From 637ed8aeb17893f710746c7488869ad8b00b10d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E6=98=8E=E5=B8=85?= Date: Tue, 1 Jun 2021 18:55:27 +0800 Subject: [PATCH 001/373] Initial commit --- README.en.md | 36 ++++++++++++++++++++++++++++++++++++ README.md | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 README.en.md create mode 100644 README.md diff --git a/README.en.md b/README.en.md new file mode 100644 index 00000000..fda4e3cf --- /dev/null +++ b/README.en.md @@ -0,0 +1,36 @@ +# applications_systemui + +#### Description +SystemUI system app | 系统界面应用 + +#### Software Architecture +Software architecture description + +#### Installation + +1. xxxx +2. xxxx +3. xxxx + +#### Instructions + +1. xxxx +2. xxxx +3. xxxx + +#### Contribution + +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request + + +#### Gitee Feature + +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md new file mode 100644 index 00000000..65fd6c6a --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# applications_systemui + +#### 介绍 +SystemUI system app | 系统界面应用 + +#### 软件架构 +软件架构说明 + + +#### 安装教程 + +1. xxxx +2. xxxx +3. xxxx + +#### 使用说明 + +1. xxxx +2. xxxx +3. xxxx + +#### 参与贡献 + +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request + + +#### 特技 + +1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md +2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) +3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 +4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 +5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) +6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) -- Gitee From d4b4d75554f586d9a537f3bc3e47e51eccfcb1e1 Mon Sep 17 00:00:00 2001 From: mamingshuai Date: Wed, 2 Jun 2021 00:03:15 +0800 Subject: [PATCH 002/373] update OpenHarmony 2.0 Canary --- .gitattributes | 15 ++ LICENSE | 176 +++++++++++++++++ README.en.md | 36 ---- README.md | 56 +++--- README_zh.md | 43 ++++ build.gradle | 42 ++++ entry/.gitignore | 1 + entry/build.gradle | 11 ++ entry/package.json | 1 + entry/src/main/config.json | 60 ++++++ entry/src/main/js/default/app.js | 24 +++ .../default/center/battery/batteryStatus.js | 109 +++++++++++ .../center/statuscenter/StatusCenter.js | 58 ++++++ .../statuscenter/manager/IconManager.js | 26 +++ .../statuscenter/manager/StatusImage.js | 25 +++ .../common/image_hdpi/ic_status_battery.png | Bin 0 -> 300 bytes .../common/image_hdpi/ic_status_bluetooth.png | Bin 0 -> 358 bytes .../common/image_hdpi/ic_status_signal.png | Bin 0 -> 333 bytes .../common/image_hdpi/ic_status_wifi.png | Bin 0 -> 577 bytes .../common/image_mdpi/ic_status_battery.png | Bin 0 -> 233 bytes .../common/image_mdpi/ic_status_bluetooth.png | Bin 0 -> 249 bytes .../common/image_mdpi/ic_status_signal.png | Bin 0 -> 243 bytes .../common/image_mdpi/ic_status_wifi.png | Bin 0 -> 353 bytes .../common/image_xhdpi/ic_status_battery.png | Bin 0 -> 337 bytes .../image_xhdpi/ic_status_bluetooth.png | Bin 0 -> 443 bytes .../common/image_xhdpi/ic_status_signal.png | Bin 0 -> 299 bytes .../common/image_xhdpi/ic_status_wifi.png | Bin 0 -> 756 bytes .../common/image_xxhdpi/ic_status_battery.png | Bin 0 -> 579 bytes .../image_xxhdpi/ic_status_bluetooth.png | Bin 0 -> 617 bytes .../common/image_xxhdpi/ic_status_signal.png | Bin 0 -> 569 bytes .../common/image_xxhdpi/ic_status_wifi.png | Bin 0 -> 1135 bytes .../image_xxxhdpi/ic_status_battery.png | Bin 0 -> 687 bytes .../image_xxxhdpi/ic_status_bluetooth.png | Bin 0 -> 753 bytes .../common/image_xxxhdpi/ic_status_signal.png | Bin 0 -> 470 bytes .../common/image_xxxhdpi/ic_status_wifi.png | Bin 0 -> 1483 bytes entry/src/main/js/default/i18n/en-US.json | 4 + entry/src/main/js/default/i18n/zh-CN.json | 4 + .../src/main/js/default/pages/index/index.css | 20 ++ .../src/main/js/default/pages/index/index.hml | 23 +++ .../src/main/js/default/pages/index/index.js | 33 ++++ .../default/pages/statusbar/clock/clock.css | 24 +++ .../default/pages/statusbar/clock/clock.hml | 20 ++ .../js/default/pages/statusbar/clock/clock.js | 35 ++++ .../js/default/pages/statusbar/statusBar.css | 67 +++++++ .../js/default/pages/statusbar/statusBar.hml | 32 +++ .../js/default/pages/statusbar/statusBar.js | 43 ++++ .../statusbar/statusIcon/statusIconList.css | 23 +++ .../statusbar/statusIcon/statusIconList.hml | 20 ++ .../statusbar/statusIcon/statusIconList.js | 31 +++ .../main/resources/base/element/string.json | 12 ++ entry/src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes figures/en-us_image_0000001103686480.png | Bin 0 -> 17775 bytes figures/zh-cn_image_0000001103686480.png | Bin 0 -> 15540 bytes gradle.properties | 10 + gradlew | 183 ++++++++++++++++++ gradlew.bat | 103 ++++++++++ navigationBar/.gitignore | 1 + navigationBar/build.gradle | 13 ++ navigationBar/package.json | 1 + navigationBar/src/main/config.json | 51 +++++ navigationBar/src/main/js/default/app.js | 23 +++ .../common/image_hdpi/ic_navigation_back.png | Bin 0 -> 599 bytes .../common/image_hdpi/ic_navigation_home.png | Bin 0 -> 640 bytes .../image_hdpi/ic_navigation_recent.png | Bin 0 -> 345 bytes .../common/image_mdpi/ic_navigation_back.png | Bin 0 -> 409 bytes .../common/image_mdpi/ic_navigation_home.png | Bin 0 -> 420 bytes .../image_mdpi/ic_navigation_recent.png | Bin 0 -> 221 bytes .../common/image_xhdpi/ic_navigation_back.png | Bin 0 -> 818 bytes .../common/image_xhdpi/ic_navigation_home.png | Bin 0 -> 955 bytes .../image_xhdpi/ic_navigation_recent.png | Bin 0 -> 411 bytes .../image_xxhdpi/ic_navigation_back.png | Bin 0 -> 1292 bytes .../image_xxhdpi/ic_navigation_home.png | Bin 0 -> 1438 bytes .../image_xxhdpi/ic_navigation_recent.png | Bin 0 -> 599 bytes .../image_xxxhdpi/ic_navigation_back.png | Bin 0 -> 1743 bytes .../image_xxxhdpi/ic_navigation_home.png | Bin 0 -> 2022 bytes .../image_xxxhdpi/ic_navigation_recent.png | Bin 0 -> 733 bytes .../src/main/js/default/i18n/en-US.json | 4 + .../src/main/js/default/i18n/zh-CN.json | 4 + .../main/js/default/pages/backKey/backKey.css | 26 +++ .../main/js/default/pages/backKey/backKey.hml | 18 ++ .../main/js/default/pages/backKey/backKey.js | 42 ++++ .../main/js/default/pages/homeKey/homeKey.css | 26 +++ .../main/js/default/pages/homeKey/homeKey.hml | 18 ++ .../main/js/default/pages/homeKey/homeKey.js | 52 +++++ .../src/main/js/default/pages/index/index.css | 27 +++ .../src/main/js/default/pages/index/index.hml | 26 +++ .../src/main/js/default/pages/index/index.js | 26 +++ .../js/default/pages/recentKey/recentKey.css | 26 +++ .../js/default/pages/recentKey/recentKey.hml | 18 ++ .../js/default/pages/recentKey/recentKey.js | 53 +++++ .../main/resources/base/element/string.json | 12 ++ .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes settings.gradle | 15 ++ signature/systemui.p7b | Bin 0 -> 3421 bytes 94 files changed, 1791 insertions(+), 61 deletions(-) create mode 100644 .gitattributes create mode 100755 LICENSE delete mode 100644 README.en.md mode change 100644 => 100755 README.md create mode 100755 README_zh.md create mode 100755 build.gradle create mode 100755 entry/.gitignore create mode 100755 entry/build.gradle create mode 100755 entry/package.json create mode 100755 entry/src/main/config.json create mode 100644 entry/src/main/js/default/app.js create mode 100755 entry/src/main/js/default/center/battery/batteryStatus.js create mode 100755 entry/src/main/js/default/center/statuscenter/StatusCenter.js create mode 100755 entry/src/main/js/default/center/statuscenter/manager/IconManager.js create mode 100755 entry/src/main/js/default/center/statuscenter/manager/StatusImage.js create mode 100644 entry/src/main/js/default/common/image_hdpi/ic_status_battery.png create mode 100644 entry/src/main/js/default/common/image_hdpi/ic_status_bluetooth.png create mode 100644 entry/src/main/js/default/common/image_hdpi/ic_status_signal.png create mode 100644 entry/src/main/js/default/common/image_hdpi/ic_status_wifi.png create mode 100644 entry/src/main/js/default/common/image_mdpi/ic_status_battery.png create mode 100644 entry/src/main/js/default/common/image_mdpi/ic_status_bluetooth.png create mode 100644 entry/src/main/js/default/common/image_mdpi/ic_status_signal.png create mode 100644 entry/src/main/js/default/common/image_mdpi/ic_status_wifi.png create mode 100644 entry/src/main/js/default/common/image_xhdpi/ic_status_battery.png create mode 100644 entry/src/main/js/default/common/image_xhdpi/ic_status_bluetooth.png create mode 100644 entry/src/main/js/default/common/image_xhdpi/ic_status_signal.png create mode 100644 entry/src/main/js/default/common/image_xhdpi/ic_status_wifi.png create mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_status_battery.png create mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_status_bluetooth.png create mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_status_signal.png create mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_status_wifi.png create mode 100644 entry/src/main/js/default/common/image_xxxhdpi/ic_status_battery.png create mode 100644 entry/src/main/js/default/common/image_xxxhdpi/ic_status_bluetooth.png create mode 100644 entry/src/main/js/default/common/image_xxxhdpi/ic_status_signal.png create mode 100644 entry/src/main/js/default/common/image_xxxhdpi/ic_status_wifi.png create mode 100755 entry/src/main/js/default/i18n/en-US.json create mode 100755 entry/src/main/js/default/i18n/zh-CN.json create mode 100755 entry/src/main/js/default/pages/index/index.css create mode 100755 entry/src/main/js/default/pages/index/index.hml create mode 100755 entry/src/main/js/default/pages/index/index.js create mode 100644 entry/src/main/js/default/pages/statusbar/clock/clock.css create mode 100755 entry/src/main/js/default/pages/statusbar/clock/clock.hml create mode 100755 entry/src/main/js/default/pages/statusbar/clock/clock.js create mode 100755 entry/src/main/js/default/pages/statusbar/statusBar.css create mode 100755 entry/src/main/js/default/pages/statusbar/statusBar.hml create mode 100755 entry/src/main/js/default/pages/statusbar/statusBar.js create mode 100644 entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.css create mode 100644 entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.hml create mode 100755 entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.js create mode 100644 entry/src/main/resources/base/element/string.json create mode 100644 entry/src/main/resources/base/media/icon.png create mode 100755 figures/en-us_image_0000001103686480.png create mode 100755 figures/zh-cn_image_0000001103686480.png create mode 100755 gradle.properties create mode 100755 gradlew create mode 100755 gradlew.bat create mode 100755 navigationBar/.gitignore create mode 100755 navigationBar/build.gradle create mode 100755 navigationBar/package.json create mode 100755 navigationBar/src/main/config.json create mode 100644 navigationBar/src/main/js/default/app.js create mode 100644 navigationBar/src/main/js/default/common/image_hdpi/ic_navigation_back.png create mode 100644 navigationBar/src/main/js/default/common/image_hdpi/ic_navigation_home.png create mode 100644 navigationBar/src/main/js/default/common/image_hdpi/ic_navigation_recent.png create mode 100644 navigationBar/src/main/js/default/common/image_mdpi/ic_navigation_back.png create mode 100644 navigationBar/src/main/js/default/common/image_mdpi/ic_navigation_home.png create mode 100644 navigationBar/src/main/js/default/common/image_mdpi/ic_navigation_recent.png create mode 100644 navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_back.png create mode 100644 navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_home.png create mode 100644 navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_recent.png create mode 100644 navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_back.png create mode 100644 navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_home.png create mode 100644 navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_recent.png create mode 100644 navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_back.png create mode 100644 navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_home.png create mode 100644 navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_recent.png create mode 100755 navigationBar/src/main/js/default/i18n/en-US.json create mode 100755 navigationBar/src/main/js/default/i18n/zh-CN.json create mode 100755 navigationBar/src/main/js/default/pages/backKey/backKey.css create mode 100644 navigationBar/src/main/js/default/pages/backKey/backKey.hml create mode 100755 navigationBar/src/main/js/default/pages/backKey/backKey.js create mode 100755 navigationBar/src/main/js/default/pages/homeKey/homeKey.css create mode 100644 navigationBar/src/main/js/default/pages/homeKey/homeKey.hml create mode 100755 navigationBar/src/main/js/default/pages/homeKey/homeKey.js create mode 100644 navigationBar/src/main/js/default/pages/index/index.css create mode 100755 navigationBar/src/main/js/default/pages/index/index.hml create mode 100755 navigationBar/src/main/js/default/pages/index/index.js create mode 100755 navigationBar/src/main/js/default/pages/recentKey/recentKey.css create mode 100644 navigationBar/src/main/js/default/pages/recentKey/recentKey.hml create mode 100755 navigationBar/src/main/js/default/pages/recentKey/recentKey.js create mode 100644 navigationBar/src/main/resources/base/element/string.json create mode 100644 navigationBar/src/main/resources/base/media/icon.png create mode 100755 settings.gradle create mode 100644 signature/systemui.p7b diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..51c63e29 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,15 @@ +*.tgz filter=lfs diff=lfs merge=lfs -text +*.trp filter=lfs diff=lfs merge=lfs -text +*.apk filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.mp4 filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.asm filter=lfs diff=lfs merge=lfs -text +*.8svn filter=lfs diff=lfs merge=lfs -text +*.9svn filter=lfs diff=lfs merge=lfs -text +*.dylib filter=lfs diff=lfs merge=lfs -text +*.exe filter=lfs diff=lfs merge=lfs -text +*.a filter=lfs diff=lfs merge=lfs -text +*.so filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.dll filter=lfs diff=lfs merge=lfs -text diff --git a/LICENSE b/LICENSE new file mode 100755 index 00000000..d0381d6d --- /dev/null +++ b/LICENSE @@ -0,0 +1,176 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/README.en.md b/README.en.md deleted file mode 100644 index fda4e3cf..00000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# applications_systemui - -#### Description -SystemUI system app | 系统界面应用 - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 65fd6c6a..a9e5294c --- a/README.md +++ b/README.md @@ -1,37 +1,43 @@ -# applications_systemui +# SystemUI -#### 介绍 -SystemUI system app | 系统界面应用 +- [Introduction](#section11660541593) + - [Architecture](#section125101832114213) -#### 软件架构 -软件架构说明 +- [Directory Structure](#section161941989596) +- [Repositories Involved](#section1371113476307) +## Introduction -#### 安装教程 +SystemUI is a system app preinstalled in OpenHarmony. It provides users with interactive UIs that display system-related information, including the system status, prompts, and notifications \(such as the system time and battery level\). -1. xxxx -2. xxxx -3. xxxx +### Architecture -#### 使用说明 +![](figures/en-us_image_0000001103686480.png) -1. xxxx -2. xxxx -3. xxxx +## Directory Structure -#### 参与贡献 +``` +/applications/standard/systemui +├── figures # Architecture figures +├── entry # Main entry module code +│ └── src +│ ├── main +│ ├── js # JavaScript code +│ ├── resources # Resource configuration files +│ └── config.json # Global configuration files +├── navigationBar # System navigation module code +│ └── src +│ ├── main +│ ├── js # JavaScript code +│ ├── resources # Resource configuration files +│ └── config.json # Global configuration files +├── signature # Certificate files +├── LICENSE # License files +``` -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request +## Repositories Involved +System apps -#### 特技 +**applications\_standard\_systemui** -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README_zh.md b/README_zh.md new file mode 100755 index 00000000..47bbef8c --- /dev/null +++ b/README_zh.md @@ -0,0 +1,43 @@ +# SystemUI + +- [简介](#section11660541593) + - [架构图](#section125101832114213) + +- [目录](#section161941989596) +- [相关仓](#section1371113476307) + +## 简介 + +SystemUI应用是OpenHarmony中预置的系统应用,为用户提供系统相关信息展示及交互界面,包括系统状态、系统提示、系统提醒等,例如系统时间、电量信息。 + +### 架构图 + +![](figures/zh-cn_image_0000001103686480.png) + +## 目录 + +``` +/applications/standard/systemui +├── figures # 架构图目录 +├── entry # 主entry模块目录 +│ └── src +│ ├── main +│ ├── js # js代码目录 +│ ├── resources # 资源配置文件存放目录 +│ └── config.json # 全局配置文件 +├── navigationBar # 系统导航模块目录 +│ └── src +│ ├── main +│ ├── js # js代码目录 +│ ├── resources # 资源配置文件存放目录 +│ └── config.json # 全局配置文件 +├── signature # 证书文件目录 +├── LICENSE # 许可文件 +``` + +## 相关仓 + +系统应用 + +**applications\_standard\_systemui** + diff --git a/build.gradle b/build.gradle new file mode 100755 index 00000000..45ddcb88 --- /dev/null +++ b/build.gradle @@ -0,0 +1,42 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +apply plugin: 'com.huawei.ohos.app' + +ohos { + compileSdkVersion 6 + defaultConfig { + compatibleSdkVersion 6 + } +} + +buildscript { + repositories { + maven { + url 'http://repo.ark.tools.huawei.com/artifactory/maven-public/' + } + maven { + url 'https://mirrors.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + jcenter() + } + dependencies { + classpath 'com.huawei.ohos:hap:2.4.4.3-RC' + } +} + +allprojects { + repositories { + maven { + url 'http://repo.ark.tools.huawei.com/artifactory/maven-public/' + } + maven { + url 'https://mirrors.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + jcenter() + } +} diff --git a/entry/.gitignore b/entry/.gitignore new file mode 100755 index 00000000..3543521e --- /dev/null +++ b/entry/.gitignore @@ -0,0 +1 @@ +/build diff --git a/entry/build.gradle b/entry/build.gradle new file mode 100755 index 00000000..c847e028 --- /dev/null +++ b/entry/build.gradle @@ -0,0 +1,11 @@ +apply plugin: 'com.huawei.ohos.hap' +ohos { + compileSdkVersion 6 + defaultConfig { + compatibleSdkVersion 6 + } + supportSystem "standard" +} + +dependencies { +} diff --git a/entry/package.json b/entry/package.json new file mode 100755 index 00000000..69a88e3b --- /dev/null +++ b/entry/package.json @@ -0,0 +1 @@ +{} diff --git a/entry/src/main/config.json b/entry/src/main/config.json new file mode 100755 index 00000000..e622202a --- /dev/null +++ b/entry/src/main/config.json @@ -0,0 +1,60 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 4, + "target": 5, + "releaseType": "Beta1" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.statusbar", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry" + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "name": "com.ohos.systemui.statusbar.MainAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "page", + "launchType": "singleton" + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/app.js b/entry/src/main/js/default/app.js new file mode 100644 index 00000000..c2306778 --- /dev/null +++ b/entry/src/main/js/default/app.js @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2021 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 default { + onCreate() { + console.info('AceApplication onCreate'); + }, + + onDestroy() { + console.info('AceApplication onDestroy'); + } +}; diff --git a/entry/src/main/js/default/center/battery/batteryStatus.js b/entry/src/main/js/default/center/battery/batteryStatus.js new file mode 100755 index 00000000..10d931e6 --- /dev/null +++ b/entry/src/main/js/default/center/battery/batteryStatus.js @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2021 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 batteryInfo from '@ohos.batteryInfo'; +import statusImage from '../statuscenter/manager/StatusImage.js'; + +const NONE = 0; +const ENABLE = 1; +const DISABLE = 2; +const FULL = 3; +const loopTime = 1000; +const percentNum = 100; + +var mBackgroundColor = '#00ff21'; +var mBatteryChargingColor = '#00ff21'; +var mBatteryHighColor = '#ffffff'; +var mBatteryMediumColor = '#ffd800'; +var mBatteryLowColor = '#ff0000'; +var mHighBatteryLevel = 50; +var mLowBatteryLevel = 10; +var mProgressWidth = 51; +var mProgress = 100; + +export default class batteryStatus extends statusImage { + constructor() { + super(); + } + + getStatusImage() { + let BatteryValue = {}; + BatteryValue.mBackgroundColor = mBackgroundColor; + BatteryValue.mProgressWidth = mProgressWidth; + console.info('color = ' + BatteryValue.mBackgroundColor + ' width = ' + BatteryValue.mProgressWidth); + return JSON.stringify(BatteryValue); + } + + startGettingStatus() { + this.setOnBatteryListener(); + } + + // Method of getting the battery status + setOnBatteryListener() { + let that = this; + let batterySOC; + let batteryCharging; + setInterval(function () { + batterySOC = batteryInfo.batterySOC; + console.info('batterySOC = ' + batterySOC); + batteryCharging = batteryInfo.chargingStatus; + console.info('batteryCharging = ' + batteryCharging); + if (null == batterySOC) { + // Set the battery SOC as full when there is no battery hardware + batterySOC = 1; + } + if (batterySOC <= 0) { + // If the result is a negative number, set it as positive number. + batterySOC = Math.abs(batterySOC); + } + // Set the battery status as charging when there is no battery hardware + let batteryStatus = that.checkBatteryStatus(batteryCharging); + that.updateBattery(batterySOC * percentNum, batteryStatus); + }, loopTime); + } + + updateBattery(val, charging) { + console.info('Battery updateBattery:' + val + ' charging:' + charging); + mProgress = val; + if (charging) { + mBackgroundColor = mBatteryChargingColor; + } else if (val <= mLowBatteryLevel) { + mBackgroundColor = mBatteryLowColor; + } else if (val > mLowBatteryLevel && val <= mHighBatteryLevel) { + mBackgroundColor = mBatteryMediumColor; + } else if (val > mHighBatteryLevel) { + mBackgroundColor = mBatteryHighColor; + } + mProgressWidth = mProgressWidth * mProgress / percentNum; + console.info('Battery updateBattery mBackgroundColor:' + mBackgroundColor); + } + + checkBatteryStatus(charging) { + console.info('Battery updateBattery checkBatteryStatus:' + charging); + let batteryStatus; + switch (charging) { + case DISABLE: + batteryStatus = false; + break; + case NONE: + case ENABLE: + case FULL: + default: + batteryStatus = true; + break; + } + return batteryStatus; + } +} diff --git a/entry/src/main/js/default/center/statuscenter/StatusCenter.js b/entry/src/main/js/default/center/statuscenter/StatusCenter.js new file mode 100755 index 00000000..439f8873 --- /dev/null +++ b/entry/src/main/js/default/center/statuscenter/StatusCenter.js @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2021 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 StatusManager from '../statuscenter/manager/IconManager.js'; +import BatteryStatus from '../../center/battery/batteryStatus.js'; + +var mStatusManager = new StatusManager; +var mBatteryStatus = new BatteryStatus; + +var time; +var mStatusList = []; +var mResultStatusList = []; + +const LOOP_TIME = 1000; + +export default class StatusCenter { + constructor() { + } + + // Method of getting the battery status + setOnBatteryListener() { + let batteryStatus = mBatteryStatus.getStatusImage(); + console.info('battery status = ' + batteryStatus); + return batteryStatus; + } + + // Method of setting the time to current + setOnTimeListener(callback) { + time = setInterval(function () { + let date = new Date(); + // Get the hours and minutes by substring. + callback(date.toTimeString().substring(0,5)); + }, LOOP_TIME); + } + + stopUpdateTime() { + clearInterval(time); + } + + // Status Icon + setOnStatusListener(callback) { + mStatusManager.setStatusList(mStatusList); + mResultStatusList = mStatusManager.getStatusList(); + callback(mResultStatusList); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/center/statuscenter/manager/IconManager.js b/entry/src/main/js/default/center/statuscenter/manager/IconManager.js new file mode 100755 index 00000000..ad965eb0 --- /dev/null +++ b/entry/src/main/js/default/center/statuscenter/manager/IconManager.js @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 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. + */ + +var mStatusList = []; + +export default class IconManager { + setStatusList(list) { + mStatusList = list; + } + + getStatusList() { + return mStatusList; + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/center/statuscenter/manager/StatusImage.js b/entry/src/main/js/default/center/statuscenter/manager/StatusImage.js new file mode 100755 index 00000000..b275c298 --- /dev/null +++ b/entry/src/main/js/default/center/statuscenter/manager/StatusImage.js @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2021 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 default class StatusImage { + constructor() { + } + + getStatusImage() { + } + + init() { + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/common/image_hdpi/ic_status_battery.png b/entry/src/main/js/default/common/image_hdpi/ic_status_battery.png new file mode 100644 index 0000000000000000000000000000000000000000..94b1137d20414b9e12f37c543da98d0bfc99fe2b GIT binary patch literal 300 zcmV+{0n`48P)Px#=1D|BR7eeDU>F6XAwXFOFrsV!|Np-MP)r7hG33zIlEMEE)boUqk?{g9y(pFf z9TN&v_#23?~=#Z}zn>K2|Xb2325C8zrWIJ?BMmIPx$AW1|)R5%gUlQ9kfVGxCPH?on?NE8|h6^(1C6kKB~7jOlY))5@RHK=J65`{>F z#QNT5XYK!sXqn`ho!R&Png4AB!GA=Wrgbm@HGkvCZ{&5CJOoo;^hsdnw0%*;2@Nm< zePfZs{CP!gfnt&-T)+b)B~ePP*n$NxQ5=O~c%v}~2T&GKX0hY<2qdaycR-{mg@|Wc zPcBVC6D;7JY**?aU?n5yvWhdP0+BarI07|1(VbR7*86X^isOVM@J<);3LGN}L5VCk z)?yP&;JB9wJhFVxE=V@_WUD4M^rd48S*Meo3sNgOK(=bqrNWP_)TA=m-0RUF0g>nW z$o7Kz6-*saC3$C07Fp|kwbdc#2fQaH=npgoTKCuE3D04D7p%=e$N&HU07*qoM6N<$ Ef)Bxu3;+NC literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_hdpi/ic_status_signal.png b/entry/src/main/js/default/common/image_hdpi/ic_status_signal.png new file mode 100644 index 0000000000000000000000000000000000000000..2d97e04dce024f3c823ff06ba0b4e8741a3145bc GIT binary patch literal 333 zcmV-T0kZyyP)Px$2T4RhR7ef&lsyiDKoCX=Xd;OX7KUhLJb^JDArDvgEIiX zH97!USiIBEbpUF5l?yp_0ELF;$I1X!F+zJZH%-dw$^cAeXo6N{hUVQj0QEL7P0DK3 zRQQH9!QfulgtCKA_ zPh~Ck-$r6tLdSE`ph{(VWy6$)1gF0`hSRX fu2=Q6`Qrv&4+CT~KSGmj00000NkvXXu0mjf=$wb* literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_hdpi/ic_status_wifi.png b/entry/src/main/js/default/common/image_hdpi/ic_status_wifi.png new file mode 100644 index 0000000000000000000000000000000000000000..486c8b02331bf414ec3924901f1247419f31d9ab GIT binary patch literal 577 zcmV-H0>1r;P)Px$`$DqQ+r2wEjoN zNtl8esNFOhMI74!8l}*k3>G$lGbi}~gDF@A)rK8-$f8@+1L9jT>O}^j+V=rhh>xKT zas>z;!!iN2^(fpTPzxO3SBq+)cJPYt%W=q%J);qZ%AvRo{A*~aLJtES*g0Irc_|wU z>k#d#3r3(83u$~8=n>o{{soOZ@um&lCN;Cv@7P>*gGkkz*UlS~c!aLNC zHz}mu{eWMAS)$ZiAr7_WD`&=o7f|vxI1GEB5GQ6KJIp`bEy`Q7x8xebDvQqC4vn$t zoK$d;V%w6_54(c#{}7=?5-0})t&KFdQvhEVh7!eadGMkNIp#0%sY# zb{ibv@2TWVu=>X+tkBB#l6BQ{_E-OzmOMZ3MJe4RaKQpj0p)0}V0Ru~uV?8EVtdrw gKCY0e;9y|ba#-_1xSHe|pmP~KUHx3vIVCg!03Fs%BLDyZ literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_mdpi/ic_status_bluetooth.png b/entry/src/main/js/default/common/image_mdpi/ic_status_bluetooth.png new file mode 100644 index 0000000000000000000000000000000000000000..214f063c56d6861574c83393a0a1460d5942ef92 GIT binary patch literal 249 zcmVPx#vq?ljR45g#(6I`_Fc8M^q#%Mg2u=>-?&hF$_9Yw?bnfEYC~h4bd>02F!tM%! zi_rN0iWeOUA{h8J$>nlK|Pmx(t!eW9YEV&@zW=RU3(7_7Y zm)N6^vFGEst)3ZLXyO7@$*Z#7`v;p1?&zU9BwkuyV)f&Di;w;)dw|+)F+{2sBV3U~ zf1ua`XB_b!R2yK2HR5Z=41#*Px#tw}^dR5%gUl0gc>Fcd_qh`1IJTzdu)H-gu2>p}F&UcmUK=EuS`t**om!~dPk zp9v*R^LLd}+JR+Ud>X?S{et!o`i~5hsN}pfp_jcfgkz;EQOQ<=2BfaQj4kPuY&B?r z`U+0A)gi_V=4clky^UtTmG|Ig$_ily=+Px$8%ab#R5%gckUvX8VHAh&mF|=h1R)|Q(h}Grgl>V8xTK5p0h*nqPtn-aH*jc8 zXskhSlbXUn#X%4%$VI$9=k?sneaTz}4?LXnJOAEuujB06+)W4gzJEgg6ppn1h5v9} zcd9yc;R1#vE|;E6?DyfL$Y;X~97b4 ztzKX?kjp>|uA&9&f}lWClDGzEu!J{wlcf+pn{ylCGge$Ik>)!Q8x$gqQt z3mTi;_Q^<WS literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_status_battery.png b/entry/src/main/js/default/common/image_xhdpi/ic_status_battery.png new file mode 100644 index 0000000000000000000000000000000000000000..9efbc47a89143213cac1d45906688aa59f85c7ae GIT binary patch literal 337 zcmV-X0j~auP)Px$3rR#lR9Fe^S4#@QFc3||eNpf#f`@R?y&Es!L3$kzq4X+((!E&UNGg+1DuFUu zd4Zvmrpfyxg^6=)bbt=ffp0qCQ}DKJ=Xke8Y!F2{Zq#ppb3z=w_xCJJ2q+N;#4>B* zh#w1f;812Si-{Ftkv(zb2|+~lX<0cgX)Ca8xAdiT9~`a_@jAkI&VauT9BPa`IzD{@ zy0Kq+3i-VvbnbFdHifoQBz5klB0%wvQwoUvu^+YWxdX8u_C4-^k>?kMqjNWv zQleG@blxkVkxEdCDK*JF6%GKEdw~nZ+q?eJWcvOAxk&870{UCCJYeqtC|m~H|J}$2 j<#Lb?&;dF?2NDOKcDzvY5n|Pk00000NkvXXu0mjf=!%Kn literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_status_bluetooth.png b/entry/src/main/js/default/common/image_xhdpi/ic_status_bluetooth.png new file mode 100644 index 0000000000000000000000000000000000000000..2dd0dec771dc4b8c12d46c8d1cbcfb393c5e3303 GIT binary patch literal 443 zcmV;s0Yv_ZP)Px$bxA})R7ef&l&w-jF%X4w8GaN4!yu3dcmfzKyaoaX0#Q}LQ&d&dpx_C34ITgk z0*L?&3e4p@X||KzY;GBJcjnxryL(PH$)+JJt@i}lwp{~fV7r#MQVS&i5#u?yL1fp< zT_mucNIQ%}Ph^omzNjk_1yH^KS70M&Wb;Sn&!7;o3ib&egF!{)o7fl>A|@~)_z4by zE7CNLiM)`bO0GeO0tDZgk3g>o@l7DIOu175O*|3Yb_;>6=^BSX0@}(g2#r3ubrOGw zN#qIa0V9vomP!GVx~s`$rj=)8Ig1J`vr~!O1zAqJ1rIe$9N49%bQf6PwV+S(EjPV z>Hr)7iRk@=Rei8m@CNQGD;rslP2^E({iy&y?s4|nNea%9<+CmHku6q`{~}YD)#?BM002ovPDHLkV1nh{wTJ)! literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_status_signal.png b/entry/src/main/js/default/common/image_xhdpi/ic_status_signal.png new file mode 100644 index 0000000000000000000000000000000000000000..f256c609daa3edd52795bbafb51813c8de0d5585 GIT binary patch literal 299 zcmV+`0o4A9P)Px#3#!Xl?pHC0#@hvN2eKCo8z6hZumQY!*?GMYuojG$qz8bDlm$}*Kv^&~0Pl49 xr9{{%hz%_yD{7OW)$0S*!p6002ovPDHLkV1h8pdKdrz literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_status_wifi.png b/entry/src/main/js/default/common/image_xhdpi/ic_status_wifi.png new file mode 100644 index 0000000000000000000000000000000000000000..3f49ec5b9e05271894e99c2e4606d7b4208617f1 GIT binary patch literal 756 zcmVPx%u1Q2eR9Fe^mb+^dQ51)FeM{6v6p8o<2)-&Uw6KXrMG!n6@XbRu1-#6Z!%w%U~Gt=1Y55B#xbI(2Z+7kicW&kWaACm)tWi#ec?F*li;I6GVz-+95^`TA?OS@YzOdx;a-cV@?fW_VE zY3NB9o6h_21Sc+@Ddy_08@59)cvMY|Q@Os}H`ntm4ZOQ?Re}#5b;CLaGjbNrsy+>f0y?`$>?7c_F zU>~SyY|i|vwgzyRfo(8|k+(TgNUdqz3tM18G|>9-gRZA=m-%DKVSG6M2#hjjRwJb{ z(Ckc>Ok79%1Xz~Q1jhX=_NHi3VE`6(i>-@1LJRW$&=q>|6fx_zZpDF9OKKcRkb mQSnE|zK%K>=wzUD2L1x@_{1S?sgf7~0000)wB literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_status_battery.png b/entry/src/main/js/default/common/image_xxhdpi/ic_status_battery.png new file mode 100644 index 0000000000000000000000000000000000000000..b209209a65ae4f61446d52b960153b8e8ae3a342 GIT binary patch literal 579 zcmeAS@N?(olHy`uVBq!ia0vp^9zbls!3HEZ&9Qk6q!^2X+?^QKos)S9WdHSaaSX{| zeLK_M>xhHIQS*PASDdW5S-C|8OQd!8G~~Qx-P80f?$EVs(l<2Y4jl7~aB+0eeIvr6 zd*$n1)t0;4PacTSIrFUcgU7uyDMt7EYlJ@ES+&6Y5IcF7h+cb_*G)eB^a(W z`7M}x@ZOfF8P4;(wacFBEL?TN&0YG)`c-U8F3o#>K}wBJNn&N zv$tsNP+Y$4dC1d4WzT~4qy!Y%Jm=0}-POLMvpD#Dx4?pZjmjAu>H6ohjqT@U&s!*T zdE??|Kg-_ne!aWTih0(XrOm}(x3a6$oXVX$e?gJbr7Q;~m$i(Vf*;vb9Ii-B5E9JC zDNxGxMNQ{Q`R>;|FPK>DiacyC@w?>O&v^Lyq3}K}xyBPVU%398I^lw`iB#QMlxMZ( zV2ttgb217*U5k{sdyhSlesRA&&H1s=i{#9?izopr04!Sb-2eap literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_status_bluetooth.png b/entry/src/main/js/default/common/image_xxhdpi/ic_status_bluetooth.png new file mode 100644 index 0000000000000000000000000000000000000000..53c6d464ce820db2a66907d80df8fded23c68e09 GIT binary patch literal 617 zcmV-v0+#)WP)Px%BS}O-R9Fe^mODa_)LYqN1zk4S1sJ``}f8B%@H6)-*G#TZCeKsCK22}0%pWQOL2(0nw5|~}#>8*(zXWhID@1d~3wMNuF-CL4{|bNyT_Hw%sIFv< zAwHJQJ2%sBCikT|IzB0Y{Rq2|zsTFfnf%{?93ZSbv0+@lE7kBwDX91_=4`5btMAVlf z_K^R^n0!vj0-ykh-d&O4HZ$TQwdE(6u82=GDi%dK0!|3jDT=u&}i+M5u3u1xBa00000NkvXXu0mjf D)Qk_= literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_status_signal.png b/entry/src/main/js/default/common/image_xxhdpi/ic_status_signal.png new file mode 100644 index 0000000000000000000000000000000000000000..65c057e136618d28c22e3d8059832c7cc68919bc GIT binary patch literal 569 zcmV-90>=G`P)Px$^GQTORA>e5S+Pn3K@iQUphYl{6}UtH_wk_5Sj?4L%0S9M%0SA%=rZsD06c9>Cq|`Y00000NkvXX Hu0mjflIs9A literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_status_wifi.png b/entry/src/main/js/default/common/image_xxhdpi/ic_status_wifi.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d92cf4f9625d95cea6aea3e3e5861a49be0215 GIT binary patch literal 1135 zcmV-#1d#iQP)Px(DM>^@RA>e5n8|NVQ5?r#OIkBUm7*!BDM3Xw#1KuiVkc@^7&bOGmLmQFJ6kIu z!iExTG$ch+jc7_t9k6JsBw}c2rDEvw`O1CmednEb-@U!B>B9Xb-<)%Q=Xbup;hy2X z7mGy_RUoQBRDq}hAu5m)Vs6sZcs!nqVg{J%!ZiAE&}X1GCnrbx&=M*Ef-WM0Fn@!*Z2zoL^RbVri39=!dAh{13N#;ioLf;7xcmc%KU<=3( z;v|6W0Jch`fkeLgnU^sE0?&hJH&Ec?JV?JY_6qcZZ!XYH+82d9F9lx9?Kk5M;0B4P zpH@5*Aovny9szUHFuXzk610JCoDHV2OH#wD4Zi?r|CEC=V3Qt{XW@Ns8b)6oqpdRA4w4numrI2g~Yk?V)-as9`?$V}+X&i%WJXS}+sub&3tQnmG|6myl zt-|+gNOpmB7P2Sk^frFE$7~5~!r-vmh`!eJc_wSQWE29?Cf9v1#WB|WKGV4~meMf4 z0_6dq6VEN@;CSd(sM@BO7tAvZE-+D-kyUUwj{)5U+MI&v7!@~KJf7I-?L4-@X+8hZ zw_^Jm8x_*M60~=c#P$ZX=J$a`pc%4zv?+oEk*x;RU`dLBKZSz4g%9hS#fRdn0+m4f z?J~B1Xon;vfuRwP4#c{34}v)!W;qbrK9wn0Kx0K=NKro5Ndxkf)}8R00u2K|5Wf4(^(0sz${=& zH;OZGd@%=X&p{G60l{K}L{+W_O*s5%jCnqiNG=9CZFFp!iFCqu+LOQ;w4Flf=IK+} zEsuG)h$AhTz`{Jer4|x-PP-p$bdlKJvTJy_8{`daV460rDt(mz9t_ij?~%xQSat&K z6%{7wyie!BcLE~7iH_K~Q@s>U#&wfc0^J3=8?~{whDglBo zgY3AQ(AC$n(NUNObm3|FnWBw+iX?P&j!1%>LN*5rEy_pe^u_uvF{X7*e?Hg&DiV5H z9i=*&N1Q;|H&B4{lVCdN0+%vXlVnPC+ zp_Y(W>8P&mgL22_Da)kA%YLL|qmlr@?;)TXBd9whQD^8vKL%R2e!LNUA$Df)np)$G z`JwS`ll27fY&%*L0eOujYy!2Tk-%q<2=o_XR%J92=q5saw3#BEeyL?uMr#vKBuf4C z96E*QUt<%8{&>r3_7PcBfv5se1)>T>6&ULZ`~|;fE*wedUwi-n002ovPDHLkV1k@6 B0KxzO literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_status_battery.png b/entry/src/main/js/default/common/image_xxxhdpi/ic_status_battery.png new file mode 100644 index 0000000000000000000000000000000000000000..4f95a3506a972ba2dd3d81db50c3239ed9b3714c GIT binary patch literal 687 zcmeAS@N?(olHy`uVBq!ia0vp^2|(c(_pG#7ASU3 z-@iPQXL8}~%ZpUbYp+bps;b)c;`{Mj?+|}A2^IwgMh*uCCV>V91oJ=yhmW`Vt_Ynq z?^piusZ+T>z5nFDj7|NYq<_9Gv5LJiqh=yQ)Bn(u`%dq_>amMC`A#<9e$_*tFYH_+ zs<8KGxL3-D`A>|0HcyJSkrHlq_Wc%7r@8%x%a6#{lNW5<<=c7w$^IwyPvUn~_b$IG zp(1wd$h60f-&Q_&IVVMJYdrU__a)Ph90+6Fd}i6sTaO}?8fqWTvNcif(-oU}_F8}! zOT@ohlDB8wci(a}>4W~k^R=Bjwo5YBs=s;J$^Fx_>XYB|oh-j+ue(22;DPKUM_#u7 zdrY1B)<@@RC!Q4A@`*uwFUzOd_upN)`s};lfxr+>J}bAES)cPb9%v*nv2;9q7YP(S z!oneN`0i$Px%t4TybRA>e5n6XaWKoExSl87o2MG_qnC{^kR-XUFxkW$fJk%E$fiaup{0E$%9 z2yrA$Bp!i01V}U~kf@NN)oCI^VnXmZ!qYs&p@AnJ_FC3 zfngK<>2&%Q^T+Ua@ZZDX@X{Oag?B3qJtJ zMij`>yvCp-xEVqNyip3TQQuz#0*jFgLIYeV09Ka*5dc8`2cnZDL3|RO0Kfx)I7iV1 z#DfSH^HPyyzeuT7hftoWj z0B0H@v`A8%16=@|;DE@AF9cwOFo`b=kby9ZGfwR~z|Liu`yL>a;XW{D!3|&#m&BPM zTmTMnGlcmbFp6^_(w5!Sm;h?Tnc_RGhWan~Bs!La$O0t9x%rF%+;7n&KuWxBZRgp0 zUgfm_i;7G7GZ5=Ct`eZBxCBo?jAhImKwIJ>fbt3+Z%V^ANC}{Aam3@-)jmAll!kAR z0D!^Vt5@x0YBv)YUu#O7kD;~+E)BmyW)=X@3VZdU&$N^lV@pLwoZlY7G(gy^qjxFd zq<9rj27_bNzZUINr0G`mS*yI}j8T>L(wR#@*ULyINr_Y+qW)gmD7j01soJdanpcXm zQ(pqMo0?0UVr>KH6G)!94D1TPB;Hj9%;IeT#7~M#oB;YUWZP?Jn7}`(NAL^1!g&Mr j>{)W#9@n{# z9hp=dU?@PnQSJMt-Rq*gdDA1=BjY3aBXcjC$p8E*r@j8rz6VO0a_pJ&etmweU{<+n z#-2&%Tjx%C71z0Pp%6pPlvCThe0ZlaIOy{53Nd)C3W@zHn@}drbNBwmK2vT7E{8 z8?!TfnY*k6C=imEVZ_ofNh>tGmc63ZVI3R$+X#Jz%7AHX?5qtv4%67w)f#ko{d^c+ zY~FN5QF%gYV#XzohUuR+Y!}+RE;y)+kMYC*PenC0#~FX-$1Y#;MrIT5w!d@#_w!HR u^lnpLZO)J6So1SepCdxif$6I74@T=#Ubi>fzgiEBCPx)g-Jv~RCodHnCpvGRT##dsWiKpSz1XsW22RnK^G&seb6Ebg~9rekVp}9fuIk4 z>o2HJMNmXiSOg*oMi<0VD#DsbL%U*=jcFxmSF^Il>GzxVfx~8>eb(7$@14V57)rU;ECfetNZgKuHS`kB801@D|96Q1D{XyMey9NvMAQsRq!!fj}V^~ zb5U@4GH?ex2>Xi$F1g>Q_*;h%Uv%oXqZPowrxIWpbml|xJ%%Rs6|}IqY=4Fpw%?(! zAj&DwB6%7-2hN4Z!cYuhxEdi2gmwrLfPrgwHCzhYB{YhSOL8mRPBK66ECk|ORQuq0 z2?ux{1@qwG*AVxeJflWiTLDPIBkOk9Zq^TCvk`9UWCpMg2DzM!@j~cim{%Swl+Te% z?h%?R00Ga$$=z^zPNbh`+W_ApSYt`&n0MbqUarEcpkkbo<8cpdkCT^MFB2^VAV@zw z?uYKpEV$Ix!OaBtGs~drcjV}HxE2n=#-%D9)|L4vIqpn1_&ra62WdYms}t`$exAXp zv;VIHA!d-o3g{&)3&Z64P*%gySuc}!UR%@nix+F*MjQs;#z@d*YDJ#|r@|AU7bc(L z7wF00Q&ETEC&cj5(-zq6CC0-TUJn<;^tjy0naEoKchF-&Q?IZ2{1n05S8YK;&c>C{ zJA=ns5qv`@SKAiiejeh0xL&{Sfz1;*ME{jp{qqE{(A)(3py&8YILY1X1b0tf3>U(F zSSDN*uad*|c23E|mE}rM4EO%a^vf*JEd`)cMbhsJ1#H)lW(8<_RMv$%rVBqfM zWzdKV;otkm1pyEh_D0aE1-3v8HM5&-2%Nt zz71Xhy&JgCJ(|2JRt`ik{vhkuR-3kdnuyK&cF?<*e35@OW*v^A)pMGe? z_w*QrUV$x=!_Z%McHmQCbAeA!iQW*~R*t$7pq10+_ax~(+?l!@Dp&{BfxId@_10Mqz-wFLCSSa3_e?I;P{xX0Wa5nU;E(H2cf^(t2`9(wpDo~)3 z8qh9Jmh?<)mcahRb|=pl+2ebX@3lQ@7l6Tgrr!nAwZW6(2}JPHQyWUZ2<2tY;3w0* z9Hs|vH{UH!Z2VpeY88MH&4K>**9x|2Qyc0QAmlg;u_;ZUx&_!9ka>trfSWLrx&`p( ztgNeYBU{_FsSULXK!x}J`&H12pN8*NB{u1{%D&fr3_6k{=^jv-ve9u=ASw_Qhzdjn lq5@HYs6bR8DsV(A@HZt!f&fd# + + + +
+ + +
\ No newline at end of file diff --git a/entry/src/main/js/default/pages/index/index.js b/entry/src/main/js/default/pages/index/index.js new file mode 100755 index 00000000..063f92da --- /dev/null +++ b/entry/src/main/js/default/pages/index/index.js @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021 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 batteryStatus from '../../center/battery/batteryStatus.js'; + +var mBatteryStatus = new batteryStatus; + +export default { + data: { + isShow: false, + showMask: '', + }, + + onInit() { + mBatteryStatus.startGettingStatus(); + }, + + clickFunc() { + console.info('statusBarClicked'); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/statusbar/clock/clock.css b/entry/src/main/js/default/pages/statusbar/clock/clock.css new file mode 100644 index 00000000..ac1cdbf1 --- /dev/null +++ b/entry/src/main/js/default/pages/statusbar/clock/clock.css @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2021 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. + */ + +.clock_text { + margin-left: -10px; + width: 14%; + height: 30px; +} + +text { + color: white; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/statusbar/clock/clock.hml b/entry/src/main/js/default/pages/statusbar/clock/clock.hml new file mode 100755 index 00000000..93e8490b --- /dev/null +++ b/entry/src/main/js/default/pages/statusbar/clock/clock.hml @@ -0,0 +1,20 @@ + + +
+ {{ mTime }} +
\ No newline at end of file diff --git a/entry/src/main/js/default/pages/statusbar/clock/clock.js b/entry/src/main/js/default/pages/statusbar/clock/clock.js new file mode 100755 index 00000000..99f5dd87 --- /dev/null +++ b/entry/src/main/js/default/pages/statusbar/clock/clock.js @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 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 StatusCenter from '../../../center/statuscenter/StatusCenter.js'; + +var mStatusCenter = new StatusCenter(); + +export default { + data: { + mTime: '' + }, + + onInit() { + mStatusCenter.setOnTimeListener((time) => { + console.info('ClockModel mStatusManager time:' + time); + this.mTime = time; + }); + }, + + onDestroy() { + mStatusCenter.stopUpdateTime(); + } +} diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.css b/entry/src/main/js/default/pages/statusbar/statusBar.css new file mode 100755 index 00000000..03cdb5aa --- /dev/null +++ b/entry/src/main/js/default/pages/statusbar/statusBar.css @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2021 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. + */ + +.status_bar_page { + background-color: #66000000; + flex-direction: row; + display: flex; + flex-wrap: nowrap; + justify-content: flex-end; + align-items: center; + height: 100%; +} + +text { + color: white; +} + +.main_body { + display: flex; + width: 100%; +} + +.icon_list { + margin-left: 6px; + width: 100%; + height: 30px; + display: flex; + flex-direction: row; +} + +.battery { + flex-direction: row; + align-items: center; +} + +.battery_body { + position: relative; + margin-top: 16px; + align-items: center; + width: 80px; + height: 40px; + background-image: url("common/image_xxhdpi/ic_status_battery.png"); + background-repeat: no-repeat; + padding: 1px; + display: flex; +} + +.battery_progress { + margin-top: -7px; + margin-left: 6px; + height: 32px; + stroke-width: 32px; + stroke-linecap: "round"; +} + diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.hml b/entry/src/main/js/default/pages/statusbar/statusBar.hml new file mode 100755 index 00000000..dc57d75b --- /dev/null +++ b/entry/src/main/js/default/pages/statusbar/statusBar.hml @@ -0,0 +1,32 @@ + + + +
+
+
+
+
+
+
+
+
+
+ +
+
diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.js b/entry/src/main/js/default/pages/statusbar/statusBar.js new file mode 100755 index 00000000..3e6af816 --- /dev/null +++ b/entry/src/main/js/default/pages/statusbar/statusBar.js @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 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 StatusCenter from '../../center/statuscenter/StatusCenter.js'; + +var mStatusCenter = new StatusCenter(); +const LOOP_TIME = 1500; + +export default { + data: { + mBackgroundColor: '', + mProgressWidth: '', + }, + + onInit() { + console.info('onInit'); + let that = this; + setInterval(function () { + that.getBatteryValue(); + }, LOOP_TIME); + + console.info('mOneSignalImg====>>' + this.mSignalOneImg); + }, + + getBatteryValue() { + let batteryValue = mStatusCenter.setOnBatteryListener(); + console.info('batteryValue = ' + batteryValue); + this.mBackgroundColor = JSON.parse(batteryValue).mBackgroundColor; + this.mProgressWidth = JSON.parse(batteryValue).mProgressWidth; + } +} diff --git a/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.css b/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.css new file mode 100644 index 00000000..911e33d4 --- /dev/null +++ b/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.css @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 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. + */ + +.status_list { + display: flex; + flex-shrink: 0; + flex-direction: row; +} +.status_icon { + margin-right: 8px; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.hml b/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.hml new file mode 100644 index 00000000..f0a374ab --- /dev/null +++ b/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.hml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.js b/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.js new file mode 100755 index 00000000..f39081a0 --- /dev/null +++ b/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.js @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021 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 StatusCenter from '../../../center/statuscenter/StatusCenter.js'; + +var mStatusCenter = new StatusCenter(); + +export default { + data: { + statusListData:[] + }, + + onInit(){ + console.info('Status onInit'); + mStatusCenter.setOnStatusListener((data)=>{ + this.statusListData = data; + }) + } +} \ No newline at end of file diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json new file mode 100644 index 00000000..24fea82b --- /dev/null +++ b/entry/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "app_name", + "value": "SystemUI" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/entry/src/main/resources/base/media/icon.png b/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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
  • i4F@(&vJgN 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 QQkI-Ob@3$8{K~!m58To>djJ3c literal 0 HcmV?d00001 diff --git a/figures/zh-cn_image_0000001103686480.png b/figures/zh-cn_image_0000001103686480.png new file mode 100755 index 0000000000000000000000000000000000000000..751bd05d1759a6d1e4f56e4dc85e27e1c97d22ac GIT binary patch literal 15540 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 XsU9?+x9kdGp#M~q9xIl}n+E \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100755 index 00000000..62bd9b9c --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,103 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/navigationBar/.gitignore b/navigationBar/.gitignore new file mode 100755 index 00000000..3543521e --- /dev/null +++ b/navigationBar/.gitignore @@ -0,0 +1 @@ +/build diff --git a/navigationBar/build.gradle b/navigationBar/build.gradle new file mode 100755 index 00000000..c2ac0f33 --- /dev/null +++ b/navigationBar/build.gradle @@ -0,0 +1,13 @@ +apply plugin: 'com.huawei.ohos.hap' +ohos { + compileSdkVersion 6 + defaultConfig { + compatibleSdkVersion 6 + } + entryModules "entry" + supportSystem "standard" +} + +dependencies { + entryImplementation project(':entry') +} diff --git a/navigationBar/package.json b/navigationBar/package.json new file mode 100755 index 00000000..69a88e3b --- /dev/null +++ b/navigationBar/package.json @@ -0,0 +1 @@ +{} diff --git a/navigationBar/src/main/config.json b/navigationBar/src/main/config.json new file mode 100755 index 00000000..768821a9 --- /dev/null +++ b/navigationBar/src/main/config.json @@ -0,0 +1,51 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 4, + "target": 5, + "releaseType": "Beta1" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.navigationbar", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "navigationBar", + "moduleType": "feature" + }, + "abilities": [ + { + "visible": true, + "name": "com.ohos.systemui.navigationbar.MainAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "page", + "launchType": "singleton" + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/app.js b/navigationBar/src/main/js/default/app.js new file mode 100644 index 00000000..8e47afff --- /dev/null +++ b/navigationBar/src/main/js/default/app.js @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 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 default { + onCreate() { + console.info('AceApplication onCreate'); + }, + onDestroy() { + console.info('AceApplication onDestroy'); + } +}; diff --git a/navigationBar/src/main/js/default/common/image_hdpi/ic_navigation_back.png b/navigationBar/src/main/js/default/common/image_hdpi/ic_navigation_back.png new file mode 100644 index 0000000000000000000000000000000000000000..b9bd0b2d52709ddf685eab52d8e76e102c2bfb9a GIT binary patch literal 599 zcmV-d0;v6oP)Px%5lKWrR9Fe^)=!8{aTLJudB&dPro@BX?y zJ$2L_s5`JsJJ4#ida(m*irhk@$mGHXe*>@hy<0dmBsET zZ>P@okJXD^pz7m!Lb1_(#E8c?jI~t@%)ee+A?xL@6Yk&{4&WN8J#yEgtx!}Y^#@ai zPx%I!Q!9R9Fe^mc2?tK@f$FKWz+(3R;9Tu@N-Ah&C~mg^Fn56Zkw9K0*Qt+8D4g zPY^9E?6lBAA*ij$^*dp6LBgHg+-T(;IBb%cIeT`pyR#!BnPnBoD)7%LkW0JXD2nFE zT?QHpj^~~68QkP@IgJC`z=9A`W|nPG0ugux5+a)fGeEo#;0$5+jKLNx2qB}e?tu-^ z0Zq_m!VkvSh|BY(0%~9iT!RL2UyNQ066C}j!L|ghz&R6qTI}RZ;NJpOa0iYfbbR`}y+C$bq1 z$MHhQP!-Ze*SqwL>4IHvM2a)fd=*Me{40k~kg8*@Xh31=d1l3Zg47^qI2mdOLz&~4 zh2+U1@(I$(P<( zO}W$H)JI@eNXe{7@0n{*Wu>c(1DVU&B&p@N%zTwH#2N(Y;dRIabBq^|`<@@-R%Ikc z&yPCrTF`q)EC?B6&;xB9bbxx3o~l1?apLm)t_`d`qra&I>csut0}aC1m{3m$b?qWh zpHn+{1F{0p(bhsA!D-0fL|kma6^b+52ZX67sZna|U7ou1bc${fVxA^qGRrEERUoT? aD)0?K__MBNK$80a0000Px$6G=otR9Fe^R=W|xFbuW%6;J~u%#s-xA#2bu2aLc39J{0@H7S53JRNqEvn50B zXd>SUCDzlkcyaNJ(WMHg0s~XPrvBfyZRfy_Qt=&JW38<^d%;(6APllWXO36}8PYdz zfSxc|!L_6ebO6B&aYej1GNv{`Eu(%6v}bUJfYIeX(;9#?h%QlJLIGTa+95B%b&s`3 zcf!}7F@i7l9}YX_di;SL=C3s!NRnF>QiUW1q`KZARY+1ms_PxZ>iv4$mwOsWN3c1AyeW&l$;kr-K03iEpRzviRiORG#@cg!I6jq`DSu@ rcxKI&#|CmODHG_?Emc4j7={9GW6?QCLH8B200000NkvXXu0mjfu_B4n literal 0 HcmV?d00001 diff --git a/navigationBar/src/main/js/default/common/image_mdpi/ic_navigation_back.png b/navigationBar/src/main/js/default/common/image_mdpi/ic_navigation_back.png new file mode 100644 index 0000000000000000000000000000000000000000..4da0066ca60ba5ca5d62c9c697b105b69f930d46 GIT binary patch literal 409 zcmV;K0cQS*P)Px$Q%OWYR7ef&l%Y>TQ51)H!b}tg6bo3WCP*Y85DX@Rn@uufY;H=R5C}kHGx&cn z2)Y?;M#v@uHk$!1-(l}&pp52<=i_Wkz*We2aGXsC_>urN1XU2 zwH%^(axJ)k8sAl&m?mOdN9c_8TS&mbahxyKy3FJ73;!aN0U{2S1-OPcct(8AC}BYI z)(A8}JVoUloI(%bZ>y5Bs2U(FeJw!+hVY8`f^nm;8n~yvN9hkb2>)!Py0+PBK)wo} z2#?nGZZ%b(7iwYKp;($?84$ zzJOJ^Px$UP(kjR7ef&l)F&_F%X7*_6(sPlwbmr;{+<800>MD6;KC_KmqOnlbgUU!4E=` zk&z0f9#Zx&~)p zYe9RA3os?oyXk&55V#E{;0as-?O-RGn@%=yI?h%+n&Ts*s*MV^E)ZuDC8U%%jDV_3 z26w)2ltkQfr}M|QzwqYj`3wDZJ@-ueQ#c=Jo`HM<2@+6=daWNi3)pGJ8>XT8?y-Ud zSalS)rN>awjJsias><HVpD|pByG21=789wtMdQO3J2iyT&qD#Jklsj-o_AbP4p>Wh+0JK+z<&19#3>u^;-)JbwRM2fhFUOs&a?d*rzQ O0000p|QSiQtDM(hZq=s)&H#V@1^KJ+#` z@^Ro6TXcH!0&a(&3e(>+X6@*5mUESOkvt(eCXi*Jj9O096%pyJ4G9^2Y!^8=lwvF; zL$*mc7Hb?#V9+vPd&GZ3A5}T6vSM2oI~~?#Vc07m=d#LW S!BLPx%>`6pHRA>e5m`z9(Q5c4uex-#$lob^eNKmV+m9)qRX;ET9NG&wpG zQmDh97=KQ6CNBXnzYK@!dPCXiOKLCXN6OpI ziqilXpN+E?XaybnC-h+aHPwrp1;G3&93BK!=^5O@{IBUPPcOLxV0fNs z#@|uBD^~!_H{einU2{H#$Iyp)Et7?)ssI?T#oaDw2CX(<;3~#HQVW%J0L*JWSJ$<^ zPr*aDhxy;s!etcz^LucpRYv**>iW?1R-l*60WiM>k1{_Aci|D{|4@S}a{yd!Dm&Gk z zVg)s*G6#@LLfoKSgdeaPItkGVHrEonxsz1@ot6-9C?$9bx_R3PU4&ReEnL!^h&R{%LA#3bBdcov3WF&rbr z0nqcWSLF_1+!5k4<1^3)x-Z%cB|>bVdXuvNa!80NxX-W~KEOgaLWmBiW9(c`0~mLN z_{vxpcrWPLK(`?$3DHD#DlY-#kPs>8$FBtXSBkEOLxeaAx)paKZvl)uLJY$Nwl9O8 zkM%sEYhx>Diq(UpA4h8?)_dgG0mHfu_JX;yHAfpDq^6v;3JqY~5kxCf8!UzQaD@O> w{RP-JoCp%6f#DLzGsh0Z4#W<`4!G{XUm+9MjiItTMgRZ+07*qoM6N<$g0A9ZCjbBd literal 0 HcmV?d00001 diff --git a/navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_home.png b/navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_home.png new file mode 100644 index 0000000000000000000000000000000000000000..7b6fde4f366d85a1cef4e143380349cc2eaa6f90 GIT binary patch literal 955 zcmV;s14R6ZP)Px&bxA})RA>e5n9picK@`Rl6+uzd_y^sk3q`?};uAF0U3De;3Q`xY^$B$C!atAD zg5B9oi=+==TVfaLM!Hg3Ezyb#QRDAR&d>()=S=R6BFusB&b`x_@0|19$=o?D6p|$c zk^)JAq(D;OKUScackGQuV-K7s!4YuO`0KQv!Dg{o{AGQ)G`S@};1`ML5*P!AyF|B5 ze+?{?$Xb^%QQesnAn>zzybeZodEVmw6Oi&Uy@}(XqzAKiv~wi#HgpWq4xE53l^Zyn zG{;&ZRj@)(@2#(`Va^#k#z6&WiOH&9mN`H55NiV^Kp+QjbPHSnKfpX#Ac*g@eU171 z8FU3qfqmdLc*^{5v{4qFfGK|mFADw(c!XmuhiHRqgh|stZ$n8ujC~W@F=9>2CIo+f z(BS3N=04z7%kMn638E}20Tj~@R%>3%M#}5Qn#qjgF(l%gz{j~5!l(ow)@~!4&!T*b zV&`gH&#fo;*cs5{&Yb|tXrI@b)$3m9!8z!k7LB`%uTd|FI{^swk&;zW%(dIJhWoC@ z`NBpAUwtRL5T>la&}I6+@Af7Tly|9; zF|Dw4g3q3G-UPyH)scAEcETJ4pFRC~6WD}h88>fEm%nTnCT?J|Vg zB-VkuUUny7(au>rgH z;p0sVVN?P}JWH$cPfO`;mN#L_-!m=+J_Dkx7&Y1ka`( z2~2`(K*}rlC(IvyQIDgh5yW0@RKrd*J6eT~&hx7TqEqD`#vJYQ+A6i%=m#rX0yE6{ zd;eBxy0r^IsfJYj`lj#fl3cLhs1n=H$I+3X_w*-O%64Az>VnnKkWm4x}Z)1a?^;J)n6i5mr1(E_u dfuw*G_zgI<-ZRoj=41c>002ovPDHLkV1ik+zZL)h literal 0 HcmV?d00001 diff --git a/navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_recent.png b/navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_recent.png new file mode 100644 index 0000000000000000000000000000000000000000..70544ed52097a4737d285e6286059b153f637922 GIT binary patch literal 411 zcmV;M0c8G(P)Px$RY^oaRA>e5m@#ewK@3G%M5@q0ns9;?OAm*E8=xG9E0DXu1&G)^0HjH(K$A$z zw=_s5&DheetVn;P(HO1$Z9h}F*W)1p5+DH*AORAHBT#r#H%&7}%nRWJb;@Vynkhy7uVHTpfnuf$y-S8bhy zxd8~v-$uy4Lwt?5^@GA+Au3HsuB|0O-{O>fhUq;yV!W=$Ke@8;o(8gF5e{r1g1XMh z31}J-HYX54UFYNkG>r(G6NsR$b8-TjMug1?L{Qf`IRQ;0!sY}bsOy}b34EtO*&cLt zCQ0~~E1So&m8hZigIi*Iu)^ELT4f4d*$q{=rsG{~&7ms0Ay4C`LXwjd|Aw`VX{91D zt_CCk^q=s^-lpx<;su%q6#t2rhXhD~1W14cNZ?-(xB|QwHB#EMI*9-P002ovPDHLk FV1m`7t^oi5 literal 0 HcmV?d00001 diff --git a/navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_back.png b/navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_back.png new file mode 100644 index 0000000000000000000000000000000000000000..423faea5ed269c070423f59cfe1efcc98eb8e766 GIT binary patch literal 1292 zcmV+n1@roeP)Px(#z{m$RCodHnp=ofRT#%-RPvH#YND2qj*y@smZ&%+!Vp0U4AxyI{QOFCCiZh@vJ_ueC3vU=w~}F zW zj`xhl4Mk6&VdxU_Wzj;0r)QK{zllYa-Cznyw+Vc~!P)01xBKr@hH zvtJ1|1LhYi6yXa61e}pHt#6GMerEp=>_guJr^|{(`9c5zM)ONEdJVbr#szZCHNWA5 zu-pLwM^`3Yp>(A((;8+MY6s2(D~8~60|XeYWm?d*RO4sJw*ux`svbm|3n1WV6}$jF z<8-Z6@D9KnacaSZH3bA1E!^g!$*In@P1pvUTd8_*Y0UruM^FUEUETgc{xx8Z1xKRF zfV=|&OtsBrCu7(SoI6#<5@gvMAi(HytqE8YaUZ8!Z7wwlpLS}c3B3RUPPNTtJ0x}i z$K70(295@r84z&Ba-1bdw?ECU5NN@t+o7elOn`thi0&67gQG>>4`>f?3fWxp*TdXcoTncK%r2!mNNUIwP6O zoHWA8yG584PzMz3DS{^K6+mi6S?9K3;AR5EoTDB1=Sa6JWV$0b6MXT1=MGyZ}$#g2nB$$Ady`JTSM+KweXj@hbueIPOVWxaq>g!#Tu)9WCUu>b%K&SWeNxWmf(K;n z0ZJg|qo=Hv^7fdK&k0000Px)SV=@dRCodHnoVz2RTPF><44p%i;0LyLn=A|2DT0VpiT@Ezz_Za#+h^d1v)j3 zG{!jvlE%a^1Ac+rk^mZ`poAD8q3uA3pY?g|SVIZC)28ynN)--}M6@?|CK zjjmzuO-@d(s&EuCbb=sdhKkOkbLjq-mA=J!E9d~Sz5&F zkQt}d<-HRGF)xDTHT0z&5dB8kO;lYe6nCr3?ZKZ#A4Rvzw-lU%DB0emH-aGM5m3K@ zzOoJdLyoVYY5`ZN;LqFs|JxyPo}l0`I*+OqK8dr#b&sbP@Gdb)Dl+i2DFrREiTsC7uQ0JLq$URITMS6}WF@$u2pb z;o_6%f(5yY{}DN4i%C&}nwIk(=$xF-0sTcW#1@ErM>#xZMIz?|@+GxUi?ihxBM7h> zbJTJUH_?B=eg@df&2cY=yc(NMp^rBSzQTS;-Xdd?Dpg7}AO|^$**iH(0uk!IpUQ9K zAok5T$hAcX;x1|`_t{F_s@Im|6(^S#k;_)L2&SEu6?RHHw+KO`(mE$ZtKDA4oJg>f zCFgm{zqJ2eH$U0UCWt$wwMpD9P35PP(d1vaLGA z#nvAYw5tV!R?|K~IL5BwCUObV_!BY+XAG=nwGhV`Wvy*8K{VZIvPARMz<9NF*8Wet zMv7mXG&5k;qe+q^6GXPXmhmP{`(K~R?cCm7uxJ&3!xA}GE8gABAxJGKWG$RAvYOFC z9BY)dvN;4zS%z^WXx;ERRx94!tpx4DQ4T@7g#Lg0okLKOCfp;9-mM&Krvf2mZm2wEf_U^UIZi~1WpeGS&jZU_0)t<-X&9$MYMPrhQC2N9UKWdzV7 zM;|dbNg6Dd0It<{wva=!l?G%Vb3~3lf4P&LzycH}NU@uiqz|YLS}wiV*EppQs2*5( zYnQmO*3wiSvz4w_xB9qb%TZ8CF9aztmC^X7yS%7l6K(2UM)jC-jY{bS`#%bC^h|XK z)u1npMIi29a*1EH&fhl=%l`I8P{5>u+PBw-1P7wbthQ#f`=GA3-slE)8l7tF3)pz@ z#N85Ir;j*`%vM`bw>iBN6!{=(0bc{^z9>ty8e=r@XD0lES)-?zD-)Hy>Z$bmzap4&9rMVC^y5~ej&T~78cq}<0=sSH#GDg%{)%0OkH sGEf<)3{(ax1C@cwKxLpZ(1L+K0XsN7RY0kk2LJ#707*qoM6N<$f>zO=p#T5? literal 0 HcmV?d00001 diff --git a/navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_recent.png b/navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_recent.png new file mode 100644 index 0000000000000000000000000000000000000000..591e6ee74ba4d06e4e4b15a758f65c976db233f6 GIT binary patch literal 599 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-HD>U=s9naSW+o zd^^k9kJ(V5Epowwg&(Y(T#iaEa0ubZu;h6DKtqH>Nkc&OdV}f3&ZjIcuoEz{ugiz$DPXzyfC;*sl~Y^`GhChXu~FyqA_rzp4!j z{d%h)e{rrW1LvuxO|qHqveucOx^r)txu<=`Hl{i<77VHVkx_Z*|WWl|Q9|b*SiY8PQ zuHjcV^(}k#Y^jIs!_BJ_x>S8{*7Ww7(cVlIcM|fGLH+ M)78&qol`;+0G%T7@&Et; literal 0 HcmV?d00001 diff --git a/navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_back.png b/navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_back.png new file mode 100644 index 0000000000000000000000000000000000000000..c25181eeb2de433b34a77cac139303040302be98 GIT binary patch literal 1743 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 literal 0 HcmV?d00001 diff --git a/navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_recent.png b/navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_recent.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f0f100da7ffcebf3bc965a0df16b1a1a48d05e GIT binary patch literal 733 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-HD>V4Cjf;uuoF z_;$`lKhZ#ewnzh}wQetZSvxmwQuk2*Az=PpRwr{!CHogqogTBcIImm|Q&F!@!wFC2 zcg~(OXVRRV|6~998SUI{p7?D3`};TVv_(cea$sN*XkcJbU|{6H&z#`2!24vB%G=*{ zq1&yyo_D!-i5^v&FWtF2pF>8tW=U%)%%nFZ5AmCrUv z{@E_HZ;oo6UuE@G%QHrbtbGscr@ZJ?Qr-XQ+~*_CRx`g|+4HXXndEz+yw}N_PssXT zR6p9O^mT63l|ApD&ieOZX_CL8jl)N-+ND1hWmIkAsR&&8XN};$h}!KZwm+|Wv^-jO#XELe$cnrjiDMfYwvPz`CIU;W^EbnqfwJ|a>CB*}F9 bJrLX49dOg>=7wfqdS&o*^>bP0l+XkKXxK4{ literal 0 HcmV?d00001 diff --git a/navigationBar/src/main/js/default/i18n/en-US.json b/navigationBar/src/main/js/default/i18n/en-US.json new file mode 100755 index 00000000..9e520910 --- /dev/null +++ b/navigationBar/src/main/js/default/i18n/en-US.json @@ -0,0 +1,4 @@ +{ + "strings": { + } +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/i18n/zh-CN.json b/navigationBar/src/main/js/default/i18n/zh-CN.json new file mode 100755 index 00000000..9e520910 --- /dev/null +++ b/navigationBar/src/main/js/default/i18n/zh-CN.json @@ -0,0 +1,4 @@ +{ + "strings": { + } +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/backKey/backKey.css b/navigationBar/src/main/js/default/pages/backKey/backKey.css new file mode 100755 index 00000000..5144f837 --- /dev/null +++ b/navigationBar/src/main/js/default/pages/backKey/backKey.css @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 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. + */ + +.back { + icon-width: 42px; + icon-height: 42px; + width: 100%; + height: 100%; + background-color: transparent; +} + +.back:active { + background-color: #DCDCDC; +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/backKey/backKey.hml b/navigationBar/src/main/js/default/pages/backKey/backKey.hml new file mode 100644 index 00000000..f7324ac8 --- /dev/null +++ b/navigationBar/src/main/js/default/pages/backKey/backKey.hml @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/backKey/backKey.js b/navigationBar/src/main/js/default/pages/backKey/backKey.js new file mode 100755 index 00000000..7ea80acf --- /dev/null +++ b/navigationBar/src/main/js/default/pages/backKey/backKey.js @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2021 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 input from '@ohos.injectEventHandler'; + +var mDelayTime = 100; + +const KEYCODE = 2; +const KEY_DOWN_DURATION = 1; + +export default { + backClick() { + console.info('=====================test_inject_event back'); + var res; + res = input.injectEventSync({ + isPressed: true, + keyCode: KEYCODE, + keyDownDuration: KEY_DOWN_DURATION + }); + console.info('=====================test_inject_event down res = ' + res); + setTimeout(function () { + res = input.injectEventSync({ + isPressed: false, + keyCode: KEYCODE, + keyDownDuration: KEY_DOWN_DURATION + }); + console.info('=====================test_inject_event up res = ' + res); + }, mDelayTime); + }, +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/homeKey/homeKey.css b/navigationBar/src/main/js/default/pages/homeKey/homeKey.css new file mode 100755 index 00000000..49304723 --- /dev/null +++ b/navigationBar/src/main/js/default/pages/homeKey/homeKey.css @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 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. + */ + +.home { + icon-width: 42px; + icon-height: 42px; + width: 100%; + height: 100%; + background-color: transparent; +} + +.home:active { + background-color: #DCDCDC; +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/homeKey/homeKey.hml b/navigationBar/src/main/js/default/pages/homeKey/homeKey.hml new file mode 100644 index 00000000..b12133b2 --- /dev/null +++ b/navigationBar/src/main/js/default/pages/homeKey/homeKey.hml @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/homeKey/homeKey.js b/navigationBar/src/main/js/default/pages/homeKey/homeKey.js new file mode 100755 index 00000000..fd72000d --- /dev/null +++ b/navigationBar/src/main/js/default/pages/homeKey/homeKey.js @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 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 feature_ability from '@ohos.feature_ability'; + +const BUNDLE_NAME = "com.ohos.launcher"; +const ABILITY_NAME = "com.ohos.launcher.MainAbility"; +const REQUEST_CODE = 1; +const ABILITY_TYPE = "PageAbility"; +const ACTION = "action1"; +const ENTITIES = ["entity1"]; +const FLAGS = 2; +const DEVICE_ID = "deviceId"; +const SYNC_OPTION = 1; + +export default { + homeClick() { + console.info('homeChange'); + var result = feature_ability.startAbility({ + bundleName: BUNDLE_NAME, + abilityName: ABILITY_NAME, + requestCode: REQUEST_CODE, + abilityType: ABILITY_TYPE, + want: { + action: ACTION, + entities: ENTITIES, + type: ABILITY_TYPE, + flags: FLAGS, + elementName: { + deviceId: DEVICE_ID, + bundleName: BUNDLE_NAME, + abilityName: ABILITY_NAME, + }, + }, + syncOption: SYNC_OPTION, + }).then(data => + console.log('promise::then : ' + data)).catch(error => + console.log('promise::catch : ' + error)); + }, +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/index/index.css b/navigationBar/src/main/js/default/pages/index/index.css new file mode 100644 index 00000000..c0057f71 --- /dev/null +++ b/navigationBar/src/main/js/default/pages/index/index.css @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021 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. + */ + +.navigation { + justify-content: center; + align-items: center; + justify-content: space-around; + height: 100px; + background-color: #66000000; + padding-left: 130px; + padding-right: 130px; + width: 100%; + position: absolute; + bottom: 0px; +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/index/index.hml b/navigationBar/src/main/js/default/pages/index/index.hml new file mode 100755 index 00000000..92647163 --- /dev/null +++ b/navigationBar/src/main/js/default/pages/index/index.hml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/index/index.js b/navigationBar/src/main/js/default/pages/index/index.js new file mode 100755 index 00000000..1cc169c0 --- /dev/null +++ b/navigationBar/src/main/js/default/pages/index/index.js @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 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 device from '@system.device'; + +export default { + onInit() { + device.getInfo({ + success: (data) => { + console.log(`Resolution: ${this.width}*${this.height}`); + } + }); + }, +} diff --git a/navigationBar/src/main/js/default/pages/recentKey/recentKey.css b/navigationBar/src/main/js/default/pages/recentKey/recentKey.css new file mode 100755 index 00000000..a159e2e1 --- /dev/null +++ b/navigationBar/src/main/js/default/pages/recentKey/recentKey.css @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 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. + */ + +.recent { + icon-width: 42px; + icon-height: 42px; + width: 100%; + height: 100%; + background-color: transparent; +} + +.recent:active { + background-color: #DCDCDC; +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/recentKey/recentKey.hml b/navigationBar/src/main/js/default/pages/recentKey/recentKey.hml new file mode 100644 index 00000000..2856c9a4 --- /dev/null +++ b/navigationBar/src/main/js/default/pages/recentKey/recentKey.hml @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/recentKey/recentKey.js b/navigationBar/src/main/js/default/pages/recentKey/recentKey.js new file mode 100755 index 00000000..70944b1c --- /dev/null +++ b/navigationBar/src/main/js/default/pages/recentKey/recentKey.js @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021 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 feature_ability from '@ohos.feature_ability'; + +const BUNDLE_NAME = "com.ohos.launcher"; +const ABILITY_NAME = "com.ohos.launcher.recents.MainAbility"; +const REQUEST_CODE = 1; +const ABILITY_TYPE = "PageAbility"; +const ACTION = "action1"; +const ENTITIES = ["entity1"]; +const FLAGS = 2; +const DEVICE_ID = "deviceId"; +const SYNC_OPTION =1; + +export default { + recentClick() { + // launcher support + console.log('onRecentClick:'); + var result = feature_ability.startAbility({ + bundleName: BUNDLE_NAME, + abilityName: ABILITY_NAME, + requestCode: REQUEST_CODE, + abilityType: ABILITY_TYPE, + want: { + action: ACTION, + entities: ENTITIES, + type: ABILITY_TYPE, + flags: FLAGS, + elementName: { + deviceId: DEVICE_ID, + bundleName: BUNDLE_NAME, + abilityName: ABILITY_NAME, + }, + }, + syncOption: SYNC_OPTION, + }).then(data => + console.log('promise::then : ' + data)).catch(error => + console.log('promise::catch : ' + error)); + }, +} \ No newline at end of file diff --git a/navigationBar/src/main/resources/base/element/string.json b/navigationBar/src/main/resources/base/element/string.json new file mode 100644 index 00000000..d405647b --- /dev/null +++ b/navigationBar/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "app_name", + "value": "MyApplication" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/navigationBar/src/main/resources/base/media/icon.png b/navigationBar/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 DOf61= literal 0 HcmV?d00001 -- Gitee From 110f3575971c23ca2e0df9147d594ea1a04eeade Mon Sep 17 00:00:00 2001 From: BlancWu Date: Tue, 6 Jul 2021 22:38:10 +0800 Subject: [PATCH 003/373] Update project name in README. Signed-off-by: BlancWu --- README.md | 2 +- README_zh.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a9e5294c..275a7a3f 100755 --- a/README.md +++ b/README.md @@ -39,5 +39,5 @@ SystemUI is a system app preinstalled in OpenHarmony. It provides users with int System apps -**applications\_standard\_systemui** +**applications\_systemui** diff --git a/README_zh.md b/README_zh.md index 47bbef8c..3bd1d8eb 100755 --- a/README_zh.md +++ b/README_zh.md @@ -39,5 +39,5 @@ SystemUI应用是OpenHarmony中预置的系统应用,为用户提供系统相 系统应用 -**applications\_standard\_systemui** +**applications\_systemui** -- Gitee From 6d60473ea0f1f81b40d8cb5bb6868b024e0bd4c9 Mon Sep 17 00:00:00 2001 From: lin-shuai5 Date: Fri, 16 Jul 2021 10:59:02 +0800 Subject: [PATCH 004/373] update navigationBar code Signed-off-by: lin-shuai5 --- navigationBar/src/main/js/default/app.js | 8 ++- .../src/main/js/default/common/utils/Log.js | 52 +++++++++++++++++++ .../main/js/default/pages/backKey/backKey.hml | 2 +- .../main/js/default/pages/backKey/backKey.js | 42 ++++++++------- .../main/js/default/pages/homeKey/homeKey.js | 46 ++++++---------- .../src/main/js/default/pages/index/index.js | 9 +--- .../js/default/pages/recentKey/recentKey.js | 47 ++++++----------- .../main/resources/base/element/string.json | 2 +- 8 files changed, 119 insertions(+), 89 deletions(-) create mode 100644 navigationBar/src/main/js/default/common/utils/Log.js diff --git a/navigationBar/src/main/js/default/app.js b/navigationBar/src/main/js/default/app.js index 8e47afff..2d927855 100644 --- a/navigationBar/src/main/js/default/app.js +++ b/navigationBar/src/main/js/default/app.js @@ -13,11 +13,15 @@ * limitations under the License. */ +import mLog from '../default/common/utils/Log.js'; + +const TAG = 'app'; + export default { onCreate() { - console.info('AceApplication onCreate'); + mLog.showInfo(TAG, `Application onCreate`); }, onDestroy() { - console.info('AceApplication onDestroy'); + mLog.showInfo(TAG, `Application onDestroy`); } }; diff --git a/navigationBar/src/main/js/default/common/utils/Log.js b/navigationBar/src/main/js/default/common/utils/Log.js new file mode 100644 index 00000000..dac1baed --- /dev/null +++ b/navigationBar/src/main/js/default/common/utils/Log.js @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 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. + */ + +var TAG = "SystemUI_NavigationBar"; + +/** + * Basic log class + */ +export default class Log { + + /** + * print info level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showInfo(tag, log) { + console.info(`${TAG} tag: ${tag} --> ${log}`); + } + + /** + * print debug level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showDebug(tag, log) { + console.debug(`${TAG} tag: ${tag} --> ${log}`); + } + + /** + * print error level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showError(tag, log) { + console.error(`${TAG} tag: ${tag} --> ${log}`); + } +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/backKey/backKey.hml b/navigationBar/src/main/js/default/pages/backKey/backKey.hml index f7324ac8..4039d7e8 100644 --- a/navigationBar/src/main/js/default/pages/backKey/backKey.hml +++ b/navigationBar/src/main/js/default/pages/backKey/backKey.hml @@ -15,4 +15,4 @@ */ --> - \ No newline at end of file + \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/backKey/backKey.js b/navigationBar/src/main/js/default/pages/backKey/backKey.js index 7ea80acf..362df911 100755 --- a/navigationBar/src/main/js/default/pages/backKey/backKey.js +++ b/navigationBar/src/main/js/default/pages/backKey/backKey.js @@ -14,29 +14,35 @@ */ import input from '@ohos.injectEventHandler'; +import mLog from '../../common/utils/Log.js'; -var mDelayTime = 100; - -const KEYCODE = 2; -const KEY_DOWN_DURATION = 1; +const TAG = 'backKey'; +var res; export default { - backClick() { - console.info('=====================test_inject_event back'); - var res; + /** + * User start touching the back button + */ + backTouchStart() { + mLog.showInfo(TAG, `back touch start`); res = input.injectEventSync({ isPressed: true, - keyCode: KEYCODE, - keyDownDuration: KEY_DOWN_DURATION + keyCode: 2, + keyDownDuration: 1 }); - console.info('=====================test_inject_event down res = ' + res); - setTimeout(function () { - res = input.injectEventSync({ - isPressed: false, - keyCode: KEYCODE, - keyDownDuration: KEY_DOWN_DURATION - }); - console.info('=====================test_inject_event up res = ' + res); - }, mDelayTime); + mLog.showInfo(TAG, `injectEventHandler injectEventSync down res: ${res}`); }, + /** + * User stop touching the back button + * Trigger "Back" event + */ + backTouchEnd() { + mLog.showInfo(TAG, `back touch end and injectEventHandler injectEventSync`); + res = input.injectEventSync({ + isPressed: false, + keyCode: 2, + keyDownDuration: 1 + }); + mLog.showInfo(TAG, `injectEventHandler injectEventSync up res: ${res}`); + } } \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/homeKey/homeKey.js b/navigationBar/src/main/js/default/pages/homeKey/homeKey.js index fd72000d..8d7a34bd 100755 --- a/navigationBar/src/main/js/default/pages/homeKey/homeKey.js +++ b/navigationBar/src/main/js/default/pages/homeKey/homeKey.js @@ -13,40 +13,28 @@ * limitations under the License. */ -import feature_ability from '@ohos.feature_ability'; +import FeatureAbility from '@ohos.ability.featureability'; +import mLog from '../../common/utils/Log.js'; -const BUNDLE_NAME = "com.ohos.launcher"; -const ABILITY_NAME = "com.ohos.launcher.MainAbility"; -const REQUEST_CODE = 1; -const ABILITY_TYPE = "PageAbility"; -const ACTION = "action1"; -const ENTITIES = ["entity1"]; -const FLAGS = 2; -const DEVICE_ID = "deviceId"; -const SYNC_OPTION = 1; +const TAG = 'homeKey'; +const LAUNCHER_BUNDLE_NAME = 'com.ohos.launcher'; +const LAUNCHER_ABILITY_NAME = 'com.ohos.launcher.MainAbility'; export default { + /** + * User clicks the home button + * Trigger "Home" event + */ homeClick() { - console.info('homeChange'); - var result = feature_ability.startAbility({ - bundleName: BUNDLE_NAME, - abilityName: ABILITY_NAME, - requestCode: REQUEST_CODE, - abilityType: ABILITY_TYPE, + mLog.showInfo(TAG, `home click and start ability launcher`); + let result = FeatureAbility.startAbility({ want: { - action: ACTION, - entities: ENTITIES, - type: ABILITY_TYPE, - flags: FLAGS, - elementName: { - deviceId: DEVICE_ID, - bundleName: BUNDLE_NAME, - abilityName: ABILITY_NAME, - }, + bundleName: LAUNCHER_BUNDLE_NAME, + abilityName: LAUNCHER_ABILITY_NAME, }, - syncOption: SYNC_OPTION, }).then(data => - console.log('promise::then : ' + data)).catch(error => - console.log('promise::catch : ' + error)); - }, + mLog.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)).catch(error => + mLog.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); + mLog.showInfo(TAG, `start ability ${result}`); + } } \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/index/index.js b/navigationBar/src/main/js/default/pages/index/index.js index 1cc169c0..546051a2 100755 --- a/navigationBar/src/main/js/default/pages/index/index.js +++ b/navigationBar/src/main/js/default/pages/index/index.js @@ -13,14 +13,7 @@ * limitations under the License. */ -import device from '@system.device'; - export default { onInit() { - device.getInfo({ - success: (data) => { - console.log(`Resolution: ${this.width}*${this.height}`); - } - }); - }, + } } diff --git a/navigationBar/src/main/js/default/pages/recentKey/recentKey.js b/navigationBar/src/main/js/default/pages/recentKey/recentKey.js index 70944b1c..f5fdaacf 100755 --- a/navigationBar/src/main/js/default/pages/recentKey/recentKey.js +++ b/navigationBar/src/main/js/default/pages/recentKey/recentKey.js @@ -13,41 +13,28 @@ * limitations under the License. */ -import feature_ability from '@ohos.feature_ability'; +import FeatureAbility from '@ohos.ability.featureability'; +import mLog from '../../common/utils/Log.js'; -const BUNDLE_NAME = "com.ohos.launcher"; -const ABILITY_NAME = "com.ohos.launcher.recents.MainAbility"; -const REQUEST_CODE = 1; -const ABILITY_TYPE = "PageAbility"; -const ACTION = "action1"; -const ENTITIES = ["entity1"]; -const FLAGS = 2; -const DEVICE_ID = "deviceId"; -const SYNC_OPTION =1; +const TAG = 'recentKey'; +const RECENT_BUNDLE_NAME = 'com.ohos.launcher'; +const RECENT_ABILITY_NAME = 'com.ohos.launcher.recents.MainAbility'; export default { + /** + * User clicks the recent button + * Trigger "Recent" event + */ recentClick() { - // launcher support - console.log('onRecentClick:'); - var result = feature_ability.startAbility({ - bundleName: BUNDLE_NAME, - abilityName: ABILITY_NAME, - requestCode: REQUEST_CODE, - abilityType: ABILITY_TYPE, + mLog.showInfo(TAG, `recent click and start ability recent`); + let result = FeatureAbility.startAbility({ want: { - action: ACTION, - entities: ENTITIES, - type: ABILITY_TYPE, - flags: FLAGS, - elementName: { - deviceId: DEVICE_ID, - bundleName: BUNDLE_NAME, - abilityName: ABILITY_NAME, - }, + bundleName: RECENT_BUNDLE_NAME, + abilityName: RECENT_ABILITY_NAME, }, - syncOption: SYNC_OPTION, }).then(data => - console.log('promise::then : ' + data)).catch(error => - console.log('promise::catch : ' + error)); - }, + mLog.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)).catch(error => + mLog.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); + mLog.showInfo(TAG, `start ability ${result}`); + } } \ No newline at end of file diff --git a/navigationBar/src/main/resources/base/element/string.json b/navigationBar/src/main/resources/base/element/string.json index d405647b..b4ebfd4a 100644 --- a/navigationBar/src/main/resources/base/element/string.json +++ b/navigationBar/src/main/resources/base/element/string.json @@ -2,7 +2,7 @@ "string": [ { "name": "app_name", - "value": "MyApplication" + "value": "NavigationBar" }, { "name": "mainability_description", -- Gitee From 7ec6608479fc13067e738d272e0f19720149e815 Mon Sep 17 00:00:00 2001 From: lin-shuai5 Date: Tue, 20 Jul 2021 17:48:20 +0800 Subject: [PATCH 005/373] statusbar signal Signed-off-by: lin-shuai5 --- entry/src/main/config.json | 8 +- entry/src/main/js/default/app.js | 9 +- .../default/center/battery/batteryStatus.js | 105 ++++++---- .../js/default/center/signal/signalStatus.js | 191 ++++++++++++++++++ .../center/statuscenter/StatusCenter.js | 62 ++++-- .../statuscenter/manager/DateManager.js | 110 ++++++++++ .../statuscenter/manager/StatusImage.js | 10 + .../common/image_hdpi/ic_status_bluetooth.png | Bin 358 -> 0 bytes .../common/image_hdpi/ic_status_wifi.png | Bin 577 -> 0 bytes .../image_hdpi/ic_statusbar_signal_full.png | Bin 0 -> 314 bytes .../image_hdpi/ic_statusbar_signal_half.png | Bin 0 -> 342 bytes .../image_hdpi/ic_statusbar_signal_no.png | Bin 0 -> 296 bytes .../image_hdpi/ic_statusbar_signal_null.png | Bin 0 -> 423 bytes .../ic_statusbar_signal_roaming.png | Bin 0 -> 227 bytes .../image_hdpi/ic_statusbar_signal_wait.png | Bin 0 -> 246 bytes .../common/image_mdpi/ic_status_bluetooth.png | Bin 249 -> 0 bytes .../common/image_mdpi/ic_status_wifi.png | Bin 353 -> 0 bytes .../image_mdpi/ic_statusbar_signal_full.png | Bin 0 -> 225 bytes .../image_mdpi/ic_statusbar_signal_half.png | Bin 0 -> 251 bytes .../image_mdpi/ic_statusbar_signal_no.png | Bin 0 -> 222 bytes .../image_mdpi/ic_statusbar_signal_null.png | Bin 0 -> 286 bytes .../ic_statusbar_signal_roaming.png | Bin 0 -> 175 bytes .../image_mdpi/ic_statusbar_signal_wait.png | Bin 0 -> 178 bytes .../image_xhdpi/ic_status_bluetooth.png | Bin 443 -> 0 bytes .../common/image_xhdpi/ic_status_wifi.png | Bin 756 -> 0 bytes .../image_xhdpi/ic_statusbar_signal_full.png | Bin 0 -> 221 bytes .../image_xhdpi/ic_statusbar_signal_half.png | Bin 0 -> 245 bytes .../image_xhdpi/ic_statusbar_signal_no.png | Bin 0 -> 222 bytes .../image_xhdpi/ic_statusbar_signal_null.png | Bin 0 -> 340 bytes .../ic_statusbar_signal_roaming.png | Bin 0 -> 258 bytes .../image_xhdpi/ic_statusbar_signal_wait.png | Bin 0 -> 282 bytes .../image_xxhdpi/ic_status_bluetooth.png | Bin 617 -> 0 bytes .../common/image_xxhdpi/ic_status_wifi.png | Bin 1135 -> 0 bytes .../image_xxhdpi/ic_statusbar_signal_full.png | Bin 0 -> 377 bytes .../image_xxhdpi/ic_statusbar_signal_half.png | Bin 0 -> 420 bytes .../image_xxhdpi/ic_statusbar_signal_no.png | Bin 0 -> 346 bytes .../image_xxhdpi/ic_statusbar_signal_null.png | Bin 0 -> 525 bytes .../ic_statusbar_signal_roaming.png | Bin 0 -> 411 bytes .../image_xxhdpi/ic_statusbar_signal_wait.png | Bin 0 -> 442 bytes .../image_xxxhdpi/ic_status_bluetooth.png | Bin 753 -> 0 bytes .../common/image_xxxhdpi/ic_status_wifi.png | Bin 1483 -> 0 bytes .../ic_statusbar_signal_full.png | Bin 0 -> 243 bytes .../ic_statusbar_signal_half.png | Bin 0 -> 278 bytes .../image_xxxhdpi/ic_statusbar_signal_no.png | Bin 0 -> 243 bytes .../ic_statusbar_signal_null.png | Bin 0 -> 485 bytes .../ic_statusbar_signal_roaming.png | Bin 0 -> 467 bytes .../ic_statusbar_signal_wait.png | Bin 0 -> 524 bytes .../utils/CheckEmptyUtils.js} | 32 ++- .../statusIconList.js => common/utils/Log.js} | 45 +++-- entry/src/main/js/default/i18n/en-US.json | 12 ++ entry/src/main/js/default/i18n/zh-CN.json | 12 ++ .../src/main/js/default/pages/index/index.css | 2 +- .../src/main/js/default/pages/index/index.hml | 7 +- .../src/main/js/default/pages/index/index.js | 33 ++- .../default/pages/statusbar/clock/clock.hml | 2 +- .../js/default/pages/statusbar/clock/clock.js | 12 +- .../js/default/pages/statusbar/statusBar.css | 33 ++- .../js/default/pages/statusbar/statusBar.hml | 18 +- .../js/default/pages/statusbar/statusBar.js | 32 ++- .../statusbar/statusIcon/statusIconList.css | 23 --- .../statusbar/statusIcon/statusIconList.hml | 20 -- 61 files changed, 610 insertions(+), 168 deletions(-) create mode 100644 entry/src/main/js/default/center/signal/signalStatus.js create mode 100644 entry/src/main/js/default/center/statuscenter/manager/DateManager.js delete mode 100644 entry/src/main/js/default/common/image_hdpi/ic_status_bluetooth.png delete mode 100644 entry/src/main/js/default/common/image_hdpi/ic_status_wifi.png create mode 100644 entry/src/main/js/default/common/image_hdpi/ic_statusbar_signal_full.png create mode 100644 entry/src/main/js/default/common/image_hdpi/ic_statusbar_signal_half.png create mode 100644 entry/src/main/js/default/common/image_hdpi/ic_statusbar_signal_no.png create mode 100644 entry/src/main/js/default/common/image_hdpi/ic_statusbar_signal_null.png create mode 100644 entry/src/main/js/default/common/image_hdpi/ic_statusbar_signal_roaming.png create mode 100644 entry/src/main/js/default/common/image_hdpi/ic_statusbar_signal_wait.png delete mode 100644 entry/src/main/js/default/common/image_mdpi/ic_status_bluetooth.png delete mode 100644 entry/src/main/js/default/common/image_mdpi/ic_status_wifi.png create mode 100644 entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_full.png create mode 100644 entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_half.png create mode 100644 entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_no.png create mode 100644 entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_null.png create mode 100644 entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_roaming.png create mode 100644 entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_wait.png delete mode 100644 entry/src/main/js/default/common/image_xhdpi/ic_status_bluetooth.png delete mode 100644 entry/src/main/js/default/common/image_xhdpi/ic_status_wifi.png create mode 100644 entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_full.png create mode 100644 entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_half.png create mode 100644 entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_no.png create mode 100644 entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_null.png create mode 100644 entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_roaming.png create mode 100644 entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_wait.png delete mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_status_bluetooth.png delete mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_status_wifi.png create mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_full.png create mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_half.png create mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_no.png create mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_null.png create mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_roaming.png create mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_wait.png delete mode 100644 entry/src/main/js/default/common/image_xxxhdpi/ic_status_bluetooth.png delete mode 100644 entry/src/main/js/default/common/image_xxxhdpi/ic_status_wifi.png create mode 100644 entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_full.png create mode 100644 entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_half.png create mode 100644 entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_no.png create mode 100644 entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_null.png create mode 100644 entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_roaming.png create mode 100644 entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_wait.png rename entry/src/main/js/default/{center/statuscenter/manager/IconManager.js => common/utils/CheckEmptyUtils.js} (48%) mode change 100755 => 100644 rename entry/src/main/js/default/{pages/statusbar/statusIcon/statusIconList.js => common/utils/Log.js} (42%) mode change 100755 => 100644 delete mode 100644 entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.css delete mode 100644 entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.hml diff --git a/entry/src/main/config.json b/entry/src/main/config.json index e622202a..cab81000 100755 --- a/entry/src/main/config.json +++ b/entry/src/main/config.json @@ -46,14 +46,14 @@ ], "js": [ { - "pages": [ - "pages/index/index" - ], "name": "default", "window": { "designWidth": 720, "autoDesignWidth": false - } + }, + "pages": [ + "pages/index/index" + ] } ] } diff --git a/entry/src/main/js/default/app.js b/entry/src/main/js/default/app.js index c2306778..2d927855 100644 --- a/entry/src/main/js/default/app.js +++ b/entry/src/main/js/default/app.js @@ -13,12 +13,15 @@ * limitations under the License. */ +import mLog from '../default/common/utils/Log.js'; + +const TAG = 'app'; + export default { onCreate() { - console.info('AceApplication onCreate'); + mLog.showInfo(TAG, `Application onCreate`); }, - onDestroy() { - console.info('AceApplication onDestroy'); + mLog.showInfo(TAG, `Application onDestroy`); } }; diff --git a/entry/src/main/js/default/center/battery/batteryStatus.js b/entry/src/main/js/default/center/battery/batteryStatus.js index 10d931e6..5030af50 100755 --- a/entry/src/main/js/default/center/battery/batteryStatus.js +++ b/entry/src/main/js/default/center/battery/batteryStatus.js @@ -13,53 +13,66 @@ * limitations under the License. */ -import batteryInfo from '@ohos.batteryInfo'; -import statusImage from '../statuscenter/manager/StatusImage.js'; +/** + * Get the status of battery + */ + +import BatteryInfo from '@ohos.batteryInfo' +import StatusImage from '../statuscenter/manager/StatusImage.js' +import mLog from '../../common/utils/Log.js'; +const TAG = 'batteryStatus'; const NONE = 0; const ENABLE = 1; const DISABLE = 2; const FULL = 3; -const loopTime = 1000; -const percentNum = 100; - -var mBackgroundColor = '#00ff21'; -var mBatteryChargingColor = '#00ff21'; -var mBatteryHighColor = '#ffffff'; -var mBatteryMediumColor = '#ffd800'; -var mBatteryLowColor = '#ff0000'; -var mHighBatteryLevel = 50; -var mLowBatteryLevel = 10; +const LOOP_TIME = 1000; +const PERCENT_NUMBER = 100; +const BATTERY_CHARGING_COLOR = '#00ff21'; +const BATTERY_HIGH_COLOR = '#ffffff'; +const BATTERY_MEDIUM_COLOR = '#ffd800'; +const BATTERY_LOW_COLOR = '#ff0000'; +const BATTERY_LEVEL_HIGH = 50; +const BATTERY_LEVEL_LOW = 10; var mProgressWidth = 51; var mProgress = 100; +var mBackgroundColor = '#00ff21'; -export default class batteryStatus extends statusImage { +export default class batteryStatus extends StatusImage { constructor() { - super(); + super() } + /** + * Return the progress width and background color for the battery + * + * @return {string} battery progress width and background color + */ getStatusImage() { - let BatteryValue = {}; - BatteryValue.mBackgroundColor = mBackgroundColor; - BatteryValue.mProgressWidth = mProgressWidth; - console.info('color = ' + BatteryValue.mBackgroundColor + ' width = ' + BatteryValue.mProgressWidth); - return JSON.stringify(BatteryValue); + let batteryValue = {}; + batteryValue.mBackgroundColor = mBackgroundColor; + batteryValue.mProgressWidth = mProgressWidth; + mLog.showInfo(TAG, `color: ${batteryValue.mBackgroundColor} width: ${batteryValue.mProgressWidth}`); + return JSON.stringify(batteryValue); } - startGettingStatus() { - this.setOnBatteryListener(); + /** + * Init the parameters for the battery + */ + init() { + this.setOnBatteryListener() } - // Method of getting the battery status + /** + * Method of getting the battery status by looping + */ setOnBatteryListener() { let that = this; let batterySOC; let batteryCharging; setInterval(function () { - batterySOC = batteryInfo.batterySOC; - console.info('batterySOC = ' + batterySOC); - batteryCharging = batteryInfo.chargingStatus; - console.info('batteryCharging = ' + batteryCharging); + batterySOC = BatteryInfo.batterySOC; + batteryCharging = BatteryInfo.chargingStatus; if (null == batterySOC) { // Set the battery SOC as full when there is no battery hardware batterySOC = 1; @@ -70,29 +83,41 @@ export default class batteryStatus extends statusImage { } // Set the battery status as charging when there is no battery hardware let batteryStatus = that.checkBatteryStatus(batteryCharging); - that.updateBattery(batterySOC * percentNum, batteryStatus); - }, loopTime); + that.updateBattery(batterySOC * PERCENT_NUMBER, batteryStatus); + }, LOOP_TIME); } + /** + * Update the battery progress width and background color + * + * param {number} val - battery SOC number + * param {boolean} charging - battery charging status + */ updateBattery(val, charging) { - console.info('Battery updateBattery:' + val + ' charging:' + charging); + mLog.showInfo(TAG, `Battery updateBattery: ${val} charging: ${charging}`); mProgress = val; if (charging) { - mBackgroundColor = mBatteryChargingColor; - } else if (val <= mLowBatteryLevel) { - mBackgroundColor = mBatteryLowColor; - } else if (val > mLowBatteryLevel && val <= mHighBatteryLevel) { - mBackgroundColor = mBatteryMediumColor; - } else if (val > mHighBatteryLevel) { - mBackgroundColor = mBatteryHighColor; + mBackgroundColor = BATTERY_CHARGING_COLOR; + } else if (val <= BATTERY_LEVEL_LOW) { + mBackgroundColor = BATTERY_LOW_COLOR; + } else if (val > BATTERY_LEVEL_LOW && val <= BATTERY_LEVEL_HIGH) { + mBackgroundColor = BATTERY_MEDIUM_COLOR; + } else if (val > BATTERY_LEVEL_HIGH) { + mBackgroundColor = BATTERY_HIGH_COLOR; } - mProgressWidth = mProgressWidth * mProgress / percentNum; - console.info('Battery updateBattery mBackgroundColor:' + mBackgroundColor); + mProgressWidth = mProgressWidth * mProgress / PERCENT_NUMBER; + mLog.showInfo(TAG, `Battery updateBattery mBackgroundColor: ${mBackgroundColor}`); } + /** + * Check the battery charging status + * + * @param {number} charging - the battery charging status + * @return {boolean} whether the battery is charging or not + */ checkBatteryStatus(charging) { - console.info('Battery updateBattery checkBatteryStatus:' + charging); - let batteryStatus; + mLog.showInfo(TAG, `Battery updateBattery checkBatteryStatus: ${charging}`); + let batteryStatus switch (charging) { case DISABLE: batteryStatus = false; diff --git a/entry/src/main/js/default/center/signal/signalStatus.js b/entry/src/main/js/default/center/signal/signalStatus.js new file mode 100644 index 00000000..2957a7b9 --- /dev/null +++ b/entry/src/main/js/default/center/signal/signalStatus.js @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2021 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. + */ + +/** + * Get the cellular and wifi status + */ +import StatusImage from '../statuscenter/manager/StatusImage.js'; +import Radio from "@ohos.telephony_radio"; +import mLog from '../../common/utils/Log.js'; +import mCheckEmpty from '../../common/utils/CheckEmptyUtils.js' + +const TAG = 'signalStatus'; +const LOOP_TIME = 20000; +const EMPTY_LEVEL = 0; +const CELLULAR_NONE_IMAGE = 'common/image_xxhdpi/ic_statusbar_signal_null.png'; +const CELLULAR_EMPTY_IMAGE = 'common/image_xxhdpi/ic_statusbar_signal_no.png' +const CELLULAR_MIN_IMAGE = 'common/image_xxhdpi/ic_cellular_signal_min.png'; +const CELLULAR_LOW_IMAGE = 'common/image_xxhdpi/ic_cellular_signal_low.png'; +const CELLULAR_HALF_IMAGE = 'common/image_xxhdpi/ic_statusbar_signal_half.png'; +const CELLULAR_HIGH_IMAGE = 'common/image_xxhdpi/ic_cellular_signal_high.png'; +const CELLULAR_FULL_IMAGE = 'common/image_xxhdpi/ic_statusbar_signal_full.png'; + +var mCellularStatus; +var mCellularImage; +var SignalListenerInterval; + +export default class signalStatus extends StatusImage { + constructor() { + super() + } + + /** + * Get the images of cellular and wifi need to be showed on status bar + * + * @return {string} the image of wifi and cellular + */ + getStatusImage() { + let signalValue = {}; + signalValue.cellularImage = mCellularImage.image; + signalValue.cellularType = mCellularImage.type; + mLog.showInfo(TAG, `cellular type = ${signalValue.cellularType}, image = ${signalValue.cellularImage}`); + return JSON.stringify(signalValue); + } + + /** + * Init the parameters for the wifi and cellular signal + */ + init() { + this.setOnSignalListener(); + } + + /** + * Method of getting the cellular status parameters + */ + setOnSignalListener() { + this.getSignalMessage(); + SignalListenerInterval = setInterval( () => { + this.checkCellularStatus((result)=>{ + mCellularStatus = result; + mCellularImage = this.updateCellularImage(); + }); + }, LOOP_TIME); + } + + /** + * Get signal value + */ + getSignalMessage(){ + this.checkCellularStatus((result)=>{ + mCellularStatus = result; + mCellularImage = this.updateCellularImage(); + }); + } + + /** + * Update the image of cellular status + * + * @return {string} image used to show cellular status + */ + updateCellularImage() { + mLog.showInfo(TAG, `enter updateCellularImage ============`); + let status = mCellularStatus; + let type = status.signalType; + let level = status.signalLevel; + let typeString = ''; + let image = ''; + let imageResult = {}; + mLog.showInfo(TAG, `status = ${JSON.stringify(status)}`); + if (type == 0) { + image = CELLULAR_NONE_IMAGE; + } else { + switch (level) { + case 0: + image = CELLULAR_EMPTY_IMAGE; + break; + case 1: + image = CELLULAR_MIN_IMAGE; + break; + case 2: + image = CELLULAR_LOW_IMAGE; + break; + case 3: + image = CELLULAR_HALF_IMAGE; + break; + case 4: + image = CELLULAR_HIGH_IMAGE; + break; + case 5: + image = CELLULAR_FULL_IMAGE; + break; + default: + break; + } + switch (type) { + case 0: + typeString = ''; + break; + case 1: + case 2: + typeString = '2G'; + break; + case 3: + case 4: + typeString = '3G'; + break; + case 5: + typeString = '4G'; + break; + case 6: + typeString = '5G'; + break; + default: + typeString = '5G'; + break; + } + } + imageResult.type = typeString; + imageResult.image = image; + mLog.showInfo(TAG, `cellular result = ${JSON.stringify(imageResult)}`); + return imageResult; + } + + /** + * Check the connection type and signal level of cellular network + * + * @return {object} the type and signal level of cellular network + */ + checkCellularStatus(callback) { + let cellularStatus; + let slotId = 1; + mLog.showInfo(TAG, `enter checkCellularStatus ============`); + // The interface of getting the cellular signal status is unavailable temporarily + Radio.getSignalInformation(slotId, (err, value) => { + if (err) { + // Failed to call the interface,error is not null + mLog.showError(TAG, `failed to getSimState because ${err.message}`); + // When failed to call the interface, set the result as no signal + let value = {} + value.signalType = EMPTY_LEVEL; + value.signalLevel = EMPTY_LEVEL; + cellularStatus = value; + } else { + // Call interface succeed,error is null + mLog.showInfo(TAG, `success to getSimState: ${value}`); + // Since the value might be empty, set it as no signal by hand + if (mCheckEmpty.isEmpty(value)) { + mLog.showError(TAG, `value from api is empty, set 0`) + value.signalType = EMPTY_LEVEL; + value.signalLevel = EMPTY_LEVEL; + } + cellularStatus = value; + } + callback(cellularStatus); + }); + } + stopSignalListener() { + clearInterval(SignalListenerInterval); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/center/statuscenter/StatusCenter.js b/entry/src/main/js/default/center/statuscenter/StatusCenter.js index 439f8873..8933ac77 100755 --- a/entry/src/main/js/default/center/statuscenter/StatusCenter.js +++ b/entry/src/main/js/default/center/statuscenter/StatusCenter.js @@ -13,46 +13,64 @@ * limitations under the License. */ -import StatusManager from '../statuscenter/manager/IconManager.js'; -import BatteryStatus from '../../center/battery/batteryStatus.js'; - -var mStatusManager = new StatusManager; -var mBatteryStatus = new BatteryStatus; +/** + * Handle all data needed by status bar and prepare the content for pages to show + */ -var time; -var mStatusList = []; -var mResultStatusList = []; +import BatteryStatus from '../../center/battery/batteryStatus.js'; +import SignalStatus from '../../center/signal/signalStatus.js'; +import DateManager from '../../center/statuscenter/manager/DateManager.js' +import mLog from '../../common/utils/Log.js'; +const TAG = 'StatusCenter'; const LOOP_TIME = 1000; +var mSignalStatus = new SignalStatus(); +var mBatteryStatus = new BatteryStatus(); +var mDateManager = new DateManager(); +var time; export default class StatusCenter { constructor() { } - // Method of getting the battery status + /** + * Get the images of cellular and wifi need to be showed on status bar + * + * @return {string} the image of wifi and cellular + */ + setOnSignalListener() { + let signalStatus = mSignalStatus.getStatusImage(); + mLog.showInfo(TAG, `signal image: ${signalStatus}`); + return signalStatus; + } + + /** + * Return the progress width and background color for the battery + * + * @return {string} battery progress width and background color + */ setOnBatteryListener() { let batteryStatus = mBatteryStatus.getStatusImage(); - console.info('battery status = ' + batteryStatus); + mLog.showInfo(TAG, `battery status: ${batteryStatus}`); return batteryStatus; } - // Method of setting the time to current + /** + * Get current time + * + * @param {object} callback - Callback function + */ setOnTimeListener(callback) { - time = setInterval(function () { - let date = new Date(); - // Get the hours and minutes by substring. - callback(date.toTimeString().substring(0,5)); + time = setInterval(() => { + let currentDate = mDateManager.getCurrentDate(); + callback(currentDate); }, LOOP_TIME); } + /** + * Stop the loop of getting current time + */ stopUpdateTime() { clearInterval(time); } - - // Status Icon - setOnStatusListener(callback) { - mStatusManager.setStatusList(mStatusList); - mResultStatusList = mStatusManager.getStatusList(); - callback(mResultStatusList); - } } \ No newline at end of file diff --git a/entry/src/main/js/default/center/statuscenter/manager/DateManager.js b/entry/src/main/js/default/center/statuscenter/manager/DateManager.js new file mode 100644 index 00000000..3166d3a8 --- /dev/null +++ b/entry/src/main/js/default/center/statuscenter/manager/DateManager.js @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2021 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 SHORT_LENGTH = 1; +const MARK_MONDAY = 1; +const MARK_TUESDAY = 2; +const MARK_WEDNESDAY = 3; +const MARK_THURSDAY = 4; +const MARK_FRIDAY = 5; +const MARK_SATURDAY = 6; +const MARK_SUNDAY = 0; + +/** + * Manage methods related to time. + */ +export default class DateManager { + + /** + * Get current date and time. + * + * @return {string} current date and time. + */ + getCurrentDate() { + let result = {}; + let date = new Date(); + let month = this.getMonth(date); + let day = this.getDay(date); + let time = date.toTimeString().substring(0, 5); + let weekDay = this.getWeekDay(date); + result.time = time; + result.date = month + globalThis.$globalT('strings.month') + day + globalThis.$globalT('strings.day') + weekDay; + return JSON.stringify(result); + } + + /** + * Get Month. + * + * @param {object} date - Object of Date. + * @return {string} The month of date. + */ + getMonth(date) { + let month = (date.getMonth() + 1).toString(); + if (month.length == SHORT_LENGTH) { + month = "0" + month; + } + return month; + } + + /** + * Get Day. + * + * @param {object} date - Object of Date. + * @return {string} The day of date. + */ + getDay(date) { + let day = (date.getDate()).toString(); + if (day.length == SHORT_LENGTH) { + day = "0" + day; + } + return day; + } + + /** + * Get WeekDay. + * + * @param {object} date - Object of Date. + * @return {string} The weekday of date. + */ + getWeekDay(date) { + let weekDay = date.getDay(); + switch (weekDay) { + case MARK_MONDAY: + weekDay = globalThis.$globalT('strings.monday'); + break; + case MARK_TUESDAY: + weekDay = globalThis.$globalT('strings.tuesday'); + break; + case MARK_WEDNESDAY: + weekDay = globalThis.$globalT('strings.wednesday'); + break; + case MARK_THURSDAY: + weekDay = globalThis.$globalT('strings.thursday'); + break; + case MARK_FRIDAY: + weekDay = globalThis.$globalT('strings.friday'); + break; + case MARK_SATURDAY: + weekDay = globalThis.$globalT('strings.saturday'); + break; + case MARK_SUNDAY: + weekDay = globalThis.$globalT('strings.sunday'); + break; + default: + break; + } + return weekDay + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/center/statuscenter/manager/StatusImage.js b/entry/src/main/js/default/center/statuscenter/manager/StatusImage.js index b275c298..5401eeff 100755 --- a/entry/src/main/js/default/center/statuscenter/manager/StatusImage.js +++ b/entry/src/main/js/default/center/statuscenter/manager/StatusImage.js @@ -13,13 +13,23 @@ * limitations under the License. */ +/** + * Get the elements to be showed on status bar + */ + export default class StatusImage { constructor() { } + /** + * Get the images need to be showed + */ getStatusImage() { } + /** + * Init the parameters needed when getting the images + */ init() { } } \ No newline at end of file diff --git a/entry/src/main/js/default/common/image_hdpi/ic_status_bluetooth.png b/entry/src/main/js/default/common/image_hdpi/ic_status_bluetooth.png deleted file mode 100644 index 6a9e81f6d66c95c229beaeff1673ed3855a742b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#`ZP)Px$AW1|)R5%gUlQ9kfVGxCPH?on?NE8|h6^(1C6kKB~7jOlY))5@RHK=J65`{>F z#QNT5XYK!sXqn`ho!R&Png4AB!GA=Wrgbm@HGkvCZ{&5CJOoo;^hsdnw0%*;2@Nm< zePfZs{CP!gfnt&-T)+b)B~ePP*n$NxQ5=O~c%v}~2T&GKX0hY<2qdaycR-{mg@|Wc zPcBVC6D;7JY**?aU?n5yvWhdP0+BarI07|1(VbR7*86X^isOVM@J<);3LGN}L5VCk z)?yP&;JB9wJhFVxE=V@_WUD4M^rd48S*Meo3sNgOK(=bqrNWP_)TA=m-0RUF0g>nW z$o7Kz6-*saC3$C07Fp|kwbdc#2fQaH=npgoTKCuE3D04D7p%=e$N&HU07*qoM6N<$ Ef)Bxu3;+NC diff --git a/entry/src/main/js/default/common/image_hdpi/ic_status_wifi.png b/entry/src/main/js/default/common/image_hdpi/ic_status_wifi.png deleted file mode 100644 index 486c8b02331bf414ec3924901f1247419f31d9ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 577 zcmV-H0>1r;P)Px$`$DqQ+r2wEjoN zNtl8esNFOhMI74!8l}*k3>G$lGbi}~gDF@A)rK8-$f8@+1L9jT>O}^j+V=rhh>xKT zas>z;!!iN2^(fpTPzxO3SBq+)cJPYt%W=q%J);qZ%AvRo{A*~aLJtES*g0Irc_|wU z>k#d#3r3(83u$~8=n>o{{soOZ@um&lCN;Cv@7P>*gGkkz*UlS~c!aLNC zHz}mu{eWMAS)$ZiAr7_WD`&=o7f|vxI1GEB5GQ6KJIp`bEy`Q7x8xebDvQqC4vn$t zoK$d;V%w6_54(c#{}7=?5-0})t&8WlC2MkR@FbG!l6@{l%;=NmEvhQ;J|R`*qv!W zWm%psjv*T7*Iu&ZYcSw(xwzrI3d^Q*f8TdHwH{f*@bJ{7*ZXvn(vIjS=&9?OaXG?bU}an95Xbk&&@!%zU!p%sl5?8cWV;r%Z_mULF0dWTvm{ h*4Wa`?Z1BUsPA26QMQSXrwV8*gQu&X%Q~loCIBaqqk;gn%W>%joyP0R0g8s24m&n|*_GdYOY$T4j}wX!#}_iNEPCItxsf>_ zu0f8SPne~>=S#~DHa_k&KF*m3(kx`EpItEHTD!SzjnJ;GyHfL~2QHH;z4}(})obH9 YuG0*~)~#P13bc~J)78&qol`;+0C+8sP5=M^ literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_hdpi/ic_statusbar_signal_null.png b/entry/src/main/js/default/common/image_hdpi/ic_statusbar_signal_null.png new file mode 100644 index 0000000000000000000000000000000000000000..267b4803b449109148baaf2a972c286806c64775 GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O`1w1^9%x z{vRL!v>#}*)6HkuK$d1nkYBJG@9D#VPD(P?i^XPjPi40ZGLcjC*tpl7S(lAliqVJT zyCVyyx|N78!=cyj6M&lLd%8G=Xq;br=_cPH1p(H8JLRu$@n%GNvH$zeE~=As>Elrg z|0nZO#`e~rUFL4p6Qk8bz$^yp7`s+q>DTfmSc@q;zxM{t&gFdy@phDYIz z7Lx5Y7Z2^w`N3uKkX_)v@+}n^uE>Ip`Al7#nF|H@Di^gD{!B2u(o*a)yTw^ik2{U= zYIBo@K)W4KBJu-o#v!|`h=xZ(37eiUCj|sOWl3UH*ya{!a7vQ5@uGkPZ=<3V6GQSX WW0pr6yG(!%W$<+Mb6Mw<&;$TubxoN7 literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_hdpi/ic_statusbar_signal_wait.png b/entry/src/main/js/default/common/image_hdpi/ic_statusbar_signal_wait.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc67badb5b024c3178bdc2358ffb08e48677395 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Hh8)?hIsJ4 zon*^($U&fWbEo=+;t2I6LjDg5Rc2gXB77vffI3IUB z4aTgfq#MqQH}|BiW7IsRE+DIT?|SwD#>;%$3flc+1OG8?7VQZ*$d)CMASq?A{-xAn tPx#vq?ljR45g#(6I`_Fc8M^q#%Mg2u=>-?&hF$_9Yw?bnfEYC~h4bd>02F!tM%! zi_rN0iWeOUA{h8J$>nlK|Pmx(t!eW9YEV&@zW=RU3(7_7Y zm)N6^vFGEst)3ZLXyO7@$*Z#7`v;p1?&zU9BwkuyV)f&Di;w;)dw|+)F+{2sBV3U~ zf1ua`XB_b!R2yK2HR5Z=41#*Px$8%ab#R5%gckUvX8VHAh&mF|=h1R)|Q(h}Grgl>V8xTK5p0h*nqPtn-aH*jc8 zXskhSlbXUn#X%4%$VI$9=k?sneaTz}4?LXnJOAEuujB06+)W4gzJEgg6ppn1h5v9} zcd9yc;R1#vE|;E6?DyfL$Y;X~97b4 ztzKX?kjp>|uA&9&f}lWClDGzEu!J{wlcf+pn{ylCGge$Ik>)!Q8x$gqQt z3mTi;_Q^<WS diff --git a/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_full.png b/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_full.png new file mode 100644 index 0000000000000000000000000000000000000000..afead1b092b13dcbdf1cae439ca08a90d4c06913 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFgTe~DWM4fj}2%* literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_half.png b/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_half.png new file mode 100644 index 0000000000000000000000000000000000000000..1248c0acf163b9ca565bc8cec267af951a11596e GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|wtBiahFAzD zCrA`M`2YX^90wiNVhiCOM}gO^ptjG-oX0Wmv^}lWUVK>jP7U z3}tD7)5U1wNO!zU2Wrg?;wL-GLol@s0G#vU@O86DE&nI3u6NF^3U@G^M4 zV%lisBWNd;$8f>TTVY;{zoD7s4n_yhbcJ(GTEDoL{C6#S3j3^P6){h(Z{tsNe!Z-U5HcFx3_F$Oig8e@{hYrvf-Ebx#Wf#zP327C(U!;r~bNQ&o5^zZ0I9w R_6lelgQu&X%Q~loCIGocgs1=j literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_roaming.png b/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_roaming.png new file mode 100644 index 0000000000000000000000000000000000000000..1f42d78c42b228e1f65da4e62196edfc8f7fc0ff GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|GCf@!Lo5W7 z6C_L?{Qv*|n?nruk!wpVx;Q;IDojl~+8uA)A z11{^jxgDE+B!g|Gqj`d1fDiKv*1RO%1jnEq@+bar9y#9_!P2px>7#}OFXJL728NFh Wr6x}QcgX-~DTAl0pUXO@geCxhp*$)8 literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_wait.png b/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_wait.png new file mode 100644 index 0000000000000000000000000000000000000000..8f457de86185aff1cc79543a88461dba29f04a6b GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|ay(reLo5W7 z6C^SYa1Px$bxA})R7ef&l&w-jF%X4w8GaN4!yu3dcmfzKyaoaX0#Q}LQ&d&dpx_C34ITgk z0*L?&3e4p@X||KzY;GBJcjnxryL(PH$)+JJt@i}lwp{~fV7r#MQVS&i5#u?yL1fp< zT_mucNIQ%}Ph^omzNjk_1yH^KS70M&Wb;Sn&!7;o3ib&egF!{)o7fl>A|@~)_z4by zE7CNLiM)`bO0GeO0tDZgk3g>o@l7DIOu175O*|3Yb_;>6=^BSX0@}(g2#r3ubrOGw zN#qIa0V9vomP!GVx~s`$rj=)8Ig1J`vr~!O1zAqJ1rIe$9N49%bQf6PwV+S(EjPV z>Hr)7iRk@=Rei8m@CNQGD;rslP2^E({iy&y?s4|nNea%9<+CmHku6q`{~}YD)#?BM002ovPDHLkV1nh{wTJ)! diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_status_wifi.png b/entry/src/main/js/default/common/image_xhdpi/ic_status_wifi.png deleted file mode 100644 index 3f49ec5b9e05271894e99c2e4606d7b4208617f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmVPx%u1Q2eR9Fe^mb+^dQ51)FeM{6v6p8o<2)-&Uw6KXrMG!n6@XbRu1-#6Z!%w%U~Gt=1Y55B#xbI(2Z+7kicW&kWaACm)tWi#ec?F*li;I6GVz-+95^`TA?OS@YzOdx;a-cV@?fW_VE zY3NB9o6h_21Sc+@Ddy_08@59)cvMY|Q@Os}H`ntm4ZOQ?Re}#5b;CLaGjbNrsy+>f0y?`$>?7c_F zU>~SyY|i|vwgzyRfo(8|k+(TgNUdqz3tM18G|>9-gRZA=m-%DKVSG6M2#hjjRwJb{ z(Ckc>Ok79%1Xz~Q1jhX=_NHi3VE`6(i>-@1LJRW$&=q>|6fx_zZpDF9OKKcRkb mQSnE|zK%K>=wzUD2L1x@_{1S?sgf7~0000)wB diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_full.png b/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_full.png new file mode 100644 index 0000000000000000000000000000000000000000..07f989416d741bd588960d47caed7eca984e9906 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G|s0G|-o z{}=!$0~EX2x2h7zVlN5u3ocf^{kioggX1dY7eJv{PZ!4!jq}MK&dfYl#5@cgg*|j# zg+26->pytYrY0cQrWO#_7OpT+&{tt4hcCkkHD87|YAK8xW=~)}kaLI0!2BR=S;yH~DQf<|fEF=$y85}Sb4q9e0NP+tK>z>% literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_half.png b/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_half.png new file mode 100644 index 0000000000000000000000000000000000000000..e79bf3d04d35b173bee91d86d7ac3487bfe8882f GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G|&0G|-o z|9AmV6;NLF((NiBi@PMqFSuCQ>+@}&)}NZb44%{3*8zo7JzX3_G|neSw6aO8(B0s~ z?3?g1#H4Ym@kefx(uJHZZVNfj%xMizP*k3EV3KYI)9Uic8WZNUss+Ths%@wik7Hag zJAkzz&qNS%G|s0G|-o z|JVRfQgiCFTR@7VB*-sVncLY*)5n)#$M1i0fMT(pE{-7@=aV(unR%{=X&5>RYxuef zYj_{lfAFSHO+c(qZNjv^@C6eDeHUnO`ZAnQ^JRFWmcqDU_5{`gId_;0%n!0A{v;S3j3^P6!lvI6<80X`wF z|0x4NV}J%EY!1lVx7X(;0HAhuYNQcH(mL-WPa!h Z{w0$Ft{wGejsd!n!PC{xWt~$(69Dz&uUr5C literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_roaming.png b/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_roaming.png new file mode 100644 index 0000000000000000000000000000000000000000..f5245005b14eeaa2aaa806e51647b172570a0a6f GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}dpunnLn1hn z6C_v{D;h{RKluOue|@6_OC9saP=#-cS6e%pF(2etu;VzQaJ+^w$#9n?Q-&mm4QnLF zlIP794i7xJ*$o5}U+Axx_1|U1(mtV%_W$*)m%1AzT$&d(zYAp8BFxvd;<2eu@CVm} z-U~j3tPs=mS!*KF`0Kak1TmIJ_6{}E+pZ-_@fI_9u${1DdHOne)sh&NaFIXEQh&v> s{-kNV_1{^#Sgoh+Kn4d2p}@n);Gj6kB~W8`F3=wgp00i_>zopr0PXo)_5c6? literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_wait.png b/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_wait.png new file mode 100644 index 0000000000000000000000000000000000000000..02b4bf29015f37ddf1aaa66a794571d5ef66c6b4 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S3F%DLn1ie zPT9-JC5v?c3+v{Ox0Ct&u5q)A zq&-M(+kSe_ZtIx9;VhMe!x?F0=>CS($U;$5*wOha9F) z7epOCU=-JRlf!9k;&gwd$3K=WYpWXB>ga02oWqiGA6j^#KKd%NZWhVA&?fXd?`LF@_5GTwEMS?o!aq-ujTl&ki;orFZ8OJ<~684;H&^q eAO3UhVU*-N8qfaZ$6=uV7(8A5T-G@yGywn%opWyh literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_status_bluetooth.png b/entry/src/main/js/default/common/image_xxhdpi/ic_status_bluetooth.png deleted file mode 100644 index 53c6d464ce820db2a66907d80df8fded23c68e09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 617 zcmV-v0+#)WP)Px%BS}O-R9Fe^mODa_)LYqN1zk4S1sJ``}f8B%@H6)-*G#TZCeKsCK22}0%pWQOL2(0nw5|~}#>8*(zXWhID@1d~3wMNuF-CL4{|bNyT_Hw%sIFv< zAwHJQJ2%sBCikT|IzB0Y{Rq2|zsTFfnf%{?93ZSbv0+@lE7kBwDX91_=4`5btMAVlf z_K^R^n0!vj0-ykh-d&O4HZ$TQwdE(6u82=GDi%dK0!|3jDT=u&}i+M5u3u1xBa00000NkvXXu0mjf D)Qk_= diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_status_wifi.png b/entry/src/main/js/default/common/image_xxhdpi/ic_status_wifi.png deleted file mode 100644 index c8d92cf4f9625d95cea6aea3e3e5861a49be0215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1135 zcmV-#1d#iQP)Px(DM>^@RA>e5n8|NVQ5?r#OIkBUm7*!BDM3Xw#1KuiVkc@^7&bOGmLmQFJ6kIu z!iExTG$ch+jc7_t9k6JsBw}c2rDEvw`O1CmednEb-@U!B>B9Xb-<)%Q=Xbup;hy2X z7mGy_RUoQBRDq}hAu5m)Vs6sZcs!nqVg{J%!ZiAE&}X1GCnrbx&=M*Ef-WM0Fn@!*Z2zoL^RbVri39=!dAh{13N#;ioLf;7xcmc%KU<=3( z;v|6W0Jch`fkeLgnU^sE0?&hJH&Ec?JV?JY_6qcZZ!XYH+82d9F9lx9?Kk5M;0B4P zpH@5*Aovny9szUHFuXzk610JCoDHV2OH#wD4Zi?r|CEC=V3Qt{XW@Ns8b)6oqpdRA4w4numrI2g~Yk?V)-as9`?$V}+X&i%WJXS}+sub&3tQnmG|6myl zt-|+gNOpmB7P2Sk^frFE$7~5~!r-vmh`!eJc_wSQWE29?Cf9v1#WB|WKGV4~meMf4 z0_6dq6VEN@;CSd(sM@BO7tAvZE-+D-kyUUwj{)5U+MI&v7!@~KJf7I-?L4-@X+8hZ zw_^Jm8x_*M60~=c#P$ZX=J$a`pc%4zv?+oEk*x;RU`dLBKZSz4g%9hS#fRdn0+m4f z?J~B1Xon;vfuRwP4#c{34}v)!W;qbrK9wn0Kx0K=NKro5Ndxkf)}8R00u2K|5Wf4(^(0sz${=& zH;OZGd@%=X&p{G60l{K}L{+W_O*s5%jCnqiNG=9CZFFp!iFCqu+LOQ;w4Flf=IK+} zEsuG)h$AhTz`{Jer4|x-PP-p$bdlKJvTJy_8{`daV460rDt(mz9t_ij?~%xQSat&K z6%{7wyie!BcLE~7iH_K~Q@s>U#&wfc0^J3=8?~{whDglBo zgY3AQ(AC$n(NUNObm3|FnWBw+iX?P&j!1%>LN*5rEy_pe^u_uvF{X7*e?Hg&DiV5H z9i=*&N1Q;|H&B4{lVCdN0+%vXlVnPC+ zp_Y(W>8P&mgL22_Da)kA%YLL|qmlr@?;)TXBd9whQD^8vKL%R2e!LNUA$Df)np)$G z`JwS`ll27fY&%*L0eOujYy!2Tk-%q<2=o_XR%J92=q5saw3#BEeyL?uMr#vKBuf4C z96E*QUt<%8{&>r3_7PcBfv5se1)>T>6&ULZ`~|;fE*wedUwi-n002ovPDHLkV1k@6 B0KxzO diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_full.png b/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_full.png new file mode 100644 index 0000000000000000000000000000000000000000..3d07a122b467da87f18c59a6a9405e84150919e6 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;00X`wF z|7ie#W&=%~eDL;HAWOC+$S=6guyVrsXtPtyPsO-CY)KW;zwqy8;royIeF1U}3{eqB zt^*Y=^mK6y@i_kW>RG-f0|Ax?T}|~IN+P$8R{p=9!fB$YX6w@wC{%U3Y@av(=4ZZg zo14Ejl+0tA#N5Zo+c1rBFVi3H4|4+!FosE7$l8#2K;q4Iu0Jm$j1;OF`Po#YR!9m6 z&1PvoWyKZp>yhMw|NMs=`j7Y@d|J8qz~3ILRELG;;cPBK+D!r5i`TmxV->I#{dFg1 oV&TuViK#w!C8WP^{jF-i&>Hxw+)_8D4d_?~Pgg&ebxsLQ07!(xqyPW_ literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_half.png b/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_half.png new file mode 100644 index 0000000000000000000000000000000000000000..54f893156fc698d524ed2582a66aa10d0d969d30 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6-z0X`wF z|LFpNwgK%qwoj`E$Wkr|@(ZprWEM+(Dzs(7DYMG;(fSwu{VdG?sQkW9Nn0{N&XcP_ z-IwA1d>K8U@-3b&jv*e$-(L0PZZ;5MN!a~&7)~!iykXx?8^P=f&kYlC2yktQw zqdMCi1{R(bq6sS#9?zb_w2#f3?ZwZ-$qwRc(wVlMmu0=fda#+XnpZ~RgXbUq7O9TX z{!;$qg)3%u8f{~Hp%=&{Vcq9E(f8`!-c$e5``&!N5w7}o!J79bJMUF-=zLhVym$l9 O{S2P2elF{r5}E*l?%$mN literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_no.png b/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_no.png new file mode 100644 index 0000000000000000000000000000000000000000..bec95a3438320d4ea37fa941e9a4e0a5134b912a GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6`-%bVJ|sj}+`vf1_CrQr{^8josX=oV%p=rZ4PXedBtQ0D^?O05m8 z9Xd=h%)huVtZr<0bXtn#L-D1i2IUt?th-*hv+&4h2wW&~P&%N#h~;yND2tliMUD!U zM@&iY6ee6(F=m;v=dyyrgbKkQyY^P88r*Bp|FU`~)8oI9f2S9gC1?2Df9IaS&XIe0 V$ElRY2A~5OJYD@<);T3K0RX)jrf>iN literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_null.png b/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_null.png new file mode 100644 index 0000000000000000000000000000000000000000..f974779f120e74178c7c4821141a9f8da224ebce GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;y0X`wF z{|62LodC4l@!)xoCq|hRbXFq!<_&89iMbLp+YZy?Ti@_M0&Q^>SUeh!?$_jn?7953`ta?fMl6d!l?RVb&) z?AeZUue0<_zSsLe;ZvkedTAB2piXZ>{8w%3`=yM>tLzlc#fcy2`|WHx&GU#AAh~6dxovc>Pf=xbE7-l>Nimz`^^Ec*M?Pkr{4R$_*4+^$pn~gyLDU?p~`t yTJ)D8YvJ|Tr;Gl|tgbRzbvI-8xA$NA4+uv{W(e8dTb~CELIzJ)KbLh*2~7ZArxzXo literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_roaming.png b/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_roaming.png new file mode 100644 index 0000000000000000000000000000000000000000..649632b5f71d3aebcd73febfcc6ffd2695140784 GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6& zzl2M4wb+{cAU@0b@CF9g{gWO7b=G^jIEHu}e|yDU=#YU(bK+%d&b`xFf(qXJ|93oj zhvSyidEf54EuPq&G>4I~X3zJ#tMd4n_WSTDCB$$iTzKuQ+Ms4N!z+P*yPaTIC&-l?5c*qkBay7^*~k>r&$Ly!18Z`L!$ld*I$=K*~7KJU*Af*d#L=Z)eW|&9^-1WKCL{L`wsFSMNNuj zo;@#oKi6*J``r=D+vFAZzdX&!wO{D@!naFz?&iD0QN=Umih7i5_KI$&tpRsscd#-Q z@Yya7c<9U0nzdN6`r2Cd5~;llLuAh^iB8~VdttH5|H-oZkB+~IoGy1Fo4K|lf7aKj z-Y-~KUrcMfYxp_V_`XkZxavrqt&mjfgarZk{)LRCI6 Y|5;yC(^}(m1{fI(p00i_>zopr0MHz`#sB~S literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_status_bluetooth.png b/entry/src/main/js/default/common/image_xxxhdpi/ic_status_bluetooth.png deleted file mode 100644 index c96d94e1febd1bc148025793743a4cba92f47d0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 753 zcmVPx%t4TybRA>e5n6XaWKoExSl87o2MG_qnC{^kR-XUFxkW$fJk%E$fiaup{0E$%9 z2yrA$Bp!i01V}U~kf@NN)oCI^VnXmZ!qYs&p@AnJ_FC3 zfngK<>2&%Q^T+Ua@ZZDX@X{Oag?B3qJtJ zMij`>yvCp-xEVqNyip3TQQuz#0*jFgLIYeV09Ka*5dc8`2cnZDL3|RO0Kfx)I7iV1 z#DfSH^HPyyzeuT7hftoWj z0B0H@v`A8%16=@|;DE@AF9cwOFo`b=kby9ZGfwR~z|Liu`yL>a;XW{D!3|&#m&BPM zTmTMnGlcmbFp6^_(w5!Sm;h?Tnc_RGhWan~Bs!La$O0t9x%rF%+;7n&KuWxBZRgp0 zUgfm_i;7G7GZ5=Ct`eZBxCBo?jAhImKwIJ>fbt3+Z%V^ANC}{Aam3@-)jmAll!kAR z0D!^Vt5@x0YBv)YUu#O7kD;~+E)BmyW)=X@3VZdU&$N^lV@pLwoZlY7G(gy^qjxFd zq<9rj27_bNzZUINr0G`mS*yI}j8T>L(wR#@*ULyINr_Y+qW)gmD7j01soJdanpcXm zQ(pqMo0?0UVr>KH6G)!94D1TPB;Hj9%;IeT#7~M#oB;YUWZP?Jn7}`(NAL^1!g&Mr jPx)g-Jv~RCodHnCpvGRT##dsWiKpSz1XsW22RnK^G&seb6Ebg~9rekVp}9fuIk4 z>o2HJMNmXiSOg*oMi<0VD#DsbL%U*=jcFxmSF^Il>GzxVfx~8>eb(7$@14V57)rU;ECfetNZgKuHS`kB801@D|96Q1D{XyMey9NvMAQsRq!!fj}V^~ zb5U@4GH?ex2>Xi$F1g>Q_*;h%Uv%oXqZPowrxIWpbml|xJ%%Rs6|}IqY=4Fpw%?(! zAj&DwB6%7-2hN4Z!cYuhxEdi2gmwrLfPrgwHCzhYB{YhSOL8mRPBK66ECk|ORQuq0 z2?ux{1@qwG*AVxeJflWiTLDPIBkOk9Zq^TCvk`9UWCpMg2DzM!@j~cim{%Swl+Te% z?h%?R00Ga$$=z^zPNbh`+W_ApSYt`&n0MbqUarEcpkkbo<8cpdkCT^MFB2^VAV@zw z?uYKpEV$Ix!OaBtGs~drcjV}HxE2n=#-%D9)|L4vIqpn1_&ra62WdYms}t`$exAXp zv;VIHA!d-o3g{&)3&Z64P*%gySuc}!UR%@nix+F*MjQs;#z@d*YDJ#|r@|AU7bc(L z7wF00Q&ETEC&cj5(-zq6CC0-TUJn<;^tjy0naEoKchF-&Q?IZ2{1n05S8YK;&c>C{ zJA=ns5qv`@SKAiiejeh0xL&{Sfz1;*ME{jp{qqE{(A)(3py&8YILY1X1b0tf3>U(F zSSDN*uad*|c23E|mE}rM4EO%a^vf*JEd`)cMbhsJ1#H)lW(8<_RMv$%rVBqfM zWzdKV;otkm1pyEh_D0aE1-3v8HM5&-2%Nt zz71Xhy&JgCJ(|2JRt`ik{vhkuR-3kdnuyK&cF?<*e35@OW*v^A)pMGe? z_w*QrUV$x=!_Z%McHmQCbAeA!iQW*~R*t$7pq10+_ax~(+?l!@Dp&{BfxId@_10Mqz-wFLCSSa3_e?I;P{xX0Wa5nU;E(H2cf^(t2`9(wpDo~)3 z8qh9Jmh?<)mcahRb|=pl+2ebX@3lQ@7l6Tgrr!nAwZW6(2}JPHQyWUZ2<2tY;3w0* z9Hs|vH{UH!Z2VpeY88MH&4K>**9x|2Qyc0QAmlg;u_;ZUx&_!9ka>trfSWLrx&`p( ztgNeYBU{_FsSULXK!x}J`&H12pN8*NB{u1{%D&fr3_6k{=^jv-ve9u=ASw_Qhzdjn lq5@HYs6bR8DsV(A@HZt!f&fd#NS%G~10G|-o z|1ba)05TIVSuO!7EeY}qW_#AbaN=ycIFMiO>EamTas2Jojl2y8JT4bIcqd3SH1W=0 zc=9*hsVMp8J{eZc4O2w&{&YPt&wPG5Q@Dop^seH96K4;qiL)zx%3i=Jae;*=gNdyq zTry%Y-v&3?gkGxyWv-4HQ=sU^Rpu2Fp(w*#;)U#mg7prEOC6HyJRcumF8{u=%(*@@ QALtYYPgg&ebxsLQ0Q_NF9smFU literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_half.png b/entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_half.png new file mode 100644 index 0000000000000000000000000000000000000000..bd6005a2d2195a135161a4383ed73d077323e667 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}%0G|-o z|JVRf5-9wAK}{Zz#ZeOE7tF+_<@T(@mtkLV-)W%OBu^K|5Rc<;uWsaQFc4w6@PO}I zn4W?~W9!ff7)jp&lRNjt$3iD(dO5D&y3gYwyDA9 zcxIOc3`zkEf*K96Cl|~W;|<$yGUM-+19wleo$z2xS;Alx#ISo3qp=r5+7yN}8jL%B z^E{BY`0!`3)Dc~a0ENJbO6+_g0o%G>+rO6F!T5N_(x8bNS%G~10G|-o z|40BRHt}RBJCI^63GxeOa?|oEamTas2Jojl2y8JT4bIcm=o>3>hm} zzs=`7*_-;iMr4UXP|%K#+LP`txvRh2_k*a;>vIPc#o1@ik?AW%fx$~vG=FyS7!dK)c+}K|LGJ1UBck$ L>gTe~DWM4f9Ff|19~{pG0lD$DjAbKQOFnOxeW-3O)b z)y!j-`H=WP#;rZ5zqH6}d&rW^-Rp7%6xbSO3%$yc3FgZ9{c$UYK!f0`$0l<%7R+wo zW30K*^vlk{iE(cg#{_Y$ii>DTVjV^xv9_TiEv0ZZrOV{;z^v zH1nTo!2_?7Srfi)WZLj6f-&L@<9@~;zc?87*)cV&?`L?B%=bf0VJ$zW$7^S%OTQ*G xn0z~aU>EaCmpDhOiMA8`-qjyu{Lg%cF+B0alur3u$-v-a@O1TaS?83{1OT+^{BZyP literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_roaming.png b/entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_roaming.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f9a71caf8d6fb474d8c387a105f9bfd66b26ad GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!SkfJR9T^xl_H+M9WCil)1o(uw z{vVV8=sKXgww_6x3}hLX1o;K4MX9(xlE3Cue_eN#!-wwk@%zP2{_DN`c=AEVmA`~6 znH2<0W9Dp}!MM3C=xq|qjjwM`G2Fh{o(t5z*we)^B;xSftH=2c83?o_Ubb$z7yV+1 zz@GR2^UgG?e<*OAW&2})ZP1gck8Ldd8XDx8^$)8&erYDM;k}5p(1u7co{-CFO>>$W zw|`fCa*84K$sq>QC+8SMpUCiBiA`=;^2Aiko$rRtN!KXh)pxR<|7hB)p0}{S_$Wi{ z9B#G~RcW84H+#scq&09<8XU+-n#OLQ>72s(V!{6=21X_p4grM+^BehV7fN>gTe~DWM4fGI11j literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_wait.png b/entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_wait.png new file mode 100644 index 0000000000000000000000000000000000000000..1a8c0ac018dbb91172d576fb3abe868839b17530 GIT binary patch literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zk9oQ{hEy=V zow3`C*-@lza>c<@K}U)ly*G;Mh`jl#DI&6_wPf3(Uj2l{{t6tAls%4kIUeCw>d0TP z=Ke$<3BKJdo6o-cz%TP`)AIv0_xWxruAMfE=R^Yn{gFKJ*+yBe1(1lw@MC=_o~~Ul^C~+n%!I-5Zxct_fg`b*xdhjH_e^6S^TN3v7S&=SlsL`gZC`U%Fh20!wDXy7WL9`S(rntDWFyy*<8vb_qn}6Z&}WsZhOmzJ4j%QM zKEkq(dN|G&O`F{CO`xHaId%X3#pZ&AuYc`Y@@#_K@hy2ZQ$%tEc@E?*dVV0c%6Ut7 z)}$!rPe(GmZzTq8kYjtn%wBi!&VRNyzjvuTYgi{_Kd~YB*f-V<-Ipr2%)1xPutW2a zY10;S`yEdWw^bh~{bIAWnjzt%==bKIJ@(hu{G9z@+xg5VG6vR<-n(QhO;9oKY=`>? Z^t)#+l{MP%tN<9j44$rjF6*2UngGr>?S23N literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/center/statuscenter/manager/IconManager.js b/entry/src/main/js/default/common/utils/CheckEmptyUtils.js old mode 100755 new mode 100644 similarity index 48% rename from entry/src/main/js/default/center/statuscenter/manager/IconManager.js rename to entry/src/main/js/default/common/utils/CheckEmptyUtils.js index ad965eb0..008e5ece --- a/entry/src/main/js/default/center/statuscenter/manager/IconManager.js +++ b/entry/src/main/js/default/common/utils/CheckEmptyUtils.js @@ -13,14 +13,34 @@ * limitations under the License. */ -var mStatusList = []; +export default class CheckEmptyUtils { + /** + * Check obj is empty. + * + * @param {object} obj + * @return {boolean} true(empty) + */ + static isEmpty(obj) { + return (typeof obj === 'undefined' || obj === null || obj === '' || Object.keys(obj).length === 0); + } -export default class IconManager { - setStatusList(list) { - mStatusList = list; + /** + * Check str is empty. + * + * @param {string} str + * @return {boolean} true(empty) + */ + static checkStrIsEmpty(str) { + return str.trim().length == 0; } - getStatusList() { - return mStatusList; + /** + * Check array is empty. + * + * @param {Array}arr + * @return {boolean} true(empty) + */ + static isEmptyArr(arr) { + return arr.length == 0; } } \ No newline at end of file diff --git a/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.js b/entry/src/main/js/default/common/utils/Log.js old mode 100755 new mode 100644 similarity index 42% rename from entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.js rename to entry/src/main/js/default/common/utils/Log.js index f39081a0..69980760 --- a/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.js +++ b/entry/src/main/js/default/common/utils/Log.js @@ -13,19 +13,40 @@ * limitations under the License. */ -import StatusCenter from '../../../center/statuscenter/StatusCenter.js'; +const TAG = "SystemUI_StatusBar"; -var mStatusCenter = new StatusCenter(); +/** + * Basic log class + */ +export default class Log { + + /** + * print info level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showInfo(tag, log) { + console.info(`${TAG} tag: ${tag} --> ${log}`); + } -export default { - data: { - statusListData:[] - }, + /** + * print debug level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showDebug(tag, log) { + console.debug(`${TAG} tag: ${tag} --> ${log}`); + } - onInit(){ - console.info('Status onInit'); - mStatusCenter.setOnStatusListener((data)=>{ - this.statusListData = data; - }) + /** + * print error level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showError(tag, log) { + console.error(`${TAG} tag: ${tag} --> ${log}`); } -} \ No newline at end of file +} diff --git a/entry/src/main/js/default/i18n/en-US.json b/entry/src/main/js/default/i18n/en-US.json index 9e520910..1a0eedcd 100755 --- a/entry/src/main/js/default/i18n/en-US.json +++ b/entry/src/main/js/default/i18n/en-US.json @@ -1,4 +1,16 @@ { "strings": { + "monday": "monday", + "tuesday": "tuesday", + "wednesday": "wednesday", + "thursday": "thursday", + "friday": "friday", + "saturday": "saturday", + "sunday": "sunday", + "month": "month", + "day": "day" + }, + "colors": { + "statusBackground": "#66000000" } } \ No newline at end of file diff --git a/entry/src/main/js/default/i18n/zh-CN.json b/entry/src/main/js/default/i18n/zh-CN.json index 9e520910..dc1532de 100755 --- a/entry/src/main/js/default/i18n/zh-CN.json +++ b/entry/src/main/js/default/i18n/zh-CN.json @@ -1,4 +1,16 @@ { "strings": { + "monday": "星期一", + "tuesday": "星期二", + "wednesday": "星期三", + "thursday": "星期四", + "friday": "星期五", + "saturday": "星期六", + "sunday": "星期日", + "month": "月", + "day": "日" + }, + "colors": { + "statusBackground": "#66000000" } } \ No newline at end of file diff --git a/entry/src/main/js/default/pages/index/index.css b/entry/src/main/js/default/pages/index/index.css index b54aef4f..6acfc656 100755 --- a/entry/src/main/js/default/pages/index/index.css +++ b/entry/src/main/js/default/pages/index/index.css @@ -13,7 +13,7 @@ * limitations under the License. */ -.bk { +.bk{ flex-direction: column; background-color: #66000000; position: relative; diff --git a/entry/src/main/js/default/pages/index/index.hml b/entry/src/main/js/default/pages/index/index.hml index e059bba0..d9d28565 100755 --- a/entry/src/main/js/default/pages/index/index.hml +++ b/entry/src/main/js/default/pages/index/index.hml @@ -15,9 +15,10 @@ */ --> - + -
    - +
    +
    \ No newline at end of file diff --git a/entry/src/main/js/default/pages/index/index.js b/entry/src/main/js/default/pages/index/index.js index 063f92da..9ee37191 100755 --- a/entry/src/main/js/default/pages/index/index.js +++ b/entry/src/main/js/default/pages/index/index.js @@ -13,21 +13,36 @@ * limitations under the License. */ -import batteryStatus from '../../center/battery/batteryStatus.js'; +import BatteryStatus from '../../center/battery/batteryStatus.js'; +import SignalStatus from '../../center/signal/signalStatus.js'; +import mLog from '../../common/utils/Log.js'; -var mBatteryStatus = new batteryStatus; +const MAX_HEIGHT = "100%"; +const MAX_WIDTH = "100%"; +const TAG = 'index'; +var mBatteryStatus = new BatteryStatus(); +var mSignalStatus = new SignalStatus(); + +globalThis.$globalT; export default { data: { - isShow: false, - showMask: '', + statusHeight: MAX_HEIGHT, + statusWidth: MAX_WIDTH, + backgroundColor: "", + showClock: true }, - onInit() { - mBatteryStatus.startGettingStatus(); + mLog.showInfo(TAG, `onInit start`); + // add resources file bind + globalThis.$globalT = this.$t.bind(this); + this.backgroundColor = this.$t('colors.statusBackground'); + mSignalStatus.init(); + mBatteryStatus.init(); + mLog.showInfo(TAG, `onInit end`); }, - clickFunc() { - console.info('statusBarClicked'); - } + onDestroy() { + mLog.showInfo(TAG, `onDestroy`); + }, } \ No newline at end of file diff --git a/entry/src/main/js/default/pages/statusbar/clock/clock.hml b/entry/src/main/js/default/pages/statusbar/clock/clock.hml index 93e8490b..552543aa 100755 --- a/entry/src/main/js/default/pages/statusbar/clock/clock.hml +++ b/entry/src/main/js/default/pages/statusbar/clock/clock.hml @@ -16,5 +16,5 @@ -->
    - {{ mTime }} + {{mTime}}
    \ No newline at end of file diff --git a/entry/src/main/js/default/pages/statusbar/clock/clock.js b/entry/src/main/js/default/pages/statusbar/clock/clock.js index 99f5dd87..963f8f8a 100755 --- a/entry/src/main/js/default/pages/statusbar/clock/clock.js +++ b/entry/src/main/js/default/pages/statusbar/clock/clock.js @@ -14,22 +14,24 @@ */ import StatusCenter from '../../../center/statuscenter/StatusCenter.js'; +import mLog from '../../../common/utils/Log.js'; +const TAG = 'clock'; var mStatusCenter = new StatusCenter(); export default { data: { mTime: '' }, - onInit() { - mStatusCenter.setOnTimeListener((time) => { - console.info('ClockModel mStatusManager time:' + time); - this.mTime = time; + mLog.showInfo(TAG, `clock onInit`); + // get currentDate + mStatusCenter.setOnTimeListener((currentDate) => { + this.mTime = JSON.parse(currentDate).time; }); }, - onDestroy() { + mLog.showInfo(TAG, `clock onDestroy`); mStatusCenter.stopUpdateTime(); } } diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.css b/entry/src/main/js/default/pages/statusbar/statusBar.css index 03cdb5aa..9cadf929 100755 --- a/entry/src/main/js/default/pages/statusbar/statusBar.css +++ b/entry/src/main/js/default/pages/statusbar/statusBar.css @@ -14,7 +14,6 @@ */ .status_bar_page { - background-color: #66000000; flex-direction: row; display: flex; flex-wrap: nowrap; @@ -32,10 +31,27 @@ text { width: 100%; } +.signal { + align-items: center; + margin-left: 10px; + height: 60px; + width: 200px; +} + +.signal_text { + margin-top: 12px; + font-size: 36px; + width: 120px; +} + +.signal_icon { + object-fit: contain; +} + .icon_list { margin-left: 6px; - width: 100%; - height: 30px; + width: 120px; + height: 60px; display: flex; flex-direction: row; } @@ -49,8 +65,8 @@ text { position: relative; margin-top: 16px; align-items: center; - width: 80px; - height: 40px; + width: 120px; + height: 60px; background-image: url("common/image_xxhdpi/ic_status_battery.png"); background-repeat: no-repeat; padding: 1px; @@ -58,10 +74,9 @@ text { } .battery_progress { - margin-top: -7px; + margin-bottom: 13px; margin-left: 6px; - height: 32px; - stroke-width: 32px; - stroke-linecap: "round"; + height: 25px; + stroke-width: 25px; } diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.hml b/entry/src/main/js/default/pages/statusbar/statusBar.hml index dc57d75b..6e3f486f 100755 --- a/entry/src/main/js/default/pages/statusbar/statusBar.hml +++ b/entry/src/main/js/default/pages/statusbar/statusBar.hml @@ -15,18 +15,26 @@ */ --> - -
    -
    + + +
    +
    +
    + {{ mCellularType }} + + +
    + style="width : {{ mProgressWidth }}; background-color : {{ mBackgroundColor }};">
    - + + +
    diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.js b/entry/src/main/js/default/pages/statusbar/statusBar.js index 3e6af816..54fec8b2 100755 --- a/entry/src/main/js/default/pages/statusbar/statusBar.js +++ b/entry/src/main/js/default/pages/statusbar/statusBar.js @@ -14,29 +14,51 @@ */ import StatusCenter from '../../center/statuscenter/StatusCenter.js'; +import mLog from '../../common/utils/Log.js'; -var mStatusCenter = new StatusCenter(); +const TAG = 'statusBar'; const LOOP_TIME = 1500; +var mStatusCenter = new StatusCenter(); export default { + props: ['statusHeight', 'statusWidth', "backgroundColor", "showClock"], data: { + mCellularType: '', + mTypeShow: '', + mCellularImage: '', mBackgroundColor: '', mProgressWidth: '', }, - onInit() { - console.info('onInit'); + mLog.showInfo(TAG, `onInit`); let that = this; setInterval(function () { that.getBatteryValue(); + that.getSignalImage(); }, LOOP_TIME); + }, - console.info('mOneSignalImg====>>' + this.mSignalOneImg); + /** + * Get signal icon Data + */ + getSignalImage() { + let signalStatus = mStatusCenter.setOnSignalListener(); + mLog.showInfo(TAG, `signalImage: ${signalStatus}`); + this.mCellularType = JSON.parse(signalStatus).cellularType; + if (this.mCellularType == '') { + this.mTypeShow = false; + } else { + this.mTypeShow = true; + } + this.mCellularImage = JSON.parse(signalStatus).cellularImage; }, + /** + * Get battery data + */ getBatteryValue() { let batteryValue = mStatusCenter.setOnBatteryListener(); - console.info('batteryValue = ' + batteryValue); + mLog.showInfo(TAG, `batteryValue: ${batteryValue}`); this.mBackgroundColor = JSON.parse(batteryValue).mBackgroundColor; this.mProgressWidth = JSON.parse(batteryValue).mProgressWidth; } diff --git a/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.css b/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.css deleted file mode 100644 index 911e33d4..00000000 --- a/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.css +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -.status_list { - display: flex; - flex-shrink: 0; - flex-direction: row; -} -.status_icon { - margin-right: 8px; -} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.hml b/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.hml deleted file mode 100644 index f0a374ab..00000000 --- a/entry/src/main/js/default/pages/statusbar/statusIcon/statusIconList.hml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - \ No newline at end of file -- Gitee From 941257171c6a5ad4112348197b7d0bb08307d92f Mon Sep 17 00:00:00 2001 From: lin-shuai5 Date: Tue, 20 Jul 2021 21:35:03 +0800 Subject: [PATCH 006/373] system dialog Signed-off-by: lin-shuai5 --- settings.gradle | 4 +- systemDialog/.gitignore | 1 + systemDialog/build.gradle | 13 ++ systemDialog/package.json | 1 + systemDialog/src/main/config.json | 51 +++++++ systemDialog/src/main/js/default/app.js | 27 ++++ .../systemDialogCenter/SystemDialogCenter.js | 46 +++++++ .../src/main/js/default/common/utils/Log.js | 52 ++++++++ .../src/main/js/default/i18n/en-US.json | 7 + .../src/main/js/default/i18n/zh-CN.json | 7 + .../src/main/js/default/pages/index/index.css | 119 +++++++++++++++++ .../src/main/js/default/pages/index/index.hml | 40 ++++++ .../src/main/js/default/pages/index/index.js | 126 ++++++++++++++++++ .../main/resources/base/element/string.json | 12 ++ .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes 15 files changed, 504 insertions(+), 2 deletions(-) create mode 100644 systemDialog/.gitignore create mode 100644 systemDialog/build.gradle create mode 100644 systemDialog/package.json create mode 100644 systemDialog/src/main/config.json create mode 100644 systemDialog/src/main/js/default/app.js create mode 100644 systemDialog/src/main/js/default/center/systemDialogCenter/SystemDialogCenter.js create mode 100644 systemDialog/src/main/js/default/common/utils/Log.js create mode 100644 systemDialog/src/main/js/default/i18n/en-US.json create mode 100644 systemDialog/src/main/js/default/i18n/zh-CN.json create mode 100644 systemDialog/src/main/js/default/pages/index/index.css create mode 100644 systemDialog/src/main/js/default/pages/index/index.hml create mode 100644 systemDialog/src/main/js/default/pages/index/index.js create mode 100644 systemDialog/src/main/resources/base/element/string.json create mode 100644 systemDialog/src/main/resources/base/media/icon.png diff --git a/settings.gradle b/settings.gradle index a58b4aca..015fb8d5 100755 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2021 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. @@ -12,4 +12,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -include ':entry', ':navigationBar' \ No newline at end of file +include ':entry', ':navigationBar', ':systemDialog' \ No newline at end of file diff --git a/systemDialog/.gitignore b/systemDialog/.gitignore new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/systemDialog/.gitignore @@ -0,0 +1 @@ + diff --git a/systemDialog/build.gradle b/systemDialog/build.gradle new file mode 100644 index 00000000..6de6c8b2 --- /dev/null +++ b/systemDialog/build.gradle @@ -0,0 +1,13 @@ +apply plugin: 'com.huawei.ohos.hap' +ohos { + compileSdkVersion 6 + defaultConfig { + compatibleSdkVersion 6 + } + entryModules "entry" + supportSystem "standard" +} + +dependencies { + entryImplementation project(':entry') +} diff --git a/systemDialog/package.json b/systemDialog/package.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/systemDialog/package.json @@ -0,0 +1 @@ +{} diff --git a/systemDialog/src/main/config.json b/systemDialog/src/main/config.json new file mode 100644 index 00000000..ada76ba5 --- /dev/null +++ b/systemDialog/src/main/config.json @@ -0,0 +1,51 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 4, + "target": 5, + "releaseType": "Beta1" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.systemdialog", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "systemDialog", + "moduleType": "feature" + }, + "abilities": [ + { + "visible": true, + "name": "com.ohos.systemui.systemdialog.MainAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "page", + "launchType": "singleton" + } + ], + "js": [ + { + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": false + }, + "pages": [ + "pages/index/index" + ] + } + ] + } +} \ No newline at end of file diff --git a/systemDialog/src/main/js/default/app.js b/systemDialog/src/main/js/default/app.js new file mode 100644 index 00000000..2ea1b337 --- /dev/null +++ b/systemDialog/src/main/js/default/app.js @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021 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 mLog from '../default/common/utils/Log.js'; + +const TAG = 'app'; + +export default { + onCreate() { + mLog.showInfo(TAG, ` AceApplication onCreate`); + }, + onDestroy() { + mLog.showInfo(TAG, ` AceApplication onDestroy`); + } +}; diff --git a/systemDialog/src/main/js/default/center/systemDialogCenter/SystemDialogCenter.js b/systemDialog/src/main/js/default/center/systemDialogCenter/SystemDialogCenter.js new file mode 100644 index 00000000..70330314 --- /dev/null +++ b/systemDialog/src/main/js/default/center/systemDialogCenter/SystemDialogCenter.js @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2021 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 featureAbility from '@ohos.ability.featureability'; + +import mLog from '../../common/utils/Log.js'; + +const TAG = 'SystemDialog_SystemDialogCenter'; + + +export default class SystemDialogCenter { + getMessageWant(callBack) { + mLog.showInfo(TAG, ` getMessageWant Start`); + featureAbility.getWant((err, data) => { + let appArray = data; + mLog.showInfo(TAG, ` getMessageWant callBack ${JSON.stringify(appArray)}`); + callBack(appArray); + }); + } + finishResult(AbilityResult){ + if(Object.keys(AbilityResult) .length != 0){ + mLog.showInfo(TAG, ` finishResult Start`); + mLog.showInfo(TAG, ` finishResult parameter ${JSON.stringify(AbilityResult)}`); + featureAbility.finishWithResult(AbilityResult, (err, data) => { + mLog.showInfo(TAG, ` finishResult finishWithResult callback`); + featureAbility.terminateAbility((err, data) => { + mLog.showInfo(TAG, ` finishResult terminateAbility callback`); + }); + }); + }else{ + mLog.showInfo(TAG, ` finishResult AbilityResult is a empty object`); + } + } +} \ No newline at end of file diff --git a/systemDialog/src/main/js/default/common/utils/Log.js b/systemDialog/src/main/js/default/common/utils/Log.js new file mode 100644 index 00000000..c7fe5c57 --- /dev/null +++ b/systemDialog/src/main/js/default/common/utils/Log.js @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 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. + */ + +var TAG = "SystemUI_Dialog"; + +/** + * Basic log class + */ +export default class Log { + + /** + * print info level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showInfo(tag, log) { + console.info(`${TAG} tag: ${tag} --> ${log}`); + } + + /** + * print debug level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showDebug(tag, log) { + console.debug(`${TAG} tag: ${tag} --> ${log}`); + } + + /** + * print error level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showError(tag, log) { + console.error(`${TAG} tag: ${tag} --> ${log}`); + } +} diff --git a/systemDialog/src/main/js/default/i18n/en-US.json b/systemDialog/src/main/js/default/i18n/en-US.json new file mode 100644 index 00000000..d71202bc --- /dev/null +++ b/systemDialog/src/main/js/default/i18n/en-US.json @@ -0,0 +1,7 @@ +{ + "strings": { + "dialogTitle": "Access Request", + "sure": "sure", + "cancel": "cancel" + } +} \ No newline at end of file diff --git a/systemDialog/src/main/js/default/i18n/zh-CN.json b/systemDialog/src/main/js/default/i18n/zh-CN.json new file mode 100644 index 00000000..842be8a9 --- /dev/null +++ b/systemDialog/src/main/js/default/i18n/zh-CN.json @@ -0,0 +1,7 @@ +{ + "strings": { + "dialogTitle": "权限申请", + "sure": "确认", + "cancel": "取消" + } +} \ No newline at end of file diff --git a/systemDialog/src/main/js/default/pages/index/index.css b/systemDialog/src/main/js/default/pages/index/index.css new file mode 100644 index 00000000..3cb64f28 --- /dev/null +++ b/systemDialog/src/main/js/default/pages/index/index.css @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2021 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. + */ + +.container { + flex-direction: column; + justify-content: center; + align-items: center; + border:1px solid #000 +} + +.dialog-title{ + height: 15%; + flex-direction: row; + align-items: center; + justify-content: center; +} +.dialog-title_txt{ + color: #000000; + font-weight: bold; + font-size: 46px; +} + +.btn-div { + width: 100%; + height: 19%; + flex-direction: row; + align-items: center; + justify-content: space-around; +} + +.txt { + color: #000000; + font-weight: bold; + font-size: 39px; +} + +.dialog-div { + flex-direction: column; + align-items: center; +} + +.list { + width: 100%; + height: 65%; +} + +.list-item { + width: 100%; + height: 130px; + display: flex; + flex: 1; + align-items: center; + justify-content: center; +} + +.item-box { + width: 100%; + height: 100%; + margin-left: 20px; + border-bottom-width: 3px; + border-color: #ACABAB; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} +.layout { + width: 70%; +} +.switch { + width: 20%; + height: 100%; + display: flex; + float: right; + flex-direction: row; + align-items: center; + justify-content: center; +} + +.button { + height: 80px; + width: 180px; + background-color: #008CBA; + color: white; + text-align: center; + align-items: center; + justify-content: center; + text-decoration: none; + display: flex; + font-size: 32px; + margin: 4px 2px; + +} + +.button_cancel { + height: 80px; + width: 180px; + background-color: grey; + color: white; + text-align: center; + align-items: center; + justify-content: center; + text-decoration: none; + display: flex; + font-size: 32px; + margin: 4px 2px; +} \ No newline at end of file diff --git a/systemDialog/src/main/js/default/pages/index/index.hml b/systemDialog/src/main/js/default/pages/index/index.hml new file mode 100644 index 00000000..ca4d84b8 --- /dev/null +++ b/systemDialog/src/main/js/default/pages/index/index.hml @@ -0,0 +1,40 @@ + + +
    +
    + {{ $t('strings.dialogTitle') }} +
    + + +
    +
    + + {{ $item.permissions }} + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    \ No newline at end of file diff --git a/systemDialog/src/main/js/default/pages/index/index.js b/systemDialog/src/main/js/default/pages/index/index.js new file mode 100644 index 00000000..63bc74c3 --- /dev/null +++ b/systemDialog/src/main/js/default/pages/index/index.js @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2021 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 mLog from '../../common/utils/Log.js'; +import SystemDialogCenter from '../../center/systemDialogCenter/SystemDialogCenter.js'; + +var mSystemDialogCenter = new SystemDialogCenter(); +const TAG = 'SystemDialog'; + +export default { + data: { + getData: '', + workDataArray: [], + useList: [], + unUseList: [] + }, + onInit() { + mLog.showInfo(TAG, ` onInitStart`); + }, + onShow() { + mLog.showInfo(TAG, ` onShowStart`); + // get the requested permission data + mSystemDialogCenter.getMessageWant(this.getMessage.bind(this)); + }, + + /** + * Get permission data + * @param {Object} resultData permission data Object + * + */ + getMessage(resultData) { + if (Object.keys(resultData).length != 0) { + this.getData = resultData; + mLog.showInfo(TAG, ` getMessageWant result Data ${JSON.stringify(resultData)}`); + // handle permission Data to show + for (let item of resultData.parameters.OHOS_REQUEST_PERMISSIONS_LIST) { + this.workDataArray.push( + { + permissions: item, + checked: false + } + ) + } + mLog.showInfo(TAG, ` getMessageWant work with data ${JSON.stringify(this.workDataArray)}`); + } else { + mLog.showInfo(TAG, ` getMessageWant result Data is a empty object`); + } + }, + + /** + * Processing of permission selection or cancellation + * @param {string} checked Selected status + * @param {string} permissions Selected permissions + */ + changeSwitch(checked, permissions) { + mLog.showInfo(TAG, ` changeSwitch start`); + mLog.showInfo(TAG, ` changeSwitch parameter checked: ${checked} permissions: ${permissions}`); + + let indexNum; + for (let i = 0; i < this.workDataArray.length; i++) { + if (permissions == this.workDataArray[i].permissions) { + indexNum = i; + } + } + + if (checked) { + this.workDataArray[indexNum].checked = false; + } else { + this.workDataArray[indexNum].checked = true; + } + mLog.showInfo(TAG, ` changeSwitch End`); + }, + /** + * User confirmation + */ + makeSure() { + mLog.showInfo(TAG, ` makeSure Click`); + for (let item of this.workDataArray) { + if (item.checked) { + this.useList.push(item.permissions); + } else { + this.unUseList.push(item.permissions); + } + } + let want = { + parameters: { + OHOS_RESULT_PERMISSION_KEY: 1, + OHOS_RESULT_PERMISSIONS_LIST: this.getData.parameters.OHOS_REQUEST_PERMISSIONS_LIST, + OHOS_RESULT_PERMISSIONS_LIST_YES: this.useList, + OHOS_RESULT_PERMISSIONS_LIST_NO: this.unUseList, + OHOS_RESULT_CALLER_BUNDLERNAME: this.getData.parameters.OHOS_REQUEST_CALLER_BUNDLERNAME + }, + }; + + let AbilityResult = { resultCode: 1,want: want }; + + mSystemDialogCenter.finishResult(AbilityResult); + }, + /** + * User canceled + */ + cancelButton() { + mLog.showInfo(TAG, ` cancelButton Click`); + let want = { + parameters: { + OHOS_RESULT_PERMISSION_KEY: 1, + OHOS_RESULT_PERMISSIONS_LIST: this.getData.parameters.OHOS_REQUEST_PERMISSIONS_LIST, + OHOS_RESULT_CALLER_BUNDLERNAME: this.getData.parameters.OHOS_REQUEST_CALLER_BUNDLERNAME + }, + }; + let AbilityResult = { resultCode: 0,want: want }; + mSystemDialogCenter.finishResult(AbilityResult); + } +} diff --git a/systemDialog/src/main/resources/base/element/string.json b/systemDialog/src/main/resources/base/element/string.json new file mode 100644 index 00000000..4706d850 --- /dev/null +++ b/systemDialog/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "app_name", + "value": "Dialog" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/systemDialog/src/main/resources/base/media/icon.png b/systemDialog/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 Date: Fri, 23 Jul 2021 20:30:51 +0800 Subject: [PATCH 007/373] Modify OAT content --- OAT.xml | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 OAT.xml diff --git a/OAT.xml b/OAT.xml new file mode 100644 index 00000000..62e7ab5d --- /dev/null +++ b/OAT.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + -- Gitee From fd960f63a1fbabbc0189c2ac46c889aef9e9f53c Mon Sep 17 00:00:00 2001 From: lin-shuai5 Date: Fri, 6 Aug 2021 20:52:22 +0800 Subject: [PATCH 008/373] new feature for Status bar drop down Signed-off-by: lin-shuai5 --- .../center/statuscenter/StatusCenter.js | 26 +++++ .../statuscenter/manager/WindowManager.js | 56 +++++++++ .../common/image_xxhdpi/ic_settings.png | Bin 0 -> 1060 bytes entry/src/main/js/default/i18n/zh-CN.json | 3 +- .../src/main/js/default/pages/index/index.hml | 4 +- .../src/main/js/default/pages/index/index.js | 103 +++++++++++++++++ .../pages/largeStatusBar/largeStatusBar.css | 20 ++++ .../pages/largeStatusBar/largeStatusBar.hml | 26 +++++ .../pages/largeStatusBar/largeStatusBar.js | 48 ++++++++ .../pages/notification/notification.css | 26 +++++ .../pages/notification/notification.hml | 20 ++++ .../pages/notification/notification.js | 28 +++++ .../pages/quicklySetting/quicklySetting.css | 108 ++++++++++++++++++ .../pages/quicklySetting/quicklySetting.hml | 26 +++++ .../pages/quicklySetting/quicklySetting.js | 85 ++++++++++++++ .../js/default/pages/statusbar/statusBar.css | 2 +- .../js/default/pages/statusbar/statusBar.hml | 2 +- 17 files changed, 579 insertions(+), 4 deletions(-) create mode 100644 entry/src/main/js/default/center/statuscenter/manager/WindowManager.js create mode 100644 entry/src/main/js/default/common/image_xxhdpi/ic_settings.png create mode 100644 entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.css create mode 100644 entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.hml create mode 100644 entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.js create mode 100644 entry/src/main/js/default/pages/notification/notification.css create mode 100644 entry/src/main/js/default/pages/notification/notification.hml create mode 100644 entry/src/main/js/default/pages/notification/notification.js create mode 100644 entry/src/main/js/default/pages/quicklySetting/quicklySetting.css create mode 100644 entry/src/main/js/default/pages/quicklySetting/quicklySetting.hml create mode 100644 entry/src/main/js/default/pages/quicklySetting/quicklySetting.js diff --git a/entry/src/main/js/default/center/statuscenter/StatusCenter.js b/entry/src/main/js/default/center/statuscenter/StatusCenter.js index 8933ac77..bb464795 100755 --- a/entry/src/main/js/default/center/statuscenter/StatusCenter.js +++ b/entry/src/main/js/default/center/statuscenter/StatusCenter.js @@ -20,6 +20,7 @@ import BatteryStatus from '../../center/battery/batteryStatus.js'; import SignalStatus from '../../center/signal/signalStatus.js'; import DateManager from '../../center/statuscenter/manager/DateManager.js' +import WindowManager from '../../center/statuscenter/manager/WindowManager.js' import mLog from '../../common/utils/Log.js'; const TAG = 'StatusCenter'; @@ -27,7 +28,10 @@ const LOOP_TIME = 1000; var mSignalStatus = new SignalStatus(); var mBatteryStatus = new BatteryStatus(); var mDateManager = new DateManager(); +var mWindowManager = new WindowManager(); var time; +var mIconList = []; +var mResultIconList = []; export default class StatusCenter { constructor() { @@ -73,4 +77,26 @@ export default class StatusCenter { stopUpdateTime() { clearInterval(time); } + + /** + * Set the status bar window to maximum size + * + * @param {object} callback - Callback function + */ + setWindowMax(callback) { + mWindowManager.setWindowMax((result) => { + callback(result); + }); + } + + /** + * Set the status bar window to minimum size + * + * @param {object} callback - Callback function + */ + setWindowMin(callback) { + mWindowManager.setWindowMin((result) => { + callback(result); + }); + } } \ No newline at end of file diff --git a/entry/src/main/js/default/center/statuscenter/manager/WindowManager.js b/entry/src/main/js/default/center/statuscenter/manager/WindowManager.js new file mode 100644 index 00000000..b9d80890 --- /dev/null +++ b/entry/src/main/js/default/center/statuscenter/manager/WindowManager.js @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Window from '@ohos.window'; +import mLog from '../../../common/utils/Log.js' + +const TAG = 'WindowManager'; +const MAX_WIDTH = 480; +const MAX_HEIGHT = 893; +const MIN_HEIGHT = 67; + +/** + * Manage window size changes. + */ +export default class WindowManager { + + /** + * Set the window to the maximum size. + * + * @param {object} callback - Callback function. + */ + setWindowMax(callback){ + mLog.showInfo(TAG, `enter setWindowMax =================`) + Window.getTopWindow().then((windowData)=> { + windowData.resetSize(MAX_WIDTH, MAX_HEIGHT).then((result)=> { + callback(result); + }); + }); + } + + /** + * Set the window to the minimum size. + * + * @param {object} callback - Callback function. + */ + setWindowMin(callback){ + mLog.showInfo(TAG, `enter setWindowMin =================`) + Window.getTopWindow().then((windowData)=> { + windowData.resetSize(MAX_WIDTH, MIN_HEIGHT).then((result)=> { + callback(result); + }); + }); + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_settings.png b/entry/src/main/js/default/common/image_xxhdpi/ic_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b665b89cd206a3e476f5e9efbe31d482be7a0321 GIT binary patch literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKMSxF;E0F#_5a8H~Cu@LqYm@}} z1v9Kz!j?9FIuBE}!mNZcS4&e#flzNf(Mi1>^=i%1`N3NL4o1n*HdQBu_hvFMFdKWi zIEF+Vej9#s+ad#j78kRdfm2)=4?g|>zd()AfAYJE{uH_A*Cuyvob>9Qm;38_*Xl$w zg_;8Ad2?=RF*z@q+goV#=%cJtiHVZdQUAw>rJKGbt>ZbuVqg*wcDRBmm+e%Z!84E9 zGmVOK{~Sz9ZSWBYJuGgoCl@W7{erOF;$IcgfUmCs@iPs@$<)xc{e&^r`Hz$n5Fc68o!~6m_X;r-3M!*R-C#c`pk^s zJ>T*>EFJ6%T6QFUShJtKpQXsdIE67zW3s}|YH=6SU-PrlN>v`}xS4-du5QippJ`Rn zlFzT2*C&DGO4`=s8kF>v+H*|T5jcEU0pj}>p- z&R(2s@b;??RS90X*HG_Xm(`U0F=ADlvyYehs0yDJnOBw9C1X25<)^Op@q~BX8`ta1P@n&# zQlMZ?9?P2xVMZIL`p>!fQo?`Pha*Q8{uX#SRq~QV<$VUw{C@5NXD`4}D? zS~OS2;k@mRipJAhZ%#R$7J5D1Jw481L5+t=u#l-@Ot#dN<6lnQ?@xF%E6L7fSI?=G zKd;W-{qYPw7g)mGYe$1ILWg+-yu;l zp literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/i18n/zh-CN.json b/entry/src/main/js/default/i18n/zh-CN.json index dc1532de..e1799475 100755 --- a/entry/src/main/js/default/i18n/zh-CN.json +++ b/entry/src/main/js/default/i18n/zh-CN.json @@ -8,7 +8,8 @@ "saturday": "星期六", "sunday": "星期日", "month": "月", - "day": "日" + "day": "日", + "no_notification": "没有通知" }, "colors": { "statusBackground": "#66000000" diff --git a/entry/src/main/js/default/pages/index/index.hml b/entry/src/main/js/default/pages/index/index.hml index d9d28565..2e4b7fb4 100755 --- a/entry/src/main/js/default/pages/index/index.hml +++ b/entry/src/main/js/default/pages/index/index.hml @@ -16,9 +16,11 @@ --> - +
    + +
    \ No newline at end of file diff --git a/entry/src/main/js/default/pages/index/index.js b/entry/src/main/js/default/pages/index/index.js index 9ee37191..e4acf7d8 100755 --- a/entry/src/main/js/default/pages/index/index.js +++ b/entry/src/main/js/default/pages/index/index.js @@ -15,20 +15,37 @@ import BatteryStatus from '../../center/battery/batteryStatus.js'; import SignalStatus from '../../center/signal/signalStatus.js'; +import StatusCenter from '../../center/statuscenter/StatusCenter.js' import mLog from '../../common/utils/Log.js'; +const CHANGE = true; +const NOT_CHANGE = false; const MAX_HEIGHT = "100%"; const MAX_WIDTH = "100%"; +const MIN_HEIGHT = "0px"; +const MIN_WIDTH = "0px"; +const SPREAD_HEIGHT = 10; +const SHRINK_HEIGHT = -10; +const Y_INITIAL = 0; +const LOOP_TIME = 100; const TAG = 'index'; var mBatteryStatus = new BatteryStatus(); var mSignalStatus = new SignalStatus(); +var mStatusCenter = new StatusCenter(); globalThis.$globalT; export default { data: { + isShow: false, + showMask: '', + startGlobalY: Y_INITIAL, + moveY: Y_INITIAL, + isChange: false, statusHeight: MAX_HEIGHT, statusWidth: MAX_WIDTH, + largeStatusBarHeight: MIN_HEIGHT, + largeStatusBarWidth: MIN_WIDTH, backgroundColor: "", showClock: true }, @@ -41,8 +58,94 @@ export default { mBatteryStatus.init(); mLog.showInfo(TAG, `onInit end`); }, + onBackPress() { + mLog.showInfo(TAG, `statusBar onBackPress start`); + if (this.statusHeight == MIN_HEIGHT) { + this.isChange = CHANGE; + this.statusHeight = MAX_HEIGHT + this.statusWidth = MAX_WIDTH; + this.largeStatusBarHeight = MIN_HEIGHT; + this.largeStatusBarWidth = MIN_WIDTH; + this.backgroundColor = this.$t('colors.statusBackground'); + this.setWindowMin(); + } + mLog.showInfo(TAG, `statusBar onBackPress end`); + }, + /** + * Set button click + * @param {object} dateEvent quicklySetting Set button click return data + */ + settingClick(dateEvent) { + mLog.showInfo(TAG, `settingClick start dateEvent: ${JSON.stringify(dateEvent)}`); + this.statusHeight = dateEvent.detail.statusHeight; + this.statusWidth = dateEvent.detail.statusWidth; + this.largeStatusBarHeight = dateEvent.detail.notificationHeight; + this.largeStatusBarWidth = dateEvent.detail.notificationWidth; + this.backgroundColor = dateEvent.detail.backgroundColor; + }, onDestroy() { mLog.showInfo(TAG, `onDestroy`); }, + + /** + * Monitor touch start method + * @param {object} touchEvent TouchStart return data + */ + onTouchStartListener(touchEvent) { + mLog.showInfo(TAG, `onTouchStartListener start touchEvent: ${JSON.stringify(touchEvent)}`); + this.startGlobalY = touchEvent.touches[0].globalY; + this.isChange = NOT_CHANGE; + }, + + /** + * Monitor touch Move method + * @param {object} touchEvent TouchMove return data + */ + onTouchMoveListener(touchEvent) { + mLog.showInfo(TAG, `onTouchStartListener move touchEvent: ${JSON.stringify(touchEvent)}`); + if (this.isChange == CHANGE) { + return; + } + this.moveY = touchEvent.touches[0].globalY - this.startGlobalY; + if (this.moveY >= SPREAD_HEIGHT) { + this.isChange = CHANGE; + this.statusHeight = MIN_HEIGHT; + this.statusWidth = MIN_WIDTH; + setTimeout(() => { + this.largeStatusBarHeight = MAX_HEIGHT; + this.largeStatusBarWidth = MAX_WIDTH; + this.backgroundColor = ""; + this.setWindowMax(); + }, LOOP_TIME); + } else if (this.moveY < SHRINK_HEIGHT) { + this.isChange = CHANGE; + this.statusHeight = MAX_HEIGHT + this.statusWidth = MAX_WIDTH; + setTimeout(() => { + this.largeStatusBarHeight = MIN_HEIGHT; + this.largeStatusBarWidth = MIN_WIDTH; + this.backgroundColor = this.$t('colors.statusBackground'); + this.setWindowMin(); + }, LOOP_TIME); + } + }, + + /** + * Maximize window + */ + setWindowMax() { + mStatusCenter.setWindowMax((result) => { + mLog.showInfo(TAG, `setWindowMax result: ${result}`); + }); + }, + + /** + * Minimize window + */ + setWindowMin() { + mStatusCenter.setWindowMin((result) => { + mLog.showInfo(TAG, `setWindowMin result ${result}`); + }); + } } \ No newline at end of file diff --git a/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.css b/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.css new file mode 100644 index 00000000..daad6d59 --- /dev/null +++ b/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.css @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2021 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. + */ + +.container { + flex-direction: column; + align-items: center; + background-color: #66000000; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.hml b/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.hml new file mode 100644 index 00000000..7cd76f47 --- /dev/null +++ b/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.hml @@ -0,0 +1,26 @@ + + + + + +
    + + + +
    diff --git a/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.js b/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.js new file mode 100644 index 00000000..47eb7bf2 --- /dev/null +++ b/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.js @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 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 mLog from '../../common/utils/Log.js'; + +const MAX_HEIGHT = "100px"; +const MAX_WIDTH = "100%"; +const TAG = 'LargeStatusBar'; + +export default { + props: ['windowHeight', 'windowWidth'], + data: { + statusHeight: MAX_HEIGHT, + statusWidth: MAX_WIDTH, + backgroundColor: "", + showClock: false + }, + onInit() { + mLog.showInfo(TAG, `largeStatusBar onInit`); + }, + + /** + * Set button click + * @param {object}event quicklySetting Set button click return data + */ + settingClick(event) { + mLog.showInfo(TAG, `largeStatusBar settingClick event: ${JSON.stringify(event)}`); + this.$emit('settingClick', { + statusHeight: event.detail.statusHeight, + statusWidth: event.detail.statusWidth, + notificationHeight: event.detail.notificationHeight, + notificationWidth: event.detail.notificationWidth, + backgroundColor: event.detail.backgroundColor + }); + } +} diff --git a/entry/src/main/js/default/pages/notification/notification.css b/entry/src/main/js/default/pages/notification/notification.css new file mode 100644 index 00000000..9955ae22 --- /dev/null +++ b/entry/src/main/js/default/pages/notification/notification.css @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 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_notification{ + width:100%; + height: 100%; + margin-top: 30px; + justify-content:center; + align-items: center ; +} +.text_no_notification{ + color:#ffffff; + font-size:40px; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/notification/notification.hml b/entry/src/main/js/default/pages/notification/notification.hml new file mode 100644 index 00000000..c232105a --- /dev/null +++ b/entry/src/main/js/default/pages/notification/notification.hml @@ -0,0 +1,20 @@ + + +
    + {{ mNoNotification }} +
    diff --git a/entry/src/main/js/default/pages/notification/notification.js b/entry/src/main/js/default/pages/notification/notification.js new file mode 100644 index 00000000..9386058f --- /dev/null +++ b/entry/src/main/js/default/pages/notification/notification.js @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021 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 mLog from '../../common/utils/Log.js'; + +const TAG = 'notification'; + +export default { + data: { + mNoNotification: '', + }, + onInit() { + mLog.showInfo(TAG, `onInit`); + this.mNoNotification = this.$t('strings.no_notification'); + }, +} diff --git a/entry/src/main/js/default/pages/quicklySetting/quicklySetting.css b/entry/src/main/js/default/pages/quicklySetting/quicklySetting.css new file mode 100644 index 00000000..617a8919 --- /dev/null +++ b/entry/src/main/js/default/pages/quicklySetting/quicklySetting.css @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2021 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. + */ + +.container { + flex-direction: column; + align-items: center; + background-color: #66000000; +} +.status_bar { + flex-direction: row; + align-items: center; + height: 100px; +} +.main_body { + display: flex; + width: 100%; +} +.signal{ + align-items: center; + margin-left: 20px; + height: 40px; + width: 40px; +} +.icon_list { + margin-left: 6px; + width: 100%; + height: 30px; + display: flex; + flex-direction: row; +} +.battery { + flex-direction: row; + align-items: center; +} +.battery_body { + position: relative; + margin-top: 16px; + align-items: center; + width: 80px; + height: 40px; + background-image: url("common/ic_status_battery.png"); + background-repeat: no-repeat; + padding: 1px; + display: flex; + margin-right:30px; +} +.battery_progress { + margin-top: 6px; + margin-left: 0px; + margin-right:8px; + height: 25px; + stroke-width: 25px; +} +.other_status_content{ + flex-direction: row; + align-items: center; + justify-content:space-between; + width:100%; + height:220px; + background-color: #292830; + margin-left:20px; + margin-right:20px; + border-radius: 20px; +} +.time_date{ + height:100%; + flex-direction: column; + align-items: flex-start ; + justify-content:center; + margin-left:20px; +} +.time_font{ + color:#ffffff; + font-size:40px; +} +.data_font{ + color:#ffffff; + font-size:30px; +} +.icon_setting{ + align-items: flex-end ; + justify-content:center; + margin-right:20px; + width:80px; + height:80px; +} +.no_notification{ + width:100%; + margin-top: 30px; + justify-content:center; + align-items: center ; +} +.text_no_notification{ + color:#ffffff; + font-size:40px; +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/quicklySetting/quicklySetting.hml b/entry/src/main/js/default/pages/quicklySetting/quicklySetting.hml new file mode 100644 index 00000000..0906ebac --- /dev/null +++ b/entry/src/main/js/default/pages/quicklySetting/quicklySetting.hml @@ -0,0 +1,26 @@ + + +
    +
    + {{ mTime }} + {{ mDate }} +
    +
    + +
    +
    diff --git a/entry/src/main/js/default/pages/quicklySetting/quicklySetting.js b/entry/src/main/js/default/pages/quicklySetting/quicklySetting.js new file mode 100644 index 00000000..f71e10fd --- /dev/null +++ b/entry/src/main/js/default/pages/quicklySetting/quicklySetting.js @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2021 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 StatusCenter from '../../center/statuscenter/StatusCenter.js'; +import mLog from '../../common/utils/Log.js'; +import FeatureAbility from '@ohos.ability.featureability'; + +const TAG = 'quicklySetting'; +const MAX_HEIGHT = "100%"; +const MAX_WIDTH = "100%"; +const MIN_HEIGHT = "0px"; +const MIN_WIDTH = "0px"; +const REQUEST_CODE = 1; +const FLAGS = 2; +const SYNC_OPTION = 1; +const SETTINGS_BUNDLE_NAME = 'com.ohos.settings'; +const SETTINGS_ABILITY_NAME = 'com.ohos.settings.MainAbility'; + +var mStatusCenter = new StatusCenter(); + +export default { + data: { + mTime:"", + mDate:"" + }, + onInit() { + mLog.showInfo(TAG, `onInit`) + this.getDateTime(); + }, + + /** + * Set button click + */ + settingClick(){ + mLog.showInfo(TAG, `setting click and start ability setting`); + this.$emit('settingClick', { + statusHeight : MAX_HEIGHT, + statusWidth : MAX_WIDTH, + notificationHeight : MIN_HEIGHT, + notificationWidth : MIN_WIDTH, + backgroundColor :this.$t('colors.statusBackground') + }); + this.setWindowMin(); + let result = FeatureAbility.startAbility({ + want: { + bundleName: SETTINGS_BUNDLE_NAME, + abilityName: SETTINGS_ABILITY_NAME, + }, + }).then(data => + mLog.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)).catch(error => + mLog.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); + mLog.showInfo(TAG, `start ability ${result}`); + }, + + /** + * Minimize window + */ + setWindowMin(){ + mStatusCenter.setWindowMin((result) =>{ + mLog.showInfo(TAG, `setWindowMin result: ${result}`); + }); + }, + + /** + * Get display time + */ + getDateTime(){ + mStatusCenter.setOnTimeListener((currentDate) => { + this.mTime = JSON.parse(currentDate).time; + this.mDate = JSON.parse(currentDate).date; + }); + } +} diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.css b/entry/src/main/js/default/pages/statusbar/statusBar.css index 9cadf929..5413c273 100755 --- a/entry/src/main/js/default/pages/statusbar/statusBar.css +++ b/entry/src/main/js/default/pages/statusbar/statusBar.css @@ -32,7 +32,7 @@ text { } .signal { - align-items: center; + align-items: flex-start; margin-left: 10px; height: 60px; width: 200px; diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.hml b/entry/src/main/js/default/pages/statusbar/statusBar.hml index 6e3f486f..0148ba4b 100755 --- a/entry/src/main/js/default/pages/statusbar/statusBar.hml +++ b/entry/src/main/js/default/pages/statusbar/statusBar.hml @@ -23,7 +23,7 @@
    {{ mCellularType }} - +
    -- Gitee From c988f51b2839e1cb0e005f1443018240dd2571f7 Mon Sep 17 00:00:00 2001 From: lin-shuai5 Date: Tue, 10 Aug 2021 19:13:17 +0800 Subject: [PATCH 009/373] fix the bug of drop-down statusbar Signed-off-by: lin-shuai5 --- entry/src/main/js/default/app.js | 10 +- .../default/center/battery/batteryStatus.js | 55 ++--- .../js/default/center/signal/signalStatus.js | 50 ++-- .../center/statuscenter/StatusCenter.js | 221 ++++++++++++++++-- .../statuscenter/manager/DateManager.js | 67 ++---- .../statuscenter/manager/StatusImage.js | 35 --- .../default/common/utils/CheckEmptyUtils.js | 1 + entry/src/main/js/default/common/utils/Log.js | 2 +- .../src/main/js/default/pages/index/index.hml | 17 +- .../src/main/js/default/pages/index/index.js | 175 +++++++++++--- .../pages/largeStatusBar/largeStatusBar.hml | 7 +- .../pages/largeStatusBar/largeStatusBar.js | 14 +- .../pages/quicklySetting/quicklySetting.js | 70 ++---- .../js/default/pages/statusbar/clock/clock.js | 16 +- .../js/default/pages/statusbar/statusBar.hml | 8 +- .../js/default/pages/statusbar/statusBar.js | 46 +--- .../src/main/js/default/common/utils/Log.js | 2 +- .../systemDialogCenter/SystemDialogCenter.js | 25 +- .../src/main/js/default/common/utils/Log.js | 2 +- .../src/main/js/default/pages/index/index.js | 2 + 20 files changed, 480 insertions(+), 345 deletions(-) delete mode 100755 entry/src/main/js/default/center/statuscenter/manager/StatusImage.js diff --git a/entry/src/main/js/default/app.js b/entry/src/main/js/default/app.js index 2d927855..aa4c1d51 100644 --- a/entry/src/main/js/default/app.js +++ b/entry/src/main/js/default/app.js @@ -14,14 +14,20 @@ */ import mLog from '../default/common/utils/Log.js'; +import StatusCenter from '../default/center/statuscenter/StatusCenter.js'; const TAG = 'app'; export default { + data: { + StatusCenter:new StatusCenter + }, + onCreate() { - mLog.showInfo(TAG, `Application onCreate`); + mLog.showInfo(TAG, 'Application onCreate'); }, + onDestroy() { - mLog.showInfo(TAG, `Application onDestroy`); + mLog.showInfo(TAG, 'Application onDestroy'); } }; diff --git a/entry/src/main/js/default/center/battery/batteryStatus.js b/entry/src/main/js/default/center/battery/batteryStatus.js index 5030af50..d0dc68c4 100755 --- a/entry/src/main/js/default/center/battery/batteryStatus.js +++ b/entry/src/main/js/default/center/battery/batteryStatus.js @@ -17,8 +17,7 @@ * Get the status of battery */ -import BatteryInfo from '@ohos.batteryInfo' -import StatusImage from '../statuscenter/manager/StatusImage.js' +import BatteryInfo from '@ohos.batteryInfo'; import mLog from '../../common/utils/Log.js'; const TAG = 'batteryStatus'; @@ -26,7 +25,6 @@ const NONE = 0; const ENABLE = 1; const DISABLE = 2; const FULL = 3; -const LOOP_TIME = 1000; const PERCENT_NUMBER = 100; const BATTERY_CHARGING_COLOR = '#00ff21'; const BATTERY_HIGH_COLOR = '#ffffff'; @@ -34,57 +32,50 @@ const BATTERY_MEDIUM_COLOR = '#ffd800'; const BATTERY_LOW_COLOR = '#ff0000'; const BATTERY_LEVEL_HIGH = 50; const BATTERY_LEVEL_LOW = 10; +const MAX_BATTERY_LENGTH = 51; + var mProgressWidth = 51; var mProgress = 100; var mBackgroundColor = '#00ff21'; -export default class batteryStatus extends StatusImage { +export default class batteryStatus { constructor() { - super() } /** * Return the progress width and background color for the battery * - * @return {string} battery progress width and background color + * @param {Object} callback - Callback function */ - getStatusImage() { + getStatusImage(callback) { let batteryValue = {}; + this.setOnBatteryListener(); batteryValue.mBackgroundColor = mBackgroundColor; batteryValue.mProgressWidth = mProgressWidth; mLog.showInfo(TAG, `color: ${batteryValue.mBackgroundColor} width: ${batteryValue.mProgressWidth}`); - return JSON.stringify(batteryValue); - } - - /** - * Init the parameters for the battery - */ - init() { - this.setOnBatteryListener() + callback(JSON.stringify(batteryValue)); } /** * Method of getting the battery status by looping */ setOnBatteryListener() { - let that = this; let batterySOC; let batteryCharging; - setInterval(function () { - batterySOC = BatteryInfo.batterySOC; - batteryCharging = BatteryInfo.chargingStatus; - if (null == batterySOC) { - // Set the battery SOC as full when there is no battery hardware - batterySOC = 1; - } - if (batterySOC <= 0) { - // If the result is a negative number, set it as positive number. - batterySOC = Math.abs(batterySOC); - } - // Set the battery status as charging when there is no battery hardware - let batteryStatus = that.checkBatteryStatus(batteryCharging); - that.updateBattery(batterySOC * PERCENT_NUMBER, batteryStatus); - }, LOOP_TIME); + + batterySOC = BatteryInfo.batterySOC; + batteryCharging = BatteryInfo.chargingStatus; + if (null == batterySOC) { + // Set the battery SOC as full when there is no battery hardware + batterySOC = mProgress; + } + if (batterySOC <= 0) { + // If the result is a negative number, set it as positive number. + batterySOC = Math.abs(batterySOC) * PERCENT_NUMBER; + } + // Set the battery status as charging when there is no battery hardware + let batteryStatus = this.checkBatteryStatus(batteryCharging); + this.updateBattery(batterySOC, batteryStatus); } /** @@ -105,7 +96,7 @@ export default class batteryStatus extends StatusImage { } else if (val > BATTERY_LEVEL_HIGH) { mBackgroundColor = BATTERY_HIGH_COLOR; } - mProgressWidth = mProgressWidth * mProgress / PERCENT_NUMBER; + mProgressWidth = MAX_BATTERY_LENGTH * mProgress / PERCENT_NUMBER; mLog.showInfo(TAG, `Battery updateBattery mBackgroundColor: ${mBackgroundColor}`); } diff --git a/entry/src/main/js/default/center/signal/signalStatus.js b/entry/src/main/js/default/center/signal/signalStatus.js index 2957a7b9..2670cda1 100644 --- a/entry/src/main/js/default/center/signal/signalStatus.js +++ b/entry/src/main/js/default/center/signal/signalStatus.js @@ -16,16 +16,15 @@ /** * Get the cellular and wifi status */ -import StatusImage from '../statuscenter/manager/StatusImage.js'; -import Radio from "@ohos.telephony_radio"; + +import Radio from '@ohos.telephony_radio'; import mLog from '../../common/utils/Log.js'; -import mCheckEmpty from '../../common/utils/CheckEmptyUtils.js' +import mCheckEmpty from '../../common/utils/CheckEmptyUtils.js'; const TAG = 'signalStatus'; -const LOOP_TIME = 20000; const EMPTY_LEVEL = 0; const CELLULAR_NONE_IMAGE = 'common/image_xxhdpi/ic_statusbar_signal_null.png'; -const CELLULAR_EMPTY_IMAGE = 'common/image_xxhdpi/ic_statusbar_signal_no.png' +const CELLULAR_EMPTY_IMAGE = 'common/image_xxhdpi/ic_statusbar_signal_no.png'; const CELLULAR_MIN_IMAGE = 'common/image_xxhdpi/ic_cellular_signal_min.png'; const CELLULAR_LOW_IMAGE = 'common/image_xxhdpi/ic_cellular_signal_low.png'; const CELLULAR_HALF_IMAGE = 'common/image_xxhdpi/ic_statusbar_signal_half.png'; @@ -36,42 +35,22 @@ var mCellularStatus; var mCellularImage; var SignalListenerInterval; -export default class signalStatus extends StatusImage { +export default class signalStatus { constructor() { - super() } /** * Get the images of cellular and wifi need to be showed on status bar * - * @return {string} the image of wifi and cellular + * @param {Object} callback - Callback function */ - getStatusImage() { + getStatusImage(callback) { let signalValue = {}; + this.getSignalMessage(); signalValue.cellularImage = mCellularImage.image; signalValue.cellularType = mCellularImage.type; mLog.showInfo(TAG, `cellular type = ${signalValue.cellularType}, image = ${signalValue.cellularImage}`); - return JSON.stringify(signalValue); - } - - /** - * Init the parameters for the wifi and cellular signal - */ - init() { - this.setOnSignalListener(); - } - - /** - * Method of getting the cellular status parameters - */ - setOnSignalListener() { - this.getSignalMessage(); - SignalListenerInterval = setInterval( () => { - this.checkCellularStatus((result)=>{ - mCellularStatus = result; - mCellularImage = this.updateCellularImage(); - }); - }, LOOP_TIME); + callback(JSON.stringify(signalValue)); } /** @@ -167,10 +146,10 @@ export default class signalStatus extends StatusImage { // Failed to call the interface,error is not null mLog.showError(TAG, `failed to getSimState because ${err.message}`); // When failed to call the interface, set the result as no signal - let value = {} - value.signalType = EMPTY_LEVEL; - value.signalLevel = EMPTY_LEVEL; - cellularStatus = value; + let defaultValue = {} + defaultValue.signalType = EMPTY_LEVEL; + defaultValue.signalLevel = EMPTY_LEVEL; + cellularStatus = defaultValue; } else { // Call interface succeed,error is null mLog.showInfo(TAG, `success to getSimState: ${value}`); @@ -185,7 +164,4 @@ export default class signalStatus extends StatusImage { callback(cellularStatus); }); } - stopSignalListener() { - clearInterval(SignalListenerInterval); - } } \ No newline at end of file diff --git a/entry/src/main/js/default/center/statuscenter/StatusCenter.js b/entry/src/main/js/default/center/statuscenter/StatusCenter.js index bb464795..ff9f794b 100755 --- a/entry/src/main/js/default/center/statuscenter/StatusCenter.js +++ b/entry/src/main/js/default/center/statuscenter/StatusCenter.js @@ -24,64 +24,235 @@ import WindowManager from '../../center/statuscenter/manager/WindowManager.js' import mLog from '../../common/utils/Log.js'; const TAG = 'StatusCenter'; -const LOOP_TIME = 1000; +const LOOP_TIME = 2000; +const SIGNAL_LOOP_TIME = 3000; + var mSignalStatus = new SignalStatus(); var mBatteryStatus = new BatteryStatus(); var mDateManager = new DateManager(); var mWindowManager = new WindowManager(); -var time; -var mIconList = []; -var mResultIconList = []; + +let signalInterval = null; +let signalListener = []; +let signalStatus = ''; + +let batteryInterval = null; +let batteryListener = []; +let batteryStatus = ''; + +let timeInterval = null; +let timeListener = []; +let timeStatus = ''; export default class StatusCenter { constructor() { + this.initBatteryData(); + this.initTimeData(); + this.initSignalData(); + } + + /** + * Initialize signal data + */ + initSignalData() { + mLog.showInfo(TAG, 'initSignalData'); + signalInterval = setInterval(() => { + mSignalStatus.getStatusImage((result) => { + signalStatus = result; + mLog.showInfo(TAG, `startSignalData signalStatus ${signalStatus}`); + this.sendSignalData(); + }); + }, SIGNAL_LOOP_TIME); } /** - * Get the images of cellular and wifi need to be showed on status bar + *Register signal data monitoring * - * @return {string} the image of wifi and cellular + * @param {Object} callback - Callback function */ - setOnSignalListener() { - let signalStatus = mSignalStatus.getStatusImage(); - mLog.showInfo(TAG, `signal image: ${signalStatus}`); - return signalStatus; + registerSignalListen(callback) { + mLog.showInfo(TAG, `registerSignalListen signalListener length: ${signalListener.length}`); + mLog.showInfo(TAG, `registerSignalListen callback indexOf: ${signalListener.indexOf(callback)}`); + if (signalListener.indexOf(callback) === -1) { + signalListener.push(callback); + } + mLog.showInfo(TAG, `registerSignalListen signalListener length: ${signalListener.length}`); } /** - * Return the progress width and background color for the battery + *Unregister signal data monitoring * - * @return {string} battery progress width and background color + * @param {Object} callback - Callback function */ - setOnBatteryListener() { - let batteryStatus = mBatteryStatus.getStatusImage(); - mLog.showInfo(TAG, `battery status: ${batteryStatus}`); - return batteryStatus; + unRegisterSignalListen(callback) { + mLog.showInfo(TAG, `unRegisterSignalListen signalListener length: ${signalListener.length}`); + signalListener.splice(signalListener.indexOf(callback), 1); + mLog.showInfo(TAG, `unRegisterSignalListen signalListener length: ${signalListener.length}`); } /** - * Get current time + * Return signal data to the page + */ + sendSignalData() { + mLog.showInfo(TAG, 'sendSignalData'); + + // Deep copy the callback array + let newSignalListener = []; + for (let i = 0; i < signalListener.length; i++) { + newSignalListener.push(signalListener[i]); + } + + if (newSignalListener.length > 0) { + for (let index = 0; index < newSignalListener.length; index++) { + mLog.showInfo(TAG, `sendSignalData ${newSignalListener[index]}`); + newSignalListener[index](signalStatus); + } + } + } + + /** + * Stop get signal data + */ + stopUpdateSignal() { + clearInterval(signalInterval); + } + + /** + * Initialize battery data + */ + initBatteryData() { + mLog.showInfo(TAG, 'initBatteryData'); + batteryInterval = setInterval(() => { + mBatteryStatus.getStatusImage((result) => { + batteryStatus = result; + mLog.showInfo(TAG, `initBatteryData batteryStatus ${batteryStatus}`); + this.sendBatteryData(); + }); + }, LOOP_TIME); + } + + /** + *Register battery data monitoring * - * @param {object} callback - Callback function + * @param {Object} callback - Callback function + */ + registerBatteryListen(callback) { + mLog.showInfo(TAG, `registerBatteryListen BatteryListener length: ${batteryListener.length}`); + mLog.showInfo(TAG, `registerBatteryListen callback indexOf: ${batteryListener.indexOf(callback)}`); + if (batteryListener.indexOf(callback) === -1) { + batteryListener.push(callback); + } + mLog.showInfo(TAG, `registerBatteryListen BatteryListener length: ${batteryListener.length}`); + } + + /** + *Unregister battery data monitoring + * + * @param {Object} callback - Callback function + */ + unRegisterBatteryListen(callback) { + mLog.showInfo(TAG, `unRegisterBatteryListen BatteryListener length: ${batteryListener.length}`); + batteryListener.splice(batteryListener.indexOf(callback), 1); + mLog.showInfo(TAG, `unRegisterBatteryListen BatteryListener length: ${batteryListener.length}`); + } + + /** + * Return battery data to the page */ - setOnTimeListener(callback) { - time = setInterval(() => { - let currentDate = mDateManager.getCurrentDate(); - callback(currentDate); + sendBatteryData() { + mLog.showInfo(TAG, 'sendBatteryData'); + + // Deep copy the callback array + let newBatteryListener = []; + for (let i = 0; i < batteryListener.length; i++) { + newBatteryListener.push(batteryListener[i]); + } + + if (newBatteryListener.length > 0) { + for (let index = 0; index < newBatteryListener.length; index++) { + mLog.showInfo(TAG, `sendSignalData ${newBatteryListener[index]}`); + newBatteryListener[index](batteryStatus); + } + } + } + + /** + * Stop get signal data + */ + stopUpdateBattery() { + clearInterval(batteryInterval); + } + + /** + * Initialize time data + */ + initTimeData() { + mLog.showInfo(TAG, 'initTimeData'); + timeInterval = setInterval(() => { + mDateManager.getCurrentDate((result) => { + timeStatus = result; + mLog.showInfo(TAG, `initTimeData timeStatus ${timeStatus}`); + this.sendTimeData(); + }); }, LOOP_TIME); } + /** + *Register time data monitoring + * + * @param {Object} callback - Callback function + */ + registerTimeListen(callback) { + mLog.showInfo(TAG, `registerTimeListen TimeListener length: ${timeListener.length}`); + mLog.showInfo(TAG, `registerTimeListen callback indexOf: ${timeListener.indexOf(callback)}`); + if (timeListener.indexOf(callback) === -1) { + timeListener.push(callback); + } + mLog.showInfo(TAG, `registerTimeListen TimeListener length: ${timeListener.length}`); + } + + /** + *Unregister time data monitoring + * + * @param {Object} callback - Callback function + */ + unRegisterTimeListen(callback) { + mLog.showInfo(TAG, `unRegisterTimeListen TimeListener length: ${timeListener.length}`); + timeListener.splice(timeListener.indexOf(callback), 1); + mLog.showInfo(TAG, `unRegisterTimeListen TimeListener length: ${timeListener.length}`); + } + + /** + * Return time data to the page + */ + sendTimeData() { + mLog.showInfo(TAG, `sendTimeData`); + + // Deep copy the callback array + let newTimeListener = []; + for (let i = 0; i < timeListener.length; i++) { + newTimeListener.push(timeListener[i]); + } + + if (newTimeListener.length > 0) { + for (let index = 0; index < newTimeListener.length; index++) { + mLog.showInfo(TAG, `sendTimeData ${newTimeListener[index]}`); + newTimeListener[index](timeStatus); + } + } + } + /** * Stop the loop of getting current time */ stopUpdateTime() { - clearInterval(time); + clearInterval(timeInterval); } /** * Set the status bar window to maximum size * - * @param {object} callback - Callback function + * @param {Object} callback - Callback function */ setWindowMax(callback) { mWindowManager.setWindowMax((result) => { @@ -92,7 +263,7 @@ export default class StatusCenter { /** * Set the status bar window to minimum size * - * @param {object} callback - Callback function + * @param {Object} callback - Callback function */ setWindowMin(callback) { mWindowManager.setWindowMin((result) => { diff --git a/entry/src/main/js/default/center/statuscenter/manager/DateManager.js b/entry/src/main/js/default/center/statuscenter/manager/DateManager.js index 3166d3a8..c97a9ed9 100644 --- a/entry/src/main/js/default/center/statuscenter/manager/DateManager.js +++ b/entry/src/main/js/default/center/statuscenter/manager/DateManager.js @@ -14,13 +14,6 @@ */ const SHORT_LENGTH = 1; -const MARK_MONDAY = 1; -const MARK_TUESDAY = 2; -const MARK_WEDNESDAY = 3; -const MARK_THURSDAY = 4; -const MARK_FRIDAY = 5; -const MARK_SATURDAY = 6; -const MARK_SUNDAY = 0; /** * Manage methods related to time. @@ -28,11 +21,11 @@ const MARK_SUNDAY = 0; export default class DateManager { /** - * Get current date and time. + * Obtain current date and time. * - * @return {string} current date and time. + * @param {Object} callback - Callback function. */ - getCurrentDate() { + getCurrentDate(callback) { let result = {}; let date = new Date(); let month = this.getMonth(date); @@ -40,71 +33,49 @@ export default class DateManager { let time = date.toTimeString().substring(0, 5); let weekDay = this.getWeekDay(date); result.time = time; - result.date = month + globalThis.$globalT('strings.month') + day + globalThis.$globalT('strings.day') + weekDay; - return JSON.stringify(result); + result.date = {}; + result.date.month = month; + result.date.day = day; + result.date.weekDay = weekDay; + callback(JSON.stringify(result)); } /** - * Get Month. + * Obtain Month. * - * @param {object} date - Object of Date. + * @param {Object} date - Object of Date. * @return {string} The month of date. */ getMonth(date) { let month = (date.getMonth() + 1).toString(); - if (month.length == SHORT_LENGTH) { - month = "0" + month; + if (month.length === SHORT_LENGTH) { + month = '0' + month; } return month; } /** - * Get Day. + * Obtain Day. * - * @param {object} date - Object of Date. + * @param {Object} date - Object of Date. * @return {string} The day of date. */ getDay(date) { let day = (date.getDate()).toString(); - if (day.length == SHORT_LENGTH) { - day = "0" + day; + if (day.length === SHORT_LENGTH) { + day = '0' + day; } return day; } /** - * Get WeekDay. + * Obtain WeekDay. * - * @param {object} date - Object of Date. + * @param {Object} date - Object of Date. * @return {string} The weekday of date. */ getWeekDay(date) { let weekDay = date.getDay(); - switch (weekDay) { - case MARK_MONDAY: - weekDay = globalThis.$globalT('strings.monday'); - break; - case MARK_TUESDAY: - weekDay = globalThis.$globalT('strings.tuesday'); - break; - case MARK_WEDNESDAY: - weekDay = globalThis.$globalT('strings.wednesday'); - break; - case MARK_THURSDAY: - weekDay = globalThis.$globalT('strings.thursday'); - break; - case MARK_FRIDAY: - weekDay = globalThis.$globalT('strings.friday'); - break; - case MARK_SATURDAY: - weekDay = globalThis.$globalT('strings.saturday'); - break; - case MARK_SUNDAY: - weekDay = globalThis.$globalT('strings.sunday'); - break; - default: - break; - } - return weekDay + return weekDay; } } \ No newline at end of file diff --git a/entry/src/main/js/default/center/statuscenter/manager/StatusImage.js b/entry/src/main/js/default/center/statuscenter/manager/StatusImage.js deleted file mode 100755 index 5401eeff..00000000 --- a/entry/src/main/js/default/center/statuscenter/manager/StatusImage.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -/** - * Get the elements to be showed on status bar - */ - -export default class StatusImage { - constructor() { - } - - /** - * Get the images need to be showed - */ - getStatusImage() { - } - - /** - * Init the parameters needed when getting the images - */ - init() { - } -} \ No newline at end of file diff --git a/entry/src/main/js/default/common/utils/CheckEmptyUtils.js b/entry/src/main/js/default/common/utils/CheckEmptyUtils.js index 008e5ece..f13af46d 100644 --- a/entry/src/main/js/default/common/utils/CheckEmptyUtils.js +++ b/entry/src/main/js/default/common/utils/CheckEmptyUtils.js @@ -14,6 +14,7 @@ */ export default class CheckEmptyUtils { + /** * Check obj is empty. * diff --git a/entry/src/main/js/default/common/utils/Log.js b/entry/src/main/js/default/common/utils/Log.js index 69980760..3212ce8a 100644 --- a/entry/src/main/js/default/common/utils/Log.js +++ b/entry/src/main/js/default/common/utils/Log.js @@ -13,7 +13,7 @@ * limitations under the License. */ -const TAG = "SystemUI_StatusBar"; +const TAG = 'SystemUI_StatusBar'; /** * Basic log class diff --git a/entry/src/main/js/default/pages/index/index.hml b/entry/src/main/js/default/pages/index/index.hml index 2e4b7fb4..17a3a7ac 100755 --- a/entry/src/main/js/default/pages/index/index.hml +++ b/entry/src/main/js/default/pages/index/index.hml @@ -18,9 +18,16 @@
    - - - - + + + + + + + +
    \ No newline at end of file diff --git a/entry/src/main/js/default/pages/index/index.js b/entry/src/main/js/default/pages/index/index.js index e4acf7d8..6910bdf1 100755 --- a/entry/src/main/js/default/pages/index/index.js +++ b/entry/src/main/js/default/pages/index/index.js @@ -13,27 +13,33 @@ * limitations under the License. */ -import BatteryStatus from '../../center/battery/batteryStatus.js'; -import SignalStatus from '../../center/signal/signalStatus.js'; -import StatusCenter from '../../center/statuscenter/StatusCenter.js' +import StatusCenter from '../../center/statuscenter/StatusCenter.js'; import mLog from '../../common/utils/Log.js'; +import FeatureAbility from '@ohos.ability.featureability'; const CHANGE = true; const NOT_CHANGE = false; -const MAX_HEIGHT = "100%"; -const MAX_WIDTH = "100%"; -const MIN_HEIGHT = "0px"; -const MIN_WIDTH = "0px"; +const MAX_HEIGHT = '100%'; +const MAX_WIDTH = '100%'; +const MIN_HEIGHT = '0px'; +const MIN_WIDTH = '0px'; const SPREAD_HEIGHT = 10; const SHRINK_HEIGHT = -10; const Y_INITIAL = 0; const LOOP_TIME = 100; +const LOOP_TIME_UP = 300; const TAG = 'index'; -var mBatteryStatus = new BatteryStatus(); -var mSignalStatus = new SignalStatus(); -var mStatusCenter = new StatusCenter(); +const MARK_MONDAY = 1; +const MARK_TUESDAY = 2; +const MARK_WEDNESDAY = 3; +const MARK_THURSDAY = 4; +const MARK_FRIDAY = 5; +const MARK_SATURDAY = 6; +const MARK_SUNDAY = 0; +const SETTINGS_BUNDLE_NAME = 'com.ohos.settings'; +const SETTINGS_ABILITY_NAME = 'com.ohos.settings.MainAbility'; -globalThis.$globalT; +var mStatusCenter = new StatusCenter(); export default { data: { @@ -46,51 +52,85 @@ export default { statusWidth: MAX_WIDTH, largeStatusBarHeight: MIN_HEIGHT, largeStatusBarWidth: MIN_WIDTH, - backgroundColor: "", - showClock: true + backgroundColor: '', + showClock: true, + showLarge:false, + mCellularType:'', + mTypeShow:'', + mCellularImage:'', + mBackgroundColor:'', + mProgressWidth:'', + mTime:'', + mDate:'' + }, + onInit() { - mLog.showInfo(TAG, `onInit start`); - // add resources file bind - globalThis.$globalT = this.$t.bind(this); + mLog.showInfo(TAG, 'onInit start'); this.backgroundColor = this.$t('colors.statusBackground'); - mSignalStatus.init(); - mBatteryStatus.init(); - mLog.showInfo(TAG, `onInit end`); + this.$app.$def.data.StatusCenter.registerSignalListen(this.getSignalImage.bind(this)); + this.$app.$def.data.StatusCenter.registerBatteryListen(this.getBatteryValue.bind(this)); + this.$app.$def.data.StatusCenter.registerTimeListen(this.getcurrentTime.bind(this)); + mLog.showInfo(TAG, 'onInit end'); }, + onBackPress() { - mLog.showInfo(TAG, `statusBar onBackPress start`); - if (this.statusHeight == MIN_HEIGHT) { + mLog.showInfo(TAG, 'statusBar onBackPress start'); + if (this.statusHeight === MIN_HEIGHT) { this.isChange = CHANGE; - this.statusHeight = MAX_HEIGHT + this.statusHeight = MAX_HEIGHT; this.statusWidth = MAX_WIDTH; this.largeStatusBarHeight = MIN_HEIGHT; this.largeStatusBarWidth = MIN_WIDTH; this.backgroundColor = this.$t('colors.statusBackground'); this.setWindowMin(); + this.showLarge = false; } - mLog.showInfo(TAG, `statusBar onBackPress end`); + mLog.showInfo(TAG, 'statusBar onBackPress end'); }, /** * Set button click - * @param {object} dateEvent quicklySetting Set button click return data + * + * @param {Object} dateEvent quicklySetting Set button click return data */ settingClick(dateEvent) { mLog.showInfo(TAG, `settingClick start dateEvent: ${JSON.stringify(dateEvent)}`); + this.showLarge = false; this.statusHeight = dateEvent.detail.statusHeight; this.statusWidth = dateEvent.detail.statusWidth; this.largeStatusBarHeight = dateEvent.detail.notificationHeight; this.largeStatusBarWidth = dateEvent.detail.notificationWidth; this.backgroundColor = dateEvent.detail.backgroundColor; + setTimeout(() => { + this.setWindowMin(); + }, LOOP_TIME); + + let result = FeatureAbility.startAbility({ + want: { + bundleName: SETTINGS_BUNDLE_NAME, + abilityName: SETTINGS_ABILITY_NAME, + }, + }).then(data => + mLog.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)).catch(error => + mLog.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); + mLog.showInfo(TAG, `start ability ${result}`); }, + onDestroy() { - mLog.showInfo(TAG, `onDestroy`); + mLog.showInfo(TAG, 'onDestroy'); + this.$app.$def.data.StatusCenter.unRegisterBatteryListen(this.getBatteryValue.bind(this)); + this.$app.$def.data.StatusCenter.unRegisterSignalListen()(this.getSignalImage.bind(this)); + this.$app.$def.data.StatusCenter.unRegisterTimeListen()(this.getcurrentTime.bind(this)); + this.$app.$def.data.StatusCenter.stopUpdateTime(); + this.$app.$def.data.StatusCenter.stopUpdateBattery(); + this.$app.$def.data.StatusCenter.stopUpdateSignal(); }, /** * Monitor touch start method - * @param {object} touchEvent TouchStart return data + * + * @param {Object} touchEvent TouchStart return data */ onTouchStartListener(touchEvent) { mLog.showInfo(TAG, `onTouchStartListener start touchEvent: ${JSON.stringify(touchEvent)}`); @@ -100,11 +140,12 @@ export default { /** * Monitor touch Move method - * @param {object} touchEvent TouchMove return data + * + * @param {Object} touchEvent TouchMove return data */ onTouchMoveListener(touchEvent) { mLog.showInfo(TAG, `onTouchStartListener move touchEvent: ${JSON.stringify(touchEvent)}`); - if (this.isChange == CHANGE) { + if (this.isChange === CHANGE) { return; } this.moveY = touchEvent.touches[0].globalY - this.startGlobalY; @@ -115,19 +156,19 @@ export default { setTimeout(() => { this.largeStatusBarHeight = MAX_HEIGHT; this.largeStatusBarWidth = MAX_WIDTH; - this.backgroundColor = ""; + this.backgroundColor = ''; this.setWindowMax(); + this.showLarge = true; }, LOOP_TIME); } else if (this.moveY < SHRINK_HEIGHT) { this.isChange = CHANGE; - this.statusHeight = MAX_HEIGHT + this.showLarge = false; + this.statusHeight = MAX_HEIGHT; this.statusWidth = MAX_WIDTH; + this.backgroundColor = this.$t('colors.statusBackground'); setTimeout(() => { - this.largeStatusBarHeight = MIN_HEIGHT; - this.largeStatusBarWidth = MIN_WIDTH; - this.backgroundColor = this.$t('colors.statusBackground'); this.setWindowMin(); - }, LOOP_TIME); + }, LOOP_TIME_UP); } }, @@ -147,5 +188,71 @@ export default { mStatusCenter.setWindowMin((result) => { mLog.showInfo(TAG, `setWindowMin result ${result}`); }); + }, + + /** + * Get signal icon Data + * + * @param {string} result result signal icon data + */ + getSignalImage(result) { + mLog.showInfo(TAG, `signalImage: ${result}`); + this.mCellularType = JSON.parse(result).cellularType; + if (this.mCellularType === '') { + this.mTypeShow = false; + } else { + this.mTypeShow = true; + } + this.mCellularImage = JSON.parse(result).cellularImage; + }, + + /** + * Get battery data + * + * @param {string} result result battery data + */ + getBatteryValue(result) { + mLog.showInfo(TAG, `batteryValue: ${JSON.parse(result)}`); + this.mBackgroundColor = JSON.parse(result).mBackgroundColor; + this.mProgressWidth = JSON.parse(result).mProgressWidth; + }, + + /** + * Get currentTime data + * + * @param {string} result result currentTime data + */ + getcurrentTime(result) { + mLog.showInfo(TAG, `getcurrentTime: ${result}`); + this.mTime = JSON.parse(result).time; + let weekDay = ''; + switch (JSON.parse(result).date.weekDay) { + case MARK_MONDAY: + weekDay = this.$t('strings.monday'); + break; + case MARK_TUESDAY: + weekDay = this.$t('strings.tuesday'); + break; + case MARK_WEDNESDAY: + weekDay = this.$t('strings.wednesday'); + break; + case MARK_THURSDAY: + weekDay = this.$t('strings.thursday'); + break; + case MARK_FRIDAY: + weekDay = this.$t('strings.friday'); + break; + case MARK_SATURDAY: + weekDay = this.$t('strings.saturday'); + break; + case MARK_SUNDAY: + weekDay = this.$t('strings.sunday'); + break; + default: + break; + } + this.mDate =JSON.parse(result).date.month + this.$t('strings.month') + JSON.parse(result).date.day + + this.$t('strings.day') + weekDay; + mLog.showInfo(TAG, `getcurrentTime: ${this.mDate}`); } } \ No newline at end of file diff --git a/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.hml b/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.hml index 7cd76f47..119124c1 100644 --- a/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.hml +++ b/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.hml @@ -18,9 +18,10 @@ -
    +
    - + show-clock="{{showClock}}" cellular-type="{{cellularType}}" type-show="{{typeShow}}" cellular-image="{{cellularImage}}" + back-color="{{backColor}}" progress-width="{{progressWidth}}"> +
    diff --git a/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.js b/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.js index 47eb7bf2..51c682a2 100644 --- a/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.js +++ b/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.js @@ -15,20 +15,22 @@ import mLog from '../../common/utils/Log.js'; -const MAX_HEIGHT = "100px"; -const MAX_WIDTH = "100%"; +const MAX_HEIGHT = '110px'; +const MAX_WIDTH = '100%'; const TAG = 'LargeStatusBar'; export default { - props: ['windowHeight', 'windowWidth'], + props: ['cellularType', 'typeShow', 'cellularImage', 'backColor', 'progressWidth', 'mTime', 'mDate'], + data: { statusHeight: MAX_HEIGHT, statusWidth: MAX_WIDTH, - backgroundColor: "", + backgroundColor: '', showClock: false }, + onInit() { - mLog.showInfo(TAG, `largeStatusBar onInit`); + mLog.showInfo(TAG, 'largeStatusBar onInit'); }, /** @@ -37,7 +39,7 @@ export default { */ settingClick(event) { mLog.showInfo(TAG, `largeStatusBar settingClick event: ${JSON.stringify(event)}`); - this.$emit('settingClick', { + this.$emit('eventSet', { statusHeight: event.detail.statusHeight, statusWidth: event.detail.statusWidth, notificationHeight: event.detail.notificationHeight, diff --git a/entry/src/main/js/default/pages/quicklySetting/quicklySetting.js b/entry/src/main/js/default/pages/quicklySetting/quicklySetting.js index f71e10fd..936d99d4 100644 --- a/entry/src/main/js/default/pages/quicklySetting/quicklySetting.js +++ b/entry/src/main/js/default/pages/quicklySetting/quicklySetting.js @@ -13,73 +13,35 @@ * limitations under the License. */ -import StatusCenter from '../../center/statuscenter/StatusCenter.js'; import mLog from '../../common/utils/Log.js'; -import FeatureAbility from '@ohos.ability.featureability'; const TAG = 'quicklySetting'; -const MAX_HEIGHT = "100%"; -const MAX_WIDTH = "100%"; -const MIN_HEIGHT = "0px"; -const MIN_WIDTH = "0px"; -const REQUEST_CODE = 1; -const FLAGS = 2; -const SYNC_OPTION = 1; -const SETTINGS_BUNDLE_NAME = 'com.ohos.settings'; -const SETTINGS_ABILITY_NAME = 'com.ohos.settings.MainAbility'; - -var mStatusCenter = new StatusCenter(); +const MAX_HEIGHT = '100%'; +const MAX_WIDTH = '100%'; +const MIN_HEIGHT = '0px'; +const MIN_WIDTH = '0px'; export default { + props:['mTime', 'mDate'], + data: { - mTime:"", - mDate:"" }, + onInit() { - mLog.showInfo(TAG, `onInit`) - this.getDateTime(); + mLog.showInfo(TAG, 'onInit'); }, /** * Set button click */ - settingClick(){ - mLog.showInfo(TAG, `setting click and start ability setting`); - this.$emit('settingClick', { - statusHeight : MAX_HEIGHT, - statusWidth : MAX_WIDTH, - notificationHeight : MIN_HEIGHT, - notificationWidth : MIN_WIDTH, - backgroundColor :this.$t('colors.statusBackground') - }); - this.setWindowMin(); - let result = FeatureAbility.startAbility({ - want: { - bundleName: SETTINGS_BUNDLE_NAME, - abilityName: SETTINGS_ABILITY_NAME, - }, - }).then(data => - mLog.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)).catch(error => - mLog.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); - mLog.showInfo(TAG, `start ability ${result}`); - }, - - /** - * Minimize window - */ - setWindowMin(){ - mStatusCenter.setWindowMin((result) =>{ - mLog.showInfo(TAG, `setWindowMin result: ${result}`); + settingClick() { + mLog.showInfo(TAG, 'setting click and start ability setting'); + this.$emit('eventSet', { + statusHeight: MAX_HEIGHT, + statusWidth: MAX_WIDTH, + notificationHeight: MIN_HEIGHT, + notificationWidth: MIN_WIDTH, + backgroundColor: this.$t('colors.statusBackground') }); }, - - /** - * Get display time - */ - getDateTime(){ - mStatusCenter.setOnTimeListener((currentDate) => { - this.mTime = JSON.parse(currentDate).time; - this.mDate = JSON.parse(currentDate).date; - }); - } } diff --git a/entry/src/main/js/default/pages/statusbar/clock/clock.js b/entry/src/main/js/default/pages/statusbar/clock/clock.js index 963f8f8a..c4ad49e5 100755 --- a/entry/src/main/js/default/pages/statusbar/clock/clock.js +++ b/entry/src/main/js/default/pages/statusbar/clock/clock.js @@ -13,25 +13,21 @@ * limitations under the License. */ -import StatusCenter from '../../../center/statuscenter/StatusCenter.js'; import mLog from '../../../common/utils/Log.js'; const TAG = 'clock'; -var mStatusCenter = new StatusCenter(); export default { + props:['mTime', 'mDate'], + data: { - mTime: '' }, + onInit() { - mLog.showInfo(TAG, `clock onInit`); - // get currentDate - mStatusCenter.setOnTimeListener((currentDate) => { - this.mTime = JSON.parse(currentDate).time; - }); + mLog.showInfo(TAG, 'clock onInit'); }, + onDestroy() { - mLog.showInfo(TAG, `clock onDestroy`); - mStatusCenter.stopUpdateTime(); + mLog.showInfo(TAG, 'clock onDestroy'); } } diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.hml b/entry/src/main/js/default/pages/statusbar/statusBar.hml index 0148ba4b..9edbb123 100755 --- a/entry/src/main/js/default/pages/statusbar/statusBar.hml +++ b/entry/src/main/js/default/pages/statusbar/statusBar.hml @@ -21,20 +21,20 @@
    - {{ mCellularType }} - + {{ cellularType }} +
    + style="width : {{ progressWidth }}; background-color : {{ backColor }};">
    - +
    diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.js b/entry/src/main/js/default/pages/statusbar/statusBar.js index 54fec8b2..af4c16c6 100755 --- a/entry/src/main/js/default/pages/statusbar/statusBar.js +++ b/entry/src/main/js/default/pages/statusbar/statusBar.js @@ -13,53 +13,19 @@ * limitations under the License. */ -import StatusCenter from '../../center/statuscenter/StatusCenter.js'; import mLog from '../../common/utils/Log.js'; const TAG = 'statusBar'; -const LOOP_TIME = 1500; -var mStatusCenter = new StatusCenter(); export default { - props: ['statusHeight', 'statusWidth', "backgroundColor", "showClock"], - data: { - mCellularType: '', - mTypeShow: '', - mCellularImage: '', - mBackgroundColor: '', - mProgressWidth: '', - }, - onInit() { - mLog.showInfo(TAG, `onInit`); - let that = this; - setInterval(function () { - that.getBatteryValue(); - that.getSignalImage(); - }, LOOP_TIME); - }, + props: ['statusHeight', 'statusWidth', 'backgroundColor', 'showClock', 'cellularType', 'typeShow', + 'cellularImage', 'backColor', 'progressWidth', 'mTime', 'mDate'], - /** - * Get signal icon Data - */ - getSignalImage() { - let signalStatus = mStatusCenter.setOnSignalListener(); - mLog.showInfo(TAG, `signalImage: ${signalStatus}`); - this.mCellularType = JSON.parse(signalStatus).cellularType; - if (this.mCellularType == '') { - this.mTypeShow = false; - } else { - this.mTypeShow = true; - } - this.mCellularImage = JSON.parse(signalStatus).cellularImage; + data: { }, - /** - * Get battery data - */ - getBatteryValue() { - let batteryValue = mStatusCenter.setOnBatteryListener(); - mLog.showInfo(TAG, `batteryValue: ${batteryValue}`); - this.mBackgroundColor = JSON.parse(batteryValue).mBackgroundColor; - this.mProgressWidth = JSON.parse(batteryValue).mProgressWidth; + onInit() { + mLog.showInfo(TAG, 'onInit'); } + } diff --git a/navigationBar/src/main/js/default/common/utils/Log.js b/navigationBar/src/main/js/default/common/utils/Log.js index dac1baed..53737497 100644 --- a/navigationBar/src/main/js/default/common/utils/Log.js +++ b/navigationBar/src/main/js/default/common/utils/Log.js @@ -13,7 +13,7 @@ * limitations under the License. */ -var TAG = "SystemUI_NavigationBar"; +var TAG = 'SystemUI_NavigationBar'; /** * Basic log class diff --git a/systemDialog/src/main/js/default/center/systemDialogCenter/SystemDialogCenter.js b/systemDialog/src/main/js/default/center/systemDialogCenter/SystemDialogCenter.js index 70330314..92637890 100644 --- a/systemDialog/src/main/js/default/center/systemDialogCenter/SystemDialogCenter.js +++ b/systemDialog/src/main/js/default/center/systemDialogCenter/SystemDialogCenter.js @@ -19,28 +19,39 @@ import mLog from '../../common/utils/Log.js'; const TAG = 'SystemDialog_SystemDialogCenter'; - export default class SystemDialogCenter { + + /** + * Get permission information + * + * @param {Object} callBack - Callback function + */ getMessageWant(callBack) { - mLog.showInfo(TAG, ` getMessageWant Start`); + mLog.showInfo(TAG, 'getMessageWant Start'); featureAbility.getWant((err, data) => { let appArray = data; mLog.showInfo(TAG, ` getMessageWant callBack ${JSON.stringify(appArray)}`); callBack(appArray); }); } + + /** + * Return of the authority information selected by the user + * + * @param {Object} AbilityResult - information selected by the user + */ finishResult(AbilityResult){ if(Object.keys(AbilityResult) .length != 0){ - mLog.showInfo(TAG, ` finishResult Start`); + mLog.showInfo(TAG, 'finishResult Start'); mLog.showInfo(TAG, ` finishResult parameter ${JSON.stringify(AbilityResult)}`); featureAbility.finishWithResult(AbilityResult, (err, data) => { - mLog.showInfo(TAG, ` finishResult finishWithResult callback`); + mLog.showInfo(TAG, 'finishResult finishWithResult callback'); featureAbility.terminateAbility((err, data) => { - mLog.showInfo(TAG, ` finishResult terminateAbility callback`); + mLog.showInfo(TAG, 'finishResult terminateAbility callback'); }); }); - }else{ - mLog.showInfo(TAG, ` finishResult AbilityResult is a empty object`); + } else { + mLog.showInfo(TAG, 'finishResult AbilityResult is a empty object'); } } } \ No newline at end of file diff --git a/systemDialog/src/main/js/default/common/utils/Log.js b/systemDialog/src/main/js/default/common/utils/Log.js index c7fe5c57..320a8178 100644 --- a/systemDialog/src/main/js/default/common/utils/Log.js +++ b/systemDialog/src/main/js/default/common/utils/Log.js @@ -13,7 +13,7 @@ * limitations under the License. */ -var TAG = "SystemUI_Dialog"; +var TAG = 'SystemUI_Dialog'; /** * Basic log class diff --git a/systemDialog/src/main/js/default/pages/index/index.js b/systemDialog/src/main/js/default/pages/index/index.js index 63bc74c3..0280c19a 100644 --- a/systemDialog/src/main/js/default/pages/index/index.js +++ b/systemDialog/src/main/js/default/pages/index/index.js @@ -82,6 +82,7 @@ export default { } mLog.showInfo(TAG, ` changeSwitch End`); }, + /** * User confirmation */ @@ -108,6 +109,7 @@ export default { mSystemDialogCenter.finishResult(AbilityResult); }, + /** * User canceled */ -- Gitee From 2482ca4fdea2f71f732af39f4567f1130228707b Mon Sep 17 00:00:00 2001 From: LiuZhenyu2021 Date: Wed, 15 Sep 2021 20:31:56 +0800 Subject: [PATCH 010/373] dir update Signed-off-by: LiuZhenyu2021 --- build.gradle | 2 +- common/src/main/config.json | 23 ++ .../src/main/ets/default/CheckEmptyUtils.ets | 30 +- .../src/main/ets/default/Log.ets | 2 +- .../src/main/ets/default/WindowManager.ets | 42 +-- .../main/resources/base/element/string.json | 8 + entry/build.gradle | 4 +- entry/src/main/config.json | 19 +- .../src/main/ets/default/app.ets | 18 +- entry/src/main/ets/default/pages/index.ets | 27 ++ .../default/center/battery/batteryStatus.js | 125 -------- .../js/default/center/signal/signalStatus.js | 167 ---------- .../center/statuscenter/StatusCenter.js | 273 ---------------- .../statuscenter/manager/DateManager.js | 81 ----- .../common/image_mdpi/ic_status_battery.png | Bin 233 -> 0 bytes .../common/image_mdpi/ic_status_signal.png | Bin 243 -> 0 bytes .../image_mdpi/ic_statusbar_signal_full.png | Bin 225 -> 0 bytes .../image_mdpi/ic_statusbar_signal_half.png | Bin 251 -> 0 bytes .../image_mdpi/ic_statusbar_signal_no.png | Bin 222 -> 0 bytes .../image_mdpi/ic_statusbar_signal_null.png | Bin 286 -> 0 bytes .../ic_statusbar_signal_roaming.png | Bin 175 -> 0 bytes .../image_mdpi/ic_statusbar_signal_wait.png | Bin 178 -> 0 bytes entry/src/main/js/default/i18n/en-US.json | 16 - entry/src/main/js/default/i18n/zh-CN.json | 17 - .../src/main/js/default/pages/index/index.hml | 33 -- .../src/main/js/default/pages/index/index.js | 258 --------------- .../pages/largeStatusBar/largeStatusBar.hml | 27 -- .../pages/notification/notification.hml | 20 -- .../pages/quicklySetting/quicklySetting.css | 108 ------- .../pages/quicklySetting/quicklySetting.hml | 26 -- .../pages/quicklySetting/quicklySetting.js | 47 --- .../js/default/pages/statusbar/statusBar.css | 82 ----- .../js/default/pages/statusbar/statusBar.hml | 40 --- features/batterycomponent/build.gradle | 20 ++ .../batterycomponent/src/main/config.json | 22 ++ .../src/main/ets/default/app.ets | 15 +- .../src/main/ets/default/batteryModel.ets | 151 +++++++++ .../src/main/ets/default/common/constants.ets | 60 ++-- .../main/ets/default/pages/batteryIcon.ets | 49 +++ .../src/main/ets/default/pages/batteryPic.ets | 70 ++++ .../src/main/ets/default/pages/batterySoc.ets | 24 +- .../main/resources/base/element/color.json | 20 ++ .../main/resources/base/element/float.json | 32 ++ .../main/resources/base/element/string.json | 12 + .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 12 + .../main/resources/zh_CN/element/string.json | 12 + features/clockcomponent/build.gradle | 20 ++ features/clockcomponent/src/main/config.json | 22 ++ .../src/main/ets/default/app.ets | 13 +- .../src/main/ets/default/pages/clockIcon.ets | 44 +++ .../src/main/ets/default/timeModel.ets | 120 +++++++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/float.json | 11 + .../main/resources/base/element/string.json | 12 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 12 + .../main/resources/zh_CN/element/string.json | 12 + features/control/build.gradle | 20 ++ features/control/src/main/config.json | 23 ++ .../src/main/ets/com/ohos/control/app.ets | 23 ++ .../common/brightness/brightnessManager.ets | 92 ++++++ .../com/ohos/control/common/png/airplane.svg | 14 + .../ohos/control/common/png/airplane_d.svg | 14 + .../common/png/ic_notification_settings.png | Bin .../ets/com/ohos/control/common/png/wifi.svg | 17 + .../com/ohos/control/common/png/wifi_d.svg | 17 + .../control/common/volume/VolumeModel.ets | 65 ++++ .../com/ohos/control/pages/ControlCenter.ets | 84 +++++ .../com/ohos/control/pages/IconComponent.ets | 133 ++++++++ .../ets/com/ohos/control/pages/Uniform.ets | 7 +- .../ets/com/ohos/control/pages/UpTitle.ets | 62 ++++ .../ohos/control/pages/airPlaneComponent.ets | 52 +++ .../control/pages/brightnessComponent.ets | 77 +++++ .../ohos/control/pages/volumeComponent.ets | 89 ++++++ .../com/ohos/control/pages/wifiComponent.ets | 67 ++-- .../main/resources/base/element/color.json | 41 +++ .../main/resources/base/element/float.json | 84 +++++ .../main/resources/base/element/string.json | 23 ++ .../main/resources/base/media/airplane.svg | 14 + .../main/resources/base/media/airplane_d.svg | 14 + .../base/media/ic_notification_settings.png | Bin 0 -> 1060 bytes .../src/main/resources/base/media/wifi.svg | 17 + .../src/main/resources/base/media/wifi_d.svg | 17 + .../main/resources/en_US/element/string.json | 21 ++ .../main/resources/zh_CN/element/string.json | 21 ++ .../navigationservice}/.gitignore | 3 +- features/navigationservice/build.gradle | 21 ++ .../navigationservice/src/main/config.json | 23 ++ .../ohos/navigationservice/ConfigManager.ets | 26 +- .../ohos/navigationservice/KeyCodeEvent.ets | 109 +++++++ .../ohos/navigationservice/common/colors.ets | 7 +- .../ohos/navigationservice/common/strings.ets | 28 +- .../main/resources/base/element/string.json | 8 + features/noticeitem/build.gradle | 23 ++ features/noticeitem/src/main/config.json | 23 ++ .../com/ohos/noticeItem/common/constants.ets | 33 ++ .../ets/com/ohos/noticeItem/item/longItem.ets | 178 +++++++++++ .../com/ohos/noticeItem/item/multiItem.ets | 181 +++++++++++ .../ohos/noticeItem/item/notificationItem.ets | 91 ++++++ .../com/ohos/noticeItem/item/titleItem.ets | 66 ++++ .../main/resources/base/element/color.json | 20 ++ .../main/resources/base/element/float.json | 108 +++++++ .../main/resources/base/element/string.json | 8 + .../src/main/resources/base/media/delete.png | Bin 0 -> 230 bytes .../src/main/resources/base/media/down.png | Bin 0 -> 509 bytes .../src/main/resources/base/media/up.png | Bin 0 -> 249 bytes .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + features/notificationservice/build.gradle | 23 ++ .../notificationservice/src/main/config.json | 23 ++ .../NotificationService.ets | 298 ++++++++++++++++++ .../main/resources/base/element/string.json | 8 + features/signalcomponent/build.gradle | 22 ++ features/signalcomponent/src/main/config.json | 22 ++ .../src/main/ets/default/app.ets | 12 +- .../src/main/ets/default/common/constants.ets | 38 +++ .../src/main/ets/default/pages/signalIcon.ets | 147 +++++++++ .../src/main/ets/default/signalModel.ets | 145 +++++++++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/float.json | 36 +++ .../main/resources/base/element/string.json | 44 +++ .../base/media/ic_statusbar_signal_1.png | Bin 0 -> 569 bytes .../base/media/ic_statusbar_signal_2.png | Bin 0 -> 586 bytes .../base/media/ic_statusbar_signal_3.png | Bin 0 -> 598 bytes .../base/media/ic_statusbar_signal_4.png | Bin 0 -> 576 bytes .../base/media/ic_statusbar_signal_full.png | Bin 0 -> 556 bytes .../base/media/ic_statusbar_signal_no.png | Bin 0 -> 529 bytes .../base/media/ic_statusbar_signal_null.png | Bin 0 -> 802 bytes .../media/ic_statusbar_signal_roaming.png | Bin 0 -> 411 bytes .../base/media}/ic_statusbar_signal_wait.png | Bin .../base/media/ic_statusbar_wifi_connect.png | Bin 0 -> 331 bytes .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 44 +++ .../main/resources/zh_CN/element/string.json | 43 +++ features/wificomponent/build.gradle | 23 ++ features/wificomponent/src/main/config.json | 22 ++ .../src/main/ets/default/app.ets | 23 ++ .../src/main/ets/default/common/constants.ets | 53 ++-- .../src/main/ets/default/pages/wifiIcon.ets | 66 ++++ .../src/main/ets/default/wifiModel.ets | 185 +++++++++++ .../main/resources/base/element/float.json | 14 + .../main/resources/base/element/string.json | 12 + .../base/media/ic_statusbar_wifi_1.png | Bin 0 -> 1054 bytes .../base/media/ic_statusbar_wifi_2.png | Bin 0 -> 1043 bytes .../base/media/ic_statusbar_wifi_3.png | Bin 0 -> 1016 bytes .../base/media/ic_statusbar_wifi_connect.png | Bin 0 -> 331 bytes .../base/media/ic_statusbar_wifi_full.png | Bin 0 -> 958 bytes .../base/media/ic_statusbar_wifi_no.png | Bin 0 -> 1087 bytes .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/js/default/pages/backKey/backKey.hml | 18 -- .../main/js/default/pages/homeKey/homeKey.hml | 18 -- .../main/js/default/pages/homeKey/homeKey.js | 40 --- .../src/main/js/default/pages/index/index.css | 27 -- .../js/default/pages/recentKey/recentKey.css | 26 -- .../js/default/pages/recentKey/recentKey.js | 40 --- .../navigationBar}/build.gradle | 28 +- .../navigationBar}/package.json | 2 +- .../navigationBar}/src/main/config.json | 12 +- .../src/main/ets/default/app.ets | 22 +- .../src/main/ets/default/common/constants.ets | 21 +- .../common/image_hdpi/ic_navigation_back.png | Bin .../common/image_hdpi/ic_navigation_home.png | Bin .../image_hdpi/ic_navigation_recent.png | Bin .../common/image_mdpi/ic_navigation_back.png | Bin .../common/image_mdpi/ic_navigation_home.png | Bin .../image_mdpi/ic_navigation_recent.png | Bin .../common/image_xhdpi/ic_navigation_back.png | Bin .../common/image_xhdpi/ic_navigation_home.png | Bin .../image_xhdpi/ic_navigation_recent.png | Bin .../image_xxhdpi/ic_navigation_back.png | Bin .../image_xxhdpi/ic_navigation_home.png | Bin .../image_xxhdpi/ic_navigation_recent.png | Bin .../image_xxxhdpi/ic_navigation_back.png | Bin .../image_xxxhdpi/ic_navigation_home.png | Bin .../image_xxxhdpi/ic_navigation_recent.png | Bin .../ets/default/common/utils/configReader.ets | 60 ++++ .../src/main/ets}/default/i18n/en-US.json | 0 .../src/main/ets}/default/i18n/zh-CN.json | 0 .../src/main/ets/default/pages/index.ets | 50 +++ .../src/main/ets/default/pages/keyButton.ets | 52 ++- .../src/main/ets/default/pages/oneLayout.ets | 44 +++ .../main/ets/default/pages/threeLayout.ets | 50 +++ .../main/resources/base/element/color.json | 16 + .../main/resources/base/element/float.json | 41 +++ .../main/resources/base/element/string.json | 22 +- .../base/media/ic_navigation_back.png | Bin 0 -> 409 bytes .../base/media/ic_navigation_home.png | Bin 0 -> 420 bytes .../base/media/ic_navigation_recent.png | Bin 0 -> 221 bytes .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 12 + .../rawfile/navigationBarLayoutConfig.json | 3 + .../main/resources/zh_CN/element/string.json | 12 + product/statusbar/build.gradle | 21 ++ product/statusbar/package.json | 1 + product/statusbar/src/main/config.json | 57 ++++ .../statusbar/src/main/ets/default/app.ets | 17 +- .../src/main/ets/default/common/constants.ets | 10 +- .../common/image_hdpi/ic_status_battery.png | Bin .../common/image_hdpi/ic_status_signal.png | Bin .../image_hdpi/ic_statusbar_signal_full.png | Bin .../image_hdpi/ic_statusbar_signal_half.png | Bin .../image_hdpi/ic_statusbar_signal_no.png | Bin .../image_hdpi/ic_statusbar_signal_null.png | Bin .../ic_statusbar_signal_roaming.png | Bin .../image_hdpi/ic_statusbar_signal_wait.png | Bin .../image_hdpi/ic_statusbar_wifi_connect.png | Bin 0 -> 189 bytes .../image_hdpi/ic_statusbar_wifi_full.png | Bin 0 -> 484 bytes .../image_hdpi/ic_statusbar_wifi_no.png | Bin 0 -> 577 bytes .../image_hdpi/ic_statusbar_wifi_pause.png | Bin 0 -> 189 bytes .../default/common/image_mdpi/delete_all.png | Bin 0 -> 4061 bytes .../default/common/image_mdpi/ic_settings.png | Bin 0 -> 1060 bytes .../common/image_mdpi}/ic_status_battery.png | Bin .../common/image_mdpi}/ic_status_signal.png | Bin .../image_mdpi}/ic_statusbar_signal_full.png | Bin .../image_mdpi}/ic_statusbar_signal_half.png | Bin .../image_mdpi}/ic_statusbar_signal_no.png | Bin .../image_mdpi}/ic_statusbar_signal_null.png | Bin .../ic_statusbar_signal_roaming.png | Bin .../image_mdpi/ic_statusbar_signal_wait.png | Bin 0 -> 442 bytes .../image_mdpi/ic_statusbar_wifi_connect.png | Bin 0 -> 369 bytes .../image_mdpi/ic_statusbar_wifi_full.png | Bin 0 -> 959 bytes .../image_mdpi/ic_statusbar_wifi_no.png | Bin 0 -> 1135 bytes .../image_mdpi/ic_statusbar_wifi_pause.png | Bin 0 -> 293 bytes .../common/image_xhdpi/ic_status_battery.png | Bin .../common/image_xhdpi/ic_status_signal.png | Bin .../image_xhdpi/ic_statusbar_signal_full.png | Bin .../image_xhdpi/ic_statusbar_signal_half.png | Bin .../image_xhdpi/ic_statusbar_signal_no.png | Bin .../image_xhdpi/ic_statusbar_signal_null.png | Bin .../ic_statusbar_signal_roaming.png | Bin .../image_xhdpi/ic_statusbar_signal_wait.png | Bin .../image_xhdpi/ic_statusbar_wifi_connect.png | Bin 0 -> 331 bytes .../image_xhdpi/ic_statusbar_wifi_full.png | Bin 0 -> 622 bytes .../image_xhdpi/ic_statusbar_wifi_no.png | Bin 0 -> 756 bytes .../image_xhdpi/ic_statusbar_wifi_pause.png | Bin 0 -> 190 bytes .../common/image_xxhdpi/delete_all.png | Bin 0 -> 4061 bytes .../common/image_xxhdpi/ic_settings.png | Bin 0 -> 1060 bytes .../common/image_xxhdpi/ic_status_battery.png | Bin 0 -> 579 bytes .../common/image_xxhdpi/ic_status_signal.png | Bin 0 -> 569 bytes .../image_xxhdpi/ic_statusbar_signal_full.png | Bin 0 -> 377 bytes .../image_xxhdpi/ic_statusbar_signal_half.png | Bin 0 -> 420 bytes .../image_xxhdpi/ic_statusbar_signal_no.png | Bin 0 -> 346 bytes .../image_xxhdpi/ic_statusbar_signal_null.png | Bin 0 -> 525 bytes .../ic_statusbar_signal_roaming.png | Bin 0 -> 411 bytes .../image_xxhdpi/ic_statusbar_signal_wait.png | Bin 0 -> 442 bytes .../ic_statusbar_wifi_connect.png | Bin 0 -> 369 bytes .../image_xxhdpi/ic_statusbar_wifi_full.png | Bin 0 -> 959 bytes .../image_xxhdpi/ic_statusbar_wifi_no.png | Bin 0 -> 1135 bytes .../image_xxhdpi/ic_statusbar_wifi_pause.png | Bin 0 -> 293 bytes .../image_xxxhdpi/ic_status_battery.png | Bin .../common/image_xxxhdpi/ic_status_signal.png | Bin .../ic_statusbar_signal_full.png | Bin .../ic_statusbar_signal_half.png | Bin .../image_xxxhdpi/ic_statusbar_signal_no.png | Bin .../ic_statusbar_signal_null.png | Bin .../ic_statusbar_signal_roaming.png | Bin .../ic_statusbar_signal_wait.png | Bin .../ic_statusbar_wifi_connect.png | Bin 0 -> 313 bytes .../image_xxxhdpi/ic_statusbar_wifi_full.png | Bin 0 -> 1183 bytes .../image_xxxhdpi/ic_statusbar_wifi_no.png | Bin 0 -> 1483 bytes .../image_xxxhdpi/ic_statusbar_wifi_pause.png | Bin 0 -> 201 bytes .../ets/default/common/util/configReader.ets | 59 ++++ .../ets/default/pages/common/constants.ets | 29 +- .../src/main/ets/default/pages/control.ets | 83 +++++ .../main/ets/default/pages/defaultLayout.ets | 49 +++ .../src/main/ets/default/pages/index.ets | 88 ++++++ .../main/ets/default/pages/notification.ets | 247 +++++++++++++++ .../main/ets/default/pages/twoGroupLayout.ets | 73 +++++ .../main/resources/base/element/color.json | 35 ++ .../main/resources/base/element/float.json | 72 +++++ .../main/resources/base/element/string.json | 51 +++ .../main/resources/base/media/airplane.svg | 14 + .../main/resources/base/media/airplane_d.svg | 14 + .../main/resources/base/media/delete_all.png | Bin 0 -> 4061 bytes .../main/resources/base/media/ic_settings.png | Bin 0 -> 1060 bytes .../base/media/ic_statusbar_wifi_full.png | Bin 0 -> 622 bytes .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../src/main/resources/base/media/wifi.svg | 17 + .../src/main/resources/base/media/wifi_d.svg | 17 + .../main/resources/en_US/element/string.json | 51 +++ .../main/resources/rawfile/layoutConfig.json | 7 + .../main/resources/zh_CN/element/string.json | 51 +++ settings.gradle | 5 +- 284 files changed, 5547 insertions(+), 1796 deletions(-) create mode 100644 common/src/main/config.json rename entry/src/main/js/default/common/utils/CheckEmptyUtils.js => common/src/main/ets/default/CheckEmptyUtils.ets (67%) rename entry/src/main/js/default/common/utils/Log.js => common/src/main/ets/default/Log.ets (97%) rename entry/src/main/js/default/center/statuscenter/manager/WindowManager.js => common/src/main/ets/default/WindowManager.ets (55%) create mode 100644 common/src/main/resources/base/element/string.json rename navigationBar/src/main/js/default/pages/backKey/backKey.css => entry/src/main/ets/default/app.ets (76%) mode change 100755 => 100644 create mode 100644 entry/src/main/ets/default/pages/index.ets delete mode 100755 entry/src/main/js/default/center/battery/batteryStatus.js delete mode 100644 entry/src/main/js/default/center/signal/signalStatus.js delete mode 100755 entry/src/main/js/default/center/statuscenter/StatusCenter.js delete mode 100644 entry/src/main/js/default/center/statuscenter/manager/DateManager.js delete mode 100644 entry/src/main/js/default/common/image_mdpi/ic_status_battery.png delete mode 100644 entry/src/main/js/default/common/image_mdpi/ic_status_signal.png delete mode 100644 entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_full.png delete mode 100644 entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_half.png delete mode 100644 entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_no.png delete mode 100644 entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_null.png delete mode 100644 entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_roaming.png delete mode 100644 entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_wait.png delete mode 100755 entry/src/main/js/default/i18n/en-US.json delete mode 100755 entry/src/main/js/default/i18n/zh-CN.json delete mode 100755 entry/src/main/js/default/pages/index/index.hml delete mode 100755 entry/src/main/js/default/pages/index/index.js delete mode 100644 entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.hml delete mode 100644 entry/src/main/js/default/pages/notification/notification.hml delete mode 100644 entry/src/main/js/default/pages/quicklySetting/quicklySetting.css delete mode 100644 entry/src/main/js/default/pages/quicklySetting/quicklySetting.hml delete mode 100644 entry/src/main/js/default/pages/quicklySetting/quicklySetting.js delete mode 100755 entry/src/main/js/default/pages/statusbar/statusBar.css delete mode 100755 entry/src/main/js/default/pages/statusbar/statusBar.hml create mode 100644 features/batterycomponent/build.gradle create mode 100644 features/batterycomponent/src/main/config.json rename entry/src/main/js/default/pages/statusbar/clock/clock.css => features/batterycomponent/src/main/ets/default/app.ets (81%) create mode 100644 features/batterycomponent/src/main/ets/default/batteryModel.ets rename navigationBar/src/main/js/default/common/utils/Log.js => features/batterycomponent/src/main/ets/default/common/constants.ets (40%) create mode 100644 features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets create mode 100644 features/batterycomponent/src/main/ets/default/pages/batteryPic.ets rename entry/src/main/js/default/pages/statusbar/statusBar.js => features/batterycomponent/src/main/ets/default/pages/batterySoc.ets (60%) mode change 100755 => 100644 create mode 100644 features/batterycomponent/src/main/resources/base/element/color.json create mode 100644 features/batterycomponent/src/main/resources/base/element/float.json create mode 100644 features/batterycomponent/src/main/resources/base/element/string.json rename {navigationBar => features/batterycomponent}/src/main/resources/base/media/icon.png (100%) create mode 100644 features/batterycomponent/src/main/resources/en_US/element/string.json create mode 100644 features/batterycomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/clockcomponent/build.gradle create mode 100644 features/clockcomponent/src/main/config.json rename entry/src/main/js/default/pages/index/index.css => features/clockcomponent/src/main/ets/default/app.ets (80%) mode change 100755 => 100644 create mode 100644 features/clockcomponent/src/main/ets/default/pages/clockIcon.ets create mode 100644 features/clockcomponent/src/main/ets/default/timeModel.ets create mode 100644 features/clockcomponent/src/main/resources/base/element/color.json create mode 100644 features/clockcomponent/src/main/resources/base/element/float.json create mode 100644 features/clockcomponent/src/main/resources/base/element/string.json create mode 100644 features/clockcomponent/src/main/resources/base/media/icon.png create mode 100644 features/clockcomponent/src/main/resources/en_US/element/string.json create mode 100644 features/clockcomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/control/build.gradle create mode 100644 features/control/src/main/config.json create mode 100644 features/control/src/main/ets/com/ohos/control/app.ets create mode 100644 features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets create mode 100644 features/control/src/main/ets/com/ohos/control/common/png/airplane.svg create mode 100644 features/control/src/main/ets/com/ohos/control/common/png/airplane_d.svg rename entry/src/main/js/default/common/image_xxhdpi/ic_settings.png => features/control/src/main/ets/com/ohos/control/common/png/ic_notification_settings.png (100%) create mode 100644 features/control/src/main/ets/com/ohos/control/common/png/wifi.svg create mode 100644 features/control/src/main/ets/com/ohos/control/common/png/wifi_d.svg create mode 100644 features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets create mode 100644 features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets create mode 100644 features/control/src/main/ets/com/ohos/control/pages/IconComponent.ets rename entry/src/main/js/default/pages/statusbar/clock/clock.hml => features/control/src/main/ets/com/ohos/control/pages/Uniform.ets (89%) mode change 100755 => 100644 create mode 100644 features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets create mode 100644 features/control/src/main/ets/com/ohos/control/pages/airPlaneComponent.ets create mode 100644 features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets create mode 100644 features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets rename entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.js => features/control/src/main/ets/com/ohos/control/pages/wifiComponent.ets (31%) create mode 100644 features/control/src/main/resources/base/element/color.json create mode 100644 features/control/src/main/resources/base/element/float.json create mode 100644 features/control/src/main/resources/base/element/string.json create mode 100644 features/control/src/main/resources/base/media/airplane.svg create mode 100644 features/control/src/main/resources/base/media/airplane_d.svg create mode 100644 features/control/src/main/resources/base/media/ic_notification_settings.png create mode 100644 features/control/src/main/resources/base/media/wifi.svg create mode 100644 features/control/src/main/resources/base/media/wifi_d.svg create mode 100644 features/control/src/main/resources/en_US/element/string.json create mode 100644 features/control/src/main/resources/zh_CN/element/string.json rename {navigationBar => features/navigationservice}/.gitignore (33%) mode change 100755 => 100644 create mode 100644 features/navigationservice/build.gradle create mode 100644 features/navigationservice/src/main/config.json rename entry/src/main/js/default/pages/notification/notification.js => features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets (61%) create mode 100644 features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets rename navigationBar/src/main/js/default/pages/index/index.js => features/navigationservice/src/main/ets/com/ohos/navigationservice/common/colors.ets (93%) mode change 100755 => 100644 rename entry/src/main/js/default/pages/statusbar/clock/clock.js => features/navigationservice/src/main/ets/com/ohos/navigationservice/common/strings.ets (53%) mode change 100755 => 100644 create mode 100644 features/navigationservice/src/main/resources/base/element/string.json create mode 100644 features/noticeitem/build.gradle create mode 100644 features/noticeitem/src/main/config.json create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets create mode 100644 features/noticeitem/src/main/resources/base/element/color.json create mode 100644 features/noticeitem/src/main/resources/base/element/float.json create mode 100644 features/noticeitem/src/main/resources/base/element/string.json create mode 100644 features/noticeitem/src/main/resources/base/media/delete.png create mode 100644 features/noticeitem/src/main/resources/base/media/down.png create mode 100644 features/noticeitem/src/main/resources/base/media/up.png create mode 100644 features/noticeitem/src/main/resources/en_US/element/string.json create mode 100644 features/noticeitem/src/main/resources/zh_CN/element/string.json create mode 100644 features/notificationservice/build.gradle create mode 100644 features/notificationservice/src/main/config.json create mode 100644 features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets create mode 100644 features/notificationservice/src/main/resources/base/element/string.json create mode 100644 features/signalcomponent/build.gradle create mode 100644 features/signalcomponent/src/main/config.json rename navigationBar/src/main/js/default/app.js => features/signalcomponent/src/main/ets/default/app.ets (78%) create mode 100644 features/signalcomponent/src/main/ets/default/common/constants.ets create mode 100644 features/signalcomponent/src/main/ets/default/pages/signalIcon.ets create mode 100644 features/signalcomponent/src/main/ets/default/signalModel.ets create mode 100644 features/signalcomponent/src/main/resources/base/element/color.json create mode 100644 features/signalcomponent/src/main/resources/base/element/float.json create mode 100644 features/signalcomponent/src/main/resources/base/element/string.json create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.png create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.png create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.png create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.png create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.png create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.png create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_null.png create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png rename {entry/src/main/js/default/common/image_xxhdpi => features/signalcomponent/src/main/resources/base/media}/ic_statusbar_signal_wait.png (100%) create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png create mode 100644 features/signalcomponent/src/main/resources/base/media/icon.png create mode 100644 features/signalcomponent/src/main/resources/en_US/element/string.json create mode 100644 features/signalcomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/wificomponent/build.gradle create mode 100644 features/wificomponent/src/main/config.json create mode 100644 features/wificomponent/src/main/ets/default/app.ets rename navigationBar/src/main/js/default/pages/backKey/backKey.js => features/wificomponent/src/main/ets/default/common/constants.ets (37%) mode change 100755 => 100644 create mode 100644 features/wificomponent/src/main/ets/default/pages/wifiIcon.ets create mode 100644 features/wificomponent/src/main/ets/default/wifiModel.ets create mode 100644 features/wificomponent/src/main/resources/base/element/float.json create mode 100644 features/wificomponent/src/main/resources/base/element/string.json create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.png create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.png create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.png create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.png create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.png create mode 100644 features/wificomponent/src/main/resources/base/media/icon.png delete mode 100644 navigationBar/src/main/js/default/pages/backKey/backKey.hml delete mode 100644 navigationBar/src/main/js/default/pages/homeKey/homeKey.hml delete mode 100755 navigationBar/src/main/js/default/pages/homeKey/homeKey.js delete mode 100644 navigationBar/src/main/js/default/pages/index/index.css delete mode 100755 navigationBar/src/main/js/default/pages/recentKey/recentKey.css delete mode 100755 navigationBar/src/main/js/default/pages/recentKey/recentKey.js rename {navigationBar => product/navigationBar}/build.gradle (60%) mode change 100755 => 100644 rename {navigationBar => product/navigationBar}/package.json (75%) mode change 100755 => 100644 rename {navigationBar => product/navigationBar}/src/main/config.json (87%) mode change 100755 => 100644 rename navigationBar/src/main/js/default/pages/index/index.hml => product/navigationBar/src/main/ets/default/app.ets (66%) mode change 100755 => 100644 rename entry/src/main/js/default/pages/notification/notification.css => product/navigationBar/src/main/ets/default/common/constants.ets (62%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_hdpi/ic_navigation_back.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_hdpi/ic_navigation_home.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_hdpi/ic_navigation_recent.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_mdpi/ic_navigation_back.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_mdpi/ic_navigation_home.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_mdpi/ic_navigation_recent.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_xhdpi/ic_navigation_back.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_xhdpi/ic_navigation_home.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_xhdpi/ic_navigation_recent.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_xxhdpi/ic_navigation_back.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_xxhdpi/ic_navigation_home.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_xxhdpi/ic_navigation_recent.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_xxxhdpi/ic_navigation_back.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_xxxhdpi/ic_navigation_home.png (100%) rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/common/image_xxxhdpi/ic_navigation_recent.png (100%) create mode 100644 product/navigationBar/src/main/ets/default/common/utils/configReader.ets rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/i18n/en-US.json (100%) mode change 100755 => 100644 rename {navigationBar/src/main/js => product/navigationBar/src/main/ets}/default/i18n/zh-CN.json (100%) mode change 100755 => 100644 create mode 100644 product/navigationBar/src/main/ets/default/pages/index.ets rename navigationBar/src/main/js/default/pages/recentKey/recentKey.hml => product/navigationBar/src/main/ets/default/pages/keyButton.ets (31%) create mode 100644 product/navigationBar/src/main/ets/default/pages/oneLayout.ets create mode 100644 product/navigationBar/src/main/ets/default/pages/threeLayout.ets create mode 100644 product/navigationBar/src/main/resources/base/element/color.json create mode 100644 product/navigationBar/src/main/resources/base/element/float.json rename {navigationBar => product/navigationBar}/src/main/resources/base/element/string.json (94%) create mode 100644 product/navigationBar/src/main/resources/base/media/ic_navigation_back.png create mode 100644 product/navigationBar/src/main/resources/base/media/ic_navigation_home.png create mode 100644 product/navigationBar/src/main/resources/base/media/ic_navigation_recent.png create mode 100644 product/navigationBar/src/main/resources/base/media/icon.png create mode 100644 product/navigationBar/src/main/resources/en_US/element/string.json create mode 100644 product/navigationBar/src/main/resources/rawfile/navigationBarLayoutConfig.json create mode 100644 product/navigationBar/src/main/resources/zh_CN/element/string.json create mode 100644 product/statusbar/build.gradle create mode 100644 product/statusbar/package.json create mode 100644 product/statusbar/src/main/config.json rename navigationBar/src/main/js/default/pages/homeKey/homeKey.css => product/statusbar/src/main/ets/default/app.ets (75%) mode change 100755 => 100644 rename entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.css => product/statusbar/src/main/ets/default/common/constants.ets (81%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_hdpi/ic_status_battery.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_hdpi/ic_status_signal.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_hdpi/ic_statusbar_signal_full.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_hdpi/ic_statusbar_signal_half.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_hdpi/ic_statusbar_signal_no.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_hdpi/ic_statusbar_signal_null.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_hdpi/ic_statusbar_signal_roaming.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_hdpi/ic_statusbar_signal_wait.png (100%) create mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_wifi_connect.png create mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_wifi_full.png create mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_wifi_no.png create mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_wifi_pause.png create mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/delete_all.png create mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_settings.png rename {entry/src/main/js/default/common/image_xxhdpi => product/statusbar/src/main/ets/default/common/image_mdpi}/ic_status_battery.png (100%) rename {entry/src/main/js/default/common/image_xxhdpi => product/statusbar/src/main/ets/default/common/image_mdpi}/ic_status_signal.png (100%) rename {entry/src/main/js/default/common/image_xxhdpi => product/statusbar/src/main/ets/default/common/image_mdpi}/ic_statusbar_signal_full.png (100%) rename {entry/src/main/js/default/common/image_xxhdpi => product/statusbar/src/main/ets/default/common/image_mdpi}/ic_statusbar_signal_half.png (100%) rename {entry/src/main/js/default/common/image_xxhdpi => product/statusbar/src/main/ets/default/common/image_mdpi}/ic_statusbar_signal_no.png (100%) rename {entry/src/main/js/default/common/image_xxhdpi => product/statusbar/src/main/ets/default/common/image_mdpi}/ic_statusbar_signal_null.png (100%) rename {entry/src/main/js/default/common/image_xxhdpi => product/statusbar/src/main/ets/default/common/image_mdpi}/ic_statusbar_signal_roaming.png (100%) create mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_wait.png create mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_connect.png create mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_full.png create mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_no.png create mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_pause.png rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xhdpi/ic_status_battery.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xhdpi/ic_status_signal.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xhdpi/ic_statusbar_signal_full.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xhdpi/ic_statusbar_signal_half.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xhdpi/ic_statusbar_signal_no.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xhdpi/ic_statusbar_signal_null.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xhdpi/ic_statusbar_signal_roaming.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xhdpi/ic_statusbar_signal_wait.png (100%) create mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_connect.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_full.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_no.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_pause.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/delete_all.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_settings.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_status_battery.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_status_signal.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_full.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_half.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_no.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_null.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_roaming.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_wait.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_connect.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_full.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_no.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_pause.png rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xxxhdpi/ic_status_battery.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xxxhdpi/ic_status_signal.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xxxhdpi/ic_statusbar_signal_full.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xxxhdpi/ic_statusbar_signal_half.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xxxhdpi/ic_statusbar_signal_no.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xxxhdpi/ic_statusbar_signal_null.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xxxhdpi/ic_statusbar_signal_roaming.png (100%) rename {entry/src/main/js => product/statusbar/src/main/ets}/default/common/image_xxxhdpi/ic_statusbar_signal_wait.png (100%) create mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_connect.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_full.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_no.png create mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_pause.png create mode 100644 product/statusbar/src/main/ets/default/common/util/configReader.ets rename entry/src/main/js/default/app.js => product/statusbar/src/main/ets/default/pages/common/constants.ets (60%) create mode 100644 product/statusbar/src/main/ets/default/pages/control.ets create mode 100644 product/statusbar/src/main/ets/default/pages/defaultLayout.ets create mode 100644 product/statusbar/src/main/ets/default/pages/index.ets create mode 100644 product/statusbar/src/main/ets/default/pages/notification.ets create mode 100644 product/statusbar/src/main/ets/default/pages/twoGroupLayout.ets create mode 100644 product/statusbar/src/main/resources/base/element/color.json create mode 100644 product/statusbar/src/main/resources/base/element/float.json create mode 100644 product/statusbar/src/main/resources/base/element/string.json create mode 100644 product/statusbar/src/main/resources/base/media/airplane.svg create mode 100644 product/statusbar/src/main/resources/base/media/airplane_d.svg create mode 100644 product/statusbar/src/main/resources/base/media/delete_all.png create mode 100644 product/statusbar/src/main/resources/base/media/ic_settings.png create mode 100644 product/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.png create mode 100644 product/statusbar/src/main/resources/base/media/icon.png create mode 100644 product/statusbar/src/main/resources/base/media/wifi.svg create mode 100644 product/statusbar/src/main/resources/base/media/wifi_d.svg create mode 100644 product/statusbar/src/main/resources/en_US/element/string.json create mode 100644 product/statusbar/src/main/resources/rawfile/layoutConfig.json create mode 100644 product/statusbar/src/main/resources/zh_CN/element/string.json diff --git a/build.gradle b/build.gradle index 45ddcb88..d5469116 100755 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.huawei.ohos:hap:2.4.4.3-RC' + classpath 'com.huawei.ohos:hap:3.0.1.6' } } diff --git a/common/src/main/config.json b/common/src/main/config.json new file mode 100644 index 00000000..ab15a6e9 --- /dev/null +++ b/common/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": { + }, + "module": { + "package": "com.ohos.commonutil", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "commonutil", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/common/utils/CheckEmptyUtils.js b/common/src/main/ets/default/CheckEmptyUtils.ets similarity index 67% rename from entry/src/main/js/default/common/utils/CheckEmptyUtils.js rename to common/src/main/ets/default/CheckEmptyUtils.ets index f13af46d..fb5f3ff5 100644 --- a/entry/src/main/js/default/common/utils/CheckEmptyUtils.js +++ b/common/src/main/ets/default/CheckEmptyUtils.ets @@ -15,33 +15,33 @@ export default class CheckEmptyUtils { - /** + /** * Check obj is empty. * - * @param {object} obj + * @param {Object} obj need checked object * @return {boolean} true(empty) */ - static isEmpty(obj) { - return (typeof obj === 'undefined' || obj === null || obj === '' || Object.keys(obj).length === 0); - } + static isEmpty(obj) { + return (typeof obj === 'undefined' || obj === null || obj === '' || Object.keys(obj).length === 0); + } - /** + /** * Check str is empty. * - * @param {string} str + * @param {string} str need checked string * @return {boolean} true(empty) */ - static checkStrIsEmpty(str) { - return str.trim().length == 0; - } + static checkStrIsEmpty(str) { + return str.trim().length === 0; + } - /** + /** * Check array is empty. * - * @param {Array}arr + * @param {Array} arr need checked array * @return {boolean} true(empty) */ - static isEmptyArr(arr) { - return arr.length == 0; - } + static isEmptyArr(arr) { + return arr.length === 0; + } } \ No newline at end of file diff --git a/entry/src/main/js/default/common/utils/Log.js b/common/src/main/ets/default/Log.ets similarity index 97% rename from entry/src/main/js/default/common/utils/Log.js rename to common/src/main/ets/default/Log.ets index 3212ce8a..e41d7395 100644 --- a/entry/src/main/js/default/common/utils/Log.js +++ b/common/src/main/ets/default/Log.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -const TAG = 'SystemUI_StatusBar'; +const TAG = 'SystemUI_Default'; /** * Basic log class diff --git a/entry/src/main/js/default/center/statuscenter/manager/WindowManager.js b/common/src/main/ets/default/WindowManager.ets similarity index 55% rename from entry/src/main/js/default/center/statuscenter/manager/WindowManager.js rename to common/src/main/ets/default/WindowManager.ets index b9d80890..9fa155d9 100644 --- a/entry/src/main/js/default/center/statuscenter/manager/WindowManager.js +++ b/common/src/main/ets/default/WindowManager.ets @@ -14,7 +14,7 @@ */ import Window from '@ohos.window'; -import mLog from '../../../common/utils/Log.js' +import Log from './Log.ets'; const TAG = 'WindowManager'; const MAX_WIDTH = 480; @@ -26,31 +26,31 @@ const MIN_HEIGHT = 67; */ export default class WindowManager { - /** + /** * Set the window to the maximum size. * - * @param {object} callback - Callback function. + * @param {Object} callback - Callback function. */ - setWindowMax(callback){ - mLog.showInfo(TAG, `enter setWindowMax =================`) - Window.getTopWindow().then((windowData)=> { - windowData.resetSize(MAX_WIDTH, MAX_HEIGHT).then((result)=> { - callback(result); - }); - }); - } + static setWindowMax() { + Log.showInfo(TAG, 'enter setWindowMax ================='); + Window.getTopWindow().then((windowData)=> { + windowData.resetSize(MAX_WIDTH, MAX_HEIGHT).then((result)=> { + Log.showInfo(TAG, result); + }); + }); + } - /** + /** * Set the window to the minimum size. * - * @param {object} callback - Callback function. + * @param {Object} callback - Callback function. */ - setWindowMin(callback){ - mLog.showInfo(TAG, `enter setWindowMin =================`) - Window.getTopWindow().then((windowData)=> { - windowData.resetSize(MAX_WIDTH, MIN_HEIGHT).then((result)=> { - callback(result); - }); - }); - } + static setWindowMin() { + Log.showInfo(TAG, 'enter setWindowMin ================='); + Window.getTopWindow().then((windowData)=> { + windowData.resetSize(MAX_WIDTH, MIN_HEIGHT).then((result)=> { + Log.showInfo(TAG, result); + }); + }); + } } \ No newline at end of file diff --git a/common/src/main/resources/base/element/string.json b/common/src/main/resources/base/element/string.json new file mode 100644 index 00000000..146f1466 --- /dev/null +++ b/common/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "commonutil_library", + "value": "commonutil_library" + } + ] +} diff --git a/entry/build.gradle b/entry/build.gradle index c847e028..e1eb88ec 100755 --- a/entry/build.gradle +++ b/entry/build.gradle @@ -2,10 +2,12 @@ apply plugin: 'com.huawei.ohos.hap' ohos { compileSdkVersion 6 defaultConfig { - compatibleSdkVersion 6 + compatibleSdkVersion 4 } supportSystem "standard" } dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + testCompile 'junit:junit:4.12' } diff --git a/entry/src/main/config.json b/entry/src/main/config.json index cab81000..bf7b92d8 100755 --- a/entry/src/main/config.json +++ b/entry/src/main/config.json @@ -5,17 +5,12 @@ "version": { "code": 1, "name": "1.0" - }, - "apiVersion": { - "compatible": 4, - "target": 5, - "releaseType": "Beta1" } }, "deviceConfig": {}, "module": { - "package": "com.ohos.systemui.statusbar", - "name": ".MyApplication", + "package": "com.ohos.systemui.entry", + "name": "com.ohos.systemui.entry.MyApplication", "deviceType": [ "phone" ], @@ -36,7 +31,7 @@ ] } ], - "name": "com.ohos.systemui.statusbar.MainAbility", + "name": "com.ohos.systemui.entry.MainAbility", "icon": "$media:icon", "description": "$string:mainability_description", "label": "$string:app_name", @@ -46,14 +41,16 @@ ], "js": [ { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, "name": "default", "window": { "designWidth": 720, "autoDesignWidth": false }, - "pages": [ - "pages/index/index" - ] + "pages": ["pages/index"] } ] } diff --git a/navigationBar/src/main/js/default/pages/backKey/backKey.css b/entry/src/main/ets/default/app.ets old mode 100755 new mode 100644 similarity index 76% rename from navigationBar/src/main/js/default/pages/backKey/backKey.css rename to entry/src/main/ets/default/app.ets index 5144f837..e105593e --- a/navigationBar/src/main/js/default/pages/backKey/backKey.css +++ b/entry/src/main/ets/default/app.ets @@ -13,14 +13,12 @@ * limitations under the License. */ -.back { - icon-width: 42px; - icon-height: 42px; - width: 100%; - height: 100%; - background-color: transparent; -} -.back:active { - background-color: #DCDCDC; -} \ No newline at end of file +export default { + onCreate() { + console.info('SystemUI entry Application onDestroy') + }, + onDestroy() { + console.info('SystemUI entry Application onDestroy') + }, +} diff --git a/entry/src/main/ets/default/pages/index.ets b/entry/src/main/ets/default/pages/index.ets new file mode 100644 index 00000000..936ef95d --- /dev/null +++ b/entry/src/main/ets/default/pages/index.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021 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. + */ + +@Entry +@Component +struct Index { + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + } + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/center/battery/batteryStatus.js b/entry/src/main/js/default/center/battery/batteryStatus.js deleted file mode 100755 index d0dc68c4..00000000 --- a/entry/src/main/js/default/center/battery/batteryStatus.js +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -/** - * Get the status of battery - */ - -import BatteryInfo from '@ohos.batteryInfo'; -import mLog from '../../common/utils/Log.js'; - -const TAG = 'batteryStatus'; -const NONE = 0; -const ENABLE = 1; -const DISABLE = 2; -const FULL = 3; -const PERCENT_NUMBER = 100; -const BATTERY_CHARGING_COLOR = '#00ff21'; -const BATTERY_HIGH_COLOR = '#ffffff'; -const BATTERY_MEDIUM_COLOR = '#ffd800'; -const BATTERY_LOW_COLOR = '#ff0000'; -const BATTERY_LEVEL_HIGH = 50; -const BATTERY_LEVEL_LOW = 10; -const MAX_BATTERY_LENGTH = 51; - -var mProgressWidth = 51; -var mProgress = 100; -var mBackgroundColor = '#00ff21'; - -export default class batteryStatus { - constructor() { - } - - /** - * Return the progress width and background color for the battery - * - * @param {Object} callback - Callback function - */ - getStatusImage(callback) { - let batteryValue = {}; - this.setOnBatteryListener(); - batteryValue.mBackgroundColor = mBackgroundColor; - batteryValue.mProgressWidth = mProgressWidth; - mLog.showInfo(TAG, `color: ${batteryValue.mBackgroundColor} width: ${batteryValue.mProgressWidth}`); - callback(JSON.stringify(batteryValue)); - } - - /** - * Method of getting the battery status by looping - */ - setOnBatteryListener() { - let batterySOC; - let batteryCharging; - - batterySOC = BatteryInfo.batterySOC; - batteryCharging = BatteryInfo.chargingStatus; - if (null == batterySOC) { - // Set the battery SOC as full when there is no battery hardware - batterySOC = mProgress; - } - if (batterySOC <= 0) { - // If the result is a negative number, set it as positive number. - batterySOC = Math.abs(batterySOC) * PERCENT_NUMBER; - } - // Set the battery status as charging when there is no battery hardware - let batteryStatus = this.checkBatteryStatus(batteryCharging); - this.updateBattery(batterySOC, batteryStatus); - } - - /** - * Update the battery progress width and background color - * - * param {number} val - battery SOC number - * param {boolean} charging - battery charging status - */ - updateBattery(val, charging) { - mLog.showInfo(TAG, `Battery updateBattery: ${val} charging: ${charging}`); - mProgress = val; - if (charging) { - mBackgroundColor = BATTERY_CHARGING_COLOR; - } else if (val <= BATTERY_LEVEL_LOW) { - mBackgroundColor = BATTERY_LOW_COLOR; - } else if (val > BATTERY_LEVEL_LOW && val <= BATTERY_LEVEL_HIGH) { - mBackgroundColor = BATTERY_MEDIUM_COLOR; - } else if (val > BATTERY_LEVEL_HIGH) { - mBackgroundColor = BATTERY_HIGH_COLOR; - } - mProgressWidth = MAX_BATTERY_LENGTH * mProgress / PERCENT_NUMBER; - mLog.showInfo(TAG, `Battery updateBattery mBackgroundColor: ${mBackgroundColor}`); - } - - /** - * Check the battery charging status - * - * @param {number} charging - the battery charging status - * @return {boolean} whether the battery is charging or not - */ - checkBatteryStatus(charging) { - mLog.showInfo(TAG, `Battery updateBattery checkBatteryStatus: ${charging}`); - let batteryStatus - switch (charging) { - case DISABLE: - batteryStatus = false; - break; - case NONE: - case ENABLE: - case FULL: - default: - batteryStatus = true; - break; - } - return batteryStatus; - } -} diff --git a/entry/src/main/js/default/center/signal/signalStatus.js b/entry/src/main/js/default/center/signal/signalStatus.js deleted file mode 100644 index 2670cda1..00000000 --- a/entry/src/main/js/default/center/signal/signalStatus.js +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -/** - * Get the cellular and wifi status - */ - -import Radio from '@ohos.telephony_radio'; -import mLog from '../../common/utils/Log.js'; -import mCheckEmpty from '../../common/utils/CheckEmptyUtils.js'; - -const TAG = 'signalStatus'; -const EMPTY_LEVEL = 0; -const CELLULAR_NONE_IMAGE = 'common/image_xxhdpi/ic_statusbar_signal_null.png'; -const CELLULAR_EMPTY_IMAGE = 'common/image_xxhdpi/ic_statusbar_signal_no.png'; -const CELLULAR_MIN_IMAGE = 'common/image_xxhdpi/ic_cellular_signal_min.png'; -const CELLULAR_LOW_IMAGE = 'common/image_xxhdpi/ic_cellular_signal_low.png'; -const CELLULAR_HALF_IMAGE = 'common/image_xxhdpi/ic_statusbar_signal_half.png'; -const CELLULAR_HIGH_IMAGE = 'common/image_xxhdpi/ic_cellular_signal_high.png'; -const CELLULAR_FULL_IMAGE = 'common/image_xxhdpi/ic_statusbar_signal_full.png'; - -var mCellularStatus; -var mCellularImage; -var SignalListenerInterval; - -export default class signalStatus { - constructor() { - } - - /** - * Get the images of cellular and wifi need to be showed on status bar - * - * @param {Object} callback - Callback function - */ - getStatusImage(callback) { - let signalValue = {}; - this.getSignalMessage(); - signalValue.cellularImage = mCellularImage.image; - signalValue.cellularType = mCellularImage.type; - mLog.showInfo(TAG, `cellular type = ${signalValue.cellularType}, image = ${signalValue.cellularImage}`); - callback(JSON.stringify(signalValue)); - } - - /** - * Get signal value - */ - getSignalMessage(){ - this.checkCellularStatus((result)=>{ - mCellularStatus = result; - mCellularImage = this.updateCellularImage(); - }); - } - - /** - * Update the image of cellular status - * - * @return {string} image used to show cellular status - */ - updateCellularImage() { - mLog.showInfo(TAG, `enter updateCellularImage ============`); - let status = mCellularStatus; - let type = status.signalType; - let level = status.signalLevel; - let typeString = ''; - let image = ''; - let imageResult = {}; - mLog.showInfo(TAG, `status = ${JSON.stringify(status)}`); - if (type == 0) { - image = CELLULAR_NONE_IMAGE; - } else { - switch (level) { - case 0: - image = CELLULAR_EMPTY_IMAGE; - break; - case 1: - image = CELLULAR_MIN_IMAGE; - break; - case 2: - image = CELLULAR_LOW_IMAGE; - break; - case 3: - image = CELLULAR_HALF_IMAGE; - break; - case 4: - image = CELLULAR_HIGH_IMAGE; - break; - case 5: - image = CELLULAR_FULL_IMAGE; - break; - default: - break; - } - switch (type) { - case 0: - typeString = ''; - break; - case 1: - case 2: - typeString = '2G'; - break; - case 3: - case 4: - typeString = '3G'; - break; - case 5: - typeString = '4G'; - break; - case 6: - typeString = '5G'; - break; - default: - typeString = '5G'; - break; - } - } - imageResult.type = typeString; - imageResult.image = image; - mLog.showInfo(TAG, `cellular result = ${JSON.stringify(imageResult)}`); - return imageResult; - } - - /** - * Check the connection type and signal level of cellular network - * - * @return {object} the type and signal level of cellular network - */ - checkCellularStatus(callback) { - let cellularStatus; - let slotId = 1; - mLog.showInfo(TAG, `enter checkCellularStatus ============`); - // The interface of getting the cellular signal status is unavailable temporarily - Radio.getSignalInformation(slotId, (err, value) => { - if (err) { - // Failed to call the interface,error is not null - mLog.showError(TAG, `failed to getSimState because ${err.message}`); - // When failed to call the interface, set the result as no signal - let defaultValue = {} - defaultValue.signalType = EMPTY_LEVEL; - defaultValue.signalLevel = EMPTY_LEVEL; - cellularStatus = defaultValue; - } else { - // Call interface succeed,error is null - mLog.showInfo(TAG, `success to getSimState: ${value}`); - // Since the value might be empty, set it as no signal by hand - if (mCheckEmpty.isEmpty(value)) { - mLog.showError(TAG, `value from api is empty, set 0`) - value.signalType = EMPTY_LEVEL; - value.signalLevel = EMPTY_LEVEL; - } - cellularStatus = value; - } - callback(cellularStatus); - }); - } -} \ No newline at end of file diff --git a/entry/src/main/js/default/center/statuscenter/StatusCenter.js b/entry/src/main/js/default/center/statuscenter/StatusCenter.js deleted file mode 100755 index ff9f794b..00000000 --- a/entry/src/main/js/default/center/statuscenter/StatusCenter.js +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -/** - * Handle all data needed by status bar and prepare the content for pages to show - */ - -import BatteryStatus from '../../center/battery/batteryStatus.js'; -import SignalStatus from '../../center/signal/signalStatus.js'; -import DateManager from '../../center/statuscenter/manager/DateManager.js' -import WindowManager from '../../center/statuscenter/manager/WindowManager.js' -import mLog from '../../common/utils/Log.js'; - -const TAG = 'StatusCenter'; -const LOOP_TIME = 2000; -const SIGNAL_LOOP_TIME = 3000; - -var mSignalStatus = new SignalStatus(); -var mBatteryStatus = new BatteryStatus(); -var mDateManager = new DateManager(); -var mWindowManager = new WindowManager(); - -let signalInterval = null; -let signalListener = []; -let signalStatus = ''; - -let batteryInterval = null; -let batteryListener = []; -let batteryStatus = ''; - -let timeInterval = null; -let timeListener = []; -let timeStatus = ''; - -export default class StatusCenter { - constructor() { - this.initBatteryData(); - this.initTimeData(); - this.initSignalData(); - } - - /** - * Initialize signal data - */ - initSignalData() { - mLog.showInfo(TAG, 'initSignalData'); - signalInterval = setInterval(() => { - mSignalStatus.getStatusImage((result) => { - signalStatus = result; - mLog.showInfo(TAG, `startSignalData signalStatus ${signalStatus}`); - this.sendSignalData(); - }); - }, SIGNAL_LOOP_TIME); - } - - /** - *Register signal data monitoring - * - * @param {Object} callback - Callback function - */ - registerSignalListen(callback) { - mLog.showInfo(TAG, `registerSignalListen signalListener length: ${signalListener.length}`); - mLog.showInfo(TAG, `registerSignalListen callback indexOf: ${signalListener.indexOf(callback)}`); - if (signalListener.indexOf(callback) === -1) { - signalListener.push(callback); - } - mLog.showInfo(TAG, `registerSignalListen signalListener length: ${signalListener.length}`); - } - - /** - *Unregister signal data monitoring - * - * @param {Object} callback - Callback function - */ - unRegisterSignalListen(callback) { - mLog.showInfo(TAG, `unRegisterSignalListen signalListener length: ${signalListener.length}`); - signalListener.splice(signalListener.indexOf(callback), 1); - mLog.showInfo(TAG, `unRegisterSignalListen signalListener length: ${signalListener.length}`); - } - - /** - * Return signal data to the page - */ - sendSignalData() { - mLog.showInfo(TAG, 'sendSignalData'); - - // Deep copy the callback array - let newSignalListener = []; - for (let i = 0; i < signalListener.length; i++) { - newSignalListener.push(signalListener[i]); - } - - if (newSignalListener.length > 0) { - for (let index = 0; index < newSignalListener.length; index++) { - mLog.showInfo(TAG, `sendSignalData ${newSignalListener[index]}`); - newSignalListener[index](signalStatus); - } - } - } - - /** - * Stop get signal data - */ - stopUpdateSignal() { - clearInterval(signalInterval); - } - - /** - * Initialize battery data - */ - initBatteryData() { - mLog.showInfo(TAG, 'initBatteryData'); - batteryInterval = setInterval(() => { - mBatteryStatus.getStatusImage((result) => { - batteryStatus = result; - mLog.showInfo(TAG, `initBatteryData batteryStatus ${batteryStatus}`); - this.sendBatteryData(); - }); - }, LOOP_TIME); - } - - /** - *Register battery data monitoring - * - * @param {Object} callback - Callback function - */ - registerBatteryListen(callback) { - mLog.showInfo(TAG, `registerBatteryListen BatteryListener length: ${batteryListener.length}`); - mLog.showInfo(TAG, `registerBatteryListen callback indexOf: ${batteryListener.indexOf(callback)}`); - if (batteryListener.indexOf(callback) === -1) { - batteryListener.push(callback); - } - mLog.showInfo(TAG, `registerBatteryListen BatteryListener length: ${batteryListener.length}`); - } - - /** - *Unregister battery data monitoring - * - * @param {Object} callback - Callback function - */ - unRegisterBatteryListen(callback) { - mLog.showInfo(TAG, `unRegisterBatteryListen BatteryListener length: ${batteryListener.length}`); - batteryListener.splice(batteryListener.indexOf(callback), 1); - mLog.showInfo(TAG, `unRegisterBatteryListen BatteryListener length: ${batteryListener.length}`); - } - - /** - * Return battery data to the page - */ - sendBatteryData() { - mLog.showInfo(TAG, 'sendBatteryData'); - - // Deep copy the callback array - let newBatteryListener = []; - for (let i = 0; i < batteryListener.length; i++) { - newBatteryListener.push(batteryListener[i]); - } - - if (newBatteryListener.length > 0) { - for (let index = 0; index < newBatteryListener.length; index++) { - mLog.showInfo(TAG, `sendSignalData ${newBatteryListener[index]}`); - newBatteryListener[index](batteryStatus); - } - } - } - - /** - * Stop get signal data - */ - stopUpdateBattery() { - clearInterval(batteryInterval); - } - - /** - * Initialize time data - */ - initTimeData() { - mLog.showInfo(TAG, 'initTimeData'); - timeInterval = setInterval(() => { - mDateManager.getCurrentDate((result) => { - timeStatus = result; - mLog.showInfo(TAG, `initTimeData timeStatus ${timeStatus}`); - this.sendTimeData(); - }); - }, LOOP_TIME); - } - - /** - *Register time data monitoring - * - * @param {Object} callback - Callback function - */ - registerTimeListen(callback) { - mLog.showInfo(TAG, `registerTimeListen TimeListener length: ${timeListener.length}`); - mLog.showInfo(TAG, `registerTimeListen callback indexOf: ${timeListener.indexOf(callback)}`); - if (timeListener.indexOf(callback) === -1) { - timeListener.push(callback); - } - mLog.showInfo(TAG, `registerTimeListen TimeListener length: ${timeListener.length}`); - } - - /** - *Unregister time data monitoring - * - * @param {Object} callback - Callback function - */ - unRegisterTimeListen(callback) { - mLog.showInfo(TAG, `unRegisterTimeListen TimeListener length: ${timeListener.length}`); - timeListener.splice(timeListener.indexOf(callback), 1); - mLog.showInfo(TAG, `unRegisterTimeListen TimeListener length: ${timeListener.length}`); - } - - /** - * Return time data to the page - */ - sendTimeData() { - mLog.showInfo(TAG, `sendTimeData`); - - // Deep copy the callback array - let newTimeListener = []; - for (let i = 0; i < timeListener.length; i++) { - newTimeListener.push(timeListener[i]); - } - - if (newTimeListener.length > 0) { - for (let index = 0; index < newTimeListener.length; index++) { - mLog.showInfo(TAG, `sendTimeData ${newTimeListener[index]}`); - newTimeListener[index](timeStatus); - } - } - } - - /** - * Stop the loop of getting current time - */ - stopUpdateTime() { - clearInterval(timeInterval); - } - - /** - * Set the status bar window to maximum size - * - * @param {Object} callback - Callback function - */ - setWindowMax(callback) { - mWindowManager.setWindowMax((result) => { - callback(result); - }); - } - - /** - * Set the status bar window to minimum size - * - * @param {Object} callback - Callback function - */ - setWindowMin(callback) { - mWindowManager.setWindowMin((result) => { - callback(result); - }); - } -} \ No newline at end of file diff --git a/entry/src/main/js/default/center/statuscenter/manager/DateManager.js b/entry/src/main/js/default/center/statuscenter/manager/DateManager.js deleted file mode 100644 index c97a9ed9..00000000 --- a/entry/src/main/js/default/center/statuscenter/manager/DateManager.js +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2021 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 SHORT_LENGTH = 1; - -/** - * Manage methods related to time. - */ -export default class DateManager { - - /** - * Obtain current date and time. - * - * @param {Object} callback - Callback function. - */ - getCurrentDate(callback) { - let result = {}; - let date = new Date(); - let month = this.getMonth(date); - let day = this.getDay(date); - let time = date.toTimeString().substring(0, 5); - let weekDay = this.getWeekDay(date); - result.time = time; - result.date = {}; - result.date.month = month; - result.date.day = day; - result.date.weekDay = weekDay; - callback(JSON.stringify(result)); - } - - /** - * Obtain Month. - * - * @param {Object} date - Object of Date. - * @return {string} The month of date. - */ - getMonth(date) { - let month = (date.getMonth() + 1).toString(); - if (month.length === SHORT_LENGTH) { - month = '0' + month; - } - return month; - } - - /** - * Obtain Day. - * - * @param {Object} date - Object of Date. - * @return {string} The day of date. - */ - getDay(date) { - let day = (date.getDate()).toString(); - if (day.length === SHORT_LENGTH) { - day = '0' + day; - } - return day; - } - - /** - * Obtain WeekDay. - * - * @param {Object} date - Object of Date. - * @return {string} The weekday of date. - */ - getWeekDay(date) { - let weekDay = date.getDay(); - return weekDay; - } -} \ No newline at end of file diff --git a/entry/src/main/js/default/common/image_mdpi/ic_status_battery.png b/entry/src/main/js/default/common/image_mdpi/ic_status_battery.png deleted file mode 100644 index 6a6ab3b05aa87ea0de53f3594506e67cb0288c49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^5KFdQvhEVh7!eadGMkNIp#0%sY# zb{ibv@2TWVu=>X+tkBB#l6BQ{_E-OzmOMZ3MJe4RaKQpj0p)0}V0Ru~uV?8EVtdrw gKCY0e;9y|ba#-_1xSHe|pmP~KUHx3vIVCg!03Fs%BLDyZ diff --git a/entry/src/main/js/default/common/image_mdpi/ic_status_signal.png b/entry/src/main/js/default/common/image_mdpi/ic_status_signal.png deleted file mode 100644 index 16769df08369c6046ec395e9f7479bc761ca3966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmVPx#tw}^dR5%gUl0gc>Fcd_qh`1IJTzdu)H-gu2>p}F&UcmUK=EuS`t**om!~dPk zp9v*R^LLd}+JR+Ud>X?S{et!o`i~5hsN}pfp_jcfgkz;EQOQ<=2BfaQj4kPuY&B?r z`U+0A)gi_V=4clky^UtTmG|Ig$_ily=+gTe~DWM4fj}2%* diff --git a/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_half.png b/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_half.png deleted file mode 100644 index 1248c0acf163b9ca565bc8cec267af951a11596e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|wtBiahFAzD zCrA`M`2YX^90wiNVhiCOM}gO^ptjG-oX0Wmv^}lWUVK>jP7U z3}tD7)5U1wNO!zU2Wrg?;wL-GLol@s0G#vU@O86DE&nI3u6NF^3U@G^M4 zV%lisBWNd;$8f>TTVY;{zoD7s4n_yhbcJ(GTEDoL{C6#S3j3^P6){h(Z{tsNe!Z-U5HcFx3_F$Oig8e@{hYrvf-Ebx#Wf#zP327C(U!;r~bNQ&o5^zZ0I9w R_6lelgQu&X%Q~loCIGocgs1=j diff --git a/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_roaming.png b/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_roaming.png deleted file mode 100644 index 1f42d78c42b228e1f65da4e62196edfc8f7fc0ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|GCf@!Lo5W7 z6C_L?{Qv*|n?nruk!wpVx;Q;IDojl~+8uA)A z11{^jxgDE+B!g|Gqj`d1fDiKv*1RO%1jnEq@+bar9y#9_!P2px>7#}OFXJL728NFh Wr6x}QcgX-~DTAl0pUXO@geCxhp*$)8 diff --git a/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_wait.png b/entry/src/main/js/default/common/image_mdpi/ic_statusbar_signal_wait.png deleted file mode 100644 index 8f457de86185aff1cc79543a88461dba29f04a6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|ay(reLo5W7 z6C^SYa1 - - - -
    - - - - - - - - -
    \ No newline at end of file diff --git a/entry/src/main/js/default/pages/index/index.js b/entry/src/main/js/default/pages/index/index.js deleted file mode 100755 index 6910bdf1..00000000 --- a/entry/src/main/js/default/pages/index/index.js +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright (c) 2021 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 StatusCenter from '../../center/statuscenter/StatusCenter.js'; -import mLog from '../../common/utils/Log.js'; -import FeatureAbility from '@ohos.ability.featureability'; - -const CHANGE = true; -const NOT_CHANGE = false; -const MAX_HEIGHT = '100%'; -const MAX_WIDTH = '100%'; -const MIN_HEIGHT = '0px'; -const MIN_WIDTH = '0px'; -const SPREAD_HEIGHT = 10; -const SHRINK_HEIGHT = -10; -const Y_INITIAL = 0; -const LOOP_TIME = 100; -const LOOP_TIME_UP = 300; -const TAG = 'index'; -const MARK_MONDAY = 1; -const MARK_TUESDAY = 2; -const MARK_WEDNESDAY = 3; -const MARK_THURSDAY = 4; -const MARK_FRIDAY = 5; -const MARK_SATURDAY = 6; -const MARK_SUNDAY = 0; -const SETTINGS_BUNDLE_NAME = 'com.ohos.settings'; -const SETTINGS_ABILITY_NAME = 'com.ohos.settings.MainAbility'; - -var mStatusCenter = new StatusCenter(); - -export default { - data: { - isShow: false, - showMask: '', - startGlobalY: Y_INITIAL, - moveY: Y_INITIAL, - isChange: false, - statusHeight: MAX_HEIGHT, - statusWidth: MAX_WIDTH, - largeStatusBarHeight: MIN_HEIGHT, - largeStatusBarWidth: MIN_WIDTH, - backgroundColor: '', - showClock: true, - showLarge:false, - mCellularType:'', - mTypeShow:'', - mCellularImage:'', - mBackgroundColor:'', - mProgressWidth:'', - mTime:'', - mDate:'' - - }, - - onInit() { - mLog.showInfo(TAG, 'onInit start'); - this.backgroundColor = this.$t('colors.statusBackground'); - this.$app.$def.data.StatusCenter.registerSignalListen(this.getSignalImage.bind(this)); - this.$app.$def.data.StatusCenter.registerBatteryListen(this.getBatteryValue.bind(this)); - this.$app.$def.data.StatusCenter.registerTimeListen(this.getcurrentTime.bind(this)); - mLog.showInfo(TAG, 'onInit end'); - }, - - onBackPress() { - mLog.showInfo(TAG, 'statusBar onBackPress start'); - if (this.statusHeight === MIN_HEIGHT) { - this.isChange = CHANGE; - this.statusHeight = MAX_HEIGHT; - this.statusWidth = MAX_WIDTH; - this.largeStatusBarHeight = MIN_HEIGHT; - this.largeStatusBarWidth = MIN_WIDTH; - this.backgroundColor = this.$t('colors.statusBackground'); - this.setWindowMin(); - this.showLarge = false; - } - mLog.showInfo(TAG, 'statusBar onBackPress end'); - }, - - /** - * Set button click - * - * @param {Object} dateEvent quicklySetting Set button click return data - */ - settingClick(dateEvent) { - mLog.showInfo(TAG, `settingClick start dateEvent: ${JSON.stringify(dateEvent)}`); - this.showLarge = false; - this.statusHeight = dateEvent.detail.statusHeight; - this.statusWidth = dateEvent.detail.statusWidth; - this.largeStatusBarHeight = dateEvent.detail.notificationHeight; - this.largeStatusBarWidth = dateEvent.detail.notificationWidth; - this.backgroundColor = dateEvent.detail.backgroundColor; - setTimeout(() => { - this.setWindowMin(); - }, LOOP_TIME); - - let result = FeatureAbility.startAbility({ - want: { - bundleName: SETTINGS_BUNDLE_NAME, - abilityName: SETTINGS_ABILITY_NAME, - }, - }).then(data => - mLog.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)).catch(error => - mLog.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); - mLog.showInfo(TAG, `start ability ${result}`); - }, - - onDestroy() { - mLog.showInfo(TAG, 'onDestroy'); - this.$app.$def.data.StatusCenter.unRegisterBatteryListen(this.getBatteryValue.bind(this)); - this.$app.$def.data.StatusCenter.unRegisterSignalListen()(this.getSignalImage.bind(this)); - this.$app.$def.data.StatusCenter.unRegisterTimeListen()(this.getcurrentTime.bind(this)); - this.$app.$def.data.StatusCenter.stopUpdateTime(); - this.$app.$def.data.StatusCenter.stopUpdateBattery(); - this.$app.$def.data.StatusCenter.stopUpdateSignal(); - }, - - /** - * Monitor touch start method - * - * @param {Object} touchEvent TouchStart return data - */ - onTouchStartListener(touchEvent) { - mLog.showInfo(TAG, `onTouchStartListener start touchEvent: ${JSON.stringify(touchEvent)}`); - this.startGlobalY = touchEvent.touches[0].globalY; - this.isChange = NOT_CHANGE; - }, - - /** - * Monitor touch Move method - * - * @param {Object} touchEvent TouchMove return data - */ - onTouchMoveListener(touchEvent) { - mLog.showInfo(TAG, `onTouchStartListener move touchEvent: ${JSON.stringify(touchEvent)}`); - if (this.isChange === CHANGE) { - return; - } - this.moveY = touchEvent.touches[0].globalY - this.startGlobalY; - if (this.moveY >= SPREAD_HEIGHT) { - this.isChange = CHANGE; - this.statusHeight = MIN_HEIGHT; - this.statusWidth = MIN_WIDTH; - setTimeout(() => { - this.largeStatusBarHeight = MAX_HEIGHT; - this.largeStatusBarWidth = MAX_WIDTH; - this.backgroundColor = ''; - this.setWindowMax(); - this.showLarge = true; - }, LOOP_TIME); - } else if (this.moveY < SHRINK_HEIGHT) { - this.isChange = CHANGE; - this.showLarge = false; - this.statusHeight = MAX_HEIGHT; - this.statusWidth = MAX_WIDTH; - this.backgroundColor = this.$t('colors.statusBackground'); - setTimeout(() => { - this.setWindowMin(); - }, LOOP_TIME_UP); - } - }, - - /** - * Maximize window - */ - setWindowMax() { - mStatusCenter.setWindowMax((result) => { - mLog.showInfo(TAG, `setWindowMax result: ${result}`); - }); - }, - - /** - * Minimize window - */ - setWindowMin() { - mStatusCenter.setWindowMin((result) => { - mLog.showInfo(TAG, `setWindowMin result ${result}`); - }); - }, - - /** - * Get signal icon Data - * - * @param {string} result result signal icon data - */ - getSignalImage(result) { - mLog.showInfo(TAG, `signalImage: ${result}`); - this.mCellularType = JSON.parse(result).cellularType; - if (this.mCellularType === '') { - this.mTypeShow = false; - } else { - this.mTypeShow = true; - } - this.mCellularImage = JSON.parse(result).cellularImage; - }, - - /** - * Get battery data - * - * @param {string} result result battery data - */ - getBatteryValue(result) { - mLog.showInfo(TAG, `batteryValue: ${JSON.parse(result)}`); - this.mBackgroundColor = JSON.parse(result).mBackgroundColor; - this.mProgressWidth = JSON.parse(result).mProgressWidth; - }, - - /** - * Get currentTime data - * - * @param {string} result result currentTime data - */ - getcurrentTime(result) { - mLog.showInfo(TAG, `getcurrentTime: ${result}`); - this.mTime = JSON.parse(result).time; - let weekDay = ''; - switch (JSON.parse(result).date.weekDay) { - case MARK_MONDAY: - weekDay = this.$t('strings.monday'); - break; - case MARK_TUESDAY: - weekDay = this.$t('strings.tuesday'); - break; - case MARK_WEDNESDAY: - weekDay = this.$t('strings.wednesday'); - break; - case MARK_THURSDAY: - weekDay = this.$t('strings.thursday'); - break; - case MARK_FRIDAY: - weekDay = this.$t('strings.friday'); - break; - case MARK_SATURDAY: - weekDay = this.$t('strings.saturday'); - break; - case MARK_SUNDAY: - weekDay = this.$t('strings.sunday'); - break; - default: - break; - } - this.mDate =JSON.parse(result).date.month + this.$t('strings.month') + JSON.parse(result).date.day - + this.$t('strings.day') + weekDay; - mLog.showInfo(TAG, `getcurrentTime: ${this.mDate}`); - } -} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.hml b/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.hml deleted file mode 100644 index 119124c1..00000000 --- a/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.hml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -
    - - - -
    diff --git a/entry/src/main/js/default/pages/notification/notification.hml b/entry/src/main/js/default/pages/notification/notification.hml deleted file mode 100644 index c232105a..00000000 --- a/entry/src/main/js/default/pages/notification/notification.hml +++ /dev/null @@ -1,20 +0,0 @@ - - -
    - {{ mNoNotification }} -
    diff --git a/entry/src/main/js/default/pages/quicklySetting/quicklySetting.css b/entry/src/main/js/default/pages/quicklySetting/quicklySetting.css deleted file mode 100644 index 617a8919..00000000 --- a/entry/src/main/js/default/pages/quicklySetting/quicklySetting.css +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -.container { - flex-direction: column; - align-items: center; - background-color: #66000000; -} -.status_bar { - flex-direction: row; - align-items: center; - height: 100px; -} -.main_body { - display: flex; - width: 100%; -} -.signal{ - align-items: center; - margin-left: 20px; - height: 40px; - width: 40px; -} -.icon_list { - margin-left: 6px; - width: 100%; - height: 30px; - display: flex; - flex-direction: row; -} -.battery { - flex-direction: row; - align-items: center; -} -.battery_body { - position: relative; - margin-top: 16px; - align-items: center; - width: 80px; - height: 40px; - background-image: url("common/ic_status_battery.png"); - background-repeat: no-repeat; - padding: 1px; - display: flex; - margin-right:30px; -} -.battery_progress { - margin-top: 6px; - margin-left: 0px; - margin-right:8px; - height: 25px; - stroke-width: 25px; -} -.other_status_content{ - flex-direction: row; - align-items: center; - justify-content:space-between; - width:100%; - height:220px; - background-color: #292830; - margin-left:20px; - margin-right:20px; - border-radius: 20px; -} -.time_date{ - height:100%; - flex-direction: column; - align-items: flex-start ; - justify-content:center; - margin-left:20px; -} -.time_font{ - color:#ffffff; - font-size:40px; -} -.data_font{ - color:#ffffff; - font-size:30px; -} -.icon_setting{ - align-items: flex-end ; - justify-content:center; - margin-right:20px; - width:80px; - height:80px; -} -.no_notification{ - width:100%; - margin-top: 30px; - justify-content:center; - align-items: center ; -} -.text_no_notification{ - color:#ffffff; - font-size:40px; -} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/quicklySetting/quicklySetting.hml b/entry/src/main/js/default/pages/quicklySetting/quicklySetting.hml deleted file mode 100644 index 0906ebac..00000000 --- a/entry/src/main/js/default/pages/quicklySetting/quicklySetting.hml +++ /dev/null @@ -1,26 +0,0 @@ - - -
    -
    - {{ mTime }} - {{ mDate }} -
    -
    - -
    -
    diff --git a/entry/src/main/js/default/pages/quicklySetting/quicklySetting.js b/entry/src/main/js/default/pages/quicklySetting/quicklySetting.js deleted file mode 100644 index 936d99d4..00000000 --- a/entry/src/main/js/default/pages/quicklySetting/quicklySetting.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2021 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 mLog from '../../common/utils/Log.js'; - -const TAG = 'quicklySetting'; -const MAX_HEIGHT = '100%'; -const MAX_WIDTH = '100%'; -const MIN_HEIGHT = '0px'; -const MIN_WIDTH = '0px'; - -export default { - props:['mTime', 'mDate'], - - data: { - }, - - onInit() { - mLog.showInfo(TAG, 'onInit'); - }, - - /** - * Set button click - */ - settingClick() { - mLog.showInfo(TAG, 'setting click and start ability setting'); - this.$emit('eventSet', { - statusHeight: MAX_HEIGHT, - statusWidth: MAX_WIDTH, - notificationHeight: MIN_HEIGHT, - notificationWidth: MIN_WIDTH, - backgroundColor: this.$t('colors.statusBackground') - }); - }, -} diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.css b/entry/src/main/js/default/pages/statusbar/statusBar.css deleted file mode 100755 index 5413c273..00000000 --- a/entry/src/main/js/default/pages/statusbar/statusBar.css +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -.status_bar_page { - flex-direction: row; - display: flex; - flex-wrap: nowrap; - justify-content: flex-end; - align-items: center; - height: 100%; -} - -text { - color: white; -} - -.main_body { - display: flex; - width: 100%; -} - -.signal { - align-items: flex-start; - margin-left: 10px; - height: 60px; - width: 200px; -} - -.signal_text { - margin-top: 12px; - font-size: 36px; - width: 120px; -} - -.signal_icon { - object-fit: contain; -} - -.icon_list { - margin-left: 6px; - width: 120px; - height: 60px; - display: flex; - flex-direction: row; -} - -.battery { - flex-direction: row; - align-items: center; -} - -.battery_body { - position: relative; - margin-top: 16px; - align-items: center; - width: 120px; - height: 60px; - background-image: url("common/image_xxhdpi/ic_status_battery.png"); - background-repeat: no-repeat; - padding: 1px; - display: flex; -} - -.battery_progress { - margin-bottom: 13px; - margin-left: 6px; - height: 25px; - stroke-width: 25px; -} - diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.hml b/entry/src/main/js/default/pages/statusbar/statusBar.hml deleted file mode 100755 index 9edbb123..00000000 --- a/entry/src/main/js/default/pages/statusbar/statusBar.hml +++ /dev/null @@ -1,40 +0,0 @@ - - - - -
    -
    -
    -
    - {{ cellularType }} - - -
    -
    -
    -
    -
    -
    -
    -
    - - - -
    -
    diff --git a/features/batterycomponent/build.gradle b/features/batterycomponent/build.gradle new file mode 100644 index 00000000..01aff181 --- /dev/null +++ b/features/batterycomponent/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'com.huawei.ohos.library' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 6 + defaultConfig { + compatibleSdkVersion 4 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} diff --git a/features/batterycomponent/src/main/config.json b/features/batterycomponent/src/main/config.json new file mode 100644 index 00000000..aaa79a73 --- /dev/null +++ b/features/batterycomponent/src/main/config.json @@ -0,0 +1,22 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.batterycomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "batterycomponent", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/statusbar/clock/clock.css b/features/batterycomponent/src/main/ets/default/app.ets similarity index 81% rename from entry/src/main/js/default/pages/statusbar/clock/clock.css rename to features/batterycomponent/src/main/ets/default/app.ets index ac1cdbf1..2a3b6238 100644 --- a/entry/src/main/js/default/pages/statusbar/clock/clock.css +++ b/features/batterycomponent/src/main/ets/default/app.ets @@ -13,12 +13,11 @@ * limitations under the License. */ -.clock_text { - margin-left: -10px; - width: 14%; - height: 30px; +export default { + onCreate() { + console.info('Application onCreate') + }, + onDestroy() { + console.info('Application onDestroy') + }, } - -text { - color: white; -} \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ets b/features/batterycomponent/src/main/ets/default/batteryModel.ets new file mode 100644 index 00000000..69e0cd94 --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ets @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2021 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 Log from "../../../../../../common/src/main/ets/default/Log.ets"; +import Constants from './common/constants.ets'; +import BatteryInfo from '@ohos.batteryInfo'; +import BatterySubscriber from '@ohos.commonevent'; + +const TAG = 'batteryStatus'; + +let mProgress = Constants.DEFAULT_PROGRESS; +let mBatteryEventSubscriber = null; +let mBatteryEventSubscribeInfo = { + events: ['usual.event.BATTERY_CHANGED'] +} +var mAppStorage = AppStorage.GetOrCreate(); +var mBatterySoc; +var mBatteryCharging; + +export class BatteryModel { + initBatteryModel() { + Log.showInfo(TAG, 'initBatteryModel'); + mBatterySoc = mAppStorage.setAndLink("batterySoc", 0); + mBatteryCharging = mAppStorage.setAndLink("batteryCharging", false); + if (mBatteryEventSubscriber == null) { + this.registerBatteryListener(); + } + this.getBatteryStatus(); + } + + uninitBatteryModel() { + this.unregisterBatteryListener(); + } + + /** + * Subscribe Battery events + */ + private registerBatteryListener() { + Log.showInfo(TAG, 'registerBatteryListener start'); + BatterySubscriber.createSubscriber( + mBatteryEventSubscribeInfo, + this.createBatterySubscriberCallBack.bind(this) + ); + } + + /** + * Unsubscribe wifi events + * + */ + private unregisterBatteryListener() { + BatterySubscriber.unsubscribe(mBatteryEventSubscriber, () => { + Log.showInfo(TAG, `unregister Battery Status Listener ===============`); + }); + } + + /** + * Callback of the subscriber + * + * @param {Object} err - error returns from the caller + * @param {Object} data - data returns from the caller + */ + + private createBatterySubscriberCallBack(err, data) { + Log.showInfo(TAG, `Subscriberregister createBatterySubscriberCallBack ${JSON.stringify(err)} ${JSON.stringify(data)}`); + mBatteryEventSubscriber = data; + BatterySubscriber.subscribe(mBatteryEventSubscriber, this.batterySubscriberCallBack.bind(this)); + } + + + /** + * Callback of the events + * + * @param {Object} err - error returns from the caller + * @param {Object} data - data returns from the caller + */ + + private batterySubscriberCallBack(err, data) { + Log.showInfo(TAG, `Subscriberregister data == ${JSON.stringify(data)}`); + if (err.code == 0) { + if (data.event == 'usual.event.BATTERY_CHANGED') { + this.getBatteryStatus(); + } + } else { + Log.showInfo(TAG, 'Subscriberregister error when subscribing ========'); + } + } + + + /** + * Get battery status and remaining power + */ + private getBatteryStatus() { + let batterySoc = BatteryInfo.batterySOC; + let batteryCharging = BatteryInfo.chargingStatus; + if (null == batterySoc) { + // Set the battery Soc as full when there is no battery hardware + batterySoc = mProgress; + } + if (batterySoc <= 0) { + // If the result is a negative number, set it as positive number. + batterySoc = Math.abs(batterySoc) * Constants.PERCENT_NUMBER; + } + // Set the battery status as charging when there is no battery hardware + this.checkBatteryStatus(batteryCharging, (result) => { + let batteryStatus = result; + mBatterySoc.set(batterySoc); + mBatteryCharging.set(batteryStatus); + }); + } + + /** + * Check the battery charging status + * + * @param {number} charging - the battery charging status + * @param {object} callback - Function callback + */ + private checkBatteryStatus(charging, callback) { + Log.showInfo(TAG, `Battery updateBattery checkBatteryStatus: ${charging}`); + let batteryStatus; + switch (charging) { + case Constants.NONE: + batteryStatus = false; + break; + case Constants.DISABLE: + case Constants.ENABLE: + case Constants.FULL: + batteryStatus = true; + break; + default: + batteryStatus = false; + break; + } + callback(batteryStatus); + } +} + +let mBatteryModel = new BatteryModel(); +export default mBatteryModel as BatteryModel +; diff --git a/navigationBar/src/main/js/default/common/utils/Log.js b/features/batterycomponent/src/main/ets/default/common/constants.ets similarity index 40% rename from navigationBar/src/main/js/default/common/utils/Log.js rename to features/batterycomponent/src/main/ets/default/common/constants.ets index 53737497..e5ea5eb2 100644 --- a/navigationBar/src/main/js/default/common/utils/Log.js +++ b/features/batterycomponent/src/main/ets/default/common/constants.ets @@ -13,40 +13,36 @@ * limitations under the License. */ -var TAG = 'SystemUI_NavigationBar'; +export default class Constants { -/** - * Basic log class - */ -export default class Log { + //layout params - Icon + static WHOLE_CONTAINER_MARGIN = 2 + static WHOLE_CONTAINER_WIDTH = 100 + static WHOLE_CONTAINER_HEIGHT = '50%' + static PIC_CONTAINER_WIDTH = '70%' + static PIC_CONTAINER_HEIGHT = '85%' + //layout params - Pic + static FULL_CONTAINER_WIDTH = '100%' + static FULL_CONTAINER_HEIGHT = '100%' + static BATTERY_BORDER_WIDTH = '88%' + static BATTERY_BORDER_HEIGHT = '80%' + static BATTERY_BORDER_RADIUS = 2 + static BATTERY_BORDER_MARGIN = 2 + static BATTERY_CONTENT_PADDING = 2 + static BATTERY_DECORATOR_WIDTH = '10%' + static BATTERY_DECORATOR_HEIGHT = '50%' + static BATTERY_DECORATOR_MARGIN = 2 + //layout params - Soc + static SOC_FONT_SIZE = 16 - /** - * print info level log - * - * @param {string} tag - Page or class tag - * @param {string} log - Log needs to be printed - */ - static showInfo(tag, log) { - console.info(`${TAG} tag: ${tag} --> ${log}`); - } + //value + static BATTERY_LEVEL_LOW = 20 - /** - * print debug level log - * - * @param {string} tag - Page or class tag - * @param {string} log - Log needs to be printed - */ - static showDebug(tag, log) { - console.debug(`${TAG} tag: ${tag} --> ${log}`); - } + static NONE = 0; + static ENABLE = 1; + static DISABLE = 2; + static FULL = 3; + static PERCENT_NUMBER = 100; + static DEFAULT_PROGRESS = 100; - /** - * print error level log - * - * @param {string} tag - Page or class tag - * @param {string} log - Log needs to be printed - */ - static showError(tag, log) { - console.error(`${TAG} tag: ${tag} --> ${log}`); - } } \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets new file mode 100644 index 00000000..365a02b8 --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021 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 mBatteryModel from '../batteryModel.ets'; +import BatteryPic from './batteryPic.ets' +import BatterySoc from './batterySoc' +import Constants from '../common/constants.ets' + +@Component +export default +struct BatteryIcon { + @StorageLink('batterySoc') batterySoc: number = 100 + + aboutToAppear() { + mBatteryModel.initBatteryModel(); + } + + aboutToDisappear() { + mBatteryModel.uninitBatteryModel(); + } + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + BatterySoc() + } + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + BatteryPic() + } + .width('70%') + .height('85%') + } + .width($r('app.float.whole_container_width')) + .height('50%') + .margin($r('app.float.whole_container_margin')) + } +} diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets new file mode 100644 index 00000000..64100eaa --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +const TAG = 'battery' + +@Component +export default +struct BatteryPic { + @StorageLink('batterySoc') batterySoc: number = 100 + @StorageLink('batteryCharging') batteryCharging : boolean = false + + build() { + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + } + .height('100%') + .width(this.batterySoc + '%') + .backgroundColor(this.getBatteryColor(this.batterySoc, this.batteryCharging)) + } + .width('88%') + .height('80%') + .backgroundColor($r('app.color.battery_background')) + .border({ width: $r('app.float.battery_border_width'), + color: $r('app.color.battery_border'), + radius: $r('app.float.battery_border_radius'), + style: BorderStyle.Solid }) + .padding($r('app.float.battery_content_padding')) + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + + } + .width('10%') + .height('50%') + .backgroundColor($r('app.color.battery_border')) + .borderRadius($r('app.float.battery_border_radius')) + .margin({ left: $r('app.float.battery_decorator_margin') }) + } + .width('100%') + .height('100%') + } + + private getBatteryColor(val, charging) { + Log.showInfo(TAG, `charging ${ charging }`); + Log.showInfo(TAG, `val ${ val }`); + if (charging) { + return $r('app.color.battery_charging_color'); + } else if (val <= Constants.BATTERY_LEVEL_LOW) { + return $r('app.color.battery_low_color'); + } else { + return $r('app.color.battery_default_color'); + } + } +} diff --git a/entry/src/main/js/default/pages/statusbar/statusBar.js b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets old mode 100755 new mode 100644 similarity index 60% rename from entry/src/main/js/default/pages/statusbar/statusBar.js rename to features/batterycomponent/src/main/ets/default/pages/batterySoc.ets index af4c16c6..b51c74bc --- a/entry/src/main/js/default/pages/statusbar/statusBar.js +++ b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -13,19 +13,17 @@ * limitations under the License. */ -import mLog from '../../common/utils/Log.js'; +@Component +export default +struct BatterySoc { + @StorageLink('batterySoc') batterySoc: number = 100 -const TAG = 'statusBar'; - -export default { - props: ['statusHeight', 'statusWidth', 'backgroundColor', 'showClock', 'cellularType', 'typeShow', - 'cellularImage', 'backColor', 'progressWidth', 'mTime', 'mDate'], - - data: { - }, - - onInit() { - mLog.showInfo(TAG, 'onInit'); + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text(this.batterySoc + '%') + .height('100%') + .fontColor($r('app.color.battery_default_color')) + .fontSize($r('app.float.fontSize_network_state')) } - + } } diff --git a/features/batterycomponent/src/main/resources/base/element/color.json b/features/batterycomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..d86a7a33 --- /dev/null +++ b/features/batterycomponent/src/main/resources/base/element/color.json @@ -0,0 +1,20 @@ +{ + "color": [ + { + "name": "battery_low_color", + "value": "#ff0000" + },{ + "name": "battery_default_color", + "value": "#ffffff" + },{ + "name": "battery_charging_color", + "value": "#00ff21" + },{ + "name": "battery_border", + "value": "#fff" + },{ + "name": "battery_background", + "value": "#00000000" + } + ] +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/resources/base/element/float.json b/features/batterycomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..4a8ca9e9 --- /dev/null +++ b/features/batterycomponent/src/main/resources/base/element/float.json @@ -0,0 +1,32 @@ +{ + "float": [ + { + "name": "fontSize_network_state", + "value": "16" + }, + { + "name": "whole_container_width", + "value": "100" + }, + { + "name": "whole_container_margin", + "value": "2" + }, + { + "name": "battery_decorator_margin", + "value": "2" + }, + { + "name": "battery_border_radius", + "value": "2" + }, + { + "name": "battery_content_padding", + "value": "2" + }, + { + "name": "battery_border_width", + "value": "1" + } + ] +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/resources/base/element/string.json b/features/batterycomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..af63c7dc --- /dev/null +++ b/features/batterycomponent/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "batterycomponent_MainAbility", + "value": "batterycomponent_MainAbility" + }, + { + "name": "mainability_description", + "value": "ETS_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/navigationBar/src/main/resources/base/media/icon.png b/features/batterycomponent/src/main/resources/base/media/icon.png similarity index 100% rename from navigationBar/src/main/resources/base/media/icon.png rename to features/batterycomponent/src/main/resources/base/media/icon.png diff --git a/features/batterycomponent/src/main/resources/en_US/element/string.json b/features/batterycomponent/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..af63c7dc --- /dev/null +++ b/features/batterycomponent/src/main/resources/en_US/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "batterycomponent_MainAbility", + "value": "batterycomponent_MainAbility" + }, + { + "name": "mainability_description", + "value": "ETS_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/resources/zh_CN/element/string.json b/features/batterycomponent/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..af63c7dc --- /dev/null +++ b/features/batterycomponent/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "batterycomponent_MainAbility", + "value": "batterycomponent_MainAbility" + }, + { + "name": "mainability_description", + "value": "ETS_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/features/clockcomponent/build.gradle b/features/clockcomponent/build.gradle new file mode 100644 index 00000000..70131cb1 --- /dev/null +++ b/features/clockcomponent/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'com.huawei.ohos.library' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 6 + defaultConfig { + compatibleSdkVersion 4 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} \ No newline at end of file diff --git a/features/clockcomponent/src/main/config.json b/features/clockcomponent/src/main/config.json new file mode 100644 index 00000000..ac01639b --- /dev/null +++ b/features/clockcomponent/src/main/config.json @@ -0,0 +1,22 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.clockcomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "clockcomponent", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/index/index.css b/features/clockcomponent/src/main/ets/default/app.ets old mode 100755 new mode 100644 similarity index 80% rename from entry/src/main/js/default/pages/index/index.css rename to features/clockcomponent/src/main/ets/default/app.ets index 6acfc656..2a3b6238 --- a/entry/src/main/js/default/pages/index/index.css +++ b/features/clockcomponent/src/main/ets/default/app.ets @@ -13,8 +13,11 @@ * limitations under the License. */ -.bk{ - flex-direction: column; - background-color: #66000000; - position: relative; -} \ No newline at end of file +export default { + onCreate() { + console.info('Application onCreate') + }, + onDestroy() { + console.info('Application onDestroy') + }, +} diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets new file mode 100644 index 00000000..ddce9d21 --- /dev/null +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021 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 timeModel from '../timeModel.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +const TAG = 'clockIcon'; + +@Component +export default struct ClockIcon { + + @StorageLink('time') mTime: string = '16:01' + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`); + timeModel.initTimeModel(); + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`); + timeModel.unInitTimeModel(); + } + + build() { + Flex({alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center}) { + Text(this.mTime) + .fontColor($r('app.color.clock_text_color')) + .fontSize($r('app.float.clock_fontsize')) + } + .width($r('app.float.clock_maxwidth')) + .height('50%') + } +} \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/timeModel.ets b/features/clockcomponent/src/main/ets/default/timeModel.ets new file mode 100644 index 00000000..9137179d --- /dev/null +++ b/features/clockcomponent/src/main/ets/default/timeModel.ets @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../common/src/main/ets/default/Log.ets' + +const SHORT_LENGTH = 1; +const LOOP_TIME = 3000; +const TAG = 'timeModel'; + +var mAppStorage = AppStorage.GetOrCreate(); +var timeInterval = null; + +var mTimeLink +var mDayLink +var mWeekDayLink +var mMonthLink + + +export class TimeModel { + + /** + * Init Time Model + * + */ + initTimeModel() { + Log.showInfo(TAG, `initTimeModel`); + Log.showInfo(TAG, `timeInterval : ${timeInterval} type: ${typeof timeInterval}`); + if (timeInterval === null || timeInterval === undefined) { + Log.showInfo(TAG, `first initTimeModel`); + mTimeLink = mAppStorage.setAndLink('time', ''); + mDayLink = mAppStorage.setAndLink('day', ''); + mWeekDayLink = mAppStorage.setAndLink('weekDay', ''); + mMonthLink = mAppStorage.setAndLink('month', ''); + this.getCurrentDate(); + } + } + + unInitTimeModel() { + Log.showInfo(TAG, `unInitTimeModel`); + } + + /** + * Get current date and time. + * + */ + private getCurrentDate() { + Log.showInfo(TAG, `getCurrentDate`); + this.getDate(); + timeInterval = setInterval(() => { + this.getDate(); + }, LOOP_TIME); + } + + private getDate(){ + let date = new Date(); + Log.showInfo(TAG, `getCurrentDate ${date.toTimeString()}`); + this.updateTime(date); + this.updateDay(date); + this.updateWeekDay(date); + this.updateMonth(date); + Log.showInfo(TAG, `updateTime time ${mTimeLink.get()} + updateDay day: ${mDayLink.get()} + updateWeekDay weekDay: ${mWeekDayLink.get()} + updateMonth month: ${mMonthLink.get()}`); + } + + /** + * Update Time. + * + * @param {Object} date - Object of Date. + */ + private updateTime(date) { + let time = date.toTimeString().substring(0, 5); + mTimeLink.set(time); + } + + /** + * Update Day. + * + * @param {Object} date - Object of Date. + */ + private updateDay(date) { + let day = date.getDate(); + mDayLink.set(day); + } + + /** + * Update WeekDay. + * + * @param {Object} date - Object of Date. + */ + private updateWeekDay(date) { + let weekDay = date.getDay(); + mWeekDayLink.set(weekDay); + } + + /** + * Update Month. + * + * @param {Object} date - Object of Date. + */ + private updateMonth(date) { + let month = (date.getMonth() + 1); + mMonthLink.set(month); + } +} + +let timeModel = new TimeModel(); +export default timeModel as TimeModel; \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/base/element/color.json b/features/clockcomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..fd00ddfa --- /dev/null +++ b/features/clockcomponent/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "clock_text_color", + "value": "#fff" + } + ] +} \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/base/element/float.json b/features/clockcomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..027e03d2 --- /dev/null +++ b/features/clockcomponent/src/main/resources/base/element/float.json @@ -0,0 +1,11 @@ +{ + "float": [ + { + "name": "clock_fontsize", + "value": "18" + },{ + "name": "clock_maxwidth", + "value": "70" + } + ] +} \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/base/element/string.json b/features/clockcomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..2c0dec28 --- /dev/null +++ b/features/clockcomponent/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "clockcomponent_MainAbility", + "value": "clockcomponent_MainAbility" + }, + { + "name": "mainability_description", + "value": "ETS_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/base/media/icon.png b/features/clockcomponent/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { + Log.showInfo(TAG, `Subscriberregister unregister Wifi Status Listener ===============`); + }); + } + + setValue(callback) { + let value = parseInt(callback.value); + Log.showInfo(TAG, `setValue ${ value }`); + mBrightnessValue.set(value); + this.sendEvent(mBrightnessValue.get().toString()); + brightness.setValue(value); + Log.showInfo(TAG, `setValue ${ value } end`); + } + + sendEvent(value){ + Log.showInfo(TAG, `sendEvent ${ value }`); + let commonEventPublishData = { + bundleName: 'com.ohos.systemui', + code:1, + data: value + } + commonEvent.publish(EVENT,commonEventPublishData,(err,data)=> { + console.log(`sendEvent err ${JSON.stringify(err)}`); + console.log(`sendEvent data ${JSON.stringify(data)}`); + }); + } +} + +let mBrightnessManager = new brightnessManager(); +export default mBrightnessManager as brightnessManager; \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/common/png/airplane.svg b/features/control/src/main/ets/com/ohos/control/common/png/airplane.svg new file mode 100644 index 00000000..d648b9f9 --- /dev/null +++ b/features/control/src/main/ets/com/ohos/control/common/png/airplane.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/common/png/airplane_d.svg b/features/control/src/main/ets/com/ohos/control/common/png/airplane_d.svg new file mode 100644 index 00000000..ad2180b1 --- /dev/null +++ b/features/control/src/main/ets/com/ohos/control/common/png/airplane_d.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_settings.png b/features/control/src/main/ets/com/ohos/control/common/png/ic_notification_settings.png similarity index 100% rename from entry/src/main/js/default/common/image_xxhdpi/ic_settings.png rename to features/control/src/main/ets/com/ohos/control/common/png/ic_notification_settings.png diff --git a/features/control/src/main/ets/com/ohos/control/common/png/wifi.svg b/features/control/src/main/ets/com/ohos/control/common/png/wifi.svg new file mode 100644 index 00000000..e22c8330 --- /dev/null +++ b/features/control/src/main/ets/com/ohos/control/common/png/wifi.svg @@ -0,0 +1,17 @@ + + + + ic_notification_wlan + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/common/png/wifi_d.svg b/features/control/src/main/ets/com/ohos/control/common/png/wifi_d.svg new file mode 100644 index 00000000..e851f5b3 --- /dev/null +++ b/features/control/src/main/ets/com/ohos/control/common/png/wifi_d.svg @@ -0,0 +1,17 @@ + + + + ic_notification_wlan + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets b/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets new file mode 100644 index 00000000..65077a3d --- /dev/null +++ b/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2021 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 audio from '@ohos.multimedia.audio'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; + +let TAG = "VolumeModel"; + +export default class VolumeModel { + constructor() { + } + + setVolume(volumeValue, volumeTpye){ + Log.showInfo(TAG, `setvolume = ` + volumeValue + "volumeTpye = " + volumeTpye); + + audio.getAudioManager().setVolume(volumeTpye, volumeValue).then(() => { + console.info('Promise returned to indicate a successful volume setting.') + }); + } + + getVolume(callback, volumeType) { + audio.getAudioManager().getVolume(volumeType, (err, value) => { + if (err) { + Log.showInfo(TAG, `Failed to obtain the volume. ${err.message}`); + return; + } + Log.showInfo(TAG, 'Callback invoked to indicate that the volume is obtained.' + value); + callback.value = value; + }) + } + + getMaxVolume(callback, volumeType) { + audio.getAudioManager().getVolume(volumeType, (err, value) => { + if (err) { + Log.showInfo(TAG, `Failed to obtain the volume. ${err.message}`); + return; + } + Log.showInfo(TAG, 'Callback invoked to indicate that the volume is obtained.' + value); + callback.maxValue = value; + }) + } + + getMinVolume(callback, volumeType) { + audio.getAudioManager().getVolume(volumeType, (err, value) => { + if (err) { + Log.showInfo(TAG, `Failed to obtain the volume. ${err.message}`); + return; + } + Log.showInfo(TAG, 'Callback invoked to indicate that the volume is obtained.' + value); + callback.minValue = value; + }) + } +} \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets b/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets new file mode 100644 index 00000000..116500ca --- /dev/null +++ b/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021 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 {UpTitle} from './UpTitle.ets' +import {AirPlaneComponent} from './airPlaneComponent.ets' +import {ElseWifiComponent} from './wifiComponent.ets' +import {MyBrightness} from './brightnessComponent.ets' +import {MyVol} from './volumeComponent.ets' + + +@Component +export default +struct ControlCenterComponent { + @Link showStatusBar: boolean + + aboutToAppear() { + console.log("Control Center aboutToAppear") + } + + build() { + Column() { + Column() { + UpTitle({ showStatusBar: $showStatusBar }) + } + .width('100%') + .height('10%') + .margin({ top: $r('app.float.center_item_margin_top'), + left: $r('app.float.center_item_margin_left'), + right: $r('app.float.center_item_margin_right') }) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { + Flex() { + ElseWifiComponent() + } + .width('48%') + .height('100%') + + Flex() { + AirPlaneComponent() + } + .width('48%') + .height('100%') + } + .width('100%') + .height('15%') + .margin({ top: $r('app.float.center_item_margin_top'), + left: $r('app.float.center_item_margin_left'), + right: $r('app.float.center_item_margin_right') }) + + Column() { + MyBrightness() + } + .width('100%') + .height('8%') + .margin({ top: $r('app.float.center_item_margin_top'), + left: $r('app.float.center_item_margin_left'), + right: $r('app.float.center_item_margin_right') }) + + Flex() { + MyVol() + } + .width('100%') + .height('8%') + .margin({ top: $r('app.float.center_item_margin_top'), + left: $r('app.float.center_item_margin_left'), + right: $r('app.float.center_item_margin_right') }) + } + .backgroundColor($r('app.color.control_center_bg_color')) + .width('100%') + .height('100%') + } +} diff --git a/features/control/src/main/ets/com/ohos/control/pages/IconComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/IconComponent.ets new file mode 100644 index 00000000..2db30ef1 --- /dev/null +++ b/features/control/src/main/ets/com/ohos/control/pages/IconComponent.ets @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2021 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 {IconWidth, IconHeight} from './Uniform.ets'; +import mWifiManger from '../../../../../../../../wificomponent/src/main/ets/default/WifiModel.ets'; + + +@Component +export +struct IconComponent { + @State iconOnBG: any = $r('app.color.icon_on_bg') + private iconOn: string = "" + @State iconOffBG: any = $r('app.color.icon_off_bg') + private iconOff: string = "" + @Link OnOrOff: boolean + @State OnOrOffShow: boolean = false + @StorageLink("flyModelStatus") flyModelStatus: boolean = false + @StorageLink("wifiOpenStatus") wifiOpenStatus: boolean = false + + + aboutToAppear() { + mWifiManger.initWifiModel(); + } + + build() { + Column() { + Stack() { + Stack() { + Flex() + .backgroundColor(this.iconOffBG) + .clip(new Circle({ width: IconWidth, height: IconHeight })) + .width($r('app.float.uniform_icon_bg_width')) + .height($r('app.float.uniform_icon_bg_height')) + Image(this.iconOff) + .size({ width: $r('app.float.uniform_icon_width'), height: $r('app.float.uniform_icon_height') }) + .objectFit(ImageFit.Contain) + } + .margin({ left: $r('app.float.icon_stack_common_margin') }) + + if (this.wifiOpenStatus == true) { + Stack() { + Flex() + .backgroundColor(this.iconOnBG) + .clip(new Circle({ width: IconWidth, height: IconHeight })) + .width($r('app.float.uniform_icon_bg_width')) + .height($r('app.float.uniform_icon_bg_height')) + Image(this.iconOn) + .size({ width: $r('app.float.uniform_icon_width'), height: $r('app.float.uniform_icon_height') }) + .objectFit(ImageFit.Contain) + } + .margin({ left: $r('app.float.icon_stack_common_margin') }) + } + } + .onClick(() => { + console.log(`IconComponent onClick ${this.flyModelStatus}`) + if (this.wifiOpenStatus == false) { + mWifiManger.enableWifi(); + } else { + mWifiManger.disableWifi(); + } + }) + } + } +} + +@Component +export +struct IconFlyComponent { + @State iconOnBG: any = $r('app.color.icon_on_bg') + private iconOn: string = "" + @State iconOffBG: any = $r('app.color.icon_off_bg') + private iconOff: string = "" + @StorageLink("flyModelStatus") flyModelStatus: boolean = false + @StorageLink("wifiOpenStatus") wifiOpenStatus: boolean = false + + aboutToAppear() { + console.log('IconFlyComponent, aboutToAppear') + } + + build() { + Column() { + Stack() { + Stack() { + Flex() + .backgroundColor(this.iconOffBG) + .clip(new Circle({ width: IconWidth, height: IconHeight })) + .width($r('app.float.uniform_icon_bg_width')) + .height($r('app.float.uniform_icon_bg_height')) + Image(this.iconOff) + .size({ width: $r('app.float.uniform_icon_width'), height: $r('app.float.uniform_icon_height') }) + .objectFit(ImageFit.Contain) + } + .margin({ left: $r('app.float.icon_stack_common_margin') }) + + if (this.flyModelStatus == true) { + Stack() { + Flex() + .backgroundColor(this.iconOnBG) + .clip(new Circle({ width: IconWidth, height: IconHeight })) + .width($r('app.float.uniform_icon_bg_width')) + .height($r('app.float.uniform_icon_bg_height')) + Image(this.iconOn) + .size({ width: $r('app.float.uniform_icon_width'), height: $r('app.float.uniform_icon_height') }) + .objectFit(ImageFit.Contain) + } + .margin({ left: $r('app.float.icon_stack_common_margin') }) + } + } + .onClick(() => { + console.log(`IconFlyComponent onClick ${this.flyModelStatus} `) + this.flyModelStatus =!this.flyModelStatus + console.log(`IconFlyComponent onClick ${this.flyModelStatus} `) + if (this.flyModelStatus == true) { + mWifiManger.disableWifi(); + }else{ + mWifiManger.enableWifi(); + } + }) + } + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/statusbar/clock/clock.hml b/features/control/src/main/ets/com/ohos/control/pages/Uniform.ets old mode 100755 new mode 100644 similarity index 89% rename from entry/src/main/js/default/pages/statusbar/clock/clock.hml rename to features/control/src/main/ets/com/ohos/control/pages/Uniform.ets index 552543aa..fb5c9304 --- a/entry/src/main/js/default/pages/statusbar/clock/clock.hml +++ b/features/control/src/main/ets/com/ohos/control/pages/Uniform.ets @@ -1,4 +1,3 @@ - -
    - {{mTime}} -
    \ No newline at end of file +export const IconWidth: number = 80 +export const IconHeight: number = 80 \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets b/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets new file mode 100644 index 00000000..48d690d8 --- /dev/null +++ b/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 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 FeatureAbility from '@ohos.ability.featureability'; +import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +var TAG = 'UpTitle' + +@Component +export +struct UpTitle { + @Link showStatusBar: boolean + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.End, justifyContent: FlexAlign.SpaceBetween }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Text($r('app.string.control_center')) + .fontColor($r('app.color.title_font_color')) + .fontSize($r('app.float.title_font_size')) + } + .height('100%') + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + Image($r('app.media.ic_notification_settings')) + .objectFit(ImageFit.Contain) + .size({ width: $r('app.float.notification_settings_width'), + height: $r('app.float.notification_settings_height') }) + .onClick(this.settingClick.bind(this)) + } + .height('100%') + + } + } + + settingClick() { + this.showStatusBar = true; + WindowManager.setWindowMin(); + let result = FeatureAbility.startAbility({ + want: { + bundleName: 'com.ohos.settings', + abilityName: 'com.ohos.settings.MainAbility', + }, + }) + .then(data => + Log.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)) + .catch(error => + Log.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); + Log.showInfo(TAG, `start ability ${result}`); + } +} \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/pages/airPlaneComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/airPlaneComponent.ets new file mode 100644 index 00000000..37772c6e --- /dev/null +++ b/features/control/src/main/ets/com/ohos/control/pages/airPlaneComponent.ets @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 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 {IconFlyComponent} from './IconComponent.ets' + +@Component +export +struct AirPlaneComponent { + @State flyModel: boolean = false + @StorageLink("flyModelStatus") flyModelStatus: boolean = this.flyModel + private IconInfo: any[] = [ + '', + $r('app.media.airplane_d'), + '', + $r('app.media.airplane'), + ] + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + IconFlyComponent({ + iconOff: this.IconInfo[1], + iconOn: this.IconInfo[3] + }) + } + .height('100%') + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Center }) { + Text($r('app.string.flight_mode')) + .fontSize($r('app.float.control_common_font_size')) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .margin({ left: $r('app.float.plane_margin_left') }) + } + .height('100%') + } + .borderRadius($r('app.float.plane_border_radius')) + .backgroundColor($r('app.color.plane_bg_color')) + .height('100%') + .width('100%') + } +} \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets new file mode 100644 index 00000000..d84cb646 --- /dev/null +++ b/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2021 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 brightness from '@ohos.brightness'; +import mBrightnessManager from '../common/brightness/brightnessManager.ets'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'MyBrightness' + + +@Component +export +struct MyBrightness { + @StorageLink('BrightnessValue') brightnessValue: number = 0; + @State brightnessItem: any = { + min: 0, + max: 255, + value: 0 + }; + + aboutToAppear() { + mBrightnessManager.registerBrightnessListener(); + this.brightnessItem.value = this.brightnessValue; + Log.showInfo(TAG, `Brightness aboutToAppear ${JSON.stringify(this.brightnessItem)}`); + } + + setBrightness(value) { + Log.showInfo(TAG, `setBrightness = ${value}`); + mBrightnessManager.setValue(value); + } + + build() { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + Column() { + Text($r('app.string.brightness_text')) + .fontSize($r('app.float.control_common_font_size')) + } + .width('15%') + .padding({ left: $r('app.float.slider_text_padding_left') }) + + Column() { + Slider({ + value: this.brightnessValue, + min: this.brightnessItem.min, + max: this.brightnessItem.max, + step: 1, + style: SliderStyle.INSET + }) + .size({ width: $r('app.float.slider_size_width') }) + .blockColor(Color.Blue) + .trackColor(Color.Grey) + .selectedColor(Color.Blue) + .onChange((value: number) => { + this.brightnessItem.value = value; + this.setBrightness(this.brightnessItem); + }) + } + .width('85%') + } + .height('100%') + .width('100%') + .backgroundColor($r('app.color.brightness_bg_color')) + .borderRadius($r('app.float.brightness_border_radius')) + } +} \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets new file mode 100644 index 00000000..26252209 --- /dev/null +++ b/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2021 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 audio from '@ohos.multimedia.audio'; +import VolumeModel from '../common/volume/VolumeModel.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'ControlCenter' +const volumeTpye = 'audio.AudioVolumeType.MEDIA' + +let volumeModel = new VolumeModel(); +let volume = { + value: 7, + minValue: 0, + maxValue: 10, +} + +@Component +export +struct MyVol { + private audioManager = audio.getAudioManager(); + + initVolume() { + volumeModel.getMaxVolume(volume, volumeTpye); + volumeModel.getMinVolume(volume, volumeTpye); + volumeModel.getVolume(volume, volumeTpye); + Log.showInfo(TAG, `initVolume ${volume.value} ${volume.minValue} ${volume.maxValue} `) + } + + setVolume(volumeValue, volumeTpye) { + Log.showInfo(TAG, `setVolume = ${volume.value} Type = ${volumeTpye}`) + audio.getAudioManager().setVolume(volumeTpye, volumeValue).then(() => { + console.info("Promise returned to indicate a successful volume setting") + }) + } + + aboutToAppear() { + console.log("Start init Volume!") + this.initVolume() + console.log("Finished init Volume!") + } + + build() { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + Column() { + Text($r('app.string.volume_control')) + .fontSize($r('app.float.control_common_font_size')).alignSelf(ItemAlign.Center) + + } + .width('15%') + .padding({ left: $r('app.float.slider_text_padding_left') }) + + Column() { + Slider({ + value: volume.value, + min: volume.minValue, + max: volume.maxValue, + step: 1, + style: SliderStyle.INSET + }) + .size({ width: 300 }) + .blockColor(Color.Blue) + .trackColor(Color.Grey) + .selectedColor(Color.Blue) + .onChange((value: number) => { + volume.value = value + this.setVolume(volume, volumeTpye) + }) + } + .width('85%') + } + .height('100%') + .width('100%') + .backgroundColor($r('app.color.volume_bg_color')) + .borderRadius($r('app.float.volume_border_radius')) + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.js b/features/control/src/main/ets/com/ohos/control/pages/wifiComponent.ets similarity index 31% rename from entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.js rename to features/control/src/main/ets/com/ohos/control/pages/wifiComponent.ets index 51c682a2..1d8a5e98 100644 --- a/entry/src/main/js/default/pages/largeStatusBar/largeStatusBar.js +++ b/features/control/src/main/ets/com/ohos/control/pages/wifiComponent.ets @@ -13,38 +13,43 @@ * limitations under the License. */ -import mLog from '../../common/utils/Log.js'; +import {IconComponent} from './IconComponent.ets' -const MAX_HEIGHT = '110px'; -const MAX_WIDTH = '100%'; -const TAG = 'LargeStatusBar'; +@Component +export +struct ElseWifiComponent { + @StorageLink("flyModelStatus") flyModelStatus: boolean = false + @StorageLink("wifiName") title: string = 'WLAN' + @StorageLink("wifiOpenStatus") wifiOpenStatus: boolean = false + private IconInfo: any[] = [ + 'common/png/ic_notification_switch_off_bg.svg', + $r('app.media.wifi_d'), + '', + $r('app.media.wifi'), + ] -export default { - props: ['cellularType', 'typeShow', 'cellularImage', 'backColor', 'progressWidth', 'mTime', 'mDate'], + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + IconComponent({ + iconOff: this.IconInfo[1], + iconOn: this.IconInfo[3], + OnOrOff: $wifiOpenStatus + }) + } + .height('100%') - data: { - statusHeight: MAX_HEIGHT, - statusWidth: MAX_WIDTH, - backgroundColor: '', - showClock: false - }, - - onInit() { - mLog.showInfo(TAG, 'largeStatusBar onInit'); - }, - - /** - * Set button click - * @param {object}event quicklySetting Set button click return data - */ - settingClick(event) { - mLog.showInfo(TAG, `largeStatusBar settingClick event: ${JSON.stringify(event)}`); - this.$emit('eventSet', { - statusHeight: event.detail.statusHeight, - statusWidth: event.detail.statusWidth, - notificationHeight: event.detail.notificationHeight, - notificationWidth: event.detail.notificationWidth, - backgroundColor: event.detail.backgroundColor - }); + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Center }) { + Text(this.title) + .fontSize($r('app.float.control_common_font_size')) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .margin({ left: $r('app.float.wifi_text_margin') }) + } + .height('100%') } -} + .borderRadius($r('app.float.wifi_border_radius')) + .backgroundColor($r('app.color.wifi_bg_color')) + .height('100%') + .width('100%') + } +} \ No newline at end of file diff --git a/features/control/src/main/resources/base/element/color.json b/features/control/src/main/resources/base/element/color.json new file mode 100644 index 00000000..7b54e20d --- /dev/null +++ b/features/control/src/main/resources/base/element/color.json @@ -0,0 +1,41 @@ +{ + "color": [ + { + "name": "plane_bg_color", + "value": "#CCFFFFFF" + },{ + "name": "slider_block_color", + "value": "#0000FF" + },{ + "name": "slider_track_color", + "value": "#BEBEBE" + },{ + "name": "slider_select_color", + "value": "#0000FF" + },{ + "name": "brightness_bg_color", + "value": "#CCFFFFFF" + },{ + "name": "control_center_bg_color", + "value": "#66000000" + },{ + "name": "icon_on_bg", + "value": "#0A59F7" + },{ + "name": "icon_off_bg", + "value": "#F5F5F5" + },{ + "name": "title_font_color", + "value": "#FFF" + }, + + { + "name": "volume_bg_color", + "value": "#CCFFFFFF" + }, + { + "name": "wifi_bg_color", + "value": "#CCFFFFFF" + } + ] +} diff --git a/features/control/src/main/resources/base/element/float.json b/features/control/src/main/resources/base/element/float.json new file mode 100644 index 00000000..be66b596 --- /dev/null +++ b/features/control/src/main/resources/base/element/float.json @@ -0,0 +1,84 @@ +{ + "float": [ + { + "name": "plane_border_radius", + "value": "15" + },{ + "name": "plane_margin_left", + "value": "10" + },{ + "name": "control_common_font_size", + "value": "20" + },{ + "name": "slider_size_width", + "value": "300" + },{ + "name": "brightness_border_radius", + "value": "15" + },{ + "name": "center_item_margin_top", + "value": "20" + },{ + "name": "center_item_margin_left", + "value": "10" + },{ + "name": "center_item_margin_right", + "value": "10" + },{ + "name": "title_font_size", + "value": "35" + },{ + "name": "notification_settings_width", + "value": "60" + },{ + "name": "notification_settings_height", + "value": "60" + },{ + "name": "volume_border_radius", + "value": "15" + }, + { + "name": "uniform_icon_width", + "value": "50px" + }, + { + "name": "uniform_icon_height", + "value": "50px" + }, + { + "name": "uniform_icon_bg_height", + "value": "80px" + }, + { + "name": "uniform_icon_bg_width", + "value": "80px" + }, + { + "name": "icon_stack_common_margin", + "value": "10" + }, + + { + "name": "icon_circle_width", + "value": "80" + },{ + "name": "icon_circle_height", + "value": "80" + }, + { + "name": "wifi_border_radius", + "value": "15" + }, + { + "name": "wifi_text_margin", + "value": "10" + }, + { + "name": "icon_component_width", + "value": "15" + },{ + "name": "slider_text_padding_left", + "value": "5" + } + ] +} diff --git a/features/control/src/main/resources/base/element/string.json b/features/control/src/main/resources/base/element/string.json new file mode 100644 index 00000000..d1db5170 --- /dev/null +++ b/features/control/src/main/resources/base/element/string.json @@ -0,0 +1,23 @@ +{ + "string": [ + { + "name": "control_library", + "value": "control_library" + }, + { + "name": "flight_mode", + "value": "飞行模式" + }, + { + "name": "brightness_text", + "value": "亮度:" + },{ + "name": "control_center", + "value": "控制中心" + },{ + "name": "volume_control", + "value": "声音:" + } + + ] +} diff --git a/features/control/src/main/resources/base/media/airplane.svg b/features/control/src/main/resources/base/media/airplane.svg new file mode 100644 index 00000000..d648b9f9 --- /dev/null +++ b/features/control/src/main/resources/base/media/airplane.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/control/src/main/resources/base/media/airplane_d.svg b/features/control/src/main/resources/base/media/airplane_d.svg new file mode 100644 index 00000000..ad2180b1 --- /dev/null +++ b/features/control/src/main/resources/base/media/airplane_d.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/control/src/main/resources/base/media/ic_notification_settings.png b/features/control/src/main/resources/base/media/ic_notification_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b665b89cd206a3e476f5e9efbe31d482be7a0321 GIT binary patch literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKMSxF;E0F#_5a8H~Cu@LqYm@}} z1v9Kz!j?9FIuBE}!mNZcS4&e#flzNf(Mi1>^=i%1`N3NL4o1n*HdQBu_hvFMFdKWi zIEF+Vej9#s+ad#j78kRdfm2)=4?g|>zd()AfAYJE{uH_A*Cuyvob>9Qm;38_*Xl$w zg_;8Ad2?=RF*z@q+goV#=%cJtiHVZdQUAw>rJKGbt>ZbuVqg*wcDRBmm+e%Z!84E9 zGmVOK{~Sz9ZSWBYJuGgoCl@W7{erOF;$IcgfUmCs@iPs@$<)xc{e&^r`Hz$n5Fc68o!~6m_X;r-3M!*R-C#c`pk^s zJ>T*>EFJ6%T6QFUShJtKpQXsdIE67zW3s}|YH=6SU-PrlN>v`}xS4-du5QippJ`Rn zlFzT2*C&DGO4`=s8kF>v+H*|T5jcEU0pj}>p- z&R(2s@b;??RS90X*HG_Xm(`U0F=ADlvyYehs0yDJnOBw9C1X25<)^Op@q~BX8`ta1P@n&# zQlMZ?9?P2xVMZIL`p>!fQo?`Pha*Q8{uX#SRq~QV<$VUw{C@5NXD`4}D? zS~OS2;k@mRipJAhZ%#R$7J5D1Jw481L5+t=u#l-@Ot#dN<6lnQ?@xF%E6L7fSI?=G zKd;W-{qYPw7g)mGYe$1ILWg+-yu;l zp literal 0 HcmV?d00001 diff --git a/features/control/src/main/resources/base/media/wifi.svg b/features/control/src/main/resources/base/media/wifi.svg new file mode 100644 index 00000000..e22c8330 --- /dev/null +++ b/features/control/src/main/resources/base/media/wifi.svg @@ -0,0 +1,17 @@ + + + + ic_notification_wlan + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/features/control/src/main/resources/base/media/wifi_d.svg b/features/control/src/main/resources/base/media/wifi_d.svg new file mode 100644 index 00000000..e851f5b3 --- /dev/null +++ b/features/control/src/main/resources/base/media/wifi_d.svg @@ -0,0 +1,17 @@ + + + + ic_notification_wlan + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/features/control/src/main/resources/en_US/element/string.json b/features/control/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..78e291b8 --- /dev/null +++ b/features/control/src/main/resources/en_US/element/string.json @@ -0,0 +1,21 @@ +{ + "string": [ + { + "name": "control_library", + "value": "control_library" + },{ + "name": "flight_mode", + "value": "Flight Mode" + }, + { + "name": "brightness_text", + "value": "Brightness:" + },{ + "name": "control_center", + "value": "Control Center" + },{ + "name": "volume_control", + "value": "Volume:" + } + ] +} diff --git a/features/control/src/main/resources/zh_CN/element/string.json b/features/control/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..d3b282c0 --- /dev/null +++ b/features/control/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,21 @@ +{ + "string": [ + { + "name": "control_library", + "value": "control_library" + },{ + "name": "flight_mode", + "value": "飞行模式" + }, + { + "name": "brightness_text", + "value": "亮度:" + },{ + "name": "control_center", + "value": "控制中心" + },{ + "name": "volume_control", + "value": "声音:" + } + ] +} diff --git a/navigationBar/.gitignore b/features/navigationservice/.gitignore old mode 100755 new mode 100644 similarity index 33% rename from navigationBar/.gitignore rename to features/navigationservice/.gitignore index 3543521e..7d5b7a94 --- a/navigationBar/.gitignore +++ b/features/navigationservice/.gitignore @@ -1 +1,2 @@ -/build +/build +/node_modules diff --git a/features/navigationservice/build.gradle b/features/navigationservice/build.gradle new file mode 100644 index 00000000..0e53f75d --- /dev/null +++ b/features/navigationservice/build.gradle @@ -0,0 +1,21 @@ +apply plugin: 'com.huawei.ohos.library' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 6 + defaultConfig { + compatibleSdkVersion 4 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + testImplementation 'junit:junit:4.13' +} diff --git a/features/navigationservice/src/main/config.json b/features/navigationservice/src/main/config.json new file mode 100644 index 00000000..89d83e1f --- /dev/null +++ b/features/navigationservice/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui_ace_new", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": { + }, + "module": { + "package": "com.ohos.navigationservice", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "navigationservice", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/notification/notification.js b/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets similarity index 61% rename from entry/src/main/js/default/pages/notification/notification.js rename to features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets index 9386058f..69a58bb1 100644 --- a/entry/src/main/js/default/pages/notification/notification.js +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets @@ -13,16 +13,22 @@ * limitations under the License. */ -import mLog from '../../common/utils/Log.js'; +const STORAGE_NAVIGATION_TYPE = 'navigationType'; -const TAG = 'notification'; +var mAppStorage; + +export class ConfigManager{ + + constructor() { + } + + initConfig() { + mAppStorage = AppStorage.GetOrCreate(); +// mAppStorage.setOrCreate(STORAGE_NAVIGATION_TYPE,TYPE_THREE); + mAppStorage.setOrCreate('navigationType', 3); + } -export default { - data: { - mNoNotification: '', - }, - onInit() { - mLog.showInfo(TAG, `onInit`); - this.mNoNotification = this.$t('strings.no_notification'); - }, } + +let configManager = new ConfigManager(); +export default configManager as ConfigManager; diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets new file mode 100644 index 00000000..bd21cb59 --- /dev/null +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import Strings from './common/strings.ets'; +import FeatureAbility from '@ohos.ability.featureability'; +import Input from '@ohos.injectEventHandler'; + +const TAG = 'KeyCodeEvent' + +let res; + +export class KeyCodeEvent{ + + public sendKeyEvent(keyCode: number, eventType: number) { + Log.showInfo(TAG, `sendKeyEvent keycode: ${keyCode} type: ${eventType}`); + switch (keyCode) { + case Strings.KEYCODE_BACK: + Log.showInfo(TAG, `sendKeyEvent case back type: ${eventType}`); + if (eventType === Strings.KEY_DOWN) { + Log.showInfo(TAG, 'sendKeyEvent, if'); + this.sendBackKeyEventStart();//down + } else if (eventType === Strings.KEY_UP) { + Log.showInfo(TAG, `sendKeyEvent, else type: ${eventType}`); + this.sendBackKeyEventEnd();//up + } + break; + case Strings.KEYCODE_HOME: + Log.showInfo(TAG, `sendKeyEvent case home type: ${eventType}`); + if (eventType === Strings.KEY_UP) { + Log.showInfo(TAG, 'sendKeyEvent, if'); + this.sendHomeKeyEvent(); + } + break; + case Strings.KEYCODE_RECENT: + Log.showInfo(TAG, `sendKeyEvent case recent type: ${eventType}`); + if (eventType === Strings.KEY_UP) { + Log.showInfo(TAG, 'sendKeyEvent, if'); + this.sendRecentKeyEvent(); + } + break; + default: + Log.showInfo(TAG, `sendKeyEvent case default keycode: ${keyCode} type: ${eventType}`); + break; + } + } + + private sendBackKeyEventStart() { + Log.showInfo(TAG, 'sendBackKeyEventStart'); + res = Input.injectEventSync({ + isPressed: true, + keyCode: 2, + keyDownDuration: 1 + }); + Log.showInfo(TAG, `injectEventHandler injectEventSync down res: ${res}`); + } + + private sendBackKeyEventEnd() { + Log.showInfo(TAG, 'sendBackKeyEventEnd'); + res = Input.injectEventSync({ + isPressed: false, + keyCode: 2, + keyDownDuration: 1 + }); + Log.showInfo(TAG, `injectEventHandler injectEventSync up res: ${res}`); + } + + private sendHomeKeyEvent() { + Log.showInfo(TAG, 'sendHomeKeyEvent'); + Log.showInfo(TAG, 'home click and start ability launcher'); + let result = FeatureAbility.startAbility({ + want: { + bundleName: Strings.LAUNCHER_BUNDLE_NAME, + abilityName: Strings.LAUNCHER_ABILITY_NAME, + }, + }).then(data => + console.log("data " + JSON.stringify(data))).catch(error => + console.log("error " + JSON.stringify(error))); + console.log("result " + result)); + } + + private sendRecentKeyEvent() { + Log.showInfo(TAG, 'sendRecentKeyEvent'); + let result = FeatureAbility.startAbility({ + want: { + bundleName: Strings.RECENT_BUNDLE_NAME, + abilityName: Strings.RECENT_ABILITY_NAME, + }, + }).then(data => + Log.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)).catch(error => + Log.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); + Log.showInfo(TAG, `start ability ${result}`); + } +} + +let keyCodeEvent = new KeyCodeEvent(); +export default keyCodeEvent as KeyCodeEvent; \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/index/index.js b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/colors.ets old mode 100755 new mode 100644 similarity index 93% rename from navigationBar/src/main/js/default/pages/index/index.js rename to features/navigationservice/src/main/ets/com/ohos/navigationservice/common/colors.ets index 546051a2..1e830360 --- a/navigationBar/src/main/js/default/pages/index/index.js +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/colors.ets @@ -13,7 +13,6 @@ * limitations under the License. */ -export default { - onInit() { - } -} +export default class colors { + +} \ No newline at end of file diff --git a/entry/src/main/js/default/pages/statusbar/clock/clock.js b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/strings.ets old mode 100755 new mode 100644 similarity index 53% rename from entry/src/main/js/default/pages/statusbar/clock/clock.js rename to features/navigationservice/src/main/ets/com/ohos/navigationservice/common/strings.ets index c4ad49e5..104e0c0e --- a/entry/src/main/js/default/pages/statusbar/clock/clock.js +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/strings.ets @@ -13,21 +13,19 @@ * limitations under the License. */ -import mLog from '../../../common/utils/Log.js'; +export default class strings { + static TYPE_THREE: number = 3; + static TYPE_ONE: number = 1; -const TAG = 'clock'; + static KEY_DOWN: number = 0; + static KEY_UP: number = 1; -export default { - props:['mTime', 'mDate'], + static LAUNCHER_BUNDLE_NAME:string = 'com.ohos.launcher'; + static LAUNCHER_ABILITY_NAME:string = 'com.ohos.launcher.MainAbility'; + static RECENT_BUNDLE_NAME:string = 'com.ohos.launcher'; + static RECENT_ABILITY_NAME:string = 'com.ohos.launcher.recents.MainAbility'; - data: { - }, - - onInit() { - mLog.showInfo(TAG, 'clock onInit'); - }, - - onDestroy() { - mLog.showInfo(TAG, 'clock onDestroy'); - } -} + static KEYCODE_BACK: number = 1; + static KEYCODE_HOME: number = 2; + static KEYCODE_RECENT: number = 3; +} \ No newline at end of file diff --git a/features/navigationservice/src/main/resources/base/element/string.json b/features/navigationservice/src/main/resources/base/element/string.json new file mode 100644 index 00000000..cd0b3a5d --- /dev/null +++ b/features/navigationservice/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "navigationservice_library", + "value": "navigationservice_library" + } + ] +} diff --git a/features/noticeitem/build.gradle b/features/noticeitem/build.gradle new file mode 100644 index 00000000..b43ede7f --- /dev/null +++ b/features/noticeitem/build.gradle @@ -0,0 +1,23 @@ +import java.nio.file.Files +import java.nio.file.Paths + +apply plugin: 'com.huawei.ohos.library' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 6 + defaultConfig { + compatibleSdkVersion 4 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} \ No newline at end of file diff --git a/features/noticeitem/src/main/config.json b/features/noticeitem/src/main/config.json new file mode 100644 index 00000000..0c205af2 --- /dev/null +++ b/features/noticeitem/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": { + }, + "module": { + "package": "com.ohos.noticeItem", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "noticeitem", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets new file mode 100644 index 00000000..7cf97b56 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021 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 default class Constants { + static NOTIFICATION_TYPE_NORMAL: string = '0' + static NOTIFICATION_TYPE_LONG: string = '1' + static NOTIFICATION_TYPE_IMAGE: string = '2' + static NOTIFICATION_TYPE_MULTILINE: string = '4' + static NOTIFICATION_TYPE_SOCIAL: string = '3' + static NOTIFICATION_TYPE_MEDIA: string = '5' + static TEXT_MAX_LENGTH: number = 21 + static TEXT_EXPANDED_MAX_LENGTH: number = 13 + static TOUCHTYPE_DOWN: number = 0; + static TOUCHTYPE_UP: number = 1; + static TOUCHTYPE_MOVE: number = 2; + static HIDDEN_TRANSLATEX: number = 150; + static DISPLAY_TRANSLATEX: number = -150; + static REMOVE_TRANSLATEX: number = 150; + static DEFAULT_MAX_LINES: number= 1; + static CONTENT_LINE_HEIGHT: number = 20; +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets new file mode 100644 index 00000000..299cffa7 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets' +import titleItem from './titleItem' +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import mNotificationService from '../../../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' +import WantAgent from '@ohos.wantAgent' +import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets' + +const TAG = 'longItem' + +@Component +export default +struct longItem { + @Link showStatusBar: boolean + @Prop notificationId: string + @Prop notificationIcon: string + @Prop notificationHashCode: string + private notificationContent: string + @Prop notificationName: string + @Prop notificationTime: string + @Prop notificationTitle: string + @Prop notificationIconDisplay: string + private notificationWant: any + @State isExpand: boolean = false + @State srcIconDisplay: any = $r('app.media.down') + @State needExpand: boolean = false + @State iconDisplay: boolean = false; + @State itemWidth: string = '100%' + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 + @State showMaxLines: number = Constants.DEFAULT_MAX_LINES + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear id: ${this.notificationId}`) + if (this.notificationContent.length > Constants.TEXT_MAX_LENGTH) { + this.needExpand = true; + } else { + this.needExpand = false; + } + if (this.needExpand && this.$isExpand) { + this.showMaxLines = Math.ceil(this.notificationContent.length / Constants.TEXT_EXPANDED_MAX_LENGTH); + } else { + this.showMaxLines = Constants.DEFAULT_MAX_LINES; + } + + Log.showInfo(TAG, `aboutToAppear showMaxLines: ${this.showMaxLines} ${typeof this.showMaxLines}`) + } + + build() { + Row() { + Column() { + titleItem({ + notificationIcon: this.notificationIcon, + notificationName: this.notificationName, + notificationTime: this.notificationTime, + srcIconDisplay: $srcIconDisplay, + isExpand: $isExpand, + needExpand: this.needExpand + }) + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.notificationTitle) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) //not support Resource type + Text(this.notificationContent) + .maxLines(this.showMaxLines) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .margin({ top: $r('app.float.content_margin_top') }) + } + .width('100%') + .margin({ top: $r('app.float.body_margin_top') }) + } + .backgroundColor($r('app.color.notificationitem_background')) + .opacity($r('app.float.item_opicaty')) + .borderRadius($r('app.float.item_borderradius')) + .margin({ + left: $r('app.float.item_marginleft'), + right: $r('app.float.item_marginright'), + top: $r('app.float.item_margintop') + }) + .padding({ + left: $r('app.float.item_paddingleft'), + right: $r('app.float.item_paddingright'), + bottom: $r('app.float.item_paddingbottom') + }) + .onTouch(this.touchNotificationItem.bind(this)) + .width(this.itemWidth) + .onClick(this.clickNotificationItem.bind(this)) + + if (this.iconDisplay) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { + Image($r('app.media.delete')) //delete + .objectFit(ImageFit.Contain) + .width($r('app.float.item_delete_image_width')) + .height($r('app.float.item_delete_image_height')) + .onClick(() => { + this.removeNotificationItem(this.notificationHashCode) + }) + } + .width('30%') + } + } + } + + touchNotificationItem(event: TouchEvent) { + if (event.type == Constants.TOUCHTYPE_DOWN) { //down + this.startX = event.touches[0].x + this.startY = event.touches[0].y + Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`) + } else if (event.type == Constants.TOUCHTYPE_MOVE) { //move + this.moveX = event.touches[0].x - this.startX + this.moveY = event.touches[0].y - this.startY + } else if (event.type == Constants.TOUCHTYPE_UP) { //up + Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`) + if (this.iconDisplay) { + if (this.moveX > Constants.HIDDEN_TRANSLATEX) { + //hidden + this.iconDisplay = false; + this.itemWidth = '100%' + Log.showInfo(TAG, 'hidden'); + } + } else { + if (this.moveX < Constants.DISPLAY_TRANSLATEX) { + this.iconDisplay = true; + this.itemWidth = '70%' + Log.showInfo(TAG, 'display'); + } else if (this.moveX > Constants.REMOVE_TRANSLATEX) { + this.removeNotificationItem(this.notificationHashCode) + } + } + } + } + + removeNotificationItem(hashCode: string) { + Log.showInfo(TAG, 'removeNotificationItem'); + mNotificationService.removeNotificationItem(hashCode, true) + } + + clickNotificationItem() { + //close window + WindowManager.setWindowMin() + this.showStatusBar = true + //open app + Log.showInfo(TAG, `longitemClick wantAgent ${JSON.stringify(this.notificationWant)} id: ${this.notificationId}`); + let TriggerInfo = { + code: 0, + want: '', + permission: '', + extraInfo: {} + }; + WantAgent.trigger(this.notificationWant, TriggerInfo, ((err, data) => { + Log.showInfo(TAG, `longitemClick wantAgent trigger callback ${JSON.stringify(err)}`); + Log.showInfo(TAG, `longitemClick wantAgent trigger callback ${JSON.stringify(data)}`); + })); + //remove notification + this.removeNotificationItem(this.notificationHashCode) + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets new file mode 100644 index 00000000..b5b19d74 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets' +import titleItem from './titleItem' +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import mNotificationService from '../../../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' +import WantAgent from '@ohos.wantAgent' +import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets' + +const TAG = 'multiItem' + +@Component +export default +struct multiItem { + @Link showStatusBar: boolean + @Prop notificationId: string + @Prop notificationIcon: string + @Prop notificationHashCode: string + private notificationContent: string[] + @Prop notificationName: string + @Prop notificationTime: string + @Prop notificationTitle: string + @Prop notificationIconDisplay: string + private notificationWant: any + @State isExpand: boolean = false + @State srcIconDisplay: any = $r('app.media.down') + @State needExpand: boolean = false + @State iconDisplay: boolean = false; + @State itemWidth: string = '100%' + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 + + aboutToAppear() { + if (this.notificationContent.length > 1) { + this.needExpand = true; + } else { + this.needExpand = false; + } + } + + build() { + Row() { + Column() { + titleItem({ + notificationIcon: this.notificationIcon, + notificationName: this.notificationName, + notificationTime: this.notificationTime, + srcIconDisplay: $srcIconDisplay, + isExpand: $isExpand, + needExpand: this.needExpand + }) + + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.notificationTitle) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + if (this.isExpand) { + ForEach(this.notificationContent, + (item: string) => { + Text(`${item}`) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .margin({ top: $r('app.float.content_margin_top') }) + }, (item: string) => item.toString() + ) + } else { + Text(this.notificationContent[0]) + .fontSize($r('app.float.notification_content_fontsize')) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r('app.color.content_text_color')) + .margin({ top: $r('app.float.content_margin_top') }) + } + } + .width('100%') + .margin({ top: $r('app.float.body_margin_top') }) + + } + .backgroundColor($r('app.color.notificationitem_background')) + .opacity($r('app.float.item_opicaty')) + .borderRadius($r('app.float.item_borderradius')) + .margin({ + left: $r('app.float.item_marginleft'), + right: $r('app.float.item_marginright'), + top: $r('app.float.item_margintop') + }) + .padding({ + left: $r('app.float.item_paddingleft'), + right: $r('app.float.item_paddingright'), + bottom: $r('app.float.item_paddingbottom') + }) + .onTouch(this.touchNotificationItem.bind(this)) + .width(this.itemWidth) + .onClick(this.clickNotificationItem.bind(this)) + + if (this.iconDisplay) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { + Image($r('app.media.delete')) //delete + .objectFit(ImageFit.Contain) + .width($r('app.float.item_delete_image_width')) + .height($r('app.float.item_delete_image_height')) + .onClick(() => { + this.removeNotificationItem(this.notificationHashCode) + }) + } + .width('30%') + } + } + } + + touchNotificationItem(event: TouchEvent) { + if (event.type == Constants.TOUCHTYPE_DOWN) { //down + this.startX = event.touches[0].x + this.startY = event.touches[0].y + Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`) + } else if (event.type == Constants.TOUCHTYPE_MOVE) { //move + this.moveX = event.touches[0].x - this.startX + this.moveY = event.touches[0].y - this.startY + } else if (event.type == Constants.TOUCHTYPE_UP) { //up + Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`) + if (this.iconDisplay) { + if (this.moveX > Constants.HIDDEN_TRANSLATEX) { + //hidden + this.iconDisplay = false; + this.itemWidth = '100%' + Log.showInfo(TAG, 'hidden'); + } + } else { + if (this.moveX < Constants.DISPLAY_TRANSLATEX) { + this.iconDisplay = true; + this.itemWidth = '70%' + Log.showInfo(TAG, 'display'); + } else if (this.moveX > Constants.REMOVE_TRANSLATEX) { + this.removeNotificationItem(this.notificationHashCode) + } + } + } + } + + removeNotificationItem(hashCode: string) { + Log.showInfo(TAG, 'removeNotificationItem'); + mNotificationService.removeNotificationItem(hashCode, true) + } + + clickNotificationItem() { + //remove notification + this.removeNotificationItem(this.notificationHashCode) + //close window + WindowManager.setWindowMin() + this.showStatusBar = true + //open app + Log.showInfo(TAG, `longitemClick wantAgent ${JSON.stringify(this.notificationWant)}`); + let TriggerInfo = { + code: 0, + want: '', + permission: '', + extraInfo: {} + }; + WantAgent.trigger(this.notificationWant, TriggerInfo, ((err, data) => { + Log.showInfo(TAG, `longitemClick wantAgent trigger callback ${JSON.stringify(err)}`); + Log.showInfo(TAG, `longitemClick wantAgent trigger callback ${JSON.stringify(data)}`); + })); + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets new file mode 100644 index 00000000..83ebb5e1 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets' +import longItem from './longItem.ets' +import multiItem from './multiItem.ets' + +@Component +export default +struct notificationItem { + @Link showStatusBar: boolean + private itemObject: any + private normal: boolean = false; + private long: boolean = false; + private multi: boolean = false; + + aboutToAppear() { + switch (this.itemObject.type) { + case Constants.NOTIFICATION_TYPE_NORMAL: + this.normal = true; + break; + case Constants.NOTIFICATION_TYPE_LONG: + this.long = true; + break; + case Constants.NOTIFICATION_TYPE_MULTILINE: + this.multi = true; + break; + default: + break; + } + } + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + if (this.normal) { + longItem({ + notificationId: this.itemObject.id, + notificationIcon: this.itemObject.icon, + notificationHashCode: this.itemObject.hashcode, + notificationContent: this.itemObject.content, + notificationName: this.itemObject.name, + notificationTime: this.itemObject.time, + notificationTitle: this.itemObject.title, + notificationIconDisplay: this.itemObject.iconDisplay, + notificationWant: this.itemObject.want, + showStatusBar: $showStatusBar + }); + } + if (this.long) { + longItem({ + notificationId: this.itemObject.id, + notificationIcon: this.itemObject.icon, + notificationHashCode: this.itemObject.hashcode, + notificationContent: this.itemObject.content, + notificationName: this.itemObject.name, + notificationTime: this.itemObject.time, + notificationTitle: this.itemObject.title, + notificationIconDisplay: this.itemObject.iconDisplay, + notificationWant: this.itemObject.want, + showStatusBar: $showStatusBar + }); + } + if (this.multi) { + multiItem({ + notificationId: this.itemObject.id, + notificationIcon: this.itemObject.icon, + notificationHashCode: this.itemObject.hashcode, + notificationContent: this.itemObject.content, + notificationName: this.itemObject.name, + notificationTime: this.itemObject.time, + notificationTitle: this.itemObject.title, + notificationIconDisplay: this.itemObject.iconDisplay, + notificationWant: this.itemObject.want, + showStatusBar: $showStatusBar + }); + } + } + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets new file mode 100644 index 00000000..b655368e --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets' + +@Component +export default +struct titleItem { + @Prop notificationIcon: string + @Prop notificationName: string + @Prop notificationTime: string + @Link srcIconDisplay: any + @Link isExpand: boolean + @Prop needExpand: boolean + @State rowSpace: any = $r('app.float.titleitem_row_space') + + build() { + Row() { + Row({ space: this.rowSpace }) { + Image(this.notificationIcon) + .objectFit(ImageFit.Contain) + .width($r('app.float.title_image_width')) + .height($r('app.float.title_image_height')) + Text(this.notificationName) + .fontSize($r('app.float.title_name_fontsize')) + Text(this.notificationTime) + .fontSize($r('app.float.title_time_fontsize')) + } + .width('80%') + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End, alignItems: ItemAlign.Center }) { + if (this.needExpand) { + Image(this.srcIconDisplay) + .objectFit(ImageFit.Contain) + .width($r('app.float.displayicon_width')) + .height($r('app.float.displayicon_height')) + .onClick(() => { + if (this.isExpand) { + this.isExpand = false + this.srcIconDisplay = $r('app.media.down') + } else { + this.isExpand = true + this.srcIconDisplay = $r('app.media.up') + } + }) + } + } + .width('20%') + } + .height($r('app.float.titleitem_height')) + .width('100%') + + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/color.json b/features/noticeitem/src/main/resources/base/element/color.json new file mode 100644 index 00000000..c78aa2ca --- /dev/null +++ b/features/noticeitem/src/main/resources/base/element/color.json @@ -0,0 +1,20 @@ +{ + "color": [ + { + "name":"notificationitem_background", + "value":"#ffffff" + }, + { + "name":"title_text_color", + "value":"#222D37" + }, + { + "name":"content_text_color", + "value":"#FF435563" + }, + { + "name":"name_text_color", + "value":"#435563" + } + ] +} \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json new file mode 100644 index 00000000..26e73dab --- /dev/null +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -0,0 +1,108 @@ +{ + "float": [ + { + "name": "notification_title_fontsize", + "value": "20" + }, + { + "name": "notification_content_fontsize", + "value": "20" + }, + { + "name": "notification_content_lineheight", + "value": "20" + }, + { + "name": "notification_content_maxlines", + "value": "1" + }, + { + "name": "content_margin_top", + "value": "10" + }, + { + "name": "body_margin_top", + "value": "10" + }, + { + "name": "item_opicaty", + "value": "0.9" + }, + { + "name": "item_borderradius", + "value": "20" + }, + { + "name": "item_margintop", + "value": "10" + }, + { + "name": "item_marginleft", + "value": "10" + }, + { + "name": "item_marginright", + "value": "10" + }, + { + "name": "item_paddingleft", + "value": "20" + }, + { + "name": "item_paddingright", + "value": "20" + }, + { + "name": "item_paddingbottom", + "value": "20" + }, + { + "name": "item_setting_image_width", + "value": "30" + }, + { + "name": "item_setting_image_height", + "value": "30" + }, + { + "name": "item_delete_image_width", + "value": "30" + }, + { + "name": "item_delete_image_height", + "value": "30" + }, + { + "name": "titleitem_row_space", + "value": "10" + }, + { + "name": "titleitem_height", + "value": "50" + }, + { + "name": "title_image_width", + "value": "30" + }, + { + "name": "title_image_height", + "value": "30" + }, + { + "name": "title_name_fontsize", + "value": "20" + }, + { + "name": "title_time_fontsize", + "value": "20" + }, + { + "name": "displayicon_width", + "value": "20" + }, + { + "name": "displayicon_height", + "value": "20" + } + ] +} \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/string.json b/features/noticeitem/src/main/resources/base/element/string.json new file mode 100644 index 00000000..e21e833c --- /dev/null +++ b/features/noticeitem/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "noticeitem", + "value": "noticeitem" + } + ] +} diff --git a/features/noticeitem/src/main/resources/base/media/delete.png b/features/noticeitem/src/main/resources/base/media/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..dda4e870d8a4cffbcf2cc44a98732ca3de8e68e0 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpT2B|pkcwMxr)}gtqQK+&QnJac zIv^ljPb@*e{|L*?2eFJhJDeT*vi$`2Grw7$uXr?4u3x+7AJ41(dKZ{yh18E@Ra?6NQ8>LqFKUuIqx7E5kdzSm3D^u7znVZwtljVU9XYh3Ob6Mw<&;$Txl~(@% literal 0 HcmV?d00001 diff --git a/features/noticeitem/src/main/resources/base/media/down.png b/features/noticeitem/src/main/resources/base/media/down.png new file mode 100644 index 0000000000000000000000000000000000000000..96bb34d432253a883df1288da2fe87f76502e693 GIT binary patch literal 509 zcmVk z7=pwlxg~ji@AL2fH-ig5?85V*2B;ON71&dt)9Ktc8jZG;a(vE+a?VHA+GIYTf2RBH z0SFGEIyFn1p z@D?Ke7-M=#k}SLcsE8n%&1M1sSBN+>#`Ni1?tCdd*XUvd$QLasQsB zl(eq!@dC&uW4&JAWiJ$WfqfJ?K99s3z(H)!b|)FWj;{>h+)WT|L`;k^8&ig1xN$rp z{u*PtzG+=e_-w=Zi7}o}|FGY1;8c$tZ(3`Uuhu z34-1a#j7^au8^JxSwkU zi;6;{m4lb6A|ty3Bd5m#z7r~&IWren|E{`m`pwSS-@lexG0#1J!E!!J3iC||vkluD zFN)ucj?JiM5UczCfOCR?)`FJ#G9Oq}T9|(D#mf{hsJLh+$kvq|V4fhL+YtZo+qJSc z!5$qN3EF%9FbF9zb+nxBkXoP`r@q_Pq1xje8*eEz@BcRc-^M@6VNXVp00i_>zopr0FcjH-~a#s literal 0 HcmV?d00001 diff --git a/features/noticeitem/src/main/resources/en_US/element/string.json b/features/noticeitem/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..e21e833c --- /dev/null +++ b/features/noticeitem/src/main/resources/en_US/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "noticeitem", + "value": "noticeitem" + } + ] +} diff --git a/features/noticeitem/src/main/resources/zh_CN/element/string.json b/features/noticeitem/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..e21e833c --- /dev/null +++ b/features/noticeitem/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "noticeitem", + "value": "noticeitem" + } + ] +} diff --git a/features/notificationservice/build.gradle b/features/notificationservice/build.gradle new file mode 100644 index 00000000..b43ede7f --- /dev/null +++ b/features/notificationservice/build.gradle @@ -0,0 +1,23 @@ +import java.nio.file.Files +import java.nio.file.Paths + +apply plugin: 'com.huawei.ohos.library' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 6 + defaultConfig { + compatibleSdkVersion 4 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} \ No newline at end of file diff --git a/features/notificationservice/src/main/config.json b/features/notificationservice/src/main/config.json new file mode 100644 index 00000000..9e40ebba --- /dev/null +++ b/features/notificationservice/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": { + }, + "module": { + "package": "com.ohos.notificationservice", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "notificationservice", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets new file mode 100644 index 00000000..3c357e14 --- /dev/null +++ b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2021 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 Notification from '@ohos.notification'; +import BundleMgr from '@ohos.bundle'; +import Resmgr from '@ohos.resourcemanager'; +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' + +const TAG = 'NotificationService' + +let mAppStorage = AppStorage.GetOrCreate() +let mNotificationList +let mSubscriber; +let mDate; +let mAppName; +let mEmptyArray; + +/** + * Responsible for notification binding and interaction between View and Model. + */ +export class NotificationService { + + constructor() { + mAppStorage = AppStorage.GetOrCreate() + let tempLink = mAppStorage.setAndLink('notificationList', []) + mNotificationList = tempLink.get() + Log.showInfo(TAG, `NotificationService constructor ${JSON.stringify(mNotificationList)}`) + } + + initNotificationService() { + Log.showInfo(TAG, 'initNotificationCenter') + mDate = new Date(); + mAppName = new Map(); + mEmptyArray = []; + if (mSubscriber == undefined || mSubscriber == null) { + this.createNotificationCallback(); + Log.showInfo(TAG, `initNotificationCenter, if: ${JSON.stringify(mSubscriber)}`); + } + } + + updateNotification() { + Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(mNotificationList)}`); + Log.showInfo(TAG, `updateNotification len: ${mNotificationList.length}`); + let listLink = mAppStorage.link('notificationList') + listLink.set(mNotificationList) + } + + /** + * Call the method to receive notification events. + */ + createNotificationCallback() { + Log.showInfo(TAG, 'createNotificationCallback enter ===================='); + mSubscriber = { + onConsumed: this.consumeCallback.bind(this), + onCanceled: this.OnCancelCallback.bind(this) + } + Log.showInfo(TAG, `createNotificationCallback, ${JSON.stringify(mSubscriber)}`); + Log.showInfo(TAG, `createNotificationCallback, ${JSON.stringify(mSubscriber.onConsumed)}`); + Log.showInfo(TAG, `createNotificationCallback, ${JSON.stringify(mSubscriber.onCanceled)}`); + Notification.subscribe(mSubscriber, this.subscribeCallback.bind(this)); + Log.showInfo(TAG, 'createNotificationCallback end ===================='); + } + + /** + * Call the method before current process finished. + */ + async unRegisterNotificationSubscriber() { + if (mSubscriber != undefined && mSubscriber != null) { + await Notification.unsubscribe(mSubscriber); + } + } + + /** + * The callback method that will be called after receiving a notification. + * + * @param {Object} err - Error may occur. + * @param {Object} data - Callback data. + */ + consumeCallback(err, data) { + Log.showInfo(TAG, 'consumeCallback started ===================='); + Log.showInfo(TAG, JSON.stringify(data.request?.wantAgent)); + Log.showInfo(TAG, JSON.stringify(data)); + + let contentType = data?.request?.content?.contentType; + if (contentType == null || contentType == undefined) { + Log.showInfo(TAG, 'consumeCallback contentType is empty'); + return; + } + Log.showInfo(TAG, `contentType is : ${contentType}`); + let request = data.request; + let want = data.request.wantAgent; + let standardTime = this.getStandardTime(request.deliveryTime); + let bundleName = request.creatorBundleName + this.getAppName(bundleName, (AppName) => { + Log.showInfo(TAG, `notificationItem = ${want}`); + Log.showInfo(TAG, `notificationItem = ${AppName}`); + let appName = AppName.appName; + let icon = AppName.icon; + Log.showInfo(TAG, `appName = ${appName}`); + Log.showInfo(TAG, `icon = ${icon}`); + let notificationItem = { + 'id': request.id, + 'hashcode': request.hashCode, + 'type': contentType + '', + 'timestamp': request.deliveryTime, + 'time': standardTime, + 'name': appName, + 'want': want, + 'icon': icon, + 'bundleName': bundleName + }; + Log.showInfo(TAG, `notificationItem = ${JSON.stringify(notificationItem)}`); + switch (contentType) { + case Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT: + + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_BASIC_TEXT ====================`); + notificationItem['title'] = request.content.normal?.title ?? ''; + notificationItem['content'] = request.content.normal?.text ?? ''; + notificationItem['additionalText'] = request.content.normal?.additionalText ?? ''; + break; + case Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_LONG_TEXT ====================`); + notificationItem['title'] = request.content.longText?.expandedTitle ?? ''; + notificationItem['content'] = request.content.longText?.longText ?? ''; + notificationItem['additionalText'] = request.content.longText?.briefText ?? ''; + break; + case Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_MULTILINE ====================`); + notificationItem['title'] = request.content.multiLine?.longTitle ?? ''; + notificationItem['content'] = request.content.multiLine?.lines ?? mEmptyArray; + notificationItem['additionalText'] = request.content.multiLine?.briefText ?? ''; + break; + default: + Log.showInfo(TAG, 'no contentType match ===================='); + break; + } + Log.showInfo(TAG, `notificationItem = ${JSON.stringify(notificationItem)}`); + this.removeNotificationItem(notificationItem['hashcode'],false); + mNotificationList.unshift(notificationItem); + this.updateNotification(); + Log.showInfo(TAG, 'consumeCallback finished ===================='); + }); + } + + /** + * Get app name with bundleName. + * + * @param {string} bundleName - BundleName of the target app. + */ + getAppName(bundleName, callback) { + Log.showInfo(TAG, 'getAppName start ===================='); + if (mAppName.has(bundleName)) { + callback(mAppName.get(bundleName)); + Log.showInfo(TAG, 'HAS BUNDLENAME'); + } else { + BundleMgr.getBundleInfo(bundleName, 0) + .then((data) => { + Log.showInfo(TAG, `getBundleInfo` + JSON.stringify(data)); + let labelId = data.appInfo.labelId; + let iconId = data.appInfo.iconId; + let appName = ''; + Resmgr.getResourceManager(bundleName) + .then((item) => { + Log.showInfo(TAG, `Resmgr.getResourceManager ${Resmgr.getResourceManager}`); + item.getString(labelId, (error, value) => { + Log.showInfo(TAG, `getString` + JSON.stringify(value)); + if (value != null && value != undefined) { + appName = value + } + item.getMediaBase64(iconId, (error, MediaValue) => { + Log.showInfo(TAG, `getMediaBase64` + JSON.stringify(MediaValue)); + if (MediaValue != null) { + let appMessage = { + 'appName': appName, + 'icon': MediaValue + } + if (appName != null && appName != undefined && appName != '') { + mAppName.set(bundleName, appMessage); + } + callback(appMessage); + } + }); + }) + }) + }); + Log.showInfo(TAG, 'getAppName end ===================='); + } + } + + /** + * notification CancelCallback + * + * @param {Object} err - return err Message. + * @param {Object} data - return data Message. + */ + OnCancelCallback(err, data) { + console.info("================>OnCancelCallback err : =======================> " + JSON.stringify(err)); + console.info("================>OnCancelCallback data : =======================> " + JSON.stringify(data)); + this.removeNotificationItem(data.request.hashCode,false); + } + + onUpdateCallback(err, data) { + Log.showInfo(TAG, `onUpdateCallback = ${JSON.stringify(data.request)}`); + } + + + /** + * The callback will be called after registered callback. + * + * @param {Object} err - Error may occur. + * @param {Object} data - Callback data. + */ + subscribeCallback(err, data) { + Log.showInfo(TAG, 'subscribeCallback finished ===================='); + Log.showInfo(TAG, `subscribeCallback err: ${JSON.stringify(err)}`) + Log.showInfo(TAG, `subscribeCallback data: ${JSON.stringify(data)}`) + } + + /** + * Reformat the timestamp to hh:mm. + * + * @param {number} timestamp - Target timestamp. + */ + getStandardTime(timestamp) { + Log.showInfo(TAG, 'getStandardTime start ===================='); + if (timestamp == 0 || timestamp == undefined || timestamp == null) { + return ''; + } + mDate.setTime(timestamp); + let hoursNumber = mDate.getHours(); + let minutesNumber = mDate.getMinutes(); + let hours = hoursNumber < 10 ? '0' + hoursNumber : hoursNumber; + let minutes = minutesNumber < 10 ? '0' + minutesNumber : minutesNumber; + return hours + ':' + minutes; + } + + /** + * Compare method will be used when sorting a two-dimensional array. + * + * @param {string} property - Property in the object will be sorted. + */ + compare(property) { + return function (a, b) { + var value1 = a[property]; + var value2 = b[property]; + return value1 - value2; + } + } + + /** + * Remove all notifications. + */ + removeAllNotifications() { + mNotificationList = [] + this.updateNotification() + Notification.removeAll((err, data) => { + Log.showInfo(TAG, `removeAll , err: ${JSON.stringify(err)}`); + Log.showInfo(TAG, `removeAll , data: ${JSON.stringify(data)}`); + }); + } + + removeNotificationItem(hashCode,isDelSysConent) { + Log.showInfo(TAG, `removeNotificationItem start, hashCode: ${hashCode}`); + for (let i = 0, len = mNotificationList.length; i < len; i++) { + if (mNotificationList[i].hashcode == hashCode) { + Log.showInfo(TAG, `removeNotificationItem i = ${i}`); + mNotificationList.splice(i, 1); + break; + } + } + this.updateNotification() + if(isDelSysConent){ + this.removeSysNotificationItem(hashCode); + } + } + removeSysNotificationItem(hashCode){ + Notification.remove(hashCode, (err, data) => { + Log.showInfo(TAG, `removeNotificationItem, err: ${JSON.stringify(err)}`); + Log.showInfo(TAG, `removeNotificationItem, data: ${JSON.stringify(data)}`); + }) + Log.showInfo(TAG, `removeNotificationItem end, length: ${mNotificationList.length}`); + } +} + +let notificationService = new NotificationService(); +export default notificationService as NotificationService; \ No newline at end of file diff --git a/features/notificationservice/src/main/resources/base/element/string.json b/features/notificationservice/src/main/resources/base/element/string.json new file mode 100644 index 00000000..04635cab --- /dev/null +++ b/features/notificationservice/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "quicklysetting_library", + "value": "quicklysetting_library" + } + ] +} diff --git a/features/signalcomponent/build.gradle b/features/signalcomponent/build.gradle new file mode 100644 index 00000000..504e3833 --- /dev/null +++ b/features/signalcomponent/build.gradle @@ -0,0 +1,22 @@ +import java.nio.file.Files +import java.nio.file.Paths + +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion 6 + defaultConfig { + compatibleSdkVersion 4 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/config.json b/features/signalcomponent/src/main/config.json new file mode 100644 index 00000000..d266ddcd --- /dev/null +++ b/features/signalcomponent/src/main/config.json @@ -0,0 +1,22 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.signalcomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "signalcomponent", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/app.js b/features/signalcomponent/src/main/ets/default/app.ets similarity index 78% rename from navigationBar/src/main/js/default/app.js rename to features/signalcomponent/src/main/ets/default/app.ets index 2d927855..4d568aa2 100644 --- a/navigationBar/src/main/js/default/app.js +++ b/features/signalcomponent/src/main/ets/default/app.ets @@ -13,15 +13,11 @@ * limitations under the License. */ -import mLog from '../default/common/utils/Log.js'; - -const TAG = 'app'; - export default { onCreate() { - mLog.showInfo(TAG, `Application onCreate`); + console.info('SystemUI statusBar Application onDestroy') }, onDestroy() { - mLog.showInfo(TAG, `Application onDestroy`); - } -}; + console.info('SystemUI statusBar Application onDestroy') + }, +} diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ets b/features/signalcomponent/src/main/ets/default/common/constants.ets new file mode 100644 index 00000000..c396638e --- /dev/null +++ b/features/signalcomponent/src/main/ets/default/common/constants.ets @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 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 default class Constants { + + static NETWORK_TYPE_UNKNOWN = 0; + static NETWORK_TYPE_GSM = 1; + static NETWORK_TYPE_CDMA = 2; + static NETWORK_TYPE_WCDMA = 3; + static NETWORK_TYPE_TDSCDMA = 4; + static NETWORK_TYPE_LTE = 5; + static NETWORK_TYPE_NR = 6; + + static CELLULAR_SIGNAL_NO = 0; + static CELLULAR_SIGNAL_MIN = 1; + static CELLULAR_SIGNAL_LOW = 2; + static CELLULAR_SIGNAL_HALF = 3; + static CELLULAR_SIGNAL_HIGH = 4; + static CELLULAR_SIGNAL_FULL = 5; + static CELLULAR_NO_SIM_CARD = -1; + + static NET_CHINA_MOBILE = 'CHINA MOBILE'; + static NET_CHINA_TELECOM = 'China Telecom'; + static NET_CHN_UNICOM = 'CHN-UNICOM'; + static NET_NULL = ''; +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets new file mode 100644 index 00000000..f994cb9c --- /dev/null +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets'; +import mSignalModel from '../SignalModel.ets'; + +@Component +export default +struct SignalIcon { + @StorageLink('cellularLevel') cellularLevel : number = 0 + @StorageLink('cellularType') cellularType : number = 0 + @StorageLink('networkState') networkState : string = Constants.NET_NULL + + aboutToAppear() { + mSignalModel.initSignalModel(); + } + + aboutToDisappear() { + mSignalModel.uninitSignalModel(); + } + + build() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text(this.updateNetworkState(this.networkState)) + .fontSize($r('app.float.fontSize_network_state')) + .fontColor($r('app.color.font_color_white')) + .flexShrink(0) + .maxLines(1) + + Stack({ alignContent: Alignment.TopStart }) { + Text(this.updateCellularType(this.cellularType)) + .fontSize($r('app.float.fontSize_cellular_type')) + .fontColor($r('app.color.font_color_white')) + .margin({ top: $r('app.float.margin_cellular_type') }) + Image(this.updateCellularImage(this.cellularLevel)) + .objectFit(ImageFit.ScaleDown) + }.flexShrink(1) + } + .width($r('app.float.signalicon_width')) + .height('50%') + } + +/** + * Get the string of cellular type + * + * @param {number} type - number of cellular type + * @return {string} typeString type of cellular type + */ + private updateCellularType(signalType) : string { + let typeString; + switch (signalType) { + case Constants.NETWORK_TYPE_UNKNOWN: + typeString = ''; + break; + case Constants.NETWORK_TYPE_GSM: + case Constants.NETWORK_TYPE_CDMA: + typeString = $r('app.string.2G'); + break; + case Constants.NETWORK_TYPE_WCDMA: + case Constants.NETWORK_TYPE_TDSCDMA: + typeString = $r('app.string.3G'); + break; + case Constants.NETWORK_TYPE_LTE: + typeString = $r('app.string.4G'); + break; + case Constants.NETWORK_TYPE_NR: + default: + typeString = $r('app.string.5G'); + break; + } + return typeString; + } + +/** + * Get the cellular signal image + * + * @param {number} level - signal level from status center + * @return {string} cellularImage image of cellular signal + */ + private updateCellularImage(level) { + console.info('systemui updateCellularImage = ' + level); + let cellularImage; + switch (level) { + case Constants.CELLULAR_SIGNAL_NO: + cellularImage = $r('app.media.ic_statusbar_signal_no'); + break; + case Constants.CELLULAR_SIGNAL_MIN: + cellularImage = $r('app.media.ic_statusbar_signal_1'); + break; + case Constants.CELLULAR_SIGNAL_LOW: + cellularImage = $r('app.media.ic_statusbar_signal_2'); + break; + case Constants.CELLULAR_SIGNAL_HALF: + cellularImage = $r('app.media.ic_statusbar_signal_3'); + break; + case Constants.CELLULAR_SIGNAL_HIGH: + cellularImage = $r('app.media.ic_statusbar_signal_4'); + break; + case Constants.CELLULAR_SIGNAL_FULL: + cellularImage = $r('app.media.ic_statusbar_signal_full'); + break; + case Constants.CELLULAR_NO_SIM_CARD: + default: + cellularImage = $r('app.media.ic_statusbar_signal_null'); + break; + } + console.info('systemui updateCellularImage = ' + cellularImage); + return cellularImage; + } + +/** + * Get the NetworkState signal name + * + * @param {number} level - signal level from status center + */ + private updateNetworkState(netWorkState) { + let netWorkStateName; + switch (netWorkState) { + case Constants.NET_CHINA_MOBILE: + netWorkStateName = $r('app.string.china_mobile'); + break; + case Constants.NET_CHINA_TELECOM: + netWorkStateName = $r('app.string.china_telecom'); + break; + case Constants.NET_CHN_UNICOM: + netWorkStateName = $r('app.string.china_unicom'); + break; + case Constants.NET_NULL: + default: + netWorkStateName = $r('app.string.net_null'); + break; + } + return netWorkStateName; + } +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ets b/features/signalcomponent/src/main/ets/default/signalModel.ets new file mode 100644 index 00000000..3ff1ed97 --- /dev/null +++ b/features/signalcomponent/src/main/ets/default/signalModel.ets @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2021 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 Radio from '@ohos.telephony_radio'; +import Sim from '@ohos.telephony_sim' +import Observer from '@ohos.telephony_observer'; +import Log from "../../../../../../common/src/main/ets/default/Log.ets"; +import CheckEmpty from '../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import Constants from './common/constants.ets' + +const TAG = 'signalStatus'; +const EMPTY_LEVEL = 0; + +var mAppStorage = AppStorage.GetOrCreate(); +let mSignalCallback; +let signalValue = { + cellularLevel: '', + cellularType: '', + networkState: '' +}; + +var mLevelLink +var mTypeLink +var mStateLink + +export class SignalModel + +{ + + initSignalModel() { + mLevelLink = mAppStorage.setAndLink('cellularLevel', ''); + mTypeLink = mAppStorage.setAndLink('cellularType', ''); + mStateLink = mAppStorage.setAndLink('networkState', ''); + this.initObserver(); + this.checkCellularStatus(); + } + + uninitSignalModel() { + this.unInitObserver(); + } + + /** + * Check the connection type and signal level of cellular network + */ + checkCellularStatus() { + let cellularStatus; + let slotId = 0; + Log.showInfo(TAG, 'enter checkCellularStatus ============'); + + Sim.hasSimCard(slotId, (err, value) => { + if (value === true) { + //The interface of getting the cellular signal status is unavailable temporarily + Radio.getSignalInformation(slotId, (err, value) => { + if (err) { + // Failed to call the interface,error is not null + Log.showError(TAG, `failed to getSimState because ${err.message}`); + // When failed to call the interface, set the result as no signal + mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); + mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); + } else { + // Call interface succeed,error is null + Log.showInfo(TAG, `success to getSignalInformation: ${JSON.stringify(value)}`); + // Since the value might be empty, set it as no signal by hand + if (CheckEmpty.isEmpty(value)) { + Log.showError(TAG, 'value from api is empty, set 0'); + mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); + mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); + }else{ + mLevelLink.set(value[0].signalLevel); + mTypeLink.set(value[0].signalType); + } + } + + Log.showInfo(TAG, 'enter checknetworkState ============'); + //The interface of getting the cellular signal status is unavailable temporarily + Radio.getnetworkState(slotId,(err, value) => { + if (err) { + // Failed to call the interface,error is not null + Log.showError(TAG, `failed to getnetworkState because ${err.message}`); + // When failed to call the interface, set the result as no signal + mStateLink.set(Constants.NET_NULL); + } else { + // Call interface succeed,error is null + Log.showInfo(TAG, `success to getnetworkState: ${JSON.stringify(value)}`); + // Since the value might be empty, set it as no signal by hand + if (CheckEmpty.isEmpty(value)) { + Log.showError(TAG, 'value from api is empty, set 0'); + mStateLink.set(Constants.NET_NULL); + }else{ + mStateLink.set(value.longOperatorName); + } + } + }); + }); + } else { + mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); + mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); + mStateLink.set(Constants.NET_NULL); + } + }); + + + } + + /** + * init the observer of the cellular and signal + */ + initObserver() { + Observer.on('signalInfoChange', { slotId: 0 }, (err, value) => { + if (err.code != 0) { + this.checkCellularStatus(); + } else { + Log.showError(TAG, `failed, because ${JSON.stringify(err)}`); + } + }); + } + + /** + * Uninit the observer of the cellular and signal + */ + unInitObserver() { + Observer.off('signalInfoChange', (err, value) => { + if (err.code != 0) { + Log.showInfo(TAG, `success: ${JSON.stringify(value)}`); + } else { + Log.showError(TAG, `failed, because ${JSON.stringify(err)}`); + } + }); + } + } + + let mSignalModel = new SignalModel(); + export default mSignalModel as SignalModel; \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/base/element/color.json b/features/signalcomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..e94c75cd --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "font_color_white", + "value": "#fff" + } + ] +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/base/element/float.json b/features/signalcomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..a287d77e --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/element/float.json @@ -0,0 +1,36 @@ +{ + "float":[ + { + "name":"fontSize_network_state", + "value":"14" + }, + { + "name":"fontSize_cellular_type", + "value":"8" + }, + { + "name":"shrink_network_state", + "value":"0" + }, + { + "name":"shrink_cellular_type", + "value":"1" + }, + { + "name":"maxLine_network_state", + "value":"1" + }, + { + "name":"margin_cellular_type", + "value":"1" + }, + { + "name":"signalicon_width", + "value":"120" + }, + { + "name":"signalicon_height", + "value":"50%" + } + ] +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/base/element/string.json b/features/signalcomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..721daed1 --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/element/string.json @@ -0,0 +1,44 @@ +{ + "string": [ + { + "name": "signalcomponent", + "value": "signalcomponent" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "china_mobile", + "value": "中国移动" + }, + { + "name": "china_telecom", + "value": "中国电信" + }, + { + "name": "china_unicom", + "value": "中国联通" + }, + { + "name": "net_null", + "value": "没有 SIM 卡" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + } + ] +} diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.png b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.png new file mode 100644 index 0000000000000000000000000000000000000000..682eb1a3b5292c03954e20309c05f84811101ea5 GIT binary patch literal 569 zcmV-90>=G`P)Px$^GQTORA>e5S-naGF%Z605mZnF75}if#==4it$hY--{{`KM-Y4kE3vb&u@F29 zE!DyU5zcQk-i^az2#Y{;+&Yk4ZT?UDgl}S#b1SXm7vRFY?2$g0DlO90m{k4xWS^C;n7C6?u z&@DvZ7a^30uBrR6uzAfBN`S!gCT-rAL=Pp91XP_#l|Y?rr5Nj60UXR}$UbB(1%S{w ztpos?%HtK}2J#5|G&Epre=7k5Bfv){=q#>1qqpYbBCsWpZVEfQ=^~IFpbLPDz^jJwtidRpO7vB=NSFMJkFR-YMPx%1W80eRA>e5S-naGF%aHW5!6OO#Xl5mECdfhYhU54eF|U0!Z#3~K=c)?#O@j! z3qdWk^QZ7Yg!3CnLKt>;b~l^NDhUk9?961oZ?ehV<&q?}Sbm&gM{s5pS6z~U-xXU6jmi4d$&z6BfgC{uad6>FNzy?p)xo-G$ zm4E>#4gNfV+@+D2H(|$SrFVS_@`_FRRcFp%1OR>;fHxKBE$G*ENQ8Wa?30BGNvl!0 zg(SdNpX;T_gd|W3pyU(@NEPyJul3%Q1*MM3HTVx9_c&#~%f^=V^F{#R=Kx~Q0y2Z~ zt)(|I^tlJ-8NvmoH=_C^z~}bz)tx74q$+Jr5(%_f?W|l*D}a+`7czjnK~A$0_?GokU=jAzfj5a8)7@9H0b1BJjZ` z_!M;8|A+Zj(IsCqwM5_op6|vxNzSY>4Q-wL$X_?Q)3<>zG+ YFBx8Vg^O7+Hvj+t07*qoM6N<$g6H!6Px%5J^NqRA>e5S-nccKoCw;6s^QU`~d|KECde=Z7sykB3JtqzJ`VP0^$?s`3hFH z*Vqbbp`Aa4Hp2N0WaHd$x!KERlPJ6Ju`}73+3%aZ#4{H~VT2BZ4ulSb4mflmcF6Ub z+UxaZu)zZG702;&-e!#ykdog6>4}v1Jw)6M5-~RDVgs%%f`cJXbXM{>HB|s7Pu!)S z>1nEfjG$)xc>%dcqbVoQ|QLAAp*j?h`R#J7shqi zhc>yR#P~dceMX)*9gITEHrA(rDM4aV_@%f$1(ZTiD-r}~9rC^IbOLzNYy(~36*%=x zc2IpM0VsF@w18RQ7$OqPl@3<{TY|0h#d7(ss{r#y$}n@SXX;qbm2YUx%rfx*3&4#z z4zz%I%cfKsHuMBQnqKeS0$tz<{!yjuEH)b|0Qp3CC#^%@WlmDNF_R`>SukA^e(kO% zpmu^90ZqWWDDa{9Jf7Q>CUd_|OWOLFymZkmvyVrM-J9zTY3#c~mfH!B?e2r|ZCzw`&4%YiNvdGPSwTN7+A2^6Z k7@-591EB+<1BE;A1E}hN9$>h+lmGw#07*qoM6N<$f<5~Sp8x;= literal 0 HcmV?d00001 diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.png b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.png new file mode 100644 index 0000000000000000000000000000000000000000..c9dd4399cbbc7ef49da00ee253951196b9008e64 GIT binary patch literal 576 zcmV-G0>AxPx$`bk7VRA>e5nY~KHKoG|h6$J|w3-JTAvG%ag)8CI^3lh{rM!Q)L%haBU3?2A*&>tC-p6u<Y=E0|^qZWGtpMOJ2^`jkJ;1NLQO5~uOaP$HEU+cC zdzSCqY*N4iqg-UZliQ>KCqOAk1xOW&-5+%Y=rIW!!1}P|7-FKm2LQYe;9Hp4Fm9uL z99l%o6*#ouiTfxtJmrfiV2%OLGCznLQ$P?vDTxY@DipilYX$J6*@X>ZZ!p@N)qZ#h z0PQub1EbB@IYiL*xYom0zz(D3KI;ze`U)^FDMRL)&*X7F*FK>$nPcGp7l0dc8rFfW zI2NVWu(2xuX!^W&4;#W>;Gfn?=P=n=0T@rfdwCw(%UtB`)|?~(8;o?F`Hj1hfW`qO z07<|HOYkZ9cD&uDVUvvgX7g~r=#~WBAo9J4PLeCDO-Px$=1D|BRA>e5SvyVxF%ZoH0*L|;1qDdZP!mzW1rQxY5G5ri;0DwbQEreM5N<)6 zD*y-JbAjc}Y8?$jc5PwLI-s#M^30As^WN;P*KvA1YgPfPfK|XM5K)05Vy^1cvMl$J z;1cp&6vd-zvedx|JmekX+Awtv)p$UC>yX#|M^nP3CP(J$n)uxI9?5|{z>DSw{8 zijSeDAJ6vy@ed#qtTZp0xst~Q_#t~y-=Nd7SvBZ)%vY(-C;Oa_&zd za%GV#PY{Wm1cCti1{ncgg|z*ucL2-B05XA$Aln*b)V>1%dxQ~=W78}pS3GO>j7>q1%;QuFp7jqfXhwKCvrPE=p zcL1Q*f#wM^g}lPP?i5`>vQ`3^Pk>MAIJB3!ul0rLd<6Cc(p_O^H+=-M1M~s#5s-(f zpCX{N`FO6=G&xqPx$%Sl8*RA>e5Sv^YxF%Z2K!7uOw6cokc8bKQi8!LairJaq9g~f4j{sIp~Sl>Wg z=7!yy>?U&?VHO55n`Gv_mt@$F$;2;Lz!h)>T!91ys)V_wQ|r3kM}l+MvZ|^@SF$1r z1n^G)y&ZsmfW%uHiLJJq1>Cy;hClEG=ei41sRTH9!Y=)WPpJeNfLi0<6X;wTjd_lK z99G)vd$3O&(yt*gM>X9+J9cjDI5PqOe*zE>49Ef6FU-%k zwx~F%1PDC8q|f_I+NlIgK=ldg1p26DF;-mx9L$QU4Q$5(Kx)jjWfY*P{}FZ!gIm9% zRL)bA=A5ssz-0hWIq6yEmKr5p8i8E_wzzGi5fJ#xb2S1#0&*X}&sa*s$Md%ATY;nz zpzrcL*lcAso`0B68@P;ek3b+EUK#Bstdz@|c T54}mU00000NkvXXu0mjfR3PJd literal 0 HcmV?d00001 diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_null.png b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_null.png new file mode 100644 index 0000000000000000000000000000000000000000..393332d93db62b4edccc026035b563d717cfc227 GIT binary patch literal 802 zcmV+-1Ks?IP)Px%+(|@1RA>e5n7xY>K@i1vR8UX+I8g9Vyv0b=K>Wl&^a2qBGlL5Z)PKm>%s?R8|4Fod}y>}9Y4B->yn zB*>%UZ-YAp&e(mezQY<7`X%PFV*V848VN@v7?-gJpbsQF!TFIE|3|03%cMDB^pYAP z@QmoMW`!ehg}DLf11B3O&z%uD+TxYUx5w#g31nHO;#YuA;uUj!;ADuhLi`Um(bZT> zKt)j0M+TpSt#62NgSgLjvMW7EK!p?}?oTLcwQ2F(qa~nDvoIldaQd$Z6c_gKgltdn zm%7u0xY9Ih)LAY9jn}aokq8nXvEOY8j%@BRuZHkL+ zN#yw7oA^%D+Q&wbFZo#9q>{7XDfV|;l}O;fz}zZ$gS~G3UFfw0RDeh@2$h0gci~Z$ z6LPwk$H5l(MC`AsxR|*hfu_kRev!3mlTP-bymrQ{#?T#z*+(7B$`NbKN^g^ZpF5jX z(Ke62iS_*#dLr_WD&C53 zTVE@BEP+;vnkH!?FwJST5gU90bec@v2JCL5fY_Y1ZIq(rzX}ck%=|5_@=NTdvs@o~ z0>_HtwWof|oR%_A5+bn2D|YTaMj--T{qtvr2yA;LPh(FLt8Hw&)qP*7q!0nUF4|<9 zrPciYF}C6q@1)JOZjaH$92->%oku^^^iQj;;{CT2hF|Z!d%-vSKdrOPwRWGRrxQpg gkWL_-K;skm10%@>ZUgv9T>t<807*qoM6N<$f@*7dc>n+a literal 0 HcmV?d00001 diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png new file mode 100644 index 0000000000000000000000000000000000000000..c37dc10f00c0b991f31faf014841cf015c33684c GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T|AsMW1 zr|r*Tauhgb>uGgStNy^P_6?#FMVve)-}~+{vHSx2h4Kqd0!I#AJEhio!_(qmL#x@T zpSs)Gn>|we64(6@yY@40Z{hx*ckd+W9d~3>abQv@U~YV{|Bgo2svr9l-`#Z7H*j|p z$T?bNrpoo>*dCL*jT+p>+6wcFo{K;E8sK7>`tR-~6V@#ovL%b(l-Ikism>KMVSRJ) zySBw!uI-`=eU~h2IPySIu!9xIT*dHZkM-7jEti*GxH;KC$A6)~_3Se#ISTXE#@cJ} z*mPF+UzlH^?zAyY$yC>*_3)C^811vZGV^m+X)fr!(|5kS@_qXL)S{J|2P9=Urpr6c z_6%iw@l)QS^ndG}6%SSQj$V2f9NMt`=J$_+8#B{w?^*gX&dgezef&j$z`ROZ$3KTk m{2!cOZ#aR06Bo+hn8VPgo36`mR;~mLZ3a(QKbLh*2~7YkC#n4a literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_wait.png b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png similarity index 100% rename from entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_wait.png rename to features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a905dfc0f9c219e48db7edb5ca93b1041766f5 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g;!3HGxU+kX;q!^2X+?^QKos)S9a~60+7BevL9R^{>w;^3X z&tcIc38B^<9WJX2SbJUOI4-=R?dq7gXZz<9H|CyL=e05ZQ|h<+|7YgkRMpV3nV zx}zc3^^8>kYjoGA=EK<@@49B>=A@)`?U}M=*@1(W(3wAXhqV%sM z<);f5H`OeQzHv>={)WIo?mrH>N8z90L;+t&5DvDvqxncelwvtDnm{r-UW|#=MI2 literal 0 HcmV?d00001 diff --git a/features/signalcomponent/src/main/resources/base/media/icon.png b/features/signalcomponent/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { + Log.showInfo(TAG, `unregister Wifi Status Listener ===============`); + }); + } + + /** + * Check the connection status of Wifi + * + * @param {boolean} status - if display wifi icon + */ + private changeWifiStatus(status) { + Log.showInfo(TAG, `enter changeWifiStatus ================ ${status}`); + mWifiStatus.set(status) + } + + private updateWifiInfo(rssi=Constants.UPDATE_WIFIINFO_DEFAULT_PARAM,band=Constants.SIGNALEVEL) { + Log.showInfo(TAG, `enter changeWifiInfos ================ ${rssi}+${band}`); + mWifiInfo.set(this.getWifiInfo(rssi,band)) + } + + private updateWifiName(name) { + Log.showInfo(TAG, `enter changeWifiNames ================ ${name}`); + mWifiName.set(name); + } + + + /** + * Update the image of wifi status + * + * @param {number} rssi - the rssi number of the connected wifi + * @return {string} image used to show wifi status + */ + private getWifiInfo(rssi,band) { + //The current version keeps return 0 as result, set the level as 4(full level) by hand. + Log.showInfo(TAG, `getWifiImage enter =========`); + //Fake number of band and rssi for wifi signal level temporarily + let level = WifiInfo.getSignalLevel(rssi, band); + Log.showInfo(TAG, `signal level = ${level}`); + return level; + } + + enableWifi() { + Log.showInfo(TAG, 'enableWifi ing'); + WifiInfo.enableWifi(); + } + + disableWifi() { + Log.showInfo(TAG, 'disableWifi ing'); + WifiInfo.disableWifi(); + } +} + +let mWifiModel = new WifiModel(); +export default mWifiModel as WifiModel; diff --git a/features/wificomponent/src/main/resources/base/element/float.json b/features/wificomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..c70adb37 --- /dev/null +++ b/features/wificomponent/src/main/resources/base/element/float.json @@ -0,0 +1,14 @@ +{ + "float": [ + { + "name": "WIFISTATUS_DISPLAY_HEIGHT", + "value": "50%" + },{ + "name": "WIFISTATUS_HIDDEN_HEIGHT", + "value": "0" + },{ + "name": "WIFISTATUS_MAXWIDTH", + "value": "50" + } + ] +} diff --git a/features/wificomponent/src/main/resources/base/element/string.json b/features/wificomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..1a61a38a --- /dev/null +++ b/features/wificomponent/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "wificomponent_MainAbility", + "value": "wificomponent_MainAbility" + }, + { + "name": "mainability_description", + "value": "ETS_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.png b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f6be54757910150fd87177a70b7cbff6c8a8e360 GIT binary patch literal 1054 zcmV+(1mXLMP)Px&*hxe|RA>e5m)ma*Q51(;chU;#7DTI3w;;iTC-Er$0spFa7B3R_OGG18DN+aM=8W}4l7_RN_%r=^uy$**V6zO4INd$*^jp~eG^2O1AF9%wwUf<4f?7`o5S&i2D+ z2k>`&fOU+eZ{TZy4~$>;_V)VQ6?J3)3a>%xE}+t41L%alaOic0Neuc?mq{%HP<$-{ z4rIu^TUTb$exo!dFywpDrg*-R0VuAAhrtk74cgH!HsopJUeij0SNYL~ezN`)Ji!pt zu9Vsufb#p`Z~~Y%DN^7RFcsc_&qW^0BDj$~+kvS!0E!$U-@EXd;J1(p4M3O*tGEWF zXp%`oK7|lHUYn3%L^NUu>;@^)fP2VD)<@C+7;oj!X|O55@db0EFq}@Tbv%X4%^V&9 zdlF1OF?SQ0@8h)=12RVE*cj)lhi}8A>(&=55q=}TkMC1pOE}NiC|`{om&$8%Ggkfy zbB{P&nkt!aQ^KOp?*oSOcYtlvl>6vpid=)wHP()RgTWqkQnv+>PZ{uvO&<1uUEmf> zEzl$(%!0H|WUk_Ei8FcspMbZ8zkrz2Q4iUtT%(~goKv?2)RIE3a?sp2C-qiKPiEb7 zJApZCy>vtGIBZSX6j}&b-aSTjnmse|hNJ=Urtlkvwm}PgTR6W6;_5+L5h{j~Y7>y@W-*pVQ2!pWb=L(IvafCUpO&DSn2EkDf-pD`TdASP1 zP@#7FO^ZD5y$fz2#NUo7Gkgp~>_lfkf5uE%m8ebxY-K~hJRL`PGF?zcp60sBcxD#( zu+vyOiQg^6IU`^+tgol+Yx|IsNo51vTt+Bh>m3GrLD5rNL!JX)nzgzOXOh&l0hz}~ z;BJvu|XU&*9x_c}%-Uz#Q7=9lUe@%*7+V7kQ0 z>)lB(_rF25*H-D1V;2aWHo&($#z9BatpVR7sa`-23i5l5h-t_%5I&h>9udp(&(Is? zI}@u}{(Bi2g%>D3k=WKU#W^2;8sYQ7f=+g(mV^J}L{||gb4V5)yOZQ=bLDs$<&T5= zAScJi|Jbt3|DxyyFq&%~{5n_ZAD(||B1)bQl#Ykz7hAd1o4i{YeI*Ra)=G~3#U)%m z0H$NtXLDX$%b!s85|{~$aC~VgG+)X#I*7s-GNrH3Mmv5kEQR3>&&C6d2O1AF9+>mM YZ%5XX0CwHeR{#J207*qoM6N<$f{IY=fdBvi literal 0 HcmV?d00001 diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.png b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e3c5d4fcba24ad80a1283c185a3cd2bcd8f07bbb GIT binary patch literal 1043 zcmV+u1nm2XP)Px&%}GQ-RA>e5m&n&<3LD4-5RV z(OQ+20$!t+2>Q+ZC>SOXm0d%M3;^f%qTvKk*|UE@4MDKr3#$zeIJ09;gssV$$vh%%m-u%R7M5Zz!maFGIdiw$RgI0HcOR)kK2 zO%9D8;0>X$=9o*(!scd#4}(1pB|qT3z~)zbE)amH=qwBEdX?}ilw>~oY$wcj?052h z3T!d?jJ3;8?Zmn2TD56AKMe0Z!VOEsGp>?Q)BE=U!-YFQ$EHf|yO=K09D1HHcMKdd z*2pLMwrJ;F0Zgz+!V=Ia@DinJP$ywb4XHknaycGJ$oS{~IJ(vNiwK?)HOM;I)ov&m z;>ou~6euChBB^-C7|g0Ol@heCj`rMpMFT4T+$y}%iOy~un= zp^iZ{_%@T@gz;x|s8MH<=t>j-&g+CY36vF^w8gp)w9Tqh|J#S*LO*C%wR6g--Dj{0 z+U?f_@lh{vD0Toie*}d`9ZHokHTf8Zb@@aRx^#J!ftpl1YLgC(A)D!XPZGc-6qrr_ zuhHODFs5;0A`tDuesCO^H}X6>AH-2;Iux~DW#QMo?t zu_(z7=qT$3s?!R_o#lcv(y2b_0jl>pP+trJ)wkXQgq(IjyP^IXWnJWlTtG<{1`d?L zEieJXsLI4`5cYkQ#f5aTIMW7hfH@GCW?6U>n024dfh9_-0Ph_vpO8s5l_l0?)IWSy|8fFSGhu73pi!dH(;OUSYpD-vizOpETCRw(IxLXYvf>8OSq`XJDB!@E4hkVaAza+eiQa N002ovPDHLkV1in9-}nFk literal 0 HcmV?d00001 diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.png b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.png new file mode 100644 index 0000000000000000000000000000000000000000..3b126bc67ed9ff2df66034657eba6047b3826b69 GIT binary patch literal 1016 zcmVPx&vPnciRA>e5n9EC5K^(`undPIRu!lsN6;hE!wJ#%xpxPNi5v_tiY1yU-`VVT= zLRz(o7D0;^5)>+KOEaVpNqd2s7?zp#xP88KE=+T0yyx6|yjU$s0om`D!daK zp&W9_9|mN$jmBzQX~HXXlS6*fKMEsEMB8pr$vFX%--d_%pl#z41)KtHh0ieOt6;E# zRgBpP+IqF%D~SBQ#McL|Uhz(VU`kktYXUAAN2w*BB8Vy;S%{$((Igt74qT!M3=+fn zd^jh7;|&-chH8h$Pw0kmIOFKcTSd%u7&pOIhm%=!&x!fP?#r4$;OGbg?foj_ew-A1 z^w~+6_rzbr{UKOy>S=40d+oxx_OvoRr&tEAN_sg2`A0It5oRHz}wDXvySr zCAQE*yQAQHlE3aL`55{Ra3$o7tFh1yqu`QjPQyZ!M47fCedqoPIG>X+v1ALH{4AKF zm55jH-fKh{q`fb$2>99y1BUd!db#N`8)v4px=Vb@4yi4 z0qk_2CD`exybOB2?l8`KbY~gIp&)?|C!BQT&}_u-<)4(bv>tcna@=js~vB;S`u(a>uxr zkGoKOp?a-W=^t?K{WVn|+_!96i=TNAkwo-PbQK=Kg|LY*_IzL?+t4RrSpUmv+>*^c zsBBYE4Sm5m&;OFF7RfimE69l2`e7@5A<;@0&SY*}rOWppV8xp_NwyeC+fBVj$13`4 zj9c_k?vus(d^W|^Q}SAvu}dH5^gp1|7m{rQeJ^B0?Y5=Jd?}C7?If(vM@bjQ=-9tz m@;9kKQh}rbNd-!%0)GKa~60+7BevL9R^{>w;^3X z&tcIc38B^<9WJX2SbJUOI4-=R?dq7gXZz<9H|CyL=e05ZQ|h<+|7YgkRMpV3nV zx}zc3^^8>kYjoGA=EK<@@49B>=A@)`?U}M=*@1(W(3wAXhqV%sM z<);f5H`OeQzHv>={)WIo?mrH>N8z90L;+t&5DvDvqxncelwvtDnm{r-UW|#=MI2 literal 0 HcmV?d00001 diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.png b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a373a1c19759a434c052134c9a90c8a4ba41e1 GIT binary patch literal 958 zcmV;v13~Px&cu7P-RA>e5m`z9(Q547D%RVd%4C!N$wh9Y1f@l}LC@iSJg(38@3<9HewJ3uY zEs7SkY9X~~RkY{}Txd|J1Vx)fiONk%5$ZyUQY-59``e5R^X@$Fo0<1`!u;Xq+`0Fh zbI%-S?wxt5RHCE;Nd=M$Bo#<1uz)L&jwAPMHoKWP`=All!CKFeW@;S9JjWs0J?V7% z9mhxtbpa&2f>~Rj*PBi|tDLXL&L0-RUD zoq*_n>3;-!VQJV&nShrYYeR8T+*V`4Tsu{DQZAL!U_ z5hj(wP`82Uetkv1mdm1wIqKmh_%%&OPT>|CveDAG%+sHxeGNKT=6-wnbDB(0PvLPG*_(&7_CwG%N`lSH7T&{{ddZvYVW0 z3;QlZ`bGF?UEvnhOn9Jx!rqt)7)Xg$F^1qqR07*qoM6N<$g2$b`lmGw# literal 0 HcmV?d00001 diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.png b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.png new file mode 100644 index 0000000000000000000000000000000000000000..9811a1815ae3446594fd6656e65097e34cb89226 GIT binary patch literal 1087 zcmV-F1i<@=P)Px&`AI}URA>e5m~C$iQ546!o}VfxDhO4nr-TG)yz&8jVjn=fk)Q|>P19DYQdOi> z(XxKOn%zwA+?k!(-A2fq;c`-Hx?}>Siqt6szNF`fZ;n) za4tbBx>a@N@tdV-fg@{qOyPJb2Qb_SkAe}f9dx2!Fto}>Udu{{xB1e6elkA;rf|fv zE2NGNVEkz$Tm_a*j8wP;EQR-AH7|lm2KT~q6j*vgATJ=weTu9(esd|;0hDR5hU-9# z78o?;ODHkol?feYL?=eT2@oS4c!rK>e?%QX@L?9+0Q({m=NX$s;BsWH>mhU=Wbqg{ z842aRT^1U!{vAVW4L*u6y zd&%O$Qc09s5;lG7Jm9f?2Doina$g*bk#oqo&)g+&KE2i|r{lg$$v~v&XD1!}B#{h&m85rQZ?gHfVz%Nsss8`2#X+)YU4oDmj4h z?hx02Q3=Tudmfl(>$G+E;j!HhX4T9Y(Xh`L8Zg^WaN?~mWvH|R7=HnQ7b8NAm`(l~ z#U4H#30WRqXMjy=MniJLm<$JF?^PVQgMf6?Z!{WXvncbqGU13>I14U=^ohKV%)4a- zrVZ-EZ&|eJ-m~B#O8o7b633@;#GU9S7)*qzs}xnqfLqxJuuf-D9xWG)QKq%7F|KI> zFLpZXPU3rpSZ4;zhW#}IU&o7_LP|Rza}i;HTkj}11@f-iI`Rg1)2y`HuqH}9JCHErY$_PXjzow&6 z%o&+Y>fgi2EX-s0T!bw%#5ym3I^p%fhK}w`nT7x3Ku;Mc3P_Tj{Rz*?Rz-PB9Kd)F zGEY{&t|UKTJh@Asup6sN{E6KNODxN0!FW&9anLeeW}nBCIp6z6eRlxM{J`;44#}}z zKYl`)(K~sDsp3HTRv9iWnhSYLy>CSZ{6vgh^c-`puhe%3XjCt36CnMK;Isddajvhl zCA*Lo(y-RN|EZAtS9<1y{LfVVw~jy^fjRH literal 0 HcmV?d00001 diff --git a/features/wificomponent/src/main/resources/base/media/icon.png b/features/wificomponent/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 - - \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/homeKey/homeKey.hml b/navigationBar/src/main/js/default/pages/homeKey/homeKey.hml deleted file mode 100644 index b12133b2..00000000 --- a/navigationBar/src/main/js/default/pages/homeKey/homeKey.hml +++ /dev/null @@ -1,18 +0,0 @@ - - - \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/homeKey/homeKey.js b/navigationBar/src/main/js/default/pages/homeKey/homeKey.js deleted file mode 100755 index 8d7a34bd..00000000 --- a/navigationBar/src/main/js/default/pages/homeKey/homeKey.js +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2021 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 FeatureAbility from '@ohos.ability.featureability'; -import mLog from '../../common/utils/Log.js'; - -const TAG = 'homeKey'; -const LAUNCHER_BUNDLE_NAME = 'com.ohos.launcher'; -const LAUNCHER_ABILITY_NAME = 'com.ohos.launcher.MainAbility'; - -export default { - /** - * User clicks the home button - * Trigger "Home" event - */ - homeClick() { - mLog.showInfo(TAG, `home click and start ability launcher`); - let result = FeatureAbility.startAbility({ - want: { - bundleName: LAUNCHER_BUNDLE_NAME, - abilityName: LAUNCHER_ABILITY_NAME, - }, - }).then(data => - mLog.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)).catch(error => - mLog.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); - mLog.showInfo(TAG, `start ability ${result}`); - } -} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/index/index.css b/navigationBar/src/main/js/default/pages/index/index.css deleted file mode 100644 index c0057f71..00000000 --- a/navigationBar/src/main/js/default/pages/index/index.css +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -.navigation { - justify-content: center; - align-items: center; - justify-content: space-around; - height: 100px; - background-color: #66000000; - padding-left: 130px; - padding-right: 130px; - width: 100%; - position: absolute; - bottom: 0px; -} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/recentKey/recentKey.css b/navigationBar/src/main/js/default/pages/recentKey/recentKey.css deleted file mode 100755 index a159e2e1..00000000 --- a/navigationBar/src/main/js/default/pages/recentKey/recentKey.css +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -.recent { - icon-width: 42px; - icon-height: 42px; - width: 100%; - height: 100%; - background-color: transparent; -} - -.recent:active { - background-color: #DCDCDC; -} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/recentKey/recentKey.js b/navigationBar/src/main/js/default/pages/recentKey/recentKey.js deleted file mode 100755 index f5fdaacf..00000000 --- a/navigationBar/src/main/js/default/pages/recentKey/recentKey.js +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2021 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 FeatureAbility from '@ohos.ability.featureability'; -import mLog from '../../common/utils/Log.js'; - -const TAG = 'recentKey'; -const RECENT_BUNDLE_NAME = 'com.ohos.launcher'; -const RECENT_ABILITY_NAME = 'com.ohos.launcher.recents.MainAbility'; - -export default { - /** - * User clicks the recent button - * Trigger "Recent" event - */ - recentClick() { - mLog.showInfo(TAG, `recent click and start ability recent`); - let result = FeatureAbility.startAbility({ - want: { - bundleName: RECENT_BUNDLE_NAME, - abilityName: RECENT_ABILITY_NAME, - }, - }).then(data => - mLog.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)).catch(error => - mLog.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); - mLog.showInfo(TAG, `start ability ${result}`); - } -} \ No newline at end of file diff --git a/navigationBar/build.gradle b/product/navigationBar/build.gradle old mode 100755 new mode 100644 similarity index 60% rename from navigationBar/build.gradle rename to product/navigationBar/build.gradle index c2ac0f33..920dbf0f --- a/navigationBar/build.gradle +++ b/product/navigationBar/build.gradle @@ -1,13 +1,15 @@ -apply plugin: 'com.huawei.ohos.hap' -ohos { - compileSdkVersion 6 - defaultConfig { - compatibleSdkVersion 6 - } - entryModules "entry" - supportSystem "standard" -} - -dependencies { - entryImplementation project(':entry') -} +apply plugin: 'com.huawei.ohos.hap' +ohos { + compileSdkVersion 6 + defaultConfig { + compatibleSdkVersion 4 + } + entryModules "entry" + supportSystem "standard" +} + +dependencies { + entryImplementation project(':entry') + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + testCompile 'junit:junit:4.12' +} diff --git a/navigationBar/package.json b/product/navigationBar/package.json old mode 100755 new mode 100644 similarity index 75% rename from navigationBar/package.json rename to product/navigationBar/package.json index 69a88e3b..0967ef42 --- a/navigationBar/package.json +++ b/product/navigationBar/package.json @@ -1 +1 @@ -{} +{} diff --git a/navigationBar/src/main/config.json b/product/navigationBar/src/main/config.json old mode 100755 new mode 100644 similarity index 87% rename from navigationBar/src/main/config.json rename to product/navigationBar/src/main/config.json index 768821a9..82c458f8 --- a/navigationBar/src/main/config.json +++ b/product/navigationBar/src/main/config.json @@ -5,11 +5,6 @@ "version": { "code": 1, "name": "1.0" - }, - "apiVersion": { - "compatible": 4, - "target": 5, - "releaseType": "Beta1" } }, "deviceConfig": {}, @@ -36,9 +31,12 @@ } ], "js": [ - { + {"mode": { + "syntax": "ets", + "type": "pageAbility" + }, "pages": [ - "pages/index/index" + "pages/index" ], "name": "default", "window": { diff --git a/navigationBar/src/main/js/default/pages/index/index.hml b/product/navigationBar/src/main/ets/default/app.ets old mode 100755 new mode 100644 similarity index 66% rename from navigationBar/src/main/js/default/pages/index/index.hml rename to product/navigationBar/src/main/ets/default/app.ets index 92647163..fae1f01c --- a/navigationBar/src/main/js/default/pages/index/index.hml +++ b/product/navigationBar/src/main/ets/default/app.ets @@ -1,4 +1,3 @@ - - - - +import configManager from '../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets' - \ No newline at end of file +let mConfigMangager = configManager; + +export default { + onCreate() { + console.info('Application onCreate') + mConfigMangager.initConfig(); + }, + onDestroy() { + console.info('Application onDestroy') + }, +} diff --git a/entry/src/main/js/default/pages/notification/notification.css b/product/navigationBar/src/main/ets/default/common/constants.ets similarity index 62% rename from entry/src/main/js/default/pages/notification/notification.css rename to product/navigationBar/src/main/ets/default/common/constants.ets index 9955ae22..1730c022 100644 --- a/entry/src/main/js/default/pages/notification/notification.css +++ b/product/navigationBar/src/main/ets/default/common/constants.ets @@ -13,14 +13,15 @@ * limitations under the License. */ -.no_notification{ - width:100%; - height: 100%; - margin-top: 30px; - justify-content:center; - align-items: center ; -} -.text_no_notification{ - color:#ffffff; - font-size:40px; +export default +class Constants{ + static KEY_DOWN: number = 0; + static KEY_UP: number = 1; + static KEYCODE_BACK: number = 1; + static KEYCODE_HOME: number = 2; + static KEYCODE_RECENT: number = 3; + static ONE_TEMPLATE: string = '1fr'; + static THREE_TEMPLATE: string = '1fr 1fr 1fr'; + static ONE_ICON_LAYOUT: number = 1; + static THREE_ICON_LAYOUT: number = 3; } \ No newline at end of file diff --git a/navigationBar/src/main/js/default/common/image_hdpi/ic_navigation_back.png b/product/navigationBar/src/main/ets/default/common/image_hdpi/ic_navigation_back.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_hdpi/ic_navigation_back.png rename to product/navigationBar/src/main/ets/default/common/image_hdpi/ic_navigation_back.png diff --git a/navigationBar/src/main/js/default/common/image_hdpi/ic_navigation_home.png b/product/navigationBar/src/main/ets/default/common/image_hdpi/ic_navigation_home.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_hdpi/ic_navigation_home.png rename to product/navigationBar/src/main/ets/default/common/image_hdpi/ic_navigation_home.png diff --git a/navigationBar/src/main/js/default/common/image_hdpi/ic_navigation_recent.png b/product/navigationBar/src/main/ets/default/common/image_hdpi/ic_navigation_recent.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_hdpi/ic_navigation_recent.png rename to product/navigationBar/src/main/ets/default/common/image_hdpi/ic_navigation_recent.png diff --git a/navigationBar/src/main/js/default/common/image_mdpi/ic_navigation_back.png b/product/navigationBar/src/main/ets/default/common/image_mdpi/ic_navigation_back.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_mdpi/ic_navigation_back.png rename to product/navigationBar/src/main/ets/default/common/image_mdpi/ic_navigation_back.png diff --git a/navigationBar/src/main/js/default/common/image_mdpi/ic_navigation_home.png b/product/navigationBar/src/main/ets/default/common/image_mdpi/ic_navigation_home.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_mdpi/ic_navigation_home.png rename to product/navigationBar/src/main/ets/default/common/image_mdpi/ic_navigation_home.png diff --git a/navigationBar/src/main/js/default/common/image_mdpi/ic_navigation_recent.png b/product/navigationBar/src/main/ets/default/common/image_mdpi/ic_navigation_recent.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_mdpi/ic_navigation_recent.png rename to product/navigationBar/src/main/ets/default/common/image_mdpi/ic_navigation_recent.png diff --git a/navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_back.png b/product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_back.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_back.png rename to product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_back.png diff --git a/navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_home.png b/product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_home.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_home.png rename to product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_home.png diff --git a/navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_recent.png b/product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_recent.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_xhdpi/ic_navigation_recent.png rename to product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_recent.png diff --git a/navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_back.png b/product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_back.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_back.png rename to product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_back.png diff --git a/navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_home.png b/product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_home.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_home.png rename to product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_home.png diff --git a/navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_recent.png b/product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_recent.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_xxhdpi/ic_navigation_recent.png rename to product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_recent.png diff --git a/navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_back.png b/product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_back.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_back.png rename to product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_back.png diff --git a/navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_home.png b/product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_home.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_home.png rename to product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_home.png diff --git a/navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_recent.png b/product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_recent.png similarity index 100% rename from navigationBar/src/main/js/default/common/image_xxxhdpi/ic_navigation_recent.png rename to product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_recent.png diff --git a/product/navigationBar/src/main/ets/default/common/utils/configReader.ets b/product/navigationBar/src/main/ets/default/common/utils/configReader.ets new file mode 100644 index 00000000..8f0f0e91 --- /dev/null +++ b/product/navigationBar/src/main/ets/default/common/utils/configReader.ets @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 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 Fileio from '@ohos.fileio'; +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' + +const DEFAULT_LAYOUT_INFO_FILE_PATH = "/data/accounts/account_0/applications/com.ohos.systemui/" + + "com.ohos.systemui.navigationbar/assets/navigationBar/resources/rawfile/navigationBarLayoutConfig.json"; +const READ_DATA_SIZE = 4096; +const TAG = "ConfigReader" + +export default class ConfigReader { + + public readLayoutConfig() { + Log.showInfo(TAG, "navigationbar ConfigReader readLayoutConfig start"); + var configObj = this.readFileToJson(DEFAULT_LAYOUT_INFO_FILE_PATH) + var mAppStorage = AppStorage.GetOrCreate(); + var mLayoutConfig = mAppStorage.link("navigationLayoutConfig"); + mLayoutConfig.set(configObj) + } + + public readFileToJson(path : string) { + let readStreamSync = null; + try { + readStreamSync = Fileio.createStreamSync(path, "r"); + let content = this.getContent(readStreamSync); + Log.showInfo(TAG, "navigationbar ConfigReader readJsonFile finish execution" + content); + return JSON.parse(content); + } catch (e) { + Log.showError(TAG, "navigationbar ConfigReader readJsonFile " + e); + } finally { + readStreamSync.closeSync(); + } + } + + public getContent(readStreamSync) { + Log.showInfo(TAG, "navigationbar ConfigReader getContent start"); + let buf = new ArrayBuffer(READ_DATA_SIZE); + let len = readStreamSync.readSync(buf); + let arr = new Uint8Array(buf) + let charAt = ' '.charCodeAt(0) + for (let i = len; i < READ_DATA_SIZE; i++) { + arr[i] = charAt + } + let contentBuf = String.fromCharCode.apply(null, arr) + Log.showInfo(TAG, "navigationbar ConfigReader getContent read finished " + contentBuf); + return contentBuf; + } +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/i18n/en-US.json b/product/navigationBar/src/main/ets/default/i18n/en-US.json old mode 100755 new mode 100644 similarity index 100% rename from navigationBar/src/main/js/default/i18n/en-US.json rename to product/navigationBar/src/main/ets/default/i18n/en-US.json diff --git a/navigationBar/src/main/js/default/i18n/zh-CN.json b/product/navigationBar/src/main/ets/default/i18n/zh-CN.json old mode 100755 new mode 100644 similarity index 100% rename from navigationBar/src/main/js/default/i18n/zh-CN.json rename to product/navigationBar/src/main/ets/default/i18n/zh-CN.json diff --git a/product/navigationBar/src/main/ets/default/pages/index.ets b/product/navigationBar/src/main/ets/default/pages/index.ets new file mode 100644 index 00000000..a94c583e --- /dev/null +++ b/product/navigationBar/src/main/ets/default/pages/index.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2021 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 Three from './threeLayout.ets' +import One from './oneLayout.ets' +import ConfigReader from '../common/utils/configReader.ets' +import Constants from '../common/constants.ets' + +const STORAGE_NAVIGATION_TYPE = 'navigationType' + +let mConfigReader + +@Entry +@Component +struct Index { + @StorageLink('navigationLayoutConfig') mConfig: any = {} + + aboutToAppear() { + if (mConfigReader == null || mConfigReader == undefined) { + mConfigReader = new ConfigReader() + mConfigReader.readLayoutConfig() + } + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + if (this.mConfig.type === Constants.THREE_ICON_LAYOUT) { + Three(); + } else if (this.mConfig.type === Constants.ONE_ICON_LAYOUT) { + One(); + } + } + .width('100%') + .height('100%') + .backgroundColor($r('app.color.index_background')) + .padding({ left: $r('app.float.index_padding_left'), right: $r('app.float.index_padding_right') }) + } +} \ No newline at end of file diff --git a/navigationBar/src/main/js/default/pages/recentKey/recentKey.hml b/product/navigationBar/src/main/ets/default/pages/keyButton.ets similarity index 31% rename from navigationBar/src/main/js/default/pages/recentKey/recentKey.hml rename to product/navigationBar/src/main/ets/default/pages/keyButton.ets index 2856c9a4..9feaabdf 100644 --- a/navigationBar/src/main/js/default/pages/recentKey/recentKey.hml +++ b/product/navigationBar/src/main/ets/default/pages/keyButton.ets @@ -1,4 +1,3 @@ - - \ No newline at end of file +import keyCodeEvent from '../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import Constants from '../common/constants.ets' + + +const TAG = 'keyButton'; + +@Component +export default struct keyButton { + + private uri: any; + @Prop keyCode: number; + @State backGroundColor: any = $r('app.color.button_default_background'); + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear uri: ${this.uri} type: ${typeof this.uri}`) + } + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Image(this.uri) + .objectFit(ImageFit.Contain) + .size({ width: $r('app.float.image_width'), height: $r('app.float.image_height') }) + + } + .borderRadius($r('app.float.button_radius')) + .width($r('app.float.button_width')) + .height($r('app.float.button_height')) + .backgroundColor(this.backGroundColor) + .onTouch(this.onKeyTouch.bind(this)) + } + + private onKeyTouch(event:TouchEvent) { + Log.showInfo(TAG, 'onKeyTouch') + Log.showInfo(TAG, `onKeyTouch eventType: ${event.type}`) + let eventType = event.type; + switch(eventType) { + case Constants.KEY_DOWN: + this.backGroundColor =$r('app.color.button_click_background') + break; + case Constants.KEY_UP: + this.backGroundColor = $r('app.color.button_default_background') + break; + default: + break; + } + keyCodeEvent.sendKeyEvent(this.keyCode, eventType) + } +} \ No newline at end of file diff --git a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets b/product/navigationBar/src/main/ets/default/pages/oneLayout.ets new file mode 100644 index 00000000..f035af71 --- /dev/null +++ b/product/navigationBar/src/main/ets/default/pages/oneLayout.ets @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021 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 keyButton from './keyButton.ets'; +import Constants from '../common/constants.ets' + +let KeyCodeArr: any[] = [ + { + "uri": $r('app.media.ic_navigation_home'), + "keyCode": Constants.KEYCODE_HOME + }]; + +@Component +export default struct oneLayout { + build() { + Grid() { + ForEach(KeyCodeArr, (item: any) => { + GridItem() { + keyButton({ + uri: item.uri, + keyCode: item.keyCode + }) + } + .height('100%') + .align(Alignment.Center) + }) + } + .columnsTemplate(Constants.ONE_TEMPLATE) + .height('100%') + .align(Alignment.Center); + } +} \ No newline at end of file diff --git a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets b/product/navigationBar/src/main/ets/default/pages/threeLayout.ets new file mode 100644 index 00000000..2bc784e6 --- /dev/null +++ b/product/navigationBar/src/main/ets/default/pages/threeLayout.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2021 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 keyButton from './keyButton.ets'; +import Constants from '../common/constants.ets' + +let KeyCodeArr: any[] = [ + { + "uri": $r('app.media.ic_navigation_back'), + "keyCode": Constants.KEYCODE_BACK + }, + { + "uri": $r('app.media.ic_navigation_home'), + "keyCode": Constants.KEYCODE_HOME + }, + { + "uri": $r('app.media.ic_navigation_recent'), + "keyCode": Constants.KEYCODE_RECENT + }]; + +@Component +export default +struct threeLayout { + build() { + Grid() { + ForEach(KeyCodeArr, (item: any) => { + GridItem() { + keyButton({ uri: item.uri, keyCode: item.keyCode }) + } + .height('100%') + .align(Alignment.Center) + }) + } + .columnsTemplate(Constants.THREE_TEMPLATE) + .height('100%') + .align(Alignment.Center); + } +} diff --git a/product/navigationBar/src/main/resources/base/element/color.json b/product/navigationBar/src/main/resources/base/element/color.json new file mode 100644 index 00000000..bd971768 --- /dev/null +++ b/product/navigationBar/src/main/resources/base/element/color.json @@ -0,0 +1,16 @@ +{ + "color": [ + { + "name": "index_background", + "value": "#66000000" + }, + { + "name": "button_default_background", + "value": "#00000000" + }, + { + "name": "button_click_background", + "value": "#DCDCDC" + } + ] +} \ No newline at end of file diff --git a/product/navigationBar/src/main/resources/base/element/float.json b/product/navigationBar/src/main/resources/base/element/float.json new file mode 100644 index 00000000..79ce1444 --- /dev/null +++ b/product/navigationBar/src/main/resources/base/element/float.json @@ -0,0 +1,41 @@ +{ + "float": [ + { + "name": "index_padding_left", + "value": "90" + }, + { + "name": "index_padding_right", + "value": "90" + }, + { + "name": "type_three", + "value": "3" + }, + { + "name": "type_one", + "value": "1" + }, + { + "name": "button_width", + "value": "100" + }, + { + "name": "button_height", + "value": "60" + }, + { + "name": "button_radius", + "value": "30" + }, + { + "name": "image_width", + "value": "35" + }, + { + "name": "image_height", + "value": "35" + } + + ] +} \ No newline at end of file diff --git a/navigationBar/src/main/resources/base/element/string.json b/product/navigationBar/src/main/resources/base/element/string.json similarity index 94% rename from navigationBar/src/main/resources/base/element/string.json rename to product/navigationBar/src/main/resources/base/element/string.json index b4ebfd4a..e6c338cd 100644 --- a/navigationBar/src/main/resources/base/element/string.json +++ b/product/navigationBar/src/main/resources/base/element/string.json @@ -1,12 +1,12 @@ -{ - "string": [ - { - "name": "app_name", - "value": "NavigationBar" - }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - } - ] +{ + "string": [ + { + "name": "app_name", + "value": "NavigationBar" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + } + ] } \ No newline at end of file diff --git a/product/navigationBar/src/main/resources/base/media/ic_navigation_back.png b/product/navigationBar/src/main/resources/base/media/ic_navigation_back.png new file mode 100644 index 0000000000000000000000000000000000000000..4da0066ca60ba5ca5d62c9c697b105b69f930d46 GIT binary patch literal 409 zcmV;K0cQS*P)Px$Q%OWYR7ef&l%Y>TQ51)H!b}tg6bo3WCP*Y85DX@Rn@uufY;H=R5C}kHGx&cn z2)Y?;M#v@uHk$!1-(l}&pp52<=i_Wkz*We2aGXsC_>urN1XU2 zwH%^(axJ)k8sAl&m?mOdN9c_8TS&mbahxyKy3FJ73;!aN0U{2S1-OPcct(8AC}BYI z)(A8}JVoUloI(%bZ>y5Bs2U(FeJw!+hVY8`f^nm;8n~yvN9hkb2>)!Py0+PBK)wo} z2#?nGZZ%b(7iwYKp;($?84$ zzJOJ^Px$UP(kjR7ef&l)F&_F%X7*_6(sPlwbmr;{+<800>MD6;KC_KmqOnlbgUU!4E=` zk&z0f9#Zx&~)p zYe9RA3os?oyXk&55V#E{;0as-?O-RGn@%=yI?h%+n&Ts*s*MV^E)ZuDC8U%%jDV_3 z26w)2ltkQfr}M|QzwqYj`3wDZJ@-ueQ#c=Jo`HM<2@+6=daWNi3)pGJ8>XT8?y-Ud zSalS)rN>awjJsias><HVpD|pByG21=789wtMdQO3J2iyT&qD#Jklsj-o_AbP4p>Wh+0JK+z<&19#3>u^;-)JbwRM2fhFUOs&a?d*rzQ O0000p|QSiQtDM(hZq=s)&H#V@1^KJ+#` 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 literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_wifi_full.png b/product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_wifi_full.png new file mode 100644 index 0000000000000000000000000000000000000000..b75900b7aaff2c211b1bf485d0c2366b2ccc05ae GIT binary patch literal 484 zcmVPx$o=HSOR7ef&lRZlVK@f&>k|w4I0TUY$B8Y!Mi(p~W*$6g*oxOj++9JK6g=w@% zen3D3E$po91wSCz_*F?l8go8xm_07Zg(Prbp#u*yJM-@B?%i%8@o&HV1-x+^@O^(4 z%_=NF-t=$y7r6C2uWh->9Zi$43)j$rQKp(S(k7!;7&-yM9fXHaunF(@D|moc%gy7L zVFPlOd&VDdqMD8S9gQb-TtJ3p|33dJo$$GdN2*t4Sm6)1YSL7;yzoL2saE#A>)=1Pd}wLlr7c zJC$c*4zySsoGDh$eWIy)24WiI;R|G+aA_!(spejHFfSZLzP^y4LwpB%Wc&QYmTELj z0C9toP7&|KsUQ7aHqLw2a{H$GN~c&7GZ1+Bmpw6HL%!>KcmUH@068@pt~y a9e)5VQl?8hk3{YO00001r;P)Px$`$DqQ+r2wEjoN zNtl8esNFOhMI74!8l}*k3>G$lGbi}~gDF@A)rK8-$f8@+1L9jT>O}^j+V=rhh>xKT zas>z;!!iN2^(fpTPzxO3SBq+)cJPYt%W=q%J);qZ%AvRo{A*~aLJtES*g0Irc_|wU z>k#d#3r3(83u$~8=n>o{{soOZ@um&lCN;Cv@7P>*gGkkz*UlS~c!aLNC zHz}mu{eWMAS)$ZiAr7_WD`&=o7f|vxI1GEB5GQ6KJIp`bEy`Q7x8xebDvQqC4vn$t zoK$d;V%w6_54(c#{}7=?5-0})t&RtJY4V!^ZVDNPHb6Mw<&;$TpO+;+~ literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/delete_all.png b/product/statusbar/src/main/ets/default/common/image_mdpi/delete_all.png new file mode 100644 index 0000000000000000000000000000000000000000..143463751f103bbf00d204cbbd40982b9a5a6ec1 GIT binary patch literal 4061 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 P00000NkvXXu0mjf(|(n6 literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_settings.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b665b89cd206a3e476f5e9efbe31d482be7a0321 GIT binary patch literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKMSxF;E0F#_5a8H~Cu@LqYm@}} z1v9Kz!j?9FIuBE}!mNZcS4&e#flzNf(Mi1>^=i%1`N3NL4o1n*HdQBu_hvFMFdKWi zIEF+Vej9#s+ad#j78kRdfm2)=4?g|>zd()AfAYJE{uH_A*Cuyvob>9Qm;38_*Xl$w zg_;8Ad2?=RF*z@q+goV#=%cJtiHVZdQUAw>rJKGbt>ZbuVqg*wcDRBmm+e%Z!84E9 zGmVOK{~Sz9ZSWBYJuGgoCl@W7{erOF;$IcgfUmCs@iPs@$<)xc{e&^r`Hz$n5Fc68o!~6m_X;r-3M!*R-C#c`pk^s zJ>T*>EFJ6%T6QFUShJtKpQXsdIE67zW3s}|YH=6SU-PrlN>v`}xS4-du5QippJ`Rn zlFzT2*C&DGO4`=s8kF>v+H*|T5jcEU0pj}>p- z&R(2s@b;??RS90X*HG_Xm(`U0F=ADlvyYehs0yDJnOBw9C1X25<)^Op@q~BX8`ta1P@n&# zQlMZ?9?P2xVMZIL`p>!fQo?`Pha*Q8{uX#SRq~QV<$VUw{C@5NXD`4}D? zS~OS2;k@mRipJAhZ%#R$7J5D1Jw481L5+t=u#l-@Ot#dN<6lnQ?@xF%E6L7fSI?=G zKd;W-{qYPw7g)mGYe$1ILWg+-yu;l zp literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_status_battery.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_status_battery.png similarity index 100% rename from entry/src/main/js/default/common/image_xxhdpi/ic_status_battery.png rename to product/statusbar/src/main/ets/default/common/image_mdpi/ic_status_battery.png diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_status_signal.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_status_signal.png similarity index 100% rename from entry/src/main/js/default/common/image_xxhdpi/ic_status_signal.png rename to product/statusbar/src/main/ets/default/common/image_mdpi/ic_status_signal.png diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_full.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_full.png similarity index 100% rename from entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_full.png rename to product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_full.png diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_half.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_half.png similarity index 100% rename from entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_half.png rename to product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_half.png diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_no.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_no.png similarity index 100% rename from entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_no.png rename to product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_no.png diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_null.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_null.png similarity index 100% rename from entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_null.png rename to product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_null.png diff --git a/entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_roaming.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_roaming.png similarity index 100% rename from entry/src/main/js/default/common/image_xxhdpi/ic_statusbar_signal_roaming.png rename to product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_roaming.png diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_wait.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_wait.png new file mode 100644 index 0000000000000000000000000000000000000000..11a8958a11189755d4328343ef68453f27411739 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T*yPaTIC&-l?5c*qkBay7^*~k>r&$Ly!18Z`L!$ld*I$=K*~7KJU*Af*d#L=Z)eW|&9^-1WKCL{L`wsFSMNNuj zo;@#oKi6*J``r=D+vFAZzdX&!wO{D@!naFz?&iD0QN=Umih7i5_KI$&tpRsscd#-Q z@Yya7c<9U0nzdN6`r2Cd5~;llLuAh^iB8~VdttH5|H-oZkB+~IoGy1Fo4K|lf7aKj z-Y-~KUrcMfYxp_V_`XkZxavrqt&mjfgarZk{)LRCI6 Y|5;yC(^}(m1{fI(p00i_>zopr0MHz`#sB~S literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_connect.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0cfefa63226c8b13d55a5df2e9d87d4251250a GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6-<0X`wF z|LF*Tb^>ktHnqtd$Wko{@(XU*VOO#EmrTKx67HX~mQQE@!nyZz&>_Pc`l5cUau1~b zRp~e!VBlzM{0Y=h>FMGa;&J@#rPF*(4m_<78ASv`LIhmi89(3iUz@8?X!?}e|9_{O z(VP)Px&c}YY;RA>e5n9oZTVHn4Ev%*r)lJbylU7|>>{(xwq-yr5e@K6v)bSdf(c=OPq zD2Sj_K@ilbV-a}JAV}#DT@oY;52aL~3zbopNv)qRyt7W@%?s8;R19(;0kKY_{di=iVZSN5L^%U z1JwW0{|FAk+OSC!Ycw8mm8PGmhWes%5YP>ueANEX_W(MI60~qev)yPbhu2h#HjToD z<8D~+DscY-v|X0fl*8oW@{g&eJ>KN2y&c>i0(XCw`|B{kHn+ev&`7X@!TqoWoby2b z&N=Xr_6Ry})#+zC8_?Ou*k$MkXRB9Ds%;E{jo>!;0Wv+jUBTXo1mkJA3)*RHO}>gr z7trp)$JzPjXt(9_&yC@jg5%JT>-01j>xAbJ)uhqsk5ndr=5JX)1Bh=z>MVSQJN!=P{iN}erVgB4pzi{i&Vko3Mx4%- zWky^roo8Sp+`=!j%&D9m6wm@UVH$!=WAX|6{ZRTTP)rS6g5O|k^EfJ|rt}pRp-2IB z@D9S-djjigr_iN#&n7v0G+t*U27}%(zp$kH&(C5we;G* z^^p>InlhF$KJs;}r}CAXj8u?>e$dBFpKT%do;ERxwcZJB^;eW%*=BE6cDq@PiJ<+z zDp!l*b+V3wV`}T4Ue#|DS_>0S<*uvxblO(8QDoXxw6~e}3oOjcR)q;F5R>m;Ao<1$ z$W~~WC2s=fJJ$UdP+wDp%7~VRLVLmej<0raG*$oTa&Dt~O*m@O4zZ0+`j-&*#w!r7 hK)eF+3jD_vSOh&6mHxGYXiNYA002ovPDHLkV1k%=)%^ef literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_no.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_no.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d92cf4f9625d95cea6aea3e3e5861a49be0215 GIT binary patch literal 1135 zcmV-#1d#iQP)Px(DM>^@RA>e5n8|NVQ5?r#OIkBUm7*!BDM3Xw#1KuiVkc@^7&bOGmLmQFJ6kIu z!iExTG$ch+jc7_t9k6JsBw}c2rDEvw`O1CmednEb-@U!B>B9Xb-<)%Q=Xbup;hy2X z7mGy_RUoQBRDq}hAu5m)Vs6sZcs!nqVg{J%!ZiAE&}X1GCnrbx&=M*Ef-WM0Fn@!*Z2zoL^RbVri39=!dAh{13N#;ioLf;7xcmc%KU<=3( z;v|6W0Jch`fkeLgnU^sE0?&hJH&Ec?JV?JY_6qcZZ!XYH+82d9F9lx9?Kk5M;0B4P zpH@5*Aovny9szUHFuXzk610JCoDHV2OH#wD4Zi?r|CEC=V3Qt{XW@Ns8b)6oqpdRA4w4numrI2g~Yk?V)-as9`?$V}+X&i%WJXS}+sub&3tQnmG|6myl zt-|+gNOpmB7P2Sk^frFE$7~5~!r-vmh`!eJc_wSQWE29?Cf9v1#WB|WKGV4~meMf4 z0_6dq6VEN@;CSd(sM@BO7tAvZE-+D-kyUUwj{)5U+MI&v7!@~KJf7I-?L4-@X+8hZ zw_^Jm8x_*M60~=c#P$ZX=J$a`pc%4zv?+oEk*x;RU`dLBKZSz4g%9hS#fRdn0+m4f z?J~B1Xon;vfuRwP4#c{34}v)!W;qbrK9wn0Kx0K=NKro5Ndxkf)}8R00u2K|5Wf4(^(0sz${=& zH;OZGd@%=X&p{G60l{K}L{+W_O*s5%jCnqiNG=9CZFFp!iFCqu+LOQ;w4Flf=IK+} zEsuG)h$AhTz`{Jer4|x-PP-p$bdlKJvTJy_8{`daV460rDt(mz9t_ij?~%xQSat&K z6%{7wyie!BcLE~7iH_K~Q@s>U#&wfc0^J3=8?~{whDglBo zgY3AQ(AC$n(NUNObm3|FnWBw+iX?P&j!1%>LN*5rEy_pe^u_uvF{X7*e?Hg&DiV5H z9i=*&N1Q;|H&B4{lVCdN0+%vXlVnPC+ zp_Y(W>8P&mgL22_Da)kA%YLL|qmlr@?;)TXBd9whQD^8vKL%R2e!LNUA$Df)np)$G z`JwS`ll27fY&%*L0eOujYy!2Tk-%q<2=o_XR%J92=q5saw3#BEeyL?uMr#vKBuf4C z96E*QUt<%8{&>r3_7PcBfv5se1)>T>6&ULZ`~|;fE*wedUwi-n002ovPDHLkV1k@6 B0KxzO literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_pause.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..cedb380e3feed1adbd649bec35863b49c8dba09f GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;j0X`wF z|EUCk<^fGgm}&O~$dW7x@(Vt8yi_`1)4yMg6{hv}VJxgxMX&f2jT#&nI`_<53{({B z>EamTas2I-oq`PxJj@QC|9_WX@K5@vu7*OwhEKjK{ZG}D*?1%jKJXjpJNq{>&#+?4 zVJKsp!?muzIqcx6hDi#2QC8vKKk2qcXb8A1In%I0H+0j|W0Q3&tC?Knwklj(AQaCp Q1GI?2)78&qol`;+0O<&km;e9( literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_status_battery.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_status_battery.png similarity index 100% rename from entry/src/main/js/default/common/image_xhdpi/ic_status_battery.png rename to product/statusbar/src/main/ets/default/common/image_xhdpi/ic_status_battery.png diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_status_signal.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_status_signal.png similarity index 100% rename from entry/src/main/js/default/common/image_xhdpi/ic_status_signal.png rename to product/statusbar/src/main/ets/default/common/image_xhdpi/ic_status_signal.png diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_full.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_full.png similarity index 100% rename from entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_full.png rename to product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_full.png diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_half.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_half.png similarity index 100% rename from entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_half.png rename to product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_half.png diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_no.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_no.png similarity index 100% rename from entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_no.png rename to product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_no.png diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_null.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_null.png similarity index 100% rename from entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_null.png rename to product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_null.png diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_roaming.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_roaming.png similarity index 100% rename from entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_roaming.png rename to product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_roaming.png diff --git a/entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_wait.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_wait.png similarity index 100% rename from entry/src/main/js/default/common/image_xhdpi/ic_statusbar_signal_wait.png rename to product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_wait.png diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_connect.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a905dfc0f9c219e48db7edb5ca93b1041766f5 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g;!3HGxU+kX;q!^2X+?^QKos)S9a~60+7BevL9R^{>w;^3X z&tcIc38B^<9WJX2SbJUOI4-=R?dq7gXZz<9H|CyL=e05ZQ|h<+|7YgkRMpV3nV zx}zc3^^8>kYjoGA=EK<@@49B>=A@)`?U}M=*@1(W(3wAXhqV%sM z<);f5H`OeQzHv>={)WIo?mrH>N8z90L;+t&5DvDvqxncelwvtDnm{r-UW|#=MI2 literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_full.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_full.png new file mode 100644 index 0000000000000000000000000000000000000000..ef6a536e100c74a1d595d38d1738ba2518c023c5 GIT binary patch literal 622 zcmV-!0+IcRP)Px%C`m*?R9Fe^mOV=YK@f&>iV0W=f*+u0rJbe`EUXlNgN289 zw6?aevJkOKp@<(SDt?p-f`%BMm+XMQWySHKCn z0J&VQhuU!%gI;KdHjq8T6I{bS>^Y8e!}Vvzq%oL<69{Y4NE<767rrZis1eZuEJCNJ z!6V}|=!u0)t04xU18jR>um&5fO4d&J`b^#f2VmO;g9HrvicFBaqZ(6t&eb;c)Haqj z3g+O=Qk~*Yf>tDyNn^C?;hK8S+l`90faER7E>p0_8SunR43@4b(JD5lxq@S+%!1<(mfiin+ENrgxxPI!}R~P;a(juShXC z1Jz7<^EDaMxTR8~AT@T6st*VgHPdL)G~4F&`erx&RiDZALvsYK$q)U5RrO6WnO@Ic ztLnAeP~~0dPsWF(m9N;}8IQ033HJu~Ed1RK)Mu)%K&@8b3rbqYa9sgm_W%F@07*qo IM6N<$f_>!}F#rGn literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_no.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_no.png new file mode 100644 index 0000000000000000000000000000000000000000..3f49ec5b9e05271894e99c2e4606d7b4208617f1 GIT binary patch literal 756 zcmVPx%u1Q2eR9Fe^mb+^dQ51)FeM{6v6p8o<2)-&Uw6KXrMG!n6@XbRu1-#6Z!%w%U~Gt=1Y55B#xbI(2Z+7kicW&kWaACm)tWi#ec?F*li;I6GVz-+95^`TA?OS@YzOdx;a-cV@?fW_VE zY3NB9o6h_21Sc+@Ddy_08@59)cvMY|Q@Os}H`ntm4ZOQ?Re}#5b;CLaGjbNrsy+>f0y?`$>?7c_F zU>~SyY|i|vwgzyRfo(8|k+(TgNUdqz3tM18G|>9-gRZA=m-%DKVSG6M2#hjjRwJb{ z(Ckc>Ok79%1Xz~Q1jhX=_NHi3VE`6(i>-@1LJRW$&=q>|6fx_zZpDF9OKKcRkb mQSnE|zK%K>=wzUD2L1x@_{1S?sgf7~0000)wB literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_pause.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..8050431ac26a4767ebbc75c190d05ed12a58fc8a GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}T0G|-o z|F{8A2~e_Mb?rSMi>oBaFIZ>dy`)FlYz=V?KeJdi14WHIT^vI+&L_|4WRq}XE#UUa zbrznnNy0bbTG1p{gEI#SpkC^>bP0 Hl+XkK{%T5F literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/delete_all.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/delete_all.png new file mode 100644 index 0000000000000000000000000000000000000000..143463751f103bbf00d204cbbd40982b9a5a6ec1 GIT binary patch literal 4061 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 P00000NkvXXu0mjf(|(n6 literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_settings.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b665b89cd206a3e476f5e9efbe31d482be7a0321 GIT binary patch literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKMSxF;E0F#_5a8H~Cu@LqYm@}} z1v9Kz!j?9FIuBE}!mNZcS4&e#flzNf(Mi1>^=i%1`N3NL4o1n*HdQBu_hvFMFdKWi zIEF+Vej9#s+ad#j78kRdfm2)=4?g|>zd()AfAYJE{uH_A*Cuyvob>9Qm;38_*Xl$w zg_;8Ad2?=RF*z@q+goV#=%cJtiHVZdQUAw>rJKGbt>ZbuVqg*wcDRBmm+e%Z!84E9 zGmVOK{~Sz9ZSWBYJuGgoCl@W7{erOF;$IcgfUmCs@iPs@$<)xc{e&^r`Hz$n5Fc68o!~6m_X;r-3M!*R-C#c`pk^s zJ>T*>EFJ6%T6QFUShJtKpQXsdIE67zW3s}|YH=6SU-PrlN>v`}xS4-du5QippJ`Rn zlFzT2*C&DGO4`=s8kF>v+H*|T5jcEU0pj}>p- z&R(2s@b;??RS90X*HG_Xm(`U0F=ADlvyYehs0yDJnOBw9C1X25<)^Op@q~BX8`ta1P@n&# zQlMZ?9?P2xVMZIL`p>!fQo?`Pha*Q8{uX#SRq~QV<$VUw{C@5NXD`4}D? zS~OS2;k@mRipJAhZ%#R$7J5D1Jw481L5+t=u#l-@Ot#dN<6lnQ?@xF%E6L7fSI?=G zKd;W-{qYPw7g)mGYe$1ILWg+-yu;l zp literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_status_battery.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_status_battery.png new file mode 100644 index 0000000000000000000000000000000000000000..b209209a65ae4f61446d52b960153b8e8ae3a342 GIT binary patch literal 579 zcmeAS@N?(olHy`uVBq!ia0vp^9zbls!3HEZ&9Qk6q!^2X+?^QKos)S9WdHSaaSX{| zeLK_M>xhHIQS*PASDdW5S-C|8OQd!8G~~Qx-P80f?$EVs(l<2Y4jl7~aB+0eeIvr6 zd*$n1)t0;4PacTSIrFUcgU7uyDMt7EYlJ@ES+&6Y5IcF7h+cb_*G)eB^a(W z`7M}x@ZOfF8P4;(wacFBEL?TN&0YG)`c-U8F3o#>K}wBJNn&N zv$tsNP+Y$4dC1d4WzT~4qy!Y%Jm=0}-POLMvpD#Dx4?pZjmjAu>H6ohjqT@U&s!*T zdE??|Kg-_ne!aWTih0(XrOm}(x3a6$oXVX$e?gJbr7Q;~m$i(Vf*;vb9Ii-B5E9JC zDNxGxMNQ{Q`R>;|FPK>DiacyC@w?>O&v^Lyq3}K}xyBPVU%398I^lw`iB#QMlxMZ( zV2ttgb217*U5k{sdyhSlesRA&&H1s=i{#9?izopr04!Sb-2eap literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_status_signal.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_status_signal.png new file mode 100644 index 0000000000000000000000000000000000000000..65c057e136618d28c22e3d8059832c7cc68919bc GIT binary patch literal 569 zcmV-90>=G`P)Px$^GQTORA>e5S+Pn3K@iQUphYl{6}UtH_wk_5Sj?4L%0S9M%0SA%=rZsD06c9>Cq|`Y00000NkvXX Hu0mjflIs9A literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_full.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_full.png new file mode 100644 index 0000000000000000000000000000000000000000..3d07a122b467da87f18c59a6a9405e84150919e6 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;00X`wF z|7ie#W&=%~eDL;HAWOC+$S=6guyVrsXtPtyPsO-CY)KW;zwqy8;royIeF1U}3{eqB zt^*Y=^mK6y@i_kW>RG-f0|Ax?T}|~IN+P$8R{p=9!fB$YX6w@wC{%U3Y@av(=4ZZg zo14Ejl+0tA#N5Zo+c1rBFVi3H4|4+!FosE7$l8#2K;q4Iu0Jm$j1;OF`Po#YR!9m6 z&1PvoWyKZp>yhMw|NMs=`j7Y@d|J8qz~3ILRELG;;cPBK+D!r5i`TmxV->I#{dFg1 oV&TuViK#w!C8WP^{jF-i&>Hxw+)_8D4d_?~Pgg&ebxsLQ07!(xqyPW_ literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_half.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_half.png new file mode 100644 index 0000000000000000000000000000000000000000..54f893156fc698d524ed2582a66aa10d0d969d30 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6-z0X`wF z|LFpNwgK%qwoj`E$Wkr|@(ZprWEM+(Dzs(7DYMG;(fSwu{VdG?sQkW9Nn0{N&XcP_ z-IwA1d>K8U@-3b&jv*e$-(L0PZZ;5MN!a~&7)~!iykXx?8^P=f&kYlC2yktQw zqdMCi1{R(bq6sS#9?zb_w2#f3?ZwZ-$qwRc(wVlMmu0=fda#+XnpZ~RgXbUq7O9TX z{!;$qg)3%u8f{~Hp%=&{Vcq9E(f8`!-c$e5``&!N5w7}o!J79bJMUF-=zLhVym$l9 O{S2P2elF{r5}E*l?%$mN literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_no.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_no.png new file mode 100644 index 0000000000000000000000000000000000000000..bec95a3438320d4ea37fa941e9a4e0a5134b912a GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6`-%bVJ|sj}+`vf1_CrQr{^8josX=oV%p=rZ4PXedBtQ0D^?O05m8 z9Xd=h%)huVtZr<0bXtn#L-D1i2IUt?th-*hv+&4h2wW&~P&%N#h~;yND2tliMUD!U zM@&iY6ee6(F=m;v=dyyrgbKkQyY^P88r*Bp|FU`~)8oI9f2S9gC1?2Df9IaS&XIe0 V$ElRY2A~5OJYD@<);T3K0RX)jrf>iN literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_null.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_null.png new file mode 100644 index 0000000000000000000000000000000000000000..f974779f120e74178c7c4821141a9f8da224ebce GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;y0X`wF z{|62LodC4l@!)xoCq|hRbXFq!<_&89iMbLp+YZy?Ti@_M0&Q^>SUeh!?$_jn?7953`ta?fMl6d!l?RVb&) z?AeZUue0<_zSsLe;ZvkedTAB2piXZ>{8w%3`=yM>tLzlc#fcy2`|WHx&GU#AAh~6dxovc>Pf=xbE7-l>Nimz`^^Ec*M?Pkr{4R$_*4+^$pn~gyLDU?p~`t yTJ)D8YvJ|Tr;Gl|tgbRzbvI-8xA$NA4+uv{W(e8dTb~CELIzJ)KbLh*2~7ZArxzXo literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_roaming.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_roaming.png new file mode 100644 index 0000000000000000000000000000000000000000..649632b5f71d3aebcd73febfcc6ffd2695140784 GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6& zzl2M4wb+{cAU@0b@CF9g{gWO7b=G^jIEHu}e|yDU=#YU(bK+%d&b`xFf(qXJ|93oj zhvSyidEf54EuPq&G>4I~X3zJ#tMd4n_WSTDCB$$iTzKuQ+Ms4N!z+P*yPaTIC&-l?5c*qkBay7^*~k>r&$Ly!18Z`L!$ld*I$=K*~7KJU*Af*d#L=Z)eW|&9^-1WKCL{L`wsFSMNNuj zo;@#oKi6*J``r=D+vFAZzdX&!wO{D@!naFz?&iD0QN=Umih7i5_KI$&tpRsscd#-Q z@Yya7c<9U0nzdN6`r2Cd5~;llLuAh^iB8~VdttH5|H-oZkB+~IoGy1Fo4K|lf7aKj z-Y-~KUrcMfYxp_V_`XkZxavrqt&mjfgarZk{)LRCI6 Y|5;yC(^}(m1{fI(p00i_>zopr0MHz`#sB~S literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_connect.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0cfefa63226c8b13d55a5df2e9d87d4251250a GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6-<0X`wF z|LF*Tb^>ktHnqtd$Wko{@(XU*VOO#EmrTKx67HX~mQQE@!nyZz&>_Pc`l5cUau1~b zRp~e!VBlzM{0Y=h>FMGa;&J@#rPF*(4m_<78ASv`LIhmi89(3iUz@8?X!?}e|9_{O z(VP)Px&c}YY;RA>e5n9oZTVHn4Ev%*r)lJbylU7|>>{(xwq-yr5e@K6v)bSdf(c=OPq zD2Sj_K@ilbV-a}JAV}#DT@oY;52aL~3zbopNv)qRyt7W@%?s8;R19(;0kKY_{di=iVZSN5L^%U z1JwW0{|FAk+OSC!Ycw8mm8PGmhWes%5YP>ueANEX_W(MI60~qev)yPbhu2h#HjToD z<8D~+DscY-v|X0fl*8oW@{g&eJ>KN2y&c>i0(XCw`|B{kHn+ev&`7X@!TqoWoby2b z&N=Xr_6Ry})#+zC8_?Ou*k$MkXRB9Ds%;E{jo>!;0Wv+jUBTXo1mkJA3)*RHO}>gr z7trp)$JzPjXt(9_&yC@jg5%JT>-01j>xAbJ)uhqsk5ndr=5JX)1Bh=z>MVSQJN!=P{iN}erVgB4pzi{i&Vko3Mx4%- zWky^roo8Sp+`=!j%&D9m6wm@UVH$!=WAX|6{ZRTTP)rS6g5O|k^EfJ|rt}pRp-2IB z@D9S-djjigr_iN#&n7v0G+t*U27}%(zp$kH&(C5we;G* z^^p>InlhF$KJs;}r}CAXj8u?>e$dBFpKT%do;ERxwcZJB^;eW%*=BE6cDq@PiJ<+z zDp!l*b+V3wV`}T4Ue#|DS_>0S<*uvxblO(8QDoXxw6~e}3oOjcR)q;F5R>m;Ao<1$ z$W~~WC2s=fJJ$UdP+wDp%7~VRLVLmej<0raG*$oTa&Dt~O*m@O4zZ0+`j-&*#w!r7 hK)eF+3jD_vSOh&6mHxGYXiNYA002ovPDHLkV1k%=)%^ef literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_no.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_no.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d92cf4f9625d95cea6aea3e3e5861a49be0215 GIT binary patch literal 1135 zcmV-#1d#iQP)Px(DM>^@RA>e5n8|NVQ5?r#OIkBUm7*!BDM3Xw#1KuiVkc@^7&bOGmLmQFJ6kIu z!iExTG$ch+jc7_t9k6JsBw}c2rDEvw`O1CmednEb-@U!B>B9Xb-<)%Q=Xbup;hy2X z7mGy_RUoQBRDq}hAu5m)Vs6sZcs!nqVg{J%!ZiAE&}X1GCnrbx&=M*Ef-WM0Fn@!*Z2zoL^RbVri39=!dAh{13N#;ioLf;7xcmc%KU<=3( z;v|6W0Jch`fkeLgnU^sE0?&hJH&Ec?JV?JY_6qcZZ!XYH+82d9F9lx9?Kk5M;0B4P zpH@5*Aovny9szUHFuXzk610JCoDHV2OH#wD4Zi?r|CEC=V3Qt{XW@Ns8b)6oqpdRA4w4numrI2g~Yk?V)-as9`?$V}+X&i%WJXS}+sub&3tQnmG|6myl zt-|+gNOpmB7P2Sk^frFE$7~5~!r-vmh`!eJc_wSQWE29?Cf9v1#WB|WKGV4~meMf4 z0_6dq6VEN@;CSd(sM@BO7tAvZE-+D-kyUUwj{)5U+MI&v7!@~KJf7I-?L4-@X+8hZ zw_^Jm8x_*M60~=c#P$ZX=J$a`pc%4zv?+oEk*x;RU`dLBKZSz4g%9hS#fRdn0+m4f z?J~B1Xon;vfuRwP4#c{34}v)!W;qbrK9wn0Kx0K=NKro5Ndxkf)}8R00u2K|5Wf4(^(0sz${=& zH;OZGd@%=X&p{G60l{K}L{+W_O*s5%jCnqiNG=9CZFFp!iFCqu+LOQ;w4Flf=IK+} zEsuG)h$AhTz`{Jer4|x-PP-p$bdlKJvTJy_8{`daV460rDt(mz9t_ij?~%xQSat&K z6%{7wyie!BcLE~7iH_K~Q@s>U#&wfc0^J3=8?~{whDglBo zgY3AQ(AC$n(NUNObm3|FnWBw+iX?P&j!1%>LN*5rEy_pe^u_uvF{X7*e?Hg&DiV5H z9i=*&N1Q;|H&B4{lVCdN0+%vXlVnPC+ zp_Y(W>8P&mgL22_Da)kA%YLL|qmlr@?;)TXBd9whQD^8vKL%R2e!LNUA$Df)np)$G z`JwS`ll27fY&%*L0eOujYy!2Tk-%q<2=o_XR%J92=q5saw3#BEeyL?uMr#vKBuf4C z96E*QUt<%8{&>r3_7PcBfv5se1)>T>6&ULZ`~|;fE*wedUwi-n002ovPDHLkV1k@6 B0KxzO literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_pause.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..cedb380e3feed1adbd649bec35863b49c8dba09f GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;j0X`wF z|EUCk<^fGgm}&O~$dW7x@(Vt8yi_`1)4yMg6{hv}VJxgxMX&f2jT#&nI`_<53{({B z>EamTas2I-oq`PxJj@QC|9_WX@K5@vu7*OwhEKjK{ZG}D*?1%jKJXjpJNq{>&#+?4 zVJKsp!?muzIqcx6hDi#2QC8vKKk2qcXb8A1In%I0H+0j|W0Q3&tC?Knwklj(AQaCp Q1GI?2)78&qol`;+0O<&km;e9( literal 0 HcmV?d00001 diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_status_battery.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_status_battery.png similarity index 100% rename from entry/src/main/js/default/common/image_xxxhdpi/ic_status_battery.png rename to product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_status_battery.png diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_status_signal.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_status_signal.png similarity index 100% rename from entry/src/main/js/default/common/image_xxxhdpi/ic_status_signal.png rename to product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_status_signal.png diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_full.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_full.png similarity index 100% rename from entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_full.png rename to product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_full.png diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_half.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_half.png similarity index 100% rename from entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_half.png rename to product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_half.png diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_no.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_no.png similarity index 100% rename from entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_no.png rename to product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_no.png diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_null.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_null.png similarity index 100% rename from entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_null.png rename to product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_null.png diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_roaming.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_roaming.png similarity index 100% rename from entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_roaming.png rename to product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_roaming.png diff --git a/entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_wait.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_wait.png similarity index 100% rename from entry/src/main/js/default/common/image_xxxhdpi/ic_statusbar_signal_wait.png rename to product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_wait.png diff --git a/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_connect.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..be54455a9d9e53e41b4a8296d68f13feb93ea210 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!SkfJR9T^xl_H+M9WCik_0(?ST z|5E^fW&m}6FlH?SvP4UQ{DP|*>Z`vg*f(EF=Xt%J@zd=OzkW6`oc!kT5~!fj)5S3) z;_%xmJNXVM@Gu8dIr{en{r|sS?8-tR>4m{hdCq-nJJGdE%3V;wp@D&siG@Qz;RAER zhuTvay#f&phHHhF^ITwbxaEJ1`Er|D!rYHcl`*mfZ!{Vr*j+>p)Lmg*$M7ulQnUDt yWve+kqOKiT?xehdV|7lBUF~zx|BQ|OjnaFR?U_9GY&ZmT41=eupUXO@geCws=b6(0 literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_full.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_full.png new file mode 100644 index 0000000000000000000000000000000000000000..cac433fd284a95d15232327b53b669e0b07957fc GIT binary patch literal 1183 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!SkfJR9T^xl_H+M9WMyDrY!2`V zas59E1}+4Ekpi@Q>PKE{AgiGy$S=4taq;o)wNZ#4^CT9v`GB^N-d{9VZv8;-7sR?IG6Rx$<4Zs>KPL{CqA~5+*e$obCGkW$6*)7 z<$`LjBO(ueD784-zS{c1-9uh~jrqGo<(XT4Jah=}6Igds=Gk)&pZB5KE4W$C{Sx{5 zkHM@VP@I8*$=cJ!F(l&f+iB0kZv{vk+juL={VHF2bolFg)$jM-^cHY&k(A=#TlT9Zr7pMBSRbS^_v^1zwp zZKXG_US1fQRPD1~{^iw;iQNf? zCGRbGwpFJD6;1fzVXFrS2gyL)I(>htZdj_!+K=SdI-4c5*rVPskPHFg1W+J?H~ z2E7ll7JrYNkUbLN$IZyID{l4$(-pD}Wm-3Hv}Uofv~H^IJw5TnriaTf_yrgz7`}}x z*q?tWvt2)H{z3h|?o)3%j$6DdSB$<9Z8briZ`!we&*Z%xDN5CPi16>&^|-yhJXGg_ z)wG-SZ+3Y&#C%EE<8h#mPx)g-Jv~RCodHnCpvGRT##dsWiKpSz1XsW22RnK^G&seb6Ebg~9rekVp}9fuIk4 z>o2HJMNmXiSOg*oMi<0VD#DsbL%U*=jcFxmSF^Il>GzxVfx~8>eb(7$@14V57)rU;ECfetNZgKuHS`kB801@D|96Q1D{XyMey9NvMAQsRq!!fj}V^~ zb5U@4GH?ex2>Xi$F1g>Q_*;h%Uv%oXqZPowrxIWpbml|xJ%%Rs6|}IqY=4Fpw%?(! zAj&DwB6%7-2hN4Z!cYuhxEdi2gmwrLfPrgwHCzhYB{YhSOL8mRPBK66ECk|ORQuq0 z2?ux{1@qwG*AVxeJflWiTLDPIBkOk9Zq^TCvk`9UWCpMg2DzM!@j~cim{%Swl+Te% z?h%?R00Ga$$=z^zPNbh`+W_ApSYt`&n0MbqUarEcpkkbo<8cpdkCT^MFB2^VAV@zw z?uYKpEV$Ix!OaBtGs~drcjV}HxE2n=#-%D9)|L4vIqpn1_&ra62WdYms}t`$exAXp zv;VIHA!d-o3g{&)3&Z64P*%gySuc}!UR%@nix+F*MjQs;#z@d*YDJ#|r@|AU7bc(L z7wF00Q&ETEC&cj5(-zq6CC0-TUJn<;^tjy0naEoKchF-&Q?IZ2{1n05S8YK;&c>C{ zJA=ns5qv`@SKAiiejeh0xL&{Sfz1;*ME{jp{qqE{(A)(3py&8YILY1X1b0tf3>U(F zSSDN*uad*|c23E|mE}rM4EO%a^vf*JEd`)cMbhsJ1#H)lW(8<_RMv$%rVBqfM zWzdKV;otkm1pyEh_D0aE1-3v8HM5&-2%Nt zz71Xhy&JgCJ(|2JRt`ik{vhkuR-3kdnuyK&cF?<*e35@OW*v^A)pMGe? z_w*QrUV$x=!_Z%McHmQCbAeA!iQW*~R*t$7pq10+_ax~(+?l!@Dp&{BfxId@_10Mqz-wFLCSSa3_e?I;P{xX0Wa5nU;E(H2cf^(t2`9(wpDo~)3 z8qh9Jmh?<)mcahRb|=pl+2ebX@3lQ@7l6Tgrr!nAwZW6(2}JPHQyWUZ2<2tY;3w0* z9Hs|vH{UH!Z2VpeY88MH&4K>**9x|2Qyc0QAmlg;u_;ZUx&_!9ka>trfSWLrx&`p( ztgNeYBU{_FsSULXK!x}J`&H12pN8*NB{u1{%D&fr3_6k{=^jv-ve9u=ASw_Qhzdjn lq5@HYs6bR8DsV(A@HZt!f&fd#NS%G|s0G|-o z{}=!$0~EX2x2h7zVlN5u3*PnV=V!Uy44$qACxAkpo-U3d9>O(LJd|W zFo^8v+VwD8AWp6=zOibjR2}Qnr>Tb>7#;K5rf(MH$O_)x*q;~dwfOd)J3UUqY|a)u bs;mq<59uCQHF4QlprJs+{an^LB{Ts5igrw% literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/ets/default/common/util/configReader.ets b/product/statusbar/src/main/ets/default/common/util/configReader.ets new file mode 100644 index 00000000..17e132c5 --- /dev/null +++ b/product/statusbar/src/main/ets/default/common/util/configReader.ets @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2021 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 Fileio from '@ohos.fileio'; +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' + +const DEFAULT_LAYOUT_INFO_FILE_PATH = "/data/accounts/account_0/applications/com.ohos.systemui/" + + "com.ohos.systemui.statusbar/assets/statusbar/resources/rawfile/layoutConfig.json"; +const READ_DATA_SIZE = 4096; +const TAG = "ConfigReader" + +export default class ConfigReader { + public readFileToJson(path : string) { + let readStreamSync = null; + try { + readStreamSync = Fileio.createStreamSync(path, "r"); + let content = this.getContent(readStreamSync); + Log.showInfo(TAG, "SystemUI ConfigReader readJsonFile finish execution" + content); + return JSON.parse(content); + } catch (e) { + Log.showError(TAG, "SystemUI ConfigReader readJsonFile " + e); + } finally { + readStreamSync.closeSync(); + } + } + + public getContent(readStreamSync) { + Log.showInfo(TAG, "SystemUI ConfigReader getContent start"); + let buf = new ArrayBuffer(READ_DATA_SIZE); + let len = readStreamSync.readSync(buf); + let arr = new Uint8Array(buf) + let charAt = ' '.charCodeAt(0) + for (let i = len; i < READ_DATA_SIZE; i++) { + arr[i] = charAt + } + let contentBuf = String.fromCharCode.apply(null, arr) + Log.showInfo(TAG, "SystemUI ConfigReader getContent read finished " + contentBuf); + return contentBuf; + } + + public readLayoutConfig() { + Log.showInfo(TAG, "SystemUI ConfigReader readLayoutConfig start"); + var configObj = this.readFileToJson(DEFAULT_LAYOUT_INFO_FILE_PATH) + var mAppStorage = AppStorage.GetOrCreate(); + var mLayoutConfig = mAppStorage.link("layoutConfig"); + mLayoutConfig.set(configObj) + } +} \ No newline at end of file diff --git a/entry/src/main/js/default/app.js b/product/statusbar/src/main/ets/default/pages/common/constants.ets similarity index 60% rename from entry/src/main/js/default/app.js rename to product/statusbar/src/main/ets/default/pages/common/constants.ets index aa4c1d51..14dd4f6f 100644 --- a/entry/src/main/js/default/app.js +++ b/product/statusbar/src/main/ets/default/pages/common/constants.ets @@ -13,21 +13,20 @@ * limitations under the License. */ -import mLog from '../default/common/utils/Log.js'; -import StatusCenter from '../default/center/statuscenter/StatusCenter.js'; +export default class Constants { -const TAG = 'app'; + static TOUCHTYPE_DOWN = 0; + static TOUCHTYPE_UP = 1; + static TOUCHTYPE_MOVE = 2; -export default { - data: { - StatusCenter:new StatusCenter - }, + static WEEKDAY_MONDAY = 1; + static WEEKDAY_TUESDAY = 2; + static WEEKDAY_WEDNESDAY = 3; + static WEEKDAY_THURSDAY = 4; + static WEEKDAY_FRIDAY = 5; + static WEEKDAY_SATURDAY = 6; + static WEEKDAY_SUNDAY = 7; - onCreate() { - mLog.showInfo(TAG, 'Application onCreate'); - }, - - onDestroy() { - mLog.showInfo(TAG, 'Application onDestroy'); - } -}; + static DIGITS = 10; + static DEFAULT_MIDDLE_PART_WIDTH = 70; +} \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/control.ets b/product/statusbar/src/main/ets/default/pages/control.ets new file mode 100644 index 00000000..b66ccbd7 --- /dev/null +++ b/product/statusbar/src/main/ets/default/pages/control.ets @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2021 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 ControlCenterComponent from '../../../../../../../features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets' +import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' +import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' +import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' +import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' +import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from './common/constants.ets' + +const TAG = 'Control=====' + +@Component +export default struct Control { + @Link showStatusBar: boolean + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { + statusBar() + ControlCenterComponent({showStatusBar: $showStatusBar}); + } + .width('100%') + .height('100%') + .backgroundColor($r('app.color.default_background')) + .onTouch(this.controlTouch.bind(this)) + } + + controlTouch(event: TouchEvent) { + Log.showInfo(TAG, 'controlTouch================') + if (event.type == Constants.TOUCHTYPE_DOWN) { + this.startX = event.touches[0].screenX + this.startY = event.touches[0].screenY + Log.showInfo(TAG, `controlTouch=======startX: ${this.startX}, startY: ${this.startY}`) + } else if (event.type == Constants.TOUCHTYPE_MOVE) { + this.moveX = event.touches[0].screenX - this.startX + this.moveY = event.touches[0].screenY - this.startY + } else if (event.type == Constants.TOUCHTYPE_UP) { + Log.showInfo(TAG, `controlTouch, moveX: ${this.moveX}, moveY: ${this.moveY}`) + if (this.moveY < -30) { + this.showStatusBar = true; + WindowManager.setWindowMin() + } + } + } +} + +@Component +struct statusBar { + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + SignalIcon() + WifiIcon() + } + .margin({ left: 10 }) + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + BatteryIcon() + ClockIcon() + } + } + .width('100%') + .height($r('app.float.statusbar_height')) + .backgroundColor($r('app.color.statusbar_background')) + } +} \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/defaultLayout.ets b/product/statusbar/src/main/ets/default/pages/defaultLayout.ets new file mode 100644 index 00000000..d1b41960 --- /dev/null +++ b/product/statusbar/src/main/ets/default/pages/defaultLayout.ets @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021 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 BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' +import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' +import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' +import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon.ets' +import Constants from './common/constants.ets' + +@Component +export default struct Index { + private notificationList : any + @StorageLink('wifiStatus') wifiStatus : boolean = false + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + SignalIcon() + WifiIcon() + }.width(this.wifiStatus ? $r('app.float.default_left_width_large') : $r('app.float.default_left_width_small')) + .margin({ left: 10 }) + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + ForEach(this.notificationList, (item: any) => { + Image(item.icon).objectFit(ImageFit.ScaleDown).height('50%') + }) + }.width(this.notificationList.length * Constants.DEFAULT_MIDDLE_PART_WIDTH) + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + BatteryIcon() + ClockIcon() + } + } + .width('100%') + .height('100%') + .backgroundColor($r('app.color.default_background')) + } +} \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets new file mode 100644 index 00000000..2e91d9de --- /dev/null +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import DefaultLayout from './defaultLayout.ets' +import Notification from './notification.ets' +import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' +import mNotificationService from '../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' +import ControlCenterComponent from './control.ets' +import Constants from './common/constants.ets' + +const TAG = 'StatusBar=====' + +let mConfigReader + +@Entry +@Component +struct Index { + @StorageLink('layoutConfig') layoutConfig: any = {} + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 + @State showStatusBar: boolean = true + @StorageLink('notificationList') notificationList : any = [] + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear, showStatusBar: ${this.showStatusBar}`) + mNotificationService.initNotificationService() + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear, showStatusBar: ${this.showStatusBar}`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + if (this.showStatusBar) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + DefaultLayout({ + notificationList: this.notificationList.length > 2 ? this.notificationList.slice(0,3) : this.notificationList }) + } + .width('100%') + .height('100%') + .onTouch(this.touchEvent.bind(this)) + } else { + if( this.startX <= 230) { + Notification({ showStatusBar: $showStatusBar }) + } else { + ControlCenterComponent({ showStatusBar: $showStatusBar }) + } + } + } + .width('100%') + .height('100%') + } + + touchEvent(event: TouchEvent) { + Log.showInfo(TAG, 'touchEvent================' + event.touches) + Log.showInfo(TAG, 'touchEvent================ stringfy' + JSON.stringify(event.touches)) + if (event.type == Constants.TOUCHTYPE_DOWN) { //down + this.startX = event.touches[0].screenX + this.startY = event.touches[0].screenY + Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`) + } else if (event.type == Constants.TOUCHTYPE_MOVE) { //move + this.moveX = event.touches[0].screenX - this.startX + this.moveY = event.touches[0].screenY - this.startY + } else if (event.type == Constants.TOUCHTYPE_UP) { //up + Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`) + if (this.moveY > 10) { + this.showStatusBar = false; + WindowManager.setWindowMax() + } + } + } +} \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/notification.ets b/product/statusbar/src/main/ets/default/pages/notification.ets new file mode 100644 index 00000000..4374b000 --- /dev/null +++ b/product/statusbar/src/main/ets/default/pages/notification.ets @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from './common/constants.ets' +import FeatureAbility from '@ohos.ability.featureAbility'; +import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' +import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' +import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' +import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon.ets' +import notificationItem from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets' +import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' +import mNotificationService from '../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' + +const TAG = 'StatusBar=====notification' + +@Component +export default +struct Index { + @Link showStatusBar: boolean + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear2, showStatusBar: ${this.showStatusBar}`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { + statusBar() + quicklySetting({ showStatusBar: $showStatusBar}) + notificationItems({ showStatusBar: $showStatusBar}) + } + .width('100%') + .height('100%') + .backgroundColor($r('app.color.default_background')) + .onTouch(this.touchEvent.bind(this)) + } + + touchEvent(event: TouchEvent) { +// Log.showInfo(TAG, 'touchEvent================' + event.touches) + if (event.type == Constants.TOUCHTYPE_DOWN) { + this.startX = event.touches[0].screenX + this.startY = event.touches[0].screenY + Log.showInfo(TAG, `touchStart2=======startX: ${this.startX}, startY: ${this.startY}`) + } else if (event.type == Constants.TOUCHTYPE_MOVE) { + this.moveX = event.touches[0].screenX - this.startX + this.moveY = event.touches[0].screenY - this.startY + } else if (event.type == Constants.TOUCHTYPE_UP) { + Log.showInfo(TAG, `touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`) + if (this.moveY < -30) { + this.showStatusBar = true; + WindowManager.setWindowMin() + } + } + } +} + +@Component +struct statusBar { + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + SignalIcon() + WifiIcon() + } + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + BatteryIcon() + ClockIcon() + } + } + .width('100%') + .height($r('app.float.statusbar_height')) + .backgroundColor($r('app.color.statusbar_background')) + } +} + +@Component +struct quicklySetting { + @Link showStatusBar: boolean + @StorageLink('time') mTime: string = '01:01' + @StorageLink('month') mMonth: number = 1 + @StorageLink('day') mDay: number = 1 + @StorageLink('weekDay') mWeekDay: number = 1 + @State showDay: string = 'day' + @State showMonth: string = 'month' + @State showWeekDay: any = 'weekday' + + aboutToAppear() { + Log.showInfo(TAG, `quicklySetting, aboutToAppear`) + //show month + if (this.mMonth < Constants.DIGITS) { + this.showMonth = '0' + this.mMonth; + } else { + this.showMonth = '' + this.mMonth; + } + //show day + if (this.mDay < Constants.DIGITS) { + this.showDay = '0' + this.mDay; + } else { + this.showDay = '' + this.mDay; + } + //show weekDay + switch (this.mWeekDay) { + case Constants.WEEKDAY_MONDAY: + this.showWeekDay = $r('app.string.monday'); + break; + case Constants.WEEKDAY_TUESDAY: + this.showWeekDay = $r('app.string.tuesday'); + break; + case Constants.WEEKDAY_WEDNESDAY: + this.showWeekDay = $r('app.string.wednesday'); + break; + case Constants.WEEKDAY_THURSDAY: + this.showWeekDay = $r('app.string.thursday'); + break; + case Constants.WEEKDAY_FRIDAY: + this.showWeekDay = $r('app.string.friday'); + break; + case Constants.WEEKDAY_SATURDAY: + this.showWeekDay = $r('app.string.saturday'); + break; + case Constants.WEEKDAY_SUNDAY: + this.showWeekDay = $r('app.string.sunday'); + break; + default: + break; + } + } + + build() { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Start }) { + Text(this.mTime) + .fontColor($r('app.color.quicklysetting_time_fontcolor')) + .fontSize($r('app.float.quicklysetting_time_fontsize')) + Flex({direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center}){ + Text(this.showMonth) + .fontColor($r('app.color.quicklysetting_date_fontcolor')) + .fontSize($r('app.float.quicklysetting_date_fontsize')) + Text($r('app.string.month')) + .fontColor($r('app.color.quicklysetting_date_fontcolor')) + .fontSize($r('app.float.quicklysetting_date_fontsize')) + Text(this.showDay) + .fontColor($r('app.color.quicklysetting_date_fontcolor')) + .fontSize($r('app.float.quicklysetting_date_fontsize')) + Text($r('app.string.day')) + .fontColor($r('app.color.quicklysetting_date_fontcolor')) + .fontSize($r('app.float.quicklysetting_date_fontsize')) + Text(this.showWeekDay) + .fontColor($r('app.color.quicklysetting_date_fontcolor')) + .fontSize($r('app.float.quicklysetting_date_fontsize')) + } + } + .width('50%') + .height('100%') + .margin({ left: $r('app.float.quicklysetting_textflex_marginleft') }) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End }) { + Image($r('app.media.ic_settings')) + .objectFit(ImageFit.Contain) + .onClick(this.settingClick.bind(this)) + } + .width($r('app.float.quicklysetting_image_width')) + .height($r('app.float.quicklysetting_image_height')) + .margin({ right: $r('app.float.quicklysetting_image_marginright') }) + + } + .width('100%') + .height($r('app.float.quicklysetting_height')) + .borderRadius($r('app.float.quicklysetting_borderradius')) + .margin({ left: $r('app.float.quicklysetting_marginleft'), right: $r('app.float.quicklysetting_marginright') }) + } + + settingClick() { + this.showStatusBar = true; + WindowManager.setWindowMin(); + let result = FeatureAbility.startAbility({ + want: { + bundleName: 'com.ohos.settings', + abilityName: 'com.ohos.settings.MainAbility', + }, + }).then(data => + Log.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)).catch(error => + Log.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); + Log.showInfo(TAG, `start ability ${result}`); + } +} + +@Component +struct notificationItems { + @StorageLink('notificationList') notificationList: any[] = [] + @Link showStatusBar: boolean + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + if (this.notificationList.length == 0) { + //text: no notification + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Text($r('app.string.nonotification_text')) + .fontColor($r('app.color.nonotification_text_color')) + } + } else { + Stack({alignContent: Alignment.TopStart}) { + List() { + ForEach(this.notificationList, (item: any) => { //notificationItems + ListItem() { + notificationItem({ itemObject: item, showStatusBar: $showStatusBar }) + } + }, (item: any) => item.id.toString()) + } + Image($r('app.media.delete_all')) //icon: remove all notifications + .objectFit(ImageFit.Contain) + .width($r('app.float.deleteall_image_width')) + .height($r('app.float.deleteall_image_height')) + .borderRadius($r('app.float.deleteall_image_borderradius')) + .opacity($r('app.float.deleteall_image_opacity')) + .onClick(this.removeAllNotification.bind(this)) + .position({ x: '44.5%', y: '85%' }) + } + .width('100%') + .height('100%') + } + } + .width('100%') + .height('100%') + } + + removeAllNotification() { + mNotificationService.removeAllNotifications(); + } +} diff --git a/product/statusbar/src/main/ets/default/pages/twoGroupLayout.ets b/product/statusbar/src/main/ets/default/pages/twoGroupLayout.ets new file mode 100644 index 00000000..a10e847c --- /dev/null +++ b/product/statusbar/src/main/ets/default/pages/twoGroupLayout.ets @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets' +//import featureAbility from '@ohos.ability.featureability'; +import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' +import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' +import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' +import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon.ets' + +@Component +export default struct Index { + private leftGroupOrder : any + private rightGroupOrder : any + private notificationList : any + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + ForEach(this.leftGroupOrder, (item: string) => { + if (item == Constants.WIFI) { + WifiIcon() + } + if (item == Constants.SIGNAL) { + SignalIcon() + } + if (item == Constants.CLOCK) { + ClockIcon() + } + if (item == Constants.BATTERY) { + BatteryIcon() + } + }) + } + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + ForEach(this.notificationList, (item: any) => { + Image(item.icon).objectFit(ImageFit.ScaleDown).height('50%') + }) + } + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + ForEach(this.rightGroupOrder, (item: string) => { + if (item == Constants.WIFI) { + WifiIcon() + } + if (item == Constants.SIGNAL) { + SignalIcon() + } + if (item == Constants.CLOCK) { + ClockIcon() + } + if (item == Constants.BATTERY) { + BatteryIcon() + } + }) + } + } + .width('100%') + .height('100%') + .backgroundColor($r("app.color.Colors.twogroup_layout_background")) + } +} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/element/color.json b/product/statusbar/src/main/resources/base/element/color.json new file mode 100644 index 00000000..89fd5a1c --- /dev/null +++ b/product/statusbar/src/main/resources/base/element/color.json @@ -0,0 +1,35 @@ +{ + "color": [ + { + "name": "default_background", + "value": "#66000000" + }, + { + "name": "index_background", + "value": "#66000000" + }, + { + "name": "statusbar_background", + "value": "#66000000" + }, + { + "name": "quicklysetting_time_fontcolor", + "value": "#ffffffff" + }, + { + "name": "quicklysetting_date_fontcolor", + "value": "#ffffffff" + }, + { + "name": "quicklysetting_background", + "value": "#292830" + }, + { + "name": "nonotification_text_color", + "value": "#ffffffff" + },{ + "name": "twogroup_layout_background", + "value": "#66000000" + } + ] +} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/element/float.json b/product/statusbar/src/main/resources/base/element/float.json new file mode 100644 index 00000000..0cb9bc79 --- /dev/null +++ b/product/statusbar/src/main/resources/base/element/float.json @@ -0,0 +1,72 @@ +{ + "float": [ + { + "name": "statusbar_height", + "value": "67" + }, + { + "name": "quicklysetting_time_fontsize", + "value": "30" + }, + { + "name": "quicklysetting_date_fontsize", + "value": "20" + }, + { + "name": "quicklysetting_textflex_marginleft", + "value": "10" + }, + { + "name": "quicklysetting_image_width", + "value": "50" + }, + { + "name": "quicklysetting_image_height", + "value": "50" + }, + { + "name": "quicklysetting_image_marginright", + "value": "10" + }, + { + "name": "quicklysetting_height", + "value": "120" + }, + { + "name": "quicklysetting_borderradius", + "value": "20" + }, + { + "name": "quicklysetting_marginleft", + "value": "10" + }, + { + "name": "quicklysetting_marginright", + "value": "10" + }, + { + "name": "deleteall_image_width", + "value": "50" + }, + { + "name": "deleteall_image_height", + "value": "50" + }, + { + "name": "deleteall_image_borderradius", + "value": "25" + }, + { + "name": "deleteall_image_opacity", + "value": "0.9" + }, + { + "name": "default_left_width_small", + "value": "230" + }, + { + "name": "default_left_width_large", + "value": "300" + } + ] +} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/element/string.json b/product/statusbar/src/main/resources/base/element/string.json new file mode 100644 index 00000000..d9fd5260 --- /dev/null +++ b/product/statusbar/src/main/resources/base/element/string.json @@ -0,0 +1,51 @@ +{ + "string": [ + { + "name": "app_name", + "value": "SystemUI" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "monday", + "value": "星期一" + }, + { + "name": "tuesday", + "value": "星期二" + }, + { + "name": "wednesday", + "value": "星期三" + }, + { + "name": "thursday", + "value": "星期四" + }, + { + "name": "friday", + "value": "星期五" + }, + { + "name": "saturday", + "value": "星期六" + }, + { + "name": "sunday", + "value": "星期日" + }, + { + "name": "day", + "value": "日" + }, + { + "name": "month", + "value": "月" + },{ + "name": "nonotification_text", + "value": "无通知" + } + ] +} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/media/airplane.svg b/product/statusbar/src/main/resources/base/media/airplane.svg new file mode 100644 index 00000000..d648b9f9 --- /dev/null +++ b/product/statusbar/src/main/resources/base/media/airplane.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/media/airplane_d.svg b/product/statusbar/src/main/resources/base/media/airplane_d.svg new file mode 100644 index 00000000..ad2180b1 --- /dev/null +++ b/product/statusbar/src/main/resources/base/media/airplane_d.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/media/delete_all.png b/product/statusbar/src/main/resources/base/media/delete_all.png new file mode 100644 index 0000000000000000000000000000000000000000..143463751f103bbf00d204cbbd40982b9a5a6ec1 GIT binary patch literal 4061 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 P00000NkvXXu0mjf(|(n6 literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/resources/base/media/ic_settings.png b/product/statusbar/src/main/resources/base/media/ic_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b665b89cd206a3e476f5e9efbe31d482be7a0321 GIT binary patch literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKMSxF;E0F#_5a8H~Cu@LqYm@}} z1v9Kz!j?9FIuBE}!mNZcS4&e#flzNf(Mi1>^=i%1`N3NL4o1n*HdQBu_hvFMFdKWi zIEF+Vej9#s+ad#j78kRdfm2)=4?g|>zd()AfAYJE{uH_A*Cuyvob>9Qm;38_*Xl$w zg_;8Ad2?=RF*z@q+goV#=%cJtiHVZdQUAw>rJKGbt>ZbuVqg*wcDRBmm+e%Z!84E9 zGmVOK{~Sz9ZSWBYJuGgoCl@W7{erOF;$IcgfUmCs@iPs@$<)xc{e&^r`Hz$n5Fc68o!~6m_X;r-3M!*R-C#c`pk^s zJ>T*>EFJ6%T6QFUShJtKpQXsdIE67zW3s}|YH=6SU-PrlN>v`}xS4-du5QippJ`Rn zlFzT2*C&DGO4`=s8kF>v+H*|T5jcEU0pj}>p- z&R(2s@b;??RS90X*HG_Xm(`U0F=ADlvyYehs0yDJnOBw9C1X25<)^Op@q~BX8`ta1P@n&# zQlMZ?9?P2xVMZIL`p>!fQo?`Pha*Q8{uX#SRq~QV<$VUw{C@5NXD`4}D? zS~OS2;k@mRipJAhZ%#R$7J5D1Jw481L5+t=u#l-@Ot#dN<6lnQ?@xF%E6L7fSI?=G zKd;W-{qYPw7g)mGYe$1ILWg+-yu;l zp literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.png b/product/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.png new file mode 100644 index 0000000000000000000000000000000000000000..ef6a536e100c74a1d595d38d1738ba2518c023c5 GIT binary patch literal 622 zcmV-!0+IcRP)Px%C`m*?R9Fe^mOV=YK@f&>iV0W=f*+u0rJbe`EUXlNgN289 zw6?aevJkOKp@<(SDt?p-f`%BMm+XMQWySHKCn z0J&VQhuU!%gI;KdHjq8T6I{bS>^Y8e!}Vvzq%oL<69{Y4NE<767rrZis1eZuEJCNJ z!6V}|=!u0)t04xU18jR>um&5fO4d&J`b^#f2VmO;g9HrvicFBaqZ(6t&eb;c)Haqj z3g+O=Qk~*Yf>tDyNn^C?;hK8S+l`90faER7E>p0_8SunR43@4b(JD5lxq@S+%!1<(mfiin+ENrgxxPI!}R~P;a(juShXC z1Jz7<^EDaMxTR8~AT@T6st*VgHPdL)G~4F&`erx&RiDZALvsYK$q)U5RrO6WnO@Ic ztLnAeP~~0dPsWF(m9N;}8IQ033HJu~Ed1RK)Mu)%K&@8b3rbqYa9sgm_W%F@07*qo IM6N<$f_>!}F#rGn literal 0 HcmV?d00001 diff --git a/product/statusbar/src/main/resources/base/media/icon.png b/product/statusbar/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 + + + ic_notification_wlan + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/media/wifi_d.svg b/product/statusbar/src/main/resources/base/media/wifi_d.svg new file mode 100644 index 00000000..e851f5b3 --- /dev/null +++ b/product/statusbar/src/main/resources/base/media/wifi_d.svg @@ -0,0 +1,17 @@ + + + + ic_notification_wlan + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/product/statusbar/src/main/resources/en_US/element/string.json b/product/statusbar/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..5959fa49 --- /dev/null +++ b/product/statusbar/src/main/resources/en_US/element/string.json @@ -0,0 +1,51 @@ +{ + "string": [ + { + "name": "app_name", + "value": "SystemUI" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "monday", + "value": "monday" + }, + { + "name": "tuesday", + "value": "tuesday" + }, + { + "name": "wednesday", + "value": "wednesday" + }, + { + "name": "thursday", + "value": "thursday" + }, + { + "name": "friday", + "value": "friday" + }, + { + "name": "saturday", + "value": "saturday" + }, + { + "name": "sunday", + "value": "sunday" + }, + { + "name": "day", + "value": "day" + }, + { + "name": "month", + "value": "month" + },{ + "name": "nonotification_text", + "value": "no notification" + } + ] +} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/rawfile/layoutConfig.json b/product/statusbar/src/main/resources/rawfile/layoutConfig.json new file mode 100644 index 00000000..2e8a01b7 --- /dev/null +++ b/product/statusbar/src/main/resources/rawfile/layoutConfig.json @@ -0,0 +1,7 @@ +{ + "groupNumber" : 2, + "twoGroups": { + "leftGroupOrder": ["signal","wifi"], + "rightGroupOrder": ["battery","clock"] + } +} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/zh_CN/element/string.json b/product/statusbar/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..d9fd5260 --- /dev/null +++ b/product/statusbar/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,51 @@ +{ + "string": [ + { + "name": "app_name", + "value": "SystemUI" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "monday", + "value": "星期一" + }, + { + "name": "tuesday", + "value": "星期二" + }, + { + "name": "wednesday", + "value": "星期三" + }, + { + "name": "thursday", + "value": "星期四" + }, + { + "name": "friday", + "value": "星期五" + }, + { + "name": "saturday", + "value": "星期六" + }, + { + "name": "sunday", + "value": "星期日" + }, + { + "name": "day", + "value": "日" + }, + { + "name": "month", + "value": "月" + },{ + "name": "nonotification_text", + "value": "无通知" + } + ] +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 015fb8d5..2ac679d6 100755 --- a/settings.gradle +++ b/settings.gradle @@ -12,4 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -include ':entry', ':navigationBar', ':systemDialog' \ No newline at end of file +include ':entry', ':product:navigationBar', ':systemDialog', ':common', ':product:statusbar', + ':features:control', ':features:batterycomponent', ':features:clockcomponent', + ':features:signalcomponent', ':features:wificomponent', ':features:navigationservice', + ':features:noticeitem', ':features:notificationservice' \ No newline at end of file -- Gitee From 7d640abf1b768566380b6b5af58047d8df34610c Mon Sep 17 00:00:00 2001 From: croy-chenchen Date: Sat, 18 Sep 2021 15:05:22 +0800 Subject: [PATCH 011/373] =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=8F=E7=A9=BA?= =?UTF-8?q?=E7=BC=BA=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: croy-chenchen --- .../main/ets/default/pages/defaultLayout.ets | 37 +++++++++++++------ .../src/main/ets/default/pages/index.ets | 6 ++- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/product/statusbar/src/main/ets/default/pages/defaultLayout.ets b/product/statusbar/src/main/ets/default/pages/defaultLayout.ets index d1b41960..10566269 100644 --- a/product/statusbar/src/main/ets/default/pages/defaultLayout.ets +++ b/product/statusbar/src/main/ets/default/pages/defaultLayout.ets @@ -23,24 +23,39 @@ import Constants from './common/constants.ets' @Component export default struct Index { private notificationList : any + private ListLength : number @StorageLink('wifiStatus') wifiStatus : boolean = false build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - SignalIcon() - WifiIcon() - }.width(this.wifiStatus ? $r('app.float.default_left_width_large') : $r('app.float.default_left_width_small')) - .margin({ left: 10 }) - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - ForEach(this.notificationList, (item: any) => { - Image(item.icon).objectFit(ImageFit.ScaleDown).height('50%') - }) - }.width(this.notificationList.length * Constants.DEFAULT_MIDDLE_PART_WIDTH) + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Column() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + SignalIcon() + WifiIcon() + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + ForEach(this.notificationList, (item: any) => { + Column() { + Image(item.icon).objectFit(ImageFit.ScaleDown).height('50%') + } + .width(45) + }) + if(this.ListLength > (this.wifiStatus ? 3 : 4)) { + Row() { + Text('...') + .fontSize(20) + } + } + } + .width(this.wifiStatus ? 4*45+20-50 : 4*45+20) + } + } + .width('65%') + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { BatteryIcon() ClockIcon() } + .width('35%') } .width('100%') .height('100%') diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets index 2e91d9de..67a72b4d 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -34,6 +34,7 @@ struct Index { @State moveX: number = 0 @State moveY: number = 0 @State showStatusBar: boolean = true + @StorageLink('wifiStatus') wifiStatus : boolean = false @StorageLink('notificationList') notificationList : any = [] aboutToAppear() { @@ -50,7 +51,10 @@ struct Index { if (this.showStatusBar) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { DefaultLayout({ - notificationList: this.notificationList.length > 2 ? this.notificationList.slice(0,3) : this.notificationList }) + ListLength : this.notificationList.length, + notificationList: this.notificationList.length > (this.wifiStatus ? 2 : 3) ? + this.notificationList.slice(0,(this.wifiStatus ? 3 : 4)) : + this.notificationList }) } .width('100%') .height('100%') -- Gitee From f7dfe725248310421efafde0fa11138c20294c33 Mon Sep 17 00:00:00 2001 From: LiuZhenyu2021 Date: Sat, 18 Sep 2021 18:30:48 +0800 Subject: [PATCH 012/373] update readme and fix some bugs Signed-off-by: LiuZhenyu2021 --- README_zh.md | 39 +-- common/src/main/ets/default/WindowManager.ets | 6 +- .../default/abilitymanager/bundleManager.ets | 27 +- .../abilitymanager/featureAbilityManager.ets | 66 +++++ .../abilitymanager/notificationManager.ets | 70 +++-- doc/Instructions.md | 258 ++++++++++++++++++ .../src/main/ets/default/batteryModel.ets | 23 +- .../main/ets/default/pages/batteryIcon.ets | 4 + .../src/main/ets/default/pages/batteryPic.ets | 12 +- .../src/main/ets/default/pages/batterySoc.ets | 10 + .../src/main/ets/default/pages/clockIcon.ets | 6 +- .../src/main/ets/default/timeModel.ets | 32 ++- .../common/brightness/brightnessManager.ets | 23 +- .../control/common/volume/VolumeModel.ets | 18 +- .../com/ohos/control/pages/ControlCenter.ets | 8 +- .../com/ohos/control/pages/IconComponent.ets | 28 +- .../ets/com/ohos/control/pages/UpTitle.ets | 38 ++- .../ohos/control/pages/airPlaneComponent.ets | 13 +- .../control/pages/brightnessComponent.ets | 8 +- .../ohos/control/pages/volumeComponent.ets | 35 ++- .../com/ohos/control/pages/wifiComponent.ets | 16 +- .../ohos/navigationservice/ConfigManager.ets | 6 +- .../ohos/navigationservice/KeyCodeEvent.ets | 45 ++- .../common/{strings.ets => constants.ets} | 5 +- .../com/ohos/noticeItem/common/constants.ets | 12 +- .../ets/com/ohos/noticeItem/item/longItem.ets | 27 +- .../com/ohos/noticeItem/item/multiItem.ets | 25 +- .../ohos/noticeItem/item/notificationItem.ets | 8 +- .../com/ohos/noticeItem/item/titleItem.ets | 11 +- .../NotificationService.ets | 62 ++--- .../src/main/ets/default/common/constants.ets | 8 +- .../src/main/ets/default/pages/signalIcon.ets | 17 +- .../src/main/ets/default/signalModel.ets | 55 ++-- .../src/main/ets/default/common/constants.ets | 16 +- .../src/main/ets/default/pages/wifiIcon.ets | 13 +- .../src/main/ets/default/wifiModel.ets | 21 +- figures/TS_01.png | Bin 0 -> 179052 bytes figures/TS_02.png | Bin 0 -> 156607 bytes figures/cmd1.png | Bin 0 -> 71867 bytes figures/cmd2.png | Bin 0 -> 110399 bytes figures/cmd3.png | Bin 0 -> 24588 bytes figures/commit_source_clone_page.png | Bin 0 -> 165623 bytes figures/commit_source_fork_button.png | Bin 0 -> 169052 bytes figures/commit_source_fork_confirm.png | Bin 0 -> 24250 bytes figures/commit_source_forked_repo.jpg | Bin 0 -> 121406 bytes figures/commit_source_new_pr_done copy.png | Bin 0 -> 29494 bytes figures/commit_source_new_pr_done.png | Bin 0 -> 29494 bytes .../commit_source_new_pull_request copy.png | Bin 0 -> 53511 bytes figures/commit_source_new_pull_request.png | Bin 0 -> 86062 bytes ...t_source_new_pull_request_confirm copy.png | Bin 0 -> 43340 bytes ...commit_source_new_pull_request_confirm.png | Bin 0 -> 43340 bytes figures/downLoadSDK_01.png | Bin 0 -> 37067 bytes figures/downLoad_01.png | Bin 0 -> 118418 bytes figures/downLoad_02.png | Bin 0 -> 61351 bytes figures/downLoad_03.png | Bin 0 -> 46171 bytes figures/downLoad_04.png | Bin 0 -> 33993 bytes figures/downLoad_05.png | Bin 0 -> 165386 bytes figures/downLoad_06.png | Bin 0 -> 238501 bytes figures/ds_build_haps.png | Bin 0 -> 13633 bytes figures/ds_hilog_window.png | Bin 0 -> 74859 bytes figures/ds_ohosbuild_output_dir_debug.png | Bin 0 -> 14099 bytes figures/ds_ohosbuild_output_dir_release.png | Bin 0 -> 14362 bytes figures/ds_ohosbuild_variants.png | Bin 0 -> 17602 bytes figures/ds_ohosbuild_variants_debug.png | Bin 0 -> 19164 bytes figures/ds_ohosbuild_variants_release.png | Bin 0 -> 13028 bytes figures/gitee_01.png | Bin 0 -> 70315 bytes figures/hap_repo.png | Bin 0 -> 102316 bytes figures/importProject.png | Bin 0 -> 24539 bytes figures/screenshot-20210521-105407.png | Bin 0 -> 60040 bytes figures/screenshot-20210521-110433.png | Bin 0 -> 71270 bytes figures/screenshot-20210521-111223.png | Bin 0 -> 25883 bytes figures/signature_1.png | Bin 0 -> 20463 bytes figures/signature_2.png | Bin 0 -> 37697 bytes figures/signature_3.png | Bin 0 -> 73718 bytes .../common/image_hdpi/ic_navigation_back.png | Bin 599 -> 0 bytes .../common/image_hdpi/ic_navigation_home.png | Bin 640 -> 0 bytes .../image_hdpi/ic_navigation_recent.png | Bin 345 -> 0 bytes .../common/image_mdpi/ic_navigation_back.png | Bin 409 -> 0 bytes .../common/image_mdpi/ic_navigation_home.png | Bin 420 -> 0 bytes .../image_mdpi/ic_navigation_recent.png | Bin 221 -> 0 bytes .../common/image_xhdpi/ic_navigation_back.png | Bin 818 -> 0 bytes .../common/image_xhdpi/ic_navigation_home.png | Bin 955 -> 0 bytes .../image_xhdpi/ic_navigation_recent.png | Bin 411 -> 0 bytes .../image_xxhdpi/ic_navigation_back.png | Bin 1292 -> 0 bytes .../image_xxhdpi/ic_navigation_home.png | Bin 1438 -> 0 bytes .../image_xxhdpi/ic_navigation_recent.png | Bin 599 -> 0 bytes .../image_xxxhdpi/ic_navigation_back.png | Bin 1743 -> 0 bytes .../image_xxxhdpi/ic_navigation_home.png | Bin 2022 -> 0 bytes .../image_xxxhdpi/ic_navigation_recent.png | Bin 733 -> 0 bytes .../ets/default/common/utils/configReader.ets | 7 +- .../src/main/ets/default/pages/index.ets | 9 +- .../src/main/ets/default/pages/keyButton.ets | 12 +- .../src/main/ets/default/pages/oneLayout.ets | 12 +- .../main/ets/default/pages/threeLayout.ets | 10 + .../common/image_hdpi/ic_status_battery.png | Bin 300 -> 0 bytes .../common/image_hdpi/ic_status_signal.png | Bin 333 -> 0 bytes .../image_hdpi/ic_statusbar_signal_full.png | Bin 314 -> 0 bytes .../image_hdpi/ic_statusbar_signal_half.png | Bin 342 -> 0 bytes .../image_hdpi/ic_statusbar_signal_no.png | Bin 296 -> 0 bytes .../image_hdpi/ic_statusbar_signal_null.png | Bin 423 -> 0 bytes .../ic_statusbar_signal_roaming.png | Bin 227 -> 0 bytes .../image_hdpi/ic_statusbar_signal_wait.png | Bin 246 -> 0 bytes .../image_hdpi/ic_statusbar_wifi_connect.png | Bin 189 -> 0 bytes .../image_hdpi/ic_statusbar_wifi_full.png | Bin 484 -> 0 bytes .../image_hdpi/ic_statusbar_wifi_no.png | Bin 577 -> 0 bytes .../image_hdpi/ic_statusbar_wifi_pause.png | Bin 189 -> 0 bytes .../default/common/image_mdpi/delete_all.png | Bin 4061 -> 0 bytes .../default/common/image_mdpi/ic_settings.png | Bin 1060 -> 0 bytes .../common/image_mdpi/ic_status_battery.png | Bin 579 -> 0 bytes .../common/image_mdpi/ic_status_signal.png | Bin 569 -> 0 bytes .../image_mdpi/ic_statusbar_signal_full.png | Bin 377 -> 0 bytes .../image_mdpi/ic_statusbar_signal_half.png | Bin 420 -> 0 bytes .../image_mdpi/ic_statusbar_signal_no.png | Bin 346 -> 0 bytes .../image_mdpi/ic_statusbar_signal_null.png | Bin 525 -> 0 bytes .../ic_statusbar_signal_roaming.png | Bin 411 -> 0 bytes .../image_mdpi/ic_statusbar_signal_wait.png | Bin 442 -> 0 bytes .../image_mdpi/ic_statusbar_wifi_connect.png | Bin 369 -> 0 bytes .../image_mdpi/ic_statusbar_wifi_full.png | Bin 959 -> 0 bytes .../image_mdpi/ic_statusbar_wifi_no.png | Bin 1135 -> 0 bytes .../image_mdpi/ic_statusbar_wifi_pause.png | Bin 293 -> 0 bytes .../common/image_xhdpi/ic_status_battery.png | Bin 337 -> 0 bytes .../common/image_xhdpi/ic_status_signal.png | Bin 299 -> 0 bytes .../image_xhdpi/ic_statusbar_signal_full.png | Bin 221 -> 0 bytes .../image_xhdpi/ic_statusbar_signal_half.png | Bin 245 -> 0 bytes .../image_xhdpi/ic_statusbar_signal_no.png | Bin 222 -> 0 bytes .../image_xhdpi/ic_statusbar_signal_null.png | Bin 340 -> 0 bytes .../ic_statusbar_signal_roaming.png | Bin 258 -> 0 bytes .../image_xhdpi/ic_statusbar_signal_wait.png | Bin 282 -> 0 bytes .../image_xhdpi/ic_statusbar_wifi_connect.png | Bin 331 -> 0 bytes .../image_xhdpi/ic_statusbar_wifi_full.png | Bin 622 -> 0 bytes .../image_xhdpi/ic_statusbar_wifi_no.png | Bin 756 -> 0 bytes .../image_xhdpi/ic_statusbar_wifi_pause.png | Bin 190 -> 0 bytes .../common/image_xxhdpi/delete_all.png | Bin 4061 -> 0 bytes .../common/image_xxhdpi/ic_settings.png | Bin 1060 -> 0 bytes .../common/image_xxhdpi/ic_status_battery.png | Bin 579 -> 0 bytes .../common/image_xxhdpi/ic_status_signal.png | Bin 569 -> 0 bytes .../image_xxhdpi/ic_statusbar_signal_full.png | Bin 377 -> 0 bytes .../image_xxhdpi/ic_statusbar_signal_half.png | Bin 420 -> 0 bytes .../image_xxhdpi/ic_statusbar_signal_no.png | Bin 346 -> 0 bytes .../image_xxhdpi/ic_statusbar_signal_null.png | Bin 525 -> 0 bytes .../ic_statusbar_signal_roaming.png | Bin 411 -> 0 bytes .../image_xxhdpi/ic_statusbar_signal_wait.png | Bin 442 -> 0 bytes .../ic_statusbar_wifi_connect.png | Bin 369 -> 0 bytes .../image_xxhdpi/ic_statusbar_wifi_full.png | Bin 959 -> 0 bytes .../image_xxhdpi/ic_statusbar_wifi_no.png | Bin 1135 -> 0 bytes .../image_xxhdpi/ic_statusbar_wifi_pause.png | Bin 293 -> 0 bytes .../image_xxxhdpi/ic_status_battery.png | Bin 687 -> 0 bytes .../common/image_xxxhdpi/ic_status_signal.png | Bin 470 -> 0 bytes .../ic_statusbar_signal_full.png | Bin 243 -> 0 bytes .../ic_statusbar_signal_half.png | Bin 278 -> 0 bytes .../image_xxxhdpi/ic_statusbar_signal_no.png | Bin 243 -> 0 bytes .../ic_statusbar_signal_null.png | Bin 485 -> 0 bytes .../ic_statusbar_signal_roaming.png | Bin 467 -> 0 bytes .../ic_statusbar_signal_wait.png | Bin 524 -> 0 bytes .../ic_statusbar_wifi_connect.png | Bin 313 -> 0 bytes .../image_xxxhdpi/ic_statusbar_wifi_full.png | Bin 1183 -> 0 bytes .../image_xxxhdpi/ic_statusbar_wifi_no.png | Bin 1483 -> 0 bytes .../image_xxxhdpi/ic_statusbar_wifi_pause.png | Bin 201 -> 0 bytes .../src/main/ets/default/pages/control.ets | 18 +- .../main/ets/default/pages/defaultLayout.ets | 48 +++- .../src/main/ets/default/pages/index.ets | 24 +- .../main/ets/default/pages/notification.ets | 61 +++-- .../main/ets/default/pages/twoGroupLayout.ets | 10 +- .../systemDialog}/build.gradle | 4 +- .../systemDialog}/package.json | 0 .../systemDialog}/src/main/config.json | 18 +- .../systemDialog/src/main/ets/default/app.ets | 11 +- .../src/main/ets/default/dialogModel.ets | 66 +++-- .../src/main/ets/default/pages/index.ets | 173 ++++++++++++ .../main/resources/base/element/color.json | 20 ++ .../main/resources/base/element/string.json | 12 + .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 24 ++ .../main/resources/zh_CN/element/string.json | 24 ++ settings.gradle | 2 +- systemDialog/.gitignore | 1 - .../src/main/js/default/i18n/en-US.json | 7 - .../src/main/js/default/i18n/zh-CN.json | 7 - .../src/main/js/default/pages/index/index.css | 119 -------- .../src/main/js/default/pages/index/index.hml | 40 --- .../src/main/js/default/pages/index/index.js | 128 --------- 181 files changed, 1218 insertions(+), 720 deletions(-) rename systemDialog/src/main/js/default/app.js => common/src/main/ets/default/abilitymanager/bundleManager.ets (53%) create mode 100644 common/src/main/ets/default/abilitymanager/featureAbilityManager.ets rename systemDialog/src/main/js/default/common/utils/Log.js => common/src/main/ets/default/abilitymanager/notificationManager.ets (35%) create mode 100644 doc/Instructions.md rename features/navigationservice/src/main/ets/com/ohos/navigationservice/common/{strings.ets => constants.ets} (97%) create mode 100644 figures/TS_01.png create mode 100644 figures/TS_02.png create mode 100644 figures/cmd1.png create mode 100644 figures/cmd2.png create mode 100644 figures/cmd3.png create mode 100644 figures/commit_source_clone_page.png create mode 100644 figures/commit_source_fork_button.png create mode 100644 figures/commit_source_fork_confirm.png create mode 100644 figures/commit_source_forked_repo.jpg create mode 100644 figures/commit_source_new_pr_done copy.png create mode 100644 figures/commit_source_new_pr_done.png create mode 100644 figures/commit_source_new_pull_request copy.png create mode 100644 figures/commit_source_new_pull_request.png create mode 100644 figures/commit_source_new_pull_request_confirm copy.png create mode 100644 figures/commit_source_new_pull_request_confirm.png create mode 100644 figures/downLoadSDK_01.png create mode 100644 figures/downLoad_01.png create mode 100644 figures/downLoad_02.png create mode 100644 figures/downLoad_03.png create mode 100644 figures/downLoad_04.png create mode 100644 figures/downLoad_05.png create mode 100644 figures/downLoad_06.png create mode 100644 figures/ds_build_haps.png create mode 100644 figures/ds_hilog_window.png create mode 100644 figures/ds_ohosbuild_output_dir_debug.png create mode 100644 figures/ds_ohosbuild_output_dir_release.png create mode 100644 figures/ds_ohosbuild_variants.png create mode 100644 figures/ds_ohosbuild_variants_debug.png create mode 100644 figures/ds_ohosbuild_variants_release.png create mode 100644 figures/gitee_01.png create mode 100644 figures/hap_repo.png create mode 100644 figures/importProject.png create mode 100644 figures/screenshot-20210521-105407.png create mode 100644 figures/screenshot-20210521-110433.png create mode 100644 figures/screenshot-20210521-111223.png create mode 100644 figures/signature_1.png create mode 100644 figures/signature_2.png create mode 100644 figures/signature_3.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_hdpi/ic_navigation_back.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_hdpi/ic_navigation_home.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_hdpi/ic_navigation_recent.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_mdpi/ic_navigation_back.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_mdpi/ic_navigation_home.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_mdpi/ic_navigation_recent.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_back.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_home.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_recent.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_back.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_home.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_recent.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_back.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_home.png delete mode 100644 product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_recent.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_status_battery.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_status_signal.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_signal_full.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_signal_half.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_signal_no.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_signal_null.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_signal_roaming.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_signal_wait.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_wifi_connect.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_wifi_full.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_wifi_no.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_wifi_pause.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/delete_all.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_settings.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_status_battery.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_status_signal.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_full.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_half.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_no.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_null.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_roaming.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_wait.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_connect.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_full.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_no.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_pause.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_status_battery.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_status_signal.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_full.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_half.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_no.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_null.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_roaming.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_wait.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_connect.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_full.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_no.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_pause.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/delete_all.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_settings.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_status_battery.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_status_signal.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_full.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_half.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_no.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_null.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_roaming.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_wait.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_connect.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_full.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_no.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_pause.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_status_battery.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_status_signal.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_full.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_half.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_no.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_null.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_roaming.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_wait.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_connect.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_full.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_no.png delete mode 100644 product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_pause.png rename {systemDialog => product/systemDialog}/build.gradle (60%) rename {systemDialog => product/systemDialog}/package.json (100%) rename {systemDialog => product/systemDialog}/src/main/config.json (85%) rename features/navigationservice/src/main/ets/com/ohos/navigationservice/common/colors.ets => product/systemDialog/src/main/ets/default/app.ets (78%) rename systemDialog/src/main/js/default/center/systemDialogCenter/SystemDialogCenter.js => product/systemDialog/src/main/ets/default/dialogModel.ets (37%) create mode 100644 product/systemDialog/src/main/ets/default/pages/index.ets create mode 100644 product/systemDialog/src/main/resources/base/element/color.json rename {systemDialog => product/systemDialog}/src/main/resources/base/element/string.json (46%) rename {systemDialog => product/systemDialog}/src/main/resources/base/media/icon.png (100%) create mode 100644 product/systemDialog/src/main/resources/en_US/element/string.json create mode 100644 product/systemDialog/src/main/resources/zh_CN/element/string.json delete mode 100644 systemDialog/.gitignore delete mode 100644 systemDialog/src/main/js/default/i18n/en-US.json delete mode 100644 systemDialog/src/main/js/default/i18n/zh-CN.json delete mode 100644 systemDialog/src/main/js/default/pages/index/index.css delete mode 100644 systemDialog/src/main/js/default/pages/index/index.hml delete mode 100644 systemDialog/src/main/js/default/pages/index/index.js diff --git a/README_zh.md b/README_zh.md index 3bd1d8eb..385abf6a 100755 --- a/README_zh.md +++ b/README_zh.md @@ -2,8 +2,8 @@ - [简介](#section11660541593) - [架构图](#section125101832114213) - - [目录](#section161941989596) +- [使用说明](#section123459000) - [相关仓](#section1371113476307) ## 简介 @@ -18,22 +18,29 @@ SystemUI应用是OpenHarmony中预置的系统应用,为用户提供系统相 ``` /applications/standard/systemui -├── figures # 架构图目录 -├── entry # 主entry模块目录 -│ └── src -│ ├── main -│ ├── js # js代码目录 -│ ├── resources # 资源配置文件存放目录 -│ └── config.json # 全局配置文件 -├── navigationBar # 系统导航模块目录 -│ └── src -│ ├── main -│ ├── js # js代码目录 -│ ├── resources # 资源配置文件存放目录 -│ └── config.json # 全局配置文件 -├── signature # 证书文件目录 -├── LICENSE # 许可文件 + ├── build.gradle # 全局编译配置文件 + ├── settings.gradle # 编译模块配置文件 + ├── LICENSE # 许可文件 + ├── common # 通用工具类目录 + ├── entry # entry模块目录 + ├── signature # 证书文件目录 + ├── features # 子组件目录 + │ ├── batterycomponent # 电池组件 + │ ├── clockcomponent # 时间组件 + │ ├── control # 控制中心组件 + │ ├── navigationservice # 导航栏服务组件 + │ ├── noticeitem # 通知子组件 + │ ├── notificationservice # 通知服务组件 + │ ├── signalcomponent # sim卡信号组件 + │ ├── wificomponent # wifi组件 + ├── product # SystemUI总体功能目录 + ├── navigationBar # 导航栏模块目录 + ├── statusbar # 状态栏模块目录 + ├── systemDialog # 系统弹框模块目录 ``` +## 使用说明 + + 参见使用说明([使用说明](./doc/Instructions.md)) ## 相关仓 diff --git a/common/src/main/ets/default/WindowManager.ets b/common/src/main/ets/default/WindowManager.ets index 9fa155d9..db14a28b 100644 --- a/common/src/main/ets/default/WindowManager.ets +++ b/common/src/main/ets/default/WindowManager.ets @@ -31,11 +31,12 @@ export default class WindowManager { * * @param {Object} callback - Callback function. */ - static setWindowMax() { + setWindowMax(callback) { Log.showInfo(TAG, 'enter setWindowMax ================='); Window.getTopWindow().then((windowData)=> { windowData.resetSize(MAX_WIDTH, MAX_HEIGHT).then((result)=> { Log.showInfo(TAG, result); + callback(result); }); }); } @@ -45,11 +46,12 @@ export default class WindowManager { * * @param {Object} callback - Callback function. */ - static setWindowMin() { + setWindowMin(callback) { Log.showInfo(TAG, 'enter setWindowMin ================='); Window.getTopWindow().then((windowData)=> { windowData.resetSize(MAX_WIDTH, MIN_HEIGHT).then((result)=> { Log.showInfo(TAG, result); + callback(result); }); }); } diff --git a/systemDialog/src/main/js/default/app.js b/common/src/main/ets/default/abilitymanager/bundleManager.ets similarity index 53% rename from systemDialog/src/main/js/default/app.js rename to common/src/main/ets/default/abilitymanager/bundleManager.ets index 2ea1b337..05b7c525 100644 --- a/systemDialog/src/main/js/default/app.js +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ets @@ -13,15 +13,22 @@ * limitations under the License. */ -import mLog from '../default/common/utils/Log.js'; +import BundleMgr from '@ohos.bundle'; +import Resmgr from '@ohos.resourceManager'; +import Log from '../Log.ets'; -const TAG = 'app'; +const TAG = 'BRManager'; -export default { - onCreate() { - mLog.showInfo(TAG, ` AceApplication onCreate`); - }, - onDestroy() { - mLog.showInfo(TAG, ` AceApplication onDestroy`); - } -}; +export default class BundleManager { + + static getResourceManager(tag, bundleName, then) { + Log.showInfo(TAG, `getResourceManager from: ${tag}`)); + Resmgr.getResourceManager(bundleName).then(then); + } + + static getBundleInfo(tag, bundleName, getInfo, then) { + Log.showInfo(TAG, `getBundleInfo from: ${tag}`)); + BundleMgr.getBundleInfo(bundleName, getInfo).then(then); + } + +} \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ets b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ets new file mode 100644 index 00000000..730f8fa5 --- /dev/null +++ b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ets @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2021 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 FeatureAbility from '@ohos.ability.featureAbility'; +import Log from '../Log.ets'; + +const TAG = 'FeatureAbilityManager'; + +export default class FeatureAbilityManager { + + openAbility(tag, want) { + Log.showInfo(TAG, `openAbility from: ${tag}`)); + let result = FeatureAbility.startAbility(want) + .then(data => + Log.showInfo(TAG, `tag: ${tag} promise then: ${JSON.stringify(data)}`)) + .catch(error => + Log.showError(TAG, `tag: ${tag} promise catch: ${JSON.stringify(error)}`)); + Log.showInfo(TAG, `tag: ${tag} openAbility result: ${result}`); + } + + getAbilityWant(listener) { + FeatureAbility.getWant((err, data) => { + Log.showInfo(TAG, `getAbilityWant callBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + if (err.code !== 0) { + Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); + return; + } else { + if(listener != null && listener != undefined) { + listener(data); + } + } + }); + } + + finishAbilityWithResult(abilityResult) { + FeatureAbility.finishWithResult(abilityResult, (err, data) => { + if (err.code !== 0) { + Log.showError(TAG, `failed to finishWithResult because ${JSON.stringify(err)}`); + return; + } + FeatureAbilityManager.finishAbility(); + }); + } + + static finishAbility() { + FeatureAbility.terminateAbility((err, data) => { + if (err.code !== 0) { + Log.showError(TAG, `failed to finishAbility because ${JSON.stringify(err)}`); + return; + } + Log.showInfo(TAG, ` finishAbility callback err: ${JSON.stringify(err)} data:${data}`); + }); + } +} \ No newline at end of file diff --git a/systemDialog/src/main/js/default/common/utils/Log.js b/common/src/main/ets/default/abilitymanager/notificationManager.ets similarity index 35% rename from systemDialog/src/main/js/default/common/utils/Log.js rename to common/src/main/ets/default/abilitymanager/notificationManager.ets index 320a8178..4522f535 100644 --- a/systemDialog/src/main/js/default/common/utils/Log.js +++ b/common/src/main/ets/default/abilitymanager/notificationManager.ets @@ -13,40 +13,38 @@ * limitations under the License. */ -var TAG = 'SystemUI_Dialog'; +//import { NotificationSubscriber } from './notification/notificationSubscriber'; +import Notification from '@ohos.notification'; +import Log from '../Log.ets'; -/** - * Basic log class - */ -export default class Log { - - /** - * print info level log - * - * @param {string} tag - Page or class tag - * @param {string} log - Log needs to be printed - */ - static showInfo(tag, log) { - console.info(`${TAG} tag: ${tag} --> ${log}`); - } - - /** - * print debug level log - * - * @param {string} tag - Page or class tag - * @param {string} log - Log needs to be printed - */ - static showDebug(tag, log) { - console.debug(`${TAG} tag: ${tag} --> ${log}`); - } - - /** - * print error level log - * - * @param {string} tag - Page or class tag - * @param {string} log - Log needs to be printed - */ - static showError(tag, log) { - console.error(`${TAG} tag: ${tag} --> ${log}`); - } -} +const TAG = 'NotificationManager'; + + +export default class NotificationManager { + + static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; + static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; + static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; + + static subscribeNotification(tag, subscriber, asyncCallback) { + Log.showInfo(TAG, `subscribeNotification from: ${tag}`)); + Notification.subscribe(subscriber, asyncCallback); + } + + static unsubscribeNotification(tag, subscriber) { + Log.showInfo(TAG, `subscribeNotification from: ${tag}`)); + Notification.unsubscribe(subscriber); + } + + static removeAll(tag, callback) { + Log.showInfo(TAG, `removeAll from: ${tag}`)); + Notification.removeAll(callback); + } + + static remove(tag, hashCode, callback) { + Log.showInfo(TAG, `remove from: ${tag}`)); + Notification.remove(hashCode, callback) + } + + +} \ No newline at end of file diff --git a/doc/Instructions.md b/doc/Instructions.md new file mode 100644 index 00000000..9ad3abb5 --- /dev/null +++ b/doc/Instructions.md @@ -0,0 +1,258 @@ +# SystemUI 使用说明 +## 代码使用 +### 代码下载 +#### 配置码云ssh +1. 打开本地git bash窗口 +2. 进入到.ssh 目录:cd ~/.ssh +3. 找到id_rsa.pub文件:ls +4. 查看公钥:cat id_rsa.pub +5. 在码云个人设置-安全设置-ssh公钥中配置公钥 + +#### 下载代码 + 1. 打开码云SystemUI地址([下载地址](https://gitee.com/openharmony/applications_systemui))。 + 2. 选择克隆/下载 - ssh方式 -复制下载地址 + 3. 本机git bash 中执行: + ``` + git clone '复制的下载地址' + ``` + +### 环境搭建 +打开DevEco Studio链接下载安装,安装步骤及安装说明详见下载地址([下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download)) + +## 基础开发说明 +### 系统接口调用 +#### NAPI接口集成 +- 导入指定模块 +``` JavaScript +import bundle from '@ohos.bundle'; +``` +- 调用模块中的相应函数 +``` JavaScript +bundle.getApplicationInfos().then(data => { + +}); +``` +### 异步回调的使用 +- 在需要回调操作的ets文件中创建回调函数 +```JavaScript +subscribeCallback(err, data){ + // do something +}, +``` +- 调用应用内部封装的接口,并传入回调函数 +```JavaScript +Notification.subscribe(mSubscriber, this.subscribeCallback.bind(this)); +``` +- 在AsyncCallback返回数据时可以获取到错误信息或目标数据 +```JavaScript +subscribeCallback(err, data) { + Log.showInfo(TAG, 'subscribeCallback finished ====================' + JSON.stringify(data)); +} +``` +### 如何引用资源文件 +- 在.ets文件中,可直接通过$r()引用资源 +```` JavaScript +this.title = this.$r('app.string.hello_world'); +```` + +## 典型接口的使用 + 1. 获取电池状态接口 + ``` JavaScript + import BatteryInfo from '@ohos.batteryInfo' + // 根据TS的文件描述,获取对应的电池属性 + + batterySOC = BatteryInfo.batterySOC; // 电池剩余电量 0~100; + batteryCharging = BatteryInfo.chargingStatus; // 电池充电状态 + ``` + 2. 返回按键 + ``` JavaScript + import input from '@ohos.injectEventHandler' + // 在触摸开始及结束时分别调用 + onTouchStart(){ + let res = input.injectEventSync({ + isPressed: true, // 是否为按下 + keyCode: 2, // 对应code + keyDownDuration: 1 // keydown 时长 + }); + }, + onTouchStop(){ + let res = input.injectEventSync({ + isPressed: false, // 是否为按下 + keyCode: 2, // 对应code + keyDownDuration: 1 // keydown 时长 + }); + } + ``` +## 签名打包 +### 签名 +#### 签名文件的获取 +1. 拷贝OpenHarmony标准版 工程的 prebuilts\signcenter 目录到操作目录 +2. 拷贝SystemUI 工程的 signature\systemui.p7b 到该目录下 +#### 签名文件的配置 +打开项目工程,选择 File → Project Structure + +![](../figures/signature_1.png) + +选择 Modules → Signing Configs,将对应的签名文件配置如下,完成后点击Apply,再点击OK。 + +![](../figures/signature_2.png) + +配置完成后,对应的build.gradle文件中会出现如下内容 + +![](../figures/signature_3.png) +### 打包 +DevEco Studio 支持 debug 与 release 两种打包类型。可以在 OhosBuild Variants 窗口中进行切换。 + + ![](../figures/ds_ohosbuild_variants.png) + +#### debug打包 +1. 代码准备完成后,在 OhosBuild Variants 窗口的 Selected Variant 中选择 debug。 + + ![](../figures/ds_ohosbuild_variants_debug.png) + +2. 选择Build → Build Haps(s)/APP(s) → Build Hap(s) + + ![](../figures/ds_build_haps.png) + +3. 编译完成后,hap包会生成在工程目录下的 `\build\outputs\hap\debug\phone\`路径下(如果没有配置签名,则只会生成未签名的hap包) + + ![](../figures/ds_ohosbuild_output_dir_debug.png) +#### release打包 +1. 代码准备完成后,在 OhosBuild Variants 窗口的 Selected Variant 中选择 release + + ![](../figures/ds_ohosbuild_variants_release.png) + +2. 选择Build → Build Haps(s)/APP(s) → Build Hap(s) + + ![](../figures/ds_build_haps.png) + +3. 编译完成后,hap包会生成在工程目录下的 `\build\outputs\hap\release\phone\`路径下(配置好签名后,生成的hap包会显示signed) + + ![](../figures/ds_ohosbuild_output_dir_release.png) +## 安装、运行、调试 +## 应用安装 +配置 hdc: +进入SDK目录中的toolchains文件夹下,获取文件路径: + +![](../figures/screenshot-20210521-105407.png) + +> 注意,此处的hdc.exe如果版本较老,可能不能正常使用,需要获取新的hdc.exe文件 +> hdc命令介绍与下载详见:[hdc仓库地址](https://gitee.com/openharmony/developtools_hdc_standard) + + +并将此路径配置到环境变量中: + +![](../figures/screenshot-20210521-111223.png) + +重启电脑使环境变量生效 + +连接开发板,打开cmd命令窗口,执行hdc list targets,弹出窗口如下: + +![](../figures/cmd1.png) + +等待一段时间后,窗口出现如下打印,可回到输入 hdc list targets 的命令窗口继续操作: + +![](../figures/cmd2.png) + +再次输入hdc list targets,出现如下结果,说明hdc连接成功 + +![](../figures/cmd3.png) + +获取读写权限: + +``` +hdc target mount +``` +将签名好的 hap 包放入设备的 `/system/app` 目录下,并修改hap包的权限 + +``` +hdc file send 本地路径 /system/app/hap包名称 +例如:hdc file send SystemUI-StatusBar.hap /system/app/SystemUI-StatusBar.hap +``` +> 注意,如果设备不存在 `/system/app` 目录,则需要手动创建该目录并修改权限。 +> ``` +> hdc shell +> cd system +> mkdir app +> chmod 777 app +> ``` +> `/system/app` 目录放置系统应用,例如:Launcher,SystemUI,Settings 等。 +> +> 但hap包需要在该目录下手动设置权限 +> ``` +> chmod 666 hap包名 +> ``` +> 此目录应用不用手动安装,系统自动拉起。 +## 应用运行 +SystemUI属于系统应用,在将签名的 hap 包放入 `/system/app` 目录后,重启系统,应用会自动拉起。 +``` +hdc shell +reboot +(不可以直接执行hdc reboot,命令是无效的) +``` +> 注意,如果设备之前安装过系统应用,则需要执行如下两条命令清除设备中存储的应用信息才能够在设备重启的时候将我们装入设备的新 hap 包正常拉起。 +> ``` +> hdc shell rm -rf /data/misc_de/0/mdds/0/default/bundle_manager_service +> hdc shell rm -rf /data/accounts +> ``` +## 应用调试 +### log打印 +- 在程序中添加 log +```JS +console.info("SystemUI log info"); +``` +### log获取及过滤 +- log获取 + +将log输出至文件 +``` +hdc shell hilog > 输出文件名称 +``` + +例: +在真实环境查看log,将全log输出到当前目录的hilog.log文件中 +``` +hdc shell hilog > hilog.log +``` + +- log过滤 + +在命令行窗口中过滤log +``` +hilog │ grep 过滤信息 +``` + +例:过滤包含信息 Label 的 hilog +``` +hilog │ grep Label +``` +## 贡献代码 +### Fork 代码仓库 +1. 在码云上打开 SystemUI 代码仓库([仓库地址](https://gitee.com/openharmony/applications_systemui))。 + +2. 点击仓库右上角的 Forked 按钮,在弹出的画面中,选择将仓库 fork 到哪里,点击确认。 + +3. Fork 成功之后,会在自己的账号下看见 fork 的代码仓库。 + +### 提交代码 +1. 访问我们自己在码云账号上 fork 的代码仓库,点击“克隆/下载”按钮,选择 SSH,点击“复制”按钮。 + +2. 在本地新建 SystemUI 目录,在 SystemUI 目录中执行如下命令 + ``` + git clone 步骤1中复制的地址 + ``` + +3. 修改代码。 + > 将代码引入工程,以及编译工程等相关内容请参见 **3. 代码使用** 部分的相关内容。 +4. 提交代码到 fork 仓库。 + > 修改后的代码,首先执行 `git add` 命令,然后执行 `git commit` 命令与 `git push` 命令,将代码 push 到我们自己的 fork 仓中。 + > 关于代码提交的这部分内容涉及 git 的使用,可以参照 [git官网](https://git-scm.com/) 的内容,在此不再赘述。 + +### 发起 Pull Request (PR) +在将代码提交到 fork 仓之后,我们可以通过发起 Pull Request(PR)的方式来为 OpenHarmony 的相关项目贡献代码。 + +1. 打开 fork 仓库。选择 `Pull Requests` → `新建 Pull Request` + +2. 在 `新建 Pull Request` 画面填入标题与说明,点击 `创建` 按钮。 + +3. 创建 Pull Request 完成。 PR 创建完成后,会有专门的代码审查人员对代码进行评审,评审通过之后会合入相应的代码库。 \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ets b/features/batterycomponent/src/main/ets/default/batteryModel.ets index 69e0cd94..481c4377 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ets +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ets @@ -13,27 +13,26 @@ * limitations under the License. */ -import Log from "../../../../../../common/src/main/ets/default/Log.ets"; +import Log from '../../../../../../common/src/main/ets/default/Log.ets'; import Constants from './common/constants.ets'; import BatteryInfo from '@ohos.batteryInfo'; -import BatterySubscriber from '@ohos.commonevent'; +import BatterySubscriber from '@ohos.commonEvent'; -const TAG = 'batteryStatus'; +const TAG = 'BatteryComponent-batteryModel'; let mProgress = Constants.DEFAULT_PROGRESS; let mBatteryEventSubscriber = null; let mBatteryEventSubscribeInfo = { events: ['usual.event.BATTERY_CHANGED'] } -var mAppStorage = AppStorage.GetOrCreate(); var mBatterySoc; var mBatteryCharging; export class BatteryModel { initBatteryModel() { Log.showInfo(TAG, 'initBatteryModel'); - mBatterySoc = mAppStorage.setAndLink("batterySoc", 0); - mBatteryCharging = mAppStorage.setAndLink("batteryCharging", false); + mBatterySoc = AppStorage.SetAndLink('batterySoc', 0); + mBatteryCharging = AppStorage.SetAndLink('batteryCharging', false); if (mBatteryEventSubscriber == null) { this.registerBatteryListener(); } @@ -41,6 +40,7 @@ export class BatteryModel { } uninitBatteryModel() { + Log.showInfo(TAG, 'uninitBatteryModel'); this.unregisterBatteryListener(); } @@ -60,6 +60,7 @@ export class BatteryModel { * */ private unregisterBatteryListener() { + Log.showInfo(TAG, 'unregisterBatteryListener'); BatterySubscriber.unsubscribe(mBatteryEventSubscriber, () => { Log.showInfo(TAG, `unregister Battery Status Listener ===============`); }); @@ -73,7 +74,7 @@ export class BatteryModel { */ private createBatterySubscriberCallBack(err, data) { - Log.showInfo(TAG, `Subscriberregister createBatterySubscriberCallBack ${JSON.stringify(err)} ${JSON.stringify(data)}`); + Log.showInfo(TAG, `Subscriberregister createBatterySubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); mBatteryEventSubscriber = data; BatterySubscriber.subscribe(mBatteryEventSubscriber, this.batterySubscriberCallBack.bind(this)); } @@ -87,7 +88,7 @@ export class BatteryModel { */ private batterySubscriberCallBack(err, data) { - Log.showInfo(TAG, `Subscriberregister data == ${JSON.stringify(data)}`); + Log.showInfo(TAG, `batterySubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); if (err.code == 0) { if (data.event == 'usual.event.BATTERY_CHANGED') { this.getBatteryStatus(); @@ -102,6 +103,7 @@ export class BatteryModel { * Get battery status and remaining power */ private getBatteryStatus() { + Log.showInfo(TAG,'getBatteryStatus') let batterySoc = BatteryInfo.batterySOC; let batteryCharging = BatteryInfo.chargingStatus; if (null == batterySoc) { @@ -127,7 +129,7 @@ export class BatteryModel { * @param {object} callback - Function callback */ private checkBatteryStatus(charging, callback) { - Log.showInfo(TAG, `Battery updateBattery checkBatteryStatus: ${charging}`); + Log.showInfo(TAG, `checkBatteryStatus charging: ${charging}`); let batteryStatus; switch (charging) { case Constants.NONE: @@ -147,5 +149,4 @@ export class BatteryModel { } let mBatteryModel = new BatteryModel(); -export default mBatteryModel as BatteryModel -; +export default mBatteryModel as BatteryModel; diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index 365a02b8..8fc47fb0 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -17,7 +17,9 @@ import mBatteryModel from '../batteryModel.ets'; import BatteryPic from './batteryPic.ets' import BatterySoc from './batterySoc' import Constants from '../common/constants.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +const TAG = 'BatteryComponent-batteryIcon' @Component export default struct BatteryIcon { @@ -25,10 +27,12 @@ struct BatteryIcon { aboutToAppear() { mBatteryModel.initBatteryModel(); + Log.showInfo(TAG,'aboutToAppear'); } aboutToDisappear() { mBatteryModel.uninitBatteryModel(); + Log.showInfo(TAG,'aboutToDisappear'); } build() { diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets index 64100eaa..8f880079 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -15,13 +15,20 @@ import Constants from '../common/constants.ets' import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -const TAG = 'battery' +const TAG = 'BatteryComponent-batteryPic' @Component export default struct BatteryPic { @StorageLink('batterySoc') batterySoc: number = 100 @StorageLink('batteryCharging') batteryCharging : boolean = false + aboutToAppear(){ + Log.showInfo(TAG,'aboutToAppear Start'); + } + + aboutToDisappear(){ + Log.showInfo(TAG,'aboutToDisappear'); + } build() { @@ -57,8 +64,7 @@ struct BatteryPic { } private getBatteryColor(val, charging) { - Log.showInfo(TAG, `charging ${ charging }`); - Log.showInfo(TAG, `val ${ val }`); + Log.showInfo(TAG, `getBatteryColor, val: ${ val } charging: ${ charging } `); if (charging) { return $r('app.color.battery_charging_color'); } else if (val <= Constants.BATTERY_LEVEL_LOW) { diff --git a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets index b51c74bc..86e6a90e 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -13,11 +13,21 @@ * limitations under the License. */ +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +const TAG = 'BatteryComponent-batterySoc' @Component export default struct BatterySoc { @StorageLink('batterySoc') batterySoc: number = 100 + aboutToAppear(){ + Log.showInfo(TAG,'aboutToAppear Start'); + } + + aboutToDisappear(){ + Log.showInfo(TAG,'aboutToDisappear'); + } + build() { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Text(this.batterySoc + '%') diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index ddce9d21..d29fb59d 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -15,7 +15,7 @@ import timeModel from '../timeModel.ets' import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -const TAG = 'clockIcon'; +const TAG = 'ClockComponent-clockIcon'; @Component export default struct ClockIcon { @@ -23,12 +23,12 @@ export default struct ClockIcon { @StorageLink('time') mTime: string = '16:01' aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`); + Log.showInfo(TAG, 'aboutToAppear'); timeModel.initTimeModel(); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`); + Log.showInfo(TAG, 'aboutToDisappear'); timeModel.unInitTimeModel(); } diff --git a/features/clockcomponent/src/main/ets/default/timeModel.ets b/features/clockcomponent/src/main/ets/default/timeModel.ets index 9137179d..22ff486b 100644 --- a/features/clockcomponent/src/main/ets/default/timeModel.ets +++ b/features/clockcomponent/src/main/ets/default/timeModel.ets @@ -16,15 +16,14 @@ import Log from '../../../../../../common/src/main/ets/default/Log.ets' const SHORT_LENGTH = 1; const LOOP_TIME = 3000; -const TAG = 'timeModel'; +const TAG = 'ClockComponent-timeModel'; -var mAppStorage = AppStorage.GetOrCreate(); var timeInterval = null; -var mTimeLink -var mDayLink -var mWeekDayLink -var mMonthLink +var mTimeLink; +var mDayLink; +var mWeekDayLink; +var mMonthLink; export class TimeModel { @@ -34,20 +33,20 @@ export class TimeModel { * */ initTimeModel() { - Log.showInfo(TAG, `initTimeModel`); + Log.showInfo(TAG, 'initTimeModel'); Log.showInfo(TAG, `timeInterval : ${timeInterval} type: ${typeof timeInterval}`); if (timeInterval === null || timeInterval === undefined) { - Log.showInfo(TAG, `first initTimeModel`); - mTimeLink = mAppStorage.setAndLink('time', ''); - mDayLink = mAppStorage.setAndLink('day', ''); - mWeekDayLink = mAppStorage.setAndLink('weekDay', ''); - mMonthLink = mAppStorage.setAndLink('month', ''); + Log.showInfo(TAG, 'first initTimeModel'); + mTimeLink = AppStorage.SetAndLink('time', ''); + mDayLink = AppStorage.SetAndLink('day', ''); + mWeekDayLink = AppStorage.SetAndLink('weekDay', ''); + mMonthLink = AppStorage.SetAndLink('month', ''); this.getCurrentDate(); } } unInitTimeModel() { - Log.showInfo(TAG, `unInitTimeModel`); + Log.showInfo(TAG, 'unInitTimeModel'); } /** @@ -55,7 +54,7 @@ export class TimeModel { * */ private getCurrentDate() { - Log.showInfo(TAG, `getCurrentDate`); + Log.showInfo(TAG, 'getCurrentDate'); this.getDate(); timeInterval = setInterval(() => { this.getDate(); @@ -63,6 +62,7 @@ export class TimeModel { } private getDate(){ + Log.showInfo(TAG, 'getDate'); let date = new Date(); Log.showInfo(TAG, `getCurrentDate ${date.toTimeString()}`); this.updateTime(date); @@ -81,6 +81,7 @@ export class TimeModel { * @param {Object} date - Object of Date. */ private updateTime(date) { + Log.showInfo(TAG,`updateDay, date:${JSON.stringify(date)}`) let time = date.toTimeString().substring(0, 5); mTimeLink.set(time); } @@ -91,6 +92,7 @@ export class TimeModel { * @param {Object} date - Object of Date. */ private updateDay(date) { + Log.showInfo(TAG,`updateDay, date:${JSON.stringify(date)}`) let day = date.getDate(); mDayLink.set(day); } @@ -101,6 +103,7 @@ export class TimeModel { * @param {Object} date - Object of Date. */ private updateWeekDay(date) { + Log.showInfo(TAG,`updateWeekDay, date:${JSON.stringify(date)}`) let weekDay = date.getDay(); mWeekDayLink.set(weekDay); } @@ -111,6 +114,7 @@ export class TimeModel { * @param {Object} date - Object of Date. */ private updateMonth(date) { + Log.showInfo(TAG,`updateMonth, date:${JSON.stringify(date)}`) let month = (date.getMonth() + 1); mMonthLink.set(month); } diff --git a/features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets b/features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets index 6b47eaa3..ad366aaf 100644 --- a/features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets +++ b/features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets @@ -15,17 +15,16 @@ import brightness from '@ohos.brightness'; import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; -import commonEvent from '@ohos.commonevent'; +import commonEvent from '@ohos.commonEvent'; -const TAG = 'BrightnessManager'; +const TAG = 'Control-brightnessManager'; const EVENT = 'BRIGHTNESS_VALUE_SYSTEM_UI'; let mCommonEventSubscribeInfo = { events: ['BRIGHTNESS_VALUE'] }; let curValue = 10; let mCommonEventSubscriber =null; -var mAppStorage = AppStorage.GetOrCreate(); -var mBrightnessValue = mAppStorage.setAndLink("BrightnessValue",0); +var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 0); export class brightnessManager{ @@ -40,32 +39,35 @@ export class brightnessManager{ } createBrightnessSubscriberCallBack(err, data) { - Log.showInfo(TAG, `Subscriberregister createBrightnessSubscriberCallBack ${JSON.stringify(err)} ${JSON.stringify(data)}`); + Log.showInfo(TAG, `createBrightnessSubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); mCommonEventSubscriber = data; commonEvent.subscribe(mCommonEventSubscriber, this.BrightnessSubscriberCallBack.bind(this)); } BrightnessSubscriberCallBack(err, data) { - Log.showInfo(TAG,`Subscriberregister data == ${JSON.stringify(data)}`); - Log.showInfo(TAG, `Subscriberregister err == ${JSON.stringify(err)}`); + Log.showInfo(TAG,`BrightnessSubscriberCallBack, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); if (err.code == 0) { if(data.data == '-1'){ this.sendEvent(mBrightnessValue.get()); }else{ - mBrightnessValue.set(data.data); + Log.showInfo(TAG, `BrightnessSubscriberCallBack set${parseInt(data.data)}`); + mBrightnessValue.set(parseInt(data.data)); + Log.showInfo(TAG, `BrightnessSubscriberCallBack set${mBrightnessValue.get()}`); } }else{ Log.showInfo(TAG,'Subscriberregister error when subscribing ========'); } } - unregisterWiFiStatusListener() { + unRegisterBrightnessListener() { + Log.showInfo(TAG,'unRegisterBrightnessListener') commonEvent.unsubscribe(mCommonEventSubscriber, () => { - Log.showInfo(TAG, `Subscriberregister unregister Wifi Status Listener ===============`); + Log.showInfo(TAG, 'Subscriberregister unregister Brightness Status Listener ==============='); }); } setValue(callback) { + Log.showInfo(TAG, 'setValue'); let value = parseInt(callback.value); Log.showInfo(TAG, `setValue ${ value }`); mBrightnessValue.set(value); @@ -75,6 +77,7 @@ export class brightnessManager{ } sendEvent(value){ + Log.showInfo(TAG, `sendEvent value: ${ value }`); Log.showInfo(TAG, `sendEvent ${ value }`); let commonEventPublishData = { bundleName: 'com.ohos.systemui', diff --git a/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets b/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets index 65077a3d..790506f3 100644 --- a/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets +++ b/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets @@ -16,22 +16,24 @@ import audio from '@ohos.multimedia.audio'; import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; -let TAG = "VolumeModel"; +let TAG = 'Control-VolumeModel'; export default class VolumeModel { constructor() { } - setVolume(volumeValue, volumeTpye){ - Log.showInfo(TAG, `setvolume = ` + volumeValue + "volumeTpye = " + volumeTpye); + setVolume(volumeValue, volumeType){ + Log.showInfo(TAG, `setVolume volumeValue: ${JSON.stringify(volumeValue)} volumeType:${JSON.stringify(volumeType)} `); - audio.getAudioManager().setVolume(volumeTpye, volumeValue).then(() => { - console.info('Promise returned to indicate a successful volume setting.') + audio.getAudioManager().setVolume(volumeType, volumeValue).then(() => { + Log.showInfo(TAG,'Promise returned to indicate a successful volume setting.') }); } getVolume(callback, volumeType) { + Log.showInfo(TAG, `getVolume volumeType:${volumeType} `); audio.getAudioManager().getVolume(volumeType, (err, value) => { + if (err) { Log.showInfo(TAG, `Failed to obtain the volume. ${err.message}`); return; @@ -42,7 +44,8 @@ export default class VolumeModel { } getMaxVolume(callback, volumeType) { - audio.getAudioManager().getVolume(volumeType, (err, value) => { + Log.showInfo(TAG, `getMaxVolume volumeType:${volumeType} `); + audio.getAudioManager().getMaxVolume(volumeType, (err, value) => { if (err) { Log.showInfo(TAG, `Failed to obtain the volume. ${err.message}`); return; @@ -53,7 +56,8 @@ export default class VolumeModel { } getMinVolume(callback, volumeType) { - audio.getAudioManager().getVolume(volumeType, (err, value) => { + Log.showInfo(TAG, `getMaxVolume volumeType:${volumeType} `); + audio.getAudioManager().getMinVolume(volumeType, (err, value) => { if (err) { Log.showInfo(TAG, `Failed to obtain the volume. ${err.message}`); return; diff --git a/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets b/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets index 116500ca..2da99c2a 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets @@ -19,6 +19,8 @@ import {ElseWifiComponent} from './wifiComponent.ets' import {MyBrightness} from './brightnessComponent.ets' import {MyVol} from './volumeComponent.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +const TAG='Control-ControlCenter' @Component export default @@ -26,7 +28,11 @@ struct ControlCenterComponent { @Link showStatusBar: boolean aboutToAppear() { - console.log("Control Center aboutToAppear") + Log.showInfo(TAG,'aboutToAppear') + } + + aboutToDisappear () { + Log.showInfo(TAG,'aboutToDisappear ') } build() { diff --git a/features/control/src/main/ets/com/ohos/control/pages/IconComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/IconComponent.ets index 2db30ef1..c12a7035 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/IconComponent.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/IconComponent.ets @@ -16,23 +16,29 @@ import {IconWidth, IconHeight} from './Uniform.ets'; import mWifiManger from '../../../../../../../../wificomponent/src/main/ets/default/WifiModel.ets'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +const TAG='Control-IconComponent' @Component export struct IconComponent { @State iconOnBG: any = $r('app.color.icon_on_bg') - private iconOn: string = "" + private iconOn: string = '' @State iconOffBG: any = $r('app.color.icon_off_bg') - private iconOff: string = "" + private iconOff: string = '' @Link OnOrOff: boolean @State OnOrOffShow: boolean = false - @StorageLink("flyModelStatus") flyModelStatus: boolean = false - @StorageLink("wifiOpenStatus") wifiOpenStatus: boolean = false + @StorageLink('flyModelStatus') flyModelStatus: boolean = false + @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = false aboutToAppear() { + Log.showInfo(TAG,'aboutToAppear') mWifiManger.initWifiModel(); } + aboutToDisappear () { + Log.showInfo(TAG,'aboutToDisappear') + } build() { Column() { @@ -79,14 +85,18 @@ struct IconComponent { export struct IconFlyComponent { @State iconOnBG: any = $r('app.color.icon_on_bg') - private iconOn: string = "" + private iconOn: string = '' @State iconOffBG: any = $r('app.color.icon_off_bg') - private iconOff: string = "" - @StorageLink("flyModelStatus") flyModelStatus: boolean = false - @StorageLink("wifiOpenStatus") wifiOpenStatus: boolean = false + private iconOff: string = '' + @StorageLink('flyModelStatus') flyModelStatus: boolean = false + @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = false aboutToAppear() { - console.log('IconFlyComponent, aboutToAppear') + Log.showInfo(TAG,'aboutToAppear') + } + + aboutToDisappear () { + Log.showInfo(TAG,'aboutToDisappear') } build() { diff --git a/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets b/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets index 48d690d8..98206cee 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets @@ -13,16 +13,28 @@ * limitations under the License. */ -import FeatureAbility from '@ohos.ability.featureability'; -import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import FeatureAbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; +import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -var TAG = 'UpTitle' +const TAG = 'Control-UpTitle' + +let mWindowManager; +let mFeatureAbilityManager; @Component export struct UpTitle { @Link showStatusBar: boolean + aboutToAppear() { + Log.showInfo(TAG,'aboutToAppear'); + mWindowManager = new WindowManager(); + mFeatureAbilityManager = new FeatureAbilityManager(); + } + aboutToDisappear () { + Log.showInfo(TAG,'aboutToDisappear') + } + build() { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.End, justifyContent: FlexAlign.SpaceBetween }) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { @@ -46,17 +58,13 @@ struct UpTitle { settingClick() { this.showStatusBar = true; - WindowManager.setWindowMin(); - let result = FeatureAbility.startAbility({ - want: { - bundleName: 'com.ohos.settings', - abilityName: 'com.ohos.settings.MainAbility', - }, - }) - .then(data => - Log.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)) - .catch(error => - Log.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); - Log.showInfo(TAG, `start ability ${result}`); + mWindowManager.setWindowMin((result)=>{ + mFeatureAbilityManager.openAbility(TAG, { + want: { + bundleName: 'com.ohos.settings', + abilityName: 'com.ohos.settings.MainAbility', + } + }); + }); } } \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/pages/airPlaneComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/airPlaneComponent.ets index 37772c6e..0e3accd6 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/airPlaneComponent.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/airPlaneComponent.ets @@ -14,12 +14,23 @@ */ import {IconFlyComponent} from './IconComponent.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +const TAG = 'Control-airPlaneComponent' @Component export struct AirPlaneComponent { @State flyModel: boolean = false - @StorageLink("flyModelStatus") flyModelStatus: boolean = this.flyModel + @StorageLink('flyModelStatus') flyModelStatus: boolean = this.flyModel + + aboutToAppear(){ + Log.showInfo(TAG,'aboutToAppear') + } + + aboutToDisappear (){ + Log.showInfo(TAG,'aboutToDisappear ') + } + private IconInfo: any[] = [ '', $r('app.media.airplane_d'), diff --git a/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets index d84cb646..4706affa 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets @@ -17,7 +17,7 @@ import brightness from '@ohos.brightness'; import mBrightnessManager from '../common/brightness/brightnessManager.ets'; import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -const TAG = 'MyBrightness' +const TAG = 'Control-brightnessComponent' @Component @@ -31,11 +31,13 @@ struct MyBrightness { }; aboutToAppear() { - mBrightnessManager.registerBrightnessListener(); - this.brightnessItem.value = this.brightnessValue; Log.showInfo(TAG, `Brightness aboutToAppear ${JSON.stringify(this.brightnessItem)}`); } + aboutToDisappear (){ + Log.showInfo(TAG,'aboutToDisappear') + } + setBrightness(value) { Log.showInfo(TAG, `setBrightness = ${value}`); mBrightnessManager.setValue(value); diff --git a/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets index 26252209..7c1c4f57 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets @@ -14,42 +14,47 @@ */ import audio from '@ohos.multimedia.audio'; -import VolumeModel from '../common/volume/VolumeModel.ets' +import VolumeModel from '../common/volume/VolumeModel.ets'; import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -const TAG = 'ControlCenter' -const volumeTpye = 'audio.AudioVolumeType.MEDIA' +const TAG = 'Control-volumeComponent' +const volumeType = audio.AudioVolumeType.MEDIA; let volumeModel = new VolumeModel(); let volume = { value: 7, minValue: 0, maxValue: 10, -} +}; @Component export struct MyVol { private audioManager = audio.getAudioManager(); + aboutToDisappear () { + Log.showInfo(TAG,'aboutToDisappear') + } + initVolume() { - volumeModel.getMaxVolume(volume, volumeTpye); - volumeModel.getMinVolume(volume, volumeTpye); - volumeModel.getVolume(volume, volumeTpye); - Log.showInfo(TAG, `initVolume ${volume.value} ${volume.minValue} ${volume.maxValue} `) + volumeModel.getMaxVolume(volume, volumeType); + volumeModel.getMinVolume(volume, volumeType); + volumeModel.getVolume(volume, volumeType); + Log.showInfo(TAG, `initVolume ${volume.value} ${volume.minValue} ${volume.maxValue} `); } - setVolume(volumeValue, volumeTpye) { - Log.showInfo(TAG, `setVolume = ${volume.value} Type = ${volumeTpye}`) - audio.getAudioManager().setVolume(volumeTpye, volumeValue).then(() => { - console.info("Promise returned to indicate a successful volume setting") + + setVolume(volumeValue, volumeType) { + Log.showInfo(TAG, `setVolume = ${volume.value} Type = ${volumeType}`) + audio.getAudioManager().setVolume(volumeType, volume.value).then(() => { + Log.showInfo(TAG,'Promise returned to indicate a successful volume setting') }) } aboutToAppear() { - console.log("Start init Volume!") + Log.showInfo(TAG,'Start init Volume!') this.initVolume() - console.log("Finished init Volume!") + Log.showInfo(TAG,'Finished init Volume!') } build() { @@ -76,7 +81,7 @@ struct MyVol { .selectedColor(Color.Blue) .onChange((value: number) => { volume.value = value - this.setVolume(volume, volumeTpye) + this.setVolume(volume, volumeType) }) } .width('85%') diff --git a/features/control/src/main/ets/com/ohos/control/pages/wifiComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/wifiComponent.ets index 1d8a5e98..2dfb6286 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/wifiComponent.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/wifiComponent.ets @@ -14,13 +14,23 @@ */ import {IconComponent} from './IconComponent.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +const TAG= 'Control-wifiComponent' @Component export struct ElseWifiComponent { - @StorageLink("flyModelStatus") flyModelStatus: boolean = false - @StorageLink("wifiName") title: string = 'WLAN' - @StorageLink("wifiOpenStatus") wifiOpenStatus: boolean = false + @StorageLink('flyModelStatus') flyModelStatus: boolean = false + @StorageLink('wifiName') title: string = 'WLAN' + @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = false + aboutToAppear() { + Log.showInfo(TAG,'aboutToAppear') + } + + aboutToDisappear () { + Log.showInfo(TAG,'aboutToDisappear') + } + private IconInfo: any[] = [ 'common/png/ic_notification_switch_off_bg.svg', $r('app.media.wifi_d'), diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets b/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets index 69a58bb1..271a77df 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets @@ -15,17 +15,15 @@ const STORAGE_NAVIGATION_TYPE = 'navigationType'; -var mAppStorage; - export class ConfigManager{ constructor() { } initConfig() { - mAppStorage = AppStorage.GetOrCreate(); + var mLayoutConfig = AppStorage.SetAndLink("navigationType", 0); // mAppStorage.setOrCreate(STORAGE_NAVIGATION_TYPE,TYPE_THREE); - mAppStorage.setOrCreate('navigationType', 3); + mLayoutConfig.set(3); } } diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets index bd21cb59..687a3aff 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets @@ -14,39 +14,40 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import Strings from './common/strings.ets'; -import FeatureAbility from '@ohos.ability.featureability'; +import Constants from './common/constants.ets'; +import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; import Input from '@ohos.injectEventHandler'; const TAG = 'KeyCodeEvent' let res; +let mFeatureAbilityManager = new FeatureAbilityManager(); export class KeyCodeEvent{ public sendKeyEvent(keyCode: number, eventType: number) { Log.showInfo(TAG, `sendKeyEvent keycode: ${keyCode} type: ${eventType}`); switch (keyCode) { - case Strings.KEYCODE_BACK: + case Constants.KEYCODE_BACK: Log.showInfo(TAG, `sendKeyEvent case back type: ${eventType}`); - if (eventType === Strings.KEY_DOWN) { + if (eventType === Constants.KEY_DOWN) { Log.showInfo(TAG, 'sendKeyEvent, if'); this.sendBackKeyEventStart();//down - } else if (eventType === Strings.KEY_UP) { + } else if (eventType === Constants.KEY_UP) { Log.showInfo(TAG, `sendKeyEvent, else type: ${eventType}`); this.sendBackKeyEventEnd();//up } break; - case Strings.KEYCODE_HOME: + case Constants.KEYCODE_HOME: Log.showInfo(TAG, `sendKeyEvent case home type: ${eventType}`); - if (eventType === Strings.KEY_UP) { + if (eventType === Constants.KEY_UP) { Log.showInfo(TAG, 'sendKeyEvent, if'); this.sendHomeKeyEvent(); } break; - case Strings.KEYCODE_RECENT: + case Constants.KEYCODE_RECENT: Log.showInfo(TAG, `sendKeyEvent case recent type: ${eventType}`); - if (eventType === Strings.KEY_UP) { + if (eventType === Constants.KEY_UP) { Log.showInfo(TAG, 'sendKeyEvent, if'); this.sendRecentKeyEvent(); } @@ -80,28 +81,22 @@ export class KeyCodeEvent{ private sendHomeKeyEvent() { Log.showInfo(TAG, 'sendHomeKeyEvent'); Log.showInfo(TAG, 'home click and start ability launcher'); - let result = FeatureAbility.startAbility({ + mFeatureAbilityManager.openAbility(TAG, { want: { - bundleName: Strings.LAUNCHER_BUNDLE_NAME, - abilityName: Strings.LAUNCHER_ABILITY_NAME, - }, - }).then(data => - console.log("data " + JSON.stringify(data))).catch(error => - console.log("error " + JSON.stringify(error))); - console.log("result " + result)); + bundleName: Constants.LAUNCHER_BUNDLE_NAME, + abilityName: Constants.LAUNCHER_ABILITY_NAME + } + }); } private sendRecentKeyEvent() { Log.showInfo(TAG, 'sendRecentKeyEvent'); - let result = FeatureAbility.startAbility({ + mFeatureAbilityManager.openAbility(TAG, { want: { - bundleName: Strings.RECENT_BUNDLE_NAME, - abilityName: Strings.RECENT_ABILITY_NAME, - }, - }).then(data => - Log.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)).catch(error => - Log.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); - Log.showInfo(TAG, `start ability ${result}`); + bundleName: Constants.RECENT_BUNDLE_NAME, + abilityName: Constants.RECENT_ABILITY_NAME + } + }); } } diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/strings.ets b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ets similarity index 97% rename from features/navigationservice/src/main/ets/com/ohos/navigationservice/common/strings.ets rename to features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ets index 104e0c0e..c154329d 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/strings.ets +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ets @@ -13,18 +13,15 @@ * limitations under the License. */ -export default class strings { +export default class Constants { static TYPE_THREE: number = 3; static TYPE_ONE: number = 1; - static KEY_DOWN: number = 0; static KEY_UP: number = 1; - static LAUNCHER_BUNDLE_NAME:string = 'com.ohos.launcher'; static LAUNCHER_ABILITY_NAME:string = 'com.ohos.launcher.MainAbility'; static RECENT_BUNDLE_NAME:string = 'com.ohos.launcher'; static RECENT_ABILITY_NAME:string = 'com.ohos.launcher.recents.MainAbility'; - static KEYCODE_BACK: number = 1; static KEYCODE_HOME: number = 2; static KEYCODE_RECENT: number = 3; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets index 7cf97b56..7c46d3d2 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets @@ -22,12 +22,12 @@ export default class Constants { static NOTIFICATION_TYPE_MEDIA: string = '5' static TEXT_MAX_LENGTH: number = 21 static TEXT_EXPANDED_MAX_LENGTH: number = 13 - static TOUCHTYPE_DOWN: number = 0; - static TOUCHTYPE_UP: number = 1; - static TOUCHTYPE_MOVE: number = 2; - static HIDDEN_TRANSLATEX: number = 150; - static DISPLAY_TRANSLATEX: number = -150; - static REMOVE_TRANSLATEX: number = 150; + static TOUCH_TYPE_DOWN: number = 0; + static TOUCH_TYPE_UP: number = 1; + static TOUCH_TYPE_MOVE: number = 2; + static HIDDEN_TRANSLATE_X: number = 150; + static DISPLAY_TRANSLATE_X: number = -150; + static REMOVE_TRANSLATE_X: number = 150; static DEFAULT_MAX_LINES: number= 1; static CONTENT_LINE_HEIGHT: number = 20; } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets index 299cffa7..036db5c1 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets @@ -20,7 +20,9 @@ import mNotificationService from '../../../../../../../../../features/notificati import WantAgent from '@ohos.wantAgent' import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets' -const TAG = 'longItem' +const TAG = 'NoticeItem-LongItem'; + +let mWindowManager; @Component export default @@ -48,6 +50,7 @@ struct longItem { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear id: ${this.notificationId}`) + mWindowManager = new WindowManager(); if (this.notificationContent.length > Constants.TEXT_MAX_LENGTH) { this.needExpand = true; } else { @@ -59,8 +62,12 @@ struct longItem { this.showMaxLines = Constants.DEFAULT_MAX_LINES; } + Log.showInfo(TAG, `aboutToAppear showMaxLines: ${this.showMaxLines} ${typeof this.showMaxLines}`) } + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear id: ${this.notificationId}`) + } build() { Row() { @@ -123,28 +130,28 @@ struct longItem { } touchNotificationItem(event: TouchEvent) { - if (event.type == Constants.TOUCHTYPE_DOWN) { //down + if (event.type == Constants.TOUCH_TYPE_DOWN) { //down this.startX = event.touches[0].x this.startY = event.touches[0].y Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`) - } else if (event.type == Constants.TOUCHTYPE_MOVE) { //move + } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move this.moveX = event.touches[0].x - this.startX this.moveY = event.touches[0].y - this.startY - } else if (event.type == Constants.TOUCHTYPE_UP) { //up + } else if (event.type == Constants.TOUCH_TYPE_UP) { //up Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`) if (this.iconDisplay) { - if (this.moveX > Constants.HIDDEN_TRANSLATEX) { + if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { //hidden this.iconDisplay = false; this.itemWidth = '100%' Log.showInfo(TAG, 'hidden'); } } else { - if (this.moveX < Constants.DISPLAY_TRANSLATEX) { + if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { this.iconDisplay = true; this.itemWidth = '70%' Log.showInfo(TAG, 'display'); - } else if (this.moveX > Constants.REMOVE_TRANSLATEX) { + } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { this.removeNotificationItem(this.notificationHashCode) } } @@ -158,8 +165,10 @@ struct longItem { clickNotificationItem() { //close window - WindowManager.setWindowMin() this.showStatusBar = true + mWindowManager.setWindowMin((result)=>{ + Log.showInfo(TAG, `setWindowMin ${result}`); + }); //open app Log.showInfo(TAG, `longitemClick wantAgent ${JSON.stringify(this.notificationWant)} id: ${this.notificationId}`); let TriggerInfo = { @@ -175,4 +184,4 @@ struct longItem { //remove notification this.removeNotificationItem(this.notificationHashCode) } -} \ No newline at end of file +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets index b5b19d74..2fd618b0 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets @@ -20,7 +20,9 @@ import mNotificationService from '../../../../../../../../../features/notificati import WantAgent from '@ohos.wantAgent' import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets' -const TAG = 'multiItem' +const TAG = 'NoticeItem-multiItem'; + +let mWindowManager; @Component export default @@ -46,13 +48,16 @@ struct multiItem { @State moveY: number = 0 aboutToAppear() { + mWindowManager = new WindowManager(); if (this.notificationContent.length > 1) { this.needExpand = true; } else { this.needExpand = false; } } - + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear id: ${this.notificationId}`) + } build() { Row() { Column() { @@ -126,28 +131,28 @@ struct multiItem { } touchNotificationItem(event: TouchEvent) { - if (event.type == Constants.TOUCHTYPE_DOWN) { //down + if (event.type == Constants.TOUCH_TYPE_DOWN) { //down this.startX = event.touches[0].x this.startY = event.touches[0].y Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`) - } else if (event.type == Constants.TOUCHTYPE_MOVE) { //move + } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move this.moveX = event.touches[0].x - this.startX this.moveY = event.touches[0].y - this.startY - } else if (event.type == Constants.TOUCHTYPE_UP) { //up + } else if (event.type == Constants.TOUCH_TYPE_UP) { //up Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`) if (this.iconDisplay) { - if (this.moveX > Constants.HIDDEN_TRANSLATEX) { + if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { //hidden this.iconDisplay = false; this.itemWidth = '100%' Log.showInfo(TAG, 'hidden'); } } else { - if (this.moveX < Constants.DISPLAY_TRANSLATEX) { + if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { this.iconDisplay = true; this.itemWidth = '70%' Log.showInfo(TAG, 'display'); - } else if (this.moveX > Constants.REMOVE_TRANSLATEX) { + } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { this.removeNotificationItem(this.notificationHashCode) } } @@ -163,7 +168,7 @@ struct multiItem { //remove notification this.removeNotificationItem(this.notificationHashCode) //close window - WindowManager.setWindowMin() + mWindowManager.setWindowMin((result)=>{}); this.showStatusBar = true //open app Log.showInfo(TAG, `longitemClick wantAgent ${JSON.stringify(this.notificationWant)}`); @@ -178,4 +183,4 @@ struct multiItem { Log.showInfo(TAG, `longitemClick wantAgent trigger callback ${JSON.stringify(data)}`); })); } -} \ No newline at end of file +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets index 83ebb5e1..95cfbc49 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets @@ -16,6 +16,8 @@ import Constants from '../common/constants.ets' import longItem from './longItem.ets' import multiItem from './multiItem.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +const TAG = 'NoticeItem-NotificationItem' @Component export default @@ -27,6 +29,7 @@ struct notificationItem { private multi: boolean = false; aboutToAppear() { + Log.showInfo(TAG, `aboutToDisAppear Start`) switch (this.itemObject.type) { case Constants.NOTIFICATION_TYPE_NORMAL: this.normal = true; @@ -41,6 +44,9 @@ struct notificationItem { break; } } + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear`) + } build() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { @@ -88,4 +94,4 @@ struct notificationItem { } } } -} \ No newline at end of file +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets index b655368e..94a83730 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets @@ -14,6 +14,8 @@ */ import Constants from '../common/constants.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +const TAG = 'NoticeItem-TitleItem' @Component export default @@ -25,7 +27,12 @@ struct titleItem { @Link isExpand: boolean @Prop needExpand: boolean @State rowSpace: any = $r('app.float.titleitem_row_space') - + aboutToAppear() { + Log.showInfo(TAG, `aboutToDisAppear Start`) + } + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear`) + } build() { Row() { Row({ space: this.rowSpace }) { @@ -63,4 +70,4 @@ struct titleItem { .width('100%') } -} \ No newline at end of file +} diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets index 3c357e14..7884beb3 100644 --- a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets +++ b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets @@ -13,14 +13,12 @@ * limitations under the License. */ -import Notification from '@ohos.notification'; -import BundleMgr from '@ohos.bundle'; -import Resmgr from '@ohos.resourcemanager'; -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import NotificationManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/notificationManager.ets'; +import BundleManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager.ets'; +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; const TAG = 'NotificationService' -let mAppStorage = AppStorage.GetOrCreate() let mNotificationList let mSubscriber; let mDate; @@ -33,8 +31,7 @@ let mEmptyArray; export class NotificationService { constructor() { - mAppStorage = AppStorage.GetOrCreate() - let tempLink = mAppStorage.setAndLink('notificationList', []) + let tempLink = AppStorage.SetAndLink('notificationList', []) mNotificationList = tempLink.get() Log.showInfo(TAG, `NotificationService constructor ${JSON.stringify(mNotificationList)}`) } @@ -53,8 +50,9 @@ export class NotificationService { updateNotification() { Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(mNotificationList)}`); Log.showInfo(TAG, `updateNotification len: ${mNotificationList.length}`); - let listLink = mAppStorage.link('notificationList') - listLink.set(mNotificationList) + let listLink = AppStorage.Link('notificationList'); + listLink.set(mNotificationList); + Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(listLink.get())}`); } /** @@ -63,13 +61,13 @@ export class NotificationService { createNotificationCallback() { Log.showInfo(TAG, 'createNotificationCallback enter ===================='); mSubscriber = { - onConsumed: this.consumeCallback.bind(this), - onCanceled: this.OnCancelCallback.bind(this) + onConsume: this.consumeCallback.bind(this), + onCancel: this.OnCancelCallback.bind(this) } Log.showInfo(TAG, `createNotificationCallback, ${JSON.stringify(mSubscriber)}`); - Log.showInfo(TAG, `createNotificationCallback, ${JSON.stringify(mSubscriber.onConsumed)}`); - Log.showInfo(TAG, `createNotificationCallback, ${JSON.stringify(mSubscriber.onCanceled)}`); - Notification.subscribe(mSubscriber, this.subscribeCallback.bind(this)); + Log.showInfo(TAG, `createNotificationCallback, ${JSON.stringify(mSubscriber.onConsume)}`); + Log.showInfo(TAG, `createNotificationCallback, ${JSON.stringify(mSubscriber.onCancel)}`); + NotificationManager.subscribeNotification(TAG, mSubscriber, this.subscribeCallback.bind(this)); Log.showInfo(TAG, 'createNotificationCallback end ===================='); } @@ -78,12 +76,12 @@ export class NotificationService { */ async unRegisterNotificationSubscriber() { if (mSubscriber != undefined && mSubscriber != null) { - await Notification.unsubscribe(mSubscriber); + NotificationManager.unsubscribeNotification(TAG, mSubscriber); } } /** - * The callback method that will be called after receiving a notification. + * The callback method that will be called after receiving a notification * * @param {Object} err - Error may occur. * @param {Object} data - Callback data. @@ -123,20 +121,19 @@ export class NotificationService { }; Log.showInfo(TAG, `notificationItem = ${JSON.stringify(notificationItem)}`); switch (contentType) { - case Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT: - + case NotificationManager.TYPE_BASIC: Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_BASIC_TEXT ====================`); notificationItem['title'] = request.content.normal?.title ?? ''; notificationItem['content'] = request.content.normal?.text ?? ''; notificationItem['additionalText'] = request.content.normal?.additionalText ?? ''; break; - case Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT: + case NotificationManager.TYPE_LONG: Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_LONG_TEXT ====================`); notificationItem['title'] = request.content.longText?.expandedTitle ?? ''; notificationItem['content'] = request.content.longText?.longText ?? ''; notificationItem['additionalText'] = request.content.longText?.briefText ?? ''; break; - case Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE: + case NotificationManager.TYPE_MULTI: Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_MULTILINE ====================`); notificationItem['title'] = request.content.multiLine?.longTitle ?? ''; notificationItem['content'] = request.content.multiLine?.lines ?? mEmptyArray; @@ -149,6 +146,7 @@ export class NotificationService { Log.showInfo(TAG, `notificationItem = ${JSON.stringify(notificationItem)}`); this.removeNotificationItem(notificationItem['hashcode'],false); mNotificationList.unshift(notificationItem); +// mNotificationList.sort(this.compare('timestamp')); this.updateNotification(); Log.showInfo(TAG, 'consumeCallback finished ===================='); }); @@ -165,15 +163,13 @@ export class NotificationService { callback(mAppName.get(bundleName)); Log.showInfo(TAG, 'HAS BUNDLENAME'); } else { - BundleMgr.getBundleInfo(bundleName, 0) - .then((data) => { + BundleManager.getBundleInfo(TAG, bundleName, 0, (data) => { Log.showInfo(TAG, `getBundleInfo` + JSON.stringify(data)); let labelId = data.appInfo.labelId; let iconId = data.appInfo.iconId; let appName = ''; - Resmgr.getResourceManager(bundleName) - .then((item) => { - Log.showInfo(TAG, `Resmgr.getResourceManager ${Resmgr.getResourceManager}`); + BundleManager.getResourceManager(TAG, bundleName, (item) => { + Log.showInfo(TAG, `BundleManager.getResourceManager ${BundleManager.getResourceManager}`); item.getString(labelId, (error, value) => { Log.showInfo(TAG, `getString` + JSON.stringify(value)); if (value != null && value != undefined) { @@ -215,7 +211,6 @@ export class NotificationService { Log.showInfo(TAG, `onUpdateCallback = ${JSON.stringify(data.request)}`); } - /** * The callback will be called after registered callback. * @@ -251,11 +246,11 @@ export class NotificationService { * * @param {string} property - Property in the object will be sorted. */ - compare(property) { - return function (a, b) { - var value1 = a[property]; - var value2 = b[property]; - return value1 - value2; + compare(params) { + return function (item1, item2) { + var itemTime1 = item1[params]; + var itemTime2 = item2[params]; + return itemTime2 - itemTime1; } } @@ -265,7 +260,7 @@ export class NotificationService { removeAllNotifications() { mNotificationList = [] this.updateNotification() - Notification.removeAll((err, data) => { + NotificationManager.removeAll(TAG, (err, data) => { Log.showInfo(TAG, `removeAll , err: ${JSON.stringify(err)}`); Log.showInfo(TAG, `removeAll , data: ${JSON.stringify(data)}`); }); @@ -277,6 +272,7 @@ export class NotificationService { if (mNotificationList[i].hashcode == hashCode) { Log.showInfo(TAG, `removeNotificationItem i = ${i}`); mNotificationList.splice(i, 1); +// mNotificationList.pop(i); break; } } @@ -286,7 +282,7 @@ export class NotificationService { } } removeSysNotificationItem(hashCode){ - Notification.remove(hashCode, (err, data) => { + NotificationManager.remove(TAG, hashCode, (err, data) => { Log.showInfo(TAG, `removeNotificationItem, err: ${JSON.stringify(err)}`); Log.showInfo(TAG, `removeNotificationItem, data: ${JSON.stringify(data)}`); }) diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ets b/features/signalcomponent/src/main/ets/default/common/constants.ets index c396638e..2740f921 100644 --- a/features/signalcomponent/src/main/ets/default/common/constants.ets +++ b/features/signalcomponent/src/main/ets/default/common/constants.ets @@ -18,8 +18,8 @@ export default class Constants { static NETWORK_TYPE_UNKNOWN = 0; static NETWORK_TYPE_GSM = 1; static NETWORK_TYPE_CDMA = 2; - static NETWORK_TYPE_WCDMA = 3; - static NETWORK_TYPE_TDSCDMA = 4; + static NETWORK_TYPE_W_CDMA = 3; + static NETWORK_TYPE_TDS_CDMA = 4; static NETWORK_TYPE_LTE = 5; static NETWORK_TYPE_NR = 6; @@ -33,6 +33,6 @@ export default class Constants { static NET_CHINA_MOBILE = 'CHINA MOBILE'; static NET_CHINA_TELECOM = 'China Telecom'; - static NET_CHN_UNICOM = 'CHN-UNICOM'; + static NET_CHN_UN_ICON = 'CHN-UN_ICON'; static NET_NULL = ''; -} \ No newline at end of file +} diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index f994cb9c..cf16a2d9 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -15,19 +15,23 @@ import Constants from '../common/constants.ets'; import mSignalModel from '../SignalModel.ets'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +const TAG = 'SignalComponent-SignalIcon' @Component export default struct SignalIcon { - @StorageLink('cellularLevel') cellularLevel : number = 0 - @StorageLink('cellularType') cellularType : number = 0 + @StorageLink('cellularLevel') cellularLevel : number = Constants.CELLULAR_NO_SIM_CARD + @StorageLink('cellularType') cellularType : number = Constants.NETWORK_TYPE_UNKNOWN @StorageLink('networkState') networkState : string = Constants.NET_NULL aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear'); mSignalModel.initSignalModel(); } aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear'); mSignalModel.uninitSignalModel(); } @@ -59,6 +63,7 @@ struct SignalIcon { * @return {string} typeString type of cellular type */ private updateCellularType(signalType) : string { + Log.showInfo(TAG, `updateCellularType, signalType: ${ signalType }`); let typeString; switch (signalType) { case Constants.NETWORK_TYPE_UNKNOWN: @@ -68,8 +73,8 @@ struct SignalIcon { case Constants.NETWORK_TYPE_CDMA: typeString = $r('app.string.2G'); break; - case Constants.NETWORK_TYPE_WCDMA: - case Constants.NETWORK_TYPE_TDSCDMA: + case Constants.NETWORK_TYPE_W_CDMA: + case Constants.NETWORK_TYPE_TDS_CDMA: typeString = $r('app.string.3G'); break; case Constants.NETWORK_TYPE_LTE: @@ -90,6 +95,7 @@ struct SignalIcon { * @return {string} cellularImage image of cellular signal */ private updateCellularImage(level) { + Log.showInfo(TAG, `updateCellularImage, level: ${level}`); console.info('systemui updateCellularImage = ' + level); let cellularImage; switch (level) { @@ -126,6 +132,7 @@ struct SignalIcon { * @param {number} level - signal level from status center */ private updateNetworkState(netWorkState) { + Log.showInfo(TAG, `updateNetworkState, netWorkState: ${netWorkState}`); let netWorkStateName; switch (netWorkState) { case Constants.NET_CHINA_MOBILE: @@ -134,7 +141,7 @@ struct SignalIcon { case Constants.NET_CHINA_TELECOM: netWorkStateName = $r('app.string.china_telecom'); break; - case Constants.NET_CHN_UNICOM: + case Constants.NET_CHN_UN_ICON: netWorkStateName = $r('app.string.china_unicom'); break; case Constants.NET_NULL: diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ets b/features/signalcomponent/src/main/ets/default/signalModel.ets index 3ff1ed97..06a8f174 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ets +++ b/features/signalcomponent/src/main/ets/default/signalModel.ets @@ -20,10 +20,9 @@ import Log from "../../../../../../common/src/main/ets/default/Log.ets"; import CheckEmpty from '../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; import Constants from './common/constants.ets' -const TAG = 'signalStatus'; +const TAG = 'SignalStatus-SignalModel'; const EMPTY_LEVEL = 0; -var mAppStorage = AppStorage.GetOrCreate(); let mSignalCallback; let signalValue = { cellularLevel: '', @@ -31,23 +30,25 @@ let signalValue = { networkState: '' }; -var mLevelLink -var mTypeLink -var mStateLink +var mLevelLink; +var mTypeLink; +var mStateLink; export class SignalModel { initSignalModel() { - mLevelLink = mAppStorage.setAndLink('cellularLevel', ''); - mTypeLink = mAppStorage.setAndLink('cellularType', ''); - mStateLink = mAppStorage.setAndLink('networkState', ''); + Log.showInfo(TAG, 'initSignalModel'); + mLevelLink = AppStorage.SetAndLink("cellularLevel", ''); + mTypeLink = AppStorage.SetAndLink("cellularType", ''); + mStateLink = AppStorage.SetAndLink("networkState", ''); this.initObserver(); this.checkCellularStatus(); } uninitSignalModel() { + Log.showInfo(TAG, 'uninitSignalModel'); this.unInitObserver(); } @@ -117,29 +118,31 @@ export class SignalModel /** * init the observer of the cellular and signal */ - initObserver() { - Observer.on('signalInfoChange', { slotId: 0 }, (err, value) => { - if (err.code != 0) { - this.checkCellularStatus(); - } else { - Log.showError(TAG, `failed, because ${JSON.stringify(err)}`); - } - }); - } + initObserver() { + Log.showInfo(TAG, 'initObserver'); + Observer.on('signalInfoChange', { slotId: 0 }, (err, value) => { + if (err.code != 0) { + this.checkCellularStatus(); + } else { + Log.showError(TAG, `failed, because ${JSON.stringify(err)}`); + } + }); + } /** * Uninit the observer of the cellular and signal */ - unInitObserver() { - Observer.off('signalInfoChange', (err, value) => { - if (err.code != 0) { - Log.showInfo(TAG, `success: ${JSON.stringify(value)}`); - } else { - Log.showError(TAG, `failed, because ${JSON.stringify(err)}`); - } - }); - } + unInitObserver() { + Log.showInfo(TAG, 'unInitObserver'); + Observer.off('signalInfoChange', (err, value) => { + if (err.code != 0) { + Log.showInfo(TAG, `success: ${JSON.stringify(value)}`); + } else { + Log.showError(TAG, `failed, because ${JSON.stringify(err)}`); + } + }); } +} let mSignalModel = new SignalModel(); export default mSignalModel as SignalModel; \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/common/constants.ets b/features/wificomponent/src/main/ets/default/common/constants.ets index b58800c9..e453e111 100644 --- a/features/wificomponent/src/main/ets/default/common/constants.ets +++ b/features/wificomponent/src/main/ets/default/common/constants.ets @@ -14,11 +14,11 @@ */ export default class constants { - static DEFAULT_WIFIINFO: number = 0 - static DEFAULT_WIFISTATUS: boolean = false - static WIFISTATUS_DISPLAY_HEIGHT: string = '50%' - static WIFISTATUS_HIDDEN_HEIGHT: number = 0 - static WIFISTATUS_MAXWIDTH: string = '50' + static DEFAULT_WIFI_INFO: number = 0 + static DEFAULT_WIFI_STATUS: boolean = false + static WIFI_STATUS_DISPLAY_HEIGHT: string = '50%' + static WIFI_STATUS_HIDDEN_HEIGHT: number = 0 + static WIFI_STATUS_MAX_WIDTH: string = '50' static EVENT_CONN_STATE: string = 'usual.event.wifi.CONN_STATE' static EVENT_RSSI_VALUE: string = 'usual.event.wifi.RSSI_VALUE' static EVENT_POWER_STATE: string = 'usual.event.wifi.POWER_STATE' @@ -34,8 +34,8 @@ export default class constants { static WIFI_STATE_AP_CONNECTING: number = 3 static WIFI_Disconnected: number = 9 static DEFAULT_ERR_CODE: number = 0 - static UPDATE_WIFIINFO_DEFAULT_PARAM: number = -60 + static UPDATE_WIFI_INFO_DEFAULT_PARAM: number = -60 static WIFI_SIGNAL_DEFAULT: number = -1 - static SIGNALEVEL: number = 2 + static SIGN_LEVEL: number = 2 -} \ No newline at end of file +} diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index 4ba18121..90f1ac7b 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -15,18 +15,22 @@ import Constants from '../common/constants.ets' import mWifiModel from '../WifiModel.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +const TAG = 'WifiComponent-WifiIcon' @Component export default struct WifiIcon { - @StorageLink('wifiInfo') wifiInfo : number = Constants.DEFAULT_WIFIINFO - @StorageLink('wifiStatus') wifiStatus : boolean = Constants.DEFAULT_WIFISTATUS + @StorageLink('wifiInfo') wifiInfo : number = Constants.DEFAULT_WIFI_INFO + @StorageLink('wifiStatus') wifiStatus : boolean = Constants.DEFAULT_WIFI_STATUS aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) mWifiModel.initWifiModel() } aboutToDisappear() { -// mWifiModel.uninitWifiModel() + Log.showInfo(TAG, `aboutToDisappear`) + // mWifiModel.uninitWifiModel() } build() { @@ -40,6 +44,7 @@ export default struct WifiIcon { } private getImage(wifiInfo: number) { + Log.showInfo(TAG, `getImage, wifiInfo: ${ JSON.stringify(wifiInfo) }`) let wifiImage ; switch (wifiInfo) { case Constants.WIFI_SIGNAL_NO: @@ -63,4 +68,4 @@ export default struct WifiIcon { } return wifiImage; } -} \ No newline at end of file +} diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ets b/features/wificomponent/src/main/ets/default/wifiModel.ets index cd1feb22..f1fd1280 100644 --- a/features/wificomponent/src/main/ets/default/wifiModel.ets +++ b/features/wificomponent/src/main/ets/default/wifiModel.ets @@ -15,11 +15,10 @@ import Constants from './common/constants.ets' import WifiInfo from '@ohos.wifi_native_js'; -import Subscriber from '@ohos.commonevent'; +import Subscriber from '@ohos.commonEvent'; import Log from "../../../../../../common/src/main/ets/default/Log.ets"; -const TAG = 'wifiStatus'; -var mAppStroage = AppStorage.GetOrCreate(); +const TAG = 'WifiComponent-WifiModel'; var mCommonEventSubscribeInfo = { events: [Constants.EVENT_CONN_STATE, Constants.EVENT_RSSI_VALUE, @@ -34,16 +33,19 @@ var mWifiName; export class WifiModel { initWifiModel() { - mWifiInfo = mAppStroage.setAndLink("wifiInfo",0); - mWifiStatus = mAppStroage.setAndLink("wifiStatus",false); - mWifiName = mAppStroage.setAndLink("wifiName",'WLAN') - mWifiOpenStatus = mAppStroage.setAndLink("wifiOpenStatus",false); + Log.showInfo(TAG, `initWifiModel`) + mWifiInfo = AppStorage.SetAndLink("wifiInfo", 0); + mWifiStatus = AppStorage.SetAndLink("wifiStatus", false); + mWifiName = AppStorage.SetAndLink("wifiName", 'WLAN') + mWifiOpenStatus = AppStorage.SetAndLink("wifiOpenStatus", false); if(mCommonEventSubscriber == null){ this.registerWiFiStatusListener(); } + // this.getWifiMessage(); } uninitWifiModel() { + Log.showInfo(TAG, `uninitWifiModel`) this.unregisterWiFiStatusListener() } @@ -76,7 +78,7 @@ export class WifiModel { * @param {Object} data - data returns from the caller */ createWifiStatusSubscriberCallBack(err, data) { - Log.showInfo(TAG, `createWifiStatusSubscriberCallBack start`); + Log.showInfo(TAG, `createWifiStatusSubscriberCallBack start err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); mCommonEventSubscriber = data; Subscriber.subscribe(mCommonEventSubscriber, this.wifiStatusSubscriberCallBack.bind(this)); } @@ -88,6 +90,7 @@ export class WifiModel { * @param {Object} data - data returns from the caller */ private wifiStatusSubscriberCallBack(err, data) { + Log.showInfo(TAG, `createWifiStatusSubscriberCallBack start err:${ JSON.stringify(err)} data: ${ JSON.stringify(data) }`); if (err.code == Constants.DEFAULT_ERR_CODE) { Log.showInfo(TAG, `wifi data == ${JSON.stringify(data)}`); if (data.event == Constants.EVENT_CONN_STATE && data.code ==Constants.WIFI_STATE_AP_CONNECTING) { @@ -144,7 +147,7 @@ export class WifiModel { mWifiStatus.set(status) } - private updateWifiInfo(rssi=Constants.UPDATE_WIFIINFO_DEFAULT_PARAM,band=Constants.SIGNALEVEL) { + private updateWifiInfo(rssi=Constants.UPDATE_WIFI_INFO_DEFAULT_PARAM,band=Constants.SIGN_LEVEL) { Log.showInfo(TAG, `enter changeWifiInfos ================ ${rssi}+${band}`); mWifiInfo.set(this.getWifiInfo(rssi,band)) } diff --git a/figures/TS_01.png b/figures/TS_01.png new file mode 100644 index 0000000000000000000000000000000000000000..a63b7d9b9eb4e007d58a82dddf0b160a4b0eb796 GIT binary patch literal 179052 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

    l=(y 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 literal 0 HcmV?d00001 diff --git a/figures/TS_02.png b/figures/TS_02.png new file mode 100644 index 0000000000000000000000000000000000000000..b491841b6d46929c1a150c3ce620fd792281a2c2 GIT binary patch literal 156607 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 z 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

    SKv@|x<(-?O` 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 Si=i^t#o)Zjx#Hg(qy7WV5E6R; literal 0 HcmV?d00001 diff --git a/figures/cmd2.png b/figures/cmd2.png new file mode 100644 index 0000000000000000000000000000000000000000..b771fda0faed1df341bb1e7c7247223bec53986e GIT binary patch literal 110399 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 literal 0 HcmV?d00001 diff --git a/figures/cmd3.png b/figures/cmd3.png new file mode 100644 index 0000000000000000000000000000000000000000..75cc11c96e8842d0b72329f0bc000dad824eeb5b GIT binary patch literal 24588 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 (qCM1v6xZEuRriI#dXUWA7?uZwqb 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 literal 0 HcmV?d00001 diff --git a/figures/commit_source_clone_page.png b/figures/commit_source_clone_page.png new file mode 100644 index 0000000000000000000000000000000000000000..80be69053cc1b585ebaf759582fa403343279b2f GIT binary patch literal 165623 zcmcfpcU03!`v(liMX`abjVhp`xJs{)8dp{j0Z~zq8fvH^VrZcS8>lo9DM=_QO{q!? zfsi0oN~l7lh8jwM0HGuV!V}!R?|Xme{p0=PIp>*kAjvS_nQN~3%+we%SB&r^%lHz}L8=+YSe~ zpASE}X$c1aPWbNq>>Gth1_A)P*@l1pc|Xu@VJEm!;zk;szY{(h42q-;(BU;?MrZYA zd%8|XdZ}itN^oc3wWe2pNC_t%zkxc-r^kCi|JjivfBk;)+#%j>#fC#tA9)r3^zU+0 zeY?-``xCvh5pSNqalYtz(XyrW)&944V7pb-Rr&eIk%0A@rSksJ;&qlCE2}y`FTXlJ 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 literal 0 HcmV?d00001 diff --git a/figures/commit_source_fork_button.png b/figures/commit_source_fork_button.png new file mode 100644 index 0000000000000000000000000000000000000000..081c6bf8609403c9beb2e001e47f99600ad7428d GIT binary patch literal 169052 zcmd42Wl&sQw>8>0!QDLxArLIMySux)H16&$Ap{5#EFrkNL-644?(Q_sw|SoPo%5c5 z_s6|ecU3h-!P?zx?`dO0U!`eAtF5Rmj`)nIuM8g zBqb`O>XC7@>?t_q`V4<&0Uzewpd=_3yZF$79RG`bfcJCJFuev3)8w+#u+t#>Vo9lb zb)8?S#DZOunO*Xs*H$hrZIp4rTBt5r1WG?249XBxyFf4DjyXJnkdOY$p3mqg3JVO& zDCFrGF)X&N9ZvLrt*MV_q;u;PCT~dH-ckLpb)bq85E=2GtLY7V$N#!mbQu=L@PA#D zYxk$I8bJ`)<&sZ0HWksAmxQQZ$n8p!H!?DJLK=WvX7_^|?Y}QM;MRna1vZ=Jmtj0Z z3sy*n0vG(?L-}_@Ric6ni;s31k2is+=#*R~^!EsExdQ3Hz2D+jDzq3y${h-&K@u{^ zV-rEtfuLIX5gKQ=UNsAit>&h;t39>V;j*HzAU&$b=>usK%75Q-P`o&eNozSI(E9z7 zwl)Y93k@~G6X`HEfcqiiZW$jFlM5cWqo&dfkZehcaYhT8k#uO!F|c**w{mX2bR^{$ z7+1CeMk%1dPb^)G~@PploT?)FTO9T>B;HX-&v8L)IUkgx7Tefq_w+F zDgOH$_t?*@ta_ovNX3g}+mW4ZtU4u=px>$?WvFr(1xMps!`UuLiHg>XGud7}(f{B> zq-x@kElV-B)}wDppRV^Q$>MFT)Hp)+#D5C*=&kuE+2GFGZOnMIkQlV=4ROEu644(x zBUP66>9G0=9nr^>8fSak;pRsC=1B$fVc7gOCZ59^#Z`~bI-V?e)fXa6fi>@ACuT*6 z^n6D9YroHB5HIYi_C+28^K~hOUjk>%BFaOwsVntXNf;wMZSrJ+rKV~^CgrZ^`hDzn zybzkoVxhep_TEKwYTfH2?rm)el9F638qdztwQ~0W@mXoSfPAAT=TSr4*`LQo%`dzf z?mTwgiru0ThSw4{JdUcOQ{$q1-W_Zu=(=6^AW$#f_GWM0F((<`n+_+qibiV#nZZB$ z-f&{%K9(5ISg)s=#U|##7$1jO+uoj@7olt_o|>MfX!ZDz~gk-NZCa3kK`6oQ+qG}=tKhi zi5rX}oP!~pvtt7pIQZ>GzN>!oo+|gGkMj|1!$tS{7`xeKOyt2mV4l@2FT!uolx`7E zc8gr}TJ4U=D}I-1iDo-3_ZL*bYxNrChU!Sz%Yn3RN1{D(KR^N5edK|OnlYK}zF6;V z1ZHa;WzQ>#RN9yFZh-O zTIc-?o35>`0bywBl2TfW*El2p$&2q4qUA@Q9;+v-L6OdNX$9`4V%U40Uwq!xP$4{KzEP(WlcyzGxQDb5i+ zooNnwpcy{h`GdKr0k;L#vLBx}{N_cHFi6nfU!bA3rkyTRM+O?!IlOaP5$KPq4)`D=d3r==>rPk=kfIK6Z~35@`lwN^Njf1G=KS!2ZhJBlh?*)q zT~FmrAgceG7g|i{>NkW1U$Xsk6v=oqf=>@};P*(nOB9ZHwGRz(U(z)qmRkO>*CV68 zX+!-AoM2W*;*O4cI4(cdC)^fPGU~L|q%k`m=9$eenHghE2L|S`3 zeI^7EKx6-NFRqmO#`Y-0pGjK1Ac2yW^EkV0e4ugu2dAXk?_<60Z<( zLQ@>J*B1rYG#y4UP{=-`AfP|N=KXnYjEamXI5Y;yilSW$>d~JlX=nZH7C48x@;yXt zxH<8a+5Ji;5QyBD$*M^WI;$ulI(+h4ny7@5<0QtKfN^{qCPZBFH?@NI*b9*3l_UvebH$W`_+4mQ??V4g-l2 z2a&R-m^V2h;so~9+l-ddbj}p@N~gg=Wd1noHqQ$=n*nU`GYh}q(c1R<4{b<-U3>kCR_v6B zgj^k9;ohLFRpXs2(L~qswid+H{HpVrztdp&PL|(toyeEFX|3g-wMg4m>R^c3Q?uH? zv+f9RAeczRcMEXXcO_iK)VW)Bh1@cGn6KE92smO9x8MFXT)r@i#w1%A-El7UI+gQi zXf|2y9p?0>oZY!}5sQC6+%aUOLXq@$XeFzTK)?+KLDXdZ(bMwFV5RLHk2z%AKV~BS zDJb-EH%C-C45IF9eCc^DVhEzXgo5edD_#jc-IDs^^9(1P>5m5F`-qIyA(11F^w+|r z`_g_Lal2^Es@IN|Q(Qc~Hivhal^z^gQ8$QZM(wo6HKMf_>W6_AP7pq}pfR z7$`EDd^<&u6KIuP_$qL-4j zh6C;B1!|gY8vd}jh}Kb@qFeIkQ&b{8!4iYcdENYGmixidi5q~SEKFWQgr!gjsXo~} z`mnVxcK_^5!^SDNMi1(2(Z0=^UA2~)^&J6AzC!1HY+5$!`pP-{dKuvVsgu~QP-n$5 zeirPHY}9z(>xJ|2X|NqL(59sgm?D+O28Yc4giJOIiWnGzo)uMAEr*~ypa^R zK@LMB3K+odque#l6d@aYIk_Vj7TKvi{JxOAyksN(z)j3aLFCugR?j=Kc-*R%wO09y z(8EgU^K>tmhdN-8QQZt21DWdw!R1~%Kl@^!xD04_E~1MsEOcgG9v;=?WhZL_M9{d-qd zy=FT|$8#)@t| zyGb8pdZ}R3K<6lP)96y5egJoZ4Ls_x}AivJ`s35*+Ee~ z*AZd*v$X69XBq_9*gS_Vm=Ny0j3B{M4_6V;9%_u#ZN~~Q)HR$e-RY*o^k3pTIWip+ z{H9(BpZi|m7W%ihoN#l~U2KNoos^dc?N>6p(i#04Lo##utlZ)NGFGOAgGvO{nBJLT zo8hwR8_i`qAkLKWd##K8OUL1xtt1rIuFV)X8uPQdBZnrble((S<$Fp})A~*)wu?Pn zZk)fTd60X-!sSXRQpj68S~@JDkSqN* z&4bO#KWUj_JxfauR@f*Yf#j|oRZSc0^juUq&E*xQN)cG6J9qx90zBcTs4`OJ9I^s` zf~m_&=rRMyjTNlOPU#mj&=d%h%j~(qiG!!lOst(&954khK$}E_;Kv`66Aa%mKR@tJ zb)u-Kh}n{bm~e$W&y2%m7a474DEi0l8e=T?SN47vh{J5{3*XnwKp?VAtT%jV=v&9F z=mUvi9@o{i%-nu79_T)C1zqcD*DbBN=^X#a+wYUD`{>I4=zQ`Rs{7~{x$Z~`es*^L z!t`I8y-28OHR?zSqkYtGV$TAl|y&OT321%|0!?haF6z@4Xxy z7IJVvPweZS0gX&>fm87tIhipr!_lF7-rp=UBhb0J^}3ycq7RP?;o)WdpL=o3q|g<5 z0C4eI?RmNEl^zgQVl|7P+5Jkjyuemj?)SJ4rq+P7on2jZl(jzac+9_P9DCjIeKCG;L16a=B9S)YN07tTrYct^GLdqoQfASUEDh1@foL(7TPd=HY2)N3nfV#Ufw`! zxPxZe!&!IU+6Ib(cRL~?xRun^XXwd;|8Wh2&}(&e`4!{f#p_*XZYNGqz%w{TDr;`= z>aX;sp$0Vz*pZYJ*T@~Tq`y<-rcuHQE^f6M^=qjz%{jU0Ul(zC!H;g072X2s0_q(8Fp2gnI!H<_C70$2E(er1m?&TQ4(G<@O zR}jhOy9K5;0wDv92Byy2pt#cXS*mLXZcx{GYBQ+wwsQKEAlu-{zVHvZr7xqWT_;xG zN~I1Hw;kuo-6i?>TbeP$M!yGho#a)T@{Sd9KUS@>?TwAx)Q1Nj1|42(Or`qI#&d=! zguEbmd3g*ZI1jfKdxtw|%ru=eB^5d`Utbu&vv_<+@STwznCn45#nC3|C)M$gLxmAx zJ8BBsCrVAO88O$6wqkmFsaZcRpanq5AwC91f5;@}#xlCYA5+jqt;ds-vi>O;a4Ank z;^NeLxWJF@ZWZ=-wRh6&LoQ9jKvf>@99M|ZbUZS(zoHYwZzP#HtYhvf;EGM4Yo z7`&#c)2XZSwsv#HEhg5$Clq*@eKu&QgPyxRXVZWx8Rb-Dx7#es`@wh%q%OUa=otXl zC2+RZzOQv7TZIuI`)s*cf*Mt>+h{(~rsZ!SgM$QT{_Y7cI@6y>r@o{s(HTF@R>fd7 z;Nl`mr-1{=HTA27CDoist}}*cYXDx@!zGH5!tON&3QPaM^dsu&@p0%X|23!R$cUwt zqb&L4_dUdd>0$F-JUqdG>RqR^L8-2T#C>!=(1#Bn!ZWh=>|D6sp@e@MrlIK%1{6@x zlG=1z?}l!gW6MC>1LN5l>=x-_LdPg0Kqg{)L!B*@s2W#tcB!ZiXkOVRr4KlxuRCqM z4-F8B?7X|uiy$u%OI!FQcALv3bss_O8t2?j-57d{CY5u8zw}r@-z5LqlAV@D#eGJ# zk1h6G&@wZY9JpMaOM zL=7la1N*(^h7NPxCmshu)>nl7_iqscKH2`H`d9rSddq5MwJg7fBQfM1N_O^FLWu;} z3j>=p5OAgRlX}1Jb|f8IDr$PcYind@mtb(^(QdvKUwNtMiEP|=bWLx^AnCl`JUWe6 zfU>1KBmz8K#FKfL=9?1^k0Exz^MatEk23SMsEZNC?r)(2vdS5k_?DFPwLE1YIX~xh zph{5vuj#5aS|QXcx0}Yxa0m-vfCOqb8#$-=JuT2OjjgWTKo;9NQmgS%{%q8VE=`gX z^Xq__C8>c2i-sfp{<9xf>|>D3t99FqS}Bue)(s5oXKMr8VA0XhQHU^tp8+ngH;jBA zv3Ik-x5n|Qgz==Y@5-CPm!Yf-Bf6E@@9`b$D$1{6r9xFsXKG~SLK8-pILz9$2C&!^ z_wamDVs|Ok;+H4 zg0iyEtgQH9`s~`{tlH_~<8#dk6o4(SZS7YRU=Zi&=<92lX%x&8UUk`mYweBJanrjD z!LGm6M|yZ=Gda& z?&7-sxFrP$-?;Z!Tp~0sLD7;SuVK64G2D|UKOzrbPpSsxb8tnd+s@G0k0~<7QBvQ@ z{lVhHYcU8$=pkZo#}cM)KKgQrtkq0Q_OdB$qa9pDz~y7S_}=0Mww_#kSdHb`AqaJw4y_OM-kd?kGKPl@dGW56t+q zWdL=bnv#^8u?nuil1lAia=NSPIlI2@t=c{Xtb~wpoDpxn7GMdeH|Zfm_K%Ltpf0>_ zKR-G|W#)JR<>*rS=0hqLUJt@Enb13=f z!|LvxCy7S$baZv0@3NtqFjU)<+%*gbm)d({iq#%MuRCjv-@tcUGfd3ipOR{F`jav2 z;AOW|VF74@)v~q}oYx9|@CV$FwYyhzKQs7VsIYFkQr$!aTl$?DBISGJD4}c8ix(xHFHvB~TRe3qtU&Rlg?&domv_c`D*+r*mR*EBkhG2sThM-E+3mtck;Hv4fBlkuWRaAo0 z(uj%|Lqe{E1NwJ{HD-#sW7K1cdc|{-0RSYHl%;%2Hk!@E@o5EzOHC_F@BmCx zJdTNEwXF5yTy5Wt;f!uil`6H!#h(;=PapTsV9?@8eW(q*ypLSL@y`WwT%Q$D<`++xn7VO*L0o&?sOJEyf`!hg<|RVfK9iC)ij#btAOpu-;-46}{?PuQ6%RH@;1+u!yI)eYneA!z%WQEO5R> zqW5v1ErC9eYtP5z3Kt%m$bA#O4Caw&K(qu}cNq9GIt5TPY%iQpu~d|P>T{_(D`9_4 zsi?gF0g?qyZsLr28_98wJ3@zQUgPOAUG{&=OYBTa76yFw%tnUxBfoR;DY-uYVg%)- zDqgp~K8W@5iMwjM+O18-7m(ZoHIK~Lb>;b7rrv@4E+XIkBICApCis!AQDDI#yY#ts%1b{Bz#nlhCx=e) zeLt(SCZGHlR0nZ|Qu9aF0u7dt@e_~%5Rz2pTV3}DLY`hf?=$jRgmOgSjr-T2K&;Nl zv(wW$D8VXdzn}wz5CJfP%&1p+*YfHP)JX~;ePB4?-&ug^_1j35v+HwlKskMNS!$q4ZeL#?wp>+rA^Xym#+(;&W)qC z!R(OeSo;=H@b({T)41X-JAsyx?=SI>kOB@vge61k+J}cTk}VyYMU@xKZMJk0(lrd- z?f^|Ws=VIUeqzNFP@r0v{L6$qh)Hqdz%SbI*TnVNfOr(S1urb@MPb*?)NkrK_tfQ= z=x}=oUNr&QlmDnt5e5C;6*l%!Cj>c^orpjyVnAiSpEv0^+k2U<7WYaEn;09;-kuq- z7bv?Be#Ty_*(ddP?4>{CQK5bmV15*zTiT_zv-$n~4fK#L!PCFo?AFNrrMrgqRRG$i znSvbLM09LY^2DXN*h_YwbK%b8X5zBM6hq8{rKZNFS9T9k*QI0V+%Iv4cP1fzIL&-9 zT7R6Og-mtryTPpiwN8;Xsi`rjdQ?yF&o2*H$Wfr4H)Qp~caLU=HY0Z4DJPVEx@Dnm z!o8?|MYAYfbqg3$BT7W1{YF6%-UgZVrOUgoGR*XM!#@zCVtZ_;|;vEff$#gum&whuwQk zZUi(BxYmOBg&&~T%u}CMmoYGxV+lam2_m{!jmE!POkOOn6>99ua%6JrimOWQETc)S+`)GE?i3JaACqw~6;E zC3M~ZX4GsnPMvoK5P)INUp4r_*Txahqmlq5#!jbABun2*e1_v0$}=E{zHs!*(F%gs zcXwg(q(d_@e3l=}LqpRPjR3j_M61z-m=utUd6$+efhJ8${Q-6&mmt(+atqKv5|nj; z1rWlTq!)Zpu(#n(&ByOAOBp;xK@j=e)e)Vno81h9IqkbI1|Ed1-k}}KU8JufziY+~ z)2uM@81L%PU3+cXfvn9XO;-DtX!u5w=QFWaBDwpsmiD3l?77L>8q_~9&^I^!mVU%_ zdD>D$KcU(=#V%`w@D(M#rf#YP7Ppgy@F5k8v->K1WB-+yiq z;N{~(eHO0`O-cFi_wQdy0C9f0nRq(pvE38ALPG8A?AmVvpQiIdfxft1aekAYre6}t zs+clGdn&t8j=h&ZIa7%P>MOa&R@cf>Jb>fyL_8b*^%@v?s` zWO9E}HGx4b2dx~gNnyuUi^V^X>wsj6uHcUmV16>+_tpGW!vT~VL!gCZv=%VKCD6WD zNt~C*aRw*^O&FR2tSoi|#XtJ$YmUOoTubT>T!8(m8nd5W4nP3QaGhSd7ifP~8q%_{ z#vWV#bUmya=(Km$Aozz`>$g}(^7he^u zQ#(KP#u5Z+vE*-*awO-rv|wdslF=~Mw?DNdvx~MlZKugCRv)AQ{al>csPavRG@{K- z38S0M>amH5ppql!hVM2DQbjdz)7)SeA@!VJ_->*sSQl2{iVjLG0-TM z1ll~0k3LNMz6$yq#2u+hl5R(6i6-t6!u@<0-}>9 z0B`})ilQG6sMzAKl>-j8#{1-GQH*C70&o)4OcMY*s%Igb*p*R_$~f0tp1ZP5{^k#u zO=(3`Kp#F`BHqTGOS!1-x${_k9whpfqH#bQ%&6BE1ptM@bODcB^1+i+C2bxmk762!JEv*lRhIz$2`Z<(9&w{4OjkL3qkBQcf6KHA(MgGF+ znUzu0(~AZKCP2%N>ZOL8h|j7h{>;HNMh;R`q3Z!|M{#v50FWYI-OS8vo4S3p9M?eN z{@j4cZAdaEj@a%T!Z*Gwxwi$2?(Qx~!Kynx5d);s;e)a}h>rzNDMoG~oC9u6>v5@K z9TOsDZZrBSB% z1;_#J$5KL4QXe#=dP9|(=rmc@86 z?*|usNx(XbN6z>zxN*%lmb8(zebeP%SkY$M7AqI6nOKc)F@U0`S+X#dX)*0>?-ng> zC;{ga=YayWt^?-=2Y(q)&-M}1)*^++ll1+$yHuq5$U;zmV^IY-@KB4Vk%Yyg>{V7U z*y_;JQg*Sb<+ce{VMNEYO8>#*wd1P8Q7$GWMflE)gCc1Fr4Bn%6!8ku2ap^OkNe

    zJt(GV2n@kcVGxd!W3E3rp6H^5p%RAtEwU!zcUsEU*2vN>4O1=*YHFM}Y)r|=Cn8Q? z+uw(Bcjw3$;YJ3%dRt04&N`q0IJmou0Avhkra*x-%JhS!OU0|3=C^o7-B}nF6l6Wu zC^@;f_VsP#g(;`3*>1>hp_GY{C{EOIt)aZQ7SBU

    cv!FUuMC#^sZwGA@*d1^5V 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
    y&q+7s#&Z$ys88UAnZ1@bA}IfYN5l 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≧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 o*<$5ev}$KZ0oN~ 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 literal 0 HcmV?d00001 diff --git a/figures/commit_source_forked_repo.jpg b/figures/commit_source_forked_repo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f9276a458fb849d92a904ab0b9a46de14a600d3 GIT binary patch literal 121406 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 QL87+Dgm5P?^6%aM2h9CwN&o-= literal 0 HcmV?d00001 diff --git a/figures/commit_source_new_pr_done copy.png b/figures/commit_source_new_pr_done copy.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8cd5ad4915d31105609e7832908752b004fec2 GIT binary patch literal 29494 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≀m#RcS8c^$yrN_iyGDtv&Zk z6yniQjt}!)GDb(+r(}d3bZu#9Cf~*x)06;$Z)^Ay`HdE!5(HD z-x9NKl_4sDeJj-on9|rVs*CXB=hkhhX?0n`g@L15g@aG{HH3q4$(*PP(U9)f${2)W z*2Z@^;0AUzjlGi11U50+D1dxm5wnNWK~qb&{7Rg&4GmrHcNbh$>kgWmjVQWtrNt|j z7O`aZLX0SoCM*$}jjl5L%uC=)>C5e=Kd;lj*{tS0p?%^rqrNAmG+415GbJ0}t_-=c z-YU-tZmJ7Bz0NSvVBFS1T=7;#WM)n&nndcr<((M2ybWG`zoW%bGsRDJw5Id&>-;l{ zO1=j)T)va`5 zVVeH|^Z?v#o22Y@Ed6vS~KGjXt>^_plzI3|1o6mzHlp|yuqM3Jlgo0Y zq7!({o_P{|YkaaZe4%{UK$ZXE z1G^OQsPW??VVpw6&g-)uLpPhN8_|!<{Tl4@!$xO4?2C8TONeRfL2#@EI?Av=a57;a zWKVb?;|2bnN!VnF)oJvJ5--KH-PygtYSU{w#a`ulv9T37Q_JePC4Gr&l`#2Sm3r7s z6^Q2i4q__T_L}JpRop=ajTv}bsVxn)97vzph2_Z}Sb~2ya-v3Ly#=Yn-Bz&P*iebf z#nn_c+#4@}SM9w*Jgna5fsB0f?>>Hd1`6f3vVJTkGr(*3o|Dx71$- zE=t#C{Y`w!vyMYy^s|Y`gsOId(=lVUXX9L{mq*e>=nGQQtJTOmlj0Mq*TqE6J9ykW zC{XdG4%Y5`J`OBDJC}gg^LdI2+Aao08F*B}ryrh*u7RD17?I*6_GoM+Ut2Kb-YXn3nU~OlOU@UR1o+=cz80kooZBeu)=X zQH9!dd&?B^E!7^WwDd2@V~Cw(6z+2p5t?t}gPR?4GAWVGT!ZOZWw91nt4uc^U;N>S zeH4+rV;17v3Iw8WnWM-rMa%|zJ++ElTF(N`=Om(Shm=ZhWyxqLRL(Z-Cbw?}peeTE zK^o+;zwWB(>hZKmcF~C4 z*ZwP?5^NfZy($~BUVSLuaZ}x!0o}G03O4n~ttG+|{9A_DDa*V1jl~mHe3hI}!jD=1 z`~ZKJ9cig?BMQ70C>-gD`LsK}OEVRGX5qoq!%YEfxS-iQG~2n#8oe*J9H`9NqkXxi zqZul~L^F8f^Oh;uPsxoZb*e{y&Xe-DGm0C3vsCgaGM(XIX@4QF-YW4=? z81FclQunpq2da2~#C$DteRt}0vtv_)@7+kuuXEB+kUO=vso{v-kqPlb-|uS_4;T3t zc5U~0bK)uLA2?>z?+$&aQLnL8997mvJzumn2vB=CGlEBh^iu zjvjXEe?_PlAn&YCtcCVcAMZrqc{mA?r7?ji5v5e2!-)1bI!tVe`TB1o++Xi}dt>Ps zpGM!;JD4wMTW~&n;_=8y=o4XP5J!QmEX>joBn>!LH>i5p_AkDpPFARvYVW%k)_7Ij z!`fTVaJ8!$p`SG3g_ujivj2Z4zW!@{PYw@xzJ+-|%U7kpp-+6y3j@*VlCS~@Na^idBRdvsd2sEG5dmyS%yX`g`49oxBgXJwn|_vw(nr}L!6HAr$8_UBik=l|J!K4-Xw3~y%L z?uA{F@rBtJ*4>-h2*i(`%fro4SZSphnFZ(Yq+l$X_ zC;{!J;@n{{+}qJi=OTQBdSZ9tA8-dSAkNz95rgGUs&KSh&gIcg zKQj>V89m`g5 zap?IlIO%T_jK*)_L+twzZudHLJGFVs-I#cQ$Z+QG#($?t^um=Zt%}5@cidI_d>2$EhE6ocj!GoM%5x$a$?Zjfr1D`Ay9oeuiwg085UfF)Z!qW9?eT`u##QJOKD9=6fSLk?KF2Ie#+KRiBPo*CZR7w#Q4MU%H3XkCr zq-rr&64d8^A=Y=Bx`*@zqulx3$^U5p{TFiE2($zRBa+NKXHy5;NT1f`fWW~69`zsd zC#0cGO;yuBD5R~{vF|@kaWNx#2xp#fW%%b%D9eq@(sETY&d zEu$Wh3BKwyyTgZkV7f4`6FdY$B+Rw`bN=5H67b>Et<4c;p3B4I>Hu4Y70N+Fv`-+L zGpJgn!pA4xIwn_8cP8jjZEtxFgsGehok5eifm&9Wb&rCEfSn1I)*72YIfp~K`HC0W^7h3~oxUh38z!1z>sDAHZ4*P_ zkv|j*CbHsfQ{1%oD_!12ZzO(v0m-?Ln=Wg+T$p=Cu0T=dL$+~W5IjLcCSJ_?6){Tcuc|Agx1EdH&LBr{gExPZXDX5y(;%fJ{B-ZXo#yVl#!KJiAREF~pe z(3OL zg{HBGwt;N9C}7#&y|#{+`)KpsX2FgEzcQh4!hB^NPx@m&|Ao}7Uo_slFC-8XV%_-o z&Z^0|3Z+z=xdfO_b%mnj{KL}BV5tbHg*Ya8vKEk2TV5;{Fb`yA@IH96aE~4Eo}40` zr7eql4f7lgydSI@Yv(y)_rbw_Jk-9w(loM8Ny!H7i zT`U%anQ|-L3_mn}Z*nt`sRcln>a{_xIGoC7}-$H2wl^Gg zhTyNA`;A91+oqQaYwIfsZ{;jIWW?vBU+d=DP*n#7!bP#zZ0i<^Dvj0Y44^#3u~!i%6xfc z1L#&Q=K3WYNtZ)DmkHb6jE&v-b*T171-G8}K;5(HV!@$@r|&a|f6Q~HIeg}ic>E6~ z;r=0?b7gu!0gnzje`dCF4)+v$FZCngU)z}JKOC0-50UzRv{sA_Iu%JmTP8>BcN89D z?I@hDI_%Q76Sr>~WS^_r2pvPV9Z-q*3_hjUcbO?D8Sre%xW}-F+$J7{`aZQSnfPZ2 zqh3dyN;J;bv}%dc#qM<~)9GKvA(_ic?XsvJ+C6U|4MDz0RA28oB3g8{nkkgt5?)t3(>19JMQP1Tpz>G1QL@jeN$Q(B>5dzCD2 zfp$y;*nl=EC%4sjUXH@4zqR?N)BAdCxE#H_^{yc&Bdzfk=7~nr2Tp&I#J{ca>q71H zRPpsgYwi(_m9DlTmJ6Q%akK4Pvz-p~_HC8Dk|)64&(Y4ahRSz^{0&w$uji&)pXqNq zD;M_rBea7_?~wR9-P*zfR<$qW{@I&lp-igta@~d2s}(Sve4jtgVZHv^EfSPpF@R~t zX0mqaFtgF@jgR68&ZBb@a^z^oxc+q;f&HCrm8fMB5I2zvl@Ad%%b?#kpbbNi+a}oG zc=|=x_z8)1Dp?jaY~P6*4(03{JscZL86-J<@fB6ZaQ<>h(^(F2_#Lm_Js@yl2Ua6d zw}2E2SIN3Pi=Jev31^4eYz-NvYU;1H&^QC{osi(b)M+S$4by?ROh;(xdW3?5k!Y%> zaH7o2jRXiG6^PC4E)d&|A{YUCS9PoZq3CI!k8fUE3TMNem4Ra(E}swAJMecxeog|w zhPGTLi_E)CK93^Tq~k#YYN|-(ifZJ4D zn5P}Ll&%;aF&*+7k$$kA;Nn0Z$_9>9igIYJwp5v3(|lC(XI8&zo#7%s)P+v5Irqoc zBfg08`>IQ^nesV6Ze=mO110_7mf2m@Rq4=`laOW8n+IDsR@}O_%UV=mVrN;?3DhH2 zv$PldLZCLEv_VE-fBzdESqJWL z_Yko66*j(!Q@x?^IPg?PC1u}SZsnPLbz^%!gP5$c_pTk^+6MSw{Lh|O_T(bloO(v` z4+GmWZF;AMgpI_7xgnc;X7WndR&Uky%(m$pdrSus-?}0T)#S`01w0G9@u$#SY;W|$~S}s8-PWd zBxZgvQK1J}z>ojIDBPGDp!lzEl*g`SS;3om+{$)mW8#Vp)D!c$5=~<$;paXo2?5nRjA&Ix)QE%P(#`79JyIOrIeq$$=flfHDZ;yJPMbI#L2>@ z9R8Xs@o`icN`#O`_&vLwwm|$qT23N?p`h$KqabQTM^&QEw@rx^LUxejpvSF;&=bp7 zOh8hjmQ@(-IB+mIocoU%o%Vk5ttSV(u=+`1`N67;@T({sD(pj{j@B|8MGycv@S(Cm$<)Jc>i% z$g)~Ip_*jE9__tb4G?rX!dd9+NTyR_FFYZ?enL+0AANd?3AlY?bpT(nVfgDFT;zO} z8NTvS`QDT*XPl-oR*m_849pkve*yR{zK;FCl97{n4 znffkbllxp8mf)pXN7t3Z2A|bExY=wme4>7ytHw)0$hYO<&dix|b96{h-Sof8(oUhloqL>BQ+36qO>RxkQ!erByC&%K}h?0et)x~}_r=1*j@0?&_1)*u#cN?^;UP--#1 z2kT#H_g)~X(3?SH#9Kwsok%~>ZtHC$jd#r(Fg|TIGv6~`HMAX6#yxe{kkq+6S#f>F zFUUvIA^Vc&c3oXic8T-%2at(wt(#LR^XdDLhukbSr;nKX9>X@}NwnQ*t#RRvAel?p zLg-c&sp>aSLi5}(sn~cpG^}QNYqPLLS!OxIASEOJnn*ESa`>dT|F9l3m2mQWo_2L( za>(G=pML^3yIcfmEPa4z6?E-R=;mMypg0Uy`keFvuyPUyj8Kyxc#(MwfCEaF=KE*0 z%e+O({Ld-=u_Y*L^Nn0(O-)a`m?eGMJxX45K)KOE6istNJj34Q?4DGJK{O#q)z+#? z#F!HxX=Q}GX#oU_%r=@^_!nmRzA^vv5o*>Jc}s{?oO4JqWx&09Z0TY>W6jJ1>DVNC z$UWuaMQ8IF|CM+zw%lNF)Ri=Pr2xW1y4FMcbT9hkU67Zt$jl#5+7E41UpA`Ho-S+e zlAB6O05FM{g(9<1O#3emTh|>mwtlFuXXz%J`CtsU*_0B-aJSHEE6zTMa9(F6=I6Xr z$?hhh%MRLVbqtOeu`0$(at=2<(6f^w%ok-FDzc;xtQ34!LtQbzU6u_nx2+l(ALmzqFdl(e~p%jv^ zwR%*-&^T8u95x>M;T-!-KG?EiC%RvND!WNgJFySeyZel?>|3q(H*O5m_DuDfOjRH) z>-PtAG7<|`k-G=7K|F|md1wP?rOT@6 zy&53MP3P*_m5T=ePC6=W7q_Q31xk|oOMlR(>`?sr*OL0HN2N?WZvZSd#>K}n-aL|n z?g1>zz$QXgHYZ5f^fx>A;6Cc~sYsMs86bD}xEr7xtSG2?6%NtQJ#xz11u5FN>=dPH zvWIZ9w_v5J6U;L1e1b}Aj8aaZtrkqaZ&_qCoa{wBTnmufyJ7_xZ!7<7ve-XEaY7x6 zoB2s$3G!Ziyw2@i-+syt*^f08O*W#yWX!%D+~T6rIjc-3%bL2d5v{i0Vl7%GLjB<< z+bQ)2XRaLvsnTP|)0@@$>HC&Jui=aFM$fuH| zNz1GhWBI3yTUMw!96>{?{|?#WFQAkuKyh&Jo$w@SSqLrBh;UHn!u;_6s=SNsEpAu5VU#0=En`C5MKbViV%Unop%c z$Hz-^FgwZ3LrKs~f=`Wd)*b&1#GA?r*eyB!-x3N*7;c8t)3WdNflksvouxGqk=V zA2@emB@MWYSmnhf+jopkO}yjzr>KRao3Om6;;?wujK7JFWwQZh7h|@k6-ly8Febm|Vw{REo&kEhqjsejpk{ZmQ(Hx%?A zlJ$Q8-u+n)4M&HVDfj;5*6z=!I=2;s$gJo76VBhuQ{YPWp9trFU_}4Xzi6sb{LESC zNjR=RQi%#VovCPd6qi-|3A>ZlKhSEU_>qEs`*-8ciAqHvOeEX(yVNd-NXg^ixei^d zTTVJKILG_w9wQY!!PkGWb;wi#9Wl;CA2kNq9qEig-M)24AQ}t%KH(0F4~E*cLvT;o zf1fBg`4Mv^0!K5f1VZ|C%F}!cft26eE`G%CZ;Dt}uEBnF$e4Y2Jy{^&H}8AkD*N*S z_~I|U-1_ed|4(P~9~xu6FY(BfZ<pW~1}vTS1P&Wg<( zb`NJOFcQPxyE7AoFq<3dIz~9)5e8+grzdr2JYXA*S~GKAJmQe$jw>c_X2cB}t%>v* zs!7_oG662Nu%(lTc^W;bQJB1J7Qwz^JqFVr$RU?4LS)T|o2}{(KbAxI9%0{HkY684 zp{&C4gQzSBCcDWo7?Dk0uPWaCOT$*CJ>cFa%LdMz&Q(tQTaH$JejY z8DPrBxJqT|Jhy27K;6YQMkDzy zS+(W8;PN%F+w}RUqiy`+&$P1hD++>SnxDh!BAvMCd_(6~?enLW3!vvu`5gY!JIr(d z^8;|8BwNQPo26w#-Q&8la83O^0rxC5mTWP4%^3c*?B3T`O!wy()alqZ5noBu%R*kO z7fLHHv_T$?TOFRZvK^ak_blBC2R}}>j4eodR^8J()jZpRBbT+AtxSMV6AiTxy0BG$ z!Q9cplE+>|2ty&jb+sz+x?_XO;9r-03x_pkZZyNRl*QK7PxWUiV3G?bLhh=WA$CD- zizO&8E^?Ql(<%{G4ce5o$eTLlX-iGbAdk189&wC?M1NqYx7v8t22$51=hIjo5S(Qg z4!`}uK_x6d#m4Ex!Xg)5?1lk^^o_KyWTrsbsKQHpjS~OrkM8!9nQki|1-E9GfHJia zXlLvNs}B0!oI^oxCHlCw3}%swBMJF0&RGqKQwYCyjqb7zyY=-U52|M~XP%;V(B88n zvA#cLbg8A}F1b`)-T@Q>1Bf_FAb$Ch%-{;!7X+G1y$d*|<0_wm?`yq#FUmBa$Rcj^ z?#31PoZHmU3>rKOeWW%X@!dKI`0%5hQyHO>t|)`wE37>Bkov9Zo_~HimRo=Is|%F+ zK$9O;?{Y`U+l4iNsM^{XT)$ctSxs3{85K9^aeex5&A)~DY}9^S1!av&8l-@0Liw(q zgser7>c+4_CyLvB<2ls^L%5leC#Q?3A^Li{Vtv2AjH!+N0}@L0FLiUMAe=8e`ilsd zCta}93%2*vsZxRJLwkK|Z&%2HE9H9u20n1T;y;sUBNZ3um_@x7pB4+fwA}=xn2!}l{iIiztAj+7n6g== za8iyA-{<*^Pk(fR4?Zm&KdSzzTIk)-R(9j^(y}91UAuY(>LWM46kai^F+GrM)d`ym zIz0ul0eEZYf2J;6ISdXq4XSM;n_EkqDRo5($F1FKqCRf8Q17EP_LMt>O2!);yor$n zm4oA*HXJQ(=NMJek*im32lhjef7x=8v~aYV_CBXak;#Fq$id)Hdr-p|bt7f;F(Dft zM7bzPlf4|DGy7l`1M*ZDJ;xJszdSRe%R#c zz?$Dhq$Dg9QW&2_43?mt@YKr5)U#;d@%zR81!sf3bZsh-5J-r}j8zI~5)Nt)jD7QJ z>=m6DE>p}C?XbR{AK;jsE0QD)FRk=lz~7xzk>WH(fT9?=!Dc#!6m|wa2>KHI!*-#S zPnu+90c8MP!<6VTJGmb;b=YFtO)6d$LY=XywgCebl8{3h`SYJU)_ty{2VtM30ZkvK z!5vgmwgGz+h)cOQ)7&VNg=Cahw%>%I8NH@TwHt42o1t< zeZH`f-!Txg5@z=Z7~;JmZYaz(k~H7Y!EcJ6&A>Y?dUnpOpIB&tZfw;=U=%Sdw-vZq z3AP4?k-Xtfb5MdQv1zBns#ez|F9pPI8hAKvfcZf|Sp)@Utx$+K_mZ0xW<{{seg*F) zHI-?rYxz1Z0Z-;L^89e{o7I)b)izkTY-AmNZU!L@v}(ZoL0;zH4VNdPMKvEPq3iWX z{Vf|USQkfG#j=Cm_0-L7Cl~A5$o{XqQN(;aeXG*`dou5i*lVl(%g38OhCEl^J3~LYKh6$sRhAQt zFYg9D-vBI{CT@}@53G+BD~`x>bEG&!{u1_wRB%pC@AIK0@AGW7xw?Z4Z&VV|PrbkBwlu1K*o>??L2I~d=JXdZL}#>ia58bx<+}m zF>HoqEK?%r7w&TtZ_;eqB%bZ(J@kmmkOqYD^o_9vjeV+2q$b*Ff@eDS*nff(uz*5T z;sZH##zPz{W@38JTHxXk$9|?84OBo$OG|DQ3~BhAPG{$bO%jVlQXpnCl0nu$R*B07 zeTX`6Z)1hFaNW_qRK9Fk^abmChnRqzg2)Mu1hu}xq?&YUHJcr|VODA}J2-0AJe+zF)VgCQMnl zSxExlH_$Jk9eAbY=u0Xf7pbZ}_En_&rNQVxtqXDVSMEe}x`W-=h(liwfUqCa#)t{V z9g)H!Amy?3q9-$0`T**6gXiSe0R;H%P*W?)uEnfsT}<{PVvlq`sFtiz^M_qxKQQyn zC#H=&;#L1smab&1rShqVob$Sd^|1aR$S~?A)gw|eM=4DjVHXltQ`!U$C0OO@GWuH7 zd#t!ix-eNh1>DFzVZ*dxU%xltd6+uZ6S)xG%driMk6%35J_>l^wR!b*4eRy>C%_d1 z7rH)^SF}-^md&au)$FI`_kn8LxBGS3j*8>__ir}RR>QoeH~U)r*WHcCTFeN|Lld>< zCI@mBSyjCpYKv`Ziq_&Xl2shwBd5Acz`dEq|F%PAZCILs->b2s0ei(J$d1zFWnEN- z0Z1NxmuRjKEtZ0PW-ySBjLVB!N)UesAxFn!P{(#X_ z!v(e#_gBokJ9lCe)Dz+%W9e-uR_N$3;j8LQ-7*)kOYF1U-!hGvJ>R5swr%UT&@r`x zkBkS_rV{((Q}D6x?H1B}BDZEDBh?lcjZ_~h8EBQlty9!$pN~*D$k6HR-(wX*t(*(% zG0cJ3hRl*qQZ~#{iflf^2oD&0#^TDzOR@e)5~wl6$Vv89L37@4tER5n*BvO!=2_g# zi+2=|fSsvHoT{=4T3`n(t!-beS*$;NQDx8YV8$5KP~(FF;zErw_BE^)>SR)h_XIz{ ztlunYyg?ymuOYWOjI9ex&q|us()}v=BONUP`9Y!dbV8A_#T4U3zTzl!JT0{euaWT*$QnhpdvVG~v$pUh!?_7J8@5Vx5L~AD)CNOxb753bgx{ zR&UnY6y()3DkDAfn(O3KZ|MrdLT_|EH=~QU!C^@lU6Bjssp0fP^b)OJBTgHy6`-hn zchOvEMDb5v#1|w+v#QD`w3v0msj{I+?`B3l`dP?%teo0}!?@IF#83 ze!qS@v_?38cOjQo!mPjaDU&jS}EE{B$X{R(idB2W6QsUznaX0ur_2};=xaRb9 zkXas#D%h$*&pO!}QBKJ7=WE|?`Kic#t&+0QA*P(n^W}dZ=&I%rb1}8!6Gmlm2&3 zA-mK%-Y#+8$m!c;W`x~iYkR}yC{KGa{M!hNFXLBym27?sSp@%T^VuG)W)Bj(KzU$& z@LB!gO35DA0z2e~yPAl4Zh8l{%)7uQv!nc6wO*LK6u#x^R1p1iNZ5BN$Q(y&cSV)e zrswOKU#oL+c+gsiI-(~d*@oU~J((<6R4e5k*MRq+r%%hIeeRr`OgwnI)io-sqGLu; z@{aD*$~EvSw#d@@F_anhU_|k3?-mc`19y@uJo%F<1 zVoJ_-!2~>IANEZt0(Tk8OLW+o72z&+yioN3!=%_;r;}FiSl8?2p4UW1V6?3Kv_)XNdLD zar39W1R1OZYHuIZY<4oH3zL$Fv5-4^_t3LLt%0#E7n)Kzeq3gziu7ggk8e7vjNT?y zV2vI?n?dH)eT~(x_J@`DSNZD=X`*k5Ze(*Eh_m3ch3e^kNgrYF@rfjz3sVD~%2%gtqvXy~X*ASve*D$#q2Q zRP~hz9Zs@Ow0S5lw(6bW?|d_~&lOwCj()b3+bdn`2yT9*_^FShg&Ww|3m^OS&4TtB zp_@5QcRe1zDp06pMJ{ZxEka)gq&3~dYA6h(<_%;(mycj!tTgq-<$zb!j_6XfRlrzB z>tf;L%a!#FXS3En@9ML`Z4i9RA-}+nUKu#Q^ntgi`b2jME2Ecs+iW*`DME2{O^2=u z3FIlHL22SU!d03Wpqy4cuupTr`@yIVy}CLMi}GS8nG#BO(0@+WWbr4%I`6b{3eUS~jKd9~CGu2o?K< z2|oCm$bTFT8Egq}8@`g>Su^=WLk9Gl;*@WKl{68bGh$V#-A{p`ZJrfpQ>W=jOoL(|8J*j2S0URD;xn~|h4BkUs1HoWc)GdAG1=Fl6AQf(1l zvBLyA9s8V3B`!sj;8?Uq zVx`Y@yVu(AY>CgKMl`R`I|>}tj4vKPc((Tlz8+y(KDY1}K~(RGzjTRGn%V;6hw;>w z+fos-0w}>sIBwy#ps@v}+$sM(W=%kc+TstyEhxyIdve`KmnObEXw$!=le!{mf0&i} zcLzXKWuxGT`G3Rc*~#(>-gae*$pcb={eD>l6xONl3-x_KqUtgMHSeigc@zFP@1?`>8GkK|fm?0$jQi zjx(~v^HXG1P@=ehwR{+qSKaW`$nBVm2I7;U{L~e%G8li!1!BssjjUaK_OPp!}^eJLt8dH+I9M;xE&WU7rEhqQs)OG!VI!3X1DC)0Iff zx6kGN{6Suv31H&SL%QoI$V3pDNapgs!35n4!~D;@>a4L>{fPmQ>(S&LV7-d=b8f2= zL=Q)CzE&Y97Kj^O%pSk{+p`1p5EJ2(CzXyx9;w@iiz7NoDe%LtcR4VVGtK&Y-9K?x z+bBPRKYSQkkI*z*iI+7qxXQnw^R??H_e^uJg-2U+pP{J!!Cz`O5i(uCu;iEehpwKI z$m$@8UcRzc;_pDNJ{!~*d(xQJ!pPKeAyIXXJ9z2*B{QXk%Th_fY*V^z8H<(dH~m}Q z?GUfJ?)gDX6hHh<9Tyt~OyhC}MPy*ysf>V^%Tf1za+!>jhr9eY>g7(M%LBIMheJCd zJ3551{kut{#i@)5YG~v%p=EUT`irE>`hi$4lvOTg;Fxn8K!g^cXi>Q$ zm&Fg;<{Ijxnyi5JmRfeG5t`60#$sm2v<&PIB{;WgeFa|Rx=w7`-(C@=SiE5!Ntl-Ziq8lQP=ljXftHruxF9cJM0i$Ir5bH6oEwz}o+RKduUh(a|UwFX4-A2Iqk>uM9O8~6v>1+E9# zG@ZguP$Qb=`o5kFVQ098fMT;Ul~X`{k!LcMoy2OmwY-w6b{N zcVb0%!v#&${0%I*2E=QgSMLY?2o@9bWn}^=E?cF8JU(59XKT*_IkOYy@#KWRCl&hq zNig)$;UCtGlEKzp$1wf#9xOby9-@TZhWUBKo8wno1uFxra5gXsbj7&hL2ge8+d2}O zRdof@q$rB!V<{9Q^1+OP%DlD}F!HoBfqq0w<^-d3@JO4~y~&un)X3$oKb1 zxlW?sY`#TE?Gs*-aXB=p9pj6E3SKF6Tp<)Vd0#)3>Fv3Z}&iFrno&{2@roMeN z5r|m*;pSlIrJ+cAYuMX4Y961kyL?2_RCb?vdHl^LH;Ys36!&~{3*ec($>q?;2Tx2X z>*y{csf6tJmrO8gH6T}L;`v;NUt_*@x%LYmH;RCUMH52kO{Bd^ok4`tG2U9mrN<$Y z{BrbhBO*LS z*w-Wgs+!vawZqMN8;%iDYy5`WEGtM+=(kOmmg`3!H|Y|@>*|$*LwTQV*+nUaxHjG6 zb?zF!II)Sx>Z2TZ%{7uYaXof#Ukclmh~pSwe{)o6x?l>89^RIVt9sG1 z&=cevIsBFR;i9na+82L%lUJDeRN$aR;u^YtUYFrD&570RZX*gF@{?Vkzj`A+a}v%* z|0stB9-OtfpPRfe=HNR@5vB}XDvxA%oQIvz-5fN_&OB6}X=HyHIp<{1KyLn4LV@6B zM6gWXlhg0_LCm}U-nE=|61)5a23MmEHDfz5+di$+H=q&ZP`TM^ zeAIBbuc!K$K_BWP{Vl2m0tzUe{IR*8Z!=<2Q#_&dl=^ohK3p zFOlAb$2i(6kDgb4XBkN1?Vs<_@try=bFA*+XJfl@PC-iETPSrK$ERO<(#{IP4Dd{z zy2|ShI^_6VI<-Q}Ln|Y6jIlJ3N>1kJQ=PTO6j#8pX_t{221AwKI&eA)r19?<&s}BE zY}p$K1FuQk7@}PE2T05f8e>DykhM=%*M)t(QQ_ZC{}lc%p644kUjK1m!XhNTIw&E- zChC$kVa<1NHUGCfurQpmbzHSE8#BwOlBSnfz};OBycQI`Zh&{jb1sYMRTciod&O(n zd<&R10Q_;wH;W5D0BFwLZp*aMx51PpC^v=-iyJ!NjouQO}xnTtgO z(A=cNN#iHQt4E1^9|vnr>-nd=MbiJW{)~i4?$Ys@QJaviWyASny-0!W!lE$$hs&Vf z5KAkwx@v6zqab1PsdV&?4Gxn^P4A3zL@KU@04^!lP$-03MF?KjSUGSTR$&~;`7*F zV=C)a`14PKHd=HZQ#OmmX5<>p=6Km<*K+^$KwKBNiIhBHVcl=yJaoY)CYj&PLBS)h z;b(xG79RS*KEunYy+*|X(?>z|=Cx`5+cR+F)|%otciY``C7=Om6r5`>iZ_1XE3g0R z88&|(Cga^D_E2l}%-A{82V@X$)wwFTi48GUx{DZh_CHP5?D}^hR%o|V-Rj6NdJ~V} zG6i~B(Ssu6RpI(bfkNb+tL&I-tw49zzS^t6SXIC|vsaJT`BA`wL-qFpT^cOgu4J4a ze{}Y^%a~fSgdlsrulaZTbtzcz`9Jm2x1Sw%$oH#jN+B{Eyv>1uZxK5euTq-w=Jd3S zgqjMx{dSY)?a}k1Kb3YHul^B^{6}>x|2x%3v?znW>q$>hieArBdCi5hBp6Bl8KIdH5If;E}q|1Iv;1mlB z3;ToncT8AVjzd{kjvo2@1hWL+Yb(LL90@ehz0Fe5C$z-;@|W8!!&@vYRf%i|PmVLc zpY*?P9mvAMfjoR4Ns;6bWMK(FKe%(tEX-kThHcs`I9q#znE&j`m-MS<4&T{6zYp0o zDGxQ=cyF8OF;HPseBN7gwBmEIpzAEdQLFBKUfpd$TVFa{(J-&MsXoJAq4pcw@A9LY z8TU_JWl*wJNgDE`9u4K2G6dRg@Z2<^N7c0sc^esYc0Z1i`Y$N2;vJhl6T0E{tv(%!fx!5iC>M*yTitv$lNq)s5Y&1V7K++ z{PUe3L%?>V?44GabI)fY@}(x4womfymFRZmXPTVY&JJBvknVnh_RgchJy} z+63%9jgt;WK@LiR9Yo8gL;J)aE04+6%}#GHK>80XA7U*x#ewmH0| z-~$_Hl*uBOn%v|~`1@j8C*)GI_j5NV3%MmZ5!X}wk`j&TRh1kxe?y^$;vJ<$QCB$= zjuZh}M<;wu|*MczfWMbrMcnMpf<}M-QrIoxd3*gg}i} znNx2`3fF(1La8U5=SwPz((Ho}_s!~`kNi*_2=yCRPNm@wtmHyaM&&Oog#yB*v{y(~ z2kex;nSya4|AZX#vXX+GVfe3prF|Xu+*qLSM>yLTo9<7OWIOT3GI8*=1~09`8ulHl zN@LW8%?vN!NcGfT&}aP2zV39RE2UtpfG8=4aIw<%jtI}BBQ)o^b@f!bPgD#$Dx!C} zOYXilj}Ox@rK;EvbxE z0CSbMJAf3OmgEPvw%7`scgF@d-azB`?`}hM%BF+R(B66(cE7Ct(`AXN(zXu!SzDC9 zSRR@kb&6R3UW%)ATots;Qquq&F;CUxPcv%P#Drr!fZr@Ah>GUzn|2YH7T~YB#E!)y z6vWQ>dokG#Hb}S}z*Fi~M<%BLf3%+cK%G>p+6lXmN65kg`Yl4|mNDe2gMI7ueMfTQ zz>Q_yDsM9_QLiyc{ZI20)Fq4N_lfQwu~(`BHWIiq5kUyOROxszG>I-EaNWOVoCTw0 zy`quPf=z&&C=tQ5QT zDjk7!r6kK}Y|!}Conz9KC?EN41hO=DlH_~{mG`EoITDfQDV6+kJ6ZfqKH;NVe94s^ zJ>W0i1pdIM$evu;pE0GYN)?eUWs&;p2lukbgNVT@;rEGM(zYT4pUnq992fs%ZZe6h-!ebl=l^8`kt|Es}h&ke_hH*3`vL&`M^`z+%n8)c{EVn``Mi` zvNTZrNdY+27Ml{C2pu!p1505GHMG5Mor=kgx(ZmtbYE;b8B1L*0O6WV-H<%d>TP^7 z5c&tJ8~!WfB|}q-gJJ8^c${`0cC0eO>Td5*oHmNx5ps2RfBIHcq*kH$AU1*rPXe}| zZz4Fq-{#+ekj+1{^|0YzUV#i1w4F1u-uT|QbEGUoJSybwbQ{V;t{&dzYJm0YZxaPv zRjuBRB4a?FDDw&0_Vx^XpZaLOg7ylr`F4Mk#VhSux)HBEIVD}=ckLu+nG3mdu3tJX z(LwD>J*0R$=D=Fsd3&zE^On7<-8^SoIKGvKXICn*m?El8^^d&N8M*zLxoT-%AD_T@0*>XduMOK@ynLnfo zJ9iW%##@qH)NJ{WwW?|;MW_J`UV~**AqzV8Ql>6_V@^Z4#PoiM@o5#J7dK-s-)i(i z@;U>M+0hwDdfp?qX_FML{C8!GfHX|s7*U$qzGI?~^SO6Td4O+8e(gOpwt(DRUgC); z;{6d=6m`QF;w z(7(>%@nLY~sY$*^S=%7c=PZ}9AT}j|R6_SdbP}Fe!-xJtu2hIa&Rf!{{rDX1Rw2nx zj;8^UPvfZLAg7qd6?@r(eR1GCgX(iY?-;bBoj|Qq+hmP2J%YSH7!z$Mksf+9MfBO8 z@=nqv^)Z=B-{gSD2BXzc$94#N14{&yFbb?#C^UtBTfYp_GsEPX+?@X1q~G{BHS#qa z;;N*Ywi36g%2sw|PWIoO+e3hxgGxhKo8pL@*yFd0^ z6Gwt&OftRMVc;=Jabr?9wG+*k+GH7XptH?b7^%8)sXIlt#}AS%C;#CXGa^DMBSBE&77Yx8P?l1j5i;2qpq{Xn2wLq8yuIbf3M}8 z2kMO=MsrgtHwps%w~XX*x|~m=%fwR|vy6@j#}=h^3R08!Pw$kKH z9vs@7%MbUvVtgSp(4!#l6*RJowb;{{00%omacdTG{8kE_gk8-18PgMS6sRXQMv4_4WM37KapaG7reK8x zC0T_9D-%Sfqmmj^GKu_^zB!!R-?tJmyp@`?aRG)uXy;o$$_r>*8>Ce$_;U4i&`u6D zcTstz(A|39TkBKJYxF?iF>>6HtcG@>-TOvk)U3HSXomjQn1Jt3>?&HH_*{m3JMLQq z{Sc~^&YAWZR>7Il8aH|zwRC$WT6ewFMM!fyEu9QQ;TynTs#x*5X}WQYn+ zZGT}WciZpCLht3y;@bD;`+-xO#CSeTz*BJe)_LGER`@JyZp1x1jiu<#iZGQ{#ic>S zT2}{R~`S-f8sB;YRI0`-S(~F$(HKCE}pZqSzeE1APsRyll_u{Hrif& zA^mMx{6gVOGo$%Z4t3m3JuNtF34?gDISagLA6dAj4*;{ys7d>JZ}>bJ=&x{REEyQG zy_e#0;A&rKyKJWQcW$F*Aq`AWamroZAb&_FKWs=borng4mJ$)s;8?3rb|I0XEQpf` zM`h!r#eHGvy8;Qu+Eo=^hVOgR7)LBpD}Gz1uDE|sRsfaVOI7rAy&e{$vh{7vY2|rl zhpVk0Apb<#f-MH|`&RqBwIU1vOKlFts~bTL8TcIV)dyk{O0Xk=Ti-`Yn%52c(M=hs zUUIb*7TB?{<&K02%{9`rqYBz9KTFaRRnpe zZeNXQ+i5!`nQNNTKNI8|{8DmWhV5}wj?Ej3c)yU=t^M$YyuFbcZmQ7!`WKJts+}qP z_5%i2j9=AtSMZMDX8DAqQ$LTkAmLz!3UE(B6xQ9BOC!uH$2~)Fm*c9*vb3G?KKge(C|H;Ly0* zlZ4>qR$4Xyxi!D!db-To7)5J?s<>lAJAV2A-ZV^9*^7kIws!}yt8i3&FsdvsNH%LQ zbljten3cHrRwg8PKOxic*COKY)TnnP3V%`?Jo~*&g<*M%`{+;Eb-GV`pg7HE?`X)<1C&MMJ9{lVp8cu{ ztL+*;q%Ml)3=SIf+&h|-%~4& zvW>i$6Cp8^UkUtv%<-s28(o_b<9)c;)J&bA&#JK%>g{=DxS=On6+AqZ7~m z#W_RJtO9}jvt*jrg+!NS{~pu7g*q=^4QurMYLG*#yph8Y~bXrUcH{LiLx6#!{^e zc11L=-CI{`UYMo~EeQQ-qfG zeb5Z8^qd{=2J?v^#9c>+cPBNCR5Wp&AW1?bV07XaT8>yBzS%T?4F54y!3bwjA+@V{ z+twt0_Db;UrVI-MpWrHX6C zo6BD!o0@MqqInVtk?l^DFWtM_&|EnS(P*r7pL->nNOk#vg}_|?d-jiV4z z&d!2xmFWT8$&9XOOflXGdY_&b2^m ziIi=+ze@s5Le8i5P8mLEa_vlRCDbx-)!Ul$$-Cs~Y6_%mJB^;;y+Nn!wveHa{Z(-% zv~+jce*O8aPQ-6Eyz^e)(N;x|34ML%2gM*9283%Mrx45K!HJr9993=RKW5ik>ya`pm-Z`8y^a1=dYV%@>WbwX8X0T}})MKs9qRdXJbX^U* z8u;7Q4?3hBcz{8h2Js32LlQtP9sNE$Jo)9IqncI}(c2m7JOIdD40@#<`8?A9 zyL^iS;n|U1-$%Q*4`vAvsBI2bfkQ0_KJGCD4$59Y`|a8AItm}F*o#2EsnliojbO|w zN>n{idX2hg%urA?>;AEjrhSIuJeHdC1%8mPj~`J%G$*Y4&W#PCWY0(1CsaQN zb-vWUMoeLxbuP8#Y9r=OVs(nL2JW)q-shHNJaWgk615X$jj{wR z9m37QjICneE`@Qf?TtNth+qtjhEHAF)!3;4_FZhpZQ9Bv)?6`6BoWs)(~%dMkS?6w`(j!hx4W7pnO3SU<~89^F@xb=9$lgH z@hxe>rCxy@<3)XY;dwAeHH+K0na~;4)}ZyjW;Ze{f{*Mr19Y>#`cW`y$3jFzbN~p6 zialZ*Qa4e^K|o%EgW-=%lv!PP;oUBPR7ak~bF8`-J46^~S=jT+wdmI8W)@TgRFy^8 zVS;yrKc6`R04_G++W{IjDyPeojyf$jOBkgi{HDXY46REO#G}GZPe)?46dmuRY51Gl zZ4JiYSIMLBYwI7%EXL>MOFf$ka}Pr4Ck-clWC%E}%^;`n%4`}8=>Fle&= z8U%S1I5ZaEe?Tpx`;&4_)8aoQcN4*Rh4<8h#F{pr&?UcaH`th_eqJx^h|L@i2mu1&)u*WcS;eW9B)GB@b`qKqS>k`p|M77 z?uO-~0GiDbRi|M3{zyFMRGaf0L3iYMO@d6y)KcqTW~X9pQMqRT>PxgAPafAX@z9C- z7!r%hlmOfU|xl_rF zU95NaPh%qqyKP$5=-2BC8tZK}_-oW>&ol3iZ4w3%E2*qbb4D{@#jxL0^NT(u$I{43 zg1ISj#kE`#UCXB|X|p-YfpiVpY$~UvSAE|V%-5wW1A`_FVm9lE#>h&C>C2cp#@DcR zw7&C_e!=>DpPZ46%pt14evQ@uW(Zep<`SXtIZ`{8EqOtT<;o5-u2^V8Xf1quW-kE} z7jI!YT6d5S@9+vFskKiX7?#CBpi%68`xYEw%KPEw{OWG^dP9QX*=Vf8m{UV{XDGN_ zlndjE8VpgWxqjk67p3$xapF}<=I+|j$Bt=|%|2u(9=lbFxGsC~(TpL;eI=br>%*gr z>E_;{21yp*3U-7a?Pq11L=a0kUZ8`a5N>6y;UvM9RKJg+mu23xbp}qnig^P3F)UYQ zpGJ$9HB2U|zWed^;Dm$q$ykkVrPEwhHYHsX*EK-bWz3_TXjMClDw|m(r)9Xz8)6ix zd9P>)%cHJmJn0QuzD z@fAO8N=nvZ?CKcQkUh4_t)OwZj^HY;NMQfgnCG%ISkNK!;z6KsU)&Hq(8_=^tu^yk zWW4nLge5NdIAGQNgLV0Gr!vo{ZPZvcHI;xy!5JPY6@5xJTGXvat&;VEgfhw0&eh^1 z+#7yAH;8xGFt+LID4QIaij9@noJ}`TYt7zj+h(Q22|L*|o-~|MeOFQIhH9SJyG)Iy zCj>Bj@lIP8+n}){1SeWJuR3b4n1CE#bjmiAvfeUj-bmvk|a{1ba`+n?=eZr2THyzzb*!B+yq1pozFPz3ORGx79m~`&lwt8@$gz zxmE$AbPy@J)4Y;IO@uQ&hy>3i@}p}~Tgk|0q*mU|#CgHS5&e}3cPeF550pLoesuvz zMtV)$@SsF{RWue_w56<-U=sMlZ7r7bA|ma5-5!MGHwi*)MDClw=4)prl(KRY%OZQM zz`@>Il?*Ovph11SB*dYPT~5NGWrNh~w?LjO9jHbqklt8saSJQ8lGz4`X&_{&TO2Gy zzU2_E&wR%%=+RXzlg`A{C(`=6tRGuGqOTe_+IVT%mSO`*;S2F-+Zl6=tZD4CE)deM zq^Rn-mCe2Z-NK-i^Z|?zoJxpglhybVm_A6K$bc03PEo-6g!$TRbZ&VaM0|mymE4eGYdpEPb_P^#{*Cwq7Zf>EoqibE2W`dH& z_v7t#7rn;?PV}v0Sf<`V4=G|hn`#4o`f_J(Q{ZCXBBWnkk#}zDqF`MpuO^p2Dw{?g zfq&j5wsk7sJ0DHHqebtav|uqJxI*|=e;mPcfW52Fz3xGF_PSb?WJD8@#OB^!HiA3 z7t?oI==reugH3kMS?RQ`Z-YzRdHE|R*aeaki_M1#?DpJ;jPAD+myRRtU%gn#XWvw9 z5ow(AvviCMUTq?_R^b!W7nn~bYVKN12li`j=5a<|1(=q8=@)FgbYcA!h?lNb5w+Nc z+vLlIrlqzeCrYP2r?GZ&WcmRBlWWmc#IKo|@KL^!jv-&3f?R9V}rjC!yA&uh)Y7F=NxyURPd+{SlZ^kt3Upzt_?_ zjT0F}hoH1hH_~18OfIZUZ{P?hu`4E%y80x3LH$Z=#5M#4$L4TWNCXz4x=cw?hm}4q z=i;j5$Xw&5wz*)(y=uS+c$E6ZgoXt_^bFqko)qLl#h24=Gt!%Pn$ME4j^}f@us``U z*IVS5f8ceTse^mBbhI3lTZe@sp9onxls&z@+Dg%{`rWVH8xttH3(LkoPp3?Q!{XBg zhiZcMey3|t; zopc^Q7$LV!`bxd*5Kz8p66I4{u?`nL?74;Vk?p}Lvc31 zQaZIs{>E$eK9Iabn5JrVSlAX)1z{bDlQE1>TFC^sJqL!jj1=Zfa}O4x9LBE)Ntaie z{sNnMG=Q%U{gzvqQIbngE2;PH^x+XlA!Dgyb*VDtrE0XbfqLfVZSLcp5pt`?2(gjA z_wl0Y%JI0jaw+TG2w6dGahdahx9pm(3RtqP12;@N`PIS>jZ1S31Ly!(g`<&iz(XWt@|VTj(foDUys^IdMLJDALS z`xmm*y~mf@@r#cxspUTtgJ0&WkEfB-g%}~@1RPDLK0Z%Ji&tA~zk6?TYPXBv5Mvh8 zowBjV+)J~WN}esv`#sq?td*?B39+nWmr*T&o!bcNdXxT4m)woxjVXWCM;^?`c?C3Z zZ29n1cC}-_7sN;#dl3sQZLS-~H<5aFDN}`^FYDG;GS5+#8-qHxw<4x21>qe&@NDj( znqY&(-2qc#AH29|ii3sa>+7ep=FuOQ=RD-x)@xOY2Wm^WR>xs($Z|e_fLs8IKlN1! zUq`TwQ)o%qv2dv#H^ zqkJedPSW#7vkwjt%i39%q`ao}T@;WCg}OEcw=Y~ff=PHpgBh~2!uWY_pKWJ$xL zG_qCL-nKTOC++#zyJunNG$~v9a*s)x_#S)X#1-UM?xg&Q`5NW=K=9L;HC(KAF5lRKvqi`6C)wD6oHidP%==xY z2yOme1ZmjW(DzDq`dgYre`QAmfMQ?gPiC_8$G=i!2bOm0nklYjXZCJ`rF8{zXl&QE*t=(RuCxHBCUy^=rA} zX=`xV4&cZWHvwhZxAdL-fUAxEQKt-)ufu#3ByrO!UO`%Rg9<_YiILR1&3@XM}nOOA{&dyw({TkF!myXKMvs*F#3{cIhzK+0a>!IP~oDy6l?o`uR@z|)oT zM>elDGR92t;{CqoVu(O@@151)&2mSqAcNFYgG1UDb@ph}Z_o*|MQVEL3TCavcA&RS z?IGORdK$wi(f4Pb@NCWNN0>NW3LXnRN0)&Dk{3QSOvFtJj>V5F)pvs|4TCo#Yz;I@ z0&iyOU3(e~Ce1D^qb-66^*%JnkDPtB7Wpd=I5R=H0SCN&^(s5MCitOYS9G6ro~gg8o1WK*MscZ^T-I&e z{`K(acQ##GyhSNFjv=kJ4t$Bpo%Mi~{q)i`XO{`^da%Zt93OS592{HBx)R zB=UE;$Qx(hRt3Pj&%vvF{a9_8)`y|o(lejeYYn5Ul_AQ5&Yv$d+BC{Jh+Kf|eq|)I z<5RcPbnW;poPu6Ck%lU$=4c7eI;%$5i7th=bSV{Nj-==Ugp%A06QcQcy{DM^ zHv-p$rTK!HhQZI62=U`lNlxIj?{=qtR`6p|`;)raYCA>SIpbGw&k(`4=jO%qOeUV` z-Oso^ruUFP=ANxZcOJoFUUlSJT3guDIcU1P@~7Yk`xUHOUB6;lj{d1;_2b{>Bj4R_ z&k;~;^_>yZZd>X@kk+wtI>Pn*3fGM&RL;&(ztwP_iuGOF++8ov%?uf#r^h5#g#mI6 zK^$3w(QGV~R_g3V=@w~qDS=cFJA9)-mXEhF!nc$NzP3USPU>rF!u|Sy>cr1viJ}~) zd7BI}&&XA+1lD{Qp-o@qkcN)Qp?pT0b{pH3&-3d$Sii-FRg}B}=2uvk;+F--Q^5Fz zw)jjvz$7*br1eR*TClQUl*t~qDSlyOHYPZ=%t1CNBAJ*m~!Tv@CQrRJQ6O7n4c@UJ7lRd&mcI#{=M zUVrx~Gx+D8AG3Ps0nDp*FXSvQCcDn1<$oGgPaF?g$Sel%~*zB5@O7nV≀m#RcS8c^$yrN_iyGDtv&Zk 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

    N@ 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 A4*&oF literal 0 HcmV?d00001 diff --git a/figures/commit_source_new_pull_request_confirm copy.png b/figures/commit_source_new_pull_request_confirm copy.png new file mode 100644 index 0000000000000000000000000000000000000000..32a814fd5a84c53c13144cc400fea4ef754eba02 GIT binary patch literal 43340 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 Cr=V{D literal 0 HcmV?d00001 diff --git a/figures/commit_source_new_pull_request_confirm.png b/figures/commit_source_new_pull_request_confirm.png new file mode 100644 index 0000000000000000000000000000000000000000..32a814fd5a84c53c13144cc400fea4ef754eba02 GIT binary patch literal 43340 zcmeFZcTiLR`!5*vgQy6oNKu-Kh|~~4da(f_O+lJ;A|N$HI)tKrKx$BtB2`5|dXvx- z1d=E%0!j-INu<{h2!w=WgWvnRyLV@2?%dh^V|QjVlX;(Wa?10(-%ou#&q>04Qv>c3 z=T86t0B*y(cgz6*4j};G2=LfZ_L1hswrlL+P=L9?EkM_&j5H=jOvu$CW9rTnD!>AXDnktz-ZGbNI5%MVG_Z zO3%K09(d!K|LG$FNts>`D~?B(Tb%U0wR$mK;;I8RO2g}O5gkb(6{Sz8>ZW-Zow+vBYUg! zkp!07=2;>)a#N2XvO7aUH zk$2Tc*ko@Rcc?x7f>9M#?dIT?!rTnw3f%aaO3L;|@uBh_30~)%^G$F2awXd;HEG-$ zc5OQ9@wCc6K6r$@Vy}oCB(9?S&4t&owK`h`?HIn&}85 z(;Byl^~y2YtWF5HH^X|fGEZ1LoR#JO1Y$n+!E-lJ7k)ZNN4(lzQBr@B1{Xrk663K| zi7q)KddX_q!O79!m8Rbi@N#WoQiyZ45EbU#ov}@`0w#-zYhKwsTqXn5K2^~CC&NYw zxm@dy-rL99${j8Wh*d|0LrSnm#qsyx78+)m)R=CvU>$a$#WQzBP2mHV^-7`jjHiwPionvW?mjNt8F#PCPL- zx>iL8woe1miaHa1&xW9nbIqgQX}e!WznCveLY>bPb@EyCf0HGeJK8;|AeFNi<&@CW zHe~o@?HwJ=47q~7B$abSf3Ic5A>94@_XFJ+Kd1{njX11qol|hoe$Y3 zO-N^neG9i}w)x)l0=rh9o=n$fyc61nK$2J2)h|-%1Dvj7i~Y5$F?OzhRGD%_d0sSv zPaOVQRp)edB-3Ir^5*D-(00i6T0#KL{ppx42BFI;482ZR8SDXK7Q~Ie?*MhIavRkV zrZ@;Nle&+wr0EaB8yk66@AXbURIsW6+t0{3NRq0IqKB)JZ0@VgiJGg#`Ig=H@nobm zvDhkA2$3uI7g4{$^N0{tfFL~%&y5qu;x+dj`kB<}oe@*)Pin{frMwI>M(#F$ z)A4pv0D7rO2$Zdee$0nMqKIWSWX@LXg}u9@*XGWL{PXHABLPRW|AC+F3;)!PdB>9M@loti))> z$P4nX&dpTaP^}T)?+}@K=&;fF{*GRCp1+%qE_p^Miew2|>1GMyO@&0OMd`Jnv%{6- zCA;Eo@9La0?fX_s4ZOZ^`2wIqwHS3!h!#RfoT2$f%EV^UC_c3M=;Wr>EBcjv5aAeo z=5W?nG>B1;-;PkZL7^X8oV9hMuG5j);@y^?I zZPt@!&Zt=_aOsb9>cLkhaHwjVs|`K$@6I8vLKv16GW3Xd%s8D;rPdKc}iM&Yc zC3H{za*~6=kz%~_jqC8U|Mb%~|JaOCcVlO><2hn+i`zPxw{aHz(D}X7wR4%?8pg)W z4fD1#A%g+rpG&aoX~-B_dFM8HFcwv8fSttD;T|E*>I_5VR;U=Us)9p@Nbg@`ezaCy zpNtYFNybg)a5>)5XV=)An_rDD^i4I4g!qPpvLBRFdD z&$aY7C29Q}s~1UKgl0)%h3aZRARR3RcY}o3>wdJH5J(`e@!MUBVDaNS@RX_ z&e!R_chW&U)gxUPt9=5S`TmpS` zS5sXLa>c6ig6-*-ff7<^YFGKXK>KP}FR5WZe}Sc|@sjnR%}N-wGA?tZ?b+IF&(y~q zx*qssG-E7uJ9Rz5*CS7e3~@?+oyYp;({bmPX5DuG-(+$E&WT^uJ~P7%)9f~dxKgnF zy=}kDCiFXbDlkb$4xW1+I+`lh-^ewT8H|#%?+ZL3HY^yFnjezbBND!dw%I00ks4`M zZmAemln7`?8=Y7u*QC(;WKD>NKXX&;q?GcpYR=3OFs+go9jBTr$nti%ZNG_B0%Ih( zp{v)|QyRO${RTGeOc>Us8R}I+mcAm$lj|`Z z5-{m7;}bBogBr5ho0<_`k-N{Z{28e8T~73FL9?zO^Xnj)%GcY~H4pv;OtKWvOU3NR zro|}b{mWy|Inte5?mjz1TwAu`7-X6Rp{YOhYK9xf$D?TC8y~m0T^FNP`Og}L;4BTZ z$Mr z46=c(3>JLP>Vm& zCbpjB5;FRBm31T83tv6Igz-TvDCDQku(nyQ*!5gKJa$FAS~S3PMeR2MJeG|(ldh7! zZdSeG#{vF&9HJ@Vx;;Tnn(@d_Ho!$dVDVS{0e2_H>+YxTdl_hBSjx$e-1&f zIb0~6J2w$-U25~aE5#{!#0;jTncAmNL&5#*NHLnB0Vy&YkD zkp_BU)r%mAj>LedF!@K9!;x%<*YL2^>767h?zTpLL!{Ncf`)t8Dk|b-^p{I;dN(Z{ z<*&|stA?sP+!k0+Re)Eaf$E9A962h!a8}T23YpxiGweotSsf*T@Wtn^8?wR_n9JDH z9{HOYpS6jZgKzfnen|z)<^9+IDxI`u%5vu~Y6hGbtx=68F0_4c*sJ^0d)-egUNH5A z;nL}iQZ-#&M8BcafO0TnsOXKj>b?OQXR4vPJ4+Jnk#zZXMv>=Cnps8CNQ8JoXY(yi zAR}VNIl|Fl6k?uF)0-48={}x^b&+GZIM}G&&5w2@$KaXV!7iR{P5x@D3LL*Cxkoer$6K+#YR*xOdCPr5b-%+Fmzx)yZ%ynu<5c?9ytl!05hdMBD8+`WPHUXS z=X{qJZoy>|qf@t;1Ztbj4wV;vQL7e3s^PPvR83TpCjyivUiA4eF!9#-7HhKvmk^eB z6c`wYWW6*^*hjt&ITB5^0}e++O5rBkG0Njdnce5uA@@i=!EMHNBy9<3s;x12hx`s|)opnju;~2o|$G zpSW0~R@#**$KiWhonNKkiO~Bq(!C4(4!+BY z^g)*;psXV$=;ys=$>LG04?I)F5tYNIP8CVgpI6=9aCkH%)L4Y;!Aevu!y>R3JKwbM z6&tJyduzagqbOS~p_KIz{r;a0@8DcVfrm&JKuf!+-OnXZdA+&i%(YG24dEEJ(w~{Y3P_dVaXRz>Q+Q7YN9| za5W`?22mJ3^BzG6bV^Hfhn>!3MfVc0jN4H{y8SZ#`N?MU-1ZRy1cOrWtQrOjy;`{g0IfHPrn9U>jt2Y)dO7Pa1d zVqfqwX_a5_N1oPIpEk9*Vt>hkzG~NPmzjX=Cwm`l_=&$&W>Ux*wwZvUDqsE%({(a#ONMaaX2l-|)|GO~ox zBuA=bFR$2><#%sZThlJSYYB*&(I~0JTF+>>nc_i>pSMSgwmZWf$CBpPf3-_9pH5?4 zC%>Yr6M1x3el+b>&*}FM9{$MuvR%|)TUt{Qw(x9sRWmVw>u1~IZs>-fH!)UxUr`K( zwIlr`=&CA&F1(CIq0o`4tM`U>F-k;+Y1d6TEg)~TMF_oadCbRCOUBP{S>AH5t_ZfM zVLS2+%oA_Mh^{A2)|>VscJL4z#*8K|MO{1$k}Na`EPT}!BjGG^#|ucKsBP23u3K*! z2TZDO_Ng`8PA4Klo5-@{p9VVP4VppbYB9mlAoHl1VZ)iIr0IZ%$gjVHY<}jCop-X` z7$v7WA*H?QaNiz42RmbH|Mb%8HYTT2zh)ht!#rHQ-=^rf>^0;-H?5#=XDbjCi@Dw# zL~k<`bmu-lm=(3_^^IpSzeZ!*mkqG*JW!zGV5JJ@ogH!F0qC&5o@yZSd^EF$3!@@5Y~qEAkt+MsJw!W@RXo0zX8CR;0MZ-kySYm2*=P zcYwh`3ffWG>U1ZI*LMW0keeRSXS0JRAXdlK-+nx#MIjQ1b_XY?7aZ%)wTT{ zH%>9}Ob2TXE2f+MeaEl6aFmZ`-1Lthx7jYYyD(KjY}lMP263Twe;uO1v$oQ?S5R?xjJ`e3+G7y)Hm`ep36e4v#AEq&tV^dpDZH3kcExa-B|}lnn+zOB z3Ut`Sh_vkFmn>Vg7tD}@r?%aIHW~?LIZloseIKlKIihO3WLIY?uj*CL$)NwhvBA{Il zezT~=`<3~(U245q5^vj1UZ);a{V?X{Y!I2rQPMp%y01vL3hPI)6t5sj-8_QVa>Q)U zkG5|;Ya;sQm7kB05|*9q4M|V&&1|U%mOli1gm+0!L%4n2C;zSvhV%*SO&bA=_DWwv zJ0%NJg>{sGeoawUxr$|>c6#lrmvWz@R&v_R^v){SYy6v>J`te^GEx57TyFWuyg{#y zD^=a=VUd$x0Ar^PTe#RjCg*cSOHGIR@4W2j*%9B1W39vq1rv8j>9T97t5VaV^!*6A?`7)%hYSzve%ZJdt&<&ykp z!B7Qyf0|2j-(mGfC35&vbb_J7QPgV`1=&Q+=Iu^?QINtZ#;9&$p$byEOq(uLwYUf8 zs$C?MZeU5DcN_#p2h=6ucxw4B)CDE3i_kV@bg_U{^ewx>d5OURtxOY{FebXxz!G$| zLiyeO#ej^en{^vfme5R-r@!1puut1R@0zBWA-t>a*a|pXUF*Mpe@VfK%>w?qK9hEp-dPlB z*rm4uJC=6#+CYJ(l+NZ?-LndHxYLR}Dh9d2T+@;MjNs+r*rZqAp>qkMC|lTKQMS#G zAE3ZV$;A#jrtTb}4kXYk1(jAUz11A*VjJrI33Ui7Iu%UqbX0+QnJ`9ECs4D(LBF#W z)OGM8y6ro!Kj*ciS@aqp9R)Uvp#Gb`)+Xxxc8egNx$2<&y{3$z-N(9jqjxE*Pp7oq zRe6NkqfZK3Wm{d|S-wuLPoZP&mZZ>!>{PIGnJ0QPsz5hdoLX4OC)izS(2BLJYxgkg z9DRQ&A)ZX4*o7l~t=qzPrBBPtPFyiNha}=$QOF*{;%FJi%66H!k^~zbUG3m*1MnTy zwBj}u8n5fvRO1&j;^s=DD{6D`IB$V@6U!1*arUG;Ne03B3LjN1*SF#`E7*G&T{v{z zM0Eu7IogZ&Z2eBL6zAD#ic6lEm6Kq#D1{DM`OxaxJ!kET!mcN{09h_8YE{D^wJAt4 zX;VRyXaXG+juI%qwcf}Cs$D4%7Y-vK3s=0?3$LeW;LP zXa$0WDOZg~hHqr~-|E}j^7u$La*D6spYk9Ab;%=YWw$QUo6=Z{bJ5Iz@u-yOolJ59 z#Y@9@uWs4=S*H`4+d}sj=tf)F%j0`>0UeygJ($mg3O4$3`RBZ0T0o{wp>?ISNPs5K z@n0@hi=8^2N0(f$Kc2as9$Ac+6+YK=1$$gdpRv|TcoXz)Eu}*BVIxlxmx3ATX)wbl zcyK1*$O;?3RfVWr7ir_Rhg3D%_Bgke?tLHlOX2E->TWa?ZQ%8hGN~)-d(~bs`nq2{Z#Q>r zG(o{7NaI86?B^zRZsPQ!(re^mFSEbZ+pLbSlOMgU>L|j6+k?toWyu9IbJ2sKM)EN9 z=GI2m)YyOF^0Kb`FIeXYUaJq^sn5OIEesjC6ZTML?RPEo$IVFPe(L*rNqxp2ZxG{y z0T`PQ0H%9l(cUz9ZGu&mTJybJYpedz@86;xNb@#gR zw5(o68VyzSp%W||)k)ud+8OvS?7TL-LV1|-&HPCy8(S@xijs}1rag?vT=Th7&Jo?7{J(He_=+Di&5)@XXEbtib8-1#Je_R!e<((iT#d{Nf4GF!O8s9QL ziNCJ`aGqNf3d0J5QP)|Hp%3P}z1MdGeKgC!cah-9*QYsG|9FQ`4D7ZPW5h z;moR=c(@rP;sQ%kLmElT2kI|}dE8+*>uF8QK2qTzIrU*)RPT;|gBO}%a(N0g-{;0a ze@qDEAmGU_%2v?L!+f1}uS!<$)UCYNsO{WO5;UgiXX@^q{AXFLMb?iwus>*C+Z(YK zpWXCZdp%*NKux)GX5MMn*Jph59sj z*0O+lHz1Q341HI$WZdOYjgNCaUE5 z-)iFL>=XJ2HN^K`hyNcMyHp_4Z4yqL&ackxzXQ?EuY}p@pwyk%6+fz*jL;$Wvtr7) zy?yu7Pw29Y~)s_;Z-(0ZGo83zxVLHXfRE9Q*&r{}0TA z@4?zdZiMd^t1Tx=xia72(9*gn4V}=gGDh49g{Et3tv=z%2Q_Q?O@Y*YXkSBP_pDS! z^6~)d)*VDX!Evyj+)kr_AM_>I3Fh&oZCU{U!6uY#K`cX)lCt(T4^`PNk+*D;pcmqB zCdk$Zs6KxLu%LSTlCyp5+IV~c;lA2KCtUf`Tm?Df1`XcgM3{4lZ8dmb|j zjmQl`x5rZJHFLiRm_3d-Cf{pZ(0bJmHa|lX006Y5k0y)a+9&v5bl_XLgzACshMVoI z1%r?A=1~p-wn{!c_-a$U`iU|TPjfI;D{-@guV-hC7)fR4nckp48m&jDTP6*V`a^)d zTkA(KT@wRSi9NXGaAGbm;5~{v0VHJcIdp^(;p&T=QpgLPKC?4rX_L{HKs}G4LTZOs zMO!e&T2g+-bi|~Hc*SlOyFgwU0cO$!v9=Bw!0uI=*y)$pR)MKANeXwDrC&{^`wyy% z18zj0zvS@A8gqmT^(wNpZDEoh6fMP{Y!F#52;P7D$Kh$Pj?Vq@#)YCajXZ3`KY;fy z9F{IQlxg%G#&D6o^YEwSon5QHiu}zc(wSH241aRk6;m8?5LsC!BJop}P?j|G zAwGc^Kn@Kd{A-qPu2yU85bBpWSK;DjpQ-IP^El|HZBtmMB%1F5;qei`)-6cOU0q=_ zguZdLd|WieI|CEMTXF)ML>kh}mt8v}OUw>Lb*j5~4A208J>03|LP=7&zFsBWpN5VT z8axEg-y>Lsh?RS|P3E+8eA-Xq*1ne-2BwA& zd}3#C8X=}I#w2m%!8*ep_N0HPvw7@GR@kNs8lxtmlV8TWZhxL&m#ONO`yY`xtymSI zmeFv>xSD1{{!=@*4U$e79Hv$Ve8oYQuAT0i&>S-KoQayx|52XS-*>zuBX8k~2X=h+ zNSu_XR=yunn-lO}BWPVtoM(PK^!Lm1OA1-PE^g%nZk_{aTcPU;baNWj4wL|L`?53a z(sJE3rTnW=tuXhqt+k(^K_ibNx=FE;{bxe^MbT;f%9Jfm$X%%-YfQ?zmX`POh1j<= zFT)Y;)}NMA+#>n?t~LyJ`Va$p2ry>ZzIbWMkjX)b^$1?d*COZchR%ri&hm;6AZ>!# zEBS*J*DW_xG|o8>RKM;zV@CR{ewqTwe}lW4hrvq^7^_L=IU@!V?YuMGrLu?T6}&VD zSJc4HOXgG49L4(x_^R(crDFnbb+541PBss_?Ip1I+|}7e4cEH^)P1=O6SF!Y_*d(y zFP>IBd|><|u&>_foj=$bqx`S7yTq+t{Wi*3xmw*WfC`(79YgH@YU2PnF9@l-hPE-| zZ-cv|ZZEgG%=>p#34vg!(EXX0XWa|Y38tGSsUTG;D& z#CY>?4X@&Nu9H#a`Hvd0%vJ`Sb1j)g&tb(UrIx0KVGD8^sqObrX%vkyRneBYT3Dq= zI$StnbN5({EVYP~b`TzDg!-afUL&6|v6d##MKk1Syi-JFDBGhyyx@FbQml9Ir@M#^ zoe4y5@;XjOtYB|Z7n@YwmP=qaVu>zZ;;!NSp?Cf$YHHE7ezn1x1eX$r2LU1RE?sf6 zm3nmkfq!12GE7f!3CHHdtu{JMqNszr>jdT%#JY7`ikNk8k zFFP=J%l@9!qYse{JC4=xo>J`m-KZ(`IS1jJ(5%Z0XYA}b&C9R$9KneCj+3IukC6FO z$Vh{>7N_p7oZ=!$rtkP0Uba<*lKjpn9+o_;?|gM46K>XW_Xyx5wCe;5UtRGO6dPA0 zY3Sm5;?yv1(-|ah>jqwX*AK)LF#jx*3BW*Z8TR~!u){H-``OhfHHCK4IE-sS)AM7- zv|KDpocah~S6JgC?pWbxoDK*2hN&|HX{;2t@{r1F=bfEq?2nEKvM&ZKSXuqbiW0~$ zwsZ%E3kVy#{MCPPN$ zq05u;di6kf{hID|JQDIfH!Es>Xm`2=MhI0Ad!jAjXVU0KH%r1pkWwSXIVYsXDRx{^ z#3KA$8}dhJXq)$-eC@*X_{9K0{)t|*Z(O+a^$0>kEZ;^fjr7^|MqP72=q&!b=t~b8fw9_S)3&$@6$o%Xg=AXoC9x+F`E{d! zBR^}g#woh*D9?B4|K!(@FKvN#m!k_jFJ;Y07<6-c*o#Ep4{$}QcC6(< z_txjV_xqYp)+F7#NLn}6Rbg(K>B!ly#KoMBSu%!2itt$wKj+IZhgGTbPWJZh1QA)v zoZ8Hrrge5WH12DiX?Y@$>Z3J&zIHQ?wwf9cwG{p^YLoZH?XYiI8AiHLvKW_O$RC!h zwB^O%j4MwUzuzp>$2LI1oN{5^gJE197v}7bE)<=;#-tUAr;tf4)Vm+;52WW4AEjbH*+!+cm5u>=p~a>zAIb z{mKgqo{U194CX?*oKLVLNrfUSJ?%+PJhLajQ32j{F$UdOBkmy3n z*=u5IPgz3sX>NZuW}r7trdq$`H#;kpdQRLan~WvLvF)kOsScga=94$px$zHPRr5Xq z8tbSy9eMxev^?*;cROW;-I(ENKvlkQx~8Nu+-pjVzP`B^jgmkzf8t1QyNWR$rpT-1 z&MUm>QBw0kH4u%!elYD3PDWIf`iFel*?PqY%MM7{mTbezMSU?odw1D_K!D6#0swBm zj5!U6;em^@T6SIc>7?HeIRD5406(<dC)ZPAiR0`WOXEXu;Cq)jPXOPb% z(|r1#B-lVi2%`1GOWAn;Ms7f8x7@v*Za#bI7kQcuMRfeQ==`rtW%%NESc=1JJ3FF@`2aq4Gx_Hy z_=&?^6G;NtP7ZdwPf%!#qCL-Qb`I-Kj;-~XNfw%_lk@XlJA2(U?{s}}6}+g|TCj1n zvAa&P_oL(z7tTW5BB}BnIYTJ}&Fyt>wyZ5$+;rUzVL&n!QlC_b=jL1c% z>O|vlp^((S!W$R&VOTHR*Fw(z{z<_?#623DlK2S z1cD@EZ0ZD$R6pCz-qY)S^BE^&yYp`dR@I$xp?qYye+V|zN})I81Pq0=v{$l$`ba4x z^x^c6Jk>~fcI325FKue2=!{3A1X!Acf7ldLwQpZ=o;+h>q?7Y9X&Y2ct_KzRbf723 z3sS;@lt}d{Nnm$i_=ReRX(29)bC1iO+us*2(3=-n6{JK}g}1*99({PEBpn1XbK3s`mQB9_;)M z;qsRL=FKar8?bP5e3estuf*4P{OLqV9n~B#j$FC*JLD%ppR#O}Fmv-k^kXte_Fce` zCrExZz+U>XT-(43lHI!1Din2)Z{5b8IwoXbuwMa7{yI3TbT>02wpJ_r-JY*!q9j*_ z+acHeDn0gUrXdxp)M{)Y}W0&=(`{hwN? z+U0JB%=7np-<&A=PQ&UsX8!im{5%xQ5P=f>kn<9;_RQt4M^pUbC09CRys8a z4@fI@G5)E+(QECj$VbwDWbHIK!y*@=8J`}WqdjKyPOVzLksM$CUdC(Dw41;CBMtq2 z)5%drIRzE~E7p=@ps|TxXA4>9fC4H`uo>}*&c4m1-t5+-RJQ2?tk}hUy9_J@Z+#l1 zh137Y_GSX%wqf4u$#BD5rEUp-b|XDIU1>h%VWKv9qPezxW(b|%VI@iH2jz^lO)sToa`tAh9HgXZb-p6f>) z^D=DAPsk4^br9iG7UGH2syQ3JRPV~l!B#L=QjyMQ5CzuH)P%_$}HVt!AnVo07)F~wZv zwNa_OaCI%|u~HHATuHkQp@h+VApDV?uTBaXKx`dO?q{gDkq(cj*q;qT=Y%Vl`nmrU zj8cgVc7&-&rjb1EO#R#fyF>`txV*_68d{(78LjT`>SsO_uE)2W0;Y0s$r@j=2-VF9 z+MB8`!kG_kd#d&OrMFxUaZEHT2zjC46S9y#rPjLqSTSPq0U0TmMIZhw{!VrKQ)XIQ z_k$Aj`dP7cbV^9Ks!DOfBhw^^Ncu~--6*;r-7a%AXngGpqZoDp?Hc}gd7db9Mvw)2tR%Xk^tOrXseIZ}ZkEdO2j zQN|aR@XrCiCB(-ema!OZHTBlZP?bv}>y*k++0}b@;%e^k^-k*I=skkb&s9quQ+_n<<`vjFb z;Wq~^Er+Z-<$T1*`+j(g+*15*)cAE)L0CLU3IC$eNABz1R9+o3Eb~C9%M6igY&kcvrj_CuVwaoLh`Y0krj@PWqUcN z8`4hbj#R_vGJe%Y`5MVNIf{I!?O$>ukK?8@Aa|7I^ZAwBuj^Cx$e>b$%F>btMo(#3 zLfiO6o4bAB1N(;2!@<+$2i|#u=wY8Ur z9GaXwGf&`}vF(fAzRw(00s@MDS6MrJk~N-q6XF&{j@5K^(;0Ckt3T4<$YsN)d7q&C z7IrSt4(|_i&GbJQWTQMgMpF{#u7lMloxLWXdzv(=kQA4slVip-S4O%R%H=o+duLwn z)+_LZla&OEI}tu-GK)-FM`D99op{%oWY>QTo40LaU29)~VvA;#9`c$>Cl`iG?;gY- zM^PX66a^mF8vt$3=P7+9TX^wTb1>aPtiK_`$%A33_~d~kVUx>=`GXi;<3{_#$-DCmk4*g9;TO^frwn5wMM2i~^%XSzvq+^ZDp z;fNrT7fG{(5&7RDak@K)#MZO8Qt@x2W0upJ?2Cjn9x8VFHO-F~Ke6A(k$X+b!6a(t zrj^V&O=3qV>83@!KRLH+nZm9M0i0`uPaPt0rKR?d9_;P>#V)yHn8p961n)0S`d@hI zLBe-P^Lx^vF!q`(aF4zPL}dQot$%g}pZ&8O(f^l{iT@y|AtR_=^R^~v0Q+r4ZFW}4 zCicAg(>o$s!N$qDyB%#s5s^@n<2SbB?sPQGpficH^3~lRNLbA02NHjIJ6c|8*NEm4 zRzV-4rzS!*kDud621Ja$TDa8iLYhXVJb*fls}5L(>>9~;r#h8 z#NIJroO@=tK3$6VJ!t#{p!p)`dvDnRxt=3lNeC4`?5qPiy<+g_d3GR}G)< z^oAt#7WUBdUO@mS%?}^ckB?TgpHnpbZ$-5*u$%XK)8F!6)ySzseus+qFdR`&jGlOeXXj%S<|*;q0ARy}!aFoTWi<#nRdp$@SiA*pss zz&O%(#?`X|Gp=gT=kTz}mtBoAQO!MV%};IJp5!Ng^}{^1$G6Bh9TBpBcp$xs&a3Gs zFpmXW3^U6FbJ#HL9O0cRHN#8K`Plux8Ti!QsZSQM#K;hbbAs;j9@vjQ^o*vUwJ#M# zpVsQ?_RamX)<>bzmdbOf688VZ0Sx0cN~x$idm(9 zmBMf39tW6Hv(ovW19|=r5k~yUMIey~rHJbtH!eB%X_LPlAy0nugbqRZF6Boni`h3^ zbnJ&LKQT7en%&JhgTof`RwZ)h1)o>)vu~^WkVA*R6DkqWl_anq@9aSh?idrJra$kZ zI{W{Hbs;vt*zc-2;xB`)L>)SM?hv@@cE^}3ItGe&DY*kuT4{5D^`(IEjcidIyB;C$ zyzGnQO`fsa4&`db&sqwjCx@@kD!mR+wgJoIR|Ge{uFvq`P6+8qT97$8p*>JNH$uLRUBX{LM+W!y}~1ms}5U1n$F_~1!hn6~r6=6g2xMOtf{jD=O(d>I%EQw;@u zj|eUCRGm?`V!?wu37J!AG01tuYE>%eK(6MAQts%$3 z-K987^a+eXe!Mi+Ea^3_GLajkP@FPl^JG-}K;~mUe3u)-hMcz}(;l{~X<^!{I^&aU z`AKu33P$_|sq)or=kY515E)BFQ(>C@r{hitQL75~T*cYlTXdINU&{!gzb}U0W^0S4 zv=vZn#J6GQZ7rDii`xv#XQm}8%&vFUtv#b2cRg`MB*a`mS&VS8AomQm;N#zJkeClx zxuIrd&)xuu60~91i7^-VMGzn9Ej+=6Zai2@OE4fl3u+gF)OM2C#QxB(zkB2)>_2)h zcSxe6L+U{OojWG%4juHgU@@7Fa9=$BW%uDRO9_LMskNM9r#MqZ(;82j{Fkvftyt_2 z?Ul6yGn!tw{`_`2Otzy6-{KolL8y_|U)S}z`!e~;fvt|YR{Hco)3L4CKoLW1TA=;8 zp1(D~`&WXJ1QZTON{X7r?fG;4z3cx%D+{}GK!k0VeWnoF1hzytU%fjT_TQ~32?I|c zR1vN|X7eO;X=vM_Wx!}O0&vpj|H|O2wC$Svj5Vnvj-O*wd$j#wb5DcGPY zE}k!I0=GE%f&-Ah+I>(H6JnWO`Ql@ZpZ`wtec_Y*$nyPRJl<{iIy<%WO5pjrbRZ#1<0=oDA$6vU(PNPA(@me@hz4)Ffb5gF%-OILFn zzet{6+DuU?U8mAk?x*GWUK)1so7~&Hz z&xDLT1(VuP{iuRBXYac^q~+AzsMYbVNR7+bd(txzG5jk$sKQaK7Ph?vYxU@z|J4}u za;@zrPFCwwhv|PYA?NTZqU;}IhwPBr4N$s{zR~CqcI)xreO+J%w#{Z@xy;~weZ*R` zlvRbzYe<8zs-HbS=mARSx!R^uP>&M!tg^~4>!oXX zM*Q#;i&pX8+6!E=V9%N8`e3F_yYY3|5K`O+->x`rb~m{yI&x z&8(DIx5YMCbx*c1SE^?92cbvsf^*zK6xXi*u#>C@Vev0nBF;YmN3}^!9 z2J-AIo0@>94ut4Nfe}d@!TG`@$)h_NZQ|xKGt?=TE}#EP%sALKTn6Ifmu#EFg|oBr zvKg&WUYe6%KzA#yE?o(7!X2Z3JbSI!pZwFptlw_I_-~h0q#v)f;v7kOz-}VUJhSDA z%_Bj|QUr*;wdXcy6Z*imV|*-E_3%pWUv7k+9$gkn{&hFiK^NF!EHr#m>_)LnPnD7_ zyJ;o2QHy)srmcN9D>m*^>v-8SN2Tvv?3rA-y(e*O;k;t-&+_jM8adXv(&1JCW@*T` zMjzbI7eYOiO?-WLPs#SVPu)zNx%@-;uTqb_Jh^>=UHOmOgQA80Cx3bo*LN9MSy@Rt zFsQfnOiWCWh znm$~!Y(DFHLXcNX^9tl#_FwCD@@^FcaFp|)?9aAvWu?xK3&<1R)p`~d7L!r*RWhEy zRMCfvoNH)kAR~9$fmcj(v(_6Rp-kF5=^3Y3JXS11E{c*v=w5bW?Ws}6z@)bprU?g{ z5pi>UeN3UQ=o%-g6L((ofd|`J%sP{shmcBD}8tZ6s#{G%n86A0UW(H z8U}drBBqwpOpAPn4Nj=B+xT)D1C$Gc7+Pf+n0J2mPU;TsHkq_DqcZ4cE;7FMmYrmt|@A$$^8^k^1DYxnny zFr(HZyjqGnwC`q^FP_7j86TEsGo9ekw9M!Pan>$&oO+W}^sIz_a{Ma0|DxC=rw-AG z+^)1;2=6!);SQMaD2P;vVzcJ9Y#<&PDDw2%Me>jlP!Gam!q(T_8> z+WXpJ3^KMJNJ-nL;(@Kcj9v10@O8Fy{9TGg-g(0Q6v0i25s}&>)#vqMx42YG+!nyUVgH-wK(p*j|N7)Zhx6}#U!y8h-$+* z5^kJ)d2eRCC1{zrQjdc-qV`v9J8a$@#@HP_mArvEqc-aD$Pc3&4o{nSsuN(TiS zAT1C9L8=Xvu0ZHbA|TR42)$WABoqbd5G*7}C-e?dg3_Y&77#*jAtVqW1nx}u_Fik< zbJo~vpS#W&dyM;6h9z^%ymP+4_LMjGGYMG7&as@`_?PJhkYsaU4TrGZo~{|xoo@m= zH|t9My6erD+fJx#{@#pL-HJU?kSDjjR=Tv{?$w`AU~AtEUfW(Qh=$}C+NLMf@3hx1 zQLsA9LG^nyLTj4WSW=#FTF@-8Y_4U>T&loKn;5;fWpmb_%mXIj?3=S>V=sxBkCt7( zmTSSLYDL5umrWX>eI~QORIFXA*$J^RnC_KxC;M|vV$1JvMrA@9#R_V=CkSIxKVm6^ zM5f>ulIzBsTi76kt6D1XsE2&?^#XMs6jcZL0sYgfrd2HG)Z#1C?RasB$~uzlEp6Ww zQR+Bghr@Ksxr)5j2s*ESSc@5@7YEILrV*!^<@g)%eCqu@%zS1#{~l3b?>+5;ZXDdm zDgd_AMcC1)yEhKln|P$UcU>oj%GG?5$kn_#*urI%ii;=Pr7MesFz=Cd_t;gbL)fC_ zUO@#KAByeM_#SN>yQ{soSidVqmDB2T&w8FGxieBvGgI20`(grHbjVDLr%}mv>cYBN zISy7qh;IAKX{;!X{7Uy(JBWJL!E*Cqoo|i{yh)Zp3Scdcsw^>|pzUeNpd^VOZms7M zXyVS4yH&bYwMHV=I^Q&z&2$y!Gyd^8AupdJC8wl7N6MVfHExnCHTvLLpA`ZE$2Q8! zTl966<19{Ptg1j7fi+TymoSSzT<9?Oio7}RrEOIRB*?M>DmkSyx;e&iS7>*AYj|@G zlKys&P*e4lXUk@1X~PxcRqtoNL&alT6X!EqMsyUVyA<(};GOzC**aogdP`YVkIi;P zU4aTA*F)(FBt2uH`DD;$6OkAlq|~KIs993hX#Gsy(zNt4S%ulbd13)%jxkfx7Xj3bu|L8Ml?uB!)`&mQlApc3kXHqQDjma>)v zgAaR(+|eTFGJoqKm}UoSUkDIs)+HDzsO&bW?%dv)5?1~3a*^F|-S+$D_e;^udF5lt zhu_Rs>h;~>rJ$AMmpWBwP-k&7Z|70vwR1$(f?d3P;L_@?o}$g2IIFkmE-IIW>OZY| zEo|+DSJ(Ub?X-T6o$SD8V!)Ycr|+o-xlYv5DBN4|()h%U#>v3m+mY@YdwCY4P@{1M$k?)ut~)eEN^dbl#@-jHMb)&J_^?!g~4D$)Rh0szct0=@AigO)8SsL+hqd^_eBQAD?khUz{(^Sg2s1A~>l7|3uYbzOFy8 zQIgT{%(X5)#$(OWR~so7J#hoNn)Shxt)HR52O3h}axqX=ngo z%EKaI8nJ(53|$M_?n$?cQxf^8(Fe}b{EaB{U0+zT_uW;#zKg$+kbSzxFE)EkZ=h~U z!qrDJ*BE_~TCRBkx;-OnVUW3c$wDgO<@>t$TXA}YF@f=*g&r(>l{u^rGKAe_<s;yj~DQQEKnn^`cDVgj=sGx+BjCFQq&86SNZ^_AJ%{Ejfohorjd3HV zCsFCjvKP9%buB&wg@9K|yqdF)?pzK0b?xqM;#X?y5OJoHf>Dm1(x!a`LY4ZSkY)lX z@-Pc$3FH$>6sy4&viuegc!pUe|0x+Dl9tWx7vtNKA(^+)oA{G8P|{`eY`rDbKNo2J z0({j8H+?0o3xBCqap`f#-Ad}!7Kc@9-qgyvB@7YoOqLZ}?5`9?W`F7pk+oPwvdk5C zDL7`1U)+dWTfxrTCr5lH=~XEY#ad+O--s9TP{)1lsaN+sm*u?Bn>FOQ?WK9sjTb6e zi<0@IzU`&m=kCCoRJSyij1kw2PRgFtEB_@EXj1h=G6arn5L!+_$idun3nV({h7*7b za>cWUWx9~(y>#L{9n62RH)M<}LTZp;vc`ygs@vTS-|is&d78$AQ;?@-C83U56nu&1 z71y{XL;9UiM@HrU<0II2?H;zao)>EU7&~R3Kh`sJd^ouwcIITrC=+ z>%iLMk*l8Gr)PvGCtZPD&Oj?@LcTd9hOy5eN4nM2w$En1{h+7zh&LJ>fYLL{#%&SA z15~pl7gY9-tt|RWIgO7eOD#sEpGB zl$e6MJl>DVW!wN94a}g87mjkpqrtns4^f6}$-7@{dNd`u^0%zuG>Y7=?5j7-7>jqH zWPSPA-3FxKVP7Q6szE@hFmj=qomp_cbSd(f!I5P4s$G)mo;#-~D!aKPtuZ7+X3Us* zJBGaj1)m0n1h?MH7}^Z4oSb*-IUK0bHXMj5Vg!cNq$4#M9ymHJzM=19Vo+h zNs^|Op0>8U=2DkNQ0zsvm7BR#3R1N)&O4pIpB^dW`D80**wb?aQS^MeZK=MLd|mfY z6{VbPtE6Rd-Vz>U%IQc#aT~GS)Ad#{6!*Iv z4z~C;lP&>Iuk(IsgA7kUzGLYK1mGu&Q+0K z6002Is~(}kTVyWiW`EzJm&3VNrL^zA7cx`lfH)kCCKD2}^SUG20%(MIQNTx$= z=}N+)bqeG{q_dc%Yh7uAG_RCE$_oHq1A4O!LagX-z0Fhv)Cw^rNCVA}U#7{$We@2I z+GIb~ws_JrD-vMWeMbX{cg^8bC{R>BpQJHlR z?;tBufQ$fE5~_93%iS6%Xx*c>e0%6M+$(<`mmwa%p#04dPXsbZ-C~lRYR2y;$Nr9|InQGezz;3s2Oyxd%RMH2;n`LK~kBQ z9~!53dUYO%4|Ro_LDIh4FICpLHD=@HYplI?J-=Fy%GDGG>Kj(x|Ft?nwI!%$KY9J_ z)?vKM{TGm|Hjzk5xo|5=12@_oViQy4afX;m)Z8Kh| zc-mCPyUT~))6Owx#^&fv>t-wDv4b`;J=PLLuj@;Fc=?(AH!{0e##6@^s~4iTom8gp zSEUSueO-!JI!~c0Ylga|-k*la;w_gY)#kl4;+*H*^dBVN$}}iVd)Y!(yO(7u6*4fd ze81b-A-%-4O1H|@H)7X2=twFU<~Bd8!s%*Gimce~(VTpL{Pd;h^m9S9km!~l(0+{a zIDi9Awfu0Ku(b-qcBHbSmn%1ij0&Rm)@cd&-uB&#dip`4=T3^ML;4-AW*gY1W$P)9 zurbz6rbc@~)}V@WUT1-4ZM`5!nYzXq{7JW=B1J>`Y5c(q<>{TRE0BS?d0$fx~>kfkOS?zQYcgw)K7v zS}oB5OVADxkSjeIx|WW!a848qB|^y6ULPnh$XV+!NLGXMlf7*HmlN0~X?rAhFm-b`=|`P8@L~aW zA$oqJT6+Mw@!)x(vy zpzf@q%i20InA2JlHVe$DmLmwgF}14d6)X_b3y`ASWY;(#rp#(u$j7oPp_n9LTiOeY zi+CI%(5wCkKN6HI!lcuO%3=v{jqeq_9+3a^>C^2JKKpD|aczIF^KglGPs-Sb089NV z24-d>{QWhN0?1S*ef%*8$2riqHsx_~<#k5sxG zb$z);{>#cc?}=G2%pP@&qM-E}HcK(OLn?+&Hd8tyb$5fLq1zR^Jcr6+Je2NRozH;k zt8Wv4QGCz%FZRStm)_|YKEBwEW=8v(=9*c5X}*0z25qzODYi=_)`NeyuOLvij<)P- zAEeps%`Tk&z9%bF2aOV`jk9CiX)WWu@(o;JiuzgqBn%e*fDh zJ$85l6P1JjbYZ!r<`z{ivd&*3E(5EdjnP!qe-bcco3Q+Tp$svW&`lUk3D~G{M*B3) zc-KAi4_A-1X-sqj+ezBNfV9plR(6?2LF`7M>NAm0yQ@BHQ_4VEvi_|(@yKED(`628 z|GC=&ZTMO=!`$e45}YHo7^4b4sa1^ zCju@Uzk?8}QopIeY@ml681t1l1kM0aR+~=R6Ces8sUV7w*DmLE6NWXa88;ay=qML8_R=*s-3}0_ z%W@u{S(J=gZQ?@Lm2VZnn#ejzK6cb0;c*C8!lt% z&#Spm$Qx)d>Y6O3gV++k-p>0u5O$ki{)EoKyGQsATmmM$x7#cWthM6&i_^oRXD2LM znK4Qg5kIj z+bUe`Il_>$i-oRLd)@LVveLY=F}E8;GB6Xz+yme~Wo}PpWV<4ithA0nWqJ#uLgPa% zLvsS~2)~uL9Abu3X3O1=GX-dK_lke$`e`geA4!=X>mdv zJS`5g0L$0Q?Nw7)mfq{KIX`Ier{R3yba?c8SF)kk0UOTnF+lwBuBdvzz`x4@9JKPm z*yA>{EPP^GM73Tde`|sb?0%D93U%r#47sA_HUH_1l*?e@1(&LMR0YsHtO2&n(AK-R zZ{JQ0+@AN*B>efGkLSLhuyqG4Uv$Yi?okM>iiNot)S6ekb_!H*UVNg~hq#~1riSB%cJa_*+%mz5{5^?+!8(g65H#Q^3@Hg$wz-P}Zg6GY!EqtD@ZSo5RC; zOkQhE=Y-tnP594ynyFVLh;kQ?ODh~k#HD9;{~>MB_Z<>-4?sk& zn3rEo#us`&e>8Mi-oh@XE9lKw$KA9Mnv`>ZxZ~GopLVzz>4;B7BK=A3@BH)2dCV9a zxf#fop?%8_t(k;uzUnMi@t}ybH}BNfIU@S5)YUZ-e)T}74@{9Or*X)U+s!PJ@`^6? z()9sr%eK_JV1vk&Y+1!K`$3JtP?0*n+z0ATvxNjdOr1h1$!oHuWSD%AywcTRzK}f% z{*a?H5RCp}35#6GB`cWuaqX5K4tK7%8enc)X>7}-y-^f^KirRlcmG<-j|cB=M@r?1 z0YSera7!212~5EjLi8nJV#@yCe{Lkd2S^e9&Lbp=zq%VnXlbyN-e@>vLkrcug?UNl z&!Aka6_!e5r7LPEIb1>lDFvm9bYaZ!ilei0WO8z{KY)b=f6JE}@Sz3d{Xh^WF`Z~4 zG66cWVMK}#(9bs4nwb0sZJm;kl4r0b%{rqhs^bf#4|!q|wDNk@LA@K)0+;vC86HuLd; z+B0}dIl*zAsv~cgxA3dna?2m&r$6{7UCaLoAdEnKfCr-=w-Le4qhdsJv(NH^mU1AQ z9(M=omN)qu>@=HhI9`a|)p>ybvX0CTHu^WH+y|gZ$6C|ag^_=NVIhIPUl^B8^m)UY zvKzOvujFE80HYI|f-3cTUOvM(h+O{ggC`6W?2}r%edwyQ`D|3z^3BPr zP9OcdTn_XLhpHTa_S3ExT=if5)!3ik&EN_J2P6c8g__-j)6Qgi=p41eoyyU`rL@QQ zI{RiK#?KT?<_2C$Ib!^rB%%9*zQDq4|>>QX)4EBB{ih*S^ac}<-VF9o@TzL30 zQ$5U^j?iN})9rV`=vU4}@~a%1 zkvaDBDgsz%Us+6q#7Q=Hhxqxjqzpx!ndfv;$-?mv>N!vIH`Zt9Ukkl>09t7zckiqr z>oEa;Ylzcekd4O`!w%(iQ9fz?$xVHoaQtvgGw^78IefLIsr0pJcyP(O1Njr+#yGh7 zE5$@6RO~hDw^iNJ4Qo2V%bzk(s!P_(Dk8qU*WWS&W@}%e+)>g~If73_U+|*8(AHOY z%D$YpA{a6BU5;LJ$*pUpxPjqeURhaLy8i*wD+_uSpqjD;r|JK<6qBO9$&OT!*2#}A^164X6rOOKY|4c z5wDsUyVX>ZSU(kCLC80o?62$zr#=SK*h>r>=q)v0xw`PG1izKLzWKoQ#MA)yTrDcj z$5s5PNnHQr2DO+o_~yR5h;9Fv8!T0JPmcJh+U3WgrkCklhgyz?o8dGs;4RYOeB(aq z=7^Q?N9vz!Z!V`+l=gZKk(XT5H)=$}YAomeWCbyB>ML?S8d|QE*Hz^A5XLET%jRx7 zEjFb#lC7>wkDVRS*{7`w8KLY(lDe?@897i=Y)Hg-g{tdlRukR=?($ZRYbxd3!B+pu zT{$-`=LuB2u;`HlSOP5X=^xyzj6m~qsM&oIQw`Kp*p6~96Yw+f$RY2EQW1Hj3uZ^T zpYH!36QsJi=g5Scf%f*+9VHVruBX8-G#K!Hn#_2*U36XfYW-w}#Jy6^GRMqj5x~pf z5jEzk*h*QuP~TMXgF~zr7{6xj_mFpyEKNzVOQ$w@0LNxkS-dK(z0zQ}JydZvUx ze0dpX3tV=88Gy^Oyz1N}uzM+gXnImhF zoVxkoT9BsYR$|C|xJ}?9*W@d?Tn)K9bjo3ZD(20M4m?h7^lW)+N#fq_2G5sHKv{0c zVEND%LVmQ)I4+;CAQ{({QBBRvzMzEoBmmA=@P&{2q5D`v7lZcqPZP#JOCjR}Te5f zX08`?@1icvd&fkH-3APbfGygV;qt3d?PEa({>K9Wmz#{&=)V^3{hxXE1lZDwo;+~^ z<;%(4b#`{nM1t4MSo&LwLWjS5O4eJcIgE!Im(^Y8b?m{`RPrq*$lh^|jyC$RJTNWm zY0m4p@wh>SQ6@13*zR;Z2{T!q7>j86)!ThWVyH-F#x|1UR^v{f;z`oN=TGyWEAr}; zzAimoUzi3%7kd43?4>#7rV9!dyGy+9)^XhcKt$lz|9rE+8;_}Ji9|a&kG;!gQv}XE zh+i?1E2uO6H5f~j{(?qcSXk@K?{6JWo2eZ-d z$Of25Y1N_wtu@o_P|E-lvvT#R1>;&JK;G52<%x~Q=1BS>qBLnWjfV~_H5Z;cyyaW( z`)CclWmct`x3UYD05&d#DfX zFvoG1M(TfYc+~uIyYJUeJpt`f?T6_!r--Z;J{#C=eJy9L12z-8S(-3>2e*}f$yEnd zOo^+ejE7Z~@rT+_AGFd;OEByBfR|&XU31Z9?4|85YSu$cYX>I&iG%4`T(q~miqQI15hqIp$#|?8ujZ^o6bezL zVU+qBwbl*ava$YteQPQf3h*B2?21x}Xw_ZsnrR8wAtWG=-w*b61_P%g(sEAOYekM} zSH`g0C#-O<$==nUh@UA{giE9pzct|mY|W}n;9n};gm2ovQGX&Tq5TNKwE@Y}Bhooj z0F)v&!msG*BqJl!450Z4=N`IW1`|_27AXUiW7L`-`8d%?#twK{j7LB8^V#(GrU?gh zMi$!;YeEx~x;tg0VYnLO!k(n85hVDsmrAVck|Lm!_nA%Oa-Z$u0D0ctzuc369_OKE z5txr4egV~T8WwBgpWKWzf?m9K4;rHK125dyvNn<&&hb{H*=f!oZE%#km=g;}+P;$E zv`1Nj&s1P~8d*H6-nL`hCs|K(wpynOxS*4j^3%Z~8jvKvzA zwpBJ!US{H7(>OZy#XP>|YqEVC<16(!p ztvDm$mw**peiZsNIDh{oH|m#bac-YgYvUS_bPO9d=>#Zr7kGJ1KhJ+2`CRAT_o$Mc z7i7gBqId^tww>76HYpzw*$I27T2NS90^JhrHP6ZzeDR&X3NkQNnnA+S-J|$ z(kaga1w*^dhWf+4R-3($q4(64mR)x zuuNB#G~<#n;A5y8oq#AHQ&9s+gc1LMUEhn!x?7HiH#qj|Crroy-RG;X^ZD}7mSwfW zupmp`Cv@*!*`Cai8ocm^Z84RLTa9w;n`{Sy= zT$j&96=Tj@08evF8W3FQUUAB$YAXeP%X(;3<8abcpq=;Wm$I@78F91p@%jGSHN zM&(G$Io2KzC^aYxqK94MUe>P+FM_JCf@<6y{9UzyRCd_!;qk;3ua4s+5_2Pe#5x>RbAR&hne<5u=Fah8oD+d!Z$=YZQKl)^?1Z&!NP2-?^#x^HU5cVJ(E0WZ$lA9eld*I z82*5<)S57t6y-K^i8_f|Uu#%R0R$wqg(*+J{Z)6%&Ih(Iw^UKEZ(9onx47S)i;Fy6 zDHSJ)3ch-hG90f4t}oNS?>j`E#3^dxQhKn8LBr6#$IQ2}Rg-TMRVhn0g3vK%zvXkP zk*zG)K06#6x@cydb{51bBiAy?!=*;s^slz|r>TLVZaq3Vs?=d+$|xJ1N|rEPwU`f| zO%GBTX9*Qzg!&SZBf%zdmRrVQY2}KNNR3*cquR=IpUh_NgHJDjss&xrsCPPaIYP3i zYo+=&zZxy(byDlQ3`797In4VkB(`AX4zrq(;r7n&lA5{D?(ns)fA0FzzLZClQ#~A;TNlKn^EGG@oWJ-8yWIG%0Wm zCua*-6&I^p8)9m`bl_Wrbjw^+P37~SNwj)9zr^8!= zFMX(hTU`s;UH5wqR}gQx)iYq6JMF?Qtnt=lAiPwUu8!?@XADg%PKuzdRe? z(!>L2_Dy~ud;7IVWPxR^aIt@15)@(g+1Y{?qTDQPhbmx{W?4Bchx86X$OS`gyc9%q zY_n^&NZnXvvq^fgpSk$Dy|k3ov!}h&aS@ILNhPamp^tdY(3wN&nn2gYA@nRs#z!N! zBb%8;FKo!iaJCmo?J8FM1JRO{q9GyYxT?FINKM6)P@Qp{0x|R^eepSb4m#*GTn)a>0=CtBSOtt`X;vSdQ_#S z{e)H4;u_aQJt-qM!)bf`3xWJ_7Hr4uIwf+oRNaGqngYH2fcy@xK&@^@8}X7>U+d!= z<2i^om{}BcYhtRNW`b}Qfo~Y4hrL&_w;j&it@ovxTSuqQoT+hlVuV~-q@2mpMSip> zXMp>_f@IFMKs%WZv$Ms#nx*NTXpgbAM5B7rea<<>{pMPK3FGfNz>IOCqMih9Za9U` zPi?qh#5(vdRTFl+{dK?@OJ$4Xsy9%R_8~XViH%8j)zc*4wMhUbIDkKvz>+!47!(pJ zk#lhdB+9Z4csdQW3x4)k=-sH5V+2@;efBN$5sHde^FL|=Dv%sK;xDI(Ia4QH*ww!G~8TFEC~jO%2y*6sCH zl-fCtuh-EMo(v&!E&SK-YZi}#vi;=bZ$<_g3DLUPmial)^q!#+S*S>){%-i0!OiY=v@eK$Mci38@(P+-;!_T77UTj6oN@hPp)pa%l}Ya_DYxn%BeUHC7y*Q ziT|)tVr+OobnyT6li?ZlUrxB)@+!Bp>}?j_-gW+c*2!&7)|V6zF}%8cSrNK#n?fE9LXrLLyXx3 zfaXXYjj%wjy54MV#LT@r=BX#rtLe;Q^XQEf8bAYiGdT}o)*ciodpJd5hEZQ#9l}l! zt=*x$*K|4$Vj5W%&e(OC)yOB$cEa0E&jNCzEn=`GU8}>Ghx{ZMwk}M=zz+7duYOFL zJOoGuWf`ZQZPjd_a4v4sU~9!XMa0L)8!Je<&LP*Roo2%^d2+p6F84X2Le}Hsk>CRV zT5q{v(0+?G-d_+o;|~MEZD(U$H+{xnm}ETG&o6{(`@ZoL&3@;aoo<=DU0g`akRC$I zE}11-RdPWrPH?5o@yLb)-I|a|>iqG3P!-GM|W9^3{w1)T%h%{z}Swy?X|7S zs-tc7OTt5aEix`t&LaGPuAO7cu$rDd@2PJ8N|btZYplo}@MgKh*yElp4|rdp9nTvN z<-d+SC*-4k^O0p*VwED+bcBTeu#y5`lMkT_Cu*f^ZeBB(>flaq#2{logINTsd3sKV z79Quj)~qduW2fM}tj5lO|1K-L&YuIU`G8$keF1hGahj`-ON^Z_J`X!mjn=ftfG4LU zLopFyJfs;lQZB|gExI64LL1If9*5Br2boA!2Aar#x>~KYs8i99qPqDq!1j+MF-XbK zXwd{!UhYy@%yp_B{?GA1U`e0}R2(tz6TkFJaHv_#7WbuEf8gDl*Xqp7DU#vvZXBvB z9D_U^smKCmN!Hg$()-aBkA-g!cg41Mgm-Ui@ec5%p#}@AwKYz;Q zb9czd$PV@k>XbMg$OSGWDKjI8n$+aZhxN%HBrhLlvU_t(l^!B zY$_V`nRT?b`oa*)AL_PVzL*A+bg?|E?c;?%A?j(NV-auPGOSloE~aN|V^Th2!!_Th zNO+nyF4<=4 z`wEB*eA|P6t&{y<2dfr;L*xE7RXq{`81((GaNPgh-0~l*_pjxcivH2E06!(#=yoI4 zh{PGZ5XoI$2&p^1X=^;5*7MrQmwtD{xwj>)TmiKKw=K zTzomJG9&!lNZL1|-PTe-u&#$cVKgg$Inn-|!@~dDapC{$&*V>Zl8Gk4yQ~5Y_=S^q z;P~9|cAz646^mW*>R%Tl<$2QG1-g>y43_c(N0R@gfr)CqtdVjlh+)_}3=_GsqtW@f zf|&MZR-*RZ%kO}#z^u31_ULuDj^lEz%Uhl)Ecp>sPzu78=@4#(-{^<}<2M5vhE5NX z-|Ol$60 zA7<<^Aowt0oS9rNu(NuP_yu(oSi7SF9@ZUOcnaqA?UO$Msq0}n8uwGoF{th$-#xeK z<0N3LDr5_Z+$wskqZM5YedwS_w_;$wkAUs!;+Gnohq$AJ&GiNey%iMT*;KtDr3D9i zwV92jhP++uR~{)-qKvxYr(y%W5}H~9UNHLb?dG;k%yIq6MixM!&($}2cHFyyo42e} zH0`mprqwyXINOzr{Z$JbKbFjXYmASi*l~>(QlX4$!OL-#ACCOFhl%Fn6G$PwkoO$! zb@JO>Jx$!DAOxg!_GnHiQTu83X#W^mhCki!Q7S;D1M~DuiCa~YmNvb&BD&eIZ=qq>Eq@0kccF91q|144yUfXET|*<(~BRB-*hPqMHYIxaS$mym5;waYGjC6A?`RuH6mVVvnm4Nf_q)q@d;k7Rt~l{)Bgtv6bX5kr9E>ls7O zfA{B&Bswhvh*|(P;;E~Eh~QQ!xm5A5hJx zbQ7Aft1^tbpZnd0VFQ3ONC2ld67eU(A6~jQmB&==vRJl^4s1ek*Y172aPI1UoU+xM z{`~Cp9Lv0XOqB3^#Z`byK_3}tEpSSh|FNw>&j=Ho|B;^lEuT_@vH%F!RAij)dT>dd zu}*VGJ0nYf73Q*U$=-uHLnrnw^-DTlaU=j`(kWz$-&lFZvvdHv@SXsQRb2hGr(zNZ z?|)3+-z8XC`gqXoA$<~u+e~7?e;!%*QU-2`O#5p@7g7y#q!nSFSk_3{*-^6Kp^Vbr zW~@8@iAZjyU~T-@6!z-XLZ({ApgdS5{#JbpiFfU1K`~Hjp+z|5u;EcW_-*6<3VEBY zny=WL6N|GFl1}|zd3VKe=t}T{k=z}q@8@1^g`7Zh0Y^n;mmcTSaQnXL5vBmge|1mx z=_<47M=M<%&%TRRB=@31jV)BgIA`;4N$3g@mOu5q=C(&b;V4XRU*(ljiLj6sCiKhR z<9>!CY#nf<#PNp-FWW-5E0#Y`;_bdc^#e*|{^Wk-Iz+>_HJ}(4Alnbzq0AhMHr<;x zUemcL&wC~l-ydw~_3{A>A4E&J;(^m{Q(=yvs4s(lu;cUKWE>r;e8$GAHm6@P){xKWjYzrFL_lkrmFia;0i-C? z_YIRhj(lC3iq(xG;#*q*Id*TE5+K7Q#+TO!3TY+2BdA@ZlfZ&i^ag&)nrlHqwaX=< zeb#Z&FO0LVic6fcf1x9-i4AMfUM|lRTr{;9c$eqJZ3*tYlUDTvt7TCNheVi^FS`h* z9T4RK94pM9{}6QRH?g-Jfwo3PhBgM_0rjbGnYQ9SvX^OK%MJfBdAZBsV0@ImI#-6t zNBid96{@~hj8L3I!BZy})3e|Ll?5CB4)Y56WP9XW>zNk4*qR0qkfdhQyevD?6pbnd zkMCbCW#&mL&|%0LAZi3*X^3AU>gM%MH#^|)&#hw}B8g7MoO}I=FI!}wFv~vUarQ{S zHeyn#(|p{+OdQ*v49y#|_$Vs!7+{|PVus}MpZgquZMEcJL72AXFq*|ZsV@gkw0bzK z8d+`3rCE$-_xkLjmx}1TXpwvt^=$9(kU?+AayOLYn*L@*323Ho7RY>L@czxcsd4lG zj3AAT1W5EAtVYv)p=wmh-CxE&E{x?OC#s>4Bp-!`>RIqMp}o_c)FJQFT0OL|M&&ZR z_W3{yPk(h$8>?Wx95;tv-_(=C;4v$ z{l9V00S38`=F!EKx0+bVQ56Pl3R1KYmBSK^CIK|DztHbkb>Z~WJv|!j;ojC3{eMVJ z{cF@px4fk66RN=ZL;g8lD69p$9Af90xdL^@IH`PjlujCRC+5H15^6XvNZ;?)H-J_M z`f%Z*GH?_^>N)sI)#Zh?{%gPy&CG0$v-`AlTq(rB*Xh6|DVhD#sc=!1U?QsndJ)jm4rUU;o~v*e?)cfVe>$0G>)yB=fsDdc_Hs}H&=UcPnU?ZFGD4jwpj{`Kn{cC%iyV-sB|UUp+XvG0CNk*?2f z)KV(<2w!KXM#f1>YI77W;ui|dd33i`aXlhw6Ct^Cdvuo=(xUb2-Z?6Aa~%6YQG-or z1+t?;o^x+;{UQkGqPj)5^iSd0T)-2axn6!|V|jrn%)$qj6q4eNO?W2!6jM z;t2R@?=`fiv%O|}zgcv|F*Z-JuET@f`!$%I^X%}T?^J&a!8-ooNJO}7L4ioYRd30< zO&h?d;ZhwHM~IgQNKp+6baO)Jmjg=liq%FIIPKMYia(`#+(KL!;cX*sUQzf2yJ)cN zQ}2Ww&&~@>7ua2Wql~qzx5T^oMAqE1!X^&<5QGr)>kUg~{PwD9?jlkKo~Y4AAd7wO zB^T2LvGar^>k7tz{f4%EEOU!tf>QZ89*qDZ+$w_Z1rral7`ERuygv8w)nsmQSGX=9 zl2>lEyRy;g8YoS7Kd}k22)bzj@>@dR+u4}~ysCzZ?ORVMECG8*~HL zVgoGQ&+}N0J#UvFzSZ@=2&l0L9G^x21sE4y_-!6UTL%L|D&rb&Hy@8?;7X8D$)+Y& z3F$v-C}V!`GSNGo_H^SR_=D$TH9l@LN%ovCERXoirn>7Wt$n{V-FFdGOYXjS-f5#t zAEouSAYj?C#n+OuQcVE$n>|bePDLL?xW-P{sMuT7?TKWjo-wk3L9kvq!$_~MYsEz?*BdNH6GwL*ef#K-*7dzO)8(cdLjEAsHws(c^SJ1 zd0~k|{mI=LEg+z)vi10E&<+u>6|2Y#)xpkgw7l6UUN~;YBsgk5!#IaCChGo-7p~YwYWtAnS zO|johLZ6x(ONjFV{D{ba6Myr#P-)pMWW;e-*Rio~mf9S>xy5xQv#r33Br7cmOobxgd(CJkpLB#>*>d|7{B-1>P!-0F$ae*F`wpf1(?0pyWci(BN zAgmsQWd(R+v~v`wv6K#?n0p82Qk4AXfl_H>^Fr&Jrwy-phI9q+_-|w`JhjZK@;eE* z?T&Hqh3;o;#`6kV>rn*G2095UKVrWNydYDj-^7{G9Az7FFnf;cn|FP70iUaKb&RzV z`R8poQP2wq8>pB`c5M67AIA|MLqH`q9K5IAtb{Vah9DQ-C=BZPYnQLw7V3(i$ zeV^$#BTPq4%Y}%f!0wlwE*ciZ`7jpe&>5KbzKz}y*N7T2Al@Z{4GMRn~pK_ zFsT6hO5)9!iNat+SBt#zJ7C~%)*eI~~l_5TP-+$<3e{_{9qPpw26m?!3VIT2HGjPsiB_(UeJO>QO zxIWn$vZ?^4RAAt=PuR=4lYy(RTK&VqeRTAroG?uJlM$0F6lr^O8@MjbaL39s3XS+1;q80z+FJ}`w4(>h!6s_%{%Pn~SFz2VV1a<^s+ z*vB%|_WDCj!B?HEXLA-yF6Nvh?V8LFcw2@(W8InWQkjiIMZ& zMM2aqIUUgD#f`qVjOw+7d|QUUX5QI5NgaS;I6U36+Mbm>aHuEw?Ok76Ax()1|KZ{A8ZX-R}c z58))>kU~Z7hA(^yE)ywYRlV(dD>nh`(w`h}9euYcR z8to&vA9Gx4m|;+B8{U;<0VA6u_x4pgAD#c2bN!F|JeOwCwjQ|<@|OC+(UrIU$<4~L zUH$;_uR%XTZ9Cmc`I=YWj-u-qni;9pDyqvbKg`=leMl!S%<>a{?3gLqpli3MI za_c>gdXE0(n@XL8OJX8;q$jHZn}VV4@-5OVSL@7m81N!Ru}Ibw4ytndV7=<8xR&RW zZ-s$lS6JGWanFOS29_MH%8Upx)SN{*vuu1f-A>C!y^kuRnCZK>8}$Q8RGcpEB_vS0 z0NNRB?0R`|Es<|v9j1ks?gK0{XnlT-GhO@5g?h?UR!mp1LR;y9vn1r4{7&&{78iJz zfWMN>db^r?Ys;%Wd(R^VRy&hi_^)50!mVfvMsA~Stu26MpTUYVs3{NdLlain+ro0S z+C5qSkAjI_CA5F3f>2#5CPIsl<#c8JY^suHUp9n}9NQ>DC_r+K^|erJs-hd4bSaTK zxMiOj3~i%Wf6jEK49xC+7^nb>4t#9-&SSJih>K6Ue>`2c9;LdwISAB9;Ts>u7mM0K zaOp1jF9Yryu=;IxdVs2385mIPP5&YZc~${9CN=}4ZKGVH{Hld)R8Z54UCy|=t~d0v z#+aBI-pOPf!mx5h@0d4#UA|~(buR7t?qr^ogy->V)*XdTfbkq%*U5Rol;ehMXhhx- zeHeX?b2?)k*7@zL=w2P*z{K&%GBk?I!sB6Tz{XH*V|}lce8NDYlFxIjJ5Wx8ThHph zPK;JsyZ;M8uZ$9b3a`ftan)7>Tb$uLm$)!qQVW3-PY4V zzs`Z|9*{Rj!}ch(&u4!>UX6Rv1LRA;mnhb_t54cbic%H=s_Y7~Gs0_XVtuS`-03YQ^`N zI}AXk^DMdbm)p+x-J01CbDMKZEANPf*gLJiX74yjmnoX>bT0qeir%|4*&^H?Ya07V zKkC~6_i$fAZf?6vxsN%2{e>wSFQLaN3-c)VR=w}f_zBC<@GUb}ED~)ad8ifRIO_+& zz9+=v(0stjBe~ootHf4;Xuw7XX%v>E8CcK)=SsMD?_r#Gr|bY(0W=V_gBRfXe+s+u zsHE1ePp^$;(=`=Sv#!@HO%2VVEUnC}Yh{CDh7$snQ%;y*KzTE6&Xrm@WoDKr4&($W zmWnxFGX3(;J z&$n`El=eTshD4PsK*{+45fDx~mbrQuRE<2&oa&4dzBANGzkRA}JK0c*^mI3qe=ilc z5l4QONCFOPU)7XUD)^p znkm(U%jABZ2V4yAOJwbu4fVj0l123mB~wzke|eqjHfu7G5Acj`BIZsQ(0=3D$|Vh2 zCA1(5DMT8eVR2AbFP!Q1aQH=*s9xt$`0gMcw5SbS<`3u5*Du^`PQd|no}R?O;@fc^_aw0KV#%0VD11g zqn(6vMh?UQra|g!`xp67CA#ApSb#Ix0{Ot3e9k=|8E~xP3hp8OM>FE2mp1iJWSJN0 zW`Odco~&H{psJCRV&mcHH+NT77MG~-m(P@*&;9MU_=PQekiA+r8tWKHwdLw_Pk#_B zJU|pNHZ8EGYU8-z z$l?<(Hz%+Y03vh@nkKjl-FJ62!V31CZ7MECKP)&=K=Xi^@jiY|H0fYp>V6OhyJnj9 z7CF^l6(nfVsaURfkiA;Ulxs@l+gaFf;SU1^w;^zof!F7rT-&V!q0Vka&^d@wZ^OFs z^o$4wG+du<+GHqfq9ny6hirt?+^CNZ%MyU#Z@ObuL5S4hAG;zFc=^|h z+KCp!thg%g49)~1yJ5?{2@q3G&%^Fx4tA5>}t)Y0fM%-Yp2>&U%*W`KydR|i{56* zgpRVz6t>y%P74DT-CC>7iNA30wH8A?b94*X>+!x@!{49CCp}byRGt{eDUoxe&fm zfMSbN%8-aN2&t)0x5zP3+_7iD=$4`1Yj4Y{8J^@(_6tzj;Jz)=%AKb*P>20c2FwQr zFb?Sbuj6|EZ=KXnlSz|dxu4#YwAtD!}|fO!AQEVr`-ff`LH2zmB>5 zxAoe*RPFbbO-!@C45ESld1d0;Q{M-Oq`Cm?7bv+@FqNfEZnf)8EQW{M$DXm~`dZ)j zQRl6`R*T2sok@);c9Dx6)V|FT8E|N0Y8uG8_H&XJCmhQS_wIc^B?&?U7)}-fiiegX z>K8O)L~Y0%V@qWXF5A5v>EaUoC=6$1aJ1tGp*;=zC2Uzh*dR9WMktx1GBhntH}cCs zf}GI^P@2p7xT|>=;{a%PRTdT1&P2zsAGs{E2s8h;mGL7PeTD)+k0qgu8V?z*If(8q>1L z3U&<`69i~Q>gB6e^xo2wJw87N!>^R{X3egziL5sjec4OQH$a=3p^e!s{9aGViZH=? z>ybas#DZ6WdK{-it6a}{Nl^P?tY5nk2@Hp85fB=V?1Pcz>A~+lodtdb^j7l8Su3kz z;A##Xr}f#7;zj2qjt|58!TcZC9mZ@mjiUC6UNMz0vqY1r>l zcFR#6D;nzTWaaj60Bo@C(`H5C0mk5AZ0G&pLY$5B2+F5eM78V5_zR9;SW#7aC}#H5 z_~&iW z2-_)Z8wKgRR-?l%H<+Vm$GlC)0T#4b>asxi9tXt_J}Tqdb}2h2ei2G-i^=y_rTb{3 zGXA%s4*l!9tFnef(1|74TLU`L_kY$)6*D!X&4-NC*_*&dvTrVR@i%yAxZk_}%W;H; zq7E>m9@6EG*RbViZyMe3+9gt_0bA+D8CjRq{}cfZ?bmZEAV{YZ0MtO%Ob5(ngM z(rs9EVAvONN}uUo3TK$52LW|f<%44@Y>e!!tc%C<3$;A|(ziz?U}rmRIe59PgdJLE zWWEcGT^k#yu|~@;qV!S8W3Scu0U&&e&r1;?*xvwTyPB0{iAZp?!=aimV02Q-FKztV z^+{fyomcxg@MXw-MI4N#}ru(Jx z`RS$xyJ0}=jwtef%J}^9kX#)__r$TG*T!gl$;1XT<)thP)-_gK*a;aG;)<97&hCMC zPc;M5-E?A6&90Ud8rUuilkF0Gyf0W2xXwe%{wHCF5Ve(V^&@#Xu*JV#<%YCB)C#D2 z=Mwk>meI+lj-oXwMf^cR3~jpxypKYeI=(bZkVMW@wzHrTp%qm)KaQv7a5zxz&StL1 zwScX!A0Veo&^Gm@jau&08o_g=b8iVjfeB!fH-5}g$CKo(fxQFxlRmh3;((!b z15yGRp22;w2eS&Nk!okBk(!sHW9)E_0q;GzcPj{qB{Wdr9*aqHgZ7LgT3C#5la2Op zvNP1#;do65?e1`Hs&josQRTjimVBD>Qr{-9ych8K`;@=X`I|69g%|f@{8FBPIKD4JGJX(R?VPNY}6BIzGR>G z_qfgyJJ#2S6@PfP26S{-e#MP?=M?z#!zF~mGf%hFu}|#voT7~gh?r9ilz!nhNhmCG zC?w0^KCNH;WgX6K%73a(6OHR?{;ccSdg5o6WR8sz{^{eN? zB!8mrx|jP!WF^PMl|ByYuhj4+7Ah=Arvld{$AuRl80M!J+G8fuu%3rF(Rg#}T0+n$*QGp3Oto$l=0ineueq zdY++YD__a@b-{?_{xMo4{8;Jjo5!f3Hp}9V7y=i?vxxn1L|S`KHpeN9T97RtaL{F&HBsT|bg z+p`nyj4u#se3%av?O6qhd}CDX?pgHAP|G=(VrH{FGSeQLhosb_=jMw#Zbp zF&Fh=LRYxNb*j61bnaB~*<$;kYPorK-dm#&f#NiHRZJH44a3+6Bue$DdCORs(=Hky zITAhe7?kSL;0ygrEjA^=qrQB4?{|sh5j_Ohcl;16MgdIztr+>8n|?NTG|_-+E;Ml( z_>1s>8@e*M6GGf=gn+~JKk%M6P_nDNZem&+Ki=_&S6vDB3~d!njNM_}8$~Jly6Zca zE2#FuyN3!xrg)B3srmo>q^W;d!oa&Zz$XM_3GXS`7}57?@;QkUKTc`)q@Qiw!(a3@ z)JwTuL^0G1{%4Ji32c3O)yN`=%5%u0U%cVGK3ia!-ZY$Xw4Rb87tYDUkqg zwB7%=Q>GrxKU#<_lSSdj!-epkZWdyUTpnKgUYm*ek_quj%|JUs5X@(s-D08D!q21G zUhSmF*4dkopyAzcyPetY7Gx7=BbNe-0a9t?QF4*8@oDbki8fs=U Cr=V{D literal 0 HcmV?d00001 diff --git a/figures/downLoadSDK_01.png b/figures/downLoadSDK_01.png new file mode 100644 index 0000000000000000000000000000000000000000..a334d469057f34943549d4fc7dd94ee0e600829c GIT binary patch literal 37067 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 literal 0 HcmV?d00001 diff --git a/figures/downLoad_01.png b/figures/downLoad_01.png new file mode 100644 index 0000000000000000000000000000000000000000..c235fbe0e906526de60fae0df1fae49b737d2786 GIT binary patch literal 118418 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

    ?ScCsBGWhy8(;8`uvne}uIW-6;H>@|iYg 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

    u@8Z(Sv$*& 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�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

    #*cP@KxASF#;alO}l zEcbhtcWP}7xa^5u7;*dWiZNwl0X-a;@Xlj_B*j&M1ts8MCSP6iG^OQj=Y`U{jOY~` zeG_QPo;p~GoUw}xMu`P)s)Ix39{{Z?i4Ntv1q)W&8T)%JCS7C}81Skl*#*7jGnk(t z!0?V_)%;QwVb56whR`3a%UxB}cOS9!_vbv>w%W=N-ruvN!lCaWH#X2R#-{fSYyGa_ z8k}9iM!pBZ4-Cd-6yjKw$uHDjhv{!9$z@}H8iwD z)umXI!SUw5#l->bbdt-Ih?g$32TkV+H?I79wm7XyP|e`@MK(BbClf??`4FMqh@ZK+ zPyu7Z${=;xXmxl_3dtL*hvFIqp`RmT9A)htn`-qneN5*?NCz$Z{4OKZ0q*nN67m88 zk`1?u7Ybez8_P>`uUr_UA&YgsKk4{NULL4m8G;jq6h}qQSAGChjzrey))~ydZmnHO zjKf%BYZizaW`3L_vJG>Zj9Wmh=#CbkKtM>jUj%zD?T#cfqq0q%ReB&#UPu|JoXee! z@LcLY!Tf3rejf$JU#k1Lxa-SH1!N#5!Ok4nsX1wgdT#zg60~xZPtS8SrBx##{%J?s zgGsv0X1Fxf;0!%)tKu*qf3XJRy9o6!vv;%)4YP6FF0B=fIavR9Z@=HTPUmt-@*>Rh zdzzS>Ev{Y|kX=gsd@lO-Vs^vz%7HvJ+2HIJsm;Z_YLgA~!6IO-FCysZnT4W<;;eir z?-_SzP;FjyNOXOD#vFhn@z`Ba5tN*#m0F|B&vxHwieI2^9R-x_l{+AdYsPn8eQe^K?ECLfrb;1lxX?UoVQ?|DoGcwc6`1C-dpv7u*GwZP*LdD&Krg}_qH~}e^T%zH(04nkm|IRK zRK6@VJLI1L;g*WyhleoC1-IFcKP=`S_s%v~)+&P>$5w&560@xSTz^!vyHoUVWZk15_gZn)j( z2X-c8AjR^&<&~jPidOq|SQ7d#)(y2;w-b2m`m5>3-5`&b1xnXa+&eE3D8)#7K49|PlE^NncEkiCd zSb>8bb>iKjPlA9eTTcj7pQymL_Bm@~rx5Auy#M{DTriG3uo4JejK@2g*Fi{>k(SCG zer2-gZgbV%aiK&N|G9e#wkl?D+@^Wz+3@V`nUCwgWvq4**uAZrPbaTk{Z>r*FsN}c z;1OPLXdto)*~GCrD9dI*tjO%N(p>try5)b~etGjHvqqyc&CQp{XxP%|je){(>nLiD zo-`P%te-e^h0@=n(!On;ymZ=3Z|JFaw$3B*{drNsYOxx?r=#;!8pUoJX{Co^^jlXH zF=^!ml@}6`_oNe1bI-m$st{&8rpmGV{BCUwRSR+f%orbxLvAcjkgu;CctrNL0`)B@ z!B456t>9T<+mh+d>(6NQYP=j+xFn)Zhw^?unMyP`%-st|$}te7xFZo6yUwaEB(BcE z4Vn(2OotdGcUuDNYZI(-vD)$6AlfZ})k)3mw#7L8IW?}t!{7p;q^v<(gVYTWS3?w3 zF>~7p0tell37%3WXOzG9e_r4!0|Xig3CZf$xYE=nT*y*cbL+CQugXGZR9)*~5dOXC z*){ysA?|ctmB*TUj;eSZ_@#ce5bfJq`!J9pMSO^}q84jlmb<3_t|pHr9v@C5PX9G^ ztv74Ajn~-Km0fcCcTYED=T~z7Cec3kTLtYbm>BH4?>GY zD$V|D6>$?z7n9unl7uGc(PuV?I)hUBJwq|YoOhM|9|;bkk&lyTo*n53=Z-iviScp? z=WEW%e>ItnhaEzX^>o)Jr3|_; zFj~iZ>>!H~Y5W4U$f9oVQNz6&r320U&#Mmr&>Hr^6>QYBMbc zEtV2D>aYIK?PxkX!@d*N1Jk(LpI@5>SX-X2oDi=Er@zy&97J7mv$z-ibbUQ3C1qJF zXkd`EF1^^Wou2o-LD0CI18uj8wU7K?-Idov$s5U8?@EpLR)tLpRv{vApFj0lglBid3~VyXrHS>KAK>I-8=L)oVDF$FygC1e(QvTg)r2)B=S}ey%jE@r zm3#vrm-{Ucwozw>#>25GHy+a6He|9v0{c3;$E-{AQ^$8m=$YQ+Au&Rg0~Sy$N6jiA7l5)8xAprV6GeXsk? z;>o4`)E$nM<9xSr@dkDNO6FIRsfRfxA#uuoujgDi^FxJf0K=lbn!FH(gw7TALQ4k- zu^alNePR4fU0aLOhISc$MUCb5e0q&$v@~`xMnPctxPheBRSk@Q{6dCX za*Xq;*!Dnvve`!icq;#3$*jkGW_2BCIvlleuf}I#1drN5rRQn;1-gG;b`uD2nAL2F zV#x!D%=K0+8ew(KMOW_C;4=l}?BhE4-rX_o6We5XXl~JQNjd%Eq^#639!|7ol9e>; z_TOflP(I07)3dec?1JXX;jx3_AW+5TWzq?Kivpnv>81aSMsv#xq3(tm5j#@?_Mqts zBBTzR+JUeN;mj9Ei?ed;ZBf)62|qx<(nF86PYm`0bhLUgSh?Y0HoE5;YTab7^Upc6v_3k8ns|(|gFcJtSxgSj5<`iyaql(OaJs@R#Wq zoADm*c4(O0jXCRK%9cp3{BF|fQbFyAG-aMXX|;kAjLzD5T@nNSVkgBTom~G z5*i8M7GpTjR_7mqRPTY!xfh~mVoiTErH^Vi6v0&F@(+R=!k69G8ePQ3$|`L2JoZkv zSm4q8n7d?24`oe=NRX)cTz~5+Eq~C}HhSdN9x=+-#?79=! zvoIKR&Vz4cib}kkZ7#r(2fq4{vJ+Y`i?lVNihGr2#n9Z1?UFV}S+j9UGudPhmCA}0q9g0c;qnt_W@oPv zTfPxT(&oC&zsJX(%I>#z9uKh#ZETG8X{nDLB`G^gXn^o%#m!gZB{YQ3m$Ut5JiVrh zgvZwSNY)GkgcJun-Nj^^=buC4oH7DCbmyL!mi%dDOexwIr0lduH_bbWf;ThwA?}m# zy*VrlV`xQK8^6SeWF--}0AkSbE)uCJzGpcm04Ak;y8ZvjSyPadU;H$Oa_`q1OxkY;A^c-l7N$446!njWLm zWa>+YVW5kfu%Gc+9{n*}H-8ZoFJc=srs!=E(hstdK!xI*Z}6p$XDjyZ$#=5*waL~#{iZ6oEciVC&hTW)l$-yO?^vqJ5jW5AY; za)RL1sA#!^R5=V}838!K^M@DVcQg5Ui0P`lFNC{@c+Qo0?{a zV75EBl=~jJUOxldnT|sH{%!p*k2d#-(t+;VlLZHtH17vn9R=Fs^5j4=P-MzrOzcA0 zZXXV|o8P-L3uID$kV+v}mdxC`&W1y`A0=ugS&?)YmD1hK6?$Q`#YA@hDdlr13jkDp zTk!f+lgFf{?1QMP&t0c>K=7Gb>N-_t;692+5|7XWcv8a3;2W!J&pYI2=1z&uIhx#G z_+II_UlETj)1Vyr5h(iJzSuqyJzo>lRl1x%{o%Pyk>LX{2IL^vt>fNdgaGb;`GYVX z6qj-L?MMS|!9Rh(WuDQrWk24h*0B zv3gzdy6DjO$e~ju`)UM#8mZ}E_4vl8ZW8<6Cl5Y*p;C!+zTw^DCtqmtlh!FB5+-Zs zn2zce7PdIbk0KH!A1WRox|+UYY@MIJ7$?`3c!RO(UpP{ELxM>5ljNZ|8Q~`tCo}?| z)!|GQ%RX0Hn&%fUQ}0iAFD#!*-T<{nW1bF4C(CP9JnRCN>3}`*FKK6$fRE$crZ9>N z2MZD&dq2g&*rzr?NbU;+7$2xk7%2IWh23vPvg>g$oNrKt-Iz^&L_IBxQ*T9}NxOfW zxE+3lr_cBahEZUJOUtGG_BsPxj(^{2lB?ST-G;a$B+7CX`{%(Lqto0)|{6BZRmnDqJ5mZhx15-0E}rVUl0*7Yi4lN7lmtNXZ^u zK;_w&7tFEmHujLZA)Wnx8zX!V%|%)Kno>gM_T3PHU*VdKC2kS_Y34SUaYLRJnJb-7 z4)sX9$8Tg=*}>gFRyd)F&+5+>?OtF4L@36*E*Il-*NKeWObZ>#aTD%+{-h>{7Fk5T zJ_7_%8}rZfdC_ZU|B%Bg<$vngQBum+r#SMJR zo(+n)m(bNR?qFgyms=#>(>IBTkM24F5W!m1Ic?BkZ0y0HJrdb8-61j^#AV9`WH!cy z0t>8~0{i8e5v5O)ksjl)6w52opq_7+C1 zfxWbjaej=SpbmHb60&La*7ODnHB&;p0Z)1`QGIJ~sU`DWlvK0Cw9#0x!l0B~&Kh30 zFXTUBAvhP$$9~a(nzn`=wzg^g;1XMbs=C^)kW4r=bCEqB%w)$2}(BA~80E%5hJiMHxy@=7zGp?`93X-!`cknpSkg z-zpZvrPL1ItKd`P$V-@(-knmx@2+Fk@wWc&f{pj~iZXhbTcsQ9LjNEpKYL-;7mZi5 zCf?6>^Px3i_RF#_Ar0C{YKsvAwE3Bg9_~(yT+`||ZI5LgkZnCb(3G*3svrp2#0Ha(a29{Tq zKR=a_*M?-JaZk}}?#UM!_Z3_X1H4>$a`ea%x0N5Sg;m@Nj%|^L-pbn6D%{YIw{h1< zNx*Kc~37uIb^(U3-zAqA;4H?pN=bDkKs= z8_QRDekw2dA`yJf#j7W+#Zq8~HGq>)jAl#8w8M4#-_hLKlS}}>JXn|0@ zFJ7?0Db6MC@}!~Ku%VjFlbmh$Wm;tEskB;S16B0yxoVpXHE&8!dPbek`qglB@L!%; z`GF30C!u$;Vty;3nHUu7^oT%>qoZp{%n zy7cw*ZLbc!Xd#iTm{`7D8(U?Tg++*d&7iuk&n%u0^4Pg(&TH1)WqY?Lt;V@K>q?(t zs#l7A^~opDr_GIVulz)#W_A$zYmym?&+P7WoF_d;Y{p*K?C4>myNlC(CvL!%RrMV< zRlktZOdhAu-b=!-)wRiM;cn@Mgr%H7_+gY;pJuN8@b#b_I zcL#O@0YspAU7snu8)90Sw`R9Ob!y)tI`B&luexD7<7{?2k~%&29h$RVE?Z3OD11xJ zy8tJ&FV^Q}yU%PVE-5aaR2E}S-}-=E33e_rF)(W)h)ZoUxhrV8?{X?)>g#x~phn6s zQsTu3mb7K8bnfZl?_QTLh7WEJjtHa*Mx>FwUKJ0=nu&C}rvG?saPv&<=_z{RQ>+@v z>n#$9z(mbmaCFk8$67i1>S~G<&oIP9yrgoNwXV=syLXM=*&}_mBAMT2h&vxzvq{s@ zQ}nl4z*4)Hn8sVipUyE3PVzKjq!88aZ@sLTI6mcAdly-$0Si)ft#i%_l%eF(^HN{A zTf1GohkirTPjoy9RP&vrw0Rx9C=?>iO zzHnrh2~hN8+^IA3gm!vnsWC#34(h*Q?h$O`RtIXvBL-^M7zwrW{@=k!XozE*8d9cB zjc2j&i$C!CfBb=id|vXTdeIF5$mU1O9BX6!HD+QNxkl=Ob_2hUx(v0%&RT;6~bk$y9B z;Pc9zqYpdWp(j@A`bzFFPeofyxj$I-?&vW&$9VnvwQgRS0p;>5$pZLlkS}X{{H?^&SD>zJPY_(|NZw@gP0_pDM9M?ma7LRxHucpeBA;YdA`FmZ9)3 z)TuL4RG#$aC+(&#&`Mfkl?%NzNsj~L_iNxyYTly->B_De@D>}+g!!=V(^fimcj@89 zUmtuWGnx}3uKrS2-m<(eLDHbsYeeZs!ib`?+P$!_u+vk!{zL)Bn3d!LKUadiIDW3F zRp)%evx7lpyHLJJinJ}EOKp|={I#aN6D_o~v~;w_6;;DYV2j^O6;+D9bondWb?&jLWk;#z1J%`>eevLqO725 zGyAuOwqrQf6o2W&7BQN$_3XJ|Txnu(_`B1Kx^cg*iIZG1fq!jOE{Yzq@Tr2|Fc2R6 zRQOV&Ddu;D#Ca(qEVg*Eb>?3K9zhnZrX6$to6qSir9()$mO1Gcr9Ej?(D8=4&fR;n zan3(p+BNL^{l;qk|AYSn`?s))S0TJtS~#e#k(|vm{N)bB1Awxb9&{S6#v7`+im2Jn zh6v;b{IrfJ&~p9LcJB8XKj0tjy>~_faZGRe7_w#Q9Ok8Sz6zp}yd9?Chxh!=5B_1N zO{d~2yi*J{)Je&R;{19~kRm?>%|*e`@x3nE(I) literal 0 HcmV?d00001 diff --git a/figures/downLoad_06.png b/figures/downLoad_06.png new file mode 100644 index 0000000000000000000000000000000000000000..16f51ac2d531561ba681cffb4e844404829e918c GIT binary patch literal 238501 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

    R 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 Be;)t< literal 0 HcmV?d00001 diff --git a/figures/ds_hilog_window.png b/figures/ds_hilog_window.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0f2dbcedb2817685ee819d0f8e50c4a74697ed GIT binary patch literal 74859 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

    _O_~WR4oe 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%0D94k`z&DlHys0IFU^?B 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 literal 0 HcmV?d00001 diff --git a/figures/ds_ohosbuild_output_dir_release.png b/figures/ds_ohosbuild_output_dir_release.png new file mode 100644 index 0000000000000000000000000000000000000000..8f183cdf359b8d5fd454ab2c603b2981d78cdb95 GIT binary patch literal 14362 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

    5YnKw>XB@M0NW zh)Ls86F<4KGp}vbOs`^`(i^G3-6HhL+WN!UN;{%mIH#%Ba!@t@x8mCJ8lkzMWDosT zhoQd6V7uy0+T7?$_2>mL&q*AGbMa_;P4O1+EbrfXCE?`nzqjriwKpiY2|L>a`5{o@(t#N8f@8*L&FJ|Zt z8Z1s6qlkwB4QlgbWEi8jj&8#(?`YU-XoZ+=dMxezK&Se*=};LI9k{pdV2*T*pID!g zfZy|`G*DjG=zASmmur5@Y5OQ^KwxnjT3PFz&>9Y@MGrU@#<&$#gT6-Vds&X4zf8kh z!b-eh_)EM?5w+NiT0bm}8k z$iY(J*KXb9v%_-og)y<`isZib-cVoHa)Wz8rLJ(6m#J6xEZ=oGa&dN@|4yUdkG75r z1lflrwJ>2NbNq6A$v`RAL_5HvlO2|!%&ETh`j3O7O2DPqLH%1qbt(R?o0XLs)yf9G zfpb*fPC`a~vBu0B8Qzgt9iio&i;UU+7yo7qol5aB20YswpS?C;*FjD5a|-n*WYvS+ zH}+o#1eZO0U67eK4d+d`XPm-$w*>f*ju2@(#uoaLPe7#+$IX)wZDoQ>Yf7wnb`BMd zB%ewZJd+<`_}f@^ooq^g6CV3Kc}g7d(h@N zM77tl%pOIn^@v8B{sDrF_^K!u(I~Ol-_`dJgETm&cK5e#a z8R5-Ny2nhM%*!@}P)0*PF@3BXgiz@>JomjblOBxjWeHoA8{!|QnuRn5?G#GeZ`GjA zZbA3`{r4zEv-gc5$1tbne&@

    19ERqw)jzOmy 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 literal 0 HcmV?d00001 diff --git a/figures/ds_ohosbuild_variants_release.png b/figures/ds_ohosbuild_variants_release.png new file mode 100644 index 0000000000000000000000000000000000000000..8aab29a708813761e8522d9e10ae9dca8042e88e GIT binary patch literal 13028 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 literal 0 HcmV?d00001 diff --git a/figures/gitee_01.png b/figures/gitee_01.png new file mode 100644 index 0000000000000000000000000000000000000000..9c32dc957c11f45b14309d2f6e1a95422b1de105 GIT binary patch literal 70315 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 YN@W_g|JnqLhBU-E6)ok=)8=>o1AwdmIRF3v literal 0 HcmV?d00001 diff --git a/figures/hap_repo.png b/figures/hap_repo.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbdcb4acbf133bb20808a1b561296f7b979bbba GIT binary patch literal 102316 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

    N^?Paj7l+lP-;ysda2vyo-z_tBXg(Lwk}C- zzlftR;|IPs@6YQ!@9E*TSn~WkyQQ_wbGYW^&qz7wJ1oQ9<1XUo+MWLE5x1)TDR0*P z*m-5Hby6GZ6X&nr;8kVik%%o;~O$Uxq??FFGJ4G!Q6_Sffykn7ZgEPKv8|rua8k+&d=X*aTc!$Q&hD@7 z4>%K!j!t?XK&~ve?SO9m#Li9XT1wBK%b1#G88T~7dL*W&PJTYO!e z7F#I^B#slCO|d}69U-*oLau#4^VmsI$lh={VDu@ZLR#er6`C=NZbG|&rvEPW6m^K) zAlH*-hOU(wyaY*3$t&NWMb{S(j8%z6>+oxIy}J)HD|5*a#O&GKW$y|5q(PvJ*+{7j z^n)rF6HO|z_8_bd<0D>{sPA1-3igJHxomhi>%nnpHuP56sZflq?St8eex>6^%j=HFa>s72?J{xsT4*>T&>I_ZD(A&Oo<_1O8HF19aHeBkenCHP@BlSB*I z(Ei0JV=!JdeF%xsNi*ul@Sg7Lv(T0ZC6Fc_3=Z-??>|{g6VnSB&ThbTY}l76y7(TN z`EfqHjxt`If^VuqA`Dj2`^(x31`IuA|77O*jw_pBh9dD11+rSF~8-!`3+^PE2v!2#+ zmOQU)s;?&lLJ{5Pe^>8)sE;41NJvSG=iW170#xiC&6UgaIY28KXUUQZrArV$R16;u zMs=deKYLaxgWT`9qoWn|dWkB{Z&4Vm{TbzIFQeUc&|4Y?%}yop(+=;<o~<0ftXM;@gg#Uy@Yq0p@ARtts(RA*SmOZ1E)kP(tBX4~ z@&X}Y|MJ(yu<*v0Wkh3kj^mV1#vo*6i~3;<_3Ne|dgo~|8}0d@yJ8DW+a@QXF9~Y% z*h&b#(G*H(Q`v8ox=Mz$x5v~gSe#yyPk2{$9LkQ{5{i@HG6wK`ovz)e=h>Be^cwX? z08q!E^z65S^2hI@80T%U7Ft$*tnEMGz5|2og%uA!g-`7MbRq;ddwWaitXAbh-u|76 zEojz$Us=g*X=#a@c`4vHMUnLjaQkQhs__lUqRPqvlfLZRah2IqFX%igtdg{`HSauE z-&zJFxmJ^z7pIN_}BC!A0&o8Kp2->I9y#fQ$Ba? z)H3M($0#kO^4xD(eYw!6`nlX_x##fUIcalQ>@2#e#o#%{@W01k|LlOamwFY;0q><| zp*{9b5ntnX9Y+ky2>KJ7tO$3?Qe@8IL$uU!;pq*l0sBo9)Tz-Djy0oE22lB92DhW* z#iYE*FkU8c&bJ(J!wG$L7_Xccth4!NV?t=(FP5fN~ zx@TsVtLIh;hN(C0_Y)Wm+X;+=!hw*jSrQ|cvf#P)7U6_<%j5{#V?LVwj)vN?%CT5J z=1$7=A5l`be-rSx%SCtZ%{Sm5Qw6!?(;-Pqk7k_&@f8kaXC(;T((uRRDLqg+GGTJ0 zd#}TtcKFFG+6fph4pO4(ytiOE1*^)mH*X4G)E4gBN%d_Jx>_v_YczS@u`C82TZu3A zOni{?mdAb)lo`Gr_!YvYa64noEHw+^om0sSF~LCemX8;);VJ9g>+rvwF1}*h2`#bL z6`6^xS9oz=M*BH$Kks&ii5$7J3eXIk-#jvle2$E~x42~A6oYjF@=U)_YngI@UL=R_ z3cEeRh%A25KX*HcE$=-0rZ9vbe?0W)vC|)h$fh>nnX>se7IbeW8?43$RLqBiR>yC= zOP6cZ4EXZT*E7DdKaz0A1g!*G+TTtKYk&#Dh?c8n5UP4R(ybmg7HN_T81xq>k%RmF zM)rc&4qT|TXBr5`n$#j?muLmyq!#l1e6$44H00jEVOIEtNFdMWRLyX$&?~z8i>%4J zp>wZe&_9iu?0qHoQtCSDnU&j|2z@taQbJ(v(sIlod1*umFU~N=hBMe;WbGGl(0|p# z0(^v+^!jv-nJ$iBH)1H(T~KY!Fznl04H>15iOCc*8{{_vF(p0I_2XB_!gn-zc>b`n8ghr^DNy%S}i;k;G2_4uo6+pLCtJ{uPDPFFQ zab6&6m%8L7lggOLsUNk9=c1LO`)-B29(*`^TA{xD-rYl;hXeg+ayNHFis|XXbjSq} z3x^-}-}TCFd_|e?YRD)~ZkjMFrPy@-^X>Pzh-az-m>hruW<>wM_CpgzZuD?S+@v4b zl}|`qu$WZeVYF0V*?W-_`|tdZh`lqX-Bhw&l74P6N<7SdVwXI%iBB7?<9V!AA7OQA zTpmup$d8e9IG7=+>HCs9gkTh^YGw98>Qc#PIUa~=X*9e(YZ(n z@k3~{n{P^cYrvxNjr$9d@QS>smxz^*>b50X`H4q6=pfX56WboGF6x=zIpxe{xr;__ zTTWyNNLHUl#mW~33%cQ%9^TJq-q%27lp0YW##Dt#>22{K z2T)F`Ev5FFX=@dYPOU*v-b+erA4w*MKa?C;s%JygSQ;kA#zwPV!mgq33Ave#Xqul6 zRxt6O0-3P5UxP;~_*<=5f0v1&Up3MRU+SNnID;vv*;o)hgov+>>I$?O1J%W#G`nP7rU98qVTbMe*|EQrTrfBnEmyHdC zf$KHi`N^PBB}67X<7D4j~%||K81#Or{Xk#S%2q)WyS%XJC`fHQ1-ZlLB{vaoTkatx@q@q4h$DR_N(rd2+iY; z*oP*VRt|m~^}j|$oCigkTsmpWFYjKxSGTAuBroy0RYxN^DfNTD>#$){nl-K0wtr@QLD{qp_?o>N5ix7SMpJ$-Xbc&{Dp+ALqJrbTw zS`Q+Ugc&wZMDZif^~8hTTTKu zAp@^%@Ku#QpQfk@scUY0I3OIax=o+dKhSyiOnq&a^{9Hm*i42_&7w%a{2}1BGGRrM zT}34Lkto|`e=SfW^?SIcIdA_Z02?v8ylu`z+z*dAke zA;aDsQk`6lR!t#lHsQ+b#`O!00~41Zm)CfIcHi>h{ien2H|?L5@Q;#4ASED<)3y}T z0wXHg^73cmo?E3MZTtiM`VYm;^;sVm*SrZS2Ck#8-99erLi2A6QYS^(^x$FCdEb5y z(9nP~T^p`O4hJ7Je0JaX+02Q7-t=op!RW;TXtTIYelsmlY3n+)i3`Gecz`@;mqSzv zt}5fogqpmQt7Odrw+GMzw&SP7LTWTqYb!qMZvj@x3kne{%pCHSzpdgb(icam=)5nM z<(puZ_xJ0zCD3|^_qGS}`}pV#Qz!hc-qin0ZJJYO;yac(TO@}GLLJP~78GuQezy0q z2rK{|$k`m2Ba=&_JYjDFV{Ur4*TTm0yGv_6dyr$t3$$ONMZu4+z6Uw^x=TPXXAcHk zwdzi{m}$ndmBCZaQzn)CJ~Zclnq7*JQ+-vr&Ibd_#3|3vUi5{HxUyH>ir7)&wDEA{ zgZQV>wppJ9yF5E{+0{s^Cm&8acXWF!H)rU9Vo;NzV}cXmP;*)IBP|CX$c0~P_+Lg$ z`E1J2wCBy`8ez(th`dtw;KcVC_xUt%g*lwZ9NRwKV_?(yUn~X5#w&fTdYbp zwdc;a#}EYjGn`p^`(a}8!b?eB-uj2XhO}E#cJ(Pj#|be8gu9R0G#=?rg^3Q(yXIYX=6U+@8sEs9w!BYANAXd0++o7JZfUXQ+S5 zZ|yvi?JKtYBlL62cZs}(c=cv4>ZM}yYkWIdouj>+VpZu%7$}7qvHUcJT4b)BNQTGi zSQ`vBHsN8T?)n0D=y|3pk(}OwAkSsli^~URmbUG9l)4{45>`C+3)8=z#M!FI>d`A{#-|~9AY}K+glTWgyEd^hye!|E^7GV2M-{6eR?LM5B16!^dMYsV>V1#)o+-v5e(S)XIdw8 zB~tQEzZMo=So{@`uXS7vd4}^T!37A`2@8mmardA0fAM^V*MsvDQ?0jQ`t?L7lBwMr z-o7E#WV-GeG&>r#zO8SCGR;vzzEt_n+8q5&iy>g@B6XWed$T~gb&=Y$zwbLbVSZlZ ztqH5eEXt>Elk~=9Bw1SCi`(Ox;t|^&W&P$L*2_6BQgoV>T<_EOj|dbr^{k{dI)tDQ zuffYoB-+s7i{eD7&!p`jNaO!y*|O%RTy+eXn<#Ljuub!Zm*sA zEd`2}zIV4}sk5vy>d7uigfC$@6o|SKREVNuc@b0@V`4!$13MWNL2^);V>U$)6r5yiefV{cfj?(~)E{4!m!tkbC0Wcj{*+7)p%2i@Vq9RaK~^lt>zKh3{oIej3gj@&s6R`SbaFd77Zh$S=^8NsgB^NvE0+vp=B>HW){cm}ARm;9S z2JAkYv{!&3+1emJuanM&O@*yCMNBB+1{FHf8-H5)gL(9-^)tw>q+(ekk{0+tOSI*t zm=L5{xC!TFnV5RHexL1P8WFZ85}u&dXpgpGLGraA>r1Up5r#&cd4k9yR|S)O{Zs~? z#7LZ18(rEa!GmAukR*zv6M;n`Go=O6UbZSlZ;&8hl)ONBV)1a`({`n<2k(AnG2(Xb zRR;fJ$jf`TN&S~C^UW;6mvDO*$)N8_tYFIpC!CCaGKgFaz`(kH;9EzxE2bYf0J;g%IPz67yZWGQ_y%( z1||>n54?TfZT}s#=mXYC#RG=sSI`(Z;0vof1fKqo6Y{n|%qx_@Ch?z?+#VGfEi=<0 zm!#?>5V^=#oqTd1*7irU!ZaJr(*7WNn+Jo1-BLVCl7@Q?Dq$dMi}u)I;EA`;ydvim zUB&lJ=;g8v6Y)P0wMMei+fPH*00E7Pu}g)(8GZI%?c7nl(HLxtt+Lq^9cp1%3hQNo zEs>F#$!TAq`dm`(SKg{$|GZj(}qFwBo#qciPD$q+TqaKawGra0GFkv zaQ265jYpw(Wg~Mk@}>nkgDEji^uImmtFMU;*836fYJPa>;F0`9Kff@Ab!Cdrwv}9x zK|xC{e$=bHWC}Gzb^f@&s}1^Z55?k$`j;=YBp6q$$8CuIX(crIx+tHR4Gr^Q+-Pz| za&k|Hj&iNTOx~*zdHEm9TXocXzL(}CK+Fk-MVx*cMuqeXz&u#C>I_|*+H7q96lghA zIwLH|PI!Z7q{g@^%`nwEqh-4H{o}o4%FBb?*6(h=g8=y}IBp4Kkp@XOPhDC|B%AcC zXNE5)h9(ALyNb_K%E{L1;Ql)uLc)cH*uR^0krez@LbHKYLebRs(;Smf(2k`kLdS+m z!&O%aKUyKcgl`+z`|MovS7wT;*{BL|2-!S)v1h+{xc*1nn3xU8C%!U|FM$J6PbBj@? z@Zfr;f$-GTb(MgO_`z|u1g0a`{?j>s*SsIC3p6hOymcb&bbpBeL?Ic}I2XL@BgV(a z=e9mf>uoYu@BB6+1J}&VEMdezM<=o^@GQ@6BrE3CtKut#r3ZZc{C^jGmx>45+uJDw z97wKjZYI4iE-tVtRLbLr6**d3@}pt*uQ_-y~YN;PTAJM=%PX*069Xz4>QH zLxby*%e$qfp&=C#a`Nemed(kYf4r4pGc=uExD?H9$X&%JM)4z&uk#DiiX5YR7K004 z3HqfsE}-!A`ETSLO>|`U|r|VsCG*0_QId&(8XROoNtpQ%MQ-{WBdQ zH@MDAgTQ_!0R7NZ(s*Qcf3L5vTdfagdIwaJC?WnVN7L(u3Ia!9D5|UXuV;r=_`G

    g5l%4OsUmf_*S$Jg-Q*Ds<(CnQQIYTw2CYQ5C=5x3`)Ji zlDjpTUH>BhP=gcRUCIw%fq!I4 zm64yHSU^A^P1rq8uAhsA1;fI^;#WtglwpHQ@RHXdHItMS{o2|ZKCN{=ab{|2bWsso zg4lOpncoHm_@FS*rhTY~2j9=}aZP>wn6xwsZC%~G;H%T9`oQCj$+js$E+hqU z3hAqXs6UqhEx+O0{FT5WLvcbidcy0RUAbgG;pmKOO3M7r@GtoGTF&gNAqLoG^=CD^ zqW`wH3U979HaPZX4fYJh(F6k;UYUaq$-S? z!a{B?yQZh769@M8_Y=N-Q)GVlkdcp%NUy?JGaPz(>`hNk@3lKiijIyBh?B5k?Mo!U z%0PNN*L!$w$w)l& z_O1&s4OVIk`PH{Jm}*foLz9&Qk=ECz@bK`^Fg4wCm(Fi(rSaXHmjPsorvBpc@_suT zgD&`ha4npIB4%a9GW7$*w%n-Usj8}KX2o}6AUrP*Bu$nLV`F1c>+5zGp3vHCl`AqXC%Cny4s11qn~b6(`}aA)SBF`dASZVLnt=n2CuNi@!W6 zv=|BW-)D$Kg6~}b2V14+d|=KL{I$+E$3<829ha#TzsNw`}>J^xzHIAAR`nVT-2X*e zJn##EHV}!!X$ZI}RLguZ2eb#*nA50e0`h<19-*`?SAGd;GCbI=QKAPn&@e2BJV}+&*JbJGr}T?;^5woZY_J0;lIr-c?+lwN3R0=-l`z@|Ai z+ZY||wsdwx8&PZ&@zc}%F&pUTq8ROaf`G&~5(>hUO1uCsZ z^)3YjX=ZsaA!r~Ur=VSkamHWA)`^9`jY7^Hopuj;XwSrI@Vooq#=%zLAzqpOBea-Z z$0lyV1BUuuYf`C~A zYO6Ricx|(;y(p)!O!SY^a`)xEC7rdn`JJSm zVQaAQs16gbl-nfcMXv#y05DQf2RVqxyc2YCRaM1P`*I8n;2O6^qa}kci>B%5=;8tR z2o;}hcTdmc_VLMyg0XSN$2L?PQQ7F-^~rw1?Z;$X%7>%NdnXG`p8Y(@Ou#Dr{r%Y< zKjzC&zM$2r*VEHm&F#Y_0E!Et=4ub|n z9%P9}cib-f51}vv@~-5?;!?z}UaU(&0*TYB#_7!YF=#y``w!o2yYr4cX9$mp`54#2 zI_j-sU|{bjYieLnjDdCB6#;-idPYVn7u7$xF15b_Hgg%+@hC4hKz}BurhY0Y!0>5V zNF=H-4$rFDZVbK>+?#I-pDKTo$#+BS&mS5ZD)+IKAMiU4j*faxwx=`O1xr0!EJK)F zZBIns55Y@WXDR^IoC{D2-+=VQ;`XM+V=Y#$OZF&^Qc|*_B?yT`ay2x#EX+Dn?}cFe zv4CaW(iz?t{yv9x8LPikdxF>jp0G$!G^{aD^T?h1GE^yKj9 zNa7=-^wQ?E?{V3STT(nM7q+s#7501Gzq)G0Mzo=(p#cvH3c^+YM0#0zupMwh+QMx}%jE@o9b57; zhWGakH`1Z%fkt~JfU6KSW}vYIP`*F>_Ti*HqKbolCH5Htzm3*`3^pza4Nw{5!xBB^ zpW-^;Go@sP(VgP7&Jo7oIpW-1k){?*3}51`XN{*`H3_9hg?9U2Brzk8E=i zc#jTtr>nd441y4X=i8;#zZyT2a66}kBeyi7zjqQXNDe76@bTsUrv7=irhS_vl_e+oKRhtj8CevsK5GJ&__xYy@3c8&V(=HX>H#_ z{hN{Sle5CPY{N+2BdmBl;M=&2e%kT=>-O#-7Z;bzFz5jBu~mP3aW9^b%X|zVuPdxl z7g#{9D-;E=@y1d|$82swT-?`-qxH$yE2Zc$Er3-4_pH8*AEcOh0H}N>4vwMR)zUZt zdcbk+?(TLw{QW#bGT1Qq-df25Hhr``I8Y7%u;~cAOfd>JU7_!^Bsl zV!RpN_%YfuBApwN{Q0a~BH30Kl51EkBn*u&sb490j4}jn2Lz!>K?nQE3SDI!WGHO8 zlgBSS0sRy#oii9sXmf7a3)~=GLcr6fADUwj!Dvfq9`rw0048|jOK$MW8##RO097Gu zH`s&fmlkQ_)=W6*9z-;bOmM=t_kJM;9#uqK9Ik+X6eA-VKryw1&8c!~fFKiFyMTw{ z;MO_6iC$JXfI~p=EL$>oVi|lngO_1qXKnpC*Db3Zl-+KUPYgJg-aGS6S_=g?HB2S93Po1)&nH`Hh#Mn=Y{Wyqfn`hd$vkKV6J_}@{d&jLNI zXG`!Hg`0IRFXaTjmXC<+IWpNgCx_wOT1c1e?d#b~9)urVDS93bFv#fa37!AuXE?PB z*7PRld1Ar~okCD#no z+&GKJ-LJx^3K< zA6?j*(2aqK=@~#Rzm-?46E-ai@nK=$x^YV`HM>Q6o_JRwy=7m)o17Og^|#sCm68Iw zv*XH2N*;}5rNukOyRP1*fJwSOE|eukwJL_|z1FN4O<9i(TWUfp1n>CFSJ`y1Hb554C+_J#G*^Mf(tM z-nK?yU?M=iaI2@%sDx;YAn*0H8o|1_JzjJzQ+?Lb&!f-Lqsv-{+9-h2ZBAT#rx&gi|<7sw5J6!*9ab2-Z(gQ zMHYryXeNN9k;RFY&mYyJMJ;2<{|*zaL#Zqz1&e4ge5FSUm1y9;%shJMp$$HC3x`87 zC(>f^l`>uZOs`B$w37Q5CVR)gcKt4m2vZms*CB$$bMC;2|qF`@w zz;6-tFYu4pp?ed_fTBY!IkRQ?T?<+o)ytn(ZJuB7I2$S7rJM{iSMARwq*__I>)fKm z-4gNUQk=f_nHn+z4XWOplW#zAo#Z#IMDF#ty`NVFK|L$_1+M) z_45StFMUww6a_1508d&Cx(C-MxCfl!2@J{BnS0E{{8#|1{gL#;>u^5jMT}0$jyiCQ zCuJZa@D0xM7Av1Gkww$N2|xJ1!(JrWvyD#PBgnem<2#o|0FEPkia;vV@V4D%0h{zA zB{q3?lpM9!39NYpdA=nI>jrYue_@xe@K zK0KwhB7Gr;n}z$4w+Dz&BxXN6>)9!zccgJ+v7DHEF*PwyFk_W{uO!Dv%9Q+@oi|1M zb^bcUg+tK#ifP&<>Q7?HO~uc1xQ*FH3UVaJ2zrV{9w5E1s)8a@Qpnb1euQ-gZ&wFp z*V71iuoOT#-+*^7e>)o2j$VvLeSP%6-Fu;3w4LSt>nM{nTwyG4MYf0JpCD;-0u~T6 zSQ6&nBUSM@J1Akp8`+QV-HJ5Td|2k5X@F^A6>~m0@I;9}tC`5cW!N+Jpk%;fN-cau`s{}b&~e(8Tgd@g=Ei41-R+*JVw z3+=Igk|Tw(=UE5@5;qE+n3+llifv`yxV#A&cnTCD^{w|yb(hn-e9{>t+w*0~yOMjU z7gOjft(fN5Q2F)2$|kL}Vk(P7v>u)ipfZ6NeE*H$JnA%4tnr0$yx85f-NGV_=}@UW z$cTw=;^bJ((jV=h%Sw9F_n$cNEUDig99UNtX-nmZ8|1%ex#?a50~&x!EC7nM=ofzA z{7Vofru{D9^1nZ5=Kn^`fdHNL|As*cLH`Z_TvY7)|J~YISWHz>);_7NN(>D7mK?xO zH!!o^eVBs$8)!$%W0Qr~+DIF@UN8DdYA)rpa>O8Dgc|JwoNRM9Mhy8bVdeYHMpLhh^m_+yDctIwkl|s!85!`g=Y$ zbv~z!v9pQ5TC@vOUW*JI3PTv{>mpbg_3-~8$Ni9?e>Z5%M0=_57Km;=`LFQAmSsvz zn1OY;dA?$3CqLtL%tqJ460^@1CVTt2|330|n&>3SPi*1Yu%h`3AjlmUW=t~mze$bn zlk5KNElv<$=h&q;HEYYgBGq93``}&HUaY7Bh0X_Gy`=p0x$_}cd2VD&fT=BG&ThNo*tjS z#1ip%NXuJi%AmwcI|sv{E)jU$@1|WWyDBAR4+aXy=9W(OqNiKq{|jHdp;q!)`D>Q4 zl8@)fqtS6YBnnf;_F{JuX8wPay=7FKOA|FZxDW2`8rGBtN8JO|aI5S!L1!3R$wM1t=Y z2_01b7xU<Et27`RkR21e!4|4KH>*p%+=bC(s%_7Hf#5S%`uq zD{RJ}h(;fhtqz)hxktKZiaR~y6sCA^v@4eXk zs!?4sfA-Qb%6TI4J1l$ou|Dt+Un-ns4h24~F5LVf>p?9ohkU6*L<@=T)8I zmkBUQ6L_(LAn>(fw0c5J5|!O|=!KKJYPdJ-h&(i=a@op_0+a~}?QR*?n>8caZaTE& z<8wcMCu^Wu=%$|h3R&(%*8%?>c)-xRPHARe{YpaRF%{2?5jne{AJU@WxXIZ@%N{Flz^%Z&>fs+Dss8!gawNpVUa01-7SYzfc=eUT5)wP8^D_;AC;W zY1HJsA~)WBP9^^hAc7h{#qr;UI{8a(C#9!l!)LwhH}*A;1PNkgYV8vZ$u&x-ixM-B zo@5Ww@PT^q0ucI2=}CkKx~2)HzjyyOz>m2|&o3lOwhV*zJr!_;m*z5L$}08ZWcBL4 zc2qvb)Ju5Rt?wMs*83>An$}C4W+{<-bh&-|L3X@4 z9tYC)&}zNMr<(E&&yKMdcZ982-C4r>c*f|6zZzxg(`y45%fp?DaZ4xJP~l5eUCg5_ zri3_*`zEm@6#&;qzf2oS?zm(2g;LBr$nGTc2aJyFB>rc-=D2LN&{7CWbe}Jz)pI8l zMI}eyM)HNT*MlF{9=)f4LWDc<-V2zlEV9qg2|`4%HeG>n z!`*;*HIi`)o6{+GP@7c#9_rkqSW8)vzYXU( zQ@Fdn-~#NllA0*jitsa_S7szZvqp5z7YK~@Bo3bcQsxGG+bbg+D*;nOx&7NA8_4MB z4Ww|6%Z7?FRJ4N^6vf?72H zYYuWxDa2Xri!5x!&fY^66;xQKLztLaK!wa$bkbHN_Q}<^_FY$P$q6%qUmaMitk4wt z?H41HimyU+zq`W-M+1Q8hPgHa_ts>!1#tLK=Z2d1Ka;r$x;rq?L9bXva6%CF!@w_W15*jdj|Sbq8$1h24+FkJ-(|AS|VK$qc^c=9nVsr;yN_;kr~J^{1e>8GqPZBNs6K5 z!yf(_+!-=aX2C#NA_W-XggT#*~l}v}Ei@7|$dYl`u3wFwE}Z``g94<90uSe#cjA z@TPezE6{uK?db^I*i}^{WVUD&Tvb7<@aqTcx)dE;*|o!`G!2V?B3tv}$BH$3b4( z9;@YF-?mRF)bj@~u?PT&*>0M5A4gQb&&$?&UT0^eF?x6g&VX-t|7wXx;2zwZCf2PX z9d_PYkt}NLvm>J6K)Oyq7Y8K}J#FaBBUu&4PL_~;h9v?Uxn1ewj4bc||VSp1zULiWW%tKnZk~4g|Kc30!ybE7#)D;89bjg{Sfe;WsaOZw{UQuXP zY6pV3nikMAm;>4B{T3b*0}CJ$@gvfzF&t=h+5rH-NxjnG%QnF%Ja~-rs%fo}gP0lR zDc5|WAC!*X7~z9FU=hlJ?UD4OfvMbrVV6+;R@(|ej>!IvC=@`mt)lY@3z|~3NJ@*% z8YBMz{}s4}?DzAII%JSj9W>q|9Ry-NTpWM$nu5We|9??s6mk3iBc|NU$O~$p-3pP( zR%-yqn2+S1?F~oRdnG$dC4oWnva+ztVIdH0*KyI-(6C+@RgS66_B0mq+Dc)T4EL1B4&t3nK&Hm$RS(B4Nig2!-qim-1%RtiR= z&e!P${D_J`2XT{sldk7JmSVcVT80! zw8cho#zS1LdY=5wNsR~DEOyMrUxpq&4&XlTZ(-WXoF$fgZtN8Lspw|w(67M-W=O& zllMuO2ulP5Alt$ds2Pz$BYPPEKxkY|M6e?~m`8!L&Gf0NFf? z$XHSDwoSOT(E}TV4&xi4#b8H}+&M`xcG1?;TAg-B+>PWvQIg&Aket}lWL{zo)5r9x z<+qP%V2uY~*`K7Qx$+eJ;{MA}vZ=C!?*4|tV#*IOrpRT9^U~dSPQ)JsK zD=7^Ifa`mKZ4G#yuz%caM!Mt~;xh^sC1Xm14bchI;(+G2i!N6b&V>2cPYt1r+?8oG%&uv)sM zbCJ9cx^MHj*cyYGHrg;O2a zUD+>F8c~#PB#y%5IC63kx^0tf*XcLT4N?p3f@w{tq*n61aBmBj3IW^wSgF( zc~TlRLcrsEbG}ON`1*3I4?;FDC?o_LnN*kv>~D{gLaTI}f?}0l+dh8W>H!bcCOAj( zaHa$mNFr!?IA&pPz73WE47PjSsHmw0f6!|-22V2BOF)sC!Tc>@p;n@#vB1}dk1~vZ zM?!~97+_3dom&8{^S{C*ZPET#_l2}B?Z%LyA%Yr zzMajUU~of%b8>QYON_x=0~na;2K)Z$pDq?n?hvXSI>=lq=jorY@u&+#mxupFY`8EE zydZJZoV=w|kt$$;$P!qtCG*4ub4N7J>frtvw7KVLRA{!ko#4DZP5N_>dW|;_2|ld4 zX#aGk2BQUkZ6-V%{_lnZuC4HRTv0Q7qW+iTxY`~Vcdl~vpPsY^bdz6}!0r;ICZ~^VvrO38K&p2AIMxC;i_r!Nr>Z0pL1PU=;{D zcuIQzCbLP4q<(6xbvc*-8&R2V=H^+;#vpiL(7+pKBrePLL)W_y1tsNli83iN0q3xl zx9{_<>Iv|$i`F?e<^vjpYK0gX9lrK6ICaG8ONTY0ivjdl*4{_GA-0E1u?E7C#3Jj*8DF;LU>14I@K*ku}5JSQ^d`Rph=nVVw1IJhe z5-uOU(Ru(p4?=17YvmeHP`W+hzS4myPt@>`&|=-O=f~K8!Ln%~WjR%ixg+!>OaAq3 z<282+31AWe+FWzeH0-_&CB@f((ua=*cDPlNdG@)fxjroa)u}09CU$kP6rHW%@@buG zVJs*0oV&Aj1ccgwmD4oT5&&y(kuxEz|3P~MiE!D@xNW82g%1mz#FD?|T?*1O!wg9O zo4Lp_j%J!HWn6s+7F7S^1NdY2xu!fer7V`9*~6G1U5W$TxFIkR!Vd#!daZB*ujhP> z?CR;!7%LpOG-m!T$z8K7Y!=s5bB%Tte(4YVrKeq~ijgp&o9+LD4O7cp;s7H|`oG8m1xEwzf z?}gB(gFj{th|XgBXmsM{WkSbu{Ub3hz0w|6*_12p;v1h6MDCdib-Jv~^9#hWo(g3@ zTmXxw!yD;QVR%E0-1=Hw@%8?N;#7BBbh4(baZe(kfmU_DmZ9_C@KhV&3DQcms3^YH zYGX4d1wk&qs&W3`ibFJN2eePcN5HCskl0`(u>}u ze`M07_^s!c0uxJi=cj#A+<|$zE##TqpJ8Dr^5LSq(gKA&j~!9X6#q4#Pi`d6#_L1D zwvcq+8<)|bD|EqN8!E*OE7YsdAJ#AOTF5E?Gc~NcuhtH8k+@rNiksS|-Rh3=<5_e5 z@Z6f`G!$Q_4o`mJnRCR=R8^jrDRRS5{GCOi;oTo?@Zt8)MCmLm!9oYya$Gsd-8p{OLvSswsSS=IY*uL7|2Z_85*UcvlPEWsJCG%* zHN+Z~AuBYxC-lo%S=U%`pueu;xb`zR{b2@7$|o(n_YNbvpFGkj=d%F4_h zQ<_mpqnP8OW-1X}829({e8!@^aAbsEE2-1F#|gwm?}XNLSeBi{@Im(e)10qlyLH;n zO9sYYk6EnmG$o&e%b9K545IL%p9PYvxSylpLy)Qy-5A0 znQA_Sgn5Qamb$y8kQ8&wFv<1(mQj@}iE_Jy3?MuFLoWGqrUshmmUK560PU(({6+R~ zLC0r@AFUfQYF80@EATP2GlSS{9r*DT*Eaw#Qs)Mb zChB4Ir~FsBR%x3OJ>Y*Z`Wn|qID@CLV=L~!t(`Wj#Xzqmvs_Vwl#GOJpzdXNoCcXu zXx>ENTX3_m@n-E>tK+*z&7mL7=J_iy_05--TdRL->B^ufd826S)nSDAKAMOhJF#te zXm|eWte+i_V1hIFQnNKLv6zz^lG&Y zoTlI}95m_SHC{Qk)t`3I`%*SPP{?cK|M@!=GqDP@Fs*ecD zRQi^6RjwTFHb$c&f#8VezDc1%)>Mp&JWLt}Bld7RiN_R>rLl>|6vsoKYAL(b1P|YO zCi`>s8%!rD|l2m0DNu2J>_FDY22m& z@jE#G)R^&~Rq@vff`H8{i|ssAdtF#8m=9(j(O}>q9nFU};>=SyfMk%D5)Wk}eO+O6 z4`TH1qVhmiZ2DU=(Oh$SQGjD_TM)DkqhWWB|6!!|sA#vHKEFE*y+cQgoXNPa**{*8 z-l7jtl6GaR3E@`eumRz=4|t407kAHXfhKD+t^+gJ9pFqt#|Gt=Ezu1aBu5y;J@kR; z1Guta^zXl~MU#qPFWw~Bg(_3 zxccW#=z7w{b7zKCymCHaZCpw?){=!W6g904DND3(@uE}X3)J#GkW-0p^frz&AR*{F zC(*Th2uFkYK(}nN$fMJ6a31F7)p zk#8qQ3++2+#6#^NVg9KSN2=k*^776Rgf>nUzbYXfRuD)7z80HrCVXsf;&!16i{JkhqCtMfhhw_L|Ef`!JP%nIM zU`^Y_R>*~|LaXjiL`qE=2;bKbIv8o!DTkdU!L5SY?GyuBcuzfW3BrNJ7P&koK5G4fyE ziz*oO$3@N`66mMuQ)&H7Hfg)`6f)*reBq1?`o6AxS|5qIYy0q8ga6vVG85O5fsF~9 zdtZ+m&Y{qEYpMIL#Vi?6vDBHqRuX_ljJjumVbBtZ64tn%1J~vxYV(w7%b(bP?M3ff zQ)!P&II;{OJ8akw_1ka+E-vFNb4gM6eKjo5`KP}}6n1+)&y*Y*=FL9G%vlS*2%VqI znBc;i?i)>}_17`N`7VjqDP(f}uFuP)12*chD-8&z#4a}Y(Q07^Pjib_QjjY!SY})) zfWW<0H)pZv8!lT@XY7SqSQz!?@A*O#KOulMlLj({8(rTb^GbI%-9J`M2W&d+j>!)h zC?7{Y@HkO%hIt)z-Zgc4`eTx^rHA=>Cc438#)N!r4`opzoMh#^j_9q7VaT8 zMx+H@+0q2~c71+>SczaUWQQNiasBXOHg073_~ZM#+B&{vI5suy8l2J2~y!jsurVjui zRLW-6TzJ*0tF&atF>PMkz=dCLw6+YW8(Sw`epROet72LYetudd?t|^>C0D8TIjWvAMuKju+$&r%50w-K7#1qg7_v0zOp^jEh4mjuDm6`8U<_V zf-O0x?$HO@$aJrCid82t^Hk3pHgN9%fw19wZ*wq>J}SfSzkdm^2164Ub(z1(*H(Js zFGqK6#}1ti(J;MXPts6h=<#`;VT!|(KUYV`RFm}zDWuKn zhkSWAFZm}0Y|hFa&`E?R&=i8lt$a**^MlIf6p55(;BsN;JUP5|59FTYw`O4HU|rb= zw@$1;J7-wY^sG_mHnuk-S!jJsu+KWi=x!K$_~jK=^tQkC;OnKy;GGdtNAr$zhU3Dk z0^oSv35X-=u?FE+bJ%XvsEhhRaBxEj?yBP!Z&}zU^Fj83gvk;lKr1mAhXGmUQ6c~| zeOxj0^WaTOl07NuWpi);)Mv#RqAhSfACD4YOOFy!NpE97gHrPFn%wJ46Apq98O;U| zpcG%wq8a%`aFY>W4i;49W-1iU?1q#tL2Xit=B_$0>lc>V^$YhyrvUG7Wb&2gyc`-<$0 z%d%Hxd(y)&&%$Iv4KT6wy|TKt?J`q3%ZRrj6gIY(pwL4J({b#55^M{usU|nAx&D=s zha(d?UCFgLLLaMRWRz%6>O?sCOJ6UX@w zc#HD%!lcIXNB$_?oJ4A_a+tMw>-jyk%X$kaCD-Li3lXn3`7K1D4?WCW`{6NqN^K~H zo^_O&>6u_Jo@Y~I?zlf>8-{%){xKr3Au(_faQCoxZ_lkW^SV}a!MI)^{c2urx98&( z`#EjVD)-muxUawr6u6ph^L(SIb+Lqd7~1PN8=CP^(*rmf_}VFV1+!u!9k{*ROpRW( zv8W+%JAn_K0yW|57lwdUC-l<=lTf8o{DGwtRcc^r#_0vC_)3SWynT{({hfo9tBtSD zjMiVcx?aSc9rc|xE7;+@(9n!Ic=0#tP2Xj3`_G0%In?*Ke$0!T1IoNru8sFRxDndB z)J!=jrcM@4j^4RT|gc#tm02iLIH!AW{AD=;KV7w4W^! z!)%@JJN|aD`N~_B$g>hkM%hFB!ZY{9XOK2q3-N&e2NzV!BpFUhxelJx%6lQKH$^Bs zt0T@l^7P&5IiHujcm%a&J{1db9+Bm`B?51>KPGPwCkNGbT`mFLyJ%$HSh-@56WRMa z%FGx)I5W_3C!EBbEJL`{glmEGgJMRImv}P}Akgi2No};MGP**3-;{!vAZHYXd#DQpTnZ2(c`N5mu3} z%MVEdu){t;@!M3Kn5^%0MVc)sUB8PZup4PW8P;nOcjTU>#_?4gE#BTA%5FZ@x|0yP zE-|&ZezqB5JT3WAp3m)#K6+q+&tcf}WA4K60hxQfBP(4T-0OZih&HvA#cy(p%RrvZE=13*#z|0P73qm38(34jVuniA zHVm!{(z?~Sf9Uhf0+u|K*SCLDKe0JvuPtMa-h*j?xDi@v^i8rk_E)Eg#g1}DRCszO zX%bzhNbyeV%55l)LP>3 zaMPB(<9U4!e-jskF!NYv77v5TYBJ%g0EnuJFb-H=EuP;}(-tw|KRo0fdLlkxhNlqx z)E6>*;dB_yuzq@&%jm`bpxX)OIYHt$fpwWBX8dFf93vBZs6+MI`5@c=uKDZ1!E_<@ z-t_wtDtie_gDpUEZ2)m4@m0H65y3Pt5C5`Bf@p9)sEw(}^!MmYo#=)vhZSeLFCGqy zhTxtuB@1CU5u$#}$U2*Hjtk>Y<)&#sKY@stzxYtZL8Tq*LPc5S=K<(Z%vbyw^#(Xw z^W9}AL`<;y^U91MN))S5B*TG)hdkQtw4ew6NcG<3391gL$&tT2ylUt5zbW9i)@%k*23yv70s82@6O|lOM zCTjBZG^}G*Xf-^$?Lqp8p(}r>J%F_K`CpM+3kV2E_n`3rDiS#dW49nY7LcdoZG2Hw)4%i+mNw2xsnei-(Lowy zmBW?1OXnsVbU&Af2oOCc=4ZIu=l1gb>>zl)JC6ly(s&=6Q@XhSq zzM2rc!ml2033ejIj~~x4W@=I8YcH+_ht88FF{*6|EZ+|0-|mJ)%yC3zs2w^RvPZ(7 zN(TW-K5{OnUDq`RIga8Sk&?+2^8wm7GXDF@qCJQfoS0hKvzIqvU zO|kNy_{F9}f6FOttf@-aezm~Mb`#Nw@Rw2KP2pjNqGCxW9ipIVcmOW544@pwB4^C2=TdAEk4JM{()Po zcdH~O;sxnr2H=~m?ku5~9wb*9Fe@cWmW4m>80k%|d7yIS>o>qTBB1h`qghUA+XvHw z4_V7)qn`fdW|S6e%#jecUaf(qy21dCXG2=f8RLN4C__PCo@Ujcz=Ur$L=Uvme-uOt zUjBV^NNzf%KdmjO2K;E^&Iz7kdsBX!pI4+k1ADqL`@J``D$*XL z3Y-jna!#GS-#&Ug+2pz<&!5AQzQNkSE$S4eOreP^Z#p~)TNM-_5sX$6YgLf-M#m8l zDjekPG(yTC_Z05N7L>IHQA&qb*wB)Dx!2TG5^+O{wukkq7Qh#+v_yE{ka%Gx%h_8a zWhRNyew&)jJj;G9Rbb!dQPY`$)L~1JV;>Luq69hJr5}b;>V$yRivMdf!_K&B`fWg4 zsG{4qw%cn0GHi!H3a^)Zw0quJ9w~VV%9^^JFhFWpl8h~VDyA)3@&qKvkS)jNzdc;% zu3rF6tggw0E^rh^71~k{DsacpphTcyO%Kn0F)dLD@;Ky7XEOCtf4j{;>)@{uNmIyT z*pN2)8OFYRLcDAts1no({B*D(qghB{X~{l)r$IQPZnu+8(%J)ETwv?}kKkm;zK1K0smoetb>_XC*kB4DBCL$1V8E2&}fvz7r7-% z%o!46Lc=C`l3Q4e!|yGklj|lGx_6Uw!{o`^<2lI96QTw6NK&Tw1y6{fRM`!23w6O3 zVk4B84hp6e8gVv^gclYusSgzZKJtT%1LX?XvBbEHjjM;YDq60O@<0Olt(YYIy21B_ zn)<*k6W!F3#q%HMIg1^M&v6QVf=W;d`^D8Fbs!`&vTjX?T-D!HQ;X~fws(vTh%a1e z>Cgl&G(A2o>CoOp>xnPgnpg0Y5xv|%N8|4iZ0b+2R$i_j?N;dmj0D@Vi@v{;6EnOJsj zO4&&HoF=#V(%6;m3pWuoQIDT2${)7mf%S(LFqkdac~v=?4ts>p{}IatBJF@Gya}1_ zlI)oK+B1D<)c(ea1OOs}H5?^ep_7Z+MV&t@(5QqSQV8k*O-;%*Gorp#pdRJ*JYyy6HYYbpgwMB(Bo4)?XiCXF@vh*3GOiKx8`y<%aJgdY zlK8R?SoZqAmHkFP)r?xkA@66kTI>&xtTjVR0db&cdTPGFG#KNmPeo zqA%>%QuQkRHnlQ-A?9k0oJ3L(i0ACh_0q$q)+e|ds3H~547KN$evg15Ki((e^Km@( zIQF6Ro6w%!*jT;tXPr+_rZ-Goi4hyghqHK7jDA{C*y=wJKc5myuvt=tGO_dl$3RXT z@p(TX%?=C;df4!CJ?%^Mv3uNC^=iBMd&tkBV4G97v3P6WyFT(s8H@G;v}(dHh6=n6 zpn!hwhA!LSy+tM?Snlz_ao|D`7LTD%5#UbDBy;a9!=6*0|(e9b8A)AI}3Q(7r z3>tUKYI==Wp4l=GsPC+sFk{90w7(iVB<0s7l9)pe2~RRAV}3dO2l>vl`G)AkC3);+ zh*<56lK^E}?P3dkKo}DOh%0Wg6Mitado0~p`u>#+Dv7k#wA1{D4?I)|zGMKIq16FbG$ z2Y*}|eJUA zEE2i^yKnahJK@Tvd?|bgs}UyVei=JnwmOGcOd^Ia2je%*Rp?AX4(G-oNq87)khURwK`;oOMPVf}u>qk~T z;W3x|18CuooGX$k!gCv>7x8%?ojSw336p=DdhPQeaeLCAuucY|b?kCyinok3jmK-%CZ?(lr|zU-0M6!q$SmF8W=POZn_Y>kjq*zar;*^c&j z>(2p9vA>;z(rk$lynJv6-q)hsU)FY&-APFBdv-zBe4Q0(BEDFoUHg;G%C43ODSR&< zbswY@_JvPeLZZ+ zA~~x*u&u9_wRbPX+;hQ@^N=xt5JTm!s6e_=olFdsK9mqNFuvA5C+4;oIO8wqtLSDp ztdN(jUnhLXcW#Eh|F^t)~5}bYGADo1$Cb@YY}(JS=rr0q6`5E zU#kE~{`ae#+%7re^EU8dHsd~Q@|NX28oI$wy%n73 z7Q(kD3x)QcpV0WNHXk=?H|@z=oZ@TT)e@o1dXQl&W55o_BvPuVP}=_E_fcFuJ_gm_ z#)hClhzqFzj+HMB_UXHQe%y>ePe`EIf~p{(qT7_Zr0>eIoznt*J%c1hSG&YlreHj% zPDG)FLEGQ8=)2e<+Oto2FJ+(7cZBJTMal{AE}bj`pVDlQsAb9i84K8NUjd@jDgh6b zkS;=t`wXH^KVAv!J2@GlU|W$0=(<|H;URg2Ox&1{yq1G1T4$(3lPY`>BsrAhArr$s zEKH&)=g>`vL4-XELc@wu^X5MG%&gFg{X077#xJN?0Xt~WwaT{P$3Lqvf&8d4qE6Lk zOeJ{;%yyT5rXM(U^7gHjHgF`yG=x_H;KBe8WC35RtOFs!Z1@$VOV>LsX9jJ*rJ_}%4thYm+bU{2>;6Eda=W`xLVoWGv{Ku2wL_cRw-OL<|nAYfoH1kX4@&UkNQ!?%e~NuQ_EjejEX*uFIx)E(3jh5A8F!IJL3 zUT=O))c`2>;3F{8bHw@$Uv^Cj)L>5PeO;7ChD9=#=DnDdX z#H>$hq9T`KJ=}e8*1iHDVEmnT@o>Plu)HWbd3P6ha`>baCzfC~-HV{S*VY?wz9t4R z=|F#`V^7Blxx zW3iyA%@f#i>wi~E@{wI__s!2v{RR0z!!a?kewBqgx7aTjw+StLh_knQnibWan_d#3 zg#UKG`@kq-v8DrNaA5ZL;v>>IxG!o=al@z$8g427){_nrbt!r_rREBQ) z&Ro%F3DRJTL*vDcl0SF$*<}B>a3wMx_~2G0;h5U8xb58dXUW8%$otLqXA;881y;{* z%l!VEXY$DwrH*B$;M^?fsl1SxOK6WUA968R@@nC?YQUCBGd8NP--d{uk6kP@!au9F zAA6`P4{BmagB_R!1kLO%Z2DV>g^LzXTkd)+%lL)Cb^O>gitg~r`ETh|TfR+lZIbhE z9@S>5QH6=>TlwhsOK9I6o8P?wAGiW2|7W~Tb1K=7qX&6_w|&${uLv}WZ;}XK%ibN9 zMZdWI*LD55RVCnji5GMs9Ch^<4C>ZZ=7Y-^uoKtMZ3E?l`Y3~@V_JQx(El|UmM&W2 z#NPOG>6cbc4`xnzwVZ3UtJ5+sxCrj!D#P0niutzTXI<;DjZ#gm_pJz5L3hAl}g z^`V;Lqafs(MJ-{?h_z{iKbmVi8s}ob5JjdDp1(+Y%lG z{%(#OEi(t1yXQcPy9y@d$hodDa})i^@FzJPgs9qcs6SG`7(FPu?Wq4{U`uBMM@H_A zj!N~=F)~{8_o>8rkq47p{qqfCQ<$1V6jzM?{`RM_)7VM=fs63;gI{{18(-8EW4-#G zJxWP4z{{u?^Fa(?_ecMlopN|gPrP`h?)eXeFiPf$9-O}qP%Q>mRXsvTMa5_&W)OOR z|4vwxtl9^HfT~s0gU51?hAce2#{toBe{11*(U3Kyli0}oXXIH={63hK^)64V)4P@< zExhMU?GVi}At;uafh~jC{)n5AF>b1(B^IH2ZJR>dQd`m*71LuMne*x31BFJNL4z+x zazS;%gQ5nK_eYcvbC&Hozn6o`rYE9)5KdItUxGKApM)WsV)*;%9q98VqhUO$dCdL%LV48>1kzfzc`Z7i@p^ z7of8C3*!&Pk5tXhm&-h}{pQN1YlFU=c;p5@hLOl611t*)7{f1z-)i_=lTech7)u4Q zdzcW=;K?OLOGP}96Trnz@h@i{v#5Rfjo{&@$iyCJiv&erF-+}6+pb}X1#m5oPO!(y z-jS5FTin!jbLt8IWtLO~-8_5{?d1ZElEeMZOg?5!w#=CbnfsPI2x)`)ChAIP{V)jL zCL8JMv)^q$QNG)95t;XV?*x)M`V#|Ua0+y6YVE4^%!n!SY}?rNdiawlaOZz@a)U0z zFgU&CZSVMyBW2r@ix1Al-HgNgUe(uaP%jGXN_#m8emHw{4a^ObHxZbP_6 zMEZF%VbDR|#G^B1#x3j5R8=2^xvH5}$^mff_R zg9;01ZO${%ba-P-o^RBA==Nc3{fau`N+HyGCUU@?6M6b)PKA2-kjMaJ499a$Qh(?8 z%fjiXR>v5m2nou@o?9<$$sJlw1)Yc^K5sY=U!4Y07u+nfK$48+%KZp4x z*{e6R2-k-C<9ez9jltz^@9UO+#3#5Z-Q{y>wh&N4&vN%lEo}=aZ->?y zu1b9dz`x03>a zQUW&34(1+P=HhA%I)-SbRu2}lU+(e*0c>MqMv_@9eJHEzJfk2B$FCwS3km!VM5YoW zrB%VRUvkf>q5*DAaalo62!7D?=bv8MkkvnXp$sA#PHQb~pzb*FXRTL^T;qJIs>vJe zF8;-tf;$E~_V8uqUbVXHT{T@$lXZlib??M`7SbzH`+RF7Xd;81dp6DAoySA!B%MS& zab;0c+q_eRWCW2s1W$WH2l^Nv;w}k?IG6GFOcwM$ncHd-_2K~|=cK=5a~I)kqaZqX+!C!(k0qPqhZDp0Gzw?*qmsbDGfGscBfe*qJG8vCuO? zmyT$+ru)&*!{O^GC;9A_;dz9rrzt>LdPK=6{n%JUoq;UZhql}$*eP zBr2ZJ>%WE^%@HKdHp^VnEHP}ZJEfurnr(bhHduTrnU_N~^*5-*2`O5PyBJ-WcbKBck#`U?`?Zl*ZHblFu_EuL+s`mdOwl zM@En0!+OELAdXIJXeTn%<%MsQStW2X5XouJCH<+xALCRvb5iUO?|sO<#cf7Tpbd$q zLGP!Cq&(xJjuDb#Hd;pI^_R}7%n7tAHD9*=Z{iXzNTu1BWz?MgvD}Y(oyyCHhe3n& zq!pcz7NeF`)$Xd(#ndMX30^ zn9pZE3}==qIIHO`ei_Yo#LD>EAf%0vEGPY9&S0avS)Q%%37#BQ?A0k_doX^dPDKDa zha25P9=JoPOJ8Ma(H@o?^aUfl6Mh)X1HK)kw?JsxKGD~Kj4b}+0cqPE?(|ZnIqg)( z-W)ES6O_lYRbG$G(>5)J_!tsa`(@uY&GkD)ynsNOT{S+_Xd$T$u;JrpdZxfqZqAy- z68l1pIkxbNvFP!Tlg{8UNpKnhM4({ax?=aqfcPCY)vb`)Ls7V6+#dZ*rVAhmS6f!R ziN}q)*jWsMeCigXl~^e zL(;pU%y7a3K1mg$U%{s2YTE21WQk4|k#tpBu#iMt#B{wTVo+q&M!JmEun>H!qM5F6 z59^6a+u`U`O1=R(f}h_x1b)_VU}*oikBw=vyAa3?uaKgSi=m)iYfT*Dc_#6YpPW*y zS9QQ2Lfz*>@Hv!}S(7FS^IA=<_xtG2nd;^(ukAm(;xZZqE(BF}g*VaW_dy?3u(0!EcDB=GYG*>Hw#UNpeRGQ#G}Fxo;I znJFE$JX!o2Gi9&HCw}s?)Aee+L6w%swGzRoaa2n-g+F3$Wo_PB;vaobQNncLn*_yT zm7*c~*a*T+KGo2$Hhr<~U#86x{Cw!d^v5i>eZtUBxeOvn`9$a_^&e0<;wBn9X|{V& zeN+(tUr1Tyts3v|+3O1ALKEED4p(()zl{EQ%;Zx}4~k-OHD{y#sXL%+lH~JENA| z%PlT{H9dmF8BI2}9P2fi=*7I0(byH`r$d+yMb1um)Sc!8+B1hax_ywN)ovAUq^c8z!_w7la~K$>y(6$rLFEdU zM{-EwNsbCjvo3FnNDwhPmTXoNtcT#^H=Nd^^@%jrbcc=(^XV`~M8)cE76*km^_SEU zwL>F*PD{_(_ayO66J-V~?v@5%!O|UUH;A#Z$#xVK>yj4Z z7W4PxF&7P=se@*B;oVck{$CJo+Ck)^G2u3vqc#Gz{jPpPhSl=XjhUA(g@S1U|eEhLQD)K9Lt2;gudr4{)@I2nfn!d;OR z7IC=gNCMGDig460m4n8hKCQcNcO>oUM0Kd$|vPNl(xQpp=$5l!z-gH zS1)y$vP#cE{IesE#pRb`!fDU^A~}nZiE#0QU)a;1+y49?!rnS8%BGF~rdv|!Zj|nB z2`Lqo?rsq21}SM#QX1**?yjY~yBAnsY2FL(+vj+!dwlJbgLQ2i*8TCsb*TvlGj=8-vW(YR|z6SD_NC zWyU!G%o+38ro;9+ysK49UvUVx?Zyo;v(u0qxpMCQ9HRMsdpm|`t*$9^dgBf1@kLE5 zAA6BsK(hL$rXCx;3ZO7?%?I^4n+$0?P=Q&0gu&Fw(>nzUd#I1P;LQ|C|4l7c6W`v5 z8DpBJ1=9iRTbw$$m$9oJwfnAn^=7UMR{aO^TJF6j=I>TNCzfID4k7?j1*a4q6KnQ5 zjo61bnF+2O2GPmXPl2spMhikF2~OfBOMjJ(>HK@dp*f^P<4{Z79-m@%-9yKsYgxU%Lw3{M z3K5WMTVco-Y$3pVJr616>MeC{>4L;LFW*xfbCDc2uEYfcc~I z#V=4b6234fY;~WOg8X>%#z8gVImW1rEI~La)GKG#&^K9LSX;&^*G+yaJ%&kN{>C5S44qY`d3D{N^M5Sw=p2IR5@OtzwzcP9_(@TaWBdZert+)zT_6%9EhiD-%C7`P(L)jxKqw`5ms+FAPuO$z5z!DOL4^9$li0Wt-s zB}CDhf&Vs5h~M;ko8xmwywH~Hn-y2SRv$3YF_NR~V>1tP(>sl{_Ef)x{bdp*Z!hP?&>X@_1Di*` z^C3ox4!iYcwO3;u@?TmfiNb+E3xPm&cXr}fcKYEDbTwtB74%clSDh~EVFq-m2i+ro zXQllz9>!!pbC@G&`;xO#y3y5GdMa^YI6fJ~e%@&xkly!JW?V*|`U!hx+ zTfY$bb#<5R=3$J6wfURFd6P)gvoTx=oVvNlNLCLunU50^)^JK1IWUqVO8@yxobw-| z2=q<}{4;dO!#`qQXjWqUh{c$0t_pu7g$M$Cs>NTYG*L~u&Z9s;N`HiA!tG&2*GS<4 zV+IxH)}RhHd@WK-D*rw&E{VxVjtuo{F8gEq^NaPB$+NN3u<$pxek|tf*htKBqi)A{ z;vZRnM?DeO^_RHG5Zb|kp+dswa}=$#vGC#J1SLk zPZq7pMv1W#>JoOqcfKaK2Upk9xfzJ}?29mz{48M_dM%wTz;mqEqW|}2NNQgLNEIe#$lJdBmQq}S zt}xYu{HSs;fz|Jy91K<0i~JO{d(23uTTRhOCWX(0rHdc+-i)0(F!wvmDtH8@iVV@R zab>2>zbxSf29pzN`haSX_b^`TtlSkCKQ`w=`);++s&BS%5wB;OAdQ}Fpu(++a9A^7 zL!Rq1he*=4X4KlJq}0YR^)1*xl2>**=9og%<9KlAJ5tv<3mSjW z`6uiy);tkZp`8Z33r|YXh%Lx_?ZJ$Vj6225k4f`?)_RobN&P-5xd6Zcwq%MbrFe4J zVw2*K4itqG5*NMqMaIhlCoO3BqBuZIG?=M3j1k!4mNAdbMAit-5kf0YxrjbW*$y;^ zL?JJ%#1MwJ>Io-S>!;pJf8$b~EmqwDt-0+IFUL9bE|HHzvw-Sc3!N4?we4rPkcQo8 zc_iK;SLS%k^t=2bP+hD?s%Aisz-%;OkHo!l(#Mi1?V6~cFXNplJ^+3e>5anpl~Hi} z37W*0vpC~mF^aC^R*=<_RhR9I3gE71WaJ=LXsZ^Jg7}aTc%P>N$D>=nxB2al(k%Um5^JIlBg<^ekT5)Av(>`p5vKCc?u|BN@%q;8Tv5;l>=P$_KTJx1> z?Iw6lQ1JtN6bV)EjnD91yuQXMXBCN0H^qzAPCWd_Z)UN$p~dH|%d>|TMGJLNNHp2E zS0*jjeW(fFWkucBmrJNYOoMH&Cv}>t>HIFxp&4nh+k_wZGw{vxGF@qkfY~=OBY<~J zGCBK0_}9;q6sL86PkTmB4bB1OZN*A*j@sZS%dpMP6^%L=g>5sApIWD)k=_Wtv zPt2kcL5}Hb<}Y5EDQ3ynM*T#Z8W65g`GftpI_7a5qYY$Ob7YNP027E{CVotlJ{`|O ztWsGZw{k|?3K%D*1&c~uac}JIsM;7xUCx0}&Sr4VK8jO)(1rG)3Mc|VrF^5P-1~g0 z#jXXm%ERFDU)XEsT`fM<(^bB#vAc|fB=2Qx$gKl#_3ZC~aPCog0h^U2_LM?AN%A&~=BTbh(O53PoV(t&M7mAkvVA!Vg z2Vl}0rv;=yT7U$IN+)fYcpVVu!|o_UP8kSLRfvZ}(0A(6`MD)Y6z$X`gs%!r7F#M>4S5U=C|(jz53&rK3l+VKyJGAPx1A+|x_1+1l zgQRkxQNNZL)A0}YR7thLWQB5uPrmVX7 zJO?0kA_C;WFSwtG3Nai&ROX4VT7-P!(4PhG3e*JKwF-9E>hYW%spY~DI!g(6+REwA zK08IA8#eBmU8vt~C>va8Ic8;@{BSzlj&)u0JJe1q`MRchZn0%o9g>#7FO##<9x};Y zG8UvgeW}y*<^QJgy*CyMBAKOU71j(lwc(fm<}dCax?7sx`iu1G=Wx#WenaZi`0P}Y z5qvIC+o9UXpOAv}6X|pA5Iw&6<@F0U-cJNFC5;w@5jH<)WzK@V8{)8~)G!<}Mqx*% zmCQn>6&Plm0)0o{9S_uujcuK8Quscpc?&M*3=YhbE1%a){l2>6ZpkSjYnUfX-G*0o zd{$>wkUT>U@VO?F7XJ?l*sm+#pK9)5M%T}~mqRjVmVy0?YBXSJA&qpwr#QtwK2>oo zONp;p4$;#-x77o0$a9S@}zD5YDs{2tT?WS zTD7I;4179nAQGeIXG>cv&qA*9+VOC|x)oC%TeQS@(*6H0?*psS`wf5fd}&rhwK4TF zo(}UPS+U{oH*xJix|4sHC%vOC_QJ!dXg2db{XXlbA@$CdiWJf>YNqLcD%K-20_k}G zWq1TBLXU0>5M{z>n(tTL<;8ur6P9974)EH%e!`Q0nAGd*rz)izG*OOjRFPfn?}k56iNg{aD%aM<_2Y5`G1U{G5xn6gcw zXuCBIxcD8X7;p-c7%rqGZPCn$y}D~TKznt3r_peEA6JTn58c0md|VLFt0p_DO2he; zx&lr_Tyb(4Yrf!V@xCo>wpv++^0z`os?f>TZUmqg9;WTx3h_Yg5L*b__*i=>wd!W1 zna3WlE_;kWNk+S#B%`v2KBf#%XBjvvOE1)eD0eoGvT^a_9}C*4{kdkli~=X2w+xQ} zvlDhoIRALeg+I>qrD)NW5Fd2uGcFFyf;6t++_PF4;NGET8|ix`HeVpGh$_mn72s0a zOXHG{8|mI)`929lg?{d3+(>y8cv`t30(k!oQl<>f8=;?Dm(PDEVGYOPBvp@%y^waz zc4`EwEOj2Qla}m5{HM|Rt;-BMknws%TagO)v@Q}mbT~2((7I}pXmb_zxUAT zncb@`&{av}poakk;GLl$QL%k&K-!fO>zlA})o(ZmqHz~{mr=<5si;7*@)EJ9<%-*F zmD7PLw08Uh%mFkg2AVmb`haRtB=k=5bgWSw2T`BWXpOiRQoGrxa8*0W0pv>D6E+3H z+6>kunH`^>JCixXjH{O;PP2U&nV@vU4as2rhp@$$XCP7fYs}$rlfREcHC)e&wPq}; zu$E;nY!i$W4MaxM*UGr?lm5(S+yztJ z&?W?a{-$@|8(&e;*ZwTF*6JN&Ww*az7_YOmb9D&G(!ROWiZ>#T?Kj?6J$gy3B_tPe z>7ywAag9yDeTQr4^m4Rd3qIAGFD4U?i1yXj6B(0G>8FWw2#l#N+*t2OtBG#F{~uVJ z(R;F%X@ZlAI9|Dfe+VzD|~nWnH4LCf4KC=MV0RclH65D!uMIfbn-;;pWmoCjL&GcO4p7bj)B?-?K{}cHEXey*( zK#%kU1~ws>{8yo8MD(7@t&=V^E&`sM5(Y9F;7I2~WjvPUodSjWaJyq*i~A~TGk(Rs zX8>#mm|Hzfx()LhflgYF;%366Q5X6k$(kat=Xk9!oO^wf!gtp)5>n+uZ@#bC3KGg? z+kOwRNE=K8?>Qu9zm51;!2?t*Leuft3eq`GV{OZ}YW-@HXH^(^puu+6!-3g$y3UCl zcz$Ptr~TLK)&Ge(QOs9T#0IZv7Q9%+IIn}dN=jsfs?$|wE-sRuIz31`Yv~p@O#n*E zt!~f?KW0nwWNr=Yxo6p6t_cpCZiBR=RkDf`(&VrIV5hH@zyRGuKuoFUbBQ#w;#u0u zNg(<-l-nS)cm~qOBknmtAd6wUC-Swjt%DuzJFs4OW2SfWj38>twb}V?&+{mg7Qux* z)!YB&2z99qA_2}vb|6=k39!Ib#tdiDK>+G~|3pGV9p|}WSQUY1$ZtPr`ewbJ%ZIRT7h0$MRc+7^7`{p zYO0-QiOT-~j4C@&D)Aw`>$#3q*bdx`?%)YH;`dJ0JtnOGgTA24h*e^$9qa$&u{^F4 z{^&tb&2iT?Q;>20PHLmNtJ*9W1d!IQtMwP*83g3U!`hpieV@AXEr(hsy_;Lq(xZdx z9;hPR|G)rv^VwYl{~eaM0_@>d{?+MY*mrH61&%K~XRd$tQcC#5{wu`;9LkrM*_wML z^=O6LOD|&dK5T|_M!NeXW$ZpW06iFM{AP6t^On0^Q$_>=)=vHb*BJy^QX{K+1V0Am z9~9{wk%(T>mzu~#lD6}SVhRufzOz#gf&W}s_(Ly$udHc#aOU7PU+8et$c|r58n)O}sPtVeC1QrF2#0ScS%tVCDfw4` z&-0b_O2}T|9INU8!@!ewK6SAu_ASE0Y9ins44K7*wTjllyVr^YO>AT+_V>e3_tp_C z+e=qZb!}n3JFrx_`U|Zvl!9+7ZAf9B^`9s*^Ud3P|O{xUfb<2=eiAFiRwWcr7J$cV9jK&l2S9Uho|F- zl;X=l>X)T^g+4dB{wfl1iLw9a904U%8;PhT#(X|v{E<8GjzPiGvvbyIB#ZYezSR39 znY^*jamjv-WXh=B?HVJB?8x!91RYo=lHgjp^ zKU-#CJNQ?Z2nf5QIimgiTM$r+fC|KZ0JoAwi~BuY_IO|0jE1eQBjm|n>x%OHf3Ns# zqm4E;hj!3bm-S|I-K$j5fjY`oAwsZhIXGU| z?$_hbWjj_C0jd>YXL%(T1CED)O=o>GpPpDbwc-f9><@@qVgt8@=vUFWFERhUwbyew z3AjQ9Gv#re2d&n4xhBBwp6tQuMZj|1q-WA`acR8{^;imEa$~HnU8Nr}+&4T`uzVh6 zX@-k!{9e!kD;t=6n(SYN7Wnyw-EG89C_WAoZ+D&7hdz1Dlk2!sVFw_5dMbWkkkt9) z(b_^O@pVaVtO83f48-2w%3qSmSqe^~pNoj&^3oebdNThMxOqMhi6Dz@E=>WHKi|t)A!MPvxc|n8>myxgfOt zy$7hhK9aK^Z>HvAs;+-o0+Pg)hW>`ZTY{{&HU;XfWnX{RSn*}~T$Ga{{0oPN7Os6|w^3n!5ylss&{b|J$e`NG~;P(>pi?7&zSrl++RNo@&pVsM{ zScmC!!GDXY`)b{5Bg=9q@FnuAt9hP^tJ4vrS;}tpXqt*ldErync=Rd_n1uQP6bd z3yLxdPP&ADt#W?EGJC*GQpM33ZU7yRAHhgto%E#+Le87ABw60v#JJC+` zGhEJQOjK%JZDF6|0H-~U6M>zLy#9TM*X~ZX0MZNPJVfFG#$}WP)35nRXkW3_5}%gW zKKsC1D_#+`Q4rp1K^e3tlrH^9#G^3~*_uRXy3Iyydu#e~P)n{F@x_pYZ%>1!obwQp zIg6N#ktYIb?#T6H(o+MjS$bj$3=E&siY__)a_^Z~U~dOBr_G{jD20H4@vDl?0K|xr zV;iaJm7acsqhH+M)OXWMGT$bDbwhbt7o!)*6iSt5&+2~mR1wh?iH$4j*6`R-#=Hnq ziC!Z$=hy5WAet~A2iioUnsY@{6KGQskl^vJn6SNf2Nx_-#4u1Pf+8ur&j!W6i+*F? zo*?fyk_F3bvbIbG-_l6?ym$K!kTYPbr8tJg=?(cWyM^Wm+7lOKs%KKFPG1|eJKb3? zb9bKbG|4Uk@ddDeO!y;T?lx3iImF)GaHUn#N>e<(|IrBi5Kz!?eE%qBfu}&y#z=`R zAIV3D*;+!Cbd7XFB~9&3*WP39{_3Ic{=MXS%HkQvG^lF3C$w8$*3K-iKi*SNNfHC1 zG#RTx@+_a$wc8vc4Si2q;p(iDElFFY8-|(~N6X5cZAI)-bm!2Kf5*Npfc)Yj!9ZqY z+2g2sW{#r->Rwu%)7=@qi!?7p<#;arigUtn4$}WlIc9YLA*7z|XF?Fo;SuP>JPkz3 zUbyQ#G8=Wp1f1n0%{tg75R^%e7uFgMqY7dz@VW={GeuQos<&DZ(Qf^G_k1D5Yev8{ z{sl*6VdQ>i?9bPfG+%*3zR~s0f>l~gE%$8{8@~7{#7V_w+8Q)9Qu4Oij@&{Cm&ByU z&!kH9MBd-sighcawT2?s#jpQR;~#~clTd_BFi2J`&LUurMK^suWD+YIB*Es~7@*Wm zce3S&V_F-XsV@mqF~QLK5;aSG3H-ipnXmliX2Op+eB-SE4)WQA5bfM9!}}s zoSJpnld>=?MO(7vDySmfjy9d+$EB~Iy}5H{eEkDQ;+yL2%9@fa zTvWUk9FovNKZa?Ex0#5Ca!-YRs2RS5ODFG3k|90e_jeJPcj43wX#_IKh z3EA7tgz(E`Ww^k3HoRV>u!pA=?zv&9p!DUs+x%Cawm?;T z8I-(oq!j8!y0mrgr!Id~J?ynETG(Z!yA6G9J0=l3*ctV&T1*~N{> z&v%~80&#A4i3%0wr4?UyC(t5R;b4f2741;j$$76rUF4vnjFrx7nr|;HY1Q zO_I0{kx;#s?U{&}dl#vy)isO-WBltuyVDbsKdq5CFuy?4OcPR_Nb7uvSju) zBNwSCO~17|syJ>p&Gd=E#3&vGE9&{U)CtbZ#C0sB5J^P!)H-3dUBgC=dA3;v~2#=${t_LDhmjKoga(QO+Ag>sW0Q&~9Ua2ct*o8fO8f`LUe z!R^~Z8Ki61fsv$FdZKC7 z7W}Yey=-Q*;C#b&(Jgoep|m@~H`urc+{$a?BZ8f6fJRy6W;Zxbi(O``>psdgf9 zNVqD6NWeCQ*Y8DWnhEyM9+Hgj>X6sS9#YR2gh#8~9u6MC@Aej_sES?A@l zuq5zc%v*@r^Wzo%EC-tzk`d_e4CM?REjJy2ghI4p9BCR&qP+uGO4Ksq*dMc)ml5@&H2^~w{8Kc*eT){ zF=!+EMTPzijED1$+!1uz&Hs28;rJ3$CVNTw>{?V5a=YRrWT(b6N*uc-W<>SCYPy*IS}A`_F5wC-$~ zz>4j)Jry4T5EmJ8KmQfJN)_+PLTVPb*VF+THp~}2(#*X=UGD|Q9}Jo#eZb#AUr0BB zuT!LNlBlSg;zrxEsr*dxN#%YBM3WsbT)M%h)^&{`ViS?#2v@I*{vmMwqjTFUmdU$c z)549HT~?}YU*vP4MY1{}aJfB|-!vopG*up=rJ7pV zkY;=Y6sf6qtKV?RdA4b>;W%KLHu@Ed-}P%=-AW+IiiADr@2}n2q%gR4^m6AST08pnnfy)?!nUOMrA<}R482NioQ=ToFW%@!LUdqLGT?NE#amghNH&A(-@BMfd25hF6CNb-BX*Qzi9mh z^RtA#=(f9CLyMy(5qo^UnT|lsEa1pFT30Dqnd1+uNiRn~%3idSXTB%6RWGEBTU_UC z*e}QzO_0{rSmi-mjNf{%ji1yI99G)$@Jj1pBkDsMilJ|J@X96WR;`Hab^ppzCtj@? zV%otMfjp$|~R5g!vhE@ZIC?bjl_i3~G zj)ZbV!{`(rN1XtwLHv*%)A)DXj%^iWhR^fE!ulgF7IisZt}3HGMAWttSn7G*t39lp z+D!HWHL}m^%bDaTfgQJT->hNNnhS}wiIIAzwYTb^S=4jzDXrI5QqXg`AGXIHyaw(l zEiDOz;((FHylt4jZ+`mm0*?=^lH`>3-|8)Jl~!)oo+ZCar}P7MPzPQJN0ygRNs;ch zG!nOc3H4*!rw0MA^&_=M2iFdG1Q;?Y;DiCf^=jomcYU&c51*SsH(fEDF7HdKiY>7R zS1H@5yuUa6+C0F9xq=OCntx6U^sG+>DZ2zZmo1m(-X6~-sIAg^*c~qB4(rCk%GGv4 zDFsNR)CmpupVG*wTL~_3l^o#HE%&o`b}4<^q==p9`Pj3d=Nxg+VD-}<;h)msP6Pea zMuV-bHD@sBV&Zm2tdjq06=pT~fwYC{GVDw9@ zFOD-VwkDsx93~7B+2MCqzxmJavf4n!WtLZ5>+ta&ZcV%X{$wfJcAfzrUGDA?CXa7E zPfV5g{##H=qi48_?h~{XhU?dzYR#Uf@e=NA_lb{J5K62rWeP}ha_c@BglDD#6&)8t z_i9l315=&j|DQT6+_c0%QHg2_j3r=0@Om%`W%8t<_E&rGUJfx*S&r$yWNW-yIPpRJ`027Z zRAL3{p1z0lx2|lX!Z8KqqS^O^6oDJ$REl_>eN5{u56&Id-)5=h6gk5u^$`%m`PjVu zkDUS68L$X&zT9>65rv4_e!D^ zD>st-ZNXRJwTMo-lYDkLl*gDO4@ae**E2DR$hXK1^;de2{r+`A3A{{oOlP%GRN@XI zZ~xm;Wm(scHg9lOuD6vYFTLC6N*@K+udZ8l*0cODkkpNZs|wU(x$n-Az&%3_*kcKNYLH%4O|^UbK*>S3>sU$vh&lf?$J)!0IX>X% zdfq2*d3w%jf%o?;fe&*3!D`|rp;8tpWwY7M6UHoo#NRjdM) zs>&xf)i5c(ZuDSm6xj&E!WK^e*1tw}{QUh80OO@pv{DzCw=;8+4u|;X!p}Oy>0>Qn zG*a!UX+VF9!&OY-H1*EwoOR%vu&7D;*of}7>Ms(K%m!VZ+T}Zzhu)ORYlCr}58e(5 zD;MM>6BlA~iUvn1m3DnP7H;3I1 zcdwWon;Bx~PRF^P_eRxQit@DTN??W&dQ-pRMvN>793I4Cr}+w^{48R=P#+<};Ac(} z6~D>(jKBJkY}vYTSCE0e(w6}ug{LF@^vM_6x??8+Z6}5}#H~Q%pmgu};>y$kl}yPq zPl-LdO`gU83F^d;cZ3kB6KFCNDyDhs{>#oS3T|eGrCuLVVS=@BUSi+KP6^)Zn8XbP z1T*GIxD75k($e(H;#ny=Bj(~CUWSD^p3ZoI3ktVSHoGNUP8#7o>g5mubl;zqWaXlg-V7*8dKx!) zSROg1gYuRW6+T7Jt@K%4rU#>yaCsdTJ7TMr`7=n(_KP}Q8jkv9JcV*x<{PJHl>XEy z7aw>rq7UD#I4_sX%b1wO^?J}yQ*$PjG+1J$s+c&;Z8^=03>=(3oKsFsA+xkX%L;Eo zZfD-X;mssz**)N6DJ8c{O_*vQ6=+ui!GnFyF@f+UXHmX})Z}y;q+p9oneAQxl$#Sh z%l(Gxeu>-2NT*?|@+y$nkD&heVvGx=AF3f_g*r6TXPF>4oCt|gj6nD5=LnVX+_{h7 zP6;=WV26d9cU!=~c8y#$E2|=1E)ncleh7~?mJA8$d#0Zr(}hIy!nJBco>#eu*~e)6;(J3QTpVn{uyp3Yz;Ifzu+ znsBofIY)A8}-BmT=mO*vLZ{e6aKRjJ6zyl>}BQ$6OBB3DKh zKFTI&Mz@_JnV~hfSb6|++3L}wCOrwbUXq}`)5Hhc?C%t{L|LmNLqUjD2~H#eP90p; z%T2Y3DXT5P?~t|0v>%xcL?fDu~PT0NAl62&rWkHBkq5LwZ< z{^9?NsZiDFU{|U`-}6P406QT!R$`h4lO@&Iv5NxnNv0*ABOhzF>jsjks}djMa;mUl zg9JFlBh@I8%)Q2LRmV}}D{wq(IHfQ2{wZwPcVq|Yq>=WLy4R5S`7KA{i-BIOlAnKW zi&V&@Yd9z^qlUud< zpS_Tg&8bW^kFI0HXG^vzQ)%5*c3pIrmmH$@4T($+Q`*uJ~)CGx5JTY=VMmVm;wT@3KxJ6 z0)59$Jsfv_#E`XKX{R!$86s#j3HB9pXcV#Z+xwVZx_@U*nXnD6Y`#CRos}_xN7&a- z6ZD8lsG4ZfnOfc7z0uNJ{QyP`sb2z%_{NXC<_$>gQEFLmMy~gNwP4^0DEW~FEc|`@e!@}d!0^*9>BF8bKRUQeiDbjSN zeQslhUVe7|hMVA{$BdD>^}J3d4Wg4Wg0M|67ee&=nA~wM*Q{Qs*aFJ_>W11(8UFk< zaf7-aS}$Zgai%IS>gLZ2M9ld8`lT`MP6bf7{zP8GqKhQ&#z&lUbCR%MP9Y#VGr^Jy zxmQ(RGP(N7$hk_r7ICrrnpR|n`teG@l<5yyq+%35A$p+--Lb5+yesS5`Uv4Y63%YG3N9oNdy>o^yuC-}7! z;28;2NMOMI2)G)8ur!9cSbWHfQ}1_9DmQj_!yCSy8DClH~uFaSh?4m^S!*bVu!6h1-KroJECj*ChRMfcineQu?h~UfXhm;Gp?RQ|p`<@d% zF<1G@ummEHZw)=Lrbx4E;)w{K1)d1&`51oOhmMA$N5yqnyLXR)x9V@&-;fi{*ph?} z4JQwA%CbdwV~|+CTwbj&TSKsVs2~_$^7G%oEPebip+LACDez+LHKA2{dR7pM2dT({ zLb$d6(;(_Dty>j{(?n^80mZIIQW{jG%&`ek9Z^>Cb-Thd94$0*a}S}+9g3ok%pZ$U zWI5wf6M1m{P7-;d!9W^SpK?vhK8#dtbHvWS+zq#6MO4JIP-e5k3s*w7;KO^h6A|_~ zg4@FdKOzvNmzeIdWqG2CDW;tu+O)<@Omu!h?q`~Vk8d}w3KoalbM1WSXuYU({oE<$ zDJ$_q0DXI_)&wVBNI8iH{SkvvzdCNkerU+o=Gp$NRbz9&~7P!;?9_&f)(mKyfHac)sx zhbKKA9vM{LXZmHl($N|q{m+IoN?WjGd^4S`ns2>0mAfsRq+Y9<(|JGy(}}uh6EH0Z+Ho4BG`e{m=`$`H zULUdnfM$ErHU15ygUjWJ^pwk3-CS2OyA=4MtP8)cmG1Ce*vms}7oTYjP--mfvM8xi9Vd|2)Lj#8ugDU=q;b@*u5WBt z0KFwmdo8~Q`@N`YIFEW7;Jh`d zqM$9E$sZSHH#V-S?mm1k)D*@S83H=w*rkfbcJ%_hw8216#mjbXXA0H)qJ3*&?=8wv|x6x+HDj5xT zZ?@5cbt`8u(eMgQx{fiZXVCSu@&l`t5AeU$jkkH(g}O$Zde@LlGJ$nCyTqEgsHtfP zwJ4G1t|`pBS`JX8;#jaj!>n26+rB13(k?I^4b6rh+EQ@uNbG!6N}d_~l(+9CC1JDk zjD!NhD}eSjJOXFx!8uJvSK4t3>5lWa$T4En@VwnaIg&fmc5nk8i3-5cz12T*N!{5;hFjQQs0+Brr(!GU`6mhg{1vU&7tj)C z7W%#r9b{G`WO$s@=z8PVgi&oIkf}zNv@YX@O7f1zV`{u!B1%X?5ET>LdmK@%@WP zPI4ZWFIbpe{{25r%&UKx;uGzF{mU|NaAN=RIBGb?KZNp$9nk-!D$)r5!6(v+e+gd* z%74&fNP=xroW?isN1*#o+ft- zOeRrySUpItO6z93-lr3}j-Mro{{XPQ3$`ME1Z>&0f%lIRzAg0Ac8ije5G&WWe*dtd zde<}2MX8Tud<>e8Z+#ObJp{X9{30+ZL|X`G|xW^53qk%(vSbhg~_OeOr^(Qck} zKzz3M(riukADQW1SyrLDmy1234Mqz1qzy&Jr)Kbb8x{(PvRLbS`x4RYn+bQGu0JbM zK>ib#OcX5uk>^UqFOW@E|7}xx306)?b=h)}YRCm|liYawb9Y`=T8`(4&Xd@u{+%0H zN>l|NcAa6g0^6K-($iZ6^aj}}wS|%F)mI$b!CNZ?Sr$7-1^A5W?c-IW@!pn?LQQ*e ztEb#Ro{++K9RG28-GvbwZY8GG{yQrwO|RnCL2BxmFxLHosL%1Tvdgcqv40M% zuWN^wcre#@n{2wrzgHVx>kkV!SOqatgUxxSoa*2ab({|Ol}#PW;SkpK5|B_?Ik*wt zwcu0ACG@fl>a9_%>>8W7rTg4B2vu~BjOahw9^SX{KW0qcxg#dq6uQ<@((25h@+Q7! z!sO*UR~GlGRIe5Jl41yUR$_JyTJw*7VJDZkfhqU}_}P-r9NAvIrCxs?nNo%k7Z+U8 zd9=io8uv(OCH3j%S!Qd@%%Rlg4}$MRU3)W{s{oO^BQdY4Jm|xY?$Vit*BSnmtRs_H z_^3Nv(qKU&^U#|K^gsb3%W34<4L9jqP;%#w6b_I3IKQw_Cn(z!8}v?Q2g`CypS{!a z87Yi&;cq_Q5l%~zG@M`zJa?H0A9k$b_cll{#Zmm~XuLC=;Z{g?yR?=h;_x%utUMH+ z6dY__{l_yDqy1zWIX<@%ULFhXxY?WHyq?ypR267CVAL5hZZhysd~LGP@~Ml7IRHVG zLcKd~fr@VJQ)a4H405x|E_!D4m2rhYmmg-|<(pT~pE#pH#R)JQUWGDmfNqE2nH+cL zT-lJdC-8Nt3=2)>{bgS^Itc~{c%&L#igmw>hjnO{tgN|OyOd|Aa_Vh(nlu&F70@dj$XZ7L*n1Ih-$8`y)9*J&k& zUS`6_M?6#Q?n4@2@&#Czg(0o%d~~C2BihzKfN$uF>(1$iky))>B+Bm^0ja}B%wZOKV{laUAzdHUEk%V(3AzON&2tx|A zHm3r)p?0RP>Y&nNH{SwC$Hwg;{Q+Qg1M2z*Mo}i&^OY@6!`g3)IA?)5abV*i+uY(K zp^E#a1($QPs$V-ro#)Jhj16hL_M$Tk?}olPjJl6&*nvM?`gpNBLGsk9A~aIjf*A&d z)+}WgZCZ0JNj!dmOz)MMp*9Qk!$rWZ`X5fxAc`8znORQsCqeqQ;$p;%CivV{sAY*1i%#2750g# z3>@cCb!16-N18bA&b9ct+&(cAwUAlMEQ?#DAYgluE=6Q}1!hLm-gdRC+#nCHmE5du zPP)!r=9w?d#yU66&vTpBaf~gz!Pq}as7d&b-vy}&orAZ>rgrpGAzyVd`QI^reK?#&|cL5`v8W1aw$DiDLNnR8lh-WAE%u?7IdO?S}xgzI~l=ESwPq8gZY3#>y!F-r{UEMwDN6JWa@iH*nU$!&jsp$JK}9R(kFPn#8)fzpTX$((Dn zFp=CJ;U_zr8Wv!q;!EG!i%T0zJ{xtd3(niLHuO_ZBZAeL{7A9sX_?N08lG+k!Iy zJH)lQ`%1Vunv66vr&G8zE6_~!eZs;1+f-*Kf4qsxJJ!^h#ZCQp78#A5@w$DOkq&Ja zQS|_5;e$syg}(pgzjY_Qy{(ipJw|c|30I)*-g4Bp5*cp6%#ByiF*fFKA?Nm)J1AJG zR5DFY^!u^iC|d(?g^+*1%=8+n3%%4I4pZeIexGJ2W}4M6*zhN}j*KkGyfdt|=^Y91 zo$Oy5br%#Tyr!qRb+VRO}$7mf)-| =x!R={SufGDh5C31i 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 literal 0 HcmV?d00001 diff --git a/figures/importProject.png b/figures/importProject.png new file mode 100644 index 0000000000000000000000000000000000000000..f91ca8b18fc53e0083d810da6bd41a32dfa821a8 GIT binary patch literal 24539 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 literal 0 HcmV?d00001 diff --git a/figures/screenshot-20210521-110433.png b/figures/screenshot-20210521-110433.png new file mode 100644 index 0000000000000000000000000000000000000000..88bee3c36a129322c1b5f969ed57258448905801 GIT binary patch literal 71270 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 YCnc^m_0dsH5Dcrr6P3q#($8M~FQ#a_-v9sr literal 0 HcmV?d00001 diff --git a/figures/screenshot-20210521-111223.png b/figures/screenshot-20210521-111223.png new file mode 100644 index 0000000000000000000000000000000000000000..789bedaf0cea86dce379c07770e03538e9523258 GIT binary patch literal 25883 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 A)Bpeg literal 0 HcmV?d00001 diff --git a/figures/signature_1.png b/figures/signature_1.png new file mode 100644 index 0000000000000000000000000000000000000000..42aeb4501069525d9d25636b70ce23389ce0d9ef GIT binary patch literal 20463 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 literal 0 HcmV?d00001 diff --git a/figures/signature_2.png b/figures/signature_2.png new file mode 100644 index 0000000000000000000000000000000000000000..941a90d87ef88bd30a953175610eb416a5441bdf GIT binary patch literal 37697 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 W-Dzi9Gkn+-CCDenoB3Gn)&BvStV)6a literal 0 HcmV?d00001 diff --git a/figures/signature_3.png b/figures/signature_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a29b6487d7cc62c9528df3ac57dace766925e574 GIT binary patch literal 73718 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

    83||C~ajwez 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 f*WJPx%5lKWrR9Fe^)=!8{aTLJudB&dPro@BX?y zJ$2L_s5`JsJJ4#ida(m*irhk@$mGHXe*>@hy<0dmBsET zZ>P@okJXD^pz7m!Lb1_(#E8c?jI~t@%)ee+A?xL@6Yk&{4&WN8J#yEgtx!}Y^#@ai zPx%I!Q!9R9Fe^mc2?tK@f$FKWz+(3R;9Tu@N-Ah&C~mg^Fn56Zkw9K0*Qt+8D4g zPY^9E?6lBAA*ij$^*dp6LBgHg+-T(;IBb%cIeT`pyR#!BnPnBoD)7%LkW0JXD2nFE zT?QHpj^~~68QkP@IgJC`z=9A`W|nPG0ugux5+a)fGeEo#;0$5+jKLNx2qB}e?tu-^ z0Zq_m!VkvSh|BY(0%~9iT!RL2UyNQ066C}j!L|ghz&R6qTI}RZ;NJpOa0iYfbbR`}y+C$bq1 z$MHhQP!-Ze*SqwL>4IHvM2a)fd=*Me{40k~kg8*@Xh31=d1l3Zg47^qI2mdOLz&~4 zh2+U1@(I$(P<( zO}W$H)JI@eNXe{7@0n{*Wu>c(1DVU&B&p@N%zTwH#2N(Y;dRIabBq^|`<@@-R%Ikc z&yPCrTF`q)EC?B6&;xB9bbxx3o~l1?apLm)t_`d`qra&I>csut0}aC1m{3m$b?qWh zpHn+{1F{0p(bhsA!D-0fL|kma6^b+52ZX67sZna|U7ou1bc${fVxA^qGRrEERUoT? aD)0?K__MBNK$80a0000Px$6G=otR9Fe^R=W|xFbuW%6;J~u%#s-xA#2bu2aLc39J{0@H7S53JRNqEvn50B zXd>SUCDzlkcyaNJ(WMHg0s~XPrvBfyZRfy_Qt=&JW38<^d%;(6APllWXO36}8PYdz zfSxc|!L_6ebO6B&aYej1GNv{`Eu(%6v}bUJfYIeX(;9#?h%QlJLIGTa+95B%b&s`3 zcf!}7F@i7l9}YX_di;SL=C3s!NRnF>QiUW1q`KZARY+1ms_PxZ>iv4$mwOsWN3c1AyeW&l$;kr-K03iEpRzviRiORG#@cg!I6jq`DSu@ rcxKI&#|CmODHG_?Emc4j7={9GW6?QCLH8B200000NkvXXu0mjfu_B4n diff --git a/product/navigationBar/src/main/ets/default/common/image_mdpi/ic_navigation_back.png b/product/navigationBar/src/main/ets/default/common/image_mdpi/ic_navigation_back.png deleted file mode 100644 index 4da0066ca60ba5ca5d62c9c697b105b69f930d46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 409 zcmV;K0cQS*P)Px$Q%OWYR7ef&l%Y>TQ51)H!b}tg6bo3WCP*Y85DX@Rn@uufY;H=R5C}kHGx&cn z2)Y?;M#v@uHk$!1-(l}&pp52<=i_Wkz*We2aGXsC_>urN1XU2 zwH%^(axJ)k8sAl&m?mOdN9c_8TS&mbahxyKy3FJ73;!aN0U{2S1-OPcct(8AC}BYI z)(A8}JVoUloI(%bZ>y5Bs2U(FeJw!+hVY8`f^nm;8n~yvN9hkb2>)!Py0+PBK)wo} z2#?nGZZ%b(7iwYKp;($?84$ zzJOJ^Px$UP(kjR7ef&l)F&_F%X7*_6(sPlwbmr;{+<800>MD6;KC_KmqOnlbgUU!4E=` zk&z0f9#Zx&~)p zYe9RA3os?oyXk&55V#E{;0as-?O-RGn@%=yI?h%+n&Ts*s*MV^E)ZuDC8U%%jDV_3 z26w)2ltkQfr}M|QzwqYj`3wDZJ@-ueQ#c=Jo`HM<2@+6=daWNi3)pGJ8>XT8?y-Ud zSalS)rN>awjJsias><HVpD|pByG21=789wtMdQO3J2iyT&qD#Jklsj-o_AbP4p>Wh+0JK+z<&19#3>u^;-)JbwRM2fhFUOs&a?d*rzQ O0000p|QSiQtDM(hZq=s)&H#V@1^KJ+#` z@^Ro6TXcH!0&a(&3e(>+X6@*5mUESOkvt(eCXi*Jj9O096%pyJ4G9^2Y!^8=lwvF; zL$*mc7Hb?#V9+vPd&GZ3A5}T6vSM2oI~~?#Vc07m=d#LW S!BLPx%>`6pHRA>e5m`z9(Q5c4uex-#$lob^eNKmV+m9)qRX;ET9NG&wpG zQmDh97=KQ6CNBXnzYK@!dPCXiOKLCXN6OpI ziqilXpN+E?XaybnC-h+aHPwrp1;G3&93BK!=^5O@{IBUPPcOLxV0fNs z#@|uBD^~!_H{einU2{H#$Iyp)Et7?)ssI?T#oaDw2CX(<;3~#HQVW%J0L*JWSJ$<^ zPr*aDhxy;s!etcz^LucpRYv**>iW?1R-l*60WiM>k1{_Aci|D{|4@S}a{yd!Dm&Gk z zVg)s*G6#@LLfoKSgdeaPItkGVHrEonxsz1@ot6-9C?$9bx_R3PU4&ReEnL!^h&R{%LA#3bBdcov3WF&rbr z0nqcWSLF_1+!5k4<1^3)x-Z%cB|>bVdXuvNa!80NxX-W~KEOgaLWmBiW9(c`0~mLN z_{vxpcrWPLK(`?$3DHD#DlY-#kPs>8$FBtXSBkEOLxeaAx)paKZvl)uLJY$Nwl9O8 zkM%sEYhx>Diq(UpA4h8?)_dgG0mHfu_JX;yHAfpDq^6v;3JqY~5kxCf8!UzQaD@O> w{RP-JoCp%6f#DLzGsh0Z4#W<`4!G{XUm+9MjiItTMgRZ+07*qoM6N<$g0A9ZCjbBd diff --git a/product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_home.png b/product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_home.png deleted file mode 100644 index 7b6fde4f366d85a1cef4e143380349cc2eaa6f90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 955 zcmV;s14R6ZP)Px&bxA})RA>e5n9picK@`Rl6+uzd_y^sk3q`?};uAF0U3De;3Q`xY^$B$C!atAD zg5B9oi=+==TVfaLM!Hg3Ezyb#QRDAR&d>()=S=R6BFusB&b`x_@0|19$=o?D6p|$c zk^)JAq(D;OKUScackGQuV-K7s!4YuO`0KQv!Dg{o{AGQ)G`S@};1`ML5*P!AyF|B5 ze+?{?$Xb^%QQesnAn>zzybeZodEVmw6Oi&Uy@}(XqzAKiv~wi#HgpWq4xE53l^Zyn zG{;&ZRj@)(@2#(`Va^#k#z6&WiOH&9mN`H55NiV^Kp+QjbPHSnKfpX#Ac*g@eU171 z8FU3qfqmdLc*^{5v{4qFfGK|mFADw(c!XmuhiHRqgh|stZ$n8ujC~W@F=9>2CIo+f z(BS3N=04z7%kMn638E}20Tj~@R%>3%M#}5Qn#qjgF(l%gz{j~5!l(ow)@~!4&!T*b zV&`gH&#fo;*cs5{&Yb|tXrI@b)$3m9!8z!k7LB`%uTd|FI{^swk&;zW%(dIJhWoC@ z`NBpAUwtRL5T>la&}I6+@Af7Tly|9; zF|Dw4g3q3G-UPyH)scAEcETJ4pFRC~6WD}h88>fEm%nTnCT?J|Vg zB-VkuUUny7(au>rgH z;p0sVVN?P}JWH$cPfO`;mN#L_-!m=+J_Dkx7&Y1ka`( z2~2`(K*}rlC(IvyQIDgh5yW0@RKrd*J6eT~&hx7TqEqD`#vJYQ+A6i%=m#rX0yE6{ zd;eBxy0r^IsfJYj`lj#fl3cLhs1n=H$I+3X_w*-O%64Az>VnnKkWm4x}Z)1a?^;J)n6i5mr1(E_u dfuw*G_zgI<-ZRoj=41c>002ovPDHLkV1ik+zZL)h diff --git a/product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_recent.png b/product/navigationBar/src/main/ets/default/common/image_xhdpi/ic_navigation_recent.png deleted file mode 100644 index 70544ed52097a4737d285e6286059b153f637922..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 411 zcmV;M0c8G(P)Px$RY^oaRA>e5m@#ewK@3G%M5@q0ns9;?OAm*E8=xG9E0DXu1&G)^0HjH(K$A$z zw=_s5&DheetVn;P(HO1$Z9h}F*W)1p5+DH*AORAHBT#r#H%&7}%nRWJb;@Vynkhy7uVHTpfnuf$y-S8bhy zxd8~v-$uy4Lwt?5^@GA+Au3HsuB|0O-{O>fhUq;yV!W=$Ke@8;o(8gF5e{r1g1XMh z31}J-HYX54UFYNkG>r(G6NsR$b8-TjMug1?L{Qf`IRQ;0!sY}bsOy}b34EtO*&cLt zCQ0~~E1So&m8hZigIi*Iu)^ELT4f4d*$q{=rsG{~&7ms0Ay4C`LXwjd|Aw`VX{91D zt_CCk^q=s^-lpx<;su%q6#t2rhXhD~1W14cNZ?-(xB|QwHB#EMI*9-P002ovPDHLk FV1m`7t^oi5 diff --git a/product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_back.png b/product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_back.png deleted file mode 100644 index 423faea5ed269c070423f59cfe1efcc98eb8e766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1292 zcmV+n1@roeP)Px(#z{m$RCodHnp=ofRT#%-RPvH#YND2qj*y@smZ&%+!Vp0U4AxyI{QOFCCiZh@vJ_ueC3vU=w~}F zW zj`xhl4Mk6&VdxU_Wzj;0r)QK{zllYa-Cznyw+Vc~!P)01xBKr@hH zvtJ1|1LhYi6yXa61e}pHt#6GMerEp=>_guJr^|{(`9c5zM)ONEdJVbr#szZCHNWA5 zu-pLwM^`3Yp>(A((;8+MY6s2(D~8~60|XeYWm?d*RO4sJw*ux`svbm|3n1WV6}$jF z<8-Z6@D9KnacaSZH3bA1E!^g!$*In@P1pvUTd8_*Y0UruM^FUEUETgc{xx8Z1xKRF zfV=|&OtsBrCu7(SoI6#<5@gvMAi(HytqE8YaUZ8!Z7wwlpLS}c3B3RUPPNTtJ0x}i z$K70(295@r84z&Ba-1bdw?ECU5NN@t+o7elOn`thi0&67gQG>>4`>f?3fWxp*TdXcoTncK%r2!mNNUIwP6O zoHWA8yG584PzMz3DS{^K6+mi6S?9K3;AR5EoTDB1=Sa6JWV$0b6MXT1=MGyZ}$#g2nB$$Ady`JTSM+KweXj@hbueIPOVWxaq>g!#Tu)9WCUu>b%K&SWeNxWmf(K;n z0ZJg|qo=Hv^7fdK&k0000Px)SV=@dRCodHnoVz2RTPF><44p%i;0LyLn=A|2DT0VpiT@Ezz_Za#+h^d1v)j3 zG{!jvlE%a^1Ac+rk^mZ`poAD8q3uA3pY?g|SVIZC)28ynN)--}M6@?|CK zjjmzuO-@d(s&EuCbb=sdhKkOkbLjq-mA=J!E9d~Sz5&F zkQt}d<-HRGF)xDTHT0z&5dB8kO;lYe6nCr3?ZKZ#A4Rvzw-lU%DB0emH-aGM5m3K@ zzOoJdLyoVYY5`ZN;LqFs|JxyPo}l0`I*+OqK8dr#b&sbP@Gdb)Dl+i2DFrREiTsC7uQ0JLq$URITMS6}WF@$u2pb z;o_6%f(5yY{}DN4i%C&}nwIk(=$xF-0sTcW#1@ErM>#xZMIz?|@+GxUi?ihxBM7h> zbJTJUH_?B=eg@df&2cY=yc(NMp^rBSzQTS;-Xdd?Dpg7}AO|^$**iH(0uk!IpUQ9K zAok5T$hAcX;x1|`_t{F_s@Im|6(^S#k;_)L2&SEu6?RHHw+KO`(mE$ZtKDA4oJg>f zCFgm{zqJ2eH$U0UCWt$wwMpD9P35PP(d1vaLGA z#nvAYw5tV!R?|K~IL5BwCUObV_!BY+XAG=nwGhV`Wvy*8K{VZIvPARMz<9NF*8Wet zMv7mXG&5k;qe+q^6GXPXmhmP{`(K~R?cCm7uxJ&3!xA}GE8gABAxJGKWG$RAvYOFC z9BY)dvN;4zS%z^WXx;ERRx94!tpx4DQ4T@7g#Lg0okLKOCfp;9-mM&Krvf2mZm2wEf_U^UIZi~1WpeGS&jZU_0)t<-X&9$MYMPrhQC2N9UKWdzV7 zM;|dbNg6Dd0It<{wva=!l?G%Vb3~3lf4P&LzycH}NU@uiqz|YLS}wiV*EppQs2*5( zYnQmO*3wiSvz4w_xB9qb%TZ8CF9aztmC^X7yS%7l6K(2UM)jC-jY{bS`#%bC^h|XK z)u1npMIi29a*1EH&fhl=%l`I8P{5>u+PBw-1P7wbthQ#f`=GA3-slE)8l7tF3)pz@ z#N85Ir;j*`%vM`bw>iBN6!{=(0bc{^z9>ty8e=r@XD0lES)-?zD-)Hy>Z$bmzap4&9rMVC^y5~ej&T~78cq}<0=sSH#GDg%{)%0OkH sGEf<)3{(ax1C@cwKxLpZ(1L+K0XsN7RY0kk2LJ#707*qoM6N<$f>zO=p#T5? diff --git a/product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_recent.png b/product/navigationBar/src/main/ets/default/common/image_xxhdpi/ic_navigation_recent.png deleted file mode 100644 index 591e6ee74ba4d06e4e4b15a758f65c976db233f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-HD>U=s9naSW+o zd^^k9kJ(V5Epowwg&(Y(T#iaEa0ubZu;h6DKtqH>Nkc&OdV}f3&ZjIcuoEz{ugiz$DPXzyfC;*sl~Y^`GhChXu~FyqA_rzp4!j z{d%h)e{rrW1LvuxO|qHqveucOx^r)txu<=`Hl{i<77VHVkx_Z*|WWl|Q9|b*SiY8PQ zuHjcV^(}k#Y^jIs!_BJ_x>S8{*7Ww7(cVlIcM|fGLH+ M)78&qol`;+0G%T7@&Et; diff --git a/product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_back.png b/product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_back.png deleted file mode 100644 index c25181eeb2de433b34a77cac139303040302be98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1743 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 diff --git a/product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_recent.png b/product/navigationBar/src/main/ets/default/common/image_xxxhdpi/ic_navigation_recent.png deleted file mode 100644 index a2f0f100da7ffcebf3bc965a0df16b1a1a48d05e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 733 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-HD>V4Cjf;uuoF z_;$`lKhZ#ewnzh}wQetZSvxmwQuk2*Az=PpRwr{!CHogqogTBcIImm|Q&F!@!wFC2 zcg~(OXVRRV|6~998SUI{p7?D3`};TVv_(cea$sN*XkcJbU|{6H&z#`2!24vB%G=*{ zq1&yyo_D!-i5^v&FWtF2pF>8tW=U%)%%nFZ5AmCrUv z{@E_HZ;oo6UuE@G%QHrbtbGscr@ZJ?Qr-XQ+~*_CRx`g|+4HXXndEz+yw}N_PssXT zR6p9O^mT63l|ApD&ieOZX_CL8jl)N-+ND1hWmIkAsR&&8XN};$h}!KZwm+|Wv^-jO#XELe$cnrjiDMfYwvPz`CIU;W^EbnqfwJ|a>CB*}F9 bJrLX49dOg>=7wfqdS&o*^>bP0l+XkKXxK4{ diff --git a/product/navigationBar/src/main/ets/default/common/utils/configReader.ets b/product/navigationBar/src/main/ets/default/common/utils/configReader.ets index 8f0f0e91..278d85df 100644 --- a/product/navigationBar/src/main/ets/default/common/utils/configReader.ets +++ b/product/navigationBar/src/main/ets/default/common/utils/configReader.ets @@ -18,15 +18,14 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' const DEFAULT_LAYOUT_INFO_FILE_PATH = "/data/accounts/account_0/applications/com.ohos.systemui/" + "com.ohos.systemui.navigationbar/assets/navigationBar/resources/rawfile/navigationBarLayoutConfig.json"; const READ_DATA_SIZE = 4096; -const TAG = "ConfigReader" +const TAG = "ConfigReader"; export default class ConfigReader { public readLayoutConfig() { Log.showInfo(TAG, "navigationbar ConfigReader readLayoutConfig start"); - var configObj = this.readFileToJson(DEFAULT_LAYOUT_INFO_FILE_PATH) - var mAppStorage = AppStorage.GetOrCreate(); - var mLayoutConfig = mAppStorage.link("navigationLayoutConfig"); + var mLayoutConfig = AppStorage.SetAndLink("navigationLayoutConfig", {}); + var configObj = this.readFileToJson(DEFAULT_LAYOUT_INFO_FILE_PATH); mLayoutConfig.set(configObj) } diff --git a/product/navigationBar/src/main/ets/default/pages/index.ets b/product/navigationBar/src/main/ets/default/pages/index.ets index a94c583e..3ebc1384 100644 --- a/product/navigationBar/src/main/ets/default/pages/index.ets +++ b/product/navigationBar/src/main/ets/default/pages/index.ets @@ -15,24 +15,29 @@ import Three from './threeLayout.ets' import One from './oneLayout.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; import ConfigReader from '../common/utils/configReader.ets' import Constants from '../common/constants.ets' const STORAGE_NAVIGATION_TYPE = 'navigationType' let mConfigReader - +const TAG = 'NavigationBar-Index'; @Entry @Component struct Index { @StorageLink('navigationLayoutConfig') mConfig: any = {} aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) if (mConfigReader == null || mConfigReader == undefined) { mConfigReader = new ConfigReader() mConfigReader.readLayoutConfig() } } + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear`) + } build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { @@ -47,4 +52,4 @@ struct Index { .backgroundColor($r('app.color.index_background')) .padding({ left: $r('app.float.index_padding_left'), right: $r('app.float.index_padding_right') }) } -} \ No newline at end of file +} diff --git a/product/navigationBar/src/main/ets/default/pages/keyButton.ets b/product/navigationBar/src/main/ets/default/pages/keyButton.ets index 9feaabdf..932ccca4 100644 --- a/product/navigationBar/src/main/ets/default/pages/keyButton.ets +++ b/product/navigationBar/src/main/ets/default/pages/keyButton.ets @@ -18,7 +18,7 @@ import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; import Constants from '../common/constants.ets' -const TAG = 'keyButton'; +const TAG = 'NavigationBar-KeyButton'; @Component export default struct keyButton { @@ -28,7 +28,10 @@ export default struct keyButton { @State backGroundColor: any = $r('app.color.button_default_background'); aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear uri: ${this.uri} type: ${typeof this.uri}`) + Log.showInfo(TAG, `aboutToAppear Start`) + } + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear`) } build() { @@ -46,8 +49,7 @@ export default struct keyButton { } private onKeyTouch(event:TouchEvent) { - Log.showInfo(TAG, 'onKeyTouch') - Log.showInfo(TAG, `onKeyTouch eventType: ${event.type}`) + Log.showInfo(TAG, `onKeyTouch event: ${ event }`) let eventType = event.type; switch(eventType) { case Constants.KEY_DOWN: @@ -61,4 +63,4 @@ export default struct keyButton { } keyCodeEvent.sendKeyEvent(this.keyCode, eventType) } -} \ No newline at end of file +} diff --git a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets b/product/navigationBar/src/main/ets/default/pages/oneLayout.ets index f035af71..b2c58af9 100644 --- a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets +++ b/product/navigationBar/src/main/ets/default/pages/oneLayout.ets @@ -15,6 +15,8 @@ import keyButton from './keyButton.ets'; import Constants from '../common/constants.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +const TAG = 'NavigationBar-OneLayout'; let KeyCodeArr: any[] = [ { @@ -24,6 +26,14 @@ let KeyCodeArr: any[] = [ @Component export default struct oneLayout { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + } + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear`) + } + build() { Grid() { ForEach(KeyCodeArr, (item: any) => { @@ -41,4 +51,4 @@ export default struct oneLayout { .height('100%') .align(Alignment.Center); } -} \ No newline at end of file +} diff --git a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets b/product/navigationBar/src/main/ets/default/pages/threeLayout.ets index 2bc784e6..3fa4e6bc 100644 --- a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets +++ b/product/navigationBar/src/main/ets/default/pages/threeLayout.ets @@ -15,6 +15,8 @@ import keyButton from './keyButton.ets'; import Constants from '../common/constants.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +const TAG = 'NavigationBar-ThreeLayout'; let KeyCodeArr: any[] = [ { @@ -33,6 +35,14 @@ let KeyCodeArr: any[] = [ @Component export default struct threeLayout { + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + } + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear`) + } + build() { Grid() { ForEach(KeyCodeArr, (item: any) => { diff --git a/product/statusbar/src/main/ets/default/common/image_hdpi/ic_status_battery.png b/product/statusbar/src/main/ets/default/common/image_hdpi/ic_status_battery.png deleted file mode 100644 index 94b1137d20414b9e12f37c543da98d0bfc99fe2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmV+{0n`48P)Px#=1D|BR7eeDU>F6XAwXFOFrsV!|Np-MP)r7hG33zIlEMEE)boUqk?{g9y(pFf z9TN&v_#23?~=#Z}zn>K2|Xb2325C8zrWIJ?BMmIPx$2T4RhR7ef&lsyiDKoCX=Xd;OX7KUhLJb^JDArDvgEIiX zH97!USiIBEbpUF5l?yp_0ELF;$I1X!F+zJZH%-dw$^cAeXo6N{hUVQj0QEL7P0DK3 zRQQH9!QfulgtCKA_ zPh~Ck-$r6tLdSE`ph{(VWy6$)1gF0`hSRX fu2=Q6`Qrv&4+CT~KSGmj00000NkvXXu0mjf=$wb* diff --git a/product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_signal_full.png b/product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_signal_full.png deleted file mode 100644 index f4c0ff8167ed3adaf1b3aedb3ea7a538ff4bf929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O`0#1o(uw z{--JcnhG>8WlC2MkR@FbG!l6@{l%;=NmEvhQ;J|R`*qv!W zWm%psjv*T7*Iu&ZYcSw(xwzrI3d^Q*f8TdHwH{f*@bJ{7*ZXvn(vIjS=&9?OaXG?bU}an95Xbk&&@!%zU!p%sl5?8cWV;r%Z_mULF0dWTvm{ h*4Wa`?Z1BUsPA26QMQSXrwV8*gQu&X%Q~loCIBaqqk;gn%W>%joyP0R0g8s24m&n|*_GdYOY$T4j}wX!#}_iNEPCItxsf>_ zu0f8SPne~>=S#~DHa_k&KF*m3(kx`EpItEHTD!SzjnJ;GyHfL~2QHH;z4}(})obH9 YuG0*~)~#P13bc~J)78&qol`;+0C+8sP5=M^ diff --git a/product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_signal_null.png b/product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_signal_null.png deleted file mode 100644 index 267b4803b449109148baaf2a972c286806c64775..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O`1w1^9%x z{vRL!v>#}*)6HkuK$d1nkYBJG@9D#VPD(P?i^XPjPi40ZGLcjC*tpl7S(lAliqVJT zyCVyyx|N78!=cyj6M&lLd%8G=Xq;br=_cPH1p(H8JLRu$@n%GNvH$zeE~=As>Elrg z|0nZO#`e~rUFL4p6Qk8bz$^yp7`s+q>DTfmSc@q;zxM{t&gFdy@phDYIz z7Lx5Y7Z2^w`N3uKkX_)v@+}n^uE>Ip`Al7#nF|H@Di^gD{!B2u(o*a)yTw^ik2{U= zYIBo@K)W4KBJu-o#v!|`h=xZ(37eiUCj|sOWl3UH*ya{!a7vQ5@uGkPZ=<3V6GQSX WW0pr6yG(!%W$<+Mb6Mw<&;$TubxoN7 diff --git a/product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_signal_wait.png b/product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_signal_wait.png deleted file mode 100644 index 0fc67badb5b024c3178bdc2358ffb08e48677395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Hh8)?hIsJ4 zon*^($U&fWbEo=+;t2I6LjDg5Rc2gXB77vffI3IUB z4aTgfq#MqQH}|BiW7IsRE+DIT?|SwD#>;%$3flc+1OG8?7VQZ*$d)CMASq?A{-xAn t@8=VE&m_sZWIE$UEzzD<2}TniiH`S-AM01J@;98}Q|Mz) z66?}slG-HQaggC8lR&+!fN{`aCdmbkW(vX+b#`z(DGJW9IK!|YF~=c>d8>l>iD|7T edoQ`PGB7;(o>b4Q9Dfw(1O`u6KbLh*2~7aSTsd(7 diff --git a/product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_wifi_full.png b/product/statusbar/src/main/ets/default/common/image_hdpi/ic_statusbar_wifi_full.png deleted file mode 100644 index b75900b7aaff2c211b1bf485d0c2366b2ccc05ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 484 zcmVPx$o=HSOR7ef&lRZlVK@f&>k|w4I0TUY$B8Y!Mi(p~W*$6g*oxOj++9JK6g=w@% zen3D3E$po91wSCz_*F?l8go8xm_07Zg(Prbp#u*yJM-@B?%i%8@o&HV1-x+^@O^(4 z%_=NF-t=$y7r6C2uWh->9Zi$43)j$rQKp(S(k7!;7&-yM9fXHaunF(@D|moc%gy7L zVFPlOd&VDdqMD8S9gQb-TtJ3p|33dJo$$GdN2*t4Sm6)1YSL7;yzoL2saE#A>)=1Pd}wLlr7c zJC$c*4zySsoGDh$eWIy)24WiI;R|G+aA_!(spejHFfSZLzP^y4LwpB%Wc&QYmTELj z0C9toP7&|KsUQ7aHqLw2a{H$GN~c&7GZ1+Bmpw6HL%!>KcmUH@068@pt~y a9e)5VQl?8hk3{YO00001r;P)Px$`$DqQ+r2wEjoN zNtl8esNFOhMI74!8l}*k3>G$lGbi}~gDF@A)rK8-$f8@+1L9jT>O}^j+V=rhh>xKT zas>z;!!iN2^(fpTPzxO3SBq+)cJPYt%W=q%J);qZ%AvRo{A*~aLJtES*g0Irc_|wU z>k#d#3r3(83u$~8=n>o{{soOZ@um&lCN;Cv@7P>*gGkkz*UlS~c!aLNC zHz}mu{eWMAS)$ZiAr7_WD`&=o7f|vxI1GEB5GQ6KJIp`bEy`Q7x8xebDvQqC4vn$t zoK$d;V%w6_54(c#{}7=?5-0})t&RtJY4V!^ZVDNPHb6Mw<&;$TpO+;+~ diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/delete_all.png b/product/statusbar/src/main/ets/default/common/image_mdpi/delete_all.png deleted file mode 100644 index 143463751f103bbf00d204cbbd40982b9a5a6ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4061 zcmV<34Px^mq|oHRCodHT}x~g*BQ2r@f%F*LZBts5pqlFU~K%5P$C2i+C>&b-6oX^X%~?| zs=8r=iXyRLQ&j?qO(0p&Z3PQ9NhJ_UgoF(?CN4x4!sbyq20J$K0~^fk_ub5l?wmRE zyff#_wdY84XXZTq|2zLT|2b#QoS9o*wgSS)$Vm0`=g;3PFE4LFb(*>5a=D*lUx&Cl z9M|(08}|%z*yfQohqQU)cnbS5ZipLQzkdCr*4EZVoR@ScFGcjXZ{L3F)vH%Mz}}7R zZETyd#a)*iWR7FIi><%1va)a2u3ZmsTv8!!qa;%Kfq{Vy%gf9A)~s36{rdH565EuB zB7dQi6%`eIz|s#aS35g9r~QlQ&5>Gyhlhu&78e)yqPct@Cfb9oQm?5T+Fv2&I-2>* z)z#J4+S=Nd963@Dkvf702M62WAqQcb-(hP=fsKMdm_?>9;nkNqIy#1f6i}5XH3Z+f zb&LJ!VR&q>s>&y!2OfO`a?kJHy}LgN`C(;hC%CV#?_Kn39|L%MSnw&&KZNnZxt^Y$ zZ*=0+MleRg?_eZ+43+07cqNCs7=fR{2>e?el~hh}e}8`?JoYG>;tzCGSeH&T-524} zr@OnmXH;TPMlc91zj^cKK~(f8D%hy9k}1+P13R4V>gu`#JMca`@t}m@8#iujhS#1% zr8*L?Q3)sj$%F9bK$+tG&M zOS_kdjbP450pMAv$_7*J_V!C@qz!3Hzl=fCV<8y#x4%d8@()~vH9-|;`Q#R$4QWf- zRGuSTY|(u%uQr3+HQ`iexxFlaJ{d!q<-Zj>mt7RWMxT2&^IR{gqNjo67Z_cC(%#;F zC#sal1RKj{K7-<{&y8yRVC7~&@}HxQt|Jl5`&=|1pTl#rTcKbi6_v}lg*p`FJ~{Lt zi!)Rh>7B~REsC>Hg=uTroVE{D5Sc?0Y)n7Kdao81^eWB2)3AN0>W3nj4-Ozbn_CWL z;#f0(WN;8zXy87WkNj{u^e;%x233L0n@GkPjDJ21`lvCG2cr)t=kwf*+(ZZqE0il@ zPLh)#1p^Umti;G3)(5euf;<>icaW1Hs(h~kuAzd!e?wT-GzYP$x;$L|^9R2*UcMg8 z1#%g=>R1b*DZhBpFTbY;V?u*VTfguVl9u#Mn>PIdp{c5>sumY!sJU^hky>6_T3UGa z?AheR#Kg0-)X5JAX1V@^2@uyMxt=%9AeZZwQy)NRWlKxTTMZ2j>!X6@1yNH|)39~x z)`krmHvDXKbo2oTPh=TQRE)B621kFCr7_O6i8h`|mc*j;V#yVa!wZEn#rTw-zwPz> z*p*;h(R`gG^?}WDF`nyILCU0TxAZi{V}9bW8y;yB%@@HiLMw@Pg_@e0L=ti{Gc!|o z^)%Gm`FI7iy0Nj5Uj?wnCG5{jp+5#!yU3aBg*Pd|sHE!^;dZ6yiU%*YRU{<${{8!- zQSfZvzP$`2TQ8S$uogv*rZVKr@kXPgiRSycxFSmC6;5%q9M*FS$q>tmvJ3O3?Ua$c%YOkxyrF0FgUc#VC#d?MD0aNgO#f203+7A zZQHiB;69Z7sWr%nq8=mPUvi65R#pZBmo8bnM_ld&!o!CTM`vee`H3c#p~2wrKc-Tf z2csS52TzoT=H_OS%K=SMW}`e{x{Y1KiVADj zuGLkiJqDL~ds+megWiW2Ta&HI;?vX9ld5#7(xb6Xl?Ipjs#=6%HiRD;Q&oSPp0Tm9 zN9eD9WYdQG+A7Qi+a@n)EX)gsnz*njNZCBr1cuE=bnnkIwOpPnY+k&{;MEkq|X5@wXFu|i>9 zoyRgvGVHoAnw*-3%Loq1MA`{Pb=VJE&x3b_tY2c;F#>daUI=T#%nLCwy-1Q#GxL>vU#zrzjG8)93f&7F)M~6RYz{w%rr|=HAafY z61_zuG)uLJNyKbr)O*mJN`l4P4OxGu*KTEHA|?^DZhVIR<_cVST!)mZAbJCu!@y$% zE}_M2SS>s(aGjW!Wmq<7ArX^^IjEc@^O0Lt$o#9BBz1+74R5dwR>bDeP1web8=J7M zxf%J(F&{kt9fIG;mY(<<1k8i;?{{*KA3q*@`t+&q!w(TtNo_O39AxFMUL643bc!B~E738j;8s>uyogD}tO|#Z zo;n&Xbsmf>&*lxHxA;^_NwSDZ#H<8_zmmKM`)5;}Lo}A?EsEht)rpuy%+f*{BI&_% z8uWUq6i2?IF+B?_N)$1Pm=(eBQ!__`RWI%I163w^gV-GU3Q&+i#3W)?03nEqdEO?a z&Vxl`!I;5kErL`#hCCuB5pxVGiWWg`d7G3v55{T)+e8Oy3alZfriwO=w*Ui+?V^)l z_7k-gC7L9|BEy_0h+x9UILI0e zmRDUanK#Icst%D|lMIUtv%Qr1GjdyjPt-nwYH`%69!-HpnKxiyV;i*=WLJJD!y?11 z9GG2Uj@(wXwzl$}pK*Jd-ZPmu$h<}uN*NXzW?lFUz2oGTeK5n_pLXf^l|7k}8C4fr z85S94UHA;Wc}`7&9baeB2@b|`bQu`(n^<*1%j=e5kzv*hG|y??Xn4rorx}b*y{x&D zO)l69DLj#3kzrN{$)U>RG*7Vcmo2{QkQ`DHijXyTGOtNUy{}jq78zz=LCIy9H2;Rj zYWC2tq{fS7#*%qWa`y3-EW;wh>@6j^)Iu&Tg3-jJrXR*F2m4@KKP>Z_!XlVwxH2y%s5q2pc!jOWlihoU5*TA<5sQd5 zMpdCji5%Jp#usj`LE>y^sRLdsWG zs>TDc*%Q4+BeXIRi-=Vtwl571EeJM(8H>Iy|9vGZho%G3D@3o+1S_vr#3EwVg$>+Y z5_LNW?&#L66yw^c}ef>JTZRnMyjCsTiD6>V3<2lK#tE*c_ zEQRUBT6nJMn4CF+t4rXo(^x>;|2EXt*4FIUvE#Qesw+lEZ8SvSV$0pTckjOo3ky0) z9_s4qIxMTcqlq>%p!xB(MgP&$u0BZ%9Y@ro}O<|QLWF3pFDXo zj(;MX0FGd7au{Zc&zmDQVk}-%Q4;PNTuFtv^}+efc;s{n3%b9MmQ)bQz7}6je}sQh z`2k;X-;DmR9wS9h%t^!IfC}S)Ied6@9JsX48IU8dI{Wr-_&=WGF!TprLb5bH7Qpc2 zBK~sVq?dNrCfY27_Wd-DQ}rod6Wc1^&luczn!%S~{y!}|m?UQ*MHV0@e*YazxV{84 z6NccIAaIb!SX zF`DXQ0J3bxW&3z6K%3IG#gI!RMG;H^e3AhV{(D9;tr1V4EooD)r$j+D71cx+D(UO% zdl!AhsjRs!v`YA6ko$t38wa`69vi_F#yect+5hJ z!TirWT!Clc$=NMbp{0F};kmpO;%NDSPu5V$Mfbs?HUb3DLx_(&@)KpQg7Z7HS={8( zZm|sFoD~!5^Ye&YmY5hM_HJlcdR|y2L%$Bpa0~$6D)y7)%^R+-mja{OTA! ztcM)}J_UU=v_}e}5xh-Z~1xSJgs35PFeosDdoBF>MvcUOB-gXxvV{gL&*@ zIM4sjtr@=p_jkFp6@#d6b<|B8!DeMS0|t-&80XqvlQFTxydQ$co{MWnDk?VZ1e?II z{<<5-htYIved*1_6LpWKm~UpD$9m;deAFg21e*rMZB-janCzbqU~4erQ@-aL4qxH6 z=ORYNj#oH!Vox2xrZI+xhpQGB7x%)W-$&dYY?WqOO7?tz`8quIGF}(HCcasp5{&9@ zlZvVEz`(!;c=bMbNH_Ym9>{7cMqUwRCox{=1D1YZxmx%&n<8W;S~RsD>{V+%(7*_s zM04ALZ8NsG>%#j~E>Gnfmi-tB_a!k`4B3f>xQ&u1SU2G#BO}$A&wUfkWef5&b3@b4 zzm}~>TrH0I|BQ7!$Hp*+Z60ZJNL%1Jj``;#W84ro%8zLq-_k}@>4yIUf!VgTCGJ)* P00000NkvXXu0mjf(|(n6 diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_settings.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_settings.png deleted file mode 100644 index b665b89cd206a3e476f5e9efbe31d482be7a0321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKMSxF;E0F#_5a8H~Cu@LqYm@}} z1v9Kz!j?9FIuBE}!mNZcS4&e#flzNf(Mi1>^=i%1`N3NL4o1n*HdQBu_hvFMFdKWi zIEF+Vej9#s+ad#j78kRdfm2)=4?g|>zd()AfAYJE{uH_A*Cuyvob>9Qm;38_*Xl$w zg_;8Ad2?=RF*z@q+goV#=%cJtiHVZdQUAw>rJKGbt>ZbuVqg*wcDRBmm+e%Z!84E9 zGmVOK{~Sz9ZSWBYJuGgoCl@W7{erOF;$IcgfUmCs@iPs@$<)xc{e&^r`Hz$n5Fc68o!~6m_X;r-3M!*R-C#c`pk^s zJ>T*>EFJ6%T6QFUShJtKpQXsdIE67zW3s}|YH=6SU-PrlN>v`}xS4-du5QippJ`Rn zlFzT2*C&DGO4`=s8kF>v+H*|T5jcEU0pj}>p- z&R(2s@b;??RS90X*HG_Xm(`U0F=ADlvyYehs0yDJnOBw9C1X25<)^Op@q~BX8`ta1P@n&# zQlMZ?9?P2xVMZIL`p>!fQo?`Pha*Q8{uX#SRq~QV<$VUw{C@5NXD`4}D? zS~OS2;k@mRipJAhZ%#R$7J5D1Jw481L5+t=u#l-@Ot#dN<6lnQ?@xF%E6L7fSI?=G zKd;W-{qYPw7g)mGYe$1ILWg+-yu;l zp diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_status_battery.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_status_battery.png deleted file mode 100644 index b209209a65ae4f61446d52b960153b8e8ae3a342..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 579 zcmeAS@N?(olHy`uVBq!ia0vp^9zbls!3HEZ&9Qk6q!^2X+?^QKos)S9WdHSaaSX{| zeLK_M>xhHIQS*PASDdW5S-C|8OQd!8G~~Qx-P80f?$EVs(l<2Y4jl7~aB+0eeIvr6 zd*$n1)t0;4PacTSIrFUcgU7uyDMt7EYlJ@ES+&6Y5IcF7h+cb_*G)eB^a(W z`7M}x@ZOfF8P4;(wacFBEL?TN&0YG)`c-U8F3o#>K}wBJNn&N zv$tsNP+Y$4dC1d4WzT~4qy!Y%Jm=0}-POLMvpD#Dx4?pZjmjAu>H6ohjqT@U&s!*T zdE??|Kg-_ne!aWTih0(XrOm}(x3a6$oXVX$e?gJbr7Q;~m$i(Vf*;vb9Ii-B5E9JC zDNxGxMNQ{Q`R>;|FPK>DiacyC@w?>O&v^Lyq3}K}xyBPVU%398I^lw`iB#QMlxMZ( zV2ttgb217*U5k{sdyhSlesRA&&H1s=i{#9?izopr04!Sb-2eap diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_status_signal.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_status_signal.png deleted file mode 100644 index 65c057e136618d28c22e3d8059832c7cc68919bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmV-90>=G`P)Px$^GQTORA>e5S+Pn3K@iQUphYl{6}UtH_wk_5Sj?4L%0S9M%0SA%=rZsD06c9>Cq|`Y00000NkvXX Hu0mjflIs9A diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_full.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_full.png deleted file mode 100644 index 3d07a122b467da87f18c59a6a9405e84150919e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;00X`wF z|7ie#W&=%~eDL;HAWOC+$S=6guyVrsXtPtyPsO-CY)KW;zwqy8;royIeF1U}3{eqB zt^*Y=^mK6y@i_kW>RG-f0|Ax?T}|~IN+P$8R{p=9!fB$YX6w@wC{%U3Y@av(=4ZZg zo14Ejl+0tA#N5Zo+c1rBFVi3H4|4+!FosE7$l8#2K;q4Iu0Jm$j1;OF`Po#YR!9m6 z&1PvoWyKZp>yhMw|NMs=`j7Y@d|J8qz~3ILRELG;;cPBK+D!r5i`TmxV->I#{dFg1 oV&TuViK#w!C8WP^{jF-i&>Hxw+)_8D4d_?~Pgg&ebxsLQ07!(xqyPW_ diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_half.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_half.png deleted file mode 100644 index 54f893156fc698d524ed2582a66aa10d0d969d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6-z0X`wF z|LFpNwgK%qwoj`E$Wkr|@(ZprWEM+(Dzs(7DYMG;(fSwu{VdG?sQkW9Nn0{N&XcP_ z-IwA1d>K8U@-3b&jv*e$-(L0PZZ;5MN!a~&7)~!iykXx?8^P=f&kYlC2yktQw zqdMCi1{R(bq6sS#9?zb_w2#f3?ZwZ-$qwRc(wVlMmu0=fda#+XnpZ~RgXbUq7O9TX z{!;$qg)3%u8f{~Hp%=&{Vcq9E(f8`!-c$e5``&!N5w7}o!J79bJMUF-=zLhVym$l9 O{S2P2elF{r5}E*l?%$mN diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_no.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_no.png deleted file mode 100644 index bec95a3438320d4ea37fa941e9a4e0a5134b912a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6`-%bVJ|sj}+`vf1_CrQr{^8josX=oV%p=rZ4PXedBtQ0D^?O05m8 z9Xd=h%)huVtZr<0bXtn#L-D1i2IUt?th-*hv+&4h2wW&~P&%N#h~;yND2tliMUD!U zM@&iY6ee6(F=m;v=dyyrgbKkQyY^P88r*Bp|FU`~)8oI9f2S9gC1?2Df9IaS&XIe0 V$ElRY2A~5OJYD@<);T3K0RX)jrf>iN diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_null.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_null.png deleted file mode 100644 index f974779f120e74178c7c4821141a9f8da224ebce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;y0X`wF z{|62LodC4l@!)xoCq|hRbXFq!<_&89iMbLp+YZy?Ti@_M0&Q^>SUeh!?$_jn?7953`ta?fMl6d!l?RVb&) z?AeZUue0<_zSsLe;ZvkedTAB2piXZ>{8w%3`=yM>tLzlc#fcy2`|WHx&GU#AAh~6dxovc>Pf=xbE7-l>Nimz`^^Ec*M?Pkr{4R$_*4+^$pn~gyLDU?p~`t yTJ)D8YvJ|Tr;Gl|tgbRzbvI-8xA$NA4+uv{W(e8dTb~CELIzJ)KbLh*2~7ZArxzXo diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_roaming.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_signal_roaming.png deleted file mode 100644 index 649632b5f71d3aebcd73febfcc6ffd2695140784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6& zzl2M4wb+{cAU@0b@CF9g{gWO7b=G^jIEHu}e|yDU=#YU(bK+%d&b`xFf(qXJ|93oj zhvSyidEf54EuPq&G>4I~X3zJ#tMd4n_WSTDCB$$iTzKuQ+Ms4N!z+P*yPaTIC&-l?5c*qkBay7^*~k>r&$Ly!18Z`L!$ld*I$=K*~7KJU*Af*d#L=Z)eW|&9^-1WKCL{L`wsFSMNNuj zo;@#oKi6*J``r=D+vFAZzdX&!wO{D@!naFz?&iD0QN=Umih7i5_KI$&tpRsscd#-Q z@Yya7c<9U0nzdN6`r2Cd5~;llLuAh^iB8~VdttH5|H-oZkB+~IoGy1Fo4K|lf7aKj z-Y-~KUrcMfYxp_V_`XkZxavrqt&mjfgarZk{)LRCI6 Y|5;yC(^}(m1{fI(p00i_>zopr0MHz`#sB~S diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_connect.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_connect.png deleted file mode 100644 index 4c0cfefa63226c8b13d55a5df2e9d87d4251250a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6-<0X`wF z|LF*Tb^>ktHnqtd$Wko{@(XU*VOO#EmrTKx67HX~mQQE@!nyZz&>_Pc`l5cUau1~b zRp~e!VBlzM{0Y=h>FMGa;&J@#rPF*(4m_<78ASv`LIhmi89(3iUz@8?X!?}e|9_{O z(VP)Px&c}YY;RA>e5n9oZTVHn4Ev%*r)lJbylU7|>>{(xwq-yr5e@K6v)bSdf(c=OPq zD2Sj_K@ilbV-a}JAV}#DT@oY;52aL~3zbopNv)qRyt7W@%?s8;R19(;0kKY_{di=iVZSN5L^%U z1JwW0{|FAk+OSC!Ycw8mm8PGmhWes%5YP>ueANEX_W(MI60~qev)yPbhu2h#HjToD z<8D~+DscY-v|X0fl*8oW@{g&eJ>KN2y&c>i0(XCw`|B{kHn+ev&`7X@!TqoWoby2b z&N=Xr_6Ry})#+zC8_?Ou*k$MkXRB9Ds%;E{jo>!;0Wv+jUBTXo1mkJA3)*RHO}>gr z7trp)$JzPjXt(9_&yC@jg5%JT>-01j>xAbJ)uhqsk5ndr=5JX)1Bh=z>MVSQJN!=P{iN}erVgB4pzi{i&Vko3Mx4%- zWky^roo8Sp+`=!j%&D9m6wm@UVH$!=WAX|6{ZRTTP)rS6g5O|k^EfJ|rt}pRp-2IB z@D9S-djjigr_iN#&n7v0G+t*U27}%(zp$kH&(C5we;G* z^^p>InlhF$KJs;}r}CAXj8u?>e$dBFpKT%do;ERxwcZJB^;eW%*=BE6cDq@PiJ<+z zDp!l*b+V3wV`}T4Ue#|DS_>0S<*uvxblO(8QDoXxw6~e}3oOjcR)q;F5R>m;Ao<1$ z$W~~WC2s=fJJ$UdP+wDp%7~VRLVLmej<0raG*$oTa&Dt~O*m@O4zZ0+`j-&*#w!r7 hK)eF+3jD_vSOh&6mHxGYXiNYA002ovPDHLkV1k%=)%^ef diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_no.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_no.png deleted file mode 100644 index c8d92cf4f9625d95cea6aea3e3e5861a49be0215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1135 zcmV-#1d#iQP)Px(DM>^@RA>e5n8|NVQ5?r#OIkBUm7*!BDM3Xw#1KuiVkc@^7&bOGmLmQFJ6kIu z!iExTG$ch+jc7_t9k6JsBw}c2rDEvw`O1CmednEb-@U!B>B9Xb-<)%Q=Xbup;hy2X z7mGy_RUoQBRDq}hAu5m)Vs6sZcs!nqVg{J%!ZiAE&}X1GCnrbx&=M*Ef-WM0Fn@!*Z2zoL^RbVri39=!dAh{13N#;ioLf;7xcmc%KU<=3( z;v|6W0Jch`fkeLgnU^sE0?&hJH&Ec?JV?JY_6qcZZ!XYH+82d9F9lx9?Kk5M;0B4P zpH@5*Aovny9szUHFuXzk610JCoDHV2OH#wD4Zi?r|CEC=V3Qt{XW@Ns8b)6oqpdRA4w4numrI2g~Yk?V)-as9`?$V}+X&i%WJXS}+sub&3tQnmG|6myl zt-|+gNOpmB7P2Sk^frFE$7~5~!r-vmh`!eJc_wSQWE29?Cf9v1#WB|WKGV4~meMf4 z0_6dq6VEN@;CSd(sM@BO7tAvZE-+D-kyUUwj{)5U+MI&v7!@~KJf7I-?L4-@X+8hZ zw_^Jm8x_*M60~=c#P$ZX=J$a`pc%4zv?+oEk*x;RU`dLBKZSz4g%9hS#fRdn0+m4f z?J~B1Xon;vfuRwP4#c{34}v)!W;qbrK9wn0Kx0K=NKro5Ndxkf)}8R00u2K|5Wf4(^(0sz${=& zH;OZGd@%=X&p{G60l{K}L{+W_O*s5%jCnqiNG=9CZFFp!iFCqu+LOQ;w4Flf=IK+} zEsuG)h$AhTz`{Jer4|x-PP-p$bdlKJvTJy_8{`daV460rDt(mz9t_ij?~%xQSat&K z6%{7wyie!BcLE~7iH_K~Q@s>U#&wfc0^J3=8?~{whDglBo zgY3AQ(AC$n(NUNObm3|FnWBw+iX?P&j!1%>LN*5rEy_pe^u_uvF{X7*e?Hg&DiV5H z9i=*&N1Q;|H&B4{lVCdN0+%vXlVnPC+ zp_Y(W>8P&mgL22_Da)kA%YLL|qmlr@?;)TXBd9whQD^8vKL%R2e!LNUA$Df)np)$G z`JwS`ll27fY&%*L0eOujYy!2Tk-%q<2=o_XR%J92=q5saw3#BEeyL?uMr#vKBuf4C z96E*QUt<%8{&>r3_7PcBfv5se1)>T>6&ULZ`~|;fE*wedUwi-n002ovPDHLkV1k@6 B0KxzO diff --git a/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_pause.png b/product/statusbar/src/main/ets/default/common/image_mdpi/ic_statusbar_wifi_pause.png deleted file mode 100644 index cedb380e3feed1adbd649bec35863b49c8dba09f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;j0X`wF z|EUCk<^fGgm}&O~$dW7x@(Vt8yi_`1)4yMg6{hv}VJxgxMX&f2jT#&nI`_<53{({B z>EamTas2I-oq`PxJj@QC|9_WX@K5@vu7*OwhEKjK{ZG}D*?1%jKJXjpJNq{>&#+?4 zVJKsp!?muzIqcx6hDi#2QC8vKKk2qcXb8A1In%I0H+0j|W0Q3&tC?Knwklj(AQaCp Q1GI?2)78&qol`;+0O<&km;e9( diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_status_battery.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_status_battery.png deleted file mode 100644 index 9efbc47a89143213cac1d45906688aa59f85c7ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmV-X0j~auP)Px$3rR#lR9Fe^S4#@QFc3||eNpf#f`@R?y&Es!L3$kzq4X+((!E&UNGg+1DuFUu zd4Zvmrpfyxg^6=)bbt=ffp0qCQ}DKJ=Xke8Y!F2{Zq#ppb3z=w_xCJJ2q+N;#4>B* zh#w1f;812Si-{Ftkv(zb2|+~lX<0cgX)Ca8xAdiT9~`a_@jAkI&VauT9BPa`IzD{@ zy0Kq+3i-VvbnbFdHifoQBz5klB0%wvQwoUvu^+YWxdX8u_C4-^k>?kMqjNWv zQleG@blxkVkxEdCDK*JF6%GKEdw~nZ+q?eJWcvOAxk&870{UCCJYeqtC|m~H|J}$2 j<#Lb?&;dF?2NDOKcDzvY5n|Pk00000NkvXXu0mjf=!%Kn diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_status_signal.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_status_signal.png deleted file mode 100644 index f256c609daa3edd52795bbafb51813c8de0d5585..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299 zcmV+`0o4A9P)Px#3#!Xl?pHC0#@hvN2eKCo8z6hZumQY!*?GMYuojG$qz8bDlm$}*Kv^&~0Pl49 xr9{{%hz%_yD{7OW)$0S*!p6002ovPDHLkV1h8pdKdrz diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_full.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_full.png deleted file mode 100644 index 07f989416d741bd588960d47caed7eca984e9906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G|s0G|-o z{}=!$0~EX2x2h7zVlN5u3ocf^{kioggX1dY7eJv{PZ!4!jq}MK&dfYl#5@cgg*|j# zg+26->pytYrY0cQrWO#_7OpT+&{tt4hcCkkHD87|YAK8xW=~)}kaLI0!2BR=S;yH~DQf<|fEF=$y85}Sb4q9e0NP+tK>z>% diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_half.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_half.png deleted file mode 100644 index e79bf3d04d35b173bee91d86d7ac3487bfe8882f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G|&0G|-o z|9AmV6;NLF((NiBi@PMqFSuCQ>+@}&)}NZb44%{3*8zo7JzX3_G|neSw6aO8(B0s~ z?3?g1#H4Ym@kefx(uJHZZVNfj%xMizP*k3EV3KYI)9Uic8WZNUss+Ths%@wik7Hag zJAkzz&qNS%G|s0G|-o z|JVRfQgiCFTR@7VB*-sVncLY*)5n)#$M1i0fMT(pE{-7@=aV(unR%{=X&5>RYxuef zYj_{lfAFSHO+c(qZNjv^@C6eDeHUnO`ZAnQ^JRFWmcqDU_5{`gId_;0%n!0A{v;S3j3^P6!lvI6<80X`wF z|0x4NV}J%EY!1lVx7X(;0HAhuYNQcH(mL-WPa!h Z{w0$Ft{wGejsd!n!PC{xWt~$(69Dz&uUr5C diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_roaming.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_roaming.png deleted file mode 100644 index f5245005b14eeaa2aaa806e51647b172570a0a6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}dpunnLn1hn z6C_v{D;h{RKluOue|@6_OC9saP=#-cS6e%pF(2etu;VzQaJ+^w$#9n?Q-&mm4QnLF zlIP794i7xJ*$o5}U+Axx_1|U1(mtV%_W$*)m%1AzT$&d(zYAp8BFxvd;<2eu@CVm} z-U~j3tPs=mS!*KF`0Kak1TmIJ_6{}E+pZ-_@fI_9u${1DdHOne)sh&NaFIXEQh&v> s{-kNV_1{^#Sgoh+Kn4d2p}@n);Gj6kB~W8`F3=wgp00i_>zopr0PXo)_5c6? diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_wait.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_signal_wait.png deleted file mode 100644 index 02b4bf29015f37ddf1aaa66a794571d5ef66c6b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S3F%DLn1ie zPT9-JC5v?c3+v{Ox0Ct&u5q)A zq&-M(+kSe_ZtIx9;VhMe!x?F0=>CS($U;$5*wOha9F) z7epOCU=-JRlf!9k;&gwd$3K=WYpWXB>ga02oWqiGA6j^#KKd%NZWhVA&?fXd?`LF@_5GTwEMS?o!aq-ujTl&ki;orFZ8OJ<~684;H&^q eAO3UhVU*-N8qfaZ$6=uV7(8A5T-G@yGywn%opWyh diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_connect.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_connect.png deleted file mode 100644 index d8a905dfc0f9c219e48db7edb5ca93b1041766f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g;!3HGxU+kX;q!^2X+?^QKos)S9a~60+7BevL9R^{>w;^3X z&tcIc38B^<9WJX2SbJUOI4-=R?dq7gXZz<9H|CyL=e05ZQ|h<+|7YgkRMpV3nV zx}zc3^^8>kYjoGA=EK<@@49B>=A@)`?U}M=*@1(W(3wAXhqV%sM z<);f5H`OeQzHv>={)WIo?mrH>N8z90L;+t&5DvDvqxncelwvtDnm{r-UW|#=MI2 diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_full.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_full.png deleted file mode 100644 index ef6a536e100c74a1d595d38d1738ba2518c023c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622 zcmV-!0+IcRP)Px%C`m*?R9Fe^mOV=YK@f&>iV0W=f*+u0rJbe`EUXlNgN289 zw6?aevJkOKp@<(SDt?p-f`%BMm+XMQWySHKCn z0J&VQhuU!%gI;KdHjq8T6I{bS>^Y8e!}Vvzq%oL<69{Y4NE<767rrZis1eZuEJCNJ z!6V}|=!u0)t04xU18jR>um&5fO4d&J`b^#f2VmO;g9HrvicFBaqZ(6t&eb;c)Haqj z3g+O=Qk~*Yf>tDyNn^C?;hK8S+l`90faER7E>p0_8SunR43@4b(JD5lxq@S+%!1<(mfiin+ENrgxxPI!}R~P;a(juShXC z1Jz7<^EDaMxTR8~AT@T6st*VgHPdL)G~4F&`erx&RiDZALvsYK$q)U5RrO6WnO@Ic ztLnAeP~~0dPsWF(m9N;}8IQ033HJu~Ed1RK)Mu)%K&@8b3rbqYa9sgm_W%F@07*qo IM6N<$f_>!}F#rGn diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_no.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_no.png deleted file mode 100644 index 3f49ec5b9e05271894e99c2e4606d7b4208617f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmVPx%u1Q2eR9Fe^mb+^dQ51)FeM{6v6p8o<2)-&Uw6KXrMG!n6@XbRu1-#6Z!%w%U~Gt=1Y55B#xbI(2Z+7kicW&kWaACm)tWi#ec?F*li;I6GVz-+95^`TA?OS@YzOdx;a-cV@?fW_VE zY3NB9o6h_21Sc+@Ddy_08@59)cvMY|Q@Os}H`ntm4ZOQ?Re}#5b;CLaGjbNrsy+>f0y?`$>?7c_F zU>~SyY|i|vwgzyRfo(8|k+(TgNUdqz3tM18G|>9-gRZA=m-%DKVSG6M2#hjjRwJb{ z(Ckc>Ok79%1Xz~Q1jhX=_NHi3VE`6(i>-@1LJRW$&=q>|6fx_zZpDF9OKKcRkb mQSnE|zK%K>=wzUD2L1x@_{1S?sgf7~0000)wB diff --git a/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_pause.png b/product/statusbar/src/main/ets/default/common/image_xhdpi/ic_statusbar_wifi_pause.png deleted file mode 100644 index 8050431ac26a4767ebbc75c190d05ed12a58fc8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}T0G|-o z|F{8A2~e_Mb?rSMi>oBaFIZ>dy`)FlYz=V?KeJdi14WHIT^vI+&L_|4WRq}XE#UUa zbrznnNy0bbTG1p{gEI#SpkC^>bP0 Hl+XkK{%T5F diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/delete_all.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/delete_all.png deleted file mode 100644 index 143463751f103bbf00d204cbbd40982b9a5a6ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4061 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 P00000NkvXXu0mjf(|(n6 diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_settings.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_settings.png deleted file mode 100644 index b665b89cd206a3e476f5e9efbe31d482be7a0321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKMSxF;E0F#_5a8H~Cu@LqYm@}} z1v9Kz!j?9FIuBE}!mNZcS4&e#flzNf(Mi1>^=i%1`N3NL4o1n*HdQBu_hvFMFdKWi zIEF+Vej9#s+ad#j78kRdfm2)=4?g|>zd()AfAYJE{uH_A*Cuyvob>9Qm;38_*Xl$w zg_;8Ad2?=RF*z@q+goV#=%cJtiHVZdQUAw>rJKGbt>ZbuVqg*wcDRBmm+e%Z!84E9 zGmVOK{~Sz9ZSWBYJuGgoCl@W7{erOF;$IcgfUmCs@iPs@$<)xc{e&^r`Hz$n5Fc68o!~6m_X;r-3M!*R-C#c`pk^s zJ>T*>EFJ6%T6QFUShJtKpQXsdIE67zW3s}|YH=6SU-PrlN>v`}xS4-du5QippJ`Rn zlFzT2*C&DGO4`=s8kF>v+H*|T5jcEU0pj}>p- z&R(2s@b;??RS90X*HG_Xm(`U0F=ADlvyYehs0yDJnOBw9C1X25<)^Op@q~BX8`ta1P@n&# zQlMZ?9?P2xVMZIL`p>!fQo?`Pha*Q8{uX#SRq~QV<$VUw{C@5NXD`4}D? zS~OS2;k@mRipJAhZ%#R$7J5D1Jw481L5+t=u#l-@Ot#dN<6lnQ?@xF%E6L7fSI?=G zKd;W-{qYPw7g)mGYe$1ILWg+-yu;l zp diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_status_battery.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_status_battery.png deleted file mode 100644 index b209209a65ae4f61446d52b960153b8e8ae3a342..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 579 zcmeAS@N?(olHy`uVBq!ia0vp^9zbls!3HEZ&9Qk6q!^2X+?^QKos)S9WdHSaaSX{| zeLK_M>xhHIQS*PASDdW5S-C|8OQd!8G~~Qx-P80f?$EVs(l<2Y4jl7~aB+0eeIvr6 zd*$n1)t0;4PacTSIrFUcgU7uyDMt7EYlJ@ES+&6Y5IcF7h+cb_*G)eB^a(W z`7M}x@ZOfF8P4;(wacFBEL?TN&0YG)`c-U8F3o#>K}wBJNn&N zv$tsNP+Y$4dC1d4WzT~4qy!Y%Jm=0}-POLMvpD#Dx4?pZjmjAu>H6ohjqT@U&s!*T zdE??|Kg-_ne!aWTih0(XrOm}(x3a6$oXVX$e?gJbr7Q;~m$i(Vf*;vb9Ii-B5E9JC zDNxGxMNQ{Q`R>;|FPK>DiacyC@w?>O&v^Lyq3}K}xyBPVU%398I^lw`iB#QMlxMZ( zV2ttgb217*U5k{sdyhSlesRA&&H1s=i{#9?izopr04!Sb-2eap diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_status_signal.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_status_signal.png deleted file mode 100644 index 65c057e136618d28c22e3d8059832c7cc68919bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmV-90>=G`P)Px$^GQTORA>e5S+Pn3K@iQUphYl{6}UtH_wk_5Sj?4L%0S9M%0SA%=rZsD06c9>Cq|`Y00000NkvXX Hu0mjflIs9A diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_full.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_full.png deleted file mode 100644 index 3d07a122b467da87f18c59a6a9405e84150919e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;00X`wF z|7ie#W&=%~eDL;HAWOC+$S=6guyVrsXtPtyPsO-CY)KW;zwqy8;royIeF1U}3{eqB zt^*Y=^mK6y@i_kW>RG-f0|Ax?T}|~IN+P$8R{p=9!fB$YX6w@wC{%U3Y@av(=4ZZg zo14Ejl+0tA#N5Zo+c1rBFVi3H4|4+!FosE7$l8#2K;q4Iu0Jm$j1;OF`Po#YR!9m6 z&1PvoWyKZp>yhMw|NMs=`j7Y@d|J8qz~3ILRELG;;cPBK+D!r5i`TmxV->I#{dFg1 oV&TuViK#w!C8WP^{jF-i&>Hxw+)_8D4d_?~Pgg&ebxsLQ07!(xqyPW_ diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_half.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_half.png deleted file mode 100644 index 54f893156fc698d524ed2582a66aa10d0d969d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6-z0X`wF z|LFpNwgK%qwoj`E$Wkr|@(ZprWEM+(Dzs(7DYMG;(fSwu{VdG?sQkW9Nn0{N&XcP_ z-IwA1d>K8U@-3b&jv*e$-(L0PZZ;5MN!a~&7)~!iykXx?8^P=f&kYlC2yktQw zqdMCi1{R(bq6sS#9?zb_w2#f3?ZwZ-$qwRc(wVlMmu0=fda#+XnpZ~RgXbUq7O9TX z{!;$qg)3%u8f{~Hp%=&{Vcq9E(f8`!-c$e5``&!N5w7}o!J79bJMUF-=zLhVym$l9 O{S2P2elF{r5}E*l?%$mN diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_no.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_no.png deleted file mode 100644 index bec95a3438320d4ea37fa941e9a4e0a5134b912a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6`-%bVJ|sj}+`vf1_CrQr{^8josX=oV%p=rZ4PXedBtQ0D^?O05m8 z9Xd=h%)huVtZr<0bXtn#L-D1i2IUt?th-*hv+&4h2wW&~P&%N#h~;yND2tliMUD!U zM@&iY6ee6(F=m;v=dyyrgbKkQyY^P88r*Bp|FU`~)8oI9f2S9gC1?2Df9IaS&XIe0 V$ElRY2A~5OJYD@<);T3K0RX)jrf>iN diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_null.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_null.png deleted file mode 100644 index f974779f120e74178c7c4821141a9f8da224ebce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;y0X`wF z{|62LodC4l@!)xoCq|hRbXFq!<_&89iMbLp+YZy?Ti@_M0&Q^>SUeh!?$_jn?7953`ta?fMl6d!l?RVb&) z?AeZUue0<_zSsLe;ZvkedTAB2piXZ>{8w%3`=yM>tLzlc#fcy2`|WHx&GU#AAh~6dxovc>Pf=xbE7-l>Nimz`^^Ec*M?Pkr{4R$_*4+^$pn~gyLDU?p~`t yTJ)D8YvJ|Tr;Gl|tgbRzbvI-8xA$NA4+uv{W(e8dTb~CELIzJ)KbLh*2~7ZArxzXo diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_roaming.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_signal_roaming.png deleted file mode 100644 index 649632b5f71d3aebcd73febfcc6ffd2695140784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6& zzl2M4wb+{cAU@0b@CF9g{gWO7b=G^jIEHu}e|yDU=#YU(bK+%d&b`xFf(qXJ|93oj zhvSyidEf54EuPq&G>4I~X3zJ#tMd4n_WSTDCB$$iTzKuQ+Ms4N!z+P*yPaTIC&-l?5c*qkBay7^*~k>r&$Ly!18Z`L!$ld*I$=K*~7KJU*Af*d#L=Z)eW|&9^-1WKCL{L`wsFSMNNuj zo;@#oKi6*J``r=D+vFAZzdX&!wO{D@!naFz?&iD0QN=Umih7i5_KI$&tpRsscd#-Q z@Yya7c<9U0nzdN6`r2Cd5~;llLuAh^iB8~VdttH5|H-oZkB+~IoGy1Fo4K|lf7aKj z-Y-~KUrcMfYxp_V_`XkZxavrqt&mjfgarZk{)LRCI6 Y|5;yC(^}(m1{fI(p00i_>zopr0MHz`#sB~S diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_connect.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_connect.png deleted file mode 100644 index 4c0cfefa63226c8b13d55a5df2e9d87d4251250a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6-<0X`wF z|LF*Tb^>ktHnqtd$Wko{@(XU*VOO#EmrTKx67HX~mQQE@!nyZz&>_Pc`l5cUau1~b zRp~e!VBlzM{0Y=h>FMGa;&J@#rPF*(4m_<78ASv`LIhmi89(3iUz@8?X!?}e|9_{O z(VP)Px&c}YY;RA>e5n9oZTVHn4Ev%*r)lJbylU7|>>{(xwq-yr5e@K6v)bSdf(c=OPq zD2Sj_K@ilbV-a}JAV}#DT@oY;52aL~3zbopNv)qRyt7W@%?s8;R19(;0kKY_{di=iVZSN5L^%U z1JwW0{|FAk+OSC!Ycw8mm8PGmhWes%5YP>ueANEX_W(MI60~qev)yPbhu2h#HjToD z<8D~+DscY-v|X0fl*8oW@{g&eJ>KN2y&c>i0(XCw`|B{kHn+ev&`7X@!TqoWoby2b z&N=Xr_6Ry})#+zC8_?Ou*k$MkXRB9Ds%;E{jo>!;0Wv+jUBTXo1mkJA3)*RHO}>gr z7trp)$JzPjXt(9_&yC@jg5%JT>-01j>xAbJ)uhqsk5ndr=5JX)1Bh=z>MVSQJN!=P{iN}erVgB4pzi{i&Vko3Mx4%- zWky^roo8Sp+`=!j%&D9m6wm@UVH$!=WAX|6{ZRTTP)rS6g5O|k^EfJ|rt}pRp-2IB z@D9S-djjigr_iN#&n7v0G+t*U27}%(zp$kH&(C5we;G* z^^p>InlhF$KJs;}r}CAXj8u?>e$dBFpKT%do;ERxwcZJB^;eW%*=BE6cDq@PiJ<+z zDp!l*b+V3wV`}T4Ue#|DS_>0S<*uvxblO(8QDoXxw6~e}3oOjcR)q;F5R>m;Ao<1$ z$W~~WC2s=fJJ$UdP+wDp%7~VRLVLmej<0raG*$oTa&Dt~O*m@O4zZ0+`j-&*#w!r7 hK)eF+3jD_vSOh&6mHxGYXiNYA002ovPDHLkV1k%=)%^ef diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_no.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_no.png deleted file mode 100644 index c8d92cf4f9625d95cea6aea3e3e5861a49be0215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1135 zcmV-#1d#iQP)Px(DM>^@RA>e5n8|NVQ5?r#OIkBUm7*!BDM3Xw#1KuiVkc@^7&bOGmLmQFJ6kIu z!iExTG$ch+jc7_t9k6JsBw}c2rDEvw`O1CmednEb-@U!B>B9Xb-<)%Q=Xbup;hy2X z7mGy_RUoQBRDq}hAu5m)Vs6sZcs!nqVg{J%!ZiAE&}X1GCnrbx&=M*Ef-WM0Fn@!*Z2zoL^RbVri39=!dAh{13N#;ioLf;7xcmc%KU<=3( z;v|6W0Jch`fkeLgnU^sE0?&hJH&Ec?JV?JY_6qcZZ!XYH+82d9F9lx9?Kk5M;0B4P zpH@5*Aovny9szUHFuXzk610JCoDHV2OH#wD4Zi?r|CEC=V3Qt{XW@Ns8b)6oqpdRA4w4numrI2g~Yk?V)-as9`?$V}+X&i%WJXS}+sub&3tQnmG|6myl zt-|+gNOpmB7P2Sk^frFE$7~5~!r-vmh`!eJc_wSQWE29?Cf9v1#WB|WKGV4~meMf4 z0_6dq6VEN@;CSd(sM@BO7tAvZE-+D-kyUUwj{)5U+MI&v7!@~KJf7I-?L4-@X+8hZ zw_^Jm8x_*M60~=c#P$ZX=J$a`pc%4zv?+oEk*x;RU`dLBKZSz4g%9hS#fRdn0+m4f z?J~B1Xon;vfuRwP4#c{34}v)!W;qbrK9wn0Kx0K=NKro5Ndxkf)}8R00u2K|5Wf4(^(0sz${=& zH;OZGd@%=X&p{G60l{K}L{+W_O*s5%jCnqiNG=9CZFFp!iFCqu+LOQ;w4Flf=IK+} zEsuG)h$AhTz`{Jer4|x-PP-p$bdlKJvTJy_8{`daV460rDt(mz9t_ij?~%xQSat&K z6%{7wyie!BcLE~7iH_K~Q@s>U#&wfc0^J3=8?~{whDglBo zgY3AQ(AC$n(NUNObm3|FnWBw+iX?P&j!1%>LN*5rEy_pe^u_uvF{X7*e?Hg&DiV5H z9i=*&N1Q;|H&B4{lVCdN0+%vXlVnPC+ zp_Y(W>8P&mgL22_Da)kA%YLL|qmlr@?;)TXBd9whQD^8vKL%R2e!LNUA$Df)np)$G z`JwS`ll27fY&%*L0eOujYy!2Tk-%q<2=o_XR%J92=q5saw3#BEeyL?uMr#vKBuf4C z96E*QUt<%8{&>r3_7PcBfv5se1)>T>6&ULZ`~|;fE*wedUwi-n002ovPDHLkV1k@6 B0KxzO diff --git a/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_pause.png b/product/statusbar/src/main/ets/default/common/image_xxhdpi/ic_statusbar_wifi_pause.png deleted file mode 100644 index cedb380e3feed1adbd649bec35863b49c8dba09f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;j0X`wF z|EUCk<^fGgm}&O~$dW7x@(Vt8yi_`1)4yMg6{hv}VJxgxMX&f2jT#&nI`_<53{({B z>EamTas2I-oq`PxJj@QC|9_WX@K5@vu7*OwhEKjK{ZG}D*?1%jKJXjpJNq{>&#+?4 zVJKsp!?muzIqcx6hDi#2QC8vKKk2qcXb8A1In%I0H+0j|W0Q3&tC?Knwklj(AQaCp Q1GI?2)78&qol`;+0O<&km;e9( diff --git a/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_status_battery.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_status_battery.png deleted file mode 100644 index 4f95a3506a972ba2dd3d81db50c3239ed9b3714c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 687 zcmeAS@N?(olHy`uVBq!ia0vp^2|(c(_pG#7ASU3 z-@iPQXL8}~%ZpUbYp+bps;b)c;`{Mj?+|}A2^IwgMh*uCCV>V91oJ=yhmW`Vt_Ynq z?^piusZ+T>z5nFDj7|NYq<_9Gv5LJiqh=yQ)Bn(u`%dq_>amMC`A#<9e$_*tFYH_+ zs<8KGxL3-D`A>|0HcyJSkrHlq_Wc%7r@8%x%a6#{lNW5<<=c7w$^IwyPvUn~_b$IG zp(1wd$h60f-&Q_&IVVMJYdrU__a)Ph90+6Fd}i6sTaO}?8fqWTvNcif(-oU}_F8}! zOT@ohlDB8wci(a}>4W~k^R=Bjwo5YBs=s;J$^Fx_>XYB|oh-j+ue(22;DPKUM_#u7 zdrY1B)<@@RC!Q4A@`*uwFUzOd_upN)`s};lfxr+>J}bAES)cPb9%v*nv2;9q7YP(S z!oneN`0i$>{)W#9@n{# z9hp=dU?@PnQSJMt-Rq*gdDA1=BjY3aBXcjC$p8E*r@j8rz6VO0a_pJ&etmweU{<+n z#-2&%Tjx%C71z0Pp%6pPlvCThe0ZlaIOy{53Nd)C3W@zHn@}drbNBwmK2vT7E{8 z8?!TfnY*k6C=imEVZ_ofNh>tGmc63ZVI3R$+X#Jz%7AHX?5qtv4%67w)f#ko{d^c+ zY~FN5QF%gYV#XzohUuR+Y!}+RE;y)+kMYC*PenC0#~FX-$1Y#;MrIT5w!d@#_w!HR u^lnpLZO)J6So1SepCdxif$6I74@T=#Ubi>fzgiEBCNS%G~10G|-o z|1ba)05TIVSuO!7EeY}qW_#AbaN=ycIFMiO>EamTas2Jojl2y8JT4bIcqd3SH1W=0 zc=9*hsVMp8J{eZc4O2w&{&YPt&wPG5Q@Dop^seH96K4;qiL)zx%3i=Jae;*=gNdyq zTry%Y-v&3?gkGxyWv-4HQ=sU^Rpu2Fp(w*#;)U#mg7prEOC6HyJRcumF8{u=%(*@@ QALtYYPgg&ebxsLQ0Q_NF9smFU diff --git a/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_half.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_half.png deleted file mode 100644 index bd6005a2d2195a135161a4383ed73d077323e667..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}%0G|-o z|JVRf5-9wAK}{Zz#ZeOE7tF+_<@T(@mtkLV-)W%OBu^K|5Rc<;uWsaQFc4w6@PO}I zn4W?~W9!ff7)jp&lRNjt$3iD(dO5D&y3gYwyDA9 zcxIOc3`zkEf*K96Cl|~W;|<$yGUM-+19wleo$z2xS;Alx#ISo3qp=r5+7yN}8jL%B z^E{BY`0!`3)Dc~a0ENJbO6+_g0o%G>+rO6F!T5N_(x8bNS%G~10G|-o z|40BRHt}RBJCI^63GxeOa?|oEamTas2Jojl2y8JT4bIcm=o>3>hm} zzs=`7*_-;iMr4UXP|%K#+LP`txvRh2_k*a;>vIPc#o1@ik?AW%fx$~vG=FyS7!dK)c+}K|LGJ1UBck$ L>gTe~DWM4f9Ff|19~{pG0lD$DjAbKQOFnOxeW-3O)b z)y!j-`H=WP#;rZ5zqH6}d&rW^-Rp7%6xbSO3%$yc3FgZ9{c$UYK!f0`$0l<%7R+wo zW30K*^vlk{iE(cg#{_Y$ii>DTVjV^xv9_TiEv0ZZrOV{;z^v zH1nTo!2_?7Srfi)WZLj6f-&L@<9@~;zc?87*)cV&?`L?B%=bf0VJ$zW$7^S%OTQ*G xn0z~aU>EaCmpDhOiMA8`-qjyu{Lg%cF+B0alur3u$-v-a@O1TaS?83{1OT+^{BZyP diff --git a/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_roaming.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_roaming.png deleted file mode 100644 index f9f9a71caf8d6fb474d8c387a105f9bfd66b26ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!SkfJR9T^xl_H+M9WCil)1o(uw z{vVV8=sKXgww_6x3}hLX1o;K4MX9(xlE3Cue_eN#!-wwk@%zP2{_DN`c=AEVmA`~6 znH2<0W9Dp}!MM3C=xq|qjjwM`G2Fh{o(t5z*we)^B;xSftH=2c83?o_Ubb$z7yV+1 zz@GR2^UgG?e<*OAW&2})ZP1gck8Ldd8XDx8^$)8&erYDM;k}5p(1u7co{-CFO>>$W zw|`fCa*84K$sq>QC+8SMpUCiBiA`=;^2Aiko$rRtN!KXh)pxR<|7hB)p0}{S_$Wi{ z9B#G~RcW84H+#scq&09<8XU+-n#OLQ>72s(V!{6=21X_p4grM+^BehV7fN>gTe~DWM4fGI11j diff --git a/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_wait.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_signal_wait.png deleted file mode 100644 index 1a8c0ac018dbb91172d576fb3abe868839b17530..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zk9oQ{hEy=V zow3`C*-@lza>c<@K}U)ly*G;Mh`jl#DI&6_wPf3(Uj2l{{t6tAls%4kIUeCw>d0TP z=Ke$<3BKJdo6o-cz%TP`)AIv0_xWxruAMfE=R^Yn{gFKJ*+yBe1(1lw@MC=_o~~Ul^C~+n%!I-5Zxct_fg`b*xdhjH_e^6S^TN3v7S&=SlsL`gZC`U%Fh20!wDXy7WL9`S(rntDWFyy*<8vb_qn}6Z&}WsZhOmzJ4j%QM zKEkq(dN|G&O`F{CO`xHaId%X3#pZ&AuYc`Y@@#_K@hy2ZQ$%tEc@E?*dVV0c%6Ut7 z)}$!rPe(GmZzTq8kYjtn%wBi!&VRNyzjvuTYgi{_Kd~YB*f-V<-Ipr2%)1xPutW2a zY10;S`yEdWw^bh~{bIAWnjzt%==bKIJ@(hu{G9z@+xg5VG6vR<-n(QhO;9oKY=`>? Z^t)#+l{MP%tN<9j44$rjF6*2UngGr>?S23N diff --git a/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_connect.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_connect.png deleted file mode 100644 index be54455a9d9e53e41b4a8296d68f13feb93ea210..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!SkfJR9T^xl_H+M9WCik_0(?ST z|5E^fW&m}6FlH?SvP4UQ{DP|*>Z`vg*f(EF=Xt%J@zd=OzkW6`oc!kT5~!fj)5S3) z;_%xmJNXVM@Gu8dIr{en{r|sS?8-tR>4m{hdCq-nJJGdE%3V;wp@D&siG@Qz;RAER zhuTvay#f&phHHhF^ITwbxaEJ1`Er|D!rYHcl`*mfZ!{Vr*j+>p)Lmg*$M7ulQnUDt yWve+kqOKiT?xehdV|7lBUF~zx|BQ|OjnaFR?U_9GY&ZmT41=eupUXO@geCws=b6(0 diff --git a/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_full.png b/product/statusbar/src/main/ets/default/common/image_xxxhdpi/ic_statusbar_wifi_full.png deleted file mode 100644 index cac433fd284a95d15232327b53b669e0b07957fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1183 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!SkfJR9T^xl_H+M9WMyDrY!2`V zas59E1}+4Ekpi@Q>PKE{AgiGy$S=4taq;o)wNZ#4^CT9v`GB^N-d{9VZv8;-7sR?IG6Rx$<4Zs>KPL{CqA~5+*e$obCGkW$6*)7 z<$`LjBO(ueD784-zS{c1-9uh~jrqGo<(XT4Jah=}6Igds=Gk)&pZB5KE4W$C{Sx{5 zkHM@VP@I8*$=cJ!F(l&f+iB0kZv{vk+juL={VHF2bolFg)$jM-^cHY&k(A=#TlT9Zr7pMBSRbS^_v^1zwp zZKXG_US1fQRPD1~{^iw;iQNf? zCGRbGwpFJD6;1fzVXFrS2gyL)I(>htZdj_!+K=SdI-4c5*rVPskPHFg1W+J?H~ z2E7ll7JrYNkUbLN$IZyID{l4$(-pD}Wm-3Hv}Uofv~H^IJw5TnriaTf_yrgz7`}}x z*q?tWvt2)H{z3h|?o)3%j$6DdSB$<9Z8briZ`!we&*Z%xDN5CPi16>&^|-yhJXGg_ z)wG-SZ+3Y&#C%EE<8h#mPx)g-Jv~RCodHnCpvGRT##dsWiKpSz1XsW22RnK^G&seb6Ebg~9rekVp}9fuIk4 z>o2HJMNmXiSOg*oMi<0VD#DsbL%U*=jcFxmSF^Il>GzxVfx~8>eb(7$@14V57)rU;ECfetNZgKuHS`kB801@D|96Q1D{XyMey9NvMAQsRq!!fj}V^~ zb5U@4GH?ex2>Xi$F1g>Q_*;h%Uv%oXqZPowrxIWpbml|xJ%%Rs6|}IqY=4Fpw%?(! zAj&DwB6%7-2hN4Z!cYuhxEdi2gmwrLfPrgwHCzhYB{YhSOL8mRPBK66ECk|ORQuq0 z2?ux{1@qwG*AVxeJflWiTLDPIBkOk9Zq^TCvk`9UWCpMg2DzM!@j~cim{%Swl+Te% z?h%?R00Ga$$=z^zPNbh`+W_ApSYt`&n0MbqUarEcpkkbo<8cpdkCT^MFB2^VAV@zw z?uYKpEV$Ix!OaBtGs~drcjV}HxE2n=#-%D9)|L4vIqpn1_&ra62WdYms}t`$exAXp zv;VIHA!d-o3g{&)3&Z64P*%gySuc}!UR%@nix+F*MjQs;#z@d*YDJ#|r@|AU7bc(L z7wF00Q&ETEC&cj5(-zq6CC0-TUJn<;^tjy0naEoKchF-&Q?IZ2{1n05S8YK;&c>C{ zJA=ns5qv`@SKAiiejeh0xL&{Sfz1;*ME{jp{qqE{(A)(3py&8YILY1X1b0tf3>U(F zSSDN*uad*|c23E|mE}rM4EO%a^vf*JEd`)cMbhsJ1#H)lW(8<_RMv$%rVBqfM zWzdKV;otkm1pyEh_D0aE1-3v8HM5&-2%Nt zz71Xhy&JgCJ(|2JRt`ik{vhkuR-3kdnuyK&cF?<*e35@OW*v^A)pMGe? z_w*QrUV$x=!_Z%McHmQCbAeA!iQW*~R*t$7pq10+_ax~(+?l!@Dp&{BfxId@_10Mqz-wFLCSSa3_e?I;P{xX0Wa5nU;E(H2cf^(t2`9(wpDo~)3 z8qh9Jmh?<)mcahRb|=pl+2ebX@3lQ@7l6Tgrr!nAwZW6(2}JPHQyWUZ2<2tY;3w0* z9Hs|vH{UH!Z2VpeY88MH&4K>**9x|2Qyc0QAmlg;u_;ZUx&_!9ka>trfSWLrx&`p( ztgNeYBU{_FsSULXK!x}J`&H12pN8*NB{u1{%D&fr3_6k{=^jv-ve9u=ASw_Qhzdjn lq5@HYs6bR8DsV(A@HZt!f&fd#NS%G|s0G|-o z{}=!$0~EX2x2h7zVlN5u3*PnV=V!Uy44$qACxAkpo-U3d9>O(LJd|W zFo^8v+VwD8AWp6=zOibjR2}Qnr>Tb>7#;K5rf(MH$O_)x*q;~dwfOd)J3UUqY|a)u bs;mq<59uCQHF4QlprJs+{an^LB{Ts5igrw% diff --git a/product/statusbar/src/main/ets/default/pages/control.ets b/product/statusbar/src/main/ets/default/pages/control.ets index b66ccbd7..99922d6a 100644 --- a/product/statusbar/src/main/ets/default/pages/control.ets +++ b/product/statusbar/src/main/ets/default/pages/control.ets @@ -21,7 +21,9 @@ import SignalIcon from '../../../../../../../features/signalcomponent/src/main/e import Log from '../../../../../../../common/src/main/ets/default/Log.ets' import Constants from './common/constants.ets' -const TAG = 'Control=====' +const TAG = 'StatusBar-Control'; + +let mWindowManager; @Component export default struct Control { @@ -30,7 +32,13 @@ export default struct Control { startY: number = 0 @State moveX: number = 0 @State moveY: number = 0 - + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + mWindowManager = new WindowManager(); + } + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear`) + } build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { statusBar() @@ -43,7 +51,7 @@ export default struct Control { } controlTouch(event: TouchEvent) { - Log.showInfo(TAG, 'controlTouch================') + Log.showInfo(TAG, `controlTouch================ event: ${ event }`) if (event.type == Constants.TOUCHTYPE_DOWN) { this.startX = event.touches[0].screenX this.startY = event.touches[0].screenY @@ -55,7 +63,7 @@ export default struct Control { Log.showInfo(TAG, `controlTouch, moveX: ${this.moveX}, moveY: ${this.moveY}`) if (this.moveY < -30) { this.showStatusBar = true; - WindowManager.setWindowMin() + mWindowManager.setWindowMin((result)=>{}); } } } @@ -80,4 +88,4 @@ struct statusBar { .height($r('app.float.statusbar_height')) .backgroundColor($r('app.color.statusbar_background')) } -} \ No newline at end of file +} diff --git a/product/statusbar/src/main/ets/default/pages/defaultLayout.ets b/product/statusbar/src/main/ets/default/pages/defaultLayout.ets index d1b41960..90b00b7c 100644 --- a/product/statusbar/src/main/ets/default/pages/defaultLayout.ets +++ b/product/statusbar/src/main/ets/default/pages/defaultLayout.ets @@ -18,32 +18,54 @@ import BatteryIcon from '../../../../../../../features/batterycomponent/src/main import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' import Constants from './common/constants.ets' +const TAG = 'StatusBar-DefaultLayout' @Component export default struct Index { private notificationList : any + private ListLength : number @StorageLink('wifiStatus') wifiStatus : boolean = false - + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + } + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear`) + } build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - SignalIcon() - WifiIcon() - }.width(this.wifiStatus ? $r('app.float.default_left_width_large') : $r('app.float.default_left_width_small')) - .margin({ left: 10 }) - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - ForEach(this.notificationList, (item: any) => { - Image(item.icon).objectFit(ImageFit.ScaleDown).height('50%') - }) - }.width(this.notificationList.length * Constants.DEFAULT_MIDDLE_PART_WIDTH) + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Column() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + SignalIcon() + WifiIcon() + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + ForEach(this.notificationList, (item: any) => { + Column() { + Image(item.icon).objectFit(ImageFit.ScaleDown).height('50%') + } + .width(45) + }) + if(this.ListLength > (this.wifiStatus ? 3 : 4)) { + Row() { + Text('...') + .fontSize(20) + } + } + } + .width(this.wifiStatus ? 4*45+20-50 : 4*45+20) + } + } + .width('65%') + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { BatteryIcon() ClockIcon() } + .width('35%') } .width('100%') .height('100%') .backgroundColor($r('app.color.default_background')) } -} \ No newline at end of file +} diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets index 2e91d9de..2a4af921 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -20,10 +20,13 @@ import WindowManager from '../../../../../../../common/src/main/ets/default/Wind import mNotificationService from '../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' import ControlCenterComponent from './control.ets' import Constants from './common/constants.ets' +import mBrightnessManager from '../../../../../../../features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets'; -const TAG = 'StatusBar=====' +const TAG = 'StatusBar-Index' -let mConfigReader +let mConfigReader; + +let mWindowManager; @Entry @Component @@ -34,15 +37,19 @@ struct Index { @State moveX: number = 0 @State moveY: number = 0 @State showStatusBar: boolean = true + @StorageLink('wifiStatus') wifiStatus : boolean = false @StorageLink('notificationList') notificationList : any = [] aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, showStatusBar: ${this.showStatusBar}`) - mNotificationService.initNotificationService() + mWindowManager = new WindowManager(); + mNotificationService.initNotificationService(); + mBrightnessManager.registerBrightnessListener(); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear, showStatusBar: ${this.showStatusBar}`) + Log.showInfo(TAG, `aboutToDisappear, showStatusBar: ${this.showStatusBar}`); + mBrightnessManager.unRegisterBrightnessListener(); } build() { @@ -50,7 +57,10 @@ struct Index { if (this.showStatusBar) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { DefaultLayout({ - notificationList: this.notificationList.length > 2 ? this.notificationList.slice(0,3) : this.notificationList }) + ListLength : this.notificationList.length, + notificationList: this.notificationList.length > (this.wifiStatus ? 2 : 3) ? + this.notificationList.slice(0,(this.wifiStatus ? 3 : 4)) : + this.notificationList }) } .width('100%') .height('100%') @@ -81,8 +91,8 @@ struct Index { Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`) if (this.moveY > 10) { this.showStatusBar = false; - WindowManager.setWindowMax() + mWindowManager.setWindowMax((result)=>{}); } } } -} \ No newline at end of file +} diff --git a/product/statusbar/src/main/ets/default/pages/notification.ets b/product/statusbar/src/main/ets/default/pages/notification.ets index 4374b000..95134788 100644 --- a/product/statusbar/src/main/ets/default/pages/notification.ets +++ b/product/statusbar/src/main/ets/default/pages/notification.ets @@ -15,7 +15,7 @@ import Log from '../../../../../../../common/src/main/ets/default/Log.ets' import Constants from './common/constants.ets' -import FeatureAbility from '@ohos.ability.featureAbility'; +import FeatureAbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' @@ -24,7 +24,10 @@ import notificationItem from '../../../../../../../features/noticeitem/src/main/ import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' import mNotificationService from '../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' -const TAG = 'StatusBar=====notification' +const TAG = 'StatusBar-notification' + +let mWindowManager; +let mFeatureAbilityManager; @Component export default @@ -36,7 +39,9 @@ struct Index { @State moveY: number = 0 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear2, showStatusBar: ${this.showStatusBar}`) + mWindowManager = new WindowManager(); + mFeatureAbilityManager = new FeatureAbilityManager(); + Log.showInfo(TAG, `aboutToAppear Start`) } build() { @@ -52,7 +57,7 @@ struct Index { } touchEvent(event: TouchEvent) { -// Log.showInfo(TAG, 'touchEvent================' + event.touches) + // Log.showInfo(TAG, 'touchEvent================' + event.touches) if (event.type == Constants.TOUCHTYPE_DOWN) { this.startX = event.touches[0].screenX this.startY = event.touches[0].screenY @@ -64,7 +69,9 @@ struct Index { Log.showInfo(TAG, `touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`) if (this.moveY < -30) { this.showStatusBar = true; - WindowManager.setWindowMin() + mWindowManager.setWindowMin((result)=>{ + + }) } } } @@ -142,6 +149,9 @@ struct quicklySetting { break; } } + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear, showStatusBar: ${this.showStatusBar}`) + } build() { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { @@ -174,7 +184,7 @@ struct quicklySetting { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End }) { Image($r('app.media.ic_settings')) .objectFit(ImageFit.Contain) - .onClick(this.settingClick.bind(this)) + .onClick(this.settingClick.bind(this)) } .width($r('app.float.quicklysetting_image_width')) .height($r('app.float.quicklysetting_image_height')) @@ -188,17 +198,17 @@ struct quicklySetting { } settingClick() { + Log.showInfo(TAG,` settingClick `) this.showStatusBar = true; - WindowManager.setWindowMin(); - let result = FeatureAbility.startAbility({ - want: { - bundleName: 'com.ohos.settings', - abilityName: 'com.ohos.settings.MainAbility', - }, - }).then(data => - Log.showInfo(TAG, `promise then: ${JSON.stringify(data)}`)).catch(error => - Log.showError(TAG, `promise catch: ${JSON.stringify(error)}`)); - Log.showInfo(TAG, `start ability ${result}`); + mWindowManager.setWindowMin((result)=>{ + mFeatureAbilityManager.openAbility(TAG, { + want: { + bundleName: 'com.ohos.settings', + abilityName: 'com.ohos.settings.MainAbility' + } + }); + }); + } } @@ -222,16 +232,16 @@ struct notificationItems { ListItem() { notificationItem({ itemObject: item, showStatusBar: $showStatusBar }) } - }, (item: any) => item.id.toString()) + }, (item: any) => item.hashcode.toString()) } - Image($r('app.media.delete_all')) //icon: remove all notifications - .objectFit(ImageFit.Contain) - .width($r('app.float.deleteall_image_width')) - .height($r('app.float.deleteall_image_height')) - .borderRadius($r('app.float.deleteall_image_borderradius')) - .opacity($r('app.float.deleteall_image_opacity')) - .onClick(this.removeAllNotification.bind(this)) - .position({ x: '44.5%', y: '85%' }) + Image($r('app.media.delete_all')) //icon: remove all notifications + .objectFit(ImageFit.Contain) + .width($r('app.float.deleteall_image_width')) + .height($r('app.float.deleteall_image_height')) + .borderRadius($r('app.float.deleteall_image_borderradius')) + .opacity($r('app.float.deleteall_image_opacity')) + .onClick(this.removeAllNotification.bind(this)) + .position({ x: '44.5%', y: '85%' }) } .width('100%') .height('100%') @@ -242,6 +252,7 @@ struct notificationItems { } removeAllNotification() { + Log.showInfo(TAG,` removeAllNotification `) mNotificationService.removeAllNotifications(); } } diff --git a/product/statusbar/src/main/ets/default/pages/twoGroupLayout.ets b/product/statusbar/src/main/ets/default/pages/twoGroupLayout.ets index a10e847c..98416c22 100644 --- a/product/statusbar/src/main/ets/default/pages/twoGroupLayout.ets +++ b/product/statusbar/src/main/ets/default/pages/twoGroupLayout.ets @@ -14,18 +14,24 @@ */ import Constants from '../common/constants.ets' -//import featureAbility from '@ohos.ability.featureability'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon.ets' +const TAG = 'StatusBar-TwoGroupLayout' @Component export default struct Index { private leftGroupOrder : any private rightGroupOrder : any private notificationList : any - + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + } + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisAppear`) + } build() { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { diff --git a/systemDialog/build.gradle b/product/systemDialog/build.gradle similarity index 60% rename from systemDialog/build.gradle rename to product/systemDialog/build.gradle index 6de6c8b2..920dbf0f 100644 --- a/systemDialog/build.gradle +++ b/product/systemDialog/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.huawei.ohos.hap' ohos { compileSdkVersion 6 defaultConfig { - compatibleSdkVersion 6 + compatibleSdkVersion 4 } entryModules "entry" supportSystem "standard" @@ -10,4 +10,6 @@ ohos { dependencies { entryImplementation project(':entry') + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + testCompile 'junit:junit:4.12' } diff --git a/systemDialog/package.json b/product/systemDialog/package.json similarity index 100% rename from systemDialog/package.json rename to product/systemDialog/package.json diff --git a/systemDialog/src/main/config.json b/product/systemDialog/src/main/config.json similarity index 85% rename from systemDialog/src/main/config.json rename to product/systemDialog/src/main/config.json index ada76ba5..e2d806ce 100644 --- a/systemDialog/src/main/config.json +++ b/product/systemDialog/src/main/config.json @@ -5,11 +5,6 @@ "version": { "code": 1, "name": "1.0" - }, - "apiVersion": { - "compatible": 4, - "target": 5, - "releaseType": "Beta1" } }, "deviceConfig": {}, @@ -36,15 +31,18 @@ } ], "js": [ - { + {"mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "pages": [ + "pages/index" + ], "name": "default", "window": { "designWidth": 720, "autoDesignWidth": false - }, - "pages": [ - "pages/index/index" - ] + } } ] } diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/colors.ets b/product/systemDialog/src/main/ets/default/app.ets similarity index 78% rename from features/navigationservice/src/main/ets/com/ohos/navigationservice/common/colors.ets rename to product/systemDialog/src/main/ets/default/app.ets index 1e830360..7b6ddecb 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/colors.ets +++ b/product/systemDialog/src/main/ets/default/app.ets @@ -13,6 +13,11 @@ * limitations under the License. */ -export default class colors { - -} \ No newline at end of file +export default { + onCreate() { + console.info('System dialog Application onCreate') + }, + onDestroy() { + console.info('System dialog Application onDestroy') + }, +} diff --git a/systemDialog/src/main/js/default/center/systemDialogCenter/SystemDialogCenter.js b/product/systemDialog/src/main/ets/default/dialogModel.ets similarity index 37% rename from systemDialog/src/main/js/default/center/systemDialogCenter/SystemDialogCenter.js rename to product/systemDialog/src/main/ets/default/dialogModel.ets index 92637890..33c07c9d 100644 --- a/systemDialog/src/main/js/default/center/systemDialogCenter/SystemDialogCenter.js +++ b/product/systemDialog/src/main/ets/default/dialogModel.ets @@ -13,45 +13,51 @@ * limitations under the License. */ -import featureAbility from '@ohos.ability.featureability'; - -import mLog from '../../common/utils/Log.js'; +import FeatureAbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; +import Log from '../../../../../../common/src/main/ets/default/Log.ets'; const TAG = 'SystemDialog_SystemDialogCenter'; -export default class SystemDialogCenter { +let listener; +let mFeatureAbilityManager = new FeatureAbilityManager(); + +export class DialogModel { - /** - * Get permission information + /** + * Page listener registration * - * @param {Object} callBack - Callback function + * @param {Object} callback - Function callback */ - getMessageWant(callBack) { - mLog.showInfo(TAG, 'getMessageWant Start'); - featureAbility.getWant((err, data) => { - let appArray = data; - mLog.showInfo(TAG, ` getMessageWant callBack ${JSON.stringify(appArray)}`); - callBack(appArray); - }); + registerListener(callback) { + if (callback == null && callback == undefined) { + Log.showInfo(TAG, 'registerListener callback is null or undefined'); + return; } + listener = callback; + mFeatureAbilityManager.getAbilityWant(listener) + } - /** + /** + * Page listener unregistration + */ + unregisterListener() { + listener = null; + } + + /** * Return of the authority information selected by the user * - * @param {Object} AbilityResult - information selected by the user + * @param {Object} abilityResult - information selected by the user */ - finishResult(AbilityResult){ - if(Object.keys(AbilityResult) .length != 0){ - mLog.showInfo(TAG, 'finishResult Start'); - mLog.showInfo(TAG, ` finishResult parameter ${JSON.stringify(AbilityResult)}`); - featureAbility.finishWithResult(AbilityResult, (err, data) => { - mLog.showInfo(TAG, 'finishResult finishWithResult callback'); - featureAbility.terminateAbility((err, data) => { - mLog.showInfo(TAG, 'finishResult terminateAbility callback'); - }); - }); - } else { - mLog.showInfo(TAG, 'finishResult AbilityResult is a empty object'); - } + finishResult(abilityResult) { + if (Object.keys(abilityResult).length !== 0) { + Log.showInfo(TAG, `finishResult parameter ${JSON.stringify(abilityResult)}`); + mFeatureAbilityManager.finishAbilityWithResult(abilityResult); + } else { + Log.showInfo(TAG, 'finishResult abilityResult is a empty object'); } -} \ No newline at end of file + } +} + +let mDialogModel = new DialogModel(); +export default mDialogModel as DialogModel; \ No newline at end of file diff --git a/product/systemDialog/src/main/ets/default/pages/index.ets b/product/systemDialog/src/main/ets/default/pages/index.ets new file mode 100644 index 00000000..fbf01e62 --- /dev/null +++ b/product/systemDialog/src/main/ets/default/pages/index.ets @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2021 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 DialogModel from '../dialogModel.ets'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'SystemDialog_Index'; + +let tempWorkArray = []; +let tempUnuseList = []; + +@Entry +@Component +struct Index { + @State useList: any = [] + @State workDataArray: any = [] + @State unUseList: any = [] + private getData: any; + + aboutToAppear() { + Log.showInfo(TAG, 'system dialog about to appear'); + DialogModel.registerListener(this.getMessage.bind(this)); + } + + aboutToDisappear() { + Log.showInfo(TAG, 'system dialog about to disappear'); + DialogModel.unregisterListener(); + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text($r('app.string.access_request')) + .fontSize(22) + .fontWeight(FontWeight.Bold) + .fontColor($r('app.color.title_font_color')) + .height(50) + }.width('100%') + + List() { + ForEach(this.workDataArray, (item) => { + ListItem() { + Flex({ + direction: FlexDirection.Row, + alignItems: ItemAlign.Center, + justifyContent: FlexAlign.SpaceAround + }) { + Text(item) + .fontSize(18) + .fontColor(Color.Black) + .width(250) + + Toggle({ type: ToggleType.Button, isOn: false }) + .width(60) + .height(40) + .onChange((isOn) => { + let index = this.useList.indexOf(item); + if (isOn) { + if (index === -1) { + this.useList.push(item) + this.unUseList.splice(index, 1) + } + } else { + if (index !== -1) { + this.useList.splice(index, 1) + this.unUseList.push(item) + } + } + }) + } + .width('100%') + .height(75) + }.height(75) + }, item => item); + }.divider({ strokeWidth: 1, color: $r('app.color.divider_line'), startMargin: 2, endMargin: 2 }) + .width('100%') + .height(200) + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceAround }) { + Button() { + Text($r('app.string.access_sure')).fontSize(20).fontColor($r('app.color.button_font_color')) + } + .width(100) + .height(50) + .onClick(() => this.makeSure()) + + Button() { + Text($r('app.string.access_cancel')).fontSize(20).fontColor($r('app.color.button_font_color')) + } + .width(100) + .height(50) + .onClick(() => this.cancelButton()) + }.width('100%') + }.width('100%') + } + +/** + * Get permission data + * @param {Object} resultData permission data Object + * + */ + getMessage(resultData) { + Log.showInfo(TAG, 'index getMessage result'); + let dataList = resultData?.parameters?.OHOS_REQUEST_PERMISSIONS_LIST; + if (dataList?.length !== 0) { + this.getData = resultData; + Log.showInfo(TAG, ` ge tMessageWant result Data ${JSON.stringify(resultData)}`); + // handle permission Data to show + for (let item of dataList) { + tempWorkArray.push(item); + tempUnuseList.push(item); + } + this.workDataArray = tempWorkArray; + this.unUseList = tempUnuseList; + Log.showInfo(TAG, ` getMessageWant work with data ${JSON.stringify(this.workDataArray)}`); + } else { + Log.showInfo(TAG, ' getMessageWant result Data is a empty object'); + } + } + + +/** + * User confirmation + */ + makeSure() { + Log.showInfo(TAG, ' makeSure Click'); + let want = { + parameters: { + OHOS_RESULT_PERMISSION_KEY: 1, + OHOS_RESULT_PERMISSIONS_LIST: this.getData.parameters.OHOS_REQUEST_PERMISSIONS_LIST, + OHOS_RESULT_PERMISSIONS_LIST_YES: this.useList, + OHOS_RESULT_PERMISSIONS_LIST_NO: this.unUseList, + OHOS_RESULT_CALLER_BUNDLERNAME: this.getData.parameters.OHOS_REQUEST_CALLER_BUNDLERNAME + } + }; + let AbilityResult = { + resultCode: 1, + want: want + }; + DialogModel.finishResult(AbilityResult); + } + +/** + * User canceled + */ + cancelButton() { + Log.showInfo(TAG, ' cancelButton Click'); + let want = { + parameters: { + OHOS_RESULT_PERMISSION_KEY: 1, + OHOS_RESULT_PERMISSIONS_LIST: this.getData.parameters.OHOS_REQUEST_PERMISSIONS_LIST, + OHOS_RESULT_CALLER_BUNDLERNAME: this.getData.parameters.OHOS_REQUEST_CALLER_BUNDLERNAME + } + }; + let abilityResult = { + resultCode: 0, + want: want + }; + DialogModel.finishResult(abilityResult); + } +} \ No newline at end of file diff --git a/product/systemDialog/src/main/resources/base/element/color.json b/product/systemDialog/src/main/resources/base/element/color.json new file mode 100644 index 00000000..287a554a --- /dev/null +++ b/product/systemDialog/src/main/resources/base/element/color.json @@ -0,0 +1,20 @@ +{ + "color": [ + { + "name": "dialog_bg", + "value": "#AAFFFF" + }, + { + "name": "divider_line", + "value": "#BEBEBE" + }, + { + "name": "button_font_color", + "value": "#FFFFFF" + }, + { + "name": "title_font_color", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/systemDialog/src/main/resources/base/element/string.json b/product/systemDialog/src/main/resources/base/element/string.json similarity index 46% rename from systemDialog/src/main/resources/base/element/string.json rename to product/systemDialog/src/main/resources/base/element/string.json index 4706d850..e15e6feb 100644 --- a/systemDialog/src/main/resources/base/element/string.json +++ b/product/systemDialog/src/main/resources/base/element/string.json @@ -7,6 +7,18 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "access_request", + "value": "权限申请" + }, + { + "name": "access_sure", + "value": "确定" + }, + { + "name": "access_cancel", + "value": "取消" } ] } \ No newline at end of file diff --git a/systemDialog/src/main/resources/base/media/icon.png b/product/systemDialog/src/main/resources/base/media/icon.png similarity index 100% rename from systemDialog/src/main/resources/base/media/icon.png rename to product/systemDialog/src/main/resources/base/media/icon.png diff --git a/product/systemDialog/src/main/resources/en_US/element/string.json b/product/systemDialog/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..e15e6feb --- /dev/null +++ b/product/systemDialog/src/main/resources/en_US/element/string.json @@ -0,0 +1,24 @@ +{ + "string": [ + { + "name": "app_name", + "value": "Dialog" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "access_request", + "value": "权限申请" + }, + { + "name": "access_sure", + "value": "确定" + }, + { + "name": "access_cancel", + "value": "取消" + } + ] +} \ No newline at end of file diff --git a/product/systemDialog/src/main/resources/zh_CN/element/string.json b/product/systemDialog/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..e15e6feb --- /dev/null +++ b/product/systemDialog/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,24 @@ +{ + "string": [ + { + "name": "app_name", + "value": "Dialog" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "access_request", + "value": "权限申请" + }, + { + "name": "access_sure", + "value": "确定" + }, + { + "name": "access_cancel", + "value": "取消" + } + ] +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 2ac679d6..5b56641c 100755 --- a/settings.gradle +++ b/settings.gradle @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -include ':entry', ':product:navigationBar', ':systemDialog', ':common', ':product:statusbar', +include ':entry', ':product:navigationBar', ':common', ':product:statusbar', ':product:systemDialog', ':features:control', ':features:batterycomponent', ':features:clockcomponent', ':features:signalcomponent', ':features:wificomponent', ':features:navigationservice', ':features:noticeitem', ':features:notificationservice' \ No newline at end of file diff --git a/systemDialog/.gitignore b/systemDialog/.gitignore deleted file mode 100644 index 8b137891..00000000 --- a/systemDialog/.gitignore +++ /dev/null @@ -1 +0,0 @@ - diff --git a/systemDialog/src/main/js/default/i18n/en-US.json b/systemDialog/src/main/js/default/i18n/en-US.json deleted file mode 100644 index d71202bc..00000000 --- a/systemDialog/src/main/js/default/i18n/en-US.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "strings": { - "dialogTitle": "Access Request", - "sure": "sure", - "cancel": "cancel" - } -} \ No newline at end of file diff --git a/systemDialog/src/main/js/default/i18n/zh-CN.json b/systemDialog/src/main/js/default/i18n/zh-CN.json deleted file mode 100644 index 842be8a9..00000000 --- a/systemDialog/src/main/js/default/i18n/zh-CN.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "strings": { - "dialogTitle": "权限申请", - "sure": "确认", - "cancel": "取消" - } -} \ No newline at end of file diff --git a/systemDialog/src/main/js/default/pages/index/index.css b/systemDialog/src/main/js/default/pages/index/index.css deleted file mode 100644 index 3cb64f28..00000000 --- a/systemDialog/src/main/js/default/pages/index/index.css +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2021 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. - */ - -.container { - flex-direction: column; - justify-content: center; - align-items: center; - border:1px solid #000 -} - -.dialog-title{ - height: 15%; - flex-direction: row; - align-items: center; - justify-content: center; -} -.dialog-title_txt{ - color: #000000; - font-weight: bold; - font-size: 46px; -} - -.btn-div { - width: 100%; - height: 19%; - flex-direction: row; - align-items: center; - justify-content: space-around; -} - -.txt { - color: #000000; - font-weight: bold; - font-size: 39px; -} - -.dialog-div { - flex-direction: column; - align-items: center; -} - -.list { - width: 100%; - height: 65%; -} - -.list-item { - width: 100%; - height: 130px; - display: flex; - flex: 1; - align-items: center; - justify-content: center; -} - -.item-box { - width: 100%; - height: 100%; - margin-left: 20px; - border-bottom-width: 3px; - border-color: #ACABAB; - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; -} -.layout { - width: 70%; -} -.switch { - width: 20%; - height: 100%; - display: flex; - float: right; - flex-direction: row; - align-items: center; - justify-content: center; -} - -.button { - height: 80px; - width: 180px; - background-color: #008CBA; - color: white; - text-align: center; - align-items: center; - justify-content: center; - text-decoration: none; - display: flex; - font-size: 32px; - margin: 4px 2px; - -} - -.button_cancel { - height: 80px; - width: 180px; - background-color: grey; - color: white; - text-align: center; - align-items: center; - justify-content: center; - text-decoration: none; - display: flex; - font-size: 32px; - margin: 4px 2px; -} \ No newline at end of file diff --git a/systemDialog/src/main/js/default/pages/index/index.hml b/systemDialog/src/main/js/default/pages/index/index.hml deleted file mode 100644 index ca4d84b8..00000000 --- a/systemDialog/src/main/js/default/pages/index/index.hml +++ /dev/null @@ -1,40 +0,0 @@ - - -

    \ No newline at end of file diff --git a/systemDialog/src/main/js/default/pages/index/index.js b/systemDialog/src/main/js/default/pages/index/index.js deleted file mode 100644 index 0280c19a..00000000 --- a/systemDialog/src/main/js/default/pages/index/index.js +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2021 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 mLog from '../../common/utils/Log.js'; -import SystemDialogCenter from '../../center/systemDialogCenter/SystemDialogCenter.js'; - -var mSystemDialogCenter = new SystemDialogCenter(); -const TAG = 'SystemDialog'; - -export default { - data: { - getData: '', - workDataArray: [], - useList: [], - unUseList: [] - }, - onInit() { - mLog.showInfo(TAG, ` onInitStart`); - }, - onShow() { - mLog.showInfo(TAG, ` onShowStart`); - // get the requested permission data - mSystemDialogCenter.getMessageWant(this.getMessage.bind(this)); - }, - - /** - * Get permission data - * @param {Object} resultData permission data Object - * - */ - getMessage(resultData) { - if (Object.keys(resultData).length != 0) { - this.getData = resultData; - mLog.showInfo(TAG, ` getMessageWant result Data ${JSON.stringify(resultData)}`); - // handle permission Data to show - for (let item of resultData.parameters.OHOS_REQUEST_PERMISSIONS_LIST) { - this.workDataArray.push( - { - permissions: item, - checked: false - } - ) - } - mLog.showInfo(TAG, ` getMessageWant work with data ${JSON.stringify(this.workDataArray)}`); - } else { - mLog.showInfo(TAG, ` getMessageWant result Data is a empty object`); - } - }, - - /** - * Processing of permission selection or cancellation - * @param {string} checked Selected status - * @param {string} permissions Selected permissions - */ - changeSwitch(checked, permissions) { - mLog.showInfo(TAG, ` changeSwitch start`); - mLog.showInfo(TAG, ` changeSwitch parameter checked: ${checked} permissions: ${permissions}`); - - let indexNum; - for (let i = 0; i < this.workDataArray.length; i++) { - if (permissions == this.workDataArray[i].permissions) { - indexNum = i; - } - } - - if (checked) { - this.workDataArray[indexNum].checked = false; - } else { - this.workDataArray[indexNum].checked = true; - } - mLog.showInfo(TAG, ` changeSwitch End`); - }, - - /** - * User confirmation - */ - makeSure() { - mLog.showInfo(TAG, ` makeSure Click`); - for (let item of this.workDataArray) { - if (item.checked) { - this.useList.push(item.permissions); - } else { - this.unUseList.push(item.permissions); - } - } - let want = { - parameters: { - OHOS_RESULT_PERMISSION_KEY: 1, - OHOS_RESULT_PERMISSIONS_LIST: this.getData.parameters.OHOS_REQUEST_PERMISSIONS_LIST, - OHOS_RESULT_PERMISSIONS_LIST_YES: this.useList, - OHOS_RESULT_PERMISSIONS_LIST_NO: this.unUseList, - OHOS_RESULT_CALLER_BUNDLERNAME: this.getData.parameters.OHOS_REQUEST_CALLER_BUNDLERNAME - }, - }; - - let AbilityResult = { resultCode: 1,want: want }; - - mSystemDialogCenter.finishResult(AbilityResult); - }, - - /** - * User canceled - */ - cancelButton() { - mLog.showInfo(TAG, ` cancelButton Click`); - let want = { - parameters: { - OHOS_RESULT_PERMISSION_KEY: 1, - OHOS_RESULT_PERMISSIONS_LIST: this.getData.parameters.OHOS_REQUEST_PERMISSIONS_LIST, - OHOS_RESULT_CALLER_BUNDLERNAME: this.getData.parameters.OHOS_REQUEST_CALLER_BUNDLERNAME - }, - }; - let AbilityResult = { resultCode: 0,want: want }; - mSystemDialogCenter.finishResult(AbilityResult); - } -} -- Gitee From 543fa849e5be8b9aacfecf039a1dceae4662a7b3 Mon Sep 17 00:00:00 2001 From: LiuZhenyu2021 Date: Sun, 19 Sep 2021 18:18:56 +0800 Subject: [PATCH 013/373] fix statusbar layout config Signed-off-by: LiuZhenyu2021 --- .../src/main/ets/default/timeModel.ets | 4 - .../ets/com/ohos/control/pages/UpTitle.ets | 1 + .../ets/com/ohos/noticeItem/item/longItem.ets | 6 +- .../com/ohos/noticeItem/item/multiItem.ets | 6 +- .../ohos/noticeItem/item/notificationItem.ets | 1 + .../com/ohos/noticeItem/item/titleItem.ets | 21 ++-- .../src/main/resources/base/media/down.png | Bin 509 -> 0 bytes .../base/media/ic_notification_down.png | Bin 0 -> 204 bytes .../base/media/ic_notification_up.png | Bin 0 -> 204 bytes .../src/main/resources/base/media/up.png | Bin 249 -> 0 bytes .../src/main/ets/default/pages/signalIcon.ets | 1 + .../src/main/ets/default/pages/index.ets | 12 +-- .../src/main/ets/default/pages/keyButton.ets | 1 + .../src/main/ets/default/pages/oneLayout.ets | 1 + .../main/ets/default/pages/threeLayout.ets | 1 + .../src/main/ets/default/common/constants.ets | 22 ---- .../ets/default/common/util/configReader.ets | 3 +- ...faultLayout.ets => ConfigurableLayout.ets} | 102 +++++++++++------- .../ets/default/pages/common/constants.ets | 25 +++-- .../src/main/ets/default/pages/index.ets | 15 +-- .../main/ets/default/pages/notification.ets | 85 +++++++-------- .../main/ets/default/pages/twoGroupLayout.ets | 79 -------------- .../main/resources/rawfile/layoutConfig.json | 14 ++- 23 files changed, 160 insertions(+), 240 deletions(-) delete mode 100644 features/noticeitem/src/main/resources/base/media/down.png create mode 100644 features/noticeitem/src/main/resources/base/media/ic_notification_down.png create mode 100644 features/noticeitem/src/main/resources/base/media/ic_notification_up.png delete mode 100644 features/noticeitem/src/main/resources/base/media/up.png delete mode 100644 product/statusbar/src/main/ets/default/common/constants.ets rename product/statusbar/src/main/ets/default/pages/{defaultLayout.ets => ConfigurableLayout.ets} (40%) delete mode 100644 product/statusbar/src/main/ets/default/pages/twoGroupLayout.ets diff --git a/features/clockcomponent/src/main/ets/default/timeModel.ets b/features/clockcomponent/src/main/ets/default/timeModel.ets index 22ff486b..ad1c4cef 100644 --- a/features/clockcomponent/src/main/ets/default/timeModel.ets +++ b/features/clockcomponent/src/main/ets/default/timeModel.ets @@ -81,7 +81,6 @@ export class TimeModel { * @param {Object} date - Object of Date. */ private updateTime(date) { - Log.showInfo(TAG,`updateDay, date:${JSON.stringify(date)}`) let time = date.toTimeString().substring(0, 5); mTimeLink.set(time); } @@ -92,7 +91,6 @@ export class TimeModel { * @param {Object} date - Object of Date. */ private updateDay(date) { - Log.showInfo(TAG,`updateDay, date:${JSON.stringify(date)}`) let day = date.getDate(); mDayLink.set(day); } @@ -103,7 +101,6 @@ export class TimeModel { * @param {Object} date - Object of Date. */ private updateWeekDay(date) { - Log.showInfo(TAG,`updateWeekDay, date:${JSON.stringify(date)}`) let weekDay = date.getDay(); mWeekDayLink.set(weekDay); } @@ -114,7 +111,6 @@ export class TimeModel { * @param {Object} date - Object of Date. */ private updateMonth(date) { - Log.showInfo(TAG,`updateMonth, date:${JSON.stringify(date)}`) let month = (date.getMonth() + 1); mMonthLink.set(month); } diff --git a/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets b/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets index 98206cee..399dac02 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets @@ -31,6 +31,7 @@ struct UpTitle { mWindowManager = new WindowManager(); mFeatureAbilityManager = new FeatureAbilityManager(); } + aboutToDisappear () { Log.showInfo(TAG,'aboutToDisappear') } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets index 036db5c1..1d819ce5 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets @@ -38,7 +38,7 @@ struct longItem { @Prop notificationIconDisplay: string private notificationWant: any @State isExpand: boolean = false - @State srcIconDisplay: any = $r('app.media.down') + @State srcIconDisplay: any = $r('app.media.ic_notification_down') @State needExpand: boolean = false @State iconDisplay: boolean = false; @State itemWidth: string = '100%' @@ -65,6 +65,7 @@ struct longItem { Log.showInfo(TAG, `aboutToAppear showMaxLines: ${this.showMaxLines} ${typeof this.showMaxLines}`) } + aboutToDisappear(){ Log.showInfo(TAG, `aboutToDisAppear id: ${this.notificationId}`) } @@ -96,6 +97,7 @@ struct longItem { } .width('100%') .margin({ top: $r('app.float.body_margin_top') }) + .onClick(this.clickNotificationItem.bind(this)) } .backgroundColor($r('app.color.notificationitem_background')) .opacity($r('app.float.item_opicaty')) @@ -112,7 +114,7 @@ struct longItem { }) .onTouch(this.touchNotificationItem.bind(this)) .width(this.itemWidth) - .onClick(this.clickNotificationItem.bind(this)) + if (this.iconDisplay) { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets index 2fd618b0..ab9bb5f0 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets @@ -38,7 +38,7 @@ struct multiItem { @Prop notificationIconDisplay: string private notificationWant: any @State isExpand: boolean = false - @State srcIconDisplay: any = $r('app.media.down') + @State srcIconDisplay: any = $r('app.media.ic_notification_down') @State needExpand: boolean = false @State iconDisplay: boolean = false; @State itemWidth: string = '100%' @@ -96,7 +96,7 @@ struct multiItem { } .width('100%') .margin({ top: $r('app.float.body_margin_top') }) - + .onClick(this.clickNotificationItem.bind(this)) } .backgroundColor($r('app.color.notificationitem_background')) .opacity($r('app.float.item_opicaty')) @@ -113,7 +113,7 @@ struct multiItem { }) .onTouch(this.touchNotificationItem.bind(this)) .width(this.itemWidth) - .onClick(this.clickNotificationItem.bind(this)) + if (this.iconDisplay) { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets index 95cfbc49..08a59a4e 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets @@ -44,6 +44,7 @@ struct notificationItem { break; } } + aboutToDisappear(){ Log.showInfo(TAG, `aboutToDisAppear`) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets index 94a83730..01494740 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets @@ -30,9 +30,11 @@ struct titleItem { aboutToAppear() { Log.showInfo(TAG, `aboutToDisAppear Start`) } + aboutToDisappear(){ Log.showInfo(TAG, `aboutToDisAppear`) } + build() { Row() { Row({ space: this.rowSpace }) { @@ -53,21 +55,20 @@ struct titleItem { .objectFit(ImageFit.Contain) .width($r('app.float.displayicon_width')) .height($r('app.float.displayicon_height')) - .onClick(() => { - if (this.isExpand) { - this.isExpand = false - this.srcIconDisplay = $r('app.media.down') - } else { - this.isExpand = true - this.srcIconDisplay = $r('app.media.up') - } - }) } } .width('20%') } .height($r('app.float.titleitem_height')) .width('100%') - + .onClick(() => { + if (this.isExpand) { + this.isExpand = false + this.srcIconDisplay = $r('app.media.ic_notification_down') + } else { + this.isExpand = true + this.srcIconDisplay = $r('app.media.ic_notification_up') + } + }) } } diff --git a/features/noticeitem/src/main/resources/base/media/down.png b/features/noticeitem/src/main/resources/base/media/down.png deleted file mode 100644 index 96bb34d432253a883df1288da2fe87f76502e693..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 509 zcmVk z7=pwlxg~ji@AL2fH-ig5?85V*2B;ON71&dt)9Ktc8jZG;a(vE+a?VHA+GIYTf2RBH z0SFGEIyFn1p z@D?Ke7-M=#k}SLcsE8n%&1M1sSBN+>#`Ni1?tCdd*XUvd$QLasQsB zl(eq!@dC&uW4&JAWiJ$WfqfJ?K99s3z(H)!b|)FWj;{>h+)WT|L`;k^8&ig1xN$rp z{u*PtzG+=e_-w=Zi7}o}|FGY1;8c$tZ(3`Uuhu z34-1a#jkQS0)l=3uge0)t|Uz}DY$BAX5c1O#r}S{Cqv z%UWioea@159hwT8H;eY&@o6=Fymm&!Bz2?86^jiYMfJFx?EWii{x9>J2=^D;vr2zw zXD!^fGq22Oz)k!c~3>pn$p)g zpH3!z=69`%KchE){kjvI1%J%hetqZM56sLA4AF&5i(2PiwMi8@40IlYr>mdKI;Vst E09jyCt^fc4 literal 0 HcmV?d00001 diff --git a/features/noticeitem/src/main/resources/base/media/up.png b/features/noticeitem/src/main/resources/base/media/up.png deleted file mode 100644 index ee8627bbfc3e26c75682aec0a5a0061780b85dae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ1D-C9ArbCxuQ>7^au8^JxSwkU zi;6;{m4lb6A|ty3Bd5m#z7r~&IWren|E{`m`pwSS-@lexG0#1J!E!!J3iC||vkluD zFN)ucj?JiM5UczCfOCR?)`FJ#G9Oq}T9|(D#mf{hsJLh+$kvq|V4fhL+YtZo+qJSc z!5$qN3EF%9FbF9zb+nxBkXoP`r@q_Pq1xje8*eEz@BcRc-^M@6VNXVp00i_>zopr0FcjH-~a#s diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index cf16a2d9..326c59cb 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -52,6 +52,7 @@ struct SignalIcon { .objectFit(ImageFit.ScaleDown) }.flexShrink(1) } + .margin({ left: 5}) .width($r('app.float.signalicon_width')) .height('50%') } diff --git a/product/navigationBar/src/main/ets/default/pages/index.ets b/product/navigationBar/src/main/ets/default/pages/index.ets index 3ebc1384..25711dc3 100644 --- a/product/navigationBar/src/main/ets/default/pages/index.ets +++ b/product/navigationBar/src/main/ets/default/pages/index.ets @@ -14,9 +14,7 @@ */ import Three from './threeLayout.ets' -import One from './oneLayout.ets' import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import ConfigReader from '../common/utils/configReader.ets' import Constants from '../common/constants.ets' const STORAGE_NAVIGATION_TYPE = 'navigationType' @@ -30,10 +28,6 @@ struct Index { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) - if (mConfigReader == null || mConfigReader == undefined) { - mConfigReader = new ConfigReader() - mConfigReader.readLayoutConfig() - } } aboutToDisappear(){ Log.showInfo(TAG, `aboutToDisAppear`) @@ -41,11 +35,7 @@ struct Index { build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - if (this.mConfig.type === Constants.THREE_ICON_LAYOUT) { - Three(); - } else if (this.mConfig.type === Constants.ONE_ICON_LAYOUT) { - One(); - } + Three(); } .width('100%') .height('100%') diff --git a/product/navigationBar/src/main/ets/default/pages/keyButton.ets b/product/navigationBar/src/main/ets/default/pages/keyButton.ets index 932ccca4..05b938a4 100644 --- a/product/navigationBar/src/main/ets/default/pages/keyButton.ets +++ b/product/navigationBar/src/main/ets/default/pages/keyButton.ets @@ -30,6 +30,7 @@ export default struct keyButton { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) } + aboutToDisappear(){ Log.showInfo(TAG, `aboutToDisAppear`) } diff --git a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets b/product/navigationBar/src/main/ets/default/pages/oneLayout.ets index b2c58af9..909554a9 100644 --- a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets +++ b/product/navigationBar/src/main/ets/default/pages/oneLayout.ets @@ -30,6 +30,7 @@ export default struct oneLayout { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) } + aboutToDisappear(){ Log.showInfo(TAG, `aboutToDisAppear`) } diff --git a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets b/product/navigationBar/src/main/ets/default/pages/threeLayout.ets index 3fa4e6bc..01087f55 100644 --- a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets +++ b/product/navigationBar/src/main/ets/default/pages/threeLayout.ets @@ -39,6 +39,7 @@ struct threeLayout { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) } + aboutToDisappear(){ Log.showInfo(TAG, `aboutToDisAppear`) } diff --git a/product/statusbar/src/main/ets/default/common/constants.ets b/product/statusbar/src/main/ets/default/common/constants.ets deleted file mode 100644 index 2fb26d14..00000000 --- a/product/statusbar/src/main/ets/default/common/constants.ets +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 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 default -class constants{ - static WIFI = 'wifi' - static SIGNAL = 'signal' - static CLOCK = 'clock' - static BATTERY = 'battery' -} \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/common/util/configReader.ets b/product/statusbar/src/main/ets/default/common/util/configReader.ets index 17e132c5..6f68d2f0 100644 --- a/product/statusbar/src/main/ets/default/common/util/configReader.ets +++ b/product/statusbar/src/main/ets/default/common/util/configReader.ets @@ -52,8 +52,7 @@ export default class ConfigReader { public readLayoutConfig() { Log.showInfo(TAG, "SystemUI ConfigReader readLayoutConfig start"); var configObj = this.readFileToJson(DEFAULT_LAYOUT_INFO_FILE_PATH) - var mAppStorage = AppStorage.GetOrCreate(); - var mLayoutConfig = mAppStorage.link("layoutConfig"); + var mLayoutConfig = AppStorage.SetAndLink("layoutConfig", {}); mLayoutConfig.set(configObj) } } \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/defaultLayout.ets b/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets similarity index 40% rename from product/statusbar/src/main/ets/default/pages/defaultLayout.ets rename to product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets index 90b00b7c..904a9e70 100644 --- a/product/statusbar/src/main/ets/default/pages/defaultLayout.ets +++ b/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets @@ -13,59 +13,89 @@ * limitations under the License. */ - +import Constants from './common/constants.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from './common/constants.ets' +import ConfigReader from '../common/util/configReader.ets' + +const TAG = 'StatusBar-TwoGroupLayout' + +let mConfigReader; -const TAG = 'StatusBar-DefaultLayout' @Component -export default struct Index { - private notificationList : any - private ListLength : number - @StorageLink('wifiStatus') wifiStatus : boolean = false +export default +struct Index { + @StorageLink('notificationList') notificationList: any = [] + @StorageLink('layoutConfig') layoutConfig: any = {} + @StorageLink('wifiStatus') wifiStatus: boolean = false + aboutToAppear() { + if (mConfigReader == null || mConfigReader == undefined) { + mConfigReader = new ConfigReader() + mConfigReader.readLayoutConfig() + } Log.showInfo(TAG, `aboutToAppear Start`) } - aboutToDisappear(){ + + aboutToDisappear() { Log.showInfo(TAG, `aboutToDisAppear`) } + build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { - Column() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - SignalIcon() - WifiIcon() - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - ForEach(this.notificationList, (item: any) => { - Column() { - Image(item.icon).objectFit(ImageFit.ScaleDown).height('50%') - } - .width(45) - }) - if(this.ListLength > (this.wifiStatus ? 3 : 4)) { + Row() { + ForEach(this.layoutConfig.Groups, (item: any) => { + Row() { + ForEach(item.Components, (item: string) => { + if (item == Constants.WIFI) { + WifiIcon() + } + if (item == Constants.SIGNAL) { + SignalIcon() + } + if (item == Constants.CLOCK) { + ClockIcon() + } + if (item == Constants.BATTERY) { + BatteryIcon() + } + if (item == Constants.NOTIFICATION) { Row() { - Text('...') - .fontSize(20) + if (this.notificationList.length > 3) { + ForEach(this.notificationList.slice(0, 3), (item: any) => { + Image(item.icon) + .objectFit(ImageFit.ScaleDown) + .height('50%') + .width(45) + }) + Row() { + Text('...') + .fontSize(20) + } + } else { + ForEach(this.notificationList, (item: any) => { + Image(item.icon) + .objectFit(ImageFit.ScaleDown) + .height('50%') + .width(45) + }) + } } + .width(this.notificationList.length > 3 ? 45 * 4 : 45 * this.notificationList.length) } - } - .width(this.wifiStatus ? 4*45+20-50 : 4*45+20) - } - } - .width('65%') + }) + }.constraintSize({ maxWidth: 200 }) - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - BatteryIcon() - ClockIcon() - } - .width('35%') + if (item.id < this.layoutConfig.Groups.length) { + Text('') + .layoutWeight(1) + } + }) } .width('100%') .height('100%') - .backgroundColor($r('app.color.default_background')) + .backgroundColor($r("app.color.twogroup_layout_background")) } -} +} \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/common/constants.ets b/product/statusbar/src/main/ets/default/pages/common/constants.ets index 14dd4f6f..bfb17377 100644 --- a/product/statusbar/src/main/ets/default/pages/common/constants.ets +++ b/product/statusbar/src/main/ets/default/pages/common/constants.ets @@ -19,14 +19,25 @@ export default class Constants { static TOUCHTYPE_UP = 1; static TOUCHTYPE_MOVE = 2; - static WEEKDAY_MONDAY = 1; - static WEEKDAY_TUESDAY = 2; - static WEEKDAY_WEDNESDAY = 3; - static WEEKDAY_THURSDAY = 4; - static WEEKDAY_FRIDAY = 5; - static WEEKDAY_SATURDAY = 6; - static WEEKDAY_SUNDAY = 7; + static WEEKDAY_LIST = [ + $r('app.string.monday'), + $r('app.string.tuesday'), + $r('app.string.wednesday'), + $r('app.string.thursday'), + $r('app.string.friday'), + $r('app.string.saturday'), + $r('app.string.sunday') + ] static DIGITS = 10; static DEFAULT_MIDDLE_PART_WIDTH = 70; + + static MARK_MONTH = 0; + static MARK_DAY = 1; + + static WIFI = 'wifi' + static SIGNAL = 'signal' + static CLOCK = 'clock' + static BATTERY = 'battery' + static NOTIFICATION = 'notification' } \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets index 2a4af921..fe6ac8df 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -14,9 +14,10 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -import DefaultLayout from './defaultLayout.ets' +import ConfigurableLayout from './ConfigurableLayout.ets' import Notification from './notification.ets' import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' +import ConfigReader from '../common/util/configReader.ets' import mNotificationService from '../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' import ControlCenterComponent from './control.ets' import Constants from './common/constants.ets' @@ -24,24 +25,20 @@ import mBrightnessManager from '../../../../../../../features/control/src/main/e const TAG = 'StatusBar-Index' -let mConfigReader; - let mWindowManager; @Entry @Component struct Index { - @StorageLink('layoutConfig') layoutConfig: any = {} startX: number = 0 startY: number = 0 @State moveX: number = 0 @State moveY: number = 0 @State showStatusBar: boolean = true - @StorageLink('wifiStatus') wifiStatus : boolean = false - @StorageLink('notificationList') notificationList : any = [] aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, showStatusBar: ${this.showStatusBar}`) + mWindowManager = new WindowManager(); mNotificationService.initNotificationService(); mBrightnessManager.registerBrightnessListener(); @@ -56,11 +53,7 @@ struct Index { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { if (this.showStatusBar) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - DefaultLayout({ - ListLength : this.notificationList.length, - notificationList: this.notificationList.length > (this.wifiStatus ? 2 : 3) ? - this.notificationList.slice(0,(this.wifiStatus ? 3 : 4)) : - this.notificationList }) + ConfigurableLayout() } .width('100%') .height('100%') diff --git a/product/statusbar/src/main/ets/default/pages/notification.ets b/product/statusbar/src/main/ets/default/pages/notification.ets index 95134788..559a723a 100644 --- a/product/statusbar/src/main/ets/default/pages/notification.ets +++ b/product/statusbar/src/main/ets/default/pages/notification.ets @@ -57,7 +57,6 @@ struct Index { } touchEvent(event: TouchEvent) { - // Log.showInfo(TAG, 'touchEvent================' + event.touches) if (event.type == Constants.TOUCHTYPE_DOWN) { this.startX = event.touches[0].screenX this.startY = event.touches[0].screenY @@ -111,44 +110,13 @@ struct quicklySetting { aboutToAppear() { Log.showInfo(TAG, `quicklySetting, aboutToAppear`) //show month - if (this.mMonth < Constants.DIGITS) { - this.showMonth = '0' + this.mMonth; - } else { - this.showMonth = '' + this.mMonth; - } + this.showMonth = this.alignmentNumber(this.mMonth); //show day - if (this.mDay < Constants.DIGITS) { - this.showDay = '0' + this.mDay; - } else { - this.showDay = '' + this.mDay; - } + this.showDay = this.alignmentNumber(this.mDay); //show weekDay - switch (this.mWeekDay) { - case Constants.WEEKDAY_MONDAY: - this.showWeekDay = $r('app.string.monday'); - break; - case Constants.WEEKDAY_TUESDAY: - this.showWeekDay = $r('app.string.tuesday'); - break; - case Constants.WEEKDAY_WEDNESDAY: - this.showWeekDay = $r('app.string.wednesday'); - break; - case Constants.WEEKDAY_THURSDAY: - this.showWeekDay = $r('app.string.thursday'); - break; - case Constants.WEEKDAY_FRIDAY: - this.showWeekDay = $r('app.string.friday'); - break; - case Constants.WEEKDAY_SATURDAY: - this.showWeekDay = $r('app.string.saturday'); - break; - case Constants.WEEKDAY_SUNDAY: - this.showWeekDay = $r('app.string.sunday'); - break; - default: - break; - } + this.showWeekDay = Constants.WEEKDAY_LIST[this.mWeekDay-1]; } + aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear, showStatusBar: ${this.showStatusBar}`) } @@ -160,18 +128,8 @@ struct quicklySetting { .fontColor($r('app.color.quicklysetting_time_fontcolor')) .fontSize($r('app.float.quicklysetting_time_fontsize')) Flex({direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center}){ - Text(this.showMonth) - .fontColor($r('app.color.quicklysetting_date_fontcolor')) - .fontSize($r('app.float.quicklysetting_date_fontsize')) - Text($r('app.string.month')) - .fontColor($r('app.color.quicklysetting_date_fontcolor')) - .fontSize($r('app.float.quicklysetting_date_fontsize')) - Text(this.showDay) - .fontColor($r('app.color.quicklysetting_date_fontcolor')) - .fontSize($r('app.float.quicklysetting_date_fontsize')) - Text($r('app.string.day')) - .fontColor($r('app.color.quicklysetting_date_fontcolor')) - .fontSize($r('app.float.quicklysetting_date_fontsize')) + dateItem({number: this.showMonth, unit: Constants.MARK_MONTH}) + dateItem({number: this.showDay, unit: Constants.MARK_DAY}) Text(this.showWeekDay) .fontColor($r('app.color.quicklysetting_date_fontcolor')) .fontSize($r('app.float.quicklysetting_date_fontsize')) @@ -208,7 +166,38 @@ struct quicklySetting { } }); }); + } + alignmentNumber(timeOrDate){ + if(timeOrDate < Constants.DIGITS){ + return '0' + timeOrDate + }else{ + return '' + timeOrDate + } + } +} + +@Component +struct dateItem { + @Prop number: string + @Prop unit: number + + build() { + Row() { + Text(this.number) + .fontColor($r('app.color.quicklysetting_date_fontcolor')) + .fontSize($r('app.float.quicklysetting_date_fontsize')) + if (this.unit == Constants.MARK_MONTH) { + Text($r('app.string.month')) + .fontColor($r('app.color.quicklysetting_date_fontcolor')) + .fontSize($r('app.float.quicklysetting_date_fontsize')) + } + if (this.unit == Constants.MARK_DAY) { + Text($r('app.string.day')) + .fontColor($r('app.color.quicklysetting_date_fontcolor')) + .fontSize($r('app.float.quicklysetting_date_fontsize')) + } + } } } diff --git a/product/statusbar/src/main/ets/default/pages/twoGroupLayout.ets b/product/statusbar/src/main/ets/default/pages/twoGroupLayout.ets deleted file mode 100644 index 98416c22..00000000 --- a/product/statusbar/src/main/ets/default/pages/twoGroupLayout.ets +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2021 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 Constants from '../common/constants.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' -import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' -import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' -import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon.ets' -const TAG = 'StatusBar-TwoGroupLayout' - -@Component -export default struct Index { - private leftGroupOrder : any - private rightGroupOrder : any - private notificationList : any - aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) - } - aboutToDisappear(){ - Log.showInfo(TAG, `aboutToDisAppear`) - } - build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - ForEach(this.leftGroupOrder, (item: string) => { - if (item == Constants.WIFI) { - WifiIcon() - } - if (item == Constants.SIGNAL) { - SignalIcon() - } - if (item == Constants.CLOCK) { - ClockIcon() - } - if (item == Constants.BATTERY) { - BatteryIcon() - } - }) - } - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - ForEach(this.notificationList, (item: any) => { - Image(item.icon).objectFit(ImageFit.ScaleDown).height('50%') - }) - } - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - ForEach(this.rightGroupOrder, (item: string) => { - if (item == Constants.WIFI) { - WifiIcon() - } - if (item == Constants.SIGNAL) { - SignalIcon() - } - if (item == Constants.CLOCK) { - ClockIcon() - } - if (item == Constants.BATTERY) { - BatteryIcon() - } - }) - } - } - .width('100%') - .height('100%') - .backgroundColor($r("app.color.Colors.twogroup_layout_background")) - } -} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/rawfile/layoutConfig.json b/product/statusbar/src/main/resources/rawfile/layoutConfig.json index 2e8a01b7..e9324754 100644 --- a/product/statusbar/src/main/resources/rawfile/layoutConfig.json +++ b/product/statusbar/src/main/resources/rawfile/layoutConfig.json @@ -1,7 +1,11 @@ { - "groupNumber" : 2, - "twoGroups": { - "leftGroupOrder": ["signal","wifi"], - "rightGroupOrder": ["battery","clock"] - } + "Groups": [ + { "id": 1, + "Components": ["signal", "wifi", "notification"] + }, + { + "id": 2, + "Components": ["battery", "clock"] + } + ] } \ No newline at end of file -- Gitee From 9f7f277a9bd0edaeca499ee08a333943e1a4b53f Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Wed, 22 Sep 2021 19:51:18 +0800 Subject: [PATCH 014/373] [SystemUI] change wifi connection 1. change wifi connection Signed-off-by: liuss0301 --- .../wificomponent/src/main/ets/default/common/constants.ets | 2 +- .../wificomponent/src/main/ets/default/pages/wifiIcon.ets | 2 +- features/wificomponent/src/main/ets/default/wifiModel.ets | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/features/wificomponent/src/main/ets/default/common/constants.ets b/features/wificomponent/src/main/ets/default/common/constants.ets index e453e111..c0aa03a0 100644 --- a/features/wificomponent/src/main/ets/default/common/constants.ets +++ b/features/wificomponent/src/main/ets/default/common/constants.ets @@ -31,7 +31,7 @@ export default class constants { static WIFI_SIGNAL_FULL: number = 4 static WIFI_POWER_OFF: number = 1 static WIFI_POWER_ON: number = 3 - static WIFI_STATE_AP_CONNECTING: number = 3 + static WIFI_STATE_AP_CONNECTING: number = 1 static WIFI_Disconnected: number = 9 static DEFAULT_ERR_CODE: number = 0 static UPDATE_WIFI_INFO_DEFAULT_PARAM: number = -60 diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index 90f1ac7b..0db0ce94 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -36,7 +36,7 @@ export default struct WifiIcon { build() { Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { if (this.wifiStatus) { - Image(this.getImage(this.wifiInfo)).objectFit(ImageFit.ScaleDown) + Image(this.getImage(this.wifiInfo)).objectFit(ImageFit.Contain) } } .width(this.wifiStatus ? $r('app.float.WIFISTATUS_MAXWIDTH') : 0) diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ets b/features/wificomponent/src/main/ets/default/wifiModel.ets index f1fd1280..a473c07b 100644 --- a/features/wificomponent/src/main/ets/default/wifiModel.ets +++ b/features/wificomponent/src/main/ets/default/wifiModel.ets @@ -93,7 +93,7 @@ export class WifiModel { Log.showInfo(TAG, `createWifiStatusSubscriberCallBack start err:${ JSON.stringify(err)} data: ${ JSON.stringify(data) }`); if (err.code == Constants.DEFAULT_ERR_CODE) { Log.showInfo(TAG, `wifi data == ${JSON.stringify(data)}`); - if (data.event == Constants.EVENT_CONN_STATE && data.code ==Constants.WIFI_STATE_AP_CONNECTING) { + if (data.event == Constants.EVENT_CONN_STATE && data.code == Constants.WIFI_STATE_AP_CONNECTING) { this.updateWifiInfo(); this.changeWifiStatus(true); } @@ -150,6 +150,7 @@ export class WifiModel { private updateWifiInfo(rssi=Constants.UPDATE_WIFI_INFO_DEFAULT_PARAM,band=Constants.SIGN_LEVEL) { Log.showInfo(TAG, `enter changeWifiInfos ================ ${rssi}+${band}`); mWifiInfo.set(this.getWifiInfo(rssi,band)) + Log.showInfo(TAG, `mWifiInfo wifiInfo ${mWifiInfo.get()}`); } private updateWifiName(name) { @@ -169,7 +170,7 @@ export class WifiModel { Log.showInfo(TAG, `getWifiImage enter =========`); //Fake number of band and rssi for wifi signal level temporarily let level = WifiInfo.getSignalLevel(rssi, band); - Log.showInfo(TAG, `signal level = ${level}`); + Log.showInfo(TAG, `wifi level = ${level}`); return level; } -- Gitee From 7da818a77889749cc23bcc4f0ff1fbe9264cb21a Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Thu, 23 Sep 2021 14:55:44 +0800 Subject: [PATCH 015/373] [SystemUI] Add screen adaptation code Signed-off-by: liuss0301 --- common/src/main/ets/default/WindowManager.ets | 28 +++++++++++++++---- .../src/main/ets/default/pages/control.ets | 6 ++-- .../src/main/ets/default/pages/index.ets | 7 +++-- .../main/ets/default/pages/notification.ets | 7 +++-- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/common/src/main/ets/default/WindowManager.ets b/common/src/main/ets/default/WindowManager.ets index db14a28b..342f7e6d 100644 --- a/common/src/main/ets/default/WindowManager.ets +++ b/common/src/main/ets/default/WindowManager.ets @@ -14,18 +14,36 @@ */ import Window from '@ohos.window'; +import display from '@ohos.display' import Log from './Log.ets'; const TAG = 'WindowManager'; -const MAX_WIDTH = 480; -const MAX_HEIGHT = 893; -const MIN_HEIGHT = 67; +const STATUS_BAR_H = 0.07; + +var maxWidth; +var maxHeight; +var minHeight; /** * Manage window size changes. */ export default class WindowManager { + initWindowManager(){ + Log.showInfo(TAG, 'initWindowManager '); + maxWidth = AppStorage.SetAndLink("maxWidth", 0); + maxHeight = AppStorage.SetAndLink("maxHeight", 0); + minHeight = AppStorage.SetAndLink("minHeight", 0); + + display.getDefaultDisplay().then(dis => { + maxWidth.set(dis.width); + maxHeight.set(dis.height); + minHeight.set(parseInt((dis.height*STATUS_BAR_H).toString())); + + Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth.get()} maxHeight ${maxHeight.get()} minHeight ${minHeight.get()}`); + }) + } + /** * Set the window to the maximum size. * @@ -34,7 +52,7 @@ export default class WindowManager { setWindowMax(callback) { Log.showInfo(TAG, 'enter setWindowMax ================='); Window.getTopWindow().then((windowData)=> { - windowData.resetSize(MAX_WIDTH, MAX_HEIGHT).then((result)=> { + windowData.resetSize(maxWidth.get(), maxHeight.get()).then((result)=> { Log.showInfo(TAG, result); callback(result); }); @@ -49,7 +67,7 @@ export default class WindowManager { setWindowMin(callback) { Log.showInfo(TAG, 'enter setWindowMin ================='); Window.getTopWindow().then((windowData)=> { - windowData.resetSize(MAX_WIDTH, MIN_HEIGHT).then((result)=> { + windowData.resetSize(maxWidth.get(), minHeight.get()).then((result)=> { Log.showInfo(TAG, result); callback(result); }); diff --git a/product/statusbar/src/main/ets/default/pages/control.ets b/product/statusbar/src/main/ets/default/pages/control.ets index 99922d6a..e6e2c41c 100644 --- a/product/statusbar/src/main/ets/default/pages/control.ets +++ b/product/statusbar/src/main/ets/default/pages/control.ets @@ -28,6 +28,7 @@ let mWindowManager; @Component export default struct Control { @Link showStatusBar: boolean + private minHeight: number startX: number = 0 startY: number = 0 @State moveX: number = 0 @@ -41,7 +42,7 @@ export default struct Control { } build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { - statusBar() + statusBar({minHeight: this.minHeight}) ControlCenterComponent({showStatusBar: $showStatusBar}); } .width('100%') @@ -71,6 +72,7 @@ export default struct Control { @Component struct statusBar { + private minHeight: number build() { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { @@ -85,7 +87,7 @@ struct statusBar { } } .width('100%') - .height($r('app.float.statusbar_height')) + .height(this.minHeight) .backgroundColor($r('app.color.statusbar_background')) } } diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets index fe6ac8df..e75e94d3 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -35,11 +35,12 @@ struct Index { @State moveX: number = 0 @State moveY: number = 0 @State showStatusBar: boolean = true - + @StorageLink('minHeight') minHeight:number = 0 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, showStatusBar: ${this.showStatusBar}`) mWindowManager = new WindowManager(); + mWindowManager.initWindowManager(); mNotificationService.initNotificationService(); mBrightnessManager.registerBrightnessListener(); } @@ -60,9 +61,9 @@ struct Index { .onTouch(this.touchEvent.bind(this)) } else { if( this.startX <= 230) { - Notification({ showStatusBar: $showStatusBar }) + Notification({ showStatusBar: $showStatusBar,minHeight:this.minHeight }) } else { - ControlCenterComponent({ showStatusBar: $showStatusBar }) + ControlCenterComponent({ showStatusBar: $showStatusBar,minHeight:this.minHeight }) } } } diff --git a/product/statusbar/src/main/ets/default/pages/notification.ets b/product/statusbar/src/main/ets/default/pages/notification.ets index 559a723a..7d82fab5 100644 --- a/product/statusbar/src/main/ets/default/pages/notification.ets +++ b/product/statusbar/src/main/ets/default/pages/notification.ets @@ -33,6 +33,7 @@ let mFeatureAbilityManager; export default struct Index { @Link showStatusBar: boolean + private minHeight: number startX: number = 0 startY: number = 0 @State moveX: number = 0 @@ -46,7 +47,7 @@ struct Index { build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { - statusBar() + statusBar({minHeight:this.minHeight}) quicklySetting({ showStatusBar: $showStatusBar}) notificationItems({ showStatusBar: $showStatusBar}) } @@ -78,6 +79,8 @@ struct Index { @Component struct statusBar { + private minHeight: number + build() { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { @@ -91,7 +94,7 @@ struct statusBar { } } .width('100%') - .height($r('app.float.statusbar_height')) + .height(this.minHeight) .backgroundColor($r('app.color.statusbar_background')) } } -- Gitee From 9061d076bfac264e3696b49d041a833d279a47e5 Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Thu, 23 Sep 2021 18:30:10 +0800 Subject: [PATCH 016/373] [SystemUI] change build version and Screen adaptation Signed-off-by: liuss0301 --- build.gradle | 2 +- common/src/main/ets/default/WindowManager.ets | 6 ++++++ features/batterycomponent/build.gradle | 2 +- features/clockcomponent/build.gradle | 2 +- features/control/build.gradle | 2 +- .../main/ets/com/ohos/control/pages/ControlCenter.ets | 2 +- .../com/ohos/control/pages/brightnessComponent.ets | 1 + .../ets/com/ohos/control/pages/volumeComponent.ets | 1 + .../src/main/resources/base/element/float.json | 11 +++++++---- features/navigationservice/build.gradle | 2 +- features/noticeitem/build.gradle | 2 +- features/notificationservice/build.gradle | 2 +- features/signalcomponent/build.gradle | 2 +- features/wificomponent/build.gradle | 2 +- product/navigationBar/build.gradle | 2 +- product/navigationBar/src/main/config.json | 4 +++- product/statusbar/build.gradle | 2 +- product/statusbar/src/main/config.json | 4 +++- .../statusbar/src/main/ets/default/pages/index.ets | 3 ++- .../src/main/ets/default/pages/notification.ets | 6 ++++-- product/systemDialog/build.gradle | 2 +- product/systemDialog/src/main/config.json | 4 +++- 22 files changed, 43 insertions(+), 23 deletions(-) diff --git a/build.gradle b/build.gradle index d5469116..16746d08 100755 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.huawei.ohos.app' ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 6 } diff --git a/common/src/main/ets/default/WindowManager.ets b/common/src/main/ets/default/WindowManager.ets index 342f7e6d..44a18a0b 100644 --- a/common/src/main/ets/default/WindowManager.ets +++ b/common/src/main/ets/default/WindowManager.ets @@ -23,6 +23,8 @@ const STATUS_BAR_H = 0.07; var maxWidth; var maxHeight; var minHeight; +var quicklySettingH; +var notificationH; /** * Manage window size changes. @@ -34,11 +36,15 @@ export default class WindowManager { maxWidth = AppStorage.SetAndLink("maxWidth", 0); maxHeight = AppStorage.SetAndLink("maxHeight", 0); minHeight = AppStorage.SetAndLink("minHeight", 0); + quicklySettingH = AppStorage.SetAndLink("quicklySettingH", 0); + notificationH = AppStorage.SetAndLink("notificationH", 0); display.getDefaultDisplay().then(dis => { maxWidth.set(dis.width); maxHeight.set(dis.height); minHeight.set(parseInt((dis.height*STATUS_BAR_H).toString())); + quicklySettingH.set((dis.height-(minHeight.get()*2))*0.15); + notificationH.set(dis.height-(minHeight.get()*2)-quicklySettingH.get()); Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth.get()} maxHeight ${maxHeight.get()} minHeight ${minHeight.get()}`); }) diff --git a/features/batterycomponent/build.gradle b/features/batterycomponent/build.gradle index 01aff181..e107afcb 100644 --- a/features/batterycomponent/build.gradle +++ b/features/batterycomponent/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.huawei.ohos.library' //For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 4 } diff --git a/features/clockcomponent/build.gradle b/features/clockcomponent/build.gradle index 70131cb1..f30a981f 100644 --- a/features/clockcomponent/build.gradle +++ b/features/clockcomponent/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.huawei.ohos.library' //For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 4 } diff --git a/features/control/build.gradle b/features/control/build.gradle index 01aff181..e107afcb 100644 --- a/features/control/build.gradle +++ b/features/control/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.huawei.ohos.library' //For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 4 } diff --git a/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets b/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets index 2da99c2a..3fce0c17 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets @@ -60,7 +60,7 @@ struct ControlCenterComponent { .height('100%') } .width('100%') - .height('15%') + .height($r('app.float.wifi_and_air_height')) .margin({ top: $r('app.float.center_item_margin_top'), left: $r('app.float.center_item_margin_left'), right: $r('app.float.center_item_margin_right') }) diff --git a/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets index 4706affa..4507e28e 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets @@ -64,6 +64,7 @@ struct MyBrightness { .blockColor(Color.Blue) .trackColor(Color.Grey) .selectedColor(Color.Blue) + .width('100%') .onChange((value: number) => { this.brightnessItem.value = value; this.setBrightness(this.brightnessItem); diff --git a/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets index 7c1c4f57..a991829a 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets @@ -76,6 +76,7 @@ struct MyVol { style: SliderStyle.INSET }) .size({ width: 300 }) + .width('100%') .blockColor(Color.Blue) .trackColor(Color.Grey) .selectedColor(Color.Blue) diff --git a/features/control/src/main/resources/base/element/float.json b/features/control/src/main/resources/base/element/float.json index be66b596..4ff4ee9b 100644 --- a/features/control/src/main/resources/base/element/float.json +++ b/features/control/src/main/resources/base/element/float.json @@ -39,19 +39,19 @@ }, { "name": "uniform_icon_width", - "value": "50px" + "value": "50" }, { "name": "uniform_icon_height", - "value": "50px" + "value": "50" }, { "name": "uniform_icon_bg_height", - "value": "80px" + "value": "80" }, { "name": "uniform_icon_bg_width", - "value": "80px" + "value": "80" }, { "name": "icon_stack_common_margin", @@ -79,6 +79,9 @@ },{ "name": "slider_text_padding_left", "value": "5" + },{ + "name": "wifi_and_air_height", + "value": "120" } ] } diff --git a/features/navigationservice/build.gradle b/features/navigationservice/build.gradle index 0e53f75d..2ff0c29a 100644 --- a/features/navigationservice/build.gradle +++ b/features/navigationservice/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.huawei.ohos.library' //For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 4 } diff --git a/features/noticeitem/build.gradle b/features/noticeitem/build.gradle index b43ede7f..5352a9a1 100644 --- a/features/noticeitem/build.gradle +++ b/features/noticeitem/build.gradle @@ -4,7 +4,7 @@ import java.nio.file.Paths apply plugin: 'com.huawei.ohos.library' //For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 4 } diff --git a/features/notificationservice/build.gradle b/features/notificationservice/build.gradle index b43ede7f..5352a9a1 100644 --- a/features/notificationservice/build.gradle +++ b/features/notificationservice/build.gradle @@ -4,7 +4,7 @@ import java.nio.file.Paths apply plugin: 'com.huawei.ohos.library' //For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 4 } diff --git a/features/signalcomponent/build.gradle b/features/signalcomponent/build.gradle index 504e3833..336491df 100644 --- a/features/signalcomponent/build.gradle +++ b/features/signalcomponent/build.gradle @@ -3,7 +3,7 @@ import java.nio.file.Paths apply plugin: 'com.huawei.ohos.library' ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 4 } diff --git a/features/wificomponent/build.gradle b/features/wificomponent/build.gradle index b43ede7f..5352a9a1 100644 --- a/features/wificomponent/build.gradle +++ b/features/wificomponent/build.gradle @@ -4,7 +4,7 @@ import java.nio.file.Paths apply plugin: 'com.huawei.ohos.library' //For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 4 } diff --git a/product/navigationBar/build.gradle b/product/navigationBar/build.gradle index 920dbf0f..c2d4055b 100644 --- a/product/navigationBar/build.gradle +++ b/product/navigationBar/build.gradle @@ -1,6 +1,6 @@ apply plugin: 'com.huawei.ohos.hap' ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 4 } diff --git a/product/navigationBar/src/main/config.json b/product/navigationBar/src/main/config.json index 82c458f8..eff58fc1 100644 --- a/product/navigationBar/src/main/config.json +++ b/product/navigationBar/src/main/config.json @@ -27,7 +27,9 @@ "description": "$string:mainability_description", "label": "$string:app_name", "type": "page", - "launchType": "singleton" + "launchType": "singleton", + "srcPath": "default", + "srcLanguage": "ets" } ], "js": [ diff --git a/product/statusbar/build.gradle b/product/statusbar/build.gradle index 47ca2f88..0121a2b0 100644 --- a/product/statusbar/build.gradle +++ b/product/statusbar/build.gradle @@ -1,6 +1,6 @@ apply plugin: 'com.huawei.ohos.hap' ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 4 } diff --git a/product/statusbar/src/main/config.json b/product/statusbar/src/main/config.json index a6336f52..44e7554b 100644 --- a/product/statusbar/src/main/config.json +++ b/product/statusbar/src/main/config.json @@ -36,7 +36,9 @@ "description": "$string:mainability_description", "label": "$string:app_name", "type": "page", - "launchType": "singleton" + "launchType": "singleton", + "srcPath": "default", + "srcLanguage": "ets" } ], "js": [ diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets index e75e94d3..a63a7843 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -36,6 +36,7 @@ struct Index { @State moveY: number = 0 @State showStatusBar: boolean = true @StorageLink('minHeight') minHeight:number = 0 + @StorageLink('maxWidth') maxWidth:number = 0 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, showStatusBar: ${this.showStatusBar}`) @@ -60,7 +61,7 @@ struct Index { .height('100%') .onTouch(this.touchEvent.bind(this)) } else { - if( this.startX <= 230) { + if( this.startX <= parseInt((this.maxWidth/2).toString()) ) { Notification({ showStatusBar: $showStatusBar,minHeight:this.minHeight }) } else { ControlCenterComponent({ showStatusBar: $showStatusBar,minHeight:this.minHeight }) diff --git a/product/statusbar/src/main/ets/default/pages/notification.ets b/product/statusbar/src/main/ets/default/pages/notification.ets index 7d82fab5..7caddd79 100644 --- a/product/statusbar/src/main/ets/default/pages/notification.ets +++ b/product/statusbar/src/main/ets/default/pages/notification.ets @@ -109,6 +109,7 @@ struct quicklySetting { @State showDay: string = 'day' @State showMonth: string = 'month' @State showWeekDay: any = 'weekday' + @StorageLink('quicklySettingH') quicklySettingH:number = 0 aboutToAppear() { Log.showInfo(TAG, `quicklySetting, aboutToAppear`) @@ -153,7 +154,7 @@ struct quicklySetting { } .width('100%') - .height($r('app.float.quicklysetting_height')) + .height(this.quicklySettingH) .borderRadius($r('app.float.quicklysetting_borderradius')) .margin({ left: $r('app.float.quicklysetting_marginleft'), right: $r('app.float.quicklysetting_marginright') }) } @@ -207,6 +208,7 @@ struct dateItem { @Component struct notificationItems { @StorageLink('notificationList') notificationList: any[] = [] + @StorageLink('notificationH') notificationH:number = 0 @Link showStatusBar: boolean build() { @@ -240,7 +242,7 @@ struct notificationItems { } } .width('100%') - .height('100%') + .height(this.notificationH) } removeAllNotification() { diff --git a/product/systemDialog/build.gradle b/product/systemDialog/build.gradle index 920dbf0f..c2d4055b 100644 --- a/product/systemDialog/build.gradle +++ b/product/systemDialog/build.gradle @@ -1,6 +1,6 @@ apply plugin: 'com.huawei.ohos.hap' ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 4 } diff --git a/product/systemDialog/src/main/config.json b/product/systemDialog/src/main/config.json index e2d806ce..c4397511 100644 --- a/product/systemDialog/src/main/config.json +++ b/product/systemDialog/src/main/config.json @@ -27,7 +27,9 @@ "description": "$string:mainability_description", "label": "$string:app_name", "type": "page", - "launchType": "singleton" + "launchType": "singleton", + "srcPath": "default", + "srcLanguage": "ets" } ], "js": [ -- Gitee From a8420aea220bdaef0aaf95daf030335c3cc6e55d Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Thu, 23 Sep 2021 19:40:37 +0800 Subject: [PATCH 017/373] [SystemUI] change build version Signed-off-by: liuss0301 --- entry/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entry/build.gradle b/entry/build.gradle index e1eb88ec..765874c7 100755 --- a/entry/build.gradle +++ b/entry/build.gradle @@ -1,6 +1,6 @@ apply plugin: 'com.huawei.ohos.hap' ohos { - compileSdkVersion 6 + compileSdkVersion 7 defaultConfig { compatibleSdkVersion 4 } -- Gitee From 3e98e3d69a698dd606e57f55a5b26ecf0de58a68 Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Mon, 27 Sep 2021 21:02:33 +0800 Subject: [PATCH 018/373] [SystemUI] change OAT and change pic Signed-off-by: liuss0301 --- OAT.xml | 83 ++++++++++++++++-- .../main/resources/base/element/float.json | 4 +- .../src/main/resources/base/media/delete.png | Bin 230 -> 4061 bytes 3 files changed, 79 insertions(+), 8 deletions(-) diff --git a/OAT.xml b/OAT.xml index 62e7ab5d..b4454234 100644 --- a/OAT.xml +++ b/OAT.xml @@ -55,12 +55,83 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index 26e73dab..d0dda279 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -66,11 +66,11 @@ }, { "name": "item_delete_image_width", - "value": "30" + "value": "40" }, { "name": "item_delete_image_height", - "value": "30" + "value": "40" }, { "name": "titleitem_row_space", diff --git a/features/noticeitem/src/main/resources/base/media/delete.png b/features/noticeitem/src/main/resources/base/media/delete.png index dda4e870d8a4cffbcf2cc44a98732ca3de8e68e0..143463751f103bbf00d204cbbd40982b9a5a6ec1 100644 GIT binary patch literal 4061 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 P00000NkvXXu0mjf(|(n6 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpT2B|pkcwMxr)}gtqQK+&QnJac zIv^ljPb@*e{|L*?2eFJhJDeT*vi$`2Grw7$uXr?4u3x+7AJ41(dKZ{yh18E@Ra?6NQ8>LqFKUuIqx7E5kdzSm3D^u7znVZwtljVU9XYh3Ob6Mw<&;$Txl~(@% -- Gitee From da471dac4e1286c905fd8ae0e5370c36b50b1411 Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Tue, 28 Sep 2021 19:30:18 +0800 Subject: [PATCH 019/373] [SystemUI] change OAT file and some bug fix Signed-off-by: liuss0301 --- OAT.xml | 100 +++++------------- features/batterycomponent/build.gradle | 1 - features/clockcomponent/build.gradle | 1 - features/control/build.gradle | 1 - .../common/brightness/brightnessManager.ets | 2 +- .../control/pages/brightnessComponent.ets | 2 +- .../ohos/control/pages/volumeComponent.ets | 4 +- features/navigationservice/build.gradle | 1 - features/noticeitem/build.gradle | 4 - features/notificationservice/build.gradle | 4 - features/signalcomponent/build.gradle | 3 - .../src/main/ets/default/common/constants.ets | 2 +- .../src/main/ets/default/pages/signalIcon.ets | 42 +++++--- .../src/main/ets/default/signalModel.ets | 6 +- .../main/resources/base/element/float.json | 4 + features/wificomponent/build.gradle | 4 - .../src/main/ets/default/pages/keyButton.ets | 2 +- .../base/media/ic_statusbar_wifi_full.png | Bin 622 -> 0 bytes 18 files changed, 67 insertions(+), 116 deletions(-) delete mode 100644 product/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.png diff --git a/OAT.xml b/OAT.xml index b4454234..17c700ac 100644 --- a/OAT.xml +++ b/OAT.xml @@ -55,83 +55,31 @@ - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/features/batterycomponent/build.gradle b/features/batterycomponent/build.gradle index e107afcb..520bba63 100644 --- a/features/batterycomponent/build.gradle +++ b/features/batterycomponent/build.gradle @@ -1,5 +1,4 @@ apply plugin: 'com.huawei.ohos.library' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { compileSdkVersion 7 defaultConfig { diff --git a/features/clockcomponent/build.gradle b/features/clockcomponent/build.gradle index f30a981f..1dba0fa5 100644 --- a/features/clockcomponent/build.gradle +++ b/features/clockcomponent/build.gradle @@ -1,5 +1,4 @@ apply plugin: 'com.huawei.ohos.library' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { compileSdkVersion 7 defaultConfig { diff --git a/features/control/build.gradle b/features/control/build.gradle index e107afcb..520bba63 100644 --- a/features/control/build.gradle +++ b/features/control/build.gradle @@ -1,5 +1,4 @@ apply plugin: 'com.huawei.ohos.library' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { compileSdkVersion 7 defaultConfig { diff --git a/features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets b/features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets index ad366aaf..89869528 100644 --- a/features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets +++ b/features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets @@ -24,7 +24,7 @@ let mCommonEventSubscribeInfo = { }; let curValue = 10; let mCommonEventSubscriber =null; -var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 0); +var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 255); export class brightnessManager{ diff --git a/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets index 4507e28e..e5b30f77 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets @@ -52,7 +52,7 @@ struct MyBrightness { .width('15%') .padding({ left: $r('app.float.slider_text_padding_left') }) - Column() { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { Slider({ value: this.brightnessValue, min: this.brightnessItem.min, diff --git a/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets index a991829a..da2293fd 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets @@ -59,7 +59,7 @@ struct MyVol { build() { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - Column() { + Column({useAlign:HorizontalAlign.Center}) { Text($r('app.string.volume_control')) .fontSize($r('app.float.control_common_font_size')).alignSelf(ItemAlign.Center) @@ -67,7 +67,7 @@ struct MyVol { .width('15%') .padding({ left: $r('app.float.slider_text_padding_left') }) - Column() { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { Slider({ value: volume.value, min: volume.minValue, diff --git a/features/navigationservice/build.gradle b/features/navigationservice/build.gradle index 2ff0c29a..adf55660 100644 --- a/features/navigationservice/build.gradle +++ b/features/navigationservice/build.gradle @@ -1,5 +1,4 @@ apply plugin: 'com.huawei.ohos.library' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { compileSdkVersion 7 defaultConfig { diff --git a/features/noticeitem/build.gradle b/features/noticeitem/build.gradle index 5352a9a1..1dba0fa5 100644 --- a/features/noticeitem/build.gradle +++ b/features/noticeitem/build.gradle @@ -1,8 +1,4 @@ -import java.nio.file.Files -import java.nio.file.Paths - apply plugin: 'com.huawei.ohos.library' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { compileSdkVersion 7 defaultConfig { diff --git a/features/notificationservice/build.gradle b/features/notificationservice/build.gradle index 5352a9a1..1dba0fa5 100644 --- a/features/notificationservice/build.gradle +++ b/features/notificationservice/build.gradle @@ -1,8 +1,4 @@ -import java.nio.file.Files -import java.nio.file.Paths - apply plugin: 'com.huawei.ohos.library' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { compileSdkVersion 7 defaultConfig { diff --git a/features/signalcomponent/build.gradle b/features/signalcomponent/build.gradle index 336491df..1dba0fa5 100644 --- a/features/signalcomponent/build.gradle +++ b/features/signalcomponent/build.gradle @@ -1,6 +1,3 @@ -import java.nio.file.Files -import java.nio.file.Paths - apply plugin: 'com.huawei.ohos.library' ohos { compileSdkVersion 7 diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ets b/features/signalcomponent/src/main/ets/default/common/constants.ets index 2740f921..13074db1 100644 --- a/features/signalcomponent/src/main/ets/default/common/constants.ets +++ b/features/signalcomponent/src/main/ets/default/common/constants.ets @@ -33,6 +33,6 @@ export default class Constants { static NET_CHINA_MOBILE = 'CHINA MOBILE'; static NET_CHINA_TELECOM = 'China Telecom'; - static NET_CHN_UN_ICON = 'CHN-UN_ICON'; + static NET_CHN_UNICOM = 'CHN-UNICOM'; static NET_NULL = ''; } diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 326c59cb..24bda5b7 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -53,7 +53,7 @@ struct SignalIcon { }.flexShrink(1) } .margin({ left: 5}) - .width($r('app.float.signalicon_width')) + .width(this.getWidth(this.networkState)) .height('50%') } @@ -92,12 +92,11 @@ struct SignalIcon { /** * Get the cellular signal image * - * @param {number} level - signal level from status center + * @param {number} level - signal level from signalModel * @return {string} cellularImage image of cellular signal */ private updateCellularImage(level) { Log.showInfo(TAG, `updateCellularImage, level: ${level}`); - console.info('systemui updateCellularImage = ' + level); let cellularImage; switch (level) { case Constants.CELLULAR_SIGNAL_NO: @@ -130,26 +129,45 @@ struct SignalIcon { /** * Get the NetworkState signal name * - * @param {number} level - signal level from status center + * @param {string} netWorkState - network state from signal model + * @return {string} vendor's name or signal state */ private updateNetworkState(netWorkState) { Log.showInfo(TAG, `updateNetworkState, netWorkState: ${netWorkState}`); - let netWorkStateName; + let networkStateName; switch (netWorkState) { case Constants.NET_CHINA_MOBILE: - netWorkStateName = $r('app.string.china_mobile'); - break; case Constants.NET_CHINA_TELECOM: - netWorkStateName = $r('app.string.china_telecom'); + case Constants.NET_CHN_UNICOM: + networkStateName = netWorkState; + break; + case Constants.NET_NULL: + default: + networkStateName = $r('app.string.net_null'); break; - case Constants.NET_CHN_UN_ICON: - netWorkStateName = $r('app.string.china_unicom'); + } + return networkStateName; + } + + /** + * Get total width + * + * @param {string} netWorkState - network state from signal model + * @return {number} total width of signal component + */ + private getWidth(netWorkState) { + Log.showInfo(TAG, `updateNetworkState, netWorkState: ${netWorkState}`); + switch (netWorkState) { + case Constants.NET_CHINA_MOBILE: + case Constants.NET_CHINA_TELECOM: + case Constants.NET_CHN_UNICOM: + // Dynamic width + return netWorkState?.length * 10 + 48; break; case Constants.NET_NULL: default: - netWorkStateName = $r('app.string.net_null'); + return $r('app.float.signalicon_default_width'); break; } - return netWorkStateName; } } \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ets b/features/signalcomponent/src/main/ets/default/signalModel.ets index 06a8f174..ad9060ab 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ets +++ b/features/signalcomponent/src/main/ets/default/signalModel.ets @@ -40,9 +40,9 @@ export class SignalModel initSignalModel() { Log.showInfo(TAG, 'initSignalModel'); - mLevelLink = AppStorage.SetAndLink("cellularLevel", ''); - mTypeLink = AppStorage.SetAndLink("cellularType", ''); - mStateLink = AppStorage.SetAndLink("networkState", ''); + mLevelLink = AppStorage.SetAndLink("cellularLevel", Constants.CELLULAR_NO_SIM_CARD); + mTypeLink = AppStorage.SetAndLink("cellularType", Constants.NETWORK_TYPE_UNKNOWN); + mStateLink = AppStorage.SetAndLink("networkState", Constants.NET_NULL); this.initObserver(); this.checkCellularStatus(); } diff --git a/features/signalcomponent/src/main/resources/base/element/float.json b/features/signalcomponent/src/main/resources/base/element/float.json index a287d77e..1db5796c 100644 --- a/features/signalcomponent/src/main/resources/base/element/float.json +++ b/features/signalcomponent/src/main/resources/base/element/float.json @@ -31,6 +31,10 @@ { "name":"signalicon_height", "value":"50%" + }, + { + "name":"signalicon_default_width", + "value":"120" } ] } \ No newline at end of file diff --git a/features/wificomponent/build.gradle b/features/wificomponent/build.gradle index 5352a9a1..1dba0fa5 100644 --- a/features/wificomponent/build.gradle +++ b/features/wificomponent/build.gradle @@ -1,8 +1,4 @@ -import java.nio.file.Files -import java.nio.file.Paths - apply plugin: 'com.huawei.ohos.library' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { compileSdkVersion 7 defaultConfig { diff --git a/product/navigationBar/src/main/ets/default/pages/keyButton.ets b/product/navigationBar/src/main/ets/default/pages/keyButton.ets index 05b938a4..491cd6b5 100644 --- a/product/navigationBar/src/main/ets/default/pages/keyButton.ets +++ b/product/navigationBar/src/main/ets/default/pages/keyButton.ets @@ -44,7 +44,7 @@ export default struct keyButton { } .borderRadius($r('app.float.button_radius')) .width($r('app.float.button_width')) - .height($r('app.float.button_height')) + .height('100%') .backgroundColor(this.backGroundColor) .onTouch(this.onKeyTouch.bind(this)) } diff --git a/product/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.png b/product/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.png deleted file mode 100644 index ef6a536e100c74a1d595d38d1738ba2518c023c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622 zcmV-!0+IcRP)Px%C`m*?R9Fe^mOV=YK@f&>iV0W=f*+u0rJbe`EUXlNgN289 zw6?aevJkOKp@<(SDt?p-f`%BMm+XMQWySHKCn z0J&VQhuU!%gI;KdHjq8T6I{bS>^Y8e!}Vvzq%oL<69{Y4NE<767rrZis1eZuEJCNJ z!6V}|=!u0)t04xU18jR>um&5fO4d&J`b^#f2VmO;g9HrvicFBaqZ(6t&eb;c)Haqj z3g+O=Qk~*Yf>tDyNn^C?;hK8S+l`90faER7E>p0_8SunR43@4b(JD5lxq@S+%!1<(mfiin+ENrgxxPI!}R~P;a(juShXC z1Jz7<^EDaMxTR8~AT@T6st*VgHPdL)G~4F&`erx&RiDZALvsYK$q)U5RrO6WnO@Ic ztLnAeP~~0dPsWF(m9N;}8IQ033HJu~Ed1RK)Mu)%K&@8b3rbqYa9sgm_W%F@07*qo IM6N<$f_>!}F#rGn -- Gitee From ab15feb41aefb22a7302ad34ae4bcde6d97aa270 Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Wed, 29 Sep 2021 16:20:28 +0800 Subject: [PATCH 020/373] [SystemUI] some bug fix Signed-off-by: liuss0301 --- .../control/common/volume/VolumeModel.ets | 6 +-- .../src/main/ets/default/common/constants.ets | 5 +-- .../src/main/ets/default/pages/signalIcon.ets | 45 ++++--------------- .../main/resources/base/element/float.json | 4 +- .../main/resources/base/element/float.json | 2 +- .../ets/default/pages/ConfigurableLayout.ets | 8 ++-- .../main/ets/default/pages/notification.ets | 13 +++++- 7 files changed, 33 insertions(+), 50 deletions(-) diff --git a/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets b/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets index 790506f3..af17d83d 100644 --- a/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets +++ b/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets @@ -38,7 +38,7 @@ export default class VolumeModel { Log.showInfo(TAG, `Failed to obtain the volume. ${err.message}`); return; } - Log.showInfo(TAG, 'Callback invoked to indicate that the volume is obtained.' + value); + Log.showInfo(TAG, 'getVolume Callback invoked to indicate that the volume is obtained.' + value); callback.value = value; }) } @@ -50,7 +50,7 @@ export default class VolumeModel { Log.showInfo(TAG, `Failed to obtain the volume. ${err.message}`); return; } - Log.showInfo(TAG, 'Callback invoked to indicate that the volume is obtained.' + value); + Log.showInfo(TAG, 'getMaxVolume Callback invoked to indicate that the volume is obtained.' + value); callback.maxValue = value; }) } @@ -62,7 +62,7 @@ export default class VolumeModel { Log.showInfo(TAG, `Failed to obtain the volume. ${err.message}`); return; } - Log.showInfo(TAG, 'Callback invoked to indicate that the volume is obtained.' + value); + Log.showInfo(TAG, 'getMinVolume Callback invoked to indicate that the volume is obtained.' + value); callback.minValue = value; }) } diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ets b/features/signalcomponent/src/main/ets/default/common/constants.ets index 13074db1..10f24689 100644 --- a/features/signalcomponent/src/main/ets/default/common/constants.ets +++ b/features/signalcomponent/src/main/ets/default/common/constants.ets @@ -31,8 +31,5 @@ export default class Constants { static CELLULAR_SIGNAL_FULL = 5; static CELLULAR_NO_SIM_CARD = -1; - static NET_CHINA_MOBILE = 'CHINA MOBILE'; - static NET_CHINA_TELECOM = 'China Telecom'; - static NET_CHN_UNICOM = 'CHN-UNICOM'; - static NET_NULL = ''; + static NET_NULL = 'NULL'; } diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 24bda5b7..6903224f 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -24,7 +24,6 @@ struct SignalIcon { @StorageLink('cellularLevel') cellularLevel : number = Constants.CELLULAR_NO_SIM_CARD @StorageLink('cellularType') cellularType : number = Constants.NETWORK_TYPE_UNKNOWN @StorageLink('networkState') networkState : string = Constants.NET_NULL - aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); mSignalModel.initSignalModel(); @@ -36,12 +35,15 @@ struct SignalIcon { } build() { - Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Row() { Text(this.updateNetworkState(this.networkState)) .fontSize($r('app.float.fontSize_network_state')) .fontColor($r('app.color.font_color_white')) + .textOverflow({overflow: TextOverflow.Ellipsis}) + .constraintSize({ maxWidth: $r('app.float.signalicon_netstatus_width')}) .flexShrink(0) .maxLines(1) + .textAlign(TextAlign.Center) Stack({ alignContent: Alignment.TopStart }) { Text(this.updateCellularType(this.cellularType)) @@ -50,10 +52,9 @@ struct SignalIcon { .margin({ top: $r('app.float.margin_cellular_type') }) Image(this.updateCellularImage(this.cellularLevel)) .objectFit(ImageFit.ScaleDown) - }.flexShrink(1) + }.flexShrink(1).width(42) } .margin({ left: 5}) - .width(this.getWidth(this.networkState)) .height('50%') } @@ -135,39 +136,11 @@ struct SignalIcon { private updateNetworkState(netWorkState) { Log.showInfo(TAG, `updateNetworkState, netWorkState: ${netWorkState}`); let networkStateName; - switch (netWorkState) { - case Constants.NET_CHINA_MOBILE: - case Constants.NET_CHINA_TELECOM: - case Constants.NET_CHN_UNICOM: - networkStateName = netWorkState; - break; - case Constants.NET_NULL: - default: - networkStateName = $r('app.string.net_null'); - break; + if(netWorkState == Constants.NET_NULL){ + networkStateName = $r('app.string.net_null'); + }else { + networkStateName = netWorkState; } return networkStateName; } - - /** - * Get total width - * - * @param {string} netWorkState - network state from signal model - * @return {number} total width of signal component - */ - private getWidth(netWorkState) { - Log.showInfo(TAG, `updateNetworkState, netWorkState: ${netWorkState}`); - switch (netWorkState) { - case Constants.NET_CHINA_MOBILE: - case Constants.NET_CHINA_TELECOM: - case Constants.NET_CHN_UNICOM: - // Dynamic width - return netWorkState?.length * 10 + 48; - break; - case Constants.NET_NULL: - default: - return $r('app.float.signalicon_default_width'); - break; - } - } } \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/base/element/float.json b/features/signalcomponent/src/main/resources/base/element/float.json index 1db5796c..27e7b6c0 100644 --- a/features/signalcomponent/src/main/resources/base/element/float.json +++ b/features/signalcomponent/src/main/resources/base/element/float.json @@ -33,8 +33,8 @@ "value":"50%" }, { - "name":"signalicon_default_width", - "value":"120" + "name":"signalicon_netstatus_width", + "value":"113" } ] } \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/element/float.json b/features/wificomponent/src/main/resources/base/element/float.json index c70adb37..e8bf0df9 100644 --- a/features/wificomponent/src/main/resources/base/element/float.json +++ b/features/wificomponent/src/main/resources/base/element/float.json @@ -8,7 +8,7 @@ "value": "0" },{ "name": "WIFISTATUS_MAXWIDTH", - "value": "50" + "value": "42" } ] } diff --git a/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets b/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets index 904a9e70..6efa1210 100644 --- a/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets +++ b/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets @@ -68,7 +68,8 @@ struct Index { Image(item.icon) .objectFit(ImageFit.ScaleDown) .height('50%') - .width(45) + .width(30) + .margin({right:2}) }) Row() { Text('...') @@ -79,11 +80,12 @@ struct Index { Image(item.icon) .objectFit(ImageFit.ScaleDown) .height('50%') - .width(45) + .width(30) + .margin({right:2}) }) } } - .width(this.notificationList.length > 3 ? 45 * 4 : 45 * this.notificationList.length) + .width(this.notificationList.length > 3 ? 34 * 4 : 34 * this.notificationList.length) } }) }.constraintSize({ maxWidth: 200 }) diff --git a/product/statusbar/src/main/ets/default/pages/notification.ets b/product/statusbar/src/main/ets/default/pages/notification.ets index 7caddd79..6c2ff8ec 100644 --- a/product/statusbar/src/main/ets/default/pages/notification.ets +++ b/product/statusbar/src/main/ets/default/pages/notification.ets @@ -220,14 +220,20 @@ struct notificationItems { .fontColor($r('app.color.nonotification_text_color')) } } else { - Stack({alignContent: Alignment.TopStart}) { + Stack({ alignContent: Alignment.TopStart }) { List() { ForEach(this.notificationList, (item: any) => { //notificationItems ListItem() { notificationItem({ itemObject: item, showStatusBar: $showStatusBar }) } + }, (item: any) => item.hashcode.toString()) } + .onTouch((event: TouchEvent) => { + Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) + event.stopPropagation(); + }) + Image($r('app.media.delete_all')) //icon: remove all notifications .objectFit(ImageFit.Contain) .width($r('app.float.deleteall_image_width')) @@ -236,6 +242,11 @@ struct notificationItems { .opacity($r('app.float.deleteall_image_opacity')) .onClick(this.removeAllNotification.bind(this)) .position({ x: '44.5%', y: '85%' }) + + Flex() { //bottom Line + }.width('100%').height('7%') + .opacity($r('app.float.deleteall_image_opacity')) + .position({ x: 0, y: '93%' }) } .width('100%') .height('100%') -- Gitee From 20c6a62565caef2ee9d7caa50e6d15c5d4e33b4e Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Thu, 30 Sep 2021 14:54:04 +0800 Subject: [PATCH 021/373] [SystemUI] change bulid parameter Signed-off-by: liuss0301 --- build.gradle | 3 ++- entry/build.gradle | 2 +- entry/src/main/config.json | 4 +++- product/navigationBar/build.gradle | 2 +- product/statusbar/build.gradle | 2 +- product/systemDialog/build.gradle | 2 +- 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 16746d08..95a4a89e 100755 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,7 @@ ohos { defaultConfig { compatibleSdkVersion 6 } + supportSystem "standard" } buildscript { @@ -22,7 +23,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.huawei.ohos:hap:3.0.1.6' + classpath 'com.huawei.ohos:hap:3.0.3.2' } } diff --git a/entry/build.gradle b/entry/build.gradle index 765874c7..c214e8ad 100755 --- a/entry/build.gradle +++ b/entry/build.gradle @@ -4,7 +4,7 @@ ohos { defaultConfig { compatibleSdkVersion 4 } - supportSystem "standard" + arkEnabled false } dependencies { diff --git a/entry/src/main/config.json b/entry/src/main/config.json index bf7b92d8..5d5a409c 100755 --- a/entry/src/main/config.json +++ b/entry/src/main/config.json @@ -36,7 +36,9 @@ "description": "$string:mainability_description", "label": "$string:app_name", "type": "page", - "launchType": "singleton" + "launchType": "singleton", + "srcPath": "default", + "srcLanguage": "ets" } ], "js": [ diff --git a/product/navigationBar/build.gradle b/product/navigationBar/build.gradle index c2d4055b..db2bd14f 100644 --- a/product/navigationBar/build.gradle +++ b/product/navigationBar/build.gradle @@ -5,7 +5,7 @@ ohos { compatibleSdkVersion 4 } entryModules "entry" - supportSystem "standard" + arkEnabled false } dependencies { diff --git a/product/statusbar/build.gradle b/product/statusbar/build.gradle index 0121a2b0..466b5fa0 100644 --- a/product/statusbar/build.gradle +++ b/product/statusbar/build.gradle @@ -5,7 +5,7 @@ ohos { compatibleSdkVersion 4 } entryModules "entry" - supportSystem "standard" + arkEnabled false } dependencies { diff --git a/product/systemDialog/build.gradle b/product/systemDialog/build.gradle index c2d4055b..db2bd14f 100644 --- a/product/systemDialog/build.gradle +++ b/product/systemDialog/build.gradle @@ -5,7 +5,7 @@ ohos { compatibleSdkVersion 4 } entryModules "entry" - supportSystem "standard" + arkEnabled false } dependencies { -- Gitee From 868cf26cfa948008e35c354f8f2158b30bca4686 Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Mon, 11 Oct 2021 17:15:03 +0800 Subject: [PATCH 022/373] [SystemUI] SystemUI some bug fix 1. SystemDialog list use switch 2. signal interface improt name method name change Signed-off-by: liuss0301 --- .../src/main/ets/default/signalModel.ets | 10 ++++------ .../systemDialog/src/main/ets/default/pages/index.ets | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ets b/features/signalcomponent/src/main/ets/default/signalModel.ets index ad9060ab..3bc335f2 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ets +++ b/features/signalcomponent/src/main/ets/default/signalModel.ets @@ -13,9 +13,9 @@ * limitations under the License. */ -import Radio from '@ohos.telephony_radio'; -import Sim from '@ohos.telephony_sim' -import Observer from '@ohos.telephony_observer'; +import Radio from '@ohos.telephony.radio'; +import Sim from '@ohos.telephony.sim' +import Observer from '@ohos.telephony.observer'; import Log from "../../../../../../common/src/main/ets/default/Log.ets"; import CheckEmpty from '../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; import Constants from './common/constants.ets' @@ -86,7 +86,7 @@ export class SignalModel Log.showInfo(TAG, 'enter checknetworkState ============'); //The interface of getting the cellular signal status is unavailable temporarily - Radio.getnetworkState(slotId,(err, value) => { + Radio.getNetworkState((err, value) => { if (err) { // Failed to call the interface,error is not null Log.showError(TAG, `failed to getnetworkState because ${err.message}`); @@ -111,8 +111,6 @@ export class SignalModel mStateLink.set(Constants.NET_NULL); } }); - - } /** diff --git a/product/systemDialog/src/main/ets/default/pages/index.ets b/product/systemDialog/src/main/ets/default/pages/index.ets index fbf01e62..597594e5 100644 --- a/product/systemDialog/src/main/ets/default/pages/index.ets +++ b/product/systemDialog/src/main/ets/default/pages/index.ets @@ -62,7 +62,7 @@ struct Index { .fontColor(Color.Black) .width(250) - Toggle({ type: ToggleType.Button, isOn: false }) + Toggle({ type: ToggleType.Switch, isOn: false }) .width(60) .height(40) .onChange((isOn) => { -- Gitee From 98c5943d3cd8cc8ab536442129369a6cc666e6e1 Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Tue, 12 Oct 2021 18:11:41 +0800 Subject: [PATCH 023/373] [SystemUI] Modify the return key layout Signed-off-by: liuss0301 --- .../src/main/ets/default/pages/keyButton.ets | 13 ++++++++----- .../src/main/ets/default/pages/index.ets | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/product/navigationBar/src/main/ets/default/pages/keyButton.ets b/product/navigationBar/src/main/ets/default/pages/keyButton.ets index 491cd6b5..3fd0554b 100644 --- a/product/navigationBar/src/main/ets/default/pages/keyButton.ets +++ b/product/navigationBar/src/main/ets/default/pages/keyButton.ets @@ -36,17 +36,20 @@ export default struct keyButton { } build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Stack({ alignContent: Alignment.Center }) { + Flex() {} + .borderRadius($r('app.float.button_radius')) + .width($r('app.float.button_width')) + .height('100%') + .backgroundColor(this.backGroundColor) Image(this.uri) .objectFit(ImageFit.Contain) .size({ width: $r('app.float.image_width'), height: $r('app.float.image_height') }) - } - .borderRadius($r('app.float.button_radius')) + .onTouch(this.onKeyTouch.bind(this)) .width($r('app.float.button_width')) .height('100%') - .backgroundColor(this.backGroundColor) - .onTouch(this.onKeyTouch.bind(this)) + } private onKeyTouch(event:TouchEvent) { diff --git a/product/systemDialog/src/main/ets/default/pages/index.ets b/product/systemDialog/src/main/ets/default/pages/index.ets index fbf01e62..597594e5 100644 --- a/product/systemDialog/src/main/ets/default/pages/index.ets +++ b/product/systemDialog/src/main/ets/default/pages/index.ets @@ -62,7 +62,7 @@ struct Index { .fontColor(Color.Black) .width(250) - Toggle({ type: ToggleType.Button, isOn: false }) + Toggle({ type: ToggleType.Switch, isOn: false }) .width(60) .height(40) .onChange((isOn) => { -- Gitee From b54b63009ef6e1dc78a35e1b6325e933c342654d Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Wed, 13 Oct 2021 15:34:58 +0800 Subject: [PATCH 024/373] [SystemUI] Screen adaptation Signed-off-by: liuss0301 --- common/src/main/ets/default/WindowManager.ets | 28 ++++++----- .../default/abilitymanager/bundleManager.ets | 4 +- .../heightcofigUtils/HeightConfigUtils.ets | 40 ++++++++++++++++ .../src/main/ets/default/common/constants.ets | 2 +- .../main/ets/default/pages/batteryIcon.ets | 17 ++++--- .../src/main/ets/default/pages/batteryPic.ets | 2 +- .../src/main/ets/default/pages/clockIcon.ets | 1 - .../com/ohos/control/pages/ControlCenter.ets | 8 ++-- .../main/resources/base/element/float.json | 6 +++ .../src/main/ets/default/common/constants.ets | 3 ++ .../src/main/ets/default/pages/signalIcon.ets | 8 +++- .../src/main/ets/default/signalModel.ets | 5 +- .../src/main/ets/default/common/constants.ets | 48 +++++++++---------- .../src/main/ets/default/pages/wifiIcon.ets | 16 ++++--- .../src/main/ets/default/common/constants.ets | 3 ++ .../src/main/ets/default/pages/index.ets | 13 ++++- .../src/main/ets/default/pages/keyButton.ets | 8 ++-- .../src/main/ets/default/pages/oneLayout.ets | 2 + .../main/ets/default/pages/threeLayout.ets | 2 + .../main/resources/base/element/float.json | 9 ---- .../ets/default/pages/ConfigurableLayout.ets | 18 +++---- .../ets/default/pages/common/constants.ets | 4 ++ .../src/main/ets/default/pages/control.ets | 4 +- .../src/main/ets/default/pages/index.ets | 17 ++++++- .../main/ets/default/pages/notification.ets | 17 +++++-- 25 files changed, 188 insertions(+), 97 deletions(-) create mode 100644 common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets diff --git a/common/src/main/ets/default/WindowManager.ets b/common/src/main/ets/default/WindowManager.ets index 44a18a0b..00ec9b27 100644 --- a/common/src/main/ets/default/WindowManager.ets +++ b/common/src/main/ets/default/WindowManager.ets @@ -30,21 +30,17 @@ var notificationH; * Manage window size changes. */ export default class WindowManager { - - initWindowManager(){ + initWindowManager() { Log.showInfo(TAG, 'initWindowManager '); maxWidth = AppStorage.SetAndLink("maxWidth", 0); maxHeight = AppStorage.SetAndLink("maxHeight", 0); minHeight = AppStorage.SetAndLink("minHeight", 0); - quicklySettingH = AppStorage.SetAndLink("quicklySettingH", 0); - notificationH = AppStorage.SetAndLink("notificationH", 0); - display.getDefaultDisplay().then(dis => { + display.getDefaultDisplay() + .then(dis => { maxWidth.set(dis.width); maxHeight.set(dis.height); - minHeight.set(parseInt((dis.height*STATUS_BAR_H).toString())); - quicklySettingH.set((dis.height-(minHeight.get()*2))*0.15); - notificationH.set(dis.height-(minHeight.get()*2)-quicklySettingH.get()); + minHeight.set(this.getStatusBarDefaultHeight(dis.height)); Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth.get()} maxHeight ${maxHeight.get()} minHeight ${minHeight.get()}`); }) @@ -57,8 +53,10 @@ export default class WindowManager { */ setWindowMax(callback) { Log.showInfo(TAG, 'enter setWindowMax ================='); - Window.getTopWindow().then((windowData)=> { - windowData.resetSize(maxWidth.get(), maxHeight.get()).then((result)=> { + Window.getTopWindow() + .then((windowData) => { + windowData.resetSize(maxWidth.get(), maxHeight.get()) + .then((result) => { Log.showInfo(TAG, result); callback(result); }); @@ -72,11 +70,17 @@ export default class WindowManager { */ setWindowMin(callback) { Log.showInfo(TAG, 'enter setWindowMin ================='); - Window.getTopWindow().then((windowData)=> { - windowData.resetSize(maxWidth.get(), minHeight.get()).then((result)=> { + Window.getTopWindow() + .then((windowData) => { + windowData.resetSize(maxWidth.get(), minHeight.get()) + .then((result) => { Log.showInfo(TAG, result); callback(result); }); }); } + + getStatusBarDefaultHeight(maxheight) { + return parseInt((maxheight * STATUS_BAR_H).toString()) + } } \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ets b/common/src/main/ets/default/abilitymanager/bundleManager.ets index 05b7c525..2734db72 100644 --- a/common/src/main/ets/default/abilitymanager/bundleManager.ets +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ets @@ -22,12 +22,12 @@ const TAG = 'BRManager'; export default class BundleManager { static getResourceManager(tag, bundleName, then) { - Log.showInfo(TAG, `getResourceManager from: ${tag}`)); + Log.showInfo(TAG, `getResourceManager from: ${tag}`); Resmgr.getResourceManager(bundleName).then(then); } static getBundleInfo(tag, bundleName, getInfo, then) { - Log.showInfo(TAG, `getBundleInfo from: ${tag}`)); + Log.showInfo(TAG, `getBundleInfo from: ${tag}`); BundleMgr.getBundleInfo(bundleName, getInfo).then(then); } diff --git a/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets b/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets new file mode 100644 index 00000000..5dbc1284 --- /dev/null +++ b/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 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 Log from '../Log.ets'; + +const STATUS_BAR_MIN_HEIGHT = 24 +const STATUS_BAR_COEFFICIENT = 1.0 +const NAV_BAR_MIN_HEIGHT = 32 +const NAV_BAR_COEFFICIENT = 1.0 + +export default class HeightConfigUtils { + + getStatusMinH(){ + return STATUS_BAR_MIN_HEIGHT; + } + + getNavMinH(){ + return NAV_BAR_MIN_HEIGHT; + } + + getStatusCoefficient(){ + return STATUS_BAR_COEFFICIENT; + } + + getNavHCoefficient(){ + return NAV_BAR_COEFFICIENT; + } +} + diff --git a/features/batterycomponent/src/main/ets/default/common/constants.ets b/features/batterycomponent/src/main/ets/default/common/constants.ets index e5ea5eb2..d40572fc 100644 --- a/features/batterycomponent/src/main/ets/default/common/constants.ets +++ b/features/batterycomponent/src/main/ets/default/common/constants.ets @@ -18,7 +18,7 @@ export default class Constants { //layout params - Icon static WHOLE_CONTAINER_MARGIN = 2 static WHOLE_CONTAINER_WIDTH = 100 - static WHOLE_CONTAINER_HEIGHT = '50%' + static WHOLE_CONTAINER_HEIGHT = 24 static PIC_CONTAINER_WIDTH = '70%' static PIC_CONTAINER_HEIGHT = '85%' //layout params - Pic diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index 8fc47fb0..c4fd85be 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -19,20 +19,22 @@ import BatterySoc from './batterySoc' import Constants from '../common/constants.ets' import Log from '../../../../../../../common/src/main/ets/default/Log.ets' + const TAG = 'BatteryComponent-batteryIcon' + @Component -export default -struct BatteryIcon { +export default struct BatteryIcon { @StorageLink('batterySoc') batterySoc: number = 100 + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 aboutToAppear() { mBatteryModel.initBatteryModel(); - Log.showInfo(TAG,'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); } aboutToDisappear() { mBatteryModel.uninitBatteryModel(); - Log.showInfo(TAG,'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { @@ -40,14 +42,15 @@ struct BatteryIcon { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { BatterySoc() } + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { BatteryPic() } .width('70%') - .height('85%') + .height('100%') } - .width($r('app.float.whole_container_width')) - .height('50%') + .width(Constants.WHOLE_CONTAINER_WIDTH * this.StatusCoefficient) + .height(Constants.WHOLE_CONTAINER_HEIGHT * this.StatusCoefficient) .margin($r('app.float.whole_container_margin')) } } diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets index 8f880079..35af6132 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -42,7 +42,7 @@ struct BatteryPic { .backgroundColor(this.getBatteryColor(this.batterySoc, this.batteryCharging)) } .width('88%') - .height('80%') + .height('100%') .backgroundColor($r('app.color.battery_background')) .border({ width: $r('app.float.battery_border_width'), color: $r('app.color.battery_border'), diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index d29fb59d..b75563a4 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -39,6 +39,5 @@ export default struct ClockIcon { .fontSize($r('app.float.clock_fontsize')) } .width($r('app.float.clock_maxwidth')) - .height('50%') } } \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets b/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets index 3fce0c17..26e7d758 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets +++ b/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets @@ -41,7 +41,7 @@ struct ControlCenterComponent { UpTitle({ showStatusBar: $showStatusBar }) } .width('100%') - .height('10%') + .height($r('app.float.up_title_height')) .margin({ top: $r('app.float.center_item_margin_top'), left: $r('app.float.center_item_margin_left'), right: $r('app.float.center_item_margin_right') }) @@ -69,7 +69,7 @@ struct ControlCenterComponent { MyBrightness() } .width('100%') - .height('8%') + .height($r('app.float.vol_height')) .margin({ top: $r('app.float.center_item_margin_top'), left: $r('app.float.center_item_margin_left'), right: $r('app.float.center_item_margin_right') }) @@ -78,13 +78,11 @@ struct ControlCenterComponent { MyVol() } .width('100%') - .height('8%') + .height($r('app.float.vol_height')) .margin({ top: $r('app.float.center_item_margin_top'), left: $r('app.float.center_item_margin_left'), right: $r('app.float.center_item_margin_right') }) } - .backgroundColor($r('app.color.control_center_bg_color')) .width('100%') - .height('100%') } } diff --git a/features/control/src/main/resources/base/element/float.json b/features/control/src/main/resources/base/element/float.json index 4ff4ee9b..c04c1e9f 100644 --- a/features/control/src/main/resources/base/element/float.json +++ b/features/control/src/main/resources/base/element/float.json @@ -82,6 +82,12 @@ },{ "name": "wifi_and_air_height", "value": "120" + },{ + "name": "up_title_height", + "value": "83" + },{ + "name": "vol_height", + "value": "66" } ] } diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ets b/features/signalcomponent/src/main/ets/default/common/constants.ets index 10f24689..a03c0174 100644 --- a/features/signalcomponent/src/main/ets/default/common/constants.ets +++ b/features/signalcomponent/src/main/ets/default/common/constants.ets @@ -31,5 +31,8 @@ export default class Constants { static CELLULAR_SIGNAL_FULL = 5; static CELLULAR_NO_SIM_CARD = -1; + static STATIC_BAR_ICON_WIDTH = 24; + static STATIC_BAR_ICON_HEIGHT = 24 ; + static NET_NULL = 'NULL'; } diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 6903224f..2ba5aab6 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -24,6 +24,7 @@ struct SignalIcon { @StorageLink('cellularLevel') cellularLevel : number = Constants.CELLULAR_NO_SIM_CARD @StorageLink('cellularType') cellularType : number = Constants.NETWORK_TYPE_UNKNOWN @StorageLink('networkState') networkState : string = Constants.NET_NULL + @StorageLink('StatusCoefficient') StatusCoefficient:number = 1.0 aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); mSignalModel.initSignalModel(); @@ -52,10 +53,13 @@ struct SignalIcon { .margin({ top: $r('app.float.margin_cellular_type') }) Image(this.updateCellularImage(this.cellularLevel)) .objectFit(ImageFit.ScaleDown) - }.flexShrink(1).width(42) + .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) + .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) + }.flexShrink(1) + .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) } .margin({ left: 5}) - .height('50%') + .height(Constants.STATIC_BAR_ICON_HEIGHT*this.StatusCoefficient) } /** diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ets b/features/signalcomponent/src/main/ets/default/signalModel.ets index 3bc335f2..414d0bb8 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ets +++ b/features/signalcomponent/src/main/ets/default/signalModel.ets @@ -141,6 +141,5 @@ export class SignalModel }); } } - - let mSignalModel = new SignalModel(); - export default mSignalModel as SignalModel; \ No newline at end of file +let mSignalModel = new SignalModel(); +export default mSignalModel as SignalModel; \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/common/constants.ets b/features/wificomponent/src/main/ets/default/common/constants.ets index c0aa03a0..0f606925 100644 --- a/features/wificomponent/src/main/ets/default/common/constants.ets +++ b/features/wificomponent/src/main/ets/default/common/constants.ets @@ -14,28 +14,28 @@ */ export default class constants { - static DEFAULT_WIFI_INFO: number = 0 - static DEFAULT_WIFI_STATUS: boolean = false - static WIFI_STATUS_DISPLAY_HEIGHT: string = '50%' - static WIFI_STATUS_HIDDEN_HEIGHT: number = 0 - static WIFI_STATUS_MAX_WIDTH: string = '50' - static EVENT_CONN_STATE: string = 'usual.event.wifi.CONN_STATE' - static EVENT_RSSI_VALUE: string = 'usual.event.wifi.RSSI_VALUE' - static EVENT_POWER_STATE: string = 'usual.event.wifi.POWER_STATE' - static Event_CONN_NAME:string ='WIFI_CONNECT_NAME' - - static WIFI_SIGNAL_NO: number = 0 - static WIFI_SIGNAL_LOW: number = 1 - static WIFI_SIGNAL_MID: number = 2 - static WIFI_SIGNAL_HIGH: number = 3 - static WIFI_SIGNAL_FULL: number = 4 - static WIFI_POWER_OFF: number = 1 - static WIFI_POWER_ON: number = 3 - static WIFI_STATE_AP_CONNECTING: number = 1 - static WIFI_Disconnected: number = 9 - static DEFAULT_ERR_CODE: number = 0 - static UPDATE_WIFI_INFO_DEFAULT_PARAM: number = -60 - static WIFI_SIGNAL_DEFAULT: number = -1 - static SIGN_LEVEL: number = 2 - + static DEFAULT_WIFI_INFO: number = 0; + static DEFAULT_WIFI_STATUS: boolean = false; + static WIFI_STATUS_DISPLAY_HEIGHT: string = '50%'; + static WIFI_STATUS_HIDDEN_HEIGHT: number = 0; + static WIFI_STATUS_MAX_WIDTH: string = '50'; + static EVENT_CONN_STATE: string = 'usual.event.wifi.CONN_STATE'; + static EVENT_RSSI_VALUE: string = 'usual.event.wifi.RSSI_VALUE'; + static EVENT_POWER_STATE: string = 'usual.event.wifi.POWER_STATE'; + static Event_CONN_NAME: string = 'WIFI_CONNECT_NAME'; + static WIFI_SIGNAL_NO: number = 0; + static WIFI_SIGNAL_LOW: number = 1; + static WIFI_SIGNAL_MID: number = 2; + static WIFI_SIGNAL_HIGH: number = 3; + static WIFI_SIGNAL_FULL: number = 4; + static WIFI_POWER_OFF: number = 1; + static WIFI_POWER_ON: number = 3; + static WIFI_STATE_AP_CONNECTING: number = 1; + static WIFI_Disconnected: number = 9; + static DEFAULT_ERR_CODE: number = 0; + static UPDATE_WIFI_INFO_DEFAULT_PARAM: number = -60; + static WIFI_SIGNAL_DEFAULT: number = -1; + static SIGN_LEVEL: number = 2; + static STATIC_BAR_ICON_WIDTH = 24; + static STATIC_BAR_ICON_HEIGHT = 24; } diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index 0db0ce94..ae3717c2 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -16,12 +16,14 @@ import Constants from '../common/constants.ets' import mWifiModel from '../WifiModel.ets' import Log from '../../../../../../../common/src/main/ets/default/Log.ets' + const TAG = 'WifiComponent-WifiIcon' @Component export default struct WifiIcon { - @StorageLink('wifiInfo') wifiInfo : number = Constants.DEFAULT_WIFI_INFO - @StorageLink('wifiStatus') wifiStatus : boolean = Constants.DEFAULT_WIFI_STATUS + @StorageLink('wifiInfo') wifiInfo: number = Constants.DEFAULT_WIFI_INFO + @StorageLink('wifiStatus') wifiStatus: boolean = Constants.DEFAULT_WIFI_STATUS + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) @@ -39,13 +41,13 @@ export default struct WifiIcon { Image(this.getImage(this.wifiInfo)).objectFit(ImageFit.Contain) } } - .width(this.wifiStatus ? $r('app.float.WIFISTATUS_MAXWIDTH') : 0) - .height(this.wifiStatus ? '50%' : $r('app.float.WIFISTATUS_HIDDEN_HEIGHT')) + .width(this.wifiStatus ? Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient : 0) + .height(this.wifiStatus ? Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient : 0) } private getImage(wifiInfo: number) { - Log.showInfo(TAG, `getImage, wifiInfo: ${ JSON.stringify(wifiInfo) }`) - let wifiImage ; + Log.showInfo(TAG, `getImage, wifiInfo: ${JSON.stringify(wifiInfo)}`) + let wifiImage; switch (wifiInfo) { case Constants.WIFI_SIGNAL_NO: wifiImage = $r('app.media.ic_statusbar_wifi_no'); @@ -60,7 +62,7 @@ export default struct WifiIcon { wifiImage = $r('app.media.ic_statusbar_wifi_3'); break; case Constants.WIFI_SIGNAL_FULL: - wifiImage =$r('app.media.ic_statusbar_wifi_full'); + wifiImage = $r('app.media.ic_statusbar_wifi_full'); break; default: wifiImage = $r('app.media.ic_statusbar_wifi_no'); diff --git a/product/navigationBar/src/main/ets/default/common/constants.ets b/product/navigationBar/src/main/ets/default/common/constants.ets index 1730c022..8bb0f4e0 100644 --- a/product/navigationBar/src/main/ets/default/common/constants.ets +++ b/product/navigationBar/src/main/ets/default/common/constants.ets @@ -24,4 +24,7 @@ class Constants{ static THREE_TEMPLATE: string = '1fr 1fr 1fr'; static ONE_ICON_LAYOUT: number = 1; static THREE_ICON_LAYOUT: number = 3; + static IMAGE_WIDTH: number = 32; + static IMAGE_HEIGHT: number = 32; + static BUTTON_WIDTH: number = 100; } \ No newline at end of file diff --git a/product/navigationBar/src/main/ets/default/pages/index.ets b/product/navigationBar/src/main/ets/default/pages/index.ets index 25711dc3..2bc90176 100644 --- a/product/navigationBar/src/main/ets/default/pages/index.ets +++ b/product/navigationBar/src/main/ets/default/pages/index.ets @@ -15,19 +15,27 @@ import Three from './threeLayout.ets' import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets'; import Constants from '../common/constants.ets' const STORAGE_NAVIGATION_TYPE = 'navigationType' -let mConfigReader +let mConfigReader; +let mHeightConfigUtils; const TAG = 'NavigationBar-Index'; @Entry @Component struct Index { @StorageLink('navigationLayoutConfig') mConfig: any = {} + @StorageLink('NavMinH') NavMinH:number = 32 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) + mHeightConfigUtils = new HeightConfigUtils(); + let NavMinH = AppStorage.SetAndLink("NavMinH", 32); + let NavCoefficient = AppStorage.SetAndLink("NavCoefficient", 1.0); + NavMinH.set(mHeightConfigUtils.getNavMinH()); + NavCoefficient.set(mHeightConfigUtils.getNavHCoefficient()); } aboutToDisappear(){ Log.showInfo(TAG, `aboutToDisAppear`) @@ -39,7 +47,8 @@ struct Index { } .width('100%') .height('100%') + .constraintSize({ minHeight: this.NavMinH }) .backgroundColor($r('app.color.index_background')) - .padding({ left: $r('app.float.index_padding_left'), right: $r('app.float.index_padding_right') }) + .padding({ left: '18%', right: '18%' }) } } diff --git a/product/navigationBar/src/main/ets/default/pages/keyButton.ets b/product/navigationBar/src/main/ets/default/pages/keyButton.ets index 3fd0554b..8743e3f9 100644 --- a/product/navigationBar/src/main/ets/default/pages/keyButton.ets +++ b/product/navigationBar/src/main/ets/default/pages/keyButton.ets @@ -26,6 +26,7 @@ export default struct keyButton { private uri: any; @Prop keyCode: number; @State backGroundColor: any = $r('app.color.button_default_background'); + @StorageLink('NavCoefficient') NavCoefficient:number = 1.0 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) @@ -39,17 +40,16 @@ export default struct keyButton { Stack({ alignContent: Alignment.Center }) { Flex() {} .borderRadius($r('app.float.button_radius')) - .width($r('app.float.button_width')) + .width('100%') .height('100%') .backgroundColor(this.backGroundColor) Image(this.uri) .objectFit(ImageFit.Contain) - .size({ width: $r('app.float.image_width'), height: $r('app.float.image_height') }) + .size({ width: Constants.IMAGE_WIDTH*this.NavCoefficient, height:Constants.IMAGE_HEIGHT*this.NavCoefficient }) } .onTouch(this.onKeyTouch.bind(this)) - .width($r('app.float.button_width')) + .width(Constants.BUTTON_WIDTH*this.NavCoefficient) .height('100%') - } private onKeyTouch(event:TouchEvent) { diff --git a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets b/product/navigationBar/src/main/ets/default/pages/oneLayout.ets index 909554a9..13b3ce26 100644 --- a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets +++ b/product/navigationBar/src/main/ets/default/pages/oneLayout.ets @@ -26,6 +26,7 @@ let KeyCodeArr: any[] = [ @Component export default struct oneLayout { + @StorageLink('NavMinH') NavMinH:number = 32 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) @@ -45,6 +46,7 @@ export default struct oneLayout { }) } .height('100%') + .constraintSize({ minHeight: this.NavMinH }) .align(Alignment.Center) }) } diff --git a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets b/product/navigationBar/src/main/ets/default/pages/threeLayout.ets index 01087f55..b610509b 100644 --- a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets +++ b/product/navigationBar/src/main/ets/default/pages/threeLayout.ets @@ -35,6 +35,7 @@ let KeyCodeArr: any[] = [ @Component export default struct threeLayout { + @StorageLink('NavMinH') NavMinH:number = 32 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) @@ -51,6 +52,7 @@ struct threeLayout { keyButton({ uri: item.uri, keyCode: item.keyCode }) } .height('100%') + .constraintSize({ minHeight: this.NavMinH }) .align(Alignment.Center) }) } diff --git a/product/navigationBar/src/main/resources/base/element/float.json b/product/navigationBar/src/main/resources/base/element/float.json index 79ce1444..63080848 100644 --- a/product/navigationBar/src/main/resources/base/element/float.json +++ b/product/navigationBar/src/main/resources/base/element/float.json @@ -27,15 +27,6 @@ { "name": "button_radius", "value": "30" - }, - { - "name": "image_width", - "value": "35" - }, - { - "name": "image_height", - "value": "35" } - ] } \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets b/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets index 6efa1210..46cabae4 100644 --- a/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets +++ b/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets @@ -31,6 +31,7 @@ struct Index { @StorageLink('notificationList') notificationList: any = [] @StorageLink('layoutConfig') layoutConfig: any = {} @StorageLink('wifiStatus') wifiStatus: boolean = false + @StorageLink('StatusCoefficient') StatusCoefficient:number = 1.0 aboutToAppear() { if (mConfigReader == null || mConfigReader == undefined) { @@ -67,9 +68,9 @@ struct Index { ForEach(this.notificationList.slice(0, 3), (item: any) => { Image(item.icon) .objectFit(ImageFit.ScaleDown) - .height('50%') - .width(30) - .margin({right:2}) + .height(Constants.STATIC_BAR_ICON_HEIGHT*this.StatusCoefficient) + .width(Constants.STATIC_BAR_ICON_WIDTH*this.StatusCoefficient) + .margin({right:Constants.STATIC_BAR_ICON_MARGIN}) }) Row() { Text('...') @@ -79,13 +80,15 @@ struct Index { ForEach(this.notificationList, (item: any) => { Image(item.icon) .objectFit(ImageFit.ScaleDown) - .height('50%') - .width(30) - .margin({right:2}) + .height(Constants.STATIC_BAR_ICON_HEIGHT*this.StatusCoefficient) + .width(Constants.STATIC_BAR_ICON_WIDTH*this.StatusCoefficient) + .margin({right:Constants.STATIC_BAR_ICON_MARGIN}) }) } } - .width(this.notificationList.length > 3 ? 34 * 4 : 34 * this.notificationList.length) + .width(this.notificationList.length > 3 ? + (Constants.STATIC_BAR_ICON_WIDTH+Constants.STATIC_BAR_ICON_MARGIN) * 4 : + (Constants.STATIC_BAR_ICON_WIDTH+Constants.STATIC_BAR_ICON_MARGIN) * this.notificationList.length) } }) }.constraintSize({ maxWidth: 200 }) @@ -98,6 +101,5 @@ struct Index { } .width('100%') .height('100%') - .backgroundColor($r("app.color.twogroup_layout_background")) } } \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/common/constants.ets b/product/statusbar/src/main/ets/default/pages/common/constants.ets index bfb17377..9c8d4ec4 100644 --- a/product/statusbar/src/main/ets/default/pages/common/constants.ets +++ b/product/statusbar/src/main/ets/default/pages/common/constants.ets @@ -40,4 +40,8 @@ export default class Constants { static CLOCK = 'clock' static BATTERY = 'battery' static NOTIFICATION = 'notification' + static STATIC_BAR_ICON_WIDTH = 24; + static STATIC_BAR_ICON_MARGIN = 2; + static STATIC_BAR_ICON_HEIGHT = 24; + static QUICKLY_SETTING_H = 124; } \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/control.ets b/product/statusbar/src/main/ets/default/pages/control.ets index e6e2c41c..c4918a5e 100644 --- a/product/statusbar/src/main/ets/default/pages/control.ets +++ b/product/statusbar/src/main/ets/default/pages/control.ets @@ -73,14 +73,13 @@ export default struct Control { @Component struct statusBar { private minHeight: number + @StorageLink('StatusCoefficient') StatusCoefficient:number = 1.0 build() { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { SignalIcon() WifiIcon() } - .margin({ left: 10 }) - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { BatteryIcon() ClockIcon() @@ -88,6 +87,5 @@ struct statusBar { } .width('100%') .height(this.minHeight) - .backgroundColor($r('app.color.statusbar_background')) } } diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets index a63a7843..0add83f7 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -22,10 +22,12 @@ import mNotificationService from '../../../../../../../features/notificationServ import ControlCenterComponent from './control.ets' import Constants from './common/constants.ets' import mBrightnessManager from '../../../../../../../features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets'; +import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets'; const TAG = 'StatusBar-Index' let mWindowManager; +let mHeightConfigUtils; @Entry @Component @@ -37,8 +39,19 @@ struct Index { @State showStatusBar: boolean = true @StorageLink('minHeight') minHeight:number = 0 @StorageLink('maxWidth') maxWidth:number = 0 + @StorageLink('StatusMinH') StatusMinH:number = 24 + @StorageLink('StatusCoefficient') StatusCoefficient:number = 1.0 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, showStatusBar: ${this.showStatusBar}`) + Log.showInfo(TAG, `aboutToAppear, showStatusBar: ${this.showStatusBar}`); + + mHeightConfigUtils = new HeightConfigUtils(); + let StatusMinH; + let StatusCoefficient; + + StatusMinH = AppStorage.SetAndLink("StatusMinH", 24); + StatusCoefficient = AppStorage.SetAndLink("StatusCoefficient", 1.0); + StatusMinH.set(mHeightConfigUtils.getStatusMinH()); + StatusCoefficient.set(mHeightConfigUtils.getStatusCoefficient()); mWindowManager = new WindowManager(); mWindowManager.initWindowManager(); @@ -59,6 +72,7 @@ struct Index { } .width('100%') .height('100%') + .backgroundColor($r("app.color.statusbar_background")) .onTouch(this.touchEvent.bind(this)) } else { if( this.startX <= parseInt((this.maxWidth/2).toString()) ) { @@ -70,6 +84,7 @@ struct Index { } .width('100%') .height('100%') + .constraintSize({ minHeight: this.StatusMinH }) } touchEvent(event: TouchEvent) { diff --git a/product/statusbar/src/main/ets/default/pages/notification.ets b/product/statusbar/src/main/ets/default/pages/notification.ets index 6c2ff8ec..d31f6bd3 100644 --- a/product/statusbar/src/main/ets/default/pages/notification.ets +++ b/product/statusbar/src/main/ets/default/pages/notification.ets @@ -23,6 +23,7 @@ import SignalIcon from '../../../../../../../features/signalcomponent/src/main/e import notificationItem from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets' import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' import mNotificationService from '../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' +import ConfigurableLayout from './ConfigurableLayout.ets'; const TAG = 'StatusBar-notification' @@ -39,6 +40,7 @@ struct Index { @State moveX: number = 0 @State moveY: number = 0 + aboutToAppear() { mWindowManager = new WindowManager(); mFeatureAbilityManager = new FeatureAbilityManager(); @@ -80,6 +82,7 @@ struct Index { @Component struct statusBar { private minHeight: number + @StorageLink('StatusCoefficient') StatusCoefficient:number = 1.0 build() { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { @@ -95,7 +98,6 @@ struct statusBar { } .width('100%') .height(this.minHeight) - .backgroundColor($r('app.color.statusbar_background')) } } @@ -109,7 +111,6 @@ struct quicklySetting { @State showDay: string = 'day' @State showMonth: string = 'month' @State showWeekDay: any = 'weekday' - @StorageLink('quicklySettingH') quicklySettingH:number = 0 aboutToAppear() { Log.showInfo(TAG, `quicklySetting, aboutToAppear`) @@ -154,7 +155,7 @@ struct quicklySetting { } .width('100%') - .height(this.quicklySettingH) + .height(Constants.QUICKLY_SETTING_H) .borderRadius($r('app.float.quicklysetting_borderradius')) .margin({ left: $r('app.float.quicklysetting_marginleft'), right: $r('app.float.quicklysetting_marginright') }) } @@ -208,9 +209,16 @@ struct dateItem { @Component struct notificationItems { @StorageLink('notificationList') notificationList: any[] = [] - @StorageLink('notificationH') notificationH:number = 0 + @StorageLink('maxHeight') maxHeight:number = 0 + @StorageLink('minHeight') minHeight:number = 0 + @State notificationH :number = 0 @Link showStatusBar: boolean + aboutToAppear() { + Log.showInfo(TAG, `notificationItems, aboutToAppear`) + this.notificationH = this.maxHeight - (this.minHeight*2) - Constants.QUICKLY_SETTING_H; + } + build() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { if (this.notificationList.length == 0) { @@ -226,7 +234,6 @@ struct notificationItems { ListItem() { notificationItem({ itemObject: item, showStatusBar: $showStatusBar }) } - }, (item: any) => item.hashcode.toString()) } .onTouch((event: TouchEvent) => { -- Gitee From a34380d85cf59cba5c7c0b3716a567edfdba1574 Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Wed, 13 Oct 2021 16:03:24 +0800 Subject: [PATCH 025/373] [SystemUI] Screen adaptation Signed-off-by: liuss0301 --- .../statusbar/src/main/ets/default/pages/common/constants.ets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/product/statusbar/src/main/ets/default/pages/common/constants.ets b/product/statusbar/src/main/ets/default/pages/common/constants.ets index 9c8d4ec4..cd287bb3 100644 --- a/product/statusbar/src/main/ets/default/pages/common/constants.ets +++ b/product/statusbar/src/main/ets/default/pages/common/constants.ets @@ -43,5 +43,5 @@ export default class Constants { static STATIC_BAR_ICON_WIDTH = 24; static STATIC_BAR_ICON_MARGIN = 2; static STATIC_BAR_ICON_HEIGHT = 24; - static QUICKLY_SETTING_H = 124; + static QUICKLY_SETTING_H = 83; } \ No newline at end of file -- Gitee From 7cfbf61891da14bbbe09a4133c7f338525d7d81d Mon Sep 17 00:00:00 2001 From: liuss0301 Date: Mon, 18 Oct 2021 16:10:18 +0800 Subject: [PATCH 026/373] [SystemUI] signal and wifi bug fix Signed-off-by: liuss0301 --- .../src/main/ets/default/pages/signalIcon.ets | 8 ++- .../src/main/ets/default/signalModel.ets | 38 +++++++----- .../src/main/ets/default/common/constants.ets | 7 ++- .../src/main/ets/default/wifiModel.ets | 60 +++++++++++-------- .../src/main/ets/default/pages/index.ets | 3 + 5 files changed, 74 insertions(+), 42 deletions(-) diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 2ba5aab6..38433e30 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -25,14 +25,18 @@ struct SignalIcon { @StorageLink('cellularType') cellularType : number = Constants.NETWORK_TYPE_UNKNOWN @StorageLink('networkState') networkState : string = Constants.NET_NULL @StorageLink('StatusCoefficient') StatusCoefficient:number = 1.0 + @StorageLink('signalObserved') signalObserved:boolean = false aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); - mSignalModel.initSignalModel(); + if (!this.signalObserved) { + mSignalModel.initSignalModel(); + this.signalObserved = true; + } } aboutToDisappear() { Log.showInfo(TAG, 'aboutToDisappear'); - mSignalModel.uninitSignalModel(); +// mSignalModel.uninitSignalModel(); } build() { diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ets b/features/signalcomponent/src/main/ets/default/signalModel.ets index 414d0bb8..597e4a72 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ets +++ b/features/signalcomponent/src/main/ets/default/signalModel.ets @@ -29,6 +29,7 @@ let signalValue = { cellularType: '', networkState: '' }; +let isInitObserver = false var mLevelLink; var mTypeLink; @@ -43,7 +44,6 @@ export class SignalModel mLevelLink = AppStorage.SetAndLink("cellularLevel", Constants.CELLULAR_NO_SIM_CARD); mTypeLink = AppStorage.SetAndLink("cellularType", Constants.NETWORK_TYPE_UNKNOWN); mStateLink = AppStorage.SetAndLink("networkState", Constants.NET_NULL); - this.initObserver(); this.checkCellularStatus(); } @@ -105,10 +105,17 @@ export class SignalModel } }); }); + if(!isInitObserver){ + this.initObserver(); + } } else { + Log.showError(TAG, `hasSimCard failed to hasSimCard because`); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); mStateLink.set(Constants.NET_NULL); + if(!isInitObserver){ + this.initObserver(); + } } }); } @@ -118,12 +125,18 @@ export class SignalModel */ initObserver() { Log.showInfo(TAG, 'initObserver'); - Observer.on('signalInfoChange', { slotId: 0 }, (err, value) => { - if (err.code != 0) { - this.checkCellularStatus(); - } else { - Log.showError(TAG, `failed, because ${JSON.stringify(err)}`); - } + isInitObserver = true; + Observer.on('signalInfoChange', (signalInfoChange) => { + Log.showInfo(TAG, `signalInfoChange ${JSON.stringify(signalInfoChange)}`); + this.checkCellularStatus(); + }); + Observer.on('networkStateChange', (networkState) => { + Log.showInfo(TAG, `networkStateChange ${JSON.stringify(networkState)}`); + this.checkCellularStatus(); + }); + Observer.on('simStateChange', (simStateInfo) => { + Log.showInfo(TAG, `simStateChange ${JSON.stringify(simStateInfo)}`); + this.checkCellularStatus(); }); } @@ -132,13 +145,10 @@ export class SignalModel */ unInitObserver() { Log.showInfo(TAG, 'unInitObserver'); - Observer.off('signalInfoChange', (err, value) => { - if (err.code != 0) { - Log.showInfo(TAG, `success: ${JSON.stringify(value)}`); - } else { - Log.showError(TAG, `failed, because ${JSON.stringify(err)}`); - } - }); + Observer.off('signalInfoChange'); + Observer.off('networkStateChange'); + Observer.off('simStateChange'); + isInitObserver = false; } } let mSignalModel = new SignalModel(); diff --git a/features/wificomponent/src/main/ets/default/common/constants.ets b/features/wificomponent/src/main/ets/default/common/constants.ets index 0f606925..f2bd3003 100644 --- a/features/wificomponent/src/main/ets/default/common/constants.ets +++ b/features/wificomponent/src/main/ets/default/common/constants.ets @@ -20,7 +20,6 @@ export default class constants { static WIFI_STATUS_HIDDEN_HEIGHT: number = 0; static WIFI_STATUS_MAX_WIDTH: string = '50'; static EVENT_CONN_STATE: string = 'usual.event.wifi.CONN_STATE'; - static EVENT_RSSI_VALUE: string = 'usual.event.wifi.RSSI_VALUE'; static EVENT_POWER_STATE: string = 'usual.event.wifi.POWER_STATE'; static Event_CONN_NAME: string = 'WIFI_CONNECT_NAME'; static WIFI_SIGNAL_NO: number = 0; @@ -31,7 +30,11 @@ export default class constants { static WIFI_POWER_OFF: number = 1; static WIFI_POWER_ON: number = 3; static WIFI_STATE_AP_CONNECTING: number = 1; - static WIFI_Disconnected: number = 9; + static WIFI_STATE_NETWORK_ENABLED: number = 3; + static WIFI_STATE_NO_NETWORK: number = 4; + static WIFI_Disconnected: number = 7; + static WIFI_PASSWORD_ERR: number = 8; + static WIFI_CONNECTING_TIMEOUT: number = 9; static DEFAULT_ERR_CODE: number = 0; static UPDATE_WIFI_INFO_DEFAULT_PARAM: number = -60; static WIFI_SIGNAL_DEFAULT: number = -1; diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ets b/features/wificomponent/src/main/ets/default/wifiModel.ets index a473c07b..e1b9584e 100644 --- a/features/wificomponent/src/main/ets/default/wifiModel.ets +++ b/features/wificomponent/src/main/ets/default/wifiModel.ets @@ -21,7 +21,7 @@ import Log from "../../../../../../common/src/main/ets/default/Log.ets"; const TAG = 'WifiComponent-WifiModel'; var mCommonEventSubscribeInfo = { - events: [Constants.EVENT_CONN_STATE, Constants.EVENT_RSSI_VALUE, + events: [Constants.EVENT_CONN_STATE, Constants.EVENT_POWER_STATE, Constants.Event_CONN_NAME] }; var mCommonEventSubscriber = null; @@ -41,7 +41,7 @@ export class WifiModel { if(mCommonEventSubscriber == null){ this.registerWiFiStatusListener(); } - // this.getWifiMessage(); + this.getWifiMessage(); } uninitWifiModel() { @@ -55,8 +55,19 @@ export class WifiModel { */ getWifiMessage() { Log.showInfo(TAG, `wifiModel getWifiMessage ===========`); - this.changeWifiStatus(WifiInfo.isWifiActive()); - + mWifiOpenStatus.set(WifiInfo.isWifiActive()); + try{ + WifiInfo.getLinkedInfo(data => { + Log.showInfo(TAG, `getWifiMessage getLinkedInfo ${JSON.stringify(data)}`); + if(data.ssid != ''){ + mWifiName.set(data.ssid); + mWifiStatus.set(true); + this.updateWifiInfo(); + } + }); + }catch(err){ + Log.showInfo(TAG, `getWifiMessage getLinkedInfo err ${JSON.stringify(err)}`); + } } /** @@ -90,29 +101,30 @@ export class WifiModel { * @param {Object} data - data returns from the caller */ private wifiStatusSubscriberCallBack(err, data) { - Log.showInfo(TAG, `createWifiStatusSubscriberCallBack start err:${ JSON.stringify(err)} data: ${ JSON.stringify(data) }`); + Log.showInfo(TAG, `wifiStatusSubscriberCallBack start err:${ JSON.stringify(err)} data: ${ JSON.stringify(data) }`); if (err.code == Constants.DEFAULT_ERR_CODE) { Log.showInfo(TAG, `wifi data == ${JSON.stringify(data)}`); - if (data.event == Constants.EVENT_CONN_STATE && data.code == Constants.WIFI_STATE_AP_CONNECTING) { - this.updateWifiInfo(); - this.changeWifiStatus(true); - } - if (data.event == Constants.EVENT_POWER_STATE && data.code == Constants.WIFI_POWER_OFF) { - this.updateWifiInfo(); - this.changeWifiStatus(false); - mWifiOpenStatus.set(false); - mWifiName.set('WLAN'); - } - if (data.event == Constants.EVENT_POWER_STATE && data.code == Constants.WIFI_POWER_ON) { - mWifiOpenStatus.set(true); - } - if(data.event == Constants.EVENT_CONN_STATE && data.code == Constants.WIFI_Disconnected){ - this.updateWifiInfo(); - this.changeWifiStatus(false); - mWifiName.set('WLAN'); + if (data.event == Constants.EVENT_CONN_STATE) { + if(data.code == Constants.WIFI_STATE_AP_CONNECTING || + data.code == Constants.WIFI_STATE_NETWORK_ENABLED || + data.code == Constants.WIFI_STATE_NO_NETWORK){ + this.updateWifiInfo(); + this.changeWifiStatus(true); + }else { + this.updateWifiInfo(); + this.changeWifiStatus(false); + mWifiName.set('WLAN'); + } } - if (data.event == Constants.EVENT_RSSI_VALUE) { - this.updateWifiInfo(); + if (data.event == Constants.EVENT_POWER_STATE) { + if( data.code == Constants.WIFI_POWER_OFF){ + this.updateWifiInfo(); + this.changeWifiStatus(false); + mWifiOpenStatus.set(false); + mWifiName.set('WLAN'); + }else if(data.code == Constants.WIFI_POWER_ON){ + mWifiOpenStatus.set(true); + } } if(data.event == 'WIFI_CONNECT_NAME'){ this.updateWifiName(JSON.parse(data.data).name) diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets index 0add83f7..d2e3c497 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -53,6 +53,9 @@ struct Index { StatusMinH.set(mHeightConfigUtils.getStatusMinH()); StatusCoefficient.set(mHeightConfigUtils.getStatusCoefficient()); + let signalObserved = AppStorage.SetAndLink("signalObserved", false); + signalObserved.set(false); + mWindowManager = new WindowManager(); mWindowManager.initWindowManager(); mNotificationService.initNotificationService(); -- Gitee From 8176dca25f5a5b1239d80cca15fae86da9c49981 Mon Sep 17 00:00:00 2001 From: "size.peng" Date: Tue, 19 Oct 2021 18:53:27 +0800 Subject: [PATCH 027/373] [System-ui]Change back key event. Signed-off-by: size.peng --- .../ohos/navigationservice/KeyCodeEvent.ets | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets index 687a3aff..f776fa12 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets @@ -16,7 +16,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; import Constants from './common/constants.ets'; import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; -import Input from '@ohos.injectEventHandler'; +import Input from '@ohos.multimodalInput.inputEventClient'; const TAG = 'KeyCodeEvent' @@ -60,22 +60,36 @@ export class KeyCodeEvent{ private sendBackKeyEventStart() { Log.showInfo(TAG, 'sendBackKeyEventStart'); - res = Input.injectEventSync({ + + let keyEvent = { isPressed: true, + // back keycode keyCode: 2, - keyDownDuration: 1 + // After consulting the multi-mode subsystem, this parameter proved meaningless and remained unchanged + keyDownDuration: 1, + // This parameter changes with the version, and is currently 10008 + maxKeyCode: 10008 + } + res = Input.injectEvent({ + KeyEvent:keyEvent }); Log.showInfo(TAG, `injectEventHandler injectEventSync down res: ${res}`); } private sendBackKeyEventEnd() { Log.showInfo(TAG, 'sendBackKeyEventEnd'); - res = Input.injectEventSync({ + let keyEvent = { isPressed: false, + // back keycode keyCode: 2, - keyDownDuration: 1 + // After consulting the multi-mode subsystem, this parameter proved meaningless and remained unchanged + keyDownDuration: 1, + // This parameter changes with the version, and is currently 10008 + maxKeyCode: 10008 + } + res = Input.injectEvent({ + KeyEvent:keyEvent }); - Log.showInfo(TAG, `injectEventHandler injectEventSync up res: ${res}`); } private sendHomeKeyEvent() { -- Gitee From 66836a14265c0c79fe7772ebfe4ac36e1bd5a988 Mon Sep 17 00:00:00 2001 From: "size.peng" Date: Mon, 25 Oct 2021 13:15:57 +0800 Subject: [PATCH 028/373] [System-ui]Add new notification item type. Signed-off-by: size.peng --- .../abilitymanager/notificationManager.ets | 5 + .../com/ohos/noticeItem/common/constants.ets | 17 +- .../ets/com/ohos/noticeItem/item/longItem.ets | 160 ++++++++++------- .../com/ohos/noticeItem/item/multiItem.ets | 169 +++++++++++------- .../ohos/noticeItem/item/notificationItem.ets | 81 ++++++--- .../com/ohos/noticeItem/item/titleItem.ets | 61 ++++--- .../main/resources/base/element/float.json | 8 +- .../NotificationService.ets | 158 ++++++++++++---- .../ets/default/pages/ConfigurableLayout.ets | 4 +- 9 files changed, 449 insertions(+), 214 deletions(-) diff --git a/common/src/main/ets/default/abilitymanager/notificationManager.ets b/common/src/main/ets/default/abilitymanager/notificationManager.ets index 4522f535..b53f716c 100644 --- a/common/src/main/ets/default/abilitymanager/notificationManager.ets +++ b/common/src/main/ets/default/abilitymanager/notificationManager.ets @@ -25,6 +25,7 @@ export default class NotificationManager { static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; + static TYPE_IMAGE: number = Notification.ContentType.NOTIFICATION_CONTENT_PICTURE; static subscribeNotification(tag, subscriber, asyncCallback) { Log.showInfo(TAG, `subscribeNotification from: ${tag}`)); @@ -46,5 +47,9 @@ export default class NotificationManager { Notification.remove(hashCode, callback) } + static getAllActiveNotifications(tag, callback) { + Log.showInfo(TAG, `getAllActiveNotifications from: ${tag}`)); + Notification.getAllActiveNotifications(callback); + } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets index 7c46d3d2..3b894b26 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets @@ -14,14 +14,14 @@ */ export default class Constants { - static NOTIFICATION_TYPE_NORMAL: string = '0' - static NOTIFICATION_TYPE_LONG: string = '1' - static NOTIFICATION_TYPE_IMAGE: string = '2' - static NOTIFICATION_TYPE_MULTILINE: string = '4' - static NOTIFICATION_TYPE_SOCIAL: string = '3' - static NOTIFICATION_TYPE_MEDIA: string = '5' - static TEXT_MAX_LENGTH: number = 21 - static TEXT_EXPANDED_MAX_LENGTH: number = 13 + static NOTIFICATION_TYPE_BASIC: string = '0'; + static NOTIFICATION_TYPE_LONG: string = '1'; + static NOTIFICATION_TYPE_IMAGE: string = '2'; + static NOTIFICATION_TYPE_MULTILINE: string = '4'; + static NOTIFICATION_TYPE_SOCIAL: string = '3'; + static NOTIFICATION_TYPE_MEDIA: string = '5'; + static TEXT_MAX_LENGTH: number = 21; + static TEXT_EXPANDED_MAX_LENGTH: number = 13; static TOUCH_TYPE_DOWN: number = 0; static TOUCH_TYPE_UP: number = 1; static TOUCH_TYPE_MOVE: number = 2; @@ -29,5 +29,6 @@ export default class Constants { static DISPLAY_TRANSLATE_X: number = -150; static REMOVE_TRANSLATE_X: number = 150; static DEFAULT_MAX_LINES: number= 1; + static EXPENDED_MAX_LINES: number= 8; static CONTENT_LINE_HEIGHT: number = 20; } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets index 1d819ce5..b0ad8661 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets @@ -13,12 +13,13 @@ * limitations under the License. */ -import Constants from '../common/constants.ets' -import titleItem from './titleItem' -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/constants.ets'; +import titleItem from './titleItem'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; import mNotificationService from '../../../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' -import WantAgent from '@ohos.wantAgent' -import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import WantAgent from '@ohos.wantAgent'; +import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; const TAG = 'NoticeItem-LongItem'; @@ -26,78 +27,108 @@ let mWindowManager; @Component export default -struct longItem { +struct LongItem { @Link showStatusBar: boolean @Prop notificationId: string - @Prop notificationIcon: string + @Prop notificationType: string + private notificationSmallIcon: PixelMap + private notificationLargeIcon: PixelMap + private notificationActionButtons: any + @State hasPicture: boolean = false @Prop notificationHashCode: string - private notificationContent: string + @Prop notificationText: string + @Prop notificationBriefText: string + @Prop notificationExpandedTitle: string + @Prop notificationLongText: string @Prop notificationName: string @Prop notificationTime: string @Prop notificationTitle: string - @Prop notificationIconDisplay: string private notificationWant: any @State isExpand: boolean = false - @State srcIconDisplay: any = $r('app.media.ic_notification_down') - @State needExpand: boolean = false + @State needExpand: boolean = true @State iconDisplay: boolean = false; @State itemWidth: string = '100%' startX: number = 0 startY: number = 0 @State moveX: number = 0 @State moveY: number = 0 - @State showMaxLines: number = Constants.DEFAULT_MAX_LINES aboutToAppear() { Log.showInfo(TAG, `aboutToAppear id: ${this.notificationId}`) mWindowManager = new WindowManager(); - if (this.notificationContent.length > Constants.TEXT_MAX_LENGTH) { - this.needExpand = true; + if (CheckEmptyUtils.isEmpty(this.notificationLargeIcon)) { + this.hasPicture = false; } else { - this.needExpand = false; + this.hasPicture = true; } - if (this.needExpand && this.$isExpand) { - this.showMaxLines = Math.ceil(this.notificationContent.length / Constants.TEXT_EXPANDED_MAX_LENGTH); - } else { - this.showMaxLines = Constants.DEFAULT_MAX_LINES; - } - - - Log.showInfo(TAG, `aboutToAppear showMaxLines: ${this.showMaxLines} ${typeof this.showMaxLines}`) } - aboutToDisappear(){ - Log.showInfo(TAG, `aboutToDisAppear id: ${this.notificationId}`) + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear id: ${this.notificationId}`); } build() { Row() { Column() { titleItem({ - notificationIcon: this.notificationIcon, + notificationSmallIcon: this.notificationSmallIcon, notificationName: this.notificationName, notificationTime: this.notificationTime, - srcIconDisplay: $srcIconDisplay, isExpand: $isExpand, needExpand: this.needExpand }) - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Text(this.notificationTitle) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) //not support Resource type - Text(this.notificationContent) - .maxLines(this.showMaxLines) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - .margin({ top: $r('app.float.content_margin_top') }) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.isExpand ? this.notificationExpandedTitle : this.notificationTitle) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) //not support Resource type + Text(this.isExpand ? this.notificationLongText : this.notificationText) + .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .constraintSize({maxHeight: $r('app.float.notification_expanded_text_maxheight')}) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .margin({ top: $r('app.float.content_margin_top') }) + } + .width(this.hasPicture ? '85%' : '100%') + .margin({ top: $r('app.float.body_margin_top') }) + + if (this.hasPicture) { + Column() { + Image(this.notificationLargeIcon) + .objectFit(ImageFit.Contain) + .width(50) + .height(50) + } + .alignItems(HorizontalAlign.End) + .width('15%') + } } - .width('100%') - .margin({ top: $r('app.float.body_margin_top') }) - .onClick(this.clickNotificationItem.bind(this)) + .onClick(this.clickLongItem.bind(this)) + + if (this.isExpand) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + ForEach(this.notificationActionButtons, (item: any) => { + Text(item.title) + .fontSize(20) + .height(30) + .fontColor(Color.Blue) + .margin({ right: 20 }) + .onClick(() => { + Log.showInfo(TAG, `clickbuttonEvent: ${JSON.stringify(item.wantAgent)}`) + this.startTargetAbility(item.wantAgent) + }) + } + } + .margin({ top: 10 }) + } + } .backgroundColor($r('app.color.notificationitem_background')) .opacity($r('app.float.item_opicaty')) @@ -115,7 +146,6 @@ struct longItem { .onTouch(this.touchNotificationItem.bind(this)) .width(this.itemWidth) - if (this.iconDisplay) { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { Image($r('app.media.delete')) //delete @@ -123,7 +153,7 @@ struct longItem { .width($r('app.float.item_delete_image_width')) .height($r('app.float.item_delete_image_height')) .onClick(() => { - this.removeNotificationItem(this.notificationHashCode) + this.removeNotificationItem(this.notificationHashCode); }) } .width('30%') @@ -133,28 +163,28 @@ struct longItem { touchNotificationItem(event: TouchEvent) { if (event.type == Constants.TOUCH_TYPE_DOWN) { //down - this.startX = event.touches[0].x - this.startY = event.touches[0].y - Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`) + this.startX = event.touches[0].x; + this.startY = event.touches[0].y; + Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`); } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move - this.moveX = event.touches[0].x - this.startX - this.moveY = event.touches[0].y - this.startY + this.moveX = event.touches[0].x - this.startX; + this.moveY = event.touches[0].y - this.startY; } else if (event.type == Constants.TOUCH_TYPE_UP) { //up - Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`) + Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); if (this.iconDisplay) { if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { //hidden this.iconDisplay = false; - this.itemWidth = '100%' + this.itemWidth = '100%'; Log.showInfo(TAG, 'hidden'); } } else { if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { this.iconDisplay = true; - this.itemWidth = '70%' + this.itemWidth = '70%'; Log.showInfo(TAG, 'display'); } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { - this.removeNotificationItem(this.notificationHashCode) + this.removeNotificationItem(this.notificationHashCode); } } } @@ -162,13 +192,19 @@ struct longItem { removeNotificationItem(hashCode: string) { Log.showInfo(TAG, 'removeNotificationItem'); - mNotificationService.removeNotificationItem(hashCode, true) + mNotificationService.removeNotificationItem(hashCode, true); + } + + clickLongItem() { + Log.showInfo(TAG, 'clickLongItem'); + this.startTargetAbility(this.notificationWant); } - clickNotificationItem() { + startTargetAbility(want) { + Log.showInfo(TAG, 'startTargetAbility'); //close window - this.showStatusBar = true - mWindowManager.setWindowMin((result)=>{ + this.showStatusBar = true; + mWindowManager.setWindowMin((result) => { Log.showInfo(TAG, `setWindowMin ${result}`); }); //open app @@ -179,11 +215,11 @@ struct longItem { permission: '', extraInfo: {} }; - WantAgent.trigger(this.notificationWant, TriggerInfo, ((err, data) => { - Log.showInfo(TAG, `longitemClick wantAgent trigger callback ${JSON.stringify(err)}`); - Log.showInfo(TAG, `longitemClick wantAgent trigger callback ${JSON.stringify(data)}`); + WantAgent.trigger(want, TriggerInfo, ((err, data) => { + Log.showInfo(TAG, `longitemClick wantAgent trigger err ${JSON.stringify(err)}`); + Log.showInfo(TAG, `longitemClick wantAgent trigger data ${JSON.stringify(data)}`); })); //remove notification - this.removeNotificationItem(this.notificationHashCode) + this.removeNotificationItem(this.notificationHashCode); } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets index ab9bb5f0..2300e468 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets @@ -13,12 +13,13 @@ * limitations under the License. */ -import Constants from '../common/constants.ets' -import titleItem from './titleItem' -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/constants.ets'; +import titleItem from './titleItem'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; import mNotificationService from '../../../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' -import WantAgent from '@ohos.wantAgent' -import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import WantAgent from '@ohos.wantAgent'; +import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; const TAG = 'NoticeItem-multiItem'; @@ -26,20 +27,24 @@ let mWindowManager; @Component export default -struct multiItem { +struct MultiItem { @Link showStatusBar: boolean @Prop notificationId: string - @Prop notificationIcon: string + private notificationSmallIcon: PixelMap + private notificationLargeIcon: PixelMap + private notificationActionButtons: any + @State hasPicture: boolean = false @Prop notificationHashCode: string - private notificationContent: string[] + @Prop notificationText: string + @Prop notificationBriefText: string + @Prop notificationLongTitle: string + private notificationLines: string[] @Prop notificationName: string @Prop notificationTime: string @Prop notificationTitle: string - @Prop notificationIconDisplay: string private notificationWant: any @State isExpand: boolean = false - @State srcIconDisplay: any = $r('app.media.ic_notification_down') - @State needExpand: boolean = false + @State needExpand: boolean = true @State iconDisplay: boolean = false; @State itemWidth: string = '100%' startX: number = 0 @@ -48,55 +53,89 @@ struct multiItem { @State moveY: number = 0 aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear id: ${this.notificationId}`); mWindowManager = new WindowManager(); - if (this.notificationContent.length > 1) { - this.needExpand = true; + if (CheckEmptyUtils.isEmpty(this.notificationLargeIcon)) { + this.hasPicture = false; } else { - this.needExpand = false; + this.hasPicture = true; } } - aboutToDisappear(){ - Log.showInfo(TAG, `aboutToDisAppear id: ${this.notificationId}`) + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear id: ${this.notificationId}`); } + build() { Row() { Column() { titleItem({ - notificationIcon: this.notificationIcon, + notificationSmallIcon: this.notificationSmallIcon, notificationName: this.notificationName, notificationTime: this.notificationTime, - srcIconDisplay: $srcIconDisplay, isExpand: $isExpand, needExpand: this.needExpand }) - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Text(this.notificationTitle) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - if (this.isExpand) { - ForEach(this.notificationContent, - (item: string) => { - Text(`${item}`) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .margin({ top: $r('app.float.content_margin_top') }) - }, (item: string) => item.toString() - ) - } else { - Text(this.notificationContent[0]) - .fontSize($r('app.float.notification_content_fontsize')) + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.isExpand ? this.notificationLongTitle : this.notificationTitle) .maxLines(Constants.DEFAULT_MAX_LINES) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontColor($r('app.color.content_text_color')) - .margin({ top: $r('app.float.content_margin_top') }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + if (this.isExpand) { + ForEach(this.notificationLines, + (item: string) => { + Text(`${item}`) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .margin({ top: $r('app.float.content_margin_top') }) + }, (item: string) => item.toString() + ) + } else { + Text(this.notificationText) + .fontSize($r('app.float.notification_content_fontsize')) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r('app.color.content_text_color')) + .margin({ top: $r('app.float.content_margin_top') }) + } + } + .width(this.hasPicture ? '85%' : '100%') + .margin({ top: $r('app.float.body_margin_top') }) + + if (this.hasPicture) { + Column() { + Image(this.notificationLargeIcon) + .objectFit(ImageFit.Contain) + .width(50) + .height(50) + } + .alignItems(HorizontalAlign.End) + .width('15%') } } - .width('100%') - .margin({ top: $r('app.float.body_margin_top') }) - .onClick(this.clickNotificationItem.bind(this)) + .onClick(this.clickMultiItem.bind(this)) + + if (this.isExpand) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + ForEach(this.notificationActionButtons, (item: any) => { + Text(item.title) + .fontSize(20) + .height(30) + .fontColor(Color.Blue) + .margin({ right: 20 }) + .onClick(() => { + Log.showInfo(TAG, `clickbuttonEvent: ${JSON.stringify(item.wantAgent)}`) + this.startTargetAbility(item.wantAgent) + }) + } + } + .margin({ top: 10 }) + } } .backgroundColor($r('app.color.notificationitem_background')) .opacity($r('app.float.item_opicaty')) @@ -122,7 +161,7 @@ struct multiItem { .width($r('app.float.item_delete_image_width')) .height($r('app.float.item_delete_image_height')) .onClick(() => { - this.removeNotificationItem(this.notificationHashCode) + this.removeNotificationItem(this.notificationHashCode); }) } .width('30%') @@ -132,28 +171,28 @@ struct multiItem { touchNotificationItem(event: TouchEvent) { if (event.type == Constants.TOUCH_TYPE_DOWN) { //down - this.startX = event.touches[0].x - this.startY = event.touches[0].y - Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`) + this.startX = event.touches[0].x; + this.startY = event.touches[0].y; + Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`); } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move - this.moveX = event.touches[0].x - this.startX - this.moveY = event.touches[0].y - this.startY + this.moveX = event.touches[0].x - this.startX; + this.moveY = event.touches[0].y - this.startY; } else if (event.type == Constants.TOUCH_TYPE_UP) { //up - Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`) + Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); if (this.iconDisplay) { if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { //hidden this.iconDisplay = false; - this.itemWidth = '100%' + this.itemWidth = '100%'; Log.showInfo(TAG, 'hidden'); } } else { if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { this.iconDisplay = true; - this.itemWidth = '70%' + this.itemWidth = '70%'; Log.showInfo(TAG, 'display'); } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { - this.removeNotificationItem(this.notificationHashCode) + this.removeNotificationItem(this.notificationHashCode); } } } @@ -161,26 +200,34 @@ struct multiItem { removeNotificationItem(hashCode: string) { Log.showInfo(TAG, 'removeNotificationItem'); - mNotificationService.removeNotificationItem(hashCode, true) + mNotificationService.removeNotificationItem(hashCode, true); } - clickNotificationItem() { - //remove notification - this.removeNotificationItem(this.notificationHashCode) + clickMultiItem() { + Log.showInfo(TAG, 'clickMultiItem'); + this.startTargetAbility(this.notificationWant); + } + + startTargetAbility(want) { + Log.showInfo(TAG, 'startTargetAbility'); //close window - mWindowManager.setWindowMin((result)=>{}); - this.showStatusBar = true + this.showStatusBar = true; + mWindowManager.setWindowMin((result) => { + Log.showInfo(TAG, `setWindowMin ${result}`); + }); //open app - Log.showInfo(TAG, `longitemClick wantAgent ${JSON.stringify(this.notificationWant)}`); + Log.showInfo(TAG, `longitemClick wantAgent ${JSON.stringify(this.notificationWant)} id: ${this.notificationId}`); let TriggerInfo = { code: 0, want: '', permission: '', extraInfo: {} }; - WantAgent.trigger(this.notificationWant, TriggerInfo, ((err, data) => { - Log.showInfo(TAG, `longitemClick wantAgent trigger callback ${JSON.stringify(err)}`); - Log.showInfo(TAG, `longitemClick wantAgent trigger callback ${JSON.stringify(data)}`); + WantAgent.trigger(want, TriggerInfo, ((err, data) => { + Log.showInfo(TAG, `longitemClick wantAgent trigger err ${JSON.stringify(err)}`); + Log.showInfo(TAG, `longitemClick wantAgent trigger data ${JSON.stringify(data)}`); })); + //remove notification + this.removeNotificationItem(this.notificationHashCode); } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets index 08a59a4e..6d24c42b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets @@ -13,30 +13,37 @@ * limitations under the License. */ -import Constants from '../common/constants.ets' -import longItem from './longItem.ets' -import multiItem from './multiItem.ets' -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -const TAG = 'NoticeItem-NotificationItem' +import Constants from '../common/constants.ets'; +import basicItem from './basicItem.ets'; +import longItem from './longItem.ets'; +import imageItem from './imageItem.ets'; +import multiItem from './multiItem.ets'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'NoticeItem-NotificationItem'; @Component export default -struct notificationItem { +struct NotificationItem { @Link showStatusBar: boolean private itemObject: any - private normal: boolean = false; + private basic: boolean = false; private long: boolean = false; + private image: boolean = false; private multi: boolean = false; aboutToAppear() { Log.showInfo(TAG, `aboutToDisAppear Start`) switch (this.itemObject.type) { - case Constants.NOTIFICATION_TYPE_NORMAL: - this.normal = true; + case Constants.NOTIFICATION_TYPE_BASIC: + this.basic = true; break; case Constants.NOTIFICATION_TYPE_LONG: this.long = true; break; + case Constants.NOTIFICATION_TYPE_IMAGE: + this.image = true; + break; case Constants.NOTIFICATION_TYPE_MULTILINE: this.multi = true; break; @@ -46,21 +53,23 @@ struct notificationItem { } aboutToDisappear(){ - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`); } build() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - if (this.normal) { - longItem({ + if (this.basic) { + basicItem({ notificationId: this.itemObject.id, - notificationIcon: this.itemObject.icon, + notificationType: this.itemObject.type, + notificationSmallIcon: this.itemObject.smallIcon, + notificationLargeIcon: this.itemObject.largeIcon, + notificationActionButtons: this.itemObject.actionButtons, notificationHashCode: this.itemObject.hashcode, - notificationContent: this.itemObject.content, + notificationText: this.itemObject.text, notificationName: this.itemObject.name, notificationTime: this.itemObject.time, notificationTitle: this.itemObject.title, - notificationIconDisplay: this.itemObject.iconDisplay, notificationWant: this.itemObject.want, showStatusBar: $showStatusBar }); @@ -68,13 +77,37 @@ struct notificationItem { if (this.long) { longItem({ notificationId: this.itemObject.id, - notificationIcon: this.itemObject.icon, + notificationType: this.itemObject.type, + notificationSmallIcon: this.itemObject.smallIcon, + notificationLargeIcon: this.itemObject.largeIcon, + notificationActionButtons: this.itemObject.actionButtons, + notificationHashCode: this.itemObject.hashcode, + notificationText: this.itemObject.text, + notificationBriefText: this.itemObject.briefText, + notificationExpandedTitle: this.itemObject.expandedTitle, + notificationLongText: this.itemObject.longText, + notificationName: this.itemObject.name, + notificationTime: this.itemObject.time, + notificationTitle: this.itemObject.title, + notificationWant: this.itemObject.want, + showStatusBar: $showStatusBar + }); + } + if (this.image) { + imageItem({ + notificationId: this.itemObject.id, + notificationType: this.itemObject.type, + notificationSmallIcon: this.itemObject.smallIcon, + notificationLargeIcon: this.itemObject.largeIcon, + notificationActionButtons: this.itemObject.actionButtons, notificationHashCode: this.itemObject.hashcode, - notificationContent: this.itemObject.content, + notificationText: this.itemObject.text, + notificationBriefText: this.itemObject.briefText, + notificationExpandedTitle: this.itemObject.expandedTitle, + notificationBigPicture: this.itemObject.bigPicture, notificationName: this.itemObject.name, notificationTime: this.itemObject.time, notificationTitle: this.itemObject.title, - notificationIconDisplay: this.itemObject.iconDisplay, notificationWant: this.itemObject.want, showStatusBar: $showStatusBar }); @@ -82,13 +115,19 @@ struct notificationItem { if (this.multi) { multiItem({ notificationId: this.itemObject.id, - notificationIcon: this.itemObject.icon, + + notificationSmallIcon: this.itemObject.smallIcon, + notificationLargeIcon: this.itemObject.largeIcon, + notificationActionButtons: this.itemObject.actionButtons, + notificationHashCode: this.itemObject.hashcode, - notificationContent: this.itemObject.content, + notificationText: this.itemObject.text, + notificationBriefText: this.itemObject.briefText, + notificationLongTitle: this.itemObject.longTitle, + notificationLines: this.itemObject.lines, notificationName: this.itemObject.name, notificationTime: this.itemObject.time, notificationTitle: this.itemObject.title, - notificationIconDisplay: this.itemObject.iconDisplay, notificationWant: this.itemObject.want, showStatusBar: $showStatusBar }); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets index 01494740..c2d73539 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets @@ -13,62 +13,77 @@ * limitations under the License. */ -import Constants from '../common/constants.ets' -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -const TAG = 'NoticeItem-TitleItem' +import Constants from '../common/constants.ets'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; + +const TAG = 'NoticeItem-TitleItem'; @Component export default -struct titleItem { - @Prop notificationIcon: string +struct TitleItem { + private notificationSmallIcon: PixelMap @Prop notificationName: string @Prop notificationTime: string - @Link srcIconDisplay: any + @State srcIconDisplay: any = $r('app.media.ic_notification_down') @Link isExpand: boolean @Prop needExpand: boolean @State rowSpace: any = $r('app.float.titleitem_row_space') + aboutToAppear() { - Log.showInfo(TAG, `aboutToDisAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`); } - aboutToDisappear(){ - Log.showInfo(TAG, `aboutToDisAppear`) + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`); } build() { Row() { Row({ space: this.rowSpace }) { - Image(this.notificationIcon) - .objectFit(ImageFit.Contain) - .width($r('app.float.title_image_width')) - .height($r('app.float.title_image_height')) + if (!CheckEmptyUtils.isEmpty(this.notificationSmallIcon)) { + Image(this.notificationSmallIcon) + .objectFit(ImageFit.Contain) + .width($r('app.float.title_image_width')) + .height($r('app.float.title_image_height')) + .flexShrink(0) + } Text(this.notificationName) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) .fontSize($r('app.float.title_name_fontsize')) + .flexShrink(1) Text(this.notificationTime) .fontSize($r('app.float.title_time_fontsize')) + .flexShrink(0) } - .width('80%') + .width(this.needExpand ? '80%' : '100%') - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End, alignItems: ItemAlign.Center }) { - if (this.needExpand) { + if (this.needExpand) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End, alignItems: ItemAlign.Center }) { Image(this.srcIconDisplay) .objectFit(ImageFit.Contain) .width($r('app.float.displayicon_width')) .height($r('app.float.displayicon_height')) } + .width('20%') } - .width('20%') } .height($r('app.float.titleitem_height')) .width('100%') - .onClick(() => { + .onClick(this.clickTitleItem.bind(this)) + } + + clickTitleItem() { + Log.showInfo(TAG, 'clickTitleItem'); + if (this.needExpand) { if (this.isExpand) { - this.isExpand = false - this.srcIconDisplay = $r('app.media.ic_notification_down') + this.isExpand = false; + this.srcIconDisplay = $r('app.media.ic_notification_down'); } else { - this.isExpand = true - this.srcIconDisplay = $r('app.media.ic_notification_up') + this.isExpand = true; + this.srcIconDisplay = $r('app.media.ic_notification_up'); } - }) + } } } diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index d0dda279..9c529219 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -4,6 +4,10 @@ "name": "notification_title_fontsize", "value": "20" }, + { + "name": "notification_expanded_text_maxheight", + "value": "295" + }, { "name": "notification_content_fontsize", "value": "20" @@ -66,11 +70,11 @@ }, { "name": "item_delete_image_width", - "value": "40" + "value": "30" }, { "name": "item_delete_image_height", - "value": "40" + "value": "30" }, { "name": "titleitem_row_space", diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets index 7884beb3..8f304391 100644 --- a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets +++ b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets @@ -16,10 +16,14 @@ import NotificationManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/notificationManager.ets'; import BundleManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager.ets'; import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import Constants from './common/constants.ets'; +import {SlotLevel} from '@ohos.notification' +import Media from '@ohos.multimedia.media' -const TAG = 'NotificationService' +const TAG = 'NotificationService'; -let mNotificationList +let mNotificationList; let mSubscriber; let mDate; let mAppName; @@ -29,11 +33,13 @@ let mEmptyArray; * Responsible for notification binding and interaction between View and Model. */ export class NotificationService { - + media:any constructor() { let tempLink = AppStorage.SetAndLink('notificationList', []) mNotificationList = tempLink.get() Log.showInfo(TAG, `NotificationService constructor ${JSON.stringify(mNotificationList)}`) + this.media=Media.createAudioPlayer() + this.media.src='file://system/etc/Light.ogg' } initNotificationService() { @@ -45,6 +51,7 @@ export class NotificationService { this.createNotificationCallback(); Log.showInfo(TAG, `initNotificationCenter, if: ${JSON.stringify(mSubscriber)}`); } + this.getAllActiveNotifications(); } updateNotification() { @@ -87,27 +94,54 @@ export class NotificationService { * @param {Object} data - Callback data. */ consumeCallback(err, data) { - Log.showInfo(TAG, 'consumeCallback started ===================='); + Log.showInfo(TAG, 'consumeCallback started'); Log.showInfo(TAG, JSON.stringify(data.request?.wantAgent)); + Log.showInfo(TAG, 'sortingMap' + JSON.stringify(data.sortingMap||{})) Log.showInfo(TAG, JSON.stringify(data)); + let request = data?.request; + if (request == null || request == undefined) { + Log.showInfo(TAG, 'consumeCallback request is empty'); + return; + } + let sortingMap = data?.sortingMap; + if (sortingMap == null || sortingMap == undefined) { + Log.showInfo(TAG, 'consumeCallback sortingMap is empty'); + return; + } + this.parseRequest(request,sortingMap,Constants.GET_NEW_NOTIFICATION); + } - let contentType = data?.request?.content?.contentType; + parseRequest(request,sortingMap, processType) { + Log.showInfo(TAG, `request : ${JSON.stringify(request)}`) + Log.showInfo(TAG, `processType : ${processType}`) + let contentType = request?.content?.contentType; if (contentType == null || contentType == undefined) { - Log.showInfo(TAG, 'consumeCallback contentType is empty'); + Log.showInfo(TAG, 'parseRequest contentType is empty'); return; } - Log.showInfo(TAG, `contentType is : ${contentType}`); - let request = data.request; - let want = data.request.wantAgent; + let want = request.wantAgent; let standardTime = this.getStandardTime(request.deliveryTime); - let bundleName = request.creatorBundleName + let bundleName = request.creatorBundleName; + let actionButtons = request.actionButtons; + Log.showInfo(TAG, `actionButtons = ${JSON.stringify(actionButtons)}`); + //let smallIcon = request.smallIcon; + //Log.showInfo(TAG, `smallIcon = ${smallIcon}`); + let largeIcon = request.largeIcon; + Log.showInfo(TAG, `largeIcon = ${largeIcon}`); + let slotLevel; + try{ + slotLevel=sortingMap?.sortings[request.hashCode]?.slot.level; + }catch(e){ + Log.showInfo(TAG, `slot level get error: ${e.toString()}`); + } + Log.showInfo(TAG, `slotLevel = ${slotLevel}`); this.getAppName(bundleName, (AppName) => { Log.showInfo(TAG, `notificationItem = ${want}`); Log.showInfo(TAG, `notificationItem = ${AppName}`); let appName = AppName.appName; - let icon = AppName.icon; Log.showInfo(TAG, `appName = ${appName}`); - Log.showInfo(TAG, `icon = ${icon}`); + let icon = AppName.icon; + Log.showInfo(TAG, `smallIcon = ${icon}`); let notificationItem = { 'id': request.id, 'hashcode': request.hashCode, @@ -116,39 +150,75 @@ export class NotificationService { 'time': standardTime, 'name': appName, 'want': want, - 'icon': icon, - 'bundleName': bundleName + 'bundleName': bundleName, + 'actionButtons': actionButtons, + 'smallIcon': icon, + 'largeIcon': largeIcon, }; Log.showInfo(TAG, `notificationItem = ${JSON.stringify(notificationItem)}`); switch (contentType) { case NotificationManager.TYPE_BASIC: Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_BASIC_TEXT ====================`); notificationItem['title'] = request.content.normal?.title ?? ''; - notificationItem['content'] = request.content.normal?.text ?? ''; + notificationItem['text'] = request.content.normal?.text ?? ''; notificationItem['additionalText'] = request.content.normal?.additionalText ?? ''; break; case NotificationManager.TYPE_LONG: Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_LONG_TEXT ====================`); - notificationItem['title'] = request.content.longText?.expandedTitle ?? ''; - notificationItem['content'] = request.content.longText?.longText ?? ''; - notificationItem['additionalText'] = request.content.longText?.briefText ?? ''; + notificationItem['title'] = request.content.longText?.title ?? ''; + notificationItem['text'] = request.content.longText?.text ?? ''; + notificationItem['additionalText'] = request.content.longText?.additionalText ?? ''; + notificationItem['briefText'] = request.content.longText?.briefText ?? ''; + notificationItem['expandedTitle'] = request.content.longText?.expandedTitle ?? ''; + notificationItem['longText'] = request.content.longText?.longText ?? ''; + break; + case NotificationManager.TYPE_IMAGE: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_LONG_TEXT ====================`); + notificationItem['title'] = request.content.picture?.title ?? ''; + notificationItem['text'] = request.content.picture?.text ?? ''; + notificationItem['additionalText'] = request.content.picture?.additionalText ?? ''; + notificationItem['briefText'] = request.content.picture?.briefText ?? ''; + notificationItem['expandedTitle'] = request.content.picture?.expandedTitle ?? ''; + notificationItem['bigPicture'] = request.content.picture?.bigPicture ?? ''; break; case NotificationManager.TYPE_MULTI: Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_MULTILINE ====================`); - notificationItem['title'] = request.content.multiLine?.longTitle ?? ''; - notificationItem['content'] = request.content.multiLine?.lines ?? mEmptyArray; - notificationItem['additionalText'] = request.content.multiLine?.briefText ?? ''; + notificationItem['title'] = request.content.multiLine?.title ?? ''; + notificationItem['text'] = request.content.multiLine?.text ?? ''; + notificationItem['additionalText'] = request.content.multiLine?.additionalText ?? ''; + notificationItem['briefText'] = request.content.multiLine?.briefText ?? ''; + notificationItem['longTitle'] = request.content.multiLine?.longTitle ?? ''; + notificationItem['lines'] = request.content.multiLine?.lines ?? mEmptyArray; + Log.showInfo(TAG, `multilines: ${JSON.stringify(request.content.multiLine?.lines)}`) break; default: - Log.showInfo(TAG, 'no contentType match ===================='); + Log.showInfo(TAG, 'no match content type'); break; } Log.showInfo(TAG, `notificationItem = ${JSON.stringify(notificationItem)}`); - this.removeNotificationItem(notificationItem['hashcode'],false); - mNotificationList.unshift(notificationItem); -// mNotificationList.sort(this.compare('timestamp')); - this.updateNotification(); - Log.showInfo(TAG, 'consumeCallback finished ===================='); + Log.showInfo(TAG, `notificationItem get id ========================== ${JSON.stringify(notificationItem.id)}`); + if(slotLevel===SlotLevel.LEVEL_HIGH){ + try{ + this.media.play() + }catch(e){ + Log.showInfo(TAG, `notificationItem id:${notificationItem.id} alert error: ${e.toString()}`); + } + } + switch (processType) { + case Constants.GET_NEW_NOTIFICATION: + this.removeNotificationItem(notificationItem['hashcode'], false); + mNotificationList.unshift(notificationItem); +// mNotificationList.sort(this.compare('timestamp')); + this.updateNotification(); + break; + case Constants.GET_EXIST_NOTIFICATION: + mNotificationList.unshift(notificationItem); + this.updateNotification(); + break; + default: + Log.showInfo(TAG, 'no match process type'); + break; + } }); } @@ -204,7 +274,7 @@ export class NotificationService { OnCancelCallback(err, data) { console.info("================>OnCancelCallback err : =======================> " + JSON.stringify(err)); console.info("================>OnCancelCallback data : =======================> " + JSON.stringify(data)); - this.removeNotificationItem(data.request.hashCode,false); + this.removeNotificationItem(data.request.hashCode, false); } onUpdateCallback(err, data) { @@ -218,9 +288,9 @@ export class NotificationService { * @param {Object} data - Callback data. */ subscribeCallback(err, data) { - Log.showInfo(TAG, 'subscribeCallback finished ===================='); - Log.showInfo(TAG, `subscribeCallback err: ${JSON.stringify(err)}`) - Log.showInfo(TAG, `subscribeCallback data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, 'subscribeCallback finished ===================='); + Log.showInfo(TAG, `subscribeCallback err: ${JSON.stringify(err)}`) + Log.showInfo(TAG, `subscribeCallback data: ${JSON.stringify(data)}`) } /** @@ -266,28 +336,46 @@ export class NotificationService { }); } - removeNotificationItem(hashCode,isDelSysConent) { + removeNotificationItem(hashCode, isDelSysConent) { Log.showInfo(TAG, `removeNotificationItem start, hashCode: ${hashCode}`); for (let i = 0, len = mNotificationList.length; i < len; i++) { if (mNotificationList[i].hashcode == hashCode) { Log.showInfo(TAG, `removeNotificationItem i = ${i}`); mNotificationList.splice(i, 1); -// mNotificationList.pop(i); + // mNotificationList.pop(i); break; } } this.updateNotification() - if(isDelSysConent){ + if (isDelSysConent) { this.removeSysNotificationItem(hashCode); } } - removeSysNotificationItem(hashCode){ + + removeSysNotificationItem(hashCode) { NotificationManager.remove(TAG, hashCode, (err, data) => { Log.showInfo(TAG, `removeNotificationItem, err: ${JSON.stringify(err)}`); Log.showInfo(TAG, `removeNotificationItem, data: ${JSON.stringify(data)}`); }) Log.showInfo(TAG, `removeNotificationItem end, length: ${mNotificationList.length}`); } + + getAllActiveNotifications() { + Log.showInfo(TAG, `getAllActiveNotifications`); + NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { + Log.showInfo(TAG, `getAllActiveNotifications err: ${err}`); + Log.showInfo(TAG, `getAllActiveNotifications err: ${JSON.stringify(err)}`); + Log.showInfo(TAG, `getAllActiveNotifications requestsArr: ${requestsArr}`); + Log.showInfo(TAG, `getAllActiveNotifications requestsArr: ${JSON.stringify(requestsArr)}`); + if (Array.isArray(requestsArr)) { + for(let i = 0,len = requestsArr.length; i< len; i++) { + this.parseRequest(requestsArr[i],null, Constants.GET_EXIST_NOTIFICATION); + } + } else { + mNotificationList = []; + } + }) + } } let notificationService = new NotificationService(); diff --git a/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets b/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets index 46cabae4..5151fad2 100644 --- a/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets +++ b/product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets @@ -66,7 +66,7 @@ struct Index { Row() { if (this.notificationList.length > 3) { ForEach(this.notificationList.slice(0, 3), (item: any) => { - Image(item.icon) + Image(item.smallIcon) .objectFit(ImageFit.ScaleDown) .height(Constants.STATIC_BAR_ICON_HEIGHT*this.StatusCoefficient) .width(Constants.STATIC_BAR_ICON_WIDTH*this.StatusCoefficient) @@ -78,7 +78,7 @@ struct Index { } } else { ForEach(this.notificationList, (item: any) => { - Image(item.icon) + Image(item.smallIcon) .objectFit(ImageFit.ScaleDown) .height(Constants.STATIC_BAR_ICON_HEIGHT*this.StatusCoefficient) .width(Constants.STATIC_BAR_ICON_WIDTH*this.StatusCoefficient) -- Gitee From 4da94137b01668d8d4ad392dbffadbb89c0a282b Mon Sep 17 00:00:00 2001 From: "size.peng" Date: Thu, 28 Oct 2021 17:13:53 +0800 Subject: [PATCH 029/373] [System-ui]Add new notification item type. Signed-off-by: size.peng --- .../abilitymanager/notificationManager.ets | 1 - .../com/ohos/noticeItem/item/basicItem.ets | 225 ++++++++++++++++++ .../ohos/noticeItem/item/notificationItem.ets | 24 -- .../NotificationService.ets | 9 - 4 files changed, 225 insertions(+), 34 deletions(-) create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets diff --git a/common/src/main/ets/default/abilitymanager/notificationManager.ets b/common/src/main/ets/default/abilitymanager/notificationManager.ets index b53f716c..04895620 100644 --- a/common/src/main/ets/default/abilitymanager/notificationManager.ets +++ b/common/src/main/ets/default/abilitymanager/notificationManager.ets @@ -25,7 +25,6 @@ export default class NotificationManager { static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; - static TYPE_IMAGE: number = Notification.ContentType.NOTIFICATION_CONTENT_PICTURE; static subscribeNotification(tag, subscriber, asyncCallback) { Log.showInfo(TAG, `subscribeNotification from: ${tag}`)); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets new file mode 100644 index 00000000..2b2ce01c --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets'; +import titleItem from './titleItem'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import mNotificationService from '../../../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' +import WantAgent from '@ohos.wantAgent'; +import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; + +const TAG = 'NoticeItem-BasicItem'; + +let mWindowManager; + +@Component +export default +struct BasicItem { + @Link showStatusBar: boolean + @Prop notificationId: string + @Prop notificationType: string + private notificationSmallIcon: PixelMap + private notificationLargeIcon: PixelMap + private notificationActionButtons: any + @State hasPicture: boolean = false + @Prop notificationHashCode: string + @Prop notificationText: string + @Prop notificationName: string + @Prop notificationTime: string + @Prop notificationTitle: string + private notificationWant: any + @State isExpand: boolean = false + @State needExpand: boolean = false + @State iconDisplay: boolean = false; + @State itemWidth: string = '100%' + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear id: ${this.notificationId}`) + mWindowManager = new WindowManager(); + if (CheckEmptyUtils.isEmpty(this.notificationLargeIcon)) { + this.hasPicture = false; + } else { + this.hasPicture = true; + } + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear id: ${this.notificationId}`); + } + + build() { + Row() { + Column() { + Column() { + titleItem({ + notificationSmallIcon: this.notificationSmallIcon, + notificationName: this.notificationName, + notificationTime: this.notificationTime, + isExpand: $isExpand, + needExpand: this.needExpand + }) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.notificationTitle) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + Text(this.notificationText) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Clip }) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .margin({ top: $r('app.float.content_margin_top') }) + } + .width(this.hasPicture ? '85%' : '100%') + .margin({ top: $r('app.float.body_margin_top') }) + + if (this.hasPicture) { + Column() { + Image(this.notificationLargeIcon) + .objectFit(ImageFit.Contain) + .width(50) + .height(50) + } + .alignItems(HorizontalAlign.End) + .width('15%') + } + } + } + .onTouch(this.touchNotificationItem.bind(this)) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + ForEach(this.notificationActionButtons, (item: any) => { + Text(item.title) + .fontSize(20) + .height(30) + .fontColor(Color.Blue) + .margin({ right: 20 }) + .onClick(() => { + Log.showInfo(TAG, `clickbuttonEvent: ${JSON.stringify(item.wantAgent)}`) + this.startTargetAbility(item.wantAgent) + }) + } + } + .margin({ top: 10 }) + + } + .backgroundColor($r('app.color.notificationitem_background')) + .opacity($r('app.float.item_opicaty')) + .borderRadius($r('app.float.item_borderradius')) + .margin({ + left: $r('app.float.item_marginleft'), + right: $r('app.float.item_marginright'), + top: $r('app.float.item_margintop') + }) + .padding({ + left: $r('app.float.item_paddingleft'), + right: $r('app.float.item_paddingright'), + bottom: $r('app.float.item_paddingbottom') + }) + // .onTouch(this.touchNotificationItem.bind(this)) + .width(this.itemWidth) + + if (this.iconDisplay) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { + Image($r('app.media.delete')) //delete + .objectFit(ImageFit.Contain) + .width($r('app.float.item_delete_image_width')) + .height($r('app.float.item_delete_image_height')) + .onClick(() => { + this.removeNotificationItem(this.notificationHashCode); + }) + } + .width('30%') + } + } + } + + touchNotificationItem(event: TouchEvent) { + if (event.type == Constants.TOUCH_TYPE_DOWN) { //down + this.startX = event.touches[0].x; + this.startY = event.touches[0].y; + Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`); + } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move + this.moveX = event.touches[0].x - this.startX; + this.moveY = event.touches[0].y - this.startY; + } else if (event.type == Constants.TOUCH_TYPE_UP) { //up + Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); + if (this.moveX == 0 && this.moveY == 0) { + this.clickBasicItem(); + return; + } + if (this.iconDisplay) { + if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { + //hidden + this.iconDisplay = false; + this.itemWidth = '100%'; + Log.showInfo(TAG, 'hidden'); + } + } else { + if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { + this.iconDisplay = true; + this.itemWidth = '70%'; + Log.showInfo(TAG, 'display'); + } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { + this.removeNotificationItem(this.notificationHashCode); + } + } + } + } + + removeNotificationItem(hashCode: string) { + Log.showInfo(TAG, 'removeNotificationItem'); + mNotificationService.removeNotificationItem(hashCode, true); + } + + clickBasicItem() { + Log.showInfo(TAG, 'clickBasicItem'); + this.startTargetAbility(this.notificationWant); + } + + startTargetAbility(want) { + Log.showInfo(TAG, 'startTargetAbility'); + //close window + this.showStatusBar = true; + mWindowManager.setWindowMin((result) => { + Log.showInfo(TAG, `setWindowMin ${result}`); + }); + //open app + Log.showInfo(TAG, `longitemClick wantAgent ${JSON.stringify(this.notificationWant)} id: ${this.notificationId}`); + let TriggerInfo = { + code: 0, + want: '', + permission: '', + extraInfo: {} + }; + WantAgent.trigger(want, TriggerInfo, ((err, data) => { + Log.showInfo(TAG, `longitemClick wantAgent trigger err ${JSON.stringify(err)}`); + Log.showInfo(TAG, `longitemClick wantAgent trigger data ${JSON.stringify(data)}`); + })); + //remove notification + this.removeNotificationItem(this.notificationHashCode); + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets index 6d24c42b..b6940f58 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets @@ -16,7 +16,6 @@ import Constants from '../common/constants.ets'; import basicItem from './basicItem.ets'; import longItem from './longItem.ets'; -import imageItem from './imageItem.ets'; import multiItem from './multiItem.ets'; import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; @@ -29,7 +28,6 @@ struct NotificationItem { private itemObject: any private basic: boolean = false; private long: boolean = false; - private image: boolean = false; private multi: boolean = false; aboutToAppear() { @@ -41,9 +39,6 @@ struct NotificationItem { case Constants.NOTIFICATION_TYPE_LONG: this.long = true; break; - case Constants.NOTIFICATION_TYPE_IMAGE: - this.image = true; - break; case Constants.NOTIFICATION_TYPE_MULTILINE: this.multi = true; break; @@ -93,25 +88,6 @@ struct NotificationItem { showStatusBar: $showStatusBar }); } - if (this.image) { - imageItem({ - notificationId: this.itemObject.id, - notificationType: this.itemObject.type, - notificationSmallIcon: this.itemObject.smallIcon, - notificationLargeIcon: this.itemObject.largeIcon, - notificationActionButtons: this.itemObject.actionButtons, - notificationHashCode: this.itemObject.hashcode, - notificationText: this.itemObject.text, - notificationBriefText: this.itemObject.briefText, - notificationExpandedTitle: this.itemObject.expandedTitle, - notificationBigPicture: this.itemObject.bigPicture, - notificationName: this.itemObject.name, - notificationTime: this.itemObject.time, - notificationTitle: this.itemObject.title, - notificationWant: this.itemObject.want, - showStatusBar: $showStatusBar - }); - } if (this.multi) { multiItem({ notificationId: this.itemObject.id, diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets index 8f304391..93f04cd1 100644 --- a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets +++ b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets @@ -172,15 +172,6 @@ export class NotificationService { notificationItem['expandedTitle'] = request.content.longText?.expandedTitle ?? ''; notificationItem['longText'] = request.content.longText?.longText ?? ''; break; - case NotificationManager.TYPE_IMAGE: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_LONG_TEXT ====================`); - notificationItem['title'] = request.content.picture?.title ?? ''; - notificationItem['text'] = request.content.picture?.text ?? ''; - notificationItem['additionalText'] = request.content.picture?.additionalText ?? ''; - notificationItem['briefText'] = request.content.picture?.briefText ?? ''; - notificationItem['expandedTitle'] = request.content.picture?.expandedTitle ?? ''; - notificationItem['bigPicture'] = request.content.picture?.bigPicture ?? ''; - break; case NotificationManager.TYPE_MULTI: Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_MULTILINE ====================`); notificationItem['title'] = request.content.multiLine?.title ?? ''; -- Gitee From 1807ff9ca4a774df906128593c6a2c40606c088b Mon Sep 17 00:00:00 2001 From: "size.peng" Date: Tue, 2 Nov 2021 16:41:55 +0800 Subject: [PATCH 030/373] [System-UI]Fix code check issue. Signed-off-by: size.peng --- .../com/ohos/noticeItem/item/basicItem.ets | 203 +-------------- .../ets/com/ohos/noticeItem/item/longItem.ets | 187 +------------- .../com/ohos/noticeItem/item/multiItem.ets | 235 +++-------------- .../ohos/noticeItem/item/notificationItem.ets | 237 +++++++++++++----- .../NotificationService.ets | 140 +++++------ .../notificationservice/common/constants.ets | 40 +++ .../main/ets/default/pages/notification.ets | 2 +- 7 files changed, 330 insertions(+), 714 deletions(-) create mode 100644 features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets index 2b2ce01c..d3209a99 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets @@ -14,78 +14,23 @@ */ import Constants from '../common/constants.ets'; -import titleItem from './titleItem'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import mNotificationService from '../../../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' -import WantAgent from '@ohos.wantAgent'; -import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; - -const TAG = 'NoticeItem-BasicItem'; - -let mWindowManager; +import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; @Component -export default -struct BasicItem { - @Link showStatusBar: boolean - @Prop notificationId: string - @Prop notificationType: string - private notificationSmallIcon: PixelMap - private notificationLargeIcon: PixelMap - private notificationActionButtons: any +export default struct BasicItem { @State hasPicture: boolean = false - @Prop notificationHashCode: string - @Prop notificationText: string - @Prop notificationName: string - @Prop notificationTime: string - @Prop notificationTitle: string - private notificationWant: any - @State isExpand: boolean = false - @State needExpand: boolean = false - @State iconDisplay: boolean = false; - @State itemWidth: string = '100%' - startX: number = 0 - startY: number = 0 - @State moveX: number = 0 - @State moveY: number = 0 - - aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear id: ${this.notificationId}`) - mWindowManager = new WindowManager(); - if (CheckEmptyUtils.isEmpty(this.notificationLargeIcon)) { - this.hasPicture = false; - } else { - this.hasPicture = true; - } - } - - aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear id: ${this.notificationId}`); - } + @State itemData: NotificationItemData= undefined build() { - Row() { - Column() { - Column() { - titleItem({ - notificationSmallIcon: this.notificationSmallIcon, - notificationName: this.notificationName, - notificationTime: this.notificationTime, - isExpand: $isExpand, - needExpand: this.needExpand - }) - - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Text(this.notificationTitle) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - Text(this.notificationText) + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.itemData.title) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + Text(this.itemData.text) .maxLines(Constants.DEFAULT_MAX_LINES) .textOverflow({ overflow: TextOverflow.Clip }) .fontSize($r('app.float.notification_content_fontsize')) @@ -96,130 +41,6 @@ struct BasicItem { .width(this.hasPicture ? '85%' : '100%') .margin({ top: $r('app.float.body_margin_top') }) - if (this.hasPicture) { - Column() { - Image(this.notificationLargeIcon) - .objectFit(ImageFit.Contain) - .width(50) - .height(50) - } - .alignItems(HorizontalAlign.End) - .width('15%') - } - } - } - .onTouch(this.touchNotificationItem.bind(this)) - - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - ForEach(this.notificationActionButtons, (item: any) => { - Text(item.title) - .fontSize(20) - .height(30) - .fontColor(Color.Blue) - .margin({ right: 20 }) - .onClick(() => { - Log.showInfo(TAG, `clickbuttonEvent: ${JSON.stringify(item.wantAgent)}`) - this.startTargetAbility(item.wantAgent) - }) - } - } - .margin({ top: 10 }) - - } - .backgroundColor($r('app.color.notificationitem_background')) - .opacity($r('app.float.item_opicaty')) - .borderRadius($r('app.float.item_borderradius')) - .margin({ - left: $r('app.float.item_marginleft'), - right: $r('app.float.item_marginright'), - top: $r('app.float.item_margintop') - }) - .padding({ - left: $r('app.float.item_paddingleft'), - right: $r('app.float.item_paddingright'), - bottom: $r('app.float.item_paddingbottom') - }) - // .onTouch(this.touchNotificationItem.bind(this)) - .width(this.itemWidth) - - if (this.iconDisplay) { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { - Image($r('app.media.delete')) //delete - .objectFit(ImageFit.Contain) - .width($r('app.float.item_delete_image_width')) - .height($r('app.float.item_delete_image_height')) - .onClick(() => { - this.removeNotificationItem(this.notificationHashCode); - }) - } - .width('30%') - } - } - } - - touchNotificationItem(event: TouchEvent) { - if (event.type == Constants.TOUCH_TYPE_DOWN) { //down - this.startX = event.touches[0].x; - this.startY = event.touches[0].y; - Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`); - } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move - this.moveX = event.touches[0].x - this.startX; - this.moveY = event.touches[0].y - this.startY; - } else if (event.type == Constants.TOUCH_TYPE_UP) { //up - Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); - if (this.moveX == 0 && this.moveY == 0) { - this.clickBasicItem(); - return; - } - if (this.iconDisplay) { - if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { - //hidden - this.iconDisplay = false; - this.itemWidth = '100%'; - Log.showInfo(TAG, 'hidden'); - } - } else { - if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { - this.iconDisplay = true; - this.itemWidth = '70%'; - Log.showInfo(TAG, 'display'); - } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { - this.removeNotificationItem(this.notificationHashCode); - } - } - } - } - - removeNotificationItem(hashCode: string) { - Log.showInfo(TAG, 'removeNotificationItem'); - mNotificationService.removeNotificationItem(hashCode, true); - } - - clickBasicItem() { - Log.showInfo(TAG, 'clickBasicItem'); - this.startTargetAbility(this.notificationWant); - } - startTargetAbility(want) { - Log.showInfo(TAG, 'startTargetAbility'); - //close window - this.showStatusBar = true; - mWindowManager.setWindowMin((result) => { - Log.showInfo(TAG, `setWindowMin ${result}`); - }); - //open app - Log.showInfo(TAG, `longitemClick wantAgent ${JSON.stringify(this.notificationWant)} id: ${this.notificationId}`); - let TriggerInfo = { - code: 0, - want: '', - permission: '', - extraInfo: {} - }; - WantAgent.trigger(want, TriggerInfo, ((err, data) => { - Log.showInfo(TAG, `longitemClick wantAgent trigger err ${JSON.stringify(err)}`); - Log.showInfo(TAG, `longitemClick wantAgent trigger data ${JSON.stringify(data)}`); - })); - //remove notification - this.removeNotificationItem(this.notificationHashCode); } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets index b0ad8661..d5c12f3a 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets @@ -14,80 +14,26 @@ */ import Constants from '../common/constants.ets'; -import titleItem from './titleItem'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import mNotificationService from '../../../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' -import WantAgent from '@ohos.wantAgent'; -import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; - -const TAG = 'NoticeItem-LongItem'; - -let mWindowManager; +import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; @Component export default struct LongItem { - @Link showStatusBar: boolean - @Prop notificationId: string - @Prop notificationType: string - private notificationSmallIcon: PixelMap - private notificationLargeIcon: PixelMap - private notificationActionButtons: any - @State hasPicture: boolean = false - @Prop notificationHashCode: string - @Prop notificationText: string - @Prop notificationBriefText: string - @Prop notificationExpandedTitle: string - @Prop notificationLongText: string - @Prop notificationName: string - @Prop notificationTime: string - @Prop notificationTitle: string - private notificationWant: any - @State isExpand: boolean = false - @State needExpand: boolean = true - @State iconDisplay: boolean = false; - @State itemWidth: string = '100%' - startX: number = 0 - startY: number = 0 - @State moveX: number = 0 - @State moveY: number = 0 + @State itemData: NotificationItemData= undefined + @Prop hasPicture: boolean + @Prop isExpand: boolean - aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear id: ${this.notificationId}`) - mWindowManager = new WindowManager(); - if (CheckEmptyUtils.isEmpty(this.notificationLargeIcon)) { - this.hasPicture = false; - } else { - this.hasPicture = true; - } - } - - aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear id: ${this.notificationId}`); - } build() { - Row() { - Column() { - titleItem({ - notificationSmallIcon: this.notificationSmallIcon, - notificationName: this.notificationName, - notificationTime: this.notificationTime, - isExpand: $isExpand, - needExpand: this.needExpand - }) - - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Text(this.isExpand ? this.notificationExpandedTitle : this.notificationTitle) + Text(this.isExpand ? this.itemData.expandedTitle : this.itemData.title) .maxLines(Constants.DEFAULT_MAX_LINES) .textOverflow({ overflow: TextOverflow.Ellipsis }) .fontSize($r('app.float.notification_title_fontsize')) .fontColor($r('app.color.title_text_color')) .fontWeight(FontWeight.Bold) .lineHeight(Constants.CONTENT_LINE_HEIGHT) //not support Resource type - Text(this.isExpand ? this.notificationLongText : this.notificationText) + Text(this.isExpand ? this.itemData.longText : this.itemData.text) .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.DEFAULT_MAX_LINES) .textOverflow({ overflow: TextOverflow.Ellipsis }) .constraintSize({maxHeight: $r('app.float.notification_expanded_text_maxheight')}) @@ -98,128 +44,7 @@ struct LongItem { } .width(this.hasPicture ? '85%' : '100%') .margin({ top: $r('app.float.body_margin_top') }) - - if (this.hasPicture) { - Column() { - Image(this.notificationLargeIcon) - .objectFit(ImageFit.Contain) - .width(50) - .height(50) - } - .alignItems(HorizontalAlign.End) - .width('15%') - } - } - .onClick(this.clickLongItem.bind(this)) - - if (this.isExpand) { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - ForEach(this.notificationActionButtons, (item: any) => { - Text(item.title) - .fontSize(20) - .height(30) - .fontColor(Color.Blue) - .margin({ right: 20 }) - .onClick(() => { - Log.showInfo(TAG, `clickbuttonEvent: ${JSON.stringify(item.wantAgent)}`) - this.startTargetAbility(item.wantAgent) - }) - } - } - .margin({ top: 10 }) - } - - } - .backgroundColor($r('app.color.notificationitem_background')) - .opacity($r('app.float.item_opicaty')) - .borderRadius($r('app.float.item_borderradius')) - .margin({ - left: $r('app.float.item_marginleft'), - right: $r('app.float.item_marginright'), - top: $r('app.float.item_margintop') - }) - .padding({ - left: $r('app.float.item_paddingleft'), - right: $r('app.float.item_paddingright'), - bottom: $r('app.float.item_paddingbottom') - }) - .onTouch(this.touchNotificationItem.bind(this)) - .width(this.itemWidth) - - if (this.iconDisplay) { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { - Image($r('app.media.delete')) //delete - .objectFit(ImageFit.Contain) - .width($r('app.float.item_delete_image_width')) - .height($r('app.float.item_delete_image_height')) - .onClick(() => { - this.removeNotificationItem(this.notificationHashCode); - }) - } - .width('30%') - } - } } - touchNotificationItem(event: TouchEvent) { - if (event.type == Constants.TOUCH_TYPE_DOWN) { //down - this.startX = event.touches[0].x; - this.startY = event.touches[0].y; - Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`); - } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move - this.moveX = event.touches[0].x - this.startX; - this.moveY = event.touches[0].y - this.startY; - } else if (event.type == Constants.TOUCH_TYPE_UP) { //up - Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); - if (this.iconDisplay) { - if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { - //hidden - this.iconDisplay = false; - this.itemWidth = '100%'; - Log.showInfo(TAG, 'hidden'); - } - } else { - if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { - this.iconDisplay = true; - this.itemWidth = '70%'; - Log.showInfo(TAG, 'display'); - } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { - this.removeNotificationItem(this.notificationHashCode); - } - } - } - } - removeNotificationItem(hashCode: string) { - Log.showInfo(TAG, 'removeNotificationItem'); - mNotificationService.removeNotificationItem(hashCode, true); - } - - clickLongItem() { - Log.showInfo(TAG, 'clickLongItem'); - this.startTargetAbility(this.notificationWant); - } - - startTargetAbility(want) { - Log.showInfo(TAG, 'startTargetAbility'); - //close window - this.showStatusBar = true; - mWindowManager.setWindowMin((result) => { - Log.showInfo(TAG, `setWindowMin ${result}`); - }); - //open app - Log.showInfo(TAG, `longitemClick wantAgent ${JSON.stringify(this.notificationWant)} id: ${this.notificationId}`); - let TriggerInfo = { - code: 0, - want: '', - permission: '', - extraInfo: {} - }; - WantAgent.trigger(want, TriggerInfo, ((err, data) => { - Log.showInfo(TAG, `longitemClick wantAgent trigger err ${JSON.stringify(err)}`); - Log.showInfo(TAG, `longitemClick wantAgent trigger data ${JSON.stringify(data)}`); - })); - //remove notification - this.removeNotificationItem(this.notificationHashCode); - } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets index 2300e468..f92996fc 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets @@ -14,220 +14,45 @@ */ import Constants from '../common/constants.ets'; -import titleItem from './titleItem'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import mNotificationService from '../../../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' -import WantAgent from '@ohos.wantAgent'; -import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; - -const TAG = 'NoticeItem-multiItem'; - -let mWindowManager; +import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; @Component -export default -struct MultiItem { - @Link showStatusBar: boolean - @Prop notificationId: string - private notificationSmallIcon: PixelMap - private notificationLargeIcon: PixelMap - private notificationActionButtons: any - @State hasPicture: boolean = false - @Prop notificationHashCode: string - @Prop notificationText: string - @Prop notificationBriefText: string - @Prop notificationLongTitle: string - private notificationLines: string[] - @Prop notificationName: string - @Prop notificationTime: string - @Prop notificationTitle: string - private notificationWant: any - @State isExpand: boolean = false - @State needExpand: boolean = true - @State iconDisplay: boolean = false; - @State itemWidth: string = '100%' - startX: number = 0 - startY: number = 0 - @State moveX: number = 0 - @State moveY: number = 0 +export default struct MultiItem { - aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear id: ${this.notificationId}`); - mWindowManager = new WindowManager(); - if (CheckEmptyUtils.isEmpty(this.notificationLargeIcon)) { - this.hasPicture = false; - } else { - this.hasPicture = true; - } - } + @State itemData: NotificationItemData= undefined + @Prop hasPicture: boolean + @Prop isExpand: boolean - aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear id: ${this.notificationId}`); - } build() { - Row() { - Column() { - titleItem({ - notificationSmallIcon: this.notificationSmallIcon, - notificationName: this.notificationName, - notificationTime: this.notificationTime, - isExpand: $isExpand, - needExpand: this.needExpand - }) - - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Text(this.isExpand ? this.notificationLongTitle : this.notificationTitle) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - if (this.isExpand) { - ForEach(this.notificationLines, - (item: string) => { - Text(`${item}`) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .margin({ top: $r('app.float.content_margin_top') }) - }, (item: string) => item.toString() - ) - } else { - Text(this.notificationText) - .fontSize($r('app.float.notification_content_fontsize')) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontColor($r('app.color.content_text_color')) - .margin({ top: $r('app.float.content_margin_top') }) - } - } - .width(this.hasPicture ? '85%' : '100%') - .margin({ top: $r('app.float.body_margin_top') }) - - if (this.hasPicture) { - Column() { - Image(this.notificationLargeIcon) - .objectFit(ImageFit.Contain) - .width(50) - .height(50) - } - .alignItems(HorizontalAlign.End) - .width('15%') - } - } - .onClick(this.clickMultiItem.bind(this)) - - if (this.isExpand) { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - ForEach(this.notificationActionButtons, (item: any) => { - Text(item.title) - .fontSize(20) - .height(30) - .fontColor(Color.Blue) - .margin({ right: 20 }) - .onClick(() => { - Log.showInfo(TAG, `clickbuttonEvent: ${JSON.stringify(item.wantAgent)}`) - this.startTargetAbility(item.wantAgent) - }) - } - } - .margin({ top: 10 }) - } - } - .backgroundColor($r('app.color.notificationitem_background')) - .opacity($r('app.float.item_opicaty')) - .borderRadius($r('app.float.item_borderradius')) - .margin({ - left: $r('app.float.item_marginleft'), - right: $r('app.float.item_marginright'), - top: $r('app.float.item_margintop') - }) - .padding({ - left: $r('app.float.item_paddingleft'), - right: $r('app.float.item_paddingright'), - bottom: $r('app.float.item_paddingbottom') - }) - .onTouch(this.touchNotificationItem.bind(this)) - .width(this.itemWidth) - - - if (this.iconDisplay) { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { - Image($r('app.media.delete')) //delete - .objectFit(ImageFit.Contain) - .width($r('app.float.item_delete_image_width')) - .height($r('app.float.item_delete_image_height')) - .onClick(() => { - this.removeNotificationItem(this.notificationHashCode); - }) - } - .width('30%') - } - } - } - - touchNotificationItem(event: TouchEvent) { - if (event.type == Constants.TOUCH_TYPE_DOWN) { //down - this.startX = event.touches[0].x; - this.startY = event.touches[0].y; - Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`); - } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move - this.moveX = event.touches[0].x - this.startX; - this.moveY = event.touches[0].y - this.startY; - } else if (event.type == Constants.TOUCH_TYPE_UP) { //up - Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); - if (this.iconDisplay) { - if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { - //hidden - this.iconDisplay = false; - this.itemWidth = '100%'; - Log.showInfo(TAG, 'hidden'); - } + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.isExpand ? this.itemData.longTitle : this.itemData.title) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + if (this.isExpand) { + ForEach(this.itemData.lines, + (item: string) => { + Text(`${item}`) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .margin({ top: $r('app.float.content_margin_top') }) + }, (item: string) => item.toString() + ) } else { - if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { - this.iconDisplay = true; - this.itemWidth = '70%'; - Log.showInfo(TAG, 'display'); - } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { - this.removeNotificationItem(this.notificationHashCode); - } + Text(this.itemData.text) + .fontSize($r('app.float.notification_content_fontsize')) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r('app.color.content_text_color')) + .margin({ top: $r('app.float.content_margin_top') }) } } - } - - removeNotificationItem(hashCode: string) { - Log.showInfo(TAG, 'removeNotificationItem'); - mNotificationService.removeNotificationItem(hashCode, true); - } - - clickMultiItem() { - Log.showInfo(TAG, 'clickMultiItem'); - this.startTargetAbility(this.notificationWant); - } + .width(this.hasPicture ? '85%' : '100%') + .margin({ top: $r('app.float.body_margin_top') }) - startTargetAbility(want) { - Log.showInfo(TAG, 'startTargetAbility'); - //close window - this.showStatusBar = true; - mWindowManager.setWindowMin((result) => { - Log.showInfo(TAG, `setWindowMin ${result}`); - }); - //open app - Log.showInfo(TAG, `longitemClick wantAgent ${JSON.stringify(this.notificationWant)} id: ${this.notificationId}`); - let TriggerInfo = { - code: 0, - want: '', - permission: '', - extraInfo: {} - }; - WantAgent.trigger(want, TriggerInfo, ((err, data) => { - Log.showInfo(TAG, `longitemClick wantAgent trigger err ${JSON.stringify(err)}`); - Log.showInfo(TAG, `longitemClick wantAgent trigger data ${JSON.stringify(data)}`); - })); - //remove notification - this.removeNotificationItem(this.notificationHashCode); } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets index b6940f58..ef2b72f5 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets @@ -17,24 +17,46 @@ import Constants from '../common/constants.ets'; import basicItem from './basicItem.ets'; import longItem from './longItem.ets'; import multiItem from './multiItem.ets'; +import titleItem from './titleItem'; import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import mNotificationService from '../../../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' +import WantAgent from '@ohos.wantAgent'; +import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; +import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; const TAG = 'NoticeItem-NotificationItem'; +let mWindowManager; @Component -export default -struct NotificationItem { +export default struct NotificationItem { @Link showStatusBar: boolean - private itemObject: any + private itemData: NotificationItemData private basic: boolean = false; private long: boolean = false; private multi: boolean = false; + @State hasPicture: boolean = false + @State isExpand: boolean = false + @State needExpand: boolean = true + @State iconDisplay: boolean = false; + @State itemWidth: string = '100%' + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 aboutToAppear() { Log.showInfo(TAG, `aboutToDisAppear Start`) - switch (this.itemObject.type) { + mWindowManager = new WindowManager(); + if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { + this.hasPicture = false; + } else { + this.hasPicture = true; + } + switch (this.itemData.contentType) { case Constants.NOTIFICATION_TYPE_BASIC: this.basic = true; + this.needExpand=false; break; case Constants.NOTIFICATION_TYPE_LONG: this.long = true; @@ -47,67 +69,166 @@ struct NotificationItem { } } - aboutToDisappear(){ + aboutToDisappear() { Log.showInfo(TAG, `aboutToDisAppear`); } build() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - if (this.basic) { - basicItem({ - notificationId: this.itemObject.id, - notificationType: this.itemObject.type, - notificationSmallIcon: this.itemObject.smallIcon, - notificationLargeIcon: this.itemObject.largeIcon, - notificationActionButtons: this.itemObject.actionButtons, - notificationHashCode: this.itemObject.hashcode, - notificationText: this.itemObject.text, - notificationName: this.itemObject.name, - notificationTime: this.itemObject.time, - notificationTitle: this.itemObject.title, - notificationWant: this.itemObject.want, - showStatusBar: $showStatusBar - }); - } - if (this.long) { - longItem({ - notificationId: this.itemObject.id, - notificationType: this.itemObject.type, - notificationSmallIcon: this.itemObject.smallIcon, - notificationLargeIcon: this.itemObject.largeIcon, - notificationActionButtons: this.itemObject.actionButtons, - notificationHashCode: this.itemObject.hashcode, - notificationText: this.itemObject.text, - notificationBriefText: this.itemObject.briefText, - notificationExpandedTitle: this.itemObject.expandedTitle, - notificationLongText: this.itemObject.longText, - notificationName: this.itemObject.name, - notificationTime: this.itemObject.time, - notificationTitle: this.itemObject.title, - notificationWant: this.itemObject.want, - showStatusBar: $showStatusBar - }); + + Row() { + Column() { + titleItem({ + notificationSmallIcon: this.itemData.smallIcon, + notificationName: this.itemData.name, + notificationTime: this.itemData.time, + isExpand: $isExpand, + needExpand: this.needExpand + }) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + if (this.basic) { + basicItem({ + itemData: this.itemData, + hasPicture:this.hasPicture + }); + } + if (this.long) { + longItem({ + itemData: this.itemData, + hasPicture:this.hasPicture, + isExpand:this.isExpand + }); + } + if (this.multi) { + multiItem({ + itemData: this.itemData, + hasPicture:this.hasPicture, + isExpand:this.isExpand + }); + } + + if (this.hasPicture) { + Column() { + Image(this.itemData.largeIcon) + .objectFit(ImageFit.Contain) + .width(50) + .height(50) + } + .alignItems(HorizontalAlign.End) + .width('15%') + } + }.onClick(this.clickItem.bind(this)) + + if(this.basic||this.isExpand){ + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + ForEach(this.itemData.actionButtons, (item: any) => { + Text(item.title) + .fontSize(20) + .height(30) + .fontColor(Color.Blue) + .margin({ right: 20 }) + .onClick(() => { + Log.showInfo(TAG, `clickbuttonEvent: ${JSON.stringify(item.wantAgent)}`) + this.startTargetAbility(item.wantAgent) + }) + }) + } + .margin({ top: 10 }) + } + + } + .backgroundColor($r('app.color.notificationitem_background')) + .opacity($r('app.float.item_opicaty')) + .borderRadius($r('app.float.item_borderradius')) + .margin({ + left: $r('app.float.item_marginleft'), + right: $r('app.float.item_marginright'), + top: $r('app.float.item_margintop') + }) + .padding({ + left: $r('app.float.item_paddingleft'), + right: $r('app.float.item_paddingright'), + bottom: $r('app.float.item_paddingbottom') + }) + .onTouch(this.touchNotificationItem.bind(this)) + .width(this.itemWidth) + + if (this.iconDisplay) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { + Image($r('app.media.delete')) //delete + .objectFit(ImageFit.Contain) + .width($r('app.float.item_delete_image_width')) + .height($r('app.float.item_delete_image_height')) + .onClick(() => { + this.removeNotificationItem(this.itemData.hashcode); + }) + } + .width('30%') + } } - if (this.multi) { - multiItem({ - notificationId: this.itemObject.id, - - notificationSmallIcon: this.itemObject.smallIcon, - notificationLargeIcon: this.itemObject.largeIcon, - notificationActionButtons: this.itemObject.actionButtons, - - notificationHashCode: this.itemObject.hashcode, - notificationText: this.itemObject.text, - notificationBriefText: this.itemObject.briefText, - notificationLongTitle: this.itemObject.longTitle, - notificationLines: this.itemObject.lines, - notificationName: this.itemObject.name, - notificationTime: this.itemObject.time, - notificationTitle: this.itemObject.title, - notificationWant: this.itemObject.want, - showStatusBar: $showStatusBar - }); + } + } + + touchNotificationItem(event: TouchEvent) { + if (event.type == Constants.TOUCH_TYPE_DOWN) { //down + this.startX = event.touches[0].x; + this.startY = event.touches[0].y; + Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`); + } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move + this.moveX = event.touches[0].x - this.startX; + this.moveY = event.touches[0].y - this.startY; + } else if (event.type == Constants.TOUCH_TYPE_UP) { //up + Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); + if (this.iconDisplay) { + if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { + //hidden + this.iconDisplay = false; + this.itemWidth = '100%'; + Log.showInfo(TAG, 'hidden'); + } + } else { + if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { + this.iconDisplay = true; + this.itemWidth = '70%'; + Log.showInfo(TAG, 'display'); + } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { + this.removeNotificationItem(this.itemData.hashcode); + } } } } + + removeNotificationItem(hashCode: string) { + Log.showInfo(TAG, 'removeNotificationItem'); + mNotificationService.removeNotificationItem(hashCode, true); + } + + clickItem() { + Log.showInfo(TAG, 'click Item'); + this.startTargetAbility(this.itemData.want); + } + + startTargetAbility(want) { + Log.showInfo(TAG, 'startTargetAbility'); + //close window + this.showStatusBar = true; + mWindowManager.setWindowMin((result) => { + Log.showInfo(TAG, `setWindowMin ${result}`); + }); + //open app + Log.showInfo(TAG, `itemClick wantAgent ${JSON.stringify(this.itemData.want)} id: ${this.itemData.id}`); + let TriggerInfo = { + code: 0, + want: '', + permission: '', + extraInfo: {} + }; + WantAgent.trigger(want, TriggerInfo, ((err, data) => { + Log.showInfo(TAG, `itemClick wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); + })); + //remove notification + this.removeNotificationItem(this.itemData.hashcode); + } + } diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets index 93f04cd1..191eacff 100644 --- a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets +++ b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets @@ -17,7 +17,7 @@ import NotificationManager from '../../../../../../../../common/src/main/ets/def import BundleManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager.ets'; import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import Constants from './common/constants.ets'; +import Constants,{NotificationItemData} from './common/constants.ets'; import {SlotLevel} from '@ohos.notification' import Media from '@ohos.multimedia.media' @@ -95,7 +95,6 @@ export class NotificationService { */ consumeCallback(err, data) { Log.showInfo(TAG, 'consumeCallback started'); - Log.showInfo(TAG, JSON.stringify(data.request?.wantAgent)); Log.showInfo(TAG, 'sortingMap' + JSON.stringify(data.sortingMap||{})) Log.showInfo(TAG, JSON.stringify(data)); let request = data?.request; @@ -108,26 +107,67 @@ export class NotificationService { Log.showInfo(TAG, 'consumeCallback sortingMap is empty'); return; } - this.parseRequest(request,sortingMap,Constants.GET_NEW_NOTIFICATION); + this.handleRequest(request,sortingMap,Constants.GET_NEW_NOTIFICATION); } - parseRequest(request,sortingMap, processType) { + parseRequest(request,appName,icon){ + Log.showInfo(TAG, `want = ${JSON.stringify(request.wantAgent)}`); + Log.showInfo(TAG, `actionButtons = ${JSON.stringify(request.actionButtons)}`); + Log.showInfo(TAG, `largeIcon = ${request.largeIcon}`); + let notificationItem:NotificationItemData = { + id: request.id, + hashcode: request.hashCode, + contentType: request?.content?.contentType + '', + timestamp: request.deliveryTime, + time: this.getStandardTime(request.deliveryTime), + name: appName, + want: request.wantAgent, + bundleName: request.creatorBundleName, + actionButtons: request.actionButtons, + smallIcon: icon, + largeIcon: request.largeIcon, + }; + switch (request?.content?.contentType) { + case NotificationManager.TYPE_BASIC: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_BASIC_TEXT ====================`); + notificationItem.title = request.content.normal?.title ?? ''; + notificationItem.text = request.content.normal?.text ?? ''; + notificationItem.additionalText = request.content.normal?.additionalText ?? ''; + break; + case NotificationManager.TYPE_LONG: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_LONG_TEXT ====================`); + notificationItem.title = request.content.longText?.title ?? ''; + notificationItem.text = request.content.longText?.text ?? ''; + notificationItem.additionalText = request.content.longText?.additionalText ?? ''; + notificationItem.briefText = request.content.longText?.briefText ?? ''; + notificationItem.expandedTitle = request.content.longText?.expandedTitle ?? ''; + notificationItem.longText = request.content.longText?.longText ?? ''; + break; + case NotificationManager.TYPE_MULTI: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_MULTILINE ====================`); + notificationItem.title = request.content.multiLine?.title ?? ''; + notificationItem.text = request.content.multiLine?.text ?? ''; + notificationItem.additionalText = request.content.multiLine?.additionalText ?? ''; + notificationItem.briefText = request.content.multiLine?.briefText ?? ''; + notificationItem.longTitle = request.content.multiLine?.longTitle ?? ''; + notificationItem.lines = request.content.multiLine?.lines ?? mEmptyArray; + Log.showInfo(TAG, `multilines: ${JSON.stringify(request.content.multiLine?.lines)}`) + break; + default: + Log.showInfo(TAG, 'no match content type'); + break; + } + return notificationItem + } + + handleRequest(request,sortingMap, processType) { Log.showInfo(TAG, `request : ${JSON.stringify(request)}`) Log.showInfo(TAG, `processType : ${processType}`) let contentType = request?.content?.contentType; if (contentType == null || contentType == undefined) { - Log.showInfo(TAG, 'parseRequest contentType is empty'); + Log.showInfo(TAG, 'Request contentType is empty'); return; } - let want = request.wantAgent; - let standardTime = this.getStandardTime(request.deliveryTime); - let bundleName = request.creatorBundleName; - let actionButtons = request.actionButtons; - Log.showInfo(TAG, `actionButtons = ${JSON.stringify(actionButtons)}`); - //let smallIcon = request.smallIcon; - //Log.showInfo(TAG, `smallIcon = ${smallIcon}`); - let largeIcon = request.largeIcon; - Log.showInfo(TAG, `largeIcon = ${largeIcon}`); let slotLevel; try{ slotLevel=sortingMap?.sortings[request.hashCode]?.slot.level; @@ -135,59 +175,10 @@ export class NotificationService { Log.showInfo(TAG, `slot level get error: ${e.toString()}`); } Log.showInfo(TAG, `slotLevel = ${slotLevel}`); - this.getAppName(bundleName, (AppName) => { - Log.showInfo(TAG, `notificationItem = ${want}`); - Log.showInfo(TAG, `notificationItem = ${AppName}`); - let appName = AppName.appName; - Log.showInfo(TAG, `appName = ${appName}`); - let icon = AppName.icon; - Log.showInfo(TAG, `smallIcon = ${icon}`); - let notificationItem = { - 'id': request.id, - 'hashcode': request.hashCode, - 'type': contentType + '', - 'timestamp': request.deliveryTime, - 'time': standardTime, - 'name': appName, - 'want': want, - 'bundleName': bundleName, - 'actionButtons': actionButtons, - 'smallIcon': icon, - 'largeIcon': largeIcon, - }; - Log.showInfo(TAG, `notificationItem = ${JSON.stringify(notificationItem)}`); - switch (contentType) { - case NotificationManager.TYPE_BASIC: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_BASIC_TEXT ====================`); - notificationItem['title'] = request.content.normal?.title ?? ''; - notificationItem['text'] = request.content.normal?.text ?? ''; - notificationItem['additionalText'] = request.content.normal?.additionalText ?? ''; - break; - case NotificationManager.TYPE_LONG: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_LONG_TEXT ====================`); - notificationItem['title'] = request.content.longText?.title ?? ''; - notificationItem['text'] = request.content.longText?.text ?? ''; - notificationItem['additionalText'] = request.content.longText?.additionalText ?? ''; - notificationItem['briefText'] = request.content.longText?.briefText ?? ''; - notificationItem['expandedTitle'] = request.content.longText?.expandedTitle ?? ''; - notificationItem['longText'] = request.content.longText?.longText ?? ''; - break; - case NotificationManager.TYPE_MULTI: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_MULTILINE ====================`); - notificationItem['title'] = request.content.multiLine?.title ?? ''; - notificationItem['text'] = request.content.multiLine?.text ?? ''; - notificationItem['additionalText'] = request.content.multiLine?.additionalText ?? ''; - notificationItem['briefText'] = request.content.multiLine?.briefText ?? ''; - notificationItem['longTitle'] = request.content.multiLine?.longTitle ?? ''; - notificationItem['lines'] = request.content.multiLine?.lines ?? mEmptyArray; - Log.showInfo(TAG, `multilines: ${JSON.stringify(request.content.multiLine?.lines)}`) - break; - default: - Log.showInfo(TAG, 'no match content type'); - break; - } + this.getAppName(request.creatorBundleName, (AppName) => { + Log.showInfo(TAG, `notificationItem AppName = ${JSON.stringify(AppName)}`); + let notificationItem:NotificationItemData = this.parseRequest(request,AppName.appName,AppName.icon) Log.showInfo(TAG, `notificationItem = ${JSON.stringify(notificationItem)}`); - Log.showInfo(TAG, `notificationItem get id ========================== ${JSON.stringify(notificationItem.id)}`); if(slotLevel===SlotLevel.LEVEL_HIGH){ try{ this.media.play() @@ -263,8 +254,7 @@ export class NotificationService { * @param {Object} data - return data Message. */ OnCancelCallback(err, data) { - console.info("================>OnCancelCallback err : =======================> " + JSON.stringify(err)); - console.info("================>OnCancelCallback data : =======================> " + JSON.stringify(data)); + console.info("===>OnCancelCallback data : ==> " + ` err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); this.removeNotificationItem(data.request.hashCode, false); } @@ -279,9 +269,7 @@ export class NotificationService { * @param {Object} data - Callback data. */ subscribeCallback(err, data) { - Log.showInfo(TAG, 'subscribeCallback finished ===================='); - Log.showInfo(TAG, `subscribeCallback err: ${JSON.stringify(err)}`) - Log.showInfo(TAG, `subscribeCallback data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) } /** @@ -322,8 +310,7 @@ export class NotificationService { mNotificationList = [] this.updateNotification() NotificationManager.removeAll(TAG, (err, data) => { - Log.showInfo(TAG, `removeAll , err: ${JSON.stringify(err)}`); - Log.showInfo(TAG, `removeAll , data: ${JSON.stringify(data)}`); + Log.showInfo(TAG, `removeAll , err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); }); } @@ -345,8 +332,7 @@ export class NotificationService { removeSysNotificationItem(hashCode) { NotificationManager.remove(TAG, hashCode, (err, data) => { - Log.showInfo(TAG, `removeNotificationItem, err: ${JSON.stringify(err)}`); - Log.showInfo(TAG, `removeNotificationItem, data: ${JSON.stringify(data)}`); + Log.showInfo(TAG, `removeNotificationItem, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); }) Log.showInfo(TAG, `removeNotificationItem end, length: ${mNotificationList.length}`); } @@ -354,13 +340,11 @@ export class NotificationService { getAllActiveNotifications() { Log.showInfo(TAG, `getAllActiveNotifications`); NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { - Log.showInfo(TAG, `getAllActiveNotifications err: ${err}`); Log.showInfo(TAG, `getAllActiveNotifications err: ${JSON.stringify(err)}`); - Log.showInfo(TAG, `getAllActiveNotifications requestsArr: ${requestsArr}`); Log.showInfo(TAG, `getAllActiveNotifications requestsArr: ${JSON.stringify(requestsArr)}`); if (Array.isArray(requestsArr)) { for(let i = 0,len = requestsArr.length; i< len; i++) { - this.parseRequest(requestsArr[i],null, Constants.GET_EXIST_NOTIFICATION); + this.handleRequest(requestsArr[i],null, Constants.GET_EXIST_NOTIFICATION); } } else { mNotificationList = []; diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets b/features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets new file mode 100644 index 00000000..8f1432f4 --- /dev/null +++ b/features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 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 default class Constants { + static GET_NEW_NOTIFICATION: number = 0; + static GET_EXIST_NOTIFICATION: number = 1; +} + +export interface NotificationItemData{ + id:string; + hashcode:string; + contentType:string; + timestamp:string; + time:string; + name:string; + want:any; + actionButtons:any[]; + bundleName:string; + smallIcon?:Resource|string; + largeIcon?:Resource|string; + title?:string; + text?:string; + additionalText?:string; + briefText?:string; + expandedTitle?:string; + longText?:string; + lines?:any[]; + longTitle?:string; +} \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/notification.ets b/product/statusbar/src/main/ets/default/pages/notification.ets index d31f6bd3..3e0f05cc 100644 --- a/product/statusbar/src/main/ets/default/pages/notification.ets +++ b/product/statusbar/src/main/ets/default/pages/notification.ets @@ -232,7 +232,7 @@ struct notificationItems { List() { ForEach(this.notificationList, (item: any) => { //notificationItems ListItem() { - notificationItem({ itemObject: item, showStatusBar: $showStatusBar }) + notificationItem({ itemData: item, showStatusBar: $showStatusBar }) } }, (item: any) => item.hashcode.toString()) } -- Gitee From da39e3aae7a63675f3521be3399c754b0b6d6e97 Mon Sep 17 00:00:00 2001 From: "size.peng" Date: Mon, 8 Nov 2021 14:00:31 +0800 Subject: [PATCH 031/373] [System-UI]Fix code check issue. Signed-off-by: size.peng --- .../ohos/noticeItem/item/notificationItem.ets | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets index ef2b72f5..ca8ed22d 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets @@ -32,13 +32,10 @@ let mWindowManager; export default struct NotificationItem { @Link showStatusBar: boolean private itemData: NotificationItemData - private basic: boolean = false; - private long: boolean = false; - private multi: boolean = false; @State hasPicture: boolean = false @State isExpand: boolean = false @State needExpand: boolean = true - @State iconDisplay: boolean = false; + @State deleteIconDisplay: boolean = false; @State itemWidth: string = '100%' startX: number = 0 startY: number = 0 @@ -53,19 +50,14 @@ export default struct NotificationItem { } else { this.hasPicture = true; } - switch (this.itemData.contentType) { - case Constants.NOTIFICATION_TYPE_BASIC: - this.basic = true; - this.needExpand=false; - break; - case Constants.NOTIFICATION_TYPE_LONG: - this.long = true; - break; - case Constants.NOTIFICATION_TYPE_MULTILINE: - this.multi = true; - break; - default: - break; + this.needExpand=this.checkItemNeedExpand() + } + + checkItemNeedExpand(){ + if(this.itemData.contentType===Constants.NOTIFICATION_TYPE_BASIC&&(!(this.itemData.actionButtons?.length>0))){ + return false; + }else{ + return true; } } @@ -87,20 +79,20 @@ export default struct NotificationItem { }) Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - if (this.basic) { + if (this.itemData.contentType===Constants.NOTIFICATION_TYPE_BASIC) { basicItem({ itemData: this.itemData, hasPicture:this.hasPicture }); } - if (this.long) { + if (this.itemData.contentType===Constants.NOTIFICATION_TYPE_LONG) { longItem({ itemData: this.itemData, hasPicture:this.hasPicture, isExpand:this.isExpand }); } - if (this.multi) { + if (this.itemData.contentType===Constants.NOTIFICATION_TYPE_MULTILINE) { multiItem({ itemData: this.itemData, hasPicture:this.hasPicture, @@ -120,7 +112,7 @@ export default struct NotificationItem { } }.onClick(this.clickItem.bind(this)) - if(this.basic||this.isExpand){ + if(this.isExpand){ Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { ForEach(this.itemData.actionButtons, (item: any) => { Text(item.title) @@ -154,7 +146,7 @@ export default struct NotificationItem { .onTouch(this.touchNotificationItem.bind(this)) .width(this.itemWidth) - if (this.iconDisplay) { + if (this.deleteIconDisplay) { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { Image($r('app.media.delete')) //delete .objectFit(ImageFit.Contain) @@ -180,16 +172,16 @@ export default struct NotificationItem { this.moveY = event.touches[0].y - this.startY; } else if (event.type == Constants.TOUCH_TYPE_UP) { //up Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); - if (this.iconDisplay) { + if (this.deleteIconDisplay) { if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { //hidden - this.iconDisplay = false; + this.deleteIconDisplay = false; this.itemWidth = '100%'; Log.showInfo(TAG, 'hidden'); } } else { if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { - this.iconDisplay = true; + this.deleteIconDisplay = true; this.itemWidth = '70%'; Log.showInfo(TAG, 'display'); } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { -- Gitee From 7ad6d2b9b762e897cc4c3fa7b08c0fb0980455b7 Mon Sep 17 00:00:00 2001 From: "size.peng" Date: Mon, 8 Nov 2021 14:43:21 +0800 Subject: [PATCH 032/373] [System-UI]Fix code check issue. Signed-off-by: size.peng --- .../com/ohos/noticeItem/item/basicItem.ets | 19 ++++----- .../ets/com/ohos/noticeItem/item/longItem.ets | 40 ++++++++----------- .../com/ohos/noticeItem/item/multiItem.ets | 8 +--- .../ohos/noticeItem/item/notificationItem.ets | 22 +++++----- 4 files changed, 35 insertions(+), 54 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets index d3209a99..c7e08ae6 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets @@ -18,7 +18,6 @@ import {NotificationItemData} from '../../../../../../../../notificationService/ @Component export default struct BasicItem { - @State hasPicture: boolean = false @State itemData: NotificationItemData= undefined build() { @@ -31,16 +30,12 @@ export default struct BasicItem { .fontWeight(FontWeight.Bold) .lineHeight(Constants.CONTENT_LINE_HEIGHT) Text(this.itemData.text) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Clip }) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - .margin({ top: $r('app.float.content_margin_top') }) - } - .width(this.hasPicture ? '85%' : '100%') - .margin({ top: $r('app.float.body_margin_top') }) - - + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Clip }) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .margin({ top: $r('app.float.content_margin_top') }) + }.width('100%') } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets index d5c12f3a..04ee4abf 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets @@ -20,31 +20,25 @@ import {NotificationItemData} from '../../../../../../../../notificationService/ export default struct LongItem { @State itemData: NotificationItemData= undefined - @Prop hasPicture: boolean @Prop isExpand: boolean - build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Text(this.isExpand ? this.itemData.expandedTitle : this.itemData.title) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) //not support Resource type - Text(this.isExpand ? this.itemData.longText : this.itemData.text) - .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .constraintSize({maxHeight: $r('app.float.notification_expanded_text_maxheight')}) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - .margin({ top: $r('app.float.content_margin_top') }) - } - .width(this.hasPicture ? '85%' : '100%') - .margin({ top: $r('app.float.body_margin_top') }) + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.isExpand ? this.itemData.expandedTitle : this.itemData.title) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) //not support Resource type + Text(this.isExpand ? this.itemData.longText : this.itemData.text) + .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .constraintSize({ maxHeight: $r('app.float.notification_expanded_text_maxheight') }) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .margin({ top: $r('app.float.content_margin_top') }) + }.width('100%') } - - } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets index f92996fc..2cf14928 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets @@ -18,12 +18,9 @@ import {NotificationItemData} from '../../../../../../../../notificationService/ @Component export default struct MultiItem { - @State itemData: NotificationItemData= undefined - @Prop hasPicture: boolean @Prop isExpand: boolean - build() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { Text(this.isExpand ? this.itemData.longTitle : this.itemData.title) @@ -50,9 +47,6 @@ export default struct MultiItem { .fontColor($r('app.color.content_text_color')) .margin({ top: $r('app.float.content_margin_top') }) } - } - .width(this.hasPicture ? '85%' : '100%') - .margin({ top: $r('app.float.body_margin_top') }) - + }.width('100%') } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets index ca8ed22d..3b07e1fc 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets @@ -67,7 +67,6 @@ export default struct NotificationItem { build() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - Row() { Column() { titleItem({ @@ -79,26 +78,27 @@ export default struct NotificationItem { }) Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - if (this.itemData.contentType===Constants.NOTIFICATION_TYPE_BASIC) { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC) { basicItem({ - itemData: this.itemData, - hasPicture:this.hasPicture + itemData: this.itemData }); } - if (this.itemData.contentType===Constants.NOTIFICATION_TYPE_LONG) { + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { longItem({ itemData: this.itemData, - hasPicture:this.hasPicture, - isExpand:this.isExpand + isExpand: this.isExpand }); } - if (this.itemData.contentType===Constants.NOTIFICATION_TYPE_MULTILINE) { + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { multiItem({ itemData: this.itemData, - hasPicture:this.hasPicture, - isExpand:this.isExpand + isExpand: this.isExpand }); } + } + .width(this.hasPicture ? '85%' : '100%') + .margin({ top: $r('app.float.body_margin_top') }) if (this.hasPicture) { Column() { @@ -128,7 +128,6 @@ export default struct NotificationItem { } .margin({ top: 10 }) } - } .backgroundColor($r('app.color.notificationitem_background')) .opacity($r('app.float.item_opicaty')) @@ -222,5 +221,4 @@ export default struct NotificationItem { //remove notification this.removeNotificationItem(this.itemData.hashcode); } - } -- Gitee From b1224d34abc050642fe9c3792544832092af99d6 Mon Sep 17 00:00:00 2001 From: croy Date: Mon, 8 Nov 2021 21:37:12 +0800 Subject: [PATCH 033/373] Split feature:control Signed-off-by: croy --- .../src/main/ets/template/UniformConfig.ets | 45 ++++++ .../src/main/ets/template/iconComponent.ets | 45 ++++++ .../src/main/ets/template/iconTitleBase.ets | 54 ++++--- .../build.gradle | 0 .../airplanecomponent/src/main/config.json | 23 +++ .../src/main/ets/default}/app.ets | 0 .../ets/default/pages/airplaneComponent.ets | 77 ++++++++++ .../main/resources/base/element/color.json | 5 + .../main/resources/base/element/float.json | 4 + .../main/resources/base/element/string.json | 8 + .../main/resources/base/media}/airplane.svg | 0 .../main/resources/base/media}/airplane_d.svg | 0 .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + features/brightnesscomponent/build.gradle | 19 +++ .../brightnesscomponent/src/main/config.json | 23 +++ .../src/main/ets/default/app.ets} | 10 +- .../main/ets/default}/brightnessManager.ets | 2 +- .../default}/pages/brightnessComponent.ets | 12 +- .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/float.json | 20 +++ .../main/resources/base/element/string.json | 8 + .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + .../common/png/ic_notification_settings.png | Bin 1060 -> 0 bytes .../com/ohos/control/pages/IconComponent.ets | 143 ------------------ .../main/resources/base/element/color.json | 41 ----- .../main/resources/base/element/float.json | 93 ------------ .../main/resources/base/element/string.json | 23 --- .../main/resources/base/media/airplane.svg | 14 -- .../main/resources/base/media/airplane_d.svg | 14 -- .../base/media/ic_notification_settings.png | Bin 1060 -> 0 bytes .../src/main/resources/base/media/wifi.svg | 17 --- .../src/main/resources/base/media/wifi_d.svg | 17 --- .../main/resources/en_US/element/string.json | 21 --- .../main/resources/zh_CN/element/string.json | 21 --- features/volumecomponent/build.gradle | 20 +++ .../src/main/config.json | 4 +- .../src/main/ets/default}/VolumeModel.ets | 2 +- .../src/main/ets/default/app.ets | 23 +++ .../ets/default}/pages/volumeComponent.ets | 10 +- .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/float.json | 17 +++ .../main/resources/base/element/string.json | 9 ++ .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + .../main/ets/default/pages/wifiComponent.ets} | 72 ++++----- .../src/main/ets/default/wifiModel.ets | 1 + .../main/resources/base/element/color.json | 4 + .../src/main/resources/base/media}/wifi.svg | 0 .../src/main/resources/base/media}/wifi_d.svg | 0 product/statusbar/build.gradle | 5 +- .../main/ets/default}/pages/ControlCenter.ets | 35 ++++- .../src/main/ets/default}/pages/UpTitle.ets | 8 +- .../src/main/ets/default/pages/control.ets | 2 +- .../src/main/ets/default/pages/index.ets | 2 +- .../main/ets/default/pages/notification.ets | 2 +- .../main/resources/base/element/color.json | 3 + .../main/resources/base/element/float.json | 27 ++++ .../main/resources/base/element/string.json | 6 + .../main/resources/en_US/element/string.json | 6 + .../main/resources/rawfile/layoutConfig.json | 6 +- .../main/resources/zh_CN/element/string.json | 6 + settings.gradle | 7 +- 64 files changed, 600 insertions(+), 500 deletions(-) create mode 100644 common/src/main/ets/template/UniformConfig.ets create mode 100644 common/src/main/ets/template/iconComponent.ets rename features/control/src/main/ets/com/ohos/control/pages/wifiComponent.ets => common/src/main/ets/template/iconTitleBase.ets (58%) rename features/{control => airplanecomponent}/build.gradle (100%) create mode 100644 features/airplanecomponent/src/main/config.json rename features/{control/src/main/ets/com/ohos/control => airplanecomponent/src/main/ets/default}/app.ets (100%) create mode 100644 features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets create mode 100644 features/airplanecomponent/src/main/resources/base/element/color.json create mode 100644 features/airplanecomponent/src/main/resources/base/element/float.json create mode 100644 features/airplanecomponent/src/main/resources/base/element/string.json rename features/{control/src/main/ets/com/ohos/control/common/png => airplanecomponent/src/main/resources/base/media}/airplane.svg (100%) rename features/{control/src/main/ets/com/ohos/control/common/png => airplanecomponent/src/main/resources/base/media}/airplane_d.svg (100%) create mode 100644 features/airplanecomponent/src/main/resources/en_US/element/string.json create mode 100644 features/airplanecomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/brightnesscomponent/build.gradle create mode 100644 features/brightnesscomponent/src/main/config.json rename features/{control/src/main/ets/com/ohos/control/pages/Uniform.ets => brightnesscomponent/src/main/ets/default/app.ets} (80%) rename features/{control/src/main/ets/com/ohos/control/common/brightness => brightnesscomponent/src/main/ets/default}/brightnessManager.ets (97%) rename features/{control/src/main/ets/com/ohos/control => brightnesscomponent/src/main/ets/default}/pages/brightnessComponent.ets (88%) create mode 100644 features/brightnesscomponent/src/main/resources/base/element/color.json create mode 100644 features/brightnesscomponent/src/main/resources/base/element/float.json create mode 100644 features/brightnesscomponent/src/main/resources/base/element/string.json create mode 100644 features/brightnesscomponent/src/main/resources/en_US/element/string.json create mode 100644 features/brightnesscomponent/src/main/resources/zh_CN/element/string.json delete mode 100644 features/control/src/main/ets/com/ohos/control/common/png/ic_notification_settings.png delete mode 100644 features/control/src/main/ets/com/ohos/control/pages/IconComponent.ets delete mode 100644 features/control/src/main/resources/base/element/color.json delete mode 100644 features/control/src/main/resources/base/element/float.json delete mode 100644 features/control/src/main/resources/base/element/string.json delete mode 100644 features/control/src/main/resources/base/media/airplane.svg delete mode 100644 features/control/src/main/resources/base/media/airplane_d.svg delete mode 100644 features/control/src/main/resources/base/media/ic_notification_settings.png delete mode 100644 features/control/src/main/resources/base/media/wifi.svg delete mode 100644 features/control/src/main/resources/base/media/wifi_d.svg delete mode 100644 features/control/src/main/resources/en_US/element/string.json delete mode 100644 features/control/src/main/resources/zh_CN/element/string.json create mode 100644 features/volumecomponent/build.gradle rename features/{control => volumecomponent}/src/main/config.json (77%) rename features/{control/src/main/ets/com/ohos/control/common/volume => volumecomponent/src/main/ets/default}/VolumeModel.ets (96%) create mode 100644 features/volumecomponent/src/main/ets/default/app.ets rename features/{control/src/main/ets/com/ohos/control => volumecomponent/src/main/ets/default}/pages/volumeComponent.ets (90%) create mode 100644 features/volumecomponent/src/main/resources/base/element/color.json create mode 100644 features/volumecomponent/src/main/resources/base/element/float.json create mode 100644 features/volumecomponent/src/main/resources/base/element/string.json create mode 100644 features/volumecomponent/src/main/resources/en_US/element/string.json create mode 100644 features/volumecomponent/src/main/resources/zh_CN/element/string.json rename features/{control/src/main/ets/com/ohos/control/pages/airPlaneComponent.ets => wificomponent/src/main/ets/default/pages/wifiComponent.ets} (34%) create mode 100644 features/wificomponent/src/main/resources/base/element/color.json rename features/{control/src/main/ets/com/ohos/control/common/png => wificomponent/src/main/resources/base/media}/wifi.svg (100%) rename features/{control/src/main/ets/com/ohos/control/common/png => wificomponent/src/main/resources/base/media}/wifi_d.svg (100%) rename {features/control/src/main/ets/com/ohos/control => product/statusbar/src/main/ets/default}/pages/ControlCenter.ets (62%) rename {features/control/src/main/ets/com/ohos/control => product/statusbar/src/main/ets/default}/pages/UpTitle.ets (84%) diff --git a/common/src/main/ets/template/UniformConfig.ets b/common/src/main/ets/template/UniformConfig.ets new file mode 100644 index 00000000..948acf50 --- /dev/null +++ b/common/src/main/ets/template/UniformConfig.ets @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2021 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 default class UniformConfig { + + static config = { + iconOnBG: "#0A59F7", + iconOffBG: "#F5F5F5", + baseColor: "#CCFFFFFF", + circleWidth: 80, + circleHeight: 80, + iconWidth: 50, + iconHeight: 50, + titleSize: 20, + baseBorderRadius: 15 + } + + static initParams(params?) { + console.log('----initParams(params)----ing'); + UniformConfig.config = params || { + iconOnBG: "#0A59F7", + iconOffBG: "#F5F5F5", + baseColor: "#CCFFFFFF", + circleWidth: 80, + circleHeight: 80, + iconWidth: 50, + iconHeight: 50, + titleSize: 20, + baseBorderRadius: 15 + } + console.log('----initParams(params)----finish'); + } +} diff --git a/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/template/iconComponent.ets new file mode 100644 index 00000000..ed072e0c --- /dev/null +++ b/common/src/main/ets/template/iconComponent.ets @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2021 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 UniformConfig from './UniformConfig.ets' + +@Component +export default +struct iconComponent { + + private mConfig = UniformConfig.config; + @State iconOff: any = "" + @State iconOn: any = "" + + @Link changeSwitch: boolean + + aboutToAppear() { + console.log(`------iconTitleBaseComponent ${this.changeSwitch} ${JSON.stringify(this.iconOff)} ${JSON.stringify(this.iconOn) }`) + } + build() { + Column() { + Stack() { + Flex() + .backgroundColor(this.changeSwitch == false? this.mConfig.iconOffBG : this.mConfig.iconOnBG) + .clip(new Circle({ width: this.mConfig.circleWidth, height: this.mConfig.circleHeight })) + .width(this.mConfig.circleWidth) + .height(this.mConfig.circleHeight) + Image(this.changeSwitch == false? this.iconOff: this.iconOn) + .size({ width: this.mConfig.iconWidth, height: this.mConfig.iconHeight }) + .objectFit(ImageFit.Contain) + }.margin({ left: 10 }) + } + } +} diff --git a/features/control/src/main/ets/com/ohos/control/pages/wifiComponent.ets b/common/src/main/ets/template/iconTitleBase.ets similarity index 58% rename from features/control/src/main/ets/com/ohos/control/pages/wifiComponent.ets rename to common/src/main/ets/template/iconTitleBase.ets index 2dfb6286..d1310f98 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/wifiComponent.ets +++ b/common/src/main/ets/template/iconTitleBase.ets @@ -13,16 +13,23 @@ * limitations under the License. */ -import {IconComponent} from './IconComponent.ets' -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import UniformConfig from './UniformConfig.ets' +import Log from '../default/Log.ets'; +import iconComponent from './iconComponent.ets' + +const TAG= 'iconTitleBase.ets' -const TAG= 'Control-wifiComponent' @Component -export -struct ElseWifiComponent { - @StorageLink('flyModelStatus') flyModelStatus: boolean = false - @StorageLink('wifiName') title: string = 'WLAN' - @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = false +export default +struct iconBaseComponent { + + private iconOn: any + private iconOff: any + private mTitle: string = "None" + private mConfig = UniformConfig.config; + private mClickEvent: Function + + @Link changeSwitch: boolean aboutToAppear() { Log.showInfo(TAG,'aboutToAppear') } @@ -30,35 +37,32 @@ struct ElseWifiComponent { aboutToDisappear () { Log.showInfo(TAG,'aboutToDisappear') } - - private IconInfo: any[] = [ - 'common/png/ic_notification_switch_off_bg.svg', - $r('app.media.wifi_d'), - '', - $r('app.media.wifi'), - ] build() { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - IconComponent({ - iconOff: this.IconInfo[1], - iconOn: this.IconInfo[3], - OnOrOff: $wifiOpenStatus + iconComponent({ + iconOff: this.iconOff, + iconOn: this.iconOn, + changeSwitch: $changeSwitch, }) } .height('100%') - + .onClick(() => { + console.log(`start clickEvent ${this.changeSwitch}`) + this.mClickEvent() + console.log(`end clickEvent ${this.changeSwitch}`) + }) Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Center }) { - Text(this.title) - .fontSize($r('app.float.control_common_font_size')) + Text(this.mTitle) + .fontSize(this.mConfig.titleSize) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .margin({ left: $r('app.float.wifi_text_margin') }) + .margin({ left: 10 }) } .height('100%') } - .borderRadius($r('app.float.wifi_border_radius')) - .backgroundColor($r('app.color.wifi_bg_color')) + .borderRadius(this.mConfig.baseBorderRadius) + .backgroundColor(this.mConfig.baseColor) .height('100%') .width('100%') } diff --git a/features/control/build.gradle b/features/airplanecomponent/build.gradle similarity index 100% rename from features/control/build.gradle rename to features/airplanecomponent/build.gradle diff --git a/features/airplanecomponent/src/main/config.json b/features/airplanecomponent/src/main/config.json new file mode 100644 index 00000000..3bb5c7c3 --- /dev/null +++ b/features/airplanecomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": { + }, + "module": { + "package": "com.ohos.systemui.airplanecomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "airplanecomponent", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/app.ets b/features/airplanecomponent/src/main/ets/default/app.ets similarity index 100% rename from features/control/src/main/ets/com/ohos/control/app.ets rename to features/airplanecomponent/src/main/ets/default/app.ets diff --git a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets new file mode 100644 index 00000000..4d77c9bd --- /dev/null +++ b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2021 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 WifiInfo from '@ohos.wifi_native_js'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import iconTitleBase from '../../../../../../../common/src/main/ets/template/iconTitleBase.ets' +const TAG = 'Control-airPlaneComponent' + +@Component +export default +struct airplaneComponent { + + private IconInfo: any[] = [ + $r('app.media.airplane_d'), + $r('app.media.airplane'), + ] + private flyModelTitle: any = $r("app.string.airplane_mode") + @StorageLink('flyModelStatus') flyModelStatus: boolean = false + private mWifiOriginalStatus: boolean = false + + +/* when flyModelStatus == true, so airplane is opening, + * use variable mWifiOriginalStatus to record WLAN current status + * use system interface to WLAN current status: WifiInfo.isWifiActive() + * when flyModelStatus == false ,so airplane is closed + * get variable mWifiOriginalStatus + * if variable mWifiOriginalStatus == true, set WLAN status enableWifi(),conversely disableWifi(). + */ + mClickEvent() { + this.flyModelStatus =!this.flyModelStatus + if (this.flyModelStatus == true) { + this.mWifiOriginalStatus = WifiInfo.isWifiActive() + console.log(`airplane status is opening, WLAN Original Status :${this.mWifiOriginalStatus}`) + WifiInfo.disableWifi(); + }else{ + if(this.mWifiOriginalStatus == true) { + WifiInfo.enableWifi(); + console.log(`airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},get system interface, set WLAN status enableWifi`) + } else { + WifiInfo.disableWifi(); + console.log(`airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},,get system interface, set WLAN status disableWifi`) + } + } + } + + aboutToAppear(){ + Log.showInfo(TAG,'aboutToAppear') + } + + aboutToDisappear (){ + Log.showInfo(TAG,'aboutToDisappear ') + } + + build() { + Column() { + iconTitleBase({ + iconOff: this.IconInfo[0], + iconOn: this.IconInfo[1], + mTitle: this.flyModelTitle, + changeSwitch: $flyModelStatus, + mClickEvent: this.mClickEvent.bind(this) + }) + } + } +} \ No newline at end of file diff --git a/features/airplanecomponent/src/main/resources/base/element/color.json b/features/airplanecomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..fd47795d --- /dev/null +++ b/features/airplanecomponent/src/main/resources/base/element/color.json @@ -0,0 +1,5 @@ +{ + "color": [ + + ] +} diff --git a/features/airplanecomponent/src/main/resources/base/element/float.json b/features/airplanecomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..f7b2ff16 --- /dev/null +++ b/features/airplanecomponent/src/main/resources/base/element/float.json @@ -0,0 +1,4 @@ +{ + "float": [ + ] +} diff --git a/features/airplanecomponent/src/main/resources/base/element/string.json b/features/airplanecomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..65f7a455 --- /dev/null +++ b/features/airplanecomponent/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "airplane_mode", + "value": "飞行模式" + } + ] +} diff --git a/features/control/src/main/ets/com/ohos/control/common/png/airplane.svg b/features/airplanecomponent/src/main/resources/base/media/airplane.svg similarity index 100% rename from features/control/src/main/ets/com/ohos/control/common/png/airplane.svg rename to features/airplanecomponent/src/main/resources/base/media/airplane.svg diff --git a/features/control/src/main/ets/com/ohos/control/common/png/airplane_d.svg b/features/airplanecomponent/src/main/resources/base/media/airplane_d.svg similarity index 100% rename from features/control/src/main/ets/com/ohos/control/common/png/airplane_d.svg rename to features/airplanecomponent/src/main/resources/base/media/airplane_d.svg diff --git a/features/airplanecomponent/src/main/resources/en_US/element/string.json b/features/airplanecomponent/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..d1d6cc71 --- /dev/null +++ b/features/airplanecomponent/src/main/resources/en_US/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "airplane_mode", + "value": "AirPlane Mode" + } + ] +} diff --git a/features/airplanecomponent/src/main/resources/zh_CN/element/string.json b/features/airplanecomponent/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..65f7a455 --- /dev/null +++ b/features/airplanecomponent/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "airplane_mode", + "value": "飞行模式" + } + ] +} diff --git a/features/brightnesscomponent/build.gradle b/features/brightnesscomponent/build.gradle new file mode 100644 index 00000000..520bba63 --- /dev/null +++ b/features/brightnesscomponent/build.gradle @@ -0,0 +1,19 @@ +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion 7 + defaultConfig { + compatibleSdkVersion 4 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} diff --git a/features/brightnesscomponent/src/main/config.json b/features/brightnesscomponent/src/main/config.json new file mode 100644 index 00000000..d859c81b --- /dev/null +++ b/features/brightnesscomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": { + }, + "module": { + "package": "com.ohos.systemui.brightnesscomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "brightnesscomponent", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/features/control/src/main/ets/com/ohos/control/pages/Uniform.ets b/features/brightnesscomponent/src/main/ets/default/app.ets similarity index 80% rename from features/control/src/main/ets/com/ohos/control/pages/Uniform.ets rename to features/brightnesscomponent/src/main/ets/default/app.ets index fb5c9304..2a3b6238 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/Uniform.ets +++ b/features/brightnesscomponent/src/main/ets/default/app.ets @@ -13,5 +13,11 @@ * limitations under the License. */ -export const IconWidth: number = 80 -export const IconHeight: number = 80 \ No newline at end of file +export default { + onCreate() { + console.info('Application onCreate') + }, + onDestroy() { + console.info('Application onDestroy') + }, +} diff --git a/features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets similarity index 97% rename from features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets rename to features/brightnesscomponent/src/main/ets/default/brightnessManager.ets index 89869528..506e3f6d 100644 --- a/features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets @@ -14,7 +14,7 @@ */ import brightness from '@ohos.brightness'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import Log from '../../../../../../common/src/main/ets/default/Log.ets'; import commonEvent from '@ohos.commonEvent'; const TAG = 'Control-brightnessManager'; diff --git a/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets similarity index 88% rename from features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets rename to features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets index e5b30f77..8e39befc 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/brightnessComponent.ets +++ b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets @@ -14,12 +14,11 @@ */ import brightness from '@ohos.brightness'; -import mBrightnessManager from '../common/brightness/brightnessManager.ets'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import mBrightnessManager from '../brightnessManager.ets'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; const TAG = 'Control-brightnessComponent' - @Component export struct MyBrightness { @@ -45,11 +44,13 @@ struct MyBrightness { build() { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - Column() { + Column({useAlign:HorizontalAlign.Center}) { Text($r('app.string.brightness_text')) .fontSize($r('app.float.control_common_font_size')) + .alignSelf(ItemAlign.Center) } .width('15%') + .constraintSize({ maxWidth: $r("app.float.font_constraint_maxSize") }) .padding({ left: $r('app.float.slider_text_padding_left') }) Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { @@ -60,11 +61,10 @@ struct MyBrightness { step: 1, style: SliderStyle.INSET }) - .size({ width: $r('app.float.slider_size_width') }) + .width('100%') .blockColor(Color.Blue) .trackColor(Color.Grey) .selectedColor(Color.Blue) - .width('100%') .onChange((value: number) => { this.brightnessItem.value = value; this.setBrightness(this.brightnessItem); diff --git a/features/brightnesscomponent/src/main/resources/base/element/color.json b/features/brightnesscomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..e3a32623 --- /dev/null +++ b/features/brightnesscomponent/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "brightness_bg_color", + "value": "#CCFFFFFF" + } + ] +} diff --git a/features/brightnesscomponent/src/main/resources/base/element/float.json b/features/brightnesscomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..43a9e86d --- /dev/null +++ b/features/brightnesscomponent/src/main/resources/base/element/float.json @@ -0,0 +1,20 @@ +{ + "float": [ + { + "name": "control_common_font_size", + "value": "20" + },{ + "name": "slider_text_padding_left", + "value": "5" + },{ + "name": "slider_size_width", + "value": "300" + },{ + "name": "brightness_border_radius", + "value": "15" + },{ + "name": "font_constraint_maxSize", + "value": "70" + } + ] +} diff --git a/features/brightnesscomponent/src/main/resources/base/element/string.json b/features/brightnesscomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..28b7bcc8 --- /dev/null +++ b/features/brightnesscomponent/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "brightness_text", + "value": "亮度" + } + ] +} diff --git a/features/brightnesscomponent/src/main/resources/en_US/element/string.json b/features/brightnesscomponent/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..bb6daa6a --- /dev/null +++ b/features/brightnesscomponent/src/main/resources/en_US/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "brightness_text", + "value": "Brightness" + } + ] +} diff --git a/features/brightnesscomponent/src/main/resources/zh_CN/element/string.json b/features/brightnesscomponent/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..28b7bcc8 --- /dev/null +++ b/features/brightnesscomponent/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "brightness_text", + "value": "亮度" + } + ] +} diff --git a/features/control/src/main/ets/com/ohos/control/common/png/ic_notification_settings.png b/features/control/src/main/ets/com/ohos/control/common/png/ic_notification_settings.png deleted file mode 100644 index b665b89cd206a3e476f5e9efbe31d482be7a0321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKMSxF;E0F#_5a8H~Cu@LqYm@}} z1v9Kz!j?9FIuBE}!mNZcS4&e#flzNf(Mi1>^=i%1`N3NL4o1n*HdQBu_hvFMFdKWi zIEF+Vej9#s+ad#j78kRdfm2)=4?g|>zd()AfAYJE{uH_A*Cuyvob>9Qm;38_*Xl$w zg_;8Ad2?=RF*z@q+goV#=%cJtiHVZdQUAw>rJKGbt>ZbuVqg*wcDRBmm+e%Z!84E9 zGmVOK{~Sz9ZSWBYJuGgoCl@W7{erOF;$IcgfUmCs@iPs@$<)xc{e&^r`Hz$n5Fc68o!~6m_X;r-3M!*R-C#c`pk^s zJ>T*>EFJ6%T6QFUShJtKpQXsdIE67zW3s}|YH=6SU-PrlN>v`}xS4-du5QippJ`Rn zlFzT2*C&DGO4`=s8kF>v+H*|T5jcEU0pj}>p- z&R(2s@b;??RS90X*HG_Xm(`U0F=ADlvyYehs0yDJnOBw9C1X25<)^Op@q~BX8`ta1P@n&# zQlMZ?9?P2xVMZIL`p>!fQo?`Pha*Q8{uX#SRq~QV<$VUw{C@5NXD`4}D? zS~OS2;k@mRipJAhZ%#R$7J5D1Jw481L5+t=u#l-@Ot#dN<6lnQ?@xF%E6L7fSI?=G zKd;W-{qYPw7g)mGYe$1ILWg+-yu;l zp diff --git a/features/control/src/main/ets/com/ohos/control/pages/IconComponent.ets b/features/control/src/main/ets/com/ohos/control/pages/IconComponent.ets deleted file mode 100644 index c12a7035..00000000 --- a/features/control/src/main/ets/com/ohos/control/pages/IconComponent.ets +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2021 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 {IconWidth, IconHeight} from './Uniform.ets'; -import mWifiManger from '../../../../../../../../wificomponent/src/main/ets/default/WifiModel.ets'; - -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; - -const TAG='Control-IconComponent' -@Component -export -struct IconComponent { - @State iconOnBG: any = $r('app.color.icon_on_bg') - private iconOn: string = '' - @State iconOffBG: any = $r('app.color.icon_off_bg') - private iconOff: string = '' - @Link OnOrOff: boolean - @State OnOrOffShow: boolean = false - @StorageLink('flyModelStatus') flyModelStatus: boolean = false - @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = false - - - aboutToAppear() { - Log.showInfo(TAG,'aboutToAppear') - mWifiManger.initWifiModel(); - } - aboutToDisappear () { - Log.showInfo(TAG,'aboutToDisappear') - } - - build() { - Column() { - Stack() { - Stack() { - Flex() - .backgroundColor(this.iconOffBG) - .clip(new Circle({ width: IconWidth, height: IconHeight })) - .width($r('app.float.uniform_icon_bg_width')) - .height($r('app.float.uniform_icon_bg_height')) - Image(this.iconOff) - .size({ width: $r('app.float.uniform_icon_width'), height: $r('app.float.uniform_icon_height') }) - .objectFit(ImageFit.Contain) - } - .margin({ left: $r('app.float.icon_stack_common_margin') }) - - if (this.wifiOpenStatus == true) { - Stack() { - Flex() - .backgroundColor(this.iconOnBG) - .clip(new Circle({ width: IconWidth, height: IconHeight })) - .width($r('app.float.uniform_icon_bg_width')) - .height($r('app.float.uniform_icon_bg_height')) - Image(this.iconOn) - .size({ width: $r('app.float.uniform_icon_width'), height: $r('app.float.uniform_icon_height') }) - .objectFit(ImageFit.Contain) - } - .margin({ left: $r('app.float.icon_stack_common_margin') }) - } - } - .onClick(() => { - console.log(`IconComponent onClick ${this.flyModelStatus}`) - if (this.wifiOpenStatus == false) { - mWifiManger.enableWifi(); - } else { - mWifiManger.disableWifi(); - } - }) - } - } -} - -@Component -export -struct IconFlyComponent { - @State iconOnBG: any = $r('app.color.icon_on_bg') - private iconOn: string = '' - @State iconOffBG: any = $r('app.color.icon_off_bg') - private iconOff: string = '' - @StorageLink('flyModelStatus') flyModelStatus: boolean = false - @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = false - - aboutToAppear() { - Log.showInfo(TAG,'aboutToAppear') - } - - aboutToDisappear () { - Log.showInfo(TAG,'aboutToDisappear') - } - - build() { - Column() { - Stack() { - Stack() { - Flex() - .backgroundColor(this.iconOffBG) - .clip(new Circle({ width: IconWidth, height: IconHeight })) - .width($r('app.float.uniform_icon_bg_width')) - .height($r('app.float.uniform_icon_bg_height')) - Image(this.iconOff) - .size({ width: $r('app.float.uniform_icon_width'), height: $r('app.float.uniform_icon_height') }) - .objectFit(ImageFit.Contain) - } - .margin({ left: $r('app.float.icon_stack_common_margin') }) - - if (this.flyModelStatus == true) { - Stack() { - Flex() - .backgroundColor(this.iconOnBG) - .clip(new Circle({ width: IconWidth, height: IconHeight })) - .width($r('app.float.uniform_icon_bg_width')) - .height($r('app.float.uniform_icon_bg_height')) - Image(this.iconOn) - .size({ width: $r('app.float.uniform_icon_width'), height: $r('app.float.uniform_icon_height') }) - .objectFit(ImageFit.Contain) - } - .margin({ left: $r('app.float.icon_stack_common_margin') }) - } - } - .onClick(() => { - console.log(`IconFlyComponent onClick ${this.flyModelStatus} `) - this.flyModelStatus =!this.flyModelStatus - console.log(`IconFlyComponent onClick ${this.flyModelStatus} `) - if (this.flyModelStatus == true) { - mWifiManger.disableWifi(); - }else{ - mWifiManger.enableWifi(); - } - }) - } - } -} \ No newline at end of file diff --git a/features/control/src/main/resources/base/element/color.json b/features/control/src/main/resources/base/element/color.json deleted file mode 100644 index 7b54e20d..00000000 --- a/features/control/src/main/resources/base/element/color.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "color": [ - { - "name": "plane_bg_color", - "value": "#CCFFFFFF" - },{ - "name": "slider_block_color", - "value": "#0000FF" - },{ - "name": "slider_track_color", - "value": "#BEBEBE" - },{ - "name": "slider_select_color", - "value": "#0000FF" - },{ - "name": "brightness_bg_color", - "value": "#CCFFFFFF" - },{ - "name": "control_center_bg_color", - "value": "#66000000" - },{ - "name": "icon_on_bg", - "value": "#0A59F7" - },{ - "name": "icon_off_bg", - "value": "#F5F5F5" - },{ - "name": "title_font_color", - "value": "#FFF" - }, - - { - "name": "volume_bg_color", - "value": "#CCFFFFFF" - }, - { - "name": "wifi_bg_color", - "value": "#CCFFFFFF" - } - ] -} diff --git a/features/control/src/main/resources/base/element/float.json b/features/control/src/main/resources/base/element/float.json deleted file mode 100644 index c04c1e9f..00000000 --- a/features/control/src/main/resources/base/element/float.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "float": [ - { - "name": "plane_border_radius", - "value": "15" - },{ - "name": "plane_margin_left", - "value": "10" - },{ - "name": "control_common_font_size", - "value": "20" - },{ - "name": "slider_size_width", - "value": "300" - },{ - "name": "brightness_border_radius", - "value": "15" - },{ - "name": "center_item_margin_top", - "value": "20" - },{ - "name": "center_item_margin_left", - "value": "10" - },{ - "name": "center_item_margin_right", - "value": "10" - },{ - "name": "title_font_size", - "value": "35" - },{ - "name": "notification_settings_width", - "value": "60" - },{ - "name": "notification_settings_height", - "value": "60" - },{ - "name": "volume_border_radius", - "value": "15" - }, - { - "name": "uniform_icon_width", - "value": "50" - }, - { - "name": "uniform_icon_height", - "value": "50" - }, - { - "name": "uniform_icon_bg_height", - "value": "80" - }, - { - "name": "uniform_icon_bg_width", - "value": "80" - }, - { - "name": "icon_stack_common_margin", - "value": "10" - }, - - { - "name": "icon_circle_width", - "value": "80" - },{ - "name": "icon_circle_height", - "value": "80" - }, - { - "name": "wifi_border_radius", - "value": "15" - }, - { - "name": "wifi_text_margin", - "value": "10" - }, - { - "name": "icon_component_width", - "value": "15" - },{ - "name": "slider_text_padding_left", - "value": "5" - },{ - "name": "wifi_and_air_height", - "value": "120" - },{ - "name": "up_title_height", - "value": "83" - },{ - "name": "vol_height", - "value": "66" - } - ] -} diff --git a/features/control/src/main/resources/base/element/string.json b/features/control/src/main/resources/base/element/string.json deleted file mode 100644 index d1db5170..00000000 --- a/features/control/src/main/resources/base/element/string.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "string": [ - { - "name": "control_library", - "value": "control_library" - }, - { - "name": "flight_mode", - "value": "飞行模式" - }, - { - "name": "brightness_text", - "value": "亮度:" - },{ - "name": "control_center", - "value": "控制中心" - },{ - "name": "volume_control", - "value": "声音:" - } - - ] -} diff --git a/features/control/src/main/resources/base/media/airplane.svg b/features/control/src/main/resources/base/media/airplane.svg deleted file mode 100644 index d648b9f9..00000000 --- a/features/control/src/main/resources/base/media/airplane.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/features/control/src/main/resources/base/media/airplane_d.svg b/features/control/src/main/resources/base/media/airplane_d.svg deleted file mode 100644 index ad2180b1..00000000 --- a/features/control/src/main/resources/base/media/airplane_d.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/features/control/src/main/resources/base/media/ic_notification_settings.png b/features/control/src/main/resources/base/media/ic_notification_settings.png deleted file mode 100644 index b665b89cd206a3e476f5e9efbe31d482be7a0321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKMSxF;E0F#_5a8H~Cu@LqYm@}} z1v9Kz!j?9FIuBE}!mNZcS4&e#flzNf(Mi1>^=i%1`N3NL4o1n*HdQBu_hvFMFdKWi zIEF+Vej9#s+ad#j78kRdfm2)=4?g|>zd()AfAYJE{uH_A*Cuyvob>9Qm;38_*Xl$w zg_;8Ad2?=RF*z@q+goV#=%cJtiHVZdQUAw>rJKGbt>ZbuVqg*wcDRBmm+e%Z!84E9 zGmVOK{~Sz9ZSWBYJuGgoCl@W7{erOF;$IcgfUmCs@iPs@$<)xc{e&^r`Hz$n5Fc68o!~6m_X;r-3M!*R-C#c`pk^s zJ>T*>EFJ6%T6QFUShJtKpQXsdIE67zW3s}|YH=6SU-PrlN>v`}xS4-du5QippJ`Rn zlFzT2*C&DGO4`=s8kF>v+H*|T5jcEU0pj}>p- z&R(2s@b;??RS90X*HG_Xm(`U0F=ADlvyYehs0yDJnOBw9C1X25<)^Op@q~BX8`ta1P@n&# zQlMZ?9?P2xVMZIL`p>!fQo?`Pha*Q8{uX#SRq~QV<$VUw{C@5NXD`4}D? zS~OS2;k@mRipJAhZ%#R$7J5D1Jw481L5+t=u#l-@Ot#dN<6lnQ?@xF%E6L7fSI?=G zKd;W-{qYPw7g)mGYe$1ILWg+-yu;l zp diff --git a/features/control/src/main/resources/base/media/wifi.svg b/features/control/src/main/resources/base/media/wifi.svg deleted file mode 100644 index e22c8330..00000000 --- a/features/control/src/main/resources/base/media/wifi.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - ic_notification_wlan - Created with Sketch. - - - - - - - - - - - - \ No newline at end of file diff --git a/features/control/src/main/resources/base/media/wifi_d.svg b/features/control/src/main/resources/base/media/wifi_d.svg deleted file mode 100644 index e851f5b3..00000000 --- a/features/control/src/main/resources/base/media/wifi_d.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - ic_notification_wlan - Created with Sketch. - - - - - - - - - - - - \ No newline at end of file diff --git a/features/control/src/main/resources/en_US/element/string.json b/features/control/src/main/resources/en_US/element/string.json deleted file mode 100644 index 78e291b8..00000000 --- a/features/control/src/main/resources/en_US/element/string.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "string": [ - { - "name": "control_library", - "value": "control_library" - },{ - "name": "flight_mode", - "value": "Flight Mode" - }, - { - "name": "brightness_text", - "value": "Brightness:" - },{ - "name": "control_center", - "value": "Control Center" - },{ - "name": "volume_control", - "value": "Volume:" - } - ] -} diff --git a/features/control/src/main/resources/zh_CN/element/string.json b/features/control/src/main/resources/zh_CN/element/string.json deleted file mode 100644 index d3b282c0..00000000 --- a/features/control/src/main/resources/zh_CN/element/string.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "string": [ - { - "name": "control_library", - "value": "control_library" - },{ - "name": "flight_mode", - "value": "飞行模式" - }, - { - "name": "brightness_text", - "value": "亮度:" - },{ - "name": "control_center", - "value": "控制中心" - },{ - "name": "volume_control", - "value": "声音:" - } - ] -} diff --git a/features/volumecomponent/build.gradle b/features/volumecomponent/build.gradle new file mode 100644 index 00000000..3489fe34 --- /dev/null +++ b/features/volumecomponent/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion 7 + defaultConfig { + compatibleSdkVersion 4 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + +} diff --git a/features/control/src/main/config.json b/features/volumecomponent/src/main/config.json similarity index 77% rename from features/control/src/main/config.json rename to features/volumecomponent/src/main/config.json index 8dc1b2a4..98b83a58 100644 --- a/features/control/src/main/config.json +++ b/features/volumecomponent/src/main/config.json @@ -10,13 +10,13 @@ "deviceConfig": { }, "module": { - "package": "com.ohos.control", + "package": "com.ohos.systemui.volumecomponent", "deviceType": [ "phone" ], "distro": { "deliveryWithInstall": true, - "moduleName": "control", + "moduleName": "volumecomponent", "moduleType": "har" } } diff --git a/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets b/features/volumecomponent/src/main/ets/default/VolumeModel.ets similarity index 96% rename from features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets rename to features/volumecomponent/src/main/ets/default/VolumeModel.ets index af17d83d..adf69507 100644 --- a/features/control/src/main/ets/com/ohos/control/common/volume/VolumeModel.ets +++ b/features/volumecomponent/src/main/ets/default/VolumeModel.ets @@ -14,7 +14,7 @@ */ import audio from '@ohos.multimedia.audio'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import Log from '../../../../../../common/src/main/ets/default/Log.ets'; let TAG = 'Control-VolumeModel'; diff --git a/features/volumecomponent/src/main/ets/default/app.ets b/features/volumecomponent/src/main/ets/default/app.ets new file mode 100644 index 00000000..2a3b6238 --- /dev/null +++ b/features/volumecomponent/src/main/ets/default/app.ets @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 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 default { + onCreate() { + console.info('Application onCreate') + }, + onDestroy() { + console.info('Application onDestroy') + }, +} diff --git a/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets similarity index 90% rename from features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets rename to features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets index da2293fd..0289eddc 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/volumeComponent.ets +++ b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets @@ -14,8 +14,8 @@ */ import audio from '@ohos.multimedia.audio'; -import VolumeModel from '../common/volume/VolumeModel.ets'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import VolumeModel from '../VolumeModel.ets'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; const TAG = 'Control-volumeComponent' const volumeType = audio.AudioVolumeType.MEDIA; @@ -43,7 +43,6 @@ struct MyVol { Log.showInfo(TAG, `initVolume ${volume.value} ${volume.minValue} ${volume.maxValue} `); } - setVolume(volumeValue, volumeType) { Log.showInfo(TAG, `setVolume = ${volume.value} Type = ${volumeType}`) audio.getAudioManager().setVolume(volumeType, volume.value).then(() => { @@ -61,10 +60,12 @@ struct MyVol { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { Column({useAlign:HorizontalAlign.Center}) { Text($r('app.string.volume_control')) - .fontSize($r('app.float.control_common_font_size')).alignSelf(ItemAlign.Center) + .fontSize($r('app.float.control_common_font_size')) + .alignSelf(ItemAlign.Center) } .width('15%') + .constraintSize({ maxWidth: $r("app.float.font_constraint_maxSize") }) .padding({ left: $r('app.float.slider_text_padding_left') }) Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { @@ -75,7 +76,6 @@ struct MyVol { step: 1, style: SliderStyle.INSET }) - .size({ width: 300 }) .width('100%') .blockColor(Color.Blue) .trackColor(Color.Grey) diff --git a/features/volumecomponent/src/main/resources/base/element/color.json b/features/volumecomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..c8775bea --- /dev/null +++ b/features/volumecomponent/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "volume_bg_color", + "value": "#CCFFFFFF" + } + ] +} diff --git a/features/volumecomponent/src/main/resources/base/element/float.json b/features/volumecomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..edac3870 --- /dev/null +++ b/features/volumecomponent/src/main/resources/base/element/float.json @@ -0,0 +1,17 @@ +{ + "float": [ + { + "name": "control_common_font_size", + "value": "20" + },{ + "name": "slider_text_padding_left", + "value": "5" + },{ + "name": "volume_border_radius", + "value": "15" + },{ + "name": "font_constraint_maxSize", + "value": "70" + } + ] +} diff --git a/features/volumecomponent/src/main/resources/base/element/string.json b/features/volumecomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..1939801a --- /dev/null +++ b/features/volumecomponent/src/main/resources/base/element/string.json @@ -0,0 +1,9 @@ +{ + "string": [ + { + "name": "volume_control", + "value": "声音" + } + + ] +} \ No newline at end of file diff --git a/features/volumecomponent/src/main/resources/en_US/element/string.json b/features/volumecomponent/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..e7eed20b --- /dev/null +++ b/features/volumecomponent/src/main/resources/en_US/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "volume_control", + "value": "Volume" + } + ] +} diff --git a/features/volumecomponent/src/main/resources/zh_CN/element/string.json b/features/volumecomponent/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..d2b4e579 --- /dev/null +++ b/features/volumecomponent/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "volume_control", + "value": "声音" + } + ] +} diff --git a/features/control/src/main/ets/com/ohos/control/pages/airPlaneComponent.ets b/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets similarity index 34% rename from features/control/src/main/ets/com/ohos/control/pages/airPlaneComponent.ets rename to features/wificomponent/src/main/ets/default/pages/wifiComponent.ets index 0e3accd6..7fa3a2d8 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/airPlaneComponent.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets @@ -13,51 +13,51 @@ * limitations under the License. */ -import {IconFlyComponent} from './IconComponent.ets' -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import mWifiManger from '../WifiModel.ets'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import iconTitleBase from '../../../../../../../common/src/main/ets/template/iconTitleBase.ets' +const TAG= 'Control-wifiComponent' -const TAG = 'Control-airPlaneComponent' @Component -export -struct AirPlaneComponent { - @State flyModel: boolean = false - @StorageLink('flyModelStatus') flyModelStatus: boolean = this.flyModel +export default +struct WifiComponent { - aboutToAppear(){ - Log.showInfo(TAG,'aboutToAppear') + private IconInfo: any[] = [ + $r('app.media.wifi_d'), + $r('app.media.wifi'), + ] + + @StorageLink('wifiName') wifiName: string = 'WLAN' + @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = false + + mClickEvent() { + if (this.wifiOpenStatus == false) { + console.log(`WLAN status is closing:${this.wifiOpenStatus} ”no“, set WLAN status enableWifi`) + mWifiManger.enableWifi(); + } else { + console.log(`WLAN status is opening:${this.wifiOpenStatus} ”yes“,se WLAN status disableWifi`) + mWifiManger.disableWifi(); + } } - aboutToDisappear (){ - Log.showInfo(TAG,'aboutToDisappear ') + aboutToAppear() { + Log.showInfo(TAG,'aboutToAppear') + mWifiManger.initWifiModel() } - private IconInfo: any[] = [ - '', - $r('app.media.airplane_d'), - '', - $r('app.media.airplane'), - ] + aboutToDisappear () { + Log.showInfo(TAG,'aboutToDisappear') + } build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - IconFlyComponent({ - iconOff: this.IconInfo[1], - iconOn: this.IconInfo[3] - }) - } - .height('100%') - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Center }) { - Text($r('app.string.flight_mode')) - .fontSize($r('app.float.control_common_font_size')) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .margin({ left: $r('app.float.plane_margin_left') }) - } - .height('100%') + Column() { + iconTitleBase({ + iconOff: this.IconInfo[0], + iconOn: this.IconInfo[1], + mTitle: this.wifiName, + changeSwitch: $wifiOpenStatus, + mClickEvent: this.mClickEvent.bind(this) + }) } - .borderRadius($r('app.float.plane_border_radius')) - .backgroundColor($r('app.color.plane_bg_color')) - .height('100%') - .width('100%') } } \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ets b/features/wificomponent/src/main/ets/default/wifiModel.ets index e1b9584e..1c7f2728 100644 --- a/features/wificomponent/src/main/ets/default/wifiModel.ets +++ b/features/wificomponent/src/main/ets/default/wifiModel.ets @@ -30,6 +30,7 @@ var mWifiStatus; var mWifiOpenStatus; var mWifiName; + export class WifiModel { initWifiModel() { diff --git a/features/wificomponent/src/main/resources/base/element/color.json b/features/wificomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..7fc8ec73 --- /dev/null +++ b/features/wificomponent/src/main/resources/base/element/color.json @@ -0,0 +1,4 @@ +{ + "color": [ + ] +} diff --git a/features/control/src/main/ets/com/ohos/control/common/png/wifi.svg b/features/wificomponent/src/main/resources/base/media/wifi.svg similarity index 100% rename from features/control/src/main/ets/com/ohos/control/common/png/wifi.svg rename to features/wificomponent/src/main/resources/base/media/wifi.svg diff --git a/features/control/src/main/ets/com/ohos/control/common/png/wifi_d.svg b/features/wificomponent/src/main/resources/base/media/wifi_d.svg similarity index 100% rename from features/control/src/main/ets/com/ohos/control/common/png/wifi_d.svg rename to features/wificomponent/src/main/resources/base/media/wifi_d.svg diff --git a/product/statusbar/build.gradle b/product/statusbar/build.gradle index 466b5fa0..bc4a10c9 100644 --- a/product/statusbar/build.gradle +++ b/product/statusbar/build.gradle @@ -13,9 +13,12 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) testCompile 'junit:junit:4.12' implementation project(':features:signalcomponent') - implementation project(':features:control') + implementation project(':features:airplanecomponent') + implementation project(':features:brightnesscomponent') implementation project(':features:wificomponent') + implementation project(':features:volumecomponent') implementation project(':features:batterycomponent') implementation project(':features:clockcomponent') implementation project(':features:noticeitem') + implementation project(':features:notificationservice') } diff --git a/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets b/product/statusbar/src/main/ets/default/pages/ControlCenter.ets similarity index 62% rename from features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets rename to product/statusbar/src/main/ets/default/pages/ControlCenter.ets index 26e7d758..383d8da2 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets +++ b/product/statusbar/src/main/ets/default/pages/ControlCenter.ets @@ -14,21 +14,44 @@ */ import {UpTitle} from './UpTitle.ets' -import {AirPlaneComponent} from './airPlaneComponent.ets' -import {ElseWifiComponent} from './wifiComponent.ets' -import {MyBrightness} from './brightnessComponent.ets' -import {MyVol} from './volumeComponent.ets' +import AirPlaneComponent from "../../../../../../../features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets" +import WifiComponent from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiComponent.ets' +import {MyBrightness} from '../../../../../../../features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets' +import {MyVol} from '../../../../../../../features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets' +import mWifiManger from "../../../../../../../features/wificomponent/src/main/ets/default//WifiModel.ets" +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import UniformConfig from '../../../../../../../common/src/main/ets/template/UniformConfig.ets' -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; const TAG='Control-ControlCenter' +var mUniform; @Component export default struct ControlCenterComponent { @Link showStatusBar: boolean + @StorageLink('flyModelStatus') flyModelStatus: boolean = false + @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = false + @StorageLink("mWifiOriginalStatus") mWifiOriginalStatus: boolean = false + + componentUniform = { + iconOnBG: "#0A59F7", + iconOffBG: "#F5F5F5", + baseColor: "#CCFFFFFF", + circleWidth: 80, + circleHeight: 80, + iconWidth: 50, + iconHeight: 50, + titleSize: 20, + iconTitleMargin: 10, + baseBorderRadius: 15, + } aboutToAppear() { Log.showInfo(TAG,'aboutToAppear') + // 初始化自定义组件样式 + mUniform = UniformConfig.initParams(this.componentUniform) + + console.log(`------${JSON.stringify(mUniform)}`); } aboutToDisappear () { @@ -48,7 +71,7 @@ struct ControlCenterComponent { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { Flex() { - ElseWifiComponent() + WifiComponent() } .width('48%') .height('100%') diff --git a/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets b/product/statusbar/src/main/ets/default/pages/UpTitle.ets similarity index 84% rename from features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets rename to product/statusbar/src/main/ets/default/pages/UpTitle.ets index 399dac02..5d4f1b48 100644 --- a/features/control/src/main/ets/com/ohos/control/pages/UpTitle.ets +++ b/product/statusbar/src/main/ets/default/pages/UpTitle.ets @@ -13,9 +13,9 @@ * limitations under the License. */ -import FeatureAbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; -import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import FeatureAbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; +import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' const TAG = 'Control-UpTitle' let mWindowManager; @@ -46,7 +46,7 @@ struct UpTitle { .height('100%') Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - Image($r('app.media.ic_notification_settings')) + Image($r('app.media.ic_settings')) .objectFit(ImageFit.Contain) .size({ width: $r('app.float.notification_settings_width'), height: $r('app.float.notification_settings_height') }) diff --git a/product/statusbar/src/main/ets/default/pages/control.ets b/product/statusbar/src/main/ets/default/pages/control.ets index c4918a5e..42619a57 100644 --- a/product/statusbar/src/main/ets/default/pages/control.ets +++ b/product/statusbar/src/main/ets/default/pages/control.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ControlCenterComponent from '../../../../../../../features/control/src/main/ets/com/ohos/control/pages/ControlCenter.ets' +import ControlCenterComponent from './ControlCenter.ets' import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets index d2e3c497..67768609 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -21,7 +21,7 @@ import ConfigReader from '../common/util/configReader.ets' import mNotificationService from '../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' import ControlCenterComponent from './control.ets' import Constants from './common/constants.ets' -import mBrightnessManager from '../../../../../../../features/control/src/main/ets/com/ohos/control/common/brightness/brightnessManager.ets'; +import mBrightnessManager from '../../../../../../../features/brightnesscomponent/src/main/ets/default/brightnessManager.ets'; import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets'; const TAG = 'StatusBar-Index' diff --git a/product/statusbar/src/main/ets/default/pages/notification.ets b/product/statusbar/src/main/ets/default/pages/notification.ets index d31f6bd3..ece86f96 100644 --- a/product/statusbar/src/main/ets/default/pages/notification.ets +++ b/product/statusbar/src/main/ets/default/pages/notification.ets @@ -23,7 +23,7 @@ import SignalIcon from '../../../../../../../features/signalcomponent/src/main/e import notificationItem from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets' import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' import mNotificationService from '../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' -import ConfigurableLayout from './ConfigurableLayout.ets'; + const TAG = 'StatusBar-notification' diff --git a/product/statusbar/src/main/resources/base/element/color.json b/product/statusbar/src/main/resources/base/element/color.json index 89fd5a1c..8c9f6a80 100644 --- a/product/statusbar/src/main/resources/base/element/color.json +++ b/product/statusbar/src/main/resources/base/element/color.json @@ -30,6 +30,9 @@ },{ "name": "twogroup_layout_background", "value": "#66000000" + },{ + "name": "title_font_color", + "value": "#FFF" } ] } \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/element/float.json b/product/statusbar/src/main/resources/base/element/float.json index 0cb9bc79..bdd031b6 100644 --- a/product/statusbar/src/main/resources/base/element/float.json +++ b/product/statusbar/src/main/resources/base/element/float.json @@ -67,6 +67,33 @@ { "name": "default_left_width_large", "value": "300" + },{ + "name": "up_title_height", + "value": "83" + },{ + "name": "center_item_margin_top", + "value": "20" + },{ + "name": "center_item_margin_left", + "value": "10" + },{ + "name": "center_item_margin_right", + "value": "10" + },{ + "name": "wifi_and_air_height", + "value": "120" + },{ + "name": "vol_height", + "value": "66" + },{ + "name": "title_font_size", + "value": "35" + },{ + "name": "notification_settings_width", + "value": "60" + },{ + "name": "notification_settings_height", + "value": "60" } ] } \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/element/string.json b/product/statusbar/src/main/resources/base/element/string.json index d9fd5260..4f850568 100644 --- a/product/statusbar/src/main/resources/base/element/string.json +++ b/product/statusbar/src/main/resources/base/element/string.json @@ -46,6 +46,12 @@ },{ "name": "nonotification_text", "value": "无通知" + },{ + "name": "control_library", + "value": "control_library" + },{ + "name": "control_center", + "value": "控制中心" } ] } \ No newline at end of file diff --git a/product/statusbar/src/main/resources/en_US/element/string.json b/product/statusbar/src/main/resources/en_US/element/string.json index 5959fa49..c3ada6c8 100644 --- a/product/statusbar/src/main/resources/en_US/element/string.json +++ b/product/statusbar/src/main/resources/en_US/element/string.json @@ -46,6 +46,12 @@ },{ "name": "nonotification_text", "value": "no notification" + },{ + "name": "control_library", + "value": "control_library" + },{ + "name": "control_center", + "value": "控制中心" } ] } \ No newline at end of file diff --git a/product/statusbar/src/main/resources/rawfile/layoutConfig.json b/product/statusbar/src/main/resources/rawfile/layoutConfig.json index e9324754..63c3c334 100644 --- a/product/statusbar/src/main/resources/rawfile/layoutConfig.json +++ b/product/statusbar/src/main/resources/rawfile/layoutConfig.json @@ -1,10 +1,14 @@ { "Groups": [ { "id": 1, - "Components": ["signal", "wifi", "notification"] + "Components": ["signal", "wifi", "notification"] }, { "id": 2, + "Components": ["empty"] + }, + { + "id": 3, "Components": ["battery", "clock"] } ] diff --git a/product/statusbar/src/main/resources/zh_CN/element/string.json b/product/statusbar/src/main/resources/zh_CN/element/string.json index d9fd5260..4f850568 100644 --- a/product/statusbar/src/main/resources/zh_CN/element/string.json +++ b/product/statusbar/src/main/resources/zh_CN/element/string.json @@ -46,6 +46,12 @@ },{ "name": "nonotification_text", "value": "无通知" + },{ + "name": "control_library", + "value": "control_library" + },{ + "name": "control_center", + "value": "控制中心" } ] } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 5b56641c..affd590b 100755 --- a/settings.gradle +++ b/settings.gradle @@ -13,6 +13,7 @@ * limitations under the License. */ include ':entry', ':product:navigationBar', ':common', ':product:statusbar', ':product:systemDialog', - ':features:control', ':features:batterycomponent', ':features:clockcomponent', - ':features:signalcomponent', ':features:wificomponent', ':features:navigationservice', - ':features:noticeitem', ':features:notificationservice' \ No newline at end of file + ':features:batterycomponent', ':features:clockcomponent',':features:signalcomponent', + ':features:wificomponent', ':features:navigationservice',':features:noticeitem', + ':features:notificationservice',':features:airplanecomponent',':features:brightnesscomponent', + ':features:volumecomponent' \ No newline at end of file -- Gitee From 58589c682374b66ce1e83cab5609286e68343c10 Mon Sep 17 00:00:00 2001 From: croy Date: Wed, 10 Nov 2021 10:17:46 +0800 Subject: [PATCH 034/373] modify Signed-off-by: croy --- .../statusbar/src/main/ets/default/pages/ControlCenter.ets | 4 ---- 1 file changed, 4 deletions(-) diff --git a/product/statusbar/src/main/ets/default/pages/ControlCenter.ets b/product/statusbar/src/main/ets/default/pages/ControlCenter.ets index 383d8da2..cc247a24 100644 --- a/product/statusbar/src/main/ets/default/pages/ControlCenter.ets +++ b/product/statusbar/src/main/ets/default/pages/ControlCenter.ets @@ -18,7 +18,6 @@ import AirPlaneComponent from "../../../../../../../features/airplanecomponent/s import WifiComponent from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiComponent.ets' import {MyBrightness} from '../../../../../../../features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets' import {MyVol} from '../../../../../../../features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets' -import mWifiManger from "../../../../../../../features/wificomponent/src/main/ets/default//WifiModel.ets" import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; import UniformConfig from '../../../../../../../common/src/main/ets/template/UniformConfig.ets' @@ -29,9 +28,6 @@ var mUniform; export default struct ControlCenterComponent { @Link showStatusBar: boolean - @StorageLink('flyModelStatus') flyModelStatus: boolean = false - @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = false - @StorageLink("mWifiOriginalStatus") mWifiOriginalStatus: boolean = false componentUniform = { iconOnBG: "#0A59F7", -- Gitee From aa35de45a92aa9c8676b757ae77255a1986cc837 Mon Sep 17 00:00:00 2001 From: croy Date: Wed, 10 Nov 2021 11:37:58 +0800 Subject: [PATCH 035/373] modify Signed-off-by: croy --- common/src/main/ets/template/iconComponent.ets | 1 + common/src/main/ets/template/iconTitleBase.ets | 1 + 2 files changed, 2 insertions(+) diff --git a/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/template/iconComponent.ets index ed072e0c..bf92233f 100644 --- a/common/src/main/ets/template/iconComponent.ets +++ b/common/src/main/ets/template/iconComponent.ets @@ -41,5 +41,6 @@ struct iconComponent { .objectFit(ImageFit.Contain) }.margin({ left: 10 }) } + .flexShrink(0) } } diff --git a/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/template/iconTitleBase.ets index d1310f98..3d9b8586 100644 --- a/common/src/main/ets/template/iconTitleBase.ets +++ b/common/src/main/ets/template/iconTitleBase.ets @@ -47,6 +47,7 @@ struct iconBaseComponent { changeSwitch: $changeSwitch, }) } + .flexShrink(0) .height('100%') .onClick(() => { console.log(`start clickEvent ${this.changeSwitch}`) -- Gitee From 3dacc4ad09863152f822cb2ef1d6a25f5aff4e1f Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Thu, 25 Nov 2021 19:10:54 +0800 Subject: [PATCH 036/373] =?UTF-8?q?[SystemUI]=E9=BB=98=E8=AE=A4=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=96=B9=E8=88=9F=E7=BC=96=E8=AF=91=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- entry/build.gradle | 1 - product/navigationBar/build.gradle | 1 - product/statusbar/build.gradle | 1 - product/systemDialog/build.gradle | 1 - 4 files changed, 4 deletions(-) diff --git a/entry/build.gradle b/entry/build.gradle index c214e8ad..1b66b0d4 100755 --- a/entry/build.gradle +++ b/entry/build.gradle @@ -4,7 +4,6 @@ ohos { defaultConfig { compatibleSdkVersion 4 } - arkEnabled false } dependencies { diff --git a/product/navigationBar/build.gradle b/product/navigationBar/build.gradle index db2bd14f..4a316c39 100644 --- a/product/navigationBar/build.gradle +++ b/product/navigationBar/build.gradle @@ -5,7 +5,6 @@ ohos { compatibleSdkVersion 4 } entryModules "entry" - arkEnabled false } dependencies { diff --git a/product/statusbar/build.gradle b/product/statusbar/build.gradle index bc4a10c9..0dca2920 100644 --- a/product/statusbar/build.gradle +++ b/product/statusbar/build.gradle @@ -5,7 +5,6 @@ ohos { compatibleSdkVersion 4 } entryModules "entry" - arkEnabled false } dependencies { diff --git a/product/systemDialog/build.gradle b/product/systemDialog/build.gradle index db2bd14f..4a316c39 100644 --- a/product/systemDialog/build.gradle +++ b/product/systemDialog/build.gradle @@ -5,7 +5,6 @@ ohos { compatibleSdkVersion 4 } entryModules "entry" - arkEnabled false } dependencies { -- Gitee From 81a4092105c8f79917d28b1b785595559799dae7 Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Thu, 25 Nov 2021 19:13:40 +0800 Subject: [PATCH 037/373] =?UTF-8?q?[SystemUI]=E9=80=9A=E7=9F=A5=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E5=88=A0=E9=99=A4=E7=9B=B8=E5=85=B3=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=87=BD=E6=95=B0err=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .../notificationservice/NotificationService.ets | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets index 191eacff..361665a0 100644 --- a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets +++ b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets @@ -90,10 +90,9 @@ export class NotificationService { /** * The callback method that will be called after receiving a notification * - * @param {Object} err - Error may occur. * @param {Object} data - Callback data. */ - consumeCallback(err, data) { + consumeCallback(data) { Log.showInfo(TAG, 'consumeCallback started'); Log.showInfo(TAG, 'sortingMap' + JSON.stringify(data.sortingMap||{})) Log.showInfo(TAG, JSON.stringify(data)); @@ -190,7 +189,7 @@ export class NotificationService { case Constants.GET_NEW_NOTIFICATION: this.removeNotificationItem(notificationItem['hashcode'], false); mNotificationList.unshift(notificationItem); -// mNotificationList.sort(this.compare('timestamp')); + //mNotificationList.sort(this.compare('timestamp')); this.updateNotification(); break; case Constants.GET_EXIST_NOTIFICATION: @@ -250,26 +249,24 @@ export class NotificationService { /** * notification CancelCallback * - * @param {Object} err - return err Message. * @param {Object} data - return data Message. */ - OnCancelCallback(err, data) { - console.info("===>OnCancelCallback data : ==> " + ` err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); + OnCancelCallback(data) { + console.info("===>OnCancelCallback data : ==> " + `data:${JSON.stringify(data)}`); this.removeNotificationItem(data.request.hashCode, false); } - onUpdateCallback(err, data) { + onUpdateCallback(data) { Log.showInfo(TAG, `onUpdateCallback = ${JSON.stringify(data.request)}`); } /** * The callback will be called after registered callback. * - * @param {Object} err - Error may occur. * @param {Object} data - Callback data. */ - subscribeCallback(err, data) { - Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + subscribeCallback(data) { + Log.showInfo(TAG, `subscribeCallback finished data: ${JSON.stringify(data)}`) } /** -- Gitee From 319569083aa47dfcfb48f7e24d87fc1ce4901473 Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Thu, 25 Nov 2021 19:57:10 +0800 Subject: [PATCH 038/373] =?UTF-8?q?[SystemUI]=E9=80=9A=E7=9F=A5=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E5=88=A0=E9=99=A4=E7=9B=B8=E5=85=B3=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=87=BD=E6=95=B0err=E5=8F=82=E6=95=B0=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .../ets/com/ohos/notificationservice/NotificationService.ets | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets index 361665a0..1b6d1da6 100644 --- a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets +++ b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets @@ -263,10 +263,11 @@ export class NotificationService { /** * The callback will be called after registered callback. * + * @param {Object} err - Error may occur. * @param {Object} data - Callback data. */ - subscribeCallback(data) { - Log.showInfo(TAG, `subscribeCallback finished data: ${JSON.stringify(data)}`) + subscribeCallback(err, data) { + Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) } /** -- Gitee From b36af54c850f9c82f88f665284a199c48cf9e603 Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Mon, 29 Nov 2021 20:22:49 +0800 Subject: [PATCH 039/373] =?UTF-8?q?[SystemUI]1.=E5=88=A0=E9=99=A4=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E5=87=BD=E6=95=B0=E5=88=A0=E9=99=A4=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E5=87=BD=E6=95=B0err=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .../com/ohos/notificationservice/NotificationService.ets | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets index 1b6d1da6..1341ddd1 100644 --- a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets +++ b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets @@ -307,8 +307,8 @@ export class NotificationService { removeAllNotifications() { mNotificationList = [] this.updateNotification() - NotificationManager.removeAll(TAG, (err, data) => { - Log.showInfo(TAG, `removeAll , err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + NotificationManager.removeAll(TAG, (data) => { + Log.showInfo(TAG, `removeAll , data: ${JSON.stringify(data)}`); }); } @@ -329,8 +329,8 @@ export class NotificationService { } removeSysNotificationItem(hashCode) { - NotificationManager.remove(TAG, hashCode, (err, data) => { - Log.showInfo(TAG, `removeNotificationItem, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + NotificationManager.remove(TAG, hashCode, (data) => { + Log.showInfo(TAG, `removeNotificationItem, data: ${JSON.stringify(data)}`); }) Log.showInfo(TAG, `removeNotificationItem end, length: ${mNotificationList.length}`); } -- Gitee From fd23b7d6211ef17769a16f48adf8f1fb4f6dc769 Mon Sep 17 00:00:00 2001 From: supeng Date: Wed, 29 Dec 2021 00:01:25 +0800 Subject: [PATCH 040/373] update SystemUI code Signed-off-by: supeng --- .gitignore | 5 + README_zh.md | 10 +- build.gradle | 5 +- common/src/main/config.json | 2 +- .../src/main/ets/default/DateAndTimeUtil.ets | 28 ++ .../src/main/ets/default/ReadConfigUtil.ets | 49 +++ .../PluginDataSourceAdapter.ets | 114 ++++++ .../PluginDataSourceManager.ets | 62 +++ .../ets/plugindatasource/common/Constants.ets | 58 +++ .../sourceloader/BaseMetaSourceLoader.ets | 214 +++++++++++ .../sourceloader/DataAbilitySourceLoader.ets | 31 ++ .../sourceloader/MetaSourceLoader.ets | 27 ++ .../sourceloader/PluginSourceLoader.ets | 40 ++ .../sourceloader/SourceLoader.ets | 42 +++ .../sourceloader/SourceLoaderFactory.ets | 72 ++-- .../src/main/ets/template/iconComponent.ets | 18 +- .../src/main/ets/template/iconTitleBase.ets | 20 +- entry/build.gradle | 4 +- features/airplanecomponent/.gitignore | 1 + features/airplanecomponent/build.gradle | 4 +- features/batterycomponent/.gitignore | 1 + features/batterycomponent/build.gradle | 4 +- .../src/main/ets/default/batteryModel.ets | 15 +- .../main/ets/default/pages/batteryIcon.ets | 8 +- features/brightnesscomponent/.gitignore | 1 + features/brightnesscomponent/build.gradle | 4 +- .../main/ets/default/brightnessManager.ets | 89 ++--- .../ets/default/pages/brightnessComponent.ets | 19 +- features/capsulecomponent/.gitignore | 1 + .../build.gradle | 4 +- .../capsulecomponent/src/main/config.json | 32 ++ .../main/ets/default}/common/constants.ets | 32 +- .../main/ets/default/model/CapsuleModel.ets | 67 ++++ .../main/ets/default/pages/CapsuleIcon.ets | 89 +++++ .../default/viewmodel/CapsuleViewModel.ets | 148 ++++++++ .../main/resources/base/element/color.json | 12 + .../main/resources/base/element/float.json | 31 ++ .../main/resources/base/element/string.json | 4 + .../base/media/ic_statusbar_phone.svg | 11 + .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + features/clockcomponent/.gitignore | 1 + features/clockcomponent/build.gradle | 4 +- .../src/main/ets/default/pages/clockIcon.ets | 40 +- .../src/main/ets/default/timeModel.ets | 33 +- features/controlcentercomponent/build.gradle | 19 + .../src/main/config.json | 23 ++ .../main/ets/com/ohos/common/Constants.ets | 26 ++ .../com/ohos/model/ControlCenterService.ets | 120 ++++++ .../com/ohos/pages/ComplexToggleComponent.ets | 103 +++++ .../com/ohos/pages/ControlCenterComponent.ets | 148 ++++++-- .../com/ohos/pages/SimpleToggleComponent.ets | 108 ++++++ .../src/main/ets/com/ohos}/pages/UpTitle.ets | 6 +- .../com/ohos/viewmodel/ControlCenterVM.ets | 140 +++++++ .../main/resources/base/element/color.json | 14 +- .../main/resources/base/element/float.json | 35 ++ .../main/resources/base/element/string.json | 8 + .../main/resources/base/media/ic_settings.png | Bin 0 -> 1060 bytes .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + features/managementcomponent/.gitignore | 1 + features/managementcomponent/build.gradle | 19 + .../src/main/config.json | 4 +- .../main/ets/com/ohos/common/constants.ets | 28 ++ .../com/ohos/model/bundleResourceModel.ets | 107 ++++++ .../ets/com/ohos/model/noDisturbingModel.ets | 55 +++ .../ohos/view/component/appItemComponent.ets | 122 ++++++ .../ohos/view/component/appLstComponent.ets | 91 +++++ .../com/ohos/view/component/headComponent.ets | 58 +++ .../com/ohos/view/component/itemComponent.ets | 56 +++ .../view/component/noDisturbComponent.ets | 77 ++++ .../ohos/view/component/slotItemComponent.ets | 68 ++++ .../ohos/view/component/slotLstComponent.ets | 95 +++++ .../ohos/view/component/switchComponent.ets | 79 ++++ .../com/ohos/vm/appLstComponentViewModel.ets | 34 ++ .../ohos/vm/noDisturbComponentViewModel.ets | 92 +++++ .../main/resources/base/element/color.json | 32 ++ .../main/resources/base/element/float.json | 216 +++++++++++ .../main/resources/base/element/string.json | 76 ++++ .../src/main/resources/base/media/ic_back.svg | 18 + .../base/media/ic_settings_arrow.svg | 28 ++ .../main/resources/en_US/element/string.json | 76 ++++ .../main/resources/zh_CN/element/string.json | 77 ++++ features/navigationservice/build.gradle | 4 +- .../ohos/navigationservice/KeyCodeEvent.ets | 35 +- features/noticeitem/.gitignore | 1 + features/noticeitem/build.gradle | 4 +- .../com/ohos/noticeItem/common/CommonUtil.ets | 38 ++ .../com/ohos/noticeItem/common/constants.ets | 53 ++- .../noticeItem/model/NotificationConfig.ets | 36 ++ .../noticeItem/model/NotificationManager.ets | 52 +++ .../noticeItem/model/NotificationService.ets | 135 +++++++ .../model/NotificationWindowManager.ets | 39 ++ .../ohos/noticeItem/model/ParseDataUtil.ets | 174 +++++++++ .../com/ohos/noticeItem/model/RuleData.ets | 21 ++ .../noticeItem/model/rule/RuleController.ets | 119 ++++++ .../view/NotificationListComponent.ets | 74 ++++ .../noticeItem/view/item/actionComponent.ets | 125 ++++++ .../noticeItem/{ => view}/item/basicItem.ets | 5 +- .../noticeItem/view/item/confirmDialog.ets | 80 ++++ .../noticeItem/{ => view}/item/longItem.ets | 3 +- .../noticeItem/{ => view}/item/multiItem.ets | 3 +- .../{ => view}/item/notificationItem.ets | 151 ++++---- .../ohos/noticeItem/view/item/pictureItem.ets | 53 +++ .../noticeItem/view/item/settingDialog.ets | 131 +++++++ .../noticeItem/{ => view}/item/titleItem.ets | 7 +- .../ohos/noticeItem/viewmodel/ViewModel.ets | 309 +++++++++++++++ .../main/resources/base/element/color.json | 28 ++ .../main/resources/base/element/float.json | 52 +++ .../main/resources/base/element/string.json | 36 ++ .../main/resources/base/media/ic_setting.png | Bin 0 -> 2788 bytes .../main/resources/en_US/element/string.json | 36 ++ .../resources/rawfile/notificationConfig.json | 8 + .../main/resources/zh_CN/element/string.json | 36 ++ .../NotificationService.ets | 355 ------------------ .../main/resources/base/element/string.json | 8 - features/signalcomponent/.gitignore | 1 + features/signalcomponent/build.gradle | 4 +- .../src/main/ets/default/pages/signalIcon.ets | 9 +- features/statusbarcomponent/build.gradle | 23 ++ .../statusbarcomponent/src/main/config.json | 23 ++ .../main/ets/com/ohos/common/Constants.ets | 38 ++ .../ets/com/ohos/model/StatusBarService.ets | 228 +++++++++++ .../ets/com/ohos/pages/IconItemComponent.ets | 103 +++++ .../ets/com/ohos/pages/StatusBarComponent.ets | 211 +++++++++++ .../ets/com/ohos/viewmodel/StatusBarVM.ets | 235 ++++++++++++ .../main/resources/base/element/color.json | 12 + .../main/resources/base/element/float.json | 8 + .../main/resources/base/element/string.json | 4 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 4 + .../main/resources/zh_CN/element/string.json | 4 + features/volumecomponent/.gitignore | 1 + features/volumecomponent/build.gradle | 4 +- .../src/main/ets/default/VolumeModel.ets | 62 ++- .../ets/default/pages/volumeComponent.ets | 60 ++- features/wificomponent/.gitignore | 1 + features/wificomponent/build.gradle | 4 +- infra/config_exts.gradle | 6 + product/navigationBar/.gitignore | 1 + product/navigationBar/build.gradle | 4 +- .../src/main/ets/default/pages/index.ets | 4 + product/notificationmanagement/.gitignore | 1 + .../build.gradle | 5 +- .../package.json | 0 .../src/main/config.json | 26 +- .../src/main/ets/default/app.ets | 4 +- .../src/main/ets/default/common/constants.ets | 23 ++ .../main/ets/default/pages/batchSetEnable.ets | 81 ++++ .../src/main/ets/default/pages/noDisturb.ets | 250 ++++++++++++ .../default/pages/notificationManagenment.ets | 97 +++++ .../src/main/ets/default/pages/setEnable.ets | 89 +++++ .../ets/default/vm/noDisturbViewModel.ets | 70 ++++ .../main/resources/base/element/color.json | 32 ++ .../main/resources/base/element/float.json | 80 ++++ .../main/resources/base}/element/string.json | 15 +- .../src/main/resources/base/media/ic_back.svg | 18 + .../base/media/ic_settings_arrow.svg | 28 ++ .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US}/element/string.json | 14 +- .../main/resources/zh_CN/element/string.json | 14 +- product/statusbar/.gitignore | 1 + product/statusbar/build.gradle | 10 +- product/statusbar/src/main/config.json | 10 - .../ets/default/pages/ConfigurableLayout.ets | 105 ------ .../ets/default/pages/common/constants.ets | 7 +- .../common/navigationEvent.ets} | 83 ++-- .../src/main/ets/default/pages/control.ets | 8 +- .../src/main/ets/default/pages/index.ets | 75 +++- .../main/ets/default/pages/notification.ets | 89 +---- .../default/workers/PluginDataSourceWorker.js | 82 ++++ .../main/resources/base/element/color.json | 10 +- .../main/resources/base/element/float.json | 31 -- .../main/resources/base/element/string.json | 9 - .../main/resources/en_US/element/string.json | 9 - .../rawfile/controlcentercomponentConfig.json | 19 + .../main/resources/rawfile/layoutConfig.json | 15 - .../rawfile/statusbarcomponentConfig.json | 40 ++ .../main/resources/zh_CN/element/string.json | 9 - .../src/main/ets/default/pages/index.ets | 173 --------- settings.gradle | 11 +- 182 files changed, 7350 insertions(+), 1305 deletions(-) create mode 100644 .gitignore create mode 100644 common/src/main/ets/default/DateAndTimeUtil.ets create mode 100644 common/src/main/ets/default/ReadConfigUtil.ets create mode 100644 common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets create mode 100644 common/src/main/ets/plugindatasource/PluginDataSourceManager.ets create mode 100644 common/src/main/ets/plugindatasource/common/Constants.ets create mode 100644 common/src/main/ets/plugindatasource/sourceloader/BaseMetaSourceLoader.ets create mode 100644 common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ets create mode 100644 common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ets create mode 100644 common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ets create mode 100644 common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ets rename product/systemDialog/src/main/ets/default/dialogModel.ets => common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ets (32%) create mode 100644 features/airplanecomponent/.gitignore create mode 100644 features/batterycomponent/.gitignore create mode 100644 features/brightnesscomponent/.gitignore create mode 100644 features/capsulecomponent/.gitignore rename features/{notificationservice => capsulecomponent}/build.gradle (73%) create mode 100644 features/capsulecomponent/src/main/config.json rename features/{notificationservice/src/main/ets/com/ohos/notificationservice => capsulecomponent/src/main/ets/default}/common/constants.ets (55%) create mode 100644 features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ets create mode 100644 features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets create mode 100644 features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ets create mode 100644 features/capsulecomponent/src/main/resources/base/element/color.json create mode 100644 features/capsulecomponent/src/main/resources/base/element/float.json create mode 100644 features/capsulecomponent/src/main/resources/base/element/string.json create mode 100644 features/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg create mode 100644 features/capsulecomponent/src/main/resources/en_US/element/string.json create mode 100644 features/capsulecomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/clockcomponent/.gitignore create mode 100644 features/controlcentercomponent/build.gradle create mode 100644 features/controlcentercomponent/src/main/config.json create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ets create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ets create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets rename product/statusbar/src/main/ets/default/pages/ControlCenter.ets => features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets (31%) create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets rename {product/statusbar/src/main/ets/default => features/controlcentercomponent/src/main/ets/com/ohos}/pages/UpTitle.ets (87%) create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ets rename {product/systemDialog => features/controlcentercomponent}/src/main/resources/base/element/color.json (30%) create mode 100644 features/controlcentercomponent/src/main/resources/base/element/float.json create mode 100644 features/controlcentercomponent/src/main/resources/base/element/string.json create mode 100644 features/controlcentercomponent/src/main/resources/base/media/ic_settings.png rename {product/systemDialog => features/controlcentercomponent}/src/main/resources/base/media/icon.png (100%) create mode 100644 features/controlcentercomponent/src/main/resources/en_US/element/string.json create mode 100644 features/controlcentercomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/managementcomponent/.gitignore create mode 100644 features/managementcomponent/build.gradle rename features/{notificationservice => managementcomponent}/src/main/config.json (77%) create mode 100644 features/managementcomponent/src/main/ets/com/ohos/common/constants.ets create mode 100644 features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ets create mode 100644 features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ets create mode 100644 features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets create mode 100644 features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets create mode 100644 features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets create mode 100644 features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets create mode 100644 features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets create mode 100644 features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets create mode 100644 features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets create mode 100644 features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets create mode 100644 features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ets create mode 100644 features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ets create mode 100644 features/managementcomponent/src/main/resources/base/element/color.json create mode 100644 features/managementcomponent/src/main/resources/base/element/float.json create mode 100644 features/managementcomponent/src/main/resources/base/element/string.json create mode 100644 features/managementcomponent/src/main/resources/base/media/ic_back.svg create mode 100644 features/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg create mode 100644 features/managementcomponent/src/main/resources/en_US/element/string.json create mode 100644 features/managementcomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/noticeitem/.gitignore create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets rename features/noticeitem/src/main/ets/com/ohos/noticeItem/{ => view}/item/basicItem.ets (86%) create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets rename features/noticeitem/src/main/ets/com/ohos/noticeItem/{ => view}/item/longItem.ets (90%) rename features/noticeitem/src/main/ets/com/ohos/noticeItem/{ => view}/item/multiItem.ets (91%) rename features/noticeitem/src/main/ets/com/ohos/noticeItem/{ => view}/item/notificationItem.ets (60%) create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets rename features/noticeitem/src/main/ets/com/ohos/noticeItem/{ => view}/item/titleItem.ets (89%) create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets create mode 100644 features/noticeitem/src/main/resources/base/media/ic_setting.png create mode 100644 features/noticeitem/src/main/resources/rawfile/notificationConfig.json delete mode 100644 features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets delete mode 100644 features/notificationservice/src/main/resources/base/element/string.json create mode 100644 features/signalcomponent/.gitignore create mode 100644 features/statusbarcomponent/build.gradle create mode 100644 features/statusbarcomponent/src/main/config.json create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ets create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ets create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ets create mode 100644 features/statusbarcomponent/src/main/resources/base/element/color.json create mode 100644 features/statusbarcomponent/src/main/resources/base/element/float.json create mode 100644 features/statusbarcomponent/src/main/resources/base/element/string.json create mode 100644 features/statusbarcomponent/src/main/resources/base/media/icon.png create mode 100644 features/statusbarcomponent/src/main/resources/en_US/element/string.json create mode 100644 features/statusbarcomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/volumecomponent/.gitignore create mode 100644 features/wificomponent/.gitignore create mode 100644 infra/config_exts.gradle create mode 100644 product/navigationBar/.gitignore create mode 100644 product/notificationmanagement/.gitignore rename product/{systemDialog => notificationmanagement}/build.gradle (58%) rename product/{systemDialog => notificationmanagement}/package.json (100%) rename product/{systemDialog => notificationmanagement}/src/main/config.json (65%) rename product/{systemDialog => notificationmanagement}/src/main/ets/default/app.ets (85%) create mode 100644 product/notificationmanagement/src/main/ets/default/common/constants.ets create mode 100644 product/notificationmanagement/src/main/ets/default/pages/batchSetEnable.ets create mode 100644 product/notificationmanagement/src/main/ets/default/pages/noDisturb.ets create mode 100644 product/notificationmanagement/src/main/ets/default/pages/notificationManagenment.ets create mode 100644 product/notificationmanagement/src/main/ets/default/pages/setEnable.ets create mode 100644 product/notificationmanagement/src/main/ets/default/vm/noDisturbViewModel.ets create mode 100644 product/notificationmanagement/src/main/resources/base/element/color.json create mode 100644 product/notificationmanagement/src/main/resources/base/element/float.json rename product/{systemDialog/src/main/resources/en_US => notificationmanagement/src/main/resources/base}/element/string.json (40%) create mode 100644 product/notificationmanagement/src/main/resources/base/media/ic_back.svg create mode 100644 product/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg create mode 100644 product/notificationmanagement/src/main/resources/base/media/icon.png rename product/{systemDialog/src/main/resources/base => notificationmanagement/src/main/resources/en_US}/element/string.json (40%) rename product/{systemDialog => notificationmanagement}/src/main/resources/zh_CN/element/string.json (40%) create mode 100644 product/statusbar/.gitignore delete mode 100644 product/statusbar/src/main/ets/default/pages/ConfigurableLayout.ets rename product/statusbar/src/main/ets/default/{common/util/configReader.ets => pages/common/navigationEvent.ets} (31%) create mode 100644 product/statusbar/src/main/ets/default/workers/PluginDataSourceWorker.js create mode 100644 product/statusbar/src/main/resources/rawfile/controlcentercomponentConfig.json delete mode 100644 product/statusbar/src/main/resources/rawfile/layoutConfig.json create mode 100644 product/statusbar/src/main/resources/rawfile/statusbarcomponentConfig.json delete mode 100644 product/systemDialog/src/main/ets/default/pages/index.ets diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..1f53d195 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.gradle +.idea +build +local.properties +signature/systemui_provision_verified.json \ No newline at end of file diff --git a/README_zh.md b/README_zh.md index 385abf6a..b12d6267 100755 --- a/README_zh.md +++ b/README_zh.md @@ -25,18 +25,24 @@ SystemUI应用是OpenHarmony中预置的系统应用,为用户提供系统相 ├── entry # entry模块目录 ├── signature # 证书文件目录 ├── features # 子组件目录 + │ ├── airplanecomponent # 飞行模式组件 │ ├── batterycomponent # 电池组件 + │ ├── brightnesscomponent # 亮度组件 + │ ├── capsulecomponent # 通知胶囊组件 │ ├── clockcomponent # 时间组件 - │ ├── control # 控制中心组件 + │ ├── controlcentercomponent # 控制中心组件 + │ ├── managementcomponent # 通知管理组件 │ ├── navigationservice # 导航栏服务组件 │ ├── noticeitem # 通知子组件 │ ├── notificationservice # 通知服务组件 │ ├── signalcomponent # sim卡信号组件 + │ ├── statusbarcomponent # 状态栏组件 + │ ├── volumecomponent # 音量组件 │ ├── wificomponent # wifi组件 ├── product # SystemUI总体功能目录 ├── navigationBar # 导航栏模块目录 ├── statusbar # 状态栏模块目录 - ├── systemDialog # 系统弹框模块目录 + ├── notificationmanagement # 通知管理模块目录 ``` ## 使用说明 diff --git a/build.gradle b/build.gradle index 95a4a89e..333f9a86 100755 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,11 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. apply plugin: 'com.huawei.ohos.app' +apply from: "./infra/config_exts.gradle" ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 6 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } supportSystem "standard" } diff --git a/common/src/main/config.json b/common/src/main/config.json index ab15a6e9..4c70dedb 100644 --- a/common/src/main/config.json +++ b/common/src/main/config.json @@ -16,7 +16,7 @@ ], "distro": { "deliveryWithInstall": true, - "moduleName": "commonutil", + "moduleName": "common", "moduleType": "har" } } diff --git a/common/src/main/ets/default/DateAndTimeUtil.ets b/common/src/main/ets/default/DateAndTimeUtil.ets new file mode 100644 index 00000000..d0392fa1 --- /dev/null +++ b/common/src/main/ets/default/DateAndTimeUtil.ets @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export class DateAndTimeUtil { + concatTime(hours, minutes) { + return `${this.fill(hours)}:${this.fill(minutes)}`; + }; + + fill(value) { + return (value > 9 ? "" : "0") + value; + }; +} + +let dateAndTimeUtil = new DateAndTimeUtil(); + +export default dateAndTimeUtil as DateAndTimeUtil diff --git a/common/src/main/ets/default/ReadConfigUtil.ets b/common/src/main/ets/default/ReadConfigUtil.ets new file mode 100644 index 00000000..587704de --- /dev/null +++ b/common/src/main/ets/default/ReadConfigUtil.ets @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2021 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 Log from './Log.ets'; +import FileIo from '@ohos.fileio'; + +const DFAULT_SIZE = 4096; +const CHAR_CODE_AT_INDEX = 0; +const TAG = 'ReadConfigUtil'; + +export class ReadConfigUtil { + ReadConfigFile(fileName) { + Log.showInfo(TAG, `readConfigFile fileName:${fileName}`); + try { + let stream = FileIo.createStreamSync(fileName, 'r'); + Log.showInfo(TAG, `readConfigFile stream:` + stream); + let buf = new ArrayBuffer(DFAULT_SIZE); + let len = stream.readSync(buf); + Log.showInfo(TAG, `readConfigFile len:` + len); + let arr = new Uint8Array(buf); + let charAt = ' '.charCodeAt(CHAR_CODE_AT_INDEX); + for (let i = len;i < DFAULT_SIZE; i++) { + arr[i] = charAt; + } + let content = String.fromCharCode.apply(null, arr); + stream.closeSync(); + Log.showInfo(TAG, `readConfigFile content:` + JSON.stringify(content)); + return JSON.parse(content); + } catch (error) { + Log.showInfo(TAG, `readConfigFile error:` + JSON.stringify(error)); + } + } +} + +let readConfigUtil = new ReadConfigUtil(); + +export default readConfigUtil as ReadConfigUtil diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets new file mode 100644 index 00000000..57d5e9f9 --- /dev/null +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2021 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 Log from '../default/Log.ets'; +import worker from '@ohos.worker'; +import Constants, {obtainMsg} from './common/Constants.ets'; + +const TAG = 'PluginDataSourceAdapter'; +const WORKER_JS_URL = 'workers/PluginDataSourceWorker.js'; + +export default class PluginDataSourceAdapter { + mWorker: any; + mName: any; + mListener: any; + + constructor(name: String) { + Log.showInfo(TAG, `constructor, name: ${name}`) + this.mName = name; + this.mWorker = new worker.Worker(WORKER_JS_URL, { + type: "classic", name: this.mName + }); + + this.mWorker.onmessage = this.onMessage.bind(this); + this.mWorker.onmessageerror = this.onMessageError.bind(this); + this.mWorker.onexit = this.onExit.bind(this); + this.mWorker.onerror = this.onError.bind(this); + } + + initDataSource(configs) { + Log.showInfo(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`) + this.mWorker.postMessage(obtainMsg(Constants.INIT_CONFIG, configs)); + } + + loadData() { + Log.showInfo(TAG, `loadData`) + this.mWorker.postMessage(obtainMsg(Constants.LOAD_DATA, {})); + } + + clearAll() { + Log.showInfo(TAG, `clearAll`) + this.mWorker.postMessage(obtainMsg(Constants.CLEAR_ALL, {})); + } + + onMessage(msg) { + Log.showInfo(TAG, `onMessage, msg: ${JSON.stringify(msg)}`) + let data = msg.data; + switch (data.action) { + case Constants.INIT_FINISH: + this.onInitFinish(); + break; + case Constants.ADD_ITEM: + this.onItemAdd(data.data); + break; + case Constants.REMOVE_ITEM: + this.onItemRemove(data.data); + break; + default: + Log.showError(TAG, `unknown type: ${JSON.stringify(msg)}`) + } + } + + onInitFinish() { + Log.showInfo(TAG, `onInitFinish`) + this.mListener.initFinish(); + } + + onItemAdd(itemData) { + Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`) + this.mListener.addItem(itemData); + } + + onItemRemove(itemData) { + Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`) + this.mListener.removeItem(itemData); + } + + registerListener(listener: { + 'initFinish': Function, + 'addItem': Function, + 'removeItem': Function + }) { + Log.showInfo(TAG, `registerListener`) + this.mListener = listener; + } + + unregisterListener() { + Log.showInfo(TAG, `mListener`) + this.mListener = null; + } + + onMessageError(event) { + Log.showInfo(TAG, `mWorker.onmessageerror, event: ${event}`) + }; + + onExit(code) { + Log.showInfo(TAG, `mWorker.onexit, code: ${code}`) + }; + + onError(err) { + Log.showInfo(TAG, `mWorker.onerror, err: ${JSON.stringify(err)}`) + }; +} diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ets b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ets new file mode 100644 index 00000000..6ba6b518 --- /dev/null +++ b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ets @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 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 Log from '../default/Log.ets'; +import SourceLoaderFactory from './sourceloader/SourceLoaderFactory.ets'; +import SourceLoader from './sourceloader/SourceLoader.ets'; + +const TAG = "PluginDataSourceManager"; + +export default class PluginDataSourceManager { + mLoaders: Map = new Map(); + + initDataSource(configs) { + Log.showInfo(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`); + let factory = new SourceLoaderFactory({ + 'add': this.onItemAdd.bind(this), + 'remove': this.onItemRemove.bind(this) + }); + for (let pluginType in configs) { + factory.getSourceLoader(pluginType, configs[pluginType], (sourceLoader) => { + Log.showInfo(TAG, `getSourceLoader callback`); + if (sourceLoader instanceof SourceLoader) { + this.mLoaders.set(pluginType, sourceLoader); + Log.showInfo(TAG, `getSourceLoader callback, plugin: ${pluginType} ${this.mLoaders.get(pluginType)}`); + } + }) + } + } + + onItemAdd(itemData) { + Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); + } + + onItemRemove(itemData) { + Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); + } + + clearAll() { + Log.showInfo(TAG, `clearAll`); + this.mLoaders.forEach((sourceLoader) => sourceLoader.stopLoad()); + this.mLoaders.clear(); + } + + loadData() { + Log.showInfo(TAG, `loadData`); + this.mLoaders.forEach((sourceLoader) => { + sourceLoader.loadData(); + }); + } +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/common/Constants.ets b/common/src/main/ets/plugindatasource/common/Constants.ets new file mode 100644 index 00000000..86218d6b --- /dev/null +++ b/common/src/main/ets/plugindatasource/common/Constants.ets @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2021 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 default class Constants { + static INIT_CONFIG = "initConfig"; + static INIT_FINISH = "initFinish"; + static CLEAR_ALL = "clearAll"; + static ADD_ITEM = "addItem"; + static REMOVE_ITEM = "removeItem"; + static LOAD_DATA = "loadData"; + static DEFAULT_USER_ID = 0; + static DEFAULT_BUNDLE_FLAG = 0x00000020 | 0x00000008; +} + +export enum PluginType { + SIMPLE = 1, + OBSERVER = 2, + LISTENER = 3, +} + +export function obtainMsg(action, data) { + return { "action": action, "data": data }; +} + +export class ItemComponentData { + id: string; + pluginType: number; + deviceId: string; + bundleName: string; + abilityName: string; + abilityLabelId: number; + abilityIconId: number; + label: string; + iconUrl: Resource | string; + template?: string; + state?: any; + actionData?: ActionData; +} + +export class ActionData { + clickAction?: string; + longClickAction?: string; + launchType?: number; + pluginData?: any; + extra?: any; +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/BaseMetaSourceLoader.ets b/common/src/main/ets/plugindatasource/sourceloader/BaseMetaSourceLoader.ets new file mode 100644 index 00000000..ec672226 --- /dev/null +++ b/common/src/main/ets/plugindatasource/sourceloader/BaseMetaSourceLoader.ets @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2021 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 bundleManager from "@ohos.bundle"; +import commonEvent from '@ohos.commonEvent'; +import Log from '../../default/Log.ets'; +import CheckEmptyUtils from '../../default/CheckEmptyUtils.ets'; +import SourceLoader from './SourceLoader.ets'; +import Constants, {ItemComponentData, ActionData} from '../common/Constants.ets'; + +const TAG = "BaseMetaSourceLoader"; + +let mCommonEventSubscribeInfo = { + events: [ + commonEvent.Support.COMMON_EVENT_PACKAGE_ADDED, + commonEvent.Support.COMMON_EVENT_PACKAGE_REMOVED, + commonEvent.Support.COMMON_EVENT_PACKAGE_CHANGED + ] +}; + +export default abstract class BaseMetaSourceLoader extends SourceLoader { + mAction: string = null; + mPermission: string = null; + mFilterIds: string[] = null; + mPluginType: number = null; + mItemComponentDatas: ItemComponentData[] = []; + mCommonEventSubscriber = null; + + constructor(config, channel, pluginType) { + super(channel); + Log.showInfo(TAG, `constructor, config: ${JSON.stringify(config)} channel: ${channel} pluginType: ${pluginType}`) + this.mPluginType = pluginType; + this.initSourceLoader(config); + } + + initSourceLoader(config) { + Log.showInfo(TAG, `init loader, config: ${JSON.stringify(config)}`) + + this.mAction = config.action; + this.mPermission = config.permission; + this.mFilterIds = config.filterIds; + + Log.showInfo(TAG, `init loader, mCommonEventSubscribeInfo: ${JSON.stringify(mCommonEventSubscribeInfo)}`) + commonEvent.createSubscriber( + mCommonEventSubscribeInfo, + this.createCommonEventSubscriberCallBack.bind(this) + ); + } + + stopLoad() { + Log.showInfo(TAG, `stop loader`) + this.unRegisterCommonEventListener(); + this.removeAllItemComponentData(); + } + + loadData() { + Log.showInfo(TAG, `load loader`) + this.removeAllItemComponentData(); + this.addAbilityItemComponentData({ + "action": this.mAction + }); + } + + createCommonEventSubscriberCallBack(err, data) { + Log.showInfo(TAG, `createCommonEventSubscriberCallBack, err: ${JSON.stringify(err)}`); + if (err.code != 0) { + return; + } + + this.mCommonEventSubscriber = data; + commonEvent.subscribe(this.mCommonEventSubscriber, this.procCommonEventSubscriberCallBack.bind(this)); + } + + procCommonEventSubscriberCallBack(err, data) { + Log.showInfo(TAG, `procCommonEventSubscriberCallBack, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + if (err.code != 0) { + return; + } + + let event = data.event; + let bundleName = data.bundleName; + if (event == commonEvent.Support.COMMON_EVENT_PACKAGE_CHANGED || event == commonEvent.Support.COMMON_EVENT_PACKAGE_REMOVED) { + this.removeItemComponentData(bundleName); + } + if (event == commonEvent.Support.COMMON_EVENT_PACKAGE_ADDED || event == commonEvent.Support.COMMON_EVENT_PACKAGE_CHANGED) { + this.addAbilityItemComponentData({ + "bundleName": bundleName, + "action": this.mAction + }); + } + } + + unRegisterCommonEventListener() { + Log.showInfo(TAG, 'unRegisterCommonEventListener') + commonEvent.unsubscribe(this.mCommonEventSubscriber, () => { + Log.showInfo(TAG, 'unRegisterCommonEventListener unregister Listener ==============='); + }); + } + + removeAllItemComponentData(): void{ + Log.showInfo(TAG, `removeAllItemComponentData`); + for (let itemComponentData of this.mItemComponentDatas) { + this.removeItem(itemComponentData); + } + this.mItemComponentDatas = []; + } + + addAbilityItemComponentData(want): void{ + Log.showInfo(TAG, `addAbilityItemComponentData, want: ${JSON.stringify(want)} BundleFlag: ${Constants.DEFAULT_BUNDLE_FLAG}`); + bundleManager.queryAbilityByWant(want, Constants.DEFAULT_BUNDLE_FLAG, Constants.DEFAULT_USER_ID, + (err, abilityInfos) => { + Log.showInfo(TAG, `addAbilityItemComponentData queryAbilityByWant callback, want: ${JSON.stringify(want)} err: ${JSON.stringify(err)} abilityInfos: ${abilityInfos.length} ${JSON.stringify(abilityInfos)} `) + if (err != 0) { + return; + } + for (let abilityInfo of abilityInfos) { + this.createItemComponentData(abilityInfo, (itemComponentData) => { + this.addItemComponentData(itemComponentData); + }); + } + Log.showInfo(TAG, `addAbilityItemComponentData, mItemComponentDatas: ${JSON.stringify(this.mItemComponentDatas)} `) + }); + } + + createItemComponentData(abilityInfo, callback: Function): void{ + Log.showInfo(TAG, `createItemComponentData, abilityInfo: ${JSON.stringify(abilityInfo)}`); + + let pluginData: any = null; + Log.showInfo(TAG, `abilityInfo.metaData: ${JSON.stringify(abilityInfo.metaData)}`); + if (abilityInfo.metaData) { + for (let index in abilityInfo.metaData) { + if (abilityInfo.metaData[index].name == this.mAction) { + Log.showInfo(TAG, `customizeData.extra: ${abilityInfo.metaData[index].extra}`); + pluginData = JSON.parse("{" + abilityInfo.metaData[index].extra + "}"); + break; + } + } + } + Log.showInfo(TAG, `createItemComponentData, pluginData: ${JSON.stringify(pluginData)}`); + if (!pluginData && parseInt(pluginData.pluginType) != this.mPluginType) { + return; + } + if (this.mFilterIds.indexOf(pluginData.id) < 0) { + return; + } + + let itemComponentData = new ItemComponentData(); + { + itemComponentData.id = pluginData.id; + itemComponentData.pluginType = this.mPluginType; + itemComponentData.deviceId = null; + itemComponentData.bundleName = abilityInfo.bundleName; + itemComponentData.abilityName = abilityInfo.name; + itemComponentData.abilityLabelId = abilityInfo.labelId; + itemComponentData.abilityIconId = abilityInfo.iconId; + if (!CheckEmptyUtils.isEmpty(pluginData.label)) { + itemComponentData.label = encodeURIComponent(pluginData.label); + } + if (!CheckEmptyUtils.isEmpty(pluginData.icon)) { + itemComponentData.iconUrl = pluginData.icon; + } + if (!CheckEmptyUtils.isEmpty(pluginData.template)) { + itemComponentData.template = pluginData.template; + } + { + let actionData = new ActionData(); + actionData.clickAction = pluginData.clickAction; + actionData.longClickAction = pluginData.longClickAction; + actionData.launchType = pluginData.launchType; + actionData.pluginData = pluginData.pluginData; + actionData.extra = pluginData.extra; + itemComponentData.actionData = actionData; + } + } + + Log.showInfo(TAG, `createItemComponentData, itemComponentData: ${JSON.stringify(itemComponentData)}`); + callback(itemComponentData); + } + + addItemComponentData(itemComponentData): void { + Log.showInfo(TAG, `addItemComponentData, itemComponentData: ${JSON.stringify(itemComponentData)} `); + this.addItem(itemComponentData); + this.mItemComponentDatas.push(itemComponentData); + } + + removeItemComponentData(bundleName): void { + Log.showInfo(TAG, `removeItemComponentData, bundleName: ${bundleName}`); + let deleteIndexs = []; + for (let i = 0;i < this.mItemComponentDatas.length; i++) { + if (this.mItemComponentDatas[i].bundleName == bundleName) { + deleteIndexs.push(i); + } + } + Log.showInfo(TAG, `removeItemComponentData, deleteIndexs: ${JSON.stringify(deleteIndexs)}`); + for (let i = (deleteIndexs.length - 1);i >= 0; i--) { + let itemComponentData = this.mItemComponentDatas[deleteIndexs[i]]; + this.removeItem(itemComponentData); + this.mItemComponentDatas.splice(deleteIndexs[i], 1); + } + Log.showInfo(TAG, `removeItemComponentData, mItemComponentDatas: ${JSON.stringify(this.mItemComponentDatas)}`); + } +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ets b/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ets new file mode 100644 index 00000000..d3254473 --- /dev/null +++ b/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ets @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021 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 Log from '../../default/Log.ets'; +import BaseMetaSourceLoader from './BaseMetaSourceLoader.ets'; +import {PluginType} from '../common/Constants.ets'; + +const TAG = "DataAbilitySourceLoader"; + +export default class DataAbilitySourceLoader extends BaseMetaSourceLoader { + // config = {"methodName":"xxx/xx/xx"} + + constructor(config, channel) { + super(config, channel, PluginType.OBSERVER); + Log.showInfo(TAG, `constructor, config: ${JSON.stringify(config)} channel: ${channel}`) + } + + // todo 启动监听,监听call方法,数据转换为ItemComponentData,通过addItem/removewItem传输 +} diff --git a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ets b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ets new file mode 100644 index 00000000..e897518c --- /dev/null +++ b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021 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 Log from '../../default/Log.ets'; +import BaseMetaSourceLoader from './BaseMetaSourceLoader.ets'; +import {PluginType} from '../common/Constants.ets'; + +const TAG = "MetaSourceLoader"; + +export default class MetaSourceLoader extends BaseMetaSourceLoader { + constructor(config, channel) { + super(config, channel, PluginType.SIMPLE); + Log.showInfo(TAG, `constructor, config: ${JSON.stringify(config)} channel: ${channel}`) + } +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ets b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ets new file mode 100644 index 00000000..01bd5c60 --- /dev/null +++ b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ets @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 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 Log from '../../default/Log.ets'; +import SourceLoader from './SourceLoader.ets'; + +const TAG = "PluginSourceLoader"; + +export default class PluginSourceLoader extends SourceLoader { + constructor(config, channel) { + super(channel); + this.initSourceLoader(config); + } + + initSourceLoader(config) { + Log.showInfo(TAG, `init loader, config: ${JSON.stringify(config)}`) + // todo 配置解析, config格式配置 + // todo 启动监听,数据转换为ItemComponentData,通过addItem/removewItem传输 + } + + stopLoad() { + // todo 停止监听,清除数据 + } + + loadData() { + // todo 重新获取一次数据 + } +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ets b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ets new file mode 100644 index 00000000..2707e4e6 --- /dev/null +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ets @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2021 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 Log from '../../default/Log.ets'; +import {ItemComponentData} from '../common/Constants.ets'; + +const TAG = "SourceLoader"; + +export default abstract class SourceLoader { + mChannel: any; + + constructor(channel) { + Log.showInfo(TAG, `constructor, channel: ${channel}`) + this.mChannel = channel; + } + + abstract stopLoad(): void; + + abstract loadData(): void; + + addItem(itemData: ItemComponentData) { + Log.showInfo(TAG, `addItem, itemData: ${JSON.stringify(itemData)}`) + this.mChannel.add(itemData); + } + + removeItem(itemData:ItemComponentData) { + Log.showInfo(TAG, `remove, itemData: ${JSON.stringify(itemData)}`) + this.mChannel.remove(itemData); + } +} \ No newline at end of file diff --git a/product/systemDialog/src/main/ets/default/dialogModel.ets b/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ets similarity index 32% rename from product/systemDialog/src/main/ets/default/dialogModel.ets rename to common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ets index 33c07c9d..55b437b6 100644 --- a/product/systemDialog/src/main/ets/default/dialogModel.ets +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ets @@ -13,51 +13,35 @@ * limitations under the License. */ -import FeatureAbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; -import Log from '../../../../../../common/src/main/ets/default/Log.ets'; - -const TAG = 'SystemDialog_SystemDialogCenter'; - -let listener; -let mFeatureAbilityManager = new FeatureAbilityManager(); - -export class DialogModel { - - /** - * Page listener registration - * - * @param {Object} callback - Function callback - */ - registerListener(callback) { - if (callback == null && callback == undefined) { - Log.showInfo(TAG, 'registerListener callback is null or undefined'); - return; - } - listener = callback; - mFeatureAbilityManager.getAbilityWant(listener) - } - - /** - * Page listener unregistration - */ - unregisterListener() { - listener = null; +import Log from '../../default/Log.ets'; +import DataAbilitySourceLoader from './DataAbilitySourceLoader.ets' +import MetaSourceLoader from './MetaSourceLoader.ets' +import PluginSourceLoader from './PluginSourceLoader.ets' + +const TAG = "SourceLoaderFactory"; + +const classMap = new Map([ + ["MetaSource", MetaSourceLoader], + ["PluginSourceLoader", PluginSourceLoader], + ["DataAbilitySourceLoader", DataAbilitySourceLoader] +]); + +export default class SourceLoaderFactory { + mChannel: any; + + constructor(channel: { + add: Function, + remove: Function + }) { + Log.showInfo(TAG, `constructor, channel: ${channel}`) + this.mChannel = channel; } - /** - * Return of the authority information selected by the user - * - * @param {Object} abilityResult - information selected by the user - */ - finishResult(abilityResult) { - if (Object.keys(abilityResult).length !== 0) { - Log.showInfo(TAG, `finishResult parameter ${JSON.stringify(abilityResult)}`); - mFeatureAbilityManager.finishAbilityWithResult(abilityResult); - } else { - Log.showInfo(TAG, 'finishResult abilityResult is a empty object'); + getSourceLoader(pluginType, config, callback) { + Log.showInfo(TAG, `getSourceLoader, pluginType: ${pluginType} config: ${JSON.stringify(config)}`) + if (!classMap.has(pluginType)) { + return; } + callback(new (classMap.get(pluginType))(config, this.mChannel)); } -} - -let mDialogModel = new DialogModel(); -export default mDialogModel as DialogModel; \ No newline at end of file +} \ No newline at end of file diff --git a/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/template/iconComponent.ets index bf92233f..afb9b6bf 100644 --- a/common/src/main/ets/template/iconComponent.ets +++ b/common/src/main/ets/template/iconComponent.ets @@ -13,8 +13,11 @@ * limitations under the License. */ +import Log from '../default/Log.ets'; import UniformConfig from './UniformConfig.ets' +const TAG= 'iconComponent.ets' + @Component export default struct iconComponent { @@ -22,21 +25,30 @@ struct iconComponent { private mConfig = UniformConfig.config; @State iconOff: any = "" @State iconOn: any = "" + @Prop iconOffStr: string + @Prop iconOnStr: string + private useIconStr = false @Link changeSwitch: boolean aboutToAppear() { - console.log(`------iconTitleBaseComponent ${this.changeSwitch} ${JSON.stringify(this.iconOff)} ${JSON.stringify(this.iconOn) }`) + Log.showInfo(TAG,`aboutToAppear, ${this.changeSwitch} ${JSON.stringify(this.iconOff)} ${JSON.stringify(this.iconOn)}`) + Log.showInfo(TAG,`aboutToAppear, useIconStr: ${this.useIconStr}`) + } + + aboutToDisappear () { + Log.showInfo(TAG,'aboutToDisappear') } + build() { Column() { Stack() { Flex() .backgroundColor(this.changeSwitch == false? this.mConfig.iconOffBG : this.mConfig.iconOnBG) - .clip(new Circle({ width: this.mConfig.circleWidth, height: this.mConfig.circleHeight })) + .clip(Circle({ width: this.mConfig.circleWidth, height: this.mConfig.circleHeight })) .width(this.mConfig.circleWidth) .height(this.mConfig.circleHeight) - Image(this.changeSwitch == false? this.iconOff: this.iconOn) + Image(this.changeSwitch == false? (this.useIconStr ? this.iconOffStr : this.iconOff): (this.useIconStr ? this.iconOnStr : this.iconOn)) .size({ width: this.mConfig.iconWidth, height: this.mConfig.iconHeight }) .objectFit(ImageFit.Contain) }.margin({ left: 10 }) diff --git a/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/template/iconTitleBase.ets index 3d9b8586..13fecedf 100644 --- a/common/src/main/ets/template/iconTitleBase.ets +++ b/common/src/main/ets/template/iconTitleBase.ets @@ -25,9 +25,13 @@ struct iconBaseComponent { private iconOn: any private iconOff: any - private mTitle: string = "None" + @State iconOffStr: string = "" + @State iconOnStr: string = "" + @State mTitle: string = "None" + private useIconStr = false private mConfig = UniformConfig.config; private mClickEvent: Function + private mLongClickEvent: Function @Link changeSwitch: boolean aboutToAppear() { @@ -42,8 +46,11 @@ struct iconBaseComponent { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { iconComponent({ + useIconStr: this.useIconStr, iconOff: this.iconOff, iconOn: this.iconOn, + iconOffStr: this.iconOffStr, + iconOnStr: this.iconOnStr, changeSwitch: $changeSwitch, }) } @@ -51,9 +58,18 @@ struct iconBaseComponent { .height('100%') .onClick(() => { console.log(`start clickEvent ${this.changeSwitch}`) - this.mClickEvent() + if(this.mClickEvent){ + this.mClickEvent() + } console.log(`end clickEvent ${this.changeSwitch}`) }) + .gesture(LongPressGesture({ repeat: false }).onAction(()=>{ + console.log(`start longClickEvent ${this.changeSwitch}`) + if(this.mLongClickEvent){ + this.mLongClickEvent() + } + console.log(`end longClickEvent ${this.changeSwitch}`) + })) Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Center }) { Text(this.mTitle) .fontSize(this.mConfig.titleSize) diff --git a/entry/build.gradle b/entry/build.gradle index 1b66b0d4..f1d235ec 100755 --- a/entry/build.gradle +++ b/entry/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.huawei.ohos.hap' ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 4 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } } diff --git a/features/airplanecomponent/.gitignore b/features/airplanecomponent/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/airplanecomponent/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/airplanecomponent/build.gradle b/features/airplanecomponent/build.gradle index 520bba63..e2d5bfb6 100644 --- a/features/airplanecomponent/build.gradle +++ b/features/airplanecomponent/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.huawei.ohos.library' ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 4 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } buildTypes { release { diff --git a/features/batterycomponent/.gitignore b/features/batterycomponent/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/batterycomponent/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/batterycomponent/build.gradle b/features/batterycomponent/build.gradle index 520bba63..e2d5bfb6 100644 --- a/features/batterycomponent/build.gradle +++ b/features/batterycomponent/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.huawei.ohos.library' ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 4 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } buildTypes { release { diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ets b/features/batterycomponent/src/main/ets/default/batteryModel.ets index 481c4377..02b0d11b 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ets +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ets @@ -33,7 +33,8 @@ export class BatteryModel { Log.showInfo(TAG, 'initBatteryModel'); mBatterySoc = AppStorage.SetAndLink('batterySoc', 0); mBatteryCharging = AppStorage.SetAndLink('batteryCharging', false); - if (mBatteryEventSubscriber == null) { + Log.showInfo(TAG, 'mBatteryEventSubscriber' + mBatteryEventSubscriber); + if (mBatteryEventSubscriber == null || mBatteryEventSubscriber == undefined) { this.registerBatteryListener(); } this.getBatteryStatus(); @@ -51,7 +52,7 @@ export class BatteryModel { Log.showInfo(TAG, 'registerBatteryListener start'); BatterySubscriber.createSubscriber( mBatteryEventSubscribeInfo, - this.createBatterySubscriberCallBack.bind(this) + this.createBatterySubscriberCallBack.bind(this) ); } @@ -79,14 +80,12 @@ export class BatteryModel { BatterySubscriber.subscribe(mBatteryEventSubscriber, this.batterySubscriberCallBack.bind(this)); } - /** * Callback of the events * * @param {Object} err - error returns from the caller * @param {Object} data - data returns from the caller */ - private batterySubscriberCallBack(err, data) { Log.showInfo(TAG, `batterySubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); if (err.code == 0) { @@ -103,7 +102,7 @@ export class BatteryModel { * Get battery status and remaining power */ private getBatteryStatus() { - Log.showInfo(TAG,'getBatteryStatus') + Log.showInfo(TAG, 'getBatteryStatus') let batterySoc = BatteryInfo.batterySOC; let batteryCharging = BatteryInfo.chargingStatus; if (null == batterySoc) { @@ -114,6 +113,9 @@ export class BatteryModel { // If the result is a negative number, set it as positive number. batterySoc = Math.abs(batterySoc) * Constants.PERCENT_NUMBER; } + + Log.showInfo(TAG, 'batterySoc = ' + batterySoc) + // Set the battery status as charging when there is no battery hardware this.checkBatteryStatus(batteryCharging, (result) => { let batteryStatus = result; @@ -149,4 +151,5 @@ export class BatteryModel { } let mBatteryModel = new BatteryModel(); -export default mBatteryModel as BatteryModel; + +export default mBatteryModel as BatteryModel; \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index c4fd85be..19446b13 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -19,7 +19,6 @@ import BatterySoc from './batterySoc' import Constants from '../common/constants.ets' import Log from '../../../../../../../common/src/main/ets/default/Log.ets' - const TAG = 'BatteryComponent-batteryIcon' @Component @@ -33,7 +32,6 @@ export default struct BatteryIcon { } aboutToDisappear() { - mBatteryModel.uninitBatteryModel(); Log.showInfo(TAG, 'aboutToDisappear'); } @@ -49,8 +47,8 @@ export default struct BatteryIcon { .width('70%') .height('100%') } - .width(Constants.WHOLE_CONTAINER_WIDTH * this.StatusCoefficient) - .height(Constants.WHOLE_CONTAINER_HEIGHT * this.StatusCoefficient) + .width(`${Constants.WHOLE_CONTAINER_WIDTH * this.StatusCoefficient}px`) + .height(`${Constants.WHOLE_CONTAINER_HEIGHT * this.StatusCoefficient}px`) .margin($r('app.float.whole_container_margin')) } -} +} \ No newline at end of file diff --git a/features/brightnesscomponent/.gitignore b/features/brightnesscomponent/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/brightnesscomponent/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/brightnesscomponent/build.gradle b/features/brightnesscomponent/build.gradle index 520bba63..e2d5bfb6 100644 --- a/features/brightnesscomponent/build.gradle +++ b/features/brightnesscomponent/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.huawei.ohos.library' ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 4 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } buildTypes { release { diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets index 506e3f6d..5675df3d 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets @@ -13,83 +13,60 @@ * limitations under the License. */ -import brightness from '@ohos.brightness'; import Log from '../../../../../../common/src/main/ets/default/Log.ets'; import commonEvent from '@ohos.commonEvent'; +import settings from '@ohos.settingsnapi'; +import featureAbility from '@ohos.ability.featureAbility'; +const SYSTEMUI_BRIGHTNESS = 'brightness'; const TAG = 'Control-brightnessManager'; -const EVENT = 'BRIGHTNESS_VALUE_SYSTEM_UI'; -let mCommonEventSubscribeInfo = { - events: ['BRIGHTNESS_VALUE'] -}; -let curValue = 10; -let mCommonEventSubscriber =null; var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 255); -export class brightnessManager{ +export class brightnessManager { + helper: any + uri: string - registerBrightnessListener() { - Log.showInfo(TAG, 'registerBrightnessListener status listener ==========='); - if(mCommonEventSubscriber == null){ - commonEvent.createSubscriber( - mCommonEventSubscribeInfo, - this.createBrightnessSubscriberCallBack.bind(this) - ); - } + init(): void{ + Log.showInfo(TAG, 'init'); + this.uri = settings.getUri(SYSTEMUI_BRIGHTNESS); + Log.showInfo(TAG, 'settings geturi of brightness is ' + this.uri); + this.helper = featureAbility.acquireDataAbilityHelper(this.uri); + this.getValue(); } - createBrightnessSubscriberCallBack(err, data) { - Log.showInfo(TAG, `createBrightnessSubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - mCommonEventSubscriber = data; - commonEvent.subscribe(mCommonEventSubscriber, this.BrightnessSubscriberCallBack.bind(this)); + registerBrightness() { + this.helper.on("dataChange", this.uri, (err) => { + let data = settings.getValue(this.helper, SYSTEMUI_BRIGHTNESS, '100') + Log.showInfo(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); + mBrightnessValue.set(parseInt(data)); + }) } - BrightnessSubscriberCallBack(err, data) { - Log.showInfo(TAG,`BrightnessSubscriberCallBack, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - if (err.code == 0) { - if(data.data == '-1'){ - this.sendEvent(mBrightnessValue.get()); - }else{ - Log.showInfo(TAG, `BrightnessSubscriberCallBack set${parseInt(data.data)}`); - mBrightnessValue.set(parseInt(data.data)); - Log.showInfo(TAG, `BrightnessSubscriberCallBack set${mBrightnessValue.get()}`); - } - }else{ - Log.showInfo(TAG,'Subscriberregister error when subscribing ========'); - } + unRegisterBrightness() { + this.helper.off("dataChange", this.uri, (err) => { + Log.showInfo(TAG, `unregister brightness helper`); + }) } - unRegisterBrightnessListener() { - Log.showInfo(TAG,'unRegisterBrightnessListener') - commonEvent.unsubscribe(mCommonEventSubscriber, () => { - Log.showInfo(TAG, 'Subscriberregister unregister Brightness Status Listener ==============='); - }); + getValue() { + Log.showInfo(TAG, 'getValue'); + let data = settings.getValue(this.helper, SYSTEMUI_BRIGHTNESS, '100'); + Log.showInfo(TAG, `settings getValue ${parseInt(data)}`); + mBrightnessValue.set(parseInt(data)); } setValue(callback) { Log.showInfo(TAG, 'setValue'); let value = parseInt(callback.value); - Log.showInfo(TAG, `setValue ${ value }`); + Log.showInfo(TAG, `setValue ${value}`); mBrightnessValue.set(value); - this.sendEvent(mBrightnessValue.get().toString()); - brightness.setValue(value); - Log.showInfo(TAG, `setValue ${ value } end`); - } - - sendEvent(value){ - Log.showInfo(TAG, `sendEvent value: ${ value }`); - Log.showInfo(TAG, `sendEvent ${ value }`); - let commonEventPublishData = { - bundleName: 'com.ohos.systemui', - code:1, - data: value - } - commonEvent.publish(EVENT,commonEventPublishData,(err,data)=> { - console.log(`sendEvent err ${JSON.stringify(err)}`); - console.log(`sendEvent data ${JSON.stringify(data)}`); - }); + Log.showInfo(TAG, `brightness setValue ${value} end`); + settings.setValue(this.helper, SYSTEMUI_BRIGHTNESS, callback.value.toString()); + Log.showInfo(TAG, `settings setValue ${callback.value} end`); } } + let mBrightnessManager = new brightnessManager(); + export default mBrightnessManager as brightnessManager; \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets index 8e39befc..a32bb022 100644 --- a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets +++ b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets @@ -20,8 +20,7 @@ import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; const TAG = 'Control-brightnessComponent' @Component -export -struct MyBrightness { +export struct MyBrightness { @StorageLink('BrightnessValue') brightnessValue: number = 0; @State brightnessItem: any = { min: 0, @@ -31,10 +30,13 @@ struct MyBrightness { aboutToAppear() { Log.showInfo(TAG, `Brightness aboutToAppear ${JSON.stringify(this.brightnessItem)}`); + mBrightnessManager.init(); + mBrightnessManager.registerBrightness(); } - aboutToDisappear (){ - Log.showInfo(TAG,'aboutToDisappear') + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') + mBrightnessManager.unRegisterBrightness(); } setBrightness(value) { @@ -44,7 +46,7 @@ struct MyBrightness { build() { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - Column({useAlign:HorizontalAlign.Center}) { + Column() { Text($r('app.string.brightness_text')) .fontSize($r('app.float.control_common_font_size')) .alignSelf(ItemAlign.Center) @@ -60,15 +62,16 @@ struct MyBrightness { max: this.brightnessItem.max, step: 1, style: SliderStyle.INSET + }) .width('100%') .blockColor(Color.Blue) .trackColor(Color.Grey) .selectedColor(Color.Blue) .onChange((value: number) => { - this.brightnessItem.value = value; - this.setBrightness(this.brightnessItem); - }) + this.brightnessItem.value = value; + this.setBrightness(this.brightnessItem); + }) } .width('85%') } diff --git a/features/capsulecomponent/.gitignore b/features/capsulecomponent/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/capsulecomponent/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/notificationservice/build.gradle b/features/capsulecomponent/build.gradle similarity index 73% rename from features/notificationservice/build.gradle rename to features/capsulecomponent/build.gradle index 1dba0fa5..ae402d92 100644 --- a/features/notificationservice/build.gradle +++ b/features/capsulecomponent/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.huawei.ohos.library' ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 4 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } buildTypes { release { diff --git a/features/capsulecomponent/src/main/config.json b/features/capsulecomponent/src/main/config.json new file mode 100644 index 00000000..cf592c99 --- /dev/null +++ b/features/capsulecomponent/src/main/config.json @@ -0,0 +1,32 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.capsulecomponent", + "deviceType": [ + "phone" + ], + "reqPermissions": [{ + "name": "ohos.permission.COMMONEVENT_STICKY", + "reason": "Obtain the required permission", + "usedScene": { + "ability": [ + ".MainAbility" + ], + "when": "inuse" + } + }], + "distro": { + "deliveryWithInstall": true, + "moduleName": "capsulecomponent", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets b/features/capsulecomponent/src/main/ets/default/common/constants.ets similarity index 55% rename from features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets rename to features/capsulecomponent/src/main/ets/default/common/constants.ets index 8f1432f4..60fe5aa2 100644 --- a/features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets +++ b/features/capsulecomponent/src/main/ets/default/common/constants.ets @@ -12,29 +12,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + export default class Constants { - static GET_NEW_NOTIFICATION: number = 0; - static GET_EXIST_NOTIFICATION: number = 1; + static STATIC_BAR_ICON_WIDTH = 24; + static STATIC_BAR_ICON_HEIGHT = 24 ; + static TOUCH_TYPE_DOWN: number = 0; + static TOUCH_TYPE_UP: number = 1; + static TOUCH_TYPE_MOVE: number = 2; + static DEFAULT_MAX_LINES: number= 1; + static CAPSULE_HEIGHT_MULTIPLE = 2; } - -export interface NotificationItemData{ - id:string; - hashcode:string; - contentType:string; - timestamp:string; - time:string; - name:string; - want:any; - actionButtons:any[]; - bundleName:string; - smallIcon?:Resource|string; - largeIcon?:Resource|string; - title?:string; - text?:string; - additionalText?:string; - briefText?:string; - expandedTitle?:string; - longText?:string; - lines?:any[]; - longTitle?:string; -} \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ets b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ets new file mode 100644 index 00000000..eeaa2e07 --- /dev/null +++ b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ets @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2021 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 commonEvent from '@ohos.commonEvent'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' + +const TAG = 'CapsuleModel'; + +let commonEventSubscribeInfo = { + events: ['CAPSULE_VALUE_SYSTEM_UI'] +}; +let commonEventSubscriber = null; + +export class CapsuleModel { + mCallback: any; + + registerCallback(callback) { + Log.showInfo(TAG, 'registerCallback'); + this.mCallback = callback; + if (commonEventSubscriber == null) { + commonEvent.createSubscriber( + commonEventSubscribeInfo, + this.createCapsuleSubscriberCallBack.bind(this) + ); + } + } + + createCapsuleSubscriberCallBack(err, data) { + commonEventSubscriber = data; + commonEvent.subscribe(commonEventSubscriber, (err, data) => { + Log.showInfo(TAG, `createCapsuleSubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + if (err.code == 0) { + const processingData = JSON.parse(data.data); + if (processingData) { + Log.showInfo(TAG, `createCapsuleSubscriberCallBack processingData: ${JSON.stringify(processingData)} `); + this.mCallback.onStateChange(processingData); + } + } else { + Log.showError(TAG, 'date is err'); + } + }); + } + + unregisterCallback() { + if (commonEventSubscriber != null) { + commonEvent.unsubscribe(commonEventSubscriber, () => { + Log.showInfo(TAG, 'Subscriberregister unregister Capsule Status Listener ==============='); + }); + } + } +} + +let mCapsuleModel = new CapsuleModel(); + +export default mCapsuleModel as CapsuleModel; \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets new file mode 100644 index 00000000..34c0fb27 --- /dev/null +++ b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets' +import CapsuleViewModel, {VIEW_MODEL_ID, CallType} from '../viewmodel/CapsuleViewModel.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' + +const TAG = "CapsuleIcon"; + +@Component +export default struct CapsuleIcon { + @StorageLink(VIEW_MODEL_ID) mCapsuleViewModel: CapsuleViewModel = CapsuleViewModel.getInstance(); + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + startX: number = 0 + startY: number = 0 + moveX: number = 0 + moveY: number = 0 + + aboutToAppear() { + this.mCapsuleViewModel.initViewModel(); + Log.showInfo(TAG, 'aboutToAppear, text: ' + this.mCapsuleViewModel.mText); + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear'); + } + + build() { + Row() { + Image($r("app.media.ic_statusbar_phone")) + .width($r("app.float.ic_statusbar_phone_width")) + .height($r("app.float.ic_statusbar_phone_height")) + .objectFit(ImageFit.Contain) + .margin({ left: $r("app.float.green_capsule_margin") }) + Text(this.mCapsuleViewModel.mText) + .fontSize($r("app.float.green_capsule_font_size")) + .fontWeight(FontWeight.Regular) + .fontColor($r('app.color.green_capsule_text_color')) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .margin({ + left: $r("app.float.green_capsule_text_margin"), + right: $r("app.float.green_capsule_margin"), + top: $r("app.float.green_capsule_text_margin"), + bottom: $r("app.float.green_capsule_text_margin") + }) + } + .alignItems(VerticalAlign.Center) + .margin({ left: $r("app.float.green_capsule_left_margin") }) + .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient * Constants.CAPSULE_HEIGHT_MULTIPLE) + .backgroundColor($r('app.color.background_color')) + .borderRadius($r('app.float.green_capsule_radius')) + .visibility(this.mCapsuleViewModel.mIsBackground ? Visibility.Visible : Visibility.Hidden) + .onTouch(this.touchEvent.bind(this)) + } + + touchEvent(event: TouchEvent) { + Log.showInfo(TAG, `touchEventtouchEventtouchEvent`) + if (event.type == Constants.TOUCH_TYPE_DOWN) { + this.startX = event.touches[0].screenX; + this.startY = event.touches[0].screenY; + this.moveX = 0; + this.moveY = 0; + Log.showInfo(TAG, `touchStart2=======startX: ${this.startX}, startY: ${this.startY}`); + } else if (event.type == Constants.TOUCH_TYPE_MOVE) { + this.moveX = event.touches[0].screenX - this.startX; + this.moveY = event.touches[0].screenY - this.startY; + } else if (event.type == Constants.TOUCH_TYPE_UP) { + Log.showInfo(TAG, `touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`); + if (this.moveX < 5 && this.moveX > -5 && this.moveY < 5 && this.moveY > -5) { + event.stopPropagation(); + this.mCapsuleViewModel.onClickEvent(); + this.mCapsuleViewModel.mIsBackground = false; + } + } + } +} \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ets b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ets new file mode 100644 index 00000000..6999828a --- /dev/null +++ b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ets @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2021 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 CapsuleModel from '../model/CapsuleModel.ets' +import FeatureAbility from '@ohos.ability.featureAbility'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Rsm from '@ohos.resourceManager'; + +let sCapsuleViewModel; + +const SEC_VAL = 1000; +const MIN_VAL = 60 * SEC_VAL; +const TAG = "CapsuleViewModel"; + +function fixInteger(num) { + return (num >= 10) ? String(num) : '0' + num; +} + +function parseTime(num) { + return fixInteger(Math.floor(num / MIN_VAL)) + ":" + fixInteger(Math.floor((num % MIN_VAL) / SEC_VAL); +} + +export const VIEW_MODEL_ID = "CapsuleViewModelVm"; + +export enum CallType { + NO_CALL, + WAIT_CALL, + ON_CALL, +} + +export default class CapsuleViewModel { + mText: string = "00:00"; + mStartTime: number = 0; + mCallType: CallType = CallType.NO_CALL; + mIsBackground: boolean = false; + mWantBundleName: string = ""; + mWantAbilityName: string = ""; + mTimeMeter: any; + mCallback: any; + + initViewModel() { + this.mCallback = { + "onStateChange": this.onStateChange.bind(this) + } + CapsuleModel.registerCallback(this.mCallback); + } + + onStateChange(data) { + Log.showInfo(TAG, `onStateChange, data: ${JSON.stringify(data)}`); + this.mIsBackground = data.isBackground; + this.mWantBundleName = data.wantBundleName; + this.mWantAbilityName = data.wantAbilityName; + if (data.callType == CallType.WAIT_CALL) { + this.mStartTime = 0; + let id = JSON.parse(JSON.stringify($r("app.string.incoming_call"))).id; + let resourceMgr = Rsm.getResourceManager('com.ohos.systemui'); + resourceMgr.then((result) => { + result.getString(id).then((resource) => { + this.mText = resource; + Log.showInfo(TAG, 'getStringById resource : ' + resource); + }) + .catch((err) => { + Log.showInfo(TAG, 'getStringById err : ' + JSON.stringify(err)); + }); + }); + } else if (data.callType == CallType.ON_CALL) { + clearTimeout(this.mTimeMeter); + if (this.mCallType != CallType.ON_CALL) { + this.mStartTime = new Date().valueOf(); + } + this.mCallType = data.callType; + + let startTime; + let commonTimeDiff = new Date().valueOf() - data.startTime; + let localTimeDiff = new Date().valueOf() - this.mStartTime; + if (commonTimeDiff < 0) { + if (localTimeDiff < 0) { + startTime = new Date().valueOf(); + } else { + startTime = this.mStartTime; + } + } else { + startTime = data.startTime; + } + + this.startUpdateTime(startTime); + } else { + clearTimeout(this.mTimeMeter); + this.mStartTime = 0; + this.mIsBackground = false; + this.mText = ""; + Log.showInfo(TAG, `cannot show`); + } + this.mCallType = data.callType; + } + + startUpdateTime(startTime) { + if (!this.mIsBackground || this.mCallType != CallType.ON_CALL) { + return; + } + let val = new Date().valueOf() - startTime.valueOf(); + if (val < 0) { + val = 0; + } + this.mText = parseTime(val); + this.mTimeMeter = setTimeout(() => { + this.startUpdateTime(startTime); + }, 1000 - val % 1000); + } + + onClickEvent() { + if (this.mIsBackground) { + this.mIsBackground = false; + } + Log.showInfo(TAG, `onClickEvent `); + let result = FeatureAbility.startAbility({ + want: { + bundleName: this.mWantBundleName, + abilityName: this.mWantAbilityName + } + }) + .then(data => + Log.showInfo(TAG, `onClickEvent promise then: ${JSON.stringify(data)}`)) + .catch(error => + Log.showError(TAG, `onClickEvent promise catch: ${JSON.stringify(error)}`)); + Log.showInfo(TAG, `onClickEvent openAbility result: ${result}`); + } + + static getInstance() { + if (sCapsuleViewModel == null) { + sCapsuleViewModel = new CapsuleViewModel(); + AppStorage.SetAndLink(VIEW_MODEL_ID, sCapsuleViewModel); + } + return sCapsuleViewModel; + } +} \ No newline at end of file diff --git a/features/capsulecomponent/src/main/resources/base/element/color.json b/features/capsulecomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..8541aba8 --- /dev/null +++ b/features/capsulecomponent/src/main/resources/base/element/color.json @@ -0,0 +1,12 @@ +{ + "color": [ + { + "name": "background_color", + "value": "#64BB5C" + }, + { + "name" : "green_capsule_text_color", + "value" : "#ccFFFFFF" + } + ] +} \ No newline at end of file diff --git a/features/capsulecomponent/src/main/resources/base/element/float.json b/features/capsulecomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..563c6443 --- /dev/null +++ b/features/capsulecomponent/src/main/resources/base/element/float.json @@ -0,0 +1,31 @@ +{ + "float": [ + { + "name": "green_capsule_font_size", + "value": "24" + }, { + "name": "green_capsule_radius", + "value": "25" + }, + { + "name": "green_capsule_margin", + "value": "16" + }, + { + "name" : "green_capsule_text_margin", + "value" : "4" + }, + { + "name" : "green_capsule_left_margin", + "value" : "5" + }, + { + "name": "ic_statusbar_phone_width", + "value": "30" + }, + { + "name": "ic_statusbar_phone_height", + "value": "30" + } + ] +} \ No newline at end of file diff --git a/features/capsulecomponent/src/main/resources/base/element/string.json b/features/capsulecomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..bc311734 --- /dev/null +++ b/features/capsulecomponent/src/main/resources/base/element/string.json @@ -0,0 +1,4 @@ +{ + "string": [ + ] +} \ No newline at end of file diff --git a/features/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg b/features/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg new file mode 100644 index 00000000..a6bac17a --- /dev/null +++ b/features/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/features/capsulecomponent/src/main/resources/en_US/element/string.json b/features/capsulecomponent/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..a97527e4 --- /dev/null +++ b/features/capsulecomponent/src/main/resources/en_US/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "incoming_call", + "value": "Incoming call" + } + ] +} \ No newline at end of file diff --git a/features/capsulecomponent/src/main/resources/zh_CN/element/string.json b/features/capsulecomponent/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..96a9b595 --- /dev/null +++ b/features/capsulecomponent/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "incoming_call", + "value": "来电" + } + ] +} \ No newline at end of file diff --git a/features/clockcomponent/.gitignore b/features/clockcomponent/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/clockcomponent/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/clockcomponent/build.gradle b/features/clockcomponent/build.gradle index 1dba0fa5..ae402d92 100644 --- a/features/clockcomponent/build.gradle +++ b/features/clockcomponent/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.huawei.ohos.library' ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 4 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } buildTypes { release { diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index b75563a4..f5705271 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -15,16 +15,50 @@ import timeModel from '../timeModel.ets' import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import featureAbility from '@ohos.ability.featureAbility' +import settings from '@ohos.settingsnapi'; + const TAG = 'ClockComponent-clockIcon'; +const LOOP_TIME = 20000; + @Component export default struct ClockIcon { - @StorageLink('time') mTime: string = '16:01' + isUsing24hFormat: boolean aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); - timeModel.initTimeModel(); + timeModel.initTimeModel(this.isUsing24hFormat); + var isOnChange: boolean = false; + var timeInterval = setInterval(() => { + if (isOnChange) { + return; + } + Log.showInfo(TAG, 'setInterval') + let urivar = settings.getUri('settings.time.format') + Log.showInfo(TAG, 'urivar = ' + urivar) + let helper = featureAbility.acquireDataAbilityHelper(urivar); + Log.showInfo(TAG, ' helper = ' + helper) + helper.on("dataChange", urivar, (err) => { + if (err.code !== 0) { + Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); + return; + } else { + let getRetValue = settings.getValue(helper, 'settings.time.format', '24') + Log.showInfo(TAG, 'observer reveive notifychange on success format = ' + getRetValue) + if (getRetValue === '12') { + isOnChange = true; + this.isUsing24hFormat = false; + } else if (getRetValue === '24') { + isOnChange = true; + this.isUsing24hFormat = true; + } + timeModel.initTimeModel(this.isUsing24hFormat); + } + Log.showInfo(TAG, 'observer reveive notifychange on success data : ' + JSON.stringify(err)) + }) + }, LOOP_TIME); } aboutToDisappear() { @@ -33,7 +67,7 @@ export default struct ClockIcon { } build() { - Flex({alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center}) { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Text(this.mTime) .fontColor($r('app.color.clock_text_color')) .fontSize($r('app.float.clock_fontsize')) diff --git a/features/clockcomponent/src/main/ets/default/timeModel.ets b/features/clockcomponent/src/main/ets/default/timeModel.ets index ad1c4cef..17b0176b 100644 --- a/features/clockcomponent/src/main/ets/default/timeModel.ets +++ b/features/clockcomponent/src/main/ets/default/timeModel.ets @@ -13,6 +13,8 @@ * limitations under the License. */ import Log from '../../../../../../common/src/main/ets/default/Log.ets' +import featureAbility from '@ohos.ability.featureAbility' +import settings from '@ohos.settingsnapi'; const SHORT_LENGTH = 1; const LOOP_TIME = 3000; @@ -24,7 +26,7 @@ var mTimeLink; var mDayLink; var mWeekDayLink; var mMonthLink; - +var misUsing24hFormat: boolean; export class TimeModel { @@ -32,9 +34,16 @@ export class TimeModel { * Init Time Model * */ - initTimeModel() { - Log.showInfo(TAG, 'initTimeModel'); + initTimeModel(isUsing24hFormat: boolean) { + Log.showInfo(TAG, 'initTimeModel' + isUsing24hFormat); + var reFresh: boolean = (misUsing24hFormat === isUsing24hFormat); + misUsing24hFormat = isUsing24hFormat; Log.showInfo(TAG, `timeInterval : ${timeInterval} type: ${typeof timeInterval}`); + if (!reFresh) { + let date = new Date(); + Log.showInfo(TAG, `getCurrentDate ${date.toTimeString()}`); + this.updateTime(date); + } if (timeInterval === null || timeInterval === undefined) { Log.showInfo(TAG, 'first initTimeModel'); mTimeLink = AppStorage.SetAndLink('time', ''); @@ -61,7 +70,7 @@ export class TimeModel { }, LOOP_TIME); } - private getDate(){ + private getDate() { Log.showInfo(TAG, 'getDate'); let date = new Date(); Log.showInfo(TAG, `getCurrentDate ${date.toTimeString()}`); @@ -80,9 +89,18 @@ export class TimeModel { * * @param {Object} date - Object of Date. */ - private updateTime(date) { - let time = date.toTimeString().substring(0, 5); - mTimeLink.set(time); + private updateTime(dateTime) { + let hours = dateTime.getHours(); + Log.showInfo(TAG, 'updateTime' + misUsing24hFormat); + if (!misUsing24hFormat && hours > 12) { + hours = hours % 12; + } + let minutes = dateTime.getMinutes(); + mTimeLink.set(`${this.fill(hours)}:${this.fill(minutes)}`); + } + + fill(value) { + return (value > 9 ? "" : "0") + value; } /** @@ -117,4 +135,5 @@ export class TimeModel { } let timeModel = new TimeModel(); + export default timeModel as TimeModel; \ No newline at end of file diff --git a/features/controlcentercomponent/build.gradle b/features/controlcentercomponent/build.gradle new file mode 100644 index 00000000..ae402d92 --- /dev/null +++ b/features/controlcentercomponent/build.gradle @@ -0,0 +1,19 @@ +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/config.json b/features/controlcentercomponent/src/main/config.json new file mode 100644 index 00000000..d9314d61 --- /dev/null +++ b/features/controlcentercomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": { + }, + "module": { + "package": "com.ohos.systemui.controlcentercomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "controlcentercomponent", + "moduleType": "har" + }, + } +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ets b/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ets new file mode 100644 index 00000000..dc9fbb29 --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ets @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 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 default class Constants { + static WIFI = 'wifi'; + static AIR_PLANE = 'air_plane'; + static COMPLEX_TOGGLE_HEIGHT = 120; + static COMPLEX_TOGGLE_UP_DOWN_SPACE = 20; + static SIMPLE_TOGGLE_HEIGHT = 105; + static SIMPLE_TOGGLE_UP_DOWN_SPACE = 20; + static SIMPLE_TOGGLE_ICON_WIDTH = 50; + static SIMPLE_TOGGLE_ICON_HEIGHT = 50; + static SIMPLE_TOGGLE_INSIDE_SPACE = 10; +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ets b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ets new file mode 100644 index 00000000..aab04220 --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ets @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2021 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 Resmgr from '@ohos.resourceManager'; +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import PluginDataSourceAdapter from '../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets'; +import Constants from '../common/Constants.ets'; + +const TAG = 'ControlCenterModel'; + +let CONTROLCENTER_SOURCE_CONFIG = { + "MetaSource": { + "action": "com.ohos.systemui.action.TOGGLE", + "permission": null, + "filterIds": [] + }, + // "pluginSource": { "pluginUrl": "xxx/xxx/xx" } +} + +export class ControlCenterService { + mIsStart: boolean = false; + mAdapter: PluginDataSourceAdapter; + mListener: any; + + startService(filterIds: string[]) { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `start ControlCenterService.`) + this.mIsStart = true; + this.mAdapter = new PluginDataSourceAdapter(TAG); + this.mAdapter.registerListener({ + 'initFinish': this.loadData.bind(this), + 'addItem': this.onItemAdd.bind(this), + 'removeItem': this.onItemRemove.bind(this) + }); + { + CONTROLCENTER_SOURCE_CONFIG.MetaSource.filterIds = filterIds; + } + this.mAdapter.initDataSource(CONTROLCENTER_SOURCE_CONFIG); + } + + stopService() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `stop ControlCenterService.`) + this.mIsStart = false; + this?.mAdapter.unregisterListener(); + this?.mAdapter.clearAll(); + } + + loadData() { + Log.showInfo(TAG, `loadData`) + this.mAdapter.loadData(); + } + + registerListener(listener: { + 'addItem': Function, + 'removeItem': Function + }) { + Log.showInfo(TAG, `registerListener, listener: ${listener}`) + this.mListener = listener; + } + + onItemAdd(itemData) { + Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`) + if (!CheckEmptyUtils.isEmpty(itemData.label) || !CheckEmptyUtils.isEmpty(itemData.iconUrl)) { + if (!CheckEmptyUtils.isEmpty(itemData.label)) { + itemData.label = decodeURIComponent(itemData.label); + } + this.mListener?.addItem(itemData); + + } else { + Resmgr.getResourceManager(itemData.bundleName) + .then(mgr => { + mgr.getString(itemData.abilityLabelId, (error, value) => { + Log.showInfo(TAG, `onItemAdd mgr.getString, error: ${JSON.stringify(error)} value: ${JSON.stringify(value)}`) + if (error != null) { + return; + } + itemData.label = value; + mgr.getMediaBase64(itemData.abilityIconId, (error, value) => { + Log.showInfo(TAG, `onItemAdd mgr.getMediaBase64, error: ${JSON.stringify(error)} value: ${JSON.stringify(value)}`) + if (error != null) { + return; + } + itemData.iconUrl = value; + this.mListener?.addItem(itemData); + }); + }); + }) + .catch(e => { + Log.showInfo(TAG, `onItemAdd Resmgr.getResourceManager, e: ${JSON.stringify(e)}`) + }); + } + } + + onItemRemove(itemData) { + Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`) + this.mListener?.removeItem(itemData); + } +} + +let controlCenterService = new ControlCenterService(); + +export default controlCenterService as ControlCenterService; \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets new file mode 100644 index 00000000..e8de9537 --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; +import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets' +import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase.ets' +import Constants from '../common/Constants.ets' + +const TAG = 'ComplexToggleComponent' + +@Component +export default struct ComplexToggleComponent { + @Prop keyId: string + @State mItemData: any = {} + @State mStatus: boolean = false + @Link showStatusBar: boolean + private mWindowManager + private mFeatureAbilityManager + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) + this.mItemData = AppStorage.Link(this.keyId) + Log.showInfo(TAG, `aboutToAppear, mItemData: ${this.mItemData.get().iconUrl} ${this.mItemData.get().label}`) + this.mWindowManager = new WindowManager(); + this.mFeatureAbilityManager = new FeatureAbilityManager(); + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + let deleteRs: boolean = AppStorage.Delete(this.keyId) + Log.showInfo(TAG, `aboutToDisappear AppStorage.Delete, ${deleteRs} key: ${this.keyId}`) + } + + build() { + Column() { + iconTitleBase({ + mTitle: this.mItemData.get() + .label, + useIconStr: true, + iconOffStr: this.mItemData.get() + .iconUrl, + iconOnStr: this.mItemData.get() + .iconUrl, + changeSwitch: $mStatus, + mClickEvent: this.onIconItemClick.bind(this), + mLongClickEvent: this.onIconItemLongPressGesture.bind(this) + }) + } + } + + onIconItemClick() { + Log.showInfo(TAG, `onIconItemClick`) + if (this.mItemData.get().actionData && this.mItemData.get().actionData.clickAction) { + this.startAbility(this.mItemData.get().actionData.clickAction) + } + } + + onIconItemLongPressGesture() { + Log.showInfo(TAG, `onIconItemLongPressGesture`) + if (this.mItemData.get().actionData && this.mItemData.get().actionData.longClickAction) { + this.startAbility(this.mItemData.get().actionData.longClickAction) + } + } + + startAbility(action) { + Log.showInfo(TAG, `startAbility, action: ${action}`) + let actionInfos = action.split('&') + let wantParam = { + parameters: {} + } + for (let actionInfoStr of actionInfos) { + let actionInfo = actionInfoStr.split('=') + if (actionInfo[0] == 'want') { + wantParam['bundleName'] = actionInfo[1].split('/')[0] + wantParam['abilityName'] = actionInfo[1].split('/')[1] + } else { + wantParam.parameters[actionInfo[0]] = actionInfo.length > 1 ? actionInfo[1] : actionInfo[0] + } + } + Log.showInfo(TAG, `startAbility, want: ${JSON.stringify(wantParam)}`) + + this.showStatusBar = true; + this.mWindowManager.setWindowMin((result) => { + this.mFeatureAbilityManager.openAbility(TAG, { + want: wantParam + }); + }); + } +} \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/ControlCenter.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets similarity index 31% rename from product/statusbar/src/main/ets/default/pages/ControlCenter.ets rename to features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index cc247a24..d5ce1bfc 100644 --- a/product/statusbar/src/main/ets/default/pages/ControlCenter.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -14,21 +14,27 @@ */ import {UpTitle} from './UpTitle.ets' -import AirPlaneComponent from "../../../../../../../features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets" -import WifiComponent from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiComponent.ets' -import {MyBrightness} from '../../../../../../../features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets' -import {MyVol} from '../../../../../../../features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import UniformConfig from '../../../../../../../common/src/main/ets/template/UniformConfig.ets' +import AirPlaneComponent from "../../../../../../../airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets" +import WifiComponent from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiComponent.ets' +import {MyBrightness} from '../../../../../../../brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets' +import {MyVol} from '../../../../../../../volumecomponent/src/main/ets/default/pages/volumeComponent.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import UniformConfig from '../../../../../../../../common/src/main/ets/template/UniformConfig.ets' +import Constants from '../common/Constants.ets' +import ViewModel from '../viewmodel/ControlCenterVM.ets' +import ComplexToggleComponent from './ComplexToggleComponent.ets' +import SimpleToggleComponent from './SimpleToggleComponent.ets' -const TAG='Control-ControlCenter' +const TAG = 'Control-ControlCenter' +const TAG_ControlCenterComplexToggleLayout = 'Control-ControlCenterComplexToggleLayout' +const TAG_ControlCenterSimpleToggleLayout = 'Control-TAG_ControlCenterSimpleToggleLayout' var mUniform; + @Component -export default -struct ControlCenterComponent { +export default struct ControlCenterComponent { + @State mControlCenterComponentConfig: any = {} @Link showStatusBar: boolean - componentUniform = { iconOnBG: "#0A59F7", iconOffBG: "#F5F5F5", @@ -43,15 +49,18 @@ struct ControlCenterComponent { } aboutToAppear() { - Log.showInfo(TAG,'aboutToAppear') + Log.showInfo(TAG, 'aboutToAppear') // 初始化自定义组件样式 mUniform = UniformConfig.initParams(this.componentUniform) console.log(`------${JSON.stringify(mUniform)}`); + + Log.showInfo(TAG, `aboutToAppear, mControlCenterComponentConfig: ${JSON.stringify(this.mControlCenterComponentConfig)}`) + ViewModel.initViewModel(this.mControlCenterComponentConfig) } - aboutToDisappear () { - Log.showInfo(TAG,'aboutToDisappear ') + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear ') } build() { @@ -65,25 +74,8 @@ struct ControlCenterComponent { left: $r('app.float.center_item_margin_left'), right: $r('app.float.center_item_margin_right') }) - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { - Flex() { - WifiComponent() - } - .width('48%') - .height('100%') - - Flex() { - AirPlaneComponent() - } - .width('48%') - .height('100%') - } - .width('100%') - .height($r('app.float.wifi_and_air_height')) - .margin({ top: $r('app.float.center_item_margin_top'), - left: $r('app.float.center_item_margin_left'), - right: $r('app.float.center_item_margin_right') }) - + ControlCenterComplexToggleLayout({ showStatusBar: $showStatusBar }) + ControlCenterSimpleToggleLayout({ showStatusBar: $showStatusBar }) Column() { MyBrightness() } @@ -105,3 +97,95 @@ struct ControlCenterComponent { .width('100%') } } + +@Component +struct ControlCenterComplexToggleLayout { + @StorageLink('ControlCenterComplexToggleLayout') mComplexToggleLayout: string[] = [] + @Link showStatusBar: boolean + + aboutToAppear() { + Log.showInfo(TAG_ControlCenterComplexToggleLayout, `aboutToAppear Start`) + Log.showInfo(TAG_ControlCenterComplexToggleLayout, `aboutToAppear, mComplexToggleLayout: ${this.mComplexToggleLayout} `) + } + + aboutToDisappear() { + Log.showInfo(TAG_ControlCenterComplexToggleLayout, `aboutToDisAppear`) + } + + build() { + Flex({ + direction: FlexDirection.Row, + wrap: FlexWrap.Wrap, + justifyContent: FlexAlign.SpaceBetween, + alignItems: ItemAlign.Start, + alignContent: FlexAlign.Start + }) { + ForEach(this.mComplexToggleLayout, (componentName: string) => { + Row() { + if (componentName == Constants.WIFI) { + WifiComponent() + } else if (componentName == Constants.AIR_PLANE) { + AirPlaneComponent() + } else { + ComplexToggleComponent({ + keyId: componentName, + showStatusBar: $showStatusBar + }) + } + } + .width('48%') + .height(Constants.COMPLEX_TOGGLE_HEIGHT) + .margin({ top: Constants.COMPLEX_TOGGLE_UP_DOWN_SPACE }) + }, (componentName: string) => componentName) + } + .width('100%') + .height((Math.ceil(this.mComplexToggleLayout.length / 2) * (Constants.COMPLEX_TOGGLE_HEIGHT + Constants.COMPLEX_TOGGLE_UP_DOWN_SPACE)).toString()) + .margin({ + left: $r('app.float.center_item_margin_left'), + right: $r('app.float.center_item_margin_right') + }) + } +} + +@Component +struct ControlCenterSimpleToggleLayout { + @StorageLink('ControlCenterSimpleToggleLayout') mSimpleToggleLayout: string[] = [] + @Link showStatusBar: boolean + + aboutToAppear() { + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `aboutToAppear Start`) + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `aboutToAppear, mSimpleToggleLayout: ${this.mSimpleToggleLayout} `) + } + + aboutToDisappear() { + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `aboutToDisAppear`) + } + + build() { + Flex({ + direction: FlexDirection.Row, + wrap: FlexWrap.Wrap, + justifyContent: FlexAlign.Start, + alignItems: ItemAlign.Start, + alignContent: FlexAlign.Start + }) { + ForEach(this.mSimpleToggleLayout, (componentName: string) => { + Column() { + SimpleToggleComponent({ + keyId: componentName, + showStatusBar: $showStatusBar + }) + } + .width('25%') + .height(Constants.SIMPLE_TOGGLE_HEIGHT) + .margin({ top: Constants.SIMPLE_TOGGLE_UP_DOWN_SPACE }) + }, (componentName: string) => componentName) + } + .width('100%') + .height((Math.ceil(this.mSimpleToggleLayout.length / 4) * (Constants.SIMPLE_TOGGLE_HEIGHT + Constants.SIMPLE_TOGGLE_UP_DOWN_SPACE)).toString()) + .margin({ + left: $r('app.float.center_item_margin_left'), + right: $r('app.float.center_item_margin_right') + }) + } +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets new file mode 100644 index 00000000..7b7ad03a --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; +import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets' +import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase.ets' +import UniformConfig from '../../../../../../../../common/src/main/ets/template/UniformConfig.ets' +import Constants from '../common/Constants.ets' + +const TAG = 'SimpleToggleComponent' + +@Component +export default struct SimpleToggleComponent { + @Prop keyId: string + @State mItemData: any = {} + @Link showStatusBar: boolean + private mWindowManager + private mFeatureAbilityManager + private mConfig = UniformConfig.config; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) + this.mItemData = AppStorage.Link(this.keyId) + Log.showInfo(TAG, `aboutToAppear, mItemData: ${this.mItemData.get().iconUrl} ${this.mItemData.get().label}`) + this.mWindowManager = new WindowManager(); + this.mFeatureAbilityManager = new FeatureAbilityManager(); + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + let deleteRs: boolean = AppStorage.Delete(this.keyId) + Log.showInfo(TAG, `aboutToDisappear AppStorage.Delete, ${deleteRs} key: ${this.keyId}`) + } + + build() { + Column({ space: Constants.SIMPLE_TOGGLE_INSIDE_SPACE }) { + Stack() { + Flex() + .backgroundColor(this.mConfig.iconOffBG) + .clip(new Circle({ width: this.mConfig.circleWidth, height: this.mConfig.circleHeight })) + .width(this.mConfig.circleWidth) + .height(this.mConfig.circleHeight) + Image(this.mItemData.get() + .iconUrl) + .size({ width: Constants.SIMPLE_TOGGLE_ICON_WIDTH, height: Constants.SIMPLE_TOGGLE_ICON_HEIGHT }) + .objectFit(ImageFit.Contain) + }.onClick(this.onIconItemClick.bind(this)) + .gesture(LongPressGesture({ repeat: false }).onAction(this.onIconItemLongPressGesture.bind(this))) + + Text(this.mItemData.get() + .label) + .fontSize($r('app.float.icon_item_fontsize')) + } + } + + onIconItemClick(event: ClickEvent) { + Log.showInfo(TAG, `onIconItemClick`) + if (this.mItemData.get().actionData && this.mItemData.get().actionData.clickAction) { + this.startAbility(this.mItemData.get().actionData.clickAction) + } + } + + onIconItemLongPressGesture(event: GestureEvent) { + Log.showInfo(TAG, `onIconItemLongPressGesture, event: ${JSON.stringify(event)}`) + if (this.mItemData.get().actionData && this.mItemData.get().actionData.longClickAction) { + this.startAbility(this.mItemData.get().actionData.longClickAction) + } + } + + startAbility(action) { + Log.showInfo(TAG, `startAbility, action: ${action}`) + let actionInfos = action.split('&') + let wantParam = { + parameters: {} + } + for (let actionInfoStr of actionInfos) { + let actionInfo = actionInfoStr.split('=') + if (actionInfo[0] == 'want') { + wantParam['bundleName'] = actionInfo[1].split('/')[0] + wantParam['abilityName'] = actionInfo[1].split('/')[1] + } else { + wantParam.parameters[actionInfo[0]] = actionInfo.length > 1 ? actionInfo[1] : actionInfo[0] + } + } + Log.showInfo(TAG, `startAbility, want: ${JSON.stringify(wantParam)}`) + + this.showStatusBar = true; + this.mWindowManager.setWindowMin((result) => { + this.mFeatureAbilityManager.openAbility(TAG, { + want: wantParam + }); + }); + } +} \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/UpTitle.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets similarity index 87% rename from product/statusbar/src/main/ets/default/pages/UpTitle.ets rename to features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets index 5d4f1b48..e28d54d5 100644 --- a/product/statusbar/src/main/ets/default/pages/UpTitle.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets @@ -13,9 +13,9 @@ * limitations under the License. */ -import FeatureAbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; -import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; +import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' const TAG = 'Control-UpTitle' let mWindowManager; diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ets b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ets new file mode 100644 index 00000000..125414c6 --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ets @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import Constants from '../common/Constants.ets'; +import ControlCenterService from '../model/ControlCenterService.ets'; + +export const ControlCenterComplexToggleLayoutKey = "ControlCenterComplexToggleLayout"; + +export const ControlCenterSimpleToggleLayoutKey = "ControlCenterSimpleToggleLayout"; + +const TAG = 'ControlCenterVM'; + +export class ControlCenterVM { + mConfig: any; + mIsStart: boolean = false; + mComplexToggleLayoutTemplate: string[]; + mSimpleToggleLayoutTemplate: string[]; + mComplexToggleLayout: any; + mSimpleToggleLayout: any; + mAllSimpleToggles: string[] = []; + + initViewModel(config) { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)} `) + this.mIsStart = true; + this.mConfig = config; + + this.parseConfig(config); + this.calcControlCenterLayout(); + + ControlCenterService.registerListener({ + 'addItem': this.onItemAdd.bind(this), + 'removeItem': this.onItemRemove.bind(this) + }); + let filterIds: string[] = []; + config.MetaToggles.forEach((metaToggle) => { + filterIds.push(metaToggle.id) + }); + ControlCenterService.startService(filterIds); + } + + parseConfig(config) { + Log.showInfo(TAG, `parseConfig, config: ${JSON.stringify(config)}`) + + this.mComplexToggleLayout = AppStorage.SetAndLink(ControlCenterComplexToggleLayoutKey, []); + this.mSimpleToggleLayout = AppStorage.SetAndLink(ControlCenterSimpleToggleLayoutKey, []); + Log.showInfo(TAG, + `parseConfig, ComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`) + Log.showInfo(TAG, + `parseConfig, SimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`) + + this.mComplexToggleLayoutTemplate = []; + config.ComplexToggleLayout.forEach((name) => { + this.mComplexToggleLayoutTemplate.push(name); + }); + this.mSimpleToggleLayoutTemplate = []; + config.TempDBSimpleToggleLayout.forEach((name) => { + this.mSimpleToggleLayoutTemplate.push(name); + }); + Log.showInfo(TAG, + `parseConfig, ComplexToggleLayoutTemplate: ${JSON.stringify(this.mComplexToggleLayoutTemplate)}`) + Log.showInfo(TAG, + `parseConfig, SimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`) + + config.LocalToggles.forEach((name) => { + this.mAllSimpleToggles.push(name); + }); + Log.showInfo(TAG, `parseConfig, allSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`) + } + + onItemAdd(itemData) { + Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`) + AppStorage.SetOrCreate(itemData.id, itemData); + if (this.mAllSimpleToggles.indexOf(itemData.id) < 0) { + this.mAllSimpleToggles.push(itemData.id); + this.calcControlCenterLayout(); + } + Log.showInfo(TAG, `onItemAdd, ComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`) + Log.showInfo(TAG, `onItemAdd, SimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`) + } + + onItemRemove(itemData) { + Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`) + if (this.mAllSimpleToggles.indexOf(itemData.id) >= 0) { + this.mAllSimpleToggles.splice(this.mAllSimpleToggles.indexOf(itemData.id), 1); + this.calcControlCenterLayout(); + } + Log.showInfo(TAG, `onItemRemove, ComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`) + Log.showInfo(TAG, `onItemRemove, SimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`) + } + + calcControlCenterLayout() { + Log.showInfo(TAG, `calcControlCenterLayout`) + + let complexToggleLayout: string[] = []; + this.mComplexToggleLayoutTemplate.forEach((name) => { + if (this.mAllSimpleToggles.indexOf(name) >= 0) { + complexToggleLayout.push(name); + } + }); + let simpleToggleLayout: string[] = []; + this.mSimpleToggleLayoutTemplate.forEach((name) => { + if (this.mAllSimpleToggles.indexOf(name) >= 0) { + simpleToggleLayout.push(name); + } + }); + + Log.showInfo(TAG, `calcControlCenterLayout, complexToggleLayout: ${JSON.stringify(complexToggleLayout)}`) + Log.showInfo(TAG, `calcControlCenterLayout, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`) + + + if (JSON.stringify(complexToggleLayout) != JSON.stringify(this.mComplexToggleLayout.get())) { + this.mComplexToggleLayout.set(complexToggleLayout); + } + if (JSON.stringify(simpleToggleLayout) != JSON.stringify(this.mSimpleToggleLayout.get())) { + this.mSimpleToggleLayout.set(simpleToggleLayout); + } + Log.showInfo(TAG, `calcControlCenterLayout, mComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`) + Log.showInfo(TAG, `calcControlCenterLayout, mSimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`) + } +} + +let controlCenterVM = new ControlCenterVM(); + +export default controlCenterVM as ControlCenterVM; \ No newline at end of file diff --git a/product/systemDialog/src/main/resources/base/element/color.json b/features/controlcentercomponent/src/main/resources/base/element/color.json similarity index 30% rename from product/systemDialog/src/main/resources/base/element/color.json rename to features/controlcentercomponent/src/main/resources/base/element/color.json index 287a554a..09f83ab3 100644 --- a/product/systemDialog/src/main/resources/base/element/color.json +++ b/features/controlcentercomponent/src/main/resources/base/element/color.json @@ -1,20 +1,16 @@ { "color": [ { - "name": "dialog_bg", - "value": "#AAFFFF" + "name": "default_background", + "value": "#66000000" }, { - "name": "divider_line", - "value": "#BEBEBE" - }, - { - "name": "button_font_color", - "value": "#FFFFFF" + "name": "default_font_color", + "value": "#ffffffff" }, { "name": "title_font_color", - "value": "#000000" + "value": "#FFF" } ] } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/base/element/float.json b/features/controlcentercomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..e7def617 --- /dev/null +++ b/features/controlcentercomponent/src/main/resources/base/element/float.json @@ -0,0 +1,35 @@ +{ + "float": [ + { + "name": "icon_item_fontsize", + "value": "18" + },{ + "name": "up_title_height", + "value": "83" + },{ + "name": "center_item_margin_top", + "value": "20" + },{ + "name": "center_item_margin_left", + "value": "10" + },{ + "name": "center_item_margin_right", + "value": "10" + },{ + "name": "complex_toggle_height", + "value": "120" + },{ + "name": "vol_height", + "value": "66" + },{ + "name": "title_font_size", + "value": "35" + },{ + "name": "notification_settings_width", + "value": "60" + },{ + "name": "notification_settings_height", + "value": "60" + } + ] +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/base/element/string.json b/features/controlcentercomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..35b22041 --- /dev/null +++ b/features/controlcentercomponent/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "control_center", + "value": "控制中心" + } + ] +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/base/media/ic_settings.png b/features/controlcentercomponent/src/main/resources/base/media/ic_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b665b89cd206a3e476f5e9efbe31d482be7a0321 GIT binary patch literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKMSxF;E0F#_5a8H~Cu@LqYm@}} z1v9Kz!j?9FIuBE}!mNZcS4&e#flzNf(Mi1>^=i%1`N3NL4o1n*HdQBu_hvFMFdKWi zIEF+Vej9#s+ad#j78kRdfm2)=4?g|>zd()AfAYJE{uH_A*Cuyvob>9Qm;38_*Xl$w zg_;8Ad2?=RF*z@q+goV#=%cJtiHVZdQUAw>rJKGbt>ZbuVqg*wcDRBmm+e%Z!84E9 zGmVOK{~Sz9ZSWBYJuGgoCl@W7{erOF;$IcgfUmCs@iPs@$<)xc{e&^r`Hz$n5Fc68o!~6m_X;r-3M!*R-C#c`pk^s zJ>T*>EFJ6%T6QFUShJtKpQXsdIE67zW3s}|YH=6SU-PrlN>v`}xS4-du5QippJ`Rn zlFzT2*C&DGO4`=s8kF>v+H*|T5jcEU0pj}>p- z&R(2s@b;??RS90X*HG_Xm(`U0F=ADlvyYehs0yDJnOBw9C1X25<)^Op@q~BX8`ta1P@n&# zQlMZ?9?P2xVMZIL`p>!fQo?`Pha*Q8{uX#SRq~QV<$VUw{C@5NXD`4}D? zS~OS2;k@mRipJAhZ%#R$7J5D1Jw481L5+t=u#l-@Ot#dN<6lnQ?@xF%E6L7fSI?=G zKd;W-{qYPw7g)mGYe$1ILWg+-yu;l zp literal 0 HcmV?d00001 diff --git a/product/systemDialog/src/main/resources/base/media/icon.png b/features/controlcentercomponent/src/main/resources/base/media/icon.png similarity index 100% rename from product/systemDialog/src/main/resources/base/media/icon.png rename to features/controlcentercomponent/src/main/resources/base/media/icon.png diff --git a/features/controlcentercomponent/src/main/resources/en_US/element/string.json b/features/controlcentercomponent/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..35b22041 --- /dev/null +++ b/features/controlcentercomponent/src/main/resources/en_US/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "control_center", + "value": "控制中心" + } + ] +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json b/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..35b22041 --- /dev/null +++ b/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "control_center", + "value": "控制中心" + } + ] +} \ No newline at end of file diff --git a/features/managementcomponent/.gitignore b/features/managementcomponent/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/features/managementcomponent/.gitignore @@ -0,0 +1 @@ +/build diff --git a/features/managementcomponent/build.gradle b/features/managementcomponent/build.gradle new file mode 100644 index 00000000..ae402d92 --- /dev/null +++ b/features/managementcomponent/build.gradle @@ -0,0 +1,19 @@ +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} \ No newline at end of file diff --git a/features/notificationservice/src/main/config.json b/features/managementcomponent/src/main/config.json similarity index 77% rename from features/notificationservice/src/main/config.json rename to features/managementcomponent/src/main/config.json index 9e40ebba..c7914daf 100644 --- a/features/notificationservice/src/main/config.json +++ b/features/managementcomponent/src/main/config.json @@ -10,13 +10,13 @@ "deviceConfig": { }, "module": { - "package": "com.ohos.notificationservice", + "package": "com.ohos.managementcomponent", "deviceType": [ "phone" ], "distro": { "deliveryWithInstall": true, - "moduleName": "notificationservice", + "moduleName": "managementcomponent", "moduleType": "har" } } diff --git a/features/managementcomponent/src/main/ets/com/ohos/common/constants.ets b/features/managementcomponent/src/main/ets/com/ohos/common/constants.ets new file mode 100644 index 00000000..64f152fb --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/common/constants.ets @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021 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 default class Constants { + + static WH_45_100 = '45%'; + static WH_50_100 = '50%'; + static WH_70_100 = '70%'; + static WH_90_100 = '90%'; + static WH_100_100 = '100%'; + static MAX_LINES_1 = 1; + static MAX_LINES_2 = 2; + static MAX_LINES_3 = 3; + static NEXT_DAY_NAME = '次日' + static EVERY_DAY_NAME = '每天:' +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ets b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ets new file mode 100644 index 00000000..da422125 --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ets @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Bundle from '@ohos.bundle'; +import ResMgr from '@ohos.resourceManager'; + +const INDEX = 0; +const IS_INCLUDE_ABILITY_INFO = 0; + +const TAG = 'NotificationManagenment-BundleResourceModel'; + +export default class BundleResourceModel { + private mBundleInfoList: any[]= []; + + getAllBundleInfos() { + Log.showInfo(TAG, 'getAllBundleInfos entry'); + Bundle.getAllBundleInfo(IS_INCLUDE_ABILITY_INFO) + .then((data) => { + this.getIconItem(INDEX, data.length, data); + }); + Log.showInfo(TAG, 'getAllBundleInfos end'); + } + + getIconItem(index, count, data) { + Log.showInfo(TAG, 'getIconItem data.length' + data.length); + let imageValue = ''; + let label = ''; + let that = this; + Log.showInfo(TAG, 'getIconItem data[index].name :' + data[index].name); + try { + ResMgr.getResourceManager(data[index].name, (error, item) => { + let appInfo = data[index].appInfo; + if (appInfo.labelId > 0) { + item.getString(appInfo.labelId, (error, value) => { + Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager value.length:' + value.length); + if (value != null) { + Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() value:' + value); + label = value; + Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() label:' + label); + } else { + Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() error:' + error); + } + }); + } else { + Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager label:' + appInfo.label); + label = appInfo.label; + } + Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager finish label:' + label); + if (appInfo.iconId <= 0) { + this.nextIconItem(index, count, data, this.mBundleInfoList, that) + return + } + item.getMediaBase64(appInfo.iconId, (error, value) => { + if (error === undefined) { + Log.showInfo(TAG, 'getIconItem ResMgr.getMediaBase64() value:' + value.length); + if (value.length > 0) { + imageValue = value; + Log.showInfo(TAG, 'getIconItem ResMgr.getMediaBase64() imageValue:' + imageValue); + } + this.mBundleInfoList.push({ + appIcon: imageValue, + appTitle: label, + appValue: '', + appArrow: $r('app.media.ic_settings_arrow'), + appSummary: data[index].versionName, + appBundleName: data[index].name, + appIconId: appInfo.iconId, + appUri: 'pages/setEnable', + appUid: data[index].uid, + }); + } + Log.showInfo(TAG, 'getIconItem ResMgr.getMediaBase64() end'); + this.nextIconItem(index, count, data, this.mBundleInfoList, that) + }); + + }); + } catch (error) { + Log.showInfo(TAG, 'getIconItem catch error:' + error); + } + Log.showInfo(TAG, 'getIconItem end'); + } + + nextIconItem(index, count, data, bundleInfoList, that) { + if (count - 1 > index) { + Log.showInfo(TAG, 'nextIconItem if index:' + index + ' | count:' + count); + index = index + 1; + that.getIconItem(index, count, data); + } else { + Log.showInfo(TAG, 'nextIconItem else index:' + index + ' | count:' + count); + AppStorage.SetOrCreate('appManagementList', bundleInfoList); + } + + } +} + diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ets b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ets new file mode 100644 index 00000000..062c6b7c --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ets @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Notification from '@ohos.notification'; +import DateAndTime from '../../../../../../../../common/src/main/ets/default/DateAndTimeUtil.ets'; + +const TAG = 'NotificationManagenment-NoDisturbingModel'; + +export default class NoDisturbingModel { + static getNoDisturbingDate(callback) { + //TODO:Interface in preparation + // Notification.getDoNotDisturbDate((error, data) => { + // if (error != undefined && error != null) { + // Log.showInfo(TAG, 'getNoDisturbingDate error:' + JSON.stringify(error)); + // } else { + // Log.showInfo(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); + // let noDisturbingData = {} + // noDisturbingData['type'] = data.type + // noDisturbingData['begin'] = DateAndTime.concatTime(data.begin.getHours(), data.begin.getMinutes()); + // noDisturbingData['end'] = DateAndTime.concatTime(data.end.getHours(), data.end.getMinutes()); + // callback(noDisturbingData) + // } + // }) + //TODO: Temporary code. + let noDisturbingData = {} + noDisturbingData['type'] = 0 + noDisturbingData['begin'] = DateAndTime.concatTime(22, 0); + noDisturbingData['end'] = DateAndTime.concatTime(7, 0) + callback(noDisturbingData) + } + + static setNoDisturbingDate(noDisturbingTime, callback) { + //TODO:Interface in preparation + //let targetDate : DoNotDisturbDate + //targetDate.type = noDisturbingTime.type + //targetDate.begin = noDisturbingTime.begin + //targetDate.end = noDisturbingTime.end + //Notification.setDoNotDisturbDate(targetDate, callback) + //TODO: Temporary code. + callback(null,null) + } +} + diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets new file mode 100644 index 00000000..0bc13b8b --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets @@ -0,0 +1,122 @@ +/** + * Copyright (c) 2021 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 ConfigData from '../../common/constants.ets'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import Notification from '@ohos.notification'; +import Router from '@system.router' + +const TAG = 'ManagementComponent-AppItemComponent'; + +@Component +export default struct AppItemComponent { + @State canNotice: boolean= false; + @Prop appIcon: string; + @Prop appTitle: string; + @Prop appSummary: string; + @Prop appValue: string; + @Prop appArrow: string; + @Prop appArrowStyle: string; + @Prop appUri: string; + @Prop appSwitch: number; + @Prop appBundleName: string; + @Prop appUid: number; + + build() { + Flex({ justifyContent: FlexAlign.SpaceBetween }) { + Row() { + Image(this.appIcon) + .width($r('app.float.appitem_icon_width')) + .height($r('app.float.appitem_icon_height')) + .margin({ right: $r('app.float.appitem_icon_margin_r') }) + .visibility('' === this.appIcon ? Visibility.None : Visibility.Visible) + .objectFit(ImageFit.Contain); + Column() { + Text(this.appTitle) + .fontColor($r('app.color.appitem_label_fontcolor')) + .fontSize($r('app.float.appitem_label_font')) + .textAlign(TextAlign.Start) + .maxLines(ConfigData.MAX_LINES_3) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .margin({ top: $r('app.float.appitem_label_margin_t'), bottom: $r('app.float.appitem_labelmargin_b') }); + Row() { + Text($r('app.string.version')) + .fontColor($r('app.color.appitem_version_fontcolor')) + .fontSize($r('app.float.appitem_version_font')) + .textAlign(TextAlign.Start) + .maxLines(ConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .visibility(Visibility.Visible) + .margin({ bottom: $r('app.float.appitem_version_margin_b') }); + Text(this.appSummary) + .fontColor($r('app.color.appitem_version_fontcolor')) + .fontSize($r('app.float.appitem_version_font')) + .textAlign(TextAlign.Start) + .maxLines(ConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .visibility(Visibility.Visible) + .margin({ bottom: $r('app.float.appitem_version_margin_b') }); + } + } + .alignItems(HorizontalAlign.Start); + } + .flexShrink(0) + .alignItems(VerticalAlign.Center) + .align(Alignment.Start) + + Row() { + if (this.appSwitch === 0) { + Text(this.appValue) + .fontSize($r('app.float.appitem_version_font')) + .fontColor($r('app.color.appitem_version_fontcolor')) + .margin({ right: $r('app.float.appitem_version_margin_r') }) + .align(Alignment.End); + Image(this.appArrow) + .width($r('app.float.arrow_icon_width')) + .height($r('app.float.arrow_icon_height')) + .visibility(Visibility.Visible); + } else { + Toggle({ type: ToggleType.Switch, isOn: this.canNotice }) + .align(Alignment.End) + .width($r('app.float.toggle_comp_width')) + .height($r('app.float.toggle_comp_height')) + .onChange((flag) => { + Log.showInfo(TAG, `Toggle onChange param: ` + this.appBundleName + " data:" + flag) + Notification.enableNotification({ bundle: this.appBundleName, uid: this.appUid }, flag, (err, result) => { + }) + }) + } + } + .margin({ right: $r('app.float.page_margin_r') }) + .align(Alignment.End); + } + .margin({ left: $r('app.float.page_margin_l') }) + .width(ConfigData.WH_100_100) + } + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + Notification.isNotificationEnabled({ bundle: this.appBundleName, uid: this.appUid }) + .then((data) => { + Log.showInfo(TAG, `Notification.isNotificationEnabled:` + data) + this.canNotice = data; + Log.showInfo(TAG, `Notification.isNotificationEnabled isOn:` + this.canNotice) + }); + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + Router.back(); + } +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets new file mode 100644 index 00000000..2507083c --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets @@ -0,0 +1,91 @@ +// @ts-nocheck +/** + * Copyright (c) 2021 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 ConfigData from '../../common/constants.ets'; +import AppItemComponent from './appItemComponent.ets'; +import Router from '@system.router'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import ViewModel from '../../vm/appLstComponentViewModel.ets' + +const TAG = 'ManagementComponent-AppLstComponent'; + +@Component +export default struct AppLstComponent { + @StorageLink('appManagementList') appList: any[]= []; + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + ViewModel.ViewModelInit() + } + + aboutToDisappear(): void{ + Log.showInfo(TAG, `aboutToDisappear`) + } + + onPageShow(): void{ + Log.showInfo(TAG, `onPageShow`) + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + } + + build() { + Column() { + List() { + ForEach(this.appList, (item) => { + ListItem() { + AppItemComponent({ + appIcon: item.appIcon, + appTitle: item.appTitle, + appSummary: item.appSummary, + appValue: item.appValue, + appArrow: item.appArrow, + appArrowStyle: '', + appUri: item.appUri, + appBundleName: item.appBundleName, + appUid: item.appUid, + appSwitch: 0 + }) + } + .onClick(() => { + Log.showInfo(TAG, `onClick`) + Router.push({ uri: item.appUri, params: item }); + }) + .height($r('app.float.appitem_item_height')); + }); + } + .divider({ + strokeWidth: 1, + color: $r('app.color.divider_color'), + startMargin: $r('app.float.divider_margin_l'), + endMargin: $r('app.float.divider_margin_r') + }) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + .visibility(Visibility.Visible) + .zIndex(0) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + } + .margin({ left: $r('app.float.page_margin_l'), + right: $r('app.float.page_margin_r') }) + .backgroundColor($r('app.color.background_color')) + .align(Alignment.Center) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets new file mode 100644 index 00000000..e13b2961 --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2021 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 ConfigData from '../../common/constants.ets'; +import Router from '@system.router'; + +@Component +export default +struct HeadComponent { + private isActive: boolean= true; + private icBackIsVisibility: boolean= true; + private headName: string= ''; + @State isTouch: boolean= false; + + build() { + Row() { + Image($r('app.media.ic_back')) + .width($r('app.float.appitem_icon_width')) + .height($r('app.float.appitem_icon_height')) + .borderRadius($r('app.float.image_border_radius')) + .margin({ + left: $r('app.float.page_margin_r'), + top: $r('app.float.page_margin_t'), + bottom: $r('app.float.page_margin_b') + }) + .backgroundColor(this.isTouch ? $r('app.color.background_color') : $r('app.color.background_transparent')) + .visibility(this.icBackIsVisibility ? Visibility.Visible : Visibility.None) + .onTouch(() => { + this.isTouch = true; + Router.back(); + }) + Text(this.headName) + .fontSize($r('app.float.page_title_font')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.Black) + .width(ConfigData.WH_100_100) + .maxLines(ConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .margin({ left: $r('app.float.page_margin_l'), right: $r('app.float.page_margin_r') }); + } + .width(ConfigData.WH_100_100) + .height($r('app.float.page_title_height')) + .alignItems(VerticalAlign.Center) + .align(Alignment.Start) + .backgroundColor( $r('app.color.background_color')) + } +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets new file mode 100644 index 00000000..05717d66 --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2021 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 ConfigData from '../../common/constants.ets'; + +@Component +export default struct ItemComponent { + @Prop title: string + @Prop value: string + @State arrow: string | PixelMap | Resource= '' + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Row() { + Text(this.title) + .fontSize($r('app.float.itemComp_titel_font')) + .fontColor($r('app.color.itemComp_title_color')) + .width(ConfigData.WH_45_100) + .textAlign(TextAlign.Start) + .fontWeight(FontWeight.Bold) + Text(this.value) + .fontSize($r('app.float.itemComp_value_font')) + .fontColor($r('app.color.itemComp_font_color')) + .width(ConfigData.WH_45_100) + .textAlign(TextAlign.End); + Image(this.arrow) + .width($r('app.float.itemComp_image_width')) + .height($r('app.float.itemComp_image_height')) + } + .width(ConfigData.WH_100_100) + .alignItems(VerticalAlign.Center) + .padding({ left: $r('app.float.itemComp_padding_l') }) + } + .width(ConfigData.WH_100_100) + .height($r('app.float.itemComp_height')) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + .margin({ + left: $r('app.float.page_margin_l'), + right: $r('app.float.page_margin_r'), + bottom: $r('app.float.itemComp_margin_b') + }) + } +} diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets new file mode 100644 index 00000000..601b9435 --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import ConfigData from '../../common/constants.ets'; +import ViewModel from '../../vm/noDisturbComponentViewModel.ets' + +const TAG = 'ManagementComponent-NoDisturbComponent'; + +@Component +export default struct NoDisturbComponent { + @State mViewModel: ViewModel = new ViewModel() + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit() + } + + build() { + Flex({ alignItems: ItemAlign.Center,justifyContent: FlexAlign.SpaceBetween }) { + Row() { + Column() { + Text($r('app.string.noDisturb')) + .fontSize($r('app.float.itemComp_titel_font')) + .fontColor($r('app.color.itemComp_title_color')) + .textAlign(TextAlign.Start) + .fontWeight(FontWeight.Bold) + Text(this.mViewModel.prompt) + .fontSize($r('app.float.itemComp_value_font')) + .fontColor($r('app.color.itemComp_font_color')) + .textAlign(TextAlign.Start) + } + .padding({ left: $r('app.float.itemComp_padding_l') }) + .alignItems(HorizontalAlign.Start) + } + .flexShrink(1) + .align(Alignment.Start) + .alignItems(VerticalAlign.Center) + + Row() { + Toggle({ type: ToggleType.Switch, isOn: this.mViewModel.isEffective }) + .align(Alignment.End) + .width($r('app.float.toggle_comp_width')) + .height($r('app.float.toggle_comp_height')) + .onChange((data) => { + Log.showInfo(TAG, `Toggle onChange param: data = ${data}`) + this.mViewModel.setNoDisturbingDate.bind(this.mViewModel)() + }) + } + .flexShrink(0) + .align(Alignment.End) + .alignItems(VerticalAlign.Center) + .padding({ right: $r('app.float.itemComp_padding_r') }) + } + .width(ConfigData.WH_100_100) + .height($r('app.float.itemComp_height')) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + .margin({ + left: $r('app.float.page_margin_l'), + right: $r('app.float.page_margin_r'), + bottom: $r('app.float.itemComp_margin_b') + }) + } +} diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets new file mode 100644 index 00000000..4aeadb8b --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2021 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 ConfigData from '../../common/constants.ets'; + +@Component +export default struct SlotItemComponent { + @Prop slotType: number; + + build() { + Flex({ justifyContent: FlexAlign.SpaceBetween }) { + Row() { + if (this.slotType === 0) { + Text($r('app.string.slot_unknown')).fontColor($r('app.color.background_color')) + .fontSize($r('app.float.slotComp_font')) + .textAlign(TextAlign.Start) + } + if (this.slotType === 1) { + Text($r('app.string.slot_social_communication')).fontColor($r('app.color.background_color')) + .fontSize($r('app.float.slotComp_font')) + .textAlign(TextAlign.Start) + } + if (this.slotType === 2) { + Text($r('app.string.slot_service_information')).fontColor($r('app.color.background_color')) + .fontSize($r('app.float.slotComp_font')) + .textAlign(TextAlign.Start) + } + if (this.slotType === 3) { + Text($r('app.string.slot_content_information')).fontColor($r('app.color.background_color')) + .fontSize($r('app.float.slotComp_font')) + .textAlign(TextAlign.Start) + } + if (this.slotType === 0xFFFF) { + Text($r('app.string.slot_other')).fontColor($r('app.color.background_color')) + .fontSize($r('app.float.slotComp_font')) + .textAlign(TextAlign.Start) + } + } + .flexShrink(0) + .alignItems(VerticalAlign.Center) + .align(Alignment.Start) + + if (this.slotType !== 0) { + Row() { + Image($r('app.media.ic_settings_arrow')) + .width($r('app.float.slotComp_image_width')) + .height($r('app.float.slotComp_image_height')) + .visibility(Visibility.Visible); + } + .margin({ right: $r('app.float.page_margin_r') }) + .align(Alignment.End); + } + } + .margin({ left: $r('app.float.page_margin_l') }) + .width(ConfigData.WH_100_100); + } +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets new file mode 100644 index 00000000..6f1e1b41 --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2021 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 ConfigData from '../../common/constants.ets'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import SlotItemComponent from './slotItemComponent.ets'; +import Notification from '@ohos.notification'; +import Router from '@system.router' + +const TAG = 'ManagementComponent-SlotLstComponent'; + +@Component +export default +struct SlotLstComponent { + private appBundleName:string =''; + private appUid:number =0; + + @State slotLst: any[] = []; + + build() { + Flex({ justifyContent: FlexAlign.SpaceBetween }) { + Column() { + Row(){ + Text($r('app.string.slotType')) + .fontSize($r('app.float.slotComp_font')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.Black) + .width(ConfigData.WH_100_100) + .maxLines(ConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .margin({ left: $r('app.float.page_margin_l'), right: $r('app.float.page_margin_r') }); + }.align(Alignment.Start); + Row(){ + List() { + ForEach(this.slotLst, (item) => { + ListItem() { + SlotItemComponent({slotType: item.slotType}) + } + .onClick(() => { + Log.showInfo(TAG, `onClick`) + }) + // .height($r('app.float.wh_value_70')); + }); + }.divider({ + strokeWidth: 1, + color: $r('app.color.divider_color'), + startMargin: $r('app.float.divider_margin_l'), + endMargin: $r('app.float.divider_margin_r') + }).width(ConfigData.WH_100_100) + .margin({ top: $r('app.float.slotComp_margin_t') }) + .visibility(Visibility.Visible) + }.align(Alignment.Start); + } + } + .margin({ left: $r('app.float.page_margin_l') }) + .width(ConfigData.WH_100_100); + } + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + Log.showInfo(TAG,`aboutToAppear Notification.getSlotsByBundle bundle:`+ 'bundle:'+ this.appBundleName + 'uid'+this.appUid) + Notification.getSlotsByBundle({bundle:this.appBundleName,uid:this.appUid},(err,data)=>{ + if (err.code!==0){ + Log.showInfo(TAG,`aboutToAppear Notification.getSlotsByBundle err:`+JSON.stringify(err)) + this.slotLst.push({ + slotType: 0 + }); + return + } + Log.showInfo(TAG,`aboutToAppear Notification.getSlotsByBundle data:`+JSON.stringify(data)) + data.forEach((val, idx, array) => { + Log.showInfo(TAG,`aboutToAppear Notification.getSlotsByBundle data.forEach:`+JSON.stringify(val)) + this.slotLst.push({ + slotType: val.type + }); + }) + }) + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + Router.back(); + } +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets new file mode 100644 index 00000000..4fef5a36 --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -0,0 +1,79 @@ +/** + * Copyright (c) 2021 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 ConfigData from '../../common/constants.ets'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import Notification from '@ohos.notification'; +import Router from '@system.router' + +const TAG = 'ManagementComponent-SwitchComponent'; + +@Component +export default struct SwitchComponent { + private title: ''; + private appBundleName: string = ''; + private appUid: number = 0; + @State canNotice: boolean= false + + build() { + Flex({ justifyContent: FlexAlign.SpaceBetween }) { + Row() { + Text(this.title) + .fontSize($r('app.float.switchComp_titel_font')) + .fontColor(Color.Black) + .align(Alignment.Start) + } + .flexShrink(0) + .height($r('app.float.switchComp_height')) + .alignItems(VerticalAlign.Center) + .align(Alignment.Start) + .padding({ right: $r('app.float.switchComp_padding_r') }) + .margin({ left: $r('app.float.page_margin_l') }) + + Row() { + Toggle({ type: ToggleType.Switch, isOn: this.canNotice }) + .align(Alignment.End) + .width($r('app.float.toggle_comp_width')) + .height($r('app.float.toggle_comp_height')) + .onChange((data) => { + Log.showInfo(TAG, `Toggle onChange param: ` + this.appBundleName + " data:" + data) + Notification.enableNotification({ bundle: this.appBundleName, uid: this.appUid }, data, (err, result) => { + }) + + }) + } + .alignItems(VerticalAlign.Center) + .align(Alignment.End) + .padding({ right: $r('app.float.switchComp_padding_r') }) + }.width(ConfigData.WH_100_100) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + } + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + Notification.isNotificationEnabled({ bundle: this.appBundleName, uid: this.appUid }) + .then((data) => { + Log.showInfo(TAG, `Notification.isNotificationEnabled:` + data) + this.canNotice = data; + Log.showInfo(TAG, `Notification.isNotificationEnabled isOn:` + this.canNotice) + }); + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + Router.back(); + } +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ets b/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ets new file mode 100644 index 00000000..fefe48ba --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ets @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import BundleResourceModel from '../model/bundleResourceModel.ets'; + + +const TAG = 'ManagementComponent-AppLstComponentViewModel' + +export class AppLstComponentViewModel { + bundleInfoList: any[]= []; + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + let dataModel:BundleResourceModel = new BundleResourceModel() + dataModel.getAllBundleInfos() + } +} + +let appLstComponentViewModel = new AppLstComponentViewModel(); + +export default appLstComponentViewModel as AppLstComponentViewModel; \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ets b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ets new file mode 100644 index 00000000..e6bec1f4 --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ets @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import NoDisturbingModel from '../model/noDisturbingModel.ets'; +import ConfigData from '../common/constants.ets' + +const TAG = 'ManagementComponent-NoDisturbComponentViewModel' + +export default class NoDisturbComponentViewModel { + defaultStartTime: Date= new Date() + defaultEndTime: Date= new Date() + startTime: string = '' + endTime: string = '' + repeatMode: number = 0 + prompt: string + isEffective: boolean + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + this.getNoDisturbingDate.bind(this)() + this.setClues.bind(this)() + } + + getNoDisturbingDate() { + Log.showInfo(TAG, 'getNoDisturbingDate'); + NoDisturbingModel.getNoDisturbingDate((data) => { + Log.showInfo(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); + this.repeatMode = data.type + this.startTime = data.begin + this.endTime = data.end + }) + } + + setNoDisturbingDate() { + + if (!this.isEffective) { + this.repeatMode = 0 + } + + let noDisturbingTime = { + type: this.repeatMode, begin: this.defaultStartTime, end: this.defaultEndTime + } + NoDisturbingModel.setNoDisturbingDate(noDisturbingTime, () => { + Log.showInfo(TAG, 'setNoDisturbingDate is success') + }) + } + + setClues() { + Log.showInfo(TAG, `setClues`) + let repeadName + if (this.repeatMode == 2) { + this.isEffective = true + repeadName = ConfigData.EVERY_DAY_NAME + } else { + this.isEffective = false + repeadName = '' + } + + if (this.startTime > this.endTime) { + this.prompt = repeadName + this.startTime + ' - ' + ConfigData.NEXT_DAY_NAME + this.endTime + } else { + this.prompt = repeadName + this.startTime + ' - ' + this.endTime + } + this.defaultStartTime = this.getDateByHHMI(this.startTime) + this.defaultEndTime = this.getDateByHHMI(this.endTime) + } + + getDateByHHMI(selectDate: string): Date{ + Log.showInfo(TAG, `getDateByHHMI selectDate:` + selectDate) + let tempDate: Date = new Date() + let HHmiArr = selectDate.split(':') + let hour = parseInt(HHmiArr[0]) + let minute = parseInt(HHmiArr[1]) + tempDate = new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDay(), + hour, minute, tempDate.getSeconds()) + return tempDate; + } +} + diff --git a/features/managementcomponent/src/main/resources/base/element/color.json b/features/managementcomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..bc1887d5 --- /dev/null +++ b/features/managementcomponent/src/main/resources/base/element/color.json @@ -0,0 +1,32 @@ +{ + "color": [ + { + "name": "background_color", + "value": "#0xDCDCDC" + }, + { + "name": "background_transparent", + "value": "#00000000" + }, + { + "name": "appitem_label_fontcolor", + "value": "#333333" + }, + { + "name": "appitem_version_fontcolor", + "value": "#999999" + }, + { + "name": "divider_color", + "value": "#E3E3E3" + }, + { + "name": "itemComp_title_color", + "value": "#333333" + }, + { + "name": "itemComp_font_color", + "value": "#666666" + } + ] +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/resources/base/element/float.json b/features/managementcomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..1f949361 --- /dev/null +++ b/features/managementcomponent/src/main/resources/base/element/float.json @@ -0,0 +1,216 @@ +{ + "float": [ + { + "name": "page_margin_l", + "value": "10" + }, + { + "name": "page_margin_r", + "value": "10" + }, + { + "name": "page_margin_t", + "value": "5" + }, + { + "name": "page_margin_b", + "value": "5" + }, + { + "name": "page_title_font", + "value": "24" + }, + { + "name": "page_title_height", + "value": "100" + }, + { + "name": "page_phrases_font", + "value": "18" + }, + { + "name": "page_phrases_height", + "value": "40" + }, + { + "name": "dialog_title_height", + "value": "60" + }, + { + "name": "dialog_title_font", + "value": "28" + }, + { + "name": "dialog_title_margin_l", + "value": "30" + }, + { + "name": "dialog_button_font", + "value": "24" + }, + { + "name": "dialog_button_height", + "value": "60" + }, + { + "name": "timeDialog_height", + "value": "400" + }, + { + "name": "timeDialog_datePicker_height", + "value": "280" + }, + { + "name": "repeatDialog_cont_font", + "value": "22" + }, + { + "name": "repeatDialog_height", + "value": "250" + }, + { + "name": "border_width", + "value": "1" + }, + { + "name": "border_radius", + "value": "30" + }, + { + "name": "image_border_radius", + "value": "15" + }, + { + "name": "appitem_item_height", + "value": "70" + }, + { + "name": "appitem_icon_width", + "value": "50" + }, + { + "name": "appitem_icon_height", + "value": "50" + }, + { + "name": "appitem_icon_margin_r", + "value": "10" + }, + { + "name": "appitem_label_margin_t", + "value": "10" + }, + { + "name": "appitem_labelmargin_b", + "value": "5" + }, + { + "name": "appitem_label_font", + "value": "20" + }, + { + "name": "appitem_version_font", + "value": "18" + }, + { + "name": "appitem_version_margin_b", + "value": "10" + }, + { + "name": "appitem_version_margin_r", + "value": "10" + }, + { + "name": "arrow_icon_width", + "value": "40" + }, + { + "name": "arrow_icon_height", + "value": "40" + }, + { + "name": "toggle_comp_width", + "value": "60" + }, + { + "name": "toggle_comp_height", + "value": "40" + }, + { + "name": "toggle_check_width", + "value": "25" + }, + { + "name": "divider_margin_l", + "value": "70" + }, + { + "name": "divider_margin_r", + "value": "30" + }, + { + "name": "divider_height", + "value": "20" + }, + { + "name": "itemComp_height", + "value": "120" + }, + { + "name": "itemComp_titel_font", + "value": "22" + }, + { + "name": "itemComp_value_font", + "value": "20" + }, + { + "name": "itemComp_image_width", + "value": "40" + }, + { + "name": "itemComp_image_height", + "value": "40" + }, + { + "name": "itemComp_padding_l", + "value": "15" + }, + { + "name": "itemComp_padding_r", + "value": "15" + }, + { + "name": "itemComp_margin_b", + "value": "30" + }, + { + "name": "slotComp_font", + "value": "20" + }, + { + "name": "slotComp_image_width", + "value": "40" + }, + { + "name": "slotComp_image_height", + "value": "40" + }, + { + "name": "slotComp_margin_t", + "value": "20" + }, + { + "name": "switchComp_titel_font", + "value": "20" + }, + { + "name": "switchComp_height", + "value": "70" + }, + { + "name": "switchComp_padding_r", + "value": "15" + } + ] +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/resources/base/element/string.json b/features/managementcomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..4a9215a3 --- /dev/null +++ b/features/managementcomponent/src/main/resources/base/element/string.json @@ -0,0 +1,76 @@ +{ + "string": [ + { + "name": "notification", + "value": "通知" + }, + { + "name": "notificationManagement", + "value": "通知管理" + }, + { + "name": "batch_Management", + "value": "批量管理" + }, + { + "name": "version", + "value": "版本 " + }, + { + "name": "allowNotification", + "value": "允许通知" + }, + { + "name": "noDisturb", + "value": "免打扰" + }, + { + "name": "slotType", + "value": "类别" + }, + { + "name": "slot_unknown", + "value": "此应用未发布任何通知" + }, + { + "name": "slot_social_communication", + "value": "社会交往" + }, + { + "name": "slot_service_information", + "value": "服务信息" + }, + { + "name": "slot_content_information", + "value": "内容信息" + }, + { + "name": "slot_other", + "value": "其他" + }, + { + "name": "startTime", + "value": "开始时间" + }, + { + "name": "endTime", + "value": "结束时间" + }, + { + "name": "repeat", + "value": "重复" + }, + { + "name": "daily", + "value": "每天" + }, + { + "name": "cancel", + "value": "取消" + }, + { + "name": "confirm", + "value": "确定" + } + ] +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/resources/base/media/ic_back.svg b/features/managementcomponent/src/main/resources/base/media/ic_back.svg new file mode 100644 index 00000000..efbe194a --- /dev/null +++ b/features/managementcomponent/src/main/resources/base/media/ic_back.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/features/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg b/features/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg new file mode 100644 index 00000000..ff6293ce --- /dev/null +++ b/features/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + diff --git a/features/managementcomponent/src/main/resources/en_US/element/string.json b/features/managementcomponent/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..dbb19a68 --- /dev/null +++ b/features/managementcomponent/src/main/resources/en_US/element/string.json @@ -0,0 +1,76 @@ +{ + "string": [ + { + "name": "notification", + "value": "Notification" + }, + { + "name": "notificationManagement", + "value": "Notification Management" + }, + { + "name": "batch_Management", + "value": "Batch Management" + }, + { + "name": "version", + "value": "ver. " + }, + { + "name": "allowNotification", + "value": "Allow Notification" + }, + { + "name": "noDisturb", + "value": "No Disturbing" + }, + { + "name": "slotType", + "value": "Slot Type" + }, + { + "name": "slot_unknown", + "value": "No notice has been issued" + }, + { + "name": "slot_social_communication", + "value": "Social Communication" + }, + { + "name": "slot_service_information", + "value": "Service Information" + }, + { + "name": "slot_content_information", + "value": "Content Information" + }, + { + "name": "slot_other", + "value": "Other" + }, + { + "name": "startTime", + "value": "Start Time" + }, + { + "name": "endTime", + "value": "End Time" + }, + { + "name": "repeat", + "value": "Repeat" + }, + { + "name": "daily", + "value": "Daily" + }, + { + "name": "cancel", + "value": "Cancel" + }, + { + "name": "confirm", + "value": "Confirm" + } + ] +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/resources/zh_CN/element/string.json b/features/managementcomponent/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..5473eac6 --- /dev/null +++ b/features/managementcomponent/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,77 @@ +{ + "string": [ + { + "name": "notification", + "value": "通知" + }, + { + "name": "notificationManagement", + "value": "通知管理" + }, + { + "name": "batch_Management", + "value": "批量管理" + }, + { + "name": "version", + "value": "版本 " + }, + { + "name": "allowNotification", + "value": "允许通知" + }, + { + "name": "noDisturb", + "value": "免打扰" + }, + { + "name": "slotType", + "value": "类别" + }, + { + "name": "slot_unknown", + "value": "此应用未发布任何通知" + }, + { + "name": "slot_social_communication", + "value": "社会交往" + }, + { + "name": "slot_service_information", + "value": "服务信息" + }, + { + "name": "slot_content_information", + "value": "内容信息" + }, + { + "name": "slot_other", + "value": "其他" + }, + { + "name": "startTime", + "value": "开始时间" + }, + { + "name": "endTime", + "value": "结束时间" + }, + { + "name": "repeat", + "value": "重复" + }, + { + "name": "daily", + "value": "每天" + }, + + { + "name": "cancel", + "value": "取消" + }, + { + "name": "confirm", + "value": "确定" + } + ] +} \ No newline at end of file diff --git a/features/navigationservice/build.gradle b/features/navigationservice/build.gradle index adf55660..a690a302 100644 --- a/features/navigationservice/build.gradle +++ b/features/navigationservice/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.huawei.ohos.library' ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 4 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } buildTypes { release { diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets index f776fa12..f0f66d52 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets @@ -14,17 +14,18 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import commonevent from '@ohos.commonevent'; import Constants from './common/constants.ets'; import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; import Input from '@ohos.multimodalInput.inputEventClient'; - +import settings from '@ohos.settingsnapi'; +import featureAbility from '@ohos.ability.featureAbility'; const TAG = 'KeyCodeEvent' let res; let mFeatureAbilityManager = new FeatureAbilityManager(); -export class KeyCodeEvent{ - +export class KeyCodeEvent { public sendKeyEvent(keyCode: number, eventType: number) { Log.showInfo(TAG, `sendKeyEvent keycode: ${keyCode} type: ${eventType}`); switch (keyCode) { @@ -32,16 +33,18 @@ export class KeyCodeEvent{ Log.showInfo(TAG, `sendKeyEvent case back type: ${eventType}`); if (eventType === Constants.KEY_DOWN) { Log.showInfo(TAG, 'sendKeyEvent, if'); - this.sendBackKeyEventStart();//down + this.sendBackKeyEventStart(); //down } else if (eventType === Constants.KEY_UP) { Log.showInfo(TAG, `sendKeyEvent, else type: ${eventType}`); - this.sendBackKeyEventEnd();//up + this.sentEvnt(); + this.sendBackKeyEventEnd(); //up } break; case Constants.KEYCODE_HOME: Log.showInfo(TAG, `sendKeyEvent case home type: ${eventType}`); if (eventType === Constants.KEY_UP) { Log.showInfo(TAG, 'sendKeyEvent, if'); + this.sentEvnt(); this.sendHomeKeyEvent(); } break; @@ -49,6 +52,7 @@ export class KeyCodeEvent{ Log.showInfo(TAG, `sendKeyEvent case recent type: ${eventType}`); if (eventType === Constants.KEY_UP) { Log.showInfo(TAG, 'sendKeyEvent, if'); + this.sentEvnt(); this.sendRecentKeyEvent(); } break; @@ -71,7 +75,7 @@ export class KeyCodeEvent{ maxKeyCode: 10008 } res = Input.injectEvent({ - KeyEvent:keyEvent + KeyEvent: keyEvent }); Log.showInfo(TAG, `injectEventHandler injectEventSync down res: ${res}`); } @@ -88,7 +92,7 @@ export class KeyCodeEvent{ maxKeyCode: 10008 } res = Input.injectEvent({ - KeyEvent:keyEvent + KeyEvent: keyEvent }); } @@ -112,7 +116,22 @@ export class KeyCodeEvent{ } }); } + + private sentEvnt() { + let commonEventPublishData = { + code: 1, + data: JSON.stringify({ + callType: 1 + }) + } + + commonevent.publish('SET_STATUSBAR_MIN_EVENT', commonEventPublishData, (err, data) => { + console.log(`sendEvent err ${JSON.stringify(err)}`); + console.log(`sendEvent data ${JSON.stringify(data)}`); + }); + } } let keyCodeEvent = new KeyCodeEvent(); -export default keyCodeEvent as KeyCodeEvent; \ No newline at end of file + +export default keyCodeEvent as KeyCodeEvent; diff --git a/features/noticeitem/.gitignore b/features/noticeitem/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/noticeitem/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/noticeitem/build.gradle b/features/noticeitem/build.gradle index 1dba0fa5..ae402d92 100644 --- a/features/noticeitem/build.gradle +++ b/features/noticeitem/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.huawei.ohos.library' ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 4 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } buildTypes { release { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ets new file mode 100644 index 00000000..9f6f55d0 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ets @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import WantAgent from '@ohos.wantAgent'; + +const TAG = 'CommonUtil'; +const DEFAULT_INFO = { + code: 0, + want: '', + permission: '', + extraInfo: {} +}; + +export default class CommonUtil { + static startWant(want, triggerInfo?: any) { + let info = (triggerInfo) ? triggerInfo : DEFAULT_INFO; + Log.showInfo(TAG, `startWant ${JSON.stringify(want)}, info ${JSON.stringify(info)}`); + WantAgent.trigger(want, triggerInfo, ((err, data) => { + Log.showInfo(TAG, `wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); + })); + } +} + + + diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets index 3b894b26..347c7973 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets @@ -16,7 +16,7 @@ export default class Constants { static NOTIFICATION_TYPE_BASIC: string = '0'; static NOTIFICATION_TYPE_LONG: string = '1'; - static NOTIFICATION_TYPE_IMAGE: string = '2'; + static NOTIFICATION_TYPE_PICTURE: string = '2'; static NOTIFICATION_TYPE_MULTILINE: string = '4'; static NOTIFICATION_TYPE_SOCIAL: string = '3'; static NOTIFICATION_TYPE_MEDIA: string = '5'; @@ -31,4 +31,53 @@ export default class Constants { static DEFAULT_MAX_LINES: number= 1; static EXPENDED_MAX_LINES: number= 8; static CONTENT_LINE_HEIGHT: number = 20; -} \ No newline at end of file + static SETTING_CONT_HEIGHT = '50'; + static SETTING_DIALOG_WITH = '80%'; + static SETTING_CONTENT_WITH = '100%' + static SETTING_DIALOG_HEIGHT = '380'; + static CONFIRM_DIALOG_HEIGHT = '250' + static CONFIRM_DIALOG_WITH = '80%' + static CONFIRM_BUTTON_WITH = '50%' + static QUICKLY_SETTING_H = 83; + static ERROR_CALLBACK: number = 0; + static SUCCESS_CALLBACK: number = 1; + static KEY_INPUT: string = 'inputAction'; +} + +export class InputActionButtonData { + isSending: boolean = false; + content: string = ''; +} + +export interface NotificationItemData { + id: string; + hashcode: string; + contentType: string; + timestamp: number; + time: string; + appName: string; + want: any; + actionButtons: any[]; + bundleName: string; + smallIcon?: PixelMap | string; + largeIcon?: PixelMap | string; + picture?: PixelMap; + title?: string; + text?: string; + additionalText?: string; + briefText?: string; + expandedTitle?: string; + longText?: string; + lines?: any[]; + longTitle?: string; + slotLevel?: any; + source?: number; + versionName?: string; +} + +export interface NotificationServiceListener { + onNotificationConsume?: (data: NotificationItemData) => void; + onNotificationLoad?: (data: NotificationItemData) => void; + onNotificationCancel?: (data: NotificationItemData) => void; +} + diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets new file mode 100644 index 00000000..10ab1659 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021 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 ReadConfigUtil from '../../../../../../../../../common/src/main/ets/default/ReadConfigUtil.ets'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; + +const FILE_URI = '/data/accounts/account_0/applications/com.ohos.systemui' ++ '/com.ohos.systemui.statusbar/assets/{0}/resources/rawfile/notificationConfig.json' + +const TAG = 'NotificationConfig' + +export class NotificationConfig { + static USE_NOTIFICATION_ICON = true; + + readNotificationConfig(deviceType: string): any{ + Log.showInfo(TAG, `readSlidingLength deviceType:${deviceType}`); + let notificationConfig = ReadConfigUtil.ReadConfigFile(FILE_URI.replace('{0}', deviceType)) + return notificationConfig + } +} + +let notificationConfig = new NotificationConfig(); + +export default notificationConfig as NotificationConfig; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets new file mode 100644 index 00000000..00b4656d --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 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 { NotificationSubscriber } from './notification/notificationSubscriber'; +import Notification from '@ohos.notification'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'NotificationManager'; + +export default class NotificationManager { + static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; + static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; + static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; + static TYPE_PICTURE: number = Notification.ContentType.NOTIFICATION_CONTENT_PICTURE; + + static subscribeNotification(tag, subscriber, asyncCallback) { + Log.showInfo(TAG, `subscribeNotification from: ${tag}`); + Notification.subscribe(subscriber, asyncCallback); + } + + static unsubscribeNotification(tag, subscriber) { + Log.showInfo(TAG, `subscribeNotification from: ${tag}`); + Notification.unsubscribe(subscriber); + } + + static removeAll(tag, callback) { + Log.showInfo(TAG, `removeAll from: ${tag}`); + Notification.removeAll(callback); + } + + static remove(tag, hashCode, callback) { + Log.showInfo(TAG, `remove from: ${tag}`); + Notification.remove(hashCode, callback) + } + + static getAllActiveNotifications(tag, callback) { + Log.showInfo(TAG, `getAllActiveNotifications from: ${tag}`); + Notification.getAllActiveNotifications(callback); + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets new file mode 100644 index 00000000..3dc91759 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2021 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 notification from '@ohos.notification'; +import NotificationSubscriber from '@ohos.notificationSubscriber'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import NotificationManager from './NotificationManager.ets'; +import ParseDataUtil from './ParseDataUtil.ets'; + +const TAG = 'NotificationService'; + +let mSubscriber; +let listeners; + +/** + * notification service api + */ +export class NotificationService { + constructor() { + listeners = []; + this.init(); + } + + init() { + this.loadAllNotifications(); + this.subscribeNotification(this.getSubscriber()); + } + + public register(listener) { + Log.showInfo(TAG, "register listener") + listeners.push(listener); + } + + public unRegister(listener) { + Log.showInfo(TAG, "unRegister listener") + let removedIndex = listeners.indexOf(listener); + if (removedIndex == -1) { + Log.showInfo(TAG, "unRegister listener, listener is not found"); + return; + } + listeners.splice(removedIndex, 1) + Log.showInfo(TAG, "unRegister listener success"); + } + + + public removeAll(){ + Log.showInfo(TAG, 'removeAll start'); + NotificationManager.removeAll(TAG, (data) => { + Log.showInfo(TAG, `removeAll => data: ${JSON.stringify(data)}`); + }); + } + + + public remove(code: string) { + NotificationManager.remove(TAG, code,(data) => { + Log.showInfo(TAG, `removeNotificationItem ==> data: ${JSON.stringify(data)}`); + }) + } + + public loadAllNotifications() { + NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { + Log.showInfo(TAG, `getAllActiveNotifications err: ${JSON.stringify(err)}`); + Log.showInfo(TAG, `getAllActiveNotifications requestsArr: ${JSON.stringify(requestsArr)}`); + if (Array.isArray(requestsArr)) { + for(let i = 0,len = requestsArr.length; i< len; i++) { + this.handleNotificationLoad(requestsArr[i]); + } + } + }) + } + + getSubscriber() { + if (mSubscriber == null || mSubscriber == undefined) { + mSubscriber = { + onConsume: this.handleNotificationAdd.bind(this), + onCancel: this.handleNotificationCancel.bind(this), + } + } + return mSubscriber; + } + + handleNotificationAdd(data) { + Log.showInfo(TAG, 'handleNotificationAdd started'); + Log.showInfo(TAG, 'sortingMap' + JSON.stringify(data.sortingMap||{})); + Log.showInfo(TAG, JSON.stringify(data)); + ParseDataUtil.parseData(data, (err, record) => { + Log.showInfo(TAG, `parseData after = ${JSON.stringify(record)}`); + Log.showInfo(TAG, `listeners.length = ${JSON.stringify(data)}`); + for(let i = 0,len = listeners.length; i< len; i++) { + Log.showInfo(TAG, `notify listener ` + i); + listeners[i].onNotificationConsume(record); + } + }); + } + + handleNotificationCancel(data) { + console.info("===>handleNotificationCancel data : ==> " + `data:${JSON.stringify(data)}`); + ParseDataUtil.parseData(data, (err, record) => { + for(let i = 0,len = listeners.length; i< len; i++) { + listeners[i].onNotificationCancel(record); + } + }); + } + + handleNotificationLoad(data) { + console.info("===>handleNotificationLoad data : ==> " + `data:${JSON.stringify(data)}`); + ParseDataUtil.parseData(data, (err, record) => { + for(let i = 0,len = listeners.length; i< len; i++) { + listeners[i].onNotificationLoad(record); + } + }); + } + + subscribeNotification(subscriber) { + let callback = (err,data) => { + Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + }; + NotificationManager.subscribeNotification(TAG, subscriber, callback); + } +} + +let notificationService = new NotificationService(); +export default notificationService as NotificationService; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ets new file mode 100644 index 00000000..a25ce2d2 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ets @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; + +const TAG = `NotificationWindowManager`; + +class NotificationWindowManager { + mWindowManager: WindowManager = new WindowManager(); + + showNotificationWindow() { + // todo show Notification window + } + + hideNotificationWindow() { + Log.showInfo(TAG, 'hide Notification window'); + AppStorage.Set("showStatusBar", true); + this.mWindowManager.setWindowMin((result) => { + Log.showInfo(TAG, `setWindowMin ${result}`); + }); + } +} + +let sNotificationWindowManager = new NotificationWindowManager(); + +export default sNotificationWindowManager as NotificationWindowManager; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets new file mode 100644 index 00000000..b5194398 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2021 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 Notification from '@ohos.notification'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import BundleManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager.ets'; +import NotificationManager from './NotificationManager.ets'; +import Constants, {NotificationItemData} from '../common/constants.ets'; +import {NotificationConfig} from './NotificationConfig.ets'; + +let mDate; +let mAppName; +let mEmptyArray; +const TAG = 'Notification_ParseDataUtil'; +mDate = new Date(); +mAppName = new Map(); +mEmptyArray = []; +let appDataMap = new Map(); + +/** + * parse data util class. + */ +export default class ParseDataUtil { + static parseData(data, callback) { + let request = data?.request; + if (request == null || request == undefined) { + Log.showInfo(TAG, 'consumeCallback request is empty'); + callback(Constants.ERROR_CALLBACK, undefined); + return; + } + let slotLevel; + try { + slotLevel = data?.sortingMap?.sortings[request.hashCode]?.slot.level; + } catch (e) { + Log.showInfo(TAG, `slot level get error: ${e.toString()}`); + } + Log.showInfo(TAG, `want = ${JSON.stringify(request.wantAgent)}`); + Log.showInfo(TAG, `actionButtons = ${JSON.stringify(request.actionButtons)}`); + Log.showInfo(TAG, `largeIcon = ${request.largeIcon}`); + ParseDataUtil.getAppData(request.creatorBundleName, (err, appMessage) => { + let notificationItem: NotificationItemData = { + id: request.id, + hashcode: request.hashCode, + contentType: request?.content?.contentType + '', + timestamp: request.deliveryTime, + time: ParseDataUtil.getStandardTime(request.deliveryTime), + appName: appMessage.appName, + want: request.wantAgent, + bundleName: request.creatorBundleName, + actionButtons: request.actionButtons, + smallIcon: NotificationConfig.USE_NOTIFICATION_ICON ? (request?.smallIcon ?? appMessage.icon) : appMessage.icon, + largeIcon: request.largeIcon, + slotLevel: slotLevel, + source: request.source + }; + Log.showInfo(TAG, `notificationItem construct over ====================`); + switch (request?.content?.contentType) { + case NotificationManager.TYPE_BASIC: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_BASIC_TEXT ====================`); + notificationItem.title = request.content.normal?.title ?? ''; + notificationItem.text = request.content.normal?.text ?? ''; + notificationItem.additionalText = request.content.normal?.additionalText ?? ''; + break; + case NotificationManager.TYPE_LONG: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_LONG_TEXT ====================`); + notificationItem.title = request.content.longText?.title ?? ''; + notificationItem.text = request.content.longText?.text ?? ''; + notificationItem.additionalText = request.content.longText?.additionalText ?? ''; + notificationItem.briefText = request.content.longText?.briefText ?? ''; + notificationItem.expandedTitle = request.content.longText?.expandedTitle ?? ''; + notificationItem.longText = request.content.longText?.longText ?? ''; + break; + case NotificationManager.TYPE_MULTI: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_MULTILINE ====================`); + notificationItem.title = request.content.multiLine?.title ?? ''; + notificationItem.text = request.content.multiLine?.text ?? ''; + notificationItem.additionalText = request.content.multiLine?.additionalText ?? ''; + notificationItem.briefText = request.content.multiLine?.briefText ?? ''; + notificationItem.longTitle = request.content.multiLine?.longTitle ?? ''; + notificationItem.lines = request.content.multiLine?.lines ?? mEmptyArray; + Log.showInfo(TAG, `multilines: ${JSON.stringify(request.content.multiLine?.lines)}`) + break; + case NotificationManager.TYPE_PICTURE: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_PICTURE ====================`); + notificationItem.title = request.content.picture?.title ?? ''; + notificationItem.text = request.content.picture?.text ?? ''; + notificationItem.additionalText = request.content.picture?.additionalText ?? ''; + notificationItem.briefText = request.content.picture?.briefText ?? ''; + notificationItem.expandedTitle = request.content.picture?.expandedTitle ?? ''; + Log.showInfo(TAG, `picture value` + request.content.picture.picture); + notificationItem.picture = request.content.picture?.picture ?? ''; + break; + default: + Log.showInfo(TAG, 'no match content type'); + break; + } + callback(Constants.SUCCESS_CALLBACK, notificationItem); + }) + } + + /** + * Get app data by bundleName. + * + * @param {string} bundleName - BundleName of the target app. + * @return {object} appData + */ + static getAppData(bundleName, callback) { + Log.showInfo(TAG, 'getAppName start ===================='); + if (appDataMap.has(bundleName)) { + callback(Constants.SUCCESS_CALLBACK, appDataMap.get(bundleName)); + return; + } + BundleManager.getBundleInfo(TAG, bundleName, 0, (data) => { + Log.showInfo(TAG, `getBundleInfo` + JSON.stringify(data)); + let labelId = data.appInfo.labelId; + let iconId = data.appInfo.iconId; + let appName = ''; + BundleManager.getResourceManager(TAG, bundleName, (item) => { + Log.showInfo(TAG, `BundleManager.getResourceManager ${BundleManager.getResourceManager}`); + item.getString(labelId, (error, value) => { + Log.showInfo(TAG, `getString` + JSON.stringify(value)); + if (value != null && value != undefined) { + appName = value + } + item.getMediaBase64(iconId, (error, MediaValue) => { + Log.showInfo(TAG, `getMediaBase64` + JSON.stringify(MediaValue)); + if (MediaValue != null) { + let appMessage = { + 'appName': appName, + 'icon': MediaValue + } + Log.showInfo(TAG, `appDataMap set appInfo, appName = ` + JSON.stringify(appName)); + if (appName != null && appName != undefined && appName != '') { + appDataMap.set(bundleName, appMessage); + } + Log.showInfo(TAG, `getAppData success, appMessage ` + JSON.stringify(appMessage)); + callback(Constants.SUCCESS_CALLBACK, appDataMap.get(bundleName)); + } + }); + }) + }) + }); + } + + /** + * Reformat the timestamp to hh:mm. + * + * @param {number} timestamp - Target timestamp. + */ + static getStandardTime(timestamp) { + Log.showInfo(TAG, 'getStandardTime start ===================='); + if (timestamp == 0 || timestamp == undefined || timestamp == null) { + return ''; + } + mDate.setTime(timestamp); + let hoursNumber = mDate.getHours(); + let minutesNumber = mDate.getMinutes(); + let hours = hoursNumber < 10 ? '0' + hoursNumber : hoursNumber; + let minutes = minutesNumber < 10 ? '0' + minutesNumber : minutesNumber; + return hours + ':' + minutes; + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets new file mode 100644 index 00000000..ddf8ff81 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2021 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 interface RuleData { + isAllowBanner:boolean; + sound:string; + vibration:string; + isAllowLockScreen:boolean; +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets new file mode 100644 index 00000000..d0578417 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2021 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 {NotificationItemData} from '../../common/constants.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'RuleController'; + +export default class RuleController { + + + /** + * Check if this notification is allow show or not + * + * @param {notificationItemData} Data of the notification + * @param {callback} Data of the type to show the notification + */ + static getNotificationData(notificationItemData, callback) { + if (typeof notificationItemData !== NotificationItemData) { + Log.showInfo(TAG, "type is not NotificationItemData") + callback(undefined) + return + } + + this.this.isAllowSendNotification(notificationItemData.name, 0, "", (isSuccess) => { + if (!isSuccess) { + Log.showInfo(TAG, "user is not allow this to send notification") + callback(undefined) + return + } + this.isTooMuchNotification((isSuccess) => { + if (!isSuccess) { + Log.showInfo(TAG, "There are too much notification") + callback(undefined) + return + } + this.isAppTooMuchNotification(notificationItemData.name, 0, (isSuccess) => { + if (!isSuccess) { + Log.showInfo(TAG, "There are too much notification") + callback(undefined) + } + this.getNotificationDataByApp(notificationItemData.name, 0, "", (originData) => { + this.updateNotificationDataBySense(originData, (finialData) => { + callback(finalData) + }); + }); + }); + }); + }); + } + + /** + * Check if user allow the app send notification or not + * + * @param {name} Package name of the app + * @param {uid} Uid of the app to distinguish twin app + * @param {channelId} The channel id of the app which is used to send notification + * @param {callback} The user allow the app send notification or not + */ + private static isAllowSendNotification(name, uid, channelId, callback) { + // TODO 权限管理 + } + + /** + * Check there have been too much notification that there is no need to show another + * + * + * @param {callback} Send too much notification or not + */ + private static isTooMuchNotification(callback) { + // TODO 通知总条数显示限制 + } + + /** + * Check if the app send too much notification to can not show another from this app + * + * + * @param {name} Package name of the app + * @param {uid} Uid of the app to distinguish twin app + * @param {callback} Send too much notification or not + */ + private static isAppTooMuchNotification(name, uid, callback) { + // TODO 单应用通知显示限制 + } + + /** + * Get notification data of the notification channel + * + * @param {name} Package name of the app which send notification + * @param {uid} Uid of the app which send notification to distinguish twin app + * @param {channelId} The channel id of the app which is used to send notification + * @param {callback} The type to show notification + */ + private static getNotificationDataByApp(name, uid, channelId, callback) { + // TODO 提醒方式 + } + + /** + * Check the sense of the phone to update the show type + * + * @param {notificationData} The origin notification data + * @param {callback} The finial notification data + */ + private static updateNotificationDataBySense(notificationData, callback) { + // TODO 场景管理 + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets new file mode 100644 index 00000000..2cafbbfa --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import Constants from '../common/constants.ets'; +import NotificationItem from './item/notificationItem.ets' +import ViewModel from '../viewmodel/ViewModel.ets' + +const TAG = 'NoticeItem-NotificationListComponent'; + +@Component +export default struct NotificationListComponent { + @StorageLink('notificationList') notificationList: any[] = [] + @StorageProp('maxHeight') maxHeight: number = 0 + @StorageProp('minHeight') minHeight: number = 0 + @State notificationH: number = 0 + + + aboutToAppear() { + Log.showInfo(TAG, `notificationList, aboutToAppear`) + this.notificationH = this.maxHeight - (this.minHeight * 2) - Constants.QUICKLY_SETTING_H; + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`); + } + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + if (this.notificationList.length == 0) { + //text: no notification + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Text($r('app.string.nonotification_text')) + .fontColor($r('app.color.nonotification_text_color')) + } + } else { + Stack({ alignContent: Alignment.TopStart }) { + List() { + ForEach(this.notificationList, (item: any) => { + ListItem() { + NotificationItem({ itemData: item }) + } + }, (item: any) => item.hashcode.toString()) + } + .onTouch((event: TouchEvent) => { + Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) + event.stopPropagation(); + }) + + Flex() { //bottom Line + }.width('100%').height('7%') + .opacity($r('app.float.deleteall_image_opacity')) + .position({ x: 0, y: '93%' }) + } + .width('100%') + .height('100%') + } + } + .width('100%') + .height(this.notificationH) + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets new file mode 100644 index 00000000..8684ecaf --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import ViewModel from '../../viewmodel/ViewModel.ets'; +import Constants, {InputActionButtonData} from '../../common/constants.ets'; + +const TAG = 'NoticeItem-ActionComponent'; + +@Component +export default struct ActionComponent { + @State showInputText: boolean = false; + @State placeholder: string = ''; + @State inputData: any = undefined; + @State inputActionData: InputActionButtonData = new InputActionButtonData(); + private itemData: any = undefined; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`); + let actionData = AppStorage.Get(Constants.KEY_INPUT + this.itemData.id); + this.inputActionData = (actionData instanceof InputActionButtonData) ? actionData : this.inputActionData; + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`); + } + + build() { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + if (CheckEmptyUtils.isEmpty(this.inputData) && !this.inputActionData.isSending) { + ForEach(this.itemData.actionButtons, (item: any) => { + ActionButton({ + content: item.title, + clickEvent: () => { + if (CheckEmptyUtils.isEmpty(item.userInput)) { + ViewModel.clickItem(this.itemData, item.wantAgent); + } else { + this.inputData = { inputKey: item.userInput.inputKey, wantAgent: item.wantAgent }; + } + } + }) + }) + } else { + TextInput({ placeholder: this.placeholder, text: this.inputActionData.content }) + .type(InputType.Normal) + .borderRadius(12) + .caretColor(Color.Green) + .backgroundColor(Color.White) + .enterKeyType(EnterKeyType.Send) + .height($r("app.float.action_button_height")) + .enabled(this.inputActionData.isSending ? false : true) + .width('80%') + .margin({ right: $r("app.float.action_button_padding") }) + ActionButton({ + content: this.inputActionData.isSending ? $r('app.string.Sending') : $r('app.string.enter'), + clickable: !this.inputActionData.isSending, + clickEvent: () => { + ViewModel.clickReply(this.inputData?.inputKey, this.placeholder, this.inputData?.wantAgent); + this.inputActionData = { + isSending: true, + content: this.placeholder + }; + AppStorage.SetOrCreate(Constants.KEY_INPUT + this.itemData.id, this.inputActionData); + } + }) + } + }.margin({ top: 10 }) + } +} + +@Component +struct ActionButton { + @State backgroundColor: Resource = $r("app.color.transparent"); + @Prop content: string; + clickable: boolean = true; + clickEvent: Function = () => { + }; + + aboutToAppear() { + Log.showInfo(TAG, `ActionButton ${this.content} aboutToAppear Start`); + } + + aboutToDisappear() { + Log.showInfo(TAG, `ActionButton ${this.content} aboutToDisAppear`); + } + + build() { + Text(this.content) + .fontSize(20) + .height($r("app.float.action_button_height")) + .borderRadius(4) + .fontColor($r("app.color.action_button_color")) + .padding({ left: $r("app.float.action_button_padding"), right: $r("app.float.action_button_padding") }) + .backgroundColor(this.backgroundColor) + .onTouch((event: TouchEvent) => { + if (!this.clickable) { + return; + } + if (event.type == TouchType.Down) { + this.backgroundColor = $r("app.color.action_button_click_color"); + } else if (event.type == TouchType.Up) { + this.backgroundColor = $r("app.color.transparent"); + } + }) + .onClick(() => { + if (!this.clickable) { + return; + } + this.clickEvent(); + }) + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets similarity index 86% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets rename to features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets index c7e08ae6..415d257a 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets @@ -13,12 +13,11 @@ * limitations under the License. */ -import Constants from '../common/constants.ets'; -import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; +import Constants,{NotificationItemData} from '../../common/constants.ets'; @Component export default struct BasicItem { - @State itemData: NotificationItemData= undefined + @State itemData: NotificationItemData = undefined build() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets new file mode 100644 index 00000000..96f024fc --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2021 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 Constants from '../../common/constants.ets'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'NoticeItem-Confirm'; + +/** + * confirm dialog + */ +@CustomDialog +export default struct ConfirmDialog { + private title: string + private bundleName: string + public controller: CustomDialogController + public action: () => void + + build() { + + Column({ space: 30 }) { + Row() { + Text(this.title) + .fontSize($r('app.float.confirm_title_fontsize')) + .fontWeight(FontWeight.Bold) + }.width(Constants.SETTING_DIALOG_WITH) + .margin({ top: 20 }) + + Row() { + Text($r('app.string.confirm_message', this.bundleName)) + .fontSize($r('app.float.confirm_cont_fontsize')) + }.width(Constants.SETTING_DIALOG_WITH) + + Row() { + Column() { + Text($r('app.string.cancel')) + .fontSize($r('app.float.confirm_cont_fontsize')) + .fontColor(Color.Blue) + }.onClick(() => { + this.controller.close(); + }) + .alignItems(HorizontalAlign.Center) + .width(Constants.CONFIRM_BUTTON_WITH) + + Divider() + .vertical(true) + .color($r('app.color.confirm_divider_color')) + .strokeWidth(1) + .height($r('app.float.confirm_divider_height')) + Column() { + Text($r('app.string.close')) + .fontSize($r('app.float.confirm_cont_fontsize')) + .fontColor(Color.Red) + + }.onClick(() => { + Log.showInfo(TAG, `confirm button of TimeDialog on click`) + this.controller.close(); + this.action(); + }) + .alignItems(HorizontalAlign.Center) + .width(Constants.CONFIRM_BUTTON_WITH) + } + .width(Constants.CONFIRM_DIALOG_WITH) + .height($r('app.float.confirm_button_height')) + }.height(Constants.CONFIRM_DIALOG_HEIGHT) + + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets similarity index 90% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets rename to features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets index 04ee4abf..b6151895 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets @@ -13,8 +13,7 @@ * limitations under the License. */ -import Constants from '../common/constants.ets'; -import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; +import Constants,{NotificationItemData} from '../../common/constants.ets'; @Component export default diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets similarity index 91% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets rename to features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets index 2cf14928..4b972453 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets @@ -13,8 +13,7 @@ * limitations under the License. */ -import Constants from '../common/constants.ets'; -import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; +import Constants,{NotificationItemData} from '../../common/constants.ets'; @Component export default struct MultiItem { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets similarity index 60% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets rename to features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 3b07e1fc..bae2a964 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -13,25 +13,24 @@ * limitations under the License. */ -import Constants from '../common/constants.ets'; +import Constants, {NotificationItemData} from '../../common/constants.ets'; import basicItem from './basicItem.ets'; import longItem from './longItem.ets'; import multiItem from './multiItem.ets'; -import titleItem from './titleItem'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import mNotificationService from '../../../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' -import WantAgent from '@ohos.wantAgent'; -import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; -import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; +import pictureItem from './pictureItem.ets'; +import titleItem from './titleItem.ets'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import ViewModel from '../../viewmodel/ViewModel.ets'; +import SettingDialog from './settingDialog.ets'; +import ConfirmDialog from './confirmDialog.ets'; +import ActionComponent from './actionComponent.ets'; const TAG = 'NoticeItem-NotificationItem'; -let mWindowManager; @Component export default struct NotificationItem { - @Link showStatusBar: boolean - private itemData: NotificationItemData + private itemData: any = {} @State hasPicture: boolean = false @State isExpand: boolean = false @State needExpand: boolean = true @@ -42,27 +41,45 @@ export default struct NotificationItem { @State moveX: number = 0 @State moveY: number = 0 + settingDialogController: CustomDialogController = new CustomDialogController({ + builder: SettingDialog({ + itemData: this.itemData, + action: this.showConfirmDialog.bind(this) + }), + autoCancel: false, + offset: { dx: 0, dy: 200 } + }); + + confirmDialogController: CustomDialogController = new CustomDialogController({ + builder: ConfirmDialog({ + title: $r('app.string.closeNovice'), + bundleName: this.itemData.name, + action: ViewModel.removeNotificationItem.bind(ViewModel,this.itemData,true) + }), + autoCancel: false, + offset: { dx: 0, dy: 250 } + }); + aboutToAppear() { - Log.showInfo(TAG, `aboutToDisAppear Start`) - mWindowManager = new WindowManager(); + Log.showInfo(TAG, `aboutToAppear Start`) if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { this.hasPicture = false; } else { this.hasPicture = true; } - this.needExpand=this.checkItemNeedExpand() + this.needExpand = this.checkItemNeedExpand() } - checkItemNeedExpand(){ - if(this.itemData.contentType===Constants.NOTIFICATION_TYPE_BASIC&&(!(this.itemData.actionButtons?.length>0))){ + checkItemNeedExpand() { + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC && (!(this.itemData.actionButtons?.length > 0))) { return false; - }else{ + } else { return true; } } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`); + Log.showInfo(TAG, `aboutToDisappear`); } build() { @@ -71,7 +88,7 @@ export default struct NotificationItem { Column() { titleItem({ notificationSmallIcon: this.itemData.smallIcon, - notificationName: this.itemData.name, + notificationName: this.itemData.appName, notificationTime: this.itemData.time, isExpand: $isExpand, needExpand: this.needExpand @@ -96,6 +113,12 @@ export default struct NotificationItem { isExpand: this.isExpand }); } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_PICTURE) { + pictureItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } } .width(this.hasPicture ? '85%' : '100%') .margin({ top: $r('app.float.body_margin_top') }) @@ -108,25 +131,16 @@ export default struct NotificationItem { .height(50) } .alignItems(HorizontalAlign.End) + .margin({ top: $r('app.float.body_margin_top') }) .width('15%') } - }.onClick(this.clickItem.bind(this)) - - if(this.isExpand){ - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - ForEach(this.itemData.actionButtons, (item: any) => { - Text(item.title) - .fontSize(20) - .height(30) - .fontColor(Color.Blue) - .margin({ right: 20 }) - .onClick(() => { - Log.showInfo(TAG, `clickbuttonEvent: ${JSON.stringify(item.wantAgent)}`) - this.startTargetAbility(item.wantAgent) - }) - }) } - .margin({ top: 10 }) + .onClick(() => { + ViewModel.clickItem(this.itemData); + }) + + if (this.isExpand) { + ActionComponent({ itemData: this.itemData }) } } .backgroundColor($r('app.color.notificationitem_background')) @@ -140,20 +154,27 @@ export default struct NotificationItem { .padding({ left: $r('app.float.item_paddingleft'), right: $r('app.float.item_paddingright'), - bottom: $r('app.float.item_paddingbottom') + bottom: this.isExpand ? 0 : $r('app.float.item_paddingbottom') }) .onTouch(this.touchNotificationItem.bind(this)) .width(this.itemWidth) if (this.deleteIconDisplay) { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { - Image($r('app.media.delete')) //delete - .objectFit(ImageFit.Contain) - .width($r('app.float.item_delete_image_width')) - .height($r('app.float.item_delete_image_height')) - .onClick(() => { - this.removeNotificationItem(this.itemData.hashcode); - }) + Row({ space: 30 }) { + Image($r("app.media.ic_setting")) //setting + .objectFit(ImageFit.Contain) + .width($r('app.float.item_delete_image_width')) + .height($r('app.float.item_delete_image_height')) + .onClick(this.showSettingDialog.bind(this)) + Image($r('app.media.delete')) //delete + .objectFit(ImageFit.Contain) + .width($r('app.float.item_delete_image_width')) + .height($r('app.float.item_delete_image_height')) + .onClick(() => { + ViewModel.removeNotificationItem(this.itemData, true); + }) + } } .width('30%') } @@ -161,6 +182,16 @@ export default struct NotificationItem { } } + showSettingDialog() { + Log.showInfo(TAG, `showSettingDialog`) + this.settingDialogController.open() + } + + showConfirmDialog() { + Log.showInfo(TAG, `showConfirmDialog`) + this.confirmDialogController.open() + } + touchNotificationItem(event: TouchEvent) { if (event.type == Constants.TOUCH_TYPE_DOWN) { //down this.startX = event.touches[0].x; @@ -184,41 +215,9 @@ export default struct NotificationItem { this.itemWidth = '70%'; Log.showInfo(TAG, 'display'); } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { - this.removeNotificationItem(this.itemData.hashcode); + ViewModel.removeNotificationItem(this.itemData, true); } } } } - - removeNotificationItem(hashCode: string) { - Log.showInfo(TAG, 'removeNotificationItem'); - mNotificationService.removeNotificationItem(hashCode, true); - } - - clickItem() { - Log.showInfo(TAG, 'click Item'); - this.startTargetAbility(this.itemData.want); - } - - startTargetAbility(want) { - Log.showInfo(TAG, 'startTargetAbility'); - //close window - this.showStatusBar = true; - mWindowManager.setWindowMin((result) => { - Log.showInfo(TAG, `setWindowMin ${result}`); - }); - //open app - Log.showInfo(TAG, `itemClick wantAgent ${JSON.stringify(this.itemData.want)} id: ${this.itemData.id}`); - let TriggerInfo = { - code: 0, - want: '', - permission: '', - extraInfo: {} - }; - WantAgent.trigger(want, TriggerInfo, ((err, data) => { - Log.showInfo(TAG, `itemClick wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); - })); - //remove notification - this.removeNotificationItem(this.itemData.hashcode); - } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets new file mode 100644 index 00000000..e4c966ea --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021 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 Constants, {NotificationItemData} from '../../common/constants.ets'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; + +@Component +export default struct PictureItem { + @State itemData: NotificationItemData= undefined + @Prop isExpand: boolean + + build() { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.isExpand ? this.itemData.expandedTitle : this.itemData.title) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + Text(this.isExpand ? this.itemData.text : this.itemData.briefText) + .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .constraintSize({ maxHeight: $r('app.float.notification_expanded_text_maxheight') }) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .margin({ top: $r('app.float.content_margin_top') }) + if (!CheckEmptyUtils.isEmpty(this.itemData.picture) && this.isExpand) { + Column() { + Image(this.itemData.picture) + .objectFit(ImageFit.Contain) + .height($r("app.float.picture_default_height")) + } + .margin({ top: $r('app.float.content_margin_top') }) + } + } + } + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets new file mode 100644 index 00000000..4c011d83 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2021 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 Constants,{NotificationItemData} from '../../common/constants.ets'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import FeatureAbilityManager from '../../../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; +import WindowManager from '../../../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import Notification from '@ohos.notification'; + +const TAG = 'NoticeItem-Setting'; + +/** + * Setting dialog + */ +@CustomDialog +export default struct SettingDialog { + private itemData: NotificationItemData + public controller: CustomDialogController + public action: () => void + + build() { + + Column({ space: 30 }) { + Row({ space: 10 }) { + if (!CheckEmptyUtils.isEmpty(this.itemData.smallIcon)) { + Image(this.itemData.smallIcon) + .objectFit(ImageFit.Contain) + .width($r('app.float.title_image_width')) + .height($r('app.float.title_image_height')) + } + Text(this.itemData.appName) + .fontSize($r('app.float.setting_title_fontsize')) + }.width(Constants.SETTING_DIALOG_WITH) + .margin({ top: 50 }) + + Row() { + Column() { + Text($r('app.string.closeNotification')) + .fontSize($r('app.float.setting_cont_fontsize')) + .fontColor($r('app.color.dialog_font_color')) + .height(Constants.SETTING_CONT_HEIGHT) + + }.alignItems(HorizontalAlign.Center) + .width(Constants.SETTING_CONTENT_WITH) + } + .width(Constants.SETTING_DIALOG_WITH) + .alignItems(VerticalAlign.Center) + .align(Alignment.Center) + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.setting_border_radius') }) + .backgroundColor($r('app.color.dialog_font_back_color')) + .onClick(this.closeNotification.bind(this)) + + Row() { + Column() { + Text($r('app.string.moreSettings')) + .fontSize($r('app.float.setting_cont_fontsize')) + .fontColor($r('app.color.dialog_font_color')) + .height(Constants.SETTING_CONT_HEIGHT) + }.alignItems(HorizontalAlign.Center) + .width(Constants.SETTING_CONTENT_WITH) + } + .width(Constants.SETTING_DIALOG_WITH) + .alignItems(VerticalAlign.Center) + .align(Alignment.Center) + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.setting_border_radius') }) + .backgroundColor($r('app.color.dialog_font_back_color')) + .onClick(this.openAbility.bind(this)) + + Row() { + Column() { + Text($r('app.string.cancel')) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.setting_cont_fontsize')) + .fontColor($r('app.color.dialog_font_back_color')) + .height(Constants.SETTING_CONT_HEIGHT) + }.alignItems(HorizontalAlign.Center) + .width(Constants.SETTING_CONTENT_WITH) + } + .width(Constants.SETTING_DIALOG_WITH) + .alignItems(VerticalAlign.Center) + .align(Alignment.Center) + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.setting_border_radius') }) + .backgroundColor($r('app.color.dialog_font_color')) + .onClick(this.closeAbility.bind(this)) + }.height(Constants.SETTING_DIALOG_HEIGHT) + } + + closeNotification() { + this.action() + this.closeAbility() + } + + openAbility() { + Log.showInfo(TAG, ` openAbility:showNotificationManagement`) + let mWindowManager = new WindowManager(); + mWindowManager.setWindowMin((result) => { + Log.showInfo(TAG, `showNotificationManagement setWindowMin`) + let mFeatureAbilityManager = new FeatureAbilityManager() + mFeatureAbilityManager.openAbility(TAG, { + want: { + bundleName: 'com.ohos.systemui', + abilityName: 'com.ohos.systemui.notificationmanagement.MainAbility' + } + }); + }); + AppStorage.Set("showStatusBar", true); + this.closeAbility() + } + + closeAbility() { + Log.showInfo(TAG, `closeAbility`) + this.controller.close() + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets similarity index 89% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets rename to features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets index c2d73539..beaaa7eb 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets @@ -13,9 +13,9 @@ * limitations under the License. */ -import Constants from '../common/constants.ets'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import Constants from '../../common/constants.ets'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; const TAG = 'NoticeItem-TitleItem'; @@ -50,7 +50,6 @@ struct TitleItem { } Text(this.notificationName) .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) .fontSize($r('app.float.title_name_fontsize')) .flexShrink(1) Text(this.notificationTime) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets new file mode 100644 index 00000000..8e163887 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import media from '@ohos.multimedia.media'; +import wantAgent from '@ohos.wantAgent'; +import SourceType from '@ohos.notification' +import NotificationService from '../model/NotificationService.ets' +import NotificationWindowManager from '../model/NotificationWindowManager.ets'; +import NotificationConfig from '../model/NotificationConfig.ets'; +import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import CommonUtil from '../common/CommonUtil.ets'; +import Constants from '../common/constants.ets'; + +const TAG = 'NotificationViewModel'; +const GROUP_THRESHOLD = 10; +/** + * Notification ViewModel class. + */ +export class ViewModel { + audioPlayer: any + mNotificationList: any[]; + mAppNotificationCount: any; + mCallback: any; + mNotificationCtrl: any = {} + + constructor() { + let tempLink = AppStorage.SetAndLink('notificationList', []); + this.mNotificationList = tempLink.get(); + this.mAppNotificationCount = new Map(); + this.audioPlayer = media.createAudioPlayer(); + this.audioPlayer.src = 'file://system/etc/Light.ogg'; + this.registerCallback(); + this.loadFlowControlInfos() + } + + registerCallback() { + this.mCallback = { + onNotificationConsume: this.onNotificationConsume.bind(this), + onNotificationCancel: this.onNotificationCancel.bind(this), + onNotificationLoad: this.onNotificationLoad.bind(this) + } + NotificationService.register(this.mCallback); + } + + unregisterCallback() { + NotificationService.unRegister(this.mCallback); + } + + + /** + * notification CancelCallback + * + * @param {Object} data - return notificationItemData. + */ + onNotificationConsume(notificationItemData) { + Log.showInfo(TAG, `onNotificationConsume ${JSON.stringify(notificationItemData)}`); + //Verify the notifications can be displayed + if (!this.isCanShow(notificationItemData.bundleName)) { + //can not displayed + return; + } + if (!this.mAppNotificationCount.has(notificationItemData.appName)) { + this.mAppNotificationCount.set(notificationItemData.appName, 0); + } + this.mAppNotificationCount[notificationItemData.appName] += 1; + if (this.mAppNotificationCount[notificationItemData.appName] >= GROUP_THRESHOLD) { + this.groupNotification(notificationItemData, this.mAppNotificationCount[notificationItemData.appName]); + } else { + // Todo Sort Insert + this.mNotificationList.unshift(notificationItemData); + this.updateFlowControlInfos(notificationItemData.bundleName, true) + this.updateNotification(); + } + // Todo doAction(notificationItemData); + } + + /** + * notification CancelCallback + */ + onNotificationCancel(notificationItemData) { + Log.showInfo(TAG, `onNotificationCancel ${JSON.stringify(notificationItemData)}`); + if (this.mAppNotificationCount[notificationItemData.appName] >= GROUP_THRESHOLD) { + //Group Notification Deletion Logic Processing + return; + } + // Common Notification Deletion Logic Processing + for (let i = 0, len = this.mNotificationList.length; i < len; i++) { + if (this.mNotificationList[i].hashcode == notificationItemData.hashcode) { + Log.showInfo(TAG, `removeNotificationItem i = ${i}`); + this.mAppNotificationCount[notificationItemData.appName] -= 1; + let removeItemArr = this.mNotificationList.splice(i, 1); + Log.showInfo(TAG, `onNotificationCancel removeItemArr= ${JSON.stringify(removeItemArr)}`); + if (!CheckEmptyUtils.isEmpty(removeItemArr)) { + this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + } + break; + } + } + } + + onNotificationLoad() { + + } + + + /** + * notification CancelCallback + * + * @param {Object} data - return notificationItemData. + */ + groupNotification(notificationItemData, num) { + if (num == GROUP_THRESHOLD) { + //Group Notification Conversion + } else { + //Group Notification Add + } + } + + updateNotification() { + Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(this.mNotificationList)}`); + Log.showInfo(TAG, `updateNotification len: ${this.mNotificationList.length}`); + this.sortNotification() + let listLink = AppStorage.Link('notificationList'); + listLink.set(this.mNotificationList); + Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(listLink.get())}`); + } + + /** + * Sort the notifications. + */ + sortNotification() { + Log.showInfo(TAG, `sortNotification`); + if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { + return + } + this.mNotificationList.sort((itemA, itemB) => { + //long term notification come first + if (itemA.source == SourceType.TYPE_CONTINUOUS && itemB.source != SourceType.TYPE_CONTINUOUS) { + return -1 + } + //long term notification come first + if (itemA.source != SourceType.TYPE_CONTINUOUS && itemB.source == SourceType.TYPE_CONTINUOUS) { + return 1 + } + if ((itemA.source == SourceType.TYPE_CONTINUOUS && itemB.source == SourceType.TYPE_CONTINUOUS) || + (itemA.source != SourceType.TYPE_CONTINUOUS && itemB.source != SourceType.TYPE_CONTINUOUS) + ) { + return -1 * (itemA.timestamp - itemB.timestamp) + } + }) + } + + /** + * Remove all notifications. + */ + removeAllNotifications() { + if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { + this.mNotificationList = [] + } else { + + let index = this.mNotificationList.length + while (index--) { + Log.showInfo(TAG, `mNotificationList[${index}].source: ${this.mNotificationList[index].source}`); + //Except the Long term notifications + if (this.mNotificationList[index].source != SourceType.TYPE_CONTINUOUS) { + Log.showInfo(TAG, `mNotificationList[${index}].hashcode: ${this.mNotificationList[index].hashcode}`); + let hashCode = this.mNotificationList[index].hashcode + this.removeSysNotificationItem(hashCode) + let removeItemArr = this.mNotificationList.splice(index, 1) + Log.showInfo(TAG, `removeAllNotifications removeItemArr= ${JSON.stringify(removeItemArr)}`); + if (!CheckEmptyUtils.isEmpty(removeItemArr)) { + this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + } + } + } + } + this.updateNotification() + } + + removeNotificationItem(itemData, isDelSysConent) { + Log.showInfo(TAG, `removeNotificationItem, hashcode: ${itemData.hashcode}`); + for (let i = 0, len = this.mNotificationList.length; i < len; i++) { + if (this.mNotificationList[i].hashcode == itemData.hashcode) { + Log.showInfo(TAG, `removeNotificationItem i = ${i}`); + this.mAppNotificationCount[itemData.appName] -= 1; + let removeItemArr = this.mNotificationList.splice(i, 1); + Log.showInfo(TAG, `removeNotificationItem removeItemArr= ${JSON.stringify(removeItemArr)}`); + if (!CheckEmptyUtils.isEmpty(removeItemArr)) { + this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + } + break; + } + } + this.updateNotification(); + if (isDelSysConent) { + this.removeSysNotificationItem(itemData.hashcode); + } + AppStorage.Delete(Constants.KEY_INPUT + itemData.id); + } + + removeSysNotificationItem(hashcode) { + NotificationService.remove(hashcode); + } + + clickItem(itemData, want?: any) { + Log.showInfo(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}`); + NotificationWindowManager.hideNotificationWindow(); + CommonUtil.startWant((want) ? want : itemData.want); + this.removeNotificationItem(itemData, true); + } + + clickReply(inputKey, content, want) { + Log.showInfo(TAG, `clickReply inputKey: ${inputKey}, content: ${content}, want: ${JSON.stringify(want)}`); + let info = { + code: 0, + want: { key: inputKey, data: content }, + permission: '', + extraInfo: {} + } + CommonUtil.startWant(want, info); + } + + loadFlowControlInfos() { + Log.showInfo(TAG, 'loadFlowControlInfos enter'); + let notificationConfig = NotificationConfig.readNotificationConfig('statusbar') + Log.showInfo(TAG, 'NotificationConfig: ' + JSON.stringify(notificationConfig)); + if (CheckEmptyUtils.isEmpty(notificationConfig)) { + Log.showInfo(TAG, 'NotificationConfig is no definition'); + Log.showInfo(TAG, 'loadFlowControlInfos end'); + return + } + + this.mNotificationCtrl['currentTotal'] = 0; + this.mNotificationCtrl['limitTotal'] = notificationConfig.limitTotal + this.mNotificationCtrl['app'] = new Map(); + for (let item of notificationConfig.app) { + let tmp = { + 'canShow': item.canShow, + 'currentNum': 0, + 'limit': item.limit + } + this.mNotificationCtrl['app'].set(item.bundleName, tmp); + } + Log.showInfo(TAG, 'mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); + Log.showInfo(TAG, 'loadFlowControlInfos end'); + } + + isCanShow(bundleName: string): boolean { + Log.showInfo(TAG, 'isCanShow'); + let result: boolean = true + if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { + let currentTotal = this.mNotificationCtrl['currentTotal'] + let limitTotal = this.mNotificationCtrl['limitTotal'] + Log.showInfo(TAG, `isCanShow Total: currentTotal=${currentTotal},limitTotal=${limitTotal}`); + if (currentTotal + 1 > limitTotal) { + result = false + } else if (this.mNotificationCtrl['app'].has(bundleName)) { + let tmp = this.mNotificationCtrl['app'].get(bundleName) + Log.showInfo(TAG, `isCanShow appTotal: canShow=${tmp['canShow']},tmp['currentNum']=${tmp['currentNum']}`); + if (tmp['canShow'] === false || (tmp['currentNum'] + 1 > tmp['limit'])) { + result = false + } + } + } + Log.showInfo(TAG, `isCanShow :${result}`); + return result; + } + + updateFlowControlInfos(bundleName: string, plusOrMinus: boolean): void { + Log.showInfo(TAG, `updateFlowControlInfos`); + if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { + if (this.mNotificationCtrl['app'].has(bundleName)) { + let tmp = this.mNotificationCtrl['app'].get(bundleName) + if (plusOrMinus) { + tmp['currentNum'] += 1 + } else if (tmp['currentNum'] > 0) { + tmp['currentNum'] -= 1 + } + this.mNotificationCtrl['app'].set(bundleName, tmp) + } + + if (plusOrMinus) { + this.mNotificationCtrl['currentTotal'] += 1 + } else if (this.mNotificationCtrl['currentTotal'] > 0) { + this.mNotificationCtrl['currentTotal'] -= 1 + } + } + + Log.showInfo(TAG, `updateFlowControlInfos:${JSON.stringify(this.mNotificationCtrl)}`); + } + +} + +let viewModel = new ViewModel(); + +export default viewModel as ViewModel; \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/color.json b/features/noticeitem/src/main/resources/base/element/color.json index c78aa2ca..44d07016 100644 --- a/features/noticeitem/src/main/resources/base/element/color.json +++ b/features/noticeitem/src/main/resources/base/element/color.json @@ -15,6 +15,34 @@ { "name":"name_text_color", "value":"#435563" + }, + { + "name": "nonotification_text_color", + "value": "#ffffffff" + }, + { + "name":"dialog_font_color", + "value":"#ffffff" + }, + { + "name": "action_button_color", + "value": "#007DFF" + }, + { + "name":"dialog_font_back_color", + "value":"#0759f6" + }, + { + "name": "confirm_divider_color", + "value": "#E3E3E3" + }, + { + "name":"action_button_click_color", + "value":"#0D000000" + }, + { + "name":"transparent", + "value":"#00000000" } ] } \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index 9c529219..758cca9c 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -107,6 +107,58 @@ { "name": "displayicon_height", "value": "20" + }, + { + "name": "deleteall_image_opacity", + "value": "0.9" + }, + { + "name": "setting_title_fontsize", + "value": "28" + }, + { + "name": "setting_cont_fontsize", + "value": "26" + }, + { + "name": "setting_border_width", + "value": "1" + }, + { + "name": "setting_border_radius", + "value": "30" + }, + { + "name": "action_button_height", + "value": "48" + }, + { + "name": "action_button_padding", + "value": "12" + }, + { + "name": "picture_default_height", + "value": "100" + }, + { + "name": "confirm_title_fontsize", + "value": "28" + }, + { + "name": "confirm_cont_fontsize", + "value": "26" + }, + { + "name": "confirm_divider_height", + "value": "20" + }, + { + "name": "confirm_button_height", + "value": "60" + }, + { + "name": "icon_item_fontsize", + "value": "18" } ] } \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/string.json b/features/noticeitem/src/main/resources/base/element/string.json index e21e833c..b9e748e5 100644 --- a/features/noticeitem/src/main/resources/base/element/string.json +++ b/features/noticeitem/src/main/resources/base/element/string.json @@ -3,6 +3,42 @@ { "name": "noticeitem", "value": "noticeitem" + }, + { + "name": "nonotification_text", + "value": "无通知" + }, + { + "name": "closeNotification", + "value": "关闭通知" + }, + { + "name": "moreSettings", + "value": "更多设置" + }, + { + "name": "cancel", + "value": "取消" + }, + { + "name": "enter", + "value": "回复" + }, + { + "name": "Sending", + "value": "发送中" + }, + { + "name": "close", + "value": "关闭" + }, + { + "name": "closeNovice", + "value": "关闭通知" + }, + { + "name": "confirm_message", + "value": "是否关掉”%s“的所有通知?" } ] } diff --git a/features/noticeitem/src/main/resources/base/media/ic_setting.png b/features/noticeitem/src/main/resources/base/media/ic_setting.png new file mode 100644 index 0000000000000000000000000000000000000000..8d30e3686f820dcfd0ba79e8193aec4f0271ee27 GIT binary patch literal 2788 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 { - Log.showInfo(TAG, `notificationItem AppName = ${JSON.stringify(AppName)}`); - let notificationItem:NotificationItemData = this.parseRequest(request,AppName.appName,AppName.icon) - Log.showInfo(TAG, `notificationItem = ${JSON.stringify(notificationItem)}`); - if(slotLevel===SlotLevel.LEVEL_HIGH){ - try{ - this.media.play() - }catch(e){ - Log.showInfo(TAG, `notificationItem id:${notificationItem.id} alert error: ${e.toString()}`); - } - } - switch (processType) { - case Constants.GET_NEW_NOTIFICATION: - this.removeNotificationItem(notificationItem['hashcode'], false); - mNotificationList.unshift(notificationItem); - //mNotificationList.sort(this.compare('timestamp')); - this.updateNotification(); - break; - case Constants.GET_EXIST_NOTIFICATION: - mNotificationList.unshift(notificationItem); - this.updateNotification(); - break; - default: - Log.showInfo(TAG, 'no match process type'); - break; - } - }); - } - - /** - * Get app name with bundleName. - * - * @param {string} bundleName - BundleName of the target app. - */ - getAppName(bundleName, callback) { - Log.showInfo(TAG, 'getAppName start ===================='); - if (mAppName.has(bundleName)) { - callback(mAppName.get(bundleName)); - Log.showInfo(TAG, 'HAS BUNDLENAME'); - } else { - BundleManager.getBundleInfo(TAG, bundleName, 0, (data) => { - Log.showInfo(TAG, `getBundleInfo` + JSON.stringify(data)); - let labelId = data.appInfo.labelId; - let iconId = data.appInfo.iconId; - let appName = ''; - BundleManager.getResourceManager(TAG, bundleName, (item) => { - Log.showInfo(TAG, `BundleManager.getResourceManager ${BundleManager.getResourceManager}`); - item.getString(labelId, (error, value) => { - Log.showInfo(TAG, `getString` + JSON.stringify(value)); - if (value != null && value != undefined) { - appName = value - } - item.getMediaBase64(iconId, (error, MediaValue) => { - Log.showInfo(TAG, `getMediaBase64` + JSON.stringify(MediaValue)); - if (MediaValue != null) { - let appMessage = { - 'appName': appName, - 'icon': MediaValue - } - if (appName != null && appName != undefined && appName != '') { - mAppName.set(bundleName, appMessage); - } - callback(appMessage); - } - }); - }) - }) - }); - Log.showInfo(TAG, 'getAppName end ===================='); - } - } - - /** - * notification CancelCallback - * - * @param {Object} data - return data Message. - */ - OnCancelCallback(data) { - console.info("===>OnCancelCallback data : ==> " + `data:${JSON.stringify(data)}`); - this.removeNotificationItem(data.request.hashCode, false); - } - - onUpdateCallback(data) { - Log.showInfo(TAG, `onUpdateCallback = ${JSON.stringify(data.request)}`); - } - - /** - * The callback will be called after registered callback. - * - * @param {Object} err - Error may occur. - * @param {Object} data - Callback data. - */ - subscribeCallback(err, data) { - Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) - } - - /** - * Reformat the timestamp to hh:mm. - * - * @param {number} timestamp - Target timestamp. - */ - getStandardTime(timestamp) { - Log.showInfo(TAG, 'getStandardTime start ===================='); - if (timestamp == 0 || timestamp == undefined || timestamp == null) { - return ''; - } - mDate.setTime(timestamp); - let hoursNumber = mDate.getHours(); - let minutesNumber = mDate.getMinutes(); - let hours = hoursNumber < 10 ? '0' + hoursNumber : hoursNumber; - let minutes = minutesNumber < 10 ? '0' + minutesNumber : minutesNumber; - return hours + ':' + minutes; - } - - /** - * Compare method will be used when sorting a two-dimensional array. - * - * @param {string} property - Property in the object will be sorted. - */ - compare(params) { - return function (item1, item2) { - var itemTime1 = item1[params]; - var itemTime2 = item2[params]; - return itemTime2 - itemTime1; - } - } - - /** - * Remove all notifications. - */ - removeAllNotifications() { - mNotificationList = [] - this.updateNotification() - NotificationManager.removeAll(TAG, (data) => { - Log.showInfo(TAG, `removeAll , data: ${JSON.stringify(data)}`); - }); - } - - removeNotificationItem(hashCode, isDelSysConent) { - Log.showInfo(TAG, `removeNotificationItem start, hashCode: ${hashCode}`); - for (let i = 0, len = mNotificationList.length; i < len; i++) { - if (mNotificationList[i].hashcode == hashCode) { - Log.showInfo(TAG, `removeNotificationItem i = ${i}`); - mNotificationList.splice(i, 1); - // mNotificationList.pop(i); - break; - } - } - this.updateNotification() - if (isDelSysConent) { - this.removeSysNotificationItem(hashCode); - } - } - - removeSysNotificationItem(hashCode) { - NotificationManager.remove(TAG, hashCode, (data) => { - Log.showInfo(TAG, `removeNotificationItem, data: ${JSON.stringify(data)}`); - }) - Log.showInfo(TAG, `removeNotificationItem end, length: ${mNotificationList.length}`); - } - - getAllActiveNotifications() { - Log.showInfo(TAG, `getAllActiveNotifications`); - NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { - Log.showInfo(TAG, `getAllActiveNotifications err: ${JSON.stringify(err)}`); - Log.showInfo(TAG, `getAllActiveNotifications requestsArr: ${JSON.stringify(requestsArr)}`); - if (Array.isArray(requestsArr)) { - for(let i = 0,len = requestsArr.length; i< len; i++) { - this.handleRequest(requestsArr[i],null, Constants.GET_EXIST_NOTIFICATION); - } - } else { - mNotificationList = []; - } - }) - } -} - -let notificationService = new NotificationService(); -export default notificationService as NotificationService; \ No newline at end of file diff --git a/features/notificationservice/src/main/resources/base/element/string.json b/features/notificationservice/src/main/resources/base/element/string.json deleted file mode 100644 index 04635cab..00000000 --- a/features/notificationservice/src/main/resources/base/element/string.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "string": [ - { - "name": "quicklysetting_library", - "value": "quicklysetting_library" - } - ] -} diff --git a/features/signalcomponent/.gitignore b/features/signalcomponent/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/signalcomponent/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/signalcomponent/build.gradle b/features/signalcomponent/build.gradle index 1dba0fa5..ae402d92 100644 --- a/features/signalcomponent/build.gradle +++ b/features/signalcomponent/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.huawei.ohos.library' ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 4 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } buildTypes { release { diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 38433e30..a65ea3fb 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -36,7 +36,6 @@ struct SignalIcon { aboutToDisappear() { Log.showInfo(TAG, 'aboutToDisappear'); -// mSignalModel.uninitSignalModel(); } build() { @@ -57,13 +56,13 @@ struct SignalIcon { .margin({ top: $r('app.float.margin_cellular_type') }) Image(this.updateCellularImage(this.cellularLevel)) .objectFit(ImageFit.ScaleDown) - .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) - .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) + .width(`${Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient}px`) + .height(`${Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient}px`) }.flexShrink(1) - .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) + .width(`${Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient}px`) } .margin({ left: 5}) - .height(Constants.STATIC_BAR_ICON_HEIGHT*this.StatusCoefficient) + .height(`${Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient}px`) } /** diff --git a/features/statusbarcomponent/build.gradle b/features/statusbarcomponent/build.gradle new file mode 100644 index 00000000..eb806119 --- /dev/null +++ b/features/statusbarcomponent/build.gradle @@ -0,0 +1,23 @@ +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + implementation project(':features:signalcomponent') + implementation project(':features:wificomponent') + implementation project(':features:batterycomponent') + implementation project(':features:clockcomponent') +} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/config.json b/features/statusbarcomponent/src/main/config.json new file mode 100644 index 00000000..060972b9 --- /dev/null +++ b/features/statusbarcomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": { + }, + "module": { + "package": "com.ohos.systemui.statusbarcomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "statusbarcomponent", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ets b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ets new file mode 100644 index 00000000..6249ccc1 --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ets @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 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 default class Constants { + static EMPTY = 'empty'; + static WIFI = 'wifi'; + static SIGNAL = 'signal'; + static CLOCK = 'clock'; + static BATTERY = 'battery'; + static CAPSULE = 'capsule' + static NOTIFICATION = 'notification'; + + static STATIC_BAR_ICON_WIDTH = 24; + static STATIC_BAR_ICON_MARGIN = 2; + static STATIC_BAR_ICON_HEIGHT = 24; + static STATIC_BAR_ICON_INSIDE_SPACE = 2; + static STATIC_BAR_ICON_OUTSIDE_MARGIN = 5; + + static EMPTY_AREA_POSITION_LEFT = 'left'; + static EMPTY_AREA_POSITION_CENTER = 'center'; + static EMPTY_AREA_POSITION_RIGHT = 'right'; + + static GROUP_ID_LEFT = 1; + static GROUP_ID_CENTER = 2; + static GROUP_ID_RIGHT = 3; +} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ets b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ets new file mode 100644 index 00000000..100f7f57 --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ets @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2021 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 Resmgr from '@ohos.resourceManager'; +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import PluginDataSourceAdapter from '../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets'; +import Constants from '../common/Constants.ets'; + +const TAG = 'StatusBarModel'; + +let STATUSBAR_SOURCE_CONFIG = { + "MetaSource": { + "action": "com.ohos.systemui.action.BAR_ICON", + "permission": null, + "filterIds": [] + }, + // "pluginSource": { "pluginUrl": "xxx/xxx/xx" } +} + +export class StatusBarService { + mIsStart: boolean = false; + mAdapter: PluginDataSourceAdapter; + mListener: any; + mEmptyPosition: any; + mMaxWidth: number; + mMaxHeight: number; + mStatusBarHeight: number; + + startService(filterIds: string[]) { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `start StatusBarService.`) + this.mIsStart = true; + this.mAdapter = new PluginDataSourceAdapter(TAG); + this.mAdapter.registerListener({ + 'initFinish': this.loadData.bind(this), + 'addItem': this.onItemAdd.bind(this), + 'removeItem': this.onItemRemove.bind(this) + }); + { + STATUSBAR_SOURCE_CONFIG.MetaSource.filterIds = filterIds; + } + this.mAdapter.initDataSource(STATUSBAR_SOURCE_CONFIG); + } + + stopService() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `stop StatusBarService.`) + this.mIsStart = false; + this?.mAdapter.unregisterListener(); + this?.mAdapter.clearAll(); + } + + loadData() { + Log.showInfo(TAG, `loadData`) + this.mAdapter.loadData(); + } + + registerListener(listener: { + 'addItem': Function, + 'removeItem': Function, + 'onEmptyAreaChange': Function + }) { + Log.showInfo(TAG, `registerListener, listener: ${listener}`) + this.mListener = listener; + } + + onItemAdd(itemData) { + Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`) + if (!CheckEmptyUtils.isEmpty(itemData.label) || !CheckEmptyUtils.isEmpty(itemData.iconUrl)) { + if (!CheckEmptyUtils.isEmpty(itemData.label)) { + itemData.label = decodeURIComponent(itemData.label); + } + this.mListener?.addItem(itemData); + + } else { + Resmgr.getResourceManager(itemData.bundleName) + .then(mgr => { + mgr.getString(itemData.abilityLabelId, (error, value) => { + Log.showInfo(TAG, `onItemAdd mgr.getString, error: ${JSON.stringify(error)} value: ${JSON.stringify(value)}`) + if (error != null) { + return; + } + itemData.label = value; + mgr.getMediaBase64(itemData.abilityIconId, (error, value) => { + Log.showInfo(TAG, `onItemAdd mgr.getMediaBase64, error: ${JSON.stringify(error)} value: ${JSON.stringify(value)}`) + if (error != null) { + return; + } + itemData.iconUrl = value; + this.mListener?.addItem(itemData); + }); + }); + }) + .catch(e => { + Log.showInfo(TAG, `onItemAdd Resmgr.getResourceManager, e: ${JSON.stringify(e)}`) + }); + } + } + + onItemRemove(itemData) { + Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`) + this.mListener?.removeItem(itemData); + } + + initEmptyArea(emptyPosition: any, windowSize: any) { + Log.showInfo(TAG, `initEmptyArea, emptyPosition: ${JSON.stringify(emptyPosition)} windowSize: ${JSON.stringify(windowSize)}`) + this.mEmptyPosition = emptyPosition; + this.mMaxWidth = windowSize.width; + this.mMaxHeight = windowSize.height; + this.mStatusBarHeight = windowSize.statusBarHeight; + + const defaultRotation = 0; + let position: string = null; + if (emptyPosition && (emptyPosition.x1 != emptyPosition.x2 || emptyPosition.y1 != emptyPosition.y2)) { + position = this.calcEmptyAreaPosition(defaultRotation); + } + let res = { "position": position, "rotation": defaultRotation }; + Log.showInfo(TAG, `initEmptyArea, res: ${JSON.stringify(res)}`) + return res; + } + + calcEmptyAreaPosition(rotation: number): string{ + Log.showInfo(TAG, `calcEmptyAreaPosition, rotation: ${rotation}`) + + let statusBarLeftX1: number; + let statusBarLeftY1: number; + let statusBarLeftX2: number; + let statusBarLeftY2: number; + let statusBarRightX1: number; + let statusBarRightY1: number; + let statusBarRightX2: number; + let statusBarRightY2: number; + if (rotation == 0) { + statusBarLeftX1 = 0; + statusBarLeftY1 = 0; + statusBarLeftX2 = this.mMaxWidth / 2; + statusBarLeftY2 = this.mStatusBarHeight; + statusBarRightX1 = this.mMaxWidth / 2; + statusBarRightY1 = 0; + statusBarRightX2 = this.mMaxWidth; + statusBarRightY2 = this.mStatusBarHeight; + } else if (rotation == 90) { + statusBarLeftX1 = this.mMaxWidth - this.mStatusBarHeight; + statusBarLeftY1 = 0; + statusBarLeftX2 = this.mMaxWidth; + statusBarLeftY2 = this.mMaxHeight / 2; + statusBarRightX1 = this.mMaxWidth - this.mStatusBarHeight; + statusBarRightY1 = this.mMaxHeight / 2; + statusBarRightX2 = this.mMaxWidth; + statusBarRightY2 = this.mMaxHeight; + } else if (rotation == 180) { + statusBarLeftX1 = this.mMaxWidth / 2; + statusBarLeftY1 = this.mMaxHeight - this.mStatusBarHeight; + statusBarLeftX2 = this.mMaxWidth; + statusBarLeftY2 = this.mMaxHeight; + statusBarRightX1 = 0; + statusBarRightY1 = this.mMaxHeight - this.mStatusBarHeight; + statusBarRightX2 = this.mMaxWidth / 2; + statusBarRightY2 = this.mMaxHeight; + } else if (rotation == 270) { + statusBarLeftX1 = 0; + statusBarLeftY1 = this.mMaxHeight / 2; + statusBarLeftX2 = this.mStatusBarHeight; + statusBarLeftY2 = this.mMaxHeight; + statusBarRightX1 = 0; + statusBarRightY1 = 0; + statusBarRightX2 = this.mStatusBarHeight; + statusBarRightY2 = this.mMaxHeight / 2; + } else { + return null; + } + Log.showInfo(TAG, `calcEmptyAreaPosition, leftxy: ${statusBarLeftX1} ${statusBarLeftY1} ${statusBarLeftX2} ${statusBarLeftY2}`) + Log.showInfo(TAG, `calcEmptyAreaPosition, rightxy: ${statusBarRightX1} ${statusBarRightY1} ${statusBarRightX2} ${statusBarRightY2}`) + + let isGlandLeft = this.isEmptyAreaGlandStatusBar(statusBarLeftX1, statusBarLeftY1, statusBarLeftX2, statusBarLeftY2); + let isGlandRight = this.isEmptyAreaGlandStatusBar(statusBarRightX1, statusBarRightY1, statusBarRightX2, statusBarRightY2); + Log.showInfo(TAG, `calcEmptyAreaPosition, gland: ${isGlandLeft} ${isGlandRight}`) + if (isGlandLeft && isGlandRight) { + return Constants.EMPTY_AREA_POSITION_CENTER; + } else if (isGlandLeft) { + return Constants.EMPTY_AREA_POSITION_LEFT; + } else if (isGlandRight) { + return Constants.EMPTY_AREA_POSITION_RIGHT; + } else { + return null; + } + } + + isEmptyAreaGlandStatusBar(x1, y1, x2, y2): boolean{ + Log.showInfo(TAG, `isEmptyAreaGlandStatusBar, xy: ${x1} ${y1} ${x2} ${y2}`) + let ex1 = this.mEmptyPosition.x1; + let ey1 = this.mEmptyPosition.y1; + let ex2 = this.mEmptyPosition.x2; + let ey2 = this.mEmptyPosition.y2; + + if (ex1 >= x1 && ex1 <= x2 && ey1 >= y1 && ey1 <= y2) { + return true; + } else if (ex2 >= x1 && ex2 <= x2 && ey1 >= y1 && ey1 <= y2) { + return true; + } else if (ex1 >= x1 && ex1 <= x2 && ey2 >= y1 && ey2 <= y2) { + return true; + } else if (ex2 >= x1 && ex2 <= x2 && ey2 >= y1 && ey2 <= y2) { + return true; + } + return false; + } +} + +let statusBarService = new StatusBarService(); + +export default statusBarService as StatusBarService; \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets new file mode 100644 index 00000000..93c196bf --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; +import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets' +import Constants from '../common/Constants.ets' + +const TAG = 'IconItemComponent' + +@Component +export default struct IconItemComponent { + @Prop keyId: string + @Prop color: string + @State mItemData: any = {} + private mWindowManager + private mFeatureAbilityManager + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId} color:${JSON.stringify(this.color)}`) + this.mItemData = AppStorage.Link(this.keyId) + Log.showInfo(TAG, `aboutToAppear, mItemData: ${this.mItemData.get().iconUrl} ${this.mItemData.get().label}`) + this.mWindowManager = new WindowManager(); + this.mFeatureAbilityManager = new FeatureAbilityManager(); + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + let deleteRs: boolean = AppStorage.Delete(this.keyId) + Log.showInfo(TAG, `aboutToDisappear AppStorage.Delete, ${deleteRs} key: ${this.keyId}`) + } + + build() { + Row({ space: Constants.STATIC_BAR_ICON_INSIDE_SPACE }) { + if (!CheckEmptyUtils.isEmpty(this.mItemData.get().label)) { + Text(this.mItemData.get() + .label) + .fontColor(this.color) + .fontSize($r('app.float.icon_item_fontsize')) + .textAlign(TextAlign.End) + } + if (!CheckEmptyUtils.isEmpty(this.mItemData.get().iconUrl)) { + Image(this.mItemData.get().iconUrl) + .size({ width: Constants.STATIC_BAR_ICON_WIDTH, height: Constants.STATIC_BAR_ICON_HEIGHT }) + } + } + .margin({ left: Constants.STATIC_BAR_ICON_OUTSIDE_MARGIN, right: Constants.STATIC_BAR_ICON_OUTSIDE_MARGIN }) + .height('100%') + .onClick(this.onIconItemClick.bind(this)) + .gesture(LongPressGesture({ repeat: false }).onAction(this.onIconItemLongPressGesture.bind(this))) + } + + onIconItemClick(event: ClickEvent) { + Log.showInfo(TAG, `onIconItemClick`) + if (this.mItemData.get().actionData && this.mItemData.get().actionData.clickAction) { + this.startAbility(this.mItemData.get().actionData.clickAction) + } + } + + onIconItemLongPressGesture(event: GestureEvent) { + Log.showInfo(TAG, `onIconItemLongPressGesture, event: ${JSON.stringify(event)}`) + if (this.mItemData.get().actionData && this.mItemData.get().actionData.longClickAction) { + this.startAbility(this.mItemData.get().actionData.longClickAction) + } + } + + startAbility(action) { + Log.showInfo(TAG, `startAbility, action: ${action}`) + let actionInfos = action.split('&') + let wantParam = { + parameters: {} + } + for (let actionInfoStr of actionInfos) { + let actionInfo = actionInfoStr.split('=') + if (actionInfo[0] == 'want') { + wantParam['bundleName'] = actionInfo[1].split('/')[0] + wantParam['abilityName'] = actionInfo[1].split('/')[1] + } else { + wantParam.parameters[actionInfo[0]] = actionInfo.length > 1 ? actionInfo[1] : actionInfo[0] + } + } + Log.showInfo(TAG, `startAbility, want: ${JSON.stringify(wantParam)}`) + + this.mWindowManager.setWindowMin((result) => { + this.mFeatureAbilityManager.openAbility(TAG, { + want: wantParam + }); + }); + } +} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets new file mode 100644 index 00000000..b650c6b3 --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/Constants.ets' +import ViewModel from '../viewmodel/StatusBarVM.ets' +import IconItemComponent from './IconItemComponent.ets' +import BatteryIcon from '../../../../../../../batterycomponent/src/main/ets/default/pages/batteryIcon.ets' +import ClockIcon from '../../../../../../../clockcomponent/src/main/ets/default/pages/clockIcon.ets' +import WifiIcon from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiIcon.ets' +import SignalIcon from '../../../../../../../signalcomponent/src/main/ets/default/pages/signalIcon.ets' +import CapsuleIcon from '../../../../../../../capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets' + +const TAG = 'StatusBarComponent' +const TAG_StatusBarGroup = 'StatusBarGroup' +const TAG_StatusBarEmptyIcon = 'StatusBarEmptyIcon' +const TAG_StatusBarNotificationIcon = 'StatusBarNotificationIcon' + +@Component +export default struct StatusBarComponent { + @State mStatusBarComponentConfig: any = {} + @Prop mStatusBarColor: string + @StorageLink('StatusBarLayout') mStatusBarLayout: any = [[], [], []] + @StorageLink('maxWidth') @Watch('onSizeUpdated') maxWidth: number = 0 + @StorageLink('maxHeight') @Watch('onSizeUpdated') maxHeight: number = 0 + @StorageLink('minHeight') @Watch('onSizeUpdated') minHeight: number = 0 + @StorageLink('StatusBarComponentIsStart') mIsStart: boolean = false + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`) + if (this.maxWidth > 0 && this.maxHeight > 0 && this.minHeight > 0) { + this.initViewModel() + } + Log.showInfo(TAG, `aboutToAppear End`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + onSizeUpdated(propName: string): void { + Log.showInfo(TAG, `onSizeUpdated, propName: ${propName} maxWidth: ${this.maxWidth} maxHeight: ${this.maxHeight} minHeight: ${this.minHeight}`) + if (this.maxWidth == 0 || this.maxHeight == 0 || this.minHeight == 0) { + return + } + this.initViewModel() + } + + initViewModel() { + Log.showInfo(TAG, `initViewModel`) + if (this.mIsStart) { + return + } + this.mIsStart = true + ViewModel.initViewModel(this.mStatusBarComponentConfig, { + width: this.maxWidth, + height: this.maxHeight, + statusBarHeight: this.minHeight + }) + } + + build() { + Row() { + StatusBarGroup({ + mColor: this.mStatusBarColor, + mComponents: this.mStatusBarLayout[0], + mLayoutWeight: 1, + mAlignItems: HorizontalAlign.Start + }) + StatusBarGroup({ + mColor: this.mStatusBarColor, + mComponents: this.mStatusBarLayout[1], + mLayoutWeight: 0, + mAlignItems: HorizontalAlign.Center + }) + StatusBarGroup({ + mColor: this.mStatusBarColor, + mComponents: this.mStatusBarLayout[2], + mLayoutWeight: 1, + mAlignItems: HorizontalAlign.End + }) + } + .width('100%') + .height('100%') + } +} + +@Component +struct StatusBarGroup { + @Prop mColor: string + @State mComponents: string[] = [] + @State mLayoutWeight: number = 1 + @State mAlignItems: HorizontalAlign = HorizontalAlign.Center; + @StorageLink('StatusBarEmptyWidth') mStatusBarEmptyWidth: any = 0 + + aboutToAppear() { + Log.showInfo(TAG_StatusBarGroup, `aboutToAppear Start`) + Log.showInfo(TAG_StatusBarGroup, `aboutToAppear, mLayoutWeight: ${this.mLayoutWeight} mAlignItems: ${this.mAlignItems} `) + } + + aboutToDisappear() { + Log.showInfo(TAG_StatusBarGroup, `aboutToDisAppear`) + } + + build() { + Column() { + Row() { + ForEach(this.mComponents, (componentName: string) => { + Row() { + if (componentName == Constants.EMPTY) { + StatusBarEmptyIcon() + } else if (componentName == Constants.WIFI) { + WifiIcon() + } else if (componentName == Constants.SIGNAL) { + SignalIcon() + } else if (componentName == Constants.CLOCK) { + ClockIcon() + } else if (componentName == Constants.BATTERY) { + BatteryIcon() + } else if (componentName == Constants.CAPSULE) { + CapsuleIcon() + } else if (componentName == Constants.NOTIFICATION) { + StatusBarNotificationIcon() + } else { + IconItemComponent({ + keyId: componentName, + color: this.mColor + }) + } + } + .height('100%') + }, (componentName: string) => componentName) + } + } + .alignItems(this.mAlignItems) + .layoutWeight(this.mLayoutWeight) + } +} + +@Component +struct StatusBarEmptyIcon { + @StorageLink('StatusBarEmptyWidth') mStatusBarEmptyWidth: any = 0 + + aboutToAppear() { + Log.showInfo(TAG_StatusBarEmptyIcon, `aboutToAppear Start`) + Log.showInfo(TAG_StatusBarEmptyIcon, `aboutToAppear, mStatusBarEmptyWidth: ${this.mStatusBarEmptyWidth} `) + } + + aboutToDisappear() { + Log.showInfo(TAG_StatusBarEmptyIcon, `aboutToDisAppear`) + } + + build() { + Row().width(this.mStatusBarEmptyWidth).height('100%') + } +} + +@Component +struct StatusBarNotificationIcon { + @StorageLink('notificationList') notificationList: any = [] + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + + aboutToAppear() { + Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToAppear Start`) + } + + aboutToDisappear() { + Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToDisAppear`) + } + + build() { + Row() { + if (this.notificationList.length > 3) { + ForEach(this.notificationList.slice(0, 3), (item: any) => { + Image(item.smallIcon) + .objectFit(ImageFit.ScaleDown) + .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) + .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) + .margin({ right: Constants.STATIC_BAR_ICON_MARGIN }) + }) + Row() { + Text('...') + .fontSize(20) + } + } else { + ForEach(this.notificationList, (item: any) => { + Image(item.smallIcon) + .objectFit(ImageFit.ScaleDown) + .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) + .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) + .margin({ right: Constants.STATIC_BAR_ICON_MARGIN }) + }) + } + } + .width(this.notificationList.length > 3 ? + (Constants.STATIC_BAR_ICON_WIDTH + Constants.STATIC_BAR_ICON_MARGIN) * 4 : + (Constants.STATIC_BAR_ICON_WIDTH + Constants.STATIC_BAR_ICON_MARGIN) * this.notificationList.length) + } +} diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ets b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ets new file mode 100644 index 00000000..14df9780 --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ets @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import Constants from '../common/Constants.ets'; +import StatusBarService from '../model/StatusBarService.ets'; + +export const StatusBarLayoutKey = "StatusBarLayout"; + +export const StatusBarEmptyWidthKey = "StatusBarEmptyWidth"; + +const TAG = 'StatusBarVM'; + +export class StatusBarVM { + mConfig: any; + mIsStart: boolean = false; + mStatusBarLayoutGroupTemplate: any[] = []; + mStatusBarLayout: any; + mStatusBarEmptyWidth: any; + + initViewModel(config, windowSize) { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)} windowSize: ${JSON.stringify(windowSize)}`) + this.mIsStart = true; + this.mConfig = config; + + StatusBarService.registerListener({ + 'addItem': this.onItemAdd.bind(this), + 'removeItem': this.onItemRemove.bind(this), + 'onEmptyAreaChange': this.onEmptyAreaChange.bind(this) + }); + + let localSlotIds = this.parseConfig(config); + + let emptyAreaInfo = StatusBarService.initEmptyArea(config.emptyPosition, windowSize); + Log.showInfo(TAG, `initViewModel initEmptyArea.callback, emptyAreaInfo: ${JSON.stringify(emptyAreaInfo)}`) + if (emptyAreaInfo.position) { + this.updateStatusBarLayoutGroupTemplateOnEmptyAreaChange(emptyAreaInfo.position); + localSlotIds.push(Constants.EMPTY); + this.calcStatusBarEmptyWidth(emptyAreaInfo.rotation); + } + + this.calcStatusBarLayout(localSlotIds); + + let filterIds: string[] = []; + for (let metaIconKey of config.metaIconKeys) { + let includeFlg = false; + for (let components of this.mStatusBarLayoutGroupTemplate) { + if (components.indexOf(metaIconKey.metaIconId) >= 0) { + includeFlg = true; + break; + } + } + if (includeFlg) { + filterIds.push(metaIconKey.metaIconId); + } + } + StatusBarService.startService(filterIds); + } + + parseConfig(config) { + Log.showInfo(TAG, `parseConfig, config: ${JSON.stringify(config)}`) + + this.mStatusBarLayout = AppStorage.SetAndLink(StatusBarLayoutKey, [[], [], []]); + this.mStatusBarEmptyWidth = AppStorage.SetAndLink( + StatusBarEmptyWidthKey, config.emptyPosition.x2 - config.emptyPosition.x1); + Log.showInfo(TAG, + `parseConfig, statusBarLayout: ${JSON.stringify(this.mStatusBarLayout.get())}`) + Log.showInfo(TAG, + `parseConfig, statusBarEmptyWidth: ${JSON.stringify(this.mStatusBarEmptyWidth.get())}`) + + const groupIds = [Constants.GROUP_ID_LEFT, Constants.GROUP_ID_CENTER, Constants.GROUP_ID_RIGHT]; + for (const groupId of groupIds) { + for (const groupInfo of config.LayoutGroups) { + if (groupId == groupInfo.id) { + let components = []; + for (let component of groupInfo.Components) { + let componentId = component; + for (let metaIconKey of config.metaIconKeys) { + if (component == metaIconKey.layoutId) { + componentId = metaIconKey.metaIconId; + break; + } + } + components.push(componentId); + } + this.mStatusBarLayoutGroupTemplate.push(components); + } + } + } + Log.showInfo(TAG, + `parseConfig, statusBarLayoutGroupTemplate: ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`) + + let localSlotIds = []; + config.LocalSlots.forEach((name) => { + localSlotIds.push(name); + }); + Log.showInfo(TAG, `parseConfig, localSlotIds: ${JSON.stringify(localSlotIds)}`) + return localSlotIds; + } + + onItemAdd(itemData) { + Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`) + AppStorage.SetOrCreate(itemData.id, itemData); + let dispIds = this.getDispIds(); + if (dispIds.indexOf(itemData.id) < 0) { + dispIds.push(itemData.id); + this.calcStatusBarLayout(dispIds); + } + Log.showInfo(TAG, `onItemAdd, statusBarLayout: ${JSON.stringify(this.mStatusBarLayout.get())}`) + } + + onItemRemove(itemData) { + Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`) + let dispIds = this.getDispIds(); + if (dispIds.indexOf(itemData.id) >= 0) { + dispIds.splice(dispIds.indexOf(itemData.id), 1); + this.calcStatusBarLayout(dispIds); + } + Log.showInfo(TAG, `onItemRemove, statusBarLayout: ${JSON.stringify(this.mStatusBarLayout.get())}`) + } + + onEmptyAreaChange(position: string, rotation: number) { + Log.showInfo(TAG, `onEmptyAreaChange, position: ${position} rotation: ${rotation}`) + + this.updateStatusBarLayoutGroupTemplateOnEmptyAreaChange(position); + + let dispIds = this.getDispIds(); + if (dispIds.indexOf(Constants.EMPTY) >= 0) { + dispIds.splice(dispIds.indexOf(Constants.EMPTY), 1); + } + if (position == Constants.EMPTY_AREA_POSITION_LEFT) { + dispIds.push(Constants.EMPTY); + } else if (position == Constants.EMPTY_AREA_POSITION_CENTER) { + dispIds.push(Constants.EMPTY); + } else if (position == Constants.EMPTY_AREA_POSITION_RIGHT) { + dispIds.push(Constants.EMPTY); + } + Log.showInfo(TAG, + `onEmptyAreaChange, dispIds: ${JSON.stringify(dispIds)}`) + + this.calcStatusBarEmptyWidth(rotation); + + this.calcStatusBarLayout(dispIds); + } + + updateStatusBarLayoutGroupTemplateOnEmptyAreaChange(position: string) { + Log.showInfo(TAG, `updateStatusBarLayoutGroupTemplateOnEmptyAreaChange, position: ${position}`) + for (let i = 0;i < this.mStatusBarLayoutGroupTemplate.length; i++) { + let componentsTemplate = this.mStatusBarLayoutGroupTemplate[i]; + let index = componentsTemplate.indexOf(Constants.EMPTY); + if (index >= 0) { + componentsTemplate.splice(index, 1); + break; + } + } + Log.showInfo(TAG, `updateStatusBarLayoutGroupTemplateOnEmptyAreaChange, ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`) + + if (position == Constants.EMPTY_AREA_POSITION_LEFT) { + this.mStatusBarLayoutGroupTemplate[0].splice(0, 0, Constants.EMPTY); + } else if (position == Constants.EMPTY_AREA_POSITION_CENTER) { + this.mStatusBarLayoutGroupTemplate[1].splice(0, 0, Constants.EMPTY); + } else if (position == Constants.EMPTY_AREA_POSITION_RIGHT) { + this.mStatusBarLayoutGroupTemplate[2].push(Constants.EMPTY); + } + Log.showInfo(TAG, + `updateStatusBarLayoutGroupTemplateOnEmptyAreaChange, ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`) + } + + calcStatusBarEmptyWidth(rotation: number) { + Log.showInfo(TAG, `calcStatusBarEmptyWidth, rotation: ${rotation}`) + if (rotation == 0 || rotation == 180) { + this.mStatusBarEmptyWidth.set(this.mConfig.emptyPosition.x2 - this.mConfig.emptyPosition.x1); + } else { + this.mStatusBarEmptyWidth.set(this.mConfig.emptyPosition.y2 - this.mConfig.emptyPosition.y1); + } + Log.showInfo(TAG, + `calcStatusBarEmptyWidth, statusBarEmptyWidth: ${JSON.stringify(this.mStatusBarEmptyWidth.get())}`) + } + + calcStatusBarLayout(dispIds: string[]) { + Log.showInfo(TAG, `calcStatusBarLayout, dispIds: ${JSON.stringify(dispIds)}`) + + let statusBarLayout = []; + for (let i = 0;i < this.mStatusBarLayoutGroupTemplate.length; i++) { + let componentsTemplate = this.mStatusBarLayoutGroupTemplate[i]; + let components: string [] = []; + for (let componentTemplate of componentsTemplate) { + if (dispIds.indexOf(componentTemplate) >= 0) { + components.push(componentTemplate); + } + } + statusBarLayout.push(components); + } + Log.showInfo(TAG, `calcStatusBarLayout, statusBarLayout: ${JSON.stringify(statusBarLayout)}`) + + let statusBarLayoutCurrent = this.mStatusBarLayout.get(); + for (let i = 0;i < statusBarLayout.length; i++) { + if (JSON.stringify(statusBarLayout[i]) != JSON.stringify(statusBarLayoutCurrent[i])) { + statusBarLayoutCurrent[i] = statusBarLayout[i]; + } + } + Log.showInfo(TAG, `calcStatusBarLayout, statusBarLayoutCurrent: ${JSON.stringify(statusBarLayoutCurrent)}`) + } + + getDispIds(): string[] { + Log.showInfo(TAG, `getDispIds`) + let dispIds: string[] = []; + for (let ids of this.mStatusBarLayout.get()) { + for (let id of ids) { + dispIds.push(id); + } + } + Log.showInfo(TAG, `getDispIds, dispIds: ${JSON.stringify(dispIds)}`) + return dispIds; + } +} + +let statusBarVM = new StatusBarVM(); + +export default statusBarVM as StatusBarVM; \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/resources/base/element/color.json b/features/statusbarcomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..6b163c9d --- /dev/null +++ b/features/statusbarcomponent/src/main/resources/base/element/color.json @@ -0,0 +1,12 @@ +{ + "color": [ + { + "name": "default_background", + "value": "#66000000" + }, + { + "name": "default_font_color", + "value": "#ffffffff" + } + ] +} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/resources/base/element/float.json b/features/statusbarcomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..4e100c94 --- /dev/null +++ b/features/statusbarcomponent/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "icon_item_fontsize", + "value": "18" + } + ] +} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/resources/base/element/string.json b/features/statusbarcomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..bc311734 --- /dev/null +++ b/features/statusbarcomponent/src/main/resources/base/element/string.json @@ -0,0 +1,4 @@ +{ + "string": [ + ] +} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/resources/base/media/icon.png b/features/statusbarcomponent/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { + let data = settings.getValue(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, '5') + Log.showInfo(TAG, `after audio.AudioVolumeType.MEDIA datachange settings getValue ${parseInt(data)}`); + mVolumeValue.set(parseInt(data)); + }) + } - audio.getAudioManager().setVolume(volumeType, volumeValue).then(() => { - Log.showInfo(TAG,'Promise returned to indicate a successful volume setting.') - }); + unRegisterVolume() { + this.helper.off("dataChange", this.uri, (err) => { + Log.showInfo(TAG, `unregister audio.AudioVolumeType.MEDIA helper`); + }) } - getVolume(callback, volumeType) { - Log.showInfo(TAG, `getVolume volumeType:${volumeType} `); - audio.getAudioManager().getVolume(volumeType, (err, value) => { + setVolume(callback){ + Log.showInfo(TAG, 'setVolume'); + let value = parseInt(callback.value); + Log.showInfo(TAG, `setVolume ${value}`); + mVolumeValue.set(value); + Log.showInfo(TAG, `mVolumeValue setVolume ${value} end`); + settings.setValue(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, callback.value.toString()); + Log.showInfo(TAG, `settings setVolume ${callback.value} end`); + } - if (err) { - Log.showInfo(TAG, `Failed to obtain the volume. ${err.message}`); - return; - } - Log.showInfo(TAG, 'getVolume Callback invoked to indicate that the volume is obtained.' + value); - callback.value = value; - }) + getVolume() { + Log.showInfo(TAG, 'getVolume'); + let data = settings.getValue(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, '5'); + Log.showInfo(TAG, `settings getVolume ${parseInt(data)}`); + mVolumeValue.set(parseInt(data)); } getMaxVolume(callback, volumeType) { @@ -66,4 +88,8 @@ export default class VolumeModel { callback.minValue = value; }) } -} \ No newline at end of file +} + +let mVolumeModel = new VolumeModel(); + +export default mVolumeModel as VolumeModel; \ No newline at end of file diff --git a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets index 0289eddc..ee3abb58 100644 --- a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets +++ b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets @@ -20,48 +20,46 @@ import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; const TAG = 'Control-volumeComponent' const volumeType = audio.AudioVolumeType.MEDIA; -let volumeModel = new VolumeModel(); -let volume = { - value: 7, +@Component +export struct MyVol { + @StorageLink('VolumeValue') volumeValue: number = 0; + @State volume : any = { minValue: 0, - maxValue: 10, -}; + maxValue: 15, + value: 7 + }; -@Component -export -struct MyVol { - private audioManager = audio.getAudioManager(); + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear') + Log.showInfo(TAG,'Start init Volume!') + this.initVolume() + Log.showInfo(TAG,'Finished init Volume!') + VolumeModel.init(); + VolumeModel.registerVolume(); + VolumeModel.unRegisterVolume(); + } aboutToDisappear () { Log.showInfo(TAG,'aboutToDisappear') } initVolume() { - volumeModel.getMaxVolume(volume, volumeType); - volumeModel.getMinVolume(volume, volumeType); - volumeModel.getVolume(volume, volumeType); - Log.showInfo(TAG, `initVolume ${volume.value} ${volume.minValue} ${volume.maxValue} `); + VolumeModel.getMaxVolume(this.volume, volumeType); + VolumeModel.getMinVolume(this.volume, volumeType); + Log.showInfo(TAG, `initVolume ${this.volume.minValue} ${this.volume.maxValue} `); } - setVolume(volumeValue, volumeType) { - Log.showInfo(TAG, `setVolume = ${volume.value} Type = ${volumeType}`) - audio.getAudioManager().setVolume(volumeType, volume.value).then(() => { - Log.showInfo(TAG,'Promise returned to indicate a successful volume setting') - }) + setVolume(value) { + Log.showInfo(TAG, `setVolume = ${value}`); + VolumeModel.setVolume(value); } - aboutToAppear() { - Log.showInfo(TAG,'Start init Volume!') - this.initVolume() - Log.showInfo(TAG,'Finished init Volume!') - } build() { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - Column({useAlign:HorizontalAlign.Center}) { + Column() { Text($r('app.string.volume_control')) - .fontSize($r('app.float.control_common_font_size')) - .alignSelf(ItemAlign.Center) + .fontSize($r('app.float.control_common_font_size')).alignSelf(ItemAlign.Center) } .width('15%') @@ -70,9 +68,9 @@ struct MyVol { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { Slider({ - value: volume.value, - min: volume.minValue, - max: volume.maxValue, + value: this.volumeValue, + min: this.volume.minValue, + max: this.volume.maxValue, step: 1, style: SliderStyle.INSET }) @@ -81,8 +79,8 @@ struct MyVol { .trackColor(Color.Grey) .selectedColor(Color.Blue) .onChange((value: number) => { - volume.value = value - this.setVolume(volume, volumeType) + this.volume.value = value + this.setVolume(this.volume) }) } .width('85%') diff --git a/features/wificomponent/.gitignore b/features/wificomponent/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/wificomponent/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/wificomponent/build.gradle b/features/wificomponent/build.gradle index 1dba0fa5..ae402d92 100644 --- a/features/wificomponent/build.gradle +++ b/features/wificomponent/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.huawei.ohos.library' ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 4 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } buildTypes { release { diff --git a/infra/config_exts.gradle b/infra/config_exts.gradle new file mode 100644 index 00000000..58418170 --- /dev/null +++ b/infra/config_exts.gradle @@ -0,0 +1,6 @@ +ext { + version = [ + compileSdk: 7, + compatibleSdk: 4 + ] +} \ No newline at end of file diff --git a/product/navigationBar/.gitignore b/product/navigationBar/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/product/navigationBar/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/product/navigationBar/build.gradle b/product/navigationBar/build.gradle index 4a316c39..38239b95 100644 --- a/product/navigationBar/build.gradle +++ b/product/navigationBar/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.huawei.ohos.hap' ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 4 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } entryModules "entry" } diff --git a/product/navigationBar/src/main/ets/default/pages/index.ets b/product/navigationBar/src/main/ets/default/pages/index.ets index 2bc90176..2a132448 100644 --- a/product/navigationBar/src/main/ets/default/pages/index.ets +++ b/product/navigationBar/src/main/ets/default/pages/index.ets @@ -29,6 +29,10 @@ struct Index { @StorageLink('navigationLayoutConfig') mConfig: any = {} @StorageLink('NavMinH') NavMinH:number = 32 + onBackPress(): boolean { + return true; + } + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) mHeightConfigUtils = new HeightConfigUtils(); diff --git a/product/notificationmanagement/.gitignore b/product/notificationmanagement/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/product/notificationmanagement/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/product/systemDialog/build.gradle b/product/notificationmanagement/build.gradle similarity index 58% rename from product/systemDialog/build.gradle rename to product/notificationmanagement/build.gradle index 4a316c39..c23569f0 100644 --- a/product/systemDialog/build.gradle +++ b/product/notificationmanagement/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.huawei.ohos.hap' ohos { - compileSdkVersion 7 + compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { - compatibleSdkVersion 4 + compatibleSdkVersion rootProject.ext.version.compatibleSdk } entryModules "entry" } @@ -11,4 +11,5 @@ dependencies { entryImplementation project(':entry') implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) testCompile 'junit:junit:4.12' + implementation project(':features:managementcomponent') } diff --git a/product/systemDialog/package.json b/product/notificationmanagement/package.json similarity index 100% rename from product/systemDialog/package.json rename to product/notificationmanagement/package.json diff --git a/product/systemDialog/src/main/config.json b/product/notificationmanagement/src/main/config.json similarity index 65% rename from product/systemDialog/src/main/config.json rename to product/notificationmanagement/src/main/config.json index c4397511..6cd5a4d6 100644 --- a/product/systemDialog/src/main/config.json +++ b/product/notificationmanagement/src/main/config.json @@ -9,20 +9,20 @@ }, "deviceConfig": {}, "module": { - "package": "com.ohos.systemui.systemdialog", + "package": "com.ohos.systemui.notificationmanagement", "name": ".MyApplication", "deviceType": [ "phone" ], "distro": { "deliveryWithInstall": true, - "moduleName": "systemDialog", + "moduleName": "notificationmanagement", "moduleType": "feature" }, "abilities": [ { "visible": true, - "name": "com.ohos.systemui.systemdialog.MainAbility", + "name": "com.ohos.systemui.notificationmanagement.MainAbility", "icon": "$media:icon", "description": "$string:mainability_description", "label": "$string:app_name", @@ -33,18 +33,22 @@ } ], "js": [ - {"mode": { - "syntax": "ets", - "type": "pageAbility" - }, - "pages": [ - "pages/index" - ], + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, "name": "default", "window": { "designWidth": 720, "autoDesignWidth": false - } + }, + "pages": [ + "pages/notificationManagenment", + "pages/batchSetEnable", + "pages/noDisturb", + "pages/setEnable" + ] } ] } diff --git a/product/systemDialog/src/main/ets/default/app.ets b/product/notificationmanagement/src/main/ets/default/app.ets similarity index 85% rename from product/systemDialog/src/main/ets/default/app.ets rename to product/notificationmanagement/src/main/ets/default/app.ets index 7b6ddecb..2a3b6238 100644 --- a/product/systemDialog/src/main/ets/default/app.ets +++ b/product/notificationmanagement/src/main/ets/default/app.ets @@ -15,9 +15,9 @@ export default { onCreate() { - console.info('System dialog Application onCreate') + console.info('Application onCreate') }, onDestroy() { - console.info('System dialog Application onDestroy') + console.info('Application onDestroy') }, } diff --git a/product/notificationmanagement/src/main/ets/default/common/constants.ets b/product/notificationmanagement/src/main/ets/default/common/constants.ets new file mode 100644 index 00000000..261c499a --- /dev/null +++ b/product/notificationmanagement/src/main/ets/default/common/constants.ets @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 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 default class Constants { + static WH_50_100 = '50%'; + static WH_70_100 = '70%'; + static WH_100_100 = '100%'; + static TOPMOST_INDEX = 999 + + static NEXT_DAY_NAME = '次日' +} \ No newline at end of file diff --git a/product/notificationmanagement/src/main/ets/default/pages/batchSetEnable.ets b/product/notificationmanagement/src/main/ets/default/pages/batchSetEnable.ets new file mode 100644 index 00000000..622405ae --- /dev/null +++ b/product/notificationmanagement/src/main/ets/default/pages/batchSetEnable.ets @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//import Window from '@ohos.window'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets'; +import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets'; +import ConfigData from '../common/constants.ets'; +import Router from '@system.router' + +const TAG = 'NotificationManagement-BatchSetEnable'; + +@Entry +@Component +export default +struct BatchSetEnable { + @StorageLink('appManagementList') appList: any[]= []; + + build() { + Column() { + HeadComponent({ headName: $r('app.string.batch_Management'), isActive: true }); + List() { + ForEach(this.appList, (item) => { + ListItem() { + AppItemComponent({ + appIcon: item.appIcon, + appTitle: item.appTitle, + appSummary: item.appSummary, + appValue: item.appValue, + appArrow: item.appArrow, + appArrowStyle: '', + appUri: '', + appBundleName:item.appBundleName, + appUid:item.appUid, + appSwitch:1 + }); + } + .height($r('app.float.appitem_item_height')); + }); + } + .divider({ + strokeWidth: 1, + color: $r('app.color.background_color'), + startMargin: $r('app.float.divider_margin_l'), + endMargin: $r('app.float.divider_margin_r') + }) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + .margin({ bottom: '90' }) + .visibility(Visibility.Visible) + .zIndex(0); + } + .align(Alignment.Center) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + .border({ width: $r('app.float.border_width'), color:Color.White, + radius:$r('app.float.border_radius') }) + } + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + Router.back(); + } + +} diff --git a/product/notificationmanagement/src/main/ets/default/pages/noDisturb.ets b/product/notificationmanagement/src/main/ets/default/pages/noDisturb.ets new file mode 100644 index 00000000..8e6fa6da --- /dev/null +++ b/product/notificationmanagement/src/main/ets/default/pages/noDisturb.ets @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets'; +import ConfigData from '../common/constants.ets'; +import Router from '@system.router' +import DateAndTime from '../../../../../../../common/src/main/ets/default/DateAndTimeUtil.ets'; +import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets'; +import ViewModel from '../vm/noDisturbViewModel.ets' + +const TAG = 'NotificationManagement-NoDisturb'; + +@Entry +@Component +export default struct NoDisturb { + @State mViewModel: ViewModel = new ViewModel() + startTimeDialogController: CustomDialogController = new CustomDialogController({ + builder: TimeDialog({ + action: this.mViewModel.onStartTimeAccept.bind(this.mViewModel), + title: $r('app.string.startTime'), + defaultDate: this.mViewModel.defaultStartTime + }), + cancel: this.mViewModel.onCancel.bind(this.mViewModel), + autoCancel: false, + offset: { dx: 0, dy: 200 } + }); + endTimeDialogController: CustomDialogController = new CustomDialogController({ + builder: TimeDialog({ + action: this.mViewModel.onEndTimeAccept.bind(this.mViewModel), + title: $r('app.string.endTime'), + defaultDate: this.mViewModel.defaultEndTime + }), + cancel: this.mViewModel.onCancel.bind(this.mViewModel), + autoCancel: false, + offset: { dx: 0, dy: 200 } + }); + repeatDialogController: CustomDialogController = new CustomDialogController({ + builder: RepeatModeDialog({ + action: this.mViewModel.onRepeatModeAccect.bind(this.mViewModel), + title: $r('app.string.repeat'), + selectMode: this.mViewModel.repeatMode + }), + cancel: this.mViewModel.onCancel.bind(this.mViewModel), + autoCancel: false, + offset: { dx: 0, dy: 200 } + }); + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { + HeadComponent({ headName: $r('app.string.noDisturb'), isActive: true }) + + Row() { + ItemComponent({ + title: $r('app.string.repeat'), + value: $r('app.string.daily'), + arrow: $r('app.media.ic_settings_arrow') + }) + }.onClick(() => { + this.repeatDialogController.open() + }).margin({ left: $r('app.float.page_margin_l'), right: $r('app.float.page_margin_r') }) + + + Row() { + ItemComponent({ + title: $r('app.string.startTime'), + value: this.mViewModel.startTime, + arrow: $r('app.media.ic_settings_arrow') + }) + }.onClick(() => { + this.startTimeDialogController.open() + }).margin({ left: $r('app.float.page_margin_l'), right: $r('app.float.page_margin_r') }) + + Row() { + ItemComponent({ + title: $r('app.string.endTime'), + value: this.mViewModel.endTimeClue, + arrow: $r('app.media.ic_settings_arrow') + }) + }.onClick(() => { + this.endTimeDialogController.open() + }).margin({ left: $r('app.float.page_margin_l'), right: $r('app.float.page_margin_r') }) + }.backgroundColor($r('app.color.background_color')) + } + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit() + + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + Router.back(); + } +} + +/** + * select time dialog + */ +@CustomDialog +struct TimeDialog { + public controller: CustomDialogController + public action: (data) => void + private selectedTime: string + private title: string= '' + private defaultDate: Date= new Date() + + build() { + Column() { + Column() { + Text(this.title) + .height($r('app.float.dialog_title_height')) + .margin({ left: $r('app.float.dialog_title_margin_l') }) + .width(ConfigData.WH_100_100) + .fontSize($r('app.float.dialog_title_font')) + .fontWeight(FontWeight.Bold) + DatePicker({ selected: this.defaultDate, type: DatePickerType.Time }) + .useMilitaryTime(true) + .onChange((date: DatePickerResult) => { + this.selectedTime = DateAndTime.concatTime(date.hour, date.minute); + }) + .width(ConfigData.WH_100_100) + .height($r('app.float.timeDialog_datePicker_height')) + } + + Row() { + Column() { + Text($r('app.string.cancel')) + .fontSize($r('app.float.dialog_button_font')) + .fontColor(Color.Blue) + + }.onClick(() => { + this.controller.close(); + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100); + Divider() + .vertical(true) + .color($r('app.color.divider_color')) + .strokeWidth(1) + .height($r('app.float.divider_height')) + Column() { + Text($r('app.string.confirm')) + .fontSize($r('app.float.dialog_button_font')) + .fontColor(Color.Blue) + + }.onClick(() => { + Log.showInfo(TAG, `confirm button of TimeDialog on click`) + this.controller.close(); + this.action(this.selectedTime); + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100) + } + .width(ConfigData.WH_100_100) + .height($r('app.float.dialog_button_height')) + } + .height($r('app.float.timeDialog_height')) + .width(ConfigData.WH_100_100) + } +} + +/** + * select repeat Mode dialog + */ +@CustomDialog +struct RepeatModeDialog { + public controller: CustomDialogController + public action: (data) => void + private title: string= '' + private selectMode: number= 2 //TODO + @State isNo: boolean = true + + build() { + Column({ space: 30 }) { + Column() { + Text(this.title) + .height($r('app.float.dialog_title_height')) + .margin({ left: $r('app.float.dialog_title_margin_l') }) + .width(ConfigData.WH_100_100) + .fontSize($r('app.float.dialog_title_font')) + .fontWeight(FontWeight.Bold) + Row() { + Text($r('app.string.daily')) + .fontSize($r('app.float.repeatDialog_cont_font')) + .fontColor(Color.Black) + .width(ConfigData.WH_70_100) + .textAlign(TextAlign.Start) + .align(Alignment.Start) + Toggle({ type: ToggleType.Checkbox, isOn: this.isNo }) + .align(Alignment.End) + .width($r('app.float.toggle_check_width')) + .height($r('app.float.toggle_check_width')) + .onChange((data) => { + //TODO + this.selectMode = 2 + this.isNo = true + }) + } + } + + Row() { + Column() { + Text($r('app.string.cancel')) + .fontSize($r('app.float.dialog_button_font')) + .fontColor(Color.Blue) + + }.onClick(() => { + this.controller.close(); + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100); + Divider() + .vertical(true) + .color($r('app.color.divider_color')) + .strokeWidth(1) + .height($r('app.float.divider_height')) + Column() { + Text($r('app.string.confirm')) + .fontSize($r('app.float.dialog_button_font')) + .fontColor(Color.Blue) + + }.onClick(() => { + Log.showInfo(TAG, `confirm button of TimeDialog on click`) + this.controller.close(); + this.action(this.selectMode); + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100) + } + .width(ConfigData.WH_100_100) + .height($r('app.float.dialog_button_height')) + } + .height($r('app.float.repeatDialog_height')) + .width(ConfigData.WH_100_100) + } +} diff --git a/product/notificationmanagement/src/main/ets/default/pages/notificationManagenment.ets b/product/notificationmanagement/src/main/ets/default/pages/notificationManagenment.ets new file mode 100644 index 00000000..38dacaec --- /dev/null +++ b/product/notificationmanagement/src/main/ets/default/pages/notificationManagenment.ets @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//import Window from '@ohos.window'; + +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets'; +import NoDisturbComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets'; +import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets'; +import ConfigData from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants.ets'; +import AppLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets'; +import Router from '@system.router'; + +const TAG = 'NotificationManagement-Main'; + +@Entry +@Component +export default struct notificationManagenment { + build() { + Column() { + Row() { + HeadComponent({ headName: $r('app.string.notification'), isActive: true }); + }.flexShrink(0) + + Row() { + Text($r('app.string.noDisturb')) + .fontSize($r('app.float.page_phrases_font')) + .height($r('app.float.page_phrases_height')) + .margin({ left: $r('app.float.page_margin_l'), bottom: $r('app.float.page_margin_t') }) + }.align(Alignment.Start) + .width(ConfigData.WH_100_100) + .flexShrink(0) + + Row() { + NoDisturbComponent() + } + .align(Alignment.Start) + .onClick(() => { + Log.showInfo(TAG, `NoDisturbComponent on click`) + Router.push({ uri: 'pages/noDisturb'}); + }).width(ConfigData.WH_100_100) + .flexShrink(0) + + Row() { + Text($r('app.string.notificationManagement')) + .fontSize($r('app.float.page_phrases_font')) + .height($r('app.float.page_phrases_height')) + .margin({ left: $r('app.float.page_margin_l'), bottom: $r('app.float.page_margin_t') }) + }.align(Alignment.Start) + .width(ConfigData.WH_100_100) + .flexShrink(0) + + Row() { + ItemComponent({ title: $r('app.string.batch_Management'), value: '', arrow: $r('app.media.ic_settings_arrow') }) + }.onClick(() => { + Log.showInfo(TAG, `BatchManagement on click`) + Router.push({ uri: 'pages/batchSetEnable' }); + }).width(ConfigData.WH_100_100) + .flexShrink(0) + + Column() { + AppLstComponent() + }.flexShrink(1) + } + .backgroundColor($r('app.color.background_color')) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear(): void{ + Log.showInfo(TAG, `aboutToDisappear`) + } + + onPageShow(): void{ + Log.showInfo(TAG, `onPageShow`) + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + } +} diff --git a/product/notificationmanagement/src/main/ets/default/pages/setEnable.ets b/product/notificationmanagement/src/main/ets/default/pages/setEnable.ets new file mode 100644 index 00000000..1481d29f --- /dev/null +++ b/product/notificationmanagement/src/main/ets/default/pages/setEnable.ets @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//import Window from '@ohos.window'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets'; +import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets'; +import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets'; +import SlotLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets'; +import ConfigData from '../common/constants.ets'; +import Router from '@system.router' + +const TAG = 'NotificationManagement-SetEnable'; + +let appInfo; + +@Entry +@Component +export default struct SetEnable { + build() { + Flex({ justifyContent: FlexAlign.SpaceBetween }) { + Column({ space: 30 }) { + HeadComponent({ headName: $r('app.string.notificationManagement'), isActive: true }); + Row() { + AppItemComponent({ + appIcon: appInfo.appIcon, + appTitle: appInfo.appTitle, + appSummary: appInfo.appSummary, + appValue: '', + appArrow: appInfo.appArrow, + appArrowStyle: '', + appUri: appInfo.appUri, + appBundleName: appInfo.appBundleName, + appUid: appInfo.appUid, + appSwitch: 0 + }); + } + .margin({ left: $r('app.float.page_margin_l'), right: $r('app.float.page_margin_r') }) + .align(Alignment.Start) + .backgroundColor($r('app.color.background_color')) + + + Row() { + SwitchComponent({ + title: $r('app.string.allowNotification'), + appBundleName: appInfo.appBundleName, + appUid: appInfo.appUid + }) + }.margin({ left: $r('app.float.page_margin_l'), + right: $r('app.float.page_margin_r') }) + .align(Alignment.Start) + + Row() { + SlotLstComponent({ appBundleName: appInfo.appBundleName, + appUid: appInfo.appUid }) + } + .align(Alignment.Start) + } + .alignItems(HorizontalAlign.Start) + .backgroundColor($r('app.color.background_color')) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + } + .width(ConfigData.WH_100_100) + + } + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + appInfo = Router.getParams(); + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + Router.back(); + } +} diff --git a/product/notificationmanagement/src/main/ets/default/vm/noDisturbViewModel.ets b/product/notificationmanagement/src/main/ets/default/vm/noDisturbViewModel.ets new file mode 100644 index 00000000..3d1d51fa --- /dev/null +++ b/product/notificationmanagement/src/main/ets/default/vm/noDisturbViewModel.ets @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2021 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 ConfigData from '../common/constants.ets'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ets'; +import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ets'; + +const TAG = 'NotificationManagement-NoDisturbViewModel' + +export default class NoDisturbViewModel extends NoDisturbComponentViewModel { + + endTimeClue: string = '' + + setClues() { + Log.showInfo(TAG, `setClues`) + if (this.startTime > this.endTime) { + this.endTimeClue = ConfigData.NEXT_DAY_NAME + this.endTime + } else { + this.endTimeClue = this.endTime + } + this.defaultStartTime = this.getDateByHHMI(this.startTime) + this.defaultEndTime = this.getDateByHHMI(this.endTime) + } + + setNoDisturbingDate() { + let noDisturbingTime = { + type: this.repeatMode, begin: this.defaultStartTime, end: this.defaultEndTime + } + NoDisturbingModel.setNoDisturbingDate(noDisturbingTime, () => { + Log.showInfo(TAG, 'setNoDisturbingDate is success') + }) + } + + onStartTimeAccept(data) { + Log.showInfo(TAG, `onStartTimeAccept`) + this.startTime = data + this.setClues() + this.setNoDisturbingDate() + + } + + onEndTimeAccept(data) { + Log.showInfo(TAG, `onEndTimeAccept`) + this.endTime = data + this.setClues() + this.setNoDisturbingDate() + } + + onRepeatModeAccect(data) { + Log.showInfo(TAG, `onRepeatModeAccect`) + this.setNoDisturbingDate() + } + + onCancel() { + Log.showInfo(TAG, `onCancel`) + } +} \ No newline at end of file diff --git a/product/notificationmanagement/src/main/resources/base/element/color.json b/product/notificationmanagement/src/main/resources/base/element/color.json new file mode 100644 index 00000000..9239d9af --- /dev/null +++ b/product/notificationmanagement/src/main/resources/base/element/color.json @@ -0,0 +1,32 @@ +{ + "color": [ + { + "name": "color_333333_grey", + "value": "#333333" + }, + { + "name": "color_999999_grey", + "value": "#999999" + }, + { + "name": "color_D4D4D4_grey", + "value": "#d4d4d4" + }, + { + "name": "color_E3E3E3_grey", + "value": "#E3E3E3" + }, + { + "name": "color_00000000_transparent", + "value": "#00000000" + }, + { + "name": "color_FBFBFB_grey", + "value": "#FBFBFB" + }, + { + "name": "color_F2F2F2_grey", + "value": "#F2F2F2" + } + ] +} \ No newline at end of file diff --git a/product/notificationmanagement/src/main/resources/base/element/float.json b/product/notificationmanagement/src/main/resources/base/element/float.json new file mode 100644 index 00000000..4ec88ecc --- /dev/null +++ b/product/notificationmanagement/src/main/resources/base/element/float.json @@ -0,0 +1,80 @@ +{ + "float": [ + { + "name": "wh_border_1", + "value": "1" + }, + { + "name": "radius_border_30", + "value": "30" + }, + { + "name": "wh_value_5", + "value": "5" + }, + { + "name": "wh_value_10", + "value": "10" + }, + { + "name": "wh_value_15", + "value": "15" + }, + { + "name": "wh_value_50", + "value": "50" + }, + { + "name": "wh_value_20", + "value": "20" + }, + { + "name": "wh_value_30", + "value": "30" + }, + { + "name": "wh_value_40", + "value": "40" + }, + { + "name": "wh_value_60", + "value": "60" + }, + { + "name": "wh_value_65", + "value": "65" + }, + { + "name": "wh_value_70", + "value": "70" + }, + { + "name": "wh_value_100", + "value": "100" + }, + { + "name": "wh_value_280", + "value": "280" + }, + { + "name": "wh_value_590", + "value": "590" + }, + { + "name": "font_16", + "value": "16" + }, + { + "name": "font_18", + "value": "18" + }, + { + "name": "font_20", + "value": "20" + }, + { + "name": "font_24", + "value": "24" + } + ] +} \ No newline at end of file diff --git a/product/systemDialog/src/main/resources/en_US/element/string.json b/product/notificationmanagement/src/main/resources/base/element/string.json similarity index 40% rename from product/systemDialog/src/main/resources/en_US/element/string.json rename to product/notificationmanagement/src/main/resources/base/element/string.json index e15e6feb..01f3cf29 100644 --- a/product/systemDialog/src/main/resources/en_US/element/string.json +++ b/product/notificationmanagement/src/main/resources/base/element/string.json @@ -2,23 +2,12 @@ "string": [ { "name": "app_name", - "value": "Dialog" + "value": "NotificationManagement" }, { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" - }, - { - "name": "access_request", - "value": "权限申请" - }, - { - "name": "access_sure", - "value": "确定" - }, - { - "name": "access_cancel", - "value": "取消" } + ] } \ No newline at end of file diff --git a/product/notificationmanagement/src/main/resources/base/media/ic_back.svg b/product/notificationmanagement/src/main/resources/base/media/ic_back.svg new file mode 100644 index 00000000..efbe194a --- /dev/null +++ b/product/notificationmanagement/src/main/resources/base/media/ic_back.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/product/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg b/product/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg new file mode 100644 index 00000000..ff6293ce --- /dev/null +++ b/product/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + diff --git a/product/notificationmanagement/src/main/resources/base/media/icon.png b/product/notificationmanagement/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { - Row() { - ForEach(item.Components, (item: string) => { - if (item == Constants.WIFI) { - WifiIcon() - } - if (item == Constants.SIGNAL) { - SignalIcon() - } - if (item == Constants.CLOCK) { - ClockIcon() - } - if (item == Constants.BATTERY) { - BatteryIcon() - } - if (item == Constants.NOTIFICATION) { - Row() { - if (this.notificationList.length > 3) { - ForEach(this.notificationList.slice(0, 3), (item: any) => { - Image(item.smallIcon) - .objectFit(ImageFit.ScaleDown) - .height(Constants.STATIC_BAR_ICON_HEIGHT*this.StatusCoefficient) - .width(Constants.STATIC_BAR_ICON_WIDTH*this.StatusCoefficient) - .margin({right:Constants.STATIC_BAR_ICON_MARGIN}) - }) - Row() { - Text('...') - .fontSize(20) - } - } else { - ForEach(this.notificationList, (item: any) => { - Image(item.smallIcon) - .objectFit(ImageFit.ScaleDown) - .height(Constants.STATIC_BAR_ICON_HEIGHT*this.StatusCoefficient) - .width(Constants.STATIC_BAR_ICON_WIDTH*this.StatusCoefficient) - .margin({right:Constants.STATIC_BAR_ICON_MARGIN}) - }) - } - } - .width(this.notificationList.length > 3 ? - (Constants.STATIC_BAR_ICON_WIDTH+Constants.STATIC_BAR_ICON_MARGIN) * 4 : - (Constants.STATIC_BAR_ICON_WIDTH+Constants.STATIC_BAR_ICON_MARGIN) * this.notificationList.length) - } - }) - }.constraintSize({ maxWidth: 200 }) - - if (item.id < this.layoutConfig.Groups.length) { - Text('') - .layoutWeight(1) - } - }) - } - .width('100%') - .height('100%') - } -} \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/common/constants.ets b/product/statusbar/src/main/ets/default/pages/common/constants.ets index cd287bb3..8086bb4c 100644 --- a/product/statusbar/src/main/ets/default/pages/common/constants.ets +++ b/product/statusbar/src/main/ets/default/pages/common/constants.ets @@ -14,11 +14,9 @@ */ export default class Constants { - static TOUCHTYPE_DOWN = 0; static TOUCHTYPE_UP = 1; static TOUCHTYPE_MOVE = 2; - static WEEKDAY_LIST = [ $r('app.string.monday'), $r('app.string.tuesday'), @@ -28,17 +26,16 @@ export default class Constants { $r('app.string.saturday'), $r('app.string.sunday') ] - static DIGITS = 10; static DEFAULT_MIDDLE_PART_WIDTH = 70; - static MARK_MONTH = 0; static MARK_DAY = 1; - + static EMPTY = 'empty' static WIFI = 'wifi' static SIGNAL = 'signal' static CLOCK = 'clock' static BATTERY = 'battery' + static CAPSULE = 'capsule' static NOTIFICATION = 'notification' static STATIC_BAR_ICON_WIDTH = 24; static STATIC_BAR_ICON_MARGIN = 2; diff --git a/product/statusbar/src/main/ets/default/common/util/configReader.ets b/product/statusbar/src/main/ets/default/pages/common/navigationEvent.ets similarity index 31% rename from product/statusbar/src/main/ets/default/common/util/configReader.ets rename to product/statusbar/src/main/ets/default/pages/common/navigationEvent.ets index 6f68d2f0..b8a7c77d 100644 --- a/product/statusbar/src/main/ets/default/common/util/configReader.ets +++ b/product/statusbar/src/main/ets/default/pages/common/navigationEvent.ets @@ -12,47 +12,58 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Fileio from '@ohos.fileio'; + +import commonEvent from '@ohos.commonEvent'; import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -const DEFAULT_LAYOUT_INFO_FILE_PATH = "/data/accounts/account_0/applications/com.ohos.systemui/" + - "com.ohos.systemui.statusbar/assets/statusbar/resources/rawfile/layoutConfig.json"; -const READ_DATA_SIZE = 4096; -const TAG = "ConfigReader" - -export default class ConfigReader { - public readFileToJson(path : string) { - let readStreamSync = null; - try { - readStreamSync = Fileio.createStreamSync(path, "r"); - let content = this.getContent(readStreamSync); - Log.showInfo(TAG, "SystemUI ConfigReader readJsonFile finish execution" + content); - return JSON.parse(content); - } catch (e) { - Log.showError(TAG, "SystemUI ConfigReader readJsonFile " + e); - } finally { - readStreamSync.closeSync(); +const TAG = 'navigationEvent'; + +let commonEventSubscribeInfo = { + events: ['SET_STATUSBAR_MIN_EVENT'] +}; + +let commonEventSubscriber = null; + +export class navigationEvent { + mCallback: any; + + registerCallback(callback) { + Log.showInfo(TAG, 'registerCallback'); + this.mCallback = callback; + if (commonEventSubscriber == null) { + commonEvent.createSubscriber( + commonEventSubscribeInfo, + this.createCapsuleSubscriberCallBack.bind(this) + ); } } - public getContent(readStreamSync) { - Log.showInfo(TAG, "SystemUI ConfigReader getContent start"); - let buf = new ArrayBuffer(READ_DATA_SIZE); - let len = readStreamSync.readSync(buf); - let arr = new Uint8Array(buf) - let charAt = ' '.charCodeAt(0) - for (let i = len; i < READ_DATA_SIZE; i++) { - arr[i] = charAt - } - let contentBuf = String.fromCharCode.apply(null, arr) - Log.showInfo(TAG, "SystemUI ConfigReader getContent read finished " + contentBuf); - return contentBuf; + createCapsuleSubscriberCallBack(err, data) { + Log.showInfo(TAG, `createCapsuleSubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + commonEventSubscriber = data; + commonEvent.subscribe(data, (err, data) => { + Log.showInfo(TAG, `subscribe err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + if (err.code == 0) { + const processingData = JSON.parse(data.data); + if (processingData) { + Log.showInfo(TAG, `subscribe processingData: ${JSON.stringify(processingData)} `); + this.mCallback.onStateChange(processingData); + } + } else { + Log.showError(TAG, 'date is err'); + } + }); } - public readLayoutConfig() { - Log.showInfo(TAG, "SystemUI ConfigReader readLayoutConfig start"); - var configObj = this.readFileToJson(DEFAULT_LAYOUT_INFO_FILE_PATH) - var mLayoutConfig = AppStorage.SetAndLink("layoutConfig", {}); - mLayoutConfig.set(configObj) + unregisterCallback() { + if (commonEventSubscriber != null) { + commonEvent.unsubscribe(commonEventSubscriber, () => { + Log.showInfo(TAG, 'Subscriberregister unregister Capsule Status Listener ==============='); + }); + } } -} \ No newline at end of file +} + +let mNavigationEvent = new navigationEvent(); + +export default mNavigationEvent as navigationEvent; \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/control.ets b/product/statusbar/src/main/ets/default/pages/control.ets index 42619a57..038f26e0 100644 --- a/product/statusbar/src/main/ets/default/pages/control.ets +++ b/product/statusbar/src/main/ets/default/pages/control.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ControlCenterComponent from './ControlCenter.ets' +import ControlCenterComponent from '../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets' import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' @@ -27,6 +27,7 @@ let mWindowManager; @Component export default struct Control { + @State mControlCenterComponentConfig: any = {} @Link showStatusBar: boolean private minHeight: number startX: number = 0 @@ -43,7 +44,10 @@ export default struct Control { build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { statusBar({minHeight: this.minHeight}) - ControlCenterComponent({showStatusBar: $showStatusBar}); + ControlCenterComponent({ + showStatusBar: $showStatusBar, + mControlCenterComponentConfig: this.mControlCenterComponentConfig + }); } .width('100%') .height('100%') diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets index 67768609..86529c4a 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -14,15 +14,21 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -import ConfigurableLayout from './ConfigurableLayout.ets' +import ReadConfigUtil from '../../../../../../../common/src/main/ets/default/ReadConfigUtil.ets' import Notification from './notification.ets' import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' -import ConfigReader from '../common/util/configReader.ets' -import mNotificationService from '../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' import ControlCenterComponent from './control.ets' import Constants from './common/constants.ets' +import NavigationEvent from './common/navigationEvent.ets' import mBrightnessManager from '../../../../../../../features/brightnesscomponent/src/main/ets/default/brightnessManager.ets'; import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets'; +import StatusBarComponent from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets'; + +const STATUS_BAR_COMPONENT_CONFIG_FILE_PATH = "/data/accounts/account_0/applications/com.ohos.systemui/" + +"com.ohos.systemui.statusbar/assets/statusbar/resources/rawfile/statusbarcomponentConfig.json"; + +const CONTROL_CENTER_COMPONENT_CONFIG_FILE_PATH = "/data/accounts/account_0/applications/com.ohos.systemui/" + +"com.ohos.systemui.statusbar/assets/statusbar/resources/rawfile/controlcentercomponentConfig.json"; const TAG = 'StatusBar-Index' @@ -36,11 +42,19 @@ struct Index { startY: number = 0 @State moveX: number = 0 @State moveY: number = 0 - @State showStatusBar: boolean = true - @StorageLink('minHeight') minHeight:number = 0 - @StorageLink('maxWidth') maxWidth:number = 0 - @StorageLink('StatusMinH') StatusMinH:number = 24 - @StorageLink('StatusCoefficient') StatusCoefficient:number = 1.0 + @StorageLink("showStatusBar") showStatusBar: boolean = true + @StorageLink('minHeight') minHeight: number = 0 + @StorageLink('maxWidth') maxWidth: number = 0 + @StorageLink('StatusMinH') StatusMinH: number = 24 + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + @State statusBarComponentConfig: any = {}; + @State controlCenterComponentConfig: any = {}; + mCallback: any; + + onBackPress(): boolean { + return true; + } + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, showStatusBar: ${this.showStatusBar}`); @@ -53,35 +67,63 @@ struct Index { StatusMinH.set(mHeightConfigUtils.getStatusMinH()); StatusCoefficient.set(mHeightConfigUtils.getStatusCoefficient()); + { + let configData = ReadConfigUtil.ReadConfigFile(STATUS_BAR_COMPONENT_CONFIG_FILE_PATH); + for (let key in configData) { + this.statusBarComponentConfig[key] = configData[key]; + } + } + { + let controlCenterConfigData = ReadConfigUtil.ReadConfigFile(CONTROL_CENTER_COMPONENT_CONFIG_FILE_PATH); + for (let key in controlCenterConfigData) { + this.controlCenterComponentConfig[key] = controlCenterConfigData[key]; + } + } + let signalObserved = AppStorage.SetAndLink("signalObserved", false); signalObserved.set(false); mWindowManager = new WindowManager(); mWindowManager.initWindowManager(); - mNotificationService.initNotificationService(); - mBrightnessManager.registerBrightnessListener(); + + this.mCallback = { + "onStateChange": this.onStateChange.bind(this) + } + NavigationEvent.registerCallback(this.mCallback); + } + + onStateChange(data) { + this.showStatusBar = true; + mWindowManager.setWindowMin((result) => { + }) } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear, showStatusBar: ${this.showStatusBar}`); - mBrightnessManager.unRegisterBrightnessListener(); } build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { if (this.showStatusBar) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - ConfigurableLayout() + StatusBarComponent({ + mStatusBarComponentConfig: this.statusBarComponentConfig, + mStatusBarColor: '#ffffffff' + }) } .width('100%') .height('100%') .backgroundColor($r("app.color.statusbar_background")) .onTouch(this.touchEvent.bind(this)) } else { - if( this.startX <= parseInt((this.maxWidth/2).toString()) ) { - Notification({ showStatusBar: $showStatusBar,minHeight:this.minHeight }) + if (vp2px(this.startX) <= parseInt((this.maxWidth / 2).toString())) { + Notification({ showStatusBar: $showStatusBar, minHeight: this.minHeight }) } else { - ControlCenterComponent({ showStatusBar: $showStatusBar,minHeight:this.minHeight }) + ControlCenterComponent({ + showStatusBar: $showStatusBar, + minHeight: this.minHeight, + mControlCenterComponentConfig: this.controlCenterComponentConfig + }) } } } @@ -104,7 +146,8 @@ struct Index { Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`) if (this.moveY > 10) { this.showStatusBar = false; - mWindowManager.setWindowMax((result)=>{}); + mWindowManager.setWindowMax((result) => { + }); } } } diff --git a/product/statusbar/src/main/ets/default/pages/notification.ets b/product/statusbar/src/main/ets/default/pages/notification.ets index 1fa0a2e1..604aa8b8 100644 --- a/product/statusbar/src/main/ets/default/pages/notification.ets +++ b/product/statusbar/src/main/ets/default/pages/notification.ets @@ -20,10 +20,9 @@ import BatteryIcon from '../../../../../../../features/batterycomponent/src/main import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon.ets' -import notificationItem from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets' +import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets' import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' -import mNotificationService from '../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' - +import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets' const TAG = 'StatusBar-notification' @@ -32,13 +31,14 @@ let mFeatureAbilityManager; @Component export default -struct Index { +struct Notification { @Link showStatusBar: boolean private minHeight: number startX: number = 0 startY: number = 0 @State moveX: number = 0 @State moveY: number = 0 + @StorageLink('notificationList') notificationList: any[] = [] aboutToAppear() { @@ -51,7 +51,21 @@ struct Index { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { statusBar({minHeight:this.minHeight}) quicklySetting({ showStatusBar: $showStatusBar}) - notificationItems({ showStatusBar: $showStatusBar}) + Stack({ alignContent: Alignment.TopStart }) { + NotificationListComponent() + if (this.notificationList.length > 0) { + Image($r('app.media.delete_all')) //icon: remove all notifications + .objectFit(ImageFit.Contain) + .width($r('app.float.deleteall_image_width')) + .height($r('app.float.deleteall_image_height')) + .borderRadius($r('app.float.deleteall_image_borderradius')) + .opacity($r('app.float.deleteall_image_opacity')) + .onClick(() => { + ViewModel.removeAllNotifications(); + }) + .position({ x: '44.5%', y: '85%' }) + } + } } .width('100%') .height('100%') @@ -123,7 +137,7 @@ struct quicklySetting { } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear, showStatusBar: ${this.showStatusBar}`) + Log.showInfo(TAG, `quicklySetting, aboutToDisappear, showStatusBar: ${this.showStatusBar}`) } build() { @@ -205,66 +219,3 @@ struct dateItem { } } } - -@Component -struct notificationItems { - @StorageLink('notificationList') notificationList: any[] = [] - @StorageLink('maxHeight') maxHeight:number = 0 - @StorageLink('minHeight') minHeight:number = 0 - @State notificationH :number = 0 - @Link showStatusBar: boolean - - aboutToAppear() { - Log.showInfo(TAG, `notificationItems, aboutToAppear`) - this.notificationH = this.maxHeight - (this.minHeight*2) - Constants.QUICKLY_SETTING_H; - } - - build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - if (this.notificationList.length == 0) { - //text: no notification - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { - Text($r('app.string.nonotification_text')) - .fontColor($r('app.color.nonotification_text_color')) - } - } else { - Stack({ alignContent: Alignment.TopStart }) { - List() { - ForEach(this.notificationList, (item: any) => { //notificationItems - ListItem() { - notificationItem({ itemData: item, showStatusBar: $showStatusBar }) - } - }, (item: any) => item.hashcode.toString()) - } - .onTouch((event: TouchEvent) => { - Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) - event.stopPropagation(); - }) - - Image($r('app.media.delete_all')) //icon: remove all notifications - .objectFit(ImageFit.Contain) - .width($r('app.float.deleteall_image_width')) - .height($r('app.float.deleteall_image_height')) - .borderRadius($r('app.float.deleteall_image_borderradius')) - .opacity($r('app.float.deleteall_image_opacity')) - .onClick(this.removeAllNotification.bind(this)) - .position({ x: '44.5%', y: '85%' }) - - Flex() { //bottom Line - }.width('100%').height('7%') - .opacity($r('app.float.deleteall_image_opacity')) - .position({ x: 0, y: '93%' }) - } - .width('100%') - .height('100%') - } - } - .width('100%') - .height(this.notificationH) - } - - removeAllNotification() { - Log.showInfo(TAG,` removeAllNotification `) - mNotificationService.removeAllNotifications(); - } -} diff --git a/product/statusbar/src/main/ets/default/workers/PluginDataSourceWorker.js b/product/statusbar/src/main/ets/default/workers/PluginDataSourceWorker.js new file mode 100644 index 00000000..069bf5f2 --- /dev/null +++ b/product/statusbar/src/main/ets/default/workers/PluginDataSourceWorker.js @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2021 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 worker from '@ohos.worker'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import PluginDataSourceManager +from '../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager.ets'; +import Constants, {obtainMsg} from '../../../../../../../common/src/main/ets/plugindatasource/common/Constants.ets'; + +const parentPort = worker.parentPort +const TAG = `${parentPort.name} Worker` +Log.showInfo(TAG, `Start.`) + +var sManager + +parentPort.onmessage = (msg) => { + Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); + let data = msg.data; + switch (data.action) { + case Constants.INIT_CONFIG: + initConfig(data.data); + break; + case Constants.CLEAR_ALL: + clearAll(); + break; + case Constants.LOAD_DATA: + loadData(); + break; + default: + Log.showError(TAG, `onMessage, unknown action type.`); + } +} + +function initConfig(config) { + Log.showInfo(TAG, `initConfig, config = ${JSON.stringify(config)}`); + sManager = new PluginDataSourceManager(); + sManager.onItemAdd = (itemData) => { + Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); + }; + sManager.onItemRemove = (itemData) => { + Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); + }; + sManager.initDataSource(config); + parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); +} + +function clearAll() { + Log.showInfo(TAG, `clearAll `); + sManager?.clearAll(); +} + +function loadData() { + Log.showInfo(TAG, `loadData `); + sManager?.loadData(); +} + +parentPort.onclose = function () { + Log.showInfo(TAG, `onclose`); +} + +parentPort.onmessageerror = function () { + Log.showInfo(TAG, `onmessageerror`); +} + +parentPort.onerror = function (data) { + Log.showInfo(TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}`); +} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/element/color.json b/product/statusbar/src/main/resources/base/element/color.json index 8c9f6a80..c3036068 100644 --- a/product/statusbar/src/main/resources/base/element/color.json +++ b/product/statusbar/src/main/resources/base/element/color.json @@ -4,6 +4,10 @@ "name": "default_background", "value": "#66000000" }, + { + "name": "default_font_color", + "value": "#ffffffff" + }, { "name": "index_background", "value": "#66000000" @@ -25,14 +29,8 @@ "value": "#292830" }, { - "name": "nonotification_text_color", - "value": "#ffffffff" - },{ "name": "twogroup_layout_background", "value": "#66000000" - },{ - "name": "title_font_color", - "value": "#FFF" } ] } \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/element/float.json b/product/statusbar/src/main/resources/base/element/float.json index bdd031b6..11ed5ed9 100644 --- a/product/statusbar/src/main/resources/base/element/float.json +++ b/product/statusbar/src/main/resources/base/element/float.json @@ -56,10 +56,6 @@ "name": "deleteall_image_borderradius", "value": "25" }, - { - "name": "deleteall_image_opacity", - "value": "0.9" - }, { "name": "default_left_width_small", "value": "230" @@ -67,33 +63,6 @@ { "name": "default_left_width_large", "value": "300" - },{ - "name": "up_title_height", - "value": "83" - },{ - "name": "center_item_margin_top", - "value": "20" - },{ - "name": "center_item_margin_left", - "value": "10" - },{ - "name": "center_item_margin_right", - "value": "10" - },{ - "name": "wifi_and_air_height", - "value": "120" - },{ - "name": "vol_height", - "value": "66" - },{ - "name": "title_font_size", - "value": "35" - },{ - "name": "notification_settings_width", - "value": "60" - },{ - "name": "notification_settings_height", - "value": "60" } ] } \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/element/string.json b/product/statusbar/src/main/resources/base/element/string.json index 4f850568..0cf84e26 100644 --- a/product/statusbar/src/main/resources/base/element/string.json +++ b/product/statusbar/src/main/resources/base/element/string.json @@ -43,15 +43,6 @@ { "name": "month", "value": "月" - },{ - "name": "nonotification_text", - "value": "无通知" - },{ - "name": "control_library", - "value": "control_library" - },{ - "name": "control_center", - "value": "控制中心" } ] } \ No newline at end of file diff --git a/product/statusbar/src/main/resources/en_US/element/string.json b/product/statusbar/src/main/resources/en_US/element/string.json index c3ada6c8..508e9bbe 100644 --- a/product/statusbar/src/main/resources/en_US/element/string.json +++ b/product/statusbar/src/main/resources/en_US/element/string.json @@ -43,15 +43,6 @@ { "name": "month", "value": "month" - },{ - "name": "nonotification_text", - "value": "no notification" - },{ - "name": "control_library", - "value": "control_library" - },{ - "name": "control_center", - "value": "控制中心" } ] } \ No newline at end of file diff --git a/product/statusbar/src/main/resources/rawfile/controlcentercomponentConfig.json b/product/statusbar/src/main/resources/rawfile/controlcentercomponentConfig.json new file mode 100644 index 00000000..837b8691 --- /dev/null +++ b/product/statusbar/src/main/resources/rawfile/controlcentercomponentConfig.json @@ -0,0 +1,19 @@ +{ + "ComplexToggleLayout": [ + "wifi", + "air_plane" + ], + "TempDBSimpleToggleLayout": [ + "testid" + ], + "LocalToggles": [ + "wifi", + "air_plane" + ], + "MetaToggles": [ + { + "id": "testid", + "abilityName": "" + } + ] +} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/rawfile/layoutConfig.json b/product/statusbar/src/main/resources/rawfile/layoutConfig.json deleted file mode 100644 index 63c3c334..00000000 --- a/product/statusbar/src/main/resources/rawfile/layoutConfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "Groups": [ - { "id": 1, - "Components": ["signal", "wifi", "notification"] - }, - { - "id": 2, - "Components": ["empty"] - }, - { - "id": 3, - "Components": ["battery", "clock"] - } - ] -} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/rawfile/statusbarcomponentConfig.json b/product/statusbar/src/main/resources/rawfile/statusbarcomponentConfig.json new file mode 100644 index 00000000..0a3cbcce --- /dev/null +++ b/product/statusbar/src/main/resources/rawfile/statusbarcomponentConfig.json @@ -0,0 +1,40 @@ +{ + "LayoutGroups": [ + { + "id": 1, + "Components": [ + "signal", + "wifi", + "capsule", + "notification" + ] + }, + { + "id": 2, + "Components": [] + }, + { + "id": 3, + "Components": [ + "battery", + "clock" + ] + } + ], + "metaIconKeys": [ + ], + "LocalSlots": [ + "clock", + "battery", + "signal", + "wifi", + "capsule", + "notification" + ], + "emptyPosition": { + "x1": 0, + "y1": 0, + "x2": 0, + "y2": 0 + } +} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/zh_CN/element/string.json b/product/statusbar/src/main/resources/zh_CN/element/string.json index 4f850568..0cf84e26 100644 --- a/product/statusbar/src/main/resources/zh_CN/element/string.json +++ b/product/statusbar/src/main/resources/zh_CN/element/string.json @@ -43,15 +43,6 @@ { "name": "month", "value": "月" - },{ - "name": "nonotification_text", - "value": "无通知" - },{ - "name": "control_library", - "value": "control_library" - },{ - "name": "control_center", - "value": "控制中心" } ] } \ No newline at end of file diff --git a/product/systemDialog/src/main/ets/default/pages/index.ets b/product/systemDialog/src/main/ets/default/pages/index.ets deleted file mode 100644 index 597594e5..00000000 --- a/product/systemDialog/src/main/ets/default/pages/index.ets +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) 2021 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 DialogModel from '../dialogModel.ets'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; - -const TAG = 'SystemDialog_Index'; - -let tempWorkArray = []; -let tempUnuseList = []; - -@Entry -@Component -struct Index { - @State useList: any = [] - @State workDataArray: any = [] - @State unUseList: any = [] - private getData: any; - - aboutToAppear() { - Log.showInfo(TAG, 'system dialog about to appear'); - DialogModel.registerListener(this.getMessage.bind(this)); - } - - aboutToDisappear() { - Log.showInfo(TAG, 'system dialog about to disappear'); - DialogModel.unregisterListener(); - } - - build() { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Text($r('app.string.access_request')) - .fontSize(22) - .fontWeight(FontWeight.Bold) - .fontColor($r('app.color.title_font_color')) - .height(50) - }.width('100%') - - List() { - ForEach(this.workDataArray, (item) => { - ListItem() { - Flex({ - direction: FlexDirection.Row, - alignItems: ItemAlign.Center, - justifyContent: FlexAlign.SpaceAround - }) { - Text(item) - .fontSize(18) - .fontColor(Color.Black) - .width(250) - - Toggle({ type: ToggleType.Switch, isOn: false }) - .width(60) - .height(40) - .onChange((isOn) => { - let index = this.useList.indexOf(item); - if (isOn) { - if (index === -1) { - this.useList.push(item) - this.unUseList.splice(index, 1) - } - } else { - if (index !== -1) { - this.useList.splice(index, 1) - this.unUseList.push(item) - } - } - }) - } - .width('100%') - .height(75) - }.height(75) - }, item => item); - }.divider({ strokeWidth: 1, color: $r('app.color.divider_line'), startMargin: 2, endMargin: 2 }) - .width('100%') - .height(200) - - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceAround }) { - Button() { - Text($r('app.string.access_sure')).fontSize(20).fontColor($r('app.color.button_font_color')) - } - .width(100) - .height(50) - .onClick(() => this.makeSure()) - - Button() { - Text($r('app.string.access_cancel')).fontSize(20).fontColor($r('app.color.button_font_color')) - } - .width(100) - .height(50) - .onClick(() => this.cancelButton()) - }.width('100%') - }.width('100%') - } - -/** - * Get permission data - * @param {Object} resultData permission data Object - * - */ - getMessage(resultData) { - Log.showInfo(TAG, 'index getMessage result'); - let dataList = resultData?.parameters?.OHOS_REQUEST_PERMISSIONS_LIST; - if (dataList?.length !== 0) { - this.getData = resultData; - Log.showInfo(TAG, ` ge tMessageWant result Data ${JSON.stringify(resultData)}`); - // handle permission Data to show - for (let item of dataList) { - tempWorkArray.push(item); - tempUnuseList.push(item); - } - this.workDataArray = tempWorkArray; - this.unUseList = tempUnuseList; - Log.showInfo(TAG, ` getMessageWant work with data ${JSON.stringify(this.workDataArray)}`); - } else { - Log.showInfo(TAG, ' getMessageWant result Data is a empty object'); - } - } - - -/** - * User confirmation - */ - makeSure() { - Log.showInfo(TAG, ' makeSure Click'); - let want = { - parameters: { - OHOS_RESULT_PERMISSION_KEY: 1, - OHOS_RESULT_PERMISSIONS_LIST: this.getData.parameters.OHOS_REQUEST_PERMISSIONS_LIST, - OHOS_RESULT_PERMISSIONS_LIST_YES: this.useList, - OHOS_RESULT_PERMISSIONS_LIST_NO: this.unUseList, - OHOS_RESULT_CALLER_BUNDLERNAME: this.getData.parameters.OHOS_REQUEST_CALLER_BUNDLERNAME - } - }; - let AbilityResult = { - resultCode: 1, - want: want - }; - DialogModel.finishResult(AbilityResult); - } - -/** - * User canceled - */ - cancelButton() { - Log.showInfo(TAG, ' cancelButton Click'); - let want = { - parameters: { - OHOS_RESULT_PERMISSION_KEY: 1, - OHOS_RESULT_PERMISSIONS_LIST: this.getData.parameters.OHOS_REQUEST_PERMISSIONS_LIST, - OHOS_RESULT_CALLER_BUNDLERNAME: this.getData.parameters.OHOS_REQUEST_CALLER_BUNDLERNAME - } - }; - let abilityResult = { - resultCode: 0, - want: want - }; - DialogModel.finishResult(abilityResult); - } -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index affd590b..444824ff 100755 --- a/settings.gradle +++ b/settings.gradle @@ -12,8 +12,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -include ':entry', ':product:navigationBar', ':common', ':product:statusbar', ':product:systemDialog', - ':features:batterycomponent', ':features:clockcomponent',':features:signalcomponent', - ':features:wificomponent', ':features:navigationservice',':features:noticeitem', - ':features:notificationservice',':features:airplanecomponent',':features:brightnesscomponent', - ':features:volumecomponent' \ No newline at end of file + +include ':entry', ':product:navigationBar', ':common', ':product:statusbar', ':product:notificationmanagement', + ':features:capsulecomponent', ':features:batterycomponent', ':features:clockcomponent', + ':features:signalcomponent', ':features:wificomponent', ':features:navigationservice', ':features:noticeitem', + ':features:airplanecomponent', ':features:brightnesscomponent', ':features:volumecomponent', ':features:managementcomponent', + ':features:statusbarcomponent', ':features:controlcentercomponent' \ No newline at end of file -- Gitee From ee4a91d6751e28260a27bcf09624fb9cd5399f8c Mon Sep 17 00:00:00 2001 From: r00498791 Date: Thu, 30 Dec 2021 14:23:26 +0800 Subject: [PATCH 041/373] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=95=8F=E6=84=9F?= =?UTF-8?q?=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: r00498791 --- doc/Instructions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/Instructions.md b/doc/Instructions.md index 9ad3abb5..aa1f4954 100644 --- a/doc/Instructions.md +++ b/doc/Instructions.md @@ -17,8 +17,8 @@ ``` ### 环境搭建 -打开DevEco Studio链接下载安装,安装步骤及安装说明详见下载地址([下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download)) - +打开DevEco Studio链接下载安装,安装步骤及安装说明详见下载地址开发者网站 + ## 基础开发说明 ### 系统接口调用 #### NAPI接口集成 -- Gitee From a44b39f870e92f17a5a3e2e96b696d82f3ab40cd Mon Sep 17 00:00:00 2001 From: r00498791 Date: Tue, 11 Jan 2022 20:00:31 +0800 Subject: [PATCH 042/373] sync SystemUI code Signed-off-by: r00498791 --- build.gradle | 103 ++++++----- .../src/main/ets/default/ResourceUtil.ets | 49 +++++- common/src/main/ets/default/WindowManager.ets | 61 ++++--- .../heightcofigUtils/HeightConfigUtils.ets | 2 +- doc/Instructions.md | 4 +- entry/.gitignore | 2 +- entry/build.gradle | 24 +-- entry/package.json | 2 +- entry/src/main/config.json | 3 +- .../main/resources/base/element/string.json | 22 +-- .../airplanecomponent/src/main/config.json | 3 +- .../main/resources/base/element/color.json | 5 - .../main/resources/base/element/float.json | 4 - .../batterycomponent/src/main/config.json | 3 +- .../brightnesscomponent/src/main/config.json | 3 +- .../main/ets/default/brightnessManager.ets | 10 +- .../ets/default/pages/brightnessComponent.ets | 2 +- .../capsulecomponent/src/main/config.json | 3 +- .../main/resources/base/element/string.json | 4 - features/clockcomponent/src/main/config.json | 3 +- .../src/main/ets/default/pages/clockIcon.ets | 36 +--- .../src/main/ets/default/timeModel.ets | 48 +++-- .../src/main/config.json | 1 + .../managementcomponent/src/main/config.json | 3 +- .../ohos/navigationservice/KeyCodeEvent.ets | 5 +- features/noticeitem/src/main/config.json | 3 +- .../com/ohos/noticeItem/common/constants.ets | 15 ++ .../noticeItem/model/NotificationManager.ets | 73 ++++++++ .../noticeItem/model/NotificationService.ets | 51 ++++-- .../ohos/noticeItem/model/ParseDataUtil.ets | 20 ++- .../noticeItem/model/rule/RuleController.ets | 166 +++++++++++------- .../view/NotificationListComponent.ets | 1 - .../ohos/noticeItem/view/item/customItem.ets | 75 ++++++++ .../ohos/noticeItem/view/item/generalItem.ets | 133 ++++++++++++++ .../noticeItem/view/item/notificationItem.ets | 121 ++----------- .../ohos/noticeItem/viewmodel/ViewModel.ets | 72 ++++++-- features/signalcomponent/src/main/config.json | 3 +- .../statusbarcomponent/src/main/config.json | 3 +- .../ohos/common/StatusBarConfiguration.ets | 124 +++++++++++++ .../ets/com/ohos/pages/StatusBarComponent.ets | 161 ++++++++++++----- .../main/resources/base/element/float.json | 4 + .../main/resources/base/element/string.json | 4 - .../main/resources/en_US/element/string.json | 4 - .../main/resources/zh_CN/element/string.json | 4 - features/volumecomponent/src/main/config.json | 3 +- .../src/main/ets/default/VolumeModel.ets | 6 +- .../ets/default/pages/volumeComponent.ets | 2 +- features/wificomponent/src/main/config.json | 3 +- .../main/resources/base/element/color.json | 4 - gradle.properties | 20 +-- infra/config_exts.gradle | 2 +- product/navigationBar/src/main/config.json | 3 +- .../src/main/ets/default/app.ets | 10 +- .../default/common/NavBarConfiguration.ets | 154 ++++++++++++++++ .../src/main/ets/default/pages/index.ets | 17 +- .../src/main/ets/default/pages/keyButton.ets | 5 +- .../src/main/ets/default/pages/oneLayout.ets | 4 +- .../main/ets/default/pages/threeLayout.ets | 44 +++-- .../main/resources/base/element/string.json | 32 ++++ .../main/resources/en_US/element/string.json | 32 ++++ .../main/resources/zh_CN/element/string.json | 34 +++- .../src/main/config.json | 3 +- product/statusbar/src/main/config.json | 3 +- .../statusbar/src/main/ets/default/app.ets | 19 +- .../src/main/ets/default/pages/index.ets | 24 ++- .../main/resources/base/element/float.json | 2 +- .../main/resources/base/element/string.json | 16 ++ .../main/resources/en_US/element/string.json | 16 ++ .../main/resources/zh_CN/element/string.json | 16 ++ 69 files changed, 1404 insertions(+), 512 deletions(-) rename features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets => common/src/main/ets/default/ResourceUtil.ets (39%) delete mode 100644 features/airplanecomponent/src/main/resources/base/element/color.json delete mode 100644 features/airplanecomponent/src/main/resources/base/element/float.json delete mode 100644 features/capsulecomponent/src/main/resources/base/element/string.json create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets delete mode 100644 features/statusbarcomponent/src/main/resources/base/element/string.json delete mode 100644 features/statusbarcomponent/src/main/resources/en_US/element/string.json delete mode 100644 features/statusbarcomponent/src/main/resources/zh_CN/element/string.json delete mode 100644 features/wificomponent/src/main/resources/base/element/color.json create mode 100644 product/navigationBar/src/main/ets/default/common/NavBarConfiguration.ets diff --git a/build.gradle b/build.gradle index 333f9a86..1849e365 100755 --- a/build.gradle +++ b/build.gradle @@ -1,44 +1,59 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. -apply plugin: 'com.huawei.ohos.app' -apply from: "./infra/config_exts.gradle" - -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - supportSystem "standard" -} - -buildscript { - repositories { - maven { - url 'http://repo.ark.tools.huawei.com/artifactory/maven-public/' - } - maven { - url 'https://mirrors.huaweicloud.com/repository/maven/' - } - maven { - url 'https://developer.huawei.com/repo/' - } - jcenter() - } - dependencies { - classpath 'com.huawei.ohos:hap:3.0.3.2' - } -} - -allprojects { - repositories { - maven { - url 'http://repo.ark.tools.huawei.com/artifactory/maven-public/' - } - maven { - url 'https://mirrors.huaweicloud.com/repository/maven/' - } - maven { - url 'https://developer.huawei.com/repo/' - } - jcenter() - } -} +// Top-level build file where you can add configuration options common to all sub-projects/modules. +apply plugin: 'com.huawei.ohos.app' +apply from: "./infra/config_exts.gradle" + +ohos { + signingConfigs { + release { + storeFile file('D:\\xu\\OpenHarmony.p12') + storePassword '00000016F2017A40C8B50DAD39A176E1D19A0BE947D48AC71C90F0DEB0CD251285923218A84F' + keyAlias = 'OpenHarmony Application Release' + keyPassword '00000016E8775BE9B2A7B5239556EDAE1A9000261023E5C8202C19A43936B6989FA617A094F7' + signAlg = 'SHA256withECDSA' + profile file('D:\\xu\\systemui.p7b') + certpath file('D:\\xu\\OpenHarmonyApplication.cer') + } + } + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + supportSystem "standard" +} + +buildscript { + repositories { + maven { + url 'http://repo.ark.tools.huawei.com/artifactory/maven-public/' + allowInsecureProtocol = true + } + maven { + url 'https://mirrors.huaweicloud.com/repository/maven/' + allowInsecureProtocol = true + } + maven { + url 'https://developer.huawei.com/repo/' + allowInsecureProtocol = true + } + } + dependencies { + classpath 'com.huawei.ohos:hap:3.0.5.2' + } +} + +allprojects { + repositories { + maven { + url 'http://repo.ark.tools.huawei.com/artifactory/maven-public/' + allowInsecureProtocol = true + } + maven { + url 'https://mirrors.huaweicloud.com/repository/maven/' + allowInsecureProtocol = true + } + maven { + url 'https://developer.huawei.com/repo/' + allowInsecureProtocol = true + } + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets b/common/src/main/ets/default/ResourceUtil.ets similarity index 39% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets rename to common/src/main/ets/default/ResourceUtil.ets index ddf8ff81..7d741e81 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets +++ b/common/src/main/ets/default/ResourceUtil.ets @@ -1,4 +1,4 @@ -/* +/** * Copyright (c) 2021 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. @@ -12,10 +12,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import ResMgr from '@ohos.resourceManager'; -export interface RuleData { - isAllowBanner:boolean; - sound:string; - vibration:string; - isAllowLockScreen:boolean; -} \ No newline at end of file +/** + * Resource util + */ +export class ResourceUtil { + private resMgr; + + /** + * Initialize ResourceManager + */ + async initResourceManager(): Promise { + if (!this.resMgr) { + this.resMgr = await ResMgr.getResourceManager('com.ohos.systemui'); + } + return this.resMgr; + } + + /** + * Get string value from NormalResource instance + * + * @param resource - NormalResource instance + */ + async getString(resource): Promise { + await this.initResourceManager(); + return await this.resMgr.getString(resource.id); + } + + /** + * Get direction value from NormalResource instance + * + * @param resource - NormalResource instance + */ + async getConfiguration(): Promise { + await this.initResourceManager(); + return await this.resMgr.getConfiguration(); + } +} + +let resourceUtil = new ResourceUtil(); + +export default resourceUtil as ResourceUtil; \ No newline at end of file diff --git a/common/src/main/ets/default/WindowManager.ets b/common/src/main/ets/default/WindowManager.ets index 00ec9b27..55534f3f 100644 --- a/common/src/main/ets/default/WindowManager.ets +++ b/common/src/main/ets/default/WindowManager.ets @@ -16,34 +16,30 @@ import Window from '@ohos.window'; import display from '@ohos.display' import Log from './Log.ets'; +import ResourceUtil from './ResourceUtil.ets'; const TAG = 'WindowManager'; -const STATUS_BAR_H = 0.07; var maxWidth; var maxHeight; var minHeight; -var quicklySettingH; -var notificationH; /** * Manage window size changes. */ export default class WindowManager { - initWindowManager() { - Log.showInfo(TAG, 'initWindowManager '); + async initWindowManager() { + Log.showInfo(TAG, 'initWindowManager'); maxWidth = AppStorage.SetAndLink("maxWidth", 0); maxHeight = AppStorage.SetAndLink("maxHeight", 0); minHeight = AppStorage.SetAndLink("minHeight", 0); - display.getDefaultDisplay() + await display.getDefaultDisplay() .then(dis => { - maxWidth.set(dis.width); - maxHeight.set(dis.height); - minHeight.set(this.getStatusBarDefaultHeight(dis.height)); - - Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth.get()} maxHeight ${maxHeight.get()} minHeight ${minHeight.get()}`); - }) + maxWidth.set(dis.width); + maxHeight.set(dis.height); + Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth.get()} maxHeight ${maxHeight.get()} minHeight ${minHeight.get()}`); + }) } /** @@ -55,12 +51,18 @@ export default class WindowManager { Log.showInfo(TAG, 'enter setWindowMax ================='); Window.getTopWindow() .then((windowData) => { - windowData.resetSize(maxWidth.get(), maxHeight.get()) - .then((result) => { - Log.showInfo(TAG, result); - callback(result); + Log.showInfo(TAG, 'enter setWindowMin maxWidth =================' + maxWidth.get() + " minHeight " + minHeight.get()); + windowData.resetSize(parseInt(maxWidth.get()), parseInt(maxHeight.get())) + .then((result) => { + Log.showInfo(TAG, result); + callback(result); + }); + + windowData.moveTo(0, 0) + .then((result) => { + Log.showInfo(TAG, result); + }); }); - }); } /** @@ -72,15 +74,26 @@ export default class WindowManager { Log.showInfo(TAG, 'enter setWindowMin ================='); Window.getTopWindow() .then((windowData) => { - windowData.resetSize(maxWidth.get(), minHeight.get()) - .then((result) => { - Log.showInfo(TAG, result); - callback(result); + Log.showInfo(TAG, 'enter setWindowMin maxWidth =================' + maxWidth.get() + " minHeight " + minHeight.get()); + windowData.resetSize(parseInt(maxWidth.get()), parseInt(minHeight.get())) + .then((result) => { + Log.showInfo(TAG, result); + callback(result); + }); }); - }); } - getStatusBarDefaultHeight(maxheight) { - return parseInt((maxheight * STATUS_BAR_H).toString()) + /** + * Set the window to the minimum size. + * + * @param {Object} callback - Callback function. + */ + async initWindowMin(width, height, x, y) { + AppStorage.Set("showStatusBar", true); + Log.showInfo(TAG, 'enter initWindowMin ================='); + Log.showInfo(TAG, 'width:' + width + ' height:' + height + ' x:' + x + ' y:' + y); + let abilityWindow = await Window.getTopWindow(); + await abilityWindow.moveTo(parseInt(x), parseInt(y)); + await abilityWindow.resetSize(parseInt(width), parseInt(height)); } } \ No newline at end of file diff --git a/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets b/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets index 5dbc1284..a6518c89 100644 --- a/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets +++ b/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets @@ -25,7 +25,7 @@ export default class HeightConfigUtils { return STATUS_BAR_MIN_HEIGHT; } - getNavMinH(){ + getminHeight(){ return NAV_BAR_MIN_HEIGHT; } diff --git a/doc/Instructions.md b/doc/Instructions.md index aa1f4954..9ad3abb5 100644 --- a/doc/Instructions.md +++ b/doc/Instructions.md @@ -17,8 +17,8 @@ ``` ### 环境搭建 -打开DevEco Studio链接下载安装,安装步骤及安装说明详见下载地址开发者网站 - +打开DevEco Studio链接下载安装,安装步骤及安装说明详见下载地址([下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download)) + ## 基础开发说明 ### 系统接口调用 #### NAPI接口集成 diff --git a/entry/.gitignore b/entry/.gitignore index 3543521e..796b96d1 100755 --- a/entry/.gitignore +++ b/entry/.gitignore @@ -1 +1 @@ -/build +/build diff --git a/entry/build.gradle b/entry/build.gradle index f1d235ec..b3f8b49d 100755 --- a/entry/build.gradle +++ b/entry/build.gradle @@ -1,12 +1,12 @@ -apply plugin: 'com.huawei.ohos.hap' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - testCompile 'junit:junit:4.12' -} +apply plugin: 'com.huawei.ohos.hap' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + testCompile 'junit:junit:4.12' +} diff --git a/entry/package.json b/entry/package.json index 69a88e3b..0967ef42 100755 --- a/entry/package.json +++ b/entry/package.json @@ -1 +1 @@ -{} +{} diff --git a/entry/src/main/config.json b/entry/src/main/config.json index 5d5a409c..d6e229b9 100755 --- a/entry/src/main/config.json +++ b/entry/src/main/config.json @@ -54,6 +54,7 @@ }, "pages": ["pages/index"] } - ] + ], + "srcPath": "default" } } \ No newline at end of file diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json index 24fea82b..6e983a57 100644 --- a/entry/src/main/resources/base/element/string.json +++ b/entry/src/main/resources/base/element/string.json @@ -1,12 +1,12 @@ -{ - "string": [ - { - "name": "app_name", - "value": "SystemUI" - }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - } - ] +{ + "string": [ + { + "name": "app_name", + "value": "SystemUI" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + } + ] } \ No newline at end of file diff --git a/features/airplanecomponent/src/main/config.json b/features/airplanecomponent/src/main/config.json index 3bb5c7c3..ff8e65b9 100644 --- a/features/airplanecomponent/src/main/config.json +++ b/features/airplanecomponent/src/main/config.json @@ -18,6 +18,7 @@ "deliveryWithInstall": true, "moduleName": "airplanecomponent", "moduleType": "har" - } + }, + "srcPath": "default" } } \ No newline at end of file diff --git a/features/airplanecomponent/src/main/resources/base/element/color.json b/features/airplanecomponent/src/main/resources/base/element/color.json deleted file mode 100644 index fd47795d..00000000 --- a/features/airplanecomponent/src/main/resources/base/element/color.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "color": [ - - ] -} diff --git a/features/airplanecomponent/src/main/resources/base/element/float.json b/features/airplanecomponent/src/main/resources/base/element/float.json deleted file mode 100644 index f7b2ff16..00000000 --- a/features/airplanecomponent/src/main/resources/base/element/float.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "float": [ - ] -} diff --git a/features/batterycomponent/src/main/config.json b/features/batterycomponent/src/main/config.json index aaa79a73..bf82fe61 100644 --- a/features/batterycomponent/src/main/config.json +++ b/features/batterycomponent/src/main/config.json @@ -17,6 +17,7 @@ "deliveryWithInstall": true, "moduleName": "batterycomponent", "moduleType": "har" - } + }, + "srcPath": "default" } } \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/config.json b/features/brightnesscomponent/src/main/config.json index d859c81b..275c237f 100644 --- a/features/brightnesscomponent/src/main/config.json +++ b/features/brightnesscomponent/src/main/config.json @@ -18,6 +18,7 @@ "deliveryWithInstall": true, "moduleName": "brightnesscomponent", "moduleType": "har" - } + }, + "srcPath": "default" } } \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets index 5675df3d..cd60e248 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets @@ -15,12 +15,12 @@ import Log from '../../../../../../common/src/main/ets/default/Log.ets'; import commonEvent from '@ohos.commonEvent'; -import settings from '@ohos.settingsnapi'; +import settings from '@ohos.settings'; import featureAbility from '@ohos.ability.featureAbility'; -const SYSTEMUI_BRIGHTNESS = 'brightness'; +const SYSTEMUI_BRIGHTNESS = 'settings.screen.brightness'; const TAG = 'Control-brightnessManager'; -var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 255); +var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 150); export class brightnessManager { helper: any @@ -36,7 +36,7 @@ export class brightnessManager { registerBrightness() { this.helper.on("dataChange", this.uri, (err) => { - let data = settings.getValue(this.helper, SYSTEMUI_BRIGHTNESS, '100') + let data = settings.getValue(this.helper, SYSTEMUI_BRIGHTNESS, '150') Log.showInfo(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); }) @@ -50,7 +50,7 @@ export class brightnessManager { getValue() { Log.showInfo(TAG, 'getValue'); - let data = settings.getValue(this.helper, SYSTEMUI_BRIGHTNESS, '100'); + let data = settings.getValue(this.helper, SYSTEMUI_BRIGHTNESS, '150'); Log.showInfo(TAG, `settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); } diff --git a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets index a32bb022..c85a2b10 100644 --- a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets +++ b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets @@ -61,7 +61,7 @@ export struct MyBrightness { min: this.brightnessItem.min, max: this.brightnessItem.max, step: 1, - style: SliderStyle.INSET + style: SliderStyle.InSet }) .width('100%') diff --git a/features/capsulecomponent/src/main/config.json b/features/capsulecomponent/src/main/config.json index cf592c99..f801c00c 100644 --- a/features/capsulecomponent/src/main/config.json +++ b/features/capsulecomponent/src/main/config.json @@ -27,6 +27,7 @@ "deliveryWithInstall": true, "moduleName": "capsulecomponent", "moduleType": "har" - } + }, + "srcPath": "default" } } \ No newline at end of file diff --git a/features/capsulecomponent/src/main/resources/base/element/string.json b/features/capsulecomponent/src/main/resources/base/element/string.json deleted file mode 100644 index bc311734..00000000 --- a/features/capsulecomponent/src/main/resources/base/element/string.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "string": [ - ] -} \ No newline at end of file diff --git a/features/clockcomponent/src/main/config.json b/features/clockcomponent/src/main/config.json index ac01639b..4d324788 100644 --- a/features/clockcomponent/src/main/config.json +++ b/features/clockcomponent/src/main/config.json @@ -17,6 +17,7 @@ "deliveryWithInstall": true, "moduleName": "clockcomponent", "moduleType": "har" - } + }, + "srcPath": "default" } } \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index f5705271..e5004beb 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -15,50 +15,16 @@ import timeModel from '../timeModel.ets' import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -import featureAbility from '@ohos.ability.featureAbility' -import settings from '@ohos.settingsnapi'; const TAG = 'ClockComponent-clockIcon'; -const LOOP_TIME = 20000; - @Component export default struct ClockIcon { @StorageLink('time') mTime: string = '16:01' - isUsing24hFormat: boolean aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); - timeModel.initTimeModel(this.isUsing24hFormat); - var isOnChange: boolean = false; - var timeInterval = setInterval(() => { - if (isOnChange) { - return; - } - Log.showInfo(TAG, 'setInterval') - let urivar = settings.getUri('settings.time.format') - Log.showInfo(TAG, 'urivar = ' + urivar) - let helper = featureAbility.acquireDataAbilityHelper(urivar); - Log.showInfo(TAG, ' helper = ' + helper) - helper.on("dataChange", urivar, (err) => { - if (err.code !== 0) { - Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); - return; - } else { - let getRetValue = settings.getValue(helper, 'settings.time.format', '24') - Log.showInfo(TAG, 'observer reveive notifychange on success format = ' + getRetValue) - if (getRetValue === '12') { - isOnChange = true; - this.isUsing24hFormat = false; - } else if (getRetValue === '24') { - isOnChange = true; - this.isUsing24hFormat = true; - } - timeModel.initTimeModel(this.isUsing24hFormat); - } - Log.showInfo(TAG, 'observer reveive notifychange on success data : ' + JSON.stringify(err)) - }) - }, LOOP_TIME); + timeModel.initTimeModel(); } aboutToDisappear() { diff --git a/features/clockcomponent/src/main/ets/default/timeModel.ets b/features/clockcomponent/src/main/ets/default/timeModel.ets index 17b0176b..988ed82a 100644 --- a/features/clockcomponent/src/main/ets/default/timeModel.ets +++ b/features/clockcomponent/src/main/ets/default/timeModel.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../common/src/main/ets/default/Log.ets' import featureAbility from '@ohos.ability.featureAbility' -import settings from '@ohos.settingsnapi'; +import settings from '@ohos.settings'; const SHORT_LENGTH = 1; const LOOP_TIME = 3000; @@ -26,24 +26,15 @@ var mTimeLink; var mDayLink; var mWeekDayLink; var mMonthLink; -var misUsing24hFormat: boolean; +var misUsing24hFormat: boolean = true; export class TimeModel { - /** * Init Time Model * */ - initTimeModel(isUsing24hFormat: boolean) { - Log.showInfo(TAG, 'initTimeModel' + isUsing24hFormat); - var reFresh: boolean = (misUsing24hFormat === isUsing24hFormat); - misUsing24hFormat = isUsing24hFormat; - Log.showInfo(TAG, `timeInterval : ${timeInterval} type: ${typeof timeInterval}`); - if (!reFresh) { - let date = new Date(); - Log.showInfo(TAG, `getCurrentDate ${date.toTimeString()}`); - this.updateTime(date); - } + initTimeModel() { + Log.showInfo(TAG, 'initTimeModel'); if (timeInterval === null || timeInterval === undefined) { Log.showInfo(TAG, 'first initTimeModel'); mTimeLink = AppStorage.SetAndLink('time', ''); @@ -52,6 +43,36 @@ export class TimeModel { mMonthLink = AppStorage.SetAndLink('month', ''); this.getCurrentDate(); } + this.listenTimeFormat(); + } + + listenTimeFormat() { + Log.showInfo(TAG, 'listenTimeFormat') + let urivar = null; + let helper = null; + try { + urivar = settings.getUri('settings.time.format') + helper = featureAbility.acquireDataAbilityHelper(urivar); + } catch (e) { + Log.showInfo(TAG, `settings getValue error: ${e.toString()}`); + } + + helper.on("dataChange", urivar, (err) => { + if (err.code !== 0) { + Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); + return; + } else { + let getRetValue = settings.getValue(helper, 'settings.time.format', '24') + Log.showInfo(TAG, 'observer reveive notifychange on success format = ' + getRetValue) + if (getRetValue === '12') { + misUsing24hFormat = false; + } else if (getRetValue === '24') { + misUsing24hFormat = true; + } + this.updateTime(new Date()); + } + Log.showInfo(TAG, 'observer reveive notifychange on success data : ' + JSON.stringify(err)) + }) } unInitTimeModel() { @@ -97,6 +118,7 @@ export class TimeModel { } let minutes = dateTime.getMinutes(); mTimeLink.set(`${this.fill(hours)}:${this.fill(minutes)}`); + Log.showInfo(TAG, 'updateTime set' + `${this.fill(hours)}:${this.fill(minutes)}`); } fill(value) { diff --git a/features/controlcentercomponent/src/main/config.json b/features/controlcentercomponent/src/main/config.json index d9314d61..6cf5a765 100644 --- a/features/controlcentercomponent/src/main/config.json +++ b/features/controlcentercomponent/src/main/config.json @@ -19,5 +19,6 @@ "moduleName": "controlcentercomponent", "moduleType": "har" }, + "srcPath": "default" } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/config.json b/features/managementcomponent/src/main/config.json index c7914daf..0bc56962 100644 --- a/features/managementcomponent/src/main/config.json +++ b/features/managementcomponent/src/main/config.json @@ -18,6 +18,7 @@ "deliveryWithInstall": true, "moduleName": "managementcomponent", "moduleType": "har" - } + }, + "srcPath": "default" } } \ No newline at end of file diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets index f0f66d52..fc8252a1 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets @@ -18,7 +18,6 @@ import commonevent from '@ohos.commonevent'; import Constants from './common/constants.ets'; import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; import Input from '@ohos.multimodalInput.inputEventClient'; -import settings from '@ohos.settingsnapi'; import featureAbility from '@ohos.ability.featureAbility'; const TAG = 'KeyCodeEvent' @@ -72,7 +71,7 @@ export class KeyCodeEvent { // After consulting the multi-mode subsystem, this parameter proved meaningless and remained unchanged keyDownDuration: 1, // This parameter changes with the version, and is currently 10008 - maxKeyCode: 10008 + isIntercepted: false } res = Input.injectEvent({ KeyEvent: keyEvent @@ -89,7 +88,7 @@ export class KeyCodeEvent { // After consulting the multi-mode subsystem, this parameter proved meaningless and remained unchanged keyDownDuration: 1, // This parameter changes with the version, and is currently 10008 - maxKeyCode: 10008 + isIntercepted: false } res = Input.injectEvent({ KeyEvent: keyEvent diff --git a/features/noticeitem/src/main/config.json b/features/noticeitem/src/main/config.json index 0c205af2..9d4eb9ec 100644 --- a/features/noticeitem/src/main/config.json +++ b/features/noticeitem/src/main/config.json @@ -18,6 +18,7 @@ "deliveryWithInstall": true, "moduleName": "noticeitem", "moduleType": "har" - } + }, + "srcPath": "default" } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets index 347c7973..0f8d7b93 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets @@ -49,6 +49,14 @@ export class InputActionButtonData { content: string = ''; } +interface RuleData { + isAllowBanner?: boolean; + isAllowSound?: boolean; + isAllowVibrationValues?: boolean; + isAllowStatusBarShow?: boolean; + isAllowNotificationListShow?: boolean; +} + export interface NotificationItemData { id: string; hashcode: string; @@ -73,6 +81,13 @@ export interface NotificationItemData { slotLevel?: any; source?: number; versionName?: string; + sound?: string; + vibrationValues?: Array; + ruleData?:RuleData; + template?: any; + isOngoing?: boolean; + isUnremovable?: boolean; + isRemoveAllowed?: boolean; } export interface NotificationServiceListener { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets index 00b4656d..f8fbecab 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets @@ -15,15 +15,19 @@ //import { NotificationSubscriber } from './notification/notificationSubscriber'; import Notification from '@ohos.notification'; +import PluginComponentManager from '@ohos.plugincomponent' import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; const TAG = 'NotificationManager'; +// Temporary path +const EXTERNAL_JSON_PATH = '/system/etc/NotificationTemplate/external.json' export default class NotificationManager { static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; static TYPE_PICTURE: number = Notification.ContentType.NOTIFICATION_CONTENT_PICTURE; + static NotificationTemplateMap = null; static subscribeNotification(tag, subscriber, asyncCallback) { Log.showInfo(TAG, `subscribeNotification from: ${tag}`); @@ -49,4 +53,73 @@ export default class NotificationManager { Log.showInfo(TAG, `getAllActiveNotifications from: ${tag}`); Notification.getAllActiveNotifications(callback); } + + static initNotificationTemplateMap(tag) { + Log.showInfo(TAG, `initNotificationTemplateMap from: ${tag}`); + if (NotificationManager.NotificationTemplateMap === null) { + NotificationManager.NotificationTemplateMap = new Map() + NotificationManager.requestTemplate(tag, '', EXTERNAL_JSON_PATH); + } + } + + static request(tag, param, asyncCallback) { + Log.showInfo(TAG, `request from: ${tag}`); + PluginComponentManager.request(param, (err, data) => { + asyncCallback(err, data); + }); + } + + static push(tag, param, asyncCallback) { + Log.showInfo(TAG, `push from: ${tag}`); + PluginComponentManager.push(param, () => { + asyncCallback(); + }); + } + + static requestListener(tag, asyncCallback) { + Log.showInfo(TAG, `requestListener from: ${tag}`); + PluginComponentManager.on('request', (source, name, data) => { + asyncCallback(source, name, data); + }) + } + + static pushListener(tag, asyncCallback) { + Log.showInfo(TAG, `pushListener from: ${tag}`); + PluginComponentManager.on('push', (source, template, data, extraData) => { + asyncCallback(source, template, data, extraData); + }); + } + + static requestTemplate(tag, templateName, templatePath) { + Log.showInfo(TAG, `requestTemplate from: ${tag}`); + + let reqWant = { + bundleName: '', + abilityName: '' + }; + let reqData = {} + + let requestParam = { + want: reqWant, + name: templateName, + data: reqData, + jsonPath: templatePath + }; + + NotificationManager.request(tag, requestParam, (err, data) => { + Log.showInfo(TAG, `request finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `request finished templateData: ${templateName} data: ${JSON.stringify(data.componentTemplate)}`) + if (data !== null && data !== undefined) { + Log.showInfo(TAG, `request finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`) + let templates = JSON.parse(data.componentTemplate.source); + Log.showInfo(TAG, `request templates: ${JSON.stringify(templates)}`) + for (let key in templates) { + NotificationManager.NotificationTemplateMap.set(key, { + "source": templates[key], "ability": "" + }); + } + } + Log.showInfo(TAG, `request finished notificationTemplateMap: ${JSON.stringify(NotificationManager.NotificationTemplateMap)}`) + }); + } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets index 3dc91759..fc577a22 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets @@ -18,6 +18,7 @@ import NotificationSubscriber from '@ohos.notificationSubscriber'; import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; import NotificationManager from './NotificationManager.ets'; import ParseDataUtil from './ParseDataUtil.ets'; +import RuleController from './rule/RuleController.ets'; const TAG = 'NotificationService'; @@ -36,6 +37,7 @@ export class NotificationService { init() { this.loadAllNotifications(); this.subscribeNotification(this.getSubscriber()); + this.loadNotificationTemplate() } public register(listener) { @@ -54,17 +56,15 @@ export class NotificationService { Log.showInfo(TAG, "unRegister listener success"); } - - public removeAll(){ + public removeAll() { Log.showInfo(TAG, 'removeAll start'); NotificationManager.removeAll(TAG, (data) => { Log.showInfo(TAG, `removeAll => data: ${JSON.stringify(data)}`); }); } - public remove(code: string) { - NotificationManager.remove(TAG, code,(data) => { + NotificationManager.remove(TAG, code, (data) => { Log.showInfo(TAG, `removeNotificationItem ==> data: ${JSON.stringify(data)}`); }) } @@ -74,7 +74,7 @@ export class NotificationService { Log.showInfo(TAG, `getAllActiveNotifications err: ${JSON.stringify(err)}`); Log.showInfo(TAG, `getAllActiveNotifications requestsArr: ${JSON.stringify(requestsArr)}`); if (Array.isArray(requestsArr)) { - for(let i = 0,len = requestsArr.length; i< len; i++) { + for (let i = 0, len = requestsArr.length; i < len; i++) { this.handleNotificationLoad(requestsArr[i]); } } @@ -93,22 +93,25 @@ export class NotificationService { handleNotificationAdd(data) { Log.showInfo(TAG, 'handleNotificationAdd started'); - Log.showInfo(TAG, 'sortingMap' + JSON.stringify(data.sortingMap||{})); + Log.showInfo(TAG, 'sortingMap' + JSON.stringify(data.sortingMap || {})); Log.showInfo(TAG, JSON.stringify(data)); - ParseDataUtil.parseData(data, (err, record) => { - Log.showInfo(TAG, `parseData after = ${JSON.stringify(record)}`); - Log.showInfo(TAG, `listeners.length = ${JSON.stringify(data)}`); - for(let i = 0,len = listeners.length; i< len; i++) { - Log.showInfo(TAG, `notify listener ` + i); - listeners[i].onNotificationConsume(record); - } + ParseDataUtil.parseData(data, (err, intermediateData) => { + Log.showInfo(TAG, `parseData after = ${JSON.stringify(intermediateData)}`); + RuleController.getNotificationData(intermediateData, (finalItemData) => { + Log.showInfo(TAG, `RuleController.getNotificationData after = ${JSON.stringify(finalItemData)}`); + Log.showInfo(TAG, `listeners.length = ${JSON.stringify(data)}`); + for (let i = 0, len = listeners.length; i < len; i++) { + Log.showInfo(TAG, `notify listener ` + i); + listeners[i].onNotificationConsume(finalItemData); + } + }); }); } handleNotificationCancel(data) { console.info("===>handleNotificationCancel data : ==> " + `data:${JSON.stringify(data)}`); ParseDataUtil.parseData(data, (err, record) => { - for(let i = 0,len = listeners.length; i< len; i++) { + for (let i = 0, len = listeners.length; i < len; i++) { listeners[i].onNotificationCancel(record); } }); @@ -117,19 +120,35 @@ export class NotificationService { handleNotificationLoad(data) { console.info("===>handleNotificationLoad data : ==> " + `data:${JSON.stringify(data)}`); ParseDataUtil.parseData(data, (err, record) => { - for(let i = 0,len = listeners.length; i< len; i++) { + for (let i = 0, len = listeners.length; i < len; i++) { listeners[i].onNotificationLoad(record); } }); } subscribeNotification(subscriber) { - let callback = (err,data) => { + let callback = (err, data) => { Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) }; NotificationManager.subscribeNotification(TAG, subscriber, callback); } + + loadNotificationTemplate() { + Log.showInfo(TAG, 'loadNotificationTemplate start'); + NotificationManager.initNotificationTemplateMap(TAG); + } + + getPluginTempLate(templateName) { + Log.showInfo(TAG, `getPluginTempLate param:${templateName}`); + let pluginTempLate = null; + if (NotificationManager.NotificationTemplateMap !== null) { + pluginTempLate = NotificationManager.NotificationTemplateMap.get(templateName); + } + Log.showInfo(TAG, `getPluginTempLate pluginTempLate:${JSON.stringify(pluginTempLate)}`); + return pluginTempLate; + } } let notificationService = new NotificationService(); + export default notificationService as NotificationService; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets index b5194398..6b1cd5dc 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets @@ -46,6 +46,18 @@ export default class ParseDataUtil { } catch (e) { Log.showInfo(TAG, `slot level get error: ${e.toString()}`); } + let sound = ''; + try { + sound = data?.sortingMap?.sortings[request.hashCode]?.slot.sound; + } catch (e) { + Log.showInfo(TAG, `sound get error: ${e.toString()}`); + } + let vibrationValues = []; + try { + vibrationValues = data?.sortingMap?.sortings[request.hashCode]?.slot.vibrationValues; + } catch (e) { + Log.showInfo(TAG, `vibrationValues get error: ${e.toString()}`); + } Log.showInfo(TAG, `want = ${JSON.stringify(request.wantAgent)}`); Log.showInfo(TAG, `actionButtons = ${JSON.stringify(request.actionButtons)}`); Log.showInfo(TAG, `largeIcon = ${request.largeIcon}`); @@ -63,7 +75,13 @@ export default class ParseDataUtil { smallIcon: NotificationConfig.USE_NOTIFICATION_ICON ? (request?.smallIcon ?? appMessage.icon) : appMessage.icon, largeIcon: request.largeIcon, slotLevel: slotLevel, - source: request.source + source: request.source, + sound: sound? sound : '', + vibrationValues: vibrationValues? vibrationValues : [], + template: request?.template, + isOngoing: request.isOngoing, + isUnremovable: request.isUnremovable, + isRemoveAllowed: request.isRemoveAllowed }; Log.showInfo(TAG, `notificationItem construct over ====================`); switch (request?.content?.contentType) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets index d0578417..28644d74 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets @@ -13,49 +13,37 @@ * limitations under the License. */ -import {NotificationItemData} from '../../common/constants.ets' -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; - -const TAG = 'RuleController'; - -export default class RuleController { +import {NotificationItemData} from '../../common/constants.ets'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import {SlotLevel} from '@ohos.notification'; +import Notification from '@ohos.notification'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import Bundle from '@ohos.bundle'; +const TAG = 'NotificationRuleController'; +export class RuleController { /** * Check if this notification is allow show or not * * @param {notificationItemData} Data of the notification * @param {callback} Data of the type to show the notification */ - static getNotificationData(notificationItemData, callback) { - if (typeof notificationItemData !== NotificationItemData) { - Log.showInfo(TAG, "type is not NotificationItemData") - callback(undefined) - return - } + getNotificationData(notificationItemData: NotificationItemData, callback) { + Log.showInfo(TAG, "getNotificationData start") + Log.showInfo(TAG, `notificationItemData = ${JSON.stringify(notificationItemData)}`); - this.this.isAllowSendNotification(notificationItemData.name, 0, "", (isSuccess) => { + this.isAllowSendNotification(notificationItemData, (isSuccess) => { if (!isSuccess) { - Log.showInfo(TAG, "user is not allow this to send notification") - callback(undefined) - return + Log.showInfo(TAG, "user is not allow this to send notification"); + callback(undefined); + return; } - this.isTooMuchNotification((isSuccess) => { - if (!isSuccess) { - Log.showInfo(TAG, "There are too much notification") - callback(undefined) - return - } - this.isAppTooMuchNotification(notificationItemData.name, 0, (isSuccess) => { - if (!isSuccess) { - Log.showInfo(TAG, "There are too much notification") - callback(undefined) - } - this.getNotificationDataByApp(notificationItemData.name, 0, "", (originData) => { - this.updateNotificationDataBySense(originData, (finialData) => { - callback(finalData) - }); - }); + this.getNotificationDataByApp(notificationItemData, (originalData) => { + Log.showInfo(TAG, `originalData = ${JSON.stringify(originalData)}`); + this.updateNotificationDataBySense(originalData, (finalData) => { + Log.showInfo(TAG, `finalData = ${JSON.stringify(finalData)}`); + callback(finalData); }); }); }); @@ -64,56 +52,106 @@ export default class RuleController { /** * Check if user allow the app send notification or not * - * @param {name} Package name of the app - * @param {uid} Uid of the app to distinguish twin app - * @param {channelId} The channel id of the app which is used to send notification + * @param {notificationItemData} The origin notification data * @param {callback} The user allow the app send notification or not */ - private static isAllowSendNotification(name, uid, channelId, callback) { - // TODO 权限管理 - } + isAllowSendNotification(notificationItemData, callback) { + Log.showInfo(TAG, "isAllowSendNotification start"); + Bundle.getBundleInfo(notificationItemData.bundleName, 0) + .then((data) => { + Log.showInfo(TAG, `getBundleInfo : ${JSON.stringify(data)}`) + Notification.isNotificationEnabled({ bundle: notificationItemData.bundleName, uid: data.uid }) + .then((flag) => { + Log.showInfo(TAG, `Notification.isNotificationEnabled:` + flag) + callback(flag); + }); + }); - /** - * Check there have been too much notification that there is no need to show another - * - * - * @param {callback} Send too much notification or not - */ - private static isTooMuchNotification(callback) { - // TODO 通知总条数显示限制 } /** - * Check if the app send too much notification to can not show another from this app - * + * Check whether sound or vibration is allowed * - * @param {name} Package name of the app - * @param {uid} Uid of the app to distinguish twin app - * @param {callback} Send too much notification or not + * @param {notificationItemData} The origin notification data + * @param {callback} whether sound or vibration is allowed */ - private static isAppTooMuchNotification(name, uid, callback) { - // TODO 单应用通知显示限制 + + SoundOrVibrate(notificationItemData, callback) { + Log.showInfo(TAG, "SoundOrVibrate start") + let sound = false; + let vibrationValues = false; + if (!CheckEmptyUtils.checkStrIsEmpty(notificationItemData.sound)) { + sound = true; + Log.showInfo(TAG, `notificationItemData.sound is allowed = ${sound}`); + } + if (!CheckEmptyUtils.isEmptyArr(notificationItemData.vibrationValues)) { + vibrationValues = true; + Log.showInfo(TAG, `notificationItemData.vibrationValues is allowed = ${vibrationValues}`); + } + callback(sound, vibrationValues); } + /** - * Get notification data of the notification channel + * Get notification data of the notification * - * @param {name} Package name of the app which send notification - * @param {uid} Uid of the app which send notification to distinguish twin app - * @param {channelId} The channel id of the app which is used to send notification + * @param {notificationItemData} The origin notification data * @param {callback} The type to show notification */ - private static getNotificationDataByApp(name, uid, channelId, callback) { - // TODO 提醒方式 + getNotificationDataByApp(notificationItemData, callback) { + Log.showInfo(TAG, "getNotificationDataByApp start") + let mNotificationItemData : NotificationItemData = notificationItemData; + mNotificationItemData.ruleData = { + isAllowBanner: false, + isAllowSound: false, + isAllowVibrationValues: false, + isAllowStatusBarShow : false, + isAllowNotificationListShow : false + }; + Log.showInfo(TAG, `notificationItemData.slotLevel = ${notificationItemData.slotLevel}`); + if (notificationItemData.slotLevel === SlotLevel.LEVEL_HIGH) { + mNotificationItemData.ruleData.isAllowBanner = true; + this.SoundOrVibrate(notificationItemData, (sound, vibrationValues) => { + mNotificationItemData.ruleData.isAllowSound = sound; + mNotificationItemData.ruleData.isAllowVibrationValues = vibrationValues; + }); + mNotificationItemData.ruleData.isAllowStatusBarShow = true; + mNotificationItemData.ruleData.isAllowNotificationListShow = true; + + } else if (notificationItemData.slotLevel === SlotLevel.LEVEL_DEFAULT) { + this.SoundOrVibrate(notificationItemData, (sound, vibrationValues) => { + mNotificationItemData.ruleData.isAllowSound = sound; + mNotificationItemData.ruleData.isAllowVibrationValues = vibrationValues; + }); + mNotificationItemData.ruleData.isAllowStatusBarShow = true; + mNotificationItemData.ruleData.isAllowNotificationListShow = true; + } else if (notificationItemData.slotLevel === SlotLevel.LEVEL_LOW || + notificationItemData.slotLevel === SlotLevel.LEVEL_MIN) { + mNotificationItemData.ruleData.isAllowNotificationListShow = true; + } else { + mNotificationItemData.ruleData.isAllowNotificationListShow = false; + } + Log.showInfo(TAG, `mNotificationItemData.ruleData = ${JSON.stringify(mNotificationItemData.ruleData)}`); + callback(mNotificationItemData); } + + /** * Check the sense of the phone to update the show type * - * @param {notificationData} The origin notification data - * @param {callback} The finial notification data + * @param {notificationItemData} The origin notification data + * @param {callback} The final notification data */ - private static updateNotificationDataBySense(notificationData, callback) { - // TODO 场景管理 + updateNotificationDataBySense(notificationItemData, callback) { + Log.showInfo(TAG, "updateNotificationDataBySense start") + let mNotificationItemData = notificationItemData; + // TODO Scenario Management + callback(mNotificationItemData); } -} \ No newline at end of file + +} + +let ruleController = new RuleController(); + +export default ruleController as RuleController; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index 2cafbbfa..85810ecd 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -27,7 +27,6 @@ export default struct NotificationListComponent { @StorageProp('minHeight') minHeight: number = 0 @State notificationH: number = 0 - aboutToAppear() { Log.showInfo(TAG, `notificationList, aboutToAppear`) this.notificationH = this.maxHeight - (this.minHeight * 2) - Constants.QUICKLY_SETTING_H; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets new file mode 100644 index 00000000..ecee556c --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import ViewModel from '../../viewmodel/ViewModel.ets'; + +const TAG = 'NoticeItem-CustomItem'; + +@Component +export default struct CustomItem { + private customItemData: any = {}; + private template: any = {}; + private templateData: any = {}; + @State isDebugMode: boolean = false; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + this.template = ViewModel.getPluginTempLate(this.customItemData.template.name); + this.templateData = this.customItemData.template.data; + Log.showInfo(TAG, `template = ${JSON.stringify(this.template)}`) + Log.showInfo(TAG, `templateData = ${JSON.stringify(this.templateData)}`) + } + + build() { + Stack({ alignContent: Alignment.TopStart }) { + Column() { + PluginComponent({ + template: this.template, + data: this.templateData + }).onComplete(() => { + Log.showInfo(TAG, `Complete`) + }).onError(({errcode, msg}) => { + Log.showInfo(TAG, `Error code:${errcode} message:${msg}`) + }) + .size({ width: 400, height: 130 }) + } + .backgroundColor($r('app.color.notificationitem_background')) + .opacity($r('app.float.item_opicaty')) + .borderRadius($r('app.float.item_borderradius')) + .margin({ + left: $r('app.float.item_marginleft'), + right: $r('app.float.item_marginright'), + top: $r('app.float.item_margintop') + }) + .padding({ + left: $r('app.float.item_paddingleft'), + right: $r('app.float.item_paddingright'), + bottom: $r('app.float.item_paddingbottom') + }) + + if (this.isDebugMode) { + Column() { + Text("-- DEBUG --") + .fontSize('32') + .fontWeight(FontWeight.Bold) + .fontColor(0xCCCCCC) + .opacity(0.5) + }.margin(10) + } + } + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets new file mode 100644 index 00000000..93303174 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2021 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 Constants from '../../common/constants.ets'; +import basicItem from './basicItem.ets'; +import longItem from './longItem.ets'; +import multiItem from './multiItem.ets'; +import pictureItem from './pictureItem.ets'; +import titleItem from './titleItem.ets'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import ViewModel from '../../viewmodel/ViewModel.ets'; +import ActionComponent from './actionComponent.ets'; + +const TAG = 'NoticeItem-GeneralItem'; + +@Component +export default struct GeneralItem { + private generalItemData: any = {} + @State hasPicture: boolean = false + @State isExpand: boolean = false + @State needExpand: boolean = true + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + if (CheckEmptyUtils.isEmpty(this.generalItemData.largeIcon)) { + this.hasPicture = false; + } else { + this.hasPicture = true; + } + this.needExpand = this.checkItemNeedExpand() + } + + checkItemNeedExpand() { + if (this.generalItemData.contentType === Constants.NOTIFICATION_TYPE_BASIC + && (!(this.generalItemData.actionButtons?.length > 0))) { + return false; + } else { + return true; + } + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`); + } + + build() { + Column() { + titleItem({ + notificationSmallIcon: this.generalItemData.smallIcon, + notificationName: this.generalItemData.appName, + notificationTime: this.generalItemData.time, + isExpand: $isExpand, + needExpand: this.needExpand + }) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + if (this.generalItemData.contentType === Constants.NOTIFICATION_TYPE_BASIC) { + basicItem({ + itemData: this.generalItemData + }); + } + if (this.generalItemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { + longItem({ + itemData: this.generalItemData, + isExpand: this.isExpand + }); + } + if (this.generalItemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { + multiItem({ + itemData: this.generalItemData, + isExpand: this.isExpand + }); + } + if (this.generalItemData.contentType === Constants.NOTIFICATION_TYPE_PICTURE) { + pictureItem({ + itemData: this.generalItemData, + isExpand: this.isExpand + }); + } + } + .width(this.hasPicture ? '85%' : '100%') + .margin({ top: $r('app.float.body_margin_top') }) + + if (this.hasPicture) { + Column() { + Image(this.generalItemData.largeIcon) + .objectFit(ImageFit.Contain) + .width(50) + .height(50) + } + .alignItems(HorizontalAlign.End) + .margin({ top: $r('app.float.body_margin_top') }) + .width('15%') + } + } + .onClick(() => { + ViewModel.clickItem(this.generalItemData); + }) + + if (this.isExpand) { + ActionComponent({ itemData: this.generalItemData }) + } + } + .backgroundColor($r('app.color.notificationitem_background')) + .opacity($r('app.float.item_opicaty')) + .borderRadius($r('app.float.item_borderradius')) + .margin({ + left: $r('app.float.item_marginleft'), + right: $r('app.float.item_marginright'), + top: $r('app.float.item_margintop') + }) + .padding({ + left: $r('app.float.item_paddingleft'), + right: $r('app.float.item_paddingright'), + bottom: $r('app.float.item_paddingbottom') + }) + + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index bae2a964..63bee3a4 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -13,34 +13,26 @@ * limitations under the License. */ -import Constants, {NotificationItemData} from '../../common/constants.ets'; -import basicItem from './basicItem.ets'; -import longItem from './longItem.ets'; -import multiItem from './multiItem.ets'; -import pictureItem from './pictureItem.ets'; -import titleItem from './titleItem.ets'; +import Constants from '../../common/constants.ets'; +import GeneralItem from './generalItem.ets'; +import CustomItem from './customItem.ets'; import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; import ViewModel from '../../viewmodel/ViewModel.ets'; import SettingDialog from './settingDialog.ets'; -import ConfirmDialog from './confirmDialog.ets'; -import ActionComponent from './actionComponent.ets'; +import ConfirmDialog from './confirmDialog.ets' const TAG = 'NoticeItem-NotificationItem'; @Component export default struct NotificationItem { private itemData: any = {} - @State hasPicture: boolean = false - @State isExpand: boolean = false - @State needExpand: boolean = true @State deleteIconDisplay: boolean = false; @State itemWidth: string = '100%' startX: number = 0 startY: number = 0 @State moveX: number = 0 @State moveY: number = 0 - settingDialogController: CustomDialogController = new CustomDialogController({ builder: SettingDialog({ itemData: this.itemData, @@ -49,12 +41,11 @@ export default struct NotificationItem { autoCancel: false, offset: { dx: 0, dy: 200 } }); - confirmDialogController: CustomDialogController = new CustomDialogController({ builder: ConfirmDialog({ title: $r('app.string.closeNovice'), bundleName: this.itemData.name, - action: ViewModel.removeNotificationItem.bind(ViewModel,this.itemData,true) + action: ViewModel.removeNotificationItem.bind(ViewModel, this.itemData, true) }), autoCancel: false, offset: { dx: 0, dy: 250 } @@ -62,20 +53,6 @@ export default struct NotificationItem { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) - if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { - this.hasPicture = false; - } else { - this.hasPicture = true; - } - this.needExpand = this.checkItemNeedExpand() - } - - checkItemNeedExpand() { - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC && (!(this.itemData.actionButtons?.length > 0))) { - return false; - } else { - return true; - } } aboutToDisappear() { @@ -86,76 +63,12 @@ export default struct NotificationItem { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { Row() { Column() { - titleItem({ - notificationSmallIcon: this.itemData.smallIcon, - notificationName: this.itemData.appName, - notificationTime: this.itemData.time, - isExpand: $isExpand, - needExpand: this.needExpand - }) - - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC) { - basicItem({ - itemData: this.itemData - }); - } - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { - longItem({ - itemData: this.itemData, - isExpand: this.isExpand - }); - } - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { - multiItem({ - itemData: this.itemData, - isExpand: this.isExpand - }); - } - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_PICTURE) { - pictureItem({ - itemData: this.itemData, - isExpand: this.isExpand - }); - } - } - .width(this.hasPicture ? '85%' : '100%') - .margin({ top: $r('app.float.body_margin_top') }) - - if (this.hasPicture) { - Column() { - Image(this.itemData.largeIcon) - .objectFit(ImageFit.Contain) - .width(50) - .height(50) - } - .alignItems(HorizontalAlign.End) - .margin({ top: $r('app.float.body_margin_top') }) - .width('15%') - } - } - .onClick(() => { - ViewModel.clickItem(this.itemData); - }) - - if (this.isExpand) { - ActionComponent({ itemData: this.itemData }) + if (CheckEmptyUtils.isEmpty(this.itemData.template)) { + GeneralItem({ generalItemData: this.itemData }) + } else { + CustomItem({ customItemData: this.itemData }) } } - .backgroundColor($r('app.color.notificationitem_background')) - .opacity($r('app.float.item_opicaty')) - .borderRadius($r('app.float.item_borderradius')) - .margin({ - left: $r('app.float.item_marginleft'), - right: $r('app.float.item_marginright'), - top: $r('app.float.item_margintop') - }) - .padding({ - left: $r('app.float.item_paddingleft'), - right: $r('app.float.item_paddingright'), - bottom: this.isExpand ? 0 : $r('app.float.item_paddingbottom') - }) .onTouch(this.touchNotificationItem.bind(this)) .width(this.itemWidth) @@ -167,13 +80,15 @@ export default struct NotificationItem { .width($r('app.float.item_delete_image_width')) .height($r('app.float.item_delete_image_height')) .onClick(this.showSettingDialog.bind(this)) - Image($r('app.media.delete')) //delete - .objectFit(ImageFit.Contain) - .width($r('app.float.item_delete_image_width')) - .height($r('app.float.item_delete_image_height')) - .onClick(() => { - ViewModel.removeNotificationItem(this.itemData, true); - }) + if (this.itemData.isRemoveAllowed) { + Image($r('app.media.delete')) //delete + .objectFit(ImageFit.Contain) + .width($r('app.float.item_delete_image_width')) + .height($r('app.float.item_delete_image_height')) + .onClick(() => { + ViewModel.removeNotificationItem(this.itemData, true); + }) + } } } .width('30%') diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets index 8e163887..c24cc3b9 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets @@ -15,6 +15,7 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; import media from '@ohos.multimedia.media'; +import vibrator from '@ohos.vibrator'; import wantAgent from '@ohos.wantAgent'; import SourceType from '@ohos.notification' import NotificationService from '../model/NotificationService.ets' @@ -30,20 +31,20 @@ const GROUP_THRESHOLD = 10; * Notification ViewModel class. */ export class ViewModel { - audioPlayer: any + audioPlayer: any; mNotificationList: any[]; mAppNotificationCount: any; mCallback: any; - mNotificationCtrl: any = {} + mNotificationCtrl: any = {}; constructor() { let tempLink = AppStorage.SetAndLink('notificationList', []); this.mNotificationList = tempLink.get(); this.mAppNotificationCount = new Map(); this.audioPlayer = media.createAudioPlayer(); - this.audioPlayer.src = 'file://system/etc/Light.ogg'; + this.audioPlayer.src = 'file://system/etc/capture.ogg'; this.registerCallback(); - this.loadFlowControlInfos() + this.loadFlowControlInfos(); } registerCallback() { @@ -59,13 +60,17 @@ export class ViewModel { NotificationService.unRegister(this.mCallback); } - /** * notification CancelCallback * * @param {Object} data - return notificationItemData. */ onNotificationConsume(notificationItemData) { + if (notificationItemData === undefined) { + Log.showInfo(TAG, `onNotificationConsume notificationItemData is undefined`); + return; + } + this.onNotificationCancel(notificationItemData) Log.showInfo(TAG, `onNotificationConsume ${JSON.stringify(notificationItemData)}`); //Verify the notifications can be displayed if (!this.isCanShow(notificationItemData.bundleName)) { @@ -79,12 +84,18 @@ export class ViewModel { if (this.mAppNotificationCount[notificationItemData.appName] >= GROUP_THRESHOLD) { this.groupNotification(notificationItemData, this.mAppNotificationCount[notificationItemData.appName]); } else { - // Todo Sort Insert - this.mNotificationList.unshift(notificationItemData); - this.updateFlowControlInfos(notificationItemData.bundleName, true) + if (notificationItemData.ruleData.isAllowStatusBarShow) { + //TODO statusbar show + } + if (notificationItemData.ruleData.isAllowNotificationListShow) { + this.mNotificationList.unshift(notificationItemData); + Log.showInfo(TAG, `reminder start `); + this.reminderWay(notificationItemData); + Log.showInfo(TAG, `reminder end `); + this.updateFlowControlInfos(notificationItemData.bundleName, true) + } this.updateNotification(); } - // Todo doAction(notificationItemData); } /** @@ -130,12 +141,12 @@ export class ViewModel { } updateNotification() { - Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(this.mNotificationList)}`); - Log.showInfo(TAG, `updateNotification len: ${this.mNotificationList.length}`); + Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(this.mNotificationList)}`); + Log.showInfo(TAG, `updateNotification length: ${this.mNotificationList.length}`); this.sortNotification() let listLink = AppStorage.Link('notificationList'); listLink.set(this.mNotificationList); - Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(listLink.get())}`); + Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(listLink.get())}`); } /** @@ -170,12 +181,12 @@ export class ViewModel { if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { this.mNotificationList = [] } else { - let index = this.mNotificationList.length while (index--) { Log.showInfo(TAG, `mNotificationList[${index}].source: ${this.mNotificationList[index].source}`); //Except the Long term notifications - if (this.mNotificationList[index].source != SourceType.TYPE_CONTINUOUS) { + if (this.mNotificationList[index].isRemoveAllowed && + !this.mNotificationList[index].isOngoing && !this.mNotificationList[index].isUnremovable) { Log.showInfo(TAG, `mNotificationList[${index}].hashcode: ${this.mNotificationList[index].hashcode}`); let hashCode = this.mNotificationList[index].hashcode this.removeSysNotificationItem(hashCode) @@ -302,6 +313,39 @@ export class ViewModel { Log.showInfo(TAG, `updateFlowControlInfos:${JSON.stringify(this.mNotificationCtrl)}`); } + reminderWay(itemData) { + if (itemData.ruleData.isAllowBanner) { + //TODO banner notification + } + if (itemData.ruleData.isAllowSound) { + try { + this.audioPlayer.src = itemData.sound; + Log.showInfo(TAG, `sound start `); + this.audioPlayer.play(); + Log.showInfo(TAG, `sound end `); + } catch (e) { + Log.showInfo(TAG, `sound notificationItem id:${itemData.id} alert error: ${e.toString()}`); + } + } + if (itemData.ruleData.isAllowVibrationValues) { + Log.showInfo(TAG, `vibrate start`); + for (let i = 0, len = itemData.vibrationValues.length; i < len; i++) { + vibrator.vibrate(itemData.vibrationValues[i], function(error){ + Log.showInfo(TAG, `vibrate id:${i}`); + if (error) { + Log.showInfo(TAG, "error.code" + error.code + "error.message" + error.message); + } else { + Log.showInfo(TAG, "Callback returned to indicate a successful vibration."); + } + }) + } + } + } + + getPluginTempLate(templateName) { + Log.showInfo(TAG, 'getPluginTempLate: ' + templateName); + return NotificationService.getPluginTempLate(templateName) + } } let viewModel = new ViewModel(); diff --git a/features/signalcomponent/src/main/config.json b/features/signalcomponent/src/main/config.json index d266ddcd..051c1f42 100644 --- a/features/signalcomponent/src/main/config.json +++ b/features/signalcomponent/src/main/config.json @@ -17,6 +17,7 @@ "deliveryWithInstall": true, "moduleName": "signalcomponent", "moduleType": "har" - } + }, + "srcPath": "default" } } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/config.json b/features/statusbarcomponent/src/main/config.json index 060972b9..aac814b5 100644 --- a/features/statusbarcomponent/src/main/config.json +++ b/features/statusbarcomponent/src/main/config.json @@ -18,6 +18,7 @@ "deliveryWithInstall": true, "moduleName": "statusbarcomponent", "moduleType": "har" - } + }, + "srcPath": "default" } } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets new file mode 100644 index 00000000..6d4bf3ef --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2021 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 display from '@ohos.display' +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil.ets' + +const TAG = 'StatusBarConfiguration'; + +var statusbarPosition; +var directionStatus; +var shortSideLength = '0'; + +var maxWidth; +var maxHeight; +var minHeight; +var realWidth; +var realHeight; +var xCoordinate = 0; +var yCoordinate = 0; + +enum Position { + NOT_CONFIGURED, + LEFT_POSITION, + TOP_POSITION, + RIGHT_POSITION, + BOTTOM_POSITION +} + +/** + * Get window size. + */ +class StatusBarConfiguration { + async initStatusBarConfiguration() { + Log.showInfo(TAG, 'initWindowManager'); + minHeight = AppStorage.SetAndLink("minHeight", 0); + + await display.getDefaultDisplay() + .then(dis => { + maxWidth = dis.width; + maxHeight = dis.height; + Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight.get()}`); + }) + } + + async getDirectionAndPosition() { + Log.showInfo(TAG, 'getDirectionAndPosition' + 1); + directionStatus = await ResourceUtil.getConfiguration(); + Log.showInfo(TAG, 'getDirectionAndPosition' + 2); + if (directionStatus.direction == -1) { + Log.showInfo(TAG, 'getDirectionAndPosition' + 3); + statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) + shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); + } else if (directionStatus.direction == 1) { + statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) + shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); + } else { + statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_portrait")) + shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_portrait")); + } + Log.showInfo(TAG, 'getDirectionAndPosition' + 4); + shortSideLength = vp2px(parseInt(shortSideLength)) + ''; + Log.showInfo(TAG, 'directionStatus = ' + directionStatus.direction); + Log.showInfo(TAG, 'statusbarPosition = ' + statusbarPosition); + Log.showInfo(TAG, 'lpx2px(parseInt(shortSideLength)) = ' + shortSideLength); + } + +/** + * Get status bar configuration + */ + public async getConfiguration() { + await this.initStatusBarConfiguration(); + await this.getDirectionAndPosition(); + if (statusbarPosition == Position.TOP_POSITION || statusbarPosition == Position.BOTTOM_POSITION) { + AppStorage.Set("showHorizontal", true); + minHeight.set(parseInt(shortSideLength)); + realWidth = maxWidth; + realHeight = parseInt(shortSideLength); + if (statusbarPosition == Position.BOTTOM_POSITION) { + yCoordinate = parseInt(maxHeight) - parseInt(shortSideLength); + } else { + AppStorage.Set("ableToMaximize", true); + } + } else if (statusbarPosition == Position.LEFT_POSITION || statusbarPosition == Position.RIGHT_POSITION) { + AppStorage.Set("showHorizontal", false); + AppStorage.Set("ableToMaximize", false); + minHeight.set(parseInt(shortSideLength)); + realWidth = parseInt(shortSideLength); + realHeight = maxHeight; + if (statusbarPosition == Position.RIGHT_POSITION) { + xCoordinate = parseInt(maxWidth) - parseInt(shortSideLength); + } + } else { + realWidth = 0; + realHeight = 0; + } + Log.showInfo(TAG, `initWindowManager xCoordinate ${xCoordinate} yCoordinate ${yCoordinate}`); + Log.showInfo(TAG, `initWindowManager realWidth ${realWidth} realHeight ${realHeight}`); + + var configuration = { + realWidth: realWidth, + realHeight: realHeight, + xCoordinate: xCoordinate, + yCoordinate: yCoordinate + } + return configuration; + } +} + +let statusBarConfiguration = new StatusBarConfiguration(); + +export default statusBarConfiguration; \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index b650c6b3..73a66fb9 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -37,6 +37,7 @@ export default struct StatusBarComponent { @StorageLink('maxHeight') @Watch('onSizeUpdated') maxHeight: number = 0 @StorageLink('minHeight') @Watch('onSizeUpdated') minHeight: number = 0 @StorageLink('StatusBarComponentIsStart') mIsStart: boolean = false + @StorageLink("showHorizontal") showHorizontal: boolean = AppStorage.SetAndLink("showHorizontal", true).get(); aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`) @@ -72,28 +73,53 @@ export default struct StatusBarComponent { } build() { - Row() { - StatusBarGroup({ - mColor: this.mStatusBarColor, - mComponents: this.mStatusBarLayout[0], - mLayoutWeight: 1, - mAlignItems: HorizontalAlign.Start - }) - StatusBarGroup({ - mColor: this.mStatusBarColor, - mComponents: this.mStatusBarLayout[1], - mLayoutWeight: 0, - mAlignItems: HorizontalAlign.Center - }) - StatusBarGroup({ - mColor: this.mStatusBarColor, - mComponents: this.mStatusBarLayout[2], - mLayoutWeight: 1, - mAlignItems: HorizontalAlign.End - }) + if (this.showHorizontal) { + Row() { + StatusBarGroup({ + mColor: this.mStatusBarColor, + mComponents: this.mStatusBarLayout[0], + mLayoutWeight: 1, + mAlignItems: HorizontalAlign.Start + }) + StatusBarGroup({ + mColor: this.mStatusBarColor, + mComponents: this.mStatusBarLayout[1], + mLayoutWeight: 0, + mAlignItems: HorizontalAlign.Center + }) + StatusBarGroup({ + mColor: this.mStatusBarColor, + mComponents: this.mStatusBarLayout[2], + mLayoutWeight: 1, + mAlignItems: HorizontalAlign.End + }) + } + .width('100%') + .height('100%') + } else { + Column() { + StatusBarGroup({ + mColor: this.mStatusBarColor, + mComponents: this.mStatusBarLayout[0], + mLayoutWeight: 1, + mAlignItems: VerticalAlign.Center + }) + StatusBarGroup({ + mColor: this.mStatusBarColor, + mComponents: this.mStatusBarLayout[1], + mLayoutWeight: 0, + mAlignItems: VerticalAlign.Center + }) + StatusBarGroup({ + mColor: this.mStatusBarColor, + mComponents: this.mStatusBarLayout[2], + mLayoutWeight: 1, + mAlignItems: VerticalAlign.Center + }) + } + .width('100%') + .height('100%') } - .width('100%') - .height('100%') } } @@ -104,6 +130,7 @@ struct StatusBarGroup { @State mLayoutWeight: number = 1 @State mAlignItems: HorizontalAlign = HorizontalAlign.Center; @StorageLink('StatusBarEmptyWidth') mStatusBarEmptyWidth: any = 0 + @StorageLink("showHorizontal") showHorizontal: boolean = AppStorage.SetAndLink("showHorizontal", true).get(); aboutToAppear() { Log.showInfo(TAG_StatusBarGroup, `aboutToAppear Start`) @@ -115,37 +142,75 @@ struct StatusBarGroup { } build() { - Column() { + if (this.showHorizontal) { + Column() { + Row() { + ForEach(this.mComponents, (componentName: string) => { + Row() { + if (componentName == Constants.EMPTY) { + StatusBarEmptyIcon() + } else if (componentName == Constants.WIFI) { + WifiIcon() + } else if (componentName == Constants.SIGNAL) { + SignalIcon() + } else if (componentName == Constants.CLOCK) { + ClockIcon() + } else if (componentName == Constants.BATTERY) { + BatteryIcon() + } else if (componentName == Constants.CAPSULE) { + CapsuleIcon() + } else if (componentName == Constants.NOTIFICATION) { + StatusBarNotificationIcon() + } else { + IconItemComponent({ + keyId: componentName, + color: this.mColor + }) + } + } + .height('100%') + }, (componentName: string) => componentName) + } + } + .alignItems(this.mAlignItems) + .layoutWeight(this.mLayoutWeight) + } else { Row() { - ForEach(this.mComponents, (componentName: string) => { - Row() { - if (componentName == Constants.EMPTY) { - StatusBarEmptyIcon() - } else if (componentName == Constants.WIFI) { - WifiIcon() - } else if (componentName == Constants.SIGNAL) { - SignalIcon() - } else if (componentName == Constants.CLOCK) { - ClockIcon() - } else if (componentName == Constants.BATTERY) { - BatteryIcon() - } else if (componentName == Constants.CAPSULE) { - CapsuleIcon() - } else if (componentName == Constants.NOTIFICATION) { - StatusBarNotificationIcon() - } else { - IconItemComponent({ - keyId: componentName, - color: this.mColor - }) + Column() { + ForEach(this.mComponents, (componentName: string) => { + Row() { + if (componentName == Constants.EMPTY) { + StatusBarEmptyIcon() + } else if (componentName == Constants.WIFI) { + WifiIcon() + } else if (componentName == Constants.SIGNAL) { + SignalIcon() + } else if (componentName == Constants.CLOCK) { + ClockIcon() + } else if (componentName == Constants.BATTERY) { + BatteryIcon() + } else if (componentName == Constants.CAPSULE) { + CapsuleIcon() + } else if (componentName == Constants.NOTIFICATION) { + StatusBarNotificationIcon() + } else { + IconItemComponent({ + keyId: componentName, + color: this.mColor + }) + } } - } - .height('100%') - }, (componentName: string) => componentName) + .width('100%') + .margin({ + top: $r("app.float.status_bar_vertical_margin"), + bottom: $r("app.float.status_bar_vertical_margin") + }) + }, (componentName: string) => componentName) + } } + .alignItems(this.mAlignItems) + .layoutWeight(this.mLayoutWeight) } - .alignItems(this.mAlignItems) - .layoutWeight(this.mLayoutWeight) } } diff --git a/features/statusbarcomponent/src/main/resources/base/element/float.json b/features/statusbarcomponent/src/main/resources/base/element/float.json index 4e100c94..26c4a1ba 100644 --- a/features/statusbarcomponent/src/main/resources/base/element/float.json +++ b/features/statusbarcomponent/src/main/resources/base/element/float.json @@ -3,6 +3,10 @@ { "name": "icon_item_fontsize", "value": "18" + }, + { + "name": "status_bar_vertical_margin", + "value": "24" } ] } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/resources/base/element/string.json b/features/statusbarcomponent/src/main/resources/base/element/string.json deleted file mode 100644 index bc311734..00000000 --- a/features/statusbarcomponent/src/main/resources/base/element/string.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "string": [ - ] -} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/resources/en_US/element/string.json b/features/statusbarcomponent/src/main/resources/en_US/element/string.json deleted file mode 100644 index bc311734..00000000 --- a/features/statusbarcomponent/src/main/resources/en_US/element/string.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "string": [ - ] -} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/resources/zh_CN/element/string.json b/features/statusbarcomponent/src/main/resources/zh_CN/element/string.json deleted file mode 100644 index bc311734..00000000 --- a/features/statusbarcomponent/src/main/resources/zh_CN/element/string.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "string": [ - ] -} \ No newline at end of file diff --git a/features/volumecomponent/src/main/config.json b/features/volumecomponent/src/main/config.json index 98b83a58..12cd750a 100644 --- a/features/volumecomponent/src/main/config.json +++ b/features/volumecomponent/src/main/config.json @@ -18,6 +18,7 @@ "deliveryWithInstall": true, "moduleName": "volumecomponent", "moduleType": "har" - } + }, + "srcPath": "default" } } \ No newline at end of file diff --git a/features/volumecomponent/src/main/ets/default/VolumeModel.ets b/features/volumecomponent/src/main/ets/default/VolumeModel.ets index 689f7fb6..49a47cf7 100644 --- a/features/volumecomponent/src/main/ets/default/VolumeModel.ets +++ b/features/volumecomponent/src/main/ets/default/VolumeModel.ets @@ -15,12 +15,12 @@ import audio from '@ohos.multimedia.audio'; import Log from '../../../../../../common/src/main/ets/default/Log.ets'; -import settings from '@ohos.settingsnapi'; +import settings from '@ohos.settings'; import featureAbility from '@ohos.ability.featureAbility'; -const SYSTEMUI_AUDIOVOLUMETYPE_MEDIA = 'Audio.AudioVolumeType.MEDIA' +const SYSTEMUI_AUDIOVOLUMETYPE_MEDIA = 'settings.audio.media' let TAG = 'Control-VolumeModel'; -var mVolumeValue = AppStorage.SetAndLink('VolumeValue', 10); +var mVolumeValue = AppStorage.SetAndLink('VolumeValue', 5); export class VolumeModel { helper: any diff --git a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets index ee3abb58..95372de3 100644 --- a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets +++ b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets @@ -72,7 +72,7 @@ export struct MyVol { min: this.volume.minValue, max: this.volume.maxValue, step: 1, - style: SliderStyle.INSET + style: SliderStyle.InSet }) .width('100%') .blockColor(Color.Blue) diff --git a/features/wificomponent/src/main/config.json b/features/wificomponent/src/main/config.json index bb1a026e..29c6ccec 100644 --- a/features/wificomponent/src/main/config.json +++ b/features/wificomponent/src/main/config.json @@ -17,6 +17,7 @@ "deliveryWithInstall": true, "moduleName": "wificomponent", "moduleType": "har" - } + }, + "srcPath": "default" } } \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/element/color.json b/features/wificomponent/src/main/resources/base/element/color.json deleted file mode 100644 index 7fc8ec73..00000000 --- a/features/wificomponent/src/main/resources/base/element/color.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "color": [ - ] -} diff --git a/gradle.properties b/gradle.properties index c555b4e6..0daf1830 100755 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,10 @@ -# Project-wide Gradle settings. -# IDE (e.g. DevEco Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -# If the Chinese output is garbled, please configure the following parameter. -# org.gradle.jvmargs=-Dfile.encoding=GBK +# Project-wide Gradle settings. +# IDE (e.g. DevEco Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# If the Chinese output is garbled, please configure the following parameter. +# org.gradle.jvmargs=-Dfile.encoding=GBK diff --git a/infra/config_exts.gradle b/infra/config_exts.gradle index 58418170..f84c6933 100644 --- a/infra/config_exts.gradle +++ b/infra/config_exts.gradle @@ -1,6 +1,6 @@ ext { version = [ - compileSdk: 7, + compileSdk: 8, compatibleSdk: 4 ] } \ No newline at end of file diff --git a/product/navigationBar/src/main/config.json b/product/navigationBar/src/main/config.json index eff58fc1..06021a60 100644 --- a/product/navigationBar/src/main/config.json +++ b/product/navigationBar/src/main/config.json @@ -46,6 +46,7 @@ "autoDesignWidth": false } } - ] + ], + "srcPath": "default" } } \ No newline at end of file diff --git a/product/navigationBar/src/main/ets/default/app.ets b/product/navigationBar/src/main/ets/default/app.ets index fae1f01c..a0bf8f9f 100644 --- a/product/navigationBar/src/main/ets/default/app.ets +++ b/product/navigationBar/src/main/ets/default/app.ets @@ -14,15 +14,21 @@ */ import configManager from '../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets' +import WindowManager from '../../../../../../common/src/main/ets/default/WindowManager.ets' +import NavBarConfiguration from './common/NavBarConfiguration.ets' let mConfigMangager = configManager; export default { - onCreate() { + async onCreate() { console.info('Application onCreate') + let val = await NavBarConfiguration.getConfiguration(); + let mWindowManager = new WindowManager(); + await mWindowManager.initWindowManager(); + await mWindowManager.initWindowMin(val.realWidth, val.realHeight, val.xCoordinate, val.yCoordinate) mConfigMangager.initConfig(); }, onDestroy() { console.info('Application onDestroy') }, -} +} \ No newline at end of file diff --git a/product/navigationBar/src/main/ets/default/common/NavBarConfiguration.ets b/product/navigationBar/src/main/ets/default/common/NavBarConfiguration.ets new file mode 100644 index 00000000..bab942a4 --- /dev/null +++ b/product/navigationBar/src/main/ets/default/common/NavBarConfiguration.ets @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2021 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 display from '@ohos.display'; +import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil.ets'; + +const TAG = 'NavBarConfiguration'; +var directionNav; +var navbarPosition; +var statusbarPosition; +var navShortSideLength = '0'; +var statusShortSideLength = '0'; + +var maxWidth; +var maxHeight; +var minHeight; +var realWidth; +var realHeight; +var xCoordinate = 0; +var yCoordinate = 0; + +enum Position { + NOT_CONFIGURED, + LEFT_POSITION, + TOP_POSITION, + RIGHT_POSITION, + BOTTOM_POSITION +} + +/** + * Get window size. + */ +class NavBarConfiguration { + async initNavBarConfiguration() { + Log.showInfo(TAG, 'initNavBarConfiguration'); + minHeight = AppStorage.SetAndLink("minNavHeight", 0); + + await display.getDefaultDisplay() + .then(dis => { + maxWidth = dis.width; + maxHeight = dis.height; + Log.showInfo(TAG, `initNavBarConfiguration maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight.get()}`); + }) + } + + async getDirectionAndPosition() { + directionNav = await ResourceUtil.getConfiguration(); + if (directionNav.direction == -1) { + statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) + navbarPosition = await ResourceUtil.getString($r("app.string.nav_bar_position_landscape")) + + statusShortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); + navShortSideLength = await ResourceUtil.getString($r("app.string.nav_bar_size_landscape")); + } else if (directionNav.direction == 1) { + statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) + navbarPosition = await ResourceUtil.getString($r("app.string.nav_bar_position_landscape")) + + statusShortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); + navShortSideLength = await ResourceUtil.getString($r("app.string.nav_bar_size_landscape")); + } else { + statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_portrait")) + navbarPosition = await ResourceUtil.getString($r("app.string.nav_bar_position_portrait")) + + statusShortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_portrait")); + navShortSideLength = await ResourceUtil.getString($r("app.string.nav_bar_size_portrait")); + } + statusShortSideLength = vp2px(parseInt(statusShortSideLength)) + ''; + navShortSideLength = vp2px(parseInt(navShortSideLength)) + ''; + Log.showInfo(TAG, 'statusShortSideLength = ' + statusShortSideLength); + Log.showInfo(TAG, 'navShortSideLength = ' + navShortSideLength); + Log.showInfo(TAG, 'directionnav = ' + directionNav.direction); + Log.showInfo(TAG, 'statusbarPosition = ' + statusbarPosition); + Log.showInfo(TAG, 'NavbarPosition = ' + navbarPosition); + } + +/** + * Get nav bar configuration + */ + public async getConfiguration() { + await this.initNavBarConfiguration(); + + await this.getDirectionAndPosition(); + + if (navbarPosition == Position.TOP_POSITION || navbarPosition == Position.BOTTOM_POSITION) { + AppStorage.Set("showNavHorizontal", true); + minHeight.set(parseInt(navShortSideLength)); + Log.showInfo(TAG, 'TOP_POSITION = ' + 2); + if (statusbarPosition == Position.LEFT_POSITION || statusbarPosition == Position.RIGHT_POSITION) { + realWidth = parseInt(maxWidth) - parseInt(statusShortSideLength); + } else { + realWidth = maxWidth; + } + Log.showInfo(TAG, 'TOP_POSITION = ' + 3); + realHeight = parseInt(navShortSideLength); + Log.showInfo(TAG, 'TOP_POSITION = ' + 4); + if (statusbarPosition == Position.LEFT_POSITION) { + xCoordinate = parseInt(statusShortSideLength); + } else { + xCoordinate = 0; + } + Log.showInfo(TAG, 'TOP_POSITION = ' + 5); + if (navbarPosition == Position.BOTTOM_POSITION) { + yCoordinate = parseInt(maxHeight) - parseInt(navShortSideLength); + Log.showInfo(TAG, 'BOTTOM_POSITION = ' + yCoordinate); + } + } else if (navbarPosition == Position.LEFT_POSITION || navbarPosition == Position.RIGHT_POSITION) { + AppStorage.Set("showNavHorizontal", false); + minHeight.set(parseInt(navShortSideLength)); + if (statusbarPosition == Position.TOP_POSITION || statusbarPosition == Position.BOTTOM_POSITION) { + realHeight = parseInt(maxHeight) - parseInt(statusShortSideLength); + } else { + realHeight = maxHeight; + } + realWidth = parseInt(navShortSideLength); + if (statusbarPosition == Position.TOP_POSITION) { + yCoordinate = parseInt(statusShortSideLength); + } else { + yCoordinate = 0; + } + if (navbarPosition == Position.RIGHT_POSITION) { + xCoordinate = parseInt(maxWidth) - parseInt(navShortSideLength); + } + } else { + realWidth = 0; + realHeight = 0; + } + Log.showInfo(TAG, `initWindowManager xCoordinate ${xCoordinate} yCoordinate ${yCoordinate}`); + Log.showInfo(TAG, `initWindowManager realWidth ${realWidth} realHeight ${realHeight}`); + var configuration = { + realWidth: realWidth, + realHeight: realHeight, + xCoordinate: xCoordinate, + yCoordinate: yCoordinate + } + return configuration; + } +} + +let navBarConfiguration = new NavBarConfiguration(); + +export default navBarConfiguration; \ No newline at end of file diff --git a/product/navigationBar/src/main/ets/default/pages/index.ets b/product/navigationBar/src/main/ets/default/pages/index.ets index 2a132448..907cc5b6 100644 --- a/product/navigationBar/src/main/ets/default/pages/index.ets +++ b/product/navigationBar/src/main/ets/default/pages/index.ets @@ -16,32 +16,31 @@ import Three from './threeLayout.ets' import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets'; -import Constants from '../common/constants.ets' const STORAGE_NAVIGATION_TYPE = 'navigationType' -let mConfigReader; let mHeightConfigUtils; const TAG = 'NavigationBar-Index'; + @Entry @Component struct Index { @StorageLink('navigationLayoutConfig') mConfig: any = {} - @StorageLink('NavMinH') NavMinH:number = 32 + @StorageLink('minNavHeight') minNavHeight: number = 32 + @StorageLink("showNavHorizontal") showNavHorizontal: boolean = true onBackPress(): boolean { + return true; } aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) - mHeightConfigUtils = new HeightConfigUtils(); - let NavMinH = AppStorage.SetAndLink("NavMinH", 32); let NavCoefficient = AppStorage.SetAndLink("NavCoefficient", 1.0); - NavMinH.set(mHeightConfigUtils.getNavMinH()); NavCoefficient.set(mHeightConfigUtils.getNavHCoefficient()); } - aboutToDisappear(){ + + aboutToDisappear() { Log.showInfo(TAG, `aboutToDisAppear`) } @@ -51,8 +50,8 @@ struct Index { } .width('100%') .height('100%') - .constraintSize({ minHeight: this.NavMinH }) + .constraintSize({ minHeight: this.minNavHeight }) .backgroundColor($r('app.color.index_background')) - .padding({ left: '18%', right: '18%' }) + .padding(this.showNavHorizontal ? { left: '18%', right: '18%' } : { top: '18%', bottom: '18%' }) } } diff --git a/product/navigationBar/src/main/ets/default/pages/keyButton.ets b/product/navigationBar/src/main/ets/default/pages/keyButton.ets index 8743e3f9..5b221f2b 100644 --- a/product/navigationBar/src/main/ets/default/pages/keyButton.ets +++ b/product/navigationBar/src/main/ets/default/pages/keyButton.ets @@ -27,6 +27,7 @@ export default struct keyButton { @Prop keyCode: number; @State backGroundColor: any = $r('app.color.button_default_background'); @StorageLink('NavCoefficient') NavCoefficient:number = 1.0 + @StorageLink("showNavHorizontal") showNavHorizontal: boolean = AppStorage.SetAndLink("showNavHorizontal", true).get(); aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) @@ -48,8 +49,8 @@ export default struct keyButton { .size({ width: Constants.IMAGE_WIDTH*this.NavCoefficient, height:Constants.IMAGE_HEIGHT*this.NavCoefficient }) } .onTouch(this.onKeyTouch.bind(this)) - .width(Constants.BUTTON_WIDTH*this.NavCoefficient) - .height('100%') + .width(this.showNavHorizontal ? Constants.BUTTON_WIDTH*this.NavCoefficient : '100%') + .height(this.showNavHorizontal ? '100%' : Constants.BUTTON_WIDTH*this.NavCoefficient ) } private onKeyTouch(event:TouchEvent) { diff --git a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets b/product/navigationBar/src/main/ets/default/pages/oneLayout.ets index 13b3ce26..4171fc27 100644 --- a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets +++ b/product/navigationBar/src/main/ets/default/pages/oneLayout.ets @@ -26,7 +26,7 @@ let KeyCodeArr: any[] = [ @Component export default struct oneLayout { - @StorageLink('NavMinH') NavMinH:number = 32 + @StorageLink('minNavHeight') minNavHeight:number = 32 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) @@ -46,7 +46,7 @@ export default struct oneLayout { }) } .height('100%') - .constraintSize({ minHeight: this.NavMinH }) + .constraintSize({ minHeight: this.minNavHeight }) .align(Alignment.Center) }) } diff --git a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets b/product/navigationBar/src/main/ets/default/pages/threeLayout.ets index b610509b..7b1fb122 100644 --- a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets +++ b/product/navigationBar/src/main/ets/default/pages/threeLayout.ets @@ -35,8 +35,8 @@ let KeyCodeArr: any[] = [ @Component export default struct threeLayout { - @StorageLink('NavMinH') NavMinH:number = 32 - + @StorageLink('minNavHeight') minNavHeight:number = 32 + @StorageLink("showNavHorizontal") showNavHorizontal: boolean = AppStorage.SetAndLink("showNavHorizontal", false).get(); aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) } @@ -46,18 +46,34 @@ struct threeLayout { } build() { - Grid() { - ForEach(KeyCodeArr, (item: any) => { - GridItem() { - keyButton({ uri: item.uri, keyCode: item.keyCode }) - } - .height('100%') - .constraintSize({ minHeight: this.NavMinH }) - .align(Alignment.Center) - }) + if (this.showNavHorizontal) { + Grid() { + ForEach(KeyCodeArr, (item: any) => { + GridItem() { + keyButton({ uri: item.uri, keyCode: item.keyCode }) + } + .height('100%') + .constraintSize({ minHeight: this.minNavHeight }) + .align(Alignment.Center) + }) + } + .columnsTemplate(Constants.THREE_TEMPLATE) + .height('100%') + .align(Alignment.Center); + } else { + Grid() { + ForEach(KeyCodeArr, (item: any) => { + GridItem() { + keyButton({ uri: item.uri, keyCode: item.keyCode }) + } + .width('100%') + .constraintSize({ minHeight: this.minNavHeight }) + .align(Alignment.Center) + }) + } + .rowsTemplate(Constants.THREE_TEMPLATE) + .width('100%') + .align(Alignment.Center); } - .columnsTemplate(Constants.THREE_TEMPLATE) - .height('100%') - .align(Alignment.Center); } } diff --git a/product/navigationBar/src/main/resources/base/element/string.json b/product/navigationBar/src/main/resources/base/element/string.json index e6c338cd..a13f1ef0 100644 --- a/product/navigationBar/src/main/resources/base/element/string.json +++ b/product/navigationBar/src/main/resources/base/element/string.json @@ -1,9 +1,41 @@ { "string": [ + { + "name": "nav_bar_size_portrait", + "value": "52" + }, + { + "name": "nav_bar_size_landscape", + "value": "52" + }, + { + "name": "nav_bar_position_portrait", + "value": "4" + }, + { + "name": "nav_bar_position_landscape", + "value": "4" + }, { "name": "app_name", "value": "NavigationBar" }, + { + "name": "status_bar_size_portrait", + "value": "52" + }, + { + "name": "status_bar_size_landscape", + "value": "52" + }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" diff --git a/product/navigationBar/src/main/resources/en_US/element/string.json b/product/navigationBar/src/main/resources/en_US/element/string.json index e6c338cd..e40546fa 100644 --- a/product/navigationBar/src/main/resources/en_US/element/string.json +++ b/product/navigationBar/src/main/resources/en_US/element/string.json @@ -1,9 +1,41 @@ { "string": [ + { + "name": "nav_bar_size_portrait", + "value": "52" + }, + { + "name": "nav_bar_size_landscape", + "value": "52" + }, + { + "name": "nav_bar_position_portrait", + "value": "1" + }, + { + "name": "nav_bar_position_landscape", + "value": "4" + }, { "name": "app_name", "value": "NavigationBar" }, + { + "name": "status_bar_size_portrait", + "value": "52" + }, + { + "name": "status_bar_size_landscape", + "value": "52" + }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" diff --git a/product/navigationBar/src/main/resources/zh_CN/element/string.json b/product/navigationBar/src/main/resources/zh_CN/element/string.json index bed7d9bb..e40546fa 100644 --- a/product/navigationBar/src/main/resources/zh_CN/element/string.json +++ b/product/navigationBar/src/main/resources/zh_CN/element/string.json @@ -1,8 +1,40 @@ { "string": [ + { + "name": "nav_bar_size_portrait", + "value": "52" + }, + { + "name": "nav_bar_size_landscape", + "value": "52" + }, + { + "name": "nav_bar_position_portrait", + "value": "1" + }, + { + "name": "nav_bar_position_landscape", + "value": "4" + }, { "name": "app_name", - "value": "navigationBar" + "value": "NavigationBar" + }, + { + "name": "status_bar_size_portrait", + "value": "52" + }, + { + "name": "status_bar_size_landscape", + "value": "52" + }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, + { + "name": "status_bar_position_landscape", + "value": "2" }, { "name": "mainability_description", diff --git a/product/notificationmanagement/src/main/config.json b/product/notificationmanagement/src/main/config.json index 6cd5a4d6..5e620ab2 100644 --- a/product/notificationmanagement/src/main/config.json +++ b/product/notificationmanagement/src/main/config.json @@ -50,6 +50,7 @@ "pages/setEnable" ] } - ] + ], + "srcPath": "default" } } \ No newline at end of file diff --git a/product/statusbar/src/main/config.json b/product/statusbar/src/main/config.json index 9a4acda9..664d6b59 100644 --- a/product/statusbar/src/main/config.json +++ b/product/statusbar/src/main/config.json @@ -44,6 +44,7 @@ }, "pages": ["pages/index"] } - ] + ], + "srcPath": "default" } } \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/app.ets b/product/statusbar/src/main/ets/default/app.ets index 10257c09..070c7f9a 100644 --- a/product/statusbar/src/main/ets/default/app.ets +++ b/product/statusbar/src/main/ets/default/app.ets @@ -12,12 +12,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import WindowManager from '../../../../../../common/src/main/ets/default/WindowManager.ets' +import StatusBarConfiguration from '../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets'; export default { - onCreate() { - console.info('SystemUI statusBar Application onCreate') - }, - onDestroy() { - console.info('SystemUI statusBar Application onDestroy') - }, + async onCreate() { + console.info('SystemUI statusBar Application onCreate') + let val = await StatusBarConfiguration.getConfiguration(); + let mWindowManager = new WindowManager(); + await mWindowManager.initWindowManager(); + await mWindowManager.initWindowMin(val.realWidth, val.realHeight, val.xCoordinate, val.yCoordinate) + + }, + onDestroy() { + console.info('SystemUI statusBar Application onDestroy') + }, } diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets index 86529c4a..4c0b8f5b 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -16,13 +16,14 @@ import Log from '../../../../../../../common/src/main/ets/default/Log.ets' import ReadConfigUtil from '../../../../../../../common/src/main/ets/default/ReadConfigUtil.ets' import Notification from './notification.ets' -import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' import ControlCenterComponent from './control.ets' import Constants from './common/constants.ets' import NavigationEvent from './common/navigationEvent.ets' import mBrightnessManager from '../../../../../../../features/brightnesscomponent/src/main/ets/default/brightnessManager.ets'; import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets'; import StatusBarComponent from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets'; +import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets'; +import Window from '@ohos.window'; const STATUS_BAR_COMPONENT_CONFIG_FILE_PATH = "/data/accounts/account_0/applications/com.ohos.systemui/" + "com.ohos.systemui.statusbar/assets/statusbar/resources/rawfile/statusbarcomponentConfig.json"; @@ -43,6 +44,8 @@ struct Index { @State moveX: number = 0 @State moveY: number = 0 @StorageLink("showStatusBar") showStatusBar: boolean = true + @StorageLink("showHorizontal") showHorizontal: boolean = true + @StorageLink("ableToMaximize") ableToMaximize: boolean = true @StorageLink('minHeight') minHeight: number = 0 @StorageLink('maxWidth') maxWidth: number = 0 @StorageLink('StatusMinH') StatusMinH: number = 24 @@ -56,8 +59,7 @@ struct Index { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, showStatusBar: ${this.showStatusBar}`); - + Log.showInfo(TAG, `aboutToAppear, start showStatusBar: ${this.showStatusBar}`); mHeightConfigUtils = new HeightConfigUtils(); let StatusMinH; let StatusCoefficient; @@ -85,17 +87,19 @@ struct Index { mWindowManager = new WindowManager(); mWindowManager.initWindowManager(); - this.mCallback = { "onStateChange": this.onStateChange.bind(this) } NavigationEvent.registerCallback(this.mCallback); + Log.showInfo(TAG, `aboutToAppear, end showStatusBar: ${this.showStatusBar}`); } onStateChange(data) { - this.showStatusBar = true; - mWindowManager.setWindowMin((result) => { - }) + if (this.ableToMaximize) { + this.showStatusBar = true; + mWindowManager.setWindowMin((result) => { + }) + } } aboutToDisappear() { @@ -115,7 +119,7 @@ struct Index { .height('100%') .backgroundColor($r("app.color.statusbar_background")) .onTouch(this.touchEvent.bind(this)) - } else { + } else if (this.showHorizontal && this.ableToMaximize) { if (vp2px(this.startX) <= parseInt((this.maxWidth / 2).toString())) { Notification({ showStatusBar: $showStatusBar, minHeight: this.minHeight }) } else { @@ -134,7 +138,9 @@ struct Index { touchEvent(event: TouchEvent) { Log.showInfo(TAG, 'touchEvent================' + event.touches) - Log.showInfo(TAG, 'touchEvent================ stringfy' + JSON.stringify(event.touches)) + if (!this.showHorizontal && !this.ableToMaximize) { + return; + } if (event.type == Constants.TOUCHTYPE_DOWN) { //down this.startX = event.touches[0].screenX this.startY = event.touches[0].screenY diff --git a/product/statusbar/src/main/resources/base/element/float.json b/product/statusbar/src/main/resources/base/element/float.json index 11ed5ed9..49f9e8db 100644 --- a/product/statusbar/src/main/resources/base/element/float.json +++ b/product/statusbar/src/main/resources/base/element/float.json @@ -1,4 +1,4 @@ -{ + { "float": [ { "name": "statusbar_height", diff --git a/product/statusbar/src/main/resources/base/element/string.json b/product/statusbar/src/main/resources/base/element/string.json index 0cf84e26..23f05f82 100644 --- a/product/statusbar/src/main/resources/base/element/string.json +++ b/product/statusbar/src/main/resources/base/element/string.json @@ -1,5 +1,21 @@ { "string": [ + { + "name": "status_bar_size_portrait", + "value": "52" + }, + { + "name": "status_bar_size_landscape", + "value": "52" + }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, { "name": "app_name", "value": "SystemUI" diff --git a/product/statusbar/src/main/resources/en_US/element/string.json b/product/statusbar/src/main/resources/en_US/element/string.json index 508e9bbe..22e3f6fe 100644 --- a/product/statusbar/src/main/resources/en_US/element/string.json +++ b/product/statusbar/src/main/resources/en_US/element/string.json @@ -1,5 +1,21 @@ { "string": [ + { + "name": "status_bar_size_portrait", + "value": "52" + }, + { + "name": "status_bar_size_landscape", + "value": "52" + }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, { "name": "app_name", "value": "SystemUI" diff --git a/product/statusbar/src/main/resources/zh_CN/element/string.json b/product/statusbar/src/main/resources/zh_CN/element/string.json index 0cf84e26..23f05f82 100644 --- a/product/statusbar/src/main/resources/zh_CN/element/string.json +++ b/product/statusbar/src/main/resources/zh_CN/element/string.json @@ -1,5 +1,21 @@ { "string": [ + { + "name": "status_bar_size_portrait", + "value": "52" + }, + { + "name": "status_bar_size_landscape", + "value": "52" + }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, { "name": "app_name", "value": "SystemUI" -- Gitee From 032785d9c96bcd1790e5b150c2e5b81d7a0800b6 Mon Sep 17 00:00:00 2001 From: supeng Date: Tue, 11 Jan 2022 13:07:43 +0000 Subject: [PATCH 043/373] update doc/Instructions.md. Signed-off-by: r00498791 --- doc/Instructions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Instructions.md b/doc/Instructions.md index 9ad3abb5..e89173bb 100644 --- a/doc/Instructions.md +++ b/doc/Instructions.md @@ -17,7 +17,7 @@ ``` ### 环境搭建 -打开DevEco Studio链接下载安装,安装步骤及安装说明详见下载地址([下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download)) +打开DevEco Studio链接下载安装,安装步骤及安装说明详见开发者网站 ## 基础开发说明 ### 系统接口调用 -- Gitee From 725461d38065c45071bbde482de98b0d9de239d1 Mon Sep 17 00:00:00 2001 From: supeng Date: Sun, 16 Jan 2022 23:13:00 +0800 Subject: [PATCH 044/373] update systemui code Signed-off-by: supeng --- build.gradle | 11 - .../main/ets/default/SwitchUserManager.ets | 101 ++++++++ .../default/abilitymanager/bundleManager.ets | 12 +- .../main/ets/template/SimpleToggleBase.ets | 131 ++++++++++ .../src/main/ets/template/UniformConfig.ets | 30 ++- .../src/main/ets/template/iconComponent.ets | 6 +- .../src/main/ets/template/iconTitleBase.ets | 9 +- doc/Instructions.md | 2 +- .../ets/default/pages/airplaneComponent.ets | 7 +- features/bluetoothcomponent/.gitignore | 1 + features/bluetoothcomponent/build.gradle | 19 ++ .../bluetoothcomponent/src/main/config.json | 23 ++ .../main/ets/com/ohos/common/Constants.ets | 22 ++ .../ets/com/ohos/model/BluetoothService.ets | 83 ++++++ ...lCenterComplexToggleBluetoothComponent.ets | 83 ++++++ .../StatusBarIconItemBluetoothComponent.ets | 48 ++++ .../ets/com/ohos/viewmodel/BluetoothVM.ets | 55 ++++ .../main/resources/base/element/string.json | 8 + .../base/media/ic_controlcenter_bt.svg | 11 + .../base/media/ic_controlcenter_bt_d.svg | 11 + .../resources/base/media/ic_status_bt.svg | 11 + .../base/media/ic_status_bt_close.svg | 11 + .../base/media/ic_status_bt_connecting.svg | 11 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + .../main/ets/default/brightnessManager.ets | 8 +- .../src/main/ets/default/timeModel.ets | 4 +- features/controlcentercomponent/.gitignore | 1 + features/controlcentercomponent/build.gradle | 5 + .../main/ets/com/ohos/common/Constants.ets | 18 +- .../com/ohos/pages/ComplexToggleComponent.ets | 35 ++- .../ohos/pages/ComplexToggleLoadComponent.ets | 53 ++++ .../com/ohos/pages/ControlCenterComponent.ets | 59 +++-- .../com/ohos/pages/SimpleToggleComponent.ets | 77 +++--- .../ohos/pages/SimpleToggleLoadComponent.ets | 62 +++++ .../com/ohos/viewmodel/ControlCenterVM.ets | 2 + features/locationcomponent/.gitignore | 1 + features/locationcomponent/build.gradle | 19 ++ .../locationcomponent/src/main/config.json | 23 ++ .../main/ets/com/ohos/common/Constants.ets | 22 ++ .../ets/com/ohos/model/LocationService.ets | 81 ++++++ ...rolCenterSimpleToggleLocationComponent.ets | 84 ++++++ .../StatusBarIconItemLocationComponent.ets | 48 ++++ .../ets/com/ohos/viewmodel/LocationVM.ets | 54 ++++ .../main/resources/base/element/string.json | 8 + .../base/media/ic_controlcenter_gps.svg | 17 ++ .../resources/base/media/ic_statusbar_gps.svg | 17 ++ .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + .../com/ohos/noticeItem/common/CommonUtil.ets | 4 + .../com/ohos/noticeItem/common/constants.ets | 3 +- .../noticeItem/model/NotificationService.ets | 92 +++---- .../ohos/noticeItem/model/ParseDataUtil.ets | 241 ++++++++--------- .../view/NotificationListComponent.ets | 2 +- .../ohos/noticeItem/viewmodel/ViewModel.ets | 51 ++-- features/ringmodecomponent/.gitignore | 1 + features/ringmodecomponent/build.gradle | 19 ++ .../ringmodecomponent/src/main/config.json | 23 ++ .../main/ets/com/ohos/common/Constants.ets | 30 +++ .../ets/com/ohos/model/RingModeService.ets | 81 ++++++ ...rolCenterSimpleToggleRingModeComponent.ets | 101 ++++++++ .../StatusBarIconItemRingModeComponent.ets | 52 ++++ .../ets/com/ohos/viewmodel/RingModeVM.ets | 56 ++++ .../main/resources/base/element/string.json | 16 ++ .../ic_controlcenter_ring_off_filled.svg | 7 + .../media/ic_controlcenter_ring_on_filled.svg | 9 + .../ic_controlcenter_vibration_filled.svg | 11 + .../media/ic_statusbar_ring_off_filled.svg | 7 + .../base/media/ic_statusbar_vibration_on.svg | 11 + .../main/resources/en_US/element/string.json | 16 ++ .../main/resources/zh_CN/element/string.json | 16 ++ features/statusbarcomponent/.gitignore | 1 + features/statusbarcomponent/build.gradle | 4 + .../main/ets/com/ohos/common/Constants.ets | 3 + .../ohos/common/StatusBarConfiguration.ets | 2 +- .../ets/com/ohos/pages/StatusBarComponent.ets | 15 ++ .../src/main/ets/default/VolumeModel.ets | 8 +- .../src/main/ets/default/common/constants.ets | 32 +-- .../main/ets/default/pages/wifiComponent.ets | 62 +++-- .../src/main/ets/default/pages/wifiIcon.ets | 1 - .../src/main/ets/default/wifiModel.ets | 243 ++++++++---------- .../main/resources/base/element/float.json | 14 - .../main/resources/base/element/string.json | 12 - .../default/common/NavBarConfiguration.ets | 4 +- .../src/main/ets/default/pages/index.ets | 2 +- .../src/main/ets/default/pages/oneLayout.ets | 2 +- .../main/ets/default/pages/threeLayout.ets | 4 +- .../main/resources/base/element/string.json | 8 +- .../main/resources/en_US/element/string.json | 8 +- .../main/resources/zh_CN/element/string.json | 8 +- product/statusbar/build.gradle | 3 + .../src/main/ets/default/pages/control.ets | 10 +- .../src/main/ets/default/pages/index.ets | 2 +- .../main/ets/default/pages/notification.ets | 8 +- .../main/resources/base/element/string.json | 4 +- .../main/resources/en_US/element/string.json | 4 +- .../rawfile/controlcentercomponentConfig.json | 9 +- .../rawfile/statusbarcomponentConfig.json | 8 +- .../main/resources/zh_CN/element/string.json | 4 +- settings.gradle | 3 +- 102 files changed, 2192 insertions(+), 581 deletions(-) create mode 100644 common/src/main/ets/default/SwitchUserManager.ets create mode 100644 common/src/main/ets/template/SimpleToggleBase.ets create mode 100644 features/bluetoothcomponent/.gitignore create mode 100644 features/bluetoothcomponent/build.gradle create mode 100644 features/bluetoothcomponent/src/main/config.json create mode 100644 features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ets create mode 100644 features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ets create mode 100644 features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets create mode 100644 features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets create mode 100644 features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ets create mode 100644 features/bluetoothcomponent/src/main/resources/base/element/string.json create mode 100644 features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg create mode 100644 features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg create mode 100644 features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg create mode 100644 features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg create mode 100644 features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg create mode 100644 features/bluetoothcomponent/src/main/resources/base/media/icon.png create mode 100644 features/bluetoothcomponent/src/main/resources/en_US/element/string.json create mode 100644 features/bluetoothcomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/controlcentercomponent/.gitignore create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets create mode 100644 features/locationcomponent/.gitignore create mode 100644 features/locationcomponent/build.gradle create mode 100644 features/locationcomponent/src/main/config.json create mode 100644 features/locationcomponent/src/main/ets/com/ohos/common/Constants.ets create mode 100644 features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ets create mode 100644 features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets create mode 100644 features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets create mode 100644 features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ets create mode 100644 features/locationcomponent/src/main/resources/base/element/string.json create mode 100644 features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg create mode 100644 features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg create mode 100644 features/locationcomponent/src/main/resources/base/media/icon.png create mode 100644 features/locationcomponent/src/main/resources/en_US/element/string.json create mode 100644 features/locationcomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/ringmodecomponent/.gitignore create mode 100644 features/ringmodecomponent/build.gradle create mode 100644 features/ringmodecomponent/src/main/config.json create mode 100644 features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ets create mode 100644 features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ets create mode 100644 features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets create mode 100644 features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets create mode 100644 features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ets create mode 100644 features/ringmodecomponent/src/main/resources/base/element/string.json create mode 100644 features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg create mode 100644 features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg create mode 100644 features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg create mode 100644 features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg create mode 100644 features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg create mode 100644 features/ringmodecomponent/src/main/resources/en_US/element/string.json create mode 100644 features/ringmodecomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/statusbarcomponent/.gitignore delete mode 100644 features/wificomponent/src/main/resources/base/element/float.json delete mode 100644 features/wificomponent/src/main/resources/base/element/string.json diff --git a/build.gradle b/build.gradle index 1849e365..10ed3f06 100755 --- a/build.gradle +++ b/build.gradle @@ -3,17 +3,6 @@ apply plugin: 'com.huawei.ohos.app' apply from: "./infra/config_exts.gradle" ohos { - signingConfigs { - release { - storeFile file('D:\\xu\\OpenHarmony.p12') - storePassword '00000016F2017A40C8B50DAD39A176E1D19A0BE947D48AC71C90F0DEB0CD251285923218A84F' - keyAlias = 'OpenHarmony Application Release' - keyPassword '00000016E8775BE9B2A7B5239556EDAE1A9000261023E5C8202C19A43936B6989FA617A094F7' - signAlg = 'SHA256withECDSA' - profile file('D:\\xu\\systemui.p7b') - certpath file('D:\\xu\\OpenHarmonyApplication.cer') - } - } compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { compatibleSdkVersion rootProject.ext.version.compatibleSdk diff --git a/common/src/main/ets/default/SwitchUserManager.ets b/common/src/main/ets/default/SwitchUserManager.ets new file mode 100644 index 00000000..d78cb2f1 --- /dev/null +++ b/common/src/main/ets/default/SwitchUserManager.ets @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2021 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 AccountManager from '@ohos.account.osAccount'; +import Log from './Log.ets'; + +const STORAGE_KEY = 'SwitchUserManager_AppStorage' +const TAG = 'SwitchUserManager' +const SUBSCRIBE_KEY = 'SystemUiAccount' +const USER_CHANGE_EVENT = 'activate' +const INVALID_USER_ID = -1; + +interface UserChangeListener { + userChange: Function +} + +export class UserInfo { + userId: number = INVALID_USER_ID; + userName: string = ''; + userIcon: string | Resource = ''; + [key: string]: any ; +} + +async function getCurrentAccountInfo() { + let currentAccountInfo = {}; + let accountInfos = await AccountManager.getAccountManager().queryAllCreatedOsAccounts(); + for (let accountInfo of accountInfos) { + Log.showInfo(TAG, `accountInfo: ${accountInfo.localId}, isActive: ${accountInfo.isActived}`); + if (accountInfo.isActived) { + return accountInfo; + } + } + return new UserInfo(); +} + +function parseAccountInfo(accountInfo): UserInfo { + return { + userId: accountInfo.localId, + userName: accountInfo.localName, + userIcon: accountInfo.photo + } +} + +export default class SwitchUserManager { + mUserInfo: UserInfo = new UserInfo(); + mListeners = new Set(); + + static getInstance(): SwitchUserManager { + if (!AppStorage.Has(STORAGE_KEY)) { + let mamanger = new SwitchUserManager(); + AppStorage.SetOrCreate(STORAGE_KEY, mamanger); + } + return AppStorage.Get(STORAGE_KEY); + } + + constructor() { + Log.showInfo(TAG, `SwitchUserManager constructor`); + AccountManager.getAccountManager().on(USER_CHANGE_EVENT, SUBSCRIBE_KEY, this.handleUserChange.bind(this)); + } + + public async getCurrentUserInfo(): Promise { + if (this.mUserInfo.userId == INVALID_USER_ID) { + let accountInfo = await getCurrentAccountInfo(); + this.mUserInfo = parseAccountInfo(accountInfo); + } + return this.mUserInfo; + } + + public registerListener(listener: UserChangeListener) { + this.mListeners.add(listener) + } + + public unregisterListener(listener: UserChangeListener) { + this.mListeners.delete(listener) + } + + handleUserChange(accountId) { + AccountManager.getAccountManager().queryOsAccountById(accountId).then((accountInfo) => { + Log.showInfo(TAG, `userChange, accountInfo: ${JSON.stringify(accountInfo)}`); + this.mUserInfo = parseAccountInfo(accountInfo) + this.notifyUserChange(); + }) + } + + notifyUserChange() { + this.mListeners.forEach((listener) => listener.userChange(this.mUserInfo)) + } +} \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ets b/common/src/main/ets/default/abilitymanager/bundleManager.ets index 2734db72..ddb020b6 100644 --- a/common/src/main/ets/default/abilitymanager/bundleManager.ets +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ets @@ -20,15 +20,19 @@ import Log from '../Log.ets'; const TAG = 'BRManager'; export default class BundleManager { - - static getResourceManager(tag, bundleName, then) { + static async getResourceManager(tag, bundleName, then?: Function) { Log.showInfo(TAG, `getResourceManager from: ${tag}`); + if (!then) { + return await Resmgr.getResourceManager(bundleName); + } Resmgr.getResourceManager(bundleName).then(then); } - static getBundleInfo(tag, bundleName, getInfo, then) { + static async getBundleInfo(tag, bundleName, getInfo, then?: Function) { Log.showInfo(TAG, `getBundleInfo from: ${tag}`); + if (!then) { + return await BundleMgr.getBundleInfo(bundleName, getInfo); + } BundleMgr.getBundleInfo(bundleName, getInfo).then(then); } - } \ No newline at end of file diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/template/SimpleToggleBase.ets new file mode 100644 index 00000000..73092462 --- /dev/null +++ b/common/src/main/ets/template/SimpleToggleBase.ets @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2021 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 Log from '../default/Log.ets' +import UniformConfig from './UniformConfig.ets' + +const TAG = 'SimpleToggleBase.ets' + +@Component +export default struct SimpleToggleBase { + private mConfig = UniformConfig.config + @Prop mToggleId: string + @Link @Watch('onIconUpdated') mIcon: string | Resource + @State @Watch('onIconStrUpdated') mIconStr: string = '' + private mUseIconStr: boolean = false + private mAutoIconColor: boolean = false + @Link @Watch('onChangeSwitchUpdated') mChangeSwitch: boolean + @Link mLabel: string | Resource + @State mLabelStr: string = '' + private mUseLabelStr: boolean = false + @Prop mShowLabel: boolean + @Prop mEditMode: boolean + private mClickEvent: Function + private mLongClickEvent: Function + private appStorageIconKey: string + private appStorageChangeSwitchKey: string + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear, mToggleId: ${this.mToggleId}`) + Log.showInfo(TAG, `aboutToAppear, mLabel: ${JSON.stringify(this.mLabel)}`) + if (this.mEditMode) { + this.appStorageIconKey = "TOGGLE_ICON_" + this.mToggleId + this.appStorageChangeSwitchKey = "TOGGLE_CHANGE_SWITCH_" + this.mToggleId + if (this.mUseIconStr) { + AppStorage.SetOrCreate(this.appStorageIconKey, this.mIconStr) + } else { + AppStorage.SetOrCreate(this.appStorageIconKey, this.mIcon) + } + AppStorage.SetOrCreate(this.appStorageChangeSwitchKey, this.mChangeSwitch) + } + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') + } + + onIconUpdated(propName: string): void { + Log.showInfo(TAG, `onIconUpdated, propName: ${propName} mIcon: ${JSON.stringify(this.mIcon)}`) + if (this.mEditMode) { + AppStorage.SetOrCreate(this.appStorageIconKey, this.mIcon) + } + } + + onIconStrUpdated(propName: string): void { + Log.showInfo(TAG, `onIconStrUpdated, propName: ${propName} mIconStr: ${this.mIconStr}`) + if (this.mEditMode) { + AppStorage.SetOrCreate(this.appStorageIconKey, this.mIconStr) + } + } + + onChangeSwitchUpdated(propName: string): void { + Log.showInfo(TAG, `onIconUpdated, propName: ${propName} mChangeSwitch: ${this.mChangeSwitch}`) + if (this.mEditMode) { + AppStorage.SetOrCreate(this.appStorageChangeSwitchKey, this.mChangeSwitch) + } + } + + build() { + Column() { + Stack() { + Flex() + .backgroundColor(this.mChangeSwitch == false ? this.mConfig.iconOffBG : this.mConfig.iconOnBG) + .clip(new Circle({ width: this.mConfig.circleWidth, height: this.mConfig.circleHeight })) + .width(this.mConfig.circleWidth) + .height(this.mConfig.circleHeight) + if (this.mAutoIconColor) { + Image(this.mUseIconStr ? this.mIconStr : this.mIcon) + .size({ width: this.mConfig.iconWidth, height: this.mConfig.iconHeight }) + .objectFit(ImageFit.Contain) + .fillColor(this.mChangeSwitch ? this.mConfig.iconOnColor : this.mConfig.iconOffColor) + } else { + Image(this.mUseIconStr ? this.mIconStr : this.mIcon) + .size({ width: this.mConfig.iconWidth, height: this.mConfig.iconHeight }) + .objectFit(ImageFit.Contain) + } + } + .width(this.mConfig.circleWidth) + .height(this.mConfig.circleHeight) + + if (this.mShowLabel) { + Column() + .width(this.mConfig.circleWidth) + .height(10) + + Text(this.mUseLabelStr ? this.mLabelStr : this.mLabel) + .fontSize(this.mConfig.simpleToggleTitleSize) + } + } + .onClick(this.onIconItemClick.bind(this)) + .gesture(LongPressGesture({ repeat: false }).onAction(this.onIconItemLongPressGesture.bind(this))) + } + + onIconItemClick(event: ClickEvent) { + Log.showInfo(TAG, `onIconItemClick`) + if (this.mClickEvent) { + this.mClickEvent() + } + } + + onIconItemLongPressGesture(event: GestureEvent) { + if (this.mEditMode) { + return + } + Log.showInfo(TAG, `onIconItemLongPressGesture, event: ${JSON.stringify(event)}`) + if (this.mLongClickEvent) { + this.mLongClickEvent() + } + } +} diff --git a/common/src/main/ets/template/UniformConfig.ets b/common/src/main/ets/template/UniformConfig.ets index 948acf50..cadfa00c 100644 --- a/common/src/main/ets/template/UniformConfig.ets +++ b/common/src/main/ets/template/UniformConfig.ets @@ -18,13 +18,16 @@ export default class UniformConfig { static config = { iconOnBG: "#0A59F7", iconOffBG: "#F5F5F5", + iconOnColor: "#FFFFFF", + iconOffColor: "#404345", baseColor: "#CCFFFFFF", - circleWidth: 80, - circleHeight: 80, - iconWidth: 50, - iconHeight: 50, - titleSize: 20, - baseBorderRadius: 15 + circleWidth: '80px', + circleHeight: '80px', + iconWidth: '50px', + iconHeight: '50px', + titleSize: '20px', + baseBorderRadius: 15, + simpleToggleTitleSize: '18px' } static initParams(params?) { @@ -32,13 +35,16 @@ export default class UniformConfig { UniformConfig.config = params || { iconOnBG: "#0A59F7", iconOffBG: "#F5F5F5", + iconOnColor: "#FFFFFF", + iconOffColor: "#404345", baseColor: "#CCFFFFFF", - circleWidth: 80, - circleHeight: 80, - iconWidth: 50, - iconHeight: 50, - titleSize: 20, - baseBorderRadius: 15 + circleWidth: '80px', + circleHeight: '80px', + iconWidth: '50px', + iconHeight: '50px', + titleSize: '20px', + baseBorderRadius: 15, + simpleToggleTitleSize: '18px' } console.log('----initParams(params)----finish'); } diff --git a/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/template/iconComponent.ets index afb9b6bf..a190fa43 100644 --- a/common/src/main/ets/template/iconComponent.ets +++ b/common/src/main/ets/template/iconComponent.ets @@ -46,10 +46,10 @@ struct iconComponent { Flex() .backgroundColor(this.changeSwitch == false? this.mConfig.iconOffBG : this.mConfig.iconOnBG) .clip(Circle({ width: this.mConfig.circleWidth, height: this.mConfig.circleHeight })) - .width(this.mConfig.circleWidth) - .height(this.mConfig.circleHeight) + .width(this.mConfig.circleWidth ) + .height(this.mConfig.circleHeight ) Image(this.changeSwitch == false? (this.useIconStr ? this.iconOffStr : this.iconOff): (this.useIconStr ? this.iconOnStr : this.iconOn)) - .size({ width: this.mConfig.iconWidth, height: this.mConfig.iconHeight }) + .size({ width: this.mConfig.iconWidth, height: this.mConfig.iconHeight}) .objectFit(ImageFit.Contain) }.margin({ left: 10 }) } diff --git a/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/template/iconTitleBase.ets index 13fecedf..77e79173 100644 --- a/common/src/main/ets/template/iconTitleBase.ets +++ b/common/src/main/ets/template/iconTitleBase.ets @@ -27,8 +27,10 @@ struct iconBaseComponent { private iconOff: any @State iconOffStr: string = "" @State iconOnStr: string = "" - @State mTitle: string = "None" + @Link mTitle: string | Resource + @State mTitleStr: string = "" private useIconStr = false + private useTitleStr = false private mConfig = UniformConfig.config; private mClickEvent: Function private mLongClickEvent: Function @@ -71,10 +73,11 @@ struct iconBaseComponent { console.log(`end longClickEvent ${this.changeSwitch}`) })) Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Center }) { - Text(this.mTitle) + Text(this.useTitleStr ? this.mTitleStr : this.mTitle) .fontSize(this.mConfig.titleSize) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .margin({ left: 10 }) + .maxLines(2) + .margin({ left: 10, right: 10 }) } .height('100%') } diff --git a/doc/Instructions.md b/doc/Instructions.md index e89173bb..a5a15616 100644 --- a/doc/Instructions.md +++ b/doc/Instructions.md @@ -17,7 +17,7 @@ ``` ### 环境搭建 -打开DevEco Studio链接下载安装,安装步骤及安装说明详见开发者网站 +打开DevEco Studio链接下载安装,安装步骤及安装说明详见开发者网站 ## 基础开发说明 ### 系统接口调用 diff --git a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets index 4d77c9bd..2215e5b2 100644 --- a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets +++ b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets @@ -26,7 +26,7 @@ struct airplaneComponent { $r('app.media.airplane_d'), $r('app.media.airplane'), ] - private flyModelTitle: any = $r("app.string.airplane_mode") + @State flyModelTitle: any = $r("app.string.airplane_mode") @StorageLink('flyModelStatus') flyModelStatus: boolean = false private mWifiOriginalStatus: boolean = false @@ -68,10 +68,11 @@ struct airplaneComponent { iconTitleBase({ iconOff: this.IconInfo[0], iconOn: this.IconInfo[1], - mTitle: this.flyModelTitle, + mTitle: $flyModelTitle, changeSwitch: $flyModelStatus, mClickEvent: this.mClickEvent.bind(this) }) - } + }.width('100%') + .height('100%') } } \ No newline at end of file diff --git a/features/bluetoothcomponent/.gitignore b/features/bluetoothcomponent/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/bluetoothcomponent/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/bluetoothcomponent/build.gradle b/features/bluetoothcomponent/build.gradle new file mode 100644 index 00000000..ae402d92 --- /dev/null +++ b/features/bluetoothcomponent/build.gradle @@ -0,0 +1,19 @@ +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/config.json b/features/bluetoothcomponent/src/main/config.json new file mode 100644 index 00000000..9a917c8c --- /dev/null +++ b/features/bluetoothcomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.bluetoothcomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "bluetoothcomponent", + "moduleType": "har" + }, + "srcPath": "default" + } +} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ets new file mode 100644 index 00000000..fb97f9a5 --- /dev/null +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ets @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 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 default class Constants { + static STATIC_BAR_ICON_WIDTH = 24; + static STATIC_BAR_ICON_MARGIN = 2; + static STATIC_BAR_ICON_HEIGHT = 24; + static STATIC_BAR_ICON_INSIDE_SPACE = 2; + static STATIC_BAR_ICON_OUTSIDE_MARGIN = 5; +} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ets new file mode 100644 index 00000000..d9bf542b --- /dev/null +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ets @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2021 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 bluetooth from '@ohos.bluetooth'; +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'BluetoothModel'; + +function isBluetoothOpen(state) { + Log.showInfo(TAG, `state change: ${state}`) + return state == bluetooth.BluetoothState.STATE_ON || state == bluetooth.BluetoothState.STATE_BLE_ON; +} + +export class BluetoothService { + mIsStart: boolean = false; + mListener: any; + mIsBluetoothOpen: boolean = false; + + startService() { + if (this.mIsStart) { + return; + } + this.mIsStart = true; + this.mIsBluetoothOpen = isBluetoothOpen(bluetooth.getState()); + bluetooth.on('stateChange', (state) => { + this.mIsBluetoothOpen = isBluetoothOpen(state); + Log.showInfo(TAG, `state change: ${this.mIsBluetoothOpen}`) + // todo !bluetooth bug, this.mListener?.updateState(this.mIsBluetoothOpen); + }); + Log.showInfo(TAG, `startService, mIsBluetoothOpen: ${this.mIsBluetoothOpen}`) + } + + stopService() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `stopService`) + this.mIsStart = false; + bluetooth.off('stateChange'); + } + + registerListener(listener: { + 'updateState': Function + }) { + Log.showInfo(TAG, `registerListener, listener: ${listener}`) + this.mListener = listener; + this.mListener.updateState(this.mIsBluetoothOpen) + } + + getState(): boolean { + return this.mIsBluetoothOpen; + } + + enableBluetooth(): boolean{ + Log.showInfo(TAG, `enableBluetooth`) + let result = bluetooth.enableBluetooth(); + Log.showInfo(TAG, `enableBluetooth, result: ${result}`) + return result; + } + + disableBluetooth(): boolean{ + Log.showInfo(TAG, `disableBluetooth`) + let result = bluetooth.disableBluetooth(); + Log.showInfo(TAG, `disableBluetooth, result: ${result}`) + return result; + } +} + +let bluetoothService = new BluetoothService(); + +export default bluetoothService as BluetoothService; \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets new file mode 100644 index 00000000..90834ed0 --- /dev/null +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' +import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import ViewModel from '../viewmodel/BluetoothVM.ets' +import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase.ets' + +const TAG = 'bluetooth-ControlCenterComplexToggleBluetoothComponent' + +@Component +export default struct ControlCenterComplexToggleBluetoothComponent { + private IconInfo: any[] = [ + $r("app.media.ic_controlcenter_bt_d"), + $r("app.media.ic_controlcenter_bt"), + ] + @State mTitle: Resource = $r("app.string.control_center_complex_toggle_bluetooth_title") + @StorageLink('BluetoothOpenStatus') BluetoothOpenStatus: boolean = false + @StorageLink("showStatusBar") showStatusBar: boolean = false + private mWindowManager + private mFeatureAbilityManager + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear') + this.mWindowManager = new WindowManager() + this.mFeatureAbilityManager = new FeatureAbilityManager() + ViewModel.initViewModel() + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') + } + + build() { + Column() { + iconTitleBase({ + iconOff: this.IconInfo[0], + iconOn: this.IconInfo[1], + mTitle: $mTitle, + changeSwitch: $BluetoothOpenStatus, + mClickEvent: this.mClickEvent.bind(this), + mLongClickEvent: this.mLongClickEvent.bind(this) + }) + }.width('100%') + .height('100%') + } + + mClickEvent() { + Log.showInfo(TAG, `mClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`) + if (this.BluetoothOpenStatus) { + ViewModel.disableBluetooth() + } else { + ViewModel.enableBluetooth() + } + } + + mLongClickEvent() { + Log.showInfo(TAG, `mLongClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`) + + this.showStatusBar = true + this.mWindowManager.setWindowMin((result) => { + this.mFeatureAbilityManager.openAbility(TAG, { + want: { + bundleName: 'com.ohos.settings', + abilityName: 'com.ohos.settings.MainAbility', + } + }) + }) + } +} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets new file mode 100644 index 00000000..0b4a5842 --- /dev/null +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/Constants.ets' +import ViewModel from '../viewmodel/BluetoothVM.ets' + +const TAG = 'bluetooth-StatusBarIconItemBluetoothComponent' + +@Component +export default struct StatusBarIconItemBluetoothComponent { + @StorageLink('BluetoothOpenStatus') BluetoothOpenStatus: boolean = false + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear') + ViewModel.initViewModel() + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') + } + + build() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + if (this.BluetoothOpenStatus) { + Image($r("app.media.ic_status_bt")) + .objectFit(ImageFit.Contain) + .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) + .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) + } + } + .width(this.BluetoothOpenStatus ? Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient : 0) + .height(this.BluetoothOpenStatus ? Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient : 0) + } +} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ets new file mode 100644 index 00000000..165efcd2 --- /dev/null +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ets @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021 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 bluetooth from '@ohos.bluetooth'; +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import BluetoothService from '../model/BluetoothService.ets'; + +export const BluetoothOpenStatusKey = "BluetoothOpenStatus"; + +const TAG = 'BluetoothVM'; + +export class BluetoothVM { + mIsStart: boolean = false; + mBluetoothOpenStatus: any; + + initViewModel() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initViewModel `) + this.mIsStart = true; + this.mBluetoothOpenStatus = AppStorage.SetAndLink(BluetoothOpenStatusKey, false); + BluetoothService.startService(); + BluetoothService.registerListener(this); + } + + updateState(state: boolean) { + Log.showInfo(TAG, `updateState, state: ${state} this.mBluetoothOpenStatus ${this.mBluetoothOpenStatus}`) + this.mBluetoothOpenStatus.set(state); + } + + enableBluetooth(): boolean{ + return BluetoothService.enableBluetooth(); + } + + disableBluetooth(): boolean{ + return BluetoothService.disableBluetooth(); + } +} + +let bluetoothVM = new BluetoothVM(); + +export default bluetoothVM as BluetoothVM; \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/resources/base/element/string.json b/features/bluetoothcomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..c7e36887 --- /dev/null +++ b/features/bluetoothcomponent/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "control_center_complex_toggle_bluetooth_title", + "value": "蓝牙" + } + ] +} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg b/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg new file mode 100644 index 00000000..7ce28a5e --- /dev/null +++ b/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg @@ -0,0 +1,11 @@ + + + ic_status_bt + + + + + + + + \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg b/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg new file mode 100644 index 00000000..9259e3e7 --- /dev/null +++ b/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg @@ -0,0 +1,11 @@ + + + ic_status_bt + + + + + + + + \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg b/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg new file mode 100644 index 00000000..40b13986 --- /dev/null +++ b/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg @@ -0,0 +1,11 @@ + + + ic_status_bt + + + + + + + + \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg b/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg new file mode 100644 index 00000000..bc153a8c --- /dev/null +++ b/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg @@ -0,0 +1,11 @@ + + + ic_status_bt_close + + + + + + + + \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg b/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg new file mode 100644 index 00000000..b69946ab --- /dev/null +++ b/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg @@ -0,0 +1,11 @@ + + + ic_status_bt_connecting + + + + + + + + \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/resources/base/media/icon.png b/features/bluetoothcomponent/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { - let data = settings.getValue(this.helper, SYSTEMUI_BRIGHTNESS, '150') + let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '150') Log.showInfo(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); }) @@ -50,7 +50,7 @@ export class brightnessManager { getValue() { Log.showInfo(TAG, 'getValue'); - let data = settings.getValue(this.helper, SYSTEMUI_BRIGHTNESS, '150'); + let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '150'); Log.showInfo(TAG, `settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); } @@ -61,7 +61,7 @@ export class brightnessManager { Log.showInfo(TAG, `setValue ${value}`); mBrightnessValue.set(value); Log.showInfo(TAG, `brightness setValue ${value} end`); - settings.setValue(this.helper, SYSTEMUI_BRIGHTNESS, callback.value.toString()); + settings.setValueSync(this.helper, SYSTEMUI_BRIGHTNESS, callback.value.toString()); Log.showInfo(TAG, `settings setValue ${callback.value} end`); } } diff --git a/features/clockcomponent/src/main/ets/default/timeModel.ets b/features/clockcomponent/src/main/ets/default/timeModel.ets index 988ed82a..1ef19786 100644 --- a/features/clockcomponent/src/main/ets/default/timeModel.ets +++ b/features/clockcomponent/src/main/ets/default/timeModel.ets @@ -51,7 +51,7 @@ export class TimeModel { let urivar = null; let helper = null; try { - urivar = settings.getUri('settings.time.format') + urivar = settings.getUriSync('settings.time.format') helper = featureAbility.acquireDataAbilityHelper(urivar); } catch (e) { Log.showInfo(TAG, `settings getValue error: ${e.toString()}`); @@ -62,7 +62,7 @@ export class TimeModel { Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); return; } else { - let getRetValue = settings.getValue(helper, 'settings.time.format', '24') + let getRetValue = settings.getValueSync(helper, 'settings.time.format', '24') Log.showInfo(TAG, 'observer reveive notifychange on success format = ' + getRetValue) if (getRetValue === '12') { misUsing24hFormat = false; diff --git a/features/controlcentercomponent/.gitignore b/features/controlcentercomponent/.gitignore new file mode 100644 index 00000000..378eac25 --- /dev/null +++ b/features/controlcentercomponent/.gitignore @@ -0,0 +1 @@ +build diff --git a/features/controlcentercomponent/build.gradle b/features/controlcentercomponent/build.gradle index ae402d92..05923dbe 100644 --- a/features/controlcentercomponent/build.gradle +++ b/features/controlcentercomponent/build.gradle @@ -16,4 +16,9 @@ ohos { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + implementation project(':features:wificomponent') + implementation project(':features:bluetoothcomponent') + implementation project(':features:airplanecomponent') + implementation project(':features:locationcomponent') + implementation project(':features:ringmodecomponent') } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ets b/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ets index dc9fbb29..96602f76 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ets @@ -15,12 +15,16 @@ export default class Constants { static WIFI = 'wifi'; + static BLUETOOTH = 'bluetooth'; static AIR_PLANE = 'air_plane'; - static COMPLEX_TOGGLE_HEIGHT = 120; - static COMPLEX_TOGGLE_UP_DOWN_SPACE = 20; - static SIMPLE_TOGGLE_HEIGHT = 105; - static SIMPLE_TOGGLE_UP_DOWN_SPACE = 20; - static SIMPLE_TOGGLE_ICON_WIDTH = 50; - static SIMPLE_TOGGLE_ICON_HEIGHT = 50; - static SIMPLE_TOGGLE_INSIDE_SPACE = 10; + static LOCATION = 'location'; + static RING_MODE = 'ring_mode'; + static COMPLEX_TOGGLE_HEIGHT = px2vp(100); + static COMPLEX_TOGGLE_UP_DOWN_SPACE = px2vp(20); + static SIMPLE_TOGGLE_HEIGHT = px2vp(110); + static SIMPLE_TOGGLE_UP_DOWN_SPACE = px2vp(20); + static SIMPLE_TOGGLE_UP_TOP_SPACE = px2vp(40); + static SIMPLE_TOGGLE_ICON_WIDTH = px2vp(50); + static SIMPLE_TOGGLE_ICON_HEIGHT = px2vp(50); + static SIMPLE_TOGGLE_INSIDE_SPACE = px2vp(10); } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets index e8de9537..1e9fa1ce 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; +import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets' import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase.ets' @@ -27,28 +27,36 @@ export default struct ComplexToggleComponent { @Prop keyId: string @State mItemData: any = {} @State mStatus: boolean = false - @Link showStatusBar: boolean + @StorageLink("showStatusBar") showStatusBar: boolean = false private mWindowManager private mFeatureAbilityManager + @State mDefaultTitle: string = '' aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) - this.mItemData = AppStorage.Link(this.keyId) - Log.showInfo(TAG, `aboutToAppear, mItemData: ${this.mItemData.get().iconUrl} ${this.mItemData.get().label}`) - this.mWindowManager = new WindowManager(); - this.mFeatureAbilityManager = new FeatureAbilityManager(); + this.mWindowManager = new WindowManager() + this.mFeatureAbilityManager = new FeatureAbilityManager() + this.linkItemData() } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) - let deleteRs: boolean = AppStorage.Delete(this.keyId) - Log.showInfo(TAG, `aboutToDisappear AppStorage.Delete, ${deleteRs} key: ${this.keyId}`) + } + + linkItemData() { + Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`) + this.mItemData = AppStorage.Link(this.keyId) + Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ + this.mItemData.get() + .iconUrl}`) } build() { Column() { iconTitleBase({ - mTitle: this.mItemData.get() + useTitleStr: true, + mTitle: $mDefaultTitle, + mTitleStr: this.mItemData.get() .label, useIconStr: true, iconOffStr: this.mItemData.get() @@ -59,7 +67,8 @@ export default struct ComplexToggleComponent { mClickEvent: this.onIconItemClick.bind(this), mLongClickEvent: this.onIconItemLongPressGesture.bind(this) }) - } + }.width('100%') + .height('100%') } onIconItemClick() { @@ -93,11 +102,11 @@ export default struct ComplexToggleComponent { } Log.showInfo(TAG, `startAbility, want: ${JSON.stringify(wantParam)}`) - this.showStatusBar = true; + this.showStatusBar = true this.mWindowManager.setWindowMin((result) => { this.mFeatureAbilityManager.openAbility(TAG, { want: wantParam - }); - }); + }) + }) } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets new file mode 100644 index 00000000..95ebc834 --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import AirPlaneComponent from "../../../../../../../airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets" +import WifiComponent from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiComponent.ets' +import BluetoothComponent from '../../../../../../../bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets' +import Constants from '../common/Constants.ets' +import ComplexToggleComponent from './ComplexToggleComponent.ets' + +const TAG = 'ComplexToggleLoadComponent' + +@Component +export default struct ComplexToggleLoadComponent { + @Prop keyId: string + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Column() { + if (this.keyId == Constants.WIFI) { + WifiComponent() + } else if (this.keyId == Constants.BLUETOOTH) { + BluetoothComponent() + } else if (this.keyId == Constants.AIR_PLANE) { + AirPlaneComponent() + } else { + ComplexToggleComponent({ + keyId: this.keyId + }) + } + }.width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index d5ce1bfc..74ebb44a 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -14,20 +14,18 @@ */ import {UpTitle} from './UpTitle.ets' -import AirPlaneComponent from "../../../../../../../airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets" -import WifiComponent from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiComponent.ets' import {MyBrightness} from '../../../../../../../brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets' import {MyVol} from '../../../../../../../volumecomponent/src/main/ets/default/pages/volumeComponent.ets' import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' import UniformConfig from '../../../../../../../../common/src/main/ets/template/UniformConfig.ets' import Constants from '../common/Constants.ets' import ViewModel from '../viewmodel/ControlCenterVM.ets' -import ComplexToggleComponent from './ComplexToggleComponent.ets' -import SimpleToggleComponent from './SimpleToggleComponent.ets' +import ComplexToggleLoadComponent from './ComplexToggleLoadComponent.ets' +import SimpleToggleLoadComponent from './SimpleToggleLoadComponent.ets' const TAG = 'Control-ControlCenter' const TAG_ControlCenterComplexToggleLayout = 'Control-ControlCenterComplexToggleLayout' -const TAG_ControlCenterSimpleToggleLayout = 'Control-TAG_ControlCenterSimpleToggleLayout' +const TAG_ControlCenterSimpleToggleLayout = 'Control-ControlCenterSimpleToggleLayout' var mUniform; @@ -38,14 +36,17 @@ export default struct ControlCenterComponent { componentUniform = { iconOnBG: "#0A59F7", iconOffBG: "#F5F5F5", + iconOnColor: "#FFFFFF", + iconOffColor: "#404345", baseColor: "#CCFFFFFF", - circleWidth: 80, - circleHeight: 80, - iconWidth: 50, - iconHeight: 50, - titleSize: 20, + circleWidth: '80px', + circleHeight: '80px', + iconWidth: '50px', + iconHeight: '50px', + titleSize: '20px', iconTitleMargin: 10, baseBorderRadius: 15, + simpleToggleTitleSize: '18px' } aboutToAppear() { @@ -74,8 +75,8 @@ export default struct ControlCenterComponent { left: $r('app.float.center_item_margin_left'), right: $r('app.float.center_item_margin_right') }) - ControlCenterComplexToggleLayout({ showStatusBar: $showStatusBar }) - ControlCenterSimpleToggleLayout({ showStatusBar: $showStatusBar }) + ControlCenterComplexToggleLayout() + ControlCenterSimpleToggleLayout() Column() { MyBrightness() } @@ -101,7 +102,6 @@ export default struct ControlCenterComponent { @Component struct ControlCenterComplexToggleLayout { @StorageLink('ControlCenterComplexToggleLayout') mComplexToggleLayout: string[] = [] - @Link showStatusBar: boolean aboutToAppear() { Log.showInfo(TAG_ControlCenterComplexToggleLayout, `aboutToAppear Start`) @@ -122,19 +122,12 @@ struct ControlCenterComplexToggleLayout { }) { ForEach(this.mComplexToggleLayout, (componentName: string) => { Row() { - if (componentName == Constants.WIFI) { - WifiComponent() - } else if (componentName == Constants.AIR_PLANE) { - AirPlaneComponent() - } else { - ComplexToggleComponent({ - keyId: componentName, - showStatusBar: $showStatusBar - }) - } + ComplexToggleLoadComponent({ + keyId: componentName + }) } .width('48%') - .height(Constants.COMPLEX_TOGGLE_HEIGHT) + .height(Constants.COMPLEX_TOGGLE_HEIGHT + Constants.COMPLEX_TOGGLE_UP_DOWN_SPACE) .margin({ top: Constants.COMPLEX_TOGGLE_UP_DOWN_SPACE }) }, (componentName: string) => componentName) } @@ -150,7 +143,8 @@ struct ControlCenterComplexToggleLayout { @Component struct ControlCenterSimpleToggleLayout { @StorageLink('ControlCenterSimpleToggleLayout') mSimpleToggleLayout: string[] = [] - @Link showStatusBar: boolean + @State mShowLabel: boolean = true + @State mEditMode: boolean = false aboutToAppear() { Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `aboutToAppear Start`) @@ -171,21 +165,26 @@ struct ControlCenterSimpleToggleLayout { }) { ForEach(this.mSimpleToggleLayout, (componentName: string) => { Column() { - SimpleToggleComponent({ + SimpleToggleLoadComponent({ keyId: componentName, - showStatusBar: $showStatusBar + mShowLabel: this.mShowLabel, + mEditMode: this.mEditMode }) } .width('25%') - .height(Constants.SIMPLE_TOGGLE_HEIGHT) + .height(Constants.SIMPLE_TOGGLE_HEIGHT + Constants.SIMPLE_TOGGLE_UP_DOWN_SPACE) .margin({ top: Constants.SIMPLE_TOGGLE_UP_DOWN_SPACE }) }, (componentName: string) => componentName) } .width('100%') - .height((Math.ceil(this.mSimpleToggleLayout.length / 4) * (Constants.SIMPLE_TOGGLE_HEIGHT + Constants.SIMPLE_TOGGLE_UP_DOWN_SPACE)).toString()) + .height((Math.ceil(this.mSimpleToggleLayout.length / 4) * (Constants.SIMPLE_TOGGLE_HEIGHT + Constants.SIMPLE_TOGGLE_UP_DOWN_SPACE) + + (Math.ceil(this.mSimpleToggleLayout.length / 4) == 0 ? 0 : Constants.SIMPLE_TOGGLE_UP_DOWN_SPACE * 2)).toString()) .margin({ left: $r('app.float.center_item_margin_left'), - right: $r('app.float.center_item_margin_right') + right: $r('app.float.center_item_margin_right'), + top: Math.ceil(this.mSimpleToggleLayout.length / 4) == 0 ? 0 : Constants.SIMPLE_TOGGLE_UP_TOP_SPACE }) + .borderRadius(UniformConfig.config.baseBorderRadius) + .backgroundColor(UniformConfig.config.baseColor) } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index 7b7ad03a..1c16c0e9 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -14,12 +14,9 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; +import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' -import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets' -import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase.ets' -import UniformConfig from '../../../../../../../../common/src/main/ets/template/UniformConfig.ets' -import Constants from '../common/Constants.ets' +import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase.ets' const TAG = 'SimpleToggleComponent' @@ -27,55 +24,61 @@ const TAG = 'SimpleToggleComponent' export default struct SimpleToggleComponent { @Prop keyId: string @State mItemData: any = {} - @Link showStatusBar: boolean + @StorageLink("showStatusBar") showStatusBar: boolean = false + @Prop mShowLabel: boolean + @Prop mEditMode: boolean private mWindowManager private mFeatureAbilityManager - private mConfig = UniformConfig.config; + @State mDefaultIcon: Resource = $r("app.media.icon") + @State mDefaultChangeSwitch: boolean = false + @State mDefaultLabel: string = '' aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) - this.mItemData = AppStorage.Link(this.keyId) - Log.showInfo(TAG, `aboutToAppear, mItemData: ${this.mItemData.get().iconUrl} ${this.mItemData.get().label}`) - this.mWindowManager = new WindowManager(); - this.mFeatureAbilityManager = new FeatureAbilityManager(); + Log.showInfo(TAG, `aboutToAppear Start, mShowLabel: ${this.mShowLabel} mEditMode: ${this.mEditMode}`) + this.mWindowManager = new WindowManager() + this.mFeatureAbilityManager = new FeatureAbilityManager() + this.linkItemData() } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) - let deleteRs: boolean = AppStorage.Delete(this.keyId) - Log.showInfo(TAG, `aboutToDisappear AppStorage.Delete, ${deleteRs} key: ${this.keyId}`) } - build() { - Column({ space: Constants.SIMPLE_TOGGLE_INSIDE_SPACE }) { - Stack() { - Flex() - .backgroundColor(this.mConfig.iconOffBG) - .clip(new Circle({ width: this.mConfig.circleWidth, height: this.mConfig.circleHeight })) - .width(this.mConfig.circleWidth) - .height(this.mConfig.circleHeight) - Image(this.mItemData.get() - .iconUrl) - .size({ width: Constants.SIMPLE_TOGGLE_ICON_WIDTH, height: Constants.SIMPLE_TOGGLE_ICON_HEIGHT }) - .objectFit(ImageFit.Contain) - }.onClick(this.onIconItemClick.bind(this)) - .gesture(LongPressGesture({ repeat: false }).onAction(this.onIconItemLongPressGesture.bind(this))) + linkItemData() { + Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`) + this.mItemData = AppStorage.Link(this.keyId) + Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ + this.mItemData.get() + .iconUrl}`) + } - Text(this.mItemData.get() - .label) - .fontSize($r('app.float.icon_item_fontsize')) - } + build() { + SimpleToggleBase({ + mToggleId: this.keyId, + mIcon: $mDefaultIcon, + mIconStr: this.mItemData.get().iconUrl, + mUseIconStr:true, + mChangeSwitch: $mDefaultChangeSwitch, + mLabel: $mDefaultLabel, + mLabelStr: this.mItemData.get().label, + mUseLabelStr: true, + mShowLabel: this.mShowLabel, + mEditMode: this.mEditMode, + mClickEvent: this.onIconItemClick.bind(this), + mLongClickEvent: this.onIconItemLongPressGesture.bind(this) + }) } - onIconItemClick(event: ClickEvent) { + onIconItemClick() { Log.showInfo(TAG, `onIconItemClick`) if (this.mItemData.get().actionData && this.mItemData.get().actionData.clickAction) { this.startAbility(this.mItemData.get().actionData.clickAction) } } - onIconItemLongPressGesture(event: GestureEvent) { - Log.showInfo(TAG, `onIconItemLongPressGesture, event: ${JSON.stringify(event)}`) + onIconItemLongPressGesture() { + Log.showInfo(TAG, `onIconItemLongPressGesture`) if (this.mItemData.get().actionData && this.mItemData.get().actionData.longClickAction) { this.startAbility(this.mItemData.get().actionData.longClickAction) } @@ -98,11 +101,11 @@ export default struct SimpleToggleComponent { } Log.showInfo(TAG, `startAbility, want: ${JSON.stringify(wantParam)}`) - this.showStatusBar = true; + this.showStatusBar = true this.mWindowManager.setWindowMin((result) => { this.mFeatureAbilityManager.openAbility(TAG, { want: wantParam - }); - }); + }) + }) } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets new file mode 100644 index 00000000..7bc76803 --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import LocationComponent from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets' +import RingModeComponent from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets' +import Constants from '../common/Constants.ets' +import SimpleToggleComponent from './SimpleToggleComponent.ets' + +const TAG = 'SimpleToggleLoadComponent' + +@Component +export default struct SimpleToggleLoadComponent { + @Prop keyId: string + @Prop mShowLabel: boolean + @Prop mEditMode: boolean + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) + Log.showInfo(TAG, `aboutToAppear Start, mShowLabel: ${this.mShowLabel} mEditMode: ${this.mEditMode}`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Column() { + if (this.keyId == Constants.LOCATION) { + LocationComponent({ + keyId: this.keyId, + mShowLabel: this.mShowLabel, + mEditMode: this.mEditMode + }) + } else if (this.keyId == Constants.RING_MODE) { + RingModeComponent({ + keyId: this.keyId, + mShowLabel: this.mShowLabel, + mEditMode: this.mEditMode + }) + } else { + SimpleToggleComponent({ + keyId: this.keyId, + mShowLabel: this.mShowLabel, + mEditMode: this.mEditMode + }) + } + } + } +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ets b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ets index 125414c6..085a4a92 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ets @@ -99,6 +99,8 @@ export class ControlCenterVM { if (this.mAllSimpleToggles.indexOf(itemData.id) >= 0) { this.mAllSimpleToggles.splice(this.mAllSimpleToggles.indexOf(itemData.id), 1); this.calcControlCenterLayout(); + let deleteRs: boolean = AppStorage.Delete(itemData.id) + Log.showInfo(TAG, `onItemRemove AppStorage.Delete(Simple), id: ${itemData.id} ${deleteRs} `) } Log.showInfo(TAG, `onItemRemove, ComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`) Log.showInfo(TAG, `onItemRemove, SimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`) diff --git a/features/locationcomponent/.gitignore b/features/locationcomponent/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/locationcomponent/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/locationcomponent/build.gradle b/features/locationcomponent/build.gradle new file mode 100644 index 00000000..ae402d92 --- /dev/null +++ b/features/locationcomponent/build.gradle @@ -0,0 +1,19 @@ +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} \ No newline at end of file diff --git a/features/locationcomponent/src/main/config.json b/features/locationcomponent/src/main/config.json new file mode 100644 index 00000000..3afe78f5 --- /dev/null +++ b/features/locationcomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.locationcomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "locationcomponent", + "moduleType": "har" + }, + "srcPath": "default" + } +} \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ets b/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ets new file mode 100644 index 00000000..fb97f9a5 --- /dev/null +++ b/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ets @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 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 default class Constants { + static STATIC_BAR_ICON_WIDTH = 24; + static STATIC_BAR_ICON_MARGIN = 2; + static STATIC_BAR_ICON_HEIGHT = 24; + static STATIC_BAR_ICON_INSIDE_SPACE = 2; + static STATIC_BAR_ICON_OUTSIDE_MARGIN = 5; +} \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ets b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ets new file mode 100644 index 00000000..004f1bf0 --- /dev/null +++ b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ets @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2021 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 geolocation from '@ohos.geolocation'; +import {LocationEventListener} from '@ohos.geolocation'; +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'LocationModel'; + +export class LocationService { + mIsStart: boolean = false; + mListener: any; + mLocationEventListener = new LocationEventListener(); + + startService() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `startService`) + this.mIsStart = true; + this.getServiceState(); + this.mLocationEventListener.on('locationServiceState', (state) => { + Log.showInfo(TAG, `startService locationChange, state: ${JSON.stringify(state)}`) + this.mListener?.updateServiceState(state); + }); + } + + stopService() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `stopService`) + this.mIsStart = false; + this.mLocationEventListener.off('locationServiceState', (state) => { + Log.showInfo(TAG, `stopService locationChange, state: ${JSON.stringify(state)}`) + }); + } + + registerListener(listener: { + 'updateServiceState': Function, + }) { + Log.showInfo(TAG, `registerListener, listener: ${listener}`) + this.mListener = listener; + } + + getServiceState() { + Log.showInfo(TAG, `getServiceState`) + geolocation.isLocationEnabled().then((data) => { + Log.showInfo(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`) + this.mListener?.updateServiceState(data); + }); + } + + enableLocation() { + Log.showInfo(TAG, `enableLocation`) + geolocation.enableLocation() + .then((res) => Log.showInfo(TAG, `enableLocation, result: ${JSON.stringify(res)}`)); + } + + disableLocation() { + Log.showInfo(TAG, `disableLocation`) + geolocation.disableLocation() + .then((res) => Log.showInfo(TAG, `disableLocation, result: ${JSON.stringify(res)}`)); + } +} + +let locationService = new LocationService(); + +export default locationService as LocationService; \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets new file mode 100644 index 00000000..3abe22bb --- /dev/null +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' +import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import ViewModel from '../viewmodel/LocationVM.ets' +import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase.ets' + +const TAG = 'location-ControlCenterSimpleToggleLocationComponent' + +@Component +export default struct ControlCenterSimpleToggleLocationComponent { + @Prop keyId: string + @Prop mShowLabel: boolean + @Prop mEditMode: boolean + @State mIcon: Resource = $r("app.media.ic_controlcenter_gps") + @State mLabel: Resource = $r("app.string.control_center_complex_toggle_location_title") + @StorageLink('LocationServiceOpenStatus') LocationServiceOpenStatus: boolean = false + @StorageLink("showStatusBar") showStatusBar: boolean = false + private mWindowManager + private mFeatureAbilityManager + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear') + this.mWindowManager = new WindowManager() + this.mFeatureAbilityManager = new FeatureAbilityManager() + ViewModel.initViewModel() + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') + } + + build() { + SimpleToggleBase({ + mToggleId: this.keyId, + mIcon: $mIcon, + mAutoIconColor: true, + mChangeSwitch: $LocationServiceOpenStatus, + mLabel: $mLabel, + mShowLabel: this.mShowLabel, + mEditMode: this.mEditMode, + mClickEvent: this.mClickEvent.bind(this), + mLongClickEvent: this.mLongClickEvent.bind(this) + }) + } + + mClickEvent() { + Log.showInfo(TAG, `mClickEvent, LocationServiceOpenStatus: ${this.LocationServiceOpenStatus}`) + if (this.LocationServiceOpenStatus) { + ViewModel.disableLocation() + } else { + ViewModel.enableLocation() + } + } + + mLongClickEvent() { + Log.showInfo(TAG, `mLongClickEvent, LocationServiceOpenStatus: ${this.LocationServiceOpenStatus}`) + + this.showStatusBar = true + this.mWindowManager.setWindowMin((result) => { + this.mFeatureAbilityManager.openAbility(TAG, { + want: { + bundleName: 'com.ohos.settings', + abilityName: 'com.ohos.settings.MainAbility', + } + }) + }) + + } +} \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets new file mode 100644 index 00000000..f199d2aa --- /dev/null +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/Constants.ets' +import ViewModel from '../viewmodel/LocationVM.ets' + +const TAG = 'location-StatusBarIconItemLocationComponent' + +@Component +export default struct StatusBarIconItemLocationComponent { + @StorageLink('LocationServiceUseStatus') LocationServiceUseStatus: boolean = false + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear') + ViewModel.initViewModel() + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') + } + + build() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + if (this.LocationServiceUseStatus) { + Image($r("app.media.ic_statusbar_gps")) + .objectFit(ImageFit.Contain) + .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) + .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) + } + } + .width(this.LocationServiceUseStatus ? Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient : 0) + .height(this.LocationServiceUseStatus ? Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient : 0) + } +} \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ets b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ets new file mode 100644 index 00000000..c2f001dd --- /dev/null +++ b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ets @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import LocationService from '../model/LocationService.ets'; + +export const LocationServiceOpenStatusKey = "LocationServiceOpenStatus"; + +const TAG = 'LocationVM'; + +export class LocationVM { + mIsStart: boolean = false; + + initViewModel() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initViewModel `) + this.mIsStart = true; + LocationService.registerListener(this); + LocationService.startService(); + } + + updateServiceState(state) { + Log.showInfo(TAG, `updateServiceState, state: ${state} `) + AppStorage.SetOrCreate(LocationServiceOpenStatusKey, state); + } + + enableLocation() { + Log.showInfo(TAG, `enableLocation`) + LocationService.enableLocation(); + } + + disableLocation() { + Log.showInfo(TAG, `disableLocation`) + LocationService.disableLocation(); + } +} + +let locationVM = new LocationVM(); + +export default locationVM as LocationVM; \ No newline at end of file diff --git a/features/locationcomponent/src/main/resources/base/element/string.json b/features/locationcomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..034695b9 --- /dev/null +++ b/features/locationcomponent/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "control_center_complex_toggle_location_title", + "value": "位置信息" + } + ] +} \ No newline at end of file diff --git a/features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg b/features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg new file mode 100644 index 00000000..31e59a8a --- /dev/null +++ b/features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg @@ -0,0 +1,17 @@ + + + ic_statusbar_gps + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg b/features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg new file mode 100644 index 00000000..48efd6d9 --- /dev/null +++ b/features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg @@ -0,0 +1,17 @@ + + + ic_statusbar_gps + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/locationcomponent/src/main/resources/base/media/icon.png b/features/locationcomponent/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 zcmX|G1ymHk)?T_}Vd;>R?p|tHQo6fg38|$UVM!6BLrPFWk?s;$LOP{GmJpBl$qoSA!PUg~PA65-S00{{S`XKG6NkG0RgjEntPrmV+?0|00mu7;+5 zrdpa{2QLqPJ4Y{j7=Mrl{BaxrkdY69+c~(w{Fv-v&aR%aEI&JYSeRTLWm!zbv;?)_ ziZB;fwGbbeL5Q}YLx`J$lp~A09KK8t_z}PZ=4ZzgdeKtgoc+o5EvN9A1K1_<>M?MBqb#!ASf&# zEX?<)!RH(7>1P+j=jqG(58}TVN-$psA6K}atCuI!KTJD&FMmH-78ZejBm)0qc{ESp z|LuG1{QnBUJRg_E=h1#XMWt2%fcoN@l7eAS!Es?Q+;XsRNPhiiE=@AqlLkJzF`O18 zbsbSmKN=aaq8k3NFYZfDWpKmM!coBU0(XnL8R{4=i|wi{!uWYM2je{U{B*K2PVdu&=E zTq*-XsEsJ$u5H4g6DIm2Y!DN`>^v|AqlwuCD;w45K0@eqauiqWf7l&o)+YLHm~|L~ z7$0v5mkobriU!H<@mVJHLlmQqzQ3d6Rh_-|%Yy2li*tHO>_vcnuZ7OR_xkAIuIU&x z-|8Y0wj|6|a6_I(v91y%k_kNw6pnkNdxjqG8!%Vz_d%c_!X+6-;1`GC9_FpjoHev5fEV7RhJ>r=mh-jp$fqbqRJ=obwdgLDVP5+s zy1=_DWG0Y-Jb3t^WXmkr(d9~08k-|#Ly zaNOmT(^9tIb&eb4%CzIT zAm3CUtWSr1t4?h1kk#NBi{U|pJslvME{q|_eS^3En>SOqSxyuN1x;Is@8~m?*>}** znrRFArP!K_52RpX*&JHMR<^lVdm8ypJ}0R(SD(51j;6@ni$6bQ+2XL+R^|NnSp5}(kzvMZ^(@4fD_{QVu$(&K6H|C37TG1Am9Re{<<3gd zh@`>;BqkXMW&p0T6rt|iB$)~CvFe(XC)F9WgAZn*0@t$oZo;!*}r@_`h?KKH&6A@3= zISXoQB+~`op>NP-buiA*^0n{@i{_?MRG)&k)c)k_F+-2Lud!S9pc+i`s74NpBCaGF zXN+pHkubw*msGBTY27BKHv)RRh3;nMg4&$fD_6X9Vt~;_4D+5XPH~#Kn-yjcy!$}1 zigv#FNY>TqMhtIBb@UoF!cE~Q8~;!Pek>SQQwHnHuWKoVBosAiOr}q>!>aE*Krc)V zBUMEcJ5NU0g8}-h6i1zpMY9>m4ne?=U2~`w7K7Q0gB_=p@$5K7p6}thw z-~3dMj?YNX2X$lZ+7ngQ$=s}3mizNN@kE%OtB)?c&i~2L55z8^=yz;xMHLmlY>&Q# zJj?!)M#q_SyfkQh)k?j8IfLtB)ZCp|*vf4_B zos?73yd^h-Ac+;?E4*bpf=o*^3x3-`TVjbY4n6!EN10K6o@fxdyps05Vo3PU)otB} z`3kR+2w7_C#8Z!q`J)p{Vh!+m9-UP!$STp+Hb}}#@#_u^SsUQg<}59< zTvH3%XS4G+6FF^(m6bVF&nSUIXcl;nw{=H$%fgeJ>CgDYiLdpDXr{;-AnG z8dvcrHYVMI&`R6;GWekI@Ir3!uo)oz4^{6q0m^}@f2tM9&=YHNi6-?rh0-{+k@cQm zdp`g#YdQn%MDVg2GR>wZ`n2<0l4)9nx1Wfr&!Dvz=bPwU!h2S?ez6MVc5APE4-xLB zi&W9Q8k2@0w!C53g?iAIQ}~p*3O(@zja6KQ=M3zfW*_6o5SwR-)6VBh~m7{^-=MC-owYH5-u40a}a0liho3QZZ5L{bS_xM1)4}19)zTU$$MY zq3eZML1WC{K%YFd`Be0M-rkO^l?h{kM{$2oK1*A@HVJ57*yhDkUF!2WZ&oA4Y-sK( zCY69%#`mBCi6>6uw(x4gbFaP0+FD*JKJ-q!F1E?vLJ+d35!I5d7@^eU?(CS|C^tmI5?lv@s{{*|1F zFg|OzNpZ0hxljdjaW%45O0MOttRrd(Z?h{HYbB-KFUx&9GfFL3b8NwZ$zNu)WbBD` zYkj$^UB5%3Pj1MDr>S2Ejr9pUcgA!;ZG!@{uAy12)vG=*^9-|dNQBc8&`oxBlU~#y zs!anJX&T?57Jdr^sb>e+V`MVfY>Y0ESg7MG<7W0g&bR-ZYzzZ%2H&Etcp zcd6QeXO1D!5A#zM0lx*GH}`M)2~ZFLE;sP^RSB5wVMNfiZXPd(cmO>j=OSA3`o5r& zna(|^jGXbdN7PK)U8b7^zYtYkkeb%<%F~=OqB~kXMQkq}ii|skh@WSRt>5za;cjP0 zZ~nD%6)wzedqE}BMLt~qKwlvTr33))#uP~xyw#*Eaa|DbMQ_%mG0U8numf8)0DX`r zRoG2bM;#g|p-8gWnwRV5SCW0tLjLO&9Z?K>FImeIxlGUgo0Zk`9Qzhj1eco~7XZy+hXc@YF&ZQ=? zn*^1O56yK^x{y}q`j7}blGCx%dydV!c7)g~tJzmHhV=W~jbWRRR{1<^oDK+1clprm zz$eCy7y9+?{E|YgkW~}}iB#I4XoJ*xr8R?i_Hv$=Cof5bo-Nj~f`-DLebH}&0% zfQj9@WGd4;N~Y?mzQsHJTJq6!Qzl^-vwol(+fMt#Pl=Wh#lI5Vmu@QM0=_r+1wHt` z+8WZ~c2}KQQ+q)~2Ki77QvV&`xb|xVcTms99&cD$Zz4+-^R4kvUBxG8gDk7Y`K*)JZ^2rL(+ZWV~%W(@6 z)0bPArG#BROa_PHs~&WplQ_UIrpd)1N1QGPfv!J(Z9jNT#i%H?CE6|pPZb9hJ1JW4 z^q;ft#!HRNV0YgPojzIYT`8LuET2rUe-J|c!9l4`^*;4WtY@Ew@pL>wkjmMgGfN7 ze}}GtmU0@<_#08~I-Suk=^*9GLW=H4xhsml;vAV{%hy5Eegl@!6qKqbG024%n2HHw zCc@ivW_$@5ZoHP70(7D+(`PvgjW1Pd`wsiuv-aCukMrafwDm)B!xXVy*j2opohhoU zcJz%ADmj>i3`-3-$7nQKBQQuGY;2Qt&+(L~C>vSGFj5{Mlv?T_^dql;{zkpe4R1}R z%XfZyQ}wr*sr>jrKgm*PWLjuVc%6&&`Kbf1SuFpHPN&>W)$GmqC;pIoBC`=4-hPY8 zT*>%I2fP}vGW;R=^!1be?ta2UQd2>alOFFbVl;(SQJ4Jk#)4Z0^wpWEVvY4=vyDk@ zqlModi@iVPMC+{?rm=4(n+<;|lmUO@UKYA>EPTS~AndtK^Wy^%#3<;(dQdk3WaUkRtzSMC9}7x2||CNpF#(3T4C)@ z$~RWs`BNABKX|{cmBt>Q=&gkXl&x!!NK_%5hW0LS)Z4PB>%sV?F-{Wyj#s7W%$F{D zXdK^Fp3wvy+48+GP6F_|^PCRx=ddcTO3sG;B23A49~Qaw31SZ0Rc~`r4qqt%#OGW{ zCA_(LG5^N>yzUn&kAgVmxb=EA8s&tBXC}S1CZ(KoW)(%^JjLTPo^fs`Va;`=YlVPgmB$!yB}<(4ym6OeZ3xAJJ#;)2+B%p3P1Wt+d$eo`vz`T zXfUP2))kBDPoscH;Jc7I3NU<({|@wM$&GaDt`n7WLgIY3IA7A6-_R?z8N3mz|}*i z(zl5ot--Oq@f2-nv{X(ujT2T(k1vY_qh93pK@>H-qc%2Xta)IP0Q%zt%bqYgI`o!wv!0QerB`nCN^1n|@$sVOQ!V0teVG!I z_fD%JvfDeT1cK#-{o6Gv7}& zY0#NWin~kVaf$aufV&;63Hbs|`QVZWpDX6IMk1Hj2G}fiH9e-^6u2zf^FIr^BwD<6zjw63+{yUe8PUFvk8v{sJ=R{d#`O!sz`Q13~< zPT$JS(w=yQfU2`zPCNfSw=&zup@DXc(98afjhv@1w_f!m2Z>rMJ19AB&dB%P#Ls3b z=lK7OILM+SQ&VEd=1GN6o&>YVVtIzoZ%=Z_SdqJN2}E43{bE`>w+A;=y->@^k{oCC z$F*WTY&?34;kfyFV?b*Xb1Pq`Z=%OgwEg)Rz)tx=`f%5#w_INP=x&z5!jI;#;N$ma zhO)+MDm;SxOEVL15; zGq(v2pL3&P1Sl)8P*;G-fd{l1QJsv@e@d8)1PK4w2m*M%V3j-V~L^$i|&C@b?D?9tfwE{B^}Z$k8e5FmQ>v7Xz)sG32g9t}YBt zyR$+*_00RmPx+0mW+vVG4mxd(n$(eQf3-w>JPl2UJpafrPaL5@2j}%{VE-) zBI%6Qpj*dsdH<;g!S!avA~bv^0E+ zfyJbSjPb+j;J52U)<|cIcntQBI2T#>2;tOxu{%D?kML476AErF(qN9hPva5Nkc@BF zC-tLF@3ZFb%Kpj)M<{)x*l|*Ia@ECeXo2E4h2f!aV=cHAhi_E_mfUth(sM4^hJq7B zQsGWqdZUm9S%F`$nQ*_#NcuD`&)Ek%_s{&^78{9Hm ztri&rYLOxgFdG>O@+XHy z9#;|&vBCPXH5Mon^I`jSuR$&~ZWtyB67ujzFSj!51>#C}C17~TffQ{c-!QFQkTQ%! zIR^b1`zHx|*1GU?tbBx23weFLz5H?y_Q%N&t$}k?w+``2A=aotj0;2v$~AL z{scF-cL{wsdrmPvf#a9OHyYLcwQD4Kcm)`LLwMh4WT~p29f7M!iafJSU`IV}QY5Wa z(n44-9oA}?J{a+ah*@31WTs#&J#o1`H98#6IQf;Wv0N_!);f&9g7o-k(lW5rWnDUR zQBFIRG+X=6NnsI@mxnwm;tf5;_Uxg?jZ8m-m0}&6+DA!qam(p$mN5R})yA_7m$q@| zFEd|dpS595rxQr-n#GjI5i-AhnUE>Cr;jpCqSrD~EwK_DqI^7%3#p5)%T_od!t3SOmH9MyXeeGO2(UQL;ax|x?Ncixmeo1=$ z{-);Au{*tfzOG?KQ~K|ak8-HQ?`Pekhe2WM(8s{xv-p>Zmu_6{G!-oE$7$mY`MOJorI=+mMx?H;`pr!;fVYz?5~yXBACruWB`Ph zZM}90_<^OBxIhyZ9BW$`>6JvO;%VFpqVr8|7t3~AmxYak6?`Pp#c;**_SYmi`&z23 z`p6_~ePvH)C6x-G9$hgL=eVALq`-AiamN>!3~Lxw&{H(b{B(7xSRm6<3<{%{yXiH# zos5Rv1L+8fUKJLo%P>4I&$}y; - ruleData?:RuleData; + ruleData?: RuleData; template?: any; isOngoing?: boolean; isUnremovable?: boolean; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets index fc577a22..1e7b3f74 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets @@ -19,41 +19,37 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' import NotificationManager from './NotificationManager.ets'; import ParseDataUtil from './ParseDataUtil.ets'; import RuleController from './rule/RuleController.ets'; +import CommonUtil from '../common/CommonUtil.ets'; const TAG = 'NotificationService'; -let mSubscriber; -let listeners; +interface NotificationListener { + userId: number; + onNotificationConsume: Function; + onNotificationCancel: Function; +} /** * notification service api */ export class NotificationService { - constructor() { - listeners = []; - this.init(); - } + mListeners = new Set(); + mSubscriber; + mSortingMap = {}; - init() { - this.loadAllNotifications(); + constructor() { this.subscribeNotification(this.getSubscriber()); this.loadNotificationTemplate() } - public register(listener) { - Log.showInfo(TAG, "register listener") - listeners.push(listener); + public register(listener: NotificationListener) { + let res = this.mListeners.add(listener); + Log.showInfo(TAG, `register, listener size: ${res.size}`); } - public unRegister(listener) { - Log.showInfo(TAG, "unRegister listener") - let removedIndex = listeners.indexOf(listener); - if (removedIndex == -1) { - Log.showInfo(TAG, "unRegister listener, listener is not found"); - return; - } - listeners.splice(removedIndex, 1) - Log.showInfo(TAG, "unRegister listener success"); + public unRegister(listener: NotificationListener) { + let res = this.mListeners.delete(listener); + Log.showInfo(TAG, `unRegister, res: ${res}`); } public removeAll() { @@ -71,59 +67,51 @@ export class NotificationService { public loadAllNotifications() { NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { - Log.showInfo(TAG, `getAllActiveNotifications err: ${JSON.stringify(err)}`); - Log.showInfo(TAG, `getAllActiveNotifications requestsArr: ${JSON.stringify(requestsArr)}`); + Log.showInfo(TAG, `getAllActiveNotifications error:${err}}, requestsArr: ${JSON.stringify(requestsArr)}`); if (Array.isArray(requestsArr)) { for (let i = 0, len = requestsArr.length; i < len; i++) { - this.handleNotificationLoad(requestsArr[i]); + this.handleNotificationAdd(requestsArr[i]); } } }) } getSubscriber() { - if (mSubscriber == null || mSubscriber == undefined) { - mSubscriber = { - onConsume: this.handleNotificationAdd.bind(this), + if (!this.mSubscriber) { + this.mSubscriber = { + onConsume: this.handleNotificationAddAndSortMap.bind(this), onCancel: this.handleNotificationCancel.bind(this), } } - return mSubscriber; + return this.mSubscriber; + } + + handleNotificationAddAndSortMap(data) { + Log.showInfo(TAG, 'handleNotificationAddAndSortMap, sortingMap' + JSON.stringify(data.sortingMap || {})); + this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; + this.handleNotificationAdd(data?.request); } - handleNotificationAdd(data) { - Log.showInfo(TAG, 'handleNotificationAdd started'); - Log.showInfo(TAG, 'sortingMap' + JSON.stringify(data.sortingMap || {})); - Log.showInfo(TAG, JSON.stringify(data)); - ParseDataUtil.parseData(data, (err, intermediateData) => { + handleNotificationAdd(request) { + ParseDataUtil.parseData(request, this.mSortingMap).then((intermediateData) => { Log.showInfo(TAG, `parseData after = ${JSON.stringify(intermediateData)}`); RuleController.getNotificationData(intermediateData, (finalItemData) => { Log.showInfo(TAG, `RuleController.getNotificationData after = ${JSON.stringify(finalItemData)}`); - Log.showInfo(TAG, `listeners.length = ${JSON.stringify(data)}`); - for (let i = 0, len = listeners.length; i < len; i++) { - Log.showInfo(TAG, `notify listener ` + i); - listeners[i].onNotificationConsume(finalItemData); - } + this.mListeners.forEach((listener) => { + Log.showInfo(TAG, `notifcationUserId: ${finalItemData.userId}, listener.userId: ${listener.userId}`); + if (CommonUtil.checkVisibilityByUser(finalItemData.userId, listener.userId)) { + listener.onNotificationConsume(finalItemData); + } + }) }); - }); + }).catch(errorInfo => Log.showError(TAG, errorInfo)); } handleNotificationCancel(data) { console.info("===>handleNotificationCancel data : ==> " + `data:${JSON.stringify(data)}`); - ParseDataUtil.parseData(data, (err, record) => { - for (let i = 0, len = listeners.length; i < len; i++) { - listeners[i].onNotificationCancel(record); - } - }); - } - - handleNotificationLoad(data) { - console.info("===>handleNotificationLoad data : ==> " + `data:${JSON.stringify(data)}`); - ParseDataUtil.parseData(data, (err, record) => { - for (let i = 0, len = listeners.length; i < len; i++) { - listeners[i].onNotificationLoad(record); - } - }); + ParseDataUtil.parseData(data, this.mSortingMap) + .then((record) => this.mListeners.forEach((listener) => listener.onNotificationCancel(record))) + .catch(errorInfo => Log.showError(TAG, errorInfo)); } subscribeNotification(subscriber) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets index 6b1cd5dc..5168ff5e 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets @@ -14,118 +14,76 @@ */ import Notification from '@ohos.notification'; +import AccountManager from '@ohos.account.osAccount'; import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; import BundleManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager.ets'; import NotificationManager from './NotificationManager.ets'; import Constants, {NotificationItemData} from '../common/constants.ets'; import {NotificationConfig} from './NotificationConfig.ets'; -let mDate; -let mAppName; -let mEmptyArray; const TAG = 'Notification_ParseDataUtil'; -mDate = new Date(); -mAppName = new Map(); -mEmptyArray = []; +let mDate = new Date(); let appDataMap = new Map(); +type NotificationContent = { + title: string, + text: string, + additionalText: string, + briefText?: string, + expandedTitle?: string, + longText?: string, + lines?: [], + picture?: any +} + +async function getUserId(uid) { + Log.showInfo(TAG, `getOsAccountLocalIdFromUid request.creatorUid = ${uid}`); + let userId = 0; + //todo userId = AccountManager.getAccountManager().getOsAccountLocalIdFromUid(uid) + Log.showInfo(TAG, `getOsAccountLocalIdFromUid userId = ${userId}`); + return userId; +} + + /** * parse data util class. */ export default class ParseDataUtil { - static parseData(data, callback) { - let request = data?.request; - if (request == null || request == undefined) { - Log.showInfo(TAG, 'consumeCallback request is empty'); - callback(Constants.ERROR_CALLBACK, undefined); - return; - } - let slotLevel; - try { - slotLevel = data?.sortingMap?.sortings[request.hashCode]?.slot.level; - } catch (e) { - Log.showInfo(TAG, `slot level get error: ${e.toString()}`); + static async parseData(request, sortingMap?) { + if (!request) { + return Promise.reject('consumeCallback request is empty'); } - let sound = ''; - try { - sound = data?.sortingMap?.sortings[request.hashCode]?.slot.sound; - } catch (e) { - Log.showInfo(TAG, `sound get error: ${e.toString()}`); - } - let vibrationValues = []; - try { - vibrationValues = data?.sortingMap?.sortings[request.hashCode]?.slot.vibrationValues; - } catch (e) { - Log.showInfo(TAG, `vibrationValues get error: ${e.toString()}`); - } - Log.showInfo(TAG, `want = ${JSON.stringify(request.wantAgent)}`); + Log.showInfo(TAG, `parse data start, want = ${JSON.stringify(request.wantAgent)}`); Log.showInfo(TAG, `actionButtons = ${JSON.stringify(request.actionButtons)}`); - Log.showInfo(TAG, `largeIcon = ${request.largeIcon}`); - ParseDataUtil.getAppData(request.creatorBundleName, (err, appMessage) => { - let notificationItem: NotificationItemData = { - id: request.id, - hashcode: request.hashCode, - contentType: request?.content?.contentType + '', - timestamp: request.deliveryTime, - time: ParseDataUtil.getStandardTime(request.deliveryTime), - appName: appMessage.appName, - want: request.wantAgent, - bundleName: request.creatorBundleName, - actionButtons: request.actionButtons, - smallIcon: NotificationConfig.USE_NOTIFICATION_ICON ? (request?.smallIcon ?? appMessage.icon) : appMessage.icon, - largeIcon: request.largeIcon, - slotLevel: slotLevel, - source: request.source, - sound: sound? sound : '', - vibrationValues: vibrationValues? vibrationValues : [], - template: request?.template, - isOngoing: request.isOngoing, - isUnremovable: request.isUnremovable, - isRemoveAllowed: request.isRemoveAllowed - }; - Log.showInfo(TAG, `notificationItem construct over ====================`); - switch (request?.content?.contentType) { - case NotificationManager.TYPE_BASIC: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_BASIC_TEXT ====================`); - notificationItem.title = request.content.normal?.title ?? ''; - notificationItem.text = request.content.normal?.text ?? ''; - notificationItem.additionalText = request.content.normal?.additionalText ?? ''; - break; - case NotificationManager.TYPE_LONG: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_LONG_TEXT ====================`); - notificationItem.title = request.content.longText?.title ?? ''; - notificationItem.text = request.content.longText?.text ?? ''; - notificationItem.additionalText = request.content.longText?.additionalText ?? ''; - notificationItem.briefText = request.content.longText?.briefText ?? ''; - notificationItem.expandedTitle = request.content.longText?.expandedTitle ?? ''; - notificationItem.longText = request.content.longText?.longText ?? ''; - break; - case NotificationManager.TYPE_MULTI: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_MULTILINE ====================`); - notificationItem.title = request.content.multiLine?.title ?? ''; - notificationItem.text = request.content.multiLine?.text ?? ''; - notificationItem.additionalText = request.content.multiLine?.additionalText ?? ''; - notificationItem.briefText = request.content.multiLine?.briefText ?? ''; - notificationItem.longTitle = request.content.multiLine?.longTitle ?? ''; - notificationItem.lines = request.content.multiLine?.lines ?? mEmptyArray; - Log.showInfo(TAG, `multilines: ${JSON.stringify(request.content.multiLine?.lines)}`) - break; - case NotificationManager.TYPE_PICTURE: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_PICTURE ====================`); - notificationItem.title = request.content.picture?.title ?? ''; - notificationItem.text = request.content.picture?.text ?? ''; - notificationItem.additionalText = request.content.picture?.additionalText ?? ''; - notificationItem.briefText = request.content.picture?.briefText ?? ''; - notificationItem.expandedTitle = request.content.picture?.expandedTitle ?? ''; - Log.showInfo(TAG, `picture value` + request.content.picture.picture); - notificationItem.picture = request.content.picture?.picture ?? ''; - break; - default: - Log.showInfo(TAG, 'no match content type'); - break; - } - callback(Constants.SUCCESS_CALLBACK, notificationItem); - }) + let [appMessage, userId] = + await Promise.all([ParseDataUtil.getAppData(request.creatorBundleName), getUserId(request.creatorUid)]); + let notificationItem: NotificationItemData = { + id: request.id, + userId: userId, + hashcode: request.hashCode, + contentType: request?.content?.contentType + '', + timestamp: request.deliveryTime, + time: ParseDataUtil.getStandardTime(request.deliveryTime), + appName: appMessage.appName, + want: request.wantAgent, + bundleName: request.creatorBundleName, + actionButtons: request.actionButtons, + smallIcon: NotificationConfig.USE_NOTIFICATION_ICON ? (request?.smallIcon ?? appMessage.icon) : appMessage.icon, + largeIcon: request.largeIcon, + slotLevel: sortingMap?.sortings[request?.hashCode]?.slot?.level, + source: request.source, + sound: sortingMap?.sortings[request?.hashCode]?.slot?.sound ?? '', + vibrationValues: sortingMap?.sortings[request?.hashCode]?.slot?.vibrationValues ?? [], + template: request?.template, + isOngoing: request.isOngoing, + isUnremovable: request.isUnremovable, + isRemoveAllowed: request.isRemoveAllowed + }; + Log.showInfo(TAG, `notificationItem construct over ====================`); + notificationItem = { + ...notificationItem, ...ParseDataUtil.getContentByType(request?.content?.contentType, request) + } + return notificationItem; } /** @@ -134,42 +92,25 @@ export default class ParseDataUtil { * @param {string} bundleName - BundleName of the target app. * @return {object} appData */ - static getAppData(bundleName, callback) { - Log.showInfo(TAG, 'getAppName start ===================='); + static async getAppData(bundleName) { + Log.showInfo(TAG, `getAppName start by ${bundleName}`); if (appDataMap.has(bundleName)) { - callback(Constants.SUCCESS_CALLBACK, appDataMap.get(bundleName)); - return; + Log.showInfo(TAG, `getAppData success.`); + return appDataMap.get(bundleName); } - BundleManager.getBundleInfo(TAG, bundleName, 0, (data) => { - Log.showInfo(TAG, `getBundleInfo` + JSON.stringify(data)); - let labelId = data.appInfo.labelId; - let iconId = data.appInfo.iconId; - let appName = ''; - BundleManager.getResourceManager(TAG, bundleName, (item) => { - Log.showInfo(TAG, `BundleManager.getResourceManager ${BundleManager.getResourceManager}`); - item.getString(labelId, (error, value) => { - Log.showInfo(TAG, `getString` + JSON.stringify(value)); - if (value != null && value != undefined) { - appName = value - } - item.getMediaBase64(iconId, (error, MediaValue) => { - Log.showInfo(TAG, `getMediaBase64` + JSON.stringify(MediaValue)); - if (MediaValue != null) { - let appMessage = { - 'appName': appName, - 'icon': MediaValue - } - Log.showInfo(TAG, `appDataMap set appInfo, appName = ` + JSON.stringify(appName)); - if (appName != null && appName != undefined && appName != '') { - appDataMap.set(bundleName, appMessage); - } - Log.showInfo(TAG, `getAppData success, appMessage ` + JSON.stringify(appMessage)); - callback(Constants.SUCCESS_CALLBACK, appDataMap.get(bundleName)); - } - }); - }) - }) - }); + let data = await BundleManager.getBundleInfo(TAG, bundleName, 0); + let labelId = data?.appInfo?.labelId; + let iconId = data?.appInfo?.iconId; + let item = await BundleManager.getResourceManager(TAG, bundleName); + let appMessage = { + appName: await item.getString(labelId), + icon: await item.getMediaBase64(iconId) + }; + if (appMessage.icon != null && appMessage.appName) { + appDataMap.set(bundleName, appMessage); + Log.showInfo(TAG, `getAppData success ${appMessage.appName} by ${bundleName}`); + } + return appMessage; } /** @@ -178,7 +119,6 @@ export default class ParseDataUtil { * @param {number} timestamp - Target timestamp. */ static getStandardTime(timestamp) { - Log.showInfo(TAG, 'getStandardTime start ===================='); if (timestamp == 0 || timestamp == undefined || timestamp == null) { return ''; } @@ -189,4 +129,41 @@ export default class ParseDataUtil { let minutes = minutesNumber < 10 ? '0' + minutesNumber : minutesNumber; return hours + ':' + minutes; } + + static getContentByType(notificationType, request): NotificationContent { + let content = { + title: '', text: '', additionalText: '' + } + + function getContentByKey(keysAndDefault, source) { + if (source) { + keysAndDefault.forEach(([key, defualt]) => { + content[key] = source[key] ?? defualt + }) + } + } + + switch (notificationType) { + case NotificationManager.TYPE_BASIC: + getContentByKey([['title', ''], ['text', ''], ['additionalText', '']], request.content.normal) + break; + case NotificationManager.TYPE_LONG: + getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], + ['expandedTitle', ''], ['longText', '']], request.content.longText) + break; + case NotificationManager.TYPE_MULTI: + getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], + ['longTitle', ''], ['lines', []]], request.content.multiLine) + break; + case NotificationManager.TYPE_PICTURE: + getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], + ['expandedTitle', ''], ['picture', '']], request.content.picture) + break; + default: + Log.showInfo(TAG, 'no match content type'); + break; + } + Log.showInfo(TAG, `notificationType = ${notificationType}, content = ${JSON.stringify(content)}`); + return content + } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index 85810ecd..d9dbef0e 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -51,7 +51,7 @@ export default struct NotificationListComponent { ListItem() { NotificationItem({ itemData: item }) } - }, (item: any) => item.hashcode.toString()) + }, (item: any) => `${item.hashcode}_${item.timestamp}`) } .onTouch((event: TouchEvent) => { Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets index c24cc3b9..588a696b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets @@ -14,6 +14,7 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import SwitchUserManager from '../../../../../../../../../common/src/main/ets/default/SwitchUserManager.ets'; import media from '@ohos.multimedia.media'; import vibrator from '@ohos.vibrator'; import wantAgent from '@ohos.wantAgent'; @@ -27,31 +28,33 @@ import Constants from '../common/constants.ets'; const TAG = 'NotificationViewModel'; const GROUP_THRESHOLD = 10; + /** * Notification ViewModel class. */ export class ViewModel { audioPlayer: any; mNotificationList: any[]; - mAppNotificationCount: any; + mAppNotificationCount = new Map(); mCallback: any; mNotificationCtrl: any = {}; constructor() { - let tempLink = AppStorage.SetAndLink('notificationList', []); - this.mNotificationList = tempLink.get(); - this.mAppNotificationCount = new Map(); + this.mNotificationList = AppStorage.SetAndLink('notificationList', []).get(); this.audioPlayer = media.createAudioPlayer(); this.audioPlayer.src = 'file://system/etc/capture.ogg'; - this.registerCallback(); - this.loadFlowControlInfos(); + SwitchUserManager.getInstance().registerListener(this); + this.initFlowControlInfos(); + SwitchUserManager.getInstance().getCurrentUserInfo().then((userInfo) => { + this.registerCallback(userInfo.userId); + }) } - registerCallback() { + registerCallback(userId) { this.mCallback = { + userId: userId, onNotificationConsume: this.onNotificationConsume.bind(this), - onNotificationCancel: this.onNotificationCancel.bind(this), - onNotificationLoad: this.onNotificationLoad.bind(this) + onNotificationCancel: this.onNotificationCancel.bind(this) } NotificationService.register(this.mCallback); } @@ -60,6 +63,15 @@ export class ViewModel { NotificationService.unRegister(this.mCallback); } + userChange(userInfo) { + Log.showInfo(TAG, `UserChange, userInfo: ${JSON.stringify(userInfo)}`); + this.unregisterCallback(); + this.mNotificationList.length = 0; + this.initFlowControlInfos(); + this.registerCallback(userInfo.userId); + NotificationService.loadAllNotifications(); + } + /** * notification CancelCallback * @@ -122,10 +134,6 @@ export class ViewModel { } } - onNotificationLoad() { - - } - /** * notification CancelCallback @@ -244,19 +252,19 @@ export class ViewModel { CommonUtil.startWant(want, info); } - loadFlowControlInfos() { - Log.showInfo(TAG, 'loadFlowControlInfos enter'); + initFlowControlInfos() { + Log.showInfo(TAG, 'initFlowControlInfos enter'); let notificationConfig = NotificationConfig.readNotificationConfig('statusbar') Log.showInfo(TAG, 'NotificationConfig: ' + JSON.stringify(notificationConfig)); if (CheckEmptyUtils.isEmpty(notificationConfig)) { Log.showInfo(TAG, 'NotificationConfig is no definition'); - Log.showInfo(TAG, 'loadFlowControlInfos end'); return } - - this.mNotificationCtrl['currentTotal'] = 0; - this.mNotificationCtrl['limitTotal'] = notificationConfig.limitTotal - this.mNotificationCtrl['app'] = new Map(); + this.mNotificationCtrl = { + currentTotal: 0, + limitTotal: notificationConfig.limitTotal, + app: new Map() + } for (let item of notificationConfig.app) { let tmp = { 'canShow': item.canShow, @@ -265,8 +273,7 @@ export class ViewModel { } this.mNotificationCtrl['app'].set(item.bundleName, tmp); } - Log.showInfo(TAG, 'mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); - Log.showInfo(TAG, 'loadFlowControlInfos end'); + Log.showInfo(TAG, 'initFlowControlInfos end, mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); } isCanShow(bundleName: string): boolean { diff --git a/features/ringmodecomponent/.gitignore b/features/ringmodecomponent/.gitignore new file mode 100644 index 00000000..378eac25 --- /dev/null +++ b/features/ringmodecomponent/.gitignore @@ -0,0 +1 @@ +build diff --git a/features/ringmodecomponent/build.gradle b/features/ringmodecomponent/build.gradle new file mode 100644 index 00000000..ae402d92 --- /dev/null +++ b/features/ringmodecomponent/build.gradle @@ -0,0 +1,19 @@ +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/config.json b/features/ringmodecomponent/src/main/config.json new file mode 100644 index 00000000..ff04f851 --- /dev/null +++ b/features/ringmodecomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.ringmodecomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "ringmodecomponent", + "moduleType": "har" + }, + "srcPath": "default" + } +} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ets b/features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ets new file mode 100644 index 00000000..39b6cb57 --- /dev/null +++ b/features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ets @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021 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 audio from '@ohos.multimedia.audio'; + +export default class Constants { + static STATIC_BAR_ICON_WIDTH = 24; + static STATIC_BAR_ICON_MARGIN = 2; + static STATIC_BAR_ICON_HEIGHT = 24; + static STATIC_BAR_ICON_INSIDE_SPACE = 2; + static STATIC_BAR_ICON_OUTSIDE_MARGIN = 5; +} + +export enum AudioRingMode { + RINGER_MODE_SILENT = audio.AudioRingMode.RINGER_MODE_SILENT, + RINGER_MODE_VIBRATE = audio.AudioRingMode.RINGER_MODE_VIBRATE, + RINGER_MODE_NORMAL = audio.AudioRingMode.RINGER_MODE_NORMAL +} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ets b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ets new file mode 100644 index 00000000..85d1326f --- /dev/null +++ b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ets @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2021 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 audio from '@ohos.multimedia.audio'; +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'RingModeModel'; + +export class RingModeService { + mIsStart: boolean = false; + mListener: any; + mAudioManager: any; + + startService() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `startService`) + this.mIsStart = true; + + this.mAudioManager = audio.getAudioManager(); + + this.getRingerMode(); + + this.mAudioManager.on('ringerModeChange', (data) => { + Log.showInfo(TAG, `startService->ringerModeChange, data: ${JSON.stringify(data)}`) + this.mListener?.updateRingerMode(data); + }); + } + + stopService() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `stopService`) + this.mIsStart = false; + + this.mAudioManager = null; + } + + registerListener(listener: { + 'updateRingerMode': Function + }) { + Log.showInfo(TAG, `registerListener, listener: ${listener}`) + this.mListener = listener; + } + + getRingerMode() { + Log.showInfo(TAG, `getRingerMode`) + this.mAudioManager.getRingerMode((error, action) => { + Log.showInfo(TAG, `getRingerMode, error: ${JSON.stringify(error)} action: ${JSON.stringify(action)}`) + if (error) { + return; + } + this.mListener?.updateRingerMode(action); + }); + } + + setRingerMode(mode) { + Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)}`) + this.mAudioManager.setRingerMode(mode, (err, data) => { + Log.showInfo(TAG, `mAudioManager.setRingerMode, mode: ${JSON.stringify(mode)}`) + }) + } +} + +let ringModeService = new RingModeService(); + +export default ringModeService as RingModeService; \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets new file mode 100644 index 00000000..f52ecfaa --- /dev/null +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' +import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import {AudioRingMode} from '../common/Constants.ets' +import ViewModel from '../viewmodel/RingModeVM.ets' +import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase.ets' + +const TAG = 'ringmode-ControlCenterSimpleToggleRingModeComponent' + +@Component +export default struct ControlCenterSimpleToggleRingModeComponent { + @Prop keyId: string + @Prop mShowLabel: boolean + @Prop mEditMode: boolean + @State mIcon: Resource = $r("app.media.ic_controlcenter_ring_on_filled") + @State mLabel: Resource = $r("app.string.control_center_complex_toggle_ring_mode_title_on") + @State mDefaultChangeSwitch: boolean = true + @StorageLink('RingModeComponentMode') @Watch('onRingModeUpdated') RingModeComponentMode: AudioRingMode = AudioRingMode.RINGER_MODE_NORMAL + @StorageLink("showStatusBar") showStatusBar: boolean = false + private mWindowManager + private mFeatureAbilityManager + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear') + this.mWindowManager = new WindowManager() + this.mFeatureAbilityManager = new FeatureAbilityManager() + ViewModel.initViewModel() + this.onRingModeUpdated('RingModeComponentMode') + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') + } + + onRingModeUpdated(propName: string): void { + Log.showInfo(TAG, `onRingModeUpdated, propName: ${propName} RingModeComponentMode: ${JSON.stringify(this.RingModeComponentMode)}`) + if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_SILENT) { + this.mIcon = $r("app.media.ic_controlcenter_ring_off_filled") + this.mLabel = $r("app.string.control_center_complex_toggle_ring_mode_title_off") + } else if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_VIBRATE) { + this.mIcon = $r("app.media.ic_controlcenter_vibration_filled") + this.mLabel = $r("app.string.control_center_complex_toggle_ring_mode_title_vibration") + } else if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_NORMAL) { + this.mIcon = $r("app.media.ic_controlcenter_ring_on_filled") + this.mLabel = $r("app.string.control_center_complex_toggle_ring_mode_title_on") + } + } + + build() { + SimpleToggleBase({ + mToggleId: this.keyId, + mIcon: $mIcon, + mChangeSwitch: $mDefaultChangeSwitch, + mLabel: $mLabel, + mShowLabel: this.mShowLabel, + mEditMode: this.mEditMode, + mClickEvent: this.mClickEvent.bind(this), + mLongClickEvent: this.mLongClickEvent.bind(this) + }) + } + + mClickEvent() { + Log.showInfo(TAG, `mClickEvent, RingModeComponentMode: ${JSON.stringify(this.RingModeComponentMode)}`) + if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_SILENT) { + ViewModel.setRingerMode(AudioRingMode.RINGER_MODE_NORMAL) + } else if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_VIBRATE) { + ViewModel.setRingerMode(AudioRingMode.RINGER_MODE_SILENT) + } else if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_NORMAL) { + ViewModel.setRingerMode(AudioRingMode.RINGER_MODE_VIBRATE) + } + } + + mLongClickEvent() { + Log.showInfo(TAG, `mLongClickEvent, RingModeComponentMode: ${JSON.stringify(this.RingModeComponentMode)}`) + + this.showStatusBar = true + this.mWindowManager.setWindowMin((result) => { + this.mFeatureAbilityManager.openAbility(TAG, { + want: { + bundleName: 'com.ohos.settings', + abilityName: 'com.ohos.settings.MainAbility', + } + }) + }) + } +} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets new file mode 100644 index 00000000..9579e196 --- /dev/null +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants, {AudioRingMode} from '../common/Constants.ets' +import ViewModel from '../viewmodel/RingModeVM.ets' + +const TAG = 'ringmode-StatusBarIconItemRingModeComponent' + +@Component +export default struct StatusBarIconItemRingModeComponent { + @StorageLink('RingModeComponentMode') RingModeComponentMode: AudioRingMode = AudioRingMode.RINGER_MODE_NORMAL + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + private ringModeIcons: any + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear') + this.ringModeIcons = {} + this.ringModeIcons[AudioRingMode.RINGER_MODE_SILENT.toString()] = $r("app.media.ic_statusbar_ring_off_filled") + this.ringModeIcons[AudioRingMode.RINGER_MODE_VIBRATE.toString()] = $r("app.media.ic_statusbar_vibration_on") + ViewModel.initViewModel() + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') + } + + build() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + if (this.RingModeComponentMode != AudioRingMode.RINGER_MODE_NORMAL) { + Image(this.ringModeIcons[this.RingModeComponentMode.toString()]) + .objectFit(ImageFit.Contain) + .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) + .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) + } + } + .width(this.RingModeComponentMode != AudioRingMode.RINGER_MODE_NORMAL ? Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient : 0) + .height(this.RingModeComponentMode != AudioRingMode.RINGER_MODE_NORMAL ? Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient : 0) + } +} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ets b/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ets new file mode 100644 index 00000000..93bc477e --- /dev/null +++ b/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ets @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import {AudioRingMode} from '../common/Constants.ets' +import RingModeService from '../model/RingModeService.ets'; + +export const RingModeComponentModeKey = "RingModeComponentMode"; + +const TAG = 'RingModeVM'; + +export class RingModeVM { + mIsStart: boolean = false; + mRingModeComponentMode: any; + + initViewModel() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initViewModel `) + this.mIsStart = true; + + this.mRingModeComponentMode = AppStorage.SetAndLink(RingModeComponentModeKey, AudioRingMode.RINGER_MODE_NORMAL); + + RingModeService.registerListener({ + 'updateRingerMode': this.updateRingerMode.bind(this) + }); + RingModeService.startService(); + } + + updateRingerMode(mode) { + Log.showInfo(TAG, `updateRingerMode, mode: ${JSON.stringify(mode)} `) + this.mRingModeComponentMode.set(mode); + } + + setRingerMode(mode) { + Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)} `) + RingModeService.setRingerMode(mode); + } +} + +let ringModeVM = new RingModeVM(); + +export default ringModeVM as RingModeVM; \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/base/element/string.json b/features/ringmodecomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..3944c9d2 --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "control_center_complex_toggle_ring_mode_title_on", + "value": "响铃" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_off", + "value": "静音" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_vibration", + "value": "振动" + } + ] +} diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg b/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg new file mode 100644 index 00000000..0c713c55 --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg b/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg new file mode 100644 index 00000000..010fa156 --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg b/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg new file mode 100644 index 00000000..1fb6b9d1 --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg b/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg new file mode 100644 index 00000000..44f0db0c --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg b/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg new file mode 100644 index 00000000..6599e8f5 --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg @@ -0,0 +1,11 @@ + + + ic_statusbar_vibration_on + + + + + + + + \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/en_US/element/string.json b/features/ringmodecomponent/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..5f2c3837 --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/en_US/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "control_center_complex_toggle_ring_mode_title_on", + "value": "Sound" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_off", + "value": "Silent" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_vibration", + "value": "Vibration" + } + ] +} diff --git a/features/ringmodecomponent/src/main/resources/zh_CN/element/string.json b/features/ringmodecomponent/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..3944c9d2 --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "control_center_complex_toggle_ring_mode_title_on", + "value": "响铃" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_off", + "value": "静音" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_vibration", + "value": "振动" + } + ] +} diff --git a/features/statusbarcomponent/.gitignore b/features/statusbarcomponent/.gitignore new file mode 100644 index 00000000..378eac25 --- /dev/null +++ b/features/statusbarcomponent/.gitignore @@ -0,0 +1 @@ +build diff --git a/features/statusbarcomponent/build.gradle b/features/statusbarcomponent/build.gradle index eb806119..a71ac7c1 100644 --- a/features/statusbarcomponent/build.gradle +++ b/features/statusbarcomponent/build.gradle @@ -17,7 +17,11 @@ ohos { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) implementation project(':features:signalcomponent') + implementation project(':features:capsulecomponent') implementation project(':features:wificomponent') + implementation project(':features:bluetoothcomponent') implementation project(':features:batterycomponent') implementation project(':features:clockcomponent') + implementation project(':features:locationcomponent') + implementation project(':features:ringmodecomponent') } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ets b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ets index 6249ccc1..14ce7678 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ets @@ -16,11 +16,14 @@ export default class Constants { static EMPTY = 'empty'; static WIFI = 'wifi'; + static BLUETOOTH = 'bluetooth'; static SIGNAL = 'signal'; static CLOCK = 'clock'; static BATTERY = 'battery'; static CAPSULE = 'capsule' static NOTIFICATION = 'notification'; + static LOCATION = 'location' + static RING_MODE = 'ring_mode'; static STATIC_BAR_ICON_WIDTH = 24; static STATIC_BAR_ICON_MARGIN = 2; diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets index 6d4bf3ef..83a00c8a 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets @@ -71,7 +71,7 @@ class StatusBarConfiguration { shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_portrait")); } Log.showInfo(TAG, 'getDirectionAndPosition' + 4); - shortSideLength = vp2px(parseInt(shortSideLength)) + ''; + shortSideLength = parseInt(shortSideLength) + ''; Log.showInfo(TAG, 'directionStatus = ' + directionStatus.direction); Log.showInfo(TAG, 'statusbarPosition = ' + statusbarPosition); Log.showInfo(TAG, 'lpx2px(parseInt(shortSideLength)) = ' + shortSideLength); diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index 73a66fb9..d1c7806a 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -20,8 +20,11 @@ import IconItemComponent from './IconItemComponent.ets' import BatteryIcon from '../../../../../../../batterycomponent/src/main/ets/default/pages/batteryIcon.ets' import ClockIcon from '../../../../../../../clockcomponent/src/main/ets/default/pages/clockIcon.ets' import WifiIcon from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiIcon.ets' +import BluetoothIcon from '../../../../../../../bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets' import SignalIcon from '../../../../../../../signalcomponent/src/main/ets/default/pages/signalIcon.ets' import CapsuleIcon from '../../../../../../../capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets' +import LocationIcon from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets' +import RingModeIcon from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets' const TAG = 'StatusBarComponent' const TAG_StatusBarGroup = 'StatusBarGroup' @@ -151,6 +154,8 @@ struct StatusBarGroup { StatusBarEmptyIcon() } else if (componentName == Constants.WIFI) { WifiIcon() + } else if (componentName == Constants.BLUETOOTH) { + BluetoothIcon() } else if (componentName == Constants.SIGNAL) { SignalIcon() } else if (componentName == Constants.CLOCK) { @@ -161,6 +166,10 @@ struct StatusBarGroup { CapsuleIcon() } else if (componentName == Constants.NOTIFICATION) { StatusBarNotificationIcon() + } else if (componentName == Constants.LOCATION) { + LocationIcon() + } else if (componentName == Constants.RING_MODE) { + RingModeIcon() } else { IconItemComponent({ keyId: componentName, @@ -183,6 +192,8 @@ struct StatusBarGroup { StatusBarEmptyIcon() } else if (componentName == Constants.WIFI) { WifiIcon() + } else if (componentName == Constants.BLUETOOTH) { + BluetoothIcon() } else if (componentName == Constants.SIGNAL) { SignalIcon() } else if (componentName == Constants.CLOCK) { @@ -193,6 +204,10 @@ struct StatusBarGroup { CapsuleIcon() } else if (componentName == Constants.NOTIFICATION) { StatusBarNotificationIcon() + } else if (componentName == Constants.LOCATION) { + LocationIcon() + } else if (componentName == Constants.RING_MODE) { + RingModeIcon() } else { IconItemComponent({ keyId: componentName, diff --git a/features/volumecomponent/src/main/ets/default/VolumeModel.ets b/features/volumecomponent/src/main/ets/default/VolumeModel.ets index 49a47cf7..19dd7593 100644 --- a/features/volumecomponent/src/main/ets/default/VolumeModel.ets +++ b/features/volumecomponent/src/main/ets/default/VolumeModel.ets @@ -28,7 +28,7 @@ export class VolumeModel { init(): void{ Log.showInfo(TAG, 'init'); - this.uri = settings.getUri(SYSTEMUI_AUDIOVOLUMETYPE_MEDIA); + this.uri = settings.getUriSync(SYSTEMUI_AUDIOVOLUMETYPE_MEDIA); Log.showInfo(TAG, 'settings geturi of audio.AudioVolumeType.MEDIA is ' + this.uri); this.helper = featureAbility.acquireDataAbilityHelper(this.uri); this.getVolume(); @@ -36,7 +36,7 @@ export class VolumeModel { registerVolume() { this.helper.on("dataChange", this.uri, (err) => { - let data = settings.getValue(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, '5') + let data = settings.getValueSync(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, '5') Log.showInfo(TAG, `after audio.AudioVolumeType.MEDIA datachange settings getValue ${parseInt(data)}`); mVolumeValue.set(parseInt(data)); }) @@ -54,13 +54,13 @@ export class VolumeModel { Log.showInfo(TAG, `setVolume ${value}`); mVolumeValue.set(value); Log.showInfo(TAG, `mVolumeValue setVolume ${value} end`); - settings.setValue(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, callback.value.toString()); + settings.setValueSync(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, callback.value.toString()); Log.showInfo(TAG, `settings setVolume ${callback.value} end`); } getVolume() { Log.showInfo(TAG, 'getVolume'); - let data = settings.getValue(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, '5'); + let data = settings.getValueSync(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, '5'); Log.showInfo(TAG, `settings getVolume ${parseInt(data)}`); mVolumeValue.set(parseInt(data)); } diff --git a/features/wificomponent/src/main/ets/default/common/constants.ets b/features/wificomponent/src/main/ets/default/common/constants.ets index f2bd3003..91072e3b 100644 --- a/features/wificomponent/src/main/ets/default/common/constants.ets +++ b/features/wificomponent/src/main/ets/default/common/constants.ets @@ -14,31 +14,27 @@ */ export default class constants { + static DEFAULT_WIFI_OPEN_STATUS: boolean = false; + static DEFAULT_WIFI_NAME: string = 'WLAN'; static DEFAULT_WIFI_INFO: number = 0; static DEFAULT_WIFI_STATUS: boolean = false; - static WIFI_STATUS_DISPLAY_HEIGHT: string = '50%'; - static WIFI_STATUS_HIDDEN_HEIGHT: number = 0; - static WIFI_STATUS_MAX_WIDTH: string = '50'; - static EVENT_CONN_STATE: string = 'usual.event.wifi.CONN_STATE'; - static EVENT_POWER_STATE: string = 'usual.event.wifi.POWER_STATE'; - static Event_CONN_NAME: string = 'WIFI_CONNECT_NAME'; static WIFI_SIGNAL_NO: number = 0; static WIFI_SIGNAL_LOW: number = 1; static WIFI_SIGNAL_MID: number = 2; static WIFI_SIGNAL_HIGH: number = 3; static WIFI_SIGNAL_FULL: number = 4; - static WIFI_POWER_OFF: number = 1; - static WIFI_POWER_ON: number = 3; - static WIFI_STATE_AP_CONNECTING: number = 1; - static WIFI_STATE_NETWORK_ENABLED: number = 3; - static WIFI_STATE_NO_NETWORK: number = 4; - static WIFI_Disconnected: number = 7; - static WIFI_PASSWORD_ERR: number = 8; - static WIFI_CONNECTING_TIMEOUT: number = 9; - static DEFAULT_ERR_CODE: number = 0; - static UPDATE_WIFI_INFO_DEFAULT_PARAM: number = -60; - static WIFI_SIGNAL_DEFAULT: number = -1; - static SIGN_LEVEL: number = 2; static STATIC_BAR_ICON_WIDTH = 24; static STATIC_BAR_ICON_HEIGHT = 24; } + +export enum WifiState { + STATE_OFF = 0, + STATE_ON = 1, + STATE_TURNING_ON = 2, + STATE_TURNING_OFF = 3 +} + +export enum WifiConnectionState { + DISCONNECTED = 0, + CONNECTED = 1 +} diff --git a/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets b/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets index 7fa3a2d8..a7e90a43 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets @@ -13,40 +13,62 @@ * limitations under the License. */ -import mWifiManger from '../WifiModel.ets'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import mWifiManger from '../WifiModel.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import FeatureAbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' +import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' import iconTitleBase from '../../../../../../../common/src/main/ets/template/iconTitleBase.ets' -const TAG= 'Control-wifiComponent' +import Constants from '../common/constants.ets' -@Component -export default -struct WifiComponent { +const TAG = 'Control-wifiComponent' +@Component +export default struct WifiComponent { private IconInfo: any[] = [ $r('app.media.wifi_d'), $r('app.media.wifi'), ] - - @StorageLink('wifiName') wifiName: string = 'WLAN' - @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = false + @StorageLink('wifiName') wifiName: string = Constants.DEFAULT_WIFI_NAME + @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = Constants.DEFAULT_WIFI_OPEN_STATUS + @StorageLink("showStatusBar") showStatusBar: boolean = false + private mWindowManager + private mFeatureAbilityManager mClickEvent() { + Log.showInfo(TAG, `mClickEvent, wifiOpenStatus: ${this.wifiOpenStatus}`) + if (this.wifiOpenStatus == false) { - console.log(`WLAN status is closing:${this.wifiOpenStatus} ”no“, set WLAN status enableWifi`) - mWifiManger.enableWifi(); + Log.showInfo(TAG, `WLAN status is closing:${this.wifiOpenStatus} “no”, set WLAN status enableWifi`) + mWifiManger.enableWifi() } else { - console.log(`WLAN status is opening:${this.wifiOpenStatus} ”yes“,se WLAN status disableWifi`) - mWifiManger.disableWifi(); + Log.showInfo(TAG, `WLAN status is opening:${this.wifiOpenStatus} “yes”,se WLAN status disableWifi`) + mWifiManger.disableWifi() } } + mLongClickEvent() { + Log.showInfo(TAG, `mLongClickEvent, wifiOpenStatus: ${this.wifiOpenStatus}`) + + this.showStatusBar = true + this.mWindowManager.setWindowMin((result) => { + this.mFeatureAbilityManager.openAbility(TAG, { + want: { + bundleName: 'com.ohos.settings', + abilityName: 'com.ohos.settings.MainAbility', + } + }) + }) + } + aboutToAppear() { - Log.showInfo(TAG,'aboutToAppear') + Log.showInfo(TAG, 'aboutToAppear') + this.mWindowManager = new WindowManager() + this.mFeatureAbilityManager = new FeatureAbilityManager() mWifiManger.initWifiModel() } - aboutToDisappear () { - Log.showInfo(TAG,'aboutToDisappear') + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') } build() { @@ -54,10 +76,12 @@ struct WifiComponent { iconTitleBase({ iconOff: this.IconInfo[0], iconOn: this.IconInfo[1], - mTitle: this.wifiName, + mTitle: $wifiName, changeSwitch: $wifiOpenStatus, - mClickEvent: this.mClickEvent.bind(this) + mClickEvent: this.mClickEvent.bind(this), + mLongClickEvent: this.mLongClickEvent.bind(this) }) - } + }.width('100%') + .height('100%') } } \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index ae3717c2..2483022b 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -32,7 +32,6 @@ export default struct WifiIcon { aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) - // mWifiModel.uninitWifiModel() } build() { diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ets b/features/wificomponent/src/main/ets/default/wifiModel.ets index 1c7f2728..a6526037 100644 --- a/features/wificomponent/src/main/ets/default/wifiModel.ets +++ b/features/wificomponent/src/main/ets/default/wifiModel.ets @@ -13,190 +13,149 @@ * limitations under the License. */ -import Constants from './common/constants.ets' -import WifiInfo from '@ohos.wifi_native_js'; -import Subscriber from '@ohos.commonEvent'; +import wifi from '@ohos.wifi'; +import {EventListener} from '@ohos.wifi'; +import Constants, {WifiState, WifiConnectionState} from './common/constants.ets' import Log from "../../../../../../common/src/main/ets/default/Log.ets"; const TAG = 'WifiComponent-WifiModel'; -var mCommonEventSubscribeInfo = { - events: [Constants.EVENT_CONN_STATE, - Constants.EVENT_POWER_STATE, Constants.Event_CONN_NAME] -}; -var mCommonEventSubscriber = null; var mWifiInfo; var mWifiStatus; var mWifiOpenStatus; var mWifiName; - export class WifiModel { + mIsStart: boolean = false; + mListener= null; initWifiModel() { - Log.showInfo(TAG, `initWifiModel`) - mWifiInfo = AppStorage.SetAndLink("wifiInfo", 0); - mWifiStatus = AppStorage.SetAndLink("wifiStatus", false); - mWifiName = AppStorage.SetAndLink("wifiName", 'WLAN') - mWifiOpenStatus = AppStorage.SetAndLink("wifiOpenStatus", false); - if(mCommonEventSubscriber == null){ - this.registerWiFiStatusListener(); + if (this.mIsStart) { + return; } - this.getWifiMessage(); + Log.showInfo(TAG, `initWifiModel`) + this.mIsStart = true; + + mWifiInfo = AppStorage.SetAndLink("wifiInfo", Constants.DEFAULT_WIFI_INFO); + mWifiStatus = AppStorage.SetAndLink("wifiStatus", Constants.DEFAULT_WIFI_STATUS); + mWifiName = AppStorage.SetAndLink("wifiName", Constants.DEFAULT_WIFI_NAME) + mWifiOpenStatus = AppStorage.SetAndLink("wifiOpenStatus", Constants.DEFAULT_WIFI_OPEN_STATUS); + + this.getWifiInfo(); + + this.mListener = new EventListener(); + this.mListener.on('wifiStateChange', this.onWifiStateChange.bind(this)); + this.mListener.on('wifiConnectionChange', this.onWifiConnectionChange.bind(this)); + this.mListener.on('wifiRssiChange', this.onWifiRssiChange.bind(this)); } uninitWifiModel() { + if (!this.mIsStart) { + return; + } Log.showInfo(TAG, `uninitWifiModel`) - this.unregisterWiFiStatusListener() - } + this.mIsStart = false; - /** - * Get Wifi value for the first time when restart device - * - */ - getWifiMessage() { - Log.showInfo(TAG, `wifiModel getWifiMessage ===========`); - mWifiOpenStatus.set(WifiInfo.isWifiActive()); - try{ - WifiInfo.getLinkedInfo(data => { - Log.showInfo(TAG, `getWifiMessage getLinkedInfo ${JSON.stringify(data)}`); - if(data.ssid != ''){ - mWifiName.set(data.ssid); - mWifiStatus.set(true); - this.updateWifiInfo(); - } - }); - }catch(err){ - Log.showInfo(TAG, `getWifiMessage getLinkedInfo err ${JSON.stringify(err)}`); - } + this.mListener.off('wifiRssiChange', (data) => { + Log.showInfo(TAG, `uninitWifiModel->wifiRssiChange, data: ${JSON.stringify(data)}`) + }); + this.mListener.off('wifiConnectionChange', (data) => { + Log.showInfo(TAG, `uninitWifiModel->wifiConnectionChange, data: ${JSON.stringify(data)}`) + }); + this.mListener.off('wifiStateChange', (data) => { + Log.showInfo(TAG, `uninitWifiModel->wifiStateChange, data: ${JSON.stringify(data)}`) + }); + this.mListener = null; + mWifiOpenStatus.set(Constants.DEFAULT_WIFI_OPEN_STATUS); + this.setDisconnectedStatus(); } - /** - * Subscribe wifi events - * - */ - registerWiFiStatusListener() : void { - Log.showInfo(TAG, `register Wifi status listener ===========`); - Subscriber.createSubscriber( - mCommonEventSubscribeInfo, - this.createWifiStatusSubscriberCallBack.bind(this) - ); - } + onWifiStateChange(data) { + Log.showInfo(TAG, `onWifiStateChange, data: ${JSON.stringify(data)}`) - /** - * Callback of the subscriber - * - * @param {Object} err - error returns from the caller - * @param {Object} data - data returns from the caller - */ - createWifiStatusSubscriberCallBack(err, data) { - Log.showInfo(TAG, `createWifiStatusSubscriberCallBack start err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - mCommonEventSubscriber = data; - Subscriber.subscribe(mCommonEventSubscriber, this.wifiStatusSubscriberCallBack.bind(this)); + let isWifiInactive = data == WifiState.STATE_OFF; + mWifiOpenStatus.set(!isWifiInactive); + if (!isWifiInactive) { + this.getWifiConnectInfo(); + } else { + this.setDisconnectedStatus(); + } } - /** - * Callback of the events - * - * @param {Object} err - error returns from the caller - * @param {Object} data - data returns from the caller - */ - private wifiStatusSubscriberCallBack(err, data) { - Log.showInfo(TAG, `wifiStatusSubscriberCallBack start err:${ JSON.stringify(err)} data: ${ JSON.stringify(data) }`); - if (err.code == Constants.DEFAULT_ERR_CODE) { - Log.showInfo(TAG, `wifi data == ${JSON.stringify(data)}`); - if (data.event == Constants.EVENT_CONN_STATE) { - if(data.code == Constants.WIFI_STATE_AP_CONNECTING || - data.code == Constants.WIFI_STATE_NETWORK_ENABLED || - data.code == Constants.WIFI_STATE_NO_NETWORK){ - this.updateWifiInfo(); - this.changeWifiStatus(true); - }else { - this.updateWifiInfo(); - this.changeWifiStatus(false); - mWifiName.set('WLAN'); - } - } - if (data.event == Constants.EVENT_POWER_STATE) { - if( data.code == Constants.WIFI_POWER_OFF){ - this.updateWifiInfo(); - this.changeWifiStatus(false); - mWifiOpenStatus.set(false); - mWifiName.set('WLAN'); - }else if(data.code == Constants.WIFI_POWER_ON){ - mWifiOpenStatus.set(true); - } - } - if(data.event == 'WIFI_CONNECT_NAME'){ - this.updateWifiName(JSON.parse(data.data).name) - this.changeWifiStatus(true) - let rssi = JSON.parse(data.data).rssi - let band = JSON.parse(data.data).band - Log.showInfo(TAG, `WIFI_CONNECT_NAME ================ ${rssi}`) - this.updateWifiInfo(rssi,band); - } + onWifiConnectionChange(data) { + Log.showInfo(TAG, `onWifiConnectionChange, data: ${JSON.stringify(data)}`) + + if (data == WifiConnectionState.CONNECTED) { + this.getLinkedInfo(); } else { - Log.showError(TAG, `error when subscribing ========`); + this.setDisconnectedStatus(); } } - /** - * Unsubscribe wifi events - * - */ - private unregisterWiFiStatusListener() { - Subscriber.unsubscribe(mCommonEventSubscriber, () => { - Log.showInfo(TAG, `unregister Wifi Status Listener ===============`); - }); + onWifiRssiChange(data) { + Log.showInfo(TAG, `onWifiRssiChange, data: ${JSON.stringify(data)}`) + this.getLinkedInfo(); } - /** - * Check the connection status of Wifi - * - * @param {boolean} status - if display wifi icon - */ - private changeWifiStatus(status) { - Log.showInfo(TAG, `enter changeWifiStatus ================ ${status}`); - mWifiStatus.set(status) + getWifiInfo() { + Log.showInfo(TAG, `getWifiInfo`) + let isWifiActive = wifi.isWifiActive(); + Log.showInfo(TAG, `getWifiInfo, isWifiActive: ${isWifiActive}`) + mWifiOpenStatus.set(isWifiActive); + if (isWifiActive) { + this.getWifiConnectInfo(); + } else { + this.setDisconnectedStatus(); + } } - private updateWifiInfo(rssi=Constants.UPDATE_WIFI_INFO_DEFAULT_PARAM,band=Constants.SIGN_LEVEL) { - Log.showInfo(TAG, `enter changeWifiInfos ================ ${rssi}+${band}`); - mWifiInfo.set(this.getWifiInfo(rssi,band)) - Log.showInfo(TAG, `mWifiInfo wifiInfo ${mWifiInfo.get()}`); + getWifiConnectInfo() { + Log.showInfo(TAG, `getWifiConnectInfo`) + let isConnected = wifi.isConnected(); + Log.showInfo(TAG, `getWifiConnectInfo, isConnected: ${isConnected}`) + if (isConnected) { + mWifiStatus.set(true); + this.getLinkedInfo(); + } else { + this.setDisconnectedStatus(); + } } - private updateWifiName(name) { - Log.showInfo(TAG, `enter changeWifiNames ================ ${name}`); - mWifiName.set(name); + getLinkedInfo() { + Log.showInfo(TAG, `getLinkedInfo`) + wifi.getLinkedInfo((data) => { + Log.showInfo(TAG, `getLinkedInfo, data: ${JSON.stringify(data)}`) + if (data.connState == wifi.ConnState.CONNECTED) { + mWifiName.set(data.ssid); + let signalLevel = wifi.getSignalLevel(data.rssi, data.band); + Log.showInfo(TAG, `getLinkedInfo, signalLevel: ${signalLevel}`) + mWifiInfo.set(signalLevel); + } else { + this.setDisconnectedStatus(); + } + }); } - - /** - * Update the image of wifi status - * - * @param {number} rssi - the rssi number of the connected wifi - * @return {string} image used to show wifi status - */ - private getWifiInfo(rssi,band) { - //The current version keeps return 0 as result, set the level as 4(full level) by hand. - Log.showInfo(TAG, `getWifiImage enter =========`); - //Fake number of band and rssi for wifi signal level temporarily - let level = WifiInfo.getSignalLevel(rssi, band); - Log.showInfo(TAG, `wifi level = ${level}`); - return level; + setDisconnectedStatus() { + Log.showInfo(TAG, `setDisconnectedStatus`) + mWifiStatus.set(Constants.DEFAULT_WIFI_STATUS); + mWifiInfo.set(Constants.DEFAULT_WIFI_INFO); + mWifiName.set(Constants.DEFAULT_WIFI_NAME); } enableWifi() { - Log.showInfo(TAG, 'enableWifi ing'); - WifiInfo.enableWifi(); + Log.showInfo(TAG, 'enableWifi'); + let result = wifi.enableWifi(); + Log.showInfo(TAG, `enableWifi, result: ${result}`); } disableWifi() { - Log.showInfo(TAG, 'disableWifi ing'); - WifiInfo.disableWifi(); + Log.showInfo(TAG, 'disableWifi'); + let result = wifi.disableWifi(); + Log.showInfo(TAG, `disableWifi, result: ${result}`); } } let mWifiModel = new WifiModel(); -export default mWifiModel as WifiModel; + +export default mWifiModel as WifiModel; \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/element/float.json b/features/wificomponent/src/main/resources/base/element/float.json deleted file mode 100644 index e8bf0df9..00000000 --- a/features/wificomponent/src/main/resources/base/element/float.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "float": [ - { - "name": "WIFISTATUS_DISPLAY_HEIGHT", - "value": "50%" - },{ - "name": "WIFISTATUS_HIDDEN_HEIGHT", - "value": "0" - },{ - "name": "WIFISTATUS_MAXWIDTH", - "value": "42" - } - ] -} diff --git a/features/wificomponent/src/main/resources/base/element/string.json b/features/wificomponent/src/main/resources/base/element/string.json deleted file mode 100644 index 1a61a38a..00000000 --- a/features/wificomponent/src/main/resources/base/element/string.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "string": [ - { - "name": "wificomponent_MainAbility", - "value": "wificomponent_MainAbility" - }, - { - "name": "mainability_description", - "value": "ETS_Empty Feature Ability" - } - ] -} \ No newline at end of file diff --git a/product/navigationBar/src/main/ets/default/common/NavBarConfiguration.ets b/product/navigationBar/src/main/ets/default/common/NavBarConfiguration.ets index bab942a4..38e9bd2d 100644 --- a/product/navigationBar/src/main/ets/default/common/NavBarConfiguration.ets +++ b/product/navigationBar/src/main/ets/default/common/NavBarConfiguration.ets @@ -77,8 +77,8 @@ class NavBarConfiguration { statusShortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_portrait")); navShortSideLength = await ResourceUtil.getString($r("app.string.nav_bar_size_portrait")); } - statusShortSideLength = vp2px(parseInt(statusShortSideLength)) + ''; - navShortSideLength = vp2px(parseInt(navShortSideLength)) + ''; + statusShortSideLength = parseInt(statusShortSideLength) + ''; + navShortSideLength = parseInt(navShortSideLength) + ''; Log.showInfo(TAG, 'statusShortSideLength = ' + statusShortSideLength); Log.showInfo(TAG, 'navShortSideLength = ' + navShortSideLength); Log.showInfo(TAG, 'directionnav = ' + directionNav.direction); diff --git a/product/navigationBar/src/main/ets/default/pages/index.ets b/product/navigationBar/src/main/ets/default/pages/index.ets index 907cc5b6..0feb07bc 100644 --- a/product/navigationBar/src/main/ets/default/pages/index.ets +++ b/product/navigationBar/src/main/ets/default/pages/index.ets @@ -50,7 +50,7 @@ struct Index { } .width('100%') .height('100%') - .constraintSize({ minHeight: this.minNavHeight }) + .constraintSize({ minHeight: this.minNavHeight + 'px'}) .backgroundColor($r('app.color.index_background')) .padding(this.showNavHorizontal ? { left: '18%', right: '18%' } : { top: '18%', bottom: '18%' }) } diff --git a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets b/product/navigationBar/src/main/ets/default/pages/oneLayout.ets index 4171fc27..20b0a02d 100644 --- a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets +++ b/product/navigationBar/src/main/ets/default/pages/oneLayout.ets @@ -46,7 +46,7 @@ export default struct oneLayout { }) } .height('100%') - .constraintSize({ minHeight: this.minNavHeight }) + .constraintSize({ minHeight: this.minNavHeight + 'px'}) .align(Alignment.Center) }) } diff --git a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets b/product/navigationBar/src/main/ets/default/pages/threeLayout.ets index 7b1fb122..9027e19f 100644 --- a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets +++ b/product/navigationBar/src/main/ets/default/pages/threeLayout.ets @@ -53,7 +53,7 @@ struct threeLayout { keyButton({ uri: item.uri, keyCode: item.keyCode }) } .height('100%') - .constraintSize({ minHeight: this.minNavHeight }) + .constraintSize({ minHeight: this.minNavHeight + 'px'}) .align(Alignment.Center) }) } @@ -67,7 +67,7 @@ struct threeLayout { keyButton({ uri: item.uri, keyCode: item.keyCode }) } .width('100%') - .constraintSize({ minHeight: this.minNavHeight }) + .constraintSize({ minHeight: this.minNavHeight + 'px'}) .align(Alignment.Center) }) } diff --git a/product/navigationBar/src/main/resources/base/element/string.json b/product/navigationBar/src/main/resources/base/element/string.json index a13f1ef0..abe15793 100644 --- a/product/navigationBar/src/main/resources/base/element/string.json +++ b/product/navigationBar/src/main/resources/base/element/string.json @@ -2,11 +2,11 @@ "string": [ { "name": "nav_bar_size_portrait", - "value": "52" + "value": "102" }, { "name": "nav_bar_size_landscape", - "value": "52" + "value": "102" }, { "name": "nav_bar_position_portrait", @@ -22,11 +22,11 @@ }, { "name": "status_bar_size_portrait", - "value": "52" + "value": "102" }, { "name": "status_bar_size_landscape", - "value": "52" + "value": "102" }, { "name": "status_bar_position_portrait", diff --git a/product/navigationBar/src/main/resources/en_US/element/string.json b/product/navigationBar/src/main/resources/en_US/element/string.json index e40546fa..7cc208b4 100644 --- a/product/navigationBar/src/main/resources/en_US/element/string.json +++ b/product/navigationBar/src/main/resources/en_US/element/string.json @@ -2,11 +2,11 @@ "string": [ { "name": "nav_bar_size_portrait", - "value": "52" + "value": "102" }, { "name": "nav_bar_size_landscape", - "value": "52" + "value": "102" }, { "name": "nav_bar_position_portrait", @@ -22,11 +22,11 @@ }, { "name": "status_bar_size_portrait", - "value": "52" + "value": "102" }, { "name": "status_bar_size_landscape", - "value": "52" + "value": "102" }, { "name": "status_bar_position_portrait", diff --git a/product/navigationBar/src/main/resources/zh_CN/element/string.json b/product/navigationBar/src/main/resources/zh_CN/element/string.json index e40546fa..7cc208b4 100644 --- a/product/navigationBar/src/main/resources/zh_CN/element/string.json +++ b/product/navigationBar/src/main/resources/zh_CN/element/string.json @@ -2,11 +2,11 @@ "string": [ { "name": "nav_bar_size_portrait", - "value": "52" + "value": "102" }, { "name": "nav_bar_size_landscape", - "value": "52" + "value": "102" }, { "name": "nav_bar_position_portrait", @@ -22,11 +22,11 @@ }, { "name": "status_bar_size_portrait", - "value": "52" + "value": "102" }, { "name": "status_bar_size_landscape", - "value": "52" + "value": "102" }, { "name": "status_bar_position_portrait", diff --git a/product/statusbar/build.gradle b/product/statusbar/build.gradle index 0da4fa51..5fb63eff 100644 --- a/product/statusbar/build.gradle +++ b/product/statusbar/build.gradle @@ -18,8 +18,11 @@ dependencies { implementation project(':features:airplanecomponent') implementation project(':features:brightnesscomponent') implementation project(':features:wificomponent') + implementation project(':features:bluetoothcomponent') implementation project(':features:volumecomponent') implementation project(':features:batterycomponent') implementation project(':features:clockcomponent') implementation project(':features:noticeitem') + implementation project(':features:locationcomponent') + implementation project(':features:ringmodecomponent') } \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/control.ets b/product/statusbar/src/main/ets/default/pages/control.ets index 038f26e0..0cdb5357 100644 --- a/product/statusbar/src/main/ets/default/pages/control.ets +++ b/product/statusbar/src/main/ets/default/pages/control.ets @@ -17,7 +17,10 @@ import WindowManager from '../../../../../../../common/src/main/ets/default/Wind import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' +import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets' import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon.ets' +import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets' +import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets' import Log from '../../../../../../../common/src/main/ets/default/Log.ets' import Constants from './common/constants.ets' @@ -47,7 +50,7 @@ export default struct Control { ControlCenterComponent({ showStatusBar: $showStatusBar, mControlCenterComponentConfig: this.mControlCenterComponentConfig - }); + }) } .width('100%') .height('100%') @@ -85,11 +88,14 @@ struct statusBar { WifiIcon() } Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + LocationIcon() + BluetoothIcon() + RingModeIcon() BatteryIcon() ClockIcon() } } .width('100%') - .height(this.minHeight) + .height(this.minHeight + 'px') } } diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets index 4c0b8f5b..b85e8e89 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -133,7 +133,7 @@ struct Index { } .width('100%') .height('100%') - .constraintSize({ minHeight: this.StatusMinH }) + .constraintSize({ minHeight: this.StatusMinH + 'px'}) } touchEvent(event: TouchEvent) { diff --git a/product/statusbar/src/main/ets/default/pages/notification.ets b/product/statusbar/src/main/ets/default/pages/notification.ets index 604aa8b8..adf5094b 100644 --- a/product/statusbar/src/main/ets/default/pages/notification.ets +++ b/product/statusbar/src/main/ets/default/pages/notification.ets @@ -19,7 +19,10 @@ import FeatureAbilityManager from '../../../../../../../common/src/main/ets/defa import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' +import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets' import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon.ets' +import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets' +import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets' import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets' import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets' @@ -106,12 +109,15 @@ struct statusBar { } Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + LocationIcon() + BluetoothIcon() + RingModeIcon() BatteryIcon() ClockIcon() } } .width('100%') - .height(this.minHeight) + .height(this.minHeight + 'px') } } diff --git a/product/statusbar/src/main/resources/base/element/string.json b/product/statusbar/src/main/resources/base/element/string.json index 23f05f82..aef4538b 100644 --- a/product/statusbar/src/main/resources/base/element/string.json +++ b/product/statusbar/src/main/resources/base/element/string.json @@ -2,11 +2,11 @@ "string": [ { "name": "status_bar_size_portrait", - "value": "52" + "value": "102" }, { "name": "status_bar_size_landscape", - "value": "52" + "value": "102" }, { "name": "status_bar_position_portrait", diff --git a/product/statusbar/src/main/resources/en_US/element/string.json b/product/statusbar/src/main/resources/en_US/element/string.json index 22e3f6fe..16328465 100644 --- a/product/statusbar/src/main/resources/en_US/element/string.json +++ b/product/statusbar/src/main/resources/en_US/element/string.json @@ -2,11 +2,11 @@ "string": [ { "name": "status_bar_size_portrait", - "value": "52" + "value": "102" }, { "name": "status_bar_size_landscape", - "value": "52" + "value": "102" }, { "name": "status_bar_position_portrait", diff --git a/product/statusbar/src/main/resources/rawfile/controlcentercomponentConfig.json b/product/statusbar/src/main/resources/rawfile/controlcentercomponentConfig.json index 837b8691..bef77a0f 100644 --- a/product/statusbar/src/main/resources/rawfile/controlcentercomponentConfig.json +++ b/product/statusbar/src/main/resources/rawfile/controlcentercomponentConfig.json @@ -1,14 +1,19 @@ { "ComplexToggleLayout": [ "wifi", - "air_plane" + "bluetooth" ], "TempDBSimpleToggleLayout": [ + "ring_mode", + "location", "testid" ], "LocalToggles": [ "wifi", - "air_plane" + "bluetooth", + "air_plane", + "location", + "ring_mode" ], "MetaToggles": [ { diff --git a/product/statusbar/src/main/resources/rawfile/statusbarcomponentConfig.json b/product/statusbar/src/main/resources/rawfile/statusbarcomponentConfig.json index 0a3cbcce..e76d8f80 100644 --- a/product/statusbar/src/main/resources/rawfile/statusbarcomponentConfig.json +++ b/product/statusbar/src/main/resources/rawfile/statusbarcomponentConfig.json @@ -16,6 +16,9 @@ { "id": 3, "Components": [ + "location", + "bluetooth", + "ring_mode", "battery", "clock" ] @@ -28,8 +31,11 @@ "battery", "signal", "wifi", + "bluetooth", "capsule", - "notification" + "notification", + "location", + "ring_mode" ], "emptyPosition": { "x1": 0, diff --git a/product/statusbar/src/main/resources/zh_CN/element/string.json b/product/statusbar/src/main/resources/zh_CN/element/string.json index 23f05f82..aef4538b 100644 --- a/product/statusbar/src/main/resources/zh_CN/element/string.json +++ b/product/statusbar/src/main/resources/zh_CN/element/string.json @@ -2,11 +2,11 @@ "string": [ { "name": "status_bar_size_portrait", - "value": "52" + "value": "102" }, { "name": "status_bar_size_landscape", - "value": "52" + "value": "102" }, { "name": "status_bar_position_portrait", diff --git a/settings.gradle b/settings.gradle index 444824ff..57b50528 100755 --- a/settings.gradle +++ b/settings.gradle @@ -17,4 +17,5 @@ include ':entry', ':product:navigationBar', ':common', ':product:statusbar', ':p ':features:capsulecomponent', ':features:batterycomponent', ':features:clockcomponent', ':features:signalcomponent', ':features:wificomponent', ':features:navigationservice', ':features:noticeitem', ':features:airplanecomponent', ':features:brightnesscomponent', ':features:volumecomponent', ':features:managementcomponent', - ':features:statusbarcomponent', ':features:controlcentercomponent' \ No newline at end of file + ':features:statusbarcomponent', ':features:controlcentercomponent', ':features:bluetoothcomponent', ':features:locationcomponent', + ':features:ringmodecomponent' \ No newline at end of file -- Gitee From d228705e0247f2934555a7344e942478f16deef9 Mon Sep 17 00:00:00 2001 From: mamingshuai Date: Tue, 18 Jan 2022 06:30:43 +0000 Subject: [PATCH 045/373] Initial commit --- README.en.md | 36 ++++++++++++++++++++++++++++++++++++ README.md | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 README.en.md create mode 100644 README.md diff --git a/README.en.md b/README.en.md new file mode 100644 index 00000000..b31a50d2 --- /dev/null +++ b/README.en.md @@ -0,0 +1,36 @@ +# applications_screenlock + +#### Description +{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} + +#### Software Architecture +Software architecture description + +#### Installation + +1. xxxx +2. xxxx +3. xxxx + +#### Instructions + +1. xxxx +2. xxxx +3. xxxx + +#### Contribution + +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request + + +#### Gitee Feature + +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md new file mode 100644 index 00000000..7679d254 --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# applications_screenlock + +#### 介绍 +{**以下是 Gitee 平台说明,您可以替换此简介** +Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 +无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} + +#### 软件架构 +软件架构说明 + + +#### 安装教程 + +1. xxxx +2. xxxx +3. xxxx + +#### 使用说明 + +1. xxxx +2. xxxx +3. xxxx + +#### 参与贡献 + +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request + + +#### 特技 + +1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md +2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) +3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 +4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 +5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) +6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) -- Gitee From 93eb21b822f69fc99cd05126b2c67bc49078e4bb Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Tue, 18 Jan 2022 14:43:30 +0800 Subject: [PATCH 046/373] =?UTF-8?q?[SystemUI]=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=8F=E8=83=B6=E5=9B=8A=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .../main/ets/default/model/CapsuleModel.ets | 2 +- .../main/ets/default/pages/CapsuleIcon.ets | 2 +- .../default/viewmodel/CapsuleViewModel.ets | 45 ++++++++++++++----- .../main/resources/en_US/element/string.json | 4 ++ .../main/resources/zh_CN/element/string.json | 4 ++ .../ets/com/ohos/model/LocationService.ets | 10 ++++- .../ohos/noticeItem/viewmodel/ViewModel.ets | 2 +- .../src/main/ets/default/pages/index.ets | 2 +- 8 files changed, 53 insertions(+), 18 deletions(-) diff --git a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ets b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ets index eeaa2e07..7d1f2d07 100644 --- a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ets +++ b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ets @@ -19,7 +19,7 @@ import Log from '../../../../../../../common/src/main/ets/default/Log.ets' const TAG = 'CapsuleModel'; let commonEventSubscribeInfo = { - events: ['CAPSULE_VALUE_SYSTEM_UI'] + events: ['CAPSULE_EVENT_CALL_UI'] }; let commonEventSubscriber = null; diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index 34c0fb27..e7e8d8af 100644 --- a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -14,7 +14,7 @@ */ import Constants from '../common/constants.ets' -import CapsuleViewModel, {VIEW_MODEL_ID, CallType} from '../viewmodel/CapsuleViewModel.ets' +import CapsuleViewModel, {VIEW_MODEL_ID, CallState} from '../viewmodel/CapsuleViewModel.ets' import Log from '../../../../../../../common/src/main/ets/default/Log.ets' const TAG = "CapsuleIcon"; diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ets b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ets index 6999828a..cbfe8d72 100644 --- a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ets +++ b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ets @@ -34,16 +34,22 @@ function parseTime(num) { export const VIEW_MODEL_ID = "CapsuleViewModelVm"; -export enum CallType { - NO_CALL, - WAIT_CALL, - ON_CALL, +export enum CallState { + CALL_ACTIVE, //通话中* + CALL_HOLDING, //通话保持 + CALL_DIALING, //拨号开始 + CALL_ALERTING, //正在呼出 + CALL_INCOMING, //来电* + CALL_WAITING, //第三方来电* + CALL_DISCONNECTED, //挂断完成 * + CALL_DISCONNECTING, //正在挂断 + CALL_IDLE //空闲 } export default class CapsuleViewModel { mText: string = "00:00"; mStartTime: number = 0; - mCallType: CallType = CallType.NO_CALL; + mCallState: CallState = CallState.CALL_DISCONNECTED; mIsBackground: boolean = false; mWantBundleName: string = ""; mWantAbilityName: string = ""; @@ -62,7 +68,7 @@ export default class CapsuleViewModel { this.mIsBackground = data.isBackground; this.mWantBundleName = data.wantBundleName; this.mWantAbilityName = data.wantAbilityName; - if (data.callType == CallType.WAIT_CALL) { + if (data.callState == CallState.CALL_INCOMING || data.callState == CallState.CALL_WAITING) { this.mStartTime = 0; let id = JSON.parse(JSON.stringify($r("app.string.incoming_call"))).id; let resourceMgr = Rsm.getResourceManager('com.ohos.systemui'); @@ -75,12 +81,12 @@ export default class CapsuleViewModel { Log.showInfo(TAG, 'getStringById err : ' + JSON.stringify(err)); }); }); - } else if (data.callType == CallType.ON_CALL) { + } else if (data.callState == CallState.CALL_ACTIVE) { clearTimeout(this.mTimeMeter); - if (this.mCallType != CallType.ON_CALL) { + if (this.mCallState != CallState.CALL_ACTIVE) { this.mStartTime = new Date().valueOf(); } - this.mCallType = data.callType; + this.mCallState = data.callState; let startTime; let commonTimeDiff = new Date().valueOf() - data.startTime; @@ -96,18 +102,33 @@ export default class CapsuleViewModel { } this.startUpdateTime(startTime); - } else { + } else if (data.callState == CallState.CALL_DISCONNECTED){ clearTimeout(this.mTimeMeter); this.mStartTime = 0; this.mIsBackground = false; this.mText = ""; Log.showInfo(TAG, `cannot show`); + } else { + this.mStartTime = 0; + let id = JSON.parse(JSON.stringify($r("app.string.communicate_by_phone"))).id; + let resourceMgr = Rsm.getResourceManager('com.ohos.systemui'); + resourceMgr.then((result) => { + result.getString(id).then((resource) => { + this.mText = resource; + Log.showInfo(TAG, 'getStringById resource : ' + resource); + }) + + + .catch((err) => { + Log.showInfo(TAG, 'getStringById err : ' + JSON.stringify(err)); + }); + }); } - this.mCallType = data.callType; + this.mCallState = data.callState; } startUpdateTime(startTime) { - if (!this.mIsBackground || this.mCallType != CallType.ON_CALL) { + if (!this.mIsBackground || this.mCallState != CallState.CALL_ACTIVE) { return; } let val = new Date().valueOf() - startTime.valueOf(); diff --git a/features/capsulecomponent/src/main/resources/en_US/element/string.json b/features/capsulecomponent/src/main/resources/en_US/element/string.json index a97527e4..aa63e2b5 100644 --- a/features/capsulecomponent/src/main/resources/en_US/element/string.json +++ b/features/capsulecomponent/src/main/resources/en_US/element/string.json @@ -3,6 +3,10 @@ { "name": "incoming_call", "value": "Incoming call" + }, + { + "name": "communicate_by_phone", + "value": "communicate" } ] } \ No newline at end of file diff --git a/features/capsulecomponent/src/main/resources/zh_CN/element/string.json b/features/capsulecomponent/src/main/resources/zh_CN/element/string.json index 96a9b595..dcd9c954 100644 --- a/features/capsulecomponent/src/main/resources/zh_CN/element/string.json +++ b/features/capsulecomponent/src/main/resources/zh_CN/element/string.json @@ -3,6 +3,10 @@ { "name": "incoming_call", "value": "来电" + }, + { + "name": "communicate_by_phone", + "value": "通话" } ] } \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ets b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ets index 004f1bf0..b43c0ba2 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ets @@ -14,7 +14,6 @@ */ import geolocation from '@ohos.geolocation'; -import {LocationEventListener} from '@ohos.geolocation'; import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; const TAG = 'LocationModel'; @@ -22,13 +21,20 @@ const TAG = 'LocationModel'; export class LocationService { mIsStart: boolean = false; mListener: any; - mLocationEventListener = new LocationEventListener(); + mLocationEventListener = geolocation?. LocationEventListener ? new (geolocation?.LocationEventListener)() : + { + on: (...args) => { + }, + off: (...args) => { + } + }; startService() { if (this.mIsStart) { return; } Log.showInfo(TAG, `startService`) + Log.showInfo(TAG, `LocationEventListener = ` + geolocation.LocationEventListener) this.mIsStart = true; this.getServiceState(); this.mLocationEventListener.on('locationServiceState', (state) => { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets index 588a696b..55335c7a 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets @@ -42,7 +42,7 @@ export class ViewModel { constructor() { this.mNotificationList = AppStorage.SetAndLink('notificationList', []).get(); this.audioPlayer = media.createAudioPlayer(); - this.audioPlayer.src = 'file://system/etc/capture.ogg'; +// this.audioPlayer.src = 'file://system/etc/capture.ogg'; SwitchUserManager.getInstance().registerListener(this); this.initFlowControlInfos(); SwitchUserManager.getInstance().getCurrentUserInfo().then((userInfo) => { diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/statusbar/src/main/ets/default/pages/index.ets index b85e8e89..4ac78b95 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/statusbar/src/main/ets/default/pages/index.ets @@ -95,7 +95,7 @@ struct Index { } onStateChange(data) { - if (this.ableToMaximize) { + if (this.ableToMaximize && !this.showStatusBar) { this.showStatusBar = true; mWindowManager.setWindowMin((result) => { }) -- Gitee From 637fd1f872957a28bcace1c05dc279f695a77ae3 Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Thu, 20 Jan 2022 15:11:39 +0800 Subject: [PATCH 047/373] =?UTF-8?q?[SystemUI]=20=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=A0=8F=E6=8E=A5=E5=85=A5=E5=9B=BE=E6=A0=87=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83=E9=80=82=E9=85=8D=E5=A4=9A?= =?UTF-8?q?=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .../PluginDataSourceAdapter.ets | 4 ++-- .../PluginDataSourceManager.ets | 4 ++-- .../sourceloader/BaseMetaSourceLoader.ets | 10 ++++++---- .../sourceloader/PluginSourceLoader.ets | 2 +- .../sourceloader/SourceLoader.ets | 2 +- .../src/main/ets/default/brightnessManager.ets | 8 ++++---- .../src/main/ets/default/common/constants.ets | 1 - .../src/main/ets/default/pages/CapsuleIcon.ets | 4 ++-- .../src/main/ets/default/timeModel.ets | 4 ++-- .../ets/com/ohos/model/ControlCenterService.ets | 17 +++++++++++++++-- .../ets/com/ohos/model/StatusBarService.ets | 17 +++++++++++++++-- .../src/main/ets/default/VolumeModel.ets | 8 ++++---- .../default/workers/PluginDataSourceWorker.js | 6 +++--- 13 files changed, 57 insertions(+), 30 deletions(-) diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets index 57d5e9f9..7abf6e98 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets @@ -43,9 +43,9 @@ export default class PluginDataSourceAdapter { this.mWorker.postMessage(obtainMsg(Constants.INIT_CONFIG, configs)); } - loadData() { + loadData(userId) { Log.showInfo(TAG, `loadData`) - this.mWorker.postMessage(obtainMsg(Constants.LOAD_DATA, {})); + this.mWorker.postMessage(obtainMsg(Constants.LOAD_DATA, userId)); } clearAll() { diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ets b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ets index 6ba6b518..97bb4f25 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ets +++ b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ets @@ -53,10 +53,10 @@ export default class PluginDataSourceManager { this.mLoaders.clear(); } - loadData() { + loadData(userId) { Log.showInfo(TAG, `loadData`); this.mLoaders.forEach((sourceLoader) => { - sourceLoader.loadData(); + sourceLoader.loadData(userId); }); } } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/BaseMetaSourceLoader.ets b/common/src/main/ets/plugindatasource/sourceloader/BaseMetaSourceLoader.ets index ec672226..977c1767 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/BaseMetaSourceLoader.ets +++ b/common/src/main/ets/plugindatasource/sourceloader/BaseMetaSourceLoader.ets @@ -37,6 +37,7 @@ export default abstract class BaseMetaSourceLoader extends SourceLoader { mPluginType: number = null; mItemComponentDatas: ItemComponentData[] = []; mCommonEventSubscriber = null; + mUserId: string = null; constructor(config, channel, pluginType) { super(channel); @@ -65,8 +66,9 @@ export default abstract class BaseMetaSourceLoader extends SourceLoader { this.removeAllItemComponentData(); } - loadData() { - Log.showInfo(TAG, `load loader`) + loadData(userId) { + Log.showInfo(TAG, `load loader userId = ` + userId) + this.mUserId = userId; this.removeAllItemComponentData(); this.addAbilityItemComponentData({ "action": this.mAction @@ -118,8 +120,8 @@ export default abstract class BaseMetaSourceLoader extends SourceLoader { } addAbilityItemComponentData(want): void{ - Log.showInfo(TAG, `addAbilityItemComponentData, want: ${JSON.stringify(want)} BundleFlag: ${Constants.DEFAULT_BUNDLE_FLAG}`); - bundleManager.queryAbilityByWant(want, Constants.DEFAULT_BUNDLE_FLAG, Constants.DEFAULT_USER_ID, + Log.showInfo(TAG, `addAbilityItemComponentData, want: ${JSON.stringify(want)} BundleFlag: ${Constants.DEFAULT_BUNDLE_FLAG}this.mUserId:${this.mUserId}`); + bundleManager.queryAbilityByWant(want, Constants.DEFAULT_BUNDLE_FLAG, this.mUserId ? this.mUserId : Constants.DEFAULT_USER_ID, (err, abilityInfos) => { Log.showInfo(TAG, `addAbilityItemComponentData queryAbilityByWant callback, want: ${JSON.stringify(want)} err: ${JSON.stringify(err)} abilityInfos: ${abilityInfos.length} ${JSON.stringify(abilityInfos)} `) if (err != 0) { diff --git a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ets b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ets index 01bd5c60..866e509d 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ets +++ b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ets @@ -34,7 +34,7 @@ export default class PluginSourceLoader extends SourceLoader { // todo 停止监听,清除数据 } - loadData() { + loadData(userId) { // todo 重新获取一次数据 } } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ets b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ets index 2707e4e6..6405beaf 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ets +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ets @@ -28,7 +28,7 @@ export default abstract class SourceLoader { abstract stopLoad(): void; - abstract loadData(): void; + abstract loadData(userId): void; addItem(itemData: ItemComponentData) { Log.showInfo(TAG, `addItem, itemData: ${JSON.stringify(itemData)}`) diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets index 078d206a..cd60e248 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets @@ -28,7 +28,7 @@ export class brightnessManager { init(): void{ Log.showInfo(TAG, 'init'); - this.uri = settings.getUriSync(SYSTEMUI_BRIGHTNESS); + this.uri = settings.getUri(SYSTEMUI_BRIGHTNESS); Log.showInfo(TAG, 'settings geturi of brightness is ' + this.uri); this.helper = featureAbility.acquireDataAbilityHelper(this.uri); this.getValue(); @@ -36,7 +36,7 @@ export class brightnessManager { registerBrightness() { this.helper.on("dataChange", this.uri, (err) => { - let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '150') + let data = settings.getValue(this.helper, SYSTEMUI_BRIGHTNESS, '150') Log.showInfo(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); }) @@ -50,7 +50,7 @@ export class brightnessManager { getValue() { Log.showInfo(TAG, 'getValue'); - let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '150'); + let data = settings.getValue(this.helper, SYSTEMUI_BRIGHTNESS, '150'); Log.showInfo(TAG, `settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); } @@ -61,7 +61,7 @@ export class brightnessManager { Log.showInfo(TAG, `setValue ${value}`); mBrightnessValue.set(value); Log.showInfo(TAG, `brightness setValue ${value} end`); - settings.setValueSync(this.helper, SYSTEMUI_BRIGHTNESS, callback.value.toString()); + settings.setValue(this.helper, SYSTEMUI_BRIGHTNESS, callback.value.toString()); Log.showInfo(TAG, `settings setValue ${callback.value} end`); } } diff --git a/features/capsulecomponent/src/main/ets/default/common/constants.ets b/features/capsulecomponent/src/main/ets/default/common/constants.ets index 60fe5aa2..4a3aeb16 100644 --- a/features/capsulecomponent/src/main/ets/default/common/constants.ets +++ b/features/capsulecomponent/src/main/ets/default/common/constants.ets @@ -20,5 +20,4 @@ export default class Constants { static TOUCH_TYPE_UP: number = 1; static TOUCH_TYPE_MOVE: number = 2; static DEFAULT_MAX_LINES: number= 1; - static CAPSULE_HEIGHT_MULTIPLE = 2; } diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index e7e8d8af..a3a52457 100644 --- a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -59,10 +59,10 @@ export default struct CapsuleIcon { } .alignItems(VerticalAlign.Center) .margin({ left: $r("app.float.green_capsule_left_margin") }) - .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient * Constants.CAPSULE_HEIGHT_MULTIPLE) + .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) .backgroundColor($r('app.color.background_color')) .borderRadius($r('app.float.green_capsule_radius')) - .visibility(this.mCapsuleViewModel.mIsBackground ? Visibility.Visible : Visibility.Hidden) + .visibility(this.mCapsuleViewModel.mIsBackground ? Visibility.Visible : Visibility.None) .onTouch(this.touchEvent.bind(this)) } diff --git a/features/clockcomponent/src/main/ets/default/timeModel.ets b/features/clockcomponent/src/main/ets/default/timeModel.ets index 1ef19786..988ed82a 100644 --- a/features/clockcomponent/src/main/ets/default/timeModel.ets +++ b/features/clockcomponent/src/main/ets/default/timeModel.ets @@ -51,7 +51,7 @@ export class TimeModel { let urivar = null; let helper = null; try { - urivar = settings.getUriSync('settings.time.format') + urivar = settings.getUri('settings.time.format') helper = featureAbility.acquireDataAbilityHelper(urivar); } catch (e) { Log.showInfo(TAG, `settings getValue error: ${e.toString()}`); @@ -62,7 +62,7 @@ export class TimeModel { Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); return; } else { - let getRetValue = settings.getValueSync(helper, 'settings.time.format', '24') + let getRetValue = settings.getValue(helper, 'settings.time.format', '24') Log.showInfo(TAG, 'observer reveive notifychange on success format = ' + getRetValue) if (getRetValue === '12') { misUsing24hFormat = false; diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ets b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ets index aab04220..ae4397a3 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ets @@ -15,6 +15,7 @@ import Resmgr from '@ohos.resourceManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import SwitchUserManager from '../../../../../../../../common/src/main/ets/default/SwitchUserManager.ets'; import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; import PluginDataSourceAdapter from '../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets'; import Constants from '../common/Constants.ets'; @@ -47,6 +48,7 @@ export class ControlCenterService { 'addItem': this.onItemAdd.bind(this), 'removeItem': this.onItemRemove.bind(this) }); + SwitchUserManager.getInstance().registerListener(this); { CONTROLCENTER_SOURCE_CONFIG.MetaSource.filterIds = filterIds; } @@ -63,9 +65,20 @@ export class ControlCenterService { this?.mAdapter.clearAll(); } - loadData() { + userChange(userInfo) { + Log.showInfo(TAG, `userChange userInfo ` + userInfo); + this.loadData(userInfo.userId); + } + + loadData(userId) { Log.showInfo(TAG, `loadData`) - this.mAdapter.loadData(); + if (userId === null || userId === undefined) { + SwitchUserManager.getInstance().getCurrentUserInfo().then((userInfo) => { + this.mAdapter.loadData(userInfo.userId); + }); + } else { + this.mAdapter.loadData(userId); + } } registerListener(listener: { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ets b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ets index 100f7f57..41c3c440 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ets @@ -15,6 +15,7 @@ import Resmgr from '@ohos.resourceManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import SwitchUserManager from '../../../../../../../../common/src/main/ets/default/SwitchUserManager.ets'; import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; import PluginDataSourceAdapter from '../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets'; import Constants from '../common/Constants.ets'; @@ -51,6 +52,7 @@ export class StatusBarService { 'addItem': this.onItemAdd.bind(this), 'removeItem': this.onItemRemove.bind(this) }); + SwitchUserManager.getInstance().registerListener(this); { STATUSBAR_SOURCE_CONFIG.MetaSource.filterIds = filterIds; } @@ -67,9 +69,20 @@ export class StatusBarService { this?.mAdapter.clearAll(); } - loadData() { + userChange(userInfo) { + Log.showInfo(TAG, `userChange userInfo ` + userInfo); + this.loadData(userInfo.userId); + } + + loadData(userId) { Log.showInfo(TAG, `loadData`) - this.mAdapter.loadData(); + if (userId === null || userId === undefined) { + SwitchUserManager.getInstance().getCurrentUserInfo().then((userInfo) => { + this.mAdapter.loadData(userInfo.userId); + }); + } else { + this.mAdapter.loadData(userId); + } } registerListener(listener: { diff --git a/features/volumecomponent/src/main/ets/default/VolumeModel.ets b/features/volumecomponent/src/main/ets/default/VolumeModel.ets index 19dd7593..49a47cf7 100644 --- a/features/volumecomponent/src/main/ets/default/VolumeModel.ets +++ b/features/volumecomponent/src/main/ets/default/VolumeModel.ets @@ -28,7 +28,7 @@ export class VolumeModel { init(): void{ Log.showInfo(TAG, 'init'); - this.uri = settings.getUriSync(SYSTEMUI_AUDIOVOLUMETYPE_MEDIA); + this.uri = settings.getUri(SYSTEMUI_AUDIOVOLUMETYPE_MEDIA); Log.showInfo(TAG, 'settings geturi of audio.AudioVolumeType.MEDIA is ' + this.uri); this.helper = featureAbility.acquireDataAbilityHelper(this.uri); this.getVolume(); @@ -36,7 +36,7 @@ export class VolumeModel { registerVolume() { this.helper.on("dataChange", this.uri, (err) => { - let data = settings.getValueSync(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, '5') + let data = settings.getValue(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, '5') Log.showInfo(TAG, `after audio.AudioVolumeType.MEDIA datachange settings getValue ${parseInt(data)}`); mVolumeValue.set(parseInt(data)); }) @@ -54,13 +54,13 @@ export class VolumeModel { Log.showInfo(TAG, `setVolume ${value}`); mVolumeValue.set(value); Log.showInfo(TAG, `mVolumeValue setVolume ${value} end`); - settings.setValueSync(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, callback.value.toString()); + settings.setValue(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, callback.value.toString()); Log.showInfo(TAG, `settings setVolume ${callback.value} end`); } getVolume() { Log.showInfo(TAG, 'getVolume'); - let data = settings.getValueSync(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, '5'); + let data = settings.getValue(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, '5'); Log.showInfo(TAG, `settings getVolume ${parseInt(data)}`); mVolumeValue.set(parseInt(data)); } diff --git a/product/statusbar/src/main/ets/default/workers/PluginDataSourceWorker.js b/product/statusbar/src/main/ets/default/workers/PluginDataSourceWorker.js index 069bf5f2..4b3d78f1 100644 --- a/product/statusbar/src/main/ets/default/workers/PluginDataSourceWorker.js +++ b/product/statusbar/src/main/ets/default/workers/PluginDataSourceWorker.js @@ -36,7 +36,7 @@ parentPort.onmessage = (msg) => { clearAll(); break; case Constants.LOAD_DATA: - loadData(); + loadData(data.data); break; default: Log.showError(TAG, `onMessage, unknown action type.`); @@ -63,9 +63,9 @@ function clearAll() { sManager?.clearAll(); } -function loadData() { +function loadData(userId) { Log.showInfo(TAG, `loadData `); - sManager?.loadData(); + sManager?.loadData(userId); } parentPort.onclose = function () { -- Gitee From 9929014b16940d9fdd4604f865fbb9b66ee2b6c3 Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Thu, 20 Jan 2022 17:04:35 +0800 Subject: [PATCH 048/373] =?UTF-8?q?[SystemUI]=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=8F=E7=94=B5=E8=AF=9D=E8=83=B6=E5=9B=8A?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .../src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets index 5168ff5e..f5ee18a9 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets @@ -39,7 +39,7 @@ type NotificationContent = { async function getUserId(uid) { Log.showInfo(TAG, `getOsAccountLocalIdFromUid request.creatorUid = ${uid}`); let userId = 0; - //todo userId = AccountManager.getAccountManager().getOsAccountLocalIdFromUid(uid) + userId = await AccountManager.getAccountManager().getOsAccountLocalIdFromUid(uid); Log.showInfo(TAG, `getOsAccountLocalIdFromUid userId = ${userId}`); return userId; } -- Gitee From b4fa204ba68c0be3ae2a873b06a7512ace43dd6f Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Thu, 20 Jan 2022 17:17:19 +0800 Subject: [PATCH 049/373] =?UTF-8?q?[SystemUI]=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=8F=E7=94=B5=E8=AF=9D=E8=83=B6=E5=9B=8A?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .../capsulecomponent/src/main/ets/default/common/constants.ets | 1 + .../capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/features/capsulecomponent/src/main/ets/default/common/constants.ets b/features/capsulecomponent/src/main/ets/default/common/constants.ets index 4a3aeb16..60fe5aa2 100644 --- a/features/capsulecomponent/src/main/ets/default/common/constants.ets +++ b/features/capsulecomponent/src/main/ets/default/common/constants.ets @@ -20,4 +20,5 @@ export default class Constants { static TOUCH_TYPE_UP: number = 1; static TOUCH_TYPE_MOVE: number = 2; static DEFAULT_MAX_LINES: number= 1; + static CAPSULE_HEIGHT_MULTIPLE = 2; } diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index a3a52457..7b0ee621 100644 --- a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -59,7 +59,7 @@ export default struct CapsuleIcon { } .alignItems(VerticalAlign.Center) .margin({ left: $r("app.float.green_capsule_left_margin") }) - .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) + .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient * Constants.CAPSULE_HEIGHT_MULTIPLE + 'px') .backgroundColor($r('app.color.background_color')) .borderRadius($r('app.float.green_capsule_radius')) .visibility(this.mCapsuleViewModel.mIsBackground ? Visibility.Visible : Visibility.None) -- Gitee From c54c0367137e8b170e90053453cb95c9bc933cbe Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Fri, 21 Jan 2022 15:17:53 +0800 Subject: [PATCH 050/373] =?UTF-8?q?[SystemUI]=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=8F=E8=83=B6=E5=9B=8A=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=AF=BC=E8=88=AA?= =?UTF-8?q?=E6=A0=8F=E7=8A=B6=E6=80=81=E6=A0=8F=E7=AA=97=E5=8F=A3=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- ...lCenterComplexToggleBluetoothComponent.ets | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets index 90834ed0..f8e66d03 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets @@ -60,24 +60,24 @@ export default struct ControlCenterComplexToggleBluetoothComponent { mClickEvent() { Log.showInfo(TAG, `mClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`) - if (this.BluetoothOpenStatus) { - ViewModel.disableBluetooth() - } else { - ViewModel.enableBluetooth() - } +// if (this.BluetoothOpenStatus) { +// ViewModel.disableBluetooth() +// } else { +// ViewModel.enableBluetooth() +// } } mLongClickEvent() { Log.showInfo(TAG, `mLongClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`) - this.showStatusBar = true - this.mWindowManager.setWindowMin((result) => { - this.mFeatureAbilityManager.openAbility(TAG, { - want: { - bundleName: 'com.ohos.settings', - abilityName: 'com.ohos.settings.MainAbility', - } - }) - }) +// this.showStatusBar = true +// this.mWindowManager.setWindowMin((result) => { +// this.mFeatureAbilityManager.openAbility(TAG, { +// want: { +// bundleName: 'com.ohos.settings', +// abilityName: 'com.ohos.settings.MainAbility', +// } +// }) +// }) } } \ No newline at end of file -- Gitee From 3968f3dd2fb79daf8598dbe17cd2eeadf960460d Mon Sep 17 00:00:00 2001 From: zhuchengfeng <940848916@qq.com> Date: Tue, 8 Mar 2022 16:45:48 +0800 Subject: [PATCH 051/373] sig Signed-off-by: zhuchengfeng <940848916@qq.com> --- .gitattributes | 15 + .gitignore | 11 + README.md | 39 -- README_zh.md | 46 +++ build.gradle | 40 ++ common/build.gradle | 21 ++ common/src/main/config.json | 24 ++ .../src/main/ets/default/CheckEmptyUtils.ets | 47 +++ .../src/main/ets/default/DateTimeCommon.ets | 84 +++++ common/src/main/ets/default/Log.ets | 52 +++ .../src/main/ets/default/ReadConfigUtil.ets | 49 +++ .../src/main/ets/default/ScreenLockCommon.ets | 47 +++ common/src/main/ets/default/WindowManager.ets | 87 +++++ .../default/abilitymanager/bundleManager.ets | 34 ++ .../abilitymanager/featureAbilityManager.ets | 66 ++++ .../abilitymanager/notificationManager.ets | 54 +++ .../main/resources/base/element/string.json | 40 ++ entry/.gitignore | 2 + entry/build.gradle | 22 ++ entry/proguard-rules.pro | 1 + entry/src/main/config.json | 64 ++++ entry/src/main/ets/AbilityStage.ts | 25 ++ entry/src/main/ets/MainAbility/MainAbility.ts | 43 +++ entry/src/main/ets/MainAbility/app.ets | 23 ++ .../src/main/ets/MainAbility/pages/index.ets | 28 ++ .../main/resources/base/element/string.json | 12 + entry/src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes features/batterycomponent/.gitignore | 1 + features/batterycomponent/build.gradle | 19 + .../batterycomponent/src/main/config.json | 23 ++ .../main/ets/com/ohos/common/constants.ets | 48 +++ .../src/main/ets/default/app.ets | 23 ++ .../src/main/ets/default/batteryModel.ets | 152 ++++++++ .../src/main/ets/default/common/constants.ets | 48 +++ .../main/ets/default/pages/batteryIcon.ets | 59 +++ .../src/main/ets/default/pages/batteryPic.ets | 76 ++++ .../src/main/ets/default/pages/batterySoc.ets | 39 ++ .../main/resources/base/element/color.json | 20 + .../main/resources/base/element/float.json | 36 ++ .../main/resources/base/element/string.json | 12 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 12 + .../main/resources/zh_CN/element/string.json | 12 + features/noticeitem/build.gradle | 20 + features/noticeitem/src/main/config.json | 24 ++ .../com/ohos/noticeItem/common/constants.ets | 76 ++++ .../com/ohos/noticeItem/item/basicItem.ets | 41 ++ .../ets/com/ohos/noticeItem/item/longItem.ets | 44 +++ .../com/ohos/noticeItem/item/multiItem.ets | 52 +++ .../ohos/noticeItem/item/notificationItem.ets | 224 +++++++++++ .../com/ohos/noticeItem/item/titleItem.ets | 89 +++++ .../noticeItem/model/NotificationConfig.ets | 36 ++ .../noticeItem/model/NotificationManager.ets | 54 +++ .../noticeItem/model/NotificationService.ets | 135 +++++++ .../ohos/noticeItem/model/ParseDataUtil.ets | 164 ++++++++ .../com/ohos/noticeItem/model/RuleData.ets | 21 ++ .../noticeItem/model/rule/RuleController.ets | 119 ++++++ .../view/NotificationListComponent.ets | 74 ++++ .../ohos/noticeItem/view/item/basicItem.ets | 40 ++ .../noticeItem/view/item/confirmDialog.ets | 80 ++++ .../ohos/noticeItem/view/item/longItem.ets | 43 +++ .../ohos/noticeItem/view/item/multiItem.ets | 51 +++ .../noticeItem/view/item/notificationItem.ets | 227 +++++++++++ .../noticeItem/view/item/settingDialog.ets | 131 +++++++ .../ohos/noticeItem/view/item/titleItem.ets | 88 +++++ .../ohos/noticeItem/viewmodel/ViewModel.ets | 314 +++++++++++++++ .../main/resources/base/element/color.json | 36 ++ .../main/resources/base/element/float.json | 148 ++++++++ .../main/resources/base/element/string.json | 36 ++ .../src/main/resources/base/media/delete.png | Bin 0 -> 4061 bytes .../base/media/ic_notification_down.png | Bin 0 -> 204 bytes .../base/media/ic_notification_up.png | Bin 0 -> 204 bytes .../main/resources/base/media/ic_setting.png | Bin 0 -> 2788 bytes .../main/resources/en_US/element/string.json | 36 ++ .../resources/rawfile/notificationConfig.json | 8 + .../main/resources/zh_CN/element/string.json | 36 ++ features/notificationservice/build.gradle | 19 + .../notificationservice/src/main/config.json | 23 ++ .../NotificationService.ets | 357 ++++++++++++++++++ .../notificationservice/common/constants.ets | 40 ++ .../main/resources/base/element/string.json | 8 + features/screenlock/build.gradle | 22 ++ features/screenlock/src/main/config.json | 23 ++ .../main/ets/com/ohos/common/constants.ets | 65 ++++ .../src/main/ets/com/ohos/data/userData.ets | 20 + .../main/ets/com/ohos/model/accountsModel.ets | 103 +++++ .../ets/com/ohos/model/screenLockModel.ets | 230 +++++++++++ .../ets/com/ohos/model/screenLockService.ets | 232 ++++++++++++ .../ets/com/ohos/model/screenlockStyle.ets | 54 +++ .../ets/com/ohos/view/component/accounts.ets | 78 ++++ .../com/ohos/view/component/batterySoc.ets | 36 ++ .../ets/com/ohos/view/component/customPSD.ets | 99 +++++ .../ets/com/ohos/view/component/dateTime.ets | 62 +++ .../com/ohos/view/component/digitalPSD.ets | 84 +++++ .../ets/com/ohos/view/component/lockIcon.ets | 52 +++ .../ets/com/ohos/view/component/mixedPSD.ets | 90 +++++ .../com/ohos/view/component/numkeyBoard.ets | 134 +++++++ .../ets/com/ohos/view/component/shortcut.ets | 114 ++++++ .../ets/com/ohos/view/component/statusBar.ets | 38 ++ .../ets/com/ohos/view/component/wallpaper.ets | 37 ++ .../ets/com/ohos/vm/accountsViewModel.ets | 37 ++ .../main/ets/com/ohos/vm/baseViewModel.ets | 108 ++++++ .../ets/com/ohos/vm/batterySocViewModel.ets | 33 ++ .../ets/com/ohos/vm/customPSDViewModel.ets | 100 +++++ .../ets/com/ohos/vm/dateTimeViewModel.ets | 77 ++++ .../ets/com/ohos/vm/digitalPSDViewModel.ets | 96 +++++ .../ets/com/ohos/vm/lockIconViewModel.ets | 48 +++ .../ets/com/ohos/vm/mixedPSDViewModel.ets | 65 ++++ .../ets/com/ohos/vm/wallpaperViewModel.ets | 36 ++ .../main/resources/base/element/color.json | 48 +++ .../main/resources/base/element/float.json | 193 ++++++++++ .../main/resources/base/element/string.json | 68 ++++ .../main/resources/base/media/delete_all.png | Bin 0 -> 4061 bytes .../base/media/ic_public_lock_filled.svg | 13 + .../base/media/ic_public_unlock_filled.svg | 13 + .../resources/base/media/ic_user_portrait.svg | 16 + .../src/main/resources/base/media/lock.png | Bin 0 -> 4173 bytes .../src/main/resources/base/media/reboot.svg | 30 ++ .../main/resources/base/media/shutdown.svg | 14 + .../src/main/resources/base/media/unlock.png | Bin 0 -> 4458 bytes .../main/resources/en_US/element/string.json | 68 ++++ .../src/main/resources/rawfile/antiTouch.json | 3 + .../main/resources/rawfile/screenlock.json | 3 + .../main/resources/zh_CN/element/string.json | 69 ++++ figures/screenlock.png | Bin 0 -> 27998 bytes gradle.properties | 10 + gradlew | 183 +++++++++ gradlew.bat | 103 +++++ infra/config_exts.gradle | 6 + mgit.info | 1 + product/pc/build.gradle | 24 ++ product/pc/src/main/config.json | 77 ++++ product/pc/src/main/ets/AbilityStage.ts | 25 ++ .../ServiceExtAbility/ServiceExtAbility.ts | 59 +++ .../pc/src/main/ets/ServiceExtAbility/app.ets | 26 ++ .../ServiceExtAbility/common/constants.ets | 30 ++ .../pages/customPassword.ets | 48 +++ .../pages/customscreenlock.ets | 37 ++ .../pages/digitalPassword.ets | 48 +++ .../ets/ServiceExtAbility/pages/index.ets | 63 ++++ .../pages/journalscreenlock.ets | 37 ++ .../ServiceExtAbility/pages/mixedPassword.ets | 48 +++ .../pages/slidescreenlock.ets | 88 +++++ .../ServiceExtAbility/vm/indexViewModel.ets | 47 +++ .../vm/slideScreenLockViewModel.ets | 63 ++++ .../main/resources/base/element/color.json | 16 + .../main/resources/base/element/float.json | 25 ++ .../main/resources/base/element/string.json | 16 + .../pc/src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 16 + .../main/resources/zh_CN/element/string.json | 16 + product/phone/build.gradle | 24 ++ product/phone/src/main/config.json | 76 ++++ product/phone/src/main/ets/AbilityStage.ts | 25 ++ .../ServiceExtAbility/ServiceExtAbility.ts | 59 +++ .../src/main/ets/ServiceExtAbility/app.ets | 26 ++ .../ServiceExtAbility/common/constants.ets | 34 ++ .../pages/customscreenlock.ets | 37 ++ .../pages/digitalPassword.ets | 48 +++ .../ets/ServiceExtAbility/pages/index.ets | 63 ++++ .../pages/journalscreenlock.ets | 37 ++ .../ServiceExtAbility/pages/mixedPassword.ets | 48 +++ .../pages/slidescreenlock.ets | 74 ++++ .../ServiceExtAbility/vm/indexViewModel.ets | 47 +++ .../vm/slideScreenLockViewModel.ets | 60 +++ .../main/resources/base/element/color.json | 12 + .../main/resources/base/element/string.json | 20 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 20 + .../main/resources/zh_CN/element/string.json | 20 + settings.gradle | 18 + signature/screenlock.p7b | Bin 0 -> 3438 bytes 172 files changed, 8982 insertions(+), 39 deletions(-) create mode 100644 .gitattributes create mode 100644 .gitignore delete mode 100644 README.md create mode 100644 README_zh.md create mode 100644 build.gradle create mode 100644 common/build.gradle create mode 100644 common/src/main/config.json create mode 100644 common/src/main/ets/default/CheckEmptyUtils.ets create mode 100644 common/src/main/ets/default/DateTimeCommon.ets create mode 100644 common/src/main/ets/default/Log.ets create mode 100644 common/src/main/ets/default/ReadConfigUtil.ets create mode 100644 common/src/main/ets/default/ScreenLockCommon.ets create mode 100644 common/src/main/ets/default/WindowManager.ets create mode 100644 common/src/main/ets/default/abilitymanager/bundleManager.ets create mode 100644 common/src/main/ets/default/abilitymanager/featureAbilityManager.ets create mode 100644 common/src/main/ets/default/abilitymanager/notificationManager.ets create mode 100644 common/src/main/resources/base/element/string.json create mode 100644 entry/.gitignore create mode 100644 entry/build.gradle create mode 100644 entry/proguard-rules.pro create mode 100644 entry/src/main/config.json create mode 100644 entry/src/main/ets/AbilityStage.ts create mode 100644 entry/src/main/ets/MainAbility/MainAbility.ts create mode 100644 entry/src/main/ets/MainAbility/app.ets create mode 100644 entry/src/main/ets/MainAbility/pages/index.ets create mode 100644 entry/src/main/resources/base/element/string.json create mode 100644 entry/src/main/resources/base/media/icon.png create mode 100644 features/batterycomponent/.gitignore create mode 100644 features/batterycomponent/build.gradle create mode 100644 features/batterycomponent/src/main/config.json create mode 100644 features/batterycomponent/src/main/ets/com/ohos/common/constants.ets create mode 100644 features/batterycomponent/src/main/ets/default/app.ets create mode 100644 features/batterycomponent/src/main/ets/default/batteryModel.ets create mode 100644 features/batterycomponent/src/main/ets/default/common/constants.ets create mode 100644 features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets create mode 100644 features/batterycomponent/src/main/ets/default/pages/batteryPic.ets create mode 100644 features/batterycomponent/src/main/ets/default/pages/batterySoc.ets create mode 100644 features/batterycomponent/src/main/resources/base/element/color.json create mode 100644 features/batterycomponent/src/main/resources/base/element/float.json create mode 100644 features/batterycomponent/src/main/resources/base/element/string.json create mode 100644 features/batterycomponent/src/main/resources/base/media/icon.png create mode 100644 features/batterycomponent/src/main/resources/en_US/element/string.json create mode 100644 features/batterycomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/noticeitem/build.gradle create mode 100644 features/noticeitem/src/main/config.json create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets create mode 100644 features/noticeitem/src/main/resources/base/element/color.json create mode 100644 features/noticeitem/src/main/resources/base/element/float.json create mode 100644 features/noticeitem/src/main/resources/base/element/string.json create mode 100644 features/noticeitem/src/main/resources/base/media/delete.png create mode 100644 features/noticeitem/src/main/resources/base/media/ic_notification_down.png create mode 100644 features/noticeitem/src/main/resources/base/media/ic_notification_up.png create mode 100644 features/noticeitem/src/main/resources/base/media/ic_setting.png create mode 100644 features/noticeitem/src/main/resources/en_US/element/string.json create mode 100644 features/noticeitem/src/main/resources/rawfile/notificationConfig.json create mode 100644 features/noticeitem/src/main/resources/zh_CN/element/string.json create mode 100644 features/notificationservice/build.gradle create mode 100644 features/notificationservice/src/main/config.json create mode 100644 features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets create mode 100644 features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets create mode 100644 features/notificationservice/src/main/resources/base/element/string.json create mode 100644 features/screenlock/build.gradle create mode 100644 features/screenlock/src/main/config.json create mode 100644 features/screenlock/src/main/ets/com/ohos/common/constants.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/data/userData.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/model/accountsModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/view/component/dateTime.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/view/component/shortcut.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/view/component/wallpaper.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/wallpaperViewModel.ets create mode 100644 features/screenlock/src/main/resources/base/element/color.json create mode 100644 features/screenlock/src/main/resources/base/element/float.json create mode 100644 features/screenlock/src/main/resources/base/element/string.json create mode 100644 features/screenlock/src/main/resources/base/media/delete_all.png create mode 100644 features/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg create mode 100644 features/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg create mode 100644 features/screenlock/src/main/resources/base/media/ic_user_portrait.svg create mode 100644 features/screenlock/src/main/resources/base/media/lock.png create mode 100644 features/screenlock/src/main/resources/base/media/reboot.svg create mode 100644 features/screenlock/src/main/resources/base/media/shutdown.svg create mode 100644 features/screenlock/src/main/resources/base/media/unlock.png create mode 100644 features/screenlock/src/main/resources/en_US/element/string.json create mode 100644 features/screenlock/src/main/resources/rawfile/antiTouch.json create mode 100644 features/screenlock/src/main/resources/rawfile/screenlock.json create mode 100644 features/screenlock/src/main/resources/zh_CN/element/string.json create mode 100644 figures/screenlock.png create mode 100644 gradle.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 infra/config_exts.gradle create mode 100644 mgit.info create mode 100644 product/pc/build.gradle create mode 100644 product/pc/src/main/config.json create mode 100644 product/pc/src/main/ets/AbilityStage.ts create mode 100644 product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts create mode 100644 product/pc/src/main/ets/ServiceExtAbility/app.ets create mode 100644 product/pc/src/main/ets/ServiceExtAbility/common/constants.ets create mode 100644 product/pc/src/main/ets/ServiceExtAbility/pages/customPassword.ets create mode 100644 product/pc/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets create mode 100644 product/pc/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets create mode 100644 product/pc/src/main/ets/ServiceExtAbility/pages/index.ets create mode 100644 product/pc/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets create mode 100644 product/pc/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets create mode 100644 product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets create mode 100644 product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets create mode 100644 product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets create mode 100644 product/pc/src/main/resources/base/element/color.json create mode 100644 product/pc/src/main/resources/base/element/float.json create mode 100644 product/pc/src/main/resources/base/element/string.json create mode 100644 product/pc/src/main/resources/base/media/icon.png create mode 100644 product/pc/src/main/resources/en_US/element/string.json create mode 100644 product/pc/src/main/resources/zh_CN/element/string.json create mode 100644 product/phone/build.gradle create mode 100644 product/phone/src/main/config.json create mode 100644 product/phone/src/main/ets/AbilityStage.ts create mode 100644 product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts create mode 100644 product/phone/src/main/ets/ServiceExtAbility/app.ets create mode 100644 product/phone/src/main/ets/ServiceExtAbility/common/constants.ets create mode 100644 product/phone/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets create mode 100644 product/phone/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets create mode 100644 product/phone/src/main/ets/ServiceExtAbility/pages/index.ets create mode 100644 product/phone/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets create mode 100644 product/phone/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets create mode 100644 product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets create mode 100644 product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets create mode 100644 product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets create mode 100644 product/phone/src/main/resources/base/element/color.json create mode 100644 product/phone/src/main/resources/base/element/string.json create mode 100644 product/phone/src/main/resources/base/media/icon.png create mode 100644 product/phone/src/main/resources/en_US/element/string.json create mode 100644 product/phone/src/main/resources/zh_CN/element/string.json create mode 100644 settings.gradle create mode 100644 signature/screenlock.p7b diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..51c63e29 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,15 @@ +*.tgz filter=lfs diff=lfs merge=lfs -text +*.trp filter=lfs diff=lfs merge=lfs -text +*.apk filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.mp4 filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.asm filter=lfs diff=lfs merge=lfs -text +*.8svn filter=lfs diff=lfs merge=lfs -text +*.9svn filter=lfs diff=lfs merge=lfs -text +*.dylib filter=lfs diff=lfs merge=lfs -text +*.exe filter=lfs diff=lfs merge=lfs -text +*.a filter=lfs diff=lfs merge=lfs -text +*.so filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.dll filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..20c4a6ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +/product/phone/build +/product/pc/build +/common/build +/build/ +/features/batterycomponent/build/ +/features/noticeitem/build/ +/features/notificationservice/build/ +/features/screenlock/build/ +/.idea +/.gradle +local.properties \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 7679d254..00000000 --- a/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# applications_screenlock - -#### 介绍 -{**以下是 Gitee 平台说明,您可以替换此简介** -Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 -无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} - -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 00000000..9a4c0840 --- /dev/null +++ b/README_zh.md @@ -0,0 +1,46 @@ +# 锁屏 + +- [简介](#section11660541593) + - [架构图](#section125101832114213) +- [目录](#section161941989596) +- [相关仓](#section1371113476307) + +## 简介 + +锁屏应用是OpenHarmony中预置的系统应用,为用户提供锁屏的基础能力,提供滑动解锁,密码解锁等解锁能力,以及锁屏页面的信息展示。 + +### 架构图 + +![](figures/screenlock.png) + +## 目录 + +``` +/applications/standard/screenlock + ├── build.gradle # 全局编译配置文件 + ├── settings.gradle # 编译模块配置文件 + ├── LICENSE # 许可文件 + ├── common # 通用工具类目录 + ├── signature # 证书文件目录 + ├── features # 子组件目录 + │ ├── batterycomponent # 电池组件 + │ ├── noticeitem # 通知子组件 + │ ├── notificationservice # 通知服务组件 + │ ├── screenlock # 锁屏组件 + │ ├── common # 通用工具 + │ ├── model # 数据管理 + │ ├── view # 组件样式管理 + │ ├── vm # 数据样式绑定管理 + ├── product # 锁屏总体功能目录 + │ ├── pc # 模块目录 + │ ├── pages/slidesrceenlock # 滑动锁屏 + │ ├── phone # 模块目录 + │ ├── pages/slidesrceenlock # 滑动锁屏 +``` + +## 相关仓 + +系统应用 + +**applications\_screenlock** + diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..bae5e354 --- /dev/null +++ b/build.gradle @@ -0,0 +1,40 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +apply plugin: 'com.huawei.ohos.app' +apply from: "./infra/config_exts.gradle" + +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + supportSystem "standard" +} + +buildscript { + repositories { + maven { + url 'https://mirrors.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + maven { + url 'http://repo.ark.tools.huawei.com/artifactory/maven-public/' + allowInsecureProtocol = true + } + } + dependencies { + classpath 'com.huawei.ohos:hap:3.0.5.2' + } +} + +allprojects { + repositories { + maven { + url 'https://mirrors.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + } +} diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 00000000..4fce9a8a --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,21 @@ +apply plugin: 'com.huawei.ohos.library' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } + entryModules "phone" +} + +dependencies { +} diff --git a/common/src/main/config.json b/common/src/main/config.json new file mode 100644 index 00000000..62f38de2 --- /dev/null +++ b/common/src/main/config.json @@ -0,0 +1,24 @@ +{ + "app": { + "bundleName": "com.ohos.screenlock", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": { + }, + "module": { + "package": "com.ohos.screenlock.common", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "common", + "moduleType": "har" + }, + "srcPath": "default" + } +} \ No newline at end of file diff --git a/common/src/main/ets/default/CheckEmptyUtils.ets b/common/src/main/ets/default/CheckEmptyUtils.ets new file mode 100644 index 00000000..fb5f3ff5 --- /dev/null +++ b/common/src/main/ets/default/CheckEmptyUtils.ets @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021 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 default class CheckEmptyUtils { + + /** + * Check obj is empty. + * + * @param {Object} obj need checked object + * @return {boolean} true(empty) + */ + static isEmpty(obj) { + return (typeof obj === 'undefined' || obj === null || obj === '' || Object.keys(obj).length === 0); + } + + /** + * Check str is empty. + * + * @param {string} str need checked string + * @return {boolean} true(empty) + */ + static checkStrIsEmpty(str) { + return str.trim().length === 0; + } + + /** + * Check array is empty. + * + * @param {Array} arr need checked array + * @return {boolean} true(empty) + */ + static isEmptyArr(arr) { + return arr.length === 0; + } +} \ No newline at end of file diff --git a/common/src/main/ets/default/DateTimeCommon.ets b/common/src/main/ets/default/DateTimeCommon.ets new file mode 100644 index 00000000..6efe425d --- /dev/null +++ b/common/src/main/ets/default/DateTimeCommon.ets @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export class DateTimeCommon { + getSystemTime(isUsing24hFormat: boolean) { + let dateTime = new Date(); + let hours = dateTime.getHours(); + if (!isUsing24hFormat && hours > 12) { + hours = hours % 12; + } + let minutes = dateTime.getMinutes(); + let time = this.concatTime(hours, minutes) + return time; + } + + getSystemDate(): {} { + let dateTime = new Date(); + let result = { + 'year': dateTime.getFullYear(), + 'month': dateTime.getMonth() + 1, + 'day': dateTime.getDate() + } + return result + } + + getSystemWeek() { + let dateTime = new Date(); + let days = dateTime.getDay(); + let week = this.convert(days) + return week + } + + concatTime(hours, minutes): string{ + return `${this.fill(hours)}:${this.fill(minutes)}`; + }; + + fill(value) { + return (value > 9 ? "" : "0") + value; + }; + + convert(days) { + switch (days) { + case 0: + return $r('app.string.sunday'); + break; + case 1: + return $r('app.string.monday'); + break; + case 2: + return $r('app.string.tuesday'); + break; + case 3: + return $r('app.string.wednesday'); + break; + case 4: + return $r('app.string.thursday'); + break; + case 5: + return $r('app.string.friday'); + break; + case 6: + return $r('app.string.saturday'); + break; + default: + break; + } + } +} + +let dateTimeCommon = new DateTimeCommon(); + +export default dateTimeCommon as DateTimeCommon diff --git a/common/src/main/ets/default/Log.ets b/common/src/main/ets/default/Log.ets new file mode 100644 index 00000000..4a1a4289 --- /dev/null +++ b/common/src/main/ets/default/Log.ets @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 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 TAG = 'ScreenLock-Default'; + +/** + * Basic log class + */ +export default class Log { + + /** + * print info level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showInfo(tag, log) { + console.info(`${TAG} tag: ${tag} --> ${log}`); + } + + /** + * print debug level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showDebug(tag, log) { + console.debug(`${TAG} tag: ${tag} --> ${log}`); + } + + /** + * print error level log + * + * @param {string} tag - Page or class tag + * @param {string} log - Log needs to be printed + */ + static showError(tag, log) { + console.error(`${TAG} tag: ${tag} --> ${log}`); + } +} diff --git a/common/src/main/ets/default/ReadConfigUtil.ets b/common/src/main/ets/default/ReadConfigUtil.ets new file mode 100644 index 00000000..587704de --- /dev/null +++ b/common/src/main/ets/default/ReadConfigUtil.ets @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2021 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 Log from './Log.ets'; +import FileIo from '@ohos.fileio'; + +const DFAULT_SIZE = 4096; +const CHAR_CODE_AT_INDEX = 0; +const TAG = 'ReadConfigUtil'; + +export class ReadConfigUtil { + ReadConfigFile(fileName) { + Log.showInfo(TAG, `readConfigFile fileName:${fileName}`); + try { + let stream = FileIo.createStreamSync(fileName, 'r'); + Log.showInfo(TAG, `readConfigFile stream:` + stream); + let buf = new ArrayBuffer(DFAULT_SIZE); + let len = stream.readSync(buf); + Log.showInfo(TAG, `readConfigFile len:` + len); + let arr = new Uint8Array(buf); + let charAt = ' '.charCodeAt(CHAR_CODE_AT_INDEX); + for (let i = len;i < DFAULT_SIZE; i++) { + arr[i] = charAt; + } + let content = String.fromCharCode.apply(null, arr); + stream.closeSync(); + Log.showInfo(TAG, `readConfigFile content:` + JSON.stringify(content)); + return JSON.parse(content); + } catch (error) { + Log.showInfo(TAG, `readConfigFile error:` + JSON.stringify(error)); + } + } +} + +let readConfigUtil = new ReadConfigUtil(); + +export default readConfigUtil as ReadConfigUtil diff --git a/common/src/main/ets/default/ScreenLockCommon.ets b/common/src/main/ets/default/ScreenLockCommon.ets new file mode 100644 index 00000000..ec39b0b1 --- /dev/null +++ b/common/src/main/ets/default/ScreenLockCommon.ets @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021 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 Log from './Log.ets'; +import FileIo from '@ohos.fileio'; + +const TAG = 'ScreenLock-ScreenLockCommon'; +const DFAULT_SIZE = 4096; +const CHAR_CODE_AT_INDEX = 0; + +export enum ScreenLockStatus { + Locking = 1, + Unlock = 2 +} + +export function ReadConfigFile(fileName) { + Log.showInfo(TAG, `readConfigFile fileName:${fileName}`); + try { + let stream = FileIo.createStreamSync(fileName, 'r'); + Log.showInfo(TAG, `readConfigFile stream:` + stream); + let buf = new ArrayBuffer(DFAULT_SIZE); + let len = stream.readSync(buf); + Log.showInfo(TAG, `readConfigFile len:` + len); + let arr = new Uint8Array(buf); + let charAt = ' '.charCodeAt(CHAR_CODE_AT_INDEX); + for (let i = len;i < DFAULT_SIZE; i++) { + arr[i] = charAt; + } + let content = String.fromCharCode.apply(null, arr); + stream.closeSync(); + Log.showInfo(TAG, `readConfigFile content:` + JSON.stringify(content)); + return JSON.parse(content); + } catch (error) { + Log.showInfo(TAG, `readConfigFile error:` + JSON.stringify(error)); + } +} \ No newline at end of file diff --git a/common/src/main/ets/default/WindowManager.ets b/common/src/main/ets/default/WindowManager.ets new file mode 100644 index 00000000..3d0e42c0 --- /dev/null +++ b/common/src/main/ets/default/WindowManager.ets @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Window from '@ohos.window'; +import display from '@ohos.display' +import Log from './Log.ets'; + +const TAG = 'WindowManager'; +//const STATUS_BAR_H = 0.07; +const STATUS_BAR_H = 0.03; + +var maxWidth; +var maxHeight; +var minHeight; +var quicklySettingH; +var notificationH; + +/** + * Manage window size changes. + */ +export default class WindowManager { + initWindowManager() { + Log.showInfo(TAG, 'initWindowManager '); + maxWidth = AppStorage.SetAndLink("maxWidth", 0); + maxHeight = AppStorage.SetAndLink("maxHeight", 0); + minHeight = AppStorage.SetAndLink("minHeight", 0); + + display.getDefaultDisplay() + .then(dis => { + maxWidth.set(dis.width); + maxHeight.set(dis.height); + minHeight.set(this.getStatusBarDefaultHeight(dis.height)); + + Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth.get()} maxHeight ${maxHeight.get()} minHeight ${minHeight.get()}`); + }) + } + + /** + * Set the window to the maximum size. + * + * @param {Object} callback - Callback function. + */ + setWindowMax(callback) { + Log.showInfo(TAG, 'enter setWindowMax ================='); + Window.getTopWindow() + .then((windowData) => { + windowData.resetSize(maxWidth.get(), maxHeight.get()) + .then((result) => { + Log.showInfo(TAG, result); + callback(result); + }); + }); + } + + /** + * Set the window to the minimum size. + * + * @param {Object} callback - Callback function. + */ + setWindowMin(callback) { + Log.showInfo(TAG, 'enter setWindowMin ================='); + Window.getTopWindow() + .then((windowData) => { + windowData.resetSize(maxWidth.get(), minHeight.get()) + .then((result) => { + Log.showInfo(TAG, result); + callback(result); + }); + }); + } + + getStatusBarDefaultHeight(maxheight) { + return parseInt((maxheight * STATUS_BAR_H).toString()) + } +} \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ets b/common/src/main/ets/default/abilitymanager/bundleManager.ets new file mode 100644 index 00000000..2734db72 --- /dev/null +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ets @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 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 BundleMgr from '@ohos.bundle'; +import Resmgr from '@ohos.resourceManager'; +import Log from '../Log.ets'; + +const TAG = 'BRManager'; + +export default class BundleManager { + + static getResourceManager(tag, bundleName, then) { + Log.showInfo(TAG, `getResourceManager from: ${tag}`); + Resmgr.getResourceManager(bundleName).then(then); + } + + static getBundleInfo(tag, bundleName, getInfo, then) { + Log.showInfo(TAG, `getBundleInfo from: ${tag}`); + BundleMgr.getBundleInfo(bundleName, getInfo).then(then); + } + +} \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ets b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ets new file mode 100644 index 00000000..b5490160 --- /dev/null +++ b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ets @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2021 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 FeatureAbility from '@ohos.ability.featureAbility'; +import Log from '../Log.ets'; + +const TAG = 'FeatureAbilityManager'; + +export default class FeatureAbilityManager { + + openAbility(tag, want) { + Log.showInfo(TAG, `openAbility from: ${tag}`); + let result = FeatureAbility.startAbility(want) + .then(data => + Log.showInfo(TAG, `tag: ${tag} promise then: ${JSON.stringify(data)}`)) + .catch(error => + Log.showError(TAG, `tag: ${tag} promise catch: ${JSON.stringify(error)}`)); + Log.showInfo(TAG, `tag: ${tag} openAbility result: ${result}`); + } + + getAbilityWant(listener) { + FeatureAbility.getWant((err, data) => { + Log.showInfo(TAG, `getAbilityWant callBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + if (err.code !== 0) { + Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); + return; + } else { + if(listener != null && listener != undefined) { + listener(data); + } + } + }); + } + + finishAbilityWithResult(abilityResult) { + FeatureAbility.finishWithResult(abilityResult, (err, data) => { + if (err.code !== 0) { + Log.showError(TAG, `failed to finishWithResult because ${JSON.stringify(err)}`); + return; + } + FeatureAbilityManager.finishAbility(); + }); + } + + static finishAbility() { + FeatureAbility.terminateAbility((err, data) => { + if (err.code !== 0) { + Log.showError(TAG, `failed to finishAbility because ${JSON.stringify(err)}`); + return; + } + Log.showInfo(TAG, ` finishAbility callback err: ${JSON.stringify(err)} data:${data}`); + }); + } +} \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/notificationManager.ets b/common/src/main/ets/default/abilitymanager/notificationManager.ets new file mode 100644 index 00000000..8c90ac65 --- /dev/null +++ b/common/src/main/ets/default/abilitymanager/notificationManager.ets @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 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 { NotificationSubscriber } from './notification/notificationSubscriber'; +import Notification from '@ohos.notification'; +import Log from '../Log.ets'; + +const TAG = 'NotificationManager'; + + +export default class NotificationManager { + + static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; + static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; + static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; + + static subscribeNotification(tag, subscriber, asyncCallback) { + Log.showInfo(TAG, `subscribeNotification from: ${tag}`); + Notification.subscribe(subscriber, asyncCallback); + } + + static unsubscribeNotification(tag, subscriber) { + Log.showInfo(TAG, `subscribeNotification from: ${tag}`); + Notification.unsubscribe(subscriber); + } + + static removeAll(tag, callback) { + Log.showInfo(TAG, `removeAll from: ${tag}`); + Notification.removeAll(callback); + } + + static remove(tag, hashCode, callback) { + Log.showInfo(TAG, `remove from: ${tag}`); + Notification.remove(hashCode, callback) + } + + static getAllActiveNotifications(tag, callback) { + Log.showInfo(TAG, `getAllActiveNotifications from: ${tag}`); + Notification.getAllActiveNotifications(callback); + } + +} \ No newline at end of file diff --git a/common/src/main/resources/base/element/string.json b/common/src/main/resources/base/element/string.json new file mode 100644 index 00000000..89e9e043 --- /dev/null +++ b/common/src/main/resources/base/element/string.json @@ -0,0 +1,40 @@ +{ + "string": [ + { + "name": "app_name", + "value": "ScreenLock" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "monday", + "value": "星期一" + }, + { + "name": "tuesday", + "value": "星期二" + }, + { + "name": "wednesday", + "value": "星期三" + }, + { + "name": "thursday", + "value": "星期四" + }, + { + "name": "friday", + "value": "星期五" + }, + { + "name": "saturday", + "value": "星期六" + }, + { + "name": "sunday", + "value": "星期日" + } + ] +} \ No newline at end of file diff --git a/entry/.gitignore b/entry/.gitignore new file mode 100644 index 00000000..7d5b7a94 --- /dev/null +++ b/entry/.gitignore @@ -0,0 +1,2 @@ +/build +/node_modules diff --git a/entry/build.gradle b/entry/build.gradle new file mode 100644 index 00000000..1b24503d --- /dev/null +++ b/entry/build.gradle @@ -0,0 +1,22 @@ +apply plugin: 'com.huawei.ohos.hap' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + + + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} diff --git a/entry/proguard-rules.pro b/entry/proguard-rules.pro new file mode 100644 index 00000000..f7666e47 --- /dev/null +++ b/entry/proguard-rules.pro @@ -0,0 +1 @@ +# config module specific ProGuard rules here. \ No newline at end of file diff --git a/entry/src/main/config.json b/entry/src/main/config.json new file mode 100644 index 00000000..1a9fe809 --- /dev/null +++ b/entry/src/main/config.json @@ -0,0 +1,64 @@ +{ + "app": { + "bundleName": "com.ohos.screenlock", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.screenlock", + "name": ".MyApplication", + "deviceType": [ + "phone","tablet" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry", + "installationFree": false + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "visible": true, + "name": "com.ohos.screenlock.MainAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:entry_MainAbility", + "type": "page", + "launchType": "standard", + "srcPath": "MainAbility", + "srcLanguage": "ets" + } + ], + "js": [ + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "pages": [ + "pages/index" + ], + "name": "MainAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ], + "srcPath": "MainAbility" + } +} \ No newline at end of file diff --git a/entry/src/main/ets/AbilityStage.ts b/entry/src/main/ets/AbilityStage.ts new file mode 100644 index 00000000..6a0eb2f8 --- /dev/null +++ b/entry/src/main/ets/AbilityStage.ts @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import AbilityStage from "@ohos.application.AbilityStage" +import Log from '../../../../common/src/main/ets/default/Log.ets' + +const TAG = "MainAbilityStage" + +export default class MainAbilityStage extends AbilityStage { + onCreate() { + Log.showInfo(TAG, "onCreate") + } +} \ No newline at end of file diff --git a/entry/src/main/ets/MainAbility/MainAbility.ts b/entry/src/main/ets/MainAbility/MainAbility.ts new file mode 100644 index 00000000..6033b14c --- /dev/null +++ b/entry/src/main/ets/MainAbility/MainAbility.ts @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Ability from "@ohos.application.Ability" + +export default class MainAbility extends Ability { + onCreate(want, launchParam) { + console.info('API8 A onCreate') + } + + onWindowStageCreate(windowStage) { + console.info('API8 A onWindowStageCreate') + windowStage.setUIContent(this.content, "pages/index", null) + } + + onForeground() { + console.info('API8 A onForeground') + } + + onBackground() { + console.info('API8 A onBackground') + } + + onWindowStageDestroy() { + console.info('API8 A onWindowStageDestroy') + } + + onDestroy() { + console.info('API8 A onDestroy') + } +} \ No newline at end of file diff --git a/entry/src/main/ets/MainAbility/app.ets b/entry/src/main/ets/MainAbility/app.ets new file mode 100644 index 00000000..cebf2a45 --- /dev/null +++ b/entry/src/main/ets/MainAbility/app.ets @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2022 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 default { + onCreate() { + console.info('Application onCreate') + }, + onDestroy() { + console.info('Application onDestroy') + }, +} diff --git a/entry/src/main/ets/MainAbility/pages/index.ets b/entry/src/main/ets/MainAbility/pages/index.ets new file mode 100644 index 00000000..31a1320e --- /dev/null +++ b/entry/src/main/ets/MainAbility/pages/index.ets @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2022 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. + */ + +@Entry +@Component +struct Index { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text('Hello World API8 A') + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json new file mode 100644 index 00000000..bc3df790 --- /dev/null +++ b/entry/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "entry_MainAbility", + "value": "entry_MainAbility" + }, + { + "name": "mainability_description", + "value": "eTS_Empty Ability" + } + ] +} \ No newline at end of file diff --git a/entry/src/main/resources/base/media/icon.png b/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { + Log.showInfo(TAG, `unregister Battery Status Listener ===============`); + }); + } + + /** + * Callback of the subscriber + * + * @param {Object} err - error returns from the caller + * @param {Object} data - data returns from the caller + */ + + private createBatterySubscriberCallBack(err, data) { + Log.showInfo(TAG, `Subscriberregister createBatterySubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + mBatteryEventSubscriber = data; + BatterySubscriber.subscribe(mBatteryEventSubscriber, this.batterySubscriberCallBack.bind(this)); + } + + + /** + * Callback of the events + * + * @param {Object} err - error returns from the caller + * @param {Object} data - data returns from the caller + */ + + private batterySubscriberCallBack(err, data) { + Log.showInfo(TAG, `batterySubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + if (err.code == 0) { + if (data.event == 'usual.event.BATTERY_CHANGED') { + this.getBatteryStatus(); + } + } else { + Log.showInfo(TAG, 'Subscriberregister error when subscribing ========'); + } + } + + + /** + * Get battery status and remaining power + */ + private getBatteryStatus() { + Log.showInfo(TAG,'getBatteryStatus') + let batterySoc = BatteryInfo.batterySOC; + let batteryCharging = BatteryInfo.chargingStatus; + if (null == batterySoc) { + // Set the battery Soc as full when there is no battery hardware + batterySoc = mProgress; + } + if (batterySoc <= 0) { + // If the result is a negative number, set it as positive number. + batterySoc = Math.abs(batterySoc) * Constants.PERCENT_NUMBER; + } + // Set the battery status as charging when there is no battery hardware + this.checkBatteryStatus(batteryCharging, (result) => { + let batteryStatus = result; + mBatterySoc.set(batterySoc); + mBatteryCharging.set(batteryStatus); + }); + } + + /** + * Check the battery charging status + * + * @param {number} charging - the battery charging status + * @param {object} callback - Function callback + */ + private checkBatteryStatus(charging, callback) { + Log.showInfo(TAG, `checkBatteryStatus charging: ${charging}`); + let batteryStatus; + switch (charging) { + case Constants.NONE: + batteryStatus = false; + break; + case Constants.DISABLE: + case Constants.ENABLE: + case Constants.FULL: + batteryStatus = true; + break; + default: + batteryStatus = false; + break; + } + callback(batteryStatus); + } +} + +let mBatteryModel = new BatteryModel(); +export default mBatteryModel as BatteryModel; diff --git a/features/batterycomponent/src/main/ets/default/common/constants.ets b/features/batterycomponent/src/main/ets/default/common/constants.ets new file mode 100644 index 00000000..d40572fc --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/common/constants.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 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 default class Constants { + + //layout params - Icon + static WHOLE_CONTAINER_MARGIN = 2 + static WHOLE_CONTAINER_WIDTH = 100 + static WHOLE_CONTAINER_HEIGHT = 24 + static PIC_CONTAINER_WIDTH = '70%' + static PIC_CONTAINER_HEIGHT = '85%' + //layout params - Pic + static FULL_CONTAINER_WIDTH = '100%' + static FULL_CONTAINER_HEIGHT = '100%' + static BATTERY_BORDER_WIDTH = '88%' + static BATTERY_BORDER_HEIGHT = '80%' + static BATTERY_BORDER_RADIUS = 2 + static BATTERY_BORDER_MARGIN = 2 + static BATTERY_CONTENT_PADDING = 2 + static BATTERY_DECORATOR_WIDTH = '10%' + static BATTERY_DECORATOR_HEIGHT = '50%' + static BATTERY_DECORATOR_MARGIN = 2 + //layout params - Soc + static SOC_FONT_SIZE = 16 + + //value + static BATTERY_LEVEL_LOW = 20 + + static NONE = 0; + static ENABLE = 1; + static DISABLE = 2; + static FULL = 3; + static PERCENT_NUMBER = 100; + static DEFAULT_PROGRESS = 100; + +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets new file mode 100644 index 00000000..05a18b38 --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2021 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 mBatteryModel from '../batteryModel.ets'; +import BatteryPic from './batteryPic.ets' +import BatterySoc from './batterySoc' +import Constants from '../common/constants.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' + + +const TAG = 'BatteryComponent-batteryIcon' + +@Component +export default struct BatteryIcon { + @StorageLink('batterySoc') batterySoc: number = 100 + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + + aboutToAppear() { + mBatteryModel.initBatteryModel(); + Log.showInfo(TAG, 'aboutToAppear'); + } + + aboutToDisappear() { + mBatteryModel.uninitBatteryModel(); + Log.showInfo(TAG, 'aboutToDisappear'); + } + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + BatterySoc() + } + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + BatteryPic() + } +// .width('70%') +// .height('100%') + .width('40%') + .height('42%') + .margin({right:$r('app.float.battery_margin')}) + } + .width(Constants.WHOLE_CONTAINER_WIDTH * this.StatusCoefficient) + .height(Constants.WHOLE_CONTAINER_HEIGHT * this.StatusCoefficient) + .margin($r('app.float.whole_container_margin')) + } +} diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets new file mode 100644 index 00000000..d7eb72c9 --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +const TAG = 'BatteryComponent-batteryPic' + +@Component +export default +struct BatteryPic { + @StorageLink('batterySoc') batterySoc: number = 100 + @StorageLink('batteryCharging') batteryCharging : boolean = false + aboutToAppear(){ + Log.showInfo(TAG,'aboutToAppear Start'); + } + + aboutToDisappear(){ + Log.showInfo(TAG,'aboutToDisappear'); + } + + build() { + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + + } + .height('100%') + .width(this.batterySoc + '%') + .backgroundColor(this.getBatteryColor(this.batterySoc, this.batteryCharging)) + } + .width('88%') + .height('100%') + .backgroundColor($r('app.color.battery_background')) + .border({ width: $r('app.float.battery_border_width'), + color: $r('app.color.battery_border'), + radius: $r('app.float.battery_border_radius'), + style: BorderStyle.Solid }) + .padding($r('app.float.battery_content_padding')) + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + + } + .width('10%') + .height('50%') + .backgroundColor($r('app.color.battery_border')) + .borderRadius($r('app.float.battery_border_radius')) + .margin({ left: $r('app.float.battery_decorator_margin') }) + } + .width('100%') + .height('100%') + } + + private getBatteryColor(val, charging) { + Log.showInfo(TAG, `getBatteryColor, val: ${ val } charging: ${ charging } `); + if (charging) { + return $r('app.color.battery_charging_color'); + } else if (val <= Constants.BATTERY_LEVEL_LOW) { + return $r('app.color.battery_low_color'); + } else { + return $r('app.color.battery_default_color'); + } + } +} diff --git a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets new file mode 100644 index 00000000..e76d44f8 --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' +const TAG = 'BatteryComponent-batterySoc' +@Component +export default +struct BatterySoc { + @StorageLink('batterySoc') batterySoc: number = 100 + + aboutToAppear(){ + Log.showInfo(TAG,'aboutToAppear Start'); + } + + aboutToDisappear(){ + Log.showInfo(TAG,'aboutToDisappear'); + } + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + Text(this.batterySoc + '%') + .height('100%') + .fontColor($r('app.color.battery_default_color')) + .fontSize($r('app.float.fontSize_network_state')) + } + } +} diff --git a/features/batterycomponent/src/main/resources/base/element/color.json b/features/batterycomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..d86a7a33 --- /dev/null +++ b/features/batterycomponent/src/main/resources/base/element/color.json @@ -0,0 +1,20 @@ +{ + "color": [ + { + "name": "battery_low_color", + "value": "#ff0000" + },{ + "name": "battery_default_color", + "value": "#ffffff" + },{ + "name": "battery_charging_color", + "value": "#00ff21" + },{ + "name": "battery_border", + "value": "#fff" + },{ + "name": "battery_background", + "value": "#00000000" + } + ] +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/resources/base/element/float.json b/features/batterycomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..42f42300 --- /dev/null +++ b/features/batterycomponent/src/main/resources/base/element/float.json @@ -0,0 +1,36 @@ +{ + "float": [ + { + "name": "fontSize_network_state", + "value": "16" + }, + { + "name": "whole_container_width", + "value": "100" + }, + { + "name": "whole_container_margin", + "value": "2" + }, + { + "name": "battery_decorator_margin", + "value": "2" + }, + { + "name": "battery_border_radius", + "value": "2" + }, + { + "name": "battery_content_padding", + "value": "2" + }, + { + "name": "battery_border_width", + "value": "1" + }, + { + "name": "battery_margin", + "value": "20" + } + ] +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/resources/base/element/string.json b/features/batterycomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..af63c7dc --- /dev/null +++ b/features/batterycomponent/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "batterycomponent_MainAbility", + "value": "batterycomponent_MainAbility" + }, + { + "name": "mainability_description", + "value": "ETS_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/resources/base/media/icon.png b/features/batterycomponent/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 void; + onNotificationLoad?:(data: NotificationItemData) => void; + onNotificationCancel?:(data: NotificationItemData) => void; +} + diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets new file mode 100644 index 00000000..c7e08ae6 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets'; +import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; + +@Component +export default struct BasicItem { + @State itemData: NotificationItemData= undefined + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.itemData.title) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + Text(this.itemData.text) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Clip }) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .margin({ top: $r('app.float.content_margin_top') }) + }.width('100%') + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets new file mode 100644 index 00000000..04ee4abf --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets'; +import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; + +@Component +export default +struct LongItem { + @State itemData: NotificationItemData= undefined + @Prop isExpand: boolean + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.isExpand ? this.itemData.expandedTitle : this.itemData.title) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) //not support Resource type + Text(this.isExpand ? this.itemData.longText : this.itemData.text) + .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .constraintSize({ maxHeight: $r('app.float.notification_expanded_text_maxheight') }) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .margin({ top: $r('app.float.content_margin_top') }) + }.width('100%') + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets new file mode 100644 index 00000000..2cf14928 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets'; +import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; + +@Component +export default struct MultiItem { + @State itemData: NotificationItemData= undefined + @Prop isExpand: boolean + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.isExpand ? this.itemData.longTitle : this.itemData.title) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + if (this.isExpand) { + ForEach(this.itemData.lines, + (item: string) => { + Text(`${item}`) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .margin({ top: $r('app.float.content_margin_top') }) + }, (item: string) => item.toString() + ) + } else { + Text(this.itemData.text) + .fontSize($r('app.float.notification_content_fontsize')) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r('app.color.content_text_color')) + .margin({ top: $r('app.float.content_margin_top') }) + } + }.width('100%') + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets new file mode 100644 index 00000000..3b07e1fc --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets'; +import basicItem from './basicItem.ets'; +import longItem from './longItem.ets'; +import multiItem from './multiItem.ets'; +import titleItem from './titleItem'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import mNotificationService from '../../../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' +import WantAgent from '@ohos.wantAgent'; +import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; +import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; + +const TAG = 'NoticeItem-NotificationItem'; +let mWindowManager; + +@Component +export default struct NotificationItem { + @Link showStatusBar: boolean + private itemData: NotificationItemData + @State hasPicture: boolean = false + @State isExpand: boolean = false + @State needExpand: boolean = true + @State deleteIconDisplay: boolean = false; + @State itemWidth: string = '100%' + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 + + aboutToAppear() { + Log.showInfo(TAG, `aboutToDisAppear Start`) + mWindowManager = new WindowManager(); + if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { + this.hasPicture = false; + } else { + this.hasPicture = true; + } + this.needExpand=this.checkItemNeedExpand() + } + + checkItemNeedExpand(){ + if(this.itemData.contentType===Constants.NOTIFICATION_TYPE_BASIC&&(!(this.itemData.actionButtons?.length>0))){ + return false; + }else{ + return true; + } + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`); + } + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + Row() { + Column() { + titleItem({ + notificationSmallIcon: this.itemData.smallIcon, + notificationName: this.itemData.name, + notificationTime: this.itemData.time, + isExpand: $isExpand, + needExpand: this.needExpand + }) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC) { + basicItem({ + itemData: this.itemData + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { + longItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { + multiItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + } + .width(this.hasPicture ? '85%' : '100%') + .margin({ top: $r('app.float.body_margin_top') }) + + if (this.hasPicture) { + Column() { + Image(this.itemData.largeIcon) + .objectFit(ImageFit.Contain) + .width(50) + .height(50) + } + .alignItems(HorizontalAlign.End) + .width('15%') + } + }.onClick(this.clickItem.bind(this)) + + if(this.isExpand){ + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + ForEach(this.itemData.actionButtons, (item: any) => { + Text(item.title) + .fontSize(20) + .height(30) + .fontColor(Color.Blue) + .margin({ right: 20 }) + .onClick(() => { + Log.showInfo(TAG, `clickbuttonEvent: ${JSON.stringify(item.wantAgent)}`) + this.startTargetAbility(item.wantAgent) + }) + }) + } + .margin({ top: 10 }) + } + } + .backgroundColor($r('app.color.notificationitem_background')) + .opacity($r('app.float.item_opicaty')) + .borderRadius($r('app.float.item_borderradius')) + .margin({ + left: $r('app.float.item_marginleft'), + right: $r('app.float.item_marginright'), + top: $r('app.float.item_margintop') + }) + .padding({ + left: $r('app.float.item_paddingleft'), + right: $r('app.float.item_paddingright'), + bottom: $r('app.float.item_paddingbottom') + }) + .onTouch(this.touchNotificationItem.bind(this)) + .width(this.itemWidth) + + if (this.deleteIconDisplay) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { + Image($r('app.media.delete')) //delete + .objectFit(ImageFit.Contain) + .width($r('app.float.item_delete_image_width')) + .height($r('app.float.item_delete_image_height')) + .onClick(() => { + this.removeNotificationItem(this.itemData.hashcode); + }) + } + .width('30%') + } + } + } + } + + touchNotificationItem(event: TouchEvent) { + if (event.type == Constants.TOUCH_TYPE_DOWN) { //down + this.startX = event.touches[0].x; + this.startY = event.touches[0].y; + Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`); + } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move + this.moveX = event.touches[0].x - this.startX; + this.moveY = event.touches[0].y - this.startY; + } else if (event.type == Constants.TOUCH_TYPE_UP) { //up + Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); + if (this.deleteIconDisplay) { + if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { + //hidden + this.deleteIconDisplay = false; + this.itemWidth = '100%'; + Log.showInfo(TAG, 'hidden'); + } + } else { + if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { + this.deleteIconDisplay = true; + this.itemWidth = '70%'; + Log.showInfo(TAG, 'display'); + } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { + this.removeNotificationItem(this.itemData.hashcode); + } + } + } + } + + removeNotificationItem(hashCode: string) { + Log.showInfo(TAG, 'removeNotificationItem'); + mNotificationService.removeNotificationItem(hashCode, true); + } + + clickItem() { + Log.showInfo(TAG, 'click Item'); + this.startTargetAbility(this.itemData.want); + } + + startTargetAbility(want) { + Log.showInfo(TAG, 'startTargetAbility'); + //close window + this.showStatusBar = true; + mWindowManager.setWindowMin((result) => { + Log.showInfo(TAG, `setWindowMin ${result}`); + }); + //open app + Log.showInfo(TAG, `itemClick wantAgent ${JSON.stringify(this.itemData.want)} id: ${this.itemData.id}`); + let TriggerInfo = { + code: 0, + want: '', + permission: '', + extraInfo: {} + }; + WantAgent.trigger(want, TriggerInfo, ((err, data) => { + Log.showInfo(TAG, `itemClick wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); + })); + //remove notification + this.removeNotificationItem(this.itemData.hashcode); + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets new file mode 100644 index 00000000..c2d73539 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2021 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 Constants from '../common/constants.ets'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; + +const TAG = 'NoticeItem-TitleItem'; + +@Component +export default +struct TitleItem { + private notificationSmallIcon: PixelMap + @Prop notificationName: string + @Prop notificationTime: string + @State srcIconDisplay: any = $r('app.media.ic_notification_down') + @Link isExpand: boolean + @Prop needExpand: boolean + @State rowSpace: any = $r('app.float.titleitem_row_space') + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`); + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`); + } + + build() { + Row() { + Row({ space: this.rowSpace }) { + if (!CheckEmptyUtils.isEmpty(this.notificationSmallIcon)) { + Image(this.notificationSmallIcon) + .objectFit(ImageFit.Contain) + .width($r('app.float.title_image_width')) + .height($r('app.float.title_image_height')) + .flexShrink(0) + } + Text(this.notificationName) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.title_name_fontsize')) + .flexShrink(1) + Text(this.notificationTime) + .fontSize($r('app.float.title_time_fontsize')) + .flexShrink(0) + } + .width(this.needExpand ? '80%' : '100%') + + if (this.needExpand) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End, alignItems: ItemAlign.Center }) { + Image(this.srcIconDisplay) + .objectFit(ImageFit.Contain) + .width($r('app.float.displayicon_width')) + .height($r('app.float.displayicon_height')) + } + .width('20%') + } + } + .height($r('app.float.titleitem_height')) + .width('100%') + .onClick(this.clickTitleItem.bind(this)) + } + + clickTitleItem() { + Log.showInfo(TAG, 'clickTitleItem'); + if (this.needExpand) { + if (this.isExpand) { + this.isExpand = false; + this.srcIconDisplay = $r('app.media.ic_notification_down'); + } else { + this.isExpand = true; + this.srcIconDisplay = $r('app.media.ic_notification_up'); + } + } + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets new file mode 100644 index 00000000..10ab1659 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021 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 ReadConfigUtil from '../../../../../../../../../common/src/main/ets/default/ReadConfigUtil.ets'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; + +const FILE_URI = '/data/accounts/account_0/applications/com.ohos.systemui' ++ '/com.ohos.systemui.statusbar/assets/{0}/resources/rawfile/notificationConfig.json' + +const TAG = 'NotificationConfig' + +export class NotificationConfig { + static USE_NOTIFICATION_ICON = true; + + readNotificationConfig(deviceType: string): any{ + Log.showInfo(TAG, `readSlidingLength deviceType:${deviceType}`); + let notificationConfig = ReadConfigUtil.ReadConfigFile(FILE_URI.replace('{0}', deviceType)) + return notificationConfig + } +} + +let notificationConfig = new NotificationConfig(); + +export default notificationConfig as NotificationConfig; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets new file mode 100644 index 00000000..201b113c --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 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 { NotificationSubscriber } from './notification/notificationSubscriber'; +import Notification from '@ohos.notification'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'NotificationManager'; + + +export default class NotificationManager { + + static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; + static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; + static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; + + static subscribeNotification(tag, subscriber, asyncCallback) { + Log.showInfo(TAG, `subscribeNotification from: ${tag}`); + Notification.subscribe(subscriber, asyncCallback); + } + + static unsubscribeNotification(tag, subscriber) { + Log.showInfo(TAG, `subscribeNotification from: ${tag}`); + Notification.unsubscribe(subscriber); + } + + static removeAll(tag, callback) { + Log.showInfo(TAG, `removeAll from: ${tag}`); + Notification.removeAll(callback); + } + + static remove(tag, hashCode, callback) { + Log.showInfo(TAG, `remove from: ${tag}`); + Notification.remove(hashCode, callback) + } + + static getAllActiveNotifications(tag, callback) { + Log.showInfo(TAG, `getAllActiveNotifications from: ${tag}`); + Notification.getAllActiveNotifications(callback); + } + +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets new file mode 100644 index 00000000..3dc91759 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2021 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 notification from '@ohos.notification'; +import NotificationSubscriber from '@ohos.notificationSubscriber'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import NotificationManager from './NotificationManager.ets'; +import ParseDataUtil from './ParseDataUtil.ets'; + +const TAG = 'NotificationService'; + +let mSubscriber; +let listeners; + +/** + * notification service api + */ +export class NotificationService { + constructor() { + listeners = []; + this.init(); + } + + init() { + this.loadAllNotifications(); + this.subscribeNotification(this.getSubscriber()); + } + + public register(listener) { + Log.showInfo(TAG, "register listener") + listeners.push(listener); + } + + public unRegister(listener) { + Log.showInfo(TAG, "unRegister listener") + let removedIndex = listeners.indexOf(listener); + if (removedIndex == -1) { + Log.showInfo(TAG, "unRegister listener, listener is not found"); + return; + } + listeners.splice(removedIndex, 1) + Log.showInfo(TAG, "unRegister listener success"); + } + + + public removeAll(){ + Log.showInfo(TAG, 'removeAll start'); + NotificationManager.removeAll(TAG, (data) => { + Log.showInfo(TAG, `removeAll => data: ${JSON.stringify(data)}`); + }); + } + + + public remove(code: string) { + NotificationManager.remove(TAG, code,(data) => { + Log.showInfo(TAG, `removeNotificationItem ==> data: ${JSON.stringify(data)}`); + }) + } + + public loadAllNotifications() { + NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { + Log.showInfo(TAG, `getAllActiveNotifications err: ${JSON.stringify(err)}`); + Log.showInfo(TAG, `getAllActiveNotifications requestsArr: ${JSON.stringify(requestsArr)}`); + if (Array.isArray(requestsArr)) { + for(let i = 0,len = requestsArr.length; i< len; i++) { + this.handleNotificationLoad(requestsArr[i]); + } + } + }) + } + + getSubscriber() { + if (mSubscriber == null || mSubscriber == undefined) { + mSubscriber = { + onConsume: this.handleNotificationAdd.bind(this), + onCancel: this.handleNotificationCancel.bind(this), + } + } + return mSubscriber; + } + + handleNotificationAdd(data) { + Log.showInfo(TAG, 'handleNotificationAdd started'); + Log.showInfo(TAG, 'sortingMap' + JSON.stringify(data.sortingMap||{})); + Log.showInfo(TAG, JSON.stringify(data)); + ParseDataUtil.parseData(data, (err, record) => { + Log.showInfo(TAG, `parseData after = ${JSON.stringify(record)}`); + Log.showInfo(TAG, `listeners.length = ${JSON.stringify(data)}`); + for(let i = 0,len = listeners.length; i< len; i++) { + Log.showInfo(TAG, `notify listener ` + i); + listeners[i].onNotificationConsume(record); + } + }); + } + + handleNotificationCancel(data) { + console.info("===>handleNotificationCancel data : ==> " + `data:${JSON.stringify(data)}`); + ParseDataUtil.parseData(data, (err, record) => { + for(let i = 0,len = listeners.length; i< len; i++) { + listeners[i].onNotificationCancel(record); + } + }); + } + + handleNotificationLoad(data) { + console.info("===>handleNotificationLoad data : ==> " + `data:${JSON.stringify(data)}`); + ParseDataUtil.parseData(data, (err, record) => { + for(let i = 0,len = listeners.length; i< len; i++) { + listeners[i].onNotificationLoad(record); + } + }); + } + + subscribeNotification(subscriber) { + let callback = (err,data) => { + Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + }; + NotificationManager.subscribeNotification(TAG, subscriber, callback); + } +} + +let notificationService = new NotificationService(); +export default notificationService as NotificationService; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets new file mode 100644 index 00000000..976d734f --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2021 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 Notification from '@ohos.notification'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import BundleManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager.ets'; +import NotificationManager from './NotificationManager.ets'; +import Constants,{NotificationItemData} from '../common/constants.ets'; +import {NotificationConfig} from './NotificationConfig.ets'; + +let mDate; +let mAppName; +let mEmptyArray; +const TAG = 'Notification_ParseDataUtil'; +mDate = new Date(); +mAppName = new Map(); +mEmptyArray = []; +let appDataMap = new Map(); + +/** + * parse data util class. + */ +export default class ParseDataUtil { + static parseData(data, callback) { + let request = data?.request; + if (request == null || request == undefined) { + Log.showInfo(TAG, 'consumeCallback request is empty'); + callback(Constants.ERROR_CALLBACK, undefined); + return; + } + let slotLevel; + try { + slotLevel = data?.sortingMap?.sortings[request.hashCode]?.slot.level; + } catch (e) { + Log.showInfo(TAG, `slot level get error: ${e.toString()}`); + } + Log.showInfo(TAG, `want = ${JSON.stringify(request.wantAgent)}`); + Log.showInfo(TAG, `actionButtons = ${JSON.stringify(request.actionButtons)}`); + Log.showInfo(TAG, `largeIcon = ${request.largeIcon}`); + ParseDataUtil.getAppData(request.creatorBundleName, (err, appMessage) => { + let notificationItem: NotificationItemData = { + id: request.id, + hashcode: request.hashCode, + contentType: request?.content?.contentType + '', + timestamp: request.deliveryTime, + time: ParseDataUtil.getStandardTime(request.deliveryTime), + appName: appMessage.appName, + want: request.wantAgent, + bundleName: request.creatorBundleName, + actionButtons: request.actionButtons, + smallIcon: NotificationConfig.USE_NOTIFICATION_ICON ? (request?.smallIcon ?? appMessage.icon) : appMessage.icon, + largeIcon: request.largeIcon, + slotLevel: slotLevel, + source: request.source + }; + Log.showInfo(TAG, `notificationItem construct over ====================`); + switch (request?.content?.contentType) { + case NotificationManager.TYPE_BASIC: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_BASIC_TEXT ====================`); + notificationItem.title = request.content.normal?.title ?? ''; + notificationItem.text = request.content.normal?.text ?? ''; + notificationItem.additionalText = request.content.normal?.additionalText ?? ''; + break; + case NotificationManager.TYPE_LONG: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_LONG_TEXT ====================`); + notificationItem.title = request.content.longText?.title ?? ''; + notificationItem.text = request.content.longText?.text ?? ''; + notificationItem.additionalText = request.content.longText?.additionalText ?? ''; + notificationItem.briefText = request.content.longText?.briefText ?? ''; + notificationItem.expandedTitle = request.content.longText?.expandedTitle ?? ''; + notificationItem.longText = request.content.longText?.longText ?? ''; + break; + case NotificationManager.TYPE_MULTI: + Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_MULTILINE ====================`); + notificationItem.title = request.content.multiLine?.title ?? ''; + notificationItem.text = request.content.multiLine?.text ?? ''; + notificationItem.additionalText = request.content.multiLine?.additionalText ?? ''; + notificationItem.briefText = request.content.multiLine?.briefText ?? ''; + notificationItem.longTitle = request.content.multiLine?.longTitle ?? ''; + notificationItem.lines = request.content.multiLine?.lines ?? mEmptyArray; + Log.showInfo(TAG, `multilines: ${JSON.stringify(request.content.multiLine?.lines)}`) + break; + default: + Log.showInfo(TAG, 'no match content type'); + break; + } + callback(Constants.SUCCESS_CALLBACK, notificationItem); + }) + } + + /** + * Get app data by bundleName. + * + * @param {string} bundleName - BundleName of the target app. + * @return {object} appData + */ + static getAppData(bundleName, callback) { + Log.showInfo(TAG, 'getAppName start ===================='); + if (appDataMap.has(bundleName)) { + callback(Constants.SUCCESS_CALLBACK,appDataMap.get(bundleName)); + return; + } + BundleManager.getBundleInfo(TAG, bundleName, 0, (data) => { + Log.showInfo(TAG, `getBundleInfo` + JSON.stringify(data)); + let labelId = data.appInfo.labelId; + let iconId = data.appInfo.iconId; + let appName = ''; + BundleManager.getResourceManager(TAG, bundleName, (item) => { + Log.showInfo(TAG, `BundleManager.getResourceManager ${BundleManager.getResourceManager}`); + item.getString(labelId, (error, value) => { + Log.showInfo(TAG, `getString` + JSON.stringify(value)); + if (value != null && value != undefined) { + appName = value + } + item.getMediaBase64(iconId, (error, MediaValue) => { + Log.showInfo(TAG, `getMediaBase64` + JSON.stringify(MediaValue)); + if (MediaValue != null) { + let appMessage = { + 'appName': appName, + 'icon': MediaValue + } + Log.showInfo(TAG, `appDataMap set appInfo, appName = ` + JSON.stringify(appName)); + if (appName != null && appName != undefined && appName != '') { + appDataMap.set(bundleName, appMessage); + } + Log.showInfo(TAG, `getAppData success, appMessage ` + JSON.stringify(appMessage)); + callback(Constants.SUCCESS_CALLBACK,appDataMap.get(bundleName)); + } + }); + }) + }) + }); + } + + /** + * Reformat the timestamp to hh:mm. + * + * @param {number} timestamp - Target timestamp. + */ + static getStandardTime(timestamp) { + Log.showInfo(TAG, 'getStandardTime start ===================='); + if (timestamp == 0 || timestamp == undefined || timestamp == null) { + return ''; + } + mDate.setTime(timestamp); + let hoursNumber = mDate.getHours(); + let minutesNumber = mDate.getMinutes(); + let hours = hoursNumber < 10 ? '0' + hoursNumber : hoursNumber; + let minutes = minutesNumber < 10 ? '0' + minutesNumber : minutesNumber; + return hours + ':' + minutes; + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets new file mode 100644 index 00000000..ddf8ff81 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2021 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 interface RuleData { + isAllowBanner:boolean; + sound:string; + vibration:string; + isAllowLockScreen:boolean; +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets new file mode 100644 index 00000000..d0578417 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2021 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 {NotificationItemData} from '../../common/constants.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'RuleController'; + +export default class RuleController { + + + /** + * Check if this notification is allow show or not + * + * @param {notificationItemData} Data of the notification + * @param {callback} Data of the type to show the notification + */ + static getNotificationData(notificationItemData, callback) { + if (typeof notificationItemData !== NotificationItemData) { + Log.showInfo(TAG, "type is not NotificationItemData") + callback(undefined) + return + } + + this.this.isAllowSendNotification(notificationItemData.name, 0, "", (isSuccess) => { + if (!isSuccess) { + Log.showInfo(TAG, "user is not allow this to send notification") + callback(undefined) + return + } + this.isTooMuchNotification((isSuccess) => { + if (!isSuccess) { + Log.showInfo(TAG, "There are too much notification") + callback(undefined) + return + } + this.isAppTooMuchNotification(notificationItemData.name, 0, (isSuccess) => { + if (!isSuccess) { + Log.showInfo(TAG, "There are too much notification") + callback(undefined) + } + this.getNotificationDataByApp(notificationItemData.name, 0, "", (originData) => { + this.updateNotificationDataBySense(originData, (finialData) => { + callback(finalData) + }); + }); + }); + }); + }); + } + + /** + * Check if user allow the app send notification or not + * + * @param {name} Package name of the app + * @param {uid} Uid of the app to distinguish twin app + * @param {channelId} The channel id of the app which is used to send notification + * @param {callback} The user allow the app send notification or not + */ + private static isAllowSendNotification(name, uid, channelId, callback) { + // TODO 权限管理 + } + + /** + * Check there have been too much notification that there is no need to show another + * + * + * @param {callback} Send too much notification or not + */ + private static isTooMuchNotification(callback) { + // TODO 通知总条数显示限制 + } + + /** + * Check if the app send too much notification to can not show another from this app + * + * + * @param {name} Package name of the app + * @param {uid} Uid of the app to distinguish twin app + * @param {callback} Send too much notification or not + */ + private static isAppTooMuchNotification(name, uid, callback) { + // TODO 单应用通知显示限制 + } + + /** + * Get notification data of the notification channel + * + * @param {name} Package name of the app which send notification + * @param {uid} Uid of the app which send notification to distinguish twin app + * @param {channelId} The channel id of the app which is used to send notification + * @param {callback} The type to show notification + */ + private static getNotificationDataByApp(name, uid, channelId, callback) { + // TODO 提醒方式 + } + + /** + * Check the sense of the phone to update the show type + * + * @param {notificationData} The origin notification data + * @param {callback} The finial notification data + */ + private static updateNotificationDataBySense(notificationData, callback) { + // TODO 场景管理 + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets new file mode 100644 index 00000000..2cafbbfa --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import Constants from '../common/constants.ets'; +import NotificationItem from './item/notificationItem.ets' +import ViewModel from '../viewmodel/ViewModel.ets' + +const TAG = 'NoticeItem-NotificationListComponent'; + +@Component +export default struct NotificationListComponent { + @StorageLink('notificationList') notificationList: any[] = [] + @StorageProp('maxHeight') maxHeight: number = 0 + @StorageProp('minHeight') minHeight: number = 0 + @State notificationH: number = 0 + + + aboutToAppear() { + Log.showInfo(TAG, `notificationList, aboutToAppear`) + this.notificationH = this.maxHeight - (this.minHeight * 2) - Constants.QUICKLY_SETTING_H; + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`); + } + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + if (this.notificationList.length == 0) { + //text: no notification + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Text($r('app.string.nonotification_text')) + .fontColor($r('app.color.nonotification_text_color')) + } + } else { + Stack({ alignContent: Alignment.TopStart }) { + List() { + ForEach(this.notificationList, (item: any) => { + ListItem() { + NotificationItem({ itemData: item }) + } + }, (item: any) => item.hashcode.toString()) + } + .onTouch((event: TouchEvent) => { + Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) + event.stopPropagation(); + }) + + Flex() { //bottom Line + }.width('100%').height('7%') + .opacity($r('app.float.deleteall_image_opacity')) + .position({ x: 0, y: '93%' }) + } + .width('100%') + .height('100%') + } + } + .width('100%') + .height(this.notificationH) + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets new file mode 100644 index 00000000..d2751d7a --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 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 Constants,{NotificationItemData} from '../../common/constants.ets'; + +@Component +export default struct BasicItem { + @State itemData: NotificationItemData= undefined + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.itemData.title) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + Text(this.itemData.text) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Clip }) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .margin({ top: $r('app.float.content_margin_top') }) + }.width('100%') + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets new file mode 100644 index 00000000..96f024fc --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2021 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 Constants from '../../common/constants.ets'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'NoticeItem-Confirm'; + +/** + * confirm dialog + */ +@CustomDialog +export default struct ConfirmDialog { + private title: string + private bundleName: string + public controller: CustomDialogController + public action: () => void + + build() { + + Column({ space: 30 }) { + Row() { + Text(this.title) + .fontSize($r('app.float.confirm_title_fontsize')) + .fontWeight(FontWeight.Bold) + }.width(Constants.SETTING_DIALOG_WITH) + .margin({ top: 20 }) + + Row() { + Text($r('app.string.confirm_message', this.bundleName)) + .fontSize($r('app.float.confirm_cont_fontsize')) + }.width(Constants.SETTING_DIALOG_WITH) + + Row() { + Column() { + Text($r('app.string.cancel')) + .fontSize($r('app.float.confirm_cont_fontsize')) + .fontColor(Color.Blue) + }.onClick(() => { + this.controller.close(); + }) + .alignItems(HorizontalAlign.Center) + .width(Constants.CONFIRM_BUTTON_WITH) + + Divider() + .vertical(true) + .color($r('app.color.confirm_divider_color')) + .strokeWidth(1) + .height($r('app.float.confirm_divider_height')) + Column() { + Text($r('app.string.close')) + .fontSize($r('app.float.confirm_cont_fontsize')) + .fontColor(Color.Red) + + }.onClick(() => { + Log.showInfo(TAG, `confirm button of TimeDialog on click`) + this.controller.close(); + this.action(); + }) + .alignItems(HorizontalAlign.Center) + .width(Constants.CONFIRM_BUTTON_WITH) + } + .width(Constants.CONFIRM_DIALOG_WITH) + .height($r('app.float.confirm_button_height')) + }.height(Constants.CONFIRM_DIALOG_HEIGHT) + + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets new file mode 100644 index 00000000..b6151895 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 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 Constants,{NotificationItemData} from '../../common/constants.ets'; + +@Component +export default +struct LongItem { + @State itemData: NotificationItemData= undefined + @Prop isExpand: boolean + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.isExpand ? this.itemData.expandedTitle : this.itemData.title) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) //not support Resource type + Text(this.isExpand ? this.itemData.longText : this.itemData.text) + .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .constraintSize({ maxHeight: $r('app.float.notification_expanded_text_maxheight') }) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .margin({ top: $r('app.float.content_margin_top') }) + }.width('100%') + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets new file mode 100644 index 00000000..4b972453 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021 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 Constants,{NotificationItemData} from '../../common/constants.ets'; + +@Component +export default struct MultiItem { + @State itemData: NotificationItemData= undefined + @Prop isExpand: boolean + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Text(this.isExpand ? this.itemData.longTitle : this.itemData.title) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.notification_title_fontsize')) + .fontColor($r('app.color.title_text_color')) + .fontWeight(FontWeight.Bold) + .lineHeight(Constants.CONTENT_LINE_HEIGHT) + if (this.isExpand) { + ForEach(this.itemData.lines, + (item: string) => { + Text(`${item}`) + .fontSize($r('app.float.notification_content_fontsize')) + .fontColor($r('app.color.content_text_color')) + .margin({ top: $r('app.float.content_margin_top') }) + }, (item: string) => item.toString() + ) + } else { + Text(this.itemData.text) + .fontSize($r('app.float.notification_content_fontsize')) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r('app.color.content_text_color')) + .margin({ top: $r('app.float.content_margin_top') }) + } + }.width('100%') + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets new file mode 100644 index 00000000..8f84a5bc --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2021 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 Constants,{NotificationItemData} from '../../common/constants.ets'; +import basicItem from './basicItem.ets'; +import longItem from './longItem.ets'; +import multiItem from './multiItem.ets'; +import titleItem from './titleItem.ets'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import WantAgent from '@ohos.wantAgent'; +import ViewModel from '../../viewmodel/ViewModel.ets'; +import SettingDialog from './settingDialog.ets'; +import ConfirmDialog from './confirmDialog.ets' + +const TAG = 'NoticeItem-NotificationItem'; + +@Component +export default struct NotificationItem { + private itemData: any = {} + @State hasPicture: boolean = false + @State isExpand: boolean = false + @State needExpand: boolean = true + @State deleteIconDisplay : boolean = false; + @State itemWidth: string = '100%' + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 + + settingDialogController: CustomDialogController = new CustomDialogController({ + builder: SettingDialog({ + itemData: this.itemData, + action: this.showConfirmDialog.bind(this) + }), + autoCancel: false, + offset: { dx: 0, dy: 200 } + }); + + confirmDialogController: CustomDialogController = new CustomDialogController({ + builder: ConfirmDialog({ + title: $r('app.string.closeNovice'), + bundleName: this.itemData.name, + action: ViewModel.removeNotificationItem.bind(ViewModel,this.itemData,true) + }), + autoCancel: false, + offset: { dx: 0, dy: 250 } + }); + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { + this.hasPicture = false; + } else { + this.hasPicture = true; + } + this.needExpand=this.checkItemNeedExpand() + } + + checkItemNeedExpand(){ + if(this.itemData.contentType===Constants.NOTIFICATION_TYPE_BASIC&&(!(this.itemData.actionButtons?.length>0))){ + return false; + }else{ + return true; + } + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`); + } + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + Row() { + Column() { + titleItem({ + notificationSmallIcon: this.itemData.smallIcon, + notificationName: this.itemData.appName, + notificationTime: this.itemData.time, + isExpand: $isExpand, + needExpand: this.needExpand + }) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC) { + basicItem({ + itemData: this.itemData + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { + longItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { + multiItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + } + .width(this.hasPicture ? '85%' : '100%') + .margin({ top: $r('app.float.body_margin_top') }) + + if (this.hasPicture) { + Column() { + Image(this.itemData.largeIcon) + .objectFit(ImageFit.Contain) + .width(50) + .height(50) + } + .alignItems(HorizontalAlign.End) + .width('15%') + } + } + .onClick(() => { + ViewModel.startTargetAbility(this.itemData); + }) + + if (this.isExpand) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + ForEach(this.itemData.actionButtons, (item: any) => { + Text(item.title) + .fontSize(20) + .height(30) + .fontColor(Color.Blue) + .margin({ right: 20 }) + .onClick(() => { + ViewModel.startTargetAbility(this.itemData); + }) + }) + } + .margin({ top: 10 }) + } + } + .backgroundColor($r('app.color.notificationitem_background')) + .opacity($r('app.float.item_opicaty')) + .borderRadius($r('app.float.item_borderradius')) + .margin({ + left: $r('app.float.item_marginleft'), + right: $r('app.float.item_marginright'), + top: $r('app.float.item_margintop') + }) + .padding({ + left: $r('app.float.item_paddingleft'), + right: $r('app.float.item_paddingright'), + bottom: $r('app.float.item_paddingbottom') + }) + .onTouch(this.touchNotificationItem.bind(this)) + .width(this.itemWidth) + + if (this.deleteIconDisplay) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { + Row({ space: 30 }) { + Image($r("app.media.ic_setting")) //setting + .objectFit(ImageFit.Contain) + .width($r('app.float.item_delete_image_width')) + .height($r('app.float.item_delete_image_height')) + .onClick(this.showSettingDialog.bind(this)) + Image($r('app.media.delete')) //delete + .objectFit(ImageFit.Contain) + .width($r('app.float.item_delete_image_width')) + .height($r('app.float.item_delete_image_height')) + .onClick(() => { + ViewModel.removeNotificationItem(this.itemData, true); + }) + } + } + .width('30%') + } + } + } + } + + showSettingDialog() { + Log.showInfo(TAG, `showSettingDialog`) + this.settingDialogController.open() + } + + showConfirmDialog() { + Log.showInfo(TAG, `showConfirmDialog`) + this.confirmDialogController.open() + } + touchNotificationItem(event: TouchEvent) { + if (event.type == Constants.TOUCH_TYPE_DOWN) { //down + this.startX = event.touches[0].x; + this.startY = event.touches[0].y; + Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`); + } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move + this.moveX = event.touches[0].x - this.startX; + this.moveY = event.touches[0].y - this.startY; + } else if (event.type == Constants.TOUCH_TYPE_UP) { //up + Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); + if (this.deleteIconDisplay) { + if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { + //hidden + this.deleteIconDisplay = false; + this.itemWidth = '100%'; + Log.showInfo(TAG, 'hidden'); + } + } else { + if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { + this.deleteIconDisplay = true; + this.itemWidth = '70%'; + Log.showInfo(TAG, 'display'); + } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { + ViewModel.removeNotificationItem(this.itemData, true); + } + } + } + } + +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets new file mode 100644 index 00000000..4c011d83 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2021 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 Constants,{NotificationItemData} from '../../common/constants.ets'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import FeatureAbilityManager from '../../../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; +import WindowManager from '../../../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import Notification from '@ohos.notification'; + +const TAG = 'NoticeItem-Setting'; + +/** + * Setting dialog + */ +@CustomDialog +export default struct SettingDialog { + private itemData: NotificationItemData + public controller: CustomDialogController + public action: () => void + + build() { + + Column({ space: 30 }) { + Row({ space: 10 }) { + if (!CheckEmptyUtils.isEmpty(this.itemData.smallIcon)) { + Image(this.itemData.smallIcon) + .objectFit(ImageFit.Contain) + .width($r('app.float.title_image_width')) + .height($r('app.float.title_image_height')) + } + Text(this.itemData.appName) + .fontSize($r('app.float.setting_title_fontsize')) + }.width(Constants.SETTING_DIALOG_WITH) + .margin({ top: 50 }) + + Row() { + Column() { + Text($r('app.string.closeNotification')) + .fontSize($r('app.float.setting_cont_fontsize')) + .fontColor($r('app.color.dialog_font_color')) + .height(Constants.SETTING_CONT_HEIGHT) + + }.alignItems(HorizontalAlign.Center) + .width(Constants.SETTING_CONTENT_WITH) + } + .width(Constants.SETTING_DIALOG_WITH) + .alignItems(VerticalAlign.Center) + .align(Alignment.Center) + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.setting_border_radius') }) + .backgroundColor($r('app.color.dialog_font_back_color')) + .onClick(this.closeNotification.bind(this)) + + Row() { + Column() { + Text($r('app.string.moreSettings')) + .fontSize($r('app.float.setting_cont_fontsize')) + .fontColor($r('app.color.dialog_font_color')) + .height(Constants.SETTING_CONT_HEIGHT) + }.alignItems(HorizontalAlign.Center) + .width(Constants.SETTING_CONTENT_WITH) + } + .width(Constants.SETTING_DIALOG_WITH) + .alignItems(VerticalAlign.Center) + .align(Alignment.Center) + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.setting_border_radius') }) + .backgroundColor($r('app.color.dialog_font_back_color')) + .onClick(this.openAbility.bind(this)) + + Row() { + Column() { + Text($r('app.string.cancel')) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.setting_cont_fontsize')) + .fontColor($r('app.color.dialog_font_back_color')) + .height(Constants.SETTING_CONT_HEIGHT) + }.alignItems(HorizontalAlign.Center) + .width(Constants.SETTING_CONTENT_WITH) + } + .width(Constants.SETTING_DIALOG_WITH) + .alignItems(VerticalAlign.Center) + .align(Alignment.Center) + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.setting_border_radius') }) + .backgroundColor($r('app.color.dialog_font_color')) + .onClick(this.closeAbility.bind(this)) + }.height(Constants.SETTING_DIALOG_HEIGHT) + } + + closeNotification() { + this.action() + this.closeAbility() + } + + openAbility() { + Log.showInfo(TAG, ` openAbility:showNotificationManagement`) + let mWindowManager = new WindowManager(); + mWindowManager.setWindowMin((result) => { + Log.showInfo(TAG, `showNotificationManagement setWindowMin`) + let mFeatureAbilityManager = new FeatureAbilityManager() + mFeatureAbilityManager.openAbility(TAG, { + want: { + bundleName: 'com.ohos.systemui', + abilityName: 'com.ohos.systemui.notificationmanagement.MainAbility' + } + }); + }); + AppStorage.Set("showStatusBar", true); + this.closeAbility() + } + + closeAbility() { + Log.showInfo(TAG, `closeAbility`) + this.controller.close() + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets new file mode 100644 index 00000000..beaaa7eb --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2021 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 Constants from '../../common/constants.ets'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; + +const TAG = 'NoticeItem-TitleItem'; + +@Component +export default +struct TitleItem { + private notificationSmallIcon: PixelMap + @Prop notificationName: string + @Prop notificationTime: string + @State srcIconDisplay: any = $r('app.media.ic_notification_down') + @Link isExpand: boolean + @Prop needExpand: boolean + @State rowSpace: any = $r('app.float.titleitem_row_space') + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`); + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`); + } + + build() { + Row() { + Row({ space: this.rowSpace }) { + if (!CheckEmptyUtils.isEmpty(this.notificationSmallIcon)) { + Image(this.notificationSmallIcon) + .objectFit(ImageFit.Contain) + .width($r('app.float.title_image_width')) + .height($r('app.float.title_image_height')) + .flexShrink(0) + } + Text(this.notificationName) + .maxLines(Constants.DEFAULT_MAX_LINES) + .fontSize($r('app.float.title_name_fontsize')) + .flexShrink(1) + Text(this.notificationTime) + .fontSize($r('app.float.title_time_fontsize')) + .flexShrink(0) + } + .width(this.needExpand ? '80%' : '100%') + + if (this.needExpand) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End, alignItems: ItemAlign.Center }) { + Image(this.srcIconDisplay) + .objectFit(ImageFit.Contain) + .width($r('app.float.displayicon_width')) + .height($r('app.float.displayicon_height')) + } + .width('20%') + } + } + .height($r('app.float.titleitem_height')) + .width('100%') + .onClick(this.clickTitleItem.bind(this)) + } + + clickTitleItem() { + Log.showInfo(TAG, 'clickTitleItem'); + if (this.needExpand) { + if (this.isExpand) { + this.isExpand = false; + this.srcIconDisplay = $r('app.media.ic_notification_down'); + } else { + this.isExpand = true; + this.srcIconDisplay = $r('app.media.ic_notification_up'); + } + } + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets new file mode 100644 index 00000000..e6d35b46 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets @@ -0,0 +1,314 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import media from '@ohos.multimedia.media'; +import NotificationService from '../model/NotificationService.ets' +import wantAgent from '@ohos.wantAgent'; +import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; +import SourceType from '@ohos.notification' +import NotificationConfig from '../model/NotificationConfig.ets'; +import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; + +const TAG = 'NotificationViewModel'; +const GROUP_THRESHOLD = 10; +/** + * Notification ViewModel class. + */ +export class ViewModel { + mWindowManager: WindowManager + audioPlayer: any + mNotificationList: any[]; + mAppNotificationCount: any; + mCallback: any; + mNotificationCtrl: any = {} + + constructor() { + this.mWindowManager = new WindowManager(); + let tempLink = AppStorage.SetAndLink('notificationList', []); + this.mNotificationList = tempLink.get(); + this.mAppNotificationCount = new Map(); + this.audioPlayer = media.createAudioPlayer(); + this.audioPlayer.src = 'file://system/etc/Light.ogg'; + this.registerCallback(); + this.loadFlowControlInfos() + } + + registerCallback() { + this.mCallback = { + onNotificationConsume: this.onNotificationConsume.bind(this), + onNotificationCancel: this.onNotificationCancel.bind(this), + onNotificationLoad: this.onNotificationLoad.bind(this) + } + NotificationService.register(this.mCallback); + } + + unregisterCallback() { + NotificationService.unRegister(this.mCallback); + } + + + /** + * notification CancelCallback + * + * @param {Object} data - return notificationItemData. + */ + onNotificationConsume(notificationItemData) { + Log.showInfo(TAG, `onNotificationConsume ${JSON.stringify(notificationItemData)}`); + //Verify the notifications can be displayed + if (!this.isCanShow(notificationItemData.bundleName)) { + //can not displayed + return; + } + if (!this.mAppNotificationCount.has(notificationItemData.appName)) { + this.mAppNotificationCount.set(notificationItemData.appName, 0); + } + this.mAppNotificationCount[notificationItemData.appName] += 1; + if (this.mAppNotificationCount[notificationItemData.appName] >= GROUP_THRESHOLD) { + this.groupNotification(notificationItemData, this.mAppNotificationCount[notificationItemData.appName]); + } else { + // Todo 排序插入 + this.mNotificationList.unshift(notificationItemData); + this.updateFlowControlInfos(notificationItemData.bundleName, true) + this.updateNotification(); + } + // Todo doAction(notificationItemData); 根据ruleData做处理 + } + + /** + * notification CancelCallback + */ + onNotificationCancel(notificationItemData) { + Log.showInfo(TAG, `onNotificationCancel ${JSON.stringify(notificationItemData)}`); + if (this.mAppNotificationCount[notificationItemData.appName] >= GROUP_THRESHOLD) { + // 组通知删除逻辑处理 + return; + } + // 普通通知删除逻辑处理 + for (let i = 0, len = this.mNotificationList.length; i < len; i++) { + if (this.mNotificationList[i].hashcode == notificationItemData.hashcode) { + Log.showInfo(TAG, `onNotificationCancel i = ${i}`); + this.mAppNotificationCount[notificationItemData.appName] -= 1; + let removeItemArr = this.mNotificationList.splice(i, 1); + Log.showInfo(TAG, `onNotificationCancel removeItemArr= ${JSON.stringify(removeItemArr)}`); + if (!CheckEmptyUtils.isEmpty(removeItemArr)) { + this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + } + break; + } + } + } + + onNotificationLoad() { + + } + + + /** + * notification CancelCallback + * + * @param {Object} data - return notificationItemData. + */ + groupNotification(notificationItemData, num) { + if (num == GROUP_THRESHOLD) { + // 组通知转化 + } else { + // 组通知添加 + } + } + + updateNotification() { + Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(this.mNotificationList)}`); + Log.showInfo(TAG, `updateNotification len: ${this.mNotificationList.length}`); + this.sortNotification() + let listLink = AppStorage.Link('notificationList'); + listLink.set(this.mNotificationList); + Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(listLink.get())}`); + } + + /** + * Sort the notifications. + */ + sortNotification() { + Log.showInfo(TAG, `sortNotification`); + if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { + return + } + this.mNotificationList.sort((itemA, itemB) => { + //long term notification come first + if (itemA.source == SourceType.TYPE_CONTINUOUS && itemB.source != SourceType.TYPE_CONTINUOUS) { + return -1 + } + //long term notification come first + if (itemA.source != SourceType.TYPE_CONTINUOUS && itemB.source == SourceType.TYPE_CONTINUOUS) { + return 1 + } + if ((itemA.source == SourceType.TYPE_CONTINUOUS && itemB.source == SourceType.TYPE_CONTINUOUS) || + (itemA.source != SourceType.TYPE_CONTINUOUS && itemB.source != SourceType.TYPE_CONTINUOUS) + ) { + return -1 * (itemA.timestamp - itemB.timestamp) + } + }) + } + + /** + * Remove all notifications. + */ + removeAllNotifications() { + if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { + this.mNotificationList = [] + } else { + + let index = this.mNotificationList.length + while (index--) { + Log.showInfo(TAG, `mNotificationList[${index}].source: ${this.mNotificationList[index].source}`); + //Except the Long term notifications + if (this.mNotificationList[index].source != SourceType.TYPE_CONTINUOUS) { + Log.showInfo(TAG, `mNotificationList[${index}].hashcode: ${this.mNotificationList[index].hashcode}`); + let hashCode = this.mNotificationList[index].hashcode + this.removeSysNotificationItem(hashCode) + let removeItemArr = this.mNotificationList.splice(index, 1) + Log.showInfo(TAG, `removeAllNotifications removeItemArr= ${JSON.stringify(removeItemArr)}`); + if (!CheckEmptyUtils.isEmpty(removeItemArr)) { + this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + } + } + } + } + this.updateNotification() + } + + removeNotificationItem(itemData, isDelSysConent) { + Log.showInfo(TAG, `removeNotificationItem, hashcode: ${itemData.hashcode}`); + for (let i = 0, len = this.mNotificationList.length; i < len; i++) { + if (this.mNotificationList[i].hashcode == itemData.hashcode) { + Log.showInfo(TAG, `this.mNotificationList[i].hashcode=${this.mNotificationList[i].hashcode}, itemData.hashcode=${itemData.hashcode}`); + Log.showInfo(TAG, `removeNotificationItem i = ${i}`); + this.mAppNotificationCount[itemData.appName] -= 1; + let removeItemArr = this.mNotificationList.splice(i, 1); + Log.showInfo(TAG, `removeNotificationItem removeItemArr= ${JSON.stringify(removeItemArr)}`); + if (!CheckEmptyUtils.isEmpty(removeItemArr)) { + this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + } + break; + } + } + this.updateNotification(); + if (isDelSysConent) { + this.removeSysNotificationItem(itemData.hashcode); + } + + } + + removeSysNotificationItem(hashcode) { + NotificationService.remove(hashcode); + } + + startTargetAbility(itemData) { + Log.showInfo(TAG, 'startTargetAbility'); + //close window + AppStorage.Set("showStatusBar", true); + this.mWindowManager.setWindowMin((result) => { + Log.showInfo(TAG, `setWindowMin ${result}`); + }); + //open app + Log.showInfo(TAG, `itemClick wantAgent ${JSON.stringify(itemData.want)} id: ${itemData.id}`); + let TriggerInfo = { + code: 0, + want: '', + permission: '', + extraInfo: {} + }; + wantAgent.trigger(itemData.want, TriggerInfo, ((err, data) => { + Log.showInfo(TAG, `itemClick wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); + })); + //remove notification + this.removeNotificationItem(itemData, true); + } + + loadFlowControlInfos() { + Log.showInfo(TAG, 'loadFlowControlInfos enter'); + let notificationConfig = NotificationConfig.readNotificationConfig('statusbar') + Log.showInfo(TAG, 'NotificationConfig: ' + JSON.stringify(notificationConfig)); + if (CheckEmptyUtils.isEmpty(notificationConfig)) { + Log.showInfo(TAG, 'NotificationConfig is no definition'); + Log.showInfo(TAG, 'loadFlowControlInfos end'); + return + } + + this.mNotificationCtrl['currentTotal'] = 0; + this.mNotificationCtrl['limitTotal'] = notificationConfig.limitTotal + this.mNotificationCtrl['app'] = new Map(); + for (let item of notificationConfig.app) { + let tmp = { + 'canShow': item.canShow, + 'currentNum': 0, + 'limit': item.limit + } + this.mNotificationCtrl['app'].set(item.bundleName, tmp); + } + Log.showInfo(TAG, 'mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); + Log.showInfo(TAG, 'loadFlowControlInfos end'); + } + + isCanShow(bundleName: string): boolean { + Log.showInfo(TAG, 'isCanShow'); + let result: boolean = true + if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { + let currentTotal = this.mNotificationCtrl['currentTotal'] + let limitTotal = this.mNotificationCtrl['limitTotal'] + Log.showInfo(TAG, `isCanShow Total: currentTotal=${currentTotal},limitTotal=${limitTotal}`); + if (currentTotal + 1 > limitTotal) { + result = false + } else if (this.mNotificationCtrl['app'].has(bundleName)) { + let tmp = this.mNotificationCtrl['app'].get(bundleName) + Log.showInfo(TAG, `isCanShow appTotal: canShow=${tmp['canShow']},tmp['currentNum']=${tmp['currentNum']}`); + if (tmp['canShow'] === false || (tmp['currentNum'] + 1 > tmp['limit'])) { + result = false + } + } + } + Log.showInfo(TAG, `isCanShow :${result}`); + return result; + } + + updateFlowControlInfos(bundleName: string, plusOrMinus: boolean): void { + Log.showInfo(TAG, `updateFlowControlInfos`); + if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { + if (this.mNotificationCtrl['app'].has(bundleName)) { + let tmp = this.mNotificationCtrl['app'].get(bundleName) + if (plusOrMinus) { + tmp['currentNum'] += 1 + } else if (tmp['currentNum'] > 0) { + tmp['currentNum'] -= 1 + } + this.mNotificationCtrl['app'].set(bundleName, tmp) + } + + if (plusOrMinus) { + this.mNotificationCtrl['currentTotal'] += 1 + } else if (this.mNotificationCtrl['currentTotal'] > 0) { + this.mNotificationCtrl['currentTotal'] -= 1 + } + } + + Log.showInfo(TAG, `updateFlowControlInfos:${JSON.stringify(this.mNotificationCtrl)}`); + } + +} + +let viewModel = new ViewModel(); + +export default viewModel as ViewModel; \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/color.json b/features/noticeitem/src/main/resources/base/element/color.json new file mode 100644 index 00000000..b1f4afa9 --- /dev/null +++ b/features/noticeitem/src/main/resources/base/element/color.json @@ -0,0 +1,36 @@ +{ + "color": [ + { + "name":"notificationitem_background", + "value":"#ffffff" + }, + { + "name":"title_text_color", + "value":"#222D37" + }, + { + "name":"content_text_color", + "value":"#FF435563" + }, + { + "name":"name_text_color", + "value":"#435563" + }, + { + "name": "nonotification_text_color", + "value": "#ffffffff" + }, + { + "name":"dialog_font_color", + "value":"#ffffff" + }, + { + "name":"dialog_font_back_color", + "value":"#0759f6" + }, + { + "name": "confirm_divider_color", + "value": "#E3E3E3" + } + ] +} \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json new file mode 100644 index 00000000..ba70de74 --- /dev/null +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -0,0 +1,148 @@ +{ + "float": [ + { + "name": "notification_title_fontsize", + "value": "20" + }, + { + "name": "notification_expanded_text_maxheight", + "value": "295" + }, + { + "name": "notification_content_fontsize", + "value": "20" + }, + { + "name": "notification_content_lineheight", + "value": "20" + }, + { + "name": "notification_content_maxlines", + "value": "1" + }, + { + "name": "content_margin_top", + "value": "10" + }, + { + "name": "body_margin_top", + "value": "10" + }, + { + "name": "item_opicaty", + "value": "0.9" + }, + { + "name": "item_borderradius", + "value": "20" + }, + { + "name": "item_margintop", + "value": "10" + }, + { + "name": "item_marginleft", + "value": "10" + }, + { + "name": "item_marginright", + "value": "10" + }, + { + "name": "item_paddingleft", + "value": "20" + }, + { + "name": "item_paddingright", + "value": "20" + }, + { + "name": "item_paddingbottom", + "value": "20" + }, + { + "name": "item_setting_image_width", + "value": "30" + }, + { + "name": "item_setting_image_height", + "value": "30" + }, + { + "name": "item_delete_image_width", + "value": "30" + }, + { + "name": "item_delete_image_height", + "value": "30" + }, + { + "name": "titleitem_row_space", + "value": "10" + }, + { + "name": "titleitem_height", + "value": "50" + }, + { + "name": "title_image_width", + "value": "30" + }, + { + "name": "title_image_height", + "value": "30" + }, + { + "name": "title_name_fontsize", + "value": "20" + }, + { + "name": "title_time_fontsize", + "value": "20" + }, + { + "name": "displayicon_width", + "value": "20" + }, + { + "name": "displayicon_height", + "value": "20" + }, + { + "name": "deleteall_image_opacity", + "value": "0.9" + }, + { + "name": "setting_title_fontsize", + "value": "28" + }, + { + "name": "setting_cont_fontsize", + "value": "26" + }, + { + "name": "setting_border_width", + "value": "1" + }, + { + "name": "setting_border_radius", + "value": "30" + }, + { + "name": "confirm_title_fontsize", + "value": "28" + }, + { + "name": "confirm_cont_fontsize", + "value": "26" + }, + { + "name": "confirm_divider_height", + "value": "20" + }, + { + "name": "confirm_button_height", + "value": "60" + } + ] +} \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/string.json b/features/noticeitem/src/main/resources/base/element/string.json new file mode 100644 index 00000000..16b52e48 --- /dev/null +++ b/features/noticeitem/src/main/resources/base/element/string.json @@ -0,0 +1,36 @@ +{ + "string": [ + { + "name": "noticeitem", + "value": "noticeitem" + }, + { + "name": "nonotification_text", + "value": "无通知" + }, + { + "name": "closeNotification", + "value": "关闭通知" + }, + { + "name": "moreSettings", + "value": "更多设置" + }, + { + "name": "cancel", + "value": "取消" + }, + { + "name": "close", + "value": "关闭" + }, + { + "name": "closeNovice", + "value": "关闭通知" + }, + { + "name": "confirm_message", + "value": "是否关掉”%s“的所有通知?" + } + ] +} diff --git a/features/noticeitem/src/main/resources/base/media/delete.png b/features/noticeitem/src/main/resources/base/media/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..143463751f103bbf00d204cbbd40982b9a5a6ec1 GIT binary patch literal 4061 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 P00000NkvXXu0mjf(|(n6 literal 0 HcmV?d00001 diff --git a/features/noticeitem/src/main/resources/base/media/ic_notification_down.png b/features/noticeitem/src/main/resources/base/media/ic_notification_down.png new file mode 100644 index 0000000000000000000000000000000000000000..690ffa8c311a2ec33de3612a5f063c67758e3410 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0D$(}BbArXh)PCdzcKtX`{E?a6& zVCJ;A6^(xu$+T>kQS0)l=3uge0)t|Uz}DY$BAX5c1O#r}S{Cqv z%UWioea@159hwT8H;eY&@o6=Fymm&!Bz2?86^jiYMfJFx?EWii{x9>J2=^D;vr2zw zXD!^fGq22Oz)k!c~3>pn$p)g zpH3!z=69`%KchE){kjvI1%J%hetqZM56sLA4AF&5i(2PiwMi8@40IlYr>mdKI;Vst E09jyCt^fc4 literal 0 HcmV?d00001 diff --git a/features/noticeitem/src/main/resources/base/media/ic_setting.png b/features/noticeitem/src/main/resources/base/media/ic_setting.png new file mode 100644 index 0000000000000000000000000000000000000000..8d30e3686f820dcfd0ba79e8193aec4f0271ee27 GIT binary patch literal 2788 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 { + Log.showInfo(TAG, `notificationItem AppName = ${JSON.stringify(AppName)}`); + let notificationItem:NotificationItemData = this.parseRequest(request,AppName.appName,AppName.icon) + Log.showInfo(TAG, `notificationItem = ${JSON.stringify(notificationItem)}`); + if(slotLevel===SlotLevel.LEVEL_HIGH){ + try{ + this.media.play() + }catch(e){ + Log.showInfo(TAG, `notificationItem id${notificationItem.id} alert error: ${e.toString()}`); + } + } + switch (processType) { + case Constants.GET_NEW_NOTIFICATION: + this.removeNotificationItem(notificationItem['hashcode'], false); + mNotificationList.unshift(notificationItem); +// mNotificationList.sort(this.compare('timestamp')); + this.updateNotification(); + break; + case Constants.GET_EXIST_NOTIFICATION: + mNotificationList.unshift(notificationItem); + this.updateNotification(); + break; + default: + Log.showInfo(TAG, 'no match process type'); + break; + } + }); + } + + /** + * Get app name with bundleName. + * + * @param {string} bundleName - BundleName of the target app. + */ + getAppName(bundleName, callback) { + Log.showInfo(TAG, 'getAppName start ===================='); + if (mAppName.has(bundleName)) { + callback(mAppName.get(bundleName)); + Log.showInfo(TAG, 'HAS BUNDLENAME'); + } else { + BundleManager.getBundleInfo(TAG, bundleName, 0, (data) => { + Log.showInfo(TAG, `getBundleInfo` + JSON.stringify(data)); + let labelId = data.appInfo.labelId; + let iconId = data.appInfo.iconId; + let appName = ''; + BundleManager.getResourceManager(TAG, bundleName, (item) => { + Log.showInfo(TAG, `BundleManager.getResourceManager ${BundleManager.getResourceManager}`); + item.getString(labelId, (error, value) => { + Log.showInfo(TAG, `getString` + JSON.stringify(value)); + if (value != null && value != undefined) { + appName = value + } + item.getMediaBase64(iconId, (error, MediaValue) => { + Log.showInfo(TAG, `getMediaBase64` + JSON.stringify(MediaValue)); + if (MediaValue != null) { + let appMessage = { + 'appName': appName, + 'icon': MediaValue + } + if (appName != null && appName != undefined && appName != '') { + mAppName.set(bundleName, appMessage); + } + callback(appMessage); + } + }); + }) + }) + }); + Log.showInfo(TAG, 'getAppName end ===================='); + } + } + + /** + * notification CancelCallback + * + * @param {Object} err - return err Message. + * @param {Object} data - return data Message. + */ + OnCancelCallback(err, data) { + console.info("===>OnCancelCallback data : ==> " + ` err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); + this.removeNotificationItem(data.request.hashCode, false); + } + + onUpdateCallback(err, data) { + Log.showInfo(TAG, `onUpdateCallback = ${JSON.stringify(data.request)}`); + } + + /** + * The callback will be called after registered callback. + * + * @param {Object} err - Error may occur. + * @param {Object} data - Callback data. + */ + subscribeCallback(err, data) { + Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + } + + /** + * Reformat the timestamp to hh:mm. + * + * @param {number} timestamp - Target timestamp. + */ + getStandardTime(timestamp) { + Log.showInfo(TAG, 'getStandardTime start ===================='); + if (timestamp == 0 || timestamp == undefined || timestamp == null) { + return ''; + } + mDate.setTime(timestamp); + let hoursNumber = mDate.getHours(); + let minutesNumber = mDate.getMinutes(); + let hours = hoursNumber < 10 ? '0' + hoursNumber : hoursNumber; + let minutes = minutesNumber < 10 ? '0' + minutesNumber : minutesNumber; + return hours + ':' + minutes; + } + + /** + * Compare method will be used when sorting a two-dimensional array. + * + * @param {string} property - Property in the object will be sorted. + */ + compare(params) { + return function (item1, item2) { + var itemTime1 = item1[params]; + var itemTime2 = item2[params]; + return itemTime2 - itemTime1; + } + } + + /** + * Remove all notifications. + */ + removeAllNotifications() { + mNotificationList = [] + this.updateNotification() + NotificationManager.removeAll(TAG, (err, data) => { + Log.showInfo(TAG, `removeAll , err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + }); + } + + removeNotificationItem(hashCode, isDelSysConent) { + Log.showInfo(TAG, `removeNotificationItem start, hashCode: ${hashCode}`); + for (let i = 0, len = mNotificationList.length; i < len; i++) { + if (mNotificationList[i].hashcode == hashCode) { + Log.showInfo(TAG, `removeNotificationItem i = ${i}`); + mNotificationList.splice(i, 1); + // mNotificationList.pop(i); + break; + } + } + this.updateNotification() + if (isDelSysConent) { + this.removeSysNotificationItem(hashCode); + } + } + + removeSysNotificationItem(hashCode) { + NotificationManager.remove(TAG, hashCode, (err, data) => { + Log.showInfo(TAG, `removeNotificationItem, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + }) + Log.showInfo(TAG, `removeNotificationItem end, length: ${mNotificationList.length}`); + } + + getAllActiveNotifications() { + Log.showInfo(TAG, `getAllActiveNotifications`); + NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { + Log.showInfo(TAG, `getAllActiveNotifications err: ${JSON.stringify(err)}`); + Log.showInfo(TAG, `getAllActiveNotifications requestsArr: ${JSON.stringify(requestsArr)}`); + if (Array.isArray(requestsArr)) { + for(let i = 0,len = requestsArr.length; i< len; i++) { + this.handleRequest(requestsArr[i],null, Constants.GET_EXIST_NOTIFICATION); + } + } else { + mNotificationList = []; + } + }) + } +} + +let notificationService = new NotificationService(); +export default notificationService as NotificationService; \ No newline at end of file diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets b/features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets new file mode 100644 index 00000000..8f1432f4 --- /dev/null +++ b/features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 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 default class Constants { + static GET_NEW_NOTIFICATION: number = 0; + static GET_EXIST_NOTIFICATION: number = 1; +} + +export interface NotificationItemData{ + id:string; + hashcode:string; + contentType:string; + timestamp:string; + time:string; + name:string; + want:any; + actionButtons:any[]; + bundleName:string; + smallIcon?:Resource|string; + largeIcon?:Resource|string; + title?:string; + text?:string; + additionalText?:string; + briefText?:string; + expandedTitle?:string; + longText?:string; + lines?:any[]; + longTitle?:string; +} \ No newline at end of file diff --git a/features/notificationservice/src/main/resources/base/element/string.json b/features/notificationservice/src/main/resources/base/element/string.json new file mode 100644 index 00000000..04635cab --- /dev/null +++ b/features/notificationservice/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "quicklysetting_library", + "value": "quicklysetting_library" + } + ] +} diff --git a/features/screenlock/build.gradle b/features/screenlock/build.gradle new file mode 100644 index 00000000..771c40b2 --- /dev/null +++ b/features/screenlock/build.gradle @@ -0,0 +1,22 @@ +apply plugin: 'com.huawei.ohos.library' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + implementation project(':common') + implementation project(':features:batterycomponent') +} diff --git a/features/screenlock/src/main/config.json b/features/screenlock/src/main/config.json new file mode 100644 index 00000000..22f124fc --- /dev/null +++ b/features/screenlock/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.screenlock", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.screenlock", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "screenlock", + "moduleType": "har" + }, + "srcPath": "default" + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/common/constants.ets b/features/screenlock/src/main/ets/com/ohos/common/constants.ets new file mode 100644 index 00000000..60addc47 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/common/constants.ets @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2021 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 default class Constants { + static WIN_NAME = "ScreenLockWindow" + + //Shortcut params + static SHORTCUT_CIRCLE_WIDTH = '80px' + static SHORTCUT_CIRCLE_HEIGHT = '80px' + static SHORTCUT_TEXT_SIZE = '24px' + static SHORTCUT_TEXT_WIDTH = '48px' + static SHORTCUT_TEXT_HEIGHT = '34px' + static SHORTCUT_BLOCK_HEIGHT = '10px' + static SHORTCUT_HEIGHT = '150px' + + //layout params - Pic + static FULL_CONTAINER_WIDTH = '100%' + static FULL_CONTAINER_HEIGHT = '100%' + static HALF_CONTAINER_WIDTH = '50%' + + //The refresh interval + static INTERVAL = 1000 + + //digitalpssword mask diameter + static DIGITALPSD_IC_DIAMETER = 12 + + //digitalpssword keybord background diameter + static DIGITALPSD_BUTTON_DIAMETER = 60 + + //digitalpssword keybord background diameter + static DIGITALPSD_BUTTON_RECT_WH = 100 + static DIGITALPSD_BUTTON_RECT_HH = 50 + + //digital keybord + static CALL_PHONE = -1 + static DEL_PWD = -2 + static GO_BACK = -3 + static NUMKEY_BOARD = [{index: 0, row1: '1', row2: ' ', value: 1, bkg: false}, + {index: 1, row1: '2', row2: 'ABC', value: 2, bkg: false}, + {index: 2, row1: '3', row2: 'DEF', value: 3, bkg: false}, + {index: 3, row1: '4', row2: 'GHI', value: 4, bkg: false}, + {index: 4, row1: '5', row2: 'JKL', value: 5, bkg: false}, + {index: 5, row1: '6', row2: 'MNO', value: 6, bkg: false}, + {index: 6, row1: '7', row2: 'PQRS', value: 7, bkg: false}, + {index: 7, row1: '8', row2: 'TUV', value: 8, bkg: false}, + {index: 8, row1: '9', row2: 'WXYZ', value: 9, bkg: false}, + {index: 9, row1: $r('app.string.emergency_call'), row2: '', value: Constants.CALL_PHONE, bkg: false}, + {index: 10,row1: '0', row2: '+', value: 0, bkg: false}, + {index: 11,row1: $r('app.string.back'), row2: '', value: Constants.GO_BACK, bkg: false}]; + //max password length + static PASSWORD_MAX_LEN = 32 + +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/data/userData.ets b/features/screenlock/src/main/ets/com/ohos/data/userData.ets new file mode 100644 index 00000000..47f7fdc2 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/data/userData.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2022 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 interface UserData { + userId:number; + userName:string; + userIconPath:string; +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ets b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ets new file mode 100644 index 00000000..f7d00b23 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ets @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2022 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 account_osAccount from '@ohos.account.osAccount' +import commonEvent from '@ohos.commonEvent'; +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import {UserData} from '../data/userData.ets' + +const TAG = "ScreenLock-AccountsModel" +const TYPE_ADMIN = 0; +const TYPE_NORMAL = 1; +const TYPE_GUEST = 2; + +let mCommonEventSubscribeInfo = { + events: [ + commonEvent.Support.COMMON_EVENT_USER_ADDED, + commonEvent.Support.COMMON_EVENT_USER_REMOVED + ] +}; + +let mEventSubscriber + +export default class AccountsModel { + modelInit() { + Log.showInfo(TAG, "start ModelInit") + this.getAllUsers() + commonEvent.createSubscriber(mCommonEventSubscribeInfo, this.createSubscriberCallBack.bind(this)); + Log.showInfo(TAG, "start ModelInit finish") + } + + private createSubscriberCallBack(err, data) { + Log.showInfo(TAG, "start createSubscriberCallBack " + JSON.stringify(data)) + mEventSubscriber = data + commonEvent.subscribe(data, this.getAllUsers.bind(this)); + Log.showInfo(TAG, "start createSubscriberCallBack finish") + } + + private getAllUsers() { + Log.showInfo(TAG, "start getAllUsers") + let tempLink = AppStorage.SetAndLink('userList', []); + let accountList = tempLink.get(); + let count = accountList.length; + accountList.splice(0, count) + Log.showInfo(TAG, "start query") + account_osAccount.getAccountManager().queryAllCreatedOsAccounts().then((list) => { + Log.showInfo(TAG, "start sort") + list.sort(this.sortAccount.bind(this)); + for (const user of list) { + Log.showInfo(TAG, "start get user" + JSON.stringify(user)) + if (user.isActived) { + AppStorage.SetOrCreate('userId', user.localId) + } + account_osAccount.getAccountManager().getOsAccountProfilePhoto(user.localId).then((path) => { + Log.showInfo(TAG, "start get photo:" + path) + let userData: UserData = { + userId: user.localId, + userName: user.localName, + userIconPath: path + } + accountList.push(userData) + }) + } + }) + } + + private sortAccount(info1, info2): number { + if (info1.isActived || info2.isActived) { + return info1.isActived ? -1 : 1; + } else if (info1.type.ADMIN == TYPE_ADMIN || info2.type.ADMIN == TYPE_ADMIN) { + return info1.type.ADMIN == TYPE_ADMIN ? -1 : 1; + } else if ( info1.type.GUEST == TYPE_GUEST || info2.type.GUEST == TYPE_GUEST) { + return info1.type.GUEST == TYPE_GUEST ? 1 : -1; + } else { + return info2.localId - info1.localId; + } + } + + + onUserSwitch(userId: number) { + Log.showInfo(TAG, "onUserSwitch:" + userId) + account_osAccount.getAccountManager().activateOsAccount(userId).then(() => { + Log.showInfo(TAG, "activateOsAccount") + }) + Log.showInfo(TAG, "onUserSwitch:" + userId + "finish") + } + + modelFinish() { + Log.showInfo(TAG, "start modelFinish") + commonEvent.unsubscribe(mEventSubscriber); + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ets b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ets new file mode 100644 index 00000000..2f261ea0 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ets @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import ScreenLockMar from '@ohos.screenlock'; +import featureAbility from '@ohos.ability.featureAbility' +import settings from '@ohos.settingsnapi'; +import windowManager from '@ohos.window' +import Constants from '../common/constants.ets' +import UserIDM from '@ohos.useridm' +import UserAuth from '@ohos.userauth' +import PinAuth from '@ohos.pinauth' +import util from '@ohos.util'; +import WallpaperMar from '@ohos.app.wallpaperability' + +const TAG = 'ScreenLock-ScreenLockModel'; + +export enum AuthType { + //Authentication type pin. + PIN = 1, + //Authentication type face. + FACE = 2 +} + +export enum AuthSubType { + //Authentication sub type six number pin. + PIN_SIX = 10000, + //Authentication sub type self defined number pin. + PIN_NUMBER = 10001, + //Authentication sub type mixed number pin. + PIN_MIXED = 10002, + //Authentication sub type 2D face. + FACE_2D = 20000, + //Authentication sub type 3D face. + FACE_3D = 20001 +} + +export enum AuthTurstLevel { + //Authentication result trusted level 1. + ATL1 = 10000, + //Authentication result trusted level 2. + ATL2 = 20000, + //Authentication result trusted level 3. + ATL3 = 30000, + //Authentication result trusted level 4. + ATL4 = 40000 +} + +export enum GetPropertyType { + //Authentication remain times. + AUTH_SUB_TYPE = 1, + //Authentication remain times. + REMAIN_TIMES = 2, + //Authentication remain times. + FREEZING_TIME = 3 +} + +export enum ResultCode { + //success + SUCCESS = 0, + //fails + FAIL = 1, +} + +export default class ScreenLockModel { + static UserIdentityManager = new UserIDM.UserIdentityManager(); + static UserAuthManager = new UserAuth.UserAuth(); + static PINAuthManager = new PinAuth.PINAuth(); + + static getScreenLockWallpaper(callback) { + Log.showInfo(TAG, 'getScreenLockWallpaper'); + WallpaperMar.getPixelMap(WallpaperMar.WALLPAPER_LOCKSCREEN, callback) + } + + static eventListener(typeName: string, callback) { + Log.showInfo(TAG, `eventListener:typeName ${typeName}`); + ScreenLockMar.on(typeName, (err, data) => { + Log.showInfo(TAG, `eventListener:callback err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); + callback(data); + }) + } + + static sendScreenLockEvent(typeName: string, typeNo: number, callback) { + Log.showInfo(TAG, `sendScreenLockEvent: typeName ${typeName} typeNo ${typeNo} `); + ScreenLockMar.sendScreenLockEvent(typeName, typeNo, (err, data) => { + Log.showInfo(TAG, `sendScreenLockEvent:callback err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); + callback(err, data); + }) + } + + static showScreenLockWindow(callback) { + Log.showInfo(TAG, 'showScreenLockWindow'); + windowManager.find(Constants.WIN_NAME).then((win) => { + Log.showInfo(TAG, 'find window finish'); + win.show().then(() => { + Log.showInfo(TAG, `window show`); + callback(); + }) + }) + } + + static hiddenScreenLockWindow(callback) { + Log.showInfo(TAG, 'hiddenScreenLockWindow'); + windowManager.find(Constants.WIN_NAME).then((win) => { + Log.showInfo(TAG, 'find window finish'); + win.hide().then(() => { + Log.showInfo(TAG, `window hide`); + callback(); + }) + }) + } + + static timeFormatMonitor(callback): void { + Log.showInfo(TAG, 'timeFormatMonitor'); + let urivar = settings.getUri('settings.time.format') + let helper = featureAbility.acquireDataAbilityHelper(urivar); + callback(ScreenLockModel.isUsing24hFormat(helper)); + helper.on("dataChange", urivar, (err) => { + if (err.code !== 0) { + Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); + return; + } else { + callback(ScreenLockModel.isUsing24hFormat(helper)); + } + Log.showInfo(TAG, 'observer reveive notifychange on success data : ' + JSON.stringify(err)) + }) + } + + static isUsing24hFormat(helper): boolean { + Log.showInfo(TAG, 'isUsing24hFormat'); + let isUsing24hFormat: boolean = false; + let getRetValue = settings.getValue(helper, 'settings.time.format', '24') + if (getRetValue === '12') { + isUsing24hFormat = false; + } else if (getRetValue === '24') { + isUsing24hFormat = true; + } + return isUsing24hFormat; + } + + static openIDMSession(callback) { + Log.showInfo(TAG, 'openIDMSession'); + ScreenLockModel.UserIdentityManager.openSession().then((credentialId) => { + Log.showInfo(TAG, `openIDMSession credentialId:${credentialId}`); + callback(credentialId); + }).catch((error) => { + Log.showInfo(TAG, `openIDMSession error:${JSON.stringify(error)}`); + }) + } + + static closeIDMSession() { + Log.showInfo(TAG, 'closeIDMSession'); + ScreenLockModel.UserIdentityManager.closeSession(); + } + + static authUser(userId: number, challenge, callback) { + Log.showInfo(TAG, `authUser param: userId ${userId} challenge ${challenge}`); + ScreenLockModel.UserAuthManager.authUser(userId, challenge, AuthType.PIN, + AuthTurstLevel.ATL4, { + onResult: (result, extraInfo) => { + Log.showInfo(TAG, `authUser UserAuthManager.authUser onResult`); + callback(result, extraInfo); + }, + onAcquireInfo: (moduleId, acquire, extraInfo) => { + Log.showInfo(TAG, `authUser UserAuthManager.authUser onAcquireInfo`); + } + } + ) + } + + static getAuthProperty(authType, keyArray, callback) { + Log.showInfo(TAG, `getAuthProperty param: authType ${authType} keyArray ${keyArray}`); + let request = { + 'authType': authType, + 'keys': keyArray + } + ScreenLockModel.UserAuthManager.getProperty(request).then((properties) => { + Log.showInfo(TAG, `getAuthProperty properties ${JSON.stringify(properties)}`); + callback(properties) + }) + } + + static registerPWDInputer(passType, password): Promise { + Log.showInfo(TAG, `registerPWDInputer`); + return new Promise(function (resolve, reject) { + let result = ScreenLockModel.registerInputer(passType, password); + if (!result) { + Log.showInfo(TAG, `registerPWDInputer again`); + ScreenLockModel.unregisterInputer(); + ScreenLockModel.registerInputer(passType, password); + } + if (result) { + resolve(); + } else { + reject(); + } + }) + } + + static registerInputer(passType, password): boolean { + Log.showInfo(TAG, `registerInputer`); + let result = ScreenLockModel.PINAuthManager.registerInputer({ + onGetData: (passType, inputData) => { + Log.showInfo(TAG, `registerInputer onSetData passType:${passType}`); + let textEncoder = new util.TextEncoder(); + let uint8PW = textEncoder.encode(password); + Log.showInfo(TAG, `registerInputer onSetData call`); + inputData.onSetData(passType, uint8PW); + } + }) + Log.showInfo(TAG, `registerInputer result:${result} `); + return result; + } + + static unregisterInputer() { + Log.showInfo(TAG, `unregisterInputer`); + ScreenLockModel.PINAuthManager.unregisterInputer(); + } +} diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets new file mode 100644 index 00000000..c925330d --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; +import ScreenLockModel, {AuthType, AuthSubType, GetPropertyType} from './screenLockModel'; +import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets'; +import Router from '@system.router'; + +const TAG = 'ScreenLock-ScreenLockService'; +const URI_DIGITALPASSWORD = 'pages/digitalPassword' +const URI_MIXEDPASSWORD = 'pages/mixedPassword' +const URI_CUSTOMPASSWORD = 'pages/customPassword' + + +//Event type name +const EVENT_BEGIN_WAKEUP: string = 'beginWakeUp' //设备将要唤醒 +const EVENT_END_WAKEUP: string = 'endWakeUp' //设备唤醒 +const EVENT_BEGIN_SCREENON: string = 'beginScreenOn' //开始亮屏 +const EVENT_END_SCREENON: string = 'endScreenOn' //设备亮屏 +const EVENT_BEGIN_SCREENOFF: string = 'beginScreenOff' //开始灭屏 +const EVENT_END_SCREENOFF: string = 'endScreenOff' //设备灭屏 +const EVENT_UNLOCK_SCREEN: string = 'unlockScreen' //请求屏幕解锁 +const EVENT_BEGIN_EXITANIMATION: string = 'beginExitAnimation' //动画结束 +const EVENT_BEGIN_SLEEP: string = 'beginSleep' // 设备将要休眠 +const EVENT_END_SLEEP: string = 'endSleep' //设备休眠 +const EVENT_CHANGE_USER: string = 'changeUser' //切换用户 +const EVENT_SCREENLOCK_ENABLE: string = 'screenlockEnabled' //锁屏锁屏应用是否可用 + +const UNLOCK_SCREEN_RESULT: string = 'unlockScreenResult' //请求解锁 +const SCREENLOCK_DRAW_DONE: string = 'screenDrawDone' // 解锁界面绘制完成 +const CHALLENGE_INT = 0 + +const MAIN_USER = 100 + +export enum UnlockResult { + Success = 0, + Fail = 1, + Cancel = 2 +} + +export {AuthSubType}; + +export class ScreenLockService { + init() { + Log.showInfo(TAG, 'init'); + this.lockScreen(); + this.monitorEvents(); + } + + monitorEvents() { + Log.showInfo(TAG, 'registered events start'); + + //设备将要唤醒 + ScreenLockModel.eventListener(EVENT_BEGIN_WAKEUP, (data) => { + Log.showInfo(TAG, `EVENT_BEGIN_WAKEUP event data:${JSON.stringify(data)}`); + this.lockScreen(); + }) + + //设备唤醒 + ScreenLockModel.eventListener(EVENT_END_WAKEUP, (data) => { + Log.showInfo(TAG, `EVENT_END_WAKEUP event data:${JSON.stringify(data)}`); + this.lockScreen(); + }) + + //开始亮屏 + ScreenLockModel.eventListener(EVENT_BEGIN_SCREENON, (data) => { + Log.showInfo(TAG, `EVENT_BEGIN_SCREENON event data:${JSON.stringify(data)}`); + this.lockScreen(); + }) + + //设备亮屏 + ScreenLockModel.eventListener(EVENT_END_SCREENON, (data) => { + Log.showInfo(TAG, `EVENT_END_SCREENON event data:${JSON.stringify(data)}`); + this.lockScreen(); + }) + + //设备将要休眠 + ScreenLockModel.eventListener(EVENT_BEGIN_SLEEP, (data) => { + Log.showInfo(TAG, `EVENT_BEGIN_SLEEP event data:${JSON.stringify(data)}`); + this.lockScreen(); + }) + + //设备休眠 + ScreenLockModel.eventListener(EVENT_END_SLEEP, (data) => { + Log.showInfo(TAG, `EVENT_END_SLEEP event data:${JSON.stringify(data)}`); + this.lockScreen(); + }) + + //设备灭屏 + ScreenLockModel.eventListener(EVENT_END_SCREENOFF, (data) => { + Log.showInfo(TAG, `EVENT_END_SCREENOFF event data:${JSON.stringify(data)}`); + this.lockScreen(); + }) + + //切换用户 + ScreenLockModel.eventListener(EVENT_CHANGE_USER, (data) => { + Log.showInfo(TAG, `EVENT_CHANGE_USER event data:${JSON.stringify(data)}`); + this.lockScreen(); + }) + + //接收到屏幕解锁请求 + ScreenLockModel.eventListener(EVENT_UNLOCK_SCREEN, (data) => { + Log.showInfo(TAG, `EVENT_UNLOCK_SCREEN event data:${JSON.stringify(data)}`); + this.unlockScreen(); + }); + + Log.showInfo(TAG, 'registered events end'); + } + + lockScreen() { + Log.showInfo(TAG, `lockScreen`); + let status = AppStorage.Link('lockStatus') + Log.showInfo(TAG, `lockScreen lockStatus.get:${status?.get()}`); + let length = Router.getLength() + Log.showInfo(TAG, `Router.getLength: ${length}`) + for (let index = 1;index < length; index++) { + Log.showInfo(TAG, `back to index`); + Router.back(); + } + if (!!status && status.get() == ScreenLockStatus.Locking) { + Log.showInfo(TAG, `lockScreen return`); + return; + } + //set the lockStatus to 'locking' + AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Locking); + //lock the screen + ScreenLockModel.showScreenLockWindow(() => { + Log.showInfo(TAG, `showScreenLockWindow finish`); + }); + } + + unlockScreen() { + Log.showInfo(TAG, `unlockScreen`); + ScreenLockModel.getAuthProperty(AuthType.PIN, [GetPropertyType.AUTH_SUB_TYPE, GetPropertyType.REMAIN_TIMES, + GetPropertyType.FREEZING_TIME], (properties) => { + Log.showInfo(TAG, `unlockScreen:AUTH_SUB_TYPE:${properties.authSubType}`); + switch (properties.authSubType) { + case AuthSubType.PIN_SIX: + Log.showInfo(TAG, `unlockScreen Router.push:digitalPassword`); + Router.push({ uri: URI_DIGITALPASSWORD }); + break; + case AuthSubType.PIN_MIXED: + Log.showInfo(TAG, `unlockScreen Router.push:mixedPassword`); + Router.push({ uri: URI_MIXEDPASSWORD }); + break; + case AuthSubType.PIN_NUMBER: + Log.showInfo(TAG, `unlockScreen Router.push:customPassword`); + Router.push({ uri: URI_CUSTOMPASSWORD }); + break; + default: + Log.showInfo(TAG, `unlock the screen`); + this.unlocking(); + } + }); + } + + unlocking() { + Log.showInfo(TAG, `unlocking`); + let status = AppStorage.Link('lockStatus') + Log.showInfo(TAG, `unlocking lockStatus:${JSON.stringify(status?.get())}`); + if (!!status && status.get() == ScreenLockStatus.Unlock) { + Log.showInfo(TAG, `unlocking return`); + return; + } + //set the lockStatus to 'Unlock' + AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Unlock); + //unlock the screen + ScreenLockModel.hiddenScreenLockWindow(() => { + Log.showInfo(TAG, `hiddenScreenLockWindow finish`); + //notify the base service that the unlock is completed + this.notifyScreenResult(UnlockResult.Success); + }); + } + + notifyScreenResult(result: UnlockResult) { + Log.showInfo(TAG, `notifyScreenResult`); + ScreenLockModel.sendScreenLockEvent(UNLOCK_SCREEN_RESULT, result, (error, data) => { + Log.showInfo(TAG, `notifyScreenResult: error:${JSON.stringify(error)} data:${JSON.stringify(data)}`); + }); + } + + notifyDrawDone() { + Log.showInfo(TAG, `notifyDrawDone`); + //notify the base service that the screen is loaded + ScreenLockModel.sendScreenLockEvent(SCREENLOCK_DRAW_DONE, 0, (error, result) => { + Log.showInfo(TAG, `notifyDrawDone: error:${JSON.stringify(error)} result:${JSON.stringify(result)}`); + }); + } + + authUser(authSubType: AuthSubType, passwordData: number[] | string, callback): void { + Log.showInfo(TAG, `authUser authSubType:${authSubType}`); + let password: string = ''; + if (typeof passwordData == 'string') { + password = passwordData; + } else { + password = passwordData.join(''); + } + ScreenLockModel.registerPWDInputer(authSubType, password).then(() => { + Log.showInfo(TAG, `registerPWDInputer success`); + let userIdLink = AppStorage.Link('userId'); + ScreenLockModel.authUser(userIdLink?.get() ?? MAIN_USER, CHALLENGE_INT, (result, extraInfo) => { + Log.showInfo(TAG, `authUser callback:${result} extraInfo:${JSON.stringify(extraInfo)}`); + ScreenLockModel.unregisterInputer(); + callback(result, extraInfo); + }) + }).catch(() => { + Log.showInfo(TAG, `registerPWDInputer fails`); + }) + } + + goBack() { + Log.showInfo(TAG, `goBack`); + Router.back(); + ScreenLockModel.unregisterInputer(); + } +} + + +let screenLockService = new ScreenLockService(); + +export default screenLockService as ScreenLockService; \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets new file mode 100644 index 00000000..6916ec70 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import {ReadConfigFile} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' + + +const FILE_URI = '/data/accounts/account_0/applications/com.ohos.screenlock' ++ '/com.ohos.screenlock/assets/{0}/resources/rawfile/screenlock.json' +const TAG = 'ScreenLock-ScreenlockStyle'; + + +export enum LockStyleMode { + SlideScreenLock = 1, + JournalScreenLock = 2, + CustomScreenLock = 3 +} + +class ScreenlockStyle { + private screenMode: LockStyleMode = LockStyleMode.SlideScreenLock + + setMode(mode: LockStyleMode): number { + Log.showInfo(TAG, 'setMode:${mode}'); + return this.screenMode = mode + } + + getMode(): number { + Log.showInfo(TAG, 'getMode'); + return this.screenMode + } + + readMode(deviceType: string): number{ + Log.showInfo(TAG, `readMode deviceType:${deviceType}`); + let modeJson = ReadConfigFile(FILE_URI.replace('{0}', deviceType)) + Log.showInfo(TAG, `ReadConfigFile content:` + JSON.stringify(modeJson)); + this.screenMode = modeJson.mode + return this.screenMode + } +} + +let screenlockStyle = new ScreenlockStyle() + +export default screenlockStyle as ScreenlockStyle \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets new file mode 100644 index 00000000..60eae9f1 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import ViewModel from '../../vm/accountsViewModel.ets' +import Constants from '../../common/constants.ets' +import {UserData} from '../../data/userData.ets' + +const TAG = 'ScreenLock-Accounts' + +@Component +export default struct Accounts { + @StorageLink("userList") accountList: UserData[] = [] + private mViewModel: ViewModel = new ViewModel() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.viewModelInit() + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + this.mViewModel.viewModelFinish() + } + + build() { + Row() { + List() { + ForEach(this.accountList, (item: any) => { + ListItem() { + UserItem({ userItem: item, viewModel: this.mViewModel }) + } + }) + } + .listDirection(Axis.Horizontal) + } + + } +} + +@Component +struct UserItem { + private userItem: any; + private viewModel: ViewModel; + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) { + if (this.userItem.userIconPath.length == 0) { + Image($r('app.media.ic_user_portrait')) + .width(Constants.SHORTCUT_CIRCLE_WIDTH) + .height(Constants.SHORTCUT_CIRCLE_WIDTH) + } else { + Image(this.userItem.userIconPath) + .width(Constants.SHORTCUT_CIRCLE_WIDTH) + .height(Constants.SHORTCUT_CIRCLE_WIDTH) + } + Text(this.userItem.userName) + .fontSize(Constants.SHORTCUT_TEXT_SIZE) + .fontColor($r('app.color.shortcut_text_color')) + //.fontWeight(FontWeight.Bold) + } + .onClick(event => { + this.viewModel.onUserSwitch(this.userItem.userId) + }) + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets new file mode 100644 index 00000000..c72444e8 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import ViewModel from '../../vm/batterySocViewModel.ets' +import Constants from '../../common/constants.ets' + +const TAG = 'ScreenLock-BatterySoc' + +@Component +export default struct BatterySoc { + @State mViewModel: ViewModel = new ViewModel() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit() + } + + build() { + Text(this.mViewModel.batterySocStr) + .fontSize($r('app.float.batterysoc_fontsize')) + .fontColor($r('app.color.batterysoc_text_color')) + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets new file mode 100644 index 00000000..47c017c3 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../../common/constants.ets' +import NumkeyBoard from './numkeyBoard.ets' +import ViewModel from '../../vm/customPSDViewModel.ets' + +const TAG = 'ScreenLock-CustomPSD' + +@Component +export default struct CustomPSD { + @State mViewModel: ViewModel = new ViewModel() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + Text(this.mViewModel.prompt) + .fontSize($r('app.float.custompsd_prompt_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .margin({ bottom: $r('app.float.custompsd_prompt_margin_bottom') }) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .width($r('app.float.custompsd_prompt_width')) + .height($r('app.float.custompsd_prompt_height')) + + TextInput({ placeholder: '', text: this.mViewModel.password }) + .type(InputType.Password) + .maxLength(Constants.PASSWORD_MAX_LEN) + .fontSize($r('app.float.custompsd_prompt_fontsize')) + .width($r('app.float.custompsd_input_width')) + .height($r('app.float.custompsd_input_height')) + .backgroundColor(Color.White) + .enterKeyType(EnterKeyType.Done) + .border({ width: 2, color: Color.Gray, radius: 15 }) + .enabled(false) + .margin({ bottom: $r('app.float.custompsd_input_margin_bottom') }) + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Text($r('app.string.emergency_call')) + .fontSize($r('app.float.custompsd_prompt_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .onClick(this.mViewModel.onCallPhone.bind(this.mViewModel)) + + Text($r('app.string.done')) + .fontSize($r('app.float.custompsd_prompt_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .onClick(() => { + Log.showInfo(TAG, `onClick`) + this.mViewModel.onAuthPassword(() => { + Log.showInfo(TAG, `onClick callback promptText:${JSON.stringify(this.mViewModel.prompt)}`) + }); + }) + } + .width(Constants.HALF_CONTAINER_WIDTH) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height($r('app.float.custompsd_input_area_height')) + .margin({ bottom: $r('app.float.custompsd_passwdmask_margin_bottom') }) + + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + NumkeyBoard({ + onKeypress: (index, callback) => this.mViewModel.onKeyPress(index, callback) + }) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height($r('app.float.custompsd_key_area_height')) + .margin({ bottom: $r('app.float.custompsd_key_area_margin_bottom') }) + } + .width(Constants.FULL_CONTAINER_WIDTH) + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/dateTime.ets b/features/screenlock/src/main/ets/com/ohos/view/component/dateTime.ets new file mode 100644 index 00000000..f9e9fb3d --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/view/component/dateTime.ets @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import ViewModel from '../../vm/dateTimeViewModel.ets' +import Constants from '../../common/constants.ets' +import {ScreenLockStatus} from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' + +const TAG = 'ScreenLock-DateTime' + +@Component +export default struct DateTime { + @StorageLink('lockStatus') @Watch("onStatusChange") lockStatus: ScreenLockStatus = ScreenLockStatus.Locking + @State mViewModel: ViewModel = new ViewModel() + private isShowData: boolean= true + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit() + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + this.mViewModel.stopPolling() + } + + build() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + Text(this.mViewModel.timeVal) + .fontSize($r('app.float.time_fontsize')) + .fontColor($r('app.color.date_time_color')) + .margin({ top: $r('app.float.time_top_margin'), bottom: $r('app.float.time_bottom_margin') }) + if (this.isShowData) { + Row() { + Text($r('app.string.yyyy_mm_dd', this.mViewModel.dateVal.year, this.mViewModel.dateVal.month, this.mViewModel.dateVal.day)) + .fontSize($r('app.float.date_fontsize')) + .fontColor($r('app.color.date_time_color')) + Text(this.mViewModel.weekVal).fontSize($r('app.float.date_fontsize')) + .fontColor($r('app.color.date_time_color')) + } + } + } + .width(Constants.FULL_CONTAINER_WIDTH) + } + + onStatusChange(propName: string): void { + Log.showInfo(TAG, `onStatusChange`) + this.mViewModel.onStatusChange(this.lockStatus) + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets new file mode 100644 index 00000000..ba506167 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../../common/constants.ets' +import NumkeyBoard from './numkeyBoard.ets' +import ViewModel from '../../vm/digitalPSDViewModel.ets' + +const TAG = 'ScreenLock-DigitalPSD' + +@Component +export default struct DigitalPSD { + @State mViewModel: ViewModel = new ViewModel() + @StorageLink('passwdMaskArr') passwdMaskArr: any[] = this.mViewModel.passwdMaskArr + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + Text(this.mViewModel.prompt) + .fontSize($r('app.float.digitalpsd_prompt_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .margin({ bottom: $r('app.float.digitalpsd_prompt_margin_bottom') }) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .width($r('app.float.digitalpsd_prompt_width')) + .height($r('app.float.digitalpsd_prompt_height')) + + Grid() { + ForEach(this.passwdMaskArr, (item) => { + GridItem() { + Column() + .backgroundColor(item) + .clip(new Circle({ width: Constants.DIGITALPSD_IC_DIAMETER, height: Constants.DIGITALPSD_IC_DIAMETER })) + .width(Constants.DIGITALPSD_IC_DIAMETER) + .height(Constants.DIGITALPSD_IC_DIAMETER) + .border({ width: 2, color: $r('app.color.circle_background'), radius: 45 }) + .alignItems(HorizontalAlign.Center) + } + }) + } + .columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr') + .width($r('app.float.digitalpsd_passwdmask_width')) + .height($r('app.float.digitalpsd_passwdmask_height')) + .margin(0) + } + .margin({ bottom: $r('app.float.digitalpsd_passwdmask_margin_bottom') }) + .width(Constants.FULL_CONTAINER_WIDTH) + .height( $r('app.float.digitalpsd_input_area_height')) + .flexShrink(1) + + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + NumkeyBoard({ + onKeypress: (index, callback) => this.mViewModel.onKeyPress(index, callback) + }) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height($r('app.float.digitalpsd_key_area_height')) + .margin({ bottom: $r('app.float.digitalpsd_key_area_margin_bottom') }) + .flexShrink(0) + } + .width(Constants.FULL_CONTAINER_WIDTH) + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets new file mode 100644 index 00000000..da2c37a5 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import {ScreenLockStatus} from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' +import ViewModel from '../../vm/lockIconViewModel.ets' +import Constants from '../../common/constants.ets' + +const TAG = 'ScreenLock-LockIcon' + +@Component +export default struct LockIcon { + @StorageLink('lockStatus') @Watch("onStatusChange") lockStatus: ScreenLockStatus = ScreenLockStatus.Locking + @State mViewModel: ViewModel = new ViewModel() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit() + } + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Image(this.mViewModel.iconPath) + .margin({ top: $r('app.float.lockicon_top_margin'), bottom: $r('app.float.lockicon_bottom_margin') }) + .objectFit(ImageFit.Contain) + .width($r('app.float.lockicon_width')) + .height($r('app.float.lockicon_height')) + .fillColor($r('app.color.lock_ic_color')) + Text(this.mViewModel.cutMessage).fontSize($r('app.float.lock_prompt_fontsize')) + .fontColor($r('app.color.lock_prompt_color')) + } + .width(Constants.FULL_CONTAINER_WIDTH) + } + + onStatusChange(propName: string): void { + Log.showInfo(TAG, `onStatusChange`) + Log.showInfo(TAG, `lockStatus:${this.lockStatus}`); + this.mViewModel.onStatusChange(this.lockStatus) + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets new file mode 100644 index 00000000..552b0cc4 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../../common/constants.ets' +import ViewModel from '../../vm/mixedPSDViewModel.ets' + +const TAG = 'ScreenLock-MixedPSD' + +@Component +export default struct MixedPSD { + @State mViewModel: ViewModel = new ViewModel() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text(this.mViewModel.prompt) + .fontSize($r('app.float.mixedpsd_prompt_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .margin({ bottom: $r('app.float.mixedpsd_prompt_margin_bottom') }) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .width($r('app.float.mixedpsd_prompt_width')) + .height($r('app.float.mixedpsd_prompt_height')) + + TextInput({ placeholder: '', text: this.mViewModel.password }) + .type(InputType.Password) + .maxLength(Constants.PASSWORD_MAX_LEN) + .fontSize($r('app.float.mixedpsd_prompt_fontsize')) + .width($r('app.float.mixedpsd_input_width')) + .height($r('app.float.mixedpsd_input_height')) + .backgroundColor(Color.White) + .enterKeyType(EnterKeyType.Done) + .border({ width: 2, color: Color.Gray, radius: 15 }) + .enabled(!this.mViewModel.inhibitInput) + .onChange(this.mViewModel.onInputChange.bind(this.mViewModel)) + .margin({ bottom: $r('app.float.mixedpsd_input_margin_bottom') }) + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Text($r('app.string.emergency_call')) + .fontSize($r('app.float.mixedpsd_prompt_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .onClick(this.mViewModel.onCallPhone.bind(this.mViewModel)); + + Text($r('app.string.done')) + .fontSize($r('app.float.mixedpsd_prompt_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .onClick(() => { + Log.showInfo(TAG, `onClick`) + this.mViewModel.onAuthPassword(() => { + Log.showInfo(TAG, `onClick callback prompt:${this.mViewModel.prompt} inhibitInput:${this.mViewModel.inhibitInput}`) + }); + }) + } + .width(Constants.HALF_CONTAINER_WIDTH) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets new file mode 100644 index 00000000..3372a6fe --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../../common/constants.ets' + +const TAG = 'ScreenLock-NumkeyBoard' + +@Component +export default struct NumkeyBoard { + private onKeypress: (params, callback) => void; + @StorageLink('numKeyboard') numKeyboard: any[] = Constants.NUMKEY_BOARD; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Grid() { + ForEach(this.numKeyboard, (item: any) => { + GridItem() { + Stack({ alignContent: Alignment.Center }) { + Column({ space: 0 }) { + Flex({ + direction: FlexDirection.Column, + alignItems: ItemAlign.Center, + justifyContent: FlexAlign.Center + }) { + if (item.value == Constants.CALL_PHONE || + item.value == Constants.GO_BACK || + item.value == Constants.DEL_PWD) { + Text(item.row1) + .fontSize($r('app.float.digitalpsd_prompt_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .width(Constants.FULL_CONTAINER_WIDTH) + .padding(0) + .margin(0) + } else { + Text(item.row1) + .fontSize($r('app.float.digitalpsd_row1_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .width(Constants.FULL_CONTAINER_WIDTH) + .padding(0) + .margin(0) + } + if (!!item.row2) { + Text(item.row2) + .fontSize($r('app.float.digitalpsd_row2_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .width(Constants.FULL_CONTAINER_WIDTH) + .padding(0) + .margin(0) + } + } + .height($r('app.float.digitalpsd_row_height')) + } + + if (item.bkg) { + if (item.value == Constants.CALL_PHONE || + item.value == Constants.GO_BACK || + item.value == Constants.DEL_PWD) { + Column() + .backgroundColor(Color.Gray) + .opacity(0.5) + .clip(new Rect({ + width: Constants.DIGITALPSD_BUTTON_RECT_WH, + height: Constants.DIGITALPSD_BUTTON_RECT_HH + })) + .width(Constants.DIGITALPSD_BUTTON_RECT_WH) + .height(Constants.DIGITALPSD_BUTTON_RECT_HH) + } else { + Column() + .backgroundColor(Color.Gray) + .opacity(0.5) + .clip(new Circle({ + width: Constants.DIGITALPSD_BUTTON_DIAMETER, + height: Constants.DIGITALPSD_BUTTON_DIAMETER + })) + .width(Constants.DIGITALPSD_BUTTON_DIAMETER) + .height(Constants.DIGITALPSD_BUTTON_DIAMETER) + } + } + } + .onTouch((event: TouchEvent) => { + Log.showInfo(TAG, `onTouch`) + if (event.type == TouchType.Down) { + Log.showInfo(TAG, `TouchType.Down`) + item.bkg = true; + } else if (event.type == TouchType.Up) { + Log.showInfo(TAG, `TouchType.Up`) + item.bkg = false + } + }) + .onClick(() => { + Log.showInfo(TAG, `onClick:${item.index}`) + setTimeout(this.onKeypress.bind(this), 0, item.index, (data) => { + Log.showInfo(TAG, `onClick callback is called`) + }); + }) + } + }) + } + .columnsTemplate('1fr 1fr 1fr') + .rowsTemplate('1fr 1fr 1fr 1fr') + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/shortcut.ets b/features/screenlock/src/main/ets/com/ohos/view/component/shortcut.ets new file mode 100644 index 00000000..0e8822fb --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/view/component/shortcut.ets @@ -0,0 +1,114 @@ +/** + * Copyright (c) 2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../../common/constants.ets' +import power from '@ohos.power' + +const TAG = 'ScreenLock-Shortcut' +const TAG_Shutdown = 'ScreenLock-Shutdown' +const TAG_Reboot = 'ScreenLock-Reboot' + +@Component +export default struct Shortcut { + private shutdownIcon: Resource = $r("app.media.shutdown") + private shutdownLabel: Resource = $r("app.string.shutdown") + private rebootIcon: Resource = $r("app.media.reboot") + private rebootLabel: Resource = $r("app.string.reboot") + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + + build() { + Row({ space:'30px' }) { + ShortcutComponent({ + mIcon: this.shutdownIcon, + mLabel: this.shutdownLabel, + mClickEvent: () => this.onShutdownClick() + }) + + ShortcutComponent({ + mIcon: this.rebootIcon, + mLabel: this.rebootLabel, + mClickEvent: () => this.onRebootClick() + }) + } + .margin({left: '50px'}) + } + + onShutdownClick() { + Log.showInfo(TAG, `onShutdownClick`) + power.shutdownDevice("shutdown_device") + Log.showInfo(TAG, `power shutdown success`) + } + + onRebootClick() { + Log.showInfo(TAG, `onRebootClick`) + power.rebootDevice("reboot_device") + Log.showInfo(TAG, `power reboot success`) + } +} + +@Component +struct ShortcutComponent { + private mIcon: Resource + private mLabel: Resource + private mClickEvent: Function + + aboutToAppear() { + Log.showInfo(TAG_Shutdown, `aboutToAppear Start`) + } + + aboutToDisappear() { + Log.showInfo(TAG_Shutdown, `aboutToDisAppear`) + } + + build() { + Column() { + Stack() { + Flex() + .backgroundColor($r('app.color.shortcut_icon_color')) + .clip(new Circle({ width: Constants.SHORTCUT_CIRCLE_WIDTH, height: Constants.SHORTCUT_CIRCLE_HEIGHT })) + .width(Constants.SHORTCUT_CIRCLE_WIDTH) + .height(Constants.SHORTCUT_CIRCLE_HEIGHT) + Image(this.mIcon) + .size({ width: Constants.SHORTCUT_CIRCLE_WIDTH, height: Constants.SHORTCUT_CIRCLE_HEIGHT}) + .objectFit(ImageFit.Contain) + } + + Column() + .width(Constants.SHORTCUT_CIRCLE_WIDTH) + .height(Constants.SHORTCUT_BLOCK_HEIGHT) + + Text(this.mLabel) + .fontSize(Constants.SHORTCUT_TEXT_SIZE) + .fontColor($r('app.color.shortcut_text_color')) + .width(Constants.SHORTCUT_TEXT_WIDTH) + .height(Constants.SHORTCUT_TEXT_HEIGHT) + } + .width(Constants.SHORTCUT_CIRCLE_WIDTH) + .onClick(this.onItemClick.bind(this)) + } + + onItemClick(event: ClickEvent) { + Log.showInfo(TAG, `onItemClick`) + if (this.mClickEvent) { + this.mClickEvent() + } + } +} + + diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets new file mode 100644 index 00000000..551971d4 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../../common/constants.ets' +import BatteryIcon from '../../../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' + +const TAG = 'ScreenLock-StatusBar' + +@Component +export default struct statusBar { + @StorageLink('minHeight') minHeight: number = 0 + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + BatteryIcon() + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(this.minHeight) + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/wallpaper.ets b/features/screenlock/src/main/ets/com/ohos/view/component/wallpaper.ets new file mode 100644 index 00000000..c21840aa --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/view/component/wallpaper.ets @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import ViewModel from '../../vm/wallpaperViewModel.ets' +import Constants from '../../common/constants.ets' + +const TAG = 'ScreenLock-Wallpaper' + +@Component +export default struct Wallpaper { + @State mViewModel: ViewModel = new ViewModel() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit() + } + + build() { + Image(this.mViewModel.screenlockWallpaper) + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + .objectFit(ImageFit.Cover) + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ets new file mode 100644 index 00000000..eaea1129 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ets @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Model from '../model/accountsModel.ets' + +const TAG = "ScreenLock-AccountsViewModel" + +export default class accountsViewModel { + private mModel = new Model() + + viewModelInit() { + Log.showInfo(TAG, "viewModelInit") + this.mModel.modelInit() + } + + onUserSwitch(userId: number) { + this.mModel.onUserSwitch(userId) + } + + viewModelFinish() { + Log.showInfo(TAG, "viewModelFinish") + this.mModel.modelFinish() + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ets new file mode 100644 index 00000000..d5afff2c --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ets @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/constants.ets' +import service, {UnlockResult, AuthSubType} from '../model/screenLockService.ets' + +const TAG = 'ScreenLock-BaseViewModel' +const MINUTE_NM = '分钟' +const SECOND_NM = "秒" +const TRY_AGAIN = "后重试" + +export {service, UnlockResult, AuthSubType} + +export default class BaseViewModel { + prompt: Resource | string; + inhibitInput: boolean = false; + countdownHandle: number = -1; + freezingMillisecond: number = 0; + + constructor() { + this.ViewModelInit() + } + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + this.prompt = $r('app.string.input'); + } + + countdown(callback) { + Log.showInfo(TAG, `countdown`) + let promptText: Resource | string = ''; + this.freezingMillisecond -= Constants.INTERVAL; + Log.showInfo(TAG, `countdown freezingMillisecond:${this.freezingMillisecond}`) + if (this.freezingMillisecond > 0) { + promptText = this.getFreezingTimeNm(); + promptText += TRY_AGAIN; + } else { + Log.showInfo(TAG, `countdown clearInterval`) + clearInterval(this.countdownHandle) + this.countdownHandle = -1 + this.inhibitInput = false + promptText = $r('app.string.input'); + } + Log.showInfo(TAG, `countdown promptText:${promptText}`) + this.prompt = promptText; + this.updateStorage(callback) + } + + changePrompt(remainTimes, freezingTime, callback) { + Log.showInfo(TAG, `changePrompt remainTimes:${remainTimes} freezingTime:${freezingTime}`) + let promptText: Resource | string = $r('app.string.incorrect'); + this.freezingMillisecond = freezingTime + + if (0 < remainTimes && remainTimes <= 2) { + if (!!this.freezingMillisecond && this.freezingMillisecond != 0) { + promptText = $r('app.string.incorrect_promp_freezing', remainTimes, this.getFreezingTimeNm()); + } else { + promptText = $r('app.string.incorrect_promp_times', remainTimes); + } + } else if (0 == remainTimes) { + if (!!this.freezingMillisecond && this.freezingMillisecond != 0) { + this.inhibitInput = true + promptText = $r('app.string.input_promp', this.getFreezingTimeNm()); + this.countdownHandle = setInterval(this.countdown.bind(this), Constants.INTERVAL, callback); + } + } + this.prompt = promptText; + this.updateStorage(callback) + //notify the base service that the unlock is fail + service.notifyScreenResult(UnlockResult.Fail); + Log.showInfo(TAG, `changePrompt end`) + } + + getFreezingTimeNm(): string { + Log.showInfo(TAG, `getFreezingTimeNm start`) + let minute = Math.floor(this.freezingMillisecond / (60 * 1000)); + Log.showInfo(TAG, `getFreezingTimeNm minute:${minute}`) + let second = Math.round((this.freezingMillisecond % (60 * 1000)) / 1000); + Log.showInfo(TAG, `getFreezingTimeNm second:${second}`) + let timeName = ''; + if (minute != 0) { + timeName += minute + MINUTE_NM + } + if (second != 0) { + timeName += second + SECOND_NM + } + Log.showInfo(TAG, `getFreezingTimeNm end`) + return timeName; + } + + updateStorage(callback) { + Log.showInfo(TAG, `updateStorage`) + callback() + } +} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets new file mode 100644 index 00000000..f088f107 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' + +const TAG = 'ScreenLock-BatterySocViewModel' + +export default class BatterySocViewModel { + batterySocStr: any= undefined + mbatterySocStr= AppStorage.SetAndLink('batterySoc', 0); + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + let batteryValue: number = this.mbatterySocStr.get(); + if (batteryValue < 100) { + this.batterySocStr = "" + } else { + this.batterySocStr = $r('app.string.charge_full') + } + } +} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ets new file mode 100644 index 00000000..13613d8c --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ets @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/constants.ets' +import BaseViewModel, {service, UnlockResult, AuthSubType} from './baseViewModel.ets' + +const TAG = 'ScreenLock-CustomPSDViewModel' + +export default class CustomPSDViewModel extends BaseViewModel { + password: string= ''; + passwordArr: any[] = []; + numKeyboard: any[] = Constants.NUMKEY_BOARD; + + constructor() { + super(); + } + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + super.ViewModelInit(); + } + + onKeyPress(index, callback) { + Log.showInfo(TAG, `onKeyPress start param: ${index}`) + let keyValue = this.numKeyboard[index].value; + if (keyValue >= 0 && !this.inhibitInput) { + if (this.passwordArr.length < Constants.PASSWORD_MAX_LEN) { + this.passwordArr.push(keyValue); + this.password = this.passwordArr.join(''); + this.numKeyboard[11].row1 = $r('app.string.delete'); + this.numKeyboard[11].value = Constants.DEL_PWD; + this.updateStorage(callback); + } + } else if (keyValue == Constants.DEL_PWD) { + this.passwordArr.pop() + this.password = this.passwordArr.join(''); + if (this.passwordArr.length == 0) { + this.numKeyboard[11].row1 = $r('app.string.back'); + this.numKeyboard[11].value = Constants.GO_BACK; + } + this.updateStorage(callback); + } else if (keyValue == Constants.GO_BACK) { + service.goBack(); + } else if (keyValue == Constants.CALL_PHONE) { + //TODO:call telephone + } + Log.showInfo(TAG, `onKeyPress end`) + } + + onCallPhone() { + Log.showInfo(TAG, 'onCallPhone'); + //TODO:call telephone + } + + onAuthPassword(callback) { + Log.showInfo(TAG, `onAuthPassword`); + if (this.passwordArr.length == 0 || this.inhibitInput) { + this.updateStorage(callback); + return; + } + service.authUser(AuthSubType.PIN_MIXED, this.passwordArr, (result, extraInfo) => { + this.clearPassword(); + if (result == 0) { + //unlock the screen + service.unlocking(); + } else { + //Clear the entered password + super.changePrompt(extraInfo.remainTimes, extraInfo.freezingTime, callback); + } + }); + } + + private clearPassword() { + Log.showInfo(TAG, `clearPassword`) + this.passwordArr = []; + this.password = this.passwordArr.join(''); + this.numKeyboard[11].row1 = $r('app.string.back'); + this.numKeyboard[11].value = Constants.GO_BACK; + } + + updateStorage(callback) { + Log.showInfo(TAG, `updateStorage child`) + //refresh the page + AppStorage.SetOrCreate('numKeyboard', this.numKeyboard); + super.updateStorage(callback) + } +} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ets new file mode 100644 index 00000000..88182202 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ets @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import DateTimeCommon from '../../../../../../../../common/src/main/ets/default/DateTimeCommon' +import Constants from '../common/constants.ets' +import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' +import ScreenLockModel from '../model/screenLockModel.ets' + +const TAG = 'ScreenLock-DateTimeViewModel' + +/** + * DateTimeViewModel class + */ +export default class DateTimeViewModel { + timeVal: string = '' + dateVal: any = {} + weekVal: any = {} + setDateTimeHandle: number = -1 + isUsing24hFormat: boolean= false + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + +// TODO api 8 下有问题,临时注释 +// ScreenLockModel.timeFormatMonitor((result) => { +// this.isUsing24hFormat = result; +// }); + + this.setDateTime.bind(this)() + this.setDateTimeHandle = setInterval(this.setDateTime.bind(this), Constants.INTERVAL); + Log.showInfo(TAG, 'ViewModelInit end'); + } + + setDateTime() { + Log.showInfo(TAG, `setDateTime`) + this.timeVal = DateTimeCommon.getSystemTime(this.isUsing24hFormat) + this.dateVal = DateTimeCommon.getSystemDate() + this.weekVal = DateTimeCommon.getSystemWeek() + } + + stopPolling() { + Log.showInfo(TAG, `stopPolling start`) + Log.showInfo(TAG, `stopPolling setDateTimeHandle:${this.setDateTimeHandle}`); + if (this.setDateTimeHandle > 0) { + clearInterval(this.setDateTimeHandle) + this.setDateTimeHandle = -1 + Log.showInfo(TAG, `stopPolling setDateTimeHandle new :${this.setDateTimeHandle}`); + } + Log.showInfo(TAG, `stopPolling end`) + } + + onStatusChange(lockStatus: ScreenLockStatus): void { + Log.showInfo(TAG, `onStatusChange lockStatus:${lockStatus}`); + Log.showInfo(TAG, `onStatusChange setDateTimeHandle:${this.setDateTimeHandle}`); + if (lockStatus == ScreenLockStatus.Locking) { + if (this.setDateTimeHandle <= 0) { + this.setDateTimeHandle = setInterval(this.setDateTime.bind(this), Constants.INTERVAL); + Log.showInfo(TAG, `onStatusChange setDateTimeHandle new:${this.setDateTimeHandle}`); + } + } else { + this.stopPolling(); + } + } +} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ets new file mode 100644 index 00000000..019a4dde --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ets @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/constants.ets' +import BaseViewModel, {service, UnlockResult, AuthSubType} from './baseViewModel.ets' + +const TAG = 'ScreenLock-DigitalPSDViewModel' + +const PW_LEN = 6 + + +export default class DigitalPSDViewModel extends BaseViewModel { + password: number[]= [] + passwdMaskArr: any[]; + numKeyboard: any[] = Constants.NUMKEY_BOARD; + + constructor() { + super(); + } + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + this.passwdMaskArr = new Array(PW_LEN).fill($r('app.color.circle_background_transparent')); + super.ViewModelInit(); + } + + onKeyPress(index, callback) { + Log.showInfo(TAG, `onKeyPress start param: ${index}`) + let keyValue = this.numKeyboard[index].value; + if (keyValue >= 0 && !this.inhibitInput) { + if (this.password.length < PW_LEN) { + this.password.push(keyValue); + this.passwdMaskArr[this.password.length-1] = $r('app.color.circle_background'); + this.numKeyboard[11].row1 = $r('app.string.delete'); + this.numKeyboard[11].value = Constants.DEL_PWD; + this.updateStorage(callback); + } + if (this.password.length >= PW_LEN) { + service.authUser(AuthSubType.PIN_SIX, this.password, (result, extraInfo) => { + this.clearPassword() + if (result == 0) { + //unlock the screen + service.unlocking(); + } else { + //Clear the entered password + super.changePrompt(extraInfo.remainTimes, extraInfo.freezingTime, callback) + } + }) + } + } else if (keyValue == Constants.DEL_PWD) { + this.passwdMaskArr[this.password.length-1] = $r('app.color.circle_background_transparent'); + this.password.pop() + if (this.password.length == 0) { + this.numKeyboard[11].row1 = $r('app.string.back'); + this.numKeyboard[11].value = Constants.GO_BACK; + } + this.updateStorage(callback); + } else if (keyValue == Constants.GO_BACK) { + service.goBack(); + } else if (keyValue == Constants.CALL_PHONE) { + //TODO:call telephone + } + + Log.showInfo(TAG, `onKeyPress end`) + } + + private clearPassword() { + Log.showInfo(TAG, `clearPassword`) + this.password = []; + this.passwdMaskArr = new Array(PW_LEN).fill($r('app.color.circle_background_transparent')); + AppStorage.SetOrCreate('passwdMaskArr', this.passwdMaskArr); + this.numKeyboard[11].row1 = $r('app.string.back'); + this.numKeyboard[11].value = Constants.GO_BACK; + } + + updateStorage(callback) { + Log.showInfo(TAG, `updateStorage child`) + //refresh the page + AppStorage.SetOrCreate('passwdMaskArr', this.passwdMaskArr); + AppStorage.SetOrCreate('numKeyboard', this.numKeyboard); + super.updateStorage(callback) + } +} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ets new file mode 100644 index 00000000..ac2aa5cf --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' + +const TAG = 'ScreenLock-LockIconViewModel' + +export default class LockIconViewModel { + cutMessage: any= {} + iconPath: any= {} + + ViewModelInit(): void{ + Log.showInfo(TAG, `ViewModelInit`); + this.iconPath = $r('app.media.ic_public_lock_filled'); + this.cutMessage = $r('app.string.lock_prompt') + } + + onStatusChange(lockStatus: ScreenLockStatus): void { + Log.showInfo(TAG, `onStatusChange lockStatus:${lockStatus}`); + switch (lockStatus) { + case ScreenLockStatus.Locking: + this.iconPath = $r('app.media.ic_public_lock_filled'); + this.cutMessage = $r('app.string.lock_prompt') + break; + case ScreenLockStatus.Unlock: + this.iconPath = $r('app.media.ic_public_unlock_filled'); + this.cutMessage = $r('app.string.unlock_prompt') + break; + default: + this.iconPath = $r('app.media.ic_public_lock_filled'); + this.cutMessage = $r('app.string.lock_prompt') + break; + } + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ets new file mode 100644 index 00000000..a1daefcc --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ets @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import BaseViewModel, {service, UnlockResult, AuthSubType} from './baseViewModel.ets' + +const TAG = 'ScreenLock-MixedPSDViewModel' + +export default class MixedPSDViewModel extends BaseViewModel { + password: string= ''; + + constructor() { + super(); + } + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + super.ViewModelInit(); + } + + onInputChange(value: string) { + Log.showInfo(TAG, `onInputChange`); + this.password = value; + } + + onCallPhone() { + Log.showInfo(TAG, 'onCallPhone'); + //TODO:call telephone + } + + onAuthPassword(callback) { + Log.showInfo(TAG, `onAuthPassword`); + if (!this.password || this.inhibitInput) { + callback(); + return; + } + service.authUser(AuthSubType.PIN_MIXED, this.password, (result, extraInfo) => { + this.clearPassword(); + if (result == 0) { + //unlock the screen + service.unlocking(); + } else { + //Clear the entered password + super.changePrompt(extraInfo.remainTimes, extraInfo.freezingTime, callback); + } + }); + } + + private clearPassword() { + Log.showInfo(TAG, `clearPassword`) + this.password = ''; + } +} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/wallpaperViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/wallpaperViewModel.ets new file mode 100644 index 00000000..64d6eb53 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/wallpaperViewModel.ets @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021 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 ScreenLockModel from '../model/screenLockModel.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +//TODO:import image from '@ohos.multimedia.image' + +const TAG = 'ScreenLock-WallpaperViewModel' + +export default class WallpaperViewModel { + screenlockWallpaper: string = '' + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + ScreenLockModel.getScreenLockWallpaper((error, data) => { + if (error != undefined && error != null) { + Log.showInfo(TAG, 'getScreenLockWallpaper error:' + JSON.stringify(error)); + } else { + Log.showInfo(TAG, 'getScreenLockWallpaper data:' + JSON.stringify(data)); + this.screenlockWallpaper = data + } + }) + } +} diff --git a/features/screenlock/src/main/resources/base/element/color.json b/features/screenlock/src/main/resources/base/element/color.json new file mode 100644 index 00000000..0ccee8d9 --- /dev/null +++ b/features/screenlock/src/main/resources/base/element/color.json @@ -0,0 +1,48 @@ +{ + "color": [ + { + "name": "lock_prompt_color", + "value": "#ffffff" + }, + { + "name": "date_time_color", + "value": "#ffffff" + }, + { + "name": "nonotification_text_color", + "value": "#ffffff" + }, + { + "name": "circle_background", + "value": "#ffffff" + }, + { + "name": "circle_background_transparent", + "value": "#00ffffff" + }, + { + "name": "page_background", + "value": "#0173C7" + }, + { + "name": "batterysoc_text_color", + "value": "#ffffff" + }, + { + "name": "accounts_text_color", + "value": "#ffffff" + }, + { + "name": "lock_ic_color", + "value": "#ffffff" + }, + { + "name": "shortcut_icon_color", + "value": "rgba(255, 255, 255, 0.5)" + }, + { + "name": "shortcut_text_color", + "value": "#ffffff" + } + ] +} \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/element/float.json b/features/screenlock/src/main/resources/base/element/float.json new file mode 100644 index 00000000..6c503a59 --- /dev/null +++ b/features/screenlock/src/main/resources/base/element/float.json @@ -0,0 +1,193 @@ +{ + "float": [ + { + "name": "lockicon_width", + "value": "40" + }, + { + "name": "lockicon_height", + "value": "45" + }, + { + "name": "lockicon_top_margin", + "value": "10" + }, + { + "name": "lockicon_bottom_margin", + "value": "10" + }, + { + "name": "lock_prompt_fontsize", + "value": "32" + }, + { + "name": "time_fontsize", + "value": "148" + }, + { + "name": "time_top_margin", + "value": "10" + }, + { + "name": "time_bottom_margin", + "value": "10" + }, + { + "name": "date_fontsize", + "value": "18" + }, + { + "name": "deleteall_image_opacity", + "value": "0.9" + }, + { + "name": "batterysoc_fontsize", + "value": "36" + }, + { + "name": "accounts_component_height", + "value": "120" + }, + { + "name": "accounts_ic_width", + "value": "72" + }, + { + "name": "accounts_ic_height", + "value": "72" + }, + { + "name": "accounts_name_fontsize", + "value": "24" + }, + { + "name": "digitalpsd_prompt_fontsize", + "value": "32" + }, + { + "name": "digitalpsd_prompt_margin_bottom", + "value": "48" + }, + { + "name": "digitalpsd_prompt_width", + "value": "800" + }, + { + "name": "digitalpsd_prompt_height", + "value": "72" + }, + { + "name": "digitalpsd_passwdmask_width", + "value": "400" + }, + { + "name": "digitalpsd_passwdmask_height", + "value": "24" + }, + { + "name": "digitalpsd_passwdmask_margin_bottom", + "value": "128" + }, + { + "name": "digitalpsd_input_area_height", + "value": "200" + }, + { + "name": "digitalpsd_row1_fontsize", + "value": "48" + }, + { + "name": "digitalpsd_row2_fontsize", + "value": "24" + }, + { + "name": "digitalpsd_row_height", + "value": "200" + }, + { + "name": "digitalpsd_key_area_height", + "value": "800" + }, + { + "name": "digitalpsd_key_area_margin_bottom", + "value": "64" + }, + { + "name": "mixedpsd_prompt_fontsize", + "value": "32" + }, + { + "name": "mixedpsd_prompt_margin_bottom", + "value": "48" + }, + { + "name": "mixedpsd_prompt_width", + "value": "800" + }, + { + "name": "mixedpsd_prompt_height", + "value": "72" + }, + { + "name": "mixedpsd_input_maxlen", + "value": "30" + }, + { + "name": "mixedpsd_input_width", + "value": "600" + }, + { + "name": "mixedpsd_input_height", + "value": "72" + }, + { + "name": "mixedpsd_input_margin_bottom", + "value": "128" + }, + + { + "name": "custompsd_prompt_fontsize", + "value": "32" + }, + { + "name": "custompsd_prompt_margin_bottom", + "value": "48" + }, + { + "name": "custompsd_prompt_width", + "value": "800" + }, + { + "name": "custompsd_prompt_height", + "value": "72" + }, + { + "name": "custompsd_input_width", + "value": "600" + }, + { + "name": "custompsd_input_height", + "value": "72" + }, + { + "name": "custompsd_input_margin_bottom", + "value": "90" + }, + { + "name": "custompsd_passwdmask_margin_bottom", + "value": "128" + }, + { + "name": "custompsd_input_area_height", + "value": "400" + }, + { + "name": "custompsd_key_area_height", + "value": "800" + }, + { + "name": "custompsd_key_area_margin_bottom", + "value": "64" + } + ] +} \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/element/string.json b/features/screenlock/src/main/resources/base/element/string.json new file mode 100644 index 00000000..96124ae2 --- /dev/null +++ b/features/screenlock/src/main/resources/base/element/string.json @@ -0,0 +1,68 @@ +{ + "string": [ + { + "name": "lock_prompt", + "value": "屏幕锁定中" + }, + { + "name": "unlock_prompt", + "value": "上滑解锁" + }, + { + "name": "yyyy_mm_dd", + "value": "%d/%d/%d" + }, + { + "name": "nonotification_text", + "value": "无通知" + }, + { + "name": "shutdown", + "value": "关机" + }, + { + "name": "reboot", + "value": "重启" + }, + { + "name": "input", + "value": "输入密码" + }, + { + "name": "incorrect", + "value": "密码错误" + }, + { + "name": "incorrect_promp_times", + "value": "密码错误,还可尝试%d次" + }, + { + "name": "incorrect_promp_freezing", + "value": "密码错误,还可尝试%d次,失败后将锁定%s" + }, + { + "name": "input_promp", + "value": "请%s后重试" + }, + { + "name": "emergency_call", + "value": "紧急呼叫" + }, + { + "name": "back", + "value": "返回" + }, + { + "name": "delete", + "value": "删除" + }, + { + "name": "done", + "value": "确定" + }, + { + "name": "charge_full", + "value": "已充满" + } + ] +} \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/media/delete_all.png b/features/screenlock/src/main/resources/base/media/delete_all.png new file mode 100644 index 0000000000000000000000000000000000000000..143463751f103bbf00d204cbbd40982b9a5a6ec1 GIT binary patch literal 4061 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 P00000NkvXXu0mjf(|(n6 literal 0 HcmV?d00001 diff --git a/features/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg b/features/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg new file mode 100644 index 00000000..66cc5da1 --- /dev/null +++ b/features/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_lock_filled + + + + + + + + + + \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg b/features/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg new file mode 100644 index 00000000..2b301ebc --- /dev/null +++ b/features/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_unlock_filled + + + + + + + + + + \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/media/ic_user_portrait.svg b/features/screenlock/src/main/resources/base/media/ic_user_portrait.svg new file mode 100644 index 00000000..26a66b69 --- /dev/null +++ b/features/screenlock/src/main/resources/base/media/ic_user_portrait.svg @@ -0,0 +1,16 @@ + + + IC/ic_user_portrait + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/media/lock.png b/features/screenlock/src/main/resources/base/media/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..9163d2c95f410a497382dfb83fac1799c57baca9 GIT binary patch literal 4173 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 + + 编组 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/media/shutdown.svg b/features/screenlock/src/main/resources/base/media/shutdown.svg new file mode 100644 index 00000000..b81ff013 --- /dev/null +++ b/features/screenlock/src/main/resources/base/media/shutdown.svg @@ -0,0 +1,14 @@ + + + 开关 + + + + + + + + + + + \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/media/unlock.png b/features/screenlock/src/main/resources/base/media/unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6a03806e5232a4dae1107c410d54d9a5cc2e0d GIT binary patch literal 4458 zcmch5_g525)IX>oMFlCM0YN$f1~4=wQbLn%sM4e;1P~%Ebb<&9J{VDH51>>dAWceW z0Yngxj)8!5LkzvQ5L({#Jm>odeBU45J!f}j?q}xiy?1We*_ZcB_0O|`*cccX&Kum- zF=t?4{0a2uSeSw5KRsV>0}W$(xz zR^CX!PcAkVrzPw3`yW9KWGz`n-qtLll!Og3!1VuPDXqU+Ky-x*a=cDZw_1^*$BS}i$B$A zc&=9~RU?(+A{tnUc{9JfXg}1`w%yigsvgm}Mdq$8vkims+z)9pg!~!c39fcwvQ4;L zqFcx|Op(xuejYg2#WA8*Ts*+rhp`_}^nyI1iAOg?#7cd+_kvVk8CEg!xhfAD``A|S z!IhPrY^Br&0RWTl&zd+1-5h+;9RQtbGSZ4aRZ67B8Md))jDt&|C*LAB)&-yB^o))(YWl!W)`9WIK3-Dj;rr;*<;uUXVr3OI| z_CeVRwipqCsxL|lR5?ME`G7Bfi&jwcek8=n+T!T&gYu$>A1geEw_m;Kcv2Q7-BZ;W zbpWHTE%|r6$jv|~tRzB7*R9(_ztZcjIT{0UPQLBb+}?<=;1}o>J4)yd9bEQdA+(F? zMC+ZWHuY`Qy=+wk_vPV(F1gEJ@q%PsOB$DD5oS|dS{V%+l~DJ@7EV@b)yc0TCp-mk zH*Y)}jtq_7Z#xBotSX~@I5P4rM`LE`oy4BUbGvqy=cDM-;{_L#Z z+O!*-{nS_=E~UC!z{LboXh-U>*O&Q!t}y4uTzX;1Q#j>2=?hD^oCBXsmjdGr(ujX( zVKoi6S0BlEiRnb!wQshvN=~l?VZbH7n$$esT%vy~c*vUx_Pj34HY`1`6?M1Ia8|*! zsDAJh8v*M5J;|FOegjxI{*e_zl;n1!Rosq)Fndl$s5`#4v0V9(Ld-9@97Ge+k6zBPq-# zFlJ9b;9D;<&y<}F2D`OYF zM8-RSWRh5kQ8;_mgx0Vlv@%)=@(BPlu0fX0T z;n*Mpqo~E2I8G+_wchk<+Ox9BZV4La+tRYndiFqkLV|aff)77qi!8^Vy3A@fr}GQ5 z_39Sj&1u!C=JVz8Pk5^(Mk@vId5 zj2NO|&KBuV%>+=Ss{GfLzp*N(n6gw=EMi@_F zwt?&)ZiH8?sL{Qq3K4#N=1M-xJ$BAu_J$J zh;*Yvz?&tSBi80-uyeW0O;=MqbW_sm|I~|v|Ju;|4=J+u60 zsR_ur)B^%UkECNg_h+bfE#%%yWzG0gRc|R|GjdI%o2xAg{ojnZ?rr1vzjVmENM$9x z>D5>adV1!ESzy+}x!c*3tj8(HC@Y+8vFYVNLF3h*l}B_~v;X#o4@tBr zR5_xYM!`w7%Kpm^>nW_xshbf~`K>@)$PF$)WaQn{Yq6G;Wgdp>bjUQkTn`v}gg8CH@laZ#(yt9oKe_B=uMt1qQfGJ?hP zDJPZ~JD(R%TsUs)Ja%QupsZtyy_g@<*lo~(2M!H?E+7VcoX&;bms^`wFm}4KbI6Bz zuB;zVurq_=P-uiwMEMX0$HxK>oav7$i}ukq^_>_IXt~X2P5tZ0dwhZ01b0}n^}&*b zJzqi`0_lhu!K-kLYACS?MR-e2hWPp}*B@??L|2C*HP|I*)?yPID{eMUM+%S$W)B=x zTwYjnkn2Rm1_;qcNRRYaCbB+Xn%UQA=pz!*sz#~@t{~lQzIL^ z&egVEsvl0`&<*iFdc{5@ayQEH%pxB_y!sg@R_Q{q=0o4+-S({R0M_rh!ceLBq=|<8V8X9{>(rQpM;G(vM z-~|3OTYUAirU1|P3|Ql%s>Jo^n|_NH4%+X*xeBmky>`FB;YOpCR^FWNRLuyv6~566 zohGUTaYemgFy_iy%mnLMWukh?DVJNA4DVr~*r6Jhj|S3kki{ey`BC2KGg61=5$-eL zzV0<%$)8x^pd?f)ZFo{t^E!8$a=TLNVY@iIL(lUaC-$PB9@1;NT~#XoJ5|qCsUhR) zkvuc%VxFSwp(Wbcq)`pCfo=&)4Ccfg_A)>BSVaD2u9XsQ+Z4-<_(txOGn8nQ44j7q_eK# zXPj?Di74e-!;;5KCx56XWrPQD48QO*oRNuHNh)H(aRKi`j-_UV3;1=seH2O?^OQ#b z-)K^9LUp&BR`LOfDucneL%>1Ku01P1>B9`$Atj?GSfh4kWJtsOGP#G}R=;LdutQ$x z3#cih1zJUCG}7&AkN>ozs1UCLuIHEHNwf`)b=K^YG;Y$#OvyBF&d;t|web1J=mRWw z+vw@OZIz3lAbRnXOUN2WKioCvLR-!LtsGkz4`^plu7Q;6RQ9R3>w9*B1_zKkVcM?Z zSMbP0k(0)McrrwFavA-M11y<9wYY@L&98fX9C6%bvo?)_xK!nnEF!h9C|ZIA?$L6Z z4j0T>M8V;w^@>>1*+kW5He*u&GCf)Q z?S!utT*Z!%f&gsSFNQhi0l?R~Mo{r}sG#-p>Fdp9-tXW<)Tfpe7I-0itj^7LbVW7) zLV+@vZI>(WUOv*`$8G`3&%%}YZnTEH28@T{lb8;pv*G`3$7>ibXI464t?|SB@l7`k zo4vzm+C@M*w80Nlg8WKz_Hzx|x5p`5zEsra{GQC=amx{)j_vw%j8^d0YS)Q0`VS^$ zxS@1~dTLu-C)a&c1D9l18#&82MIzUE1yT?3XEYtxqrIjs;oXHm z+#m4+ouerz%1N%+`)C?qk}6f?m|Cd3? z1pUv(GAXJ75#l)VoWFf0fK2Yt&SeESZmo$nZ6Le$7sO@~^9qp!g0$ywGrQyc@d3^W6*e|ML>WYe zw5a-h@_+AvDwr;c*q({^JtMwv)KUbcj$a36Qv%WhVuYM6O1g&P@<0*9<0AnSFP2&miXu&K1sxYc8Aw2aM z4kuIiMmZYOa=<`V{k~SKr4l9Vxb|}X5r`jaY|ER$aRGff<~EQaA$94;K3;1ti3^hG z(2W+)RD0W}dTPSZ%#1-6VZ(=dR{0eZYbQ3CM1P|QxnvZjgZi3PSJ5P%PNB=? z4~_u|i8r5}4bSaOiBgXQEB%+q4PCK97Xp{{D%j25fXnw08lU-9*hw%iSbnS&#;8ih zDDC?9%)+uM3OBu1pUH#t?n-_2bI&)`9b@HAz+u|Wte^+~y>F2$u`BSz&pqhogRX?-kr;v@EO{hswy1PlS4=$(Z2Pxdy|4G-y67XJMB_Ajf-W0vPbW;uJn`V<99;>-^?X1;US^A8rTzGvQ&3ljeTlDz< f_n!n4HWHnY{T|lnmuJE6zpD*&O?Ap(&d>e_%(r-& literal 0 HcmV?d00001 diff --git a/features/screenlock/src/main/resources/en_US/element/string.json b/features/screenlock/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..930c006c --- /dev/null +++ b/features/screenlock/src/main/resources/en_US/element/string.json @@ -0,0 +1,68 @@ +{ + "string": [ + { + "name": "lock_prompt", + "value": "Screen locked" + }, + { + "name": "unlock_prompt", + "value": "Please slide to unlock" + }, + { + "name": "yyyy_mm_dd", + "value": "%d/%d/%d" + }, + { + "name": "nonotification_text", + "value": "No Notification" + }, + { + "name": "input", + "value": "Input password" + }, + { + "name": "incorrect", + "value": "Password incorrect" + }, + { + "name": "incorrect_promp_times", + "value": "Password incorrect.You can try it again for %d times." + }, + { + "name": "incorrect_promp_freezing", + "value": "Password incorrect.You can try it again for %d times.If it fails, it will be locked for %s." + }, + { + "name": "input_promp", + "value": "Please try again in %s." + }, + { + "name": "emergency_call", + "value": "Emergency call" + }, + { + "name": "back", + "value": "Back" + }, + { + "name": "delete", + "value": "Delete" + }, + { + "name": "done", + "value": "Done" + }, + { + "name": "charge_full", + "value": "Already full" + }, + { + "name": "shutdown", + "value": "shutdown" + }, + { + "name": "reboot", + "value": "reboot" + } + ] +} \ No newline at end of file diff --git a/features/screenlock/src/main/resources/rawfile/antiTouch.json b/features/screenlock/src/main/resources/rawfile/antiTouch.json new file mode 100644 index 00000000..d5e314f1 --- /dev/null +++ b/features/screenlock/src/main/resources/rawfile/antiTouch.json @@ -0,0 +1,3 @@ +{ + "slidingLength": "200" +} \ No newline at end of file diff --git a/features/screenlock/src/main/resources/rawfile/screenlock.json b/features/screenlock/src/main/resources/rawfile/screenlock.json new file mode 100644 index 00000000..a3dbf684 --- /dev/null +++ b/features/screenlock/src/main/resources/rawfile/screenlock.json @@ -0,0 +1,3 @@ +{ + "mode": "1" +} \ No newline at end of file diff --git a/features/screenlock/src/main/resources/zh_CN/element/string.json b/features/screenlock/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..a8a30ad5 --- /dev/null +++ b/features/screenlock/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,69 @@ +{ + "string": [ + { + "name": "lock_prompt", + "value": "屏幕锁定中" + }, + { + "name": "unlock_prompt", + "value": "上滑解锁" + }, + { + "name": "yyyy_mm_dd", + "value": "%d年%d月%d日" + }, + { + "name": "nonotification_text", + "value": "无通知" + }, + { + "name": "input", + "value": "输入密码" + }, + { + "name": "incorrect", + "value": "密码错误" + }, + { + "name": "incorrect_promp_times", + "value": "密码错误,还可尝试%d次" + }, + { + "name": "incorrect_promp_freezing", + "value": "密码错误,还可尝试%d次,失败后将锁定%s" + }, + { + "name": "input_promp", + "value": "请%s后重试" + }, + { + "name": "emergency_call", + "value": "紧急呼叫" + }, + { + "name": "back", + "value": "返回" + }, + { + "name": "delete", + "value": "删除" + }, + + { + "name": "done", + "value": "确定" + }, + { + "name": "charge_full", + "value": "已充满" + }, + { + "name": "shutdown", + "value": "关机" + }, + { + "name": "reboot", + "value": "重启" + } + ] +} \ No newline at end of file diff --git a/figures/screenlock.png b/figures/screenlock.png new file mode 100644 index 0000000000000000000000000000000000000000..0ee29b696ec2ce14e9179ffd5595618c7ac7004a GIT binary patch literal 27998 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..62bd9b9c --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,103 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/infra/config_exts.gradle b/infra/config_exts.gradle new file mode 100644 index 00000000..eb7b7f5e --- /dev/null +++ b/infra/config_exts.gradle @@ -0,0 +1,6 @@ +ext { + version = [ + compileSdk: 8, + compatibleSdk: 8 + ] +} \ No newline at end of file diff --git a/mgit.info b/mgit.info new file mode 100644 index 00000000..058fb12e --- /dev/null +++ b/mgit.info @@ -0,0 +1 @@ +hmf/applications/standard/screenlock diff --git a/product/pc/build.gradle b/product/pc/build.gradle new file mode 100644 index 00000000..785f075f --- /dev/null +++ b/product/pc/build.gradle @@ -0,0 +1,24 @@ +apply plugin: 'com.huawei.ohos.hap' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } + entryModules "entry" +} + +dependencies { + entryImplementation project(':entry') + implementation project(':common') + implementation project(':features:screenlock') + implementation project(':features:noticeitem') +} diff --git a/product/pc/src/main/config.json b/product/pc/src/main/config.json new file mode 100644 index 00000000..327029b5 --- /dev/null +++ b/product/pc/src/main/config.json @@ -0,0 +1,77 @@ +{ + "app": { + "bundleName": "com.ohos.screenlock", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + } + }, + "deviceConfig": { + }, + "module": { + "package": "com.ohos.screenlock", + "name": ".MyApplication", + "deviceType": [ + "tablet" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "pc", + "moduleType": "feature", + "installationFree": false + }, + "reqPermissions": [ + { + "name": "ohos.permission.MANAGE_LOCAL_ACCOUNTS" + }, + { + "name": "ohos.permission.INTERACT_ACROSS_LOCAL_ACCOUNTS_EXTENSION" + }, + { + "name": "ohos.permission.USE_USER_IDM" + }, + { + "name": "ohos.permission.ACCESS_USER_AUTH_INTERNAL" + }, + { + "name": "ohos.permission.ACCESS_PIN_AUTH" + }, + { + "name": "ohos.permission.NOTIFICATION_CONTROLLER" + } + ], + "abilities": [ + { + "label": "$string:app_name", + "launchType": "singleton", + "srcPath": "ServiceExtAbility", + "name": ".ServiceExtAbility", + "icon": "$media:icon", + "srcLanguage": "ets", + "description": "$string:description_mainability", + "type": "service", + "visible": true + } + ], + "js": [ + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "pages": [ + "pages/index", + "pages/digitalPassword", + "pages/mixedPassword", + "pages/customPassword" + ], + "name": "ServiceExtAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} \ No newline at end of file diff --git a/product/pc/src/main/ets/AbilityStage.ts b/product/pc/src/main/ets/AbilityStage.ts new file mode 100644 index 00000000..9b937cbe --- /dev/null +++ b/product/pc/src/main/ets/AbilityStage.ts @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import AbilityStage from "@ohos.application.AbilityStage" +import Log from '../../../../../common/src/main/ets/default/Log.ets' + +const TAG = "ScreenLock-MainAbilityStage" + +export default class MainAbilityStage extends AbilityStage { + onCreate() { + Log.showInfo(TAG, "onCreate") + } +} \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts new file mode 100644 index 00000000..fa520217 --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2021 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 ServiceExtension from '@ohos.application.ServiceExtensionAbility' +import windowManager from '@ohos.window' +import display from '@ohos.display' +import Log from '../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../../../../../../features/screenlock/src/main/ets/com/ohos/common/constants.ets' + +const TAG = "ScreenLock-ServiceExtAbility" + +class ServiceExtAbility extends ServiceExtension { + onCreate(want) { + Log.showInfo(TAG, 'onCreate, want:' + want.abilityName); + display.getDefaultDisplay().then(dis => { + this.createWindow(Constants.WIN_NAME, dis.width, dis.height) + }) + } + + private createWindow(name: string, width: number, height: number) { + Log.showInfo(TAG, `createWindow name:${name}`) + windowManager.create(this.context, name, 2110).then((win) => { + Log.showInfo(TAG, "before begin " + name + " window show!") + win.resetSize(width, height).then(() => { + Log.showInfo(TAG, name + " window resetSize in then! ") + win.loadContent("pages/index").then(() => { + Log.showInfo(TAG, name + " window loadContent in then! ") + win.setFullScreen(true).then(() => { + Log.showInfo(TAG, name + " window setFullScreen in then! ") + win.show().then(() => { + Log.showInfo(TAG, "then begin " + name + " window show in then! "); + }) + }) + }) + }) + }, (error) => { + Log.showInfo(TAG, name + " window createFailed, error.code = " + error.code) + }) + Log.showInfo(TAG, name + " after window create") + } + + onDestroy() { + Log.showInfo(TAG, 'api8New onDestroy'); + } +} + +export default ServiceExtAbility \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/app.ets b/product/pc/src/main/ets/ServiceExtAbility/app.ets new file mode 100644 index 00000000..f523e785 --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/app.ets @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'ScreenLock-App' + +export default { + onCreate() { + Log.showInfo(TAG, 'Application onCreate'); + }, + onDestroy() { + Log.showInfo(TAG, 'Application onDestroy'); + }, +} diff --git a/product/pc/src/main/ets/ServiceExtAbility/common/constants.ets b/product/pc/src/main/ets/ServiceExtAbility/common/constants.ets new file mode 100644 index 00000000..28ddc9ee --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/common/constants.ets @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021 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 default class Constants { + + //touch mode + static TOUCHTYPE_DOWN: number = 0; + static TOUCHTYPE_UP: number = 1; + static TOUCHTYPE_MOVE: number = 2; + + //layout params - Pic + static FULL_CONTAINER_WIDTH = '100%' + static FULL_CONTAINER_HEIGHT = '100%' + static NOTIFICATION_AREA_WIDTH = '96%' + static NOTIFICATION_AREA_HEIGHT = '40%' + static PASSWORD_AREA_WIDTH = '33.33%' + +} \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/customPassword.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/customPassword.ets new file mode 100644 index 00000000..86a3f782 --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/customPassword.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' +import CustomPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets' +import Constants from '../common/constants.ets' + +const TAG = 'ScreenLock-CustomPassword' + +@Entry +@Component +export default struct CustomPassword { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Column() { + StatusBar() + } + Column() { + CustomPSD() + } + .width(Constants.PASSWORD_AREA_WIDTH) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + .backgroundColor($r('app.color.page_background')) + } +} \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets new file mode 100644 index 00000000..803f2692 --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' + +const TAG = 'ScreenLock-CustomScreenlock' + +//TODO:Custom screenlock +@Entry +@Component +export default struct CustomScreenlock { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + } + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + + } + + onDisappear() { + Log.showInfo(TAG, `onDisappear Start`) + } +} \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets new file mode 100644 index 00000000..dc56c5ee --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' +import DigitalPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets' +import Constants from '../common/constants.ets' + +const TAG = 'ScreenLock-DigitalPassword' + +@Entry +@Component +export default struct DigitalPassword { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Column() { + StatusBar() + } + Column() { + DigitalPSD() + } + .width(Constants.PASSWORD_AREA_WIDTH) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + .backgroundColor($r('app.color.page_background')) + } +} \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/index.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/index.ets new file mode 100644 index 00000000..f5011a98 --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/index.ets @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import {LockStyleMode} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets' +import ViewModel from '../vm/indexViewModel.ets' +import SlideScreenLock from './slidescreenlock.ets' +import CustomScreenLock from './customscreenlock.ets' +import JournalScreenLock from './journalscreenlock.ets' + +const TAG = 'ScreenLock-Entry'; + +@Entry +@Component +struct Index { + @State mViewModel: ViewModel = new ViewModel() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit() + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`) + } + + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + this.mViewModel.onPageShow(); + } + + onPageHide() { + Log.showInfo(TAG, `onPageHide`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + if (this.mViewModel.mode == LockStyleMode.SlideScreenLock) { + // Slide of lock screen + SlideScreenLock() + } else if (this.mViewModel.mode == LockStyleMode.JournalScreenLock) { + // TODO:Journal of lock screen + JournalScreenLock() + } else if (this.mViewModel.mode == LockStyleMode.CustomScreenLock) { + // TODO:Custom lock screen + CustomScreenLock() + } + } + } +} + diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets new file mode 100644 index 00000000..b5fbd768 --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' + +const TAG = 'ScreenLock-JournalScreenlock' + +//TODO:Journal Screenlock +@Entry +@Component +export default struct JournalScreenlock { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + } + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + + } + + onDisappear() { + Log.showInfo(TAG, `onDisappear Start`) + } +} \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets new file mode 100644 index 00000000..40328ddb --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' +import MixedPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/MixedPSD.ets' +import Constants from '../common/constants.ets' + +const TAG = 'ScreenLock-MixedPassword' + +@Entry +@Component +export default struct MixedPassword { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Column() { + StatusBar() + } + Column() { + MixedPSD() + } + .width(Constants.PASSWORD_AREA_WIDTH) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + .backgroundColor($r('app.color.page_background')) + } +} \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets new file mode 100644 index 00000000..513f99fa --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Accounts from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets' +import DateTime from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/dateTime.ets' +import BatterySoc from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets' +import LockIcon from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets' +import Wallpaper from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/wallpaper.ets' +import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets' +import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' +import Shortcut from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/shortcut.ets' +import Constants from '../common/constants.ets' +import ViewModel from '../vm/slideScreenLockViewModel.ets' + +const TAG = 'ScreenLock-SlideScreenlock' + +@Entry +@Component +export default struct SlideScreenlock { + @State mViewModel: ViewModel = new ViewModel() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit() + } + + build() { + Stack({ alignContent: Alignment.Bottom }) { + Column() { + Wallpaper() + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Column() { + StatusBar() + } + Column() { + Row() { + Shortcut() + Blank() + Accounts() + } + .width(Constants.NOTIFICATION_AREA_WIDTH) + .height($r('app.float.shortcut_area_height')) + } + Column() { + LockIcon() + }.height($r('app.float.lockicon_area_height')) + + Column() { + DateTime({ isShowData: false }) + }.height($r('app.float.datetime_area_height')) + .margin({ top: $r('app.float.datetime_margin_top')}) + + Column() { + BatterySoc() + }.height($r('app.float.batterysoc_area_height')) + + Column() { + Stack({ alignContent: Alignment.TopStart }) { + NotificationListComponent() + } + } + .width(Constants.NOTIFICATION_AREA_WIDTH) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + .onTouch((event) => { + this.mViewModel.touchEvent(event) + }) + } + } +} \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets b/product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets new file mode 100644 index 00000000..924e616d --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import ScreenlockStyle, {LockStyleMode +} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets' +import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets' + +const TAG = 'ScreenLock-IndexViewModel' + +export default class IndexViewModel { + mode: LockStyleMode = LockStyleMode.SlideScreenLock + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + this.serviceInit(); + this.mode = this.getMode(); + Log.showInfo(TAG, `ViewModelInit this.mode=${this.mode}`); + } + + serviceInit() { + Log.showInfo(TAG, `monitorEvents`) + ScreenLockService.init(); + } + + getMode(): number { + Log.showInfo(TAG, `getMode`) + return ScreenlockStyle.readMode("pc") + } + + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + ScreenLockService.notifyDrawDone(); + } +} \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets b/product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets new file mode 100644 index 00000000..c84e738c --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import {ReadConfigFile} from '../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' +import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets' +import Constants from '../common/constants.ets' +import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' + +const TAG = 'ScreenLock-SlideScreenLockViewModel' +//Height of notification area. +const NOTIFICATION_MAXHEIGHT = 500 +const SLIDING_LENGTH = 200 + + +export default class SlideScreenLockViewModel { + startX: number = 0 + startY: number = 0 + moveX: number = 0 + moveY: number = 0 + slidingLength: number = 0 + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + let mWindowManager = new WindowManager(); + mWindowManager.initWindowManager(); + this.slidingLength = SLIDING_LENGTH + Log.showInfo(TAG, `ViewModelInit slidingLength:${this.slidingLength}`); + AppStorage.SetOrCreate('maxHeight', NOTIFICATION_MAXHEIGHT); + } + + unlockScreen(): void{ + ScreenLockService.unlockScreen() + } + + touchEvent(event: TouchEvent) { + Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) + if (event.type == Constants.TOUCHTYPE_DOWN) { + this.startX = event.touches[0].screenX + this.startY = event.touches[0].screenY + } else if (event.type == Constants.TOUCHTYPE_UP) { + this.moveX = event.touches[0].screenX - this.startX + this.moveY = event.touches[0].screenY - this.startY + Log.showInfo(TAG, `Touch Event slidingLength:${this.slidingLength}`) + if (Math.abs(this.moveY) > this.slidingLength) { + this.unlockScreen() + } + } + event.stopPropagation(); + } +} \ No newline at end of file diff --git a/product/pc/src/main/resources/base/element/color.json b/product/pc/src/main/resources/base/element/color.json new file mode 100644 index 00000000..7498b868 --- /dev/null +++ b/product/pc/src/main/resources/base/element/color.json @@ -0,0 +1,16 @@ +{ + "color": [ + { + "name":"transparent", + "value":"#00000000" + }, + { + "name": "operation_ic_backgroundColor", + "value": "#FFFFFF" + }, + { + "name": "page_background", + "value": "#19181B" + } + ] +} \ No newline at end of file diff --git a/product/pc/src/main/resources/base/element/float.json b/product/pc/src/main/resources/base/element/float.json new file mode 100644 index 00000000..1dc2f112 --- /dev/null +++ b/product/pc/src/main/resources/base/element/float.json @@ -0,0 +1,25 @@ +{ + "float": [ + + { + "name": "lockicon_area_height", + "value": "44" + }, + { + "name": "datetime_area_height", + "value": "192" + }, + { + "name": "datetime_margin_top", + "value": "66" + }, + { + "name": "batterysoc_area_height", + "value": "48" + }, + { + "name": "shortcut_area_height", + "value": "120" + } + ] +} \ No newline at end of file diff --git a/product/pc/src/main/resources/base/element/string.json b/product/pc/src/main/resources/base/element/string.json new file mode 100644 index 00000000..baf627c4 --- /dev/null +++ b/product/pc/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "app_name", + "value": "ScreenLock" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "description_mainability", + "value": "JS_Phone_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/icon.png b/product/pc/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { + this.createWindow(Constants.WIN_NAME, dis.width, dis.height) + }) + } + + private createWindow(name: string, width: number, height: number) { + Log.showInfo(TAG, `createWindow name:${name}`) + windowManager.create(this.context, name, 2110).then((win) => { + Log.showInfo(TAG, "before begin " + name + " window show!") + win.resetSize(width, height).then(() => { + Log.showInfo(TAG, name + " window resetSize in then! ") + win.loadContent("pages/index").then(() => { + Log.showInfo(TAG, name + " window loadContent in then! ") + win.setFullScreen(true).then(() => { + Log.showInfo(TAG, name + " window setFullScreen in then! ") + win.show().then(() => { + Log.showInfo(TAG, "then begin " + name + " window show in then! "); + }) + }) + }) + }) + }, (error) => { + Log.showInfo(TAG, name + " window createFailed, error.code = " + error.code) + }) + Log.showInfo(TAG, name + " after window create") + } + + onDestroy() { + Log.showInfo(TAG, 'api8New onDestroy'); + } +} + +export default ServiceExtAbility \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/app.ets b/product/phone/src/main/ets/ServiceExtAbility/app.ets new file mode 100644 index 00000000..f523e785 --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/app.ets @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../common/src/main/ets/default/Log.ets'; + +const TAG = 'ScreenLock-App' + +export default { + onCreate() { + Log.showInfo(TAG, 'Application onCreate'); + }, + onDestroy() { + Log.showInfo(TAG, 'Application onDestroy'); + }, +} diff --git a/product/phone/src/main/ets/ServiceExtAbility/common/constants.ets b/product/phone/src/main/ets/ServiceExtAbility/common/constants.ets new file mode 100644 index 00000000..cc61ce9f --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/common/constants.ets @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 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 default class Constants { + + //touch mode + static TOUCHTYPE_DOWN: number = 0; + static TOUCHTYPE_UP: number = 1; + static TOUCHTYPE_MOVE: number = 2; + + //layout params - Pic + static FULL_CONTAINER_WIDTH = '100%' + static FULL_CONTAINER_HEIGHT = '100%' + static NOTIFICATION_AREA_WIDTH = '96%' + static NOTIFICATION_AREA_HEIGHT = '40%' + static LOCKICON_AREA_WIDTH = '15%' + static DATETIME_AREA_WIDTH = '20%' + + static PASSWORD_AREA_WIDTH = '95%' + + +} \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets new file mode 100644 index 00000000..803f2692 --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' + +const TAG = 'ScreenLock-CustomScreenlock' + +//TODO:Custom screenlock +@Entry +@Component +export default struct CustomScreenlock { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + } + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + + } + + onDisappear() { + Log.showInfo(TAG, `onDisappear Start`) + } +} \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets new file mode 100644 index 00000000..646878a8 --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' +import DigitalPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets' +import Constants from '../common/constants.ets' + +const TAG = 'ScreenLock-DigitalPassword' + +@Entry +@Component +export default struct DigitalPassword { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Column() { + StatusBar() + } + Column() { + DigitalPSD() + } + .width(Constants.PASSWORD_AREA_WIDTH) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + .backgroundColor($r('app.color.page_background')) + } +} \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/index.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/index.ets new file mode 100644 index 00000000..f5011a98 --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/index.ets @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import {LockStyleMode} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets' +import ViewModel from '../vm/indexViewModel.ets' +import SlideScreenLock from './slidescreenlock.ets' +import CustomScreenLock from './customscreenlock.ets' +import JournalScreenLock from './journalscreenlock.ets' + +const TAG = 'ScreenLock-Entry'; + +@Entry +@Component +struct Index { + @State mViewModel: ViewModel = new ViewModel() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit() + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`) + } + + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + this.mViewModel.onPageShow(); + } + + onPageHide() { + Log.showInfo(TAG, `onPageHide`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + if (this.mViewModel.mode == LockStyleMode.SlideScreenLock) { + // Slide of lock screen + SlideScreenLock() + } else if (this.mViewModel.mode == LockStyleMode.JournalScreenLock) { + // TODO:Journal of lock screen + JournalScreenLock() + } else if (this.mViewModel.mode == LockStyleMode.CustomScreenLock) { + // TODO:Custom lock screen + CustomScreenLock() + } + } + } +} + diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets new file mode 100644 index 00000000..b5fbd768 --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' + +const TAG = 'ScreenLock-JournalScreenlock' + +//TODO:Journal Screenlock +@Entry +@Component +export default struct JournalScreenlock { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + } + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + + } + + onDisappear() { + Log.showInfo(TAG, `onDisappear Start`) + } +} \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets new file mode 100644 index 00000000..40328ddb --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' +import MixedPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/MixedPSD.ets' +import Constants from '../common/constants.ets' + +const TAG = 'ScreenLock-MixedPassword' + +@Entry +@Component +export default struct MixedPassword { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Column() { + StatusBar() + } + Column() { + MixedPSD() + } + .width(Constants.PASSWORD_AREA_WIDTH) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + .backgroundColor($r('app.color.page_background')) + } +} \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets new file mode 100644 index 00000000..5eaa0818 --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Accounts from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets' +import DateTime from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/dateTime.ets' +import LockIcon from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets' +import Wallpaper from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/wallpaper.ets' +import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets' +import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' +import Constants from '../common/constants.ets' +import ViewModel from '../vm/slideScreenLockViewModel.ets' + +const TAG = 'ScreenLock-SlideScreenlock' + +@Entry +@Component +export default struct SlideScreenlock { + @State mViewModel: ViewModel = new ViewModel() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit() + } + + build() { + Stack({ alignContent: Alignment.Bottom }) { + Column() { + Wallpaper() + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Column() { + StatusBar() + } + + Column() { + LockIcon() + }.height(Constants.LOCKICON_AREA_WIDTH) + + Column() { + DateTime() + }.height(Constants.DATETIME_AREA_WIDTH) + + Column() { + Stack({ alignContent: Alignment.TopStart }) { + NotificationListComponent() + } + } + .width(Constants.NOTIFICATION_AREA_WIDTH) + // .height(Constants.NOTIFICATION_AREA_HEIGHT) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + .onTouch((event) => { + this.mViewModel.touchEvent(event) + }) + } + } +} \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets b/product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets new file mode 100644 index 00000000..e59e97ed --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import ScreenlockStyle, {LockStyleMode +} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets' +import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets' + +const TAG = 'ScreenLock-IndexViewModel' + +export default class IndexViewModel { + mode: LockStyleMode = LockStyleMode.SlideScreenLock + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + this.serviceInit(); + this.mode = this.getMode(); + Log.showInfo(TAG, `ViewModelInit this.mode=${this.mode}`); + } + + serviceInit() { + Log.showInfo(TAG, `monitorEvents`) + ScreenLockService.init(); + } + + getMode(): number { + Log.showInfo(TAG, `getMode`) + return ScreenlockStyle.readMode("phone") + } + + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + ScreenLockService.notifyDrawDone(); + } +} \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets b/product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets new file mode 100644 index 00000000..c2973aa4 --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import {ReadConfigFile} from '../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' +import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets' +import Constants from '../common/constants.ets' +import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' + +const TAG = 'ScreenLock-SlideScreenLockViewModel' +//Height of notification area. +const NOTIFICATION_MAXHEIGHT = 500 +const SLIDING_LENGTH = 200 + +export default class SlideScreenLockViewModel { + startX: number = 0 + startY: number = 0 + moveX: number = 0 + moveY: number = 0 + slidingLength: number = 0 + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + let mWindowManager = new WindowManager(); + mWindowManager.initWindowManager(); + this.slidingLength = SLIDING_LENGTH + AppStorage.SetOrCreate('maxHeight', NOTIFICATION_MAXHEIGHT); + } + + unlockScreen(): void{ + ScreenLockService.unlockScreen() + } + + touchEvent(event: TouchEvent) { + Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) + if (event.type == Constants.TOUCHTYPE_DOWN) { + this.startX = event.touches[0].screenX + this.startY = event.touches[0].screenY + } else if (event.type == Constants.TOUCHTYPE_UP) { + this.moveX = event.touches[0].screenX - this.startX + this.moveY = event.touches[0].screenY - this.startY + Log.showInfo(TAG, `Touch Event slidingLength:${this.slidingLength}`) + if (Math.abs(this.moveY) > this.slidingLength) { + this.unlockScreen() + } + } + } +} \ No newline at end of file diff --git a/product/phone/src/main/resources/base/element/color.json b/product/phone/src/main/resources/base/element/color.json new file mode 100644 index 00000000..c8f7d55a --- /dev/null +++ b/product/phone/src/main/resources/base/element/color.json @@ -0,0 +1,12 @@ +{ + "color": [ + { + "name":"transparent", + "value":"#00000000" + }, + { + "name": "page_background", + "value": "#19181B" + } + ] +} \ No newline at end of file diff --git a/product/phone/src/main/resources/base/element/string.json b/product/phone/src/main/resources/base/element/string.json new file mode 100644 index 00000000..ba1906b7 --- /dev/null +++ b/product/phone/src/main/resources/base/element/string.json @@ -0,0 +1,20 @@ +{ + "string": [ + { + "name": "app_name", + "value": "ScreenLock" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "description_mainability", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "input", + "value": "输入密码" + } + ] +} \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/icon.png b/product/phone/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 Date: Wed, 9 Mar 2022 09:49:19 +0800 Subject: [PATCH 052/373] add LICENSE & OAT Signed-off-by: zhuchengfeng <940848916@qq.com> --- LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ OAT.xml | 78 +++++++++++++++++++++ mgit.info | 1 - 3 files changed, 279 insertions(+), 1 deletion(-) create mode 100644 LICENSE create mode 100644 OAT.xml delete mode 100644 mgit.info diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/OAT.xml b/OAT.xml new file mode 100644 index 00000000..7c482ca2 --- /dev/null +++ b/OAT.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mgit.info b/mgit.info deleted file mode 100644 index 058fb12e..00000000 --- a/mgit.info +++ /dev/null @@ -1 +0,0 @@ -hmf/applications/standard/screenlock -- Gitee From 885668ff427008967c4f0446dd746f5c1616fbde Mon Sep 17 00:00:00 2001 From: zhuchengfeng <940848916@qq.com> Date: Fri, 11 Mar 2022 09:24:30 +0800 Subject: [PATCH 053/373] update readme Signed-off-by: zhuchengfeng <940848916@qq.com> --- README_zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_zh.md b/README_zh.md index 9a4c0840..e7f9f9d8 100644 --- a/README_zh.md +++ b/README_zh.md @@ -7,7 +7,7 @@ ## 简介 -锁屏应用是OpenHarmony中预置的系统应用,为用户提供锁屏的基础能力,提供滑动解锁,密码解锁等解锁能力,以及锁屏页面的信息展示。 +锁屏应用是OpenHarmony中预置的系统应用,为用户提供锁屏的基础能力,提供滑动解锁、密码解锁等解锁能力,以及锁屏页面的信息展示能力。 ### 架构图 -- Gitee From 60029c72cfb447d7e15fcae5e66bd76b962c9092 Mon Sep 17 00:00:00 2001 From: zhuchengfeng <940848916@qq.com> Date: Fri, 11 Mar 2022 15:13:21 +0800 Subject: [PATCH 054/373] update readme Signed-off-by: zhuchengfeng <940848916@qq.com> --- README_zh.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/README_zh.md b/README_zh.md index e7f9f9d8..6608f958 100644 --- a/README_zh.md +++ b/README_zh.md @@ -1,19 +1,20 @@ -# 锁屏 +# 锁屏 -- [简介](#section11660541593) - - [架构图](#section125101832114213) -- [目录](#section161941989596) -- [相关仓](#section1371113476307) - -## 简介 +## 简介 锁屏应用是OpenHarmony中预置的系统应用,为用户提供锁屏的基础能力,提供滑动解锁、密码解锁等解锁能力,以及锁屏页面的信息展示能力。 -### 架构图 +### 架构图 ![](figures/screenlock.png) +锁屏应用具有以下特性:\ +1.在开机流程、亮屏流程、灭屏流程中添加加锁流程及所对应的解锁流程,实现和系统的交互。\ +2.通过时间日期组件、通知组件、状态栏组件、lockIcon和快捷开关组件,实现不要的信息展示。\ +3.支持数字解锁、图案解锁、人脸解锁和密码混合解锁。 + +在common模块中,实现日志打印,外部接口管理,通用熟悉设置等功能。 -## 目录 +## 目录 ``` /applications/standard/screenlock @@ -38,7 +39,7 @@ │ ├── pages/slidesrceenlock # 滑动锁屏 ``` -## 相关仓 +## 相关仓 系统应用 -- Gitee From f2f2f6dec2f2df5ebcd7341aebace8fc5c6496c0 Mon Sep 17 00:00:00 2001 From: zhuchengfeng <940848916@qq.com> Date: Sat, 12 Mar 2022 15:07:13 +0800 Subject: [PATCH 055/373] splite features && readme update Signed-off-by: zhuchengfeng <940848916@qq.com> --- .gitignore | 3 + OAT.xml | 22 ++-- README_zh.md | 17 ++- features/datetimecomponent/build.gradle | 21 ++++ .../datetimecomponent/src/main/config.json | 23 ++++ .../src/main/ets/com/ohos/common/constants.ts | 22 ++++ .../ets/com/ohos/view/component/dateTime.ets | 6 +- .../main/ets/com/ohos/vm/dateTimeViewModel.ts | 102 ++++++++++++++++++ .../main/resources/base/element/color.json | 8 ++ .../main/resources/base/element/float.json | 20 ++++ .../main/resources/base/element/string.json | 8 ++ .../main/resources/en_US/element/string.json | 8 ++ .../main/resources/zh_CN/element/string.json | 8 ++ .../ets/com/ohos/model/screenLockModel.ets | 36 ------- .../ets/com/ohos/vm/dateTimeViewModel.ets | 77 ------------- .../main/resources/base/element/color.json | 12 --- .../main/resources/base/element/float.json | 16 --- .../main/resources/base/element/string.json | 12 --- .../main/resources/en_US/element/string.json | 12 --- .../main/resources/zh_CN/element/string.json | 12 --- features/shortcutcomponent/build.gradle | 21 ++++ .../shortcutcomponent/src/main/config.json | 23 ++++ .../src/main/ets/com/ohos/common/constants.ts | 29 +++++ .../ets/com/ohos/view/component/shortcut.ets | 35 +++--- .../main/ets/com/ohos/vm/shortcutViewModel.ts | 37 +++++++ .../main/resources/base/element/color.json | 12 +++ .../main/resources/base/element/string.json | 12 +++ .../src/main/resources/base/media/reboot.svg | 0 .../main/resources/base/media/shutdown.svg | 0 .../main/resources/en_US/element/string.json | 12 +++ .../main/resources/zh_CN/element/string.json | 12 +++ features/wallpapercomponent/build.gradle | 21 ++++ .../wallpapercomponent/src/main/config.json | 23 ++++ .../src/main/ets/com/ohos/common/constants.ts | 20 ++++ .../ets/com/ohos/view/component/wallpaper.ets | 4 +- .../ets/com/ohos/vm/wallpaperViewModel.ts} | 33 +++--- product/pc/build.gradle | 3 + .../pages/slidescreenlock.ets | 10 +- product/phone/build.gradle | 3 + .../pages/slidescreenlock.ets | 4 +- settings.gradle | 5 +- 41 files changed, 526 insertions(+), 238 deletions(-) create mode 100644 features/datetimecomponent/build.gradle create mode 100644 features/datetimecomponent/src/main/config.json create mode 100644 features/datetimecomponent/src/main/ets/com/ohos/common/constants.ts rename features/{screenlock => datetimecomponent}/src/main/ets/com/ohos/view/component/dateTime.ets (93%) create mode 100644 features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts create mode 100644 features/datetimecomponent/src/main/resources/base/element/color.json create mode 100644 features/datetimecomponent/src/main/resources/base/element/float.json create mode 100644 features/datetimecomponent/src/main/resources/base/element/string.json create mode 100644 features/datetimecomponent/src/main/resources/en_US/element/string.json create mode 100644 features/datetimecomponent/src/main/resources/zh_CN/element/string.json delete mode 100644 features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ets create mode 100644 features/shortcutcomponent/build.gradle create mode 100644 features/shortcutcomponent/src/main/config.json create mode 100644 features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts rename features/{screenlock => shortcutcomponent}/src/main/ets/com/ohos/view/component/shortcut.ets (77%) create mode 100644 features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts create mode 100644 features/shortcutcomponent/src/main/resources/base/element/color.json create mode 100644 features/shortcutcomponent/src/main/resources/base/element/string.json rename features/{screenlock => shortcutcomponent}/src/main/resources/base/media/reboot.svg (100%) rename features/{screenlock => shortcutcomponent}/src/main/resources/base/media/shutdown.svg (100%) create mode 100644 features/shortcutcomponent/src/main/resources/en_US/element/string.json create mode 100644 features/shortcutcomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/wallpapercomponent/build.gradle create mode 100644 features/wallpapercomponent/src/main/config.json create mode 100644 features/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts rename features/{screenlock => wallpapercomponent}/src/main/ets/com/ohos/view/component/wallpaper.ets (91%) rename features/{screenlock/src/main/ets/com/ohos/vm/wallpaperViewModel.ets => wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts} (50%) diff --git a/.gitignore b/.gitignore index 20c4a6ba..a51007f7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ /common/build /build/ /features/batterycomponent/build/ +/features/datetimecomponent/build/ +/features/shortcutcomponent/build/ +/features/wallpapercomponent/build/ /features/noticeitem/build/ /features/notificationservice/build/ /features/screenlock/build/ diff --git a/OAT.xml b/OAT.xml index 7c482ca2..f5f960f1 100644 --- a/OAT.xml +++ b/OAT.xml @@ -56,21 +56,27 @@ - + - + + + + + + + - + - + - + - + - + - + diff --git a/README_zh.md b/README_zh.md index 6608f958..e41fad43 100644 --- a/README_zh.md +++ b/README_zh.md @@ -2,18 +2,24 @@ ## 简介 +### 内容介绍 锁屏应用是OpenHarmony中预置的系统应用,为用户提供锁屏的基础能力,提供滑动解锁、密码解锁等解锁能力,以及锁屏页面的信息展示能力。 -### 架构图 +### 架构图介绍 ![](figures/screenlock.png) -锁屏应用具有以下特性:\ + +feature +``` 1.在开机流程、亮屏流程、灭屏流程中添加加锁流程及所对应的解锁流程,实现和系统的交互。\ 2.通过时间日期组件、通知组件、状态栏组件、lockIcon和快捷开关组件,实现不要的信息展示。\ 3.支持数字解锁、图案解锁、人脸解锁和密码混合解锁。 +``` -在common模块中,实现日志打印,外部接口管理,通用熟悉设置等功能。 - +common +``` +通用接口,实现日志打印,外部接口管理等功能 +``` ## 目录 ``` @@ -25,6 +31,9 @@ ├── signature # 证书文件目录 ├── features # 子组件目录 │ ├── batterycomponent # 电池组件 + │ ├── datetimecomponent # 日期时间组件 + │ ├── shortcutcomponent # 快捷开关组件 + │ ├── wallpapercomponent # 壁纸组件 │ ├── noticeitem # 通知子组件 │ ├── notificationservice # 通知服务组件 │ ├── screenlock # 锁屏组件 diff --git a/features/datetimecomponent/build.gradle b/features/datetimecomponent/build.gradle new file mode 100644 index 00000000..390462f7 --- /dev/null +++ b/features/datetimecomponent/build.gradle @@ -0,0 +1,21 @@ +apply plugin: 'com.huawei.ohos.library' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + implementation project(':common') +} diff --git a/features/datetimecomponent/src/main/config.json b/features/datetimecomponent/src/main/config.json new file mode 100644 index 00000000..7addd44a --- /dev/null +++ b/features/datetimecomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.screenlock", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.screenlock.datetimecomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "datetimecomponent", + "moduleType": "har" + }, + "srcPath": "default" + } +} \ No newline at end of file diff --git a/features/datetimecomponent/src/main/ets/com/ohos/common/constants.ts b/features/datetimecomponent/src/main/ets/com/ohos/common/constants.ts new file mode 100644 index 00000000..cc40dea1 --- /dev/null +++ b/features/datetimecomponent/src/main/ets/com/ohos/common/constants.ts @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + //layout params - Pic + static FULL_CONTAINER_WIDTH = '100%' + + //The refresh interval + static INTERVAL = 1000 +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/dateTime.ets b/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets similarity index 93% rename from features/screenlock/src/main/ets/com/ohos/view/component/dateTime.ets rename to features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets index f9e9fb3d..3daac210 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/dateTime.ets +++ b/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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,8 +14,8 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -import ViewModel from '../../vm/dateTimeViewModel.ets' -import Constants from '../../common/constants.ets' +import ViewModel from '../../vm/dateTimeViewModel' +import Constants from '../../common/constants' import {ScreenLockStatus} from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' const TAG = 'ScreenLock-DateTime' diff --git a/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts b/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts new file mode 100644 index 00000000..3c19462a --- /dev/null +++ b/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts @@ -0,0 +1,102 @@ +/** + * Copyright (c) 2021-2022 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 featureAbility from '@ohos.ability.featureAbility' +import settings from '@ohos.settingsnapi'; +import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import DateTimeCommon from '../../../../../../../../common/src/main/ets/default/DateTimeCommon' +import Constants from '../common/constants' +import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' + +const TAG = 'ScreenLock-DateTimeViewModel' + +/** + * DateTimeViewModel class + */ +export default class DateTimeViewModel { + timeVal: string = '' + dateVal: any = {} + weekVal: any = {} + setDateTimeHandle: number = -1 + isUsing24hFormat: boolean= false + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + + // TODO api 8 下有问题,临时注释 + // this.timeFormatMonitor(); + + this.setDateTime.bind(this)() + this.setDateTimeHandle = setInterval(this.setDateTime.bind(this), Constants.INTERVAL); + Log.showInfo(TAG, 'ViewModelInit end'); + } + + private timeFormatMonitor(): void { + Log.showInfo(TAG, 'timeFormatMonitor'); + let urivar = settings.getUri('settings.time.format') + let helper = featureAbility.acquireDataAbilityHelper(urivar); + this.checkTimeFormat(helper); + helper.on("dataChange", urivar, (err) => { + if (err.code !== 0) { + Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); + return; + } else { + this.checkTimeFormat(helper); + } + Log.showInfo(TAG, 'observer reveive notifychange on success data : ' + JSON.stringify(err)) + }) + } + + private checkTimeFormat(helper) { + Log.showInfo(TAG, 'checkTimeFormat'); + let getRetValue = settings.getValue(helper, 'settings.time.format', '24') + if (getRetValue === '12') { + this.isUsing24hFormat = false; + } else if (getRetValue === '24') { + this.isUsing24hFormat = true; + } + } + + private setDateTime() { + Log.showInfo(TAG, `setDateTime`) + this.timeVal = DateTimeCommon.getSystemTime(this.isUsing24hFormat) + this.dateVal = DateTimeCommon.getSystemDate() + this.weekVal = DateTimeCommon.getSystemWeek() + } + + stopPolling() { + Log.showInfo(TAG, `stopPolling start`) + Log.showInfo(TAG, `stopPolling setDateTimeHandle:${this.setDateTimeHandle}`); + if (this.setDateTimeHandle > 0) { + clearInterval(this.setDateTimeHandle) + this.setDateTimeHandle = -1 + Log.showInfo(TAG, `stopPolling setDateTimeHandle new :${this.setDateTimeHandle}`); + } + Log.showInfo(TAG, `stopPolling end`) + } + + onStatusChange(lockStatus: ScreenLockStatus): void { + Log.showInfo(TAG, `onStatusChange lockStatus:${lockStatus}`); + Log.showInfo(TAG, `onStatusChange setDateTimeHandle:${this.setDateTimeHandle}`); + if (lockStatus == ScreenLockStatus.Locking) { + if (this.setDateTimeHandle <= 0) { + this.setDateTimeHandle = setInterval(this.setDateTime.bind(this), Constants.INTERVAL); + Log.showInfo(TAG, `onStatusChange setDateTimeHandle new:${this.setDateTimeHandle}`); + } + } else { + this.stopPolling(); + } + } +} diff --git a/features/datetimecomponent/src/main/resources/base/element/color.json b/features/datetimecomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..58559638 --- /dev/null +++ b/features/datetimecomponent/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "date_time_color", + "value": "#ffffff" + } + ] +} \ No newline at end of file diff --git a/features/datetimecomponent/src/main/resources/base/element/float.json b/features/datetimecomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..9322ab7f --- /dev/null +++ b/features/datetimecomponent/src/main/resources/base/element/float.json @@ -0,0 +1,20 @@ +{ + "float": [ + { + "name": "time_fontsize", + "value": "148" + }, + { + "name": "time_top_margin", + "value": "10" + }, + { + "name": "time_bottom_margin", + "value": "10" + }, + { + "name": "date_fontsize", + "value": "18" + } + ] +} \ No newline at end of file diff --git a/features/datetimecomponent/src/main/resources/base/element/string.json b/features/datetimecomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..5fb11348 --- /dev/null +++ b/features/datetimecomponent/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "yyyy_mm_dd", + "value": "%d/%d/%d" + } + ] +} \ No newline at end of file diff --git a/features/datetimecomponent/src/main/resources/en_US/element/string.json b/features/datetimecomponent/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..5fb11348 --- /dev/null +++ b/features/datetimecomponent/src/main/resources/en_US/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "yyyy_mm_dd", + "value": "%d/%d/%d" + } + ] +} \ No newline at end of file diff --git a/features/datetimecomponent/src/main/resources/zh_CN/element/string.json b/features/datetimecomponent/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..8d20be74 --- /dev/null +++ b/features/datetimecomponent/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "yyyy_mm_dd", + "value": "%d年%d月%d日" + } + ] +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ets b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ets index 2f261ea0..6e9d3377 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ets +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ets @@ -14,15 +14,12 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' import ScreenLockMar from '@ohos.screenlock'; -import featureAbility from '@ohos.ability.featureAbility' -import settings from '@ohos.settingsnapi'; import windowManager from '@ohos.window' import Constants from '../common/constants.ets' import UserIDM from '@ohos.useridm' import UserAuth from '@ohos.userauth' import PinAuth from '@ohos.pinauth' import util from '@ohos.util'; -import WallpaperMar from '@ohos.app.wallpaperability' const TAG = 'ScreenLock-ScreenLockModel'; @@ -78,11 +75,6 @@ export default class ScreenLockModel { static UserAuthManager = new UserAuth.UserAuth(); static PINAuthManager = new PinAuth.PINAuth(); - static getScreenLockWallpaper(callback) { - Log.showInfo(TAG, 'getScreenLockWallpaper'); - WallpaperMar.getPixelMap(WallpaperMar.WALLPAPER_LOCKSCREEN, callback) - } - static eventListener(typeName: string, callback) { Log.showInfo(TAG, `eventListener:typeName ${typeName}`); ScreenLockMar.on(typeName, (err, data) => { @@ -121,34 +113,6 @@ export default class ScreenLockModel { }) } - static timeFormatMonitor(callback): void { - Log.showInfo(TAG, 'timeFormatMonitor'); - let urivar = settings.getUri('settings.time.format') - let helper = featureAbility.acquireDataAbilityHelper(urivar); - callback(ScreenLockModel.isUsing24hFormat(helper)); - helper.on("dataChange", urivar, (err) => { - if (err.code !== 0) { - Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); - return; - } else { - callback(ScreenLockModel.isUsing24hFormat(helper)); - } - Log.showInfo(TAG, 'observer reveive notifychange on success data : ' + JSON.stringify(err)) - }) - } - - static isUsing24hFormat(helper): boolean { - Log.showInfo(TAG, 'isUsing24hFormat'); - let isUsing24hFormat: boolean = false; - let getRetValue = settings.getValue(helper, 'settings.time.format', '24') - if (getRetValue === '12') { - isUsing24hFormat = false; - } else if (getRetValue === '24') { - isUsing24hFormat = true; - } - return isUsing24hFormat; - } - static openIDMSession(callback) { Log.showInfo(TAG, 'openIDMSession'); ScreenLockModel.UserIdentityManager.openSession().then((credentialId) => { diff --git a/features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ets deleted file mode 100644 index 88182202..00000000 --- a/features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ets +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import DateTimeCommon from '../../../../../../../../common/src/main/ets/default/DateTimeCommon' -import Constants from '../common/constants.ets' -import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' -import ScreenLockModel from '../model/screenLockModel.ets' - -const TAG = 'ScreenLock-DateTimeViewModel' - -/** - * DateTimeViewModel class - */ -export default class DateTimeViewModel { - timeVal: string = '' - dateVal: any = {} - weekVal: any = {} - setDateTimeHandle: number = -1 - isUsing24hFormat: boolean= false - - ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); - -// TODO api 8 下有问题,临时注释 -// ScreenLockModel.timeFormatMonitor((result) => { -// this.isUsing24hFormat = result; -// }); - - this.setDateTime.bind(this)() - this.setDateTimeHandle = setInterval(this.setDateTime.bind(this), Constants.INTERVAL); - Log.showInfo(TAG, 'ViewModelInit end'); - } - - setDateTime() { - Log.showInfo(TAG, `setDateTime`) - this.timeVal = DateTimeCommon.getSystemTime(this.isUsing24hFormat) - this.dateVal = DateTimeCommon.getSystemDate() - this.weekVal = DateTimeCommon.getSystemWeek() - } - - stopPolling() { - Log.showInfo(TAG, `stopPolling start`) - Log.showInfo(TAG, `stopPolling setDateTimeHandle:${this.setDateTimeHandle}`); - if (this.setDateTimeHandle > 0) { - clearInterval(this.setDateTimeHandle) - this.setDateTimeHandle = -1 - Log.showInfo(TAG, `stopPolling setDateTimeHandle new :${this.setDateTimeHandle}`); - } - Log.showInfo(TAG, `stopPolling end`) - } - - onStatusChange(lockStatus: ScreenLockStatus): void { - Log.showInfo(TAG, `onStatusChange lockStatus:${lockStatus}`); - Log.showInfo(TAG, `onStatusChange setDateTimeHandle:${this.setDateTimeHandle}`); - if (lockStatus == ScreenLockStatus.Locking) { - if (this.setDateTimeHandle <= 0) { - this.setDateTimeHandle = setInterval(this.setDateTime.bind(this), Constants.INTERVAL); - Log.showInfo(TAG, `onStatusChange setDateTimeHandle new:${this.setDateTimeHandle}`); - } - } else { - this.stopPolling(); - } - } -} diff --git a/features/screenlock/src/main/resources/base/element/color.json b/features/screenlock/src/main/resources/base/element/color.json index 0ccee8d9..618b9661 100644 --- a/features/screenlock/src/main/resources/base/element/color.json +++ b/features/screenlock/src/main/resources/base/element/color.json @@ -4,10 +4,6 @@ "name": "lock_prompt_color", "value": "#ffffff" }, - { - "name": "date_time_color", - "value": "#ffffff" - }, { "name": "nonotification_text_color", "value": "#ffffff" @@ -35,14 +31,6 @@ { "name": "lock_ic_color", "value": "#ffffff" - }, - { - "name": "shortcut_icon_color", - "value": "rgba(255, 255, 255, 0.5)" - }, - { - "name": "shortcut_text_color", - "value": "#ffffff" } ] } \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/element/float.json b/features/screenlock/src/main/resources/base/element/float.json index 6c503a59..af9d4ee0 100644 --- a/features/screenlock/src/main/resources/base/element/float.json +++ b/features/screenlock/src/main/resources/base/element/float.json @@ -20,22 +20,6 @@ "name": "lock_prompt_fontsize", "value": "32" }, - { - "name": "time_fontsize", - "value": "148" - }, - { - "name": "time_top_margin", - "value": "10" - }, - { - "name": "time_bottom_margin", - "value": "10" - }, - { - "name": "date_fontsize", - "value": "18" - }, { "name": "deleteall_image_opacity", "value": "0.9" diff --git a/features/screenlock/src/main/resources/base/element/string.json b/features/screenlock/src/main/resources/base/element/string.json index 96124ae2..cdf39bde 100644 --- a/features/screenlock/src/main/resources/base/element/string.json +++ b/features/screenlock/src/main/resources/base/element/string.json @@ -8,22 +8,10 @@ "name": "unlock_prompt", "value": "上滑解锁" }, - { - "name": "yyyy_mm_dd", - "value": "%d/%d/%d" - }, { "name": "nonotification_text", "value": "无通知" }, - { - "name": "shutdown", - "value": "关机" - }, - { - "name": "reboot", - "value": "重启" - }, { "name": "input", "value": "输入密码" diff --git a/features/screenlock/src/main/resources/en_US/element/string.json b/features/screenlock/src/main/resources/en_US/element/string.json index 930c006c..54af8d5f 100644 --- a/features/screenlock/src/main/resources/en_US/element/string.json +++ b/features/screenlock/src/main/resources/en_US/element/string.json @@ -8,10 +8,6 @@ "name": "unlock_prompt", "value": "Please slide to unlock" }, - { - "name": "yyyy_mm_dd", - "value": "%d/%d/%d" - }, { "name": "nonotification_text", "value": "No Notification" @@ -55,14 +51,6 @@ { "name": "charge_full", "value": "Already full" - }, - { - "name": "shutdown", - "value": "shutdown" - }, - { - "name": "reboot", - "value": "reboot" } ] } \ No newline at end of file diff --git a/features/screenlock/src/main/resources/zh_CN/element/string.json b/features/screenlock/src/main/resources/zh_CN/element/string.json index a8a30ad5..907d2dd1 100644 --- a/features/screenlock/src/main/resources/zh_CN/element/string.json +++ b/features/screenlock/src/main/resources/zh_CN/element/string.json @@ -7,10 +7,6 @@ { "name": "unlock_prompt", "value": "上滑解锁" - }, - { - "name": "yyyy_mm_dd", - "value": "%d年%d月%d日" }, { "name": "nonotification_text", @@ -56,14 +52,6 @@ { "name": "charge_full", "value": "已充满" - }, - { - "name": "shutdown", - "value": "关机" - }, - { - "name": "reboot", - "value": "重启" } ] } \ No newline at end of file diff --git a/features/shortcutcomponent/build.gradle b/features/shortcutcomponent/build.gradle new file mode 100644 index 00000000..390462f7 --- /dev/null +++ b/features/shortcutcomponent/build.gradle @@ -0,0 +1,21 @@ +apply plugin: 'com.huawei.ohos.library' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + implementation project(':common') +} diff --git a/features/shortcutcomponent/src/main/config.json b/features/shortcutcomponent/src/main/config.json new file mode 100644 index 00000000..7c44dd34 --- /dev/null +++ b/features/shortcutcomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.screenlock", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.screenlock.shortcutcomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "shortcutcomponent", + "moduleType": "har" + }, + "srcPath": "default" + } +} \ No newline at end of file diff --git a/features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts b/features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts new file mode 100644 index 00000000..75102961 --- /dev/null +++ b/features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 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 default class Constants { + //Shortcut params + static SHORTCUT_CIRCLE_WIDTH = '80px' + static SHORTCUT_CIRCLE_HEIGHT = '80px' + static SHORTCUT_TEXT_SIZE = '24px' + static SHORTCUT_TEXT_WIDTH = '48px' + static SHORTCUT_TEXT_HEIGHT = '34px' + static SHORTCUT_BLOCK_HEIGHT = '10px' + static SHORTCUT_HEIGHT = '150px' + + // Click types + static CLICK_TYPE_SHUTDOWN = "clickTypeShutDown" + static CLICK_TYPE_REBOOT = "clickTypeReboot" +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/shortcut.ets b/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets similarity index 77% rename from features/screenlock/src/main/ets/com/ohos/view/component/shortcut.ets rename to features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets index 0e8822fb..2bdf9967 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/shortcut.ets +++ b/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets @@ -14,15 +14,15 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../../common/constants.ets' +import Constants from '../../common/constants' +import ViewModel from '../../vm/shortcutViewModel' import power from '@ohos.power' const TAG = 'ScreenLock-Shortcut' -const TAG_Shutdown = 'ScreenLock-Shutdown' -const TAG_Reboot = 'ScreenLock-Reboot' @Component export default struct Shortcut { + private viewModel: ViewModel = new ViewModel() private shutdownIcon: Resource = $r("app.media.shutdown") private shutdownLabel: Resource = $r("app.string.shutdown") private rebootIcon: Resource = $r("app.media.reboot") @@ -33,47 +33,38 @@ export default struct Shortcut { } build() { - Row({ space:'30px' }) { + Row({ space: '30px' }) { ShortcutComponent({ + mTag: 'ScreenLock-Shutdown', mIcon: this.shutdownIcon, mLabel: this.shutdownLabel, - mClickEvent: () => this.onShutdownClick() + mClickEvent: () => this.viewModel.onShortcutClick(Constants.CLICK_TYPE_SHUTDOWN) }) ShortcutComponent({ + mTag: 'ScreenLock-Reboot', mIcon: this.rebootIcon, mLabel: this.rebootLabel, - mClickEvent: () => this.onRebootClick() + mClickEvent: () => this.viewModel.onShortcutClick(Constants.CLICK_TYPE_REBOOT) }) } - .margin({left: '50px'}) - } - - onShutdownClick() { - Log.showInfo(TAG, `onShutdownClick`) - power.shutdownDevice("shutdown_device") - Log.showInfo(TAG, `power shutdown success`) - } - - onRebootClick() { - Log.showInfo(TAG, `onRebootClick`) - power.rebootDevice("reboot_device") - Log.showInfo(TAG, `power reboot success`) + .margin({ left: '50px' }) } } @Component struct ShortcutComponent { + private mTag: string private mIcon: Resource private mLabel: Resource private mClickEvent: Function aboutToAppear() { - Log.showInfo(TAG_Shutdown, `aboutToAppear Start`) + Log.showInfo(this.mTag, `aboutToAppear Start`) } aboutToDisappear() { - Log.showInfo(TAG_Shutdown, `aboutToDisAppear`) + Log.showInfo(this.mTag, `aboutToDisAppear`) } build() { @@ -85,7 +76,7 @@ struct ShortcutComponent { .width(Constants.SHORTCUT_CIRCLE_WIDTH) .height(Constants.SHORTCUT_CIRCLE_HEIGHT) Image(this.mIcon) - .size({ width: Constants.SHORTCUT_CIRCLE_WIDTH, height: Constants.SHORTCUT_CIRCLE_HEIGHT}) + .size({ width: Constants.SHORTCUT_CIRCLE_WIDTH, height: Constants.SHORTCUT_CIRCLE_HEIGHT }) .objectFit(ImageFit.Contain) } diff --git a/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts b/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts new file mode 100644 index 00000000..acdcf3e3 --- /dev/null +++ b/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/constants' +import power from '@ohos.power' + +const TAG = 'ScreenLock-ShortcutViewModel' + +export default class ShortcutViewModel { + onShortcutClick(shortcutType: string) { + Log.showInfo(TAG, `onShortcutClick ${shortcutType}`) + switch (shortcutType) { + case Constants.CLICK_TYPE_SHUTDOWN: + power.shutdownDevice("shutdown_device") + break; + case Constants.CLICK_TYPE_REBOOT: + power.rebootDevice("reboot_device") + break; + default: + Log.showError(TAG, `${shortcutType} is not support`) + } + Log.showInfo(TAG, `onShortcutClick ${shortcutType} success`) + } +} \ No newline at end of file diff --git a/features/shortcutcomponent/src/main/resources/base/element/color.json b/features/shortcutcomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..afad5971 --- /dev/null +++ b/features/shortcutcomponent/src/main/resources/base/element/color.json @@ -0,0 +1,12 @@ +{ + "color": [ + { + "name": "shortcut_icon_color", + "value": "rgba(255, 255, 255, 0.5)" + }, + { + "name": "shortcut_text_color", + "value": "#ffffff" + } + ] +} \ No newline at end of file diff --git a/features/shortcutcomponent/src/main/resources/base/element/string.json b/features/shortcutcomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..4558c0a6 --- /dev/null +++ b/features/shortcutcomponent/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "shutdown", + "value": "关机" + }, + { + "name": "reboot", + "value": "重启" + } + ] +} \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/media/reboot.svg b/features/shortcutcomponent/src/main/resources/base/media/reboot.svg similarity index 100% rename from features/screenlock/src/main/resources/base/media/reboot.svg rename to features/shortcutcomponent/src/main/resources/base/media/reboot.svg diff --git a/features/screenlock/src/main/resources/base/media/shutdown.svg b/features/shortcutcomponent/src/main/resources/base/media/shutdown.svg similarity index 100% rename from features/screenlock/src/main/resources/base/media/shutdown.svg rename to features/shortcutcomponent/src/main/resources/base/media/shutdown.svg diff --git a/features/shortcutcomponent/src/main/resources/en_US/element/string.json b/features/shortcutcomponent/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..a8da653b --- /dev/null +++ b/features/shortcutcomponent/src/main/resources/en_US/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "shutdown", + "value": "shutdown" + }, + { + "name": "reboot", + "value": "reboot" + } + ] +} \ No newline at end of file diff --git a/features/shortcutcomponent/src/main/resources/zh_CN/element/string.json b/features/shortcutcomponent/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..4558c0a6 --- /dev/null +++ b/features/shortcutcomponent/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "shutdown", + "value": "关机" + }, + { + "name": "reboot", + "value": "重启" + } + ] +} \ No newline at end of file diff --git a/features/wallpapercomponent/build.gradle b/features/wallpapercomponent/build.gradle new file mode 100644 index 00000000..390462f7 --- /dev/null +++ b/features/wallpapercomponent/build.gradle @@ -0,0 +1,21 @@ +apply plugin: 'com.huawei.ohos.library' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + implementation project(':common') +} diff --git a/features/wallpapercomponent/src/main/config.json b/features/wallpapercomponent/src/main/config.json new file mode 100644 index 00000000..8183c58b --- /dev/null +++ b/features/wallpapercomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.screenlock", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.screenlock.wallpapercomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "wallpapercomponent", + "moduleType": "har" + }, + "srcPath": "default" + } +} \ No newline at end of file diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts b/features/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts new file mode 100644 index 00000000..2b83ee5c --- /dev/null +++ b/features/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + //layout params - Pic + static FULL_CONTAINER_WIDTH = '100%' + static FULL_CONTAINER_HEIGHT = '100%' +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/wallpaper.ets b/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets similarity index 91% rename from features/screenlock/src/main/ets/com/ohos/view/component/wallpaper.ets rename to features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets index c21840aa..b70556d7 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/wallpaper.ets +++ b/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets @@ -14,8 +14,8 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -import ViewModel from '../../vm/wallpaperViewModel.ets' -import Constants from '../../common/constants.ets' +import ViewModel from '../../vm/wallpaperViewModel' +import Constants from '../../common/constants' const TAG = 'ScreenLock-Wallpaper' diff --git a/features/screenlock/src/main/ets/com/ohos/vm/wallpaperViewModel.ets b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts similarity index 50% rename from features/screenlock/src/main/ets/com/ohos/vm/wallpaperViewModel.ets rename to features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts index 64d6eb53..71a4d30e 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/wallpaperViewModel.ets +++ b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,24 +13,29 @@ * limitations under the License. */ -import ScreenLockModel from '../model/screenLockModel.ets' +import WallpaperMar from '@ohos.app.wallpaperability' import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' //TODO:import image from '@ohos.multimedia.image' const TAG = 'ScreenLock-WallpaperViewModel' export default class WallpaperViewModel { - screenlockWallpaper: string = '' + screenlockWallpaper: string = '' - ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); - ScreenLockModel.getScreenLockWallpaper((error, data) => { - if (error != undefined && error != null) { - Log.showInfo(TAG, 'getScreenLockWallpaper error:' + JSON.stringify(error)); - } else { - Log.showInfo(TAG, 'getScreenLockWallpaper data:' + JSON.stringify(data)); - this.screenlockWallpaper = data - } - }) - } + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + this.getScreenLockWallpaper() + } + + private getScreenLockWallpaper() { + Log.showInfo(TAG, 'getScreenLockWallpaper'); + WallpaperMar.getPixelMap(WallpaperMar.WALLPAPER_LOCKSCREEN, (error, data) => { + if (error != undefined && error != null) { + Log.showInfo(TAG, 'getScreenLockWallpaper error:' + JSON.stringify(error)); + } else { + Log.showInfo(TAG, 'getScreenLockWallpaper data:' + JSON.stringify(data)); + this.screenlockWallpaper = data + } + }) + } } diff --git a/product/pc/build.gradle b/product/pc/build.gradle index 785f075f..b4ff2f55 100644 --- a/product/pc/build.gradle +++ b/product/pc/build.gradle @@ -20,5 +20,8 @@ dependencies { entryImplementation project(':entry') implementation project(':common') implementation project(':features:screenlock') + implementation project(':features:datetimecomponent') + implementation project(':features:shortcutcomponent') + implementation project(':features:wallpapercomponent') implementation project(':features:noticeitem') } diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets index 513f99fa..96e7fa00 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets @@ -15,13 +15,13 @@ import Log from '../../../../../../../common/src/main/ets/default/Log.ets' import Accounts from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets' -import DateTime from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/dateTime.ets' +import DateTime from '../../../../../../../features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets' import BatterySoc from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets' import LockIcon from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets' -import Wallpaper from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/wallpaper.ets' +import Wallpaper from '../../../../../../../features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets' import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets' import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' -import Shortcut from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/shortcut.ets' +import Shortcut from '../../../../../../../features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets' import Constants from '../common/constants.ets' import ViewModel from '../vm/slideScreenLockViewModel.ets' @@ -49,6 +49,7 @@ export default struct SlideScreenlock { Column() { StatusBar() } + Column() { Row() { Shortcut() @@ -58,6 +59,7 @@ export default struct SlideScreenlock { .width(Constants.NOTIFICATION_AREA_WIDTH) .height($r('app.float.shortcut_area_height')) } + Column() { LockIcon() }.height($r('app.float.lockicon_area_height')) @@ -65,7 +67,7 @@ export default struct SlideScreenlock { Column() { DateTime({ isShowData: false }) }.height($r('app.float.datetime_area_height')) - .margin({ top: $r('app.float.datetime_margin_top')}) + .margin({ top: $r('app.float.datetime_margin_top') }) Column() { BatterySoc() diff --git a/product/phone/build.gradle b/product/phone/build.gradle index 785f075f..b4ff2f55 100644 --- a/product/phone/build.gradle +++ b/product/phone/build.gradle @@ -20,5 +20,8 @@ dependencies { entryImplementation project(':entry') implementation project(':common') implementation project(':features:screenlock') + implementation project(':features:datetimecomponent') + implementation project(':features:shortcutcomponent') + implementation project(':features:wallpapercomponent') implementation project(':features:noticeitem') } diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets index 5eaa0818..b56e03b5 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets @@ -15,9 +15,9 @@ import Log from '../../../../../../../common/src/main/ets/default/Log.ets' import Accounts from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets' -import DateTime from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/dateTime.ets' +import DateTime from '../../../../../../../features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets' import LockIcon from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets' -import Wallpaper from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/wallpaper.ets' +import Wallpaper from '../../../../../../../features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets' import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets' import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' import Constants from '../common/constants.ets' diff --git a/settings.gradle b/settings.gradle index 4d18913a..f1565a62 100644 --- a/settings.gradle +++ b/settings.gradle @@ -12,7 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -include ':entry',':phone', ':pc', ':common', ':features:screenlock', - ':features:noticeitem', ':features:notificationservice',':features:batterycomponent' +include ':entry', ':phone', ':pc', ':common', ':features:screenlock', + ':features:noticeitem', ':features:notificationservice', ':features:batterycomponent', + ':features:datetimecomponent', ':features:wallpapercomponent', ':features:shortcutcomponent' project(':phone').projectDir = new File('./product/phone') project(':pc').projectDir = new File('./product/pc') \ No newline at end of file -- Gitee From 571f015506653206e0c9e53a97d475e164773c43 Mon Sep 17 00:00:00 2001 From: r00498791 Date: Mon, 11 Apr 2022 12:54:14 +0800 Subject: [PATCH 056/373] update systemui code from std Signed-off-by: r00498791 --- ...CheckEmptyUtils.ets => CheckEmptyUtils.ts} | 2 +- .../SourceLoader.ets => default/Constants.ts} | 63 +- common/src/main/ets/default/Decorators.ts | 45 ++ common/src/main/ets/default/InitSystemUi.ts | 29 + .../src/main/ets/default/{Log.ets => Log.ts} | 27 +- .../ets/default/MultimodalInputManager.ts | 96 +++ .../{ReadConfigUtil.ets => ReadConfigUtil.ts} | 4 +- .../{ResourceUtil.ets => ResourceUtil.ts} | 7 +- .../src/main/ets/default/ScreenLockManager.ts | 63 ++ common/src/main/ets/default/SettingsUtil.ts | 65 +++ .../main/ets/default/SingleInstanceHelper.ts | 36 ++ .../main/ets/default/StyleConfiguration.ts | 32 + .../bundleManager.ets => StyleManager.ts} | 41 +- ...chUserManager.ets => SwitchUserManager.ts} | 86 +-- common/src/main/ets/default/TimeManager.ts | 120 ++++ .../src/main/ets/default/TintStateManager.ts | 101 ++++ common/src/main/ets/default/WindowManager.ets | 99 ---- common/src/main/ets/default/WindowManager.ts | 119 ++++ .../default/abilitymanager/abilityManager.ts | 69 +++ .../default/abilitymanager/bundleManager.ts | 38 ++ ...tyManager.ets => featureAbilityManager.ts} | 4 +- ...tionManager.ets => notificationManager.ts} | 4 +- .../default/commonEvent/CommonEventManager.ts | 97 +++ common/src/main/ets/default/event/EventBus.ts | 76 +++ .../main/ets/default/event/EventManager.ts | 94 +++ .../src/main/ets/default/event/EventUtil.ts | 81 +++ ...htConfigUtils.ets => HeightConfigUtils.ts} | 4 +- .../PluginDataSourceAdapter.ets | 114 ---- .../PluginDataSourceAdapter.ts | 130 +++++ .../PluginDataSourceManager.ets | 62 -- .../PluginDataSourceManager.ts | 118 ++++ .../common/BundleParseUtil.ts | 116 ++++ .../ets/plugindatasource/common/Constants.ts | 76 +++ .../sourceloader/BaseMetaSourceLoader.ets | 216 ------- ...eLoader.ets => DataAbilitySourceLoader.ts} | 28 +- .../sourceloader/MetaSourceLoader.ts | 96 +++ ...SourceLoader.ets => PluginSourceLoader.ts} | 33 +- .../sourceloader/SourceLoader.ts | 53 ++ .../sourceloader/SourceLoaderFactory.ts | 49 ++ .../main/ets/template/SimpleToggleBase.ets | 135 +++-- .../src/main/ets/template/UniformConfig.ets | 51 -- .../ets/template/common/StyleConfiguration.ts | 87 +++ .../src/main/ets/template/iconComponent.ets | 38 +- .../src/main/ets/template/iconTitleBase.ets | 94 +-- doc/Instructions.md | 2 +- entry/{ => pc}/.gitignore | 0 entry/{ => pc}/build.gradle | 0 entry/{ => pc}/package.json | 0 entry/pc/src/main/config.json | 91 +++ entry/pc/src/main/ets/AbilityStage.ts | 24 + .../ServiceExtAbility/ServiceExtAbility.ts | 64 ++ .../src/main/ets/ServiceExtAbility}/app.ets | 0 .../ets/ServiceExtAbility}/pages/index.ets | 2 +- .../main/resources/base/element/string.json | 16 + .../src/main/resources/base/media/icon.png | Bin entry/phone/.gitignore | 1 + .../phone}/build.gradle | 2 - .../phone}/package.json | 0 entry/phone/src/main/config.json | 88 +++ entry/phone/src/main/ets/AbilityStage.ts | 24 + .../ServiceExtAbility/ServiceExtAbility.ts | 58 ++ .../src/main/ets/ServiceExtAbility/app.ets | 20 +- .../ets/ServiceExtAbility/pages/index.ets | 27 + .../main/resources/base/element/string.json | 16 + .../src/main/resources/base/media/icon.png | Bin infra/config_exts.gradle | 2 +- .../{ => default}/navigationBar/.gitignore | 0 product/default/navigationBar/build.gradle | 16 + .../navigationBar}/package.json | 0 .../navigationBar/src/main/config.json | 18 +- .../src/main/ets/AbilityStage.ts | 23 + .../ServiceExtAbility/ServiceExtAbility.ts | 73 +++ .../src/main/ets/ServiceExtAbility}/app.ets | 21 +- .../common/NavBarConfiguration.ts} | 24 +- .../common/StyleConfiguration.ts | 33 ++ .../ServiceExtAbility/common/StyleManager.ts | 77 +++ .../ServiceExtAbility/common/constants.ts} | 13 +- .../common/utils/configReader.ts} | 6 +- .../ets/ServiceExtAbility}/i18n/en-US.json | 0 .../ets/ServiceExtAbility}/i18n/zh-CN.json | 0 .../ets/ServiceExtAbility}/pages/index.ets | 32 +- .../ServiceExtAbility}/pages/keyButton.ets | 28 +- .../ServiceExtAbility}/pages/oneLayout.ets | 10 +- .../ServiceExtAbility}/pages/threeLayout.ets | 22 +- .../viewmodel/NavigationBarViewModel.ts | 158 +++++ .../main/resources/base/element/color.json | 4 - .../main/resources/base/element/float.json | 24 + .../main/resources/base/element/string.json | 8 +- .../resources/base/media/ic_systemui_back.svg | 10 + .../resources/base/media/ic_systemui_home.svg | 10 + .../base/media/ic_systemui_recent.svg | 10 + .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 8 +- .../rawfile/navigationBarLayoutConfig.json | 0 .../main/resources/zh_CN/element/string.json | 8 +- .../notificationmanagement/.gitignore | 0 .../notificationmanagement/build.gradle | 5 +- .../notificationmanagement}/package.json | 0 .../src/main/config.json | 18 +- .../src/main/ets/AbilityStage.ts | 23 + .../src/main/ets/MainAbility/MainAbility.ts | 48 ++ .../src/main/ets/MainAbility}/app.ets | 0 .../main/ets/MainAbility/common/constants.ts} | 5 +- .../ets/MainAbility/pages/batchSetEnable.ets | 101 ++++ .../main/ets/MainAbility/pages/noDisturb.ets | 551 ++++++++++++++++++ .../ets/MainAbility/pages/noDisturbPre.ets | 102 ++++ .../pages/notificationManagenment.ets | 205 +++++++ .../main/ets/MainAbility/pages/setEnable.ets | 124 ++++ .../ets/MainAbility/pages/slotSetting.ets | 233 ++++++++ .../ets/MainAbility/vm/noDisturbViewModel.ts | 141 +++++ .../vm/notificationManagenmentViewModel.ts | 62 ++ .../main/resources/base/element/string.json | 25 + .../src/main/resources/base/media/ic_back.svg | 0 .../base/media/ic_settings_arrow.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 24 + .../main/resources/zh_CN/element/string.json | 24 + product/default/volumepanel/.gitignore | 1 + product/default/volumepanel/build.gradle | 16 + product/default/volumepanel/package.json | 1 + .../default/volumepanel/src/main/config.json | 56 ++ .../volumepanel/src/main/ets/AbilityStage.ts | 23 + .../ServiceExtAbility/ServiceExtAbility.ts | 55 ++ .../src/main/ets/ServiceExtAbility/app.ets | 49 ++ .../common/StyleConfiguration.ts | 27 + .../ServiceExtAbility/common/StyleManager.ts | 73 +++ .../ets/ServiceExtAbility/common/constants.ts | 18 + .../ets/ServiceExtAbility/pages/index.ets | 50 ++ .../main/resources/base}/element/string.json | 2 +- .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 2 +- .../main/resources/zh_CN}/element/string.json | 3 +- .../main/resources/base/element/float.json | 32 - .../base/media/ic_navigation_back.png | Bin 409 -> 0 bytes .../base/media/ic_navigation_home.png | Bin 420 -> 0 bytes .../base/media/ic_navigation_recent.png | Bin 221 -> 0 bytes .../main/ets/default/pages/batchSetEnable.ets | 81 --- .../src/main/ets/default/pages/noDisturb.ets | 250 -------- .../default/pages/notificationManagenment.ets | 97 --- .../src/main/ets/default/pages/setEnable.ets | 89 --- .../ets/default/vm/noDisturbViewModel.ets | 70 --- .../main/resources/base/element/color.json | 32 - .../main/resources/base/element/float.json | 80 --- .../{statusbar => pc/controlpanel}/.gitignore | 0 product/pc/controlpanel/build.gradle | 22 + product/pc/controlpanel/package.json | 1 + product/pc/controlpanel/src/main/config.json | 67 +++ .../controlpanel/src/main/ets/AbilityStage.ts | 23 + .../ServiceExtAbility/ServiceExtAbility.ts | 55 ++ .../src/main/ets/ServiceExtAbility/app.ets | 23 + .../pages/common/ControlCenterConfig.ts | 70 +-- .../pages/common/StyleConfiguration.ts | 29 + .../pages/common/StyleManager.ts | 270 +++++++++ .../pages/common/constants.ts | 18 + .../ets/ServiceExtAbility/pages/control.ets | 48 +- .../ets/ServiceExtAbility/pages/index.ets | 232 ++++++++ .../workers/PluginDataSourceWorker.js | 52 +- .../main/resources/base/element/color.json | 12 + .../main/resources/base/element/float.json | 8 + .../main/resources/base/element/string.json | 0 .../base/media/ic_controlcenter_oh.png | Bin 0 -> 1161 bytes .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 12 + .../main/resources/zh_CN/element/string.json | 12 + product/pc/notificationpanel/.gitignore | 1 + product/pc/notificationpanel/build.gradle | 15 + product/pc/notificationpanel/package.json | 1 + .../pc/notificationpanel/src/main/config.json | 70 +++ .../src/main/ets/AbilityStage.ts | 23 + .../ServiceExtAbility/ServiceExtAbility.ts | 71 +++ .../src/main/ets/ServiceExtAbility/app.ets | 23 + .../pages/bannerNotification.ets | 133 +++++ .../pages/common/StyleConfiguration.ts | 29 + .../pages/common/StyleManager.ts | 52 ++ .../pages/common/constants.ts | 21 + .../ets/ServiceExtAbility/pages/index.ets | 168 ++++++ .../ServiceExtAbility/pages/notification.ets | 103 ++++ .../main/resources/base/element/color.json | 24 +- .../main/resources/base/element/float.json | 72 ++- .../main/resources/base}/element/string.json | 24 +- .../main/resources/base/media/delete_all.png | Bin .../base/media/ic_message_filled.png | Bin 0 -> 1375 bytes .../resources/base/media/ic_public_delete.svg | 13 + .../base/media/ic_public_settings.svg | 13 + .../main/resources/base/media/ic_settings.png | Bin .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 24 +- .../main/resources/zh_CN}/element/string.json | 24 +- product/pc/statusbar/.gitignore | 1 + product/{ => pc}/statusbar/build.gradle | 6 +- product/pc/statusbar/package.json | 1 + product/pc/statusbar/src/main/config.json | 51 ++ .../pc/statusbar/src/main/ets/AbilityStage.ts | 23 + .../ServiceExtAbility/ServiceExtAbility.ts | 62 ++ .../src/main/ets/ServiceExtAbility/app.ets | 38 ++ .../pages/common/StatusbarConfig.ts | 92 +++ .../pages/common/StyleConfiguration.ts | 27 + .../pages/common/StyleManager.ts | 174 ++++++ .../pages/common/constants.ts | 17 + .../ets/ServiceExtAbility/pages/index.ets | 80 +++ .../workers/PluginDataSourceWorker.js | 86 +++ .../main/resources/base/element/color.json | 12 + .../main/resources/base/element/string.json | 28 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 28 + .../main/resources/zh_CN/element/string.json | 28 + product/phone/dropdownpanel/.gitignore | 1 + product/phone/dropdownpanel/build.gradle | 28 + product/phone/dropdownpanel/package.json | 1 + .../phone/dropdownpanel}/src/main/config.json | 38 +- .../src/main/ets/AbilityStage.ts | 23 + .../ServiceExtAbility/ServiceExtAbility.ts | 64 ++ .../src/main/ets/ServiceExtAbility/app.ets | 20 +- .../pages/bannerNotification.ets | 132 +++++ .../pages/common/ControlCenterConfig.ts | 48 ++ .../pages/common/StyleConfiguration.ts | 73 +++ .../pages/common/StyleManager.ts | 267 +++++++++ .../pages/common/constants.ts} | 13 +- .../pages/common/navigationEvent.ts} | 4 +- .../ets/ServiceExtAbility}/pages/control.ets | 89 +-- .../ets/ServiceExtAbility/pages/index.ets | 323 ++++++++++ .../ServiceExtAbility/pages/notification.ets | 232 ++++++++ .../workers/PluginDataSourceWorker.js | 86 +++ .../main/resources/base/element/color.json | 23 + .../main/resources/base/element/float.json | 60 ++ .../main/resources/base/element/string.json | 52 ++ .../main/resources/base/media/delete_all.png | Bin 0 -> 4061 bytes .../main/resources/base/media/ic_settings.png | Bin 0 -> 1060 bytes .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 52 ++ .../main/resources/zh_CN/element/string.json | 52 ++ product/phone/statusbar/.gitignore | 1 + product/phone/statusbar/build.gradle | 24 + product/phone/statusbar/package.json | 1 + .../statusbar/src/main/config.json | 17 +- .../statusbar/src/main/ets/AbilityStage.ts | 23 + .../ServiceExtAbility/ServiceExtAbility.ts | 50 ++ .../src/main/ets/ServiceExtAbility}/app.ets | 30 +- .../pages/common/StatusbarConfig.ts | 109 ++++ .../pages/common/StyleConfiguration.ts | 27 + .../pages/common/StyleManager.ts | 51 ++ .../pages/common/constants.ts | 20 + .../ets/ServiceExtAbility}/pages/index.ets | 165 +++--- .../workers/PluginDataSourceWorker.js | 86 +++ .../main/resources/base/element/color.json | 12 + .../main/resources/base/element/string.json | 28 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 28 + .../main/resources/zh_CN/element/string.json | 28 + .../main/ets/default/pages/notification.ets | 227 -------- .../main/resources/base/media/airplane.svg | 14 - .../main/resources/base/media/airplane_d.svg | 14 - .../src/main/resources/base/media/wifi.svg | 17 - .../src/main/resources/base/media/wifi_d.svg | 17 - .../rawfile/controlcentercomponentConfig.json | 24 - .../rawfile/statusbarcomponentConfig.json | 46 -- settings.gradle | 17 +- signature/systemui.p7b | Bin 3421 -> 3436 bytes 258 files changed, 9873 insertions(+), 2365 deletions(-) rename common/src/main/ets/default/{CheckEmptyUtils.ets => CheckEmptyUtils.ts} (96%) rename common/src/main/ets/{plugindatasource/sourceloader/SourceLoader.ets => default/Constants.ts} (43%) create mode 100644 common/src/main/ets/default/Decorators.ts create mode 100644 common/src/main/ets/default/InitSystemUi.ts rename common/src/main/ets/default/{Log.ets => Log.ts} (62%) create mode 100644 common/src/main/ets/default/MultimodalInputManager.ts rename common/src/main/ets/default/{ReadConfigUtil.ets => ReadConfigUtil.ts} (95%) rename common/src/main/ets/default/{ResourceUtil.ets => ResourceUtil.ts} (86%) create mode 100644 common/src/main/ets/default/ScreenLockManager.ts create mode 100644 common/src/main/ets/default/SettingsUtil.ts create mode 100644 common/src/main/ets/default/SingleInstanceHelper.ts create mode 100644 common/src/main/ets/default/StyleConfiguration.ts rename common/src/main/ets/default/{abilitymanager/bundleManager.ets => StyleManager.ts} (42%) rename common/src/main/ets/default/{SwitchUserManager.ets => SwitchUserManager.ts} (47%) create mode 100644 common/src/main/ets/default/TimeManager.ts create mode 100644 common/src/main/ets/default/TintStateManager.ts delete mode 100644 common/src/main/ets/default/WindowManager.ets create mode 100644 common/src/main/ets/default/WindowManager.ts create mode 100644 common/src/main/ets/default/abilitymanager/abilityManager.ts create mode 100644 common/src/main/ets/default/abilitymanager/bundleManager.ts rename common/src/main/ets/default/abilitymanager/{featureAbilityManager.ets => featureAbilityManager.ts} (96%) rename common/src/main/ets/default/abilitymanager/{notificationManager.ets => notificationManager.ts} (95%) create mode 100644 common/src/main/ets/default/commonEvent/CommonEventManager.ts create mode 100644 common/src/main/ets/default/event/EventBus.ts create mode 100644 common/src/main/ets/default/event/EventManager.ts create mode 100644 common/src/main/ets/default/event/EventUtil.ts rename common/src/main/ets/default/heightcofigUtils/{HeightConfigUtils.ets => HeightConfigUtils.ts} (92%) delete mode 100644 common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets create mode 100644 common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts delete mode 100644 common/src/main/ets/plugindatasource/PluginDataSourceManager.ets create mode 100644 common/src/main/ets/plugindatasource/PluginDataSourceManager.ts create mode 100644 common/src/main/ets/plugindatasource/common/BundleParseUtil.ts create mode 100644 common/src/main/ets/plugindatasource/common/Constants.ts delete mode 100644 common/src/main/ets/plugindatasource/sourceloader/BaseMetaSourceLoader.ets rename common/src/main/ets/plugindatasource/sourceloader/{DataAbilitySourceLoader.ets => DataAbilitySourceLoader.ts} (49%) create mode 100644 common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts rename common/src/main/ets/plugindatasource/sourceloader/{PluginSourceLoader.ets => PluginSourceLoader.ts} (52%) create mode 100644 common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts create mode 100644 common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts delete mode 100644 common/src/main/ets/template/UniformConfig.ets create mode 100644 common/src/main/ets/template/common/StyleConfiguration.ts rename entry/{ => pc}/.gitignore (100%) mode change 100755 => 100644 rename entry/{ => pc}/build.gradle (100%) mode change 100755 => 100644 rename entry/{ => pc}/package.json (100%) mode change 100755 => 100644 create mode 100644 entry/pc/src/main/config.json create mode 100644 entry/pc/src/main/ets/AbilityStage.ts create mode 100644 entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename entry/{src/main/ets/default => pc/src/main/ets/ServiceExtAbility}/app.ets (100%) rename entry/{src/main/ets/default => pc/src/main/ets/ServiceExtAbility}/pages/index.ets (93%) create mode 100644 entry/pc/src/main/resources/base/element/string.json rename entry/{ => pc}/src/main/resources/base/media/icon.png (100%) create mode 100644 entry/phone/.gitignore rename {product/navigationBar => entry/phone}/build.gradle (82%) rename {product/navigationBar => entry/phone}/package.json (100%) create mode 100644 entry/phone/src/main/config.json create mode 100644 entry/phone/src/main/ets/AbilityStage.ts create mode 100644 entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename common/src/main/ets/default/DateAndTimeUtil.ets => entry/phone/src/main/ets/ServiceExtAbility/app.ets (67%) create mode 100644 entry/phone/src/main/ets/ServiceExtAbility/pages/index.ets create mode 100644 entry/phone/src/main/resources/base/element/string.json rename {product/navigationBar => entry/phone}/src/main/resources/base/media/icon.png (100%) rename product/{ => default}/navigationBar/.gitignore (100%) create mode 100644 product/default/navigationBar/build.gradle rename product/{notificationmanagement => default/navigationBar}/package.json (100%) rename product/{ => default}/navigationBar/src/main/config.json (75%) create mode 100644 product/default/navigationBar/src/main/ets/AbilityStage.ts create mode 100644 product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename product/{statusbar/src/main/ets/default => default/navigationBar/src/main/ets/ServiceExtAbility}/app.ets (52%) rename product/{navigationBar/src/main/ets/default/common/NavBarConfiguration.ets => default/navigationBar/src/main/ets/ServiceExtAbility/common/NavBarConfiguration.ts} (88%) create mode 100644 product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts create mode 100644 product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleManager.ts rename product/{navigationBar/src/main/ets/default/common/constants.ets => default/navigationBar/src/main/ets/ServiceExtAbility/common/constants.ts} (81%) rename product/{navigationBar/src/main/ets/default/common/utils/configReader.ets => default/navigationBar/src/main/ets/ServiceExtAbility/common/utils/configReader.ts} (89%) rename product/{navigationBar/src/main/ets/default => default/navigationBar/src/main/ets/ServiceExtAbility}/i18n/en-US.json (100%) rename product/{navigationBar/src/main/ets/default => default/navigationBar/src/main/ets/ServiceExtAbility}/i18n/zh-CN.json (100%) rename product/{navigationBar/src/main/ets/default => default/navigationBar/src/main/ets/ServiceExtAbility}/pages/index.ets (50%) rename product/{navigationBar/src/main/ets/default => default/navigationBar/src/main/ets/ServiceExtAbility}/pages/keyButton.ets (61%) rename product/{navigationBar/src/main/ets/default => default/navigationBar/src/main/ets/ServiceExtAbility}/pages/oneLayout.ets (83%) rename product/{navigationBar/src/main/ets/default => default/navigationBar/src/main/ets/ServiceExtAbility}/pages/threeLayout.ets (76%) create mode 100644 product/default/navigationBar/src/main/ets/ServiceExtAbility/viewmodel/NavigationBarViewModel.ts rename product/{ => default}/navigationBar/src/main/resources/base/element/color.json (70%) create mode 100644 product/default/navigationBar/src/main/resources/base/element/float.json rename product/{ => default}/navigationBar/src/main/resources/base/element/string.json (89%) create mode 100644 product/default/navigationBar/src/main/resources/base/media/ic_systemui_back.svg create mode 100644 product/default/navigationBar/src/main/resources/base/media/ic_systemui_home.svg create mode 100644 product/default/navigationBar/src/main/resources/base/media/ic_systemui_recent.svg rename product/{notificationmanagement => default/navigationBar}/src/main/resources/base/media/icon.png (100%) rename product/{ => default}/navigationBar/src/main/resources/en_US/element/string.json (89%) rename product/{ => default}/navigationBar/src/main/resources/rawfile/navigationBarLayoutConfig.json (100%) rename product/{ => default}/navigationBar/src/main/resources/zh_CN/element/string.json (89%) rename product/{ => default}/notificationmanagement/.gitignore (100%) rename product/{ => default}/notificationmanagement/build.gradle (73%) rename product/{statusbar => default/notificationmanagement}/package.json (100%) rename product/{ => default}/notificationmanagement/src/main/config.json (80%) create mode 100644 product/default/notificationmanagement/src/main/ets/AbilityStage.ts create mode 100644 product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts rename product/{notificationmanagement/src/main/ets/default => default/notificationmanagement/src/main/ets/MainAbility}/app.ets (100%) rename product/{notificationmanagement/src/main/ets/default/common/constants.ets => default/notificationmanagement/src/main/ets/MainAbility/common/constants.ts} (89%) create mode 100644 product/default/notificationmanagement/src/main/ets/MainAbility/pages/batchSetEnable.ets create mode 100644 product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturb.ets create mode 100644 product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturbPre.ets create mode 100644 product/default/notificationmanagement/src/main/ets/MainAbility/pages/notificationManagenment.ets create mode 100644 product/default/notificationmanagement/src/main/ets/MainAbility/pages/setEnable.ets create mode 100644 product/default/notificationmanagement/src/main/ets/MainAbility/pages/slotSetting.ets create mode 100644 product/default/notificationmanagement/src/main/ets/MainAbility/vm/noDisturbViewModel.ts create mode 100644 product/default/notificationmanagement/src/main/ets/MainAbility/vm/notificationManagenmentViewModel.ts create mode 100644 product/default/notificationmanagement/src/main/resources/base/element/string.json rename product/{ => default}/notificationmanagement/src/main/resources/base/media/ic_back.svg (100%) rename product/{ => default}/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg (100%) rename product/{statusbar => default/notificationmanagement}/src/main/resources/base/media/icon.png (100%) create mode 100644 product/default/notificationmanagement/src/main/resources/en_US/element/string.json create mode 100644 product/default/notificationmanagement/src/main/resources/zh_CN/element/string.json create mode 100644 product/default/volumepanel/.gitignore create mode 100644 product/default/volumepanel/build.gradle create mode 100644 product/default/volumepanel/package.json create mode 100644 product/default/volumepanel/src/main/config.json create mode 100644 product/default/volumepanel/src/main/ets/AbilityStage.ts create mode 100644 product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts create mode 100644 product/default/volumepanel/src/main/ets/ServiceExtAbility/app.ets create mode 100644 product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts create mode 100644 product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleManager.ts create mode 100644 product/default/volumepanel/src/main/ets/ServiceExtAbility/common/constants.ts create mode 100644 product/default/volumepanel/src/main/ets/ServiceExtAbility/pages/index.ets rename product/{notificationmanagement/src/main/resources/zh_CN => default/volumepanel/src/main/resources/base}/element/string.json (80%) create mode 100644 product/default/volumepanel/src/main/resources/base/media/icon.png rename product/{notificationmanagement => default/volumepanel}/src/main/resources/en_US/element/string.json (80%) rename product/{notificationmanagement/src/main/resources/base => default/volumepanel/src/main/resources/zh_CN}/element/string.json (79%) delete mode 100644 product/navigationBar/src/main/resources/base/element/float.json delete mode 100644 product/navigationBar/src/main/resources/base/media/ic_navigation_back.png delete mode 100644 product/navigationBar/src/main/resources/base/media/ic_navigation_home.png delete mode 100644 product/navigationBar/src/main/resources/base/media/ic_navigation_recent.png delete mode 100644 product/notificationmanagement/src/main/ets/default/pages/batchSetEnable.ets delete mode 100644 product/notificationmanagement/src/main/ets/default/pages/noDisturb.ets delete mode 100644 product/notificationmanagement/src/main/ets/default/pages/notificationManagenment.ets delete mode 100644 product/notificationmanagement/src/main/ets/default/pages/setEnable.ets delete mode 100644 product/notificationmanagement/src/main/ets/default/vm/noDisturbViewModel.ets delete mode 100644 product/notificationmanagement/src/main/resources/base/element/color.json delete mode 100644 product/notificationmanagement/src/main/resources/base/element/float.json rename product/{statusbar => pc/controlpanel}/.gitignore (100%) create mode 100644 product/pc/controlpanel/build.gradle create mode 100644 product/pc/controlpanel/package.json create mode 100644 product/pc/controlpanel/src/main/config.json create mode 100644 product/pc/controlpanel/src/main/ets/AbilityStage.ts create mode 100644 product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts create mode 100644 product/pc/controlpanel/src/main/ets/ServiceExtAbility/app.ets rename common/src/main/ets/plugindatasource/common/Constants.ets => product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts (39%) create mode 100644 product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts create mode 100644 product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts create mode 100644 product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts rename common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ets => product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/control.ets (37%) create mode 100644 product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/index.ets rename product/{statusbar/src/main/ets/default => pc/controlpanel/src/main/ets/ServiceExtAbility}/workers/PluginDataSourceWorker.js (59%) create mode 100644 product/pc/controlpanel/src/main/resources/base/element/color.json create mode 100644 product/pc/controlpanel/src/main/resources/base/element/float.json rename {entry => product/pc/controlpanel}/src/main/resources/base/element/string.json (100%) create mode 100644 product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_oh.png create mode 100644 product/pc/controlpanel/src/main/resources/base/media/icon.png create mode 100644 product/pc/controlpanel/src/main/resources/en_US/element/string.json create mode 100644 product/pc/controlpanel/src/main/resources/zh_CN/element/string.json create mode 100644 product/pc/notificationpanel/.gitignore create mode 100644 product/pc/notificationpanel/build.gradle create mode 100644 product/pc/notificationpanel/package.json create mode 100644 product/pc/notificationpanel/src/main/config.json create mode 100644 product/pc/notificationpanel/src/main/ets/AbilityStage.ts create mode 100644 product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts create mode 100644 product/pc/notificationpanel/src/main/ets/ServiceExtAbility/app.ets create mode 100644 product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets create mode 100644 product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts create mode 100644 product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts create mode 100644 product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts create mode 100644 product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/index.ets create mode 100644 product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/notification.ets rename product/{statusbar => pc/notificationpanel}/src/main/resources/base/element/color.json (37%) rename product/{statusbar => pc/notificationpanel}/src/main/resources/base/element/float.json (45%) rename product/{statusbar/src/main/resources/zh_CN => pc/notificationpanel/src/main/resources/base}/element/string.json (73%) rename product/{statusbar => pc/notificationpanel}/src/main/resources/base/media/delete_all.png (100%) create mode 100644 product/pc/notificationpanel/src/main/resources/base/media/ic_message_filled.png create mode 100644 product/pc/notificationpanel/src/main/resources/base/media/ic_public_delete.svg create mode 100644 product/pc/notificationpanel/src/main/resources/base/media/ic_public_settings.svg rename product/{statusbar => pc/notificationpanel}/src/main/resources/base/media/ic_settings.png (100%) create mode 100644 product/pc/notificationpanel/src/main/resources/base/media/icon.png rename product/{statusbar => pc/notificationpanel}/src/main/resources/en_US/element/string.json (73%) rename product/{statusbar/src/main/resources/base => pc/notificationpanel/src/main/resources/zh_CN}/element/string.json (73%) create mode 100644 product/pc/statusbar/.gitignore rename product/{ => pc}/statusbar/build.gradle (93%) create mode 100644 product/pc/statusbar/package.json create mode 100644 product/pc/statusbar/src/main/config.json create mode 100644 product/pc/statusbar/src/main/ets/AbilityStage.ts create mode 100644 product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts create mode 100644 product/pc/statusbar/src/main/ets/ServiceExtAbility/app.ets create mode 100644 product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts create mode 100644 product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts create mode 100644 product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts create mode 100644 product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/constants.ts create mode 100644 product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets create mode 100644 product/pc/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js create mode 100644 product/pc/statusbar/src/main/resources/base/element/color.json create mode 100644 product/pc/statusbar/src/main/resources/base/element/string.json create mode 100644 product/pc/statusbar/src/main/resources/base/media/icon.png create mode 100644 product/pc/statusbar/src/main/resources/en_US/element/string.json create mode 100644 product/pc/statusbar/src/main/resources/zh_CN/element/string.json create mode 100644 product/phone/dropdownpanel/.gitignore create mode 100644 product/phone/dropdownpanel/build.gradle create mode 100644 product/phone/dropdownpanel/package.json rename {entry => product/phone/dropdownpanel}/src/main/config.json (55%) mode change 100755 => 100644 create mode 100644 product/phone/dropdownpanel/src/main/ets/AbilityStage.ts create mode 100644 product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ets => product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/app.ets (58%) create mode 100644 product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets create mode 100644 product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts create mode 100644 product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts create mode 100644 product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts rename product/{statusbar/src/main/ets/default/pages/common/constants.ets => phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts} (72%) rename product/{statusbar/src/main/ets/default/pages/common/navigationEvent.ets => phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/navigationEvent.ts} (94%) rename product/{statusbar/src/main/ets/default => phone/dropdownpanel/src/main/ets/ServiceExtAbility}/pages/control.ets (45%) create mode 100644 product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/index.ets create mode 100644 product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/notification.ets create mode 100644 product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js create mode 100644 product/phone/dropdownpanel/src/main/resources/base/element/color.json create mode 100644 product/phone/dropdownpanel/src/main/resources/base/element/float.json create mode 100644 product/phone/dropdownpanel/src/main/resources/base/element/string.json create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/delete_all.png create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/icon.png create mode 100644 product/phone/dropdownpanel/src/main/resources/en_US/element/string.json create mode 100644 product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json create mode 100644 product/phone/statusbar/.gitignore create mode 100644 product/phone/statusbar/build.gradle create mode 100644 product/phone/statusbar/package.json rename product/{ => phone}/statusbar/src/main/config.json (76%) create mode 100644 product/phone/statusbar/src/main/ets/AbilityStage.ts create mode 100644 product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename product/{navigationBar/src/main/ets/default => phone/statusbar/src/main/ets/ServiceExtAbility}/app.ets (37%) create mode 100644 product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts create mode 100644 product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts create mode 100644 product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts create mode 100644 product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/constants.ts rename product/{statusbar/src/main/ets/default => phone/statusbar/src/main/ets/ServiceExtAbility}/pages/index.ets (36%) create mode 100644 product/phone/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js create mode 100644 product/phone/statusbar/src/main/resources/base/element/color.json create mode 100644 product/phone/statusbar/src/main/resources/base/element/string.json create mode 100644 product/phone/statusbar/src/main/resources/base/media/icon.png create mode 100644 product/phone/statusbar/src/main/resources/en_US/element/string.json create mode 100644 product/phone/statusbar/src/main/resources/zh_CN/element/string.json delete mode 100644 product/statusbar/src/main/ets/default/pages/notification.ets delete mode 100644 product/statusbar/src/main/resources/base/media/airplane.svg delete mode 100644 product/statusbar/src/main/resources/base/media/airplane_d.svg delete mode 100644 product/statusbar/src/main/resources/base/media/wifi.svg delete mode 100644 product/statusbar/src/main/resources/base/media/wifi_d.svg delete mode 100644 product/statusbar/src/main/resources/rawfile/controlcentercomponentConfig.json delete mode 100644 product/statusbar/src/main/resources/rawfile/statusbarcomponentConfig.json diff --git a/common/src/main/ets/default/CheckEmptyUtils.ets b/common/src/main/ets/default/CheckEmptyUtils.ts similarity index 96% rename from common/src/main/ets/default/CheckEmptyUtils.ets rename to common/src/main/ets/default/CheckEmptyUtils.ts index fb5f3ff5..5061c49c 100644 --- a/common/src/main/ets/default/CheckEmptyUtils.ets +++ b/common/src/main/ets/default/CheckEmptyUtils.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ets b/common/src/main/ets/default/Constants.ts similarity index 43% rename from common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ets rename to common/src/main/ets/default/Constants.ts index 6405beaf..df5fbd9b 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ets +++ b/common/src/main/ets/default/Constants.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,31 +12,36 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import Log from '../../default/Log.ets'; -import {ItemComponentData} from '../common/Constants.ets'; - -const TAG = "SourceLoader"; - -export default abstract class SourceLoader { - mChannel: any; - - constructor(channel) { - Log.showInfo(TAG, `constructor, channel: ${channel}`) - this.mChannel = channel; - } - - abstract stopLoad(): void; - - abstract loadData(userId): void; - - addItem(itemData: ItemComponentData) { - Log.showInfo(TAG, `addItem, itemData: ${JSON.stringify(itemData)}`) - this.mChannel.add(itemData); - } - - removeItem(itemData:ItemComponentData) { - Log.showInfo(TAG, `remove, itemData: ${JSON.stringify(itemData)}`) - this.mChannel.remove(itemData); - } -} \ No newline at end of file +export const WindowNameMap = { + 2112: 'navigation', + 2108: 'status', + 2111: 'volume' +}; + +export interface Rect { + left: number; + top: number; + width: number; + height: number; +}; + +export type WindowType = 'status' | 'navigation' | 'volume'; + +export default class Constants { + static URI_VAR: string = 'dataability:///com.ohos.settingsdata.DataAbility'; +} + +export enum FASlotName { + AUTO_ROTATE = "auto_rotate", + AIR_PLANE = "air_plane", + BATTERY = 'battery', + BLUETOOTH = 'bluetooth', + CAPSULE = 'capsule', + CLOCK = 'clock', + EMPTY = 'empty', + LOCATION = 'location', + NOTIFICATION = 'notification', + RING_MODE = 'ring_mode', + SIGNAL = 'signal', + WIFI = 'wifi', +} diff --git a/common/src/main/ets/default/Decorators.ts b/common/src/main/ets/default/Decorators.ts new file mode 100644 index 00000000..85cf5c58 --- /dev/null +++ b/common/src/main/ets/default/Decorators.ts @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 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 Log from "./Log"; + +const TAG = "Decorators"; + +export function debounce(timeout: number) { + return function inner(target: any, propKey: string, descriptor: PropertyDescriptor) { + let curFunc: number = 0; + const original = descriptor.value; + descriptor.value = function (...args: string[]) { + Log.showInfo(TAG, `debounce invoke ${propKey} curFunc: ${curFunc}`); + curFunc && clearTimeout(curFunc); + curFunc = setTimeout(() => original.call(this, ...args), timeout); + }; + }; +} + +export function throttle(waitTime: number) { + return function inner(target: any, propKey: string, descriptor: PropertyDescriptor) { + let lastTime: number = 0; + const original = descriptor.value; + descriptor.value = function (...args: string[]) { + let curTime = Date.now(); + Log.showInfo(TAG, `throttle invoke ${propKey} timeInterval: ${curTime - lastTime}`); + if (curTime - lastTime >= waitTime) { + original.call(this, ...args); + lastTime = curTime; + } + }; + }; +} diff --git a/common/src/main/ets/default/InitSystemUi.ts b/common/src/main/ets/default/InitSystemUi.ts new file mode 100644 index 00000000..bf023152 --- /dev/null +++ b/common/src/main/ets/default/InitSystemUi.ts @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 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 EventManager from "./event/EventManager"; +import Log from "./Log"; +import ScreenLockManager from "./ScreenLockManager"; +import ServiceExtensionContext from "application/ServiceExtensionContext"; +import TimeManager from "./TimeManager"; + +const TAG = "initSystemui"; + +export default function initSystemUi(context: ServiceExtensionContext) { + EventManager.setContext(context); + ScreenLockManager.init(); + TimeManager.init(context); + Log.showDebug(TAG, `init done, ctx: ${context}`); +} diff --git a/common/src/main/ets/default/Log.ets b/common/src/main/ets/default/Log.ts similarity index 62% rename from common/src/main/ets/default/Log.ets rename to common/src/main/ets/default/Log.ts index e41d7395..0a5170ae 100644 --- a/common/src/main/ets/default/Log.ets +++ b/common/src/main/ets/default/Log.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,20 +13,35 @@ * limitations under the License. */ -const TAG = 'SystemUI_Default'; +const TAG = "SystemUI_Default"; +const FILTER_KEYS = [ + new RegExp('hide', "gi") +] + +export function filterKey(target: any, propKey: string, descriptor: PropertyDescriptor) { + const original = descriptor.value; + descriptor.value = function (...args: string[]) { + let filterResult = args.map((str) => { + let tempStr = str + FILTER_KEYS.forEach((filterKey) => tempStr = tempStr.replace(filterKey, "**")) + return tempStr + }); + const result = original.call(this, ...filterResult); + return result; + }; +} /** * Basic log class */ export default class Log { - /** * print info level log * * @param {string} tag - Page or class tag * @param {string} log - Log needs to be printed */ - static showInfo(tag, log) { + static showInfo(tag: string, log: string) { console.info(`${TAG} tag: ${tag} --> ${log}`); } @@ -36,7 +51,7 @@ export default class Log { * @param {string} tag - Page or class tag * @param {string} log - Log needs to be printed */ - static showDebug(tag, log) { + static showDebug(tag: string, log: string) { console.debug(`${TAG} tag: ${tag} --> ${log}`); } @@ -46,7 +61,7 @@ export default class Log { * @param {string} tag - Page or class tag * @param {string} log - Log needs to be printed */ - static showError(tag, log) { + static showError(tag: string, log: string) { console.error(`${TAG} tag: ${tag} --> ${log}`); } } diff --git a/common/src/main/ets/default/MultimodalInputManager.ts b/common/src/main/ets/default/MultimodalInputManager.ts new file mode 100644 index 00000000..85d80349 --- /dev/null +++ b/common/src/main/ets/default/MultimodalInputManager.ts @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2022 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 inputConsumer from "@ohos.multimodalInput.inputConsumer"; +import Log from "./Log"; +import createOrGet from "./SingleInstanceHelper"; + +export type MultiCallback = (keyOptions: typeof inputConsumer.KeyOptions) => void; +export enum MultiKeyCode { + WIN = 2076, + N = 2030, + I = 2025, +} + +const TAG = "MultimodalInputManager"; + +class MultimodalInputManager { + //win + N + notificationKeyOptions: any = { + preKeys: [2076], + finalKey: 2030, + isFinalKeyDown: true, + finalKeyDownDuration: 0, + }; + //win + I + controlKeyOptions: any = { + preKeys: [2076], + finalKey: 2025, + isFinalKeyDown: true, + finalKeyDownDuration: 0, + }; + + subscribeCombinationKey(keys: MultiKeyCode[], cb: MultiCallback): () => void { + if (keys.length <= 1) { + Log.showError(TAG, `Invalid keys, can't subscribe.`); + return () => {}; + } + let keyOptions = { + preKeys: keys.slice(0, keys.length - 1), + finalKey: keys[keys.length - 1], + isFinalKeyDown: true, + finalKeyDownDuration: 0, + }; + inputConsumer.on("key", keyOptions, (err, options) => { + Log.showInfo(TAG, `on CombinationKey, options:${JSON.stringify(options)}, err: ${JSON.stringify(err)}`); + cb(options); + }); + Log.showInfo(TAG, `subscribe CombinationKey, keys:${JSON.stringify(keys)}`); + return () => { + inputConsumer.off("key", keyOptions, (err, data) => {}); + }; + } + + registerControlListener(callback) { + Log.showInfo(TAG, `registerListener control`); + inputConsumer.on("key", this.controlKeyOptions, (err, data) => { + Log.showInfo(TAG, `controlRegisterCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + callback.onControlShowOrHide(err, data); + }); + Log.showInfo(TAG, `registerListener end`); + } + + registerNotificationListener(callback) { + Log.showInfo(TAG, `registerListener notification`); + inputConsumer.on("key", this.notificationKeyOptions, (err, data) => { + Log.showInfo(TAG, `notificationRegisterCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + callback.onNotificationShowOrHide(err, data); + }); + Log.showInfo(TAG, `registerListener end`); + } + + unregisterListener() { + Log.showInfo(TAG, `unregisterListener start`); + inputConsumer.off("key", this.notificationKeyOptions, (err, data) => { + Log.showInfo(TAG, `notificationUnregisterCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + }); + inputConsumer.off("key", this.controlKeyOptions, (err, data) => { + Log.showInfo(TAG, `controlUnregisterCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + }); + Log.showInfo(TAG, `unregisterListener end`); + } +} +let sMultimodalInputManager = createOrGet(MultimodalInputManager, TAG); + +export default sMultimodalInputManager as MultimodalInputManager; diff --git a/common/src/main/ets/default/ReadConfigUtil.ets b/common/src/main/ets/default/ReadConfigUtil.ts similarity index 95% rename from common/src/main/ets/default/ReadConfigUtil.ets rename to common/src/main/ets/default/ReadConfigUtil.ts index 587704de..c7eb8b90 100644 --- a/common/src/main/ets/default/ReadConfigUtil.ets +++ b/common/src/main/ets/default/ReadConfigUtil.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from './Log.ets'; +import Log from './Log'; import FileIo from '@ohos.fileio'; const DFAULT_SIZE = 4096; diff --git a/common/src/main/ets/default/ResourceUtil.ets b/common/src/main/ets/default/ResourceUtil.ts similarity index 86% rename from common/src/main/ets/default/ResourceUtil.ets rename to common/src/main/ets/default/ResourceUtil.ts index 7d741e81..b01b922a 100644 --- a/common/src/main/ets/default/ResourceUtil.ets +++ b/common/src/main/ets/default/ResourceUtil.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ResMgr from '@ohos.resourceManager'; +import AbilityManager from './abilitymanager/abilityManager' /** * Resource util @@ -25,7 +25,8 @@ export class ResourceUtil { */ async initResourceManager(): Promise { if (!this.resMgr) { - this.resMgr = await ResMgr.getResourceManager('com.ohos.systemui'); + let context = AbilityManager.getContext(); + this.resMgr = await context.resourceManager; } return this.resMgr; } diff --git a/common/src/main/ets/default/ScreenLockManager.ts b/common/src/main/ets/default/ScreenLockManager.ts new file mode 100644 index 00000000..d38431d5 --- /dev/null +++ b/common/src/main/ets/default/ScreenLockManager.ts @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2022 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 commonEvent from "@ohos.commonEvent"; +import { CommonEventSubscriber } from "commonEvent/commonEventSubscriber"; +import createOrGet from "./SingleInstanceHelper"; +import EventManager from "./event/EventManager"; +import Log from "./Log"; +import { obtainLocalEvent } from "./event/EventUtil"; +import { debounce } from "./Decorators"; +export const SCREEN_CHANGE_EVENT = "screenChangeEvent"; + +const TAG = "ScreenLockManager"; +const SCREEN_COMMON_EVENT_INFO = { + events: [commonEvent.Support.COMMON_EVENT_SCREEN_OFF, commonEvent.Support.COMMON_EVENT_SCREEN_ON], +}; +const debounceTimeout = 500; + +class ScreenLockManager { + mSubscriber: CommonEventSubscriber | undefined; + + async init() { + this.mSubscriber = await commonEvent.createSubscriber(SCREEN_COMMON_EVENT_INFO); + commonEvent.subscribe(this.mSubscriber, (err, data) => { + if (err.code != 0) { + Log.showError(TAG, `Can't handle screen change, err: ${JSON.stringify(err)}`); + return; + } + Log.showDebug(TAG, `screenChange, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + switch (data.event) { + case commonEvent.Support.COMMON_EVENT_SCREEN_OFF: + this.notifyScreenEvent(false); + break; + case commonEvent.Support.COMMON_EVENT_SCREEN_ON: + this.notifyScreenEvent(true); + break; + default: + Log.showError(TAG, `unknow event`); + } + }); + } + + @debounce(debounceTimeout) + notifyScreenEvent(isScreenOn: boolean) { + EventManager.publish(obtainLocalEvent(SCREEN_CHANGE_EVENT, isScreenOn)); + Log.showDebug(TAG, `publish ${SCREEN_CHANGE_EVENT} screenState: ${isScreenOn}`); + } +} + +let sScreenLockManager = createOrGet(ScreenLockManager, TAG); +export default sScreenLockManager as ScreenLockManager; \ No newline at end of file diff --git a/common/src/main/ets/default/SettingsUtil.ts b/common/src/main/ets/default/SettingsUtil.ts new file mode 100644 index 00000000..6c025e59 --- /dev/null +++ b/common/src/main/ets/default/SettingsUtil.ts @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2021-2022 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 settings from "@ohos.settings"; +import {DataAbilityHelper} from "ability/dataAbilityHelper"; +import featureAbility from "@ohos.ability.featureAbility"; +import Log from "./Log"; +import Constants from "./Constants"; +import createOrGet from "./SingleInstanceHelper"; +import AbilityManager from "./abilitymanager/abilityManager"; + +const TAG = "SettingsUtil"; + +export class SettingsUtil { + helper: DataAbilityHelper; + + constructor() { + Log.showInfo(TAG, `constructor`); + try { + this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), Constants.URI_VAR); + } catch (e) { + Log.showInfo(TAG, `constructor, acquire helper error: ${e.toString()}`); + } + } + + getValue(name: string, defValue?: string): string { + Log.showInfo(TAG, `getValue, name: ${name} defValue: ${defValue}`); + let value: string = null; + try { + value = settings.getValueSync(this.helper, name, defValue ? defValue : ""); + } catch (e) { + Log.showInfo(TAG, `getValue e: ${e.toString()}`); + } + Log.showInfo(TAG, `getValue, value: ${value}`); + return value; + } + + setValue(name: string, value: string): boolean { + Log.showInfo(TAG, `setValue, name: ${name} value: ${value}`); + let result = false; + try { + result = settings.setValueSync(this.helper, name, value); + } catch (e) { + Log.showInfo(TAG, `setValue e: ${e.toString()}`); + } + Log.showInfo(TAG, `setValue, result: ${result}`); + return result; + } +} + +let sSettingsUtil = createOrGet(SettingsUtil, TAG); + +export default sSettingsUtil as SettingsUtil; \ No newline at end of file diff --git a/common/src/main/ets/default/SingleInstanceHelper.ts b/common/src/main/ets/default/SingleInstanceHelper.ts new file mode 100644 index 00000000..b4ffcae7 --- /dev/null +++ b/common/src/main/ets/default/SingleInstanceHelper.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2021-2022 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 Log from './Log'; +import audio from '@ohos.multimedia.audio'; + +const TAG = "SingleInstanceHelper"; +const AUDIO_MANAGER_KEY = 'MultiMediaAudioManager'; + +export default function createOrGet(objectClass: { new(): T }, storageKey: string): T { + if (!globalThis[storageKey]) { + globalThis[storageKey] = new objectClass(); + Log.showInfo(TAG, `Create key of ${storageKey}`); + } + return globalThis[storageKey]; +} + +export function getAudioManager() { + if (!globalThis[AUDIO_MANAGER_KEY]) { + globalThis[AUDIO_MANAGER_KEY] = audio.getAudioManager(); + Log.showInfo(TAG, `Create Audio Manager.`); + } + return globalThis[AUDIO_MANAGER_KEY]; +} diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts new file mode 100644 index 00000000..1d8f3e26 --- /dev/null +++ b/common/src/main/ets/default/StyleConfiguration.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from './StyleManager'; + +const TAG = 'Common-StyleConfiguration'; + +export default class StyleConfiguration { + static getCommonStyle() { + const key: string = TAG + "-Common"; + return StyleManager.getStyle(key, () => { + return { + statusBarFontSize: '16fp', + statusBarIconWidth: '24vp', + statusBarIconHeight: '24vp', + statusBarMarginLeftRight: '5vp', + }; + }); + } +} \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ets b/common/src/main/ets/default/StyleManager.ts similarity index 42% rename from common/src/main/ets/default/abilitymanager/bundleManager.ets rename to common/src/main/ets/default/StyleManager.ts index ddb020b6..d9e49622 100644 --- a/common/src/main/ets/default/abilitymanager/bundleManager.ets +++ b/common/src/main/ets/default/StyleManager.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,26 +13,29 @@ * limitations under the License. */ -import BundleMgr from '@ohos.bundle'; -import Resmgr from '@ohos.resourceManager'; -import Log from '../Log.ets'; +import Log from './Log'; -const TAG = 'BRManager'; +const TAG = 'Common-StyleManager'; -export default class BundleManager { - static async getResourceManager(tag, bundleName, then?: Function) { - Log.showInfo(TAG, `getResourceManager from: ${tag}`); - if (!then) { - return await Resmgr.getResourceManager(bundleName); +export class StyleManager { + mAbilityPageName: string = ''; + + setAbilityPageName(name: string): void{ + Log.showInfo(TAG, `setAbilityPageName, name: ${name}`); + this.mAbilityPageName = name; } - Resmgr.getResourceManager(bundleName).then(then); - } - static async getBundleInfo(tag, bundleName, getInfo, then?: Function) { - Log.showInfo(TAG, `getBundleInfo from: ${tag}`); - if (!then) { - return await BundleMgr.getBundleInfo(bundleName, getInfo); + getStyle(key: string, generateDefaultFunction: Function) { + let newKey = this.mAbilityPageName + '-' + key; + if (!AppStorage.Has(newKey)) { + let defaultStyle = generateDefaultFunction(); + AppStorage.SetOrCreate(newKey, defaultStyle); + Log.showInfo(TAG, `Create storageKey of ${newKey}`); + } + return AppStorage.Get(newKey); } - BundleMgr.getBundleInfo(bundleName, getInfo).then(then); - } -} \ No newline at end of file +} + +let styleManager = new StyleManager(); + +export default styleManager as StyleManager; \ No newline at end of file diff --git a/common/src/main/ets/default/SwitchUserManager.ets b/common/src/main/ets/default/SwitchUserManager.ts similarity index 47% rename from common/src/main/ets/default/SwitchUserManager.ets rename to common/src/main/ets/default/SwitchUserManager.ts index d78cb2f1..b352e6c9 100644 --- a/common/src/main/ets/default/SwitchUserManager.ets +++ b/common/src/main/ets/default/SwitchUserManager.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,29 +13,33 @@ * limitations under the License. */ +import AccountManager from "@ohos.account.osAccount"; +import Log from "./Log"; +import getSingleInstance from "./SingleInstanceHelper"; -import AccountManager from '@ohos.account.osAccount'; -import Log from './Log.ets'; +const TAG = "SwitchUserManager"; +const SUBSCRIBE_KEY = "SystemUiAccount"; +const USER_CHANGE_EVENT = "activate"; +const DELAY_TIME = 3 * 1000; +export const INVALID_USER_ID = -1; -const STORAGE_KEY = 'SwitchUserManager_AppStorage' -const TAG = 'SwitchUserManager' -const SUBSCRIBE_KEY = 'SystemUiAccount' -const USER_CHANGE_EVENT = 'activate' -const INVALID_USER_ID = -1; - -interface UserChangeListener { - userChange: Function -} +type AccountInfo = { + localId: number; + localName: string; + photo: string; +}; +export type UserChangeListener = { + userChange: (data: UserInfo) => void; +}; export class UserInfo { userId: number = INVALID_USER_ID; - userName: string = ''; - userIcon: string | Resource = ''; - [key: string]: any ; + userName: string = ""; + userIcon: string | Resource = ""; + [key: string]: any; } -async function getCurrentAccountInfo() { - let currentAccountInfo = {}; +async function getCurrentAccountInfo(): Promise { let accountInfos = await AccountManager.getAccountManager().queryAllCreatedOsAccounts(); for (let accountInfo of accountInfos) { Log.showInfo(TAG, `accountInfo: ${accountInfo.localId}, isActive: ${accountInfo.isActived}`); @@ -43,27 +47,24 @@ async function getCurrentAccountInfo() { return accountInfo; } } - return new UserInfo(); + return { localId: INVALID_USER_ID, localName: "", photo: "" }; } -function parseAccountInfo(accountInfo): UserInfo { +function parseAccountInfo(accountInfo: AccountInfo): UserInfo { return { userId: accountInfo.localId, userName: accountInfo.localName, - userIcon: accountInfo.photo - } + userIcon: accountInfo.photo, + }; } export default class SwitchUserManager { mUserInfo: UserInfo = new UserInfo(); mListeners = new Set(); + mHasWait: boolean = false; static getInstance(): SwitchUserManager { - if (!AppStorage.Has(STORAGE_KEY)) { - let mamanger = new SwitchUserManager(); - AppStorage.SetOrCreate(STORAGE_KEY, mamanger); - } - return AppStorage.Get(STORAGE_KEY); + return getSingleInstance(SwitchUserManager, TAG); } constructor() { @@ -73,29 +74,38 @@ export default class SwitchUserManager { public async getCurrentUserInfo(): Promise { if (this.mUserInfo.userId == INVALID_USER_ID) { - let accountInfo = await getCurrentAccountInfo(); - this.mUserInfo = parseAccountInfo(accountInfo); + this.mUserInfo = parseAccountInfo(await getCurrentAccountInfo()); + while (!this.mHasWait && this.mUserInfo.userId == INVALID_USER_ID) { + await new Promise((resolve) => setTimeout(resolve, DELAY_TIME)); + this.mUserInfo = parseAccountInfo(await getCurrentAccountInfo()); + } + this.mHasWait = true; + this.mUserInfo = parseAccountInfo(await getCurrentAccountInfo()); } + Log.showInfo(TAG, `getCurrentUserInfo userId: ${this.mUserInfo.userId}`); return this.mUserInfo; } public registerListener(listener: UserChangeListener) { - this.mListeners.add(listener) + this.mListeners.add(listener); } public unregisterListener(listener: UserChangeListener) { - this.mListeners.delete(listener) + this.mListeners.delete(listener); } - handleUserChange(accountId) { - AccountManager.getAccountManager().queryOsAccountById(accountId).then((accountInfo) => { - Log.showInfo(TAG, `userChange, accountInfo: ${JSON.stringify(accountInfo)}`); - this.mUserInfo = parseAccountInfo(accountInfo) - this.notifyUserChange(); - }) + handleUserChange(accountId: number): void { + AccountManager.getAccountManager() + .queryOsAccountById(accountId) + .then((accountInfo) => { + Log.showInfo(TAG, `userChange, accountInfo: ${JSON.stringify(accountInfo)}`); + this.mUserInfo = parseAccountInfo(accountInfo); + this.notifyUserChange(); + }) + .catch((err) => Log.showError(TAG, `Can't query account by ${accountId}, err: ${err}`)); } notifyUserChange() { - this.mListeners.forEach((listener) => listener.userChange(this.mUserInfo)) + this.mListeners.forEach((listener) => listener.userChange(this.mUserInfo)); } -} \ No newline at end of file +} diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts new file mode 100644 index 00000000..7fbdf1f1 --- /dev/null +++ b/common/src/main/ets/default/TimeManager.ts @@ -0,0 +1,120 @@ +/** + * Copyright (c) 2021-2022 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 settings from "@ohos.settings"; +import commonEvent from "@ohos.commonEvent"; +import featureAbility from "@ohos.ability.featureAbility"; +import { DataAbilityHelper } from "ability/dataAbilityHelper"; +import Log from "./Log"; +import EventManager from "./event/EventManager"; +import createOrGet from "./SingleInstanceHelper"; +import { obtainLocalEvent } from "./event/EventUtil"; +import { CommonEventManager, getCommonEventManager, POLICY } from "./commonEvent/CommonEventManager"; + +export const TIME_CHANGE_EVENT = "Time_Change_Event"; + +export type TimeEventArgs = { + date: Date; + timeFormat: boolean; +}; + +const TAG = "TimeManager"; +const URI_VAR = "dataability:///com.ohos.settingsdata.DataAbility"; +const TIME_FORMAT_KEY = "settings.time.format"; +const TIME_SUBSCRIBE_INFO = { + events: [ + commonEvent.Support.COMMON_EVENT_TIME_CHANGED, + commonEvent.Support.COMMON_EVENT_TIMEZONE_CHANGED, + commonEvent.Support.COMMON_EVENT_TIME_TICK, + ], +}; + +function fill(value: number) { + return (value > 9 ? "" : "0") + value; +} + +export function concatTime(h: number, m: number) { + return `${fill(h)}:${fill(m)}`; +} + +class TimeManager { + private mUse24hFormat: boolean = false; + private mSettingsHelper?: DataAbilityHelper; + private mManager?: CommonEventManager; + + public init(context: any) { + this.mManager = getCommonEventManager( + TAG, + TIME_SUBSCRIBE_INFO, + () => this.notifyTimeChange(), + (isSubscribe) => isSubscribe && this.notifyTimeChange() + ); + this.mManager.subscriberCommonEvent(); + this.mManager.applyPolicy([POLICY.SCREEN_POLICY]); + this.initTimeFormat(context); + } + + public release() { + this.mManager?.release(); + this.mManager = undefined; + this.mSettingsHelper?.off("dataChange", settings.getUriSync(TIME_FORMAT_KEY)); + } + + public formatTime(date: Date) { + return concatTime(date.getHours() % (this.mUse24hFormat ? 24 : 12), date.getMinutes()); + } + + private initTimeFormat(context: any) { + Log.showInfo(TAG, "initTimeFormat"); + this.mSettingsHelper = featureAbility.acquireDataAbilityHelper(context, URI_VAR); + + const handleTimeFormatChange = () => { + if (!this.mSettingsHelper) { + Log.showError(TAG, `Can't get dataAbility helper.`); + return; + } + let timeString = settings.getValueSync(this.mSettingsHelper, TIME_FORMAT_KEY, "24"); + Log.showDebug(TAG, `timeFormat change: ${timeString}`); + this.mUse24hFormat = timeString == "24"; + this.notifyTimeChange(); + }; + + try { + this.mSettingsHelper.on("dataChange", settings.getUriSync(TIME_FORMAT_KEY), (err) => { + if (err.code !== 0) { + Log.showError(TAG, `failed to getAbilityWant, code: ${err.code}.`); + return; + } + handleTimeFormatChange(); + }); + } catch (e) { + Log.showError(TAG, `Can't listen timeformate change.`); + } + handleTimeFormatChange(); + } + + private notifyTimeChange() { + Log.showInfo(TAG, "notifyTimeChange"); + let args: TimeEventArgs = { + date: new Date(), + timeFormat: this.mUse24hFormat, + }; + EventManager.publish(obtainLocalEvent(TIME_CHANGE_EVENT, args)); + } +} + +let sTimeManager = createOrGet(TimeManager, TAG); + +export default sTimeManager as TimeManager; diff --git a/common/src/main/ets/default/TintStateManager.ts b/common/src/main/ets/default/TintStateManager.ts new file mode 100644 index 00000000..887f47ec --- /dev/null +++ b/common/src/main/ets/default/TintStateManager.ts @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Window from "@ohos.window"; +import display from "@ohos.display"; +import Log from "./Log"; +import {WindowType, Rect, WindowNameMap} from "./Constants"; +import getSingleInstance from "./SingleInstanceHelper"; + +const TAG = "TintStateManager"; +const LISTENER_SYSTEM_BAR_TINT_CHANGE = "systemBarTintChange"; + +export type TintStateListener = { onTintStateChange: (state: TintState) => void } +; + +export interface TintState { + isEnable?: boolean; + region?: Rect; + backgroundColor?: string; + contentColor?: string; +} + +export class TintContentInfo { + contentColor: string = "#FFFFFFFF"; +} + +export function getOrCreateTintContentInfo(key: string): TintContentInfo { + let storageKey = 'SystemUI_TintContentInfo_' + key; + if (!AppStorage.Has(storageKey)) { + AppStorage.SetOrCreate(storageKey, new TintContentInfo()); + Log.showInfo(TAG, `getOrCreateTintContentInfo, Create storageKey of ${storageKey}`); + } + return AppStorage.Get(storageKey); +} + +export default class TintStateManager { + mListeners: Map = new Map(); + mStates: Map = new Map(); + + static getInstance(): TintStateManager { + return getSingleInstance(TintStateManager, TAG); + } + + constructor() { + Log.showInfo(TAG, `init TintStateManager. ${LISTENER_SYSTEM_BAR_TINT_CHANGE}`); + Window.on(LISTENER_SYSTEM_BAR_TINT_CHANGE, this.onSystemBarTintChange.bind(this)); + } + + registerListener(windowType: WindowType, listener: TintStateListener) { + let tintState = this.mStates.get(windowType); + tintState && listener.onTintStateChange(tintState); + let res = this.mListeners.set(windowType, listener); + Log.showInfo(TAG, `registser listenerSize: ${res.size}`); + } + + unregisterListener(windowType: WindowType) { + let res = this.mListeners.delete(windowType); + Log.showInfo(TAG, `unregistser ${windowType}, res: ${res}`); + } + + async onSystemBarTintChange(data) { + Log.showInfo(TAG, `onSystemBarTintChange, data: ${JSON.stringify(data)}`); + if (!Array.isArray(data.regionTint)) { + Log.showInfo(TAG, `regionTint is not array.`); + return; + } + let dis = await display.getDefaultDisplay(); + if (dis.id != data.displayId) { + Log.showInfo(TAG, `Needn't change, displayId: ${data.displayId}`); + return; + } + data.regionTint.forEach((regionTintData) => { + Log.showInfo(TAG, `onSystemBarTintChange, type: ${WindowNameMap[regionTintData["type"]]}`); + let windowType = WindowNameMap[regionTintData["type"]]; + if (!windowType) { + return; + } + let tintState: TintState = { + isEnable: regionTintData.isEnable, + region: regionTintData.region, + backgroundColor: regionTintData.backgroundColor, + contentColor: regionTintData.contentColor, + }; + Log.showInfo(TAG, `tintState: ${JSON.stringify(tintState)}`); + this.mStates.set(windowType, tintState); + this.mListeners.get(windowType)?.onTintStateChange(tintState); + }); + } +} diff --git a/common/src/main/ets/default/WindowManager.ets b/common/src/main/ets/default/WindowManager.ets deleted file mode 100644 index 55534f3f..00000000 --- a/common/src/main/ets/default/WindowManager.ets +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Window from '@ohos.window'; -import display from '@ohos.display' -import Log from './Log.ets'; -import ResourceUtil from './ResourceUtil.ets'; - -const TAG = 'WindowManager'; - -var maxWidth; -var maxHeight; -var minHeight; - -/** - * Manage window size changes. - */ -export default class WindowManager { - async initWindowManager() { - Log.showInfo(TAG, 'initWindowManager'); - maxWidth = AppStorage.SetAndLink("maxWidth", 0); - maxHeight = AppStorage.SetAndLink("maxHeight", 0); - minHeight = AppStorage.SetAndLink("minHeight", 0); - - await display.getDefaultDisplay() - .then(dis => { - maxWidth.set(dis.width); - maxHeight.set(dis.height); - Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth.get()} maxHeight ${maxHeight.get()} minHeight ${minHeight.get()}`); - }) - } - - /** - * Set the window to the maximum size. - * - * @param {Object} callback - Callback function. - */ - setWindowMax(callback) { - Log.showInfo(TAG, 'enter setWindowMax ================='); - Window.getTopWindow() - .then((windowData) => { - Log.showInfo(TAG, 'enter setWindowMin maxWidth =================' + maxWidth.get() + " minHeight " + minHeight.get()); - windowData.resetSize(parseInt(maxWidth.get()), parseInt(maxHeight.get())) - .then((result) => { - Log.showInfo(TAG, result); - callback(result); - }); - - windowData.moveTo(0, 0) - .then((result) => { - Log.showInfo(TAG, result); - }); - }); - } - - /** - * Set the window to the minimum size. - * - * @param {Object} callback - Callback function. - */ - setWindowMin(callback) { - Log.showInfo(TAG, 'enter setWindowMin ================='); - Window.getTopWindow() - .then((windowData) => { - Log.showInfo(TAG, 'enter setWindowMin maxWidth =================' + maxWidth.get() + " minHeight " + minHeight.get()); - windowData.resetSize(parseInt(maxWidth.get()), parseInt(minHeight.get())) - .then((result) => { - Log.showInfo(TAG, result); - callback(result); - }); - }); - } - - /** - * Set the window to the minimum size. - * - * @param {Object} callback - Callback function. - */ - async initWindowMin(width, height, x, y) { - AppStorage.Set("showStatusBar", true); - Log.showInfo(TAG, 'enter initWindowMin ================='); - Log.showInfo(TAG, 'width:' + width + ' height:' + height + ' x:' + x + ' y:' + y); - let abilityWindow = await Window.getTopWindow(); - await abilityWindow.moveTo(parseInt(x), parseInt(y)); - await abilityWindow.resetSize(parseInt(width), parseInt(height)); - } -} \ No newline at end of file diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts new file mode 100644 index 00000000..9f3f23c7 --- /dev/null +++ b/common/src/main/ets/default/WindowManager.ts @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Window from "@ohos.window"; +import Log from "./Log"; +import EventManager from "./event/EventManager"; +import { obtainLocalEvent } from "./event/EventUtil"; +import { Rect } from "./Constants"; +import createOrGet from "./SingleInstanceHelper"; + +export type WindowInfo = { + visibility: boolean; + rect: Rect; +}; +export enum WindowType { + STATUS_BAR = "SystemUi_StatusBar", + NAVIGATION_BAR = "SystemUi_NavigationBar", + DROPDOWN_PANEL = "SystemUi_DropdownPanel", + NOTIFICATION_PANEL = "SystemUi_NotificationPanel", + CONTROL_PANEL = "SystemUi_ControlPanel", + VOLUME_PANEL = "SystemUi_VolumePanel", + BANNER_NOTICE = 'SystemUi_BannerNotice' +} + +export const WINDOW_SHOW_HIDE_EVENT = "WindowShowHideEvent"; +export const WINDOW_RESIZE_EVENT = "WindowResizeEvent"; + +type WindowHandle = typeof Window.Window; +const TAG = "WindowManager"; +const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: number } = { + SystemUi_StatusBar: 2108, + SystemUi_NavigationBar: 2112, + SystemUi_DropdownPanel: 2109, + SystemUi_NotificationPanel: 2111, + SystemUi_ControlPanel: 2111, + SystemUi_VolumePanel: 2111, + SystemUi_BannerNotice: 2111, +}; +const DEFAULT_WINDOW_INFO: WindowInfo = { + visibility: false, + rect: { left: 0, top: 0, width: 0, height: 0 }, +}; + +/** + * Manage window size changes. + */ +class WindowManager { + mWindowInfos: Map = new Map(); + + async createWindow(context: any, name: WindowType, rect: Rect, loadContent: string): Promise { + Log.showInfo(TAG, `createWindow name: ${name}, rect: ${JSON.stringify(rect)}, url: ${loadContent}`); + let winHandle = await Window.create(context, name, SYSTEM_WINDOW_TYPE_MAP[name]); + await winHandle.moveTo(rect.left, rect.top); + await winHandle.resetSize(rect.width, rect.height); + await winHandle.loadContent(loadContent); + this.mWindowInfos.set(name, { visibility: false, rect }); + Log.showInfo(TAG, `create window[${name}] success.`); + return winHandle; + } + + async resetSizeWindow(name: WindowType, rect: Rect): Promise { + let window = await Window.find(name); + await window.moveTo(rect.left, rect.top); + await window.resetSize(rect.width, rect.height); + this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), rect }); + EventManager.publish( + obtainLocalEvent(WINDOW_RESIZE_EVENT, { + windowName: name, + rect, + }) + ); + Log.showInfo(TAG, `resize window[${name}] success, rect: ${JSON.stringify(rect)}.`); + } + + async showWindow(name: WindowType): Promise { + let window = await Window.find(name); + await window.show(); + this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), visibility: true }); + EventManager.publish( + obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { + windowName: name, + isShow: true, + }) + ); + Log.showInfo(TAG, `show window[${name}] success.`); + } + + async hideWindow(name: WindowType): Promise { + let window = await Window.find(name); + await window.hide(); + this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), visibility: false }); + EventManager.publish( + obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { + windowName: name, + isShow: false, + }) + ); + Log.showInfo(TAG, `hide window[${name}] success.`); + } + + getWindowInfo(name: WindowType): WindowInfo | undefined { + return this.mWindowInfos.get(name); + } +} + +let sWindowManager = createOrGet(WindowManager, TAG); +export default sWindowManager as WindowManager; diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/common/src/main/ets/default/abilitymanager/abilityManager.ts new file mode 100644 index 00000000..0d2ee9f7 --- /dev/null +++ b/common/src/main/ets/default/abilitymanager/abilityManager.ts @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../Log'; + +const TAG = 'AbilityManager'; + +export default class AbilityManager { + static ABILITY_NAME_ENTRY = 'SystemUi_Entry'; + static ABILITY_NAME_STATUS_BAR = 'SystemUi_StatusBar'; + static ABILITY_NAME_NAVIGATION_BAR = 'SystemUi_NavigationBar'; + static ABILITY_NAME_VOLUME_PANEL = 'SystemUi_VolumePanel'; + static ABILITY_NAME_NOTIFICATION_MANAGEMENT = 'SystemUi_NotificationManagement'; + static ABILITY_NAME_DROPDOWN_PANEL = 'SystemUi_DropdownPanel'; + static ABILITY_NAME_NOTIFICATION_PANEL = 'SystemUi_NotificationPanel'; + static ABILITY_NAME_CONTROL_PANEL = 'SystemUi_ControlPanel'; + static ABILITY_NAME_BANNER_NOTICE = 'SystemUi_BannerNotice'; + + static ABILITY_NAME_OWNER_WANT = 'Owner_Want'; + + static setContext(abilityName: string, context) { + Log.showInfo(TAG, `setContext, abilityName: ${abilityName}`); + globalThis[abilityName + '_Context'] = context; + } + + static getContext(abilityName?: string) { + Log.showInfo(TAG, `getContext, abilityName: ${abilityName}`); + if (!abilityName) { + abilityName = AbilityManager.ABILITY_NAME_ENTRY; + } + return globalThis[abilityName + '_Context']; + } + + static setAbilityData(abilityName, key, data) { + Log.showInfo(TAG, `setAbilityData, abilityName: ${abilityName} key: ${key} data: ${JSON.stringify(data)}`); + globalThis[abilityName + '_data_' + key] = data; + } + + static getAbilityData(abilityName, key) { + Log.showInfo(TAG, `getAbilityData, abilityName: ${abilityName} key: ${key} `); + return globalThis[abilityName + '_data_' + key]; + } + + static startAbility(want, callback?: Function) { + Log.showInfo(TAG, `startAbility, want: ${JSON.stringify(want)}`); + let context = AbilityManager.getContext(); + context.startAbility(want).then(() => { + Log.showInfo(TAG, `startAbility, then`); + if (callback) { + callback(null); + } + }).catch((error) => { + Log.showInfo(TAG, `startAbility, error: ${JSON.stringify(error)}`); + callback(error); + }) + } +} diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ts b/common/src/main/ets/default/abilitymanager/bundleManager.ts new file mode 100644 index 00000000..b38fdc5b --- /dev/null +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ts @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021-2022 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 BundleMgr from "@ohos.bundle"; +import Context from "application/ServiceExtensionContext"; +import Log from "../Log"; +import SwitchUserManager from "../SwitchUserManager"; + +const TAG = "BRManager"; + +export default class BundleManager { + static async getResourceManager(tag: string, context: Context, bundleName: string) { + Log.showInfo(TAG, `getResourceManager from: ${tag}`); + let bundleContext = await context.createBundleContext(bundleName); + return await bundleContext.resourceManager; + } + + static async getBundleInfo(tag: string, bundleName: string, getInfo: + any, requestId?: number) { + let userInfo = { + userId: requestId ?? (await SwitchUserManager.getInstance().getCurrentUserInfo()).userId, + }; + Log.showInfo(TAG, `getBundleInfo from: ${tag}, userId: ${userInfo.userId}`); + return await BundleMgr.getBundleInfo(bundleName, getInfo, userInfo); + } +} \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ets b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts similarity index 96% rename from common/src/main/ets/default/abilitymanager/featureAbilityManager.ets rename to common/src/main/ets/default/abilitymanager/featureAbilityManager.ts index 730f8fa5..876cd06f 100644 --- a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ets +++ b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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,7 +14,7 @@ */ import FeatureAbility from '@ohos.ability.featureAbility'; -import Log from '../Log.ets'; +import Log from '../Log'; const TAG = 'FeatureAbilityManager'; diff --git a/common/src/main/ets/default/abilitymanager/notificationManager.ets b/common/src/main/ets/default/abilitymanager/notificationManager.ts similarity index 95% rename from common/src/main/ets/default/abilitymanager/notificationManager.ets rename to common/src/main/ets/default/abilitymanager/notificationManager.ts index 04895620..ad137fc6 100644 --- a/common/src/main/ets/default/abilitymanager/notificationManager.ets +++ b/common/src/main/ets/default/abilitymanager/notificationManager.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -15,7 +15,7 @@ //import { NotificationSubscriber } from './notification/notificationSubscriber'; import Notification from '@ohos.notification'; -import Log from '../Log.ets'; +import Log from '../Log'; const TAG = 'NotificationManager'; diff --git a/common/src/main/ets/default/commonEvent/CommonEventManager.ts b/common/src/main/ets/default/commonEvent/CommonEventManager.ts new file mode 100644 index 00000000..bdd974a7 --- /dev/null +++ b/common/src/main/ets/default/commonEvent/CommonEventManager.ts @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2021-2022 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 commonEvent from "@ohos.commonEvent"; +import { CommonEventData } from "commonEvent/commonEventData"; +import EventManager from "../event/EventManager"; +import Log from "../Log"; +import { SCREEN_CHANGE_EVENT } from "../ScreenLockManager"; + +export type CommonEventManager = { + subscriberCommonEvent: () => Promise; + unSubscriberCommonEvent: () => void; + applyPolicy: (policys: Array) => void; + release: () => void; +}; + +export enum POLICY { + SCREEN_POLICY = "screenOnOffPolicy", +} + +type ClearPolicy = () => void; +type InnerManager = { subscriberCommonEvent: () => void; unSubscriberCommonEvent: () => void }; +const policyMap: { [key in POLICY]: (manager: InnerManager) => ClearPolicy } = { + screenOnOffPolicy: ScreenPolicy, +}; + +export function getCommonEventManager( + tag: string, + subscribeInfos: { events: Array }, + commonEventCallback: (data: CommonEventData) => void, + subscribeStateChange?: (isSubscribe: boolean) => void +): CommonEventManager { + const TAG = `CommonEvent_${tag}`; + const SUBSCRIBE_INFOS = subscribeInfos; + let unSubcribers: Array<() => void> = []; + let policyClearCb: Map | undefined = undefined; + + async function subscriberCommonEvent() { + Log.showInfo(TAG, "registerSubscriber start"); + let subscriber = await commonEvent.createSubscriber(SUBSCRIBE_INFOS); + commonEvent.subscribe(subscriber, (err, data) => { + if (err.code != 0) { + Log.showError(TAG, `Can't handle common event, err: ${JSON.stringify(err)}`); + return; + } + Log.showInfo(TAG, `handle common event: ${data.event}`); + commonEventCallback(data); + }); + unSubcribers.push(() => commonEvent.unsubscribe(subscriber)); + subscribeStateChange && subscribeStateChange(true); + Log.showInfo(TAG, `registerSubscriber success, size: ${unSubcribers.length}`); + } + + function unSubscriberCommonEvent() { + Log.showInfo(TAG, `UnSubcribers size: ${unSubcribers.length}`); + unSubcribers.forEach((unsubscribe) => unsubscribe()); + unSubcribers.length = 0; + subscribeStateChange && subscribeStateChange(false); + } + + function applyPolicy(policys: Array) { + const innerManager = { subscriberCommonEvent, unSubscriberCommonEvent }; + policyClearCb = policyClearCb ?? new Map(); + policys.forEach((policy) => { + if (policyClearCb) { + !policyClearCb.has(policy) && policyClearCb.set(policy, policyMap[policy](innerManager)); + Log.showInfo(TAG, `apply policy: ${policy}`); + } + }); + } + + function release() { + policyClearCb?.forEach((cb) => cb()); + policyClearCb?.clear(); + unSubscriberCommonEvent(); + } + + return { subscriberCommonEvent, unSubscriberCommonEvent, applyPolicy, release }; +} + +function ScreenPolicy(manager: InnerManager): ClearPolicy { + return EventManager.subscribe(SCREEN_CHANGE_EVENT, (isScreenOn: boolean) => { + isScreenOn ? manager.subscriberCommonEvent() : manager.unSubscriberCommonEvent(); + }); +} diff --git a/common/src/main/ets/default/event/EventBus.ts b/common/src/main/ets/default/event/EventBus.ts new file mode 100644 index 00000000..9195cc25 --- /dev/null +++ b/common/src/main/ets/default/event/EventBus.ts @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2022 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 Log from "../Log"; + +export type Callback = (args: any) => void; +const TAG = "EventBus"; + +export interface EventBus { + on(event: T | T[], cb: Callback): () => void; + once(event: T, cb: Callback): () => void; + off(event: T | T[] | undefined, cb: Callback): void; + emit(event: T, args: any): void; +} + +export function createEventBus(): EventBus { + let _cbs: { [key: string]: Set } = {}; + + function on(events: T | T[], cb: Callback): () => void { + if (Array.isArray(events)) { + events.forEach((e) => on(e, cb)); + } else { + (_cbs[events] || (_cbs[events] = new Set())).add(cb); + Log.showInfo(TAG, `add event[${events}] callback, size: ${_cbs[events]?.size}`); + } + return () => off(events, cb); + } + + function once(event: T, cb: Callback): () => void { + let newCallback = (args: any) => { + cb(args); + removeSelf(); + }; + function removeSelf() { + off(event, newCallback); + } + return on(event, newCallback); + } + + function off(event: T | T[] | undefined, cb: Callback) { + if (!event) { + _cbs = {}; + Log.showInfo(TAG, `remove event[${event}] all callback`); + return; + } + if (Array.isArray(event)) { + event.forEach((e) => off(e, cb)); + return; + } + _cbs[event]?.delete(cb); + Log.showInfo(TAG, `remove event[${event}] callback, size: ${_cbs[event]?.size}`); + } + + function emit(event: T, args: any) { + _cbs[event]?.forEach((cb) => cb(args)); + } + + function stickyEmit(event: T, argument: any[]) {} + return { + on, + once, + off, + emit, + }; +} \ No newline at end of file diff --git a/common/src/main/ets/default/event/EventManager.ts b/common/src/main/ets/default/event/EventManager.ts new file mode 100644 index 00000000..c6764345 --- /dev/null +++ b/common/src/main/ets/default/event/EventManager.ts @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2022 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 ServiceExtensionContext from "application/ServiceExtensionContext"; +import Log from "../Log"; +import createOrGet from "../SingleInstanceHelper"; +import { EventParser, START_ABILITY_EVENT, Event, LocalEvent } from "./EventUtil"; +import { Callback, createEventBus, EventBus } from "./EventBus"; + +export type unsubscribe = () => void; +export type Events = string | string[]; + +const TAG = "EventManager"; + +class EventManager { + mEventBus: EventBus; + eventParser: EventParser; + mContext: ServiceExtensionContext | undefined; + + constructor() { + this.mEventBus = createEventBus(); + this.eventParser = { + local: this.publishLocalEvent, + ability: this.startAbility, + commonEvent: this.publishCommonEvent, + remote: this.publishRemoteEvent, + }; + } + + setContext(ctx: ServiceExtensionContext) { + this.mContext = ctx; + } + + publish(event: Event): boolean { + return this.eventParser[event.target].call(this, event.data); + } + + subscribe(eventType: Events, callback: Callback): unsubscribe { + return this.mEventBus.on(eventType, callback); + } + + subscribeOnce(eventType: string, callback: Callback): unsubscribe { + return this.mEventBus.once(eventType, callback); + } + + private publishLocalEvent(data: LocalEvent): boolean { + Log.showInfo(TAG, `publish localEvent type: ${data.eventName}`); + if (data.eventName) { + this.mEventBus.emit(data.eventName, data.args); + return true; + } + return false; + } + + private startAbility(data: { [key: string]: any }): boolean { + Log.showInfo(TAG, `start Ability: ${data.abilityName}`); + if (data.bundleName && data.abilityName && this.mContext) { + this.mEventBus.emit(START_ABILITY_EVENT, { abilityName: data.abilityName }); + this.mContext.startAbility({ + bundleName: data.bundleName, + abilityName: data.abilityName, + parameters: data.args??undefined + }); + return true; + } + return false; + } + + private publishRemoteEvent(data: { [key: string]: any }): boolean { + // todo publish to remote device + return false; + } + + private publishCommonEvent(data: { [key: string]: any }): boolean { + // todo publish commonEvent to other app + return false; + } +} + +let sEventManager = createOrGet(EventManager, TAG); + +export default sEventManager as EventManager; \ No newline at end of file diff --git a/common/src/main/ets/default/event/EventUtil.ts b/common/src/main/ets/default/event/EventUtil.ts new file mode 100644 index 00000000..33ba707e --- /dev/null +++ b/common/src/main/ets/default/event/EventUtil.ts @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2022 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 Log from "../Log"; + +export type EventTarget = "local" | "remote" | "ability" | "commonEvent"; +export type Event = { + target: EventTarget; + data: { [key: string]: any }; +}; +export type EventParser = { + [key in EventTarget]: (data: any) => boolean; +}; +export type LocalEvent = { + eventName: string; + args: any; +}; + +export const START_ABILITY_EVENT = "startAbilityEvent"; +export const PUBLISH_COMMON_EVENT = "publishCommonEvent"; + +const TAG = "EventUtil"; +const LOCAL_EVENT_TYPE = "local"; +const START_ABILITY_TYPE = "ability"; + +export function obtainLocalEvent(event: string, args: any): Event & { data: LocalEvent } { + return { + target: LOCAL_EVENT_TYPE, + data: { + eventName: event, + args, + }, + }; +} + +export function obtainStartAbility(bundleName: string, abilityName: string, args?: any): Event { + return { + target: START_ABILITY_TYPE, + data: { + bundleName, + abilityName, + args + }, + }; +} + +export function parseEventString(eventString: string | undefined): Event | undefined { + // string must be "local=eventName|args" or "ability=bundleName|abilityName" + if (!eventString) { + return; + } + let [eventType, eventData] = eventString.split("="); + if (eventType == LOCAL_EVENT_TYPE && eventData) { + let [localEventName, args] = eventData.split("|"); + if (localEventName) { + Log.showDebug(TAG, `parseEventData name:${localEventName}, args: ${args}`); + return obtainLocalEvent(localEventName, args); + } + } + if (eventType == START_ABILITY_TYPE && eventData) { + let [bundleName, abilityName] = eventData.split("|"); + if (bundleName && abilityName) { + Log.showDebug(TAG, `parseEventData bundleName:${bundleName}, abilityName: ${abilityName}`); + return obtainStartAbility(bundleName, abilityName); + } + } + Log.showError(TAG, `Can't parse event data: ${eventString}`); + return undefined; +} diff --git a/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets b/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts similarity index 92% rename from common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets rename to common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts index a6518c89..28bbbbe7 100644 --- a/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets +++ b/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../Log.ets'; +import Log from '../Log'; const STATUS_BAR_MIN_HEIGHT = 24 const STATUS_BAR_COEFFICIENT = 1.0 diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets deleted file mode 100644 index 7abf6e98..00000000 --- a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../default/Log.ets'; -import worker from '@ohos.worker'; -import Constants, {obtainMsg} from './common/Constants.ets'; - -const TAG = 'PluginDataSourceAdapter'; -const WORKER_JS_URL = 'workers/PluginDataSourceWorker.js'; - -export default class PluginDataSourceAdapter { - mWorker: any; - mName: any; - mListener: any; - - constructor(name: String) { - Log.showInfo(TAG, `constructor, name: ${name}`) - this.mName = name; - this.mWorker = new worker.Worker(WORKER_JS_URL, { - type: "classic", name: this.mName - }); - - this.mWorker.onmessage = this.onMessage.bind(this); - this.mWorker.onmessageerror = this.onMessageError.bind(this); - this.mWorker.onexit = this.onExit.bind(this); - this.mWorker.onerror = this.onError.bind(this); - } - - initDataSource(configs) { - Log.showInfo(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`) - this.mWorker.postMessage(obtainMsg(Constants.INIT_CONFIG, configs)); - } - - loadData(userId) { - Log.showInfo(TAG, `loadData`) - this.mWorker.postMessage(obtainMsg(Constants.LOAD_DATA, userId)); - } - - clearAll() { - Log.showInfo(TAG, `clearAll`) - this.mWorker.postMessage(obtainMsg(Constants.CLEAR_ALL, {})); - } - - onMessage(msg) { - Log.showInfo(TAG, `onMessage, msg: ${JSON.stringify(msg)}`) - let data = msg.data; - switch (data.action) { - case Constants.INIT_FINISH: - this.onInitFinish(); - break; - case Constants.ADD_ITEM: - this.onItemAdd(data.data); - break; - case Constants.REMOVE_ITEM: - this.onItemRemove(data.data); - break; - default: - Log.showError(TAG, `unknown type: ${JSON.stringify(msg)}`) - } - } - - onInitFinish() { - Log.showInfo(TAG, `onInitFinish`) - this.mListener.initFinish(); - } - - onItemAdd(itemData) { - Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`) - this.mListener.addItem(itemData); - } - - onItemRemove(itemData) { - Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`) - this.mListener.removeItem(itemData); - } - - registerListener(listener: { - 'initFinish': Function, - 'addItem': Function, - 'removeItem': Function - }) { - Log.showInfo(TAG, `registerListener`) - this.mListener = listener; - } - - unregisterListener() { - Log.showInfo(TAG, `mListener`) - this.mListener = null; - } - - onMessageError(event) { - Log.showInfo(TAG, `mWorker.onmessageerror, event: ${event}`) - }; - - onExit(code) { - Log.showInfo(TAG, `mWorker.onexit, code: ${code}`) - }; - - onError(err) { - Log.showInfo(TAG, `mWorker.onerror, err: ${JSON.stringify(err)}`) - }; -} diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts new file mode 100644 index 00000000..2928aaf1 --- /dev/null +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2021-2022 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 worker from "@ohos.worker"; +import Log from "../default/Log"; +import BundleManager from "../default/abilitymanager/bundleManager"; +import Constants, { ItemComponentData, obtainMsg, RootConfigInfo } from "./common/Constants"; +import Context from "application/ServiceExtensionContext"; + +export type pluginWorkerListener = { + initFinish: () => void; + onItemAdd: (data: ItemComponentData) => void; + onItemRemove: (data: ItemComponentData) => void; +}; + +const TAG = "PluginDataSourceAdapter"; +const WORKER_JS_URL = "workers/PluginDataSourceWorker.js"; + +export default class PluginDataSourceAdapter { + mContext: Context; + mWorker: any; + mName: string; + mListener: pluginWorkerListener; + + constructor(name: string, context: Context, listener: pluginWorkerListener) { + Log.showInfo(TAG, `constructor, name: ${name}`); + this.mName = name; + this.mContext = context; + this.mListener = listener; + this.mWorker = new worker.Worker(WORKER_JS_URL, { + type: "classic", + name: this.mName, + }); + + this.mWorker.onmessage = this.onMessage.bind(this); + this.mWorker.onmessageerror = this.onMessageError.bind(this); + this.mWorker.onexit = this.onExit.bind(this); + this.mWorker.onerror = this.onError.bind(this); + } + + initDataSource(configs: RootConfigInfo) { + Log.showInfo(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`); + this.mWorker.postMessage(obtainMsg(Constants.INIT_CONFIG, configs)); + } + + loadData(userId: number) { + Log.showInfo(TAG, `loadData`); + this.mWorker.postMessage(obtainMsg(Constants.LOAD_DATA, userId)); + } + + clearAll() { + Log.showInfo(TAG, `clearAll`); + this.mWorker.postMessage(obtainMsg(Constants.CLEAR_ALL, {})); + } + + onMessage(msg: { data: any }) { + Log.showInfo(TAG, `onMessage, msg: ${JSON.stringify(msg)}`); + let data = msg.data; + switch (data.action) { + case Constants.INIT_FINISH: + this.onInitFinish(); + break; + case Constants.ADD_ITEM: + this.onItemAdd(data.data); + break; + case Constants.REMOVE_ITEM: + this.onItemRemove(data.data); + break; + default: + Log.showError(TAG, `unknown type: ${JSON.stringify(msg)}`); + } + } + + onInitFinish() { + Log.showInfo(TAG, `onInitFinish`); + this.mListener.initFinish(); + } + + async onItemAdd(itemData: ItemComponentData) { + Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); + itemData.label && (itemData.label = decodeURIComponent(itemData.label)); + if (itemData.label && itemData.iconUrl) { + this.mListener.onItemAdd(itemData); + return; + } + let manager = await BundleManager.getResourceManager(TAG, this.mContext, itemData.bundleName); + Log.showInfo(TAG, `${itemData.id} Can't find label or icon, fetch data from ${manager}`); + if (manager) { + Promise.all([ + itemData.iconUrl ?? manager.getMediaBase64(itemData.abilityIconId), + itemData.label ?? manager.getString(itemData.abilityLabelId), + ]) + .then(([iconValue, labelValue]) => { + iconValue && (itemData.iconUrl = iconValue); + labelValue && (itemData.label = labelValue); + this.mListener.onItemAdd(itemData); + }) + .catch((err) => Log.showError(TAG, `Can't get bundle info, err: ${JSON.stringify(err)}`)); + } + } + + onItemRemove(itemData: ItemComponentData) { + Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); + this.mListener.onItemRemove(itemData); + } + + onMessageError(event: any) { + Log.showInfo(TAG, `mWorker.onmessageerror, event: ${event}`); + } + + onExit(code: any) { + Log.showInfo(TAG, `mWorker.onexit, code: ${code}`); + } + + onError(err: any) { + Log.showInfo(TAG, `mWorker.onerror, err: ${JSON.stringify(err)}`); + } +} diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ets b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ets deleted file mode 100644 index 97bb4f25..00000000 --- a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ets +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../default/Log.ets'; -import SourceLoaderFactory from './sourceloader/SourceLoaderFactory.ets'; -import SourceLoader from './sourceloader/SourceLoader.ets'; - -const TAG = "PluginDataSourceManager"; - -export default class PluginDataSourceManager { - mLoaders: Map = new Map(); - - initDataSource(configs) { - Log.showInfo(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`); - let factory = new SourceLoaderFactory({ - 'add': this.onItemAdd.bind(this), - 'remove': this.onItemRemove.bind(this) - }); - for (let pluginType in configs) { - factory.getSourceLoader(pluginType, configs[pluginType], (sourceLoader) => { - Log.showInfo(TAG, `getSourceLoader callback`); - if (sourceLoader instanceof SourceLoader) { - this.mLoaders.set(pluginType, sourceLoader); - Log.showInfo(TAG, `getSourceLoader callback, plugin: ${pluginType} ${this.mLoaders.get(pluginType)}`); - } - }) - } - } - - onItemAdd(itemData) { - Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); - } - - onItemRemove(itemData) { - Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); - } - - clearAll() { - Log.showInfo(TAG, `clearAll`); - this.mLoaders.forEach((sourceLoader) => sourceLoader.stopLoad()); - this.mLoaders.clear(); - } - - loadData(userId) { - Log.showInfo(TAG, `loadData`); - this.mLoaders.forEach((sourceLoader) => { - sourceLoader.loadData(userId); - }); - } -} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts new file mode 100644 index 00000000..a5e6a102 --- /dev/null +++ b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2021-2022 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 Log from "../default/Log"; +import SourceLoaderFactory from "./sourceloader/SourceLoaderFactory"; +import SourceLoader from "./sourceloader/SourceLoader"; +import { FilterData, ItemComponentData, RootConfigInfo } from "./common/Constants"; +import { + AbilityInfoWithId, + BundleEventType, + ListenerHandle, + queryAbility, + registerBundleListener, +} from "./common/BundleParseUtil"; +import { AbilityInfo } from "bundle/abilityInfo"; + +export type PluginListener = { + onItemAdd: (itemData: ItemComponentData) => void; + onItemRemove: (itemData: ItemComponentData) => void; +}; + +const TAG = "PluginDataSourceManager"; +const INVALID_USERID = -1; + +export default class PluginDataSourceManager { + mAction: string = ""; + mUserId: number = INVALID_USERID; + mListenerHandle: ListenerHandle | undefined = undefined; + mFilterDatas: Map = new Map(); + mLoaders: Map = new Map(); + mFactory: SourceLoaderFactory; + + constructor(listener: PluginListener) { + this.mFactory = new SourceLoaderFactory({ + add: listener.onItemAdd, + remove: listener.onItemRemove, + }); + } + + initDataSource(configs: RootConfigInfo) { + Log.showInfo(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`); + this.mAction = configs.action; + configs.filterDatas.forEach((data: FilterData) => this.mFilterDatas.set(data.abilityName, data.id)); + for (let pluginType in configs.loaderConfig) { + const sourceLoader = this.mFactory.getSourceLoader(pluginType, configs.loaderConfig[pluginType]); + if (sourceLoader instanceof SourceLoader) { + this.mLoaders.set(pluginType, sourceLoader); + Log.showInfo(TAG, `getSourceLoader plugin: ${pluginType}, loader${this.mLoaders.get(pluginType)}`); + } + } + Log.showInfo(TAG, `action:${this.mAction}, filterData: ${JSON.stringify(this.mFilterDatas)}`); + registerBundleListener(this, (handle) => { + this.mListenerHandle = handle; + }); + } + + async onBundleNotify(bundleName: string, event: BundleEventType) { + Log.showInfo(TAG, `onBundleNotify, bundleName: ${bundleName}, event: ${event}`); + if (event == BundleEventType.BUNDLE_CHANGE || event == BundleEventType.BUNDLE_REMOVE) { + this.mLoaders.forEach((loader) => loader.onBundleRemove(bundleName)); + } + if (event == BundleEventType.BUNDLE_CHANGE || event == BundleEventType.BUNDLE_ADD) { + let abilityInfos = await queryAbility(this.mAction, this.mUserId, bundleName); + Log.showInfo(TAG, `abilityInfos: ${JSON.stringify(abilityInfos)}`); + abilityInfos.forEach((info) => this.notifyAbilityAdd(info)); + } + } + + clearAll() { + Log.showInfo(TAG, `clearAll`); + this.unregisterListener(); + this.mLoaders.forEach((sourceLoader) => sourceLoader.clearData()); + } + + async loadData(userId: number) { + if (this.mUserId != userId) { + this.mUserId = userId; + this.mLoaders.forEach((sourceLoader) => sourceLoader.clearData()); + let abilityInfos = await queryAbility(this.mAction, this.mUserId); + abilityInfos.forEach((info) => this.notifyAbilityAdd(info)); + } + this.mLoaders.forEach((sourceLoader) => sourceLoader.reloadData(this.mUserId)); + } + + private notifyAbilityAdd(info: AbilityInfo) { + let itemId = this.mFilterDatas.get(info.name); + if (!itemId) { + Log.showInfo(TAG, `notifyAbilityAdd, can't find itemId, ability:${info.name}`); + return; + } + let abilityInfo: AbilityInfoWithId = { + ...info, + itemId: itemId, + }; + if (!abilityInfo.metaData || !abilityInfo.metaData.length) { + Log.showInfo(TAG, `Can't find metaData, abilityId: ${abilityInfo.name}`); + return; + } + this.mLoaders.forEach((loader) => loader.onAbilityAdd(abilityInfo)); + } + + private unregisterListener() { + this.mListenerHandle?.unRegister(); + this.mListenerHandle = undefined; + } +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts new file mode 100644 index 00000000..50ac335e --- /dev/null +++ b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2022 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 bundleManager from "@ohos.bundle"; +import commonEvent from "@ohos.commonEvent"; +import { AbilityInfo } from "bundle/abilityInfo"; +import Log from "../../default/Log"; + +export type AbilityInfoWithId = AbilityInfo & { itemId: string }; +export type BundleListener = { + onBundleNotify: (bundleName: string, event: BundleEventType) => void; +}; +export type ListenerHandle = { + unRegister: () => void; +}; +export type PluginData = { + [key: string | number]: any; +}; + +export enum BundleEventType { + BUNDLE_ADD, + BUNDLE_CHANGE, + BUNDLE_REMOVE, + UNKNOWN_EVENT, +} + +const TAG = "SourceLoader-BundleParseUtil"; +const DEFAULT_BUNDLE_FLAG = + bundleManager.BundleFlag.GET_ABILITY_INFO_WITH_METADATA | bundleManager.BundleFlag.GET_ABILITY_INFO_WITH_PERMISSION; +const BUNDLE_SUBSCRIBE_INFO = { + events: [ + commonEvent.Support.COMMON_EVENT_PACKAGE_ADDED, + commonEvent.Support.COMMON_EVENT_PACKAGE_REMOVED, + commonEvent.Support.COMMON_EVENT_PACKAGE_CHANGED, + ], +}; + +export async function queryAbility(action: string, userId: number, bundleName?: string): Promise> { + if (bundleName) { + return await bundleManager.queryAbilityByWant( + { + action: action, + bundleName: bundleName, + }, + DEFAULT_BUNDLE_FLAG, + userId + ); + } + return await bundleManager.queryAbilityByWant({ action: action }, DEFAULT_BUNDLE_FLAG, userId); +} + +export function filterAbilityInfo(info: AbilityInfoWithId, filterKey: string): PluginData | undefined { + let pluginDatas = info.metaData.filter((data) => data.name == filterKey); + if (!pluginDatas.length) { + Log.showDebug(TAG, `filterKey: ${filterKey}, metaData: ${JSON.stringify(info.metaData.values)}`); + return undefined; + } + let pluginData = JSON.parse("{" + pluginDatas[0].extra + "}"); + if (!pluginData) { + Log.showError(TAG, `Can't parse pluginData: ${pluginDatas[0]}, filterKey: ${filterKey}`); + return undefined; + } + Log.showInfo(TAG, `createItemComponentData, pluginData: ${JSON.stringify(pluginData)}`); + return pluginData; +} + +export function registerBundleListener(listener: BundleListener, callback: (handle: ListenerHandle) => void) { + commonEvent.createSubscriber(BUNDLE_SUBSCRIBE_INFO, (err, handle) => { + Log.showDebug(TAG, `registerBundleListener, err: ${JSON.stringify(err)}, handle: ${handle}`); + if (err.code != 0) { + Log.showError(TAG, `Can't regitser bundle subscribe, err: ${JSON.stringify(err)}`); + return; + } + commonEvent.subscribe(handle, (err, data) => { + Log.showDebug(TAG, `bundle change, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + if (err.code != 0) { + Log.showError(TAG, `Can't handle bundle change, err: ${JSON.stringify(err)}`); + return; + } + let event = BundleEventType.UNKNOWN_EVENT; + switch (data.event) { + case commonEvent.Support.COMMON_EVENT_PACKAGE_ADDED: + event = BundleEventType.BUNDLE_ADD; + break; + case commonEvent.Support.COMMON_EVENT_PACKAGE_CHANGED: + event = BundleEventType.BUNDLE_CHANGE; + break; + case commonEvent.Support.COMMON_EVENT_PACKAGE_REMOVED: + event = BundleEventType.BUNDLE_REMOVE; + break; + default: + Log.showError(TAG, `unknow event: ${event}`); + } + listener.onBundleNotify(data.bundleName ?? "unkown", event); + }); + callback({ + unRegister: () => { + commonEvent.unsubscribe(handle, () => { + Log.showInfo(TAG, `unRegister bundle info listener, handle: ${handle}`); + }); + }, + }); + }); +} diff --git a/common/src/main/ets/plugindatasource/common/Constants.ts b/common/src/main/ets/plugindatasource/common/Constants.ts new file mode 100644 index 00000000..323c9617 --- /dev/null +++ b/common/src/main/ets/plugindatasource/common/Constants.ts @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2021-2022 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 { Event } from "../../default/Event/EventUtil"; + +export default class Constants { + static INIT_CONFIG = "initConfig"; + static INIT_FINISH = "initFinish"; + static CLEAR_ALL = "clearAll"; + static ADD_ITEM = "addItem"; + static REMOVE_ITEM = "removeItem"; + static LOCAL_DEVICE = "local"; + static LOAD_DATA = "loadData"; +} + +export type FilterData = { + id: string; + abilityName: string; +}; + +export type RootConfigInfo = { + action: string; + filterDatas: FilterData[]; + loaderConfig: { + [key in any]: LoaderConfigInfo; + }; +}; + +export type LoaderConfigInfo = { + [key: string]: any; +}; + +export enum PluginType { + META = 1, + DATA_ABILITY = 2, + PLUGIN_COMPONENT = 3, +} + +export function obtainMsg(action: string, data: any) { + return { action: action, data: data }; +} + +export type ItemComponentData = { + id: string; + pluginType: number; + deviceId: string; + bundleName: string; + abilityName: string; + abilityLabelId: number; + abilityIconId: number; + label?: string; + iconUrl?: Resource | string; + template?: string; + state?: any; + actionData?: ActionData; +} + +export class ActionData { + clickAction?: Event; + longClickAction?: Event; + launchType?: number; + pluginData?: any; + extra?: any; +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/BaseMetaSourceLoader.ets b/common/src/main/ets/plugindatasource/sourceloader/BaseMetaSourceLoader.ets deleted file mode 100644 index 977c1767..00000000 --- a/common/src/main/ets/plugindatasource/sourceloader/BaseMetaSourceLoader.ets +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) 2021 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 bundleManager from "@ohos.bundle"; -import commonEvent from '@ohos.commonEvent'; -import Log from '../../default/Log.ets'; -import CheckEmptyUtils from '../../default/CheckEmptyUtils.ets'; -import SourceLoader from './SourceLoader.ets'; -import Constants, {ItemComponentData, ActionData} from '../common/Constants.ets'; - -const TAG = "BaseMetaSourceLoader"; - -let mCommonEventSubscribeInfo = { - events: [ - commonEvent.Support.COMMON_EVENT_PACKAGE_ADDED, - commonEvent.Support.COMMON_EVENT_PACKAGE_REMOVED, - commonEvent.Support.COMMON_EVENT_PACKAGE_CHANGED - ] -}; - -export default abstract class BaseMetaSourceLoader extends SourceLoader { - mAction: string = null; - mPermission: string = null; - mFilterIds: string[] = null; - mPluginType: number = null; - mItemComponentDatas: ItemComponentData[] = []; - mCommonEventSubscriber = null; - mUserId: string = null; - - constructor(config, channel, pluginType) { - super(channel); - Log.showInfo(TAG, `constructor, config: ${JSON.stringify(config)} channel: ${channel} pluginType: ${pluginType}`) - this.mPluginType = pluginType; - this.initSourceLoader(config); - } - - initSourceLoader(config) { - Log.showInfo(TAG, `init loader, config: ${JSON.stringify(config)}`) - - this.mAction = config.action; - this.mPermission = config.permission; - this.mFilterIds = config.filterIds; - - Log.showInfo(TAG, `init loader, mCommonEventSubscribeInfo: ${JSON.stringify(mCommonEventSubscribeInfo)}`) - commonEvent.createSubscriber( - mCommonEventSubscribeInfo, - this.createCommonEventSubscriberCallBack.bind(this) - ); - } - - stopLoad() { - Log.showInfo(TAG, `stop loader`) - this.unRegisterCommonEventListener(); - this.removeAllItemComponentData(); - } - - loadData(userId) { - Log.showInfo(TAG, `load loader userId = ` + userId) - this.mUserId = userId; - this.removeAllItemComponentData(); - this.addAbilityItemComponentData({ - "action": this.mAction - }); - } - - createCommonEventSubscriberCallBack(err, data) { - Log.showInfo(TAG, `createCommonEventSubscriberCallBack, err: ${JSON.stringify(err)}`); - if (err.code != 0) { - return; - } - - this.mCommonEventSubscriber = data; - commonEvent.subscribe(this.mCommonEventSubscriber, this.procCommonEventSubscriberCallBack.bind(this)); - } - - procCommonEventSubscriberCallBack(err, data) { - Log.showInfo(TAG, `procCommonEventSubscriberCallBack, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - if (err.code != 0) { - return; - } - - let event = data.event; - let bundleName = data.bundleName; - if (event == commonEvent.Support.COMMON_EVENT_PACKAGE_CHANGED || event == commonEvent.Support.COMMON_EVENT_PACKAGE_REMOVED) { - this.removeItemComponentData(bundleName); - } - if (event == commonEvent.Support.COMMON_EVENT_PACKAGE_ADDED || event == commonEvent.Support.COMMON_EVENT_PACKAGE_CHANGED) { - this.addAbilityItemComponentData({ - "bundleName": bundleName, - "action": this.mAction - }); - } - } - - unRegisterCommonEventListener() { - Log.showInfo(TAG, 'unRegisterCommonEventListener') - commonEvent.unsubscribe(this.mCommonEventSubscriber, () => { - Log.showInfo(TAG, 'unRegisterCommonEventListener unregister Listener ==============='); - }); - } - - removeAllItemComponentData(): void{ - Log.showInfo(TAG, `removeAllItemComponentData`); - for (let itemComponentData of this.mItemComponentDatas) { - this.removeItem(itemComponentData); - } - this.mItemComponentDatas = []; - } - - addAbilityItemComponentData(want): void{ - Log.showInfo(TAG, `addAbilityItemComponentData, want: ${JSON.stringify(want)} BundleFlag: ${Constants.DEFAULT_BUNDLE_FLAG}this.mUserId:${this.mUserId}`); - bundleManager.queryAbilityByWant(want, Constants.DEFAULT_BUNDLE_FLAG, this.mUserId ? this.mUserId : Constants.DEFAULT_USER_ID, - (err, abilityInfos) => { - Log.showInfo(TAG, `addAbilityItemComponentData queryAbilityByWant callback, want: ${JSON.stringify(want)} err: ${JSON.stringify(err)} abilityInfos: ${abilityInfos.length} ${JSON.stringify(abilityInfos)} `) - if (err != 0) { - return; - } - for (let abilityInfo of abilityInfos) { - this.createItemComponentData(abilityInfo, (itemComponentData) => { - this.addItemComponentData(itemComponentData); - }); - } - Log.showInfo(TAG, `addAbilityItemComponentData, mItemComponentDatas: ${JSON.stringify(this.mItemComponentDatas)} `) - }); - } - - createItemComponentData(abilityInfo, callback: Function): void{ - Log.showInfo(TAG, `createItemComponentData, abilityInfo: ${JSON.stringify(abilityInfo)}`); - - let pluginData: any = null; - Log.showInfo(TAG, `abilityInfo.metaData: ${JSON.stringify(abilityInfo.metaData)}`); - if (abilityInfo.metaData) { - for (let index in abilityInfo.metaData) { - if (abilityInfo.metaData[index].name == this.mAction) { - Log.showInfo(TAG, `customizeData.extra: ${abilityInfo.metaData[index].extra}`); - pluginData = JSON.parse("{" + abilityInfo.metaData[index].extra + "}"); - break; - } - } - } - Log.showInfo(TAG, `createItemComponentData, pluginData: ${JSON.stringify(pluginData)}`); - if (!pluginData && parseInt(pluginData.pluginType) != this.mPluginType) { - return; - } - if (this.mFilterIds.indexOf(pluginData.id) < 0) { - return; - } - - let itemComponentData = new ItemComponentData(); - { - itemComponentData.id = pluginData.id; - itemComponentData.pluginType = this.mPluginType; - itemComponentData.deviceId = null; - itemComponentData.bundleName = abilityInfo.bundleName; - itemComponentData.abilityName = abilityInfo.name; - itemComponentData.abilityLabelId = abilityInfo.labelId; - itemComponentData.abilityIconId = abilityInfo.iconId; - if (!CheckEmptyUtils.isEmpty(pluginData.label)) { - itemComponentData.label = encodeURIComponent(pluginData.label); - } - if (!CheckEmptyUtils.isEmpty(pluginData.icon)) { - itemComponentData.iconUrl = pluginData.icon; - } - if (!CheckEmptyUtils.isEmpty(pluginData.template)) { - itemComponentData.template = pluginData.template; - } - { - let actionData = new ActionData(); - actionData.clickAction = pluginData.clickAction; - actionData.longClickAction = pluginData.longClickAction; - actionData.launchType = pluginData.launchType; - actionData.pluginData = pluginData.pluginData; - actionData.extra = pluginData.extra; - itemComponentData.actionData = actionData; - } - } - - Log.showInfo(TAG, `createItemComponentData, itemComponentData: ${JSON.stringify(itemComponentData)}`); - callback(itemComponentData); - } - - addItemComponentData(itemComponentData): void { - Log.showInfo(TAG, `addItemComponentData, itemComponentData: ${JSON.stringify(itemComponentData)} `); - this.addItem(itemComponentData); - this.mItemComponentDatas.push(itemComponentData); - } - - removeItemComponentData(bundleName): void { - Log.showInfo(TAG, `removeItemComponentData, bundleName: ${bundleName}`); - let deleteIndexs = []; - for (let i = 0;i < this.mItemComponentDatas.length; i++) { - if (this.mItemComponentDatas[i].bundleName == bundleName) { - deleteIndexs.push(i); - } - } - Log.showInfo(TAG, `removeItemComponentData, deleteIndexs: ${JSON.stringify(deleteIndexs)}`); - for (let i = (deleteIndexs.length - 1);i >= 0; i--) { - let itemComponentData = this.mItemComponentDatas[deleteIndexs[i]]; - this.removeItem(itemComponentData); - this.mItemComponentDatas.splice(deleteIndexs[i], 1); - } - Log.showInfo(TAG, `removeItemComponentData, mItemComponentDatas: ${JSON.stringify(this.mItemComponentDatas)}`); - } -} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ets b/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts similarity index 49% rename from common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ets rename to common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts index d3254473..424e43d2 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ets +++ b/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,19 +13,21 @@ * limitations under the License. */ -import Log from '../../default/Log.ets'; -import BaseMetaSourceLoader from './BaseMetaSourceLoader.ets'; -import {PluginType} from '../common/Constants.ets'; +import Log from "../../default/Log"; +import { AbilityInfoWithId } from "../common/BundleParseUtil"; +import { LoaderConfigInfo } from "../common/Constants"; +import SourceLoader from "./SourceLoader"; const TAG = "DataAbilitySourceLoader"; -export default class DataAbilitySourceLoader extends BaseMetaSourceLoader { - // config = {"methodName":"xxx/xx/xx"} +export default class DataAbilitySourceLoader extends SourceLoader { + constructor(config: LoaderConfigInfo) { + super(config); + Log.showInfo(TAG, `constructor`); + } - constructor(config, channel) { - super(config, channel, PluginType.OBSERVER); - Log.showInfo(TAG, `constructor, config: ${JSON.stringify(config)} channel: ${channel}`) - } - - // todo 启动监听,监听call方法,数据转换为ItemComponentData,通过addItem/removewItem传输 -} + clearData(): void {} + reloadData(userId: number): void {} + onAbilityAdd(abilityInfo: AbilityInfoWithId): void {} + onBundleRemove(bundleName: string): void {} +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts new file mode 100644 index 00000000..5a4944a4 --- /dev/null +++ b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2021-2022 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 Log from "../../default/Log"; +import SourceLoader from "./SourceLoader"; +import Constants, { PluginType, ItemComponentData, LoaderConfigInfo } from "../common/Constants"; +import { AbilityInfoWithId, filterAbilityInfo, PluginData } from "../common/BundleParseUtil"; +import { parseEventString } from "../../default/Event/EventUtil"; + +const TAG = "MetaSourceLoader"; + +export default class MetaSourceLoader extends SourceLoader { + mPluginFilter: string = ""; + mPermission: string = ""; + mItemDatas: ItemComponentData[] = []; + + constructor(config: LoaderConfigInfo) { + super(config); + this.mPluginFilter = config.action; + this.mPermission = config.permission; + Log.showInfo(TAG, `init loader, mPluginFilter: ${this.mPluginFilter}, mPermission: ${this.mPermission}`); + } + + onAbilityAdd(abilityInfo: AbilityInfoWithId): void { + let pluginData: PluginData | undefined = filterAbilityInfo(abilityInfo, this.mPluginFilter); + if (pluginData) { + let itemData = parseData(abilityInfo, pluginData); + if (!itemData) { + return; + } + this.mItemDatas.push(itemData); + this.addItem(itemData); + Log.showInfo(TAG, `item[${itemData.id}] add success, name: ${abilityInfo.name}`); + return; + } + Log.showDebug(TAG, `Can't filter ${abilityInfo.name}.`); + } + + onBundleRemove(bundleName: string): void { + for (let i = this.mItemDatas.length - 1; i >= 0; i--) { + if (bundleName == this.mItemDatas[i].bundleName) { + Log.showDebug(TAG, `remove item index: ${i}, abilityname: ${this.mItemDatas[i].abilityName}`); + this.removeItem(this.mItemDatas[i]); + this.mItemDatas.splice(i, 1); + } + } + } + + clearData(): void { + Log.showDebug(TAG, `clear all, size: ${this.mItemDatas.length}`); + this.mItemDatas.forEach((data) => this.removeItem(data)); + this.mItemDatas.length = 0; + } + + reloadData(userId: number): void { + Log.showDebug(TAG, `reloadData userId: ${userId}`); + } +} + +function parseData(info: AbilityInfoWithId, data: PluginData): ItemComponentData { + let { label, pluginType, icon, template, clickAction, longClickAction, launchType, ...extra } = data; + if (pluginType.toString() != PluginType.META.toString()) { + return undefined; + } + let itemData: ItemComponentData = { + id: info.itemId, + pluginType: PluginType.META, + deviceId: Constants.LOCAL_DEVICE, + bundleName: info.bundleName, + abilityName: info.name, + abilityLabelId: info.labelId, + abilityIconId: info.iconId, + label: label, + iconUrl: icon, + template: template, + actionData: { + clickAction: parseEventString(clickAction), + longClickAction: parseEventString(longClickAction), + launchType: launchType, + extra: extra, + }, + }; + return itemData; +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ets b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts similarity index 52% rename from common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ets rename to common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts index 866e509d..797806dd 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ets +++ b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,28 +13,21 @@ * limitations under the License. */ -import Log from '../../default/Log.ets'; -import SourceLoader from './SourceLoader.ets'; +import Log from "../../default/Log"; +import { AbilityInfoWithId } from "../common/BundleParseUtil"; +import { LoaderConfigInfo } from "../common/Constants"; +import SourceLoader from "./SourceLoader"; const TAG = "PluginSourceLoader"; export default class PluginSourceLoader extends SourceLoader { - constructor(config, channel) { - super(channel); - this.initSourceLoader(config); - } + constructor(config: LoaderConfigInfo) { + super(config); + Log.showInfo(TAG, `constructor`); + } - initSourceLoader(config) { - Log.showInfo(TAG, `init loader, config: ${JSON.stringify(config)}`) - // todo 配置解析, config格式配置 - // todo 启动监听,数据转换为ItemComponentData,通过addItem/removewItem传输 - } - - stopLoad() { - // todo 停止监听,清除数据 - } - - loadData(userId) { - // todo 重新获取一次数据 - } + clearData(): void {} + reloadData(userId: number): void {} + onAbilityAdd(abilityInfo: AbilityInfoWithId): void {} + onBundleRemove(bundleName: string): void {} } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts new file mode 100644 index 00000000..bec6e183 --- /dev/null +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021-2022 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 Log from "../../default/Log"; +import { ItemComponentData, LoaderConfigInfo } from "../common/Constants"; +import { AbilityInfoWithId } from "../common/BundleParseUtil"; + +const TAG = "SourceLoader"; + +export type LoaderChannel = { + add: (item: ItemComponentData) => void; + remove: (item: ItemComponentData) => void; +}; + +export default abstract class SourceLoader { + mChannel: LoaderChannel | undefined; + + constructor(config: LoaderConfigInfo) { + Log.showInfo(TAG, `constructor`); + } + + public setChannel(channel: LoaderChannel) { + this.mChannel = channel; + } + + protected addItem(itemData: ItemComponentData) { + this.mChannel?.add(itemData); + } + + protected removeItem(itemData: ItemComponentData) { + this.mChannel?.remove(itemData); + } + + abstract clearData(): void; + + abstract onBundleRemove(bundleName: string): void; + + abstract reloadData(userId: number): void; + + abstract onAbilityAdd(abilityInfo: AbilityInfoWithId): void; +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts b/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts new file mode 100644 index 00000000..8487bdad --- /dev/null +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021-2022 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 Log from "../../default/Log"; +import SourceLoader, { LoaderChannel } from "./SourceLoader"; +import DataAbilitySourceLoader from "./DataAbilitySourceLoader"; +import MetaSourceLoader from "./MetaSourceLoader"; +import PluginSourceLoader from "./PluginSourceLoader"; +import { LoaderConfigInfo } from "../common/Constants"; + +const TAG = "SourceLoaderFactory"; + +const classMap: { [key: string]: any } = { + MetaSource: MetaSourceLoader, + PluginSourceLoader: PluginSourceLoader, + DataAbilitySourceLoader: DataAbilitySourceLoader, +}; + +export default class SourceLoaderFactory { + mChannel: LoaderChannel; + + constructor(channel: LoaderChannel) { + Log.showInfo(TAG, `constructor, channel: ${channel}`); + this.mChannel = channel; + } + + getSourceLoader(pluginType: string, config: LoaderConfigInfo): null | SourceLoader { + let clz = classMap[pluginType]; + if (!clz) { + Log.showError(TAG, `Can't find pluginType: ${pluginType}`); + return null; + } + let loader: SourceLoader = new clz(config); + loader.setChannel(this.mChannel); + return loader; + } +} \ No newline at end of file diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/template/SimpleToggleBase.ets index 73092462..cc035858 100644 --- a/common/src/main/ets/template/SimpleToggleBase.ets +++ b/common/src/main/ets/template/SimpleToggleBase.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,106 +13,105 @@ * limitations under the License. */ -import Log from '../default/Log.ets' -import UniformConfig from './UniformConfig.ets' +import Log from '../default/Log' +import StyleConfiguration from './common/StyleConfiguration' -const TAG = 'SimpleToggleBase.ets' +const TAG = 'SimpleToggleBase' @Component export default struct SimpleToggleBase { - private mConfig = UniformConfig.config - @Prop mToggleId: string - @Link @Watch('onIconUpdated') mIcon: string | Resource - @State @Watch('onIconStrUpdated') mIconStr: string = '' + private mToggleId: string + @Link mIcon: string | Resource + @State mIconStr: string = '' private mUseIconStr: boolean = false private mAutoIconColor: boolean = false - @Link @Watch('onChangeSwitchUpdated') mChangeSwitch: boolean + @Prop mChangeSwitch: boolean @Link mLabel: string | Resource @State mLabelStr: string = '' private mUseLabelStr: boolean = false - @Prop mShowLabel: boolean - @Prop mEditMode: boolean + private mIconOnBG: string | Resource + private mEditMode: boolean = false + private mDragMode: boolean = false private mClickEvent: Function private mLongClickEvent: Function - private appStorageIconKey: string - private appStorageChangeSwitchKey: string + @State mIconIsHover: boolean = false + @State mTextIsHover: boolean = false + @State style: any = StyleConfiguration.getSimpleToggleBaseStyle() aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, mToggleId: ${this.mToggleId}`) Log.showInfo(TAG, `aboutToAppear, mLabel: ${JSON.stringify(this.mLabel)}`) - if (this.mEditMode) { - this.appStorageIconKey = "TOGGLE_ICON_" + this.mToggleId - this.appStorageChangeSwitchKey = "TOGGLE_CHANGE_SWITCH_" + this.mToggleId - if (this.mUseIconStr) { - AppStorage.SetOrCreate(this.appStorageIconKey, this.mIconStr) - } else { - AppStorage.SetOrCreate(this.appStorageIconKey, this.mIcon) - } - AppStorage.SetOrCreate(this.appStorageChangeSwitchKey, this.mChangeSwitch) - } + Log.showInfo(TAG, `aboutToAppear, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode}`) } aboutToDisappear() { Log.showInfo(TAG, 'aboutToDisappear') } - onIconUpdated(propName: string): void { - Log.showInfo(TAG, `onIconUpdated, propName: ${propName} mIcon: ${JSON.stringify(this.mIcon)}`) - if (this.mEditMode) { - AppStorage.SetOrCreate(this.appStorageIconKey, this.mIcon) - } - } - - onIconStrUpdated(propName: string): void { - Log.showInfo(TAG, `onIconStrUpdated, propName: ${propName} mIconStr: ${this.mIconStr}`) - if (this.mEditMode) { - AppStorage.SetOrCreate(this.appStorageIconKey, this.mIconStr) - } - } - - onChangeSwitchUpdated(propName: string): void { - Log.showInfo(TAG, `onIconUpdated, propName: ${propName} mChangeSwitch: ${this.mChangeSwitch}`) - if (this.mEditMode) { - AppStorage.SetOrCreate(this.appStorageChangeSwitchKey, this.mChangeSwitch) - } - } - build() { Column() { Stack() { Flex() - .backgroundColor(this.mChangeSwitch == false ? this.mConfig.iconOffBG : this.mConfig.iconOnBG) - .clip(new Circle({ width: this.mConfig.circleWidth, height: this.mConfig.circleHeight })) - .width(this.mConfig.circleWidth) - .height(this.mConfig.circleHeight) - if (this.mAutoIconColor) { - Image(this.mUseIconStr ? this.mIconStr : this.mIcon) - .size({ width: this.mConfig.iconWidth, height: this.mConfig.iconHeight }) - .objectFit(ImageFit.Contain) - .fillColor(this.mChangeSwitch ? this.mConfig.iconOnColor : this.mConfig.iconOffColor) - } else { - Image(this.mUseIconStr ? this.mIconStr : this.mIcon) - .size({ width: this.mConfig.iconWidth, height: this.mConfig.iconHeight }) - .objectFit(ImageFit.Contain) + .backgroundColor(this.mChangeSwitch ? (this.mIconOnBG ? this.mIconOnBG : this.style.iconOnBG) : this.style.iconOffBG) + .clip(new Circle({ + width: this.mDragMode ? this.style.dragCircleWidth : this.style.circleWidth, + height: this.mDragMode ? this.style.dragCircleHeight : this.style.circleHeight + })) + .width(this.mDragMode ? this.style.dragCircleWidth : this.style.circleWidth) + .height(this.mDragMode ? this.style.dragCircleHeight : this.style.circleHeight) + if (!this.mDragMode) { + Flex() + .backgroundColor(this.mIconIsHover ? this.style.hoverColor : this.style.transparentColor) + .clip(new Circle({ width: this.style.circleWidth, height: this.style.circleHeight })) + .width(this.style.circleWidth) + .height(this.style.circleHeight) } + Image(this.mUseIconStr ? this.mIconStr : this.mIcon) + .size({ + width: this.mDragMode ? this.style.dragIconWidth : this.style.iconWidth, + height: this.mDragMode ? this.style.dragIconHeight : this.style.iconHeight }) + .objectFit(ImageFit.Contain) + .fillColor(this.mChangeSwitch ? this.style.iconOnColor : this.style.iconOffColor) + .onHover((isHover) => { + this.mIconIsHover = isHover; + }) } - .width(this.mConfig.circleWidth) - .height(this.mConfig.circleHeight) + .width(this.mDragMode ? this.style.dragCircleWidth : this.style.circleWidth) + .height(this.mDragMode ? this.style.dragCircleHeight : this.style.circleHeight) + .onClick(this.onIconItemClick.bind(this)) - if (this.mShowLabel) { + if (!this.mDragMode) { Column() - .width(this.mConfig.circleWidth) - .height(10) - - Text(this.mUseLabelStr ? this.mLabelStr : this.mLabel) - .fontSize(this.mConfig.simpleToggleTitleSize) + .width('100%') + .height(this.style.componentGap) + Stack() { + Flex() + .backgroundColor(this.mTextIsHover ? this.style.hoverColor : this.style.transparentColor) + .clip(new Rect({ + width: this.style.textHoverWidth, + height: this.style.textHoverHeight + }).radius(this.style.textHoverRadius)) + .width(this.style.textHoverWidth) + .height(this.style.textHoverHeight) + Text(this.mUseLabelStr ? this.mLabelStr : this.mLabel) + .fontSize(this.style.titleSize) + .fontColor(this.style.titleColor) + .textAlign(TextAlign.Center) + .maxLines(2) + .onHover((isHover) => { + this.mTextIsHover = isHover; + }) + } } } - .onClick(this.onIconItemClick.bind(this)) - .gesture(LongPressGesture({ repeat: false }).onAction(this.onIconItemLongPressGesture.bind(this))) + .width('100%') + .height('100%') } onIconItemClick(event: ClickEvent) { + if (this.mDragMode) { + return + } Log.showInfo(TAG, `onIconItemClick`) if (this.mClickEvent) { this.mClickEvent() @@ -120,7 +119,7 @@ export default struct SimpleToggleBase { } onIconItemLongPressGesture(event: GestureEvent) { - if (this.mEditMode) { + if (this.mEditMode || this.mDragMode) { return } Log.showInfo(TAG, `onIconItemLongPressGesture, event: ${JSON.stringify(event)}`) diff --git a/common/src/main/ets/template/UniformConfig.ets b/common/src/main/ets/template/UniformConfig.ets deleted file mode 100644 index cadfa00c..00000000 --- a/common/src/main/ets/template/UniformConfig.ets +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2021 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 default class UniformConfig { - - static config = { - iconOnBG: "#0A59F7", - iconOffBG: "#F5F5F5", - iconOnColor: "#FFFFFF", - iconOffColor: "#404345", - baseColor: "#CCFFFFFF", - circleWidth: '80px', - circleHeight: '80px', - iconWidth: '50px', - iconHeight: '50px', - titleSize: '20px', - baseBorderRadius: 15, - simpleToggleTitleSize: '18px' - } - - static initParams(params?) { - console.log('----initParams(params)----ing'); - UniformConfig.config = params || { - iconOnBG: "#0A59F7", - iconOffBG: "#F5F5F5", - iconOnColor: "#FFFFFF", - iconOffColor: "#404345", - baseColor: "#CCFFFFFF", - circleWidth: '80px', - circleHeight: '80px', - iconWidth: '50px', - iconHeight: '50px', - titleSize: '20px', - baseBorderRadius: 15, - simpleToggleTitleSize: '18px' - } - console.log('----initParams(params)----finish'); - } -} diff --git a/common/src/main/ets/template/common/StyleConfiguration.ts b/common/src/main/ets/template/common/StyleConfiguration.ts new file mode 100644 index 00000000..180b8c50 --- /dev/null +++ b/common/src/main/ets/template/common/StyleConfiguration.ts @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../default/StyleManager'; + +const TAG = 'CommonTemplate-StyleConfiguration'; + +export default class StyleConfiguration { + static getIconTitleBaseStyle() { + const key: string = TAG + "-IconTitleBase"; + return StyleManager.getStyle(key, () => { + return { + marginLeft: '24vp', + marginRight: '16vp', + componentGap: '8vp', + titleSize: '24vp', + titleColor:$r("sys.color.ohos_id_color_text_secondary"), + borderRadius: '48vp', + backgroundColor: '#ffffff', + textMargin: '8vp', + textHoverHeight: '52vp', + textHoverWidth: '136vp', + textHoverRadius: '8vp', + hoverColor: 'rgba(0, 0, 0, 0.05)', + transparentColor: 'rgba(255, 255, 255, 0)', + }; + }); + } + + static getIconComponentStyle() { + const key: string = TAG + "-IconComponent"; + return StyleManager.getStyle(key, () => { + return { + circleWidth: '96vp', + circleHeight: '96vp', + iconWidth: '48vp', + iconHeight: '48vp', + iconOffBG: '#1A000000', + iconOnBG: '#FF007DFF', + iconOnColor: '#FFFFFFFF', + iconOffColor: $r("sys.color.ohos_id_color_secondary"), + hoverColor: 'rgba(0, 0, 0, 0.05)', + transparentColor: 'rgba(255, 255, 255, 0)', + }; + }); + } + + static getSimpleToggleBaseStyle() { + const key: string = TAG + "-SimpleToggleBase"; + return StyleManager.getStyle(key, () => { + return { + circleWidth: '96vp', + circleHeight: '96vp', + iconWidth: '48vp', + iconHeight: '48vp', + dragCircleWidth: '120vp', + dragCircleHeight: '120vp', + dragIconWidth: '72vp', + dragIconHeight: '72vp', + iconOffBG: '#1A000000', + iconOnBG: '#FF007DFF', + iconOnColor: '#FFFFFFFF', + iconOffColor: $r("sys.color.ohos_id_color_secondary"), + componentGap: '10vp', + titleSize: '24fp', + titleColor: $r("sys.color.ohos_id_color_text_secondary"), + textHoverWidth: '136vp', + textHoverHeight: '36vp', + textHoverRadius: '8vp', + hoverColor: 'rgba(0, 0, 0, 0.05)', + transparentColor: 'rgba(255, 255, 255, 0)', + }; + }); + } +} \ No newline at end of file diff --git a/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/template/iconComponent.ets index a190fa43..bf118848 100644 --- a/common/src/main/ets/template/iconComponent.ets +++ b/common/src/main/ets/template/iconComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,23 +13,25 @@ * limitations under the License. */ -import Log from '../default/Log.ets'; -import UniformConfig from './UniformConfig.ets' +import Log from '../default/Log'; +import StyleConfiguration from './common/StyleConfiguration' -const TAG= 'iconComponent.ets' +const TAG = 'iconComponent' @Component export default struct iconComponent { - private mConfig = UniformConfig.config; @State iconOff: any = "" @State iconOn: any = "" @Prop iconOffStr: string @Prop iconOnStr: string private useIconStr = false + @State mIconIsHover: boolean = false + @Link changeSwitch: boolean + @State style: any = StyleConfiguration.getIconComponentStyle() aboutToAppear() { Log.showInfo(TAG,`aboutToAppear, ${this.changeSwitch} ${JSON.stringify(this.iconOff)} ${JSON.stringify(this.iconOn)}`) @@ -44,15 +46,25 @@ struct iconComponent { Column() { Stack() { Flex() - .backgroundColor(this.changeSwitch == false? this.mConfig.iconOffBG : this.mConfig.iconOnBG) - .clip(Circle({ width: this.mConfig.circleWidth, height: this.mConfig.circleHeight })) - .width(this.mConfig.circleWidth ) - .height(this.mConfig.circleHeight ) - Image(this.changeSwitch == false? (this.useIconStr ? this.iconOffStr : this.iconOff): (this.useIconStr ? this.iconOnStr : this.iconOn)) - .size({ width: this.mConfig.iconWidth, height: this.mConfig.iconHeight}) + .backgroundColor(this.changeSwitch? this.style.iconOnBG: this.style.iconOffBG) + .clip(new Circle({ width: this.style.circleWidth, height: this.style.circleHeight })) + .width(this.style.circleWidth) + .height(this.style.circleHeight) + Flex() + .backgroundColor(this.mIconIsHover? this.style.hoverColor: this.style.transparentColor) + .clip(new Circle({ width: this.style.circleWidth, height: this.style.circleHeight })) + .width(this.style.circleWidth) + .height(this.style.circleHeight) + Image(this.changeSwitch == false ? (this.useIconStr ? this.iconOffStr : this.iconOff) : (this.useIconStr ? this.iconOnStr : this.iconOn)) + .size({ width: this.style.iconWidth, height: this.style.iconHeight }) .objectFit(ImageFit.Contain) - }.margin({ left: 10 }) + .fillColor(this.changeSwitch ? this.style.iconOnColor : this.style.iconOffColor) + .onHover((isHover) => { + this.mIconIsHover = isHover; + }) + } + .width(this.style.circleWidth) + .height(this.style.circleHeight) } - .flexShrink(0) } } diff --git a/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/template/iconTitleBase.ets index 77e79173..69385c69 100644 --- a/common/src/main/ets/template/iconTitleBase.ets +++ b/common/src/main/ets/template/iconTitleBase.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,11 +13,11 @@ * limitations under the License. */ -import UniformConfig from './UniformConfig.ets' -import Log from '../default/Log.ets'; -import iconComponent from './iconComponent.ets' +import Log from '../default/Log'; +import StyleConfiguration from './common/StyleConfiguration' +import iconComponent from './iconComponent' -const TAG= 'iconTitleBase.ets' +const TAG= 'iconTitleBase' @Component export default @@ -31,11 +31,14 @@ struct iconBaseComponent { @State mTitleStr: string = "" private useIconStr = false private useTitleStr = false - private mConfig = UniformConfig.config; private mClickEvent: Function private mLongClickEvent: Function + @State mTextIsHover: boolean = false + @Link changeSwitch: boolean + @State style: any = StyleConfiguration.getIconTitleBaseStyle() + aboutToAppear() { Log.showInfo(TAG,'aboutToAppear') } @@ -45,44 +48,57 @@ struct iconBaseComponent { } build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - iconComponent({ - useIconStr: this.useIconStr, - iconOff: this.iconOff, - iconOn: this.iconOn, - iconOffStr: this.iconOffStr, - iconOnStr: this.iconOnStr, - changeSwitch: $changeSwitch, + Row() { + Column().width(this.style.marginLeft).height('100%').layoutWeight(0) + Row() { + Row() { + iconComponent({ + useIconStr: this.useIconStr, + iconOff: this.iconOff, + iconOn: this.iconOn, + iconOffStr: this.iconOffStr, + iconOnStr: this.iconOnStr, + changeSwitch: $changeSwitch, + }) + } + .onClick(() => { + console.log(`start clickEvent ${this.changeSwitch}`) + if (this.mClickEvent) { + this.mClickEvent() + } + console.log(`end clickEvent ${this.changeSwitch}`) }) } - .flexShrink(0) .height('100%') - .onClick(() => { - console.log(`start clickEvent ${this.changeSwitch}`) - if(this.mClickEvent){ - this.mClickEvent() + .layoutWeight(0) + Column().width(this.style.componentGap).height('100%').layoutWeight(0) + Row(){ + Row() { + Column().width(this.style.textMargin).height('100%').layoutWeight(0) + Text(this.useTitleStr ? this.mTitleStr : this.mTitle) + .fontSize(this.style.titleSize) + .fontColor(this.style.titleColor) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .maxLines(2) + .layoutWeight(1) + .onHover((isHover) => { + this.mTextIsHover = isHover; + }) + Column().width(this.style.textMargin).height('100%').layoutWeight(0) } - console.log(`end clickEvent ${this.changeSwitch}`) - }) - .gesture(LongPressGesture({ repeat: false }).onAction(()=>{ - console.log(`start longClickEvent ${this.changeSwitch}`) - if(this.mLongClickEvent){ - this.mLongClickEvent() - } - console.log(`end longClickEvent ${this.changeSwitch}`) - })) - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Center }) { - Text(this.useTitleStr ? this.mTitleStr : this.mTitle) - .fontSize(this.mConfig.titleSize) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .maxLines(2) - .margin({ left: 10, right: 10 }) - } - .height('100%') + .width('100%') + .height(this.style.textHoverHeight) + .width(this.style.textHoverWidth) + .backgroundColor(this.mTextIsHover? this.style.hoverColor: this.style.transparentColor) + .borderRadius(this.style.textHoverRadius) + .clip(true) + }.height('100%') + .layoutWeight(1) + Column().width(this.style.marginRight).height('100%').layoutWeight(0) } - .borderRadius(this.mConfig.baseBorderRadius) - .backgroundColor(this.mConfig.baseColor) + .borderRadius(this.style.borderRadius) + .clip(true) + .backgroundColor(this.style.backgroundColor) .height('100%') .width('100%') } diff --git a/doc/Instructions.md b/doc/Instructions.md index a5a15616..9ad3abb5 100644 --- a/doc/Instructions.md +++ b/doc/Instructions.md @@ -17,7 +17,7 @@ ``` ### 环境搭建 -打开DevEco Studio链接下载安装,安装步骤及安装说明详见开发者网站 +打开DevEco Studio链接下载安装,安装步骤及安装说明详见下载地址([下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download)) ## 基础开发说明 ### 系统接口调用 diff --git a/entry/.gitignore b/entry/pc/.gitignore old mode 100755 new mode 100644 similarity index 100% rename from entry/.gitignore rename to entry/pc/.gitignore diff --git a/entry/build.gradle b/entry/pc/build.gradle old mode 100755 new mode 100644 similarity index 100% rename from entry/build.gradle rename to entry/pc/build.gradle diff --git a/entry/package.json b/entry/pc/package.json old mode 100755 new mode 100644 similarity index 100% rename from entry/package.json rename to entry/pc/package.json diff --git a/entry/pc/src/main/config.json b/entry/pc/src/main/config.json new file mode 100644 index 00000000..25c8b944 --- /dev/null +++ b/entry/pc/src/main/config.json @@ -0,0 +1,91 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "singleton": true + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui", + "name": ".MyApplication", + "deviceType": [ + "tablet" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "pc_entry", + "moduleType": "entry" + }, + "abilities": [ + { + "visible": true, + "srcPath": "ServiceExtAbility", + "name": ".ServiceExtAbility", + "icon": "$media:icon", + "srcLanguage": "ets", + "description": "$string:description_mainability", + "label": "$string:app_name", + "type": "service" + } + ], + "js": [ + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "name": "ServiceExtAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + }, + "pages": ["pages/index"] + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED" + }, + { + "name": "ohos.permission.MANAGE_LOCAL_ACCOUNTS" + }, + { + "name": "ohos.permission.INTERACT_ACROSS_LOCAL_ACCOUNTS_EXTENSION" + }, + { + "name": "ohos.permission.NOTIFICATION_CONTROLLER" + }, + { + "name": "ohos.permission.GET_WIFI_INFO" + }, + { + "name": "ohos.permission.SET_WIFI_INFO" + }, + { + "name": "ohos.permission.MANAGE_WIFI_CONNECTION" + }, + { + "name": "ohos.permission.GET_NETWORK_INFO" + }, + { + "name": "ohos.permission.USE_BLUETOOTH" + }, + { + "name": "ohos.permission.DISCOVER_BLUETOOTH" + }, + { + "name": "ohos.permission.MANAGE_BLUETOOTH" + }, + { + "name": "ohos.permission.CAPTURE_SCREEN" + }, + { + "name": "ohos.permission.MANAGE_SECURE_SETTINGS" + } + ] + } +} \ No newline at end of file diff --git a/entry/pc/src/main/ets/AbilityStage.ts b/entry/pc/src/main/ets/AbilityStage.ts new file mode 100644 index 00000000..288fb504 --- /dev/null +++ b/entry/pc/src/main/ets/AbilityStage.ts @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import AbilityStage from "@ohos.application.AbilityStage" +import Log from '../../../../../common/src/main/ets/default/Log' + +const TAG = "SystemUI_AbilityStage" + +export default class MainAbilityStage extends AbilityStage { + onCreate() { + Log.showInfo(TAG, "onCreate") + } +} \ No newline at end of file diff --git a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts new file mode 100644 index 00000000..b9b90861 --- /dev/null +++ b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2021-2022 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 ServiceExtension from '@ohos.application.ServiceExtensionAbility' +import Log from '../../../../../../common/src/main/ets/default/Log' +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import initSystemUi from '../../../../../../common/src/main/ets/default/InitSystemUi' + +const TAG = "SystemUI_ServiceExtAbility" + +var statusBarWant = { + "bundleName": "com.ohos.systemui", + "abilityName": "com.ohos.systemui.statusbar.ServiceExtAbility" +} + +var navigationBarWant = { + "bundleName": "com.ohos.systemui", + "abilityName": "com.ohos.systemui.navigationbar.ServiceExtAbility" +} + +var volumePanelWant = { + "bundleName": "com.ohos.systemui", + "abilityName": "com.ohos.systemui.volumepanel.ServiceExtAbility" +} + +var controlPanelWant = { + "bundleName": "com.ohos.systemui", + "abilityName": "com.ohos.systemui.controlpanel.ServiceExtAbility" +} + +var notificationPanelWant = { + "bundleName": "com.ohos.systemui", + "abilityName": "com.ohos.systemui.notificationpanel.ServiceExtAbility" +} + +class ServiceExtAbility extends ServiceExtension { + onCreate(want) { + Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`) + initSystemUi(this.context); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) + AbilityManager.startAbility(statusBarWant) + AbilityManager.startAbility(navigationBarWant) + AbilityManager.startAbility(volumePanelWant) + AbilityManager.startAbility(controlPanelWant) + AbilityManager.startAbility(notificationPanelWant) + } + + onDestroy() { + Log.showInfo(TAG, 'api8New onDestroy') + } +} + +export default ServiceExtAbility \ No newline at end of file diff --git a/entry/src/main/ets/default/app.ets b/entry/pc/src/main/ets/ServiceExtAbility/app.ets similarity index 100% rename from entry/src/main/ets/default/app.ets rename to entry/pc/src/main/ets/ServiceExtAbility/app.ets diff --git a/entry/src/main/ets/default/pages/index.ets b/entry/pc/src/main/ets/ServiceExtAbility/pages/index.ets similarity index 93% rename from entry/src/main/ets/default/pages/index.ets rename to entry/pc/src/main/ets/ServiceExtAbility/pages/index.ets index 936ef95d..d2ddea6c 100644 --- a/entry/src/main/ets/default/pages/index.ets +++ b/entry/pc/src/main/ets/ServiceExtAbility/pages/index.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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/entry/pc/src/main/resources/base/element/string.json b/entry/pc/src/main/resources/base/element/string.json new file mode 100644 index 00000000..c962e718 --- /dev/null +++ b/entry/pc/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "app_name", + "value": "SystemUI" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "description_mainability", + "value": "SystemUI ServiceExtension" + } + ] +} \ No newline at end of file diff --git a/entry/src/main/resources/base/media/icon.png b/entry/pc/src/main/resources/base/media/icon.png similarity index 100% rename from entry/src/main/resources/base/media/icon.png rename to entry/pc/src/main/resources/base/media/icon.png diff --git a/entry/phone/.gitignore b/entry/phone/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/entry/phone/.gitignore @@ -0,0 +1 @@ +/build diff --git a/product/navigationBar/build.gradle b/entry/phone/build.gradle similarity index 82% rename from product/navigationBar/build.gradle rename to entry/phone/build.gradle index 38239b95..b3f8b49d 100644 --- a/product/navigationBar/build.gradle +++ b/entry/phone/build.gradle @@ -4,11 +4,9 @@ ohos { defaultConfig { compatibleSdkVersion rootProject.ext.version.compatibleSdk } - entryModules "entry" } dependencies { - entryImplementation project(':entry') implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) testCompile 'junit:junit:4.12' } diff --git a/product/navigationBar/package.json b/entry/phone/package.json similarity index 100% rename from product/navigationBar/package.json rename to entry/phone/package.json diff --git a/entry/phone/src/main/config.json b/entry/phone/src/main/config.json new file mode 100644 index 00000000..daa15157 --- /dev/null +++ b/entry/phone/src/main/config.json @@ -0,0 +1,88 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "singleton": true + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "phone_entry", + "moduleType": "entry" + }, + "abilities": [ + { + "visible": true, + "srcPath": "ServiceExtAbility", + "name": ".ServiceExtAbility", + "icon": "$media:icon", + "srcLanguage": "ets", + "description": "$string:description_mainability", + "label": "$string:app_name", + "type": "service" + } + ], + "js": [ + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "name": "ServiceExtAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + }, + "pages": ["pages/index"] + } + ], + "reqPermissions": [ + { + "name": "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED" + }, + { + "name": "ohos.permission.MANAGE_LOCAL_ACCOUNTS" + }, + { + "name": "ohos.permission.INTERACT_ACROSS_LOCAL_ACCOUNTS_EXTENSION" + }, + { + "name": "ohos.permission.NOTIFICATION_CONTROLLER" + }, + { + "name": "ohos.permission.GET_WIFI_INFO" + }, + { + "name": "ohos.permission.SET_WIFI_INFO" + }, + { + "name": "ohos.permission.MANAGE_WIFI_CONNECTION" + }, + { + "name": "ohos.permission.USE_BLUETOOTH" + }, + { + "name": "ohos.permission.DISCOVER_BLUETOOTH" + }, + { + "name": "ohos.permission.MANAGE_BLUETOOTH" + }, + { + "name": "ohos.permission.CAPTURE_SCREEN" + }, + { + "name": "ohos.permission.MANAGE_SECURE_SETTINGS" + } + ] + } +} \ No newline at end of file diff --git a/entry/phone/src/main/ets/AbilityStage.ts b/entry/phone/src/main/ets/AbilityStage.ts new file mode 100644 index 00000000..288fb504 --- /dev/null +++ b/entry/phone/src/main/ets/AbilityStage.ts @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import AbilityStage from "@ohos.application.AbilityStage" +import Log from '../../../../../common/src/main/ets/default/Log' + +const TAG = "SystemUI_AbilityStage" + +export default class MainAbilityStage extends AbilityStage { + onCreate() { + Log.showInfo(TAG, "onCreate") + } +} \ No newline at end of file diff --git a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts new file mode 100644 index 00000000..38ddf9ec --- /dev/null +++ b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2021-2022 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 ServiceExtension from '@ohos.application.ServiceExtensionAbility' +import Log from '../../../../../../common/src/main/ets/default/Log' +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import initSystemUi from '../../../../../../common/src/main/ets/default/InitSystemUi' + +const TAG = "SystemUI_ServiceExtAbility" + +var statusBarWant = { + "bundleName": "com.ohos.systemui", + "abilityName": "com.ohos.systemui.statusbar.ServiceExtAbility" +} + +var navigationBarWant = { + "bundleName": "com.ohos.systemui", + "abilityName": "com.ohos.systemui.navigationbar.ServiceExtAbility" +} + +var volumePanelWant = { + "bundleName": "com.ohos.systemui", + "abilityName": "com.ohos.systemui.volumepanel.ServiceExtAbility" +} + +var dropdownPanelWant = { + "bundleName": "com.ohos.systemui", + "abilityName": "com.ohos.systemui.dropdownpanel.ServiceExtAbility" +} + +class ServiceExtAbility extends ServiceExtension { + onCreate(want) { + Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`) + initSystemUi(this.context) + AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) + AbilityManager.startAbility(statusBarWant) + AbilityManager.startAbility(navigationBarWant) + AbilityManager.startAbility(volumePanelWant) + AbilityManager.startAbility(dropdownPanelWant) + } + + onDestroy() { + Log.showInfo(TAG, 'api8New onDestroy') + } +} + +export default ServiceExtAbility \ No newline at end of file diff --git a/common/src/main/ets/default/DateAndTimeUtil.ets b/entry/phone/src/main/ets/ServiceExtAbility/app.ets similarity index 67% rename from common/src/main/ets/default/DateAndTimeUtil.ets rename to entry/phone/src/main/ets/ServiceExtAbility/app.ets index d0392fa1..e105593e 100644 --- a/common/src/main/ets/default/DateAndTimeUtil.ets +++ b/entry/phone/src/main/ets/ServiceExtAbility/app.ets @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2021 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. @@ -13,16 +13,12 @@ * limitations under the License. */ -export class DateAndTimeUtil { - concatTime(hours, minutes) { - return `${this.fill(hours)}:${this.fill(minutes)}`; - }; - fill(value) { - return (value > 9 ? "" : "0") + value; - }; +export default { + onCreate() { + console.info('SystemUI entry Application onDestroy') + }, + onDestroy() { + console.info('SystemUI entry Application onDestroy') + }, } - -let dateAndTimeUtil = new DateAndTimeUtil(); - -export default dateAndTimeUtil as DateAndTimeUtil diff --git a/entry/phone/src/main/ets/ServiceExtAbility/pages/index.ets b/entry/phone/src/main/ets/ServiceExtAbility/pages/index.ets new file mode 100644 index 00000000..d2ddea6c --- /dev/null +++ b/entry/phone/src/main/ets/ServiceExtAbility/pages/index.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021-2022 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. + */ + +@Entry +@Component +struct Index { + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + + } + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/entry/phone/src/main/resources/base/element/string.json b/entry/phone/src/main/resources/base/element/string.json new file mode 100644 index 00000000..c962e718 --- /dev/null +++ b/entry/phone/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "app_name", + "value": "SystemUI" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "description_mainability", + "value": "SystemUI ServiceExtension" + } + ] +} \ No newline at end of file diff --git a/product/navigationBar/src/main/resources/base/media/icon.png b/entry/phone/src/main/resources/base/media/icon.png similarity index 100% rename from product/navigationBar/src/main/resources/base/media/icon.png rename to entry/phone/src/main/resources/base/media/icon.png diff --git a/infra/config_exts.gradle b/infra/config_exts.gradle index f84c6933..eb7b7f5e 100644 --- a/infra/config_exts.gradle +++ b/infra/config_exts.gradle @@ -1,6 +1,6 @@ ext { version = [ compileSdk: 8, - compatibleSdk: 4 + compatibleSdk: 8 ] } \ No newline at end of file diff --git a/product/navigationBar/.gitignore b/product/default/navigationBar/.gitignore similarity index 100% rename from product/navigationBar/.gitignore rename to product/default/navigationBar/.gitignore diff --git a/product/default/navigationBar/build.gradle b/product/default/navigationBar/build.gradle new file mode 100644 index 00000000..9ca65e26 --- /dev/null +++ b/product/default/navigationBar/build.gradle @@ -0,0 +1,16 @@ +apply plugin: 'com.huawei.ohos.hap' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + entryModules "phone_entry,pc_entry" +} + +dependencies { + entryImplementation project(':phone_entry') + entryImplementation project(':pc_entry') + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + testCompile 'junit:junit:4.12' + implementation project(':features:navigationservice') +} diff --git a/product/notificationmanagement/package.json b/product/default/navigationBar/package.json similarity index 100% rename from product/notificationmanagement/package.json rename to product/default/navigationBar/package.json diff --git a/product/navigationBar/src/main/config.json b/product/default/navigationBar/src/main/config.json similarity index 75% rename from product/navigationBar/src/main/config.json rename to product/default/navigationBar/src/main/config.json index 06021a60..21b0b03b 100644 --- a/product/navigationBar/src/main/config.json +++ b/product/default/navigationBar/src/main/config.json @@ -5,30 +5,31 @@ "version": { "code": 1, "name": "1.0" - } + }, + "singleton": true }, "deviceConfig": {}, "module": { "package": "com.ohos.systemui.navigationbar", "name": ".MyApplication", "deviceType": [ - "phone" + "phone", "tablet" ], "distro": { "deliveryWithInstall": true, - "moduleName": "navigationBar", + "moduleName": "default_navigationBar", "moduleType": "feature" }, "abilities": [ { "visible": true, - "name": "com.ohos.systemui.navigationbar.MainAbility", + "name": "com.ohos.systemui.navigationbar.ServiceExtAbility", "icon": "$media:icon", "description": "$string:mainability_description", "label": "$string:app_name", - "type": "page", + "type": "service", "launchType": "singleton", - "srcPath": "default", + "srcPath": "ServiceExtAbility", "srcLanguage": "ets" } ], @@ -40,13 +41,12 @@ "pages": [ "pages/index" ], - "name": "default", + "name": "ServiceExtAbility", "window": { "designWidth": 720, "autoDesignWidth": false } } - ], - "srcPath": "default" + ] } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/AbilityStage.ts b/product/default/navigationBar/src/main/ets/AbilityStage.ts new file mode 100644 index 00000000..e89d59b8 --- /dev/null +++ b/product/default/navigationBar/src/main/ets/AbilityStage.ts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import AbilityStage from "@ohos.application.AbilityStage" +import Log from '../../../../../../common/src/main/ets/default/Log' + +const TAG = "NavigationBar_AbilityStage" +export default class MainAbilityStage extends AbilityStage { + onCreate() { + Log.showInfo(TAG, "onCreate") + } +} \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts new file mode 100644 index 00000000..1aba4bcc --- /dev/null +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2021-2022 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 ServiceExtension from '@ohos.application.ServiceExtensionAbility' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import NavBarConfiguration from './common/NavBarConfiguration' + +const TAG = "NavigationBar_ServiceExtAbility" + +class ServiceExtAbility extends ServiceExtension { + async onCreate(want) { + Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, this.context) + + let configInfo = await NavBarConfiguration.getConfiguration(); + if (configInfo.showNavHorizontal) { + if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode + configInfo.realHeight = 44 * configInfo.maxWidth / 1280 + } else { // Phone Mode + configInfo.realHeight = 36 * configInfo.maxWidth / 360 + } + configInfo.minHeight = configInfo.realHeight + if (configInfo.yCoordinate > 0) { + configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight + } + } else { + if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode + configInfo.realWidth = 44 * configInfo.maxWidth / 1280 + } else { // Phone Mode + configInfo.realWidth = 36 * configInfo.maxWidth / 360 + } + configInfo.minHeight = configInfo.realWidth + if (configInfo.xCoordinate > 0) { + configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth + } + } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config', configInfo) + Log.showInfo(TAG, `api8New onCreate, configInfo: ${JSON.stringify(configInfo)}`) + + let navigationBarRect = { + left: configInfo.xCoordinate, + top: configInfo.yCoordinate, + width: configInfo.realWidth, + height: configInfo.realHeight + } + WindowManager.createWindow(this.context, WindowType.NAVIGATION_BAR, navigationBarRect, "pages/index") + .then(() => { + Log.showInfo(TAG, `api8New onCreate, createWindow success.`); + WindowManager.showWindow(WindowType.NAVIGATION_BAR); + }) + .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); + } + + onDestroy() { + Log.showInfo(TAG, 'api8New onDestroy'); + } +} + +export default ServiceExtAbility \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/app.ets b/product/default/navigationBar/src/main/ets/ServiceExtAbility/app.ets similarity index 52% rename from product/statusbar/src/main/ets/default/app.ets rename to product/default/navigationBar/src/main/ets/ServiceExtAbility/app.ets index 070c7f9a..72ec8953 100644 --- a/product/statusbar/src/main/ets/default/app.ets +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/app.ets @@ -12,19 +12,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import WindowManager from '../../../../../../common/src/main/ets/default/WindowManager.ets' -import StatusBarConfiguration from '../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets'; + +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import configManager from '../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager' + +let mConfigManager = configManager export default { async onCreate() { - console.info('SystemUI statusBar Application onCreate') - let val = await StatusBarConfiguration.getConfiguration(); - let mWindowManager = new WindowManager(); - await mWindowManager.initWindowManager(); - await mWindowManager.initWindowMin(val.realWidth, val.realHeight, val.xCoordinate, val.yCoordinate) - + console.info('SystemUI navigationBar Application onCreate') + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config') + AppStorage.SetAndLink("showNavHorizontal", configInfo.showNavHorizontal) + mConfigManager.initConfig() }, onDestroy() { - console.info('SystemUI statusBar Application onDestroy') + console.info('SystemUI navigationBar Application onDestroy') }, -} +} \ No newline at end of file diff --git a/product/navigationBar/src/main/ets/default/common/NavBarConfiguration.ets b/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/NavBarConfiguration.ts similarity index 88% rename from product/navigationBar/src/main/ets/default/common/NavBarConfiguration.ets rename to product/default/navigationBar/src/main/ets/ServiceExtAbility/common/NavBarConfiguration.ts index 38e9bd2d..53cad273 100644 --- a/product/navigationBar/src/main/ets/default/common/NavBarConfiguration.ets +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/NavBarConfiguration.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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,8 +14,8 @@ */ import display from '@ohos.display'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil.ets'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil'; const TAG = 'NavBarConfiguration'; var directionNav; @@ -46,13 +46,14 @@ enum Position { class NavBarConfiguration { async initNavBarConfiguration() { Log.showInfo(TAG, 'initNavBarConfiguration'); - minHeight = AppStorage.SetAndLink("minNavHeight", 0); + minHeight = 0; await display.getDefaultDisplay() .then(dis => { + Log.showInfo(TAG, `initNavBarConfiguration dis ${JSON.stringify(dis)}`); maxWidth = dis.width; maxHeight = dis.height; - Log.showInfo(TAG, `initNavBarConfiguration maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight.get()}`); + Log.showInfo(TAG, `initNavBarConfiguration maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); }) } @@ -94,9 +95,10 @@ class NavBarConfiguration { await this.getDirectionAndPosition(); + let showNavHorizontal = false; if (navbarPosition == Position.TOP_POSITION || navbarPosition == Position.BOTTOM_POSITION) { - AppStorage.Set("showNavHorizontal", true); - minHeight.set(parseInt(navShortSideLength)); + showNavHorizontal = true; + minHeight = parseInt(navShortSideLength); Log.showInfo(TAG, 'TOP_POSITION = ' + 2); if (statusbarPosition == Position.LEFT_POSITION || statusbarPosition == Position.RIGHT_POSITION) { realWidth = parseInt(maxWidth) - parseInt(statusShortSideLength); @@ -117,8 +119,8 @@ class NavBarConfiguration { Log.showInfo(TAG, 'BOTTOM_POSITION = ' + yCoordinate); } } else if (navbarPosition == Position.LEFT_POSITION || navbarPosition == Position.RIGHT_POSITION) { - AppStorage.Set("showNavHorizontal", false); - minHeight.set(parseInt(navShortSideLength)); + showNavHorizontal = false; + minHeight = parseInt(navShortSideLength); if (statusbarPosition == Position.TOP_POSITION || statusbarPosition == Position.BOTTOM_POSITION) { realHeight = parseInt(maxHeight) - parseInt(statusShortSideLength); } else { @@ -140,6 +142,10 @@ class NavBarConfiguration { Log.showInfo(TAG, `initWindowManager xCoordinate ${xCoordinate} yCoordinate ${yCoordinate}`); Log.showInfo(TAG, `initWindowManager realWidth ${realWidth} realHeight ${realHeight}`); var configuration = { + maxWidth: maxWidth, + maxHeight: maxHeight, + minHeight: minHeight, + showNavHorizontal: showNavHorizontal, realWidth: realWidth, realHeight: realHeight, xCoordinate: xCoordinate, diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts new file mode 100644 index 00000000..5156bc40 --- /dev/null +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; + +const TAG = 'NavigationBar-StyleConfiguration'; + +export default class StyleConfiguration { + static getKeyButtonStyle() { + const key: string = TAG + "-KeyButton"; + return StyleManager.getStyle(key, () => { + return { + buttonWidth: $r('app.float.navigation_bar_button_width'), + buttonHeight: $r('app.float.navigation_bar_button_height'), + buttonBorderRadius: $r('app.float.navigation_bar_button_radius'), + buttonIconWidth: $r('app.float.navigation_bar_button_icon_width'), + buttonIconHeight: $r('app.float.navigation_bar_button_icon_height'), + }; + }); + } +} \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleManager.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleManager.ts new file mode 100644 index 00000000..4782e759 --- /dev/null +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleManager.ts @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import StyleConfiguration from './StyleConfiguration' + +const TAG = 'StatusBar-StyleManager'; + +export default class StyleManager { + static PAD_STANDARD_DISPLAY_WIDTH: number = 1280; + static PAD_STANDARD_DISPLAY_HEIGHT: number = 800; + static PHONE_STANDARD_DISPLAY_WIDTH: number = 720; + static PHONE_STANDARD_DISPLAY_HEIGHT: number = 1280; + static maxWidth: number = StyleManager.PAD_STANDARD_DISPLAY_WIDTH; + static rumMode: string = 'pad'; + + static setPadStyle() { + Log.showInfo(TAG, `setPadStyle`) + + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); + StyleManager.maxWidth = config.maxWidth; + StyleManager.rumMode = 'pad' + + // keyButton + { + let style: any = StyleConfiguration.getKeyButtonStyle(); + style.buttonWidth = StyleManager.calcScaleSizePx(88); + style.buttonHeight = StyleManager.calcScaleSizePx(44); + style.buttonBorderRadius = StyleManager.calcScaleSizePx(22); + style.buttonIconWidth = StyleManager.calcScaleSizePx(15); + style.buttonIconHeight = StyleManager.calcScaleSizePx(15); + } + } + + static setPhoneStyle() { + Log.showInfo(TAG, `setPhoneStyle`) + + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); + StyleManager.maxWidth = config.maxWidth; + StyleManager.rumMode = 'phone' + + // keyButton + { + let style: any = StyleConfiguration.getKeyButtonStyle(); + style.buttonWidth = StyleManager.calcScaleSizePx(144); + style.buttonHeight = StyleManager.calcScaleSizePx(72); + style.buttonBorderRadius = StyleManager.calcScaleSizePx(36); + style.buttonIconWidth = StyleManager.calcScaleSizePx(24); + style.buttonIconHeight = StyleManager.calcScaleSizePx(24); + } + } + + static number2px(n: number): string { + return n.toString() + 'px'; + } + + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / (StyleManager.rumMode == 'pad' ? StyleManager.PAD_STANDARD_DISPLAY_WIDTH : StyleManager.PHONE_STANDARD_DISPLAY_WIDTH); + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/navigationBar/src/main/ets/default/common/constants.ets b/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/constants.ts similarity index 81% rename from product/navigationBar/src/main/ets/default/common/constants.ets rename to product/default/navigationBar/src/main/ets/ServiceExtAbility/common/constants.ts index 8bb0f4e0..833cea42 100644 --- a/product/navigationBar/src/main/ets/default/common/constants.ets +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/constants.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -24,7 +24,10 @@ class Constants{ static THREE_TEMPLATE: string = '1fr 1fr 1fr'; static ONE_ICON_LAYOUT: number = 1; static THREE_ICON_LAYOUT: number = 3; - static IMAGE_WIDTH: number = 32; - static IMAGE_HEIGHT: number = 32; - static BUTTON_WIDTH: number = 100; -} \ No newline at end of file +} + +export class NavigationBarComponentData { + isEnable: boolean = true; + backgroundColor: string = "#00000000"; + contentColor: string = "#FFFFFFFF"; +} diff --git a/product/navigationBar/src/main/ets/default/common/utils/configReader.ets b/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/utils/configReader.ts similarity index 89% rename from product/navigationBar/src/main/ets/default/common/utils/configReader.ets rename to product/default/navigationBar/src/main/ets/ServiceExtAbility/common/utils/configReader.ts index 278d85df..c230742d 100644 --- a/product/navigationBar/src/main/ets/default/common/utils/configReader.ets +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/utils/configReader.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,10 +13,10 @@ * limitations under the License. */ import Fileio from '@ohos.fileio'; -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log' const DEFAULT_LAYOUT_INFO_FILE_PATH = "/data/accounts/account_0/applications/com.ohos.systemui/" + - "com.ohos.systemui.navigationbar/assets/navigationBar/resources/rawfile/navigationBarLayoutConfig.json"; + "com.ohos.systemui.navigationbar/assets/default_navigationBar/resources/rawfile/navigationBarLayoutConfig.json"; const READ_DATA_SIZE = 4096; const TAG = "ConfigReader"; diff --git a/product/navigationBar/src/main/ets/default/i18n/en-US.json b/product/default/navigationBar/src/main/ets/ServiceExtAbility/i18n/en-US.json similarity index 100% rename from product/navigationBar/src/main/ets/default/i18n/en-US.json rename to product/default/navigationBar/src/main/ets/ServiceExtAbility/i18n/en-US.json diff --git a/product/navigationBar/src/main/ets/default/i18n/zh-CN.json b/product/default/navigationBar/src/main/ets/ServiceExtAbility/i18n/zh-CN.json similarity index 100% rename from product/navigationBar/src/main/ets/default/i18n/zh-CN.json rename to product/default/navigationBar/src/main/ets/ServiceExtAbility/i18n/zh-CN.json diff --git a/product/navigationBar/src/main/ets/default/pages/index.ets b/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/index.ets similarity index 50% rename from product/navigationBar/src/main/ets/default/pages/index.ets rename to product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/index.ets index 0feb07bc..c53ccd38 100644 --- a/product/navigationBar/src/main/ets/default/pages/index.ets +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/index.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,13 +13,16 @@ * limitations under the License. */ -import Three from './threeLayout.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets'; +import Three from './threeLayout' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' +import NavigationBarViewModel from '../viewmodel/NavigationBarViewModel'; +import {NavigationBarComponentData} from '../common/constants' +import StyleManager from '../common/StyleManager' const STORAGE_NAVIGATION_TYPE = 'navigationType' -let mHeightConfigUtils; const TAG = 'NavigationBar-Index'; @Entry @@ -28,6 +31,7 @@ struct Index { @StorageLink('navigationLayoutConfig') mConfig: any = {} @StorageLink('minNavHeight') minNavHeight: number = 32 @StorageLink("showNavHorizontal") showNavHorizontal: boolean = true + @State mNavigationBarComponentData: NavigationBarComponentData = new NavigationBarComponentData() onBackPress(): boolean { @@ -36,12 +40,24 @@ struct Index { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) - let NavCoefficient = AppStorage.SetAndLink("NavCoefficient", 1.0); - NavCoefficient.set(mHeightConfigUtils.getNavHCoefficient()); + + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config') + if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode + StyleManager.setPadStyle() + } else { // Phone Mode + StyleManager.setPhoneStyle() + } + + let navigationBarViewModelInstance = NavigationBarViewModel.getInstance(); + navigationBarViewModelInstance.install(); + this.mNavigationBarComponentData = navigationBarViewModelInstance.getNavigationBarComponentData(); } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisAppear`) + NavigationBarViewModel.getInstance().uninstall() } build() { @@ -51,7 +67,7 @@ struct Index { .width('100%') .height('100%') .constraintSize({ minHeight: this.minNavHeight + 'px'}) - .backgroundColor($r('app.color.index_background')) + .backgroundColor(this.mNavigationBarComponentData.backgroundColor) .padding(this.showNavHorizontal ? { left: '18%', right: '18%' } : { top: '18%', bottom: '18%' }) } } diff --git a/product/navigationBar/src/main/ets/default/pages/keyButton.ets b/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/keyButton.ets similarity index 61% rename from product/navigationBar/src/main/ets/default/pages/keyButton.ets rename to product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/keyButton.ets index 5b221f2b..6629e4b0 100644 --- a/product/navigationBar/src/main/ets/default/pages/keyButton.ets +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/keyButton.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,10 +13,12 @@ * limitations under the License. */ -import keyCodeEvent from '../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import Constants from '../common/constants.ets' - +import keyCodeEvent from '../../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import Constants from '../common/constants' +import StyleConfiguration from '../common/StyleConfiguration' +import NavigationBarViewModel from '../viewmodel/NavigationBarViewModel'; +import {NavigationBarComponentData} from '../common/constants' const TAG = 'NavigationBar-KeyButton'; @@ -26,8 +28,10 @@ export default struct keyButton { private uri: any; @Prop keyCode: number; @State backGroundColor: any = $r('app.color.button_default_background'); - @StorageLink('NavCoefficient') NavCoefficient:number = 1.0 @StorageLink("showNavHorizontal") showNavHorizontal: boolean = AppStorage.SetAndLink("showNavHorizontal", true).get(); + @State mNavigationBarComponentData: NavigationBarComponentData = NavigationBarViewModel.getInstance() + .getNavigationBarComponentData() + @State style: any = StyleConfiguration.getKeyButtonStyle() aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) @@ -40,17 +44,21 @@ export default struct keyButton { build() { Stack({ alignContent: Alignment.Center }) { Flex() {} - .borderRadius($r('app.float.button_radius')) + .borderRadius(this.style.buttonBorderRadius) .width('100%') .height('100%') .backgroundColor(this.backGroundColor) Image(this.uri) .objectFit(ImageFit.Contain) - .size({ width: Constants.IMAGE_WIDTH*this.NavCoefficient, height:Constants.IMAGE_HEIGHT*this.NavCoefficient }) + .size({ + width: this.style.buttonIconWidth, + height: this.style.buttonIconHeight + }) + .fillColor(this.mNavigationBarComponentData.contentColor) } .onTouch(this.onKeyTouch.bind(this)) - .width(this.showNavHorizontal ? Constants.BUTTON_WIDTH*this.NavCoefficient : '100%') - .height(this.showNavHorizontal ? '100%' : Constants.BUTTON_WIDTH*this.NavCoefficient ) + .width(this.showNavHorizontal ? this.style.buttonWidth : this.style.buttonHeight) + .height(this.showNavHorizontal ? this.style.buttonHeight : this.style.buttonWidth) } private onKeyTouch(event:TouchEvent) { diff --git a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets b/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/oneLayout.ets similarity index 83% rename from product/navigationBar/src/main/ets/default/pages/oneLayout.ets rename to product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/oneLayout.ets index 20b0a02d..0909c6e9 100644 --- a/product/navigationBar/src/main/ets/default/pages/oneLayout.ets +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/oneLayout.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,14 +13,14 @@ * limitations under the License. */ -import keyButton from './keyButton.ets'; -import Constants from '../common/constants.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import keyButton from './keyButton'; +import Constants from '../common/constants' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NavigationBar-OneLayout'; let KeyCodeArr: any[] = [ { - "uri": $r('app.media.ic_navigation_home'), + "uri": $r('app.media.ic_systemui_home'), "keyCode": Constants.KEYCODE_HOME }]; diff --git a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets b/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/threeLayout.ets similarity index 76% rename from product/navigationBar/src/main/ets/default/pages/threeLayout.ets rename to product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/threeLayout.ets index 9027e19f..4af6d62f 100644 --- a/product/navigationBar/src/main/ets/default/pages/threeLayout.ets +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/threeLayout.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,22 +13,22 @@ * limitations under the License. */ -import keyButton from './keyButton.ets'; -import Constants from '../common/constants.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import keyButton from './keyButton'; +import Constants from '../common/constants' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NavigationBar-ThreeLayout'; let KeyCodeArr: any[] = [ { - "uri": $r('app.media.ic_navigation_back'), + "uri": $r('app.media.ic_systemui_back'), "keyCode": Constants.KEYCODE_BACK }, { - "uri": $r('app.media.ic_navigation_home'), + "uri": $r('app.media.ic_systemui_home'), "keyCode": Constants.KEYCODE_HOME }, { - "uri": $r('app.media.ic_navigation_recent'), + "uri": $r('app.media.ic_systemui_recent'), "keyCode": Constants.KEYCODE_RECENT }]; @@ -50,7 +50,9 @@ struct threeLayout { Grid() { ForEach(KeyCodeArr, (item: any) => { GridItem() { - keyButton({ uri: item.uri, keyCode: item.keyCode }) + Row() { + keyButton({ uri: item.uri, keyCode: item.keyCode }) + }.height('100%') } .height('100%') .constraintSize({ minHeight: this.minNavHeight + 'px'}) @@ -64,7 +66,9 @@ struct threeLayout { Grid() { ForEach(KeyCodeArr, (item: any) => { GridItem() { - keyButton({ uri: item.uri, keyCode: item.keyCode }) + Column() { + keyButton({ uri: item.uri, keyCode: item.keyCode }) + }.width('100%') } .width('100%') .constraintSize({ minHeight: this.minNavHeight + 'px'}) diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/viewmodel/NavigationBarViewModel.ts new file mode 100644 index 00000000..6643e0c5 --- /dev/null +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/viewmodel/NavigationBarViewModel.ts @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import WindowManager, { WindowType } from '../../../../../../../../common/src/main/ets/default/WindowManager'; +import getSingleInstance from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import TintStateManager, {TintState, TintStateListener +} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import {NavigationBarComponentData} from '../common/constants'; +import featureAbility from '@ohos.ability.featureAbility'; +import settings from '@ohos.settings'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import CommonConstants from "../../../../../../../../common/src/main/ets/default/Constants"; + +const TAG = 'NavigationBarViewModel'; + +const NAVIGATION_BAE_VIEW_MODEL_KEY = 'AppStorage_NavigationBarViewModel'; + +const NavigationBarComponentDataKey = 'AppStorage_NavigationBarComponentData'; + +export default class NavigationBarViewModel { + private settingDataKey = 'settings.display.navigationbar_status'; + private urivar: string = null; + private helper: any = null; + private navigationBarStatusDefaultValue: string = '1'; + private isDisplay = true; + mNavigationBarComponentData?: NavigationBarComponentData = { + ...new NavigationBarComponentData() + }; + mUseCount?: number = 0; + + static getInstance(): NavigationBarViewModel { + return getSingleInstance(NavigationBarViewModel, NAVIGATION_BAE_VIEW_MODEL_KEY); + } + + constructor() { + this.mNavigationBarComponentData = + AppStorage.SetAndLink(NavigationBarComponentDataKey, this.mNavigationBarComponentData).get() + this.urivar = settings.getUriSync(this.settingDataKey); + this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), CommonConstants.URI_VAR); + this.initNavigationBarStatus(); + } + + install?() { + Log.showInfo(TAG, `install, useCount: ${this.mUseCount}`); + if (!this.mUseCount) { + TintStateManager.getInstance().registerListener('navigation', this as TintStateListener); + } + this.mUseCount++; + } + + uninstall?() { + Log.showInfo(TAG, `uninstall, useCount: ${this.mUseCount}`); + this.mUseCount--; + if (this.mUseCount) { + TintStateManager.getInstance().unregisterListener('navigation'); + } + } + + getNavigationBarComponentData?(): NavigationBarComponentData { + Log.showInfo(TAG, `getNavigationBarComponentData`) + return this.mNavigationBarComponentData; + } + + onTintStateChange?(tintState: TintState) { + Log.showInfo(TAG, `onTintStateChange, tintState: ${JSON.stringify(tintState)}`) + if (typeof (tintState.isEnable) == 'boolean') { + this.setWindowEnable(tintState.isEnable); + } + if (tintState.backgroundColor) { + this.mNavigationBarComponentData.backgroundColor = tintState.backgroundColor; + } + if (tintState.contentColor) { + this.mNavigationBarComponentData.contentColor = tintState.contentColor; + } + Log.showInfo(TAG, `onTintStateChange, backgroundColor ${this.mNavigationBarComponentData.backgroundColor}`); + Log.showInfo(TAG, `onTintStateChange, contentColor ${this.mNavigationBarComponentData.contentColor}`); + } + + setWindowEnable?(isEnable: boolean) { + Log.showInfo(TAG, `setWindowEnable, isEnable ${isEnable}`); + if (this.mNavigationBarComponentData.isEnable == isEnable) { + return; + } + this.mNavigationBarComponentData.isEnable = isEnable; + if (isEnable && this.isDisplay) { + WindowManager.showWindow(WindowType.NAVIGATION_BAR); + } else { + WindowManager.hideWindow(WindowType.NAVIGATION_BAR); + } + } + + private setValue(value: string) { + settings.setValueSync(this.helper, this.settingDataKey, value); + } + + private getValue(defaultValue?: string) { + return settings.getValueSync( + this.helper, this.settingDataKey, defaultValue ? defaultValue : this.navigationBarStatusDefaultValue + ); + } + + private registerListenForDataChanges(callback) { + this.helper.on("dataChange", this.urivar, (data) => { + callback(data); + }) + } + + /** + * Initialize the NavigationBar status. + */ + public initNavigationBarStatus() { + try { + let initValue = this.getValue(); + Log.showInfo(TAG, `initNavigationBarStatus initValue ${initValue}`); + this.windowSwitches(initValue); + this.registerListenForDataChanges(this.dataChangesCallback.bind(this)); + } catch (e) { + Log.showInfo(TAG, `initNavigationBarStatus error: ${e.toString()}`); + } + } + + /** + * Get NavigationBar status data. + * @return + */ + public dataChangesCallback(data: any) { + if (data.code !== 0) { + Log.showInfo(TAG, `dataChangesCallback failed, because ${data.message}`); + return; + } else { + let getRetValue = this.getValue(); + Log.showInfo(TAG, `dataChangesCallback initValue ${getRetValue}`); + this.windowSwitches(getRetValue); + } + } + + private windowSwitches(navigationBarStatusValue) { + this.isDisplay = navigationBarStatusValue == '1' ? true : false; + if (!this.isDisplay) { + WindowManager.hideWindow(WindowType.NAVIGATION_BAR); + } else { + WindowManager.showWindow(WindowType.NAVIGATION_BAR); + } + } +} \ No newline at end of file diff --git a/product/navigationBar/src/main/resources/base/element/color.json b/product/default/navigationBar/src/main/resources/base/element/color.json similarity index 70% rename from product/navigationBar/src/main/resources/base/element/color.json rename to product/default/navigationBar/src/main/resources/base/element/color.json index bd971768..26637d9f 100644 --- a/product/navigationBar/src/main/resources/base/element/color.json +++ b/product/default/navigationBar/src/main/resources/base/element/color.json @@ -1,9 +1,5 @@ { "color": [ - { - "name": "index_background", - "value": "#66000000" - }, { "name": "button_default_background", "value": "#00000000" diff --git a/product/default/navigationBar/src/main/resources/base/element/float.json b/product/default/navigationBar/src/main/resources/base/element/float.json new file mode 100644 index 00000000..d9b34215 --- /dev/null +++ b/product/default/navigationBar/src/main/resources/base/element/float.json @@ -0,0 +1,24 @@ +{ + "float": [ + { + "name": "navigation_bar_button_width", + "value": "144vp" + }, + { + "name": "navigation_bar_button_height", + "value": "72vp" + }, + { + "name": "navigation_bar_button_radius", + "value": "36vp" + }, + { + "name": "navigation_bar_button_icon_width", + "value": "24vp" + }, + { + "name": "navigation_bar_button_icon_height", + "value": "24vp" + } + ] +} \ No newline at end of file diff --git a/product/navigationBar/src/main/resources/base/element/string.json b/product/default/navigationBar/src/main/resources/base/element/string.json similarity index 89% rename from product/navigationBar/src/main/resources/base/element/string.json rename to product/default/navigationBar/src/main/resources/base/element/string.json index abe15793..72d2bf3e 100644 --- a/product/navigationBar/src/main/resources/base/element/string.json +++ b/product/default/navigationBar/src/main/resources/base/element/string.json @@ -2,11 +2,11 @@ "string": [ { "name": "nav_bar_size_portrait", - "value": "102" + "value": "72" }, { "name": "nav_bar_size_landscape", - "value": "102" + "value": "72" }, { "name": "nav_bar_position_portrait", @@ -22,11 +22,11 @@ }, { "name": "status_bar_size_portrait", - "value": "102" + "value": "48" }, { "name": "status_bar_size_landscape", - "value": "102" + "value": "48" }, { "name": "status_bar_position_portrait", diff --git a/product/default/navigationBar/src/main/resources/base/media/ic_systemui_back.svg b/product/default/navigationBar/src/main/resources/base/media/ic_systemui_back.svg new file mode 100644 index 00000000..b9480f0a --- /dev/null +++ b/product/default/navigationBar/src/main/resources/base/media/ic_systemui_back.svg @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/product/default/navigationBar/src/main/resources/base/media/ic_systemui_home.svg b/product/default/navigationBar/src/main/resources/base/media/ic_systemui_home.svg new file mode 100644 index 00000000..fb070ea3 --- /dev/null +++ b/product/default/navigationBar/src/main/resources/base/media/ic_systemui_home.svg @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/product/default/navigationBar/src/main/resources/base/media/ic_systemui_recent.svg b/product/default/navigationBar/src/main/resources/base/media/ic_systemui_recent.svg new file mode 100644 index 00000000..306fc679 --- /dev/null +++ b/product/default/navigationBar/src/main/resources/base/media/ic_systemui_recent.svg @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/product/notificationmanagement/src/main/resources/base/media/icon.png b/product/default/navigationBar/src/main/resources/base/media/icon.png similarity index 100% rename from product/notificationmanagement/src/main/resources/base/media/icon.png rename to product/default/navigationBar/src/main/resources/base/media/icon.png diff --git a/product/navigationBar/src/main/resources/en_US/element/string.json b/product/default/navigationBar/src/main/resources/en_US/element/string.json similarity index 89% rename from product/navigationBar/src/main/resources/en_US/element/string.json rename to product/default/navigationBar/src/main/resources/en_US/element/string.json index 7cc208b4..2abf9254 100644 --- a/product/navigationBar/src/main/resources/en_US/element/string.json +++ b/product/default/navigationBar/src/main/resources/en_US/element/string.json @@ -2,11 +2,11 @@ "string": [ { "name": "nav_bar_size_portrait", - "value": "102" + "value": "72" }, { "name": "nav_bar_size_landscape", - "value": "102" + "value": "72" }, { "name": "nav_bar_position_portrait", @@ -22,11 +22,11 @@ }, { "name": "status_bar_size_portrait", - "value": "102" + "value": "48" }, { "name": "status_bar_size_landscape", - "value": "102" + "value": "48" }, { "name": "status_bar_position_portrait", diff --git a/product/navigationBar/src/main/resources/rawfile/navigationBarLayoutConfig.json b/product/default/navigationBar/src/main/resources/rawfile/navigationBarLayoutConfig.json similarity index 100% rename from product/navigationBar/src/main/resources/rawfile/navigationBarLayoutConfig.json rename to product/default/navigationBar/src/main/resources/rawfile/navigationBarLayoutConfig.json diff --git a/product/navigationBar/src/main/resources/zh_CN/element/string.json b/product/default/navigationBar/src/main/resources/zh_CN/element/string.json similarity index 89% rename from product/navigationBar/src/main/resources/zh_CN/element/string.json rename to product/default/navigationBar/src/main/resources/zh_CN/element/string.json index 7cc208b4..2abf9254 100644 --- a/product/navigationBar/src/main/resources/zh_CN/element/string.json +++ b/product/default/navigationBar/src/main/resources/zh_CN/element/string.json @@ -2,11 +2,11 @@ "string": [ { "name": "nav_bar_size_portrait", - "value": "102" + "value": "72" }, { "name": "nav_bar_size_landscape", - "value": "102" + "value": "72" }, { "name": "nav_bar_position_portrait", @@ -22,11 +22,11 @@ }, { "name": "status_bar_size_portrait", - "value": "102" + "value": "48" }, { "name": "status_bar_size_landscape", - "value": "102" + "value": "48" }, { "name": "status_bar_position_portrait", diff --git a/product/notificationmanagement/.gitignore b/product/default/notificationmanagement/.gitignore similarity index 100% rename from product/notificationmanagement/.gitignore rename to product/default/notificationmanagement/.gitignore diff --git a/product/notificationmanagement/build.gradle b/product/default/notificationmanagement/build.gradle similarity index 73% rename from product/notificationmanagement/build.gradle rename to product/default/notificationmanagement/build.gradle index c23569f0..d1dfd5a6 100644 --- a/product/notificationmanagement/build.gradle +++ b/product/default/notificationmanagement/build.gradle @@ -4,11 +4,12 @@ ohos { defaultConfig { compatibleSdkVersion rootProject.ext.version.compatibleSdk } - entryModules "entry" + entryModules "phone_entry,pc_entry" } dependencies { - entryImplementation project(':entry') + entryImplementation project(':phone_entry') + entryImplementation project(':pc_entry') implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) testCompile 'junit:junit:4.12' implementation project(':features:managementcomponent') diff --git a/product/statusbar/package.json b/product/default/notificationmanagement/package.json similarity index 100% rename from product/statusbar/package.json rename to product/default/notificationmanagement/package.json diff --git a/product/notificationmanagement/src/main/config.json b/product/default/notificationmanagement/src/main/config.json similarity index 80% rename from product/notificationmanagement/src/main/config.json rename to product/default/notificationmanagement/src/main/config.json index 5e620ab2..40e2b12f 100644 --- a/product/notificationmanagement/src/main/config.json +++ b/product/default/notificationmanagement/src/main/config.json @@ -5,18 +5,19 @@ "version": { "code": 1, "name": "1.0" - } + }, + "singleton": true }, "deviceConfig": {}, "module": { "package": "com.ohos.systemui.notificationmanagement", "name": ".MyApplication", "deviceType": [ - "phone" + "phone", "tablet" ], "distro": { "deliveryWithInstall": true, - "moduleName": "notificationmanagement", + "moduleName": "default_notificationmanagement", "moduleType": "feature" }, "abilities": [ @@ -28,7 +29,7 @@ "label": "$string:app_name", "type": "page", "launchType": "singleton", - "srcPath": "default", + "srcPath": "MainAbility", "srcLanguage": "ets" } ], @@ -38,7 +39,7 @@ "syntax": "ets", "type": "pageAbility" }, - "name": "default", + "name": "MainAbility", "window": { "designWidth": 720, "autoDesignWidth": false @@ -47,10 +48,11 @@ "pages/notificationManagenment", "pages/batchSetEnable", "pages/noDisturb", - "pages/setEnable" + "pages/setEnable", + "pages/noDisturbPre", + "pages/slotSetting" ] } - ], - "srcPath": "default" + ] } } \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/AbilityStage.ts b/product/default/notificationmanagement/src/main/ets/AbilityStage.ts new file mode 100644 index 00000000..affea733 --- /dev/null +++ b/product/default/notificationmanagement/src/main/ets/AbilityStage.ts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import AbilityStage from "@ohos.application.AbilityStage" +import Log from '../../../../../../common/src/main/ets/default/Log' + +const TAG = "NotificationManagement_AbilityStage" +export default class MainAbilityStage extends AbilityStage { + onCreate() { + Log.showInfo(TAG, "onCreate") + } +} \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts new file mode 100644 index 00000000..5c236b8c --- /dev/null +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import Ability from '@ohos.application.Ability' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' + +const TAG = "NotificationManagement-MainAbility" + +export default class MainAbility extends Ability { + onCreate(want, launchParam) { + Log.showInfo(TAG, "MainAbility onCreate") + globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = want; + } + + onDestroy() { + Log.showInfo(TAG, "MainAbility onDestroy") + } + + onWindowStageCreate(windowStage) { + Log.showInfo(TAG, "MainAbility onWindowStageCreate") + AbilityManager.setContext(AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT, this.context) + windowStage.setUIContent(this.context, "pages/notificationManagenment", null) + } + + onWindowStageDestroy() { + Log.showInfo(TAG, "MainAbility onWindowStageDestroy") + } + + onForeground() { + Log.showInfo(TAG, "MainAbility onForeground") + } + + onBackground() { + Log.showInfo(TAG, "MainAbility onBackground") + } +}; diff --git a/product/notificationmanagement/src/main/ets/default/app.ets b/product/default/notificationmanagement/src/main/ets/MainAbility/app.ets similarity index 100% rename from product/notificationmanagement/src/main/ets/default/app.ets rename to product/default/notificationmanagement/src/main/ets/MainAbility/app.ets diff --git a/product/notificationmanagement/src/main/ets/default/common/constants.ets b/product/default/notificationmanagement/src/main/ets/MainAbility/common/constants.ts similarity index 89% rename from product/notificationmanagement/src/main/ets/default/common/constants.ets rename to product/default/notificationmanagement/src/main/ets/MainAbility/common/constants.ts index 261c499a..04932856 100644 --- a/product/notificationmanagement/src/main/ets/default/common/constants.ets +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/common/constants.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -16,8 +16,7 @@ export default class Constants { static WH_50_100 = '50%'; static WH_70_100 = '70%'; + static WH_90_100 = '90%'; static WH_100_100 = '100%'; static TOPMOST_INDEX = 999 - - static NEXT_DAY_NAME = '次日' } \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/batchSetEnable.ets b/product/default/notificationmanagement/src/main/ets/MainAbility/pages/batchSetEnable.ets new file mode 100644 index 00000000..cceb4fee --- /dev/null +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/pages/batchSetEnable.ets @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//import Window from '@ohos.window'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import HeadComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import AppItemComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; +import ConfigData from '../common/constants'; +import Router from '@system.router' + +const TAG = 'NotificationManagement-BatchSetEnable'; + +@Entry +@Component +export default struct BatchSetEnable { + @StorageLink('appManagementList') appList: any[]= []; + @State headName:Resource = $r('app.string.notificationManagement') + + build() { + Column() { + GridContainer({columns:12, sizeType: SizeType.Auto, gutter: vp2px(1) === 2 ? '12vp' : '0vp', margin: vp2px(1) === 2 ? '12vp' : '0vp'}) { + Row() { + Column() { + HeadComponent({ headName: $headName, isActive: true }); + List() { + ForEach(this.appList, (item) => { + ListItem() { + AppItemComponent({ + appIcon: item.appIcon, + appTitle: item.appTitle, + appSummary: item.appSummary, + appValue: item.appValue, + appArrow: item.appArrow, + appArrowStyle: '', + appUri: '', + appBundleName:item.appBundleName, + appUid:item.appUid, + appSwitch:1, + isCanChange: !item.systemApp + }); + } + .height($r('app.float.appitem_item_height')); + }); + } + .divider({ + strokeWidth: 1, + color: $r('app.color.background_color'), + startMargin: $r('app.float.divider_margin_l_info'), + endMargin: $r('app.float.divider_margin_r') + }) + .width(ConfigData.WH_100_100) + .height($r('app.float.applist_hieght_bat')) + .padding({ left: $r('app.float.itemComp_padding_l'), right: $r('app.float.itemComp_padding_r') }) + .align(Alignment.Top) + .backgroundColor(Color.White) + .visibility(Visibility.Visible) + .zIndex(0) + .border({ width: $r('app.float.border_width'), color:Color.White, + radius:$r('app.float.border_radius') }) + .margin({ top: $r('app.float.itemComp_margin_b') }); + } + .padding({ left: $r('sys.float.ohos_id_default_padding_start'), right: $r('sys.float.ohos_id_default_padding_start') }) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + .useSizeType({ + xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, + md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } + }); + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } + } + .backgroundColor($r("sys.color.ohos_id_color_sub_background")) + .align(Alignment.Center) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + Router.back(); + } + +} diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturb.ets new file mode 100644 index 00000000..e2f148e9 --- /dev/null +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturb.ets @@ -0,0 +1,551 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import HeadComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import ConfigData from '../common/constants'; +import Router from '@system.router' +import { concatTime } from '../../../../../../../../common/src/main/ets/default/TimeManager'; +import ItemComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; +import {DoNotDisturbType} from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; +import NoDisturbingModel from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel'; +import ViewModel from '../vm/noDisturbViewModel' + +const TAG = 'NotificationManagement-NoDisturb'; +const GROUP_REPEAT_MODE = 'repeatMode' + +@Entry +@Component +export default struct NoDisturb { + @State mViewModel: ViewModel = new ViewModel() + @State headName:Resource = $r('app.string.noDisturb') + @State repeatTitle:Resource = $r('app.string.repeat') + @State startDateTitle:Resource = $r('app.string.startDate') + @State endDateTitle:Resource = $r('app.string.endDate') + @State startTitle:Resource = $r('app.string.startTime') + @State endTitle:Resource = $r('app.string.endTime') + @State arrow: string | PixelMap | Resource = $r('app.media.ic_settings_arrow') + @State mRefreshCnt: number = 0; + mPrevData: string = ''; + + startDateDialogController: CustomDialogController = new CustomDialogController({ + builder: DateDialog({ + action:(data)=> this.setStartDate(data), + title: $r('app.string.startDate'), + defaultDate: this.mViewModel.defaultStartTime + }), + cancel: ()=>this.mViewModel.onCancel(), + autoCancel: false + }); + startTimeDialogController: CustomDialogController = new CustomDialogController({ + builder: TimeDialog({ + action:(data)=> this.setStartTime(data), + title: $r('app.string.startTime'), + defaultDate: this.mViewModel.defaultStartTime + }), + cancel: ()=>this.mViewModel.onCancel(), + autoCancel: false + }); + endDateDialogController: CustomDialogController = new CustomDialogController({ + builder: DateDialog({ + action:(data)=> this.setEndDate(data), + title: $r('app.string.endDate'), + defaultDate: this.mViewModel.defaultEndTime + }), + cancel: ()=>this.mViewModel.onCancel(), + autoCancel: false + }); + endTimeDialogController: CustomDialogController = new CustomDialogController({ + builder: TimeDialog({ + action:(data)=> this.setEndTime(data), + title: $r('app.string.endTime'), + defaultDate: this.mViewModel.defaultEndTime + }), + cancel: ()=>this.mViewModel.onCancel(), + autoCancel: false + }); + repeatDialogController: CustomDialogController = new CustomDialogController({ + builder: RepeatModeDialog({ + action:(data)=> this.setRepeatMode(data), + title: $r('app.string.repeat'), + selectMode: this.mViewModel.repeatMode + }), + cancel: ()=>this.mViewModel.onCancel(), + autoCancel: false + }); + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { + Column() { + GridContainer({columns:12, sizeType: SizeType.Auto, gutter: vp2px(1) === 2 ? '12vp' : '0vp', margin: vp2px(1) === 2 ? '12vp' : '0vp'}) { + Row() { + Column() { + HeadComponent({ headName: $headName, isActive: true }) + if (this.mRefreshCnt > 0) { + Row() { + ItemComponent({ + title: $repeatTitle, + value: this.mViewModel.repeatName, + arrow: $arrow + }) + }.onClick(() => { + this.repeatDialogController.open() + }).margin({ bottom: $r('app.float.itemComp_margin_b') }) + + if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + List() { + ListItem() { + Row() { + ItemComponent({ + title: $startDateTitle, + value: this.mViewModel.startDateClue, + arrow: $arrow + }) + }.onClick(() => { + this.startDateDialogController.open() + }) + } + ListItem() { + Row() { + ItemComponent({ + title: $startTitle, + value: this.mViewModel.startTimeClue, + arrow: $arrow + }) + }.onClick(() => { + this.startTimeDialogController.open() + }) + } + }.divider({ + strokeWidth: 1, + color: $r('app.color.divider_color'), + startMargin: $r('app.float.divider_margin_l'), + endMargin: $r('app.float.divider_margin_r') + }).width(ConfigData.WH_100_100) + .visibility(Visibility.Visible) + .zIndex(0) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + .margin({ bottom: $r('app.float.itemComp_margin_b')}) + List() { + ListItem() { + Row() { + ItemComponent({ + title: $endDateTitle, + value: this.mViewModel.endDateClue, + arrow: $arrow + }) + }.onClick(() => { + this.endDateDialogController.open() + }) + } + ListItem() { + Row() { + ItemComponent({ + title: $endTitle, + value: this.mViewModel.endTimeClue, + arrow: $arrow + }) + }.onClick(() => { + this.endTimeDialogController.open() + }) + } + }.divider({ + strokeWidth: 1, + color: $r('app.color.divider_color'), + startMargin: $r('app.float.divider_margin_l'), + endMargin: $r('app.float.divider_margin_r') + }).width(ConfigData.WH_100_100) + .visibility(Visibility.Visible) + .zIndex(0) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + .margin({ bottom: $r('app.float.itemComp_margin_b')}) + } else { + Row() { + ItemComponent({ + title: $startTitle, + value: this.mViewModel.startTimeClue, + arrow: $arrow + }) + }.onClick(() => { + this.mPrevData = this.mViewModel.startTime + this.startTimeDialogController.open() + }).margin({ bottom: $r('app.float.itemComp_margin_b')}) + Row() { + ItemComponent({ + title: $endTitle, + value: this.mViewModel.endTimeClue, + arrow: $arrow + }) + }.onClick(() => { + this.mPrevData = this.mViewModel.endTime + this.endTimeDialogController.open() + }).margin({ bottom: $r('app.float.itemComp_margin_b')}) + } + } + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + .padding({ + left: $r('sys.float.ohos_id_default_padding_start'), + right: $r('sys.float.ohos_id_default_padding_end') + }) + .useSizeType({ + xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, + md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } + }) + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + } + } + .backgroundColor($r("sys.color.ohos_id_color_sub_background")) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } + .width(ConfigData.WH_100_100) + } + + setRepeatMode(data: number) { + this.mViewModel.onRepeatModeAccect(data); + this.mRefreshCnt++; + } + setStartDate(data: string) { + let dataSource = this.mViewModel.setDateIntoDateTime(this.mViewModel.defaultStartTime, data); + this.mViewModel.onStartTimeAccept(dataSource); + this.mRefreshCnt++; + } + setStartTime(data: string) { + let dataSource = data; + if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + dataSource = this.mViewModel.setTimeIntoDateTime(this.mViewModel.defaultStartTime, data); + } else if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_NONE){ + dataSource = this.mPrevData; + } + this.mViewModel.onStartTimeAccept(dataSource); + this.mRefreshCnt++; + } + setEndDate(data: string) { + let dataSource = this.mViewModel.setDateIntoDateTime(this.mViewModel.defaultEndTime, data); + this.mViewModel.onEndTimeAccept(dataSource); + this.mRefreshCnt++; + } + setEndTime(data: string) { + let dataSource = data; + if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + dataSource = this.mViewModel.setTimeIntoDateTime(this.mViewModel.defaultEndTime, data); + } else if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_NONE){ + dataSource = this.mPrevData; + } + this.mViewModel.onEndTimeAccept(dataSource); + this.mRefreshCnt++; + } + + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit() + this.mRefreshCnt++; + + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + Router.back(); + } +} + +/** + * select date dialog + */ +@CustomDialog +struct DateDialog { + public controller: CustomDialogController + public action: (data) => void + private selectedDate: string = '' + private title: string = '' + private defaultDate: Date = new Date() + private minDate: Date = new Date('2008-01-01'); + private maxDate: Date = new Date('2037-12-31'); + + build() { + Column() { + Column() { + Text(this.title) + .height($r('app.float.dialog_title_height')) + .width(ConfigData.WH_100_100) + .textAlign(TextAlign.Center) + .fontSize($r('app.float.dialog_title_font')) + .fontWeight(FontWeight.Medium) + DatePicker({ start: this.minDate, end: this.maxDate, selected: this.defaultDate, type: DatePickerType.Date }) + .useMilitaryTime(false) + .onChange((date: DatePickerResult) => { + let dateSource = new Date(date.year, date.month, date.day); + this.selectedDate = NoDisturbingModel.formatDate(dateSource); + }) + .width(ConfigData.WH_100_100) + .height($r('app.float.timeDialog_datePicker_height')) + } + + Row() { + Column() { + Text($r('app.string.cancel')) + .fontSize($r('app.float.dialog_button_font')) + .fontColor(Color.Blue) + + }.onClick(() => { + this.controller.close(); + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100); + Divider() + .vertical(true) + .color($r('app.color.divider_color')) + .strokeWidth(1) + .height($r('app.float.divider_height')) + Column() { + Text($r('app.string.confirm')) + .fontSize($r('app.float.dialog_button_font')) + .fontColor(Color.Blue) + + }.onClick(() => { + Log.showInfo(TAG, `confirm button of DateDialog on click`) + this.controller.close(); + if(this.selectedDate != '') { + this.action(this.selectedDate); + } + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100) + } + .width(ConfigData.WH_100_100) + .margin({top: $r("app.float.noDisturb_margin_16"), bottom: $r("app.float.noDisturb_margin_16")}) + } + .height($r('app.float.timeDialog_height')) + .width(ConfigData.WH_100_100) + } +} + +/** + * select time dialog + */ +@CustomDialog +struct TimeDialog { + public controller: CustomDialogController + public action: (data) => void + private selectedTime: string = '' + private title: string = '' + private defaultDate: Date = new Date() + + build() { + Column() { + Column() { + Text(this.title) + .height($r('app.float.dialog_title_height')) + .width(ConfigData.WH_100_100) + .textAlign(TextAlign.Center) + .fontSize($r('app.float.dialog_title_font')) + .fontWeight(FontWeight.Medium) + DatePicker({ selected: this.defaultDate, type: DatePickerType.Time }) + .useMilitaryTime(false) + .onChange((date: DatePickerResult) => { + this.selectedTime = concatTime(date.hour, date.minute); + }) + .width(ConfigData.WH_100_100) + .height($r('app.float.timeDialog_datePicker_height')) + } + + Row() { + Column() { + Text($r('app.string.cancel')) + .fontSize($r('app.float.dialog_button_font')) + .fontColor(Color.Blue) + + }.onClick(() => { + this.controller.close(); + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100); + Divider() + .vertical(true) + .color($r('app.color.divider_color')) + .strokeWidth(1) + .height($r('app.float.divider_height')) + Column() { + Text($r('app.string.confirm')) + .fontSize($r('app.float.dialog_button_font')) + .fontColor(Color.Blue) + + }.onClick(() => { + Log.showInfo(TAG, `confirm button of TimeDialog on click`) + this.controller.close(); + if(this.selectedTime != '') { + this.action(this.selectedTime); + } + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100) + } + .width(ConfigData.WH_100_100) + .margin({top: $r("app.float.noDisturb_margin_16"), bottom: $r("app.float.noDisturb_margin_16")}) + } + .height($r('app.float.timeDialog_height')) + .width(ConfigData.WH_100_100) + } +} + +/** + * select repeat Mode dialog + */ +@CustomDialog +struct RepeatModeDialog { + public controller: CustomDialogController + public action: (data) => void + private title: string= '' + private prevModeSetCnt: number = 0 + @State selectMode: number = DoNotDisturbType.TYPE_NONE + itSelectedBefore: number = -1 + build() { + Column() { + Column() { + Text(this.title) + .height($r('app.float.dialog_title_height')) + .width(ConfigData.WH_100_100) + .textAlign(TextAlign.Center) + .fontSize($r('app.float.dialog_title_font')) + .fontWeight(FontWeight.Medium) + Row() { + Text($r('app.string.noDisturb_none')) + .fontSize($r('app.float.repeatDialog_cont_font')) + .fontColor(Color.Black) + .width(ConfigData.WH_70_100) + .textAlign(TextAlign.Start) + .align(Alignment.Start) + Radio({ value: '' + DoNotDisturbType.TYPE_NONE, group: GROUP_REPEAT_MODE }) + .checked(this.selectMode == DoNotDisturbType.TYPE_NONE) + .align(Alignment.End) + .width($r('app.float.toggle_check_width')) + .height($r('app.float.toggle_check_width')) + .onClick(() => { + if (this.prevModeSetCnt == 0) { + this.itSelectedBefore = this.selectMode; + } + this.prevModeSetCnt++ + this.selectMode = DoNotDisturbType.TYPE_NONE; + }) + } + Row() { + Text($r('app.string.noDisturb_once')) + .fontSize($r('app.float.repeatDialog_cont_font')) + .fontColor(Color.Black) + .width(ConfigData.WH_70_100) + .textAlign(TextAlign.Start) + .align(Alignment.Start) + Radio({ value: '' + DoNotDisturbType.TYPE_ONCE, group: GROUP_REPEAT_MODE }) + .checked(this.selectMode == DoNotDisturbType.TYPE_ONCE) + .align(Alignment.End) + .width($r('app.float.toggle_check_width')) + .height($r('app.float.toggle_check_width')) + .onClick(() => { + if (this.prevModeSetCnt == 0) { + this.itSelectedBefore = this.selectMode; + } + this.prevModeSetCnt++ + this.selectMode = DoNotDisturbType.TYPE_ONCE; + }) + } + Row() { + Text($r('app.string.noDisturb_daily')) + .fontSize($r('app.float.repeatDialog_cont_font')) + .fontColor(Color.Black) + .width(ConfigData.WH_70_100) + .textAlign(TextAlign.Start) + .align(Alignment.Start) + Radio({ value: '' + DoNotDisturbType.TYPE_DAILY, group: GROUP_REPEAT_MODE }) + .checked(this.selectMode == DoNotDisturbType.TYPE_DAILY) + .align(Alignment.End) + .width($r('app.float.toggle_check_width')) + .height($r('app.float.toggle_check_width')) + .onClick(() => { + if (this.prevModeSetCnt == 0) { + this.itSelectedBefore = this.selectMode; + } + this.prevModeSetCnt++ + this.selectMode = DoNotDisturbType.TYPE_DAILY; + }) + } + Row() { + Text($r('app.string.noDisturb_clearly')) + .fontSize($r('app.float.repeatDialog_cont_font')) + .fontColor(Color.Black) + .width(ConfigData.WH_70_100) + .textAlign(TextAlign.Start) + .align(Alignment.Start) + Radio({ value: '' + DoNotDisturbType.TYPE_CLEARLY, group: GROUP_REPEAT_MODE }) + .checked(this.selectMode == DoNotDisturbType.TYPE_CLEARLY) + .align(Alignment.End) + .width($r('app.float.toggle_check_width')) + .height($r('app.float.toggle_check_width')) + .onClick(() => { + if (this.prevModeSetCnt == 0) { + this.itSelectedBefore = this.selectMode; + } + this.prevModeSetCnt++ + this.selectMode = DoNotDisturbType.TYPE_CLEARLY; + }) + } + } + + Row() { + Column() { + Text($r('app.string.cancel')) + .fontSize($r('app.float.dialog_button_font')) + .fontColor($r("app.color.font_color_007DFF")) + + }.onClick(() => { + this.controller.close(); + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100); + Divider() + .vertical(true) + .color($r('app.color.divider_color')) + .strokeWidth(1) + .height($r('app.float.divider_height')) + Column() { + Text($r('app.string.confirm')) + .fontSize($r('app.float.dialog_button_font')) + .fontColor($r("app.color.font_color_007DFF")) + + }.onClick(() => { + Log.showInfo(TAG, `confirm button of TimeDialog on click`) + this.controller.close(); + if (this.itSelectedBefore != -1 && this.itSelectedBefore != this.selectMode){ + this.action(this.selectMode); + } + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100) + } + .width(ConfigData.WH_100_100) + .margin({top: $r("app.float.noDisturb_margin_16"), bottom: $r("app.float.noDisturb_margin_16")}) + } + .height($r('app.float.repeatDialog_height')) + .width(ConfigData.WH_100_100) + } +} diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturbPre.ets b/product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturbPre.ets new file mode 100644 index 00000000..0ecea6bc --- /dev/null +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturbPre.ets @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//import Window from '@ohos.window'; + +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import HeadComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import NoDisturbComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent'; +import ItemComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; +import ConfigData from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; +import Router from '@system.router'; + +const TAG = 'NotificationManagement-NoDisturbPre'; + +@Entry +@Component +export default struct notificationManagenment { + @State columnMargin: string = '24vp'; + @State headName: Resource = $r('app.string.notificationManagement') + @State refreshRequest: number= 0 + + build() { + Column() { + GridContainer({ + columns: 12, + sizeType: SizeType.Auto, + gutter: vp2px(1) === 2 ? '12vp' : '0vp', + margin: vp2px(1) === 2 ? '24vp' : '0vp' + }) { + Row() { + Column() { + HeadComponent({ headName: $headName, isActive: true }); + Row() { + Text($r('app.string.timing_on')) + .fontSize($r('app.float.page_phrases_font')) + .margin({top:$r('app.float.page_phrases_padding_t')}) + } + .width(ConfigData.WH_100_100) + .height($r('app.float.page_phrases_height')) + .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) + + Row() { + NoDisturbComponent({ refreshRequest: this.refreshRequest }) + } + .align(Alignment.Start) + .onClick(() => { + Log.showInfo(TAG, `NoDisturbComponent on click`) + Router.push({ uri: 'pages/noDisturb' }); + }).width(ConfigData.WH_100_100) + .backgroundColor(Color.White) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + .padding({ left: $r('sys.float.ohos_id_default_padding_start'), + right: $r('sys.float.ohos_id_default_padding_end') }) + .useSizeType({ + xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, + md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } + }); + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } + .backgroundColor($r("sys.color.ohos_id_color_sub_background")) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear(): void{ + Log.showInfo(TAG, `aboutToDisappear`) + } + + onPageShow(): void{ + Log.showInfo(TAG, `onPageShow`) + this.refreshRequest++; + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + } +} diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/MainAbility/pages/notificationManagenment.ets new file mode 100644 index 00000000..5707292a --- /dev/null +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/pages/notificationManagenment.ets @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//import Window from '@ohos.window'; + +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import HeadComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import NoDisturbComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent'; +import ItemComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; +import ConfigData from '../common/constants'; +import AppLstComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent'; +import Router from '@system.router'; +import ViewModel from '../vm/notificationManagenmentViewModel' +import Notification from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; +import SwitchComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; + +const TAG = 'NotificationManagement-Main'; + +@Entry +@Component +export default struct notificationManagenment { + @State columnMargin: string = '12vp'; + @State mViewModel: ViewModel = new ViewModel(); + @State headName: Resource = $r('app.string.notification') + @State title: Resource = $r('app.string.batch_Management') + @State arrow: string | PixelMap | Resource= $r('app.media.ic_settings_arrow') + @State allowDistribut: Resource = $r('app.string.allowDistribut') + @State allowDistributDescribe: Resource = $r('app.string.allowDistributDescribe') + + build() { + Column() { + GridContainer({ + columns: 12, + sizeType: SizeType.Auto, + gutter: vp2px(1) === 2 ? '12vp' : '0vp', + margin: vp2px(1) === 2 ? '24vp' : '0vp' + }) { + Row() { + Column() { + HeadComponent({ headName: $headName, isActive: true }) + Column() { + Row() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Row() { + Column() { + Text($r('app.string.noDisturb')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('app.color.itemComp_title_color')) + .textAlign(TextAlign.Start) + .fontWeight(FontWeight.Bold) + .height($r('app.float.itemComp_height')) + .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) + } + .alignItems(HorizontalAlign.Start) + } + .flexShrink(1) + .align(Alignment.Start) + .alignItems(VerticalAlign.Center) + + Row() { + if (this.mViewModel.isEffective) { + Text($r('app.string.noDisturb_opened')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('app.color.itemComp_title_color')) + .align(Alignment.End) + } else { + Text($r('app.string.noDisturb_closed')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('app.color.itemComp_title_color')) + .align(Alignment.End) + } + Image($r('app.media.ic_settings_arrow')) + .align(Alignment.End) + .width($r('app.float.itemComp_image_width')) + .height($r('app.float.itemComp_image_height')) + } + .padding({ right: $r('sys.float.ohos_id_default_padding_end') }) + .flexShrink(0) + .align(Alignment.End) + .alignItems(VerticalAlign.Center) + } + .width(ConfigData.WH_100_100) + .height($r('app.float.itemComp_height')) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + } + .height($r('app.float.itemComp_height')) + .margin({ top: $r('app.float.noDisturb_margin_lf') }) + .align(Alignment.Start) + .onClick(() => { + Log.showInfo(TAG, `NoDisturbComponent on click`) + Router.push({ uri: 'pages/noDisturbPre' }); + }).width(ConfigData.WH_100_100) + .flexShrink(0) + Column() { + Divider().color($r('app.color.divider_color')).strokeWidth(1) + }.padding({ left: $r('sys.float.ohos_id_default_padding_start'),right:$r('sys.float.ohos_id_default_padding_end') }) + Row() { + Row() { + SwitchComponent({ + title: $allowDistribut, + describe: this.allowDistributDescribe, + initializationAction: () => this.switchComponentInit(), + settingAction: (params) => this.switchComponentSet(params), + isCanChange: true + }) + } + }.margin({ bottom: $r('app.float.noDisturb_margin_lf') }) + } + .backgroundColor(Color.White) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .margin({top:$r('app.float.page_notice_title_margin_t')}); + + Row() { + Text($r('app.string.notificationManagement')) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .fontWeight(FontWeight.Bold) + .fontFamily('HarmonyHeiTi-Medium') + .margin({top:$r('app.float.page_phrases_padding_t')}) + }.align(Alignment.Start) + .width(ConfigData.WH_100_100) + .height($r('app.float.page_phrases_height')) + .padding({ left: $r('sys.float.ohos_id_default_padding_start')}) + + Row() { + ItemComponent({ title: $title, value: '', arrow: $arrow }) + }.onClick(() => { + Log.showInfo(TAG, `BatchManagement on click`) + Router.push({ uri: 'pages/batchSetEnable' }); + }).width(ConfigData.WH_100_100) + .flexShrink(0) + + Column() { + AppLstComponent() + }.width(ConfigData.WH_100_100) + .height($r('app.float.applist_hieght')) + .margin({top:$r('app.float.applist_margin_t')}); + + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + .padding({ + left: $r('sys.float.ohos_id_default_padding_start'), + right: $r('sys.float.ohos_id_default_padding_end') + }) + .useSizeType({ + xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, + md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } + }); + + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } + .backgroundColor($r("sys.color.ohos_id_color_sub_background")) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit(); + } + + aboutToDisappear(): void{ + Log.showInfo(TAG, `aboutToDisappear`) + } + + onPageShow(): void{ + Log.showInfo(TAG, `onPageShow`) + this.mViewModel.RefreshNoDisturbState(); + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + } + + switchComponentInit() { + Log.showInfo(TAG, `switchComponentInit`) + return Notification.isDistributedEnabled(); + } + + switchComponentSet(params) { + Log.showInfo(TAG, `switchComponentSet`) + Notification.enableDistributed(params); + } +} diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/setEnable.ets b/product/default/notificationmanagement/src/main/ets/MainAbility/pages/setEnable.ets new file mode 100644 index 00000000..e2340bd2 --- /dev/null +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/pages/setEnable.ets @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//import Window from '@ohos.window'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import HeadComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import AppItemComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; +import SwitchComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; +import SlotLstComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent'; +import ConfigData from '../common/constants'; +import Router from '@system.router' +import Notification from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; + +const TAG = 'NotificationManagement-SetEnable'; + +let appInfo; + +@Entry +@Component +export default struct SetEnable { + private listeners: any[] = [] + @State headName:Resource = $r('app.string.notificationManagement') + @State allowNotice:Resource = $r('app.string.allowNotification') + build() { + Flex({ justifyContent: FlexAlign.SpaceBetween }) { + Column() { + GridContainer({columns:12, sizeType: SizeType.Auto, gutter: vp2px(1) === 2 ? '12vp' : '0vp', margin: vp2px(1) === 2 ? '12vp' : '0vp'}) { + Row() { + Column() { + HeadComponent({ headName: $headName, isActive: true }); + Row() { + AppItemComponent({ + appIcon: appInfo.appIcon, + appTitle: appInfo.appTitle, + appSummary: appInfo.appSummary, + appValue: '', + appArrow: appInfo.appArrow, + appArrowStyle: '', + appUri: appInfo.appUri, + appBundleName: appInfo.appBundleName, + appUid: appInfo.appUid, + appSwitch: 2 + }); + } + .margin({ top: $r('app.float.page_notice_part_margin_t'), right: $r('app.float.page_margin_r') }) + .padding({ left: $r('sys.float.ohos_id_max_padding_start'), right: $r('sys.float.ohos_id_default_padding_end')}) + + + Row() { + SwitchComponent({ + title: $allowNotice, + initializationAction: () => this.switchComponentInit(), + settingAction: (params) => this.switchComponentSet(params), + register: (listener) => Notification.register({bundle:appInfo.appBundleName,onEnableChanged:listener}), + isCanChange: !appInfo.systemApp + }) + } + .margin({ top: $r('app.float.page_notice_title_margin_t')}) + .padding({ left: $r('sys.float.ohos_id_default_padding_start'), right: $r('sys.float.ohos_id_default_padding_end')}) + .height($r('app.float.notice_row_height')) + + Row() { + SlotLstComponent({ appInfo: appInfo }) + } + .align(Alignment.Start) + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + .useSizeType({ + xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, + md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } + }); + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } + } + .backgroundColor($r("sys.color.ohos_id_color_sub_background")) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + } + .width(ConfigData.WH_100_100) + } + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + appInfo = Router.getParams(); + appInfo.slotSettingUrl = 'pages/slotSetting' + Notification.subscribeEnableChanged(); + Log.showInfo(TAG, `aboutToAppear end`) + } + + aboutToDisappear(): void{ + Log.showInfo(TAG, `aboutToDisappear`) + Notification.unsubscribeEnableChanged(); + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + Router.back(); + } + + switchComponentInit() { + Log.showInfo(TAG, `switchComponentInit`) + return Notification.isNotificationEnabled({ bundle: appInfo.appBundleName, uid: appInfo.appUid }) + } + + switchComponentSet(params) { + Log.showInfo(TAG, `switchComponentSet`) + Notification.enableNotification({ bundle: appInfo.appBundleName, uid: appInfo.appUid }, params); + } +} diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/slotSetting.ets b/product/default/notificationmanagement/src/main/ets/MainAbility/pages/slotSetting.ets new file mode 100644 index 00000000..bf6eee85 --- /dev/null +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/pages/slotSetting.ets @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import HeadComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import AppItemComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; +import SwitchComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; +import ConfigData from '../common/constants'; +import NotificationConfigData from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; +import Router from '@system.router' +import Notification from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; +import {SlotLevel} from '@ohos.notification'; + +const TAG = 'NotificationManagement-SlotSetting'; +const DEFAULT_SOUND = 'file://system/etc/Light.ogg'; + +let params; + +@Entry +@Component +export default struct SlotSetting { + private appInfo: any = null; + private slotInfo: any = null; + @State headName: Resource = $r('app.string.notificationManagement') + @State allowNotice: Resource = $r('app.string.allowNotification') + @State noticeStyleBanner: Resource = $r('app.string.notificationStyle_banner') + @State noticeSound: Resource = $r('app.string.notificationSound') + + build() { + Flex({ justifyContent: FlexAlign.SpaceBetween }) { + Column() { + GridContainer({ + columns: 12, + sizeType: SizeType.Auto, + gutter: vp2px(1) === 2 ? '12vp' : '0vp', + margin: vp2px(1) === 2 ? '12vp' : '0vp' + }) { + Row() { + Column() { + HeadComponent({ headName: $headName, isActive: true }); + Row() { + AppItemComponent({ + appIcon: this.appInfo.appIcon, + appTitle: this.appInfo.appTitle, + appSummary: this.appInfo.appSummary, + appValue: this.slotInfo.type, + appArrow: this.appInfo.appArrow, + appArrowStyle: '', + appUri: this.appInfo.appUri, + appBundleName: this.appInfo.appBundleName, + appUid: this.appInfo.appUid, + appSwitch: 3, + isCanChange: !this.appInfo.systemApp + }); + } + .margin({ top: $r('app.float.page_notice_part_margin_t') }) + .padding({ + left: $r('sys.float.ohos_id_max_padding_start'), + right: $r('sys.float.ohos_id_default_padding_end') + }) + + Row() { + SwitchComponent({ + title: $allowNotice, + initializationAction: () => this.notificationEnableInit(), + settingAction: (params) => this.notificationEnableSet(params), + register: (listener) => Notification.register({ + bundle: this.appInfo.appBundleName, + onEnableChanged: listener + }), + isCanChange: false //TODO: There is no service, so it cannot be modified + }) + } + .margin({ top: $r('app.float.page_notice_title_margin_t') }) + .padding({ + left: $r('sys.float.ohos_id_card_margin_start'), + right: $r('sys.float.ohos_id_card_margin_end') + }) + .height($r('app.float.notice_row_height')) + + Row() { + Text($r('app.string.notificationStyle')) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .fontWeight(FontWeight.Bold) + .width(NotificationConfigData.WH_100_100) + .maxLines(NotificationConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + }.height($r('app.float.notice_title_height')) + .padding({ + left: $r('sys.float.ohos_id_max_padding_start'), + right: $r('sys.float.ohos_id_max_padding_end') + }) + .margin({ top: $r('app.float.page_notice_part_margin_t')}) + .align(Alignment.Start); + + Row() { + SwitchComponent({ + title: $noticeStyleBanner, + initializationAction: () => this.bannerEnableInit(), + settingAction: (params) => this.bannerEnableSet(params) + }) + } + .padding({ + left: $r('sys.float.ohos_id_card_margin_start'), + right: $r('sys.float.ohos_id_card_margin_end') + }) + .margin({ top: $r('app.float.page_notice_title_margin_t')}) + .height($r('app.float.notice_row_height')) + + Row() { + SwitchComponent({ + title: $noticeSound, + initializationAction: () => this.soundEnableInit(), + settingAction: (params) => this.soundEnableSet(params) + }) + } + .padding({ + left: $r('sys.float.ohos_id_card_margin_start'), + right: $r('sys.float.ohos_id_card_margin_end') + }) + .margin({ top: $r('app.float.page_notice_row_margin_t') }) + .height($r('app.float.notice_row_height')) + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + .useSizeType({ + xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, + md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } + }); + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100); + } + } + .backgroundColor($r("sys.color.ohos_id_color_sub_background")) + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + } + .width(ConfigData.WH_100_100) + } + + aboutToAppear(): void{ + Log.showInfo(TAG, `aboutToAppear`) + params = Router.getParams(); + this.appInfo = params.appInfo; + this.slotInfo = params.slotInfo + } + + onBackPress() { + Log.showInfo(TAG, `onBackPress`) + Router.back(); + } + + notificationEnableInit() { + Log.showInfo(TAG, `notificationEnableInit`) + return Notification.isNotificationEnabled({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }) + } + + notificationEnableSet(data) { + Log.showInfo(TAG, `notificationEnableSet data:${JSON.stringify(data)}`) + Notification.enableNotification({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }, data); + } + + soundEnableInit() { + Log.showInfo(TAG, `soundEnableInit`) + return new Promise((resolve, reject) => { + let result: boolean = false; + if (!!this.slotInfo.sound) { + result = true; + } + resolve(result); + Log.showInfo(TAG, `soundEnableInit state:${result}`) + }); + } + + soundEnableSet(params) { + Log.showInfo(TAG, `soundEnableSet params:${JSON.stringify(params)}`) + if (params == 0) { + this.slotInfo.sound = ''; + this.slotInfo.level = SlotLevel.LEVEL_LOW + } else if (params == 1) { + this.slotInfo.sound = DEFAULT_SOUND; + if (this.slotInfo.level < SlotLevel.LEVEL_DEFAULT) { + this.slotInfo.level = SlotLevel.LEVEL_DEFAULT + } + } + this.notificationSlotSet(); + } + + bannerEnableInit() { + Log.showInfo(TAG, `bannerEnableInit`) + return new Promise((resolve, reject) => { + let result: boolean = false; + if (this.slotInfo.level == SlotLevel.LEVEL_HIGH) { + result = true; + } + Log.showInfo(TAG, `bannerEnableInit state:${result}`) + resolve(result); + }); + } + + bannerEnableSet(params) { + Log.showInfo(TAG, `bannerEnableSet params:${JSON.stringify(params)}`) + if (params == 0) { + if (this.slotInfo.sound) { + this.slotInfo.level = SlotLevel.LEVEL_DEFAULT; + } else { + this.slotInfo.level = SlotLevel.LEVEL_LOW; + } + } else if (params == 1) { + this.slotInfo.level = SlotLevel.LEVEL_HIGH; + } + this.notificationSlotSet(); + } + + notificationSlotSet() { + Log.showInfo(TAG, `notificationSlotSet slotInfo:${JSON.stringify(this.slotInfo)}`) + Notification.notificationSlotSet({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }, this.slotInfo); + } +} diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/vm/noDisturbViewModel.ts b/product/default/notificationmanagement/src/main/ets/MainAbility/vm/noDisturbViewModel.ts new file mode 100644 index 00000000..35858d00 --- /dev/null +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/vm/noDisturbViewModel.ts @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2021-2022 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 ConfigData from '../common/constants'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import NoDisturbingModel from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel'; +import NoDisturbComponentViewModel from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel'; +import FeaturesConfigData, {DoNotDisturbType} from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; + +const TAG = 'NotificationManagement-NoDisturbViewModel' +const CONST_DAY_LENGTH = 24*3600*1000 + +export default class NoDisturbViewModel extends NoDisturbComponentViewModel { + + startDateClue: string = '' + startTimeClue: string = '' + endDateClue: string = '' + endTimeClue: string = '' + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + this.getNextDayLabel(); + this.getNoDisturbingDate.bind(this)() + } + getNoDisturbingDate() { + Log.showInfo(TAG, 'getNoDisturbingDate'); + NoDisturbingModel.getNoDisturbingDate((data) => { + Log.showInfo(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); + this.repeatMode = data.type + this.startTime = data.begin + this.endTime = data.end + Log.showInfo(TAG, `getNoDisturbingDate this.repeatMode : ${this.repeatMode}`) + Log.showInfo(TAG, `getNoDisturbingDate this.startTime : ${this.startTime}`) + Log.showInfo(TAG, `getNoDisturbingDate this.endTime : ${this.endTime}`) + this.setClues.bind(this)() + }) + } + + setClues() { + Log.showInfo(TAG, `setClues`) + if (this.repeatMode == DoNotDisturbType.TYPE_DAILY || + this.repeatMode == DoNotDisturbType.TYPE_ONCE || + this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + this.isEffective = true; + } else { + this.isEffective = false; + } + let tmpStartDateTime = null; + let tmpEndDateTime = null; + if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + tmpStartDateTime = this.getDateByDateTime(this.startTime); + tmpEndDateTime = this.getDateByDateTime(this.endTime); + this.startDateClue = this.getDateLabel(this.startTime); + this.startTimeClue = NoDisturbingModel.formatTime(tmpStartDateTime); + this.endDateClue = this.getDateLabel(this.endTime); + this.endTimeClue = NoDisturbingModel.formatTime(tmpEndDateTime); + } else { + tmpStartDateTime = this.getDateByHHMI(this.startTime); + tmpEndDateTime = this.getDateByHHMI(this.endTime); + this.startDateClue = ''; + this.startTimeClue = this.startTime; + this.endDateClue = ''; + if (tmpStartDateTime.getTime() >= tmpEndDateTime.getTime()) { + this.endTimeClue = this.nextDayLabel + this.endTime; + } else { + this.endTimeClue = this.endTime; + } + } + this.defaultStartTime = tmpStartDateTime; + this.defaultEndTime = tmpEndDateTime; + this.repeatName = this.refreshRepeatName(this.repeatMode); + } + + onStartTimeAccept(data) { + Log.showInfo(TAG, `onStartTimeAccept`) + this.startTime = data + if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + let tmpDateTime = this.getDateByDateTime(this.startTime); + if (this.defaultEndTime.getTime() < tmpDateTime.getTime()) { + this.startTime = this.endTime + } + } + this.setClues(); + this.setNoDisturbingDate() + + } + + onEndTimeAccept(data) { + Log.showInfo(TAG, `onEndTimeAccept`) + this.endTime = data + if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + let tmpDateTime = this.getDateByDateTime(this.endTime); + if (tmpDateTime.getTime() < this.defaultStartTime.getTime()) { + this.endTime = this.startTime + } + } + this.setClues(); + this.setNoDisturbingDate() + } + + onRepeatModeAccect(data) { + Log.showInfo(TAG, `onRepeatModeAccect`) + this.repeatMode = data; + if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + let dateSource = new Date(); + this.startTime = NoDisturbingModel.formatDate(dateSource) + ' ' + FeaturesConfigData.TIME_EMPTY; + this.endTime = NoDisturbingModel.formatDate(new Date(dateSource.getTime() + CONST_DAY_LENGTH)) + ' ' + FeaturesConfigData.TIME_EMPTY; + } else { + this.startTime = FeaturesConfigData.TIME_EMPTY; + this.endTime = FeaturesConfigData.TIME_EMPTY; + } + this.setClues(); + this.setNoDisturbingDate(); + } + + setDateIntoDateTime(dateSource: Date, inputData:string): string { + let result = inputData + ' ' + NoDisturbingModel.formatTime(dateSource); + return result; + } + + setTimeIntoDateTime(dateSource: Date, inputData:string): string { + let result = NoDisturbingModel.formatDate(dateSource) + ' ' + inputData; + return result; + } + + onCancel() { + Log.showInfo(TAG, `onCancel`) + } +} \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/vm/notificationManagenmentViewModel.ts b/product/default/notificationmanagement/src/main/ets/MainAbility/vm/notificationManagenmentViewModel.ts new file mode 100644 index 00000000..7428c96c --- /dev/null +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/vm/notificationManagenmentViewModel.ts @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021-2022 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 ConfigData from '../common/constants'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import BundleResourceModel from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel'; +import NoDisturbComponentViewModel from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel' +import Router from '@system.router'; + +const TAG = 'NotificationManagement-NotificationManagenmentViewModel' + +export default class NotificationManagenmentViewModel extends NoDisturbComponentViewModel { + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + super.ViewModelInit(); + this.MigrateTo(); + } + + RefreshNoDisturbState() { + super.ViewModelInit(); + } + + MigrateTo() { + Log.showInfo(TAG, 'MigrateTo'); + //get the want + let want = globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want']; + Log.showInfo(TAG, `aboutToAppear want:${JSON.stringify(want)}`) + if (!want || !want.parameters.migrateUri || !want.parameters.migrateBundle) { + return; + } + let migrateUri = want.parameters.migrateUri; + let bundleName = want.parameters.migrateBundle; + Log.showInfo(TAG, `aboutToAppear migrateUri:${migrateUri} migrateBundle:${JSON.stringify(bundleName)}`) + + let dataModel: BundleResourceModel = new BundleResourceModel() + dataModel.getBundleInfo(bundleName, (bundleInfo) => { + Log.showInfo(TAG, `MigrateTo bundleInfo:${JSON.stringify(bundleInfo)}`); + //to next page + Router.push({ + uri: migrateUri, params: bundleInfo + }); + }); + //clear want + globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = null; + } +} + +} \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/resources/base/element/string.json b/product/default/notificationmanagement/src/main/resources/base/element/string.json new file mode 100644 index 00000000..a3b7823f --- /dev/null +++ b/product/default/notificationmanagement/src/main/resources/base/element/string.json @@ -0,0 +1,25 @@ +{ + "string": [ + { + "name": "app_name", + "value": "NotificationManagement" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "timing_on", + "value": "定时开启" + }, + { + "name": "allowDistribut", + "value": "允许通知同步" + }, + { + "name": "allowDistributDescribe", + "value": "开启后,本设备通知可同步到其他设备" + } + + ] +} \ No newline at end of file diff --git a/product/notificationmanagement/src/main/resources/base/media/ic_back.svg b/product/default/notificationmanagement/src/main/resources/base/media/ic_back.svg similarity index 100% rename from product/notificationmanagement/src/main/resources/base/media/ic_back.svg rename to product/default/notificationmanagement/src/main/resources/base/media/ic_back.svg diff --git a/product/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg b/product/default/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg similarity index 100% rename from product/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg rename to product/default/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg diff --git a/product/statusbar/src/main/resources/base/media/icon.png b/product/default/notificationmanagement/src/main/resources/base/media/icon.png similarity index 100% rename from product/statusbar/src/main/resources/base/media/icon.png rename to product/default/notificationmanagement/src/main/resources/base/media/icon.png diff --git a/product/default/notificationmanagement/src/main/resources/en_US/element/string.json b/product/default/notificationmanagement/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..1c41489c --- /dev/null +++ b/product/default/notificationmanagement/src/main/resources/en_US/element/string.json @@ -0,0 +1,24 @@ +{ + "string": [ + { + "name": "app_name", + "value": "NotificationManagement" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "timing_on", + "value": "Timing On" + }, + { + "name": "allowDistribut", + "value": "Allow Distribut Notification" + }, + { + "name": "allowDistributDescribe", + "value": "After this device is started, it can be synchronized to other devices" + } + ] +} \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/resources/zh_CN/element/string.json b/product/default/notificationmanagement/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..df357a1c --- /dev/null +++ b/product/default/notificationmanagement/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,24 @@ +{ + "string": [ + { + "name": "app_name", + "value": "NotificationManagement" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "timing_on", + "value": "定时开启" + }, + { + "name": "allowDistribut", + "value": "允许通知同步" + }, + { + "name": "allowDistributDescribe", + "value": "开启后,本设备通知可同步到其他设备" + } + ] +} \ No newline at end of file diff --git a/product/default/volumepanel/.gitignore b/product/default/volumepanel/.gitignore new file mode 100644 index 00000000..378eac25 --- /dev/null +++ b/product/default/volumepanel/.gitignore @@ -0,0 +1 @@ +build diff --git a/product/default/volumepanel/build.gradle b/product/default/volumepanel/build.gradle new file mode 100644 index 00000000..f04efab4 --- /dev/null +++ b/product/default/volumepanel/build.gradle @@ -0,0 +1,16 @@ +apply plugin: 'com.huawei.ohos.hap' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + entryModules "phone_entry,pc_entry" +} + +dependencies { + entryImplementation project(':phone_entry') + entryImplementation project(':pc_entry') + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + testCompile 'junit:junit:4.12' + implementation project(':features:volumepanelcomponent') +} \ No newline at end of file diff --git a/product/default/volumepanel/package.json b/product/default/volumepanel/package.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/product/default/volumepanel/package.json @@ -0,0 +1 @@ +{} diff --git a/product/default/volumepanel/src/main/config.json b/product/default/volumepanel/src/main/config.json new file mode 100644 index 00000000..19a549b2 --- /dev/null +++ b/product/default/volumepanel/src/main/config.json @@ -0,0 +1,56 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "singleton": true + }, + "deviceConfig": { + "default": { + "keepAlive": true + } + }, + "module": { + "package": "com.ohos.systemui.volumepanel", + "name": ".MyApplication", + "deviceType": [ + "phone", "tablet" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "default_volumepanel", + "moduleType": "feature" + }, + "abilities": [ + { + "visible": true, + "name": "com.ohos.systemui.volumepanel.ServiceExtAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "service", + "launchType": "singleton", + "srcPath": "ServiceExtAbility", + "srcLanguage": "ets" + } + ], + "js": [ + {"mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "pages": [ + "pages/index" + ], + "name": "ServiceExtAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/AbilityStage.ts b/product/default/volumepanel/src/main/ets/AbilityStage.ts new file mode 100644 index 00000000..fcdeeba1 --- /dev/null +++ b/product/default/volumepanel/src/main/ets/AbilityStage.ts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import AbilityStage from "@ohos.application.AbilityStage" +import Log from '../../../../../../common/src/main/ets/default/Log' + +const TAG = "volume_AbilityStage" +export default class MainAbilityStage extends AbilityStage { + onCreate() { + Log.showInfo(TAG, "onCreate") + } +} \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts new file mode 100644 index 00000000..ac826951 --- /dev/null +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021-2022 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 ServiceExtension from '@ohos.application.ServiceExtensionAbility' +import display from "@ohos.display"; +import Log from "../../../../../../../common/src/main/ets/default/Log"; +import WindowManager, { WindowType } from "../../../../../../../common/src/main/ets/default/WindowManager"; +import AbilityManager from "../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager"; +import VolumeWindowController from "../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController"; + +const TAG = "VolumePanel_ServiceExtAbility"; + +class ServiceExtAbility extends ServiceExtension { + onCreate(want) { + Log.showInfo(TAG, "api8New onCreate, want:" + want.abilityName); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_VOLUME_PANEL, this.context); + display.getDefaultDisplay().then((dis) => { + let volumeRect = { + left: 0, + top: 0, + width: dis.width, + height: dis.height, + }; + + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, "dis", { + width: dis.width, + height: dis.height, + }); + WindowManager.createWindow(this.context, WindowType.VOLUME_PANEL, volumeRect, "pages/index") + .then((win) => { + Log.showInfo(TAG, `api8New onCreate, createWindow callback`); + VolumeWindowController.getInstance().setWindowHandle(win); + }) + .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); + }); + } + + onDestroy() { + Log.showInfo(TAG, "api8New onDestroy"); + } +} + +export default ServiceExtAbility; diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/app.ets b/product/default/volumepanel/src/main/ets/ServiceExtAbility/app.ets new file mode 100644 index 00000000..8a989da2 --- /dev/null +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/app.ets @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021 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 AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager' + +export default { + onCreate() { + console.info('SystemUI volumePanel Application onCreate') + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis') + let volumeRect; + if (configInfo.width > configInfo.height) { // Pad、PC Mode + const realWidth = 48; + const realHeight = 284; + volumeRect = { + left: configInfo.width - vp2px(16) - vp2px(realWidth), + top: (configInfo.height - vp2px(realHeight) ) / 2, + width: vp2px(realWidth) , + height: vp2px(realHeight) + } + } else { // Phone Mode + const realWidth = 96; + const realHeight = 568; + volumeRect = { + left: configInfo.width - vp2px(32) - vp2px(realWidth), + top: configInfo.height * 0.1, + width: vp2px(realWidth) , + height: vp2px(realHeight) + } + } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'rect', volumeRect) + WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); + }, + onDestroy() { + console.info('SystemUI volumePanel Application onDestroy') + }, +} diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts new file mode 100644 index 00000000..b410ff8d --- /dev/null +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; + +const TAG = 'VolumePanel-StyleConfiguration'; + +export default class StyleConfiguration { + static getIndexStyle() { + const key: string = TAG + "-Index"; + return StyleManager.getStyle(key, () => { + return {}; + }); + } +} \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleManager.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleManager.ts new file mode 100644 index 00000000..f074b6d1 --- /dev/null +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleManager.ts @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import StyleConfiguration from '../../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration' + +const TAG = 'VolumePanel-StyleManager'; + +export default class StyleManager { + static STANDARD_DISPLAY_WIDTH: number = 2560; + static STANDARD_DISPLAY_HEIGHT: number = 1600; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + + static setStyle() { + Log.showInfo(TAG, `setStyle`) + + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis'); + StyleManager.maxWidth = config.width; + + // Pad、PC Mode + { + let style: any = StyleConfiguration.getVolumePanelComponentStyle(); + style.volumePanelSliderMarginTop = StyleManager.calcScaleSizePx(40); + style.volumePanSliderWidth = px2vp(StyleManager.calcScaleSize(8)) + 'vp'; + style.volumePanSliderHeight = StyleManager.calcScaleSizePx(320); + style.volumePanelSliderMarginBottom = StyleManager.calcScaleSizePx(40); + style.volumePanelMutBtnIconSize = StyleManager.calcScaleSizePx(48); + style.volumePanelMutBtnIconMarginBottom = StyleManager.calcScaleSizePx(24); + style.volumePanelMuteBtnHeight = StyleManager.calcScaleSizePx(72); + style.volumePanelSettingIconSize = StyleManager.calcScaleSizePx(48); + style.volumePanelSettingButtonSize = StyleManager.calcScaleSizePx(96); + style.volumePanelBackground = '#99FFFFFF' + style.volumePanelSliderBlockColor = '#FFFFFFFF' + style.volumePanelDividerHeight = StyleManager.calcScaleSizePx(1); + style.volumePanelDefaultMin = StyleManager.calcScaleSizePx(0); + style.volumePanelBorderRadius = StyleManager.calcScaleSizePx(48); + style.volumeDividerWidth = StyleManager.calcScaleSizePx(60); + style.volumeSliderTrackColor = '#FFAEE6E6'; + style.volumeSelectedColor = '#FF007DFF'; + style.volumeButtonBackgroundColor = '#00000000'; + style.volumePanelRingModeColor = '#FF007DFF'; + style.volumePanelDividerColor = '#FF9BCECE' + style.volumePanelSettingColor = '#FF4D6666' + + } + + } + + static number2px(n: number): string { + return n.toString() + 'px'; + } + + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/constants.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/constants.ts new file mode 100644 index 00000000..2e686de4 --- /dev/null +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/constants.ts @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + +} \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/pages/index.ets b/product/default/volumepanel/src/main/ets/ServiceExtAbility/pages/index.ets new file mode 100644 index 00000000..d5a0618e --- /dev/null +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/pages/index.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2021-2022 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 Constants from '../common/constants' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' +import VolumePanelComponent from '../../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent' +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import StyleManager from '../common/StyleManager' + +const TAG = 'VolumePanel-Index' + +@Entry +@Component +struct Index { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis') + Log.showInfo(TAG, `configInfo Start, configInfo ${JSON.stringify(configInfo)}`); + if (configInfo.width > configInfo.height) { // Pad、PC Mode + StyleManager.setStyle() + } + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`) + } + + build() { + Column() { + VolumePanelComponent() + } + .width('100%') + .height('100%') + } +} diff --git a/product/notificationmanagement/src/main/resources/zh_CN/element/string.json b/product/default/volumepanel/src/main/resources/base/element/string.json similarity index 80% rename from product/notificationmanagement/src/main/resources/zh_CN/element/string.json rename to product/default/volumepanel/src/main/resources/base/element/string.json index 2afcf614..4b8592f0 100644 --- a/product/notificationmanagement/src/main/resources/zh_CN/element/string.json +++ b/product/default/volumepanel/src/main/resources/base/element/string.json @@ -2,7 +2,7 @@ "string": [ { "name": "app_name", - "value": "NotificationManagement" + "value": "VolumePanel" }, { "name": "mainability_description", diff --git a/product/default/volumepanel/src/main/resources/base/media/icon.png b/product/default/volumepanel/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 O0000p|QSiQtDM(hZq=s)&H#V@1^KJ+#` z@^Ro6TXcH!0&a(&3e(>+X6@*5mUESOkvt(eCXi*Jj9O096%pyJ4G9^2Y!^8=lwvF; zL$*mc7Hb?#V9+vPd&GZ3A5}T6vSM2oI~~?#Vc07m=d#LW S!BL { - ListItem() { - AppItemComponent({ - appIcon: item.appIcon, - appTitle: item.appTitle, - appSummary: item.appSummary, - appValue: item.appValue, - appArrow: item.appArrow, - appArrowStyle: '', - appUri: '', - appBundleName:item.appBundleName, - appUid:item.appUid, - appSwitch:1 - }); - } - .height($r('app.float.appitem_item_height')); - }); - } - .divider({ - strokeWidth: 1, - color: $r('app.color.background_color'), - startMargin: $r('app.float.divider_margin_l'), - endMargin: $r('app.float.divider_margin_r') - }) - .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100) - .margin({ bottom: '90' }) - .visibility(Visibility.Visible) - .zIndex(0); - } - .align(Alignment.Center) - .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100) - .border({ width: $r('app.float.border_width'), color:Color.White, - radius:$r('app.float.border_radius') }) - } - - aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) - } - - onBackPress() { - Log.showInfo(TAG, `onBackPress`) - Router.back(); - } - -} diff --git a/product/notificationmanagement/src/main/ets/default/pages/noDisturb.ets b/product/notificationmanagement/src/main/ets/default/pages/noDisturb.ets deleted file mode 100644 index 8e6fa6da..00000000 --- a/product/notificationmanagement/src/main/ets/default/pages/noDisturb.ets +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets'; -import ConfigData from '../common/constants.ets'; -import Router from '@system.router' -import DateAndTime from '../../../../../../../common/src/main/ets/default/DateAndTimeUtil.ets'; -import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets'; -import ViewModel from '../vm/noDisturbViewModel.ets' - -const TAG = 'NotificationManagement-NoDisturb'; - -@Entry -@Component -export default struct NoDisturb { - @State mViewModel: ViewModel = new ViewModel() - startTimeDialogController: CustomDialogController = new CustomDialogController({ - builder: TimeDialog({ - action: this.mViewModel.onStartTimeAccept.bind(this.mViewModel), - title: $r('app.string.startTime'), - defaultDate: this.mViewModel.defaultStartTime - }), - cancel: this.mViewModel.onCancel.bind(this.mViewModel), - autoCancel: false, - offset: { dx: 0, dy: 200 } - }); - endTimeDialogController: CustomDialogController = new CustomDialogController({ - builder: TimeDialog({ - action: this.mViewModel.onEndTimeAccept.bind(this.mViewModel), - title: $r('app.string.endTime'), - defaultDate: this.mViewModel.defaultEndTime - }), - cancel: this.mViewModel.onCancel.bind(this.mViewModel), - autoCancel: false, - offset: { dx: 0, dy: 200 } - }); - repeatDialogController: CustomDialogController = new CustomDialogController({ - builder: RepeatModeDialog({ - action: this.mViewModel.onRepeatModeAccect.bind(this.mViewModel), - title: $r('app.string.repeat'), - selectMode: this.mViewModel.repeatMode - }), - cancel: this.mViewModel.onCancel.bind(this.mViewModel), - autoCancel: false, - offset: { dx: 0, dy: 200 } - }); - - build() { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { - HeadComponent({ headName: $r('app.string.noDisturb'), isActive: true }) - - Row() { - ItemComponent({ - title: $r('app.string.repeat'), - value: $r('app.string.daily'), - arrow: $r('app.media.ic_settings_arrow') - }) - }.onClick(() => { - this.repeatDialogController.open() - }).margin({ left: $r('app.float.page_margin_l'), right: $r('app.float.page_margin_r') }) - - - Row() { - ItemComponent({ - title: $r('app.string.startTime'), - value: this.mViewModel.startTime, - arrow: $r('app.media.ic_settings_arrow') - }) - }.onClick(() => { - this.startTimeDialogController.open() - }).margin({ left: $r('app.float.page_margin_l'), right: $r('app.float.page_margin_r') }) - - Row() { - ItemComponent({ - title: $r('app.string.endTime'), - value: this.mViewModel.endTimeClue, - arrow: $r('app.media.ic_settings_arrow') - }) - }.onClick(() => { - this.endTimeDialogController.open() - }).margin({ left: $r('app.float.page_margin_l'), right: $r('app.float.page_margin_r') }) - }.backgroundColor($r('app.color.background_color')) - } - - aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) - this.mViewModel.ViewModelInit() - - } - - onBackPress() { - Log.showInfo(TAG, `onBackPress`) - Router.back(); - } -} - -/** - * select time dialog - */ -@CustomDialog -struct TimeDialog { - public controller: CustomDialogController - public action: (data) => void - private selectedTime: string - private title: string= '' - private defaultDate: Date= new Date() - - build() { - Column() { - Column() { - Text(this.title) - .height($r('app.float.dialog_title_height')) - .margin({ left: $r('app.float.dialog_title_margin_l') }) - .width(ConfigData.WH_100_100) - .fontSize($r('app.float.dialog_title_font')) - .fontWeight(FontWeight.Bold) - DatePicker({ selected: this.defaultDate, type: DatePickerType.Time }) - .useMilitaryTime(true) - .onChange((date: DatePickerResult) => { - this.selectedTime = DateAndTime.concatTime(date.hour, date.minute); - }) - .width(ConfigData.WH_100_100) - .height($r('app.float.timeDialog_datePicker_height')) - } - - Row() { - Column() { - Text($r('app.string.cancel')) - .fontSize($r('app.float.dialog_button_font')) - .fontColor(Color.Blue) - - }.onClick(() => { - this.controller.close(); - }) - .alignItems(HorizontalAlign.Center) - .width(ConfigData.WH_50_100); - Divider() - .vertical(true) - .color($r('app.color.divider_color')) - .strokeWidth(1) - .height($r('app.float.divider_height')) - Column() { - Text($r('app.string.confirm')) - .fontSize($r('app.float.dialog_button_font')) - .fontColor(Color.Blue) - - }.onClick(() => { - Log.showInfo(TAG, `confirm button of TimeDialog on click`) - this.controller.close(); - this.action(this.selectedTime); - }) - .alignItems(HorizontalAlign.Center) - .width(ConfigData.WH_50_100) - } - .width(ConfigData.WH_100_100) - .height($r('app.float.dialog_button_height')) - } - .height($r('app.float.timeDialog_height')) - .width(ConfigData.WH_100_100) - } -} - -/** - * select repeat Mode dialog - */ -@CustomDialog -struct RepeatModeDialog { - public controller: CustomDialogController - public action: (data) => void - private title: string= '' - private selectMode: number= 2 //TODO - @State isNo: boolean = true - - build() { - Column({ space: 30 }) { - Column() { - Text(this.title) - .height($r('app.float.dialog_title_height')) - .margin({ left: $r('app.float.dialog_title_margin_l') }) - .width(ConfigData.WH_100_100) - .fontSize($r('app.float.dialog_title_font')) - .fontWeight(FontWeight.Bold) - Row() { - Text($r('app.string.daily')) - .fontSize($r('app.float.repeatDialog_cont_font')) - .fontColor(Color.Black) - .width(ConfigData.WH_70_100) - .textAlign(TextAlign.Start) - .align(Alignment.Start) - Toggle({ type: ToggleType.Checkbox, isOn: this.isNo }) - .align(Alignment.End) - .width($r('app.float.toggle_check_width')) - .height($r('app.float.toggle_check_width')) - .onChange((data) => { - //TODO - this.selectMode = 2 - this.isNo = true - }) - } - } - - Row() { - Column() { - Text($r('app.string.cancel')) - .fontSize($r('app.float.dialog_button_font')) - .fontColor(Color.Blue) - - }.onClick(() => { - this.controller.close(); - }) - .alignItems(HorizontalAlign.Center) - .width(ConfigData.WH_50_100); - Divider() - .vertical(true) - .color($r('app.color.divider_color')) - .strokeWidth(1) - .height($r('app.float.divider_height')) - Column() { - Text($r('app.string.confirm')) - .fontSize($r('app.float.dialog_button_font')) - .fontColor(Color.Blue) - - }.onClick(() => { - Log.showInfo(TAG, `confirm button of TimeDialog on click`) - this.controller.close(); - this.action(this.selectMode); - }) - .alignItems(HorizontalAlign.Center) - .width(ConfigData.WH_50_100) - } - .width(ConfigData.WH_100_100) - .height($r('app.float.dialog_button_height')) - } - .height($r('app.float.repeatDialog_height')) - .width(ConfigData.WH_100_100) - } -} diff --git a/product/notificationmanagement/src/main/ets/default/pages/notificationManagenment.ets b/product/notificationmanagement/src/main/ets/default/pages/notificationManagenment.ets deleted file mode 100644 index 38dacaec..00000000 --- a/product/notificationmanagement/src/main/ets/default/pages/notificationManagenment.ets +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//import Window from '@ohos.window'; - -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets'; -import NoDisturbComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets'; -import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets'; -import ConfigData from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants.ets'; -import AppLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets'; -import Router from '@system.router'; - -const TAG = 'NotificationManagement-Main'; - -@Entry -@Component -export default struct notificationManagenment { - build() { - Column() { - Row() { - HeadComponent({ headName: $r('app.string.notification'), isActive: true }); - }.flexShrink(0) - - Row() { - Text($r('app.string.noDisturb')) - .fontSize($r('app.float.page_phrases_font')) - .height($r('app.float.page_phrases_height')) - .margin({ left: $r('app.float.page_margin_l'), bottom: $r('app.float.page_margin_t') }) - }.align(Alignment.Start) - .width(ConfigData.WH_100_100) - .flexShrink(0) - - Row() { - NoDisturbComponent() - } - .align(Alignment.Start) - .onClick(() => { - Log.showInfo(TAG, `NoDisturbComponent on click`) - Router.push({ uri: 'pages/noDisturb'}); - }).width(ConfigData.WH_100_100) - .flexShrink(0) - - Row() { - Text($r('app.string.notificationManagement')) - .fontSize($r('app.float.page_phrases_font')) - .height($r('app.float.page_phrases_height')) - .margin({ left: $r('app.float.page_margin_l'), bottom: $r('app.float.page_margin_t') }) - }.align(Alignment.Start) - .width(ConfigData.WH_100_100) - .flexShrink(0) - - Row() { - ItemComponent({ title: $r('app.string.batch_Management'), value: '', arrow: $r('app.media.ic_settings_arrow') }) - }.onClick(() => { - Log.showInfo(TAG, `BatchManagement on click`) - Router.push({ uri: 'pages/batchSetEnable' }); - }).width(ConfigData.WH_100_100) - .flexShrink(0) - - Column() { - AppLstComponent() - }.flexShrink(1) - } - .backgroundColor($r('app.color.background_color')) - .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100); - } - - aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) - } - - aboutToDisappear(): void{ - Log.showInfo(TAG, `aboutToDisappear`) - } - - onPageShow(): void{ - Log.showInfo(TAG, `onPageShow`) - } - - onBackPress() { - Log.showInfo(TAG, `onBackPress`) - } -} diff --git a/product/notificationmanagement/src/main/ets/default/pages/setEnable.ets b/product/notificationmanagement/src/main/ets/default/pages/setEnable.ets deleted file mode 100644 index 1481d29f..00000000 --- a/product/notificationmanagement/src/main/ets/default/pages/setEnable.ets +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//import Window from '@ohos.window'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets'; -import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets'; -import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets'; -import SlotLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets'; -import ConfigData from '../common/constants.ets'; -import Router from '@system.router' - -const TAG = 'NotificationManagement-SetEnable'; - -let appInfo; - -@Entry -@Component -export default struct SetEnable { - build() { - Flex({ justifyContent: FlexAlign.SpaceBetween }) { - Column({ space: 30 }) { - HeadComponent({ headName: $r('app.string.notificationManagement'), isActive: true }); - Row() { - AppItemComponent({ - appIcon: appInfo.appIcon, - appTitle: appInfo.appTitle, - appSummary: appInfo.appSummary, - appValue: '', - appArrow: appInfo.appArrow, - appArrowStyle: '', - appUri: appInfo.appUri, - appBundleName: appInfo.appBundleName, - appUid: appInfo.appUid, - appSwitch: 0 - }); - } - .margin({ left: $r('app.float.page_margin_l'), right: $r('app.float.page_margin_r') }) - .align(Alignment.Start) - .backgroundColor($r('app.color.background_color')) - - - Row() { - SwitchComponent({ - title: $r('app.string.allowNotification'), - appBundleName: appInfo.appBundleName, - appUid: appInfo.appUid - }) - }.margin({ left: $r('app.float.page_margin_l'), - right: $r('app.float.page_margin_r') }) - .align(Alignment.Start) - - Row() { - SlotLstComponent({ appBundleName: appInfo.appBundleName, - appUid: appInfo.appUid }) - } - .align(Alignment.Start) - } - .alignItems(HorizontalAlign.Start) - .backgroundColor($r('app.color.background_color')) - .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100) - } - .width(ConfigData.WH_100_100) - - } - - aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) - appInfo = Router.getParams(); - } - - onBackPress() { - Log.showInfo(TAG, `onBackPress`) - Router.back(); - } -} diff --git a/product/notificationmanagement/src/main/ets/default/vm/noDisturbViewModel.ets b/product/notificationmanagement/src/main/ets/default/vm/noDisturbViewModel.ets deleted file mode 100644 index 3d1d51fa..00000000 --- a/product/notificationmanagement/src/main/ets/default/vm/noDisturbViewModel.ets +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2021 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 ConfigData from '../common/constants.ets'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ets'; -import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ets'; - -const TAG = 'NotificationManagement-NoDisturbViewModel' - -export default class NoDisturbViewModel extends NoDisturbComponentViewModel { - - endTimeClue: string = '' - - setClues() { - Log.showInfo(TAG, `setClues`) - if (this.startTime > this.endTime) { - this.endTimeClue = ConfigData.NEXT_DAY_NAME + this.endTime - } else { - this.endTimeClue = this.endTime - } - this.defaultStartTime = this.getDateByHHMI(this.startTime) - this.defaultEndTime = this.getDateByHHMI(this.endTime) - } - - setNoDisturbingDate() { - let noDisturbingTime = { - type: this.repeatMode, begin: this.defaultStartTime, end: this.defaultEndTime - } - NoDisturbingModel.setNoDisturbingDate(noDisturbingTime, () => { - Log.showInfo(TAG, 'setNoDisturbingDate is success') - }) - } - - onStartTimeAccept(data) { - Log.showInfo(TAG, `onStartTimeAccept`) - this.startTime = data - this.setClues() - this.setNoDisturbingDate() - - } - - onEndTimeAccept(data) { - Log.showInfo(TAG, `onEndTimeAccept`) - this.endTime = data - this.setClues() - this.setNoDisturbingDate() - } - - onRepeatModeAccect(data) { - Log.showInfo(TAG, `onRepeatModeAccect`) - this.setNoDisturbingDate() - } - - onCancel() { - Log.showInfo(TAG, `onCancel`) - } -} \ No newline at end of file diff --git a/product/notificationmanagement/src/main/resources/base/element/color.json b/product/notificationmanagement/src/main/resources/base/element/color.json deleted file mode 100644 index 9239d9af..00000000 --- a/product/notificationmanagement/src/main/resources/base/element/color.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "color": [ - { - "name": "color_333333_grey", - "value": "#333333" - }, - { - "name": "color_999999_grey", - "value": "#999999" - }, - { - "name": "color_D4D4D4_grey", - "value": "#d4d4d4" - }, - { - "name": "color_E3E3E3_grey", - "value": "#E3E3E3" - }, - { - "name": "color_00000000_transparent", - "value": "#00000000" - }, - { - "name": "color_FBFBFB_grey", - "value": "#FBFBFB" - }, - { - "name": "color_F2F2F2_grey", - "value": "#F2F2F2" - } - ] -} \ No newline at end of file diff --git a/product/notificationmanagement/src/main/resources/base/element/float.json b/product/notificationmanagement/src/main/resources/base/element/float.json deleted file mode 100644 index 4ec88ecc..00000000 --- a/product/notificationmanagement/src/main/resources/base/element/float.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "float": [ - { - "name": "wh_border_1", - "value": "1" - }, - { - "name": "radius_border_30", - "value": "30" - }, - { - "name": "wh_value_5", - "value": "5" - }, - { - "name": "wh_value_10", - "value": "10" - }, - { - "name": "wh_value_15", - "value": "15" - }, - { - "name": "wh_value_50", - "value": "50" - }, - { - "name": "wh_value_20", - "value": "20" - }, - { - "name": "wh_value_30", - "value": "30" - }, - { - "name": "wh_value_40", - "value": "40" - }, - { - "name": "wh_value_60", - "value": "60" - }, - { - "name": "wh_value_65", - "value": "65" - }, - { - "name": "wh_value_70", - "value": "70" - }, - { - "name": "wh_value_100", - "value": "100" - }, - { - "name": "wh_value_280", - "value": "280" - }, - { - "name": "wh_value_590", - "value": "590" - }, - { - "name": "font_16", - "value": "16" - }, - { - "name": "font_18", - "value": "18" - }, - { - "name": "font_20", - "value": "20" - }, - { - "name": "font_24", - "value": "24" - } - ] -} \ No newline at end of file diff --git a/product/statusbar/.gitignore b/product/pc/controlpanel/.gitignore similarity index 100% rename from product/statusbar/.gitignore rename to product/pc/controlpanel/.gitignore diff --git a/product/pc/controlpanel/build.gradle b/product/pc/controlpanel/build.gradle new file mode 100644 index 00000000..37139a6a --- /dev/null +++ b/product/pc/controlpanel/build.gradle @@ -0,0 +1,22 @@ +apply plugin: 'com.huawei.ohos.hap' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + entryModules "pc_entry" +} + +dependencies { + entryImplementation project(':pc_entry') + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + testCompile 'junit:junit:4.12' + implementation project(':features:controlcentercomponent') + implementation project(':features:airplanecomponent') + implementation project(':features:autorotatecomponent') + implementation project(':features:bluetoothcomponent') + implementation project(':features:brightnesscomponent') + implementation project(':features:locationcomponent') + implementation project(':features:ringmodecomponent') + implementation project(':features:wificomponent') +} diff --git a/product/pc/controlpanel/package.json b/product/pc/controlpanel/package.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/product/pc/controlpanel/package.json @@ -0,0 +1 @@ +{} diff --git a/product/pc/controlpanel/src/main/config.json b/product/pc/controlpanel/src/main/config.json new file mode 100644 index 00000000..8b39a12d --- /dev/null +++ b/product/pc/controlpanel/src/main/config.json @@ -0,0 +1,67 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1, + "name": "1.0" + }, + "singleton": true + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.controlpanel", + "name": ".MyApplication", + "deviceType": [ + "tablet" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "pc_controlpanel", + "moduleType": "feature" + }, + "abilities": [ + { + "visible": true, + "skills": [ + { + "actions": [ + "com.ohos.systemui.action.BAR_ICON" + ] + } + ], + "name": "com.ohos.systemui.controlpanel.ServiceExtAbility", + "icon": "$media:ic_controlcenter_oh", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "service", + "launchType": "singleton", + "srcPath": "ServiceExtAbility", + "srcLanguage": "ets", + "metaData": { + "customizeData" : [ + { + "name": "com.ohos.systemui.action.BAR_ICON", + "value": "", + "extra": "\"pluginType\":\"1\",\"clickAction\":\"local=showControlCenter\",\"selectedClickAction\":\"local=hideControlCenter\",\"relationWindowId\":\"SystemUi_ControlPanel\"" + } + ] + } + } + ], + "js": [ + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "name": "ServiceExtAbility", + "window": { + "designWidth": 1280, + "autoDesignWidth": false + }, + "pages": ["pages/index"] + } + ] + } +} \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/AbilityStage.ts b/product/pc/controlpanel/src/main/ets/AbilityStage.ts new file mode 100644 index 00000000..858fe570 --- /dev/null +++ b/product/pc/controlpanel/src/main/ets/AbilityStage.ts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import AbilityStage from "@ohos.application.AbilityStage" +import Log from '../../../../../../common/src/main/ets/default/Log' + +const TAG = "ControlPanel_AbilityStage" +export default class MainAbilityStage extends AbilityStage { + onCreate() { + Log.showInfo(TAG, "onCreate") + } +} \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts new file mode 100644 index 00000000..f018fc24 --- /dev/null +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021-2022 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 ServiceExtension from '@ohos.application.ServiceExtensionAbility' +import display from "@ohos.display"; +import Log from "../../../../../../../common/src/main/ets/default/Log"; +import WindowManager, { + WindowType +} from "../../../../../../../common/src/main/ets/default/WindowManager"; +import AbilityManager from "../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager"; + +const TAG = "ControlPanel_ServiceExtAbility"; + +class ServiceExtAbility extends ServiceExtension { + async onCreate(want) { + Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_CONTROL_PANEL, this.context); + + let dis = await display.getDefaultDisplay(); + Log.showInfo(TAG, `api8New onCreate, dis: ${JSON.stringify(dis)}`); + let rect = { + left: (872 * dis.width) / 1280, + top: (44 * dis.width) / 1280, + width: (402 * dis.width) / 1280, + height: (310 * dis.width) / 1280, + }; + + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, "rect", rect); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, "dis", { + width: dis.width, + height: dis.height, + }); + WindowManager.createWindow(this.context, WindowType.CONTROL_PANEL, rect, "pages/index").then(() => { + Log.showInfo(TAG, `createWindow success.`); + }); + } + + onDestroy() { + Log.showInfo(TAG, "onDestroy"); + } +} + +export default ServiceExtAbility; diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/app.ets b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/app.ets new file mode 100644 index 00000000..5d2d9ef2 --- /dev/null +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/app.ets @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 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 default { + onCreate() { + console.info('SystemUI ControlPanel Application onCreate') + }, + onDestroy() { + console.info('SystemUI ControlPanel Application onDestroy') + }, +} diff --git a/common/src/main/ets/plugindatasource/common/Constants.ets b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts similarity index 39% rename from common/src/main/ets/plugindatasource/common/Constants.ets rename to product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts index 86218d6b..44173d27 100644 --- a/common/src/main/ets/plugindatasource/common/Constants.ets +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,47 +12,37 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import {FASlotName} from '../../../../../../../../../common/src/main/ets/default/Constants'; -export default class Constants { - static INIT_CONFIG = "initConfig"; - static INIT_FINISH = "initFinish"; - static CLEAR_ALL = "clearAll"; - static ADD_ITEM = "addItem"; - static REMOVE_ITEM = "removeItem"; - static LOAD_DATA = "loadData"; - static DEFAULT_USER_ID = 0; - static DEFAULT_BUNDLE_FLAG = 0x00000020 | 0x00000008; -} - -export enum PluginType { - SIMPLE = 1, - OBSERVER = 2, - LISTENER = 3, -} - -export function obtainMsg(action, data) { - return { "action": action, "data": data }; -} - -export class ItemComponentData { +type pluginIconData = { id: string; - pluginType: number; - deviceId: string; bundleName: string; abilityName: string; - abilityLabelId: number; - abilityIconId: number; - label: string; - iconUrl: Resource | string; - template?: string; - state?: any; - actionData?: ActionData; -} +}; +type Config = { + ComplexToggleLayout: Array; + DefaultSimpleToggleLayout: Array; + LocalToggles: { + ComplexToggles: Array; + SimpleToggles: Array; + }; + MetaToggles: Array; +}; + +const ControlCenterConfig: Config = { + ComplexToggleLayout: [FASlotName.WIFI, FASlotName.BLUETOOTH], + DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION], + LocalToggles: { + ComplexToggles: [FASlotName.AIR_PLANE, FASlotName.BLUETOOTH, FASlotName.WIFI], + SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE], + }, + MetaToggles: [ + { + id: "screenshot", + bundleName: "com.ohos.screenshot", + abilityName: "com.ohos.screenshot.ServiceExtAbility", + }, + ], +}; -export class ActionData { - clickAction?: string; - longClickAction?: string; - launchType?: number; - pluginData?: any; - extra?: any; -} \ No newline at end of file +export default ControlCenterConfig; diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts new file mode 100644 index 00000000..e54b8095 --- /dev/null +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../../common/src/main/ets/default/StyleManager'; + +const TAG = 'ControlPanel-StyleConfiguration'; + +export default class StyleConfiguration { + static getIndexStyle() { + const key: string = TAG + "-Index"; + return StyleManager.getStyle(key, () => { + return { + borderRadius: $r('app.float.default_border_radius') + }; + }); + } +} \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts new file mode 100644 index 00000000..ec385fe1 --- /dev/null +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import CommonTemplateStyleConfiguration from '../../../../../../../../../common/src/main/ets/template/common/StyleConfiguration'; +import ControlCenterStyleConfiguration from '../../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration' +import BrightnessStyleConfiguration from '../../../../../../../../../features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration' +import RingModeStyleConfiguration from '../../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration' +import IndexStyleConfiguration from './StyleConfiguration' + +const TAG = 'ControlPanel-StyleManager'; + +export default class StyleManager { + static STANDARD_DISPLAY_WIDTH: number = 1280; + static STANDARD_DISPLAY_HEIGHT: number = 800; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + + static setStyle() { + Log.showInfo(TAG, `setStyle`) + + let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'dis'); + StyleManager.maxWidth = dis.width; + + // Index + { + let style: any = IndexStyleConfiguration.getIndexStyle(); + style.borderRadius = StyleManager.calcScaleSizePx(24); + } + + // ControlCenter + { + let style: any = ControlCenterStyleConfiguration.getControlCenterComponentStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(20); + style.marginRight = StyleManager.calcScaleSizePx(20); + style.marginTop = StyleManager.calcScaleSizePx(0); + style.upTitleHeight = StyleManager.calcScaleSizePx(56); + style.titleMarginBottom = StyleManager.calcScaleSizePx(0); + style.toggleAreaGap = StyleManager.calcScaleSizePx(12); + style.simpleToggleLayoutMarginTop = StyleManager.calcScaleSizePx(23); + style.simpleToggleLayoutMarginBottom = StyleManager.calcScaleSizePx(0); + style.brightnessMarginBottom = StyleManager.calcScaleSizePx(12); + style.componentBorderRadius = StyleManager.calcScaleSizePx(24); + style.componentBackgroundColor = '#99FFFFFF'; + } + + // ControlCenter-Title + { + let style: any = ControlCenterStyleConfiguration.getControlCenterUpTitleStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(24); + style.marginRight = StyleManager.calcScaleSizePx(21); + style.fontSize = StyleManager.calcScaleSizePx(20); + style.fontColor = '#000000'; + style.imageWidth = StyleManager.calcScaleSizePx(24); + style.imageHeight = StyleManager.calcScaleSizePx(24); + style.imageHoverWidth = StyleManager.calcScaleSizePx(32); + style.imageHoverHeight = StyleManager.calcScaleSizePx(32); + style.imageHoverRadius = StyleManager.calcScaleSizePx(8); + style.imageHoverColor = 'rgba(0, 0, 0, 0.05)'; + style.imageTransparentColor = 'rgba(255, 255, 255, 0)'; + style.upTitleSpace = StyleManager.calcScaleSizePx(24); + style.titleImageColor = '#ff182431'; + } + + // ControlCenter-ComplexToggleLayout + { + let style: any = ControlCenterStyleConfiguration.getControlCenterComplexToggleLayoutStyle(); + style.columnGap = StyleManager.calcScaleSizePx(12); + style.rowGap = StyleManager.calcScaleSize(12); + style.rowHeight = StyleManager.calcScaleSize(66); + } + + // ControlCenter-SimpleToggleLayout + { + let style: any = ControlCenterStyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(11); + style.marginRight = StyleManager.calcScaleSizePx(11); + style.columnGap = StyleManager.calcScaleSizePx(0); + style.rowGap = StyleManager.calcScaleSize(0); + style.rowHeight = StyleManager.calcScaleSize(81); + } + + // CommonTemplate-iconTitleBase + { + let style: any = CommonTemplateStyleConfiguration.getIconTitleBaseStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(8); + style.marginRight = StyleManager.calcScaleSizePx(4); + style.componentGap = StyleManager.calcScaleSizePx(8); + style.titleSize = StyleManager.calcScaleSizePx(12); + style.titleColor = $r("sys.color.ohos_id_color_text_secondary"), + style.borderRadius = StyleManager.calcScaleSizePx(24); + style.backgroundColor = '#99FFFFFF'; + style.textMargin = StyleManager.calcScaleSizePx(8); + style.textHoverHeight = StyleManager.calcScaleSizePx(26); + style.textHoverWidth = StyleManager.calcScaleSizePx(68); + style.textHoverRadius = StyleManager.calcScaleSizePx(4); + style.hoverColor = 'rgba(0, 0, 0, 0.05)'; + style.transparentColor = 'rgba(255, 255, 255, 0)'; + } + + // CommonTemplate-iconComponent + { + let style: any = CommonTemplateStyleConfiguration.getIconComponentStyle(); + style.circleWidth = StyleManager.calcScaleSizePx(48); + style.circleHeight = StyleManager.calcScaleSizePx(48); + style.iconWidth = StyleManager.calcScaleSizePx(24); + style.iconHeight = StyleManager.calcScaleSizePx(24); + style.iconOffBG = '#1A000000'; + style.iconOnBG = '#FF007DFF'; + style.iconOnColor = '#FFFFFFFF'; + style.iconOffColor = $r("sys.color.ohos_id_color_secondary"); + style.hoverColor = 'rgba(0, 0, 0, 0.05)'; + style.transparentColor = 'rgba(255, 255, 255, 0)'; + } + + // CommonTemplate-simpleToggleBase + { + let style: any = CommonTemplateStyleConfiguration.getSimpleToggleBaseStyle(); + style.circleWidth = StyleManager.calcScaleSizePx(48); + style.circleHeight = StyleManager.calcScaleSizePx(48); + style.iconWidth = StyleManager.calcScaleSizePx(24); + style.iconHeight = StyleManager.calcScaleSizePx(24); + style.dragCircleWidth = StyleManager.calcScaleSizePx(60); + style.dragCircleHeight = StyleManager.calcScaleSizePx(60); + style.dragIconWidth = StyleManager.calcScaleSizePx(36); + style.dragIconHeight = StyleManager.calcScaleSizePx(36); + style.iconOffBG = '#1A000000'; + style.iconOnBG = '#FF007DFF'; + style.iconOnColor = '#FFFFFFFF'; + style.iconOffColor = $r("sys.color.ohos_id_color_secondary"); + style.componentGap = StyleManager.calcScaleSizePx(4); + style.titleSize = StyleManager.calcScaleSizePx(12); + style.titleColor = $r("sys.color.ohos_id_color_text_secondary"); + style.textHoverWidth = StyleManager.calcScaleSizePx(68); + style.textHoverHeight = StyleManager.calcScaleSizePx(18); + style.textHoverRadius = StyleManager.calcScaleSizePx(4); + style.hoverColor = 'rgba(0, 0, 0, 0.05)'; + style.transparentColor = 'rgba(255, 255, 255, 0)'; + } + + // Brightness + { + let style: any = BrightnessStyleConfiguration.getBrightnessComponentStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(12.5); + style.marginRight = StyleManager.calcScaleSizePx(12.5); + style.componentGap = StyleManager.calcScaleSizePx(8.5); + style.brightnessIconColor = $r("sys.color.ohos_id_color_secondary"); + style.brightnessReduceWidth = StyleManager.calcScaleSizePx(22); + style.brightnessReduceHeight = StyleManager.calcScaleSizePx(22); + style.brightnessPlusWidth = StyleManager.calcScaleSizePx(22); + style.brightnessPlusHeight = StyleManager.calcScaleSizePx(22); + style.brightnessHeight = StyleManager.calcScaleSizePx(40); + style.sliderHeight = px2vp(StyleManager.calcScaleSize(20)) + 'vp'; + style.sliderBlockColor = '#FFFFFFFF'; + style.sliderTrackColor = '#0D000000'; + style.sliderSelectedColor = '#FF007DFF'; + } + + // RingMode + { + let style: any = RingModeStyleConfiguration.getControlCenterRingModeComponentStyle(); + style.brightnessIconColor = '#FFFF9800'; + } + + // SimpleToggleLayoutEdit + { + let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(0); + style.marginRight = StyleManager.calcScaleSizePx(0); + style.marginTop = StyleManager.calcScaleSizePx(0); + style.titleHeight = StyleManager.calcScaleSizePx(56); + style.titleMarginBottom = StyleManager.calcScaleSizePx(0); + style.upGridMarginTop = StyleManager.calcScaleSizePx(4); + style.upGridMarginBottom = StyleManager.calcScaleSizePx(20); + style.gridMarginLeft = StyleManager.calcScaleSizePx(21); + style.gridMarginRight = StyleManager.calcScaleSizePx(21); + style.msgMarginTop = StyleManager.calcScaleSizePx(0); + style.msgMarginBottom = StyleManager.calcScaleSizePx(4); + style.btnMarginTop = StyleManager.calcScaleSizePx(4); + style.btnMarginBottom = StyleManager.calcScaleSizePx(16); + style.borderRadius = StyleManager.calcScaleSizePx(24); + style.upAreaBgColor = '#00FFFFFF'; + style.downAreaBgColor = '#4DFFFFFF'; + style.editBtnFontColor = '#FF007DFF'; + style.editBtnFontSize = $r("sys.float.ohos_id_text_size_button1"); + style.editBtnBgColor = '#0D000000'; + style.editBtnMarginLeft = StyleManager.calcScaleSizePx(16); + style.editBtnMarginRight = StyleManager.calcScaleSizePx(16); + style.editBtnHeight = StyleManager.calcScaleSizePx(40); + style.editBtnSpace = StyleManager.calcScaleSizePx(16); + } + + // SimpleToggleLayoutEdit-title + { + let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(24); + style.imageWidth = StyleManager.calcScaleSizePx(20); + style.imageHeight = StyleManager.calcScaleSizePx(20); + style.fontColor = '#FF000000'; + style.editTitleSpace = StyleManager.calcScaleSizePx(18); + style.titleFontSize = StyleManager.calcScaleSizePx(20); + } + + // SimpleToggleLayoutEdit-msg + { + let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); + style.fontSize = StyleManager.calcScaleSizePx(12); + style.fontColor = $r('sys.color.ohos_id_color_text_secondary'); + style.height = StyleManager.calcScaleSizePx(41); + style.marginLeftRight = StyleManager.calcScaleSizePx(30); + } + + // SimpleToggleLayoutEdit-grid + { + let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditGridStyle(); + style.columnGap = StyleManager.calcScaleSizePx(0); + style.rowGap = StyleManager.calcScaleSize(0); + style.rowHeight = StyleManager.calcScaleSize(80); + style.dragBgSize = StyleManager.calcScaleSizePx(60); + } + + // EditDialog + { + let style: any = ControlCenterStyleConfiguration.getControlEditDialogStyle(); + style.editDialogHeight = StyleManager.calcScaleSizePx(121); + style.editDialogWidth = StyleManager.calcScaleSizePx(374); + style.editDialogFontSize = StyleManager.calcScaleSizePx(18); + style.editDialogBtnMarginLF = StyleManager.calcScaleSizePx(13); + style.editDialogFontHeight = StyleManager.calcScaleSizePx(20); + style.editDialogBtnMarginTop = StyleManager.calcScaleSizePx(20); + style.editDialogButtonSize = StyleManager.calcScaleSizePx(18); + style.editDialogDividerHeight = StyleManager.calcScaleSizePx(20); + style.editDialogButtonHeight = StyleManager.calcScaleSizePx(30); + style.editDialogRadius = StyleManager.calcScaleSizePx(20); + style.editDialogBtnWidth = StyleManager.calcScaleSizePx(173); + style.editDialogFontMarginTop = StyleManager.calcScaleSizePx(29); + style.editDialogColor = '#FFFFFFFF'; + style.editDialogBtnFontColor = '#FF0000FF'; + style.editDialogBtnBgColor = '#00FFFFFF'; + style.editDialogDividerColor = $r("sys.color.ohos_id_color_secondary"); + style.editDialogDividerWidth = StyleManager.calcScaleSizePx(1); + Log.showInfo(TAG, `getControlEditDialogStyle`) + } + + } + + static number2px(n: number): string { + return n.toString() + 'px'; + } + + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts new file mode 100644 index 00000000..b3ed15d1 --- /dev/null +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + static DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT = 5; +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ets b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/control.ets similarity index 37% rename from common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ets rename to product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/control.ets index 55b437b6..0ec03116 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ets +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/control.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,36 +12,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import ControlCenterComponent from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Constants from './common/constants' +import ControlCenterConfig from './common/ControlCenterConfig'; -import Log from '../../default/Log.ets'; -import DataAbilitySourceLoader from './DataAbilitySourceLoader.ets' -import MetaSourceLoader from './MetaSourceLoader.ets' -import PluginSourceLoader from './PluginSourceLoader.ets' +const TAG = 'ControlPanel-Control'; -const TAG = "SourceLoaderFactory"; +@Component +export default struct Control { + private modeChangeCallback: Function -const classMap = new Map([ - ["MetaSource", MetaSourceLoader], - ["PluginSourceLoader", PluginSourceLoader], - ["DataAbilitySourceLoader", DataAbilitySourceLoader] -]); - -export default class SourceLoaderFactory { - mChannel: any; + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + } - constructor(channel: { - add: Function, - remove: Function - }) { - Log.showInfo(TAG, `constructor, channel: ${channel}`) - this.mChannel = channel; + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`) } - getSourceLoader(pluginType, config, callback) { - Log.showInfo(TAG, `getSourceLoader, pluginType: ${pluginType} config: ${JSON.stringify(config)}`) - if (!classMap.has(pluginType)) { - return; + build() { + Column() { + ControlCenterComponent({ + mControlCenterComponentConfig: ControlCenterConfig, + mSimpleToggleColumnCount: Constants.DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT, + modeChangeCallback: (isEdit) => this.modeChangeCallback(isEdit), + titleDisplayInside: true + }) } - callback(new (classMap.get(pluginType))(config, this.mChannel)); + .width('100%') } } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/index.ets b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/index.ets new file mode 100644 index 00000000..568bca21 --- /dev/null +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/index.ets @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2021-2022 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 image from "@ohos.multimedia.image" +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' +import HeightConfigUtils from '../../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/AbilityManager' +import StyleConfiguration from './common/StyleConfiguration' +import StyleManager from './common/StyleManager' +import ControlCenterComponent from './control' +import WindowManager, { + WindowType, + WINDOW_SHOW_HIDE_EVENT, +} from "../../../../../../../../common/src/main/ets/default/WindowManager"; +import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager"; +import {START_ABILITY_EVENT} from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import MultimodalInputManager, { + MultiKeyCode, +} from "../../../../../../../../common/src/main/ets/default/MultimodalInputManager"; + + +const TAG = 'ControlPanel-Index' +const SHOW_EVENT = "showControlCenter"; +const HIDE_EVENT = "hideControlCenter"; +const SHOW_ANIM_CONFIG = { + duration: 300, + tempo: 1.0, + curve: Curve.Friction, + delay: 0, + iterations: 1, + playMode: PlayMode.Normal +}; +const HIDE_ANIM_CONFIG = { + duration: 200, + tempo: 1.0, + curve: Curve.EaseOut, + delay: 0, + iterations: 1, + playMode: PlayMode.Normal, +} + +let mHeightConfigUtils + +@Entry +@Component +struct Index { + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + @State style: any = {} + @State mBackground: PixelMap | undefined = undefined; + @State mBlur: number = 0; + @State mOpacity: number = 0.0; + @State mWidthSize: number = 0.2 + @State mHeightSize: number = 0.2 + @State mHeightPx: number = 0 + mClearCallbacks: Array = []; + mShowAnimReady: boolean = false; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear, start`) + + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + this.style = StyleConfiguration.getIndexStyle() + StyleManager.setStyle() + + let rect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'rect') + this.mHeightPx = rect.height + + mHeightConfigUtils = new HeightConfigUtils(); + let StatusCoefficient; + + StatusCoefficient = AppStorage.SetAndLink("StatusCoefficient", 1.0); + StatusCoefficient.set(mHeightConfigUtils.getStatusCoefficient()); + + this.initWindowPolicy(); + Log.showInfo(TAG, `aboutToAppear, end`) + } + + onPageShow() { + this.startShowAnim(); + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + this.mClearCallbacks.forEach((unsubscribe) => unsubscribe()); + this.mClearCallbacks.length = 0; + } + + build() { + Stack({ alignContent: Alignment.Top }) { + Image(this.mBackground) + .width('100%') + .height('100%') + .objectFit(ImageFit.Fill) + Column() { + Scroll(new Scroller()) { + Column() { + ControlCenterComponent({ + modeChangeCallback: (isEdit) => this.onModeChange(isEdit) + }) + } + .width('100%') + .onAreaChange((e, e2) => { + Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + }) + } + .scrollBarColor(Color.Gray) + .scrollBarWidth(10) + .width('100%') + } + .backgroundColor($r('app.color.default_background')) + .width('100%') + .height('100%') + } + .scale({ + x: this.mWidthSize, + y: this.mHeightSize, + z: 1, + centerX: '100%', + centerY: '0%' + }) + .opacity(this.mOpacity) + .clip(true) + .borderRadius(this.style.borderRadius) + .width('100%') + .height(this.mHeightPx + 'px') + } + + initWindowPolicy() { + Log.showInfo(TAG, `init controlcenter panel window Policy`); + this.mClearCallbacks.push( + EventManager.subscribe(SHOW_EVENT, () => WindowManager.showWindow(WindowType.CONTROL_PANEL)), + EventManager.subscribe(HIDE_EVENT, () => this.hideWindow()), + EventManager.subscribe(START_ABILITY_EVENT, () => this.hideWindow()), + EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => { + let { windowName, isShow } = args; + Log.showInfo(TAG, `WINDOW_SHOW_HIDE_EVENT windowName: ${windowName}, isShow: ${isShow}`); + windowName == WindowType.NOTIFICATION_PANEL && isShow && this.hideWindow(); + windowName == WindowType.CONTROL_PANEL && isShow && (this.mShowAnimReady = true); + }), + MultimodalInputManager.subscribeCombinationKey([MultiKeyCode.WIN, MultiKeyCode.I], (data) => { + let windowInfo = WindowManager.getWindowInfo(WindowType.CONTROL_PANEL); + Log.showInfo(TAG, `on CombinationKeyEvent: data: ${data}, windowInfo: ${windowInfo?.visibility}`); + if (windowInfo) { + windowInfo.visibility + ? this.hideWindow() + : WindowManager.showWindow(WindowType.CONTROL_PANEL); + } + }) + ); + } + + _animateTo(config, callback) { + animateTo(config, callback) + setTimeout(config.onFinish, config.duration + config.delay) + } + + async startShowAnim() { + if (!this.mShowAnimReady) { + return; + } + this.mShowAnimReady = false; + this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { + Log.showInfo(TAG, `show anim finish.`); + this.mBlur = 20; + } }, () => { + this.mBlur = 20 + this.mOpacity = 1.0 + this.mWidthSize = 1.0 + this.mHeightSize = 1.0 + }) + } + + hideWindow() { + Log.showInfo(TAG, `hide anim start: ${JSON.stringify(this)}`); + this._animateTo({ ...HIDE_ANIM_CONFIG, onFinish: () => { + Log.showInfo(TAG, `anim finish, hide Notification window.`); + this.mBlur = 0 + WindowManager.hideWindow(WindowType.CONTROL_PANEL); + } + }, () => { + this.mBlur = 0 + this.mOpacity = 0.0 + this.mWidthSize = 0.2 + this.mHeightSize = 0.2 + }) + } + + onModeChange(isEdit) { + Log.showInfo(TAG, `onModeChange, isEdit: ${isEdit}`) + let initRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'rect') + let newRect = initRect + if (isEdit) { + let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'dis') + newRect = { ...initRect, height: StyleManager.calcScaleSize(346) } + } + Log.showInfo(TAG, `onModeChange, newRect: ${JSON.stringify(newRect)}`) + this._animateTo({ + duration: 300, + tempo: 1.0, + curve: Curve.Friction, + delay: 0, + iterations: 1, + playMode: PlayMode.Normal, + onFinish: () => { + Log.showInfo(TAG, `onModeChange, show anim finish.`) + if (newRect.height <= initRect.height) { + WindowManager.resetSizeWindow(WindowType.CONTROL_PANEL, newRect) + } + } + }, () => { + Log.showInfo(TAG, `onModeChange, animateTo`) + if (newRect.height > initRect.height) { + WindowManager.resetSizeWindow(WindowType.CONTROL_PANEL, newRect) + } + this.mHeightPx = newRect.height + }) + } +} diff --git a/product/statusbar/src/main/ets/default/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js similarity index 59% rename from product/statusbar/src/main/ets/default/workers/PluginDataSourceWorker.js rename to product/pc/controlpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js index 4b3d78f1..3135d74c 100644 --- a/product/statusbar/src/main/ets/default/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,17 +13,17 @@ * limitations under the License. */ -import worker from '@ohos.worker'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import worker from "@ohos.worker"; +import Log from "../../../../../../../../common/src/main/ets/default/Log"; import PluginDataSourceManager -from '../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager.ets'; -import Constants, {obtainMsg} from '../../../../../../../common/src/main/ets/plugindatasource/common/Constants.ets'; +from "../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager"; +import Constants, { obtainMsg } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; -const parentPort = worker.parentPort -const TAG = `${parentPort.name} Worker` -Log.showInfo(TAG, `Start.`) +const parentPort = worker.parentPort; +const TAG = `${parentPort.name} Worker`; +Log.showInfo(TAG, `Start.`); -var sManager +var sManager; parentPort.onmessage = (msg) => { Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); @@ -41,19 +41,21 @@ parentPort.onmessage = (msg) => { default: Log.showError(TAG, `onMessage, unknown action type.`); } -} +}; function initConfig(config) { Log.showInfo(TAG, `initConfig, config = ${JSON.stringify(config)}`); - sManager = new PluginDataSourceManager(); - sManager.onItemAdd = (itemData) => { - Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); - parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); - }; - sManager.onItemRemove = (itemData) => { - Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); - parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); - }; + sManager = new PluginDataSourceManager({ + onItemAdd: (itemData) => { + Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); + itemData.label && (itemData.label = encodeURIComponent(itemData.label)); + parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); + }, + onItemRemove: (itemData) => { + Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); + }, + }); sManager.initDataSource(config); parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); } @@ -70,13 +72,15 @@ function loadData(userId) { parentPort.onclose = function () { Log.showInfo(TAG, `onclose`); -} +}; parentPort.onmessageerror = function () { Log.showInfo(TAG, `onmessageerror`); -} +}; parentPort.onerror = function (data) { - Log.showInfo(TAG, - `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}`); -} \ No newline at end of file + Log.showInfo( + TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + ); +}; \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/resources/base/element/color.json b/product/pc/controlpanel/src/main/resources/base/element/color.json new file mode 100644 index 00000000..242e5372 --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/element/color.json @@ -0,0 +1,12 @@ +{ + "color": [ + { + "name": "default_background", + "value": "#F2F1F3F5" + }, + { + "name": "default_font_color", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/resources/base/element/float.json b/product/pc/controlpanel/src/main/resources/base/element/float.json new file mode 100644 index 00000000..8cda5658 --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "default_border_radius", + "value": "24vp" + } + ] +} \ No newline at end of file diff --git a/entry/src/main/resources/base/element/string.json b/product/pc/controlpanel/src/main/resources/base/element/string.json similarity index 100% rename from entry/src/main/resources/base/element/string.json rename to product/pc/controlpanel/src/main/resources/base/element/string.json diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_oh.png b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_oh.png new file mode 100644 index 0000000000000000000000000000000000000000..1e83d4a277acb311d294a9679f046dc377e32286 GIT binary patch literal 1161 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 { + Log.showInfo(TAG, `api8New onCreate, createWindow callback`); + }); + + AbilityManager.setContext(AbilityManager.ABILITY_NAME_BANNER_NOTICE, this.context); + let bannerRect = { + left: 872 * dis.width / 1280, + top: 44 * dis.width / 1280, + width: 402 * dis.width / 1280, + height: 100 * dis.width / 1280 + } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); + WindowManager.createWindow(this.context, WindowType.BANNER_NOTICE, bannerRect, 'pages/bannerNotification') + .then((win) => { + Log.showInfo(TAG, `api8New onCreate, createWindow callback`); + }) + .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); + } + + onDestroy() { + Log.showInfo(TAG, "api8New onDestroy"); + } +} + +export default ServiceExtAbility; diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/app.ets b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/app.ets new file mode 100644 index 00000000..08c517ce --- /dev/null +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/app.ets @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 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 default { + onCreate() { + console.info('SystemUI NotificationPanel Application onCreate') + }, + onDestroy() { + console.info('SystemUI NotificationPanel Application onDestroy') + }, +} diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets new file mode 100644 index 00000000..db316176 --- /dev/null +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import WindowManager, { WindowType } from '../../../../../../../../common/src/main/ets/default/WindowManager' +import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager" +import BannerNotification from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem' +import ViewModel from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel'; +import NotificationConstants, { ScreenLockStatus } from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants'; + +const TAG = 'NotificationPanel-BannerNotification' + + +@Entry +@Component +struct Index { + @State distributedDeviceName: string = ''; + @State mBannerNoticeCnt: number = 0; + @State mLastActionTime: number = 0; + @State needExpand: boolean = true + @State isExpand: boolean = false; + @State pageData: any = {}; + + mClearCallbacks: unsubscribe[] + mDefaultBannerRect: any; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + setAppBgColor('#00000000') + this.mClearCallbacks = [] + this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeShow', () => this.onBannerNoticeShow())) + this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeHide', () => this.onBannerNoticeHide())) + Log.showInfo(TAG, `aboutToAppear End`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`) + this.mClearCallbacks.forEach((mClearCallback: Function) => { + mClearCallback() + mClearCallback = undefined + }) + this.mClearCallbacks = undefined + } + + build() { + Column() { + Column() { + if (this.mBannerNoticeCnt > 0) { + BannerNotification({ + want: this.pageData, + distributedDeviceName: $distributedDeviceName, + mLastActionTime: $mLastActionTime, + mBannerNoticeCnt: $mBannerNoticeCnt, + needExpand: $needExpand, + isExpand: $isExpand, + onBannerNoticeHide: () => this.onBannerNoticeHide() + }) + } else { + Blank() + } + } + } + .width('100%') + .height('100%') + .clip(true) + } + + onBannerNoticeShow() { + Log.showInfo(TAG, `onBannerNoticeShow start`); + let winInfoNotice = WindowManager.getWindowInfo(WindowType.NOTIFICATION_PANEL); + let bannerDisabledFlg = false; + let screenLockStatusInfo = AppStorage.Link('lockStatus'); + let screenLockStatus = ScreenLockStatus.Unlock; + if (!!screenLockStatusInfo) { + screenLockStatus = screenLockStatusInfo.get(); + } + if (screenLockStatus == ScreenLockStatus.Locking) { + bannerDisabledFlg = true; + } else if (winInfoNotice) { + if (winInfoNotice.visibility) { + bannerDisabledFlg = true; + } + } + WindowManager.hideWindow(WindowType.BANNER_NOTICE); + if (bannerDisabledFlg) { + Log.showInfo(TAG, `onBannerNoticeShow end`); + return; + } + this.pageData = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'itemData'); + ViewModel.getDistributedDeviceName(this.pageData).then((deviceName) => { + this.distributedDeviceName = deviceName; + }) + this.needExpand = this.checkItemNeedExpand() + this.isExpand = false; + this.mBannerNoticeCnt++; + this.mLastActionTime = (new Date()).getTime(); + Log.showInfo(TAG, `onBannerNoticeShow count:` + this.mBannerNoticeCnt); + Log.showInfo(TAG, `onBannerNoticeShow pageData:${JSON.stringify(this.pageData)}`); + + WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); + WindowManager.showWindow(WindowType.BANNER_NOTICE); + Log.showInfo(TAG, `onBannerNoticeShow end`); + } + + onBannerNoticeHide() { + this.mBannerNoticeCnt = 0; + WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); + WindowManager.hideWindow(WindowType.BANNER_NOTICE); + } + + checkItemNeedExpand() { + if (this.pageData.contentType === NotificationConstants.NOTIFICATION_TYPE_BASIC + && (!(this.pageData.actionButtons?.length > 0))) { + return false; + } else { + return true; + } + } + +} diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts new file mode 100644 index 00000000..8368748a --- /dev/null +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../../common/src/main/ets/default/StyleManager'; + +const TAG = 'NotificationPanel-StyleConfiguration'; + +export default class StyleConfiguration { + static getIndexStyle() { + const key: string = TAG + "-Index"; + return StyleManager.getStyle(key, () => { + return { + borderRadius: $r('app.float.default_border_radius') + }; + }); + } +} \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts new file mode 100644 index 00000000..b581c3ad --- /dev/null +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import IndexStyleConfiguration from './StyleConfiguration' + +const TAG = 'NotificationPanel-StyleManager'; + +export default class StyleManager { + static STANDARD_DISPLAY_WIDTH: number = 1280; + static STANDARD_DISPLAY_HEIGHT: number = 800; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + + static setStyle() { + Log.showInfo(TAG, `setStyle`) + + let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'dis'); + StyleManager.maxWidth = dis.width; + + // Index + { + let style: any = IndexStyleConfiguration.getIndexStyle(); + style.borderRadius = StyleManager.calcScaleSizePx(24); + } + + } + + static number2px(n: number): string { + return n.toString() + 'px'; + } + + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts new file mode 100644 index 00000000..80a45419 --- /dev/null +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + static DIGITS = 10; + static MARK_MONTH = 0; + static MARK_DAY = 1; + static QUICKLY_SETTING_H = 83; +} \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/index.ets b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/index.ets new file mode 100644 index 00000000..be9e5acd --- /dev/null +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/index.ets @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2021-2022 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 image from "@ohos.multimedia.image" +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Notification from './notification' +import WindowManager, { + WindowType, + WINDOW_SHOW_HIDE_EVENT, +} from "../../../../../../../../common/src/main/ets/default/WindowManager"; +import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager"; +import {START_ABILITY_EVENT} from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import MultimodalInputManager, { + MultiKeyCode, +} from "../../../../../../../../common/src/main/ets/default/MultimodalInputManager"; + +const TAG = 'NotificationPanel-Index' +const SHOW_EVENT = "showNotificationPanel"; +const HIDE_EVENT = "hideNotificationPanel"; +const SHOW_ANIM_CONFIG = { + duration: 300, + tempo: 1.0, + curve: Curve.Friction, + delay: 0, + iterations: 1, + playMode: PlayMode.Normal, +} +const HIDE_ANIM_CONFIG = { + duration: 200, + tempo: 1.0, + curve: Curve.EaseOut, + delay: 0, + iterations: 1, + playMode: PlayMode.Normal, +} + +@Entry +@Component +struct Index { + @State mBlur: number = 0; + @State mOpacity: number = 0.0; + @State mWidthSize: number = 0.2 + @State mHeightSize: number = 0.2 + @State mBackground: PixelMap | undefined = undefined; + mClearCallbacks: Array = []; + mShowAnimReady: boolean = false; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear, start`) + setAppBgColor('#00000000') + this.initWindowPolicy(); + } + + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + this.startShowAnim(); + } + + onPageHide() { + Log.showInfo(TAG, `onPageHide`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + this.mClearCallbacks.forEach((unsubscribe) => unsubscribe()); + this.mClearCallbacks.length = 0; + } + + build() { + Stack() { + Image(this.mBackground) + .width('100%') + .height('100%') + .objectFit(ImageFit.Fill) + Column() { + Notification() + } + .backgroundColor($r('app.color.default_background')) + .width('100%') + .height('100%') + } + .width('100%') + .height('100%') + .clip(true) + .opacity(this.mOpacity) + .borderRadius($r('app.float.default_border_radius')) + .scale({ + x: this.mWidthSize, + y: this.mHeightSize, + z: 1, + centerX: '100%', + centerY: '0%' + }) + } + + initWindowPolicy() { + Log.showInfo(TAG, `init notification panel window Policy`); + this.mClearCallbacks.push( + EventManager.subscribe(SHOW_EVENT, () => WindowManager.showWindow(WindowType.NOTIFICATION_PANEL)), + EventManager.subscribe(HIDE_EVENT, () => this.hideWindow()), + EventManager.subscribe(START_ABILITY_EVENT, () => this.hideWindow()), + EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => { + let { windowName, isShow } = args; + Log.showInfo(TAG, `WINDOW_SHOW_HIDE_EVENT windowName: ${windowName}, isShow: ${isShow}`); + windowName == WindowType.CONTROL_PANEL && isShow && this.hideWindow(); + windowName == WindowType.NOTIFICATION_PANEL && isShow && (this.mShowAnimReady = true); + }), + MultimodalInputManager.subscribeCombinationKey([MultiKeyCode.WIN, MultiKeyCode.N], (data) => { + let windowInfo = WindowManager.getWindowInfo(WindowType.NOTIFICATION_PANEL); + Log.showInfo(TAG, `on CombinationKeyEvent: data: ${data}, windowInfo: ${windowInfo?.visibility}`); + if (windowInfo) { + windowInfo.visibility + ? this.hideWindow() + : WindowManager.showWindow(WindowType.NOTIFICATION_PANEL); + } + }) + ); + } + + _animateTo(config, callback) { + animateTo(config, callback) + setTimeout(config.onFinish, config.duration + config.delay) + } + + async startShowAnim() { + if (!this.mShowAnimReady) { + return; + } + this.mShowAnimReady = false; + this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { + Log.showInfo(TAG, `show anim finish.`); + this.mBlur = 20; + } }, () => { + this.mBlur = 20 + this.mOpacity = 1.0 + this.mWidthSize = 1.0 + this.mHeightSize = 1.0 + }) + } + + hideWindow() { + Log.showInfo(TAG, `hide anim start`); + this._animateTo({ ...HIDE_ANIM_CONFIG, onFinish: () => { + Log.showInfo(TAG, `anim finish, hide Notification window, view: ${JSON.stringify(this)}`); + this.mBlur = 0 + WindowManager.hideWindow(WindowType.NOTIFICATION_PANEL); + } + }, () => { + Log.showInfo(TAG, `do hide anim.`); + this.mBlur = 0 + this.mOpacity = 0.0 + this.mWidthSize = 0.2 + this.mHeightSize = 0.2 + }) + } +} diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/notification.ets b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/notification.ets new file mode 100644 index 00000000..e976dd11 --- /dev/null +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/notification.ets @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" +import NotificationListComponent from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent' +import ViewModel from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel' + +const TAG = 'NotificationPanel-notification' +const NO_NOTIFICATION_TOP_MARGIN = 40; +const NOTIFICATION_TEXT_SIZE = 20; +const NOTIFICATION_TOTAL_MARGIN = 20; +const NOTIFICATION_ITEM_MARGIN = 16; +const NOTIFICATION_ICON_SIZE = 24; +const NOTIFICATION_TITLE_HEIGHT = 58; +const NOTIFICATION_TITLE_MARGIN = 4; +const NOTIFICATION_TITLE_ICON_MARGIN = 24; + +@Component +export default struct Notification { + @StorageLink('notificationList') notificationList: any[] = [] + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { + CenterTitle() + if (this.notificationList.length == 0) { + Text($r("app.string.no_notification")) + .fontColor($r("sys.color.ohos_id_color_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_sub_title2")) + .fontWeight(FontWeight.Medium) + .alignSelf(ItemAlign.Center) + .margin({ top: NO_NOTIFICATION_TOP_MARGIN }) + } else { + Column() { + NotificationListComponent({ config: { itemMargin: NOTIFICATION_ITEM_MARGIN } }) + } + .flexGrow(1) + } + }.padding({ left: NOTIFICATION_TOTAL_MARGIN, right: NOTIFICATION_TOTAL_MARGIN }) + .width('100%') + } +} + +@Component +struct CenterTitle { + aboutToAppear() { + Log.showInfo(TAG, `CenterTitle, aboutToAppear`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `CenterTitle, aboutToDisappear`) + } + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Text($r("app.string.notification_center")) + .fontColor($r("sys.color.ohos_id_color_text_primary")) + .fontSize(NOTIFICATION_TEXT_SIZE) + .fontWeight(FontWeight.Medium) + .margin({ left: NOTIFICATION_TITLE_MARGIN }) + Blank() + Image($r('app.media.ic_public_settings')) + .objectFit(ImageFit.Contain) + .fillColor($r("app.color.notification_title_image_color")) + .width(NOTIFICATION_ICON_SIZE) + .height(NOTIFICATION_ICON_SIZE) + .margin({ right: NOTIFICATION_TITLE_ICON_MARGIN }) + .onClick(this.settingClick.bind(this)) + Image($r('app.media.ic_public_delete')) + .objectFit(ImageFit.Contain) + .fillColor($r("app.color.notification_title_image_color")) + .width(NOTIFICATION_ICON_SIZE) + .height(NOTIFICATION_ICON_SIZE) + .margin({ right: NOTIFICATION_TITLE_MARGIN }) + .onClick(() => { + ViewModel.removeAllNotifications(); + }) + } + .height(NOTIFICATION_TITLE_HEIGHT) + } + + settingClick() { + Log.showInfo(TAG, ` settingClick `) + EventManager.publish(obtainStartAbility('com.ohos.systemui', 'com.ohos.systemui.notificationmanagement.MainAbility')) + } +} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/element/color.json b/product/pc/notificationpanel/src/main/resources/base/element/color.json similarity index 37% rename from product/statusbar/src/main/resources/base/element/color.json rename to product/pc/notificationpanel/src/main/resources/base/element/color.json index c3036068..4f862bb8 100644 --- a/product/statusbar/src/main/resources/base/element/color.json +++ b/product/pc/notificationpanel/src/main/resources/base/element/color.json @@ -2,35 +2,23 @@ "color": [ { "name": "default_background", - "value": "#66000000" + "value": "#F2F1F3F5" }, { "name": "default_font_color", - "value": "#ffffffff" - }, - { - "name": "index_background", - "value": "#66000000" - }, - { - "name": "statusbar_background", - "value": "#66000000" + "value": "#000000" }, { "name": "quicklysetting_time_fontcolor", - "value": "#ffffffff" + "value": "#FF000000" }, { "name": "quicklysetting_date_fontcolor", - "value": "#ffffffff" - }, - { - "name": "quicklysetting_background", - "value": "#292830" + "value": "#FF000000" }, { - "name": "twogroup_layout_background", - "value": "#66000000" + "name": "notification_title_image_color", + "value": "#ff182431" } ] } \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/element/float.json b/product/pc/notificationpanel/src/main/resources/base/element/float.json similarity index 45% rename from product/statusbar/src/main/resources/base/element/float.json rename to product/pc/notificationpanel/src/main/resources/base/element/float.json index 49f9e8db..b640ff0d 100644 --- a/product/statusbar/src/main/resources/base/element/float.json +++ b/product/pc/notificationpanel/src/main/resources/base/element/float.json @@ -1,8 +1,8 @@ { "float": [ { - "name": "statusbar_height", - "value": "67" + "name": "default_border_radius", + "value": "18vp" }, { "name": "quicklysetting_time_fontsize", @@ -28,10 +28,6 @@ "name": "quicklysetting_image_marginright", "value": "10" }, - { - "name": "quicklysetting_height", - "value": "120" - }, { "name": "quicklysetting_borderradius", "value": "20" @@ -57,12 +53,68 @@ "value": "25" }, { - "name": "default_left_width_small", - "value": "230" + "name": "setting_title_fontsize", + "value": "20vp" + }, + { + "name": "title_font_height", + "value": "28vp" + }, + { + "name": "title_font_margin_t", + "value": "13vp" + }, + { + "name": "confirm_button_margin_t", + "value": "23vp" + }, + { + "name": "message_font_margin_t", + "value": "14vp" + }, + { + "name": "confirm_title_fontsize", + "value": "20vp" + }, + { + "name": "title_image_width", + "value": "28vp" + }, + { + "name": "title_image_height", + "value": "28vp" + }, + { + "name": "setting_cont_fontsize", + "value": "32" + }, + { + "name": "close_notification_margin_top", + "value": "15vp" + }, + { + "name": "notification_appname_margin_top", + "value": "11vp" + }, + { + "name": "notification_cancle_margin_top", + "value": "11vp" + }, + { + "name": "setting_dialog_dy", + "value": "110" + }, + { + "name": "confirm_dialog_dy", + "value": "140" + }, + { + "name": "notification_border_radius", + "value": "24vp" }, { - "name": "default_left_width_large", - "value": "300" + "name": "applist_hieght", + "value": "361vp" } ] } \ No newline at end of file diff --git a/product/statusbar/src/main/resources/zh_CN/element/string.json b/product/pc/notificationpanel/src/main/resources/base/element/string.json similarity index 73% rename from product/statusbar/src/main/resources/zh_CN/element/string.json rename to product/pc/notificationpanel/src/main/resources/base/element/string.json index aef4538b..0192c24b 100644 --- a/product/statusbar/src/main/resources/zh_CN/element/string.json +++ b/product/pc/notificationpanel/src/main/resources/base/element/string.json @@ -1,21 +1,5 @@ { "string": [ - { - "name": "status_bar_size_portrait", - "value": "102" - }, - { - "name": "status_bar_size_landscape", - "value": "102" - }, - { - "name": "status_bar_position_portrait", - "value": "1" - }, - { - "name": "status_bar_position_landscape", - "value": "2" - }, { "name": "app_name", "value": "SystemUI" @@ -59,6 +43,14 @@ { "name": "month", "value": "月" + }, + { + "name": "no_notification", + "value": "没有通知" + }, + { + "name": "notification_center", + "value": "通知中心" } ] } \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/media/delete_all.png b/product/pc/notificationpanel/src/main/resources/base/media/delete_all.png similarity index 100% rename from product/statusbar/src/main/resources/base/media/delete_all.png rename to product/pc/notificationpanel/src/main/resources/base/media/delete_all.png diff --git a/product/pc/notificationpanel/src/main/resources/base/media/ic_message_filled.png b/product/pc/notificationpanel/src/main/resources/base/media/ic_message_filled.png new file mode 100644 index 0000000000000000000000000000000000000000..0709a1d309c7cda74183f19c440bbbf71851e1b5 GIT binary patch literal 1375 zcmV-l1)%zgP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91L;wH)09C=O?f?J;$w@>(RCodHo5^bwK@`Sk#C_kQ zL{Knl(2F8*K@>H{9l-@u`~&4|`-@{mEL(0CL>WttO<(kVCaTp$sbtV&P4I<$* z5}pBz!X~cqcJ1_UE9=vXQvDoMssZ9Gp^XwIMI2EUmv)bv%7NCWKqS~n!#(;}xsezf4!T`Ng{43_hYZfBY;R)U;B zh@-umhvj5UU~D5IJ@TiR_Hvxr3gk5L1=?!Yxe^NGG|4i(^heT5;EUzd=~3VhhkA+9 z0-QKKqL@E(+UUnT)9cPH1?EYhM$6?2rUH!;sLu4bb4!6b2{guXxq_*{7zs4Y^tf|N zfngHpi{)|!Q-LoM=(Fi@=avGWB~Yj3as^X?P6_nD^tf|Nfd>-kj^%O%Q-M2r7Sn5; zH^ANQO=)`8=E;ND^U!;t3wE6=NfT+KDJIjmG|p@Va+>%%isPx%%d;VNo79%{h1wKG z(1+Xz(g}_esg}o&J&G!Ucd=5*xS;+N*aLQfwIKBW zKhSm{>^m2^1Wp1yd=}lp!*n9DKxT5p(x<~4fIb;n4W@&N!d+r{2BL?0i>6eQil3xprN0s2dsI?{h%^?QtD2m?aq}aXNw;B;L=|sRO!g7usDMQxh*h7=j3~6quW9rzuYg6Pv0wh%ytn hQIo3Qx+9y(`~?O=ZfQ6ZzEA)F002ovPDHLkV1o2cVTk|$ literal 0 HcmV?d00001 diff --git a/product/pc/notificationpanel/src/main/resources/base/media/ic_public_delete.svg b/product/pc/notificationpanel/src/main/resources/base/media/ic_public_delete.svg new file mode 100644 index 00000000..422ec497 --- /dev/null +++ b/product/pc/notificationpanel/src/main/resources/base/media/ic_public_delete.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_delete + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/resources/base/media/ic_public_settings.svg b/product/pc/notificationpanel/src/main/resources/base/media/ic_public_settings.svg new file mode 100644 index 00000000..98a78dac --- /dev/null +++ b/product/pc/notificationpanel/src/main/resources/base/media/ic_public_settings.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_settings + + + + + + + + + + \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/media/ic_settings.png b/product/pc/notificationpanel/src/main/resources/base/media/ic_settings.png similarity index 100% rename from product/statusbar/src/main/resources/base/media/ic_settings.png rename to product/pc/notificationpanel/src/main/resources/base/media/ic_settings.png diff --git a/product/pc/notificationpanel/src/main/resources/base/media/icon.png b/product/pc/notificationpanel/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 zcmX|G1ymHk)?T_}Vd;>R?p|tHQo6fg38|$UVM!6BLrPFWk?s;$LOP{GmJpBl$qoSA!PUg~PA65-S00{{S`XKG6NkG0RgjEntPrmV+?0|00mu7;+5 zrdpa{2QLqPJ4Y{j7=Mrl{BaxrkdY69+c~(w{Fv-v&aR%aEI&JYSeRTLWm!zbv;?)_ ziZB;fwGbbeL5Q}YLx`J$lp~A09KK8t_z}PZ=4ZzgdeKtgoc+o5EvN9A1K1_<>M?MBqb#!ASf&# zEX?<)!RH(7>1P+j=jqG(58}TVN-$psA6K}atCuI!KTJD&FMmH-78ZejBm)0qc{ESp z|LuG1{QnBUJRg_E=h1#XMWt2%fcoN@l7eAS!Es?Q+;XsRNPhiiE=@AqlLkJzF`O18 zbsbSmKN=aaq8k3NFYZfDWpKmM!coBU0(XnL8R{4=i|wi{!uWYM2je{U{B*K2PVdu&=E zTq*-XsEsJ$u5H4g6DIm2Y!DN`>^v|AqlwuCD;w45K0@eqauiqWf7l&o)+YLHm~|L~ z7$0v5mkobriU!H<@mVJHLlmQqzQ3d6Rh_-|%Yy2li*tHO>_vcnuZ7OR_xkAIuIU&x z-|8Y0wj|6|a6_I(v91y%k_kNw6pnkNdxjqG8!%Vz_d%c_!X+6-;1`GC9_FpjoHev5fEV7RhJ>r=mh-jp$fqbqRJ=obwdgLDVP5+s zy1=_DWG0Y-Jb3t^WXmkr(d9~08k-|#Ly zaNOmT(^9tIb&eb4%CzIT zAm3CUtWSr1t4?h1kk#NBi{U|pJslvME{q|_eS^3En>SOqSxyuN1x;Is@8~m?*>}** znrRFArP!K_52RpX*&JHMR<^lVdm8ypJ}0R(SD(51j;6@ni$6bQ+2XL+R^|NnSp5}(kzvMZ^(@4fD_{QVu$(&K6H|C37TG1Am9Re{<<3gd zh@`>;BqkXMW&p0T6rt|iB$)~CvFe(XC)F9WgAZn*0@t$oZo;!*}r@_`h?KKH&6A@3= zISXoQB+~`op>NP-buiA*^0n{@i{_?MRG)&k)c)k_F+-2Lud!S9pc+i`s74NpBCaGF zXN+pHkubw*msGBTY27BKHv)RRh3;nMg4&$fD_6X9Vt~;_4D+5XPH~#Kn-yjcy!$}1 zigv#FNY>TqMhtIBb@UoF!cE~Q8~;!Pek>SQQwHnHuWKoVBosAiOr}q>!>aE*Krc)V zBUMEcJ5NU0g8}-h6i1zpMY9>m4ne?=U2~`w7K7Q0gB_=p@$5K7p6}thw z-~3dMj?YNX2X$lZ+7ngQ$=s}3mizNN@kE%OtB)?c&i~2L55z8^=yz;xMHLmlY>&Q# zJj?!)M#q_SyfkQh)k?j8IfLtB)ZCp|*vf4_B zos?73yd^h-Ac+;?E4*bpf=o*^3x3-`TVjbY4n6!EN10K6o@fxdyps05Vo3PU)otB} z`3kR+2w7_C#8Z!q`J)p{Vh!+m9-UP!$STp+Hb}}#@#_u^SsUQg<}59< zTvH3%XS4G+6FF^(m6bVF&nSUIXcl;nw{=H$%fgeJ>CgDYiLdpDXr{;-AnG z8dvcrHYVMI&`R6;GWekI@Ir3!uo)oz4^{6q0m^}@f2tM9&=YHNi6-?rh0-{+k@cQm zdp`g#YdQn%MDVg2GR>wZ`n2<0l4)9nx1Wfr&!Dvz=bPwU!h2S?ez6MVc5APE4-xLB zi&W9Q8k2@0w!C53g?iAIQ}~p*3O(@zja6KQ=M3zfW*_6o5SwR-)6VBh~m7{^-=MC-owYH5-u40a}a0liho3QZZ5L{bS_xM1)4}19)zTU$$MY zq3eZML1WC{K%YFd`Be0M-rkO^l?h{kM{$2oK1*A@HVJ57*yhDkUF!2WZ&oA4Y-sK( zCY69%#`mBCi6>6uw(x4gbFaP0+FD*JKJ-q!F1E?vLJ+d35!I5d7@^eU?(CS|C^tmI5?lv@s{{*|1F zFg|OzNpZ0hxljdjaW%45O0MOttRrd(Z?h{HYbB-KFUx&9GfFL3b8NwZ$zNu)WbBD` zYkj$^UB5%3Pj1MDr>S2Ejr9pUcgA!;ZG!@{uAy12)vG=*^9-|dNQBc8&`oxBlU~#y zs!anJX&T?57Jdr^sb>e+V`MVfY>Y0ESg7MG<7W0g&bR-ZYzzZ%2H&Etcp zcd6QeXO1D!5A#zM0lx*GH}`M)2~ZFLE;sP^RSB5wVMNfiZXPd(cmO>j=OSA3`o5r& zna(|^jGXbdN7PK)U8b7^zYtYkkeb%<%F~=OqB~kXMQkq}ii|skh@WSRt>5za;cjP0 zZ~nD%6)wzedqE}BMLt~qKwlvTr33))#uP~xyw#*Eaa|DbMQ_%mG0U8numf8)0DX`r zRoG2bM;#g|p-8gWnwRV5SCW0tLjLO&9Z?K>FImeIxlGUgo0Zk`9Qzhj1eco~7XZy+hXc@YF&ZQ=? zn*^1O56yK^x{y}q`j7}blGCx%dydV!c7)g~tJzmHhV=W~jbWRRR{1<^oDK+1clprm zz$eCy7y9+?{E|YgkW~}}iB#I4XoJ*xr8R?i_Hv$=Cof5bo-Nj~f`-DLebH}&0% zfQj9@WGd4;N~Y?mzQsHJTJq6!Qzl^-vwol(+fMt#Pl=Wh#lI5Vmu@QM0=_r+1wHt` z+8WZ~c2}KQQ+q)~2Ki77QvV&`xb|xVcTms99&cD$Zz4+-^R4kvUBxG8gDk7Y`K*)JZ^2rL(+ZWV~%W(@6 z)0bPArG#BROa_PHs~&WplQ_UIrpd)1N1QGPfv!J(Z9jNT#i%H?CE6|pPZb9hJ1JW4 z^q;ft#!HRNV0YgPojzIYT`8LuET2rUe-J|c!9l4`^*;4WtY@Ew@pL>wkjmMgGfN7 ze}}GtmU0@<_#08~I-Suk=^*9GLW=H4xhsml;vAV{%hy5Eegl@!6qKqbG024%n2HHw zCc@ivW_$@5ZoHP70(7D+(`PvgjW1Pd`wsiuv-aCukMrafwDm)B!xXVy*j2opohhoU zcJz%ADmj>i3`-3-$7nQKBQQuGY;2Qt&+(L~C>vSGFj5{Mlv?T_^dql;{zkpe4R1}R z%XfZyQ}wr*sr>jrKgm*PWLjuVc%6&&`Kbf1SuFpHPN&>W)$GmqC;pIoBC`=4-hPY8 zT*>%I2fP}vGW;R=^!1be?ta2UQd2>alOFFbVl;(SQJ4Jk#)4Z0^wpWEVvY4=vyDk@ zqlModi@iVPMC+{?rm=4(n+<;|lmUO@UKYA>EPTS~AndtK^Wy^%#3<;(dQdk3WaUkRtzSMC9}7x2||CNpF#(3T4C)@ z$~RWs`BNABKX|{cmBt>Q=&gkXl&x!!NK_%5hW0LS)Z4PB>%sV?F-{Wyj#s7W%$F{D zXdK^Fp3wvy+48+GP6F_|^PCRx=ddcTO3sG;B23A49~Qaw31SZ0Rc~`r4qqt%#OGW{ zCA_(LG5^N>yzUn&kAgVmxb=EA8s&tBXC}S1CZ(KoW)(%^JjLTPo^fs`Va;`=YlVPgmB$!yB}<(4ym6OeZ3xAJJ#;)2+B%p3P1Wt+d$eo`vz`T zXfUP2))kBDPoscH;Jc7I3NU<({|@wM$&GaDt`n7WLgIY3IA7A6-_R?z8N3mz|}*i z(zl5ot--Oq@f2-nv{X(ujT2T(k1vY_qh93pK@>H-qc%2Xta)IP0Q%zt%bqYgI`o!wv!0QerB`nCN^1n|@$sVOQ!V0teVG!I z_fD%JvfDeT1cK#-{o6Gv7}& zY0#NWin~kVaf$aufV&;63Hbs|`QVZWpDX6IMk1Hj2G}fiH9e-^6u2zf^FIr^BwD<6zjw63+{yUe8PUFvk8v{sJ=R{d#`O!sz`Q13~< zPT$JS(w=yQfU2`zPCNfSw=&zup@DXc(98afjhv@1w_f!m2Z>rMJ19AB&dB%P#Ls3b z=lK7OILM+SQ&VEd=1GN6o&>YVVtIzoZ%=Z_SdqJN2}E43{bE`>w+A;=y->@^k{oCC z$F*WTY&?34;kfyFV?b*Xb1Pq`Z=%OgwEg)Rz)tx=`f%5#w_INP=x&z5!jI;#;N$ma zhO)+MDm;SxOEVL15; zGq(v2pL3&P1Sl)8P*;G-fd{l1QJsv@e@d8)1PK4w2m*M%V3j-V~L^$i|&C@b?D?9tfwE{B^}Z$k8e5FmQ>v7Xz)sG32g9t}YBt zyR$+*_00RmPx+0mW+vVG4mxd(n$(eQf3-w>JPl2UJpafrPaL5@2j}%{VE-) zBI%6Qpj*dsdH<;g!S!avA~bv^0E+ zfyJbSjPb+j;J52U)<|cIcntQBI2T#>2;tOxu{%D?kML476AErF(qN9hPva5Nkc@BF zC-tLF@3ZFb%Kpj)M<{)x*l|*Ia@ECeXo2E4h2f!aV=cHAhi_E_mfUth(sM4^hJq7B zQsGWqdZUm9S%F`$nQ*_#NcuD`&)Ek%_s{&^78{9Hm ztri&rYLOxgFdG>O@+XHy z9#;|&vBCPXH5Mon^I`jSuR$&~ZWtyB67ujzFSj!51>#C}C17~TffQ{c-!QFQkTQ%! zIR^b1`zHx|*1GU?tbBx23weFLz5H?y_Q%N&t$}k?w+``2A=aotj0;2v$~AL z{scF-cL{wsdrmPvf#a9OHyYLcwQD4Kcm)`LLwMh4WT~p29f7M!iafJSU`IV}QY5Wa z(n44-9oA}?J{a+ah*@31WTs#&J#o1`H98#6IQf;Wv0N_!);f&9g7o-k(lW5rWnDUR zQBFIRG+X=6NnsI@mxnwm;tf5;_Uxg?jZ8m-m0}&6+DA!qam(p$mN5R})yA_7m$q@| zFEd|dpS595rxQr-n#GjI5i-AhnUE>Cr;jpCqSrD~EwK_DqI^7%3#p5)%T_od!t3SOmH9MyXeeGO2(UQL;ax|x?Ncixmeo1=$ z{-);Au{*tfzOG?KQ~K|ak8-HQ?`Pekhe2WM(8s{xv-p>Zmu_6{G!-oE$7$mY`MOJorI=+mMx?H;`pr!;fVYz?5~yXBACruWB`Ph zZM}90_<^OBxIhyZ9BW$`>6JvO;%VFpqVr8|7t3~AmxYak6?`Pp#c;**_SYmi`&z23 z`p6_~ePvH)C6x-G9$hgL=eVALq`-AiamN>!3~Lxw&{H(b{B(7xSRm6<3<{%{yXiH# zos5Rv1L+8fUKJLo%P>4I&$}y 0) { + configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; + } + } else { + configInfo.realWidth = (configInfo.realWidth * configInfo.maxWidth) / 1280; + configInfo.minHeight = configInfo.realWidth; + if (configInfo.xCoordinate > 0) { + configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth; + } + } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "config", configInfo); + Log.showInfo(TAG, `api8New onCreate, configInfo: ${JSON.stringify(configInfo)}`); + + let statusBarRect = { + left: configInfo.xCoordinate, + top: configInfo.yCoordinate, + width: configInfo.realWidth, + height: configInfo.realHeight, + }; + WindowManager.createWindow(this.context, WindowType.STATUS_BAR, statusBarRect, "pages/index").then(() => + WindowManager.showWindow(WindowType.STATUS_BAR) + ); + } + + onDestroy() { + Log.showInfo(TAG, "api8New onDestroy"); + } +} + +export default ServiceExtAbility; diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/app.ets b/product/pc/statusbar/src/main/ets/ServiceExtAbility/app.ets new file mode 100644 index 00000000..c4ae2372 --- /dev/null +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/app.ets @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021-2022 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 AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBarVM from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' +import {StatusBarData} from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants' + +export default { + async onCreate() { + console.info('SystemUI statusBar Application onCreate') + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config') + let statusBarData: StatusBarData = new StatusBarData(); + statusBarData.displayWidth = configInfo.maxWidth; + statusBarData.displayHeight = configInfo.maxHeight; + statusBarData.showHorizontal = configInfo.showHorizontal; + statusBarData.ableToMaximize = configInfo.ableToMaximize; + statusBarData.realWidth = configInfo.realWidth; + statusBarData.realHeight = configInfo.realHeight; + statusBarData.left = configInfo.xCoordinate; + statusBarData.top = configInfo.yCoordinate; + StatusBarVM.updateStatusBarData(statusBarData); + }, + onDestroy() { + console.info('SystemUI statusBar Application onDestroy') + }, +} diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts new file mode 100644 index 00000000..2d8f0016 --- /dev/null +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2021-2022 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 {FASlotName} from '../../../../../../../../../common/src/main/ets/default/Constants'; + +type LayoutGroup = { + id: number; + Components: Array; +}; +type pluginIconData = { + id: string; + bundleName: string; + abilityName: string; +}; +type Config = { + LayoutGroups: Array; + LocalSlots: Array; + MetaSlots: Array; + emptyPosition: { x1: number; x2: number; y1: number; y2: number }; +}; + +const StatusbarConfig: Config = { + LayoutGroups: [ + { + id: 1, + Components: [ + FASlotName.SIGNAL, + FASlotName.WIFI, + FASlotName.CAPSULE, + FASlotName.NOTIFICATION, + ], + }, + { + id: 2, + Components: [], + }, + { + id: 3, + Components: [ + FASlotName.LOCATION, + FASlotName.BLUETOOTH, + FASlotName.RING_MODE, + FASlotName.BATTERY, + FASlotName.CLOCK, + "systemui_notificationpanel", + "systemui_controlpanel", + ], + }, + ], + LocalSlots: [ + FASlotName.BATTERY, + FASlotName.BLUETOOTH, + FASlotName.CAPSULE, + FASlotName.CLOCK, + FASlotName.LOCATION, + FASlotName.NOTIFICATION, + FASlotName.RING_MODE, + FASlotName.SIGNAL, + FASlotName.WIFI, + ], + MetaSlots: [ + { + id: "systemui_notificationpanel", + bundleName: "com.ohos.systemui", + abilityName: "com.ohos.systemui.notificationpanel.ServiceExtAbility", + }, + { + id: "systemui_controlpanel", + bundleName: "com.ohos.systemui", + abilityName: "com.ohos.systemui.controlpanel.ServiceExtAbility", + }, + ], + emptyPosition: { + x1: 0, + y1: 0, + x2: 0, + y2: 0, + }, +}; + +export default StatusbarConfig; \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts new file mode 100644 index 00000000..9c7d17d3 --- /dev/null +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../../common/src/main/ets/default/StyleManager'; + +const TAG = 'StatusBar-StyleConfiguration'; + +export default class StyleConfiguration { + static getIndexStyle() { + const key: string = TAG + "-Index"; + return StyleManager.getStyle(key, () => { + return {}; + }); + } +} \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts new file mode 100644 index 00000000..7205ead7 --- /dev/null +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import CommonStyleConfiguration from '../../../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import StatusBarStyleConfiguration from '../../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration' +import BatteryStyleConfiguration from '../../../../../../../../../features/batterycomponent/src/main/ets/default/common/StyleConfiguration' +import ClockStyleConfiguration from '../../../../../../../../../features/clockcomponent/src/main/ets/default/common/StyleConfiguration' +import WifiStyleConfiguration from '../../../../../../../../../features/wificomponent/src/main/ets/default/common/StyleConfiguration' +import BluetoothStyleConfiguration from '../../../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration' +import SignalStyleConfiguration from '../../../../../../../../../features/signalcomponent/src/main/ets/default/common/StyleConfiguration' +import CapsuleStyleConfiguration from '../../../../../../../../../features/capsulecomponent/src/main/ets/default/common/StyleConfiguration' +import LocationStyleConfiguration from '../../../../../../../../../features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration' +import RingModeStyleConfiguration from '../../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration' +import IndexStyleConfiguration from './StyleConfiguration' + +const TAG = 'StatusBar-StyleManager'; + +export default class StyleManager { + static STANDARD_DISPLAY_WIDTH: number = 1280; + static STANDARD_DISPLAY_HEIGHT: number = 800; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + + static setStyle() { + Log.showInfo(TAG, `setStyle`) + + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); + StyleManager.maxWidth = config.maxWidth; + + // Common + { + let style: any = CommonStyleConfiguration.getCommonStyle(); + style.statusBarFontSize = StyleManager.calcScaleSizePx(14); + style.statusBarIconWidth = StyleManager.calcScaleSizePx(20); + style.statusBarIconHeight = StyleManager.calcScaleSizePx(20); + style.statusBarMarginLeftRight = StyleManager.calcScaleSizePx(10); + } + + // StatusBar-VerticalStatusBarItemLoadComponent + { + let style: any = StatusBarStyleConfiguration.getVerticalStatusBarItemLoadComponentStyle(); + style.statusBarVerticalComponentHeight = StyleManager.calcScaleSize(64); + } + + // StatusBar-NotificationIcon + { + let style: any = StatusBarStyleConfiguration.getStatusBarNotificationIconStyle(); + style.iconWidth = StyleManager.calcScaleSizePx(16); + style.iconHeight = StyleManager.calcScaleSizePx(16); + style.iconSpace = StyleManager.calcScaleSizePx(6); + } + + // StatusBar-IconComponent + { + let style: any = StatusBarStyleConfiguration.getIconItemComponentStyle(); + style.stackHeight = StyleManager.calcScaleSizePx(8 * 2 + 18); + style.stackPadding = StyleManager.calcScaleSizePx(8); + style.stackBorderRadius = StyleManager.calcScaleSizePx(8); + style.stackBgColorSelected = '#33000000'; + style.stackBgColorUnSelected = '#00000000'; + style.componentSpace = StyleManager.calcScaleSizePx(8); + style.iconWidth = StyleManager.calcScaleSizePx(18); + style.iconHeight = StyleManager.calcScaleSizePx(18); + style.marginLeft = StyleManager.calcScaleSizePx(4); + style.marginRight = StyleManager.calcScaleSizePx(4); + } + + // Clock + { + let style: any = ClockStyleConfiguration.getClockComponentStyle(); + style.statusBarClockMaxWidth = StyleManager.calcScaleSizePx(37); + } + + // Battery-Icon + { + let style: any = BatteryStyleConfiguration.getBatteryComponentStyle(); + style.componentGap = StyleManager.calcScaleSizePx(6); + } + + // Battery-Pic + { + let style: any = BatteryStyleConfiguration.getBatteryPicStyle(); + style.picGap = StyleManager.calcScaleSizePx(1); + style.picBodyWidth = StyleManager.calcScaleSizePx(18.75); + style.picBodyHeight = StyleManager.calcScaleSizePx(10.83); + style.picBodyPadding = StyleManager.calcScaleSizePx(1); + style.picBodyBorderWidth = StyleManager.calcScaleSizePx(1); + style.picBorderRadius = StyleManager.calcScaleSizePx(2); + style.picHeadBorderRadius = StyleManager.calcScaleSizePx(1); + style.picChargingColor = '#00ff21'; + style.picLevelLowColor = '#ff0000'; + style.picHeadWidth = StyleManager.calcScaleSizePx(1.5); + style.picHeadHeight = StyleManager.calcScaleSizePx(5); + } + + // Signal-Icon + { + let style: any = SignalStyleConfiguration.getSignalComponentStyle(); + style.cellularImageWidth = StyleManager.calcScaleSizePx(25); + style.cellularImageHeight = StyleManager.calcScaleSizePx(20); + style.statusBarSignalTypeFontSize = StyleManager.calcScaleSizePx(7); + style.statusBarSignalUnknownFontSize = StyleManager.calcScaleSizePx(12); + style.signalTextMaxWeight = StyleManager.calcScaleSizePx(100); + style.netSignalTextMaxWidth = StyleManager.calcScaleSizePx(18); + } + + // Bluetooth -Icon + { + let style: any = BluetoothStyleConfiguration.getStatusBarBluetoothComponentStyle(); + style.staticBarBluetoothWidth = StyleManager.calcScaleSizePx(18); + style.staticBarBluetoothHeight = StyleManager.calcScaleSizePx(20); + } + + // Location-Icon + { + let style: any = LocationStyleConfiguration.getStartsBarLocationComponentStyle(); + style.statusBarLocationWidth = StyleManager.calcScaleSizePx(18); + style.statusBarLocationHeight = StyleManager.calcScaleSizePx(20); + } + + // RingMode-Icon + { + let style: any = RingModeStyleConfiguration.getStatusRingModeComponentStyle(); + style.statusBarRingModeWidth = StyleManager.calcScaleSizePx(20); + style.statusBarRingModeHeight = StyleManager.calcScaleSizePx(20); + } + + // Wifi-Icon + { + let style: any = WifiStyleConfiguration.getStartsBarWifiComponentStyle(); + style.statusBarWifiWidth = StyleManager.calcScaleSizePx(20); + style.statusBarWifiHeight = StyleManager.calcScaleSizePx(20); + } + + // Capsule-Icon + { + let style: any = CapsuleStyleConfiguration.getCapsuleComponentStyle(); + style.greenCapsulePhoneWidth = StyleManager.calcScaleSizePx(15); + style.greenCapsulePhoneHeight = StyleManager.calcScaleSizePx(15); + style.greenCapsuleHeight = StyleManager.calcScaleSizePx(30); + style.greenCapsuleTextColor = '#CCFFFFFF'; + style.greenCapsuleTextMarginLeftRight = StyleManager.calcScaleSizePx(10); + style.greenCapsuleRadius = StyleManager.calcScaleSizePx(24); + style.greenCapsuleBackgroundColor = '#64BB5C'; + style.maxLines = 1; + } + + } + + static number2px(n: number): string { + return n.toString() + 'px'; + } + + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/constants.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/constants.ts new file mode 100644 index 00000000..6a98994c --- /dev/null +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/constants.ts @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { +} \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets b/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets new file mode 100644 index 00000000..b07025e3 --- /dev/null +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' +import HeightConfigUtils from '../../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' +import StatusBarComponent from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' +import StyleManager from './common/StyleManager' +import StatusbarConfig from './common/StatusbarConfig' + +const TAG = 'StatusBar-Index' + +let mHeightConfigUtils; + +@Entry +@Component +struct Index { + @StorageLink('StatusMinH') StatusMinH: number = 24 + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + + onBackPress(): boolean { + return true; + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear, start`); + + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + StyleManager.setStyle() + + mHeightConfigUtils = new HeightConfigUtils(); + let StatusMinH; + let StatusCoefficient; + + StatusMinH = AppStorage.SetAndLink("StatusMinH", 24); + StatusCoefficient = AppStorage.SetAndLink("StatusCoefficient", 1.0); + StatusMinH.set(mHeightConfigUtils.getStatusMinH()); + StatusCoefficient.set(mHeightConfigUtils.getStatusCoefficient()); + + let signalObserved = AppStorage.SetAndLink("signalObserved", false); + signalObserved.set(false); + + Log.showInfo(TAG, `aboutToAppear, end`); + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`); + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + StatusBarComponent({ + mStatusBarComponentConfig: StatusbarConfig + }) + } + .width('100%') + .height('100%') + } + .width('100%') + .height('100%') + .constraintSize({ minHeight: this.StatusMinH + 'px' }) + .onAreaChange((e, e2) => { + Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + }) + } +} diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js b/product/pc/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js new file mode 100644 index 00000000..3135d74c --- /dev/null +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2021-2022 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 worker from "@ohos.worker"; +import Log from "../../../../../../../../common/src/main/ets/default/Log"; +import PluginDataSourceManager +from "../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager"; +import Constants, { obtainMsg } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; + +const parentPort = worker.parentPort; +const TAG = `${parentPort.name} Worker`; +Log.showInfo(TAG, `Start.`); + +var sManager; + +parentPort.onmessage = (msg) => { + Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); + let data = msg.data; + switch (data.action) { + case Constants.INIT_CONFIG: + initConfig(data.data); + break; + case Constants.CLEAR_ALL: + clearAll(); + break; + case Constants.LOAD_DATA: + loadData(data.data); + break; + default: + Log.showError(TAG, `onMessage, unknown action type.`); + } +}; + +function initConfig(config) { + Log.showInfo(TAG, `initConfig, config = ${JSON.stringify(config)}`); + sManager = new PluginDataSourceManager({ + onItemAdd: (itemData) => { + Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); + itemData.label && (itemData.label = encodeURIComponent(itemData.label)); + parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); + }, + onItemRemove: (itemData) => { + Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); + }, + }); + sManager.initDataSource(config); + parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); +} + +function clearAll() { + Log.showInfo(TAG, `clearAll `); + sManager?.clearAll(); +} + +function loadData(userId) { + Log.showInfo(TAG, `loadData `); + sManager?.loadData(userId); +} + +parentPort.onclose = function () { + Log.showInfo(TAG, `onclose`); +}; + +parentPort.onmessageerror = function () { + Log.showInfo(TAG, `onmessageerror`); +}; + +parentPort.onerror = function (data) { + Log.showInfo( + TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + ); +}; \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/element/color.json b/product/pc/statusbar/src/main/resources/base/element/color.json new file mode 100644 index 00000000..6b163c9d --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/element/color.json @@ -0,0 +1,12 @@ +{ + "color": [ + { + "name": "default_background", + "value": "#66000000" + }, + { + "name": "default_font_color", + "value": "#ffffffff" + } + ] +} \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/element/string.json b/product/pc/statusbar/src/main/resources/base/element/string.json new file mode 100644 index 00000000..85243901 --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/element/string.json @@ -0,0 +1,28 @@ +{ + "string": [ + { + "name": "status_bar_size_portrait", + "value": "44" + }, + { + "name": "status_bar_size_landscape", + "value": "44" + }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, + { + "name": "app_name", + "value": "SystemUI" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/media/icon.png b/product/pc/statusbar/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { + let rect = { + left: 0, + top: 0, + width: dis.width, + height: dis.height, + }; + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, "rect", rect); + WindowManager.createWindow(this.context, WindowType.DROPDOWN_PANEL, rect, "pages/index").then(() => + Log.showInfo(TAG, `api8New onCreate, createWindow callback`) + ); + + AbilityManager.setContext(AbilityManager.ABILITY_NAME_BANNER_NOTICE, this.context); + let bannerRect = { + left: 0, + top: dis.height / 5, + width: dis.width, + height: dis.height / 20 + } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); + WindowManager.createWindow(this.context, WindowType.BANNER_NOTICE, bannerRect, 'pages/bannerNotification') + .then((win) => { + Log.showInfo(TAG, `api8New onCreate, createWindow callback`); + }) + .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); + }); + } + + onDestroy() { + Log.showInfo(TAG, "api8New onDestroy"); + } +} + +export default ServiceExtAbility; diff --git a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ets b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/app.ets similarity index 58% rename from common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ets rename to product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/app.ets index e897518c..ed566992 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ets +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/app.ets @@ -13,15 +13,11 @@ * limitations under the License. */ -import Log from '../../default/Log.ets'; -import BaseMetaSourceLoader from './BaseMetaSourceLoader.ets'; -import {PluginType} from '../common/Constants.ets'; - -const TAG = "MetaSourceLoader"; - -export default class MetaSourceLoader extends BaseMetaSourceLoader { - constructor(config, channel) { - super(config, channel, PluginType.SIMPLE); - Log.showInfo(TAG, `constructor, config: ${JSON.stringify(config)} channel: ${channel}`) - } -} \ No newline at end of file +export default { + async onCreate() { + console.info('SystemUI dropdownPanel Application onCreate') + }, + onDestroy() { + console.info('SystemUI dropdownPanel Application onDestroy') + }, +} diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets new file mode 100644 index 00000000..a6cf1d7f --- /dev/null +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import WindowManager, { WindowType } from '../../../../../../../../common/src/main/ets/default/WindowManager' +import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager" +import BannerNotification from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem' +import ViewModel from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel'; +import NotificationConstants, { ScreenLockStatus } from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants'; + +const TAG = 'DropdownPanel-BannerNotification' + + +@Entry +@Component +struct Index { + @State distributedDeviceName: string = ''; + @State mBannerNoticeCnt: number = 0; + @State mLastActionTime: number = 0; + @State needExpand: boolean = true + @State isExpand: boolean = false; + @State pageData: any = {}; + + mClearCallbacks: unsubscribe[] + mDefaultBannerRect: any; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + setAppBgColor('#00000000') + this.mClearCallbacks = [] + this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeShow', () => this.onBannerNoticeShow())) + this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeHide', () => this.onBannerNoticeHide())) + Log.showInfo(TAG, `aboutToAppear End`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`) + this.mClearCallbacks.forEach((mClearCallback: Function) => { + mClearCallback() + mClearCallback = undefined + }) + this.mClearCallbacks = undefined + } + + build() { + Column() { + Column() { + if (this.mBannerNoticeCnt > 0) { + BannerNotification({ + want: this.pageData, + distributedDeviceName: $distributedDeviceName, + mLastActionTime: $mLastActionTime, + mBannerNoticeCnt: $mBannerNoticeCnt, + needExpand: $needExpand, + isExpand: $isExpand, + onBannerNoticeHide: () => this.onBannerNoticeHide() + }) + } else { + Blank() + } + } + } + .width('100%') + .height('100%') + } + + onBannerNoticeShow() { + Log.showInfo(TAG, `onBannerNoticeShow start`); + let windowInfoDrop = WindowManager.getWindowInfo(WindowType.DROPDOWN_PANEL); + let bannerDisabledFlg = false; + let screenLockStatusInfo = AppStorage.Link('lockStatus'); + let screenLockStatus = ScreenLockStatus.Unlock; + if (!!screenLockStatusInfo) { + screenLockStatus = screenLockStatusInfo.get(); + } + if (screenLockStatus == ScreenLockStatus.Locking) { + bannerDisabledFlg = true; + } else if (windowInfoDrop) { + if (windowInfoDrop.visibility) { + bannerDisabledFlg = true; + } + } + WindowManager.hideWindow(WindowType.BANNER_NOTICE); + if (bannerDisabledFlg) { + Log.showInfo(TAG, `onBannerNoticeShow end`); + return; + } + this.pageData = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'itemData'); + ViewModel.getDistributedDeviceName(this.pageData).then((deviceName) => { + this.distributedDeviceName = deviceName; + }) + this.needExpand = this.checkItemNeedExpand() + this.isExpand = false; + this.mBannerNoticeCnt++; + this.mLastActionTime = (new Date()).getTime(); + Log.showInfo(TAG, `onBannerNoticeShow count:` + this.mBannerNoticeCnt); + Log.showInfo(TAG, `onBannerNoticeShow pageData:${JSON.stringify(this.pageData)}`); + + WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); + WindowManager.showWindow(WindowType.BANNER_NOTICE); + Log.showInfo(TAG, `onBannerNoticeShow end`); + } + + onBannerNoticeHide() { + this.mBannerNoticeCnt = 0; + WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); + WindowManager.hideWindow(WindowType.BANNER_NOTICE); + } + + checkItemNeedExpand() { + if (this.pageData.contentType === NotificationConstants.NOTIFICATION_TYPE_BASIC + && (!(this.pageData.actionButtons?.length > 0))) { + return false; + } else { + return true; + } + } + +} diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts new file mode 100644 index 00000000..44173d27 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021-2022 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 {FASlotName} from '../../../../../../../../../common/src/main/ets/default/Constants'; + +type pluginIconData = { + id: string; + bundleName: string; + abilityName: string; +}; +type Config = { + ComplexToggleLayout: Array; + DefaultSimpleToggleLayout: Array; + LocalToggles: { + ComplexToggles: Array; + SimpleToggles: Array; + }; + MetaToggles: Array; +}; + +const ControlCenterConfig: Config = { + ComplexToggleLayout: [FASlotName.WIFI, FASlotName.BLUETOOTH], + DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION], + LocalToggles: { + ComplexToggles: [FASlotName.AIR_PLANE, FASlotName.BLUETOOTH, FASlotName.WIFI], + SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE], + }, + MetaToggles: [ + { + id: "screenshot", + bundleName: "com.ohos.screenshot", + abilityName: "com.ohos.screenshot.ServiceExtAbility", + }, + ], +}; + +export default ControlCenterConfig; diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts new file mode 100644 index 00000000..9ddd4f1f --- /dev/null +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../../common/src/main/ets/default/StyleManager'; +import Constants from './Constants' + +const TAG = 'DropdownPanel-StyleConfiguration'; + +export default class StyleConfiguration { + static getControlStyle() { + const key: string = TAG + "-Control"; + return StyleManager.getStyle(key, () => { + return { + statusBarHeight: $r("app.float.status_bar_height") + }; + }); + } + + static getNotificationStyle() { + const key: string = TAG + "-Notification"; + return StyleManager.getStyle(key, () => { + return { + statusBarHeight: $r("app.float.status_bar_height"), + deleteAllImageWidth: $r("app.float.delete_all_image_width"), + deleteAllImageHeight: $r("app.float.delete_all_image_height"), + deleteAllImageBorderRadius: $r("app.float.delete_all_image_border_radius"), + deleteAllImageOpacity: $r("app.float.delete_all_image_opacity"), + }; + }); + } + + static getQuicklySettingStyle() { + const key: string = TAG + "-QuicklySetting"; + return StyleManager.getStyle(key, () => { + return { + quicklySetTimeFontSize: $r("app.float.quickly_setting_time_font_size"), + quicklySetTimeFontColor: $r('app.color.quickly_setting_time_font_color'), + quicklyDateFontColor: $r('app.color.quickly_setting_date_font_color'), + quicklyDateFontSize: $r("app.float.quickly_setting_date_font_size"), + quicklySetTextFlexMarginLeft: $r("app.float.quickly_setting_text_flex_margin_left"), + quicklySetImageWidth: $r("app.float.quickly_setting_image_width"), + quicklySttImageHeight: $r("app.float.quickly_setting_image_height"), + quicklySetImageMarginRight: $r("app.float.quickly_setting_image_margin_right"), + quickLySettingBorderRadius: $r("app.float.quickly_setting_border_radius"), + quickLySettingMarginLeft: $r("app.float.quickly_setting_margin_left"), + quickLySettingMarginRight: $r("app.float.quickly_setting_margin_right"), + quickSettingH: Constants.QUICKLY_SETTING_H, + }; + }); + } + + static getDateItemStyle() { + const key: string = TAG + "-DateItem"; + return StyleManager.getStyle(key, () => { + return { + quicklySetDateItemFontSize: $r("app.float.quickly_setting_date_font_size"), + quicklySetDateItemFontColor: $r('app.color.quickly_setting_date_font_color'), + }; + }); + } +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts new file mode 100644 index 00000000..e3611acc --- /dev/null +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import CommonTemplateStyleConfiguration from '../../../../../../../../../common/src/main/ets/template/common/StyleConfiguration'; +import ControlCenterStyleConfiguration from '../../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration'; +import DropdownPanelStyleConfiguration from './StyleConfiguration' +import BrightnessStyleConfiguration from '../../../../../../../../../features/brightnessComponent/src/main/ets/default/common/StyleConfiguration'; +import ClockStyleConfiguration from '../../../../../../../../../features/clockComponent/src/main/ets/default/common/StyleConfiguration'; +import RingModeStyleConfiguration from '../../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration' +import IndexStyleConfiguration from './StyleConfiguration' + +const TAG = 'DropdownPanel-StyleManager'; + +export default class StyleManager { + static STANDARD_DISPLAY_WIDTH: number = 720; + static STANDARD_DISPLAY_HEIGHT: number = 1280; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + + static setStyle() { + Log.showInfo(TAG, `setStyle`) + + let rect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect'); + StyleManager.maxWidth = rect.width; + + + // ControlCenter + { + let style: any = ControlCenterStyleConfiguration.getControlCenterComponentStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(48); + style.marginRight = StyleManager.calcScaleSizePx(48); + style.marginTop = StyleManager.calcScaleSizePx(33); + style.upTitleHeight = StyleManager.calcScaleSizePx(127); + style.titleMarginBottom = StyleManager.calcScaleSizePx(0); + style.toggleAreaGap = StyleManager.calcScaleSizePx(24); + style.simpleToggleLayoutMarginTop = StyleManager.calcScaleSizePx(48); + style.simpleToggleLayoutMarginBottom = StyleManager.calcScaleSizePx(20); + style.brightnessMarginBottom = StyleManager.calcScaleSizePx(44); + style.componentBorderRadius = StyleManager.calcScaleSizePx(48); + style.componentBackgroundColor = '#99FFFFFF'; + } + + // ControlCenter-Title + { + let style: any = ControlCenterStyleConfiguration.getControlCenterUpTitleStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(72); + style.marginRight = StyleManager.calcScaleSizePx(30); + style.fontSize = StyleManager.calcScaleSizePx(40); + style.fontColor = "#FFFFFFFF"; + style.imageWidth = StyleManager.calcScaleSizePx(48); + style.imageHeight = StyleManager.calcScaleSizePx(48); + style.imageHoverWidth = StyleManager.calcScaleSizePx(64); + style.imageHoverHeight = StyleManager.calcScaleSizePx(64); + style.imageHoverRadius = StyleManager.calcScaleSizePx(16); + style.imageHoverColor = 'rgba(0, 0, 0, 0.05)'; + style.imageTransparentColor = 'rgba(255, 255, 255, 0)'; + style.upTitleSpace = StyleManager.calcScaleSizePx(36); + style.titleImageColor = "#FFFFFFFF"; + } + + // ControlCenter-ComplexToggleLayout + { + let style: any = ControlCenterStyleConfiguration.getControlCenterComplexToggleLayoutStyle(); + style.columnGap = StyleManager.calcScaleSizePx(24); + style.rowGap = StyleManager.calcScaleSize(24); + style.rowHeight = StyleManager.calcScaleSize(132); + } + + // ControlCenter-SimpleToggleLayout + { + let style: any = ControlCenterStyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(22); + style.marginRight = StyleManager.calcScaleSizePx(22); + style.columnGap = StyleManager.calcScaleSizePx(0); + style.rowGap = StyleManager.calcScaleSize(0); + style.rowHeight = StyleManager.calcScaleSize(162); + } + + // CommonTemplate-iconTitleBase + { + let style: any = CommonTemplateStyleConfiguration.getIconTitleBaseStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(24); + style.marginRight = StyleManager.calcScaleSizePx(16); + style.componentGap = StyleManager.calcScaleSizePx(8); + style.titleSize = StyleManager.calcScaleSizePx(24); + style.titleColor = $r("sys.color.ohos_id_color_text_secondary"); + style.borderRadius = StyleManager.calcScaleSizePx(48); + style.backgroundColor = '#99FFFFFF'; + style.textMargin = StyleManager.calcScaleSizePx(8); + style.textHoverHeight = StyleManager.calcScaleSizePx(36); + style.textHoverWidth = StyleManager.calcScaleSizePx(136); + style.textHoverRadius = StyleManager.calcScaleSizePx(8); + style.hoverColor = 'rgba(0, 0, 0, 0.05)'; + style.transparentColor = 'rgba(255, 255, 255, 0)'; + } + + // CommonTemplate-iconComponent + { + let style: any = CommonTemplateStyleConfiguration.getIconComponentStyle(); + style.circleWidth = StyleManager.calcScaleSizePx(96); + style.circleHeight = StyleManager.calcScaleSizePx(96); + style.iconWidth = StyleManager.calcScaleSizePx(48); + style.iconHeight = StyleManager.calcScaleSizePx(48); + style.iconOffBG = '#1A000000'; + style.iconOnBG = '#FF007DFF'; + style.iconOnColor = '#FFFFFFFF'; + style.iconOffColor = $r("sys.color.ohos_id_color_secondary"); + style.hoverColor = 'rgba(0, 0, 0, 0.05)'; + style.transparentColor = 'rgba(255, 255, 255, 0)'; + } + + // CommonTemplate-simpleToggleBase + { + let style: any = CommonTemplateStyleConfiguration.getSimpleToggleBaseStyle(); + style.circleWidth = StyleManager.calcScaleSizePx(96); + style.circleHeight = StyleManager.calcScaleSizePx(96); + style.iconWidth = StyleManager.calcScaleSizePx(48); + style.iconHeight = StyleManager.calcScaleSizePx(48); + style.dragCircleWidth = StyleManager.calcScaleSizePx(120); + style.dragCircleHeight = StyleManager.calcScaleSizePx(120); + style.dragIconWidth = StyleManager.calcScaleSizePx(72); + style.dragIconHeight = StyleManager.calcScaleSizePx(72); + style.iconOffBG = '#1A000000'; + style.iconOnBG = '#FF007DFF'; + style.iconOnColor = '#FFFFFFFF'; + style.iconOffColor = $r("sys.color.ohos_id_color_secondary"); + style.componentGap = StyleManager.calcScaleSizePx(10); + style.titleSize = StyleManager.calcScaleSizePx(24); + style.titleColor = $r("sys.color.ohos_id_color_text_secondary"); + style.textHoverWidth = StyleManager.calcScaleSizePx(136); + style.textHoverHeight = StyleManager.calcScaleSizePx(36); + style.textHoverRadius = StyleManager.calcScaleSizePx(8); + style.hoverColor = 'rgba(0, 0, 0, 0.05)'; + style.transparentColor = 'rgba(255, 255, 255, 0)'; + } + + // Brightness + { + let style: any = BrightnessStyleConfiguration.getBrightnessComponentStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(26); + style.marginRight = StyleManager.calcScaleSizePx(26); + style.componentGap = StyleManager.calcScaleSizePx(26); + style.brightnessIconColor = $r("sys.color.ohos_id_color_secondary"); + style.brightnessReduceWidth = StyleManager.calcScaleSizePx(44); + style.brightnessReduceHeight = StyleManager.calcScaleSizePx(44); + style.brightnessPlusWidth = StyleManager.calcScaleSizePx(44); + style.brightnessPlusHeight = StyleManager.calcScaleSizePx(44); + style.brightnessHeight = StyleManager.calcScaleSizePx(44); + style.sliderHeight = StyleManager.calcScaleSizePx(40); + style.sliderBlockColor = '#FFFFFFFF'; + style.sliderTrackColor = '#0D000000'; + style.selectedColor = '#FF007DFF'; + } + + // RingMode + { + let style: any = RingModeStyleConfiguration.getControlCenterRingModeComponentStyle(); + style.brightnessIconColor = '#FFFF9800'; + } + + // SimpleToggleLayoutEdit + { + let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(48); + style.marginRight = StyleManager.calcScaleSizePx(48); + style.marginTop = StyleManager.calcScaleSizePx(33); + style.titleHeight = StyleManager.calcScaleSizePx(127); + style.titleMarginBottom = StyleManager.calcScaleSizePx(0); + style.upGridMarginTop = StyleManager.calcScaleSizePx(48); + style.upGridMarginBottom = StyleManager.calcScaleSizePx(24); + style.gridMarginLeft = StyleManager.calcScaleSizePx(18.24); + style.gridMarginRight = StyleManager.calcScaleSizePx(18.24); + style.msgMarginTop = StyleManager.calcScaleSizePx(0); + style.msgMarginBottom = StyleManager.calcScaleSizePx(0); + style.btnMarginTop = StyleManager.calcScaleSizePx(24); + style.btnMarginBottom = StyleManager.calcScaleSizePx(32); + style.borderRadius = StyleManager.calcScaleSizePx(48); + style.upAreaBgColor = '#99FFFFFF'; + style.downAreaBgColor = '#4DFFFFFF'; + style.editBtnFontColor = '#FF007DFF'; + style.editBtnFontSize = StyleManager.calcScaleSizePx(32); + style.editBtnBgColor = '#0D000000'; + style.editBtnMarginLeft = StyleManager.calcScaleSizePx(32); + style.editBtnMarginRight = StyleManager.calcScaleSizePx(32); + style.editBtnHeight = StyleManager.calcScaleSizePx(80); + style.editBtnSpace = StyleManager.calcScaleSizePx(32); + } + + // SimpleToggleLayoutEdit-title + { + let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(72); + style.imageWidth = StyleManager.calcScaleSizePx(40); + style.imageHeight = StyleManager.calcScaleSizePx(40); + style.fontColor = "#FFFFFFFF"; + style.editTitleSpace = StyleManager.calcScaleSizePx(36); + style.titleFontSize = StyleManager.calcScaleSizePx(40); + } + + // SimpleToggleLayoutEdit-msg + { + let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); + style.fontSize = StyleManager.calcScaleSizePx(24); + style.fontColor = $r('sys.color.ohos_id_color_text_secondary'); + style.height = StyleManager.calcScaleSizePx(98); + style.marginLeftRight = StyleManager.calcScaleSizePx(44); + } + + // SimpleToggleLayoutEdit-grid + { + let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditGridStyle(); + style.columnGap = StyleManager.calcScaleSizePx(0); + style.rowGap = StyleManager.calcScaleSize(0); + style.rowHeight = StyleManager.calcScaleSize(162); + style.dragBgSize = StyleManager.calcScaleSizePx(120); + } + + // EditDialog + { + let style: any = ControlCenterStyleConfiguration.getControlEditDialogStyle(); + style.editDialogHeight = StyleManager.calcScaleSizePx(217); + style.editDialogWidth = StyleManager.calcScaleSizePx(670); + style.editDialogFontSize = StyleManager.calcScaleSizePx(30); + style.editDialogBtnMarginLF = StyleManager.calcScaleSizePx(24); + style.editDialogFontHeight = StyleManager.calcScaleSizePx(36); + style.editDialogBtnMarginTop = StyleManager.calcScaleSizePx(36); + style.editDialogButtonSize = StyleManager.calcScaleSizePx(30); + style.editDialogDividerHeight = StyleManager.calcScaleSizePx(36); + style.editDialogButtonHeight = StyleManager.calcScaleSizePx(54); + style.editDialogRadius = StyleManager.calcScaleSizePx(36); + style.editDialogBtnWidth = StyleManager.calcScaleSizePx(311); + style.editDialogFontMarginTop = StyleManager.calcScaleSizePx(52); + style.editDialogColor = '#FFFFFFFF'; + style.editDialogBtnFontColor = '#FF0000FF'; + style.editDialogBtnBgColor = '#00FFFFFF'; + style.editDialogDividerColor = $r("sys.color.ohos_id_color_secondary"); + style.editDialogDividerWidth = StyleManager.calcScaleSizePx(1); + Log.showInfo(TAG, `getControlEditDialogStyle`) + } + + } + + static number2px(n: number): string { + return n.toString() + 'px'; + } + + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/common/constants.ets b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts similarity index 72% rename from product/statusbar/src/main/ets/default/pages/common/constants.ets rename to product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts index 8086bb4c..905eae19 100644 --- a/product/statusbar/src/main/ets/default/pages/common/constants.ets +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -27,18 +27,7 @@ export default class Constants { $r('app.string.sunday') ] static DIGITS = 10; - static DEFAULT_MIDDLE_PART_WIDTH = 70; static MARK_MONTH = 0; static MARK_DAY = 1; - static EMPTY = 'empty' - static WIFI = 'wifi' - static SIGNAL = 'signal' - static CLOCK = 'clock' - static BATTERY = 'battery' - static CAPSULE = 'capsule' - static NOTIFICATION = 'notification' - static STATIC_BAR_ICON_WIDTH = 24; - static STATIC_BAR_ICON_MARGIN = 2; - static STATIC_BAR_ICON_HEIGHT = 24; static QUICKLY_SETTING_H = 83; } \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/common/navigationEvent.ets b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/navigationEvent.ts similarity index 94% rename from product/statusbar/src/main/ets/default/pages/common/navigationEvent.ets rename to product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/navigationEvent.ts index b8a7c77d..ec3165f0 100644 --- a/product/statusbar/src/main/ets/default/pages/common/navigationEvent.ets +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/navigationEvent.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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,7 +14,7 @@ */ import commonEvent from '@ohos.commonEvent'; -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log' const TAG = 'navigationEvent'; diff --git a/product/statusbar/src/main/ets/default/pages/control.ets b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/control.ets similarity index 45% rename from product/statusbar/src/main/ets/default/pages/control.ets rename to product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/control.ets index 0cdb5357..3708e159 100644 --- a/product/statusbar/src/main/ets/default/pages/control.ets +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/control.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,54 +12,67 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ControlCenterComponent from '../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets' -import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' -import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' -import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' -import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' -import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets' -import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon.ets' -import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets' -import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from './common/constants.ets' +import ControlCenterComponent from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent' +import BatteryIcon from '../../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon' +import ClockIcon from '../../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon' +import WifiIcon from '../../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon' +import BluetoothIcon from '../../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent' +import SignalIcon from '../../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon' +import LocationIcon from '../../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' +import RingModeIcon from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Constants from './common/constants' +import StyleConfiguration from './common/StyleConfiguration' +import ControlCenterConfig from './common/ControlCenterConfig'; -const TAG = 'StatusBar-Control'; - -let mWindowManager; +const TAG = 'DropdownPanel-Control'; @Component export default struct Control { - @State mControlCenterComponentConfig: any = {} - @Link showStatusBar: boolean - private minHeight: number + private touchMoveCallback: Function startX: number = 0 startY: number = 0 @State moveX: number = 0 @State moveY: number = 0 + @State style: any = StyleConfiguration.getControlStyle() + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) - mWindowManager = new WindowManager(); } - aboutToDisappear(){ + + aboutToDisappear() { Log.showInfo(TAG, `aboutToDisAppear`) } + build() { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { - statusBar({minHeight: this.minHeight}) - ControlCenterComponent({ - showStatusBar: $showStatusBar, - mControlCenterComponentConfig: this.mControlCenterComponentConfig - }) + Column() { + Column() { + statusBar() + } + .width('100%') + .height(this.style.statusBarHeight) + .layoutWeight(0) + + Scroll(new Scroller()) { + Column() { + ControlCenterComponent({ + touchMoveCallback: (data)=>this.controlCenterTouchMoveCallback(data), + mControlCenterComponentConfig: ControlCenterConfig + }) + } + .width('100%') + } + .width('100%') + .scrollBarColor(Color.Gray).scrollBarWidth(10) + .layoutWeight(1) } .width('100%') .height('100%') - .backgroundColor($r('app.color.default_background')) .onTouch(this.controlTouch.bind(this)) } controlTouch(event: TouchEvent) { - Log.showInfo(TAG, `controlTouch================ event: ${ event }`) + Log.showInfo(TAG, `controlTouch================ event: ${event}`) if (event.type == Constants.TOUCHTYPE_DOWN) { this.startX = event.touches[0].screenX this.startY = event.touches[0].screenY @@ -70,23 +83,33 @@ export default struct Control { } else if (event.type == Constants.TOUCHTYPE_UP) { Log.showInfo(TAG, `controlTouch, moveX: ${this.moveX}, moveY: ${this.moveY}`) if (this.moveY < -30) { - this.showStatusBar = true; - mWindowManager.setWindowMin((result)=>{}); + if (this.touchMoveCallback) { + this.touchMoveCallback({ 'direction': 'top', 'touchComponent': 'control' }) + } } } } + + controlCenterTouchMoveCallback(data) { + Log.showInfo(TAG, `controlCenterTouchMoveCallback data: ${JSON.stringify(data)}`) + data['touchComponent'] = 'control' + if (this.touchMoveCallback) { + this.touchMoveCallback(data) + } + } } @Component struct statusBar { - private minHeight: number - @StorageLink('StatusCoefficient') StatusCoefficient:number = 1.0 + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + build() { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { SignalIcon() WifiIcon() } + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { LocationIcon() BluetoothIcon() @@ -96,6 +119,6 @@ struct statusBar { } } .width('100%') - .height(this.minHeight + 'px') + .height('100%') } } diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/index.ets new file mode 100644 index 00000000..50a7496c --- /dev/null +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/index.ets @@ -0,0 +1,323 @@ +/* + * Copyright (c) 2021-2022 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 screenshot from "@ohos.screenshot" +import image from "@ohos.multimedia.image" +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import WindowManager, +{WindowType, WINDOW_SHOW_HIDE_EVENT} from '../../../../../../../../common/src/main/ets/default/WindowManager' +import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager" +import {START_ABILITY_EVENT} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' +import MultimodalInputManager from '../../../../../../../../common/src/main/ets/default/MultimodalInputManager' +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import HeightConfigUtils from '../../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' +import StatusBarVM from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' +import NavigationEvent from './common/navigationEvent' +import Notification from './notification' +import ControlCenterComponent from './control' +import StyleManager from './common/StyleManager' +import featureAbility from '@ohos.ability.featureAbility'; +import settings from '@ohos.settings'; +import CommonConstants from "../../../../../../../../common/src/main/ets/default/Constants"; + +const TAG = 'DropdownPanel-Index' + +let mHeightConfigUtils + +const SHOW_ANIM_CONFIG = { + duration: 300, + tempo: 1.0, + curve: Curve.Friction, + delay: 0, + iterations: 1, + playMode: PlayMode.Normal +}; +const HIDE_ANIM_CONFIG = { + duration: 200, + tempo: 1.0, + curve: Curve.EaseOut, + delay: 0, + iterations: 1, + playMode: PlayMode.Normal, +} + +@Entry +@Component +struct Index { + @State showComponentName: string = undefined + @State componentOptAreaHeightPX: number = 0 + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + @State controlCenterComponentConfig: any = {}; + @State mBackground: PixelMap | undefined = undefined; + mCallback: any; + mClearCallbacks: unsubscribe[] + settingDataKey = 'settings.display.navigationbar_status'; + urivar: string = null; + helper: any = null; + mNavigationBarStatusDefaultValue: string = '1'; + navigationBarWidth: number = 0; + mNeedUpdate: boolean = false; + mWidthPx: number = 0; + @State mNotificationInsert: any = {} + @State mNotificationDelete: any = {} + @State mControlCenterInsert: any = {} + @State mControlCenterDelete: any = {} + @State componentOptAreaTranslateY: string = '0px' + @State backgroundOpacity: number = 0 + + onBackPress(): boolean { + return true + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear, start`) + + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + StyleManager.setStyle() + + let dropdownRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect') + let navigationBarRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config') + this.urivar = settings.getUriSync(this.settingDataKey); + this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), CommonConstants.URI_VAR); + this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); + Log.showInfo(TAG, `getValueSync componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`) + this.helper.on("dataChange", this.urivar, (data) => { + if (data.code !== 0) { + Log.showInfo(TAG, `dataChangesCallback failed, because ${data.message}`); + return; + } else { + this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); + Log.showInfo(TAG, `NavigationBar status change, componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`) + } + }) + + this.componentOptAreaTranslateY = (-this.componentOptAreaHeightPX * 0.1) + 'px' + + this.mClearCallbacks = [] + this.mClearCallbacks.push( + EventManager.subscribe('DropdownEvent', (args) => this.onDropdownEvent(args)), + EventManager.subscribe(START_ABILITY_EVENT, (args) => this.onStartAbility(args)), + EventManager.subscribe('hideNotificationWindowEvent', (args) => this.onHideNotificationWindowEvent(args))) + + mHeightConfigUtils = new HeightConfigUtils(); + let StatusCoefficient; + + StatusCoefficient = AppStorage.SetAndLink("StatusCoefficient", 1.0); + StatusCoefficient.set(mHeightConfigUtils.getStatusCoefficient()); + + let signalObserved = AppStorage.SetAndLink("signalObserved", false); + signalObserved.set(false); + + this.mCallback = { + "onStateChange": (data) => this.onStateChange(data), + "onNotificationShowOrHide": (err, data) => this.onNotificationShowOrHide(err, data), + "onControlShowOrHide": (err, data) => this.onControlShowOrHide(err, data) + } + NavigationEvent.registerCallback(this.mCallback); + MultimodalInputManager.registerControlListener(this.mCallback); + MultimodalInputManager.registerNotificationListener(this.mCallback); + Log.showInfo(TAG, `aboutToAppear, end`) + } + + onPageShow() { + Log.showInfo(TAG, `onPageShow, start`) + if (!this.showComponentName) { + return + } + StatusBarVM.setUseInWindowName(WindowType.DROPDOWN_PANEL) + this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { + Log.showInfo(TAG, `onPageShow, show anim finish.`); + } }, () => { + this.componentOptAreaTranslateY = '0px' + this.backgroundOpacity = 1 + }) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + this.mClearCallbacks.forEach((mClearCallback: Function) => { + mClearCallback() + mClearCallback = undefined + }) + this.mClearCallbacks = undefined + } + + resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect) { + Log.showInfo(TAG, `resizeDropdownPanelAndNavigationBar, dropdownRect: ${JSON.stringify(dropdownRect)} navigationBarRect: ${JSON.stringify(navigationBarRect)}`) + this.mNavigationBarStatusDefaultValue = settings.getValueSync(this.helper, this.settingDataKey, '1'); + this.componentOptAreaHeightPX = this.mNavigationBarStatusDefaultValue == '1' ? dropdownRect.height - navigationBarRect.realHeight : dropdownRect.height; + this.navigationBarWidth = this.mNavigationBarStatusDefaultValue == '1' ? navigationBarRect.height : 0; + WindowManager.resetSizeWindow(WindowType.NAVIGATION_BAR, { ...navigationBarRect, height: this.navigationBarWidth }) + WindowManager.resetSizeWindow(WindowType.DROPDOWN_PANEL, { ...dropdownRect, height: this.componentOptAreaHeightPX }) + } + + onNotificationShowOrHide(err, data) { + Log.showInfo(TAG, `mNotificationAsyncCallback preKeys: ${data.preKeys}, finalKey: ${data.finalKey}`); + Log.showInfo(TAG, `this.showComponentName: ${this.showComponentName}`); + if (this.showComponentName == 'Notification') { + this.hideSelf(); + } else { + this.showSelf('Notification'); + } + Log.showInfo(TAG, `mNotificationAsyncCallback end`); + } + + onControlShowOrHide(err, data) { + Log.showInfo(TAG, `mControlAsyncCallback preKeys: ${data.preKeys}, finalKey: ${data.finalKey}`); + Log.showInfo(TAG, `this.showComponentName: ${this.showComponentName}`); + if (this.showComponentName == 'ControlCenter') { + this.hideSelf(); + } else { + this.showSelf('ControlCenter'); + } + Log.showInfo(TAG, `mControlAsyncCallback end`); + } + + onStateChange(data) { + Log.showInfo(TAG, `onStateChange, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `onStateChange, showComponentName: ${this.showComponentName}`) + if (this.showComponentName) { + this.hideSelf() + } + } + + onDropdownEvent(args) { + Log.showInfo(TAG, `onDropdownEvent, args: ${JSON.stringify(args)}`) + this.showSelf(args.dropdownArea == 'left' ? 'Notification' : 'ControlCenter') + } + + onStartAbility(args) { + Log.showInfo(TAG, `onStartAbility, args: ${args}`) + this.hideSelf() + } + + onHideNotificationWindowEvent(args) { + Log.showInfo(TAG, `onHideNotificationWindowEvent, args: ${args}`) + this.hideSelf() + } + + onTouchMove(data) { + Log.showInfo(TAG, `onTouchMove, data: ${JSON.stringify(data)}`) + if (data.direction == 'top') { + this.hideSelf() + } else if (data.direction == 'left' && data.touchComponent == 'notification') { + this.switchNotificationOrControlCenter('ControlCenter') + } else if (data.direction == 'right' && data.touchComponent == 'control') { + this.switchNotificationOrControlCenter('Notification') + } + } + + switchNotificationOrControlCenter(showComponentName) { + Log.showInfo(TAG, `switchNotificationOrControlCenter, showComponentName: ${showComponentName}`) + this.mNotificationInsert = { type: TransitionType.Insert, opacity: 0, translate: { x: (-this.mWidthPx) + 'px' } } + this.mControlCenterInsert = { type: TransitionType.Insert, opacity: 0, translate: { x: (this.mWidthPx) + 'px' } } + let transitionDelete = { + type: TransitionType.Delete, + opacity: 0, + scale: { x: 0.8, y: 0.8, centerX: '50%', centerY: '50%' } + } + this.mNotificationDelete = transitionDelete + this.mControlCenterDelete = transitionDelete + this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { + Log.showInfo(TAG, `switchNotificationOrControlCenter, show anim finish.`); + } }, () => { + this.showComponentName = showComponentName + }) + } + + showSelf(showComponentName) { + Log.showInfo(TAG, `showSelf, showComponentName: ${showComponentName}`) + this.showComponentName = showComponentName + this.updateBackground() + WindowManager.showWindow(WindowType.DROPDOWN_PANEL) + } + + hideSelf() { + Log.showInfo(TAG, `hideSelf`) + this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { + Log.showInfo(TAG, `hideSelf, hide anim finish.`); + this.showComponentName = undefined + this.mBackground && this.mBackground.release(); + this.mBackground = undefined; + WindowManager.hideWindow(WindowType.DROPDOWN_PANEL) + } }, () => { + this.componentOptAreaTranslateY = (-this.componentOptAreaHeightPX * 0.1) + 'px' + this.backgroundOpacity = 0 + }) + } + + updateBackground() { + let rect = WindowManager.getWindowInfo(WindowType.DROPDOWN_PANEL)?.rect; + Log.showInfo(TAG, `start get snapShot, rect: ${JSON.stringify(rect)}`) + screenshot.save({ screenRect: rect }) + .then((snapImage) => { + Log.showInfo(TAG, `get snap: ${JSON.stringify(snapImage)}`) + this.mBackground = snapImage + }) + } + + _animateTo(config, callback) { + Log.showInfo(TAG, `_animateTo, config: ${JSON.stringify(config)}`) + animateTo(config, callback) + setTimeout(config.onFinish, config.duration + config.delay) + } + + build() { + Stack({ alignContent: Alignment.Top }) { + if (this.mBackground) { + Image(this.mBackground) + .width('100%') + .height('100%') + .objectFit(ImageFit.Fill) + .blur(20) + .opacity(this.backgroundOpacity) + } + Column() { + if (this.showComponentName == 'Notification') { + Column() { + Notification({ touchMoveCallback: (data) => this.onTouchMove(data) }) + } + .width('100%') + .height('100%') + .transition(this.mNotificationInsert) + .transition(this.mNotificationDelete) + } else if (this.showComponentName == 'ControlCenter') { + Column() { + ControlCenterComponent({ + touchMoveCallback: (data) => this.onTouchMove(data) + }) + } + .width('100%') + .height('100%') + .transition(this.mControlCenterInsert) + .transition(this.mControlCenterDelete) + } + } + .width('100%') + .height(this.componentOptAreaHeightPX + 'px') + .translate({ y: this.componentOptAreaTranslateY }) + } + .width('100%') + .height('100%') + .backgroundColor($r("app.color.default_background")) + .opacity(this.backgroundOpacity) + .onAreaChange((e, e2) => { + Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + this.mWidthPx = vp2px(e2.width) + }) + } +} diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/notification.ets new file mode 100644 index 00000000..ad0dee75 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/notification.ets @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" +import Constants from './common/constants' +import BatteryIcon from '../../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon' +import ClockIcon from '../../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon' +import WifiIcon from '../../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon' +import BluetoothIcon from '../../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent' +import SignalIcon from '../../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon' +import LocationIcon from '../../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' +import RingModeIcon from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' +import NotificationListComponent from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent' +import ViewModel from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel' +import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil' +import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT } from '../../../../../../../../common/src/main/ets/default/TimeManager' + +const TAG = 'DropdownPanel-notification' +const GRID_SIZE = 6; +const IMAGE_SIZE_L = 40; +const IMAGE_SIZE_S = 48; +const NO_NOTIFICATION_TOP_MARGIN = 40; +const TIME_TEXT_MARGIN = 8; +const TIME_BOTTOM_OFFSET = 7; +const SETTING_ICON_MARGIN = 12; + +@Component +export default struct Notification { + private touchMoveCallback: Function + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 + @StorageLink('notificationList') notificationList: any[] = [] + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + } + + build() { + Stack({ alignContent: Alignment.Bottom }) { + Column() { + Row() + .height(24) + .width('100%') + .backgroundColor($r("app.color.statusbar_background_color")) + }.height('100%') + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { + statusBar() + CenterTitle({ + touchMoveCallback: (data) => this.CenterTitleTouchMoveCallback(data) + }) + if (this.notificationList.length == 0) { + Text($r("app.string.no_notification")) + .fontColor($r("sys.color.ohos_id_color_text_primary_contrary")) + .fontSize($r("sys.float.ohos_id_text_size_sub_title2")) + .fontWeight(FontWeight.Medium) + .alignSelf(ItemAlign.Center) + .margin({ top: NO_NOTIFICATION_TOP_MARGIN }) + } else { + NotificationListComponent() + } + }.padding({ + left: $r("sys.float.ohos_id_notification_margin_start"), + right: $r("sys.float.ohos_id_notification_margin_end") + }) + .height('100%') + } + + if (this.notificationList.length > 0) { + Image($r('app.media.delete_all')) + .width(IMAGE_SIZE_L) + .height(IMAGE_SIZE_L) + .margin({ bottom: 32 }) + .onClick(() => { + ViewModel.removeAllNotifications(); + }) + } + }.onTouch(this.touchEvent.bind(this)) + } + + touchEvent(event: TouchEvent) { + if (event.type == Constants.TOUCHTYPE_DOWN) { + this.startX = event.touches[0].screenX + this.startY = event.touches[0].screenY + Log.showInfo(TAG, `touchStart2=======startX: ${this.startX}, startY: ${this.startY}`) + } else if (event.type == Constants.TOUCHTYPE_MOVE) { + this.moveX = event.touches[0].screenX - this.startX + this.moveY = event.touches[0].screenY - this.startY + } else if (event.type == Constants.TOUCHTYPE_UP) { + Log.showInfo(TAG, `touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`) + if (this.moveY < -30) { + if (this.touchMoveCallback) { + this.touchMoveCallback({ 'direction': 'top', 'touchComponent': 'notification' }) + } + } + } + } + + CenterTitleTouchMoveCallback(data) { + Log.showInfo(TAG, `CenterTitleTouchMoveCallback, data: ${JSON.stringify(data)}`) + data['touchComponent'] = 'notification' + if (this.touchMoveCallback) { + this.touchMoveCallback(data) + } + } +} + +@Component +struct statusBar { + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + SignalIcon() + WifiIcon() + } + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + LocationIcon() + BluetoothIcon() + RingModeIcon() + BatteryIcon() + ClockIcon() + } + } + .height(24) + .width('100%') + } +} + +@Component +struct CenterTitle { + private touchMoveCallback: Function + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 + @State mTimeString: string = ''; + @State mTime: string = '01:01' + unSubscriber?: unsubscribe; + + aboutToAppear() { + Log.showInfo(TAG, `CenterTitle, aboutToAppear`) + this.unSubscriber = EventManager.subscribe(TIME_CHANGE_EVENT, (args: TimeEventArgs) => { + this.updateTimeString(args.date) + }); + this.updateTimeString(new Date()) + } + + aboutToDisappear() { + Log.showInfo(TAG, 'CenterTitle aboutToDisappear'); + this.unSubscriber && this.unSubscriber(); + this.unSubscriber = undefined; + } + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.End, justifyContent: FlexAlign.Start }) { + Text(this.mTime) + .fontColor($r("sys.color.ohos_id_color_text_primary_contrary")) + .fontSize('36fp') + .fontWeight(FontWeight.Medium) + .margin({ left: TIME_TEXT_MARGIN }) + Text(this.mTimeString) + .fontColor($r("sys.color.ohos_id_color_text_primary_contrary")) + .fontSize($r("sys.float.ohos_id_text_size_sub_title3")) + .fontWeight(FontWeight.Medium) + .margin({ left: TIME_TEXT_MARGIN, bottom: TIME_BOTTOM_OFFSET }) + .flexGrow(1) + Image($r('app.media.ic_settings')) + .objectFit(ImageFit.Contain) + .width(IMAGE_SIZE_S) + .height(IMAGE_SIZE_S) + .margin({ right: SETTING_ICON_MARGIN, bottom: TIME_BOTTOM_OFFSET }) + .onClick(this.settingClick.bind(this)) + } + .margin({ top: TIME_TEXT_MARGIN, bottom: TIME_TEXT_MARGIN }) + .onTouch(this.touchEvent.bind(this)) + } + + async updateTimeString(date: Date) { + this.mTime = TimeManager.formatTime(date); + let timeString = (date.getMonth() + 1) + (await ResourceUtil.getString($r('app.string.month'))); + timeString += date.getDate() + (await ResourceUtil.getString($r('app.string.month'))); + timeString += await ResourceUtil.getString(Constants.WEEKDAY_LIST[date.getMonth()]); + this.mTimeString = timeString; + } + + settingClick() { + Log.showInfo(TAG, ` settingClick `) + EventManager.publish(obtainStartAbility('com.ohos.systemui', 'com.ohos.systemui.notificationmanagement.MainAbility')) + } + + touchEvent(event: TouchEvent) { + if (event.type == Constants.TOUCHTYPE_DOWN) { + this.startX = event.touches[0].screenX + this.startY = event.touches[0].screenY + Log.showInfo(TAG, `CenterTitle touchStart2=======startX: ${this.startX}, startY: ${this.startY}`) + } else if (event.type == Constants.TOUCHTYPE_MOVE) { + this.moveX = event.touches[0].screenX - this.startX + this.moveY = event.touches[0].screenY - this.startY + } else if (event.type == Constants.TOUCHTYPE_UP) { + Log.showInfo(TAG, `CenterTitle touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`) + if (this.moveX < -30) { + if (this.touchMoveCallback) { + this.touchMoveCallback({ 'direction': 'left' }) + } + } else if (this.moveX > 30) { + if (this.touchMoveCallback) { + this.touchMoveCallback({ 'direction': 'right' }) + } + } + } + } +} diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js new file mode 100644 index 00000000..3135d74c --- /dev/null +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2021-2022 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 worker from "@ohos.worker"; +import Log from "../../../../../../../../common/src/main/ets/default/Log"; +import PluginDataSourceManager +from "../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager"; +import Constants, { obtainMsg } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; + +const parentPort = worker.parentPort; +const TAG = `${parentPort.name} Worker`; +Log.showInfo(TAG, `Start.`); + +var sManager; + +parentPort.onmessage = (msg) => { + Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); + let data = msg.data; + switch (data.action) { + case Constants.INIT_CONFIG: + initConfig(data.data); + break; + case Constants.CLEAR_ALL: + clearAll(); + break; + case Constants.LOAD_DATA: + loadData(data.data); + break; + default: + Log.showError(TAG, `onMessage, unknown action type.`); + } +}; + +function initConfig(config) { + Log.showInfo(TAG, `initConfig, config = ${JSON.stringify(config)}`); + sManager = new PluginDataSourceManager({ + onItemAdd: (itemData) => { + Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); + itemData.label && (itemData.label = encodeURIComponent(itemData.label)); + parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); + }, + onItemRemove: (itemData) => { + Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); + }, + }); + sManager.initDataSource(config); + parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); +} + +function clearAll() { + Log.showInfo(TAG, `clearAll `); + sManager?.clearAll(); +} + +function loadData(userId) { + Log.showInfo(TAG, `loadData `); + sManager?.loadData(userId); +} + +parentPort.onclose = function () { + Log.showInfo(TAG, `onclose`); +}; + +parentPort.onmessageerror = function () { + Log.showInfo(TAG, `onmessageerror`); +}; + +parentPort.onerror = function (data) { + Log.showInfo( + TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + ); +}; \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/color.json b/product/phone/dropdownpanel/src/main/resources/base/element/color.json new file mode 100644 index 00000000..24157404 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/element/color.json @@ -0,0 +1,23 @@ +{ + "color": [ + { + "name": "default_background", + "value": "#4D999999" + }, + { + "name": "default_font_color", + "value": "#ffffffff" + }, + { + "name": "quickly_setting_time_font_color", + "value": "#ffffffff" + }, + { + "name": "quickly_setting_date_font_color", + "value": "#ffffffff" + },{ + "name": "statusbar_background_color", + "value": "#1a262626" + } + ] +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/float.json b/product/phone/dropdownpanel/src/main/resources/base/element/float.json new file mode 100644 index 00000000..76a0e294 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/element/float.json @@ -0,0 +1,60 @@ + { + "float": [ + { + "name": "status_bar_height", + "value": "48vp" + }, + { + "name": "quickly_setting_time_font_size", + "value": "30fp" + }, + { + "name": "quickly_setting_date_font_size", + "value": "20fp" + }, + { + "name": "quickly_setting_text_flex_margin_left", + "value": "10vp" + }, + { + "name": "quickly_setting_image_width", + "value": "50vp" + }, + { + "name": "quickly_setting_image_height", + "value": "50vp" + }, + { + "name": "quickly_setting_image_margin_right", + "value": "10vp" + }, + { + "name": "quickly_setting_border_radius", + "value": "20vp" + }, + { + "name": "quickly_setting_margin_left", + "value": "10vp" + }, + { + "name": "quickly_setting_margin_right", + "value": "10vp" + }, + { + "name": "delete_all_image_width", + "value": "50vp" + }, + { + "name": "delete_all_image_height", + "value": "50vp" + }, + { + "name": "delete_all_image_border_radius", + "value": "25vp" + }, + { + "name": "delete_all_image_opacity", + "value": "0.9" + } + ] +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/string.json b/product/phone/dropdownpanel/src/main/resources/base/element/string.json new file mode 100644 index 00000000..128a7ac0 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/element/string.json @@ -0,0 +1,52 @@ +{ + "string": [ + { + "name": "app_name", + "value": "SystemUI" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "monday", + "value": "星期一" + }, + { + "name": "tuesday", + "value": "星期二" + }, + { + "name": "wednesday", + "value": "星期三" + }, + { + "name": "thursday", + "value": "星期四" + }, + { + "name": "friday", + "value": "星期五" + }, + { + "name": "saturday", + "value": "星期六" + }, + { + "name": "sunday", + "value": "星期日" + }, + { + "name": "day", + "value": "日" + }, + { + "name": "month", + "value": "月" + }, + { + "name": "no_notification", + "value": "没有通知" + } + ] +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/delete_all.png b/product/phone/dropdownpanel/src/main/resources/base/media/delete_all.png new file mode 100644 index 0000000000000000000000000000000000000000..143463751f103bbf00d204cbbd40982b9a5a6ec1 GIT binary patch literal 4061 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 P00000NkvXXu0mjf(|(n6 literal 0 HcmV?d00001 diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png b/product/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b665b89cd206a3e476f5e9efbe31d482be7a0321 GIT binary patch literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKMSxF;E0F#_5a8H~Cu@LqYm@}} z1v9Kz!j?9FIuBE}!mNZcS4&e#flzNf(Mi1>^=i%1`N3NL4o1n*HdQBu_hvFMFdKWi zIEF+Vej9#s+ad#j78kRdfm2)=4?g|>zd()AfAYJE{uH_A*Cuyvob>9Qm;38_*Xl$w zg_;8Ad2?=RF*z@q+goV#=%cJtiHVZdQUAw>rJKGbt>ZbuVqg*wcDRBmm+e%Z!84E9 zGmVOK{~Sz9ZSWBYJuGgoCl@W7{erOF;$IcgfUmCs@iPs@$<)xc{e&^r`Hz$n5Fc68o!~6m_X;r-3M!*R-C#c`pk^s zJ>T*>EFJ6%T6QFUShJtKpQXsdIE67zW3s}|YH=6SU-PrlN>v`}xS4-du5QippJ`Rn zlFzT2*C&DGO4`=s8kF>v+H*|T5jcEU0pj}>p- z&R(2s@b;??RS90X*HG_Xm(`U0F=ADlvyYehs0yDJnOBw9C1X25<)^Op@q~BX8`ta1P@n&# zQlMZ?9?P2xVMZIL`p>!fQo?`Pha*Q8{uX#SRq~QV<$VUw{C@5NXD`4}D? zS~OS2;k@mRipJAhZ%#R$7J5D1Jw481L5+t=u#l-@Ot#dN<6lnQ?@xF%E6L7fSI?=G zKd;W-{qYPw7g)mGYe$1ILWg+-yu;l zp literal 0 HcmV?d00001 diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/icon.png b/product/phone/dropdownpanel/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 + WindowManager.showWindow(WindowType.STATUS_BAR) + ); + } + + onDestroy() { + Log.showInfo(TAG, 'api8New onDestroy'); + } +} + +export default ServiceExtAbility \ No newline at end of file diff --git a/product/navigationBar/src/main/ets/default/app.ets b/product/phone/statusbar/src/main/ets/ServiceExtAbility/app.ets similarity index 37% rename from product/navigationBar/src/main/ets/default/app.ets rename to product/phone/statusbar/src/main/ets/ServiceExtAbility/app.ets index a0bf8f9f..58395908 100644 --- a/product/navigationBar/src/main/ets/default/app.ets +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/app.ets @@ -13,22 +13,26 @@ * limitations under the License. */ -import configManager from '../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets' -import WindowManager from '../../../../../../common/src/main/ets/default/WindowManager.ets' -import NavBarConfiguration from './common/NavBarConfiguration.ets' - -let mConfigMangager = configManager; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBarVM from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' +import {StatusBarData} from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants' export default { async onCreate() { - console.info('Application onCreate') - let val = await NavBarConfiguration.getConfiguration(); - let mWindowManager = new WindowManager(); - await mWindowManager.initWindowManager(); - await mWindowManager.initWindowMin(val.realWidth, val.realHeight, val.xCoordinate, val.yCoordinate) - mConfigMangager.initConfig(); + console.info('SystemUI statusBar Application onCreate') + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config') + let statusBarData: StatusBarData = new StatusBarData(); + statusBarData.displayWidth = configInfo.maxWidth; + statusBarData.displayHeight = configInfo.maxHeight; + statusBarData.showHorizontal = configInfo.showHorizontal; + statusBarData.ableToMaximize = configInfo.ableToMaximize; + statusBarData.realWidth = configInfo.realWidth; + statusBarData.realHeight = configInfo.realHeight; + statusBarData.left = configInfo.xCoordinate; + statusBarData.top = configInfo.yCoordinate; + StatusBarVM.updateStatusBarData(statusBarData); }, onDestroy() { - console.info('Application onDestroy') + console.info('SystemUI statusBar Application onDestroy') }, -} \ No newline at end of file +} diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts new file mode 100644 index 00000000..0dc0910a --- /dev/null +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2021-2022 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 {FASlotName} from '../../../../../../../../../common/src/main/ets/default/Constants'; + +type LayoutGroup = { + id: number; + Components: Array; +}; +type pluginIconData = { + id: string; + bundleName: string; + abilityName: string; +}; +type DropdownRange = { + startPosition: number; + endPosition: number; +}; +type Config = { + LayoutGroups: Array; + LocalSlots: Array; + MetaSlots: Array; + emptyPosition: { + x1: number; + x2: number; + y1: number; + y2: number + }; + dropdownRanges: { + notification: DropdownRange; + control: DropdownRange + } +}; + +const StatusbarConfig: Config = { + LayoutGroups: [ + { + id: 1, + Components: [ + FASlotName.SIGNAL, + FASlotName.WIFI, + FASlotName.CAPSULE, + FASlotName.NOTIFICATION, + ], + }, + { + id: 2, + Components: [], + }, + { + id: 3, + Components: [ + "testid", + FASlotName.LOCATION, + FASlotName.BLUETOOTH, + FASlotName.RING_MODE, + FASlotName.BATTERY, + FASlotName.CLOCK, + ], + }, + ], + LocalSlots: [ + FASlotName.BATTERY, + FASlotName.BLUETOOTH, + FASlotName.CAPSULE, + FASlotName.CLOCK, + FASlotName.LOCATION, + FASlotName.NOTIFICATION, + FASlotName.RING_MODE, + FASlotName.SIGNAL, + FASlotName.WIFI, + ], + MetaSlots: [ + { + id: "testid", + bundleName: "com.example.test_app_id", + abilityName: "com.example.test_app_id.MainAbility", + }, + ], + emptyPosition: { + x1: 0, + y1: 0, + x2: 0, + y2: 0, + }, + dropdownRanges: { + notification: { + startPosition: 0, + endPosition: 0.5 + }, + control: { + startPosition: 0.5, + endPosition: 1 + }, + } +}; + +export default StatusbarConfig; \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts new file mode 100644 index 00000000..9c7d17d3 --- /dev/null +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../../common/src/main/ets/default/StyleManager'; + +const TAG = 'StatusBar-StyleConfiguration'; + +export default class StyleConfiguration { + static getIndexStyle() { + const key: string = TAG + "-Index"; + return StyleManager.getStyle(key, () => { + return {}; + }); + } +} \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts new file mode 100644 index 00000000..9059434e --- /dev/null +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import IndexStyleConfiguration from './StyleConfiguration' + +const TAG = 'StatusBar-StyleManager'; + +export default class StyleManager { + static STANDARD_DISPLAY_WIDTH: number = 720; + static STANDARD_DISPLAY_HEIGHT: number = 1280; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + + static setStyle() { + Log.showInfo(TAG, `setStyle`) + + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); + StyleManager.maxWidth = config.maxWidth; + + // xxx + { + + } + + } + + static number2px(n: number): string { + return n.toString() + 'px'; + } + + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/constants.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/constants.ts new file mode 100644 index 00000000..16e20ce9 --- /dev/null +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/constants.ts @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + static TOUCHTYPE_DOWN = 0; + static TOUCHTYPE_UP = 1; + static TOUCHTYPE_MOVE = 2; +} \ No newline at end of file diff --git a/product/statusbar/src/main/ets/default/pages/index.ets b/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets similarity index 36% rename from product/statusbar/src/main/ets/default/pages/index.ets rename to product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets index 4ac78b95..a4d80d68 100644 --- a/product/statusbar/src/main/ets/default/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,27 +13,23 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -import ReadConfigUtil from '../../../../../../../common/src/main/ets/default/ReadConfigUtil.ets' -import Notification from './notification.ets' -import ControlCenterComponent from './control.ets' -import Constants from './common/constants.ets' -import NavigationEvent from './common/navigationEvent.ets' -import mBrightnessManager from '../../../../../../../features/brightnesscomponent/src/main/ets/default/brightnessManager.ets'; -import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ets'; -import StatusBarComponent from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets'; -import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets'; -import Window from '@ohos.window'; - -const STATUS_BAR_COMPONENT_CONFIG_FILE_PATH = "/data/accounts/account_0/applications/com.ohos.systemui/" + -"com.ohos.systemui.statusbar/assets/statusbar/resources/rawfile/statusbarcomponentConfig.json"; - -const CONTROL_CENTER_COMPONENT_CONFIG_FILE_PATH = "/data/accounts/account_0/applications/com.ohos.systemui/" + -"com.ohos.systemui.statusbar/assets/statusbar/resources/rawfile/controlcentercomponentConfig.json"; +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import WindowManager, {WindowType, WINDOW_SHOW_HIDE_EVENT +} from '../../../../../../../../common/src/main/ets/default/WindowManager' +import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainLocalEvent} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' +import HeightConfigUtils from '../../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' +import StatusBarComponent from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' +import StatusBarVM from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' +import {StatusBarData} from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants' +import Constants from './common/constants' +import StyleManager from './common/StyleManager' +import StatusbarConfig from './common/StatusbarConfig' const TAG = 'StatusBar-Index' +const SLIDING_STATUS_BAR_DISTANCE = 30 -let mWindowManager; let mHeightConfigUtils; @Entry @@ -43,23 +39,24 @@ struct Index { startY: number = 0 @State moveX: number = 0 @State moveY: number = 0 - @StorageLink("showStatusBar") showStatusBar: boolean = true - @StorageLink("showHorizontal") showHorizontal: boolean = true - @StorageLink("ableToMaximize") ableToMaximize: boolean = true - @StorageLink('minHeight') minHeight: number = 0 - @StorageLink('maxWidth') maxWidth: number = 0 + @State mStatusBarData: StatusBarData = StatusBarVM.getStatusBarData() @StorageLink('StatusMinH') StatusMinH: number = 24 @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 - @State statusBarComponentConfig: any = {}; - @State controlCenterComponentConfig: any = {}; - mCallback: any; + mClearCallback: unsubscribe | undefined onBackPress(): boolean { return true; } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, start showStatusBar: ${this.showStatusBar}`); + Log.showInfo(TAG, `aboutToAppear, start`); + + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + StyleManager.setStyle() + + this.mClearCallback = EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => this.onWindowShowHideEvent(args)) + mHeightConfigUtils = new HeightConfigUtils(); let StatusMinH; let StatusCoefficient; @@ -69,78 +66,39 @@ struct Index { StatusMinH.set(mHeightConfigUtils.getStatusMinH()); StatusCoefficient.set(mHeightConfigUtils.getStatusCoefficient()); - { - let configData = ReadConfigUtil.ReadConfigFile(STATUS_BAR_COMPONENT_CONFIG_FILE_PATH); - for (let key in configData) { - this.statusBarComponentConfig[key] = configData[key]; - } - } - { - let controlCenterConfigData = ReadConfigUtil.ReadConfigFile(CONTROL_CENTER_COMPONENT_CONFIG_FILE_PATH); - for (let key in controlCenterConfigData) { - this.controlCenterComponentConfig[key] = controlCenterConfigData[key]; - } - } - let signalObserved = AppStorage.SetAndLink("signalObserved", false); signalObserved.set(false); - mWindowManager = new WindowManager(); - mWindowManager.initWindowManager(); - this.mCallback = { - "onStateChange": this.onStateChange.bind(this) - } - NavigationEvent.registerCallback(this.mCallback); - Log.showInfo(TAG, `aboutToAppear, end showStatusBar: ${this.showStatusBar}`); - } - - onStateChange(data) { - if (this.ableToMaximize && !this.showStatusBar) { - this.showStatusBar = true; - mWindowManager.setWindowMin((result) => { - }) - } + Log.showInfo(TAG, `aboutToAppear, end`); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear, showStatusBar: ${this.showStatusBar}`); + Log.showInfo(TAG, `aboutToDisappear`); + this.mClearCallback && this.mClearCallback() + this.mClearCallback = undefined } build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - if (this.showStatusBar) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - StatusBarComponent({ - mStatusBarComponentConfig: this.statusBarComponentConfig, - mStatusBarColor: '#ffffffff' - }) - } - .width('100%') - .height('100%') - .backgroundColor($r("app.color.statusbar_background")) - .onTouch(this.touchEvent.bind(this)) - } else if (this.showHorizontal && this.ableToMaximize) { - if (vp2px(this.startX) <= parseInt((this.maxWidth / 2).toString())) { - Notification({ showStatusBar: $showStatusBar, minHeight: this.minHeight }) - } else { - ControlCenterComponent({ - showStatusBar: $showStatusBar, - minHeight: this.minHeight, - mControlCenterComponentConfig: this.controlCenterComponentConfig - }) - } + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + StatusBarComponent({ + mStatusBarComponentConfig: StatusbarConfig + }) } + .width('100%') + .height('100%') + .onTouch(this.touchEvent.bind(this)) } .width('100%') .height('100%') - .constraintSize({ minHeight: this.StatusMinH + 'px'}) + .constraintSize({ minHeight: this.StatusMinH + 'px' }) + .onAreaChange((e, e2) => { + Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + }) } touchEvent(event: TouchEvent) { Log.showInfo(TAG, 'touchEvent================' + event.touches) - if (!this.showHorizontal && !this.ableToMaximize) { - return; - } if (event.type == Constants.TOUCHTYPE_DOWN) { //down this.startX = event.touches[0].screenX this.startY = event.touches[0].screenY @@ -150,10 +108,45 @@ struct Index { this.moveY = event.touches[0].screenY - this.startY } else if (event.type == Constants.TOUCHTYPE_UP) { //up Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`) - if (this.moveY > 10) { - this.showStatusBar = false; - mWindowManager.setWindowMax((result) => { - }); + if (this.moveY > SLIDING_STATUS_BAR_DISTANCE) { + this.onDropdown(); + this.moveY = 0; + } + } + } + + onDropdown() { + Log.showInfo(TAG, `onDropdown`) + if (!this.mStatusBarData.showHorizontal || !this.mStatusBarData.ableToMaximize) { + return + } + let dropdownArea: string = null + if (this.checkDropdownShowStatus(StatusbarConfig.dropdownRanges.notification)) { + dropdownArea = 'left' + } else if (this.checkDropdownShowStatus(StatusbarConfig.dropdownRanges.control)) { + dropdownArea = 'right' + } + if (dropdownArea) { + EventManager.publish(obtainLocalEvent('DropdownEvent', { + dropdownArea: dropdownArea + })) + } + } + + checkDropdownShowStatus(range) { + let rangeStartX = this.mStatusBarData.realWidth * range.startPosition + this.mStatusBarData.left + let rangeEndX = this.mStatusBarData.realWidth * range.endPosition + this.mStatusBarData.left + return (vp2px(this.startX) >= rangeStartX) && (vp2px(this.startX) <= rangeEndX) + } + + onWindowShowHideEvent(args) { + Log.showInfo(TAG, `onWindowShowHideEvent, args: ${JSON.stringify(args)}`) + if (args.windowName == WindowType.DROPDOWN_PANEL) { + if (args.isShow) { + WindowManager.hideWindow(WindowType.STATUS_BAR) + } else { + StatusBarVM.setUseInWindowName(WindowType.STATUS_BAR) + WindowManager.showWindow(WindowType.STATUS_BAR) } } } diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js b/product/phone/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js new file mode 100644 index 00000000..3135d74c --- /dev/null +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2021-2022 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 worker from "@ohos.worker"; +import Log from "../../../../../../../../common/src/main/ets/default/Log"; +import PluginDataSourceManager +from "../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager"; +import Constants, { obtainMsg } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; + +const parentPort = worker.parentPort; +const TAG = `${parentPort.name} Worker`; +Log.showInfo(TAG, `Start.`); + +var sManager; + +parentPort.onmessage = (msg) => { + Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); + let data = msg.data; + switch (data.action) { + case Constants.INIT_CONFIG: + initConfig(data.data); + break; + case Constants.CLEAR_ALL: + clearAll(); + break; + case Constants.LOAD_DATA: + loadData(data.data); + break; + default: + Log.showError(TAG, `onMessage, unknown action type.`); + } +}; + +function initConfig(config) { + Log.showInfo(TAG, `initConfig, config = ${JSON.stringify(config)}`); + sManager = new PluginDataSourceManager({ + onItemAdd: (itemData) => { + Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); + itemData.label && (itemData.label = encodeURIComponent(itemData.label)); + parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); + }, + onItemRemove: (itemData) => { + Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); + }, + }); + sManager.initDataSource(config); + parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); +} + +function clearAll() { + Log.showInfo(TAG, `clearAll `); + sManager?.clearAll(); +} + +function loadData(userId) { + Log.showInfo(TAG, `loadData `); + sManager?.loadData(userId); +} + +parentPort.onclose = function () { + Log.showInfo(TAG, `onclose`); +}; + +parentPort.onmessageerror = function () { + Log.showInfo(TAG, `onmessageerror`); +}; + +parentPort.onerror = function (data) { + Log.showInfo( + TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + ); +}; \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/element/color.json b/product/phone/statusbar/src/main/resources/base/element/color.json new file mode 100644 index 00000000..6b163c9d --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/element/color.json @@ -0,0 +1,12 @@ +{ + "color": [ + { + "name": "default_background", + "value": "#66000000" + }, + { + "name": "default_font_color", + "value": "#ffffffff" + } + ] +} \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/element/string.json b/product/phone/statusbar/src/main/resources/base/element/string.json new file mode 100644 index 00000000..6857b5fe --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/element/string.json @@ -0,0 +1,28 @@ +{ + "string": [ + { + "name": "status_bar_size_portrait", + "value": "48" + }, + { + "name": "status_bar_size_landscape", + "value": "48" + }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, + { + "name": "app_name", + "value": "SystemUI" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/media/icon.png b/product/phone/statusbar/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 0) { - Image($r('app.media.delete_all')) //icon: remove all notifications - .objectFit(ImageFit.Contain) - .width($r('app.float.deleteall_image_width')) - .height($r('app.float.deleteall_image_height')) - .borderRadius($r('app.float.deleteall_image_borderradius')) - .opacity($r('app.float.deleteall_image_opacity')) - .onClick(() => { - ViewModel.removeAllNotifications(); - }) - .position({ x: '44.5%', y: '85%' }) - } - } - } - .width('100%') - .height('100%') - .backgroundColor($r('app.color.default_background')) - .onTouch(this.touchEvent.bind(this)) - } - - touchEvent(event: TouchEvent) { - if (event.type == Constants.TOUCHTYPE_DOWN) { - this.startX = event.touches[0].screenX - this.startY = event.touches[0].screenY - Log.showInfo(TAG, `touchStart2=======startX: ${this.startX}, startY: ${this.startY}`) - } else if (event.type == Constants.TOUCHTYPE_MOVE) { - this.moveX = event.touches[0].screenX - this.startX - this.moveY = event.touches[0].screenY - this.startY - } else if (event.type == Constants.TOUCHTYPE_UP) { - Log.showInfo(TAG, `touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`) - if (this.moveY < -30) { - this.showStatusBar = true; - mWindowManager.setWindowMin((result)=>{ - - }) - } - } - } -} - -@Component -struct statusBar { - private minHeight: number - @StorageLink('StatusCoefficient') StatusCoefficient:number = 1.0 - - build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - SignalIcon() - WifiIcon() - } - - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - LocationIcon() - BluetoothIcon() - RingModeIcon() - BatteryIcon() - ClockIcon() - } - } - .width('100%') - .height(this.minHeight + 'px') - } -} - -@Component -struct quicklySetting { - @Link showStatusBar: boolean - @StorageLink('time') mTime: string = '01:01' - @StorageLink('month') mMonth: number = 1 - @StorageLink('day') mDay: number = 1 - @StorageLink('weekDay') mWeekDay: number = 1 - @State showDay: string = 'day' - @State showMonth: string = 'month' - @State showWeekDay: any = 'weekday' - - aboutToAppear() { - Log.showInfo(TAG, `quicklySetting, aboutToAppear`) - //show month - this.showMonth = this.alignmentNumber(this.mMonth); - //show day - this.showDay = this.alignmentNumber(this.mDay); - //show weekDay - this.showWeekDay = Constants.WEEKDAY_LIST[this.mWeekDay-1]; - } - - aboutToDisappear() { - Log.showInfo(TAG, `quicklySetting, aboutToDisappear, showStatusBar: ${this.showStatusBar}`) - } - - build() { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Start }) { - Text(this.mTime) - .fontColor($r('app.color.quicklysetting_time_fontcolor')) - .fontSize($r('app.float.quicklysetting_time_fontsize')) - Flex({direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center}){ - dateItem({number: this.showMonth, unit: Constants.MARK_MONTH}) - dateItem({number: this.showDay, unit: Constants.MARK_DAY}) - Text(this.showWeekDay) - .fontColor($r('app.color.quicklysetting_date_fontcolor')) - .fontSize($r('app.float.quicklysetting_date_fontsize')) - } - } - .width('50%') - .height('100%') - .margin({ left: $r('app.float.quicklysetting_textflex_marginleft') }) - - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End }) { - Image($r('app.media.ic_settings')) - .objectFit(ImageFit.Contain) - .onClick(this.settingClick.bind(this)) - } - .width($r('app.float.quicklysetting_image_width')) - .height($r('app.float.quicklysetting_image_height')) - .margin({ right: $r('app.float.quicklysetting_image_marginright') }) - - } - .width('100%') - .height(Constants.QUICKLY_SETTING_H) - .borderRadius($r('app.float.quicklysetting_borderradius')) - .margin({ left: $r('app.float.quicklysetting_marginleft'), right: $r('app.float.quicklysetting_marginright') }) - } - - settingClick() { - Log.showInfo(TAG,` settingClick `) - this.showStatusBar = true; - mWindowManager.setWindowMin((result)=>{ - mFeatureAbilityManager.openAbility(TAG, { - want: { - bundleName: 'com.ohos.settings', - abilityName: 'com.ohos.settings.MainAbility' - } - }); - }); - } - alignmentNumber(timeOrDate){ - if(timeOrDate < Constants.DIGITS){ - return '0' + timeOrDate - }else{ - return '' + timeOrDate - } - } -} - -@Component -struct dateItem { - - @Prop number: string - @Prop unit: number - - build() { - Row() { - Text(this.number) - .fontColor($r('app.color.quicklysetting_date_fontcolor')) - .fontSize($r('app.float.quicklysetting_date_fontsize')) - if (this.unit == Constants.MARK_MONTH) { - Text($r('app.string.month')) - .fontColor($r('app.color.quicklysetting_date_fontcolor')) - .fontSize($r('app.float.quicklysetting_date_fontsize')) - } - if (this.unit == Constants.MARK_DAY) { - Text($r('app.string.day')) - .fontColor($r('app.color.quicklysetting_date_fontcolor')) - .fontSize($r('app.float.quicklysetting_date_fontsize')) - } - } - } -} diff --git a/product/statusbar/src/main/resources/base/media/airplane.svg b/product/statusbar/src/main/resources/base/media/airplane.svg deleted file mode 100644 index d648b9f9..00000000 --- a/product/statusbar/src/main/resources/base/media/airplane.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/media/airplane_d.svg b/product/statusbar/src/main/resources/base/media/airplane_d.svg deleted file mode 100644 index ad2180b1..00000000 --- a/product/statusbar/src/main/resources/base/media/airplane_d.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/media/wifi.svg b/product/statusbar/src/main/resources/base/media/wifi.svg deleted file mode 100644 index e22c8330..00000000 --- a/product/statusbar/src/main/resources/base/media/wifi.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - ic_notification_wlan - Created with Sketch. - - - - - - - - - - - - \ No newline at end of file diff --git a/product/statusbar/src/main/resources/base/media/wifi_d.svg b/product/statusbar/src/main/resources/base/media/wifi_d.svg deleted file mode 100644 index e851f5b3..00000000 --- a/product/statusbar/src/main/resources/base/media/wifi_d.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - ic_notification_wlan - Created with Sketch. - - - - - - - - - - - - \ No newline at end of file diff --git a/product/statusbar/src/main/resources/rawfile/controlcentercomponentConfig.json b/product/statusbar/src/main/resources/rawfile/controlcentercomponentConfig.json deleted file mode 100644 index bef77a0f..00000000 --- a/product/statusbar/src/main/resources/rawfile/controlcentercomponentConfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "ComplexToggleLayout": [ - "wifi", - "bluetooth" - ], - "TempDBSimpleToggleLayout": [ - "ring_mode", - "location", - "testid" - ], - "LocalToggles": [ - "wifi", - "bluetooth", - "air_plane", - "location", - "ring_mode" - ], - "MetaToggles": [ - { - "id": "testid", - "abilityName": "" - } - ] -} \ No newline at end of file diff --git a/product/statusbar/src/main/resources/rawfile/statusbarcomponentConfig.json b/product/statusbar/src/main/resources/rawfile/statusbarcomponentConfig.json deleted file mode 100644 index e76d8f80..00000000 --- a/product/statusbar/src/main/resources/rawfile/statusbarcomponentConfig.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "LayoutGroups": [ - { - "id": 1, - "Components": [ - "signal", - "wifi", - "capsule", - "notification" - ] - }, - { - "id": 2, - "Components": [] - }, - { - "id": 3, - "Components": [ - "location", - "bluetooth", - "ring_mode", - "battery", - "clock" - ] - } - ], - "metaIconKeys": [ - ], - "LocalSlots": [ - "clock", - "battery", - "signal", - "wifi", - "bluetooth", - "capsule", - "notification", - "location", - "ring_mode" - ], - "emptyPosition": { - "x1": 0, - "y1": 0, - "x2": 0, - "y2": 0 - } -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 57b50528..c7d80338 100755 --- a/settings.gradle +++ b/settings.gradle @@ -13,9 +13,22 @@ * limitations under the License. */ -include ':entry', ':product:navigationBar', ':common', ':product:statusbar', ':product:notificationmanagement', +include ':common', + ':phone_entry', ':phone_statusbar', ':phone_dropdownpanel', + ':pc_entry', ':pc_statusbar', ':pc_controlpanel', ':pc_notificationpanel', + ':default_navigationBar', ':default_notificationmanagement', ':default_volumepanel', ':features:capsulecomponent', ':features:batterycomponent', ':features:clockcomponent', ':features:signalcomponent', ':features:wificomponent', ':features:navigationservice', ':features:noticeitem', ':features:airplanecomponent', ':features:brightnesscomponent', ':features:volumecomponent', ':features:managementcomponent', ':features:statusbarcomponent', ':features:controlcentercomponent', ':features:bluetoothcomponent', ':features:locationcomponent', - ':features:ringmodecomponent' \ No newline at end of file + ':features:ringmodecomponent', ':features:volumepanelcomponent', ':features:autorotatecomponent' +project(':phone_entry').projectDir = new File('./entry/phone') +project(':phone_statusbar').projectDir = new File('./product/phone/statusbar') +project(':phone_dropdownpanel').projectDir = new File('./product/phone/dropdownpanel') +project(':pc_entry').projectDir = new File('./entry/pc') +project(':pc_statusbar').projectDir = new File('./product/pc/statusbar') +project(':pc_controlpanel').projectDir = new File('./product/pc/controlpanel') +project(':pc_notificationpanel').projectDir = new File('./product/pc/notificationpanel') +project(':default_navigationBar').projectDir = new File('./product/default/navigationBar') +project(':default_notificationmanagement').projectDir = new File('./product/default/notificationmanagement') +project(':default_volumepanel').projectDir = new File('./product/default/volumepanel') \ No newline at end of file diff --git a/signature/systemui.p7b b/signature/systemui.p7b index cf9fe423ed88490ddb7b204079128f4809a7ca6b..7a68d3ce4b72d244c2e68b8348286bb6f5fbf667 100644 GIT binary patch delta 426 zcmcaB^+u}RpouqwjZ>@5qwPB{BRkWACf-P(P$&~4qam*WHydX{n+IbmGYb==K@%${ zLLuXVCYE0;O)TH4mC90!iZk=`bd&Q_QkAR>b>ISdiMc=lB||*}Jp&~jrP9*O6d>2s zz{otw(lS-oGz~~hTqVh0Qds~}SCpEQnpm8wG%-ti;$cZeQ%e&IGgBi|3mv7r{1V;7 zw35^!pz&rFmL}%LK;hcSe2fa*{spOd9*IS{`FWL_tr9B8w+GtD`{^qwQpQoCjrCO)Dpy`0>Mli;V*qnCEO+ zn3-7I4P2QNN^AULDz_voDo^~oIAdLTc}-@5qwPB{BRkWACSEU~kQ);tqanWmFB@kVK9r4|)u=I80=CFZ6oSt%Ln8R!`(>A;1P^HYGrhB``#1qHe( znZ+eVnMtK3APpsz6ZeQs%+i~9Nz%y7(9+n%(#X(KM=3AAL^m<5B((^r3n*xA01~d% zQ7Wk{0GVHunvZdz($Nof&CZT{wm zES~JFP6kbkc9Zpa3i(jIGUdMx8B+j z`}_71W8ttwmv2vgO0k)(ec|5s&}ZxZ>3s%VY#hMQJ7>$n%*5hm;KHQ98Bo}-ZX4|p zu915+o@<@BOa82iWPby_^ Date: Mon, 11 Apr 2022 12:55:57 +0800 Subject: [PATCH 057/373] =?UTF-8?q?=E6=9B=B4=E6=96=B0systemui=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: username <1037761763@qq.com> --- .../ets/default/pages/airplaneComponent.ets | 18 +- .../main/resources/en_US/element/string.json | 2 +- features/autorotatecomponent/.gitignore | 1 + features/autorotatecomponent/build.gradle | 19 + .../autorotatecomponent/src/main/config.json | 23 + .../src/main/ets/com/ohos/common/Constants.ts | 21 + .../ets/com/ohos/model/AutoRotateService.ts | 105 +++++ ...lCenterSimpleToggleAutoRotateComponent.ets | 63 +++ .../ets/com/ohos/viewmodel/AutoRotateVM.ts | 53 +++ .../main/resources/base/element/string.json | 8 + .../ic_controlcenter_auto_rotate_off.svg | 7 + .../media/ic_controlcenter_auto_rotate_on.svg | 9 + .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + .../src/main/ets/default/batteryModel.ts | 99 ++++ .../ets/default/common/StyleConfiguration.ts | 49 ++ .../src/main/ets/default/common/constants.ts | 19 + .../main/ets/default/pages/batteryIcon.ets | 34 +- .../src/main/ets/default/pages/batteryPic.ets | 58 ++- .../src/main/ets/default/pages/batterySoc.ets | 19 +- .../main/ets/default/viewmodel/BatteryVM.ts | 37 ++ .../main/resources/base/element/color.json | 16 +- .../main/resources/base/element/float.json | 40 +- .../src/main/ets/com/ohos/common/Constants.ts | 18 + .../ets/com/ohos/common/StyleConfiguration.ts | 31 ++ .../ets/com/ohos/model/BluetoothService.ts | 92 ++++ ...lCenterComplexToggleBluetoothComponent.ets | 42 +- .../StatusBarIconItemBluetoothComponent.ets | 27 +- .../ets/com/ohos/viewmodel/BluetoothVM.ts | 67 +++ .../main/resources/base/element/float.json | 11 + .../base/media/ic_controlcenter_bt.svg | 14 +- .../base/media/ic_controlcenter_bt_d.svg | 14 +- .../resources/base/media/ic_status_bt.svg | 14 +- .../src/main/ets/default/brightnessManager.ts | 78 ++++ .../ets/default/common/StyleConfiguration.ts | 41 ++ .../ets/default/pages/brightnessComponent.ets | 74 +-- .../main/resources/base/element/color.json | 12 +- .../main/resources/base/element/float.json | 48 +- .../base/media/ic_brightness_plus.svg | 12 + .../base/media/ic_brightness_reduce.svg | 12 + .../ets/default/common/StyleConfiguration.ts | 38 ++ .../src/main/ets/default/common/constants.ts | 22 + .../main/ets/default/model/CapsuleModel.ts | 67 +++ .../main/ets/default/pages/CapsuleIcon.ets | 59 +-- .../ets/default/viewmodel/CapsuleViewModel.ts | 141 ++++++ .../main/resources/base/element/float.json | 27 +- .../ets/default/common/StyleConfiguration.ts | 29 ++ .../src/main/ets/default/pages/clockIcon.ets | 39 +- .../src/main/ets/default/viewmodel/ClockVM.ts | 37 ++ .../main/resources/base/element/float.json | 7 +- features/controlcentercomponent/build.gradle | 6 +- .../src/main/ets/com/ohos/common/Constants.ts | 35 ++ .../ets/com/ohos/common/StyleConfiguration.ts | 179 ++++++++ .../com/ohos/model/ControlCenterService.ts | 274 +++++++++++ .../com/ohos/pages/ComplexToggleComponent.ets | 56 +-- .../ohos/pages/ComplexToggleLoadComponent.ets | 20 +- .../com/ohos/pages/ControlCenterComponent.ets | 325 ++++++++----- .../com/ohos/pages/SimpleToggleComponent.ets | 88 ++-- .../pages/SimpleToggleLayoutEditComponent.ets | 431 ++++++++++++++++++ .../SimpleToggleLayoutEditDialogComponent.ets | 102 +++++ .../ohos/pages/SimpleToggleLayoutEditGrid.ets | 198 ++++++++ .../ohos/pages/SimpleToggleLoadComponent.ets | 39 +- .../src/main/ets/com/ohos/pages/UpTitle.ets | 140 ++++-- .../ets/com/ohos/viewmodel/ControlCenterVM.ts | 101 ++++ .../main/resources/base/element/color.json | 52 ++- .../main/resources/base/element/float.json | 283 ++++++++++-- .../main/resources/base/element/string.json | 52 +++ .../resources/base/media/ic_public_back.svg | 3 + .../resources/base/media/ic_public_edit.svg | 13 + .../base/media/ic_public_settings.svg | 13 + .../main/resources/en_US/element/string.json | 54 ++- .../main/resources/zh_CN/element/string.json | 52 +++ .../src/main/ets/com/ohos/common/Constants.ts | 22 + .../ets/com/ohos/common/StyleConfiguration.ts | 31 ++ .../ets/com/ohos/model/LocationService.ts | 80 ++++ ...rolCenterSimpleToggleLocationComponent.ets | 54 +-- .../StatusBarIconItemLocationComponent.ets | 27 +- .../main/ets/com/ohos/viewmodel/LocationVM.ts | 74 +++ .../main/resources/base/element/float.json | 11 + .../base/media/ic_controlcenter_gps.svg | 19 +- .../resources/base/media/ic_statusbar_gps.svg | 23 +- .../src/main/ets/com/ohos/common/constants.ts | 61 +++ .../ets/com/ohos/model/bundleResourceModel.ts | 163 +++++++ .../ets/com/ohos/model/noDisturbingModel.ts | 80 ++++ .../com/ohos/model/notificationListener.ts | 131 ++++++ .../ohos/view/component/appItemComponent.ets | 198 ++++++-- .../ohos/view/component/appLstComponent.ets | 26 +- .../com/ohos/view/component/headComponent.ets | 20 +- .../com/ohos/view/component/itemComponent.ets | 22 +- .../view/component/noDisturbComponent.ets | 120 ++++- .../ohos/view/component/slotItemComponent.ets | 51 ++- .../ohos/view/component/slotLstComponent.ets | 67 ++- .../ohos/view/component/switchComponent.ets | 68 +-- .../com/ohos/vm/appLstComponentViewModel.ts | 34 ++ .../ohos/vm/noDisturbComponentViewModel.ts | 188 ++++++++ .../main/resources/base/element/color.json | 4 + .../main/resources/base/element/float.json | 218 +++++++-- .../main/resources/base/element/string.json | 57 ++- .../main/resources/en_US/element/string.json | 58 ++- .../main/resources/zh_CN/element/string.json | 59 ++- .../ohos/navigationservice/ConfigManager.ts | 32 ++ .../ohos/navigationservice/KeyCodeEvent.ts | 137 ++++++ .../navigationservice/common/constants.ts | 28 ++ .../com/ohos/noticeItem/common/CommonUtil.ts | 42 ++ .../noticeItem/common/ScrollbarManager.ts | 50 ++ .../com/ohos/noticeItem/common/constants.ts | 132 ++++++ .../noticeItem/model/NotificationConfig.ts | 49 ++ .../model/NotificationDistributionManager.ts | 87 ++++ .../noticeItem/model/NotificationManager.ts | 168 +++++++ .../noticeItem/model/NotificationService.ts | 161 +++++++ .../model/NotificationWindowManager.ts | 36 ++ .../ohos/noticeItem/model/ParseDataUtil.ts | 174 +++++++ .../noticeItem/model/rule/RuleController.ts | 151 ++++++ .../view/NotificationListComponent.ets | 61 +-- .../noticeItem/view/item/actionComponent.ets | 60 +-- .../view/item/bannerNotificationItem.ets | 272 +++++++++++ .../ohos/noticeItem/view/item/basicItem.ets | 32 +- .../noticeItem/view/item/confirmDialog.ets | 20 +- .../ohos/noticeItem/view/item/customItem.ets | 40 +- .../noticeItem/view/item/devicesDialog.ets | 108 +++++ .../ohos/noticeItem/view/item/generalItem.ets | 171 +++---- .../ohos/noticeItem/view/item/groupItem.ets | 193 ++++++++ .../view/item/iconListComponent.ets | 111 +++++ .../ohos/noticeItem/view/item/longItem.ets | 30 +- .../ohos/noticeItem/view/item/multiItem.ets | 38 +- .../noticeItem/view/item/notificationItem.ets | 197 ++++---- .../ohos/noticeItem/view/item/pictureItem.ets | 49 +- .../noticeItem/view/item/settingDialog.ets | 49 +- .../ohos/noticeItem/view/item/titleItem.ets | 82 ++-- .../ohos/noticeItem/viewmodel/ViewModel.ts | 420 +++++++++++++++++ .../main/resources/base/element/color.json | 10 +- .../main/resources/base/element/float.json | 118 +++-- .../main/resources/base/element/string.json | 8 + .../main/resources/base/media/ic_close.svg | 1 + .../base/media/ic_public_delete_filled.svg | 13 + .../base/media/ic_public_settings_filled.svg | 13 + .../src/main/resources/base/media/send.svg | 16 + .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + .../src/main/ets/com/ohos/common/Constants.ts | 25 + .../ets/com/ohos/common/StyleConfiguration.ts | 40 ++ .../ets/com/ohos/model/RingModeService.ts | 83 ++++ ...rolCenterSimpleToggleRingModeComponent.ets | 47 +- .../StatusBarIconItemRingModeComponent.ets | 27 +- .../main/ets/com/ohos/viewmodel/RingModeVM.ts | 68 +++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/float.json | 11 + .../ic_controlcenter_ring_off_filled.svg | 9 +- .../media/ic_controlcenter_ring_on_filled.svg | 7 +- .../ic_controlcenter_vibration_filled.svg | 13 +- .../media/ic_statusbar_ring_off_filled.svg | 9 +- .../base/media/ic_statusbar_vibration_on.svg | 14 +- .../ets/default/common/StyleConfiguration.ts | 35 ++ .../src/main/ets/default/common/constants.ts | 35 ++ .../src/main/ets/default/pages/signalIcon.ets | 53 ++- .../src/main/ets/default/signalModel.ts | 155 +++++++ .../main/ets/default/viewmodel/SignalVM.ts | 37 ++ .../main/resources/base/element/float.json | 36 +- .../main/resources/base/element/string.json | 4 + .../base/media/ic_statusbar_signal_1.svg | 6 + .../base/media/ic_statusbar_signal_2.svg | 6 + .../base/media/ic_statusbar_signal_3.svg | 6 + .../base/media/ic_statusbar_signal_4.svg | 6 + .../base/media/ic_statusbar_signal_full.svg | 5 + .../base/media/ic_statusbar_signal_no.svg | 5 + .../main/resources/en_US/element/string.json | 4 + .../main/resources/zh_CN/element/string.json | 4 + features/statusbarcomponent/build.gradle | 9 +- .../src/main/ets/com/ohos/common/Constants.ts | 59 +++ .../com/ohos/common/StatusBarConfiguration.ts | 133 ++++++ .../ets/com/ohos/common/StyleConfiguration.ts | 59 +++ .../ets/com/ohos/model/StatusBarService.ts | 349 ++++++++++++++ .../ets/com/ohos/pages/IconItemComponent.ets | 145 +++--- .../com/ohos/pages/MetaIconItemComponent.ets | 76 +++ .../ets/com/ohos/pages/StatusBarComponent.ets | 375 ++++++++------- .../ets/com/ohos/viewmodel/StatusBarVM.ts | 315 +++++++++++++ .../main/resources/base/element/color.json | 8 +- .../main/resources/base/element/float.json | 44 +- .../src/main/ets/default/VolumeModel.ts | 58 +++ .../ets/default/pages/volumeComponent.ets | 6 +- features/volumepanelcomponent/.gitignore | 1 + features/volumepanelcomponent/build.gradle | 19 + .../volumepanelcomponent/src/main/config.json | 23 + .../src/main/ets/com/ohos/common/Constants.ts | 36 ++ .../ets/com/ohos/common/StyleConfiguration.ts | 50 ++ .../com/ohos/common/VolumeWindowController.ts | 80 ++++ .../ets/com/ohos/model/VolumePanelService.ts | 304 ++++++++++++ .../com/ohos/pages/VolumePanelComponent.ets | 160 +++++++ .../ets/com/ohos/viewmodel/VolumePanelVM.ts | 193 ++++++++ .../main/resources/base/element/color.json | 32 ++ .../main/resources/base/element/float.json | 53 +++ .../main/resources/base/element/string.json | 8 + .../resources/base/media/ic_public_mute.svg | 9 + .../base/media/ic_public_settings.svg | 13 + .../base/media/ic_public_sound_01.svg | 17 + .../base/media/ic_public_sound_02.svg | 18 + .../base/media/ic_public_sound_03.svg | 10 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + .../ets/default/common/StyleConfiguration.ts | 31 ++ .../src/main/ets/default/common/constants.ts | 38 ++ .../main/ets/default/pages/wifiComponent.ets | 34 +- .../src/main/ets/default/pages/wifiIcon.ets | 29 +- .../src/main/ets/default/viewmodel/WifiVM.ts | 37 ++ .../src/main/ets/default/wifiModel.ts | 159 +++++++ .../main/resources/base/element/float.json | 11 + .../base/media/ic_statusbar_wifi_1.svg | 12 + .../base/media/ic_statusbar_wifi_2.svg | 12 + .../base/media/ic_statusbar_wifi_3.svg | 12 + .../base/media/ic_statusbar_wifi_full.svg | 12 + .../base/media/ic_statusbar_wifi_no.svg | 12 + .../src/main/resources/base/media/wifi.svg | 23 +- .../src/main/resources/base/media/wifi_d.svg | 23 +- 214 files changed, 11775 insertions(+), 1752 deletions(-) create mode 100644 features/autorotatecomponent/.gitignore create mode 100644 features/autorotatecomponent/build.gradle create mode 100644 features/autorotatecomponent/src/main/config.json create mode 100644 features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts create mode 100644 features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts create mode 100644 features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets create mode 100644 features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts create mode 100644 features/autorotatecomponent/src/main/resources/base/element/string.json create mode 100644 features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg create mode 100644 features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg create mode 100644 features/autorotatecomponent/src/main/resources/en_US/element/string.json create mode 100644 features/autorotatecomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/batterycomponent/src/main/ets/default/batteryModel.ts create mode 100644 features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts create mode 100644 features/batterycomponent/src/main/ets/default/common/constants.ts create mode 100644 features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts create mode 100644 features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts create mode 100644 features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts create mode 100644 features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts create mode 100644 features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts create mode 100644 features/bluetoothcomponent/src/main/resources/base/element/float.json create mode 100644 features/brightnesscomponent/src/main/ets/default/brightnessManager.ts create mode 100644 features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts create mode 100644 features/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg create mode 100644 features/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg create mode 100644 features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts create mode 100644 features/capsulecomponent/src/main/ets/default/common/constants.ts create mode 100644 features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts create mode 100644 features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts create mode 100644 features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts create mode 100644 features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts create mode 100644 features/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg create mode 100644 features/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg create mode 100644 features/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg create mode 100644 features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts create mode 100644 features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts create mode 100644 features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts create mode 100644 features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts create mode 100644 features/locationcomponent/src/main/resources/base/element/float.json create mode 100644 features/managementcomponent/src/main/ets/com/ohos/common/constants.ts create mode 100644 features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts create mode 100644 features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts create mode 100644 features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts create mode 100644 features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts create mode 100644 features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts create mode 100644 features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ts create mode 100644 features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts create mode 100644 features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts create mode 100644 features/noticeitem/src/main/resources/base/media/ic_close.svg create mode 100644 features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg create mode 100644 features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg create mode 100644 features/noticeitem/src/main/resources/base/media/send.svg create mode 100644 features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts create mode 100644 features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts create mode 100644 features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts create mode 100644 features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts create mode 100644 features/ringmodecomponent/src/main/resources/base/element/color.json create mode 100644 features/ringmodecomponent/src/main/resources/base/element/float.json create mode 100644 features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts create mode 100644 features/signalcomponent/src/main/ets/default/common/constants.ts create mode 100644 features/signalcomponent/src/main/ets/default/signalModel.ts create mode 100644 features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts create mode 100644 features/volumecomponent/src/main/ets/default/VolumeModel.ts create mode 100644 features/volumepanelcomponent/.gitignore create mode 100644 features/volumepanelcomponent/build.gradle create mode 100644 features/volumepanelcomponent/src/main/config.json create mode 100644 features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts create mode 100644 features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts create mode 100644 features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts create mode 100644 features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts create mode 100644 features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets create mode 100644 features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts create mode 100644 features/volumepanelcomponent/src/main/resources/base/element/color.json create mode 100644 features/volumepanelcomponent/src/main/resources/base/element/float.json create mode 100644 features/volumepanelcomponent/src/main/resources/base/element/string.json create mode 100644 features/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg create mode 100644 features/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg create mode 100644 features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg create mode 100644 features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg create mode 100644 features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg create mode 100644 features/volumepanelcomponent/src/main/resources/base/media/icon.png create mode 100644 features/volumepanelcomponent/src/main/resources/en_US/element/string.json create mode 100644 features/volumepanelcomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts create mode 100644 features/wificomponent/src/main/ets/default/common/constants.ts create mode 100644 features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts create mode 100644 features/wificomponent/src/main/ets/default/wifiModel.ts create mode 100644 features/wificomponent/src/main/resources/base/element/float.json create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg diff --git a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets index 2215e5b2..21423825 100644 --- a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets +++ b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,9 +13,9 @@ * limitations under the License. */ -import WifiInfo from '@ohos.wifi_native_js'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import iconTitleBase from '../../../../../../../common/src/main/ets/template/iconTitleBase.ets' +import wifi from '@ohos.wifi'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import iconTitleBase from '../../../../../../../common/src/main/ets/template/iconTitleBase' const TAG = 'Control-airPlaneComponent' @Component @@ -41,15 +41,15 @@ struct airplaneComponent { mClickEvent() { this.flyModelStatus =!this.flyModelStatus if (this.flyModelStatus == true) { - this.mWifiOriginalStatus = WifiInfo.isWifiActive() + this.mWifiOriginalStatus = wifi.isWifiActive(); console.log(`airplane status is opening, WLAN Original Status :${this.mWifiOriginalStatus}`) - WifiInfo.disableWifi(); + wifi.disableWifi(); }else{ if(this.mWifiOriginalStatus == true) { - WifiInfo.enableWifi(); + wifi.enableWifi() console.log(`airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},get system interface, set WLAN status enableWifi`) } else { - WifiInfo.disableWifi(); + wifi.disableWifi(); console.log(`airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},,get system interface, set WLAN status disableWifi`) } } @@ -70,7 +70,7 @@ struct airplaneComponent { iconOn: this.IconInfo[1], mTitle: $flyModelTitle, changeSwitch: $flyModelStatus, - mClickEvent: this.mClickEvent.bind(this) + mClickEvent: () => this.mClickEvent() }) }.width('100%') .height('100%') diff --git a/features/airplanecomponent/src/main/resources/en_US/element/string.json b/features/airplanecomponent/src/main/resources/en_US/element/string.json index d1d6cc71..42181795 100644 --- a/features/airplanecomponent/src/main/resources/en_US/element/string.json +++ b/features/airplanecomponent/src/main/resources/en_US/element/string.json @@ -2,7 +2,7 @@ "string": [ { "name": "airplane_mode", - "value": "AirPlane Mode" + "value": "Airplane mode" } ] } diff --git a/features/autorotatecomponent/.gitignore b/features/autorotatecomponent/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/autorotatecomponent/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/autorotatecomponent/build.gradle b/features/autorotatecomponent/build.gradle new file mode 100644 index 00000000..ae402d92 --- /dev/null +++ b/features/autorotatecomponent/build.gradle @@ -0,0 +1,19 @@ +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} \ No newline at end of file diff --git a/features/autorotatecomponent/src/main/config.json b/features/autorotatecomponent/src/main/config.json new file mode 100644 index 00000000..5dc935c4 --- /dev/null +++ b/features/autorotatecomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.autorotatecomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "autorotatecomponent", + "moduleType": "har" + }, + "srcPath": "default" + } +} \ No newline at end of file diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts b/features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts new file mode 100644 index 00000000..ebd11a25 --- /dev/null +++ b/features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { +} + +export class AutoRotateData { + switchStatus: boolean = false; +} \ No newline at end of file diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts new file mode 100644 index 00000000..747600a6 --- /dev/null +++ b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import screen from '@ohos.screen'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; + +const TAG = 'AutoRotateModel'; + +export class AutoRotateService { + mIsStart: boolean = false; + mListener: any; + + constructor() { + } + + registerListener(listener: { + 'updateAutoRotateSwitchStatus': Function, + }) { + Log.showInfo(TAG, `registerListener, listener: ${listener}`) + this.mListener = listener; + } + + startService() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `startService`) + this.mIsStart = true; + this.asyncStartService(); + } + + async asyncStartService(): Promise { + Log.showInfo(TAG, `asyncStartService`) + this.getOrientation(); + screen.on('change', this.onOrientationChange.bind(this)); + } + + stopService() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `stopService`) + this.mIsStart = false; + this.asyncStopService(); + } + + async asyncStopService(): Promise { + Log.showInfo(TAG, `asyncStopService`) + screen.off('change', (value: number) => { + Log.showInfo(TAG, `asyncStopService, off change value: ${value}`) + }); + } + + onOrientationChange(value: number): void{ + Log.showInfo(TAG, `onOrientationChange, value: ${value}`) + this.getOrientation(); + } + + async getOrientation(): Promise { + Log.showInfo(TAG, `getOrientation`) + let mScreen = await this.getScreen(); + this.updateAutoRotateSwitchStatus(mScreen.orientation); + } + + async changeSwitch(status: boolean): Promise { + Log.showInfo(TAG, `changeSwitch, status: ${status}`) + let newOrientation = status ? 5 : 0; + let mScreen = await this.getScreen(); + let ret = await mScreen.setOrientation(newOrientation); + Log.showInfo(TAG, `changeSwitch, ret: ${ret}`) + } + + updateAutoRotateSwitchStatus(orientation: number): void{ + Log.showInfo(TAG, `updateAutoRotateSwitchStatus, orientation: ${orientation}`) + if (orientation == 0) { + this.mListener?.updateAutoRotateSwitchStatus(false); + } else if (orientation == 5) { + this.mListener?.updateAutoRotateSwitchStatus(true); + } + } + + async getScreen(): Promise { + Log.showInfo(TAG, `getScreen`) + let screens = await screen.getAllScreen(); + return screens[0]; + } +} + + +let sAutoRotateService = createOrGet(AutoRotateService, TAG); + +export default sAutoRotateService as AutoRotateService; diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets b/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets new file mode 100644 index 00000000..3d89439a --- /dev/null +++ b/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import {AutoRotateData} from '../common/Constants'; +import ViewModel from '../viewmodel/AutoRotateVM' +import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase' + +const TAG = 'autorotate-ControlCenterSimpleToggleAutoRotateComponent' + +@Component +export default struct ControlCenterSimpleToggleAutoRotateComponent { + private keyId: string + private mEditMode: boolean = false + private mDragMode: boolean = false + @State mIcon: Resource = $r("app.media.ic_controlcenter_auto_rotate_off") + @State mLabel: Resource = $r("app.string.control_center_complex_toggle_auto_rotate_title") + @State @Watch('onAutoRotateDataChange') mAutoRotateData: AutoRotateData = ViewModel.getAutoRotateData() + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear') + this.onAutoRotateDataChange('mAutoRotateData') + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') + } + + onAutoRotateDataChange(propName: string): void { + Log.showInfo(TAG, `onAutoRotateDataChange, propName: ${propName}`) + this.mIcon = this.mAutoRotateData.switchStatus ? $r("app.media.ic_controlcenter_auto_rotate_on") : $r("app.media.ic_controlcenter_auto_rotate_off") + } + + build() { + SimpleToggleBase({ + mToggleId: this.keyId, + mIcon: $mIcon, + mChangeSwitch: this.mAutoRotateData.switchStatus, + mLabel: $mLabel, + mEditMode: this.mEditMode, + mDragMode: this.mDragMode, + mClickEvent: () => this.mClickEvent() + }) + } + + mClickEvent() { + Log.showInfo(TAG, `mClickEvent, status: ${this.mAutoRotateData.switchStatus}`) + let newStatus = !this.mAutoRotateData.switchStatus + ViewModel.processAutoRotateSwitchStatusChange(newStatus) + } +} \ No newline at end of file diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts new file mode 100644 index 00000000..f695f0f5 --- /dev/null +++ b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import AutoRotateService from '../model/AutoRotateService'; +import {AutoRotateData} from '../common/Constants'; + +const TAG = 'AutoRotateVM'; + +export class AutoRotateVM { + mAutoRotateData: AutoRotateData= { + ...new AutoRotateData() + }; + + constructor() { + Log.showInfo(TAG, `constructor`) + this.mAutoRotateData = AppStorage.SetAndLink(TAG + '_AutoRotateData', this.mAutoRotateData).get(); + AutoRotateService.registerListener(this); + AutoRotateService.startService(); + } + + getAutoRotateData(): AutoRotateData { + Log.showInfo(TAG, `getAutoRotateData`) + return this.mAutoRotateData; + } + + updateAutoRotateSwitchStatus(status: boolean): void{ + Log.showInfo(TAG, `updateAutoRotateSwitchStatus, status: ${status}`) + this.mAutoRotateData.switchStatus = status; + } + + processAutoRotateSwitchStatusChange(status: boolean): void{ + Log.showInfo(TAG, `processAutoRotateSwitchStatusChange, status: ${status}`) + AutoRotateService.changeSwitch(status); + } +} + +let sAutoRotateVM = createOrGet(AutoRotateVM, TAG); + +export default sAutoRotateVM as AutoRotateVM; \ No newline at end of file diff --git a/features/autorotatecomponent/src/main/resources/base/element/string.json b/features/autorotatecomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..774cb274 --- /dev/null +++ b/features/autorotatecomponent/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "control_center_complex_toggle_auto_rotate_title", + "value": "自动旋转" + } + ] +} \ No newline at end of file diff --git a/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg b/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg new file mode 100644 index 00000000..07d9f76c --- /dev/null +++ b/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg b/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg new file mode 100644 index 00000000..ee037ad7 --- /dev/null +++ b/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/features/autorotatecomponent/src/main/resources/en_US/element/string.json b/features/autorotatecomponent/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..ca1fa674 --- /dev/null +++ b/features/autorotatecomponent/src/main/resources/en_US/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "control_center_complex_toggle_auto_rotate_title", + "value": "Auto-rotate" + } + ] +} diff --git a/features/autorotatecomponent/src/main/resources/zh_CN/element/string.json b/features/autorotatecomponent/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..e17c7bba --- /dev/null +++ b/features/autorotatecomponent/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "control_center_complex_toggle_auto_rotate_title", + "value": "自动旋转" + } + ] +} diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts new file mode 100644 index 00000000..90a4642e --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2022 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 BatteryInfo from "@ohos.batteryInfo"; +import commonEvent from "@ohos.commonEvent"; +import createOrGet from "../../../../../../common/src/main/ets/default/SingleInstanceHelper"; +import Constants from "./common/constants"; +import Log from "../../../../../../common/src/main/ets/default/Log"; +import { CommonEventData } from "commonEvent/commonEventData"; +import { + CommonEventManager, + getCommonEventManager, + POLICY, +} from "../../../../../../common/src/main/ets/default/commonEvent/CommonEventManager"; + +const TAG = "BatteryComponent-batteryModel"; +const DEFAULT_PROGRESS = 100; +const SUBSCRIBE_INFO = { + events: [commonEvent.Support.COMMON_EVENT_BATTERY_CHANGED], +}; + +function getChargingStatus(state: typeof BatteryInfo.BatteryChargeState): boolean { + Log.showInfo(TAG, `charging status update: ${state}`); + let batteryStatus = false; + switch (state) { + case BatteryInfo.BatteryChargeState.DISABLE: + case BatteryInfo.BatteryChargeState.ENABLE: + case BatteryInfo.BatteryChargeState.FULL: + batteryStatus = true; + break; + default: + batteryStatus = false; + break; + } + return batteryStatus; +} + +export class BatteryModel { + private mBatterySoc: any; + private mBatteryCharging: any; + private mManager?: CommonEventManager; + + initBatteryModel() { + if (this.mManager) { + return; + } + this.mManager = getCommonEventManager( + TAG, + SUBSCRIBE_INFO, + () => this.updateBatteryStatus(), + (isSubscribe: boolean) => isSubscribe && this.updateBatteryStatus() + ); + Log.showInfo(TAG, "initBatteryModel"); + this.mBatterySoc = AppStorage.SetAndLink("batterySoc", 0); + this.mBatteryCharging = AppStorage.SetAndLink("batteryCharging", false); + this.mManager.subscriberCommonEvent(); + this.mManager.applyPolicy([POLICY.SCREEN_POLICY]); + } + + unInitBatteryModel() { + Log.showInfo(TAG, "unInitBatteryModel"); + this.mManager?.release(); + this.mManager = undefined; + } + + /** + * Get battery status and remaining power + */ + private updateBatteryStatus() { + Log.showInfo(TAG, "updateBatteryStatus"); + let batterySoc = BatteryInfo.batterySOC ?? DEFAULT_PROGRESS; + let batteryCharging = BatteryInfo.chargingStatus; + if (batterySoc <= 0) { + // If the result is a negative number, set it as positive number. + batterySoc = Math.abs(batterySoc) * Constants.PERCENT_NUMBER; + } + + Log.showInfo(TAG, "batterySoc = " + batterySoc); + + // Set the battery status as charging when there is no battery hardware + this.mBatterySoc.set(batterySoc); + this.mBatteryCharging.set(getChargingStatus(batteryCharging)); + } +} + +let mBatteryModel = createOrGet(BatteryModel, TAG); +export default mBatteryModel as BatteryModel; diff --git a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts new file mode 100644 index 00000000..23be8d20 --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import Constants from './Constants' + +const TAG = 'battery-StyleConfiguration'; + +export default class StyleConfiguration { + static getBatteryComponentStyle() { + const key: string = TAG + "-BatteryComponent"; + return StyleManager.getStyle(key, () => { + return { + componentGap: $r('app.float.battery_component_gap') + }; + }); + } + + static getBatteryPicStyle() { + const key: string = TAG + "-BatteryPicComponent"; + return StyleManager.getStyle(key, () => { + return { + picGap: $r('app.float.battery_component_pic_gap'), + picBodyWidth: $r('app.float.battery_component_pic_body_width'), + picBodyHeight: $r('app.float.battery_component_pic_body_height'), + picBodyPadding: $r('app.float.battery_component_pic_body_padding'), + picBodyBorderWidth: $r('app.float.battery_component_pic_body_border_width'), + picBorderRadius: $r('app.float.battery_component_pic_border_radius'), + picHeadBorderRadius: $r('app.float.battery_component_pic_head_radius'), + picChargingColor: $r('app.color.battery_component_pic_charging_color'), + picLevelLowColor: $r('app.color.battery_component_pic_level_low_color'), + picHeadWidth: $r('app.float.battery_component_pic_head_width'), + picHeadHeight: $r('app.float.battery_component_pic_head_height'), + }; + }); + } +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/common/constants.ts b/features/batterycomponent/src/main/ets/default/common/constants.ts new file mode 100644 index 00000000..ec4471ba --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/common/constants.ts @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + static BATTERY_LEVEL_LOW = 20 + static PERCENT_NUMBER = 100; +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index 19446b13..fcfb030d 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,11 +13,13 @@ * limitations under the License. */ -import mBatteryModel from '../batteryModel.ets'; -import BatteryPic from './batteryPic.ets' +import mBatteryModel from '../batteryModel'; +import BatteryPic from './batteryPic' import BatterySoc from './batterySoc' -import Constants from '../common/constants.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/constants' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' const TAG = 'BatteryComponent-batteryIcon' @@ -25,6 +27,8 @@ const TAG = 'BatteryComponent-batteryIcon' export default struct BatteryIcon { @StorageLink('batterySoc') batterySoc: number = 100 @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + @State style: any = StyleConfiguration.getBatteryComponentStyle() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { mBatteryModel.initBatteryModel(); @@ -36,19 +40,13 @@ export default struct BatteryIcon { } build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - BatterySoc() - } - - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - BatteryPic() - } - .width('70%') - .height('100%') + Row() { + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + BatterySoc() + Row().width(this.style.componentGap).height('100%') + BatteryPic() + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } - .width(`${Constants.WHOLE_CONTAINER_WIDTH * this.StatusCoefficient}px`) - .height(`${Constants.WHOLE_CONTAINER_HEIGHT * this.StatusCoefficient}px`) - .margin($r('app.float.whole_container_margin')) + .height('100%') } } \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets index 35af6132..1a80c253 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,8 +13,12 @@ * limitations under the License. */ -import Constants from '../common/constants.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/constants' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfiguration from '../common/StyleConfiguration' +import ViewModel from '../viewmodel/BatteryVM' + const TAG = 'BatteryComponent-batteryPic' @Component @@ -22,6 +26,9 @@ export default struct BatteryPic { @StorageLink('batterySoc') batterySoc: number = 100 @StorageLink('batteryCharging') batteryCharging : boolean = false + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() + @State style: any = StyleConfiguration.getBatteryPicStyle() + aboutToAppear(){ Log.showInfo(TAG,'aboutToAppear Start'); } @@ -32,45 +39,48 @@ struct BatteryPic { build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Row() { + Row() { + Row() { } .height('100%') - .width(this.batterySoc + '%') + .width((this.batterySoc < 100 ? this.batterySoc: 100) + '%') .backgroundColor(this.getBatteryColor(this.batterySoc, this.batteryCharging)) } - .width('88%') - .height('100%') + .width(this.style.picBodyWidth) + .height(this.style.picBodyHeight) .backgroundColor($r('app.color.battery_background')) - .border({ width: $r('app.float.battery_border_width'), - color: $r('app.color.battery_border'), - radius: $r('app.float.battery_border_radius'), + .border({ width: this.style.picBodyBorderWidth, + color: this.mTintContentInfo.contentColor, + radius: this.style.picBorderRadius, style: BorderStyle.Solid }) - .padding($r('app.float.battery_content_padding')) + .padding(this.style.picBodyPadding) + + Row() { + + } + .width(this.style.picGap) + .height(1) - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Row() { } - .width('10%') - .height('50%') - .backgroundColor($r('app.color.battery_border')) - .borderRadius($r('app.float.battery_border_radius')) - .margin({ left: $r('app.float.battery_decorator_margin') }) + .width(this.style.picHeadWidth) + .height(this.style.picHeadHeight) + .backgroundColor(this.mTintContentInfo.contentColor) + .borderRadius(this.style.picHeadBorderRadius) } - .width('100%') - .height('100%') } private getBatteryColor(val, charging) { Log.showInfo(TAG, `getBatteryColor, val: ${ val } charging: ${ charging } `); if (charging) { - return $r('app.color.battery_charging_color'); + return this.style.picChargingColor; } else if (val <= Constants.BATTERY_LEVEL_LOW) { - return $r('app.color.battery_low_color'); + return this.style.picLevelLowColor; } else { - return $r('app.color.battery_default_color'); + return this.mTintContentInfo.contentColor; } } } diff --git a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets index 86e6a90e..17cdbfe5 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,12 +13,18 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager' +import ViewModel from '../viewmodel/BatteryVM' + const TAG = 'BatteryComponent-batterySoc' @Component export default struct BatterySoc { @StorageLink('batterySoc') batterySoc: number = 100 + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear(){ Log.showInfo(TAG,'aboutToAppear Start'); @@ -29,11 +35,8 @@ struct BatterySoc { } build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Text(this.batterySoc + '%') - .height('100%') - .fontColor($r('app.color.battery_default_color')) - .fontSize($r('app.float.fontSize_network_state')) - } + Text(this.batterySoc + '%') + .fontColor(this.mTintContentInfo.contentColor) + .fontSize(this.styleCommon.statusBarFontSize) } } diff --git a/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts b/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts new file mode 100644 index 00000000..2031e1d3 --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../common/src/main/ets/default/Log'; +import {FASlotName} from '../../../../../../../common/src/main/ets/default/Constants'; +import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import createOrGet from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; + +const TAG = 'BatteryVM'; + +export class BatteryVM { + mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.BATTERY); + + constructor() { + Log.showInfo(TAG, `constructor`) + } + + getTintContentInfo(): TintContentInfo { + return this.mTintContentInfo; + } +} + +let sBatteryVM = createOrGet(BatteryVM, TAG); + +export default sBatteryVM as BatteryVM; \ No newline at end of file diff --git a/features/batterycomponent/src/main/resources/base/element/color.json b/features/batterycomponent/src/main/resources/base/element/color.json index d86a7a33..e4dfb894 100644 --- a/features/batterycomponent/src/main/resources/base/element/color.json +++ b/features/batterycomponent/src/main/resources/base/element/color.json @@ -1,18 +1,14 @@ { "color": [ { - "name": "battery_low_color", + "name": "battery_component_pic_level_low_color", "value": "#ff0000" - },{ - "name": "battery_default_color", - "value": "#ffffff" - },{ - "name": "battery_charging_color", + }, + { + "name": "battery_component_pic_charging_color", "value": "#00ff21" - },{ - "name": "battery_border", - "value": "#fff" - },{ + }, + { "name": "battery_background", "value": "#00000000" } diff --git a/features/batterycomponent/src/main/resources/base/element/float.json b/features/batterycomponent/src/main/resources/base/element/float.json index 4a8ca9e9..0bd8930e 100644 --- a/features/batterycomponent/src/main/resources/base/element/float.json +++ b/features/batterycomponent/src/main/resources/base/element/float.json @@ -1,32 +1,44 @@ { "float": [ { - "name": "fontSize_network_state", - "value": "16" + "name": "battery_component_gap", + "value": "8.5vp" }, { - "name": "whole_container_width", - "value": "100" + "name": "battery_component_pic_gap", + "value": "2vp" }, { - "name": "whole_container_margin", - "value": "2" + "name": "battery_component_pic_body_height", + "value": "19vp" }, { - "name": "battery_decorator_margin", - "value": "2" + "name": "battery_component_pic_body_width", + "value": "34.5vp" }, { - "name": "battery_border_radius", - "value": "2" + "name": "battery_component_pic_body_padding", + "value": "2vp" }, { - "name": "battery_content_padding", - "value": "2" + "name": "battery_component_pic_body_border_width", + "value": "1vp" }, { - "name": "battery_border_width", - "value": "1" + "name": "battery_component_pic_border_radius", + "value": "2vp" + }, + { + "name": "battery_component_pic_head_radius", + "value": "2vp" + }, + { + "name": "battery_component_pic_head_width", + "value": "3vp" + }, + { + "name": "battery_component_pic_head_height", + "value": "10vp" } ] } \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts new file mode 100644 index 00000000..2e686de4 --- /dev/null +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + +} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts new file mode 100644 index 00000000..054a0081 --- /dev/null +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' +import Constants from './Constants' + +const TAG = 'bluetooth-StyleConfiguration'; + +export default class StyleConfiguration { + static getStatusBarBluetoothComponentStyle() { + const key: string = TAG + "-StatusBarBluetoothComponent"; + return StyleManager.getStyle(key, () => { + return { + staticBarBluetoothWidth: $r('app.float.status_bar_bluetooth_width'), + staticBarBluetoothHeight: $r('app.float.status_bar_bluetooth_height') + }; + }); + } +} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts new file mode 100644 index 00000000..2611980e --- /dev/null +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2021-2022 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 bluetooth from '@ohos.bluetooth'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; + +const TAG = 'BluetoothModel'; + +function isBluetoothOpen(state) { + Log.showInfo(TAG, `BluetoothState is: ${state}`) + return state == bluetooth.BluetoothState.STATE_ON || state == bluetooth.BluetoothState.STATE_BLE_ON + || state == bluetooth.BluetoothState.STATE_TURNING_ON || state == bluetooth.BluetoothState.STATE_BLE_TURNING_ON; +} + +export class BluetoothService { + mIsStart: boolean = false; + mListener: any; + mIsBluetoothOpen: boolean = false; + + constructor() { + Log.showInfo(TAG, `constructor`) + } + + startService() { + if (this.mIsStart) { + return; + } + this.mIsStart = true; + this.mIsBluetoothOpen = isBluetoothOpen(bluetooth.getState()); + bluetooth.on('stateChange', (state) => { + let isOpen = isBluetoothOpen(state) + if (this.mIsBluetoothOpen != isOpen) { + Log.showInfo(TAG, `state change: ${isOpen}`) + this.mIsBluetoothOpen = isOpen; + this.mListener?.updateState(this.mIsBluetoothOpen); + } + }); + Log.showInfo(TAG, `startService, mIsBluetoothOpen: ${this.mIsBluetoothOpen}`) + } + + stopService() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `stopService`) + this.mIsStart = false; + bluetooth.off('stateChange'); + } + + registerListener(listener: { + 'updateState': Function + }) { + Log.showInfo(TAG, `registerListener, listener: ${listener}`) + this.mListener = listener; + this.mListener.updateState(this.mIsBluetoothOpen) + } + + getState(): boolean { + return this.mIsBluetoothOpen; + } + + enableBluetooth(): boolean{ + Log.showInfo(TAG, `enableBluetooth`) + let result = bluetooth.enableBluetooth(); + Log.showInfo(TAG, `enableBluetooth, result: ${result}`) + return result; + } + + disableBluetooth(): boolean{ + Log.showInfo(TAG, `disableBluetooth`) + let result = bluetooth.disableBluetooth(); + Log.showInfo(TAG, `disableBluetooth, result: ${result}`) + return result; + } +} + +let sBluetoothService = createOrGet(BluetoothService, TAG); + +export default sBluetoothService as BluetoothService; \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets index f8e66d03..0604e92a 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' -import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' -import ViewModel from '../viewmodel/BluetoothVM.ets' -import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" +import ViewModel from '../viewmodel/BluetoothVM' +import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase' const TAG = 'bluetooth-ControlCenterComplexToggleBluetoothComponent' @@ -29,14 +29,9 @@ export default struct ControlCenterComplexToggleBluetoothComponent { ] @State mTitle: Resource = $r("app.string.control_center_complex_toggle_bluetooth_title") @StorageLink('BluetoothOpenStatus') BluetoothOpenStatus: boolean = false - @StorageLink("showStatusBar") showStatusBar: boolean = false - private mWindowManager - private mFeatureAbilityManager aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear') - this.mWindowManager = new WindowManager() - this.mFeatureAbilityManager = new FeatureAbilityManager() ViewModel.initViewModel() } @@ -51,8 +46,8 @@ export default struct ControlCenterComplexToggleBluetoothComponent { iconOn: this.IconInfo[1], mTitle: $mTitle, changeSwitch: $BluetoothOpenStatus, - mClickEvent: this.mClickEvent.bind(this), - mLongClickEvent: this.mLongClickEvent.bind(this) + mClickEvent: () => this.mClickEvent(), + mLongClickEvent: () => this.mLongClickEvent() }) }.width('100%') .height('100%') @@ -60,24 +55,15 @@ export default struct ControlCenterComplexToggleBluetoothComponent { mClickEvent() { Log.showInfo(TAG, `mClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`) -// if (this.BluetoothOpenStatus) { -// ViewModel.disableBluetooth() -// } else { -// ViewModel.enableBluetooth() -// } + if (this.BluetoothOpenStatus) { + ViewModel.disableBluetooth() + } else { + ViewModel.enableBluetooth() + } } mLongClickEvent() { Log.showInfo(TAG, `mLongClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`) - -// this.showStatusBar = true -// this.mWindowManager.setWindowMin((result) => { -// this.mFeatureAbilityManager.openAbility(TAG, { -// want: { -// bundleName: 'com.ohos.settings', -// abilityName: 'com.ohos.settings.MainAbility', -// } -// }) -// }) + EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.BluetoothAbility')) } } \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets index 0b4a5842..2181d2bc 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,16 +13,21 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../common/Constants.ets' -import ViewModel from '../viewmodel/BluetoothVM.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' +import Constants from '../common/Constants' +import ViewModel from '../viewmodel/BluetoothVM' const TAG = 'bluetooth-StatusBarIconItemBluetoothComponent' @Component export default struct StatusBarIconItemBluetoothComponent { @StorageLink('BluetoothOpenStatus') BluetoothOpenStatus: boolean = false - @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @State style: any = StyleConfiguration.getStatusBarBluetoothComponentStyle() aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear') @@ -34,15 +39,17 @@ export default struct StatusBarIconItemBluetoothComponent { } build() { - Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Row() { if (this.BluetoothOpenStatus) { + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') Image($r("app.media.ic_status_bt")) .objectFit(ImageFit.Contain) - .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) - .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) + .width(this.style.staticBarBluetoothWidth) + .height(this.style.staticBarBluetoothHeight) + .fillColor(this.mTintContentInfo.contentColor) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } } - .width(this.BluetoothOpenStatus ? Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient : 0) - .height(this.BluetoothOpenStatus ? Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient : 0) + .height('100%') } } \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts new file mode 100644 index 00000000..0e0d1169 --- /dev/null +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2021-2022 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 bluetooth from '@ohos.bluetooth'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; +import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import BluetoothService from '../model/BluetoothService'; + +export const BluetoothOpenStatusKey = "BluetoothOpenStatus"; + +const TAG = 'BluetoothVM'; + +export class BluetoothVM { + mIsStart: boolean = false; + mBluetoothOpenStatus: any; + mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.BLUETOOTH); + + constructor() { + Log.showInfo(TAG, `constructor`) + } + + initViewModel() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initViewModel `) + this.mIsStart = true; + this.mBluetoothOpenStatus = AppStorage.SetAndLink(BluetoothOpenStatusKey, false); + BluetoothService.startService(); + BluetoothService.registerListener(this); + } + + updateState(state: boolean) { + Log.showInfo(TAG, `updateState, state: ${state} this.mBluetoothOpenStatus ${this.mBluetoothOpenStatus}`) + this.mBluetoothOpenStatus.set(state); + } + + enableBluetooth(): boolean{ + return BluetoothService.enableBluetooth(); + } + + disableBluetooth(): boolean{ + return BluetoothService.disableBluetooth(); + } + + getTintContentInfo(): TintContentInfo { + return this.mTintContentInfo; + } +} + +let sBluetoothVM = createOrGet(BluetoothVM, TAG); + +export default sBluetoothVM as BluetoothVM; \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/resources/base/element/float.json b/features/bluetoothcomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..7b4e2db7 --- /dev/null +++ b/features/bluetoothcomponent/src/main/resources/base/element/float.json @@ -0,0 +1,11 @@ +{ + "float": [ + { + "name": "status_bar_bluetooth_width", + "value": "18vp" + },{ + "name": "status_bar_bluetooth_height", + "value": "24vp" + } + ] +} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg b/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg index 7ce28a5e..0ae8745d 100644 --- a/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg +++ b/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg @@ -1,11 +1,3 @@ - - - ic_status_bt - - - - - - - - \ No newline at end of file + + + diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg b/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg index 9259e3e7..2be2692c 100644 --- a/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg +++ b/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg @@ -1,11 +1,3 @@ - - - ic_status_bt - - - - - - - - \ No newline at end of file + + + diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg b/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg index 40b13986..0527fb75 100644 --- a/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg +++ b/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg @@ -1,11 +1,3 @@ - - - ic_status_bt - - - - - - - - \ No newline at end of file + + + diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts new file mode 100644 index 00000000..eb06e36b --- /dev/null +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import commonEvent from '@ohos.commonEvent'; +import settings from '@ohos.settings'; +import featureAbility from '@ohos.ability.featureAbility'; +import Brightness from '@ohos.brightness'; +import CommonConstants from "../../../../../../common/src/main/ets/default/Constants"; + +const SYSTEMUI_BRIGHTNESS = 'settings.screen.brightness'; +const TAG = 'Control-brightnessManager'; +var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 100); + +export class brightnessManager { + helper: any + uri: string + SLIDER_CHANG_MODE_MOVING = 1; + + init(): void{ + Log.showInfo(TAG, 'init'); + this.uri = settings.getUriSync(SYSTEMUI_BRIGHTNESS); + Log.showInfo(TAG, 'settings geturi of brightness is ' + this.uri); + this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), CommonConstants.URI_VAR); + this.getValue(); + } + + registerBrightness() { + this.helper.on("dataChange", this.uri, (err) => { + let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '100') + Log.showInfo(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); + mBrightnessValue.set(parseInt(data)); + }) + } + + unRegisterBrightness() { + this.helper.off("dataChange", this.uri, (err) => { + Log.showInfo(TAG, `unregister brightness helper`); + }) + } + + getValue() { + Log.showInfo(TAG, 'getValue'); + let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '100'); + Log.showInfo(TAG, `settings getValue ${parseInt(data)}`); + mBrightnessValue.set(parseInt(data)); + } + + setValue(callback, sliderChangeMode:number) { + let value = parseInt(callback.value); + Log.showInfo(TAG, `setValue ${value}`); + mBrightnessValue.set(value); + if(sliderChangeMode === this.SLIDER_CHANG_MODE_MOVING){ + Brightness.setValue(callback.value); + }else{ + settings.setValueSync(this.helper, SYSTEMUI_BRIGHTNESS, callback.value.toString()); + Log.showInfo(TAG, `settings setValue ${callback.value} end`); + } + } +} + + +let mBrightnessManager = new brightnessManager(); + +export default mBrightnessManager as brightnessManager; \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts new file mode 100644 index 00000000..58123b84 --- /dev/null +++ b/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; + +const TAG = 'brightness-StyleConfiguration'; + +export default class StyleConfiguration { + static getBrightnessComponentStyle() { + const key: string = TAG + "-BrightnessComponent"; + return StyleManager.getStyle(key, () => { + return { + marginLeft: $r('app.float.brightness_margin_left'), + marginRight: $r('app.float.brightness_margin_right'), + componentGap: $r('app.float.brightness_component_gap'), + brightnessIconColor: $r("sys.color.ohos_id_color_secondary"), + brightnessReduceWidth: $r('app.float.brightness_reduce_width'), + brightnessReduceHeight: $r('app.float.brightness_reduce_height'), + brightnessPlusWidth: $r('app.float.brightness_plus_width'), + brightnessPlusHeight: $r('app.float.brightness_plus_height'), + brightnessHeight: $r('app.float.brightness_height'), + sliderHeight: $r('app.float.brightness_slider_height'), + sliderBlockColor: $r('app.color.brightness_slider_block_color'), + sliderTrackColor: $r('app.color.brightness_slider_track_color'), + sliderSelectedColor: $r('app.color.brightness_slider_selected_color') + }; + }); + } +} \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets index c85a2b10..e7d11126 100644 --- a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets +++ b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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,17 +14,19 @@ */ import brightness from '@ohos.brightness'; -import mBrightnessManager from '../brightnessManager.ets'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import mBrightnessManager from '../brightnessManager'; +import StyleConfiguration from '../common/StyleConfiguration' +import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'Control-brightnessComponent' @Component -export struct MyBrightness { +export default struct MyBrightness { @StorageLink('BrightnessValue') brightnessValue: number = 0; + @State style: any = StyleConfiguration.getBrightnessComponentStyle() @State brightnessItem: any = { - min: 0, - max: 255, + min: 4, + max: 100, value: 0 }; @@ -39,23 +41,26 @@ export struct MyBrightness { mBrightnessManager.unRegisterBrightness(); } - setBrightness(value) { + setBrightness(value, sliderChangeMode:number) { Log.showInfo(TAG, `setBrightness = ${value}`); - mBrightnessManager.setValue(value); + mBrightnessManager.setValue(value, sliderChangeMode); } build() { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - Column() { - Text($r('app.string.brightness_text')) - .fontSize($r('app.float.control_common_font_size')) - .alignSelf(ItemAlign.Center) + Row() { + Column().width(this.style.marginLeft).height('100%').layoutWeight(0) + Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Image($r('app.media.ic_brightness_reduce')) + .size({ width: this.style.brightnessReduceWidth, + height: this.style.brightnessReduceHeight }) + .fillColor(this.style.brightnessIconColor) } - .width('15%') - .constraintSize({ maxWidth: $r("app.float.font_constraint_maxSize") }) - .padding({ left: $r('app.float.slider_text_padding_left') }) + .width(this.style.brightnessPlusWidth) + .height('100%') + .layoutWeight(0) - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Column().width(this.style.componentGap).height('100%').layoutWeight(0) + Row() { Slider({ value: this.brightnessValue, min: this.brightnessItem.min, @@ -65,19 +70,32 @@ export struct MyBrightness { }) .width('100%') - .blockColor(Color.Blue) - .trackColor(Color.Grey) - .selectedColor(Color.Blue) - .onChange((value: number) => { + .trackThickness(this.style.sliderHeight) + .blockColor(this.style.sliderBlockColor) + .trackColor(this.style.sliderTrackColor) + .selectedColor(this.style.sliderSelectedColor) + .onChange((value: number, mode: SliderChangeMode) => { this.brightnessItem.value = value; - this.setBrightness(this.brightnessItem); + this.setBrightness(this.brightnessItem, mode); }) } - .width('85%') - } - .height('100%') - .width('100%') - .backgroundColor($r('app.color.brightness_bg_color')) - .borderRadius($r('app.float.brightness_border_radius')) + .height('100%') + .layoutWeight(1) + + Column().width(this.style.componentGap).height('100%').layoutWeight(0) + + Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Image($r('app.media.ic_brightness_plus')) + .size({ width: this.style.brightnessPlusWidth, + height: this.style.brightnessPlusHeight }) + .fillColor(this.style.brightnessIconColor) + } + .width(this.style.brightnessPlusWidth) + .height('100%') + .layoutWeight(0) + + Column().width(this.style.marginRight).height('100%').layoutWeight(0) + }.width('100%') + .height(this.style.brightnessHeight) } } \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/resources/base/element/color.json b/features/brightnesscomponent/src/main/resources/base/element/color.json index e3a32623..36dd8e92 100644 --- a/features/brightnesscomponent/src/main/resources/base/element/color.json +++ b/features/brightnesscomponent/src/main/resources/base/element/color.json @@ -1,8 +1,16 @@ { "color": [ { - "name": "brightness_bg_color", - "value": "#CCFFFFFF" + "name": "brightness_slider_block_color", + "value": "#FFFFFFFF" + }, + { + "name": "brightness_slider_track_color", + "value": "#1A000000" + }, + { + "name": "brightness_slider_selected_color", + "value": "#FF007DFF" } ] } diff --git a/features/brightnesscomponent/src/main/resources/base/element/float.json b/features/brightnesscomponent/src/main/resources/base/element/float.json index 43a9e86d..f589712e 100644 --- a/features/brightnesscomponent/src/main/resources/base/element/float.json +++ b/features/brightnesscomponent/src/main/resources/base/element/float.json @@ -1,20 +1,40 @@ { "float": [ { - "name": "control_common_font_size", - "value": "20" - },{ - "name": "slider_text_padding_left", - "value": "5" - },{ - "name": "slider_size_width", - "value": "300" - },{ - "name": "brightness_border_radius", - "value": "15" - },{ - "name": "font_constraint_maxSize", - "value": "70" + "name": "brightness_margin_left", + "value": "26vp" + }, + { + "name": "brightness_margin_right", + "value": "26vp" + }, + { + "name": "brightness_component_gap", + "value": "26vp" + }, + { + "name": "brightness_reduce_width", + "value": "44vp" + }, + { + "name": "brightness_reduce_height", + "value": "44vp" + }, + { + "name": "brightness_plus_width", + "value": "44vp" + }, + { + "name": "brightness_plus_height", + "value": "44vp" + }, + { + "name": "brightness_height", + "value": "44vp" + }, + { + "name": "brightness_slider_height", + "value": "40vp" } ] } diff --git a/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg b/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg new file mode 100644 index 00000000..e6763c2a --- /dev/null +++ b/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg @@ -0,0 +1,12 @@ + + + diff --git a/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg b/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg new file mode 100644 index 00000000..d1fa819a --- /dev/null +++ b/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg @@ -0,0 +1,12 @@ + + + diff --git a/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts new file mode 100644 index 00000000..28af404e --- /dev/null +++ b/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import Constants from './Constants' + +const TAG = 'capsule-StyleConfiguration'; + +export default class StyleConfiguration { + static getCapsuleComponentStyle() { + const key: string = TAG + "-CapsuleComponent"; + return StyleManager.getStyle(key, () => { + return { + greenCapsulePhoneWidth: $r('app.float.green_capsule_phone_width'), + greenCapsulePhoneHeight: $r('app.float.green_capsule_phone_height'), + greenCapsuleHeight: $r('app.float.green_capsule_height'), + greenCapsuleTextColor: $r('app.color.green_capsule_text_color'), + greenCapsuleTextMarginLeftRight: $r('app.float.green_capsule_text_left_right'), + greenCapsuleRadius: $r('app.float.green_capsule_radius'), + greenCapsuleBackgroundColor: $r('app.color.background_color'), + maxLines:Constants.DEFAULT_MAX_LINES + }; + }); + } + +} \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/common/constants.ts b/features/capsulecomponent/src/main/ets/default/common/constants.ts new file mode 100644 index 00000000..a6ae69b2 --- /dev/null +++ b/features/capsulecomponent/src/main/ets/default/common/constants.ts @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + static TOUCH_TYPE_DOWN: number = 0; + static TOUCH_TYPE_UP: number = 1; + static TOUCH_TYPE_MOVE: number = 2; + static DEFAULT_MAX_LINES: number= 1; + static CAPSULE_HEIGHT_MULTIPLE = 2; +} diff --git a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts new file mode 100644 index 00000000..1005a997 --- /dev/null +++ b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2021-2022 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 commonEvent from '@ohos.commonEvent'; +import Log from '../../../../../../../common/src/main/ets/default/Log' + +const TAG = 'CapsuleModel'; + +let commonEventSubscribeInfo = { + events: ['CAPSULE_EVENT_CALL_UI'] +}; +let commonEventSubscriber = null; + +export class CapsuleModel { + mCallback: any; + + registerCallback(callback) { + Log.showInfo(TAG, 'registerCallback'); + this.mCallback = callback; + if (commonEventSubscriber == null) { + commonEvent.createSubscriber( + commonEventSubscribeInfo, + this.createCapsuleSubscriberCallBack.bind(this) + ); + } + } + + createCapsuleSubscriberCallBack(err, data) { + commonEventSubscriber = data; + commonEvent.subscribe(commonEventSubscriber, (err, data) => { + Log.showInfo(TAG, `createCapsuleSubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + if (err.code == 0) { + const processingData = JSON.parse(data.data); + if (processingData) { + Log.showInfo(TAG, `createCapsuleSubscriberCallBack processingData: ${JSON.stringify(processingData)} `); + this.mCallback.onStateChange(processingData); + } + } else { + Log.showError(TAG, 'date is err'); + } + }); + } + + unregisterCallback() { + if (commonEventSubscriber != null) { + commonEvent.unsubscribe(commonEventSubscriber, () => { + Log.showInfo(TAG, 'Subscriberregister unregister Capsule Status Listener ==============='); + }); + } + } +} + +let mCapsuleModel = new CapsuleModel(); + +export default mCapsuleModel as CapsuleModel; \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index 7b0ee621..6ba5c39b 100644 --- a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,20 +13,23 @@ * limitations under the License. */ -import Constants from '../common/constants.ets' -import CapsuleViewModel, {VIEW_MODEL_ID, CallState} from '../viewmodel/CapsuleViewModel.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/constants' +import CapsuleViewModel, {VIEW_MODEL_ID, CallState} from '../viewmodel/CapsuleViewModel' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' const TAG = "CapsuleIcon"; @Component export default struct CapsuleIcon { @StorageLink(VIEW_MODEL_ID) mCapsuleViewModel: CapsuleViewModel = CapsuleViewModel.getInstance(); - @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 startX: number = 0 startY: number = 0 moveX: number = 0 moveY: number = 0 + @State style: any = StyleConfiguration.getCapsuleComponentStyle() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { this.mCapsuleViewModel.initViewModel(); @@ -39,31 +42,31 @@ export default struct CapsuleIcon { build() { Row() { - Image($r("app.media.ic_statusbar_phone")) - .width($r("app.float.ic_statusbar_phone_width")) - .height($r("app.float.ic_statusbar_phone_height")) - .objectFit(ImageFit.Contain) - .margin({ left: $r("app.float.green_capsule_margin") }) - Text(this.mCapsuleViewModel.mText) - .fontSize($r("app.float.green_capsule_font_size")) - .fontWeight(FontWeight.Regular) - .fontColor($r('app.color.green_capsule_text_color')) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .margin({ - left: $r("app.float.green_capsule_text_margin"), - right: $r("app.float.green_capsule_margin"), - top: $r("app.float.green_capsule_text_margin"), - bottom: $r("app.float.green_capsule_text_margin") - }) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + Row() { + Row().width(this.style.greenCapsuleTextMarginLeftRight).height('100%') + Image($r("app.media.ic_statusbar_phone")) + .width(this.style.greenCapsulePhoneWidth) + .height(this.style.greenCapsulePhoneHeight) + .objectFit(ImageFit.Contain) + Row().width(this.style.greenCapsuleTextMarginLeftRight).height('100%') + Text(this.mCapsuleViewModel.mText) + .fontSize(this.styleCommon.statusBarFontSize) + .fontWeight(FontWeight.Regular) + .fontColor(this.style.greenCapsuleTextColor) + .maxLines(this.style.maxLines) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + Row().width(this.style.greenCapsuleTextMarginLeftRight).height('100%') + } + .alignItems(VerticalAlign.Center) + .height(this.style.greenCapsuleHeight) + .backgroundColor(this.style.greenCapsuleBackgroundColor) + .borderRadius(this.style.greenCapsuleRadius) + .onTouch(this.touchEvent.bind(this)) + + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } - .alignItems(VerticalAlign.Center) - .margin({ left: $r("app.float.green_capsule_left_margin") }) - .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient * Constants.CAPSULE_HEIGHT_MULTIPLE + 'px') - .backgroundColor($r('app.color.background_color')) - .borderRadius($r('app.float.green_capsule_radius')) .visibility(this.mCapsuleViewModel.mIsBackground ? Visibility.Visible : Visibility.None) - .onTouch(this.touchEvent.bind(this)) } touchEvent(event: TouchEvent) { diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts new file mode 100644 index 00000000..d9a0bf99 --- /dev/null +++ b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2021-2022 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 CapsuleModel from '../model/CapsuleModel' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil' + +let sCapsuleViewModel; + +const SEC_VAL = 1000; +const MIN_VAL = 60 * SEC_VAL; +const TAG = "CapsuleViewModel"; + +function fixInteger(num) { + return (num >= 10) ? String(num) : '0' + num; +} + +function parseTime(num) { + return fixInteger(Math.floor(num / MIN_VAL)) + ":" + fixInteger(Math.floor((num % MIN_VAL) / SEC_VAL); +} + +export const VIEW_MODEL_ID = "CapsuleViewModelVm"; + +export enum CallState { + CALL_ACTIVE, //通话中* + CALL_HOLDING, //通话保持 + CALL_DIALING, //拨号开始 + CALL_ALERTING, //正在呼出 + CALL_INCOMING, //来电* + CALL_WAITING, //第三方来电* + CALL_DISCONNECTED, //挂断完成 * + CALL_DISCONNECTING, //正在挂断 + CALL_IDLE //空闲 +} + +export default class CapsuleViewModel { + mText: string = "00:00"; + mStartTime: number = 0; + mCallState: CallState = CallState.CALL_DISCONNECTED; + mIsBackground: boolean = false; + mWantBundleName: string = ""; + mWantAbilityName: string = ""; + mTimeMeter: any; + mCallback: any; + + async initViewModel() { + this.mCallback = { + "onStateChange": this.onStateChange.bind(this) + } + CapsuleModel.registerCallback(this.mCallback); + } + + async onStateChange(data) { + Log.showInfo(TAG, `onStateChange, data: ${JSON.stringify(data)}`); + this.mIsBackground = data.isBackground; + this.mWantBundleName = data.wantBundleName; + this.mWantAbilityName = data.wantAbilityName; + if (data.callState == CallState.CALL_INCOMING || data.callState == CallState.CALL_WAITING) { + this.mStartTime = 0; + this.mText =await ResourceUtil.getString($r("app.string.incoming_call")); + } else if (data.callState == CallState.CALL_ACTIVE) { + clearTimeout(this.mTimeMeter); + if (this.mCallState != CallState.CALL_ACTIVE) { + this.mStartTime = new Date().valueOf(); + } + this.mCallState = data.callState; + + let startTime; + let commonTimeDiff = new Date().valueOf() - data.startTime; + let localTimeDiff = new Date().valueOf() - this.mStartTime; + if (commonTimeDiff < 0) { + if (localTimeDiff < 0) { + startTime = new Date().valueOf(); + } else { + startTime = this.mStartTime; + } + } else { + startTime = data.startTime; + } + + this.startUpdateTime(startTime); + } else if (data.callState == CallState.CALL_DISCONNECTED){ + clearTimeout(this.mTimeMeter); + this.mStartTime = 0; + this.mIsBackground = false; + this.mText = ""; + Log.showInfo(TAG, `cannot show`); + } else { + this.mStartTime = 0; + this.mText =await ResourceUtil.getString($r("app.string.communicate_by_phone")); + } + this.mCallState = data.callState; + } + + startUpdateTime(startTime) { + if (!this.mIsBackground || this.mCallState != CallState.CALL_ACTIVE) { + return; + } + let val = new Date().valueOf() - startTime.valueOf(); + if (val < 0) { + val = 0; + } + this.mText = parseTime(val); + this.mTimeMeter = setTimeout(() => { + this.startUpdateTime(startTime); + }, 1000 - val % 1000); + } + + onClickEvent() { + if (this.mIsBackground) { + this.mIsBackground = false; + } + Log.showInfo(TAG, `onClickEvent `); + Log.showInfo(TAG, `startAbility`); + AbilityManager.startAbility({ + bundleName: this.mWantBundleName, + abilityName: this.mWantAbilityName + }); + } + + static getInstance() { + if (sCapsuleViewModel == null) { + sCapsuleViewModel = new CapsuleViewModel(); + AppStorage.SetAndLink(VIEW_MODEL_ID, sCapsuleViewModel); + } + return sCapsuleViewModel; + } +} \ No newline at end of file diff --git a/features/capsulecomponent/src/main/resources/base/element/float.json b/features/capsulecomponent/src/main/resources/base/element/float.json index 563c6443..f7060069 100644 --- a/features/capsulecomponent/src/main/resources/base/element/float.json +++ b/features/capsulecomponent/src/main/resources/base/element/float.json @@ -1,31 +1,24 @@ { "float": [ { - "name": "green_capsule_font_size", - "value": "24" - }, { - "name": "green_capsule_radius", - "value": "25" - }, - { - "name": "green_capsule_margin", - "value": "16" + "name": "green_capsule_phone_width", + "value": "15vp" }, { - "name" : "green_capsule_text_margin", - "value" : "4" + "name": "green_capsule_phone_height", + "value": "15vp" }, { - "name" : "green_capsule_left_margin", - "value" : "5" + "name": "green_capsule_height", + "value": "48vp" }, { - "name": "ic_statusbar_phone_width", - "value": "30" + "name": "green_capsule_text_left_right", + "value": "10vp" }, { - "name": "ic_statusbar_phone_height", - "value": "30" + "name": "green_capsule_radius", + "value": "24vp" } ] } \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts new file mode 100644 index 00000000..0d70e4e5 --- /dev/null +++ b/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; + +const TAG = 'clock-StyleConfiguration'; + +export default class StyleConfiguration { + static getClockComponentStyle() { + const key: string = TAG + "-ClockComponent"; + return StyleManager.getStyle(key, () => { + return { + statusBarClockMaxWidth: $r('app.float.status_bar_clock_width') + }; + }); + } +} \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index e5004beb..4dd70f27 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,31 +13,50 @@ * limitations under the License. */ -import timeModel from '../timeModel.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfiguration from '../common/StyleConfiguration' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import ViewModel from '../viewmodel/ClockVM' +import TimeManager, { + TimeEventArgs, + TIME_CHANGE_EVENT, +} from '../../../../../../../common/src/main/ets/default/TimeManager' +import EventManager, {unsubscribe} from '../../../../../../../common/src/main/ets/default/event/EventManager' const TAG = 'ClockComponent-clockIcon'; @Component export default struct ClockIcon { - @StorageLink('time') mTime: string = '16:01' + @State mTime: string = '16:01' + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() + @State style: any = StyleConfiguration.getClockComponentStyle() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + unSubscriber?: unsubscribe; aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); - timeModel.initTimeModel(); + this.unSubscriber = EventManager.subscribe(TIME_CHANGE_EVENT, (args: TimeEventArgs) => { + this.mTime = TimeManager.formatTime(args.date); + }); + this.mTime = TimeManager.formatTime(new Date()); } aboutToDisappear() { Log.showInfo(TAG, 'aboutToDisappear'); - timeModel.unInitTimeModel(); + this.unSubscriber && this.unSubscriber(); + this.unSubscriber = undefined; } build() { - Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Row() { + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') Text(this.mTime) - .fontColor($r('app.color.clock_text_color')) - .fontSize($r('app.float.clock_fontsize')) + .fontColor(this.mTintContentInfo.contentColor) + .fontSize(this.styleCommon.statusBarFontSize) + .width(this.style.statusBarClockMaxWidth) + .textAlign(TextAlign.Center) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } - .width($r('app.float.clock_maxwidth')) } } \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts b/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts new file mode 100644 index 00000000..6c698d8e --- /dev/null +++ b/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../common/src/main/ets/default/Log'; +import {FASlotName} from '../../../../../../../common/src/main/ets/default/Constants'; +import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import createOrGet from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; + +const TAG = 'ClockVM'; + +export class ClockVM { + mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.CLOCK); + + constructor() { + Log.showInfo(TAG, `constructor`) + } + + getTintContentInfo(): TintContentInfo { + return this.mTintContentInfo; + } +} + +let sClockVM = createOrGet(ClockVM, TAG); + +export default sClockVM as ClockVM; \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/base/element/float.json b/features/clockcomponent/src/main/resources/base/element/float.json index 027e03d2..4ee9f179 100644 --- a/features/clockcomponent/src/main/resources/base/element/float.json +++ b/features/clockcomponent/src/main/resources/base/element/float.json @@ -1,11 +1,8 @@ { "float": [ { - "name": "clock_fontsize", - "value": "18" - },{ - "name": "clock_maxwidth", - "value": "70" + "name": "status_bar_clock_width", + "value": "60vp" } ] } \ No newline at end of file diff --git a/features/controlcentercomponent/build.gradle b/features/controlcentercomponent/build.gradle index 05923dbe..6c359c7b 100644 --- a/features/controlcentercomponent/build.gradle +++ b/features/controlcentercomponent/build.gradle @@ -16,9 +16,11 @@ ohos { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - implementation project(':features:wificomponent') - implementation project(':features:bluetoothcomponent') implementation project(':features:airplanecomponent') + implementation project(':features:autorotatecomponent') + implementation project(':features:bluetoothcomponent') + implementation project(':features:brightnesscomponent') implementation project(':features:locationcomponent') implementation project(':features:ringmodecomponent') + implementation project(':features:wificomponent') } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts b/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts new file mode 100644 index 00000000..afa53a08 --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021-2022 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 {ItemComponentData} from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; + +export default class Constants { + static TOUCHTYPE_DOWN = 0; + static TOUCHTYPE_UP = 1; + static TOUCHTYPE_MOVE = 2; + static TOGGLE_TYPE_COMPLEX = "complex"; + static TOGGLE_TYPE_SIMPLE = "simple"; + static COMPLEX_TOGGLE_GRID_ROW_HEIGHT = vp2px(132); + static COMPLEX_TOGGLE_GRID_ROW_GAP = vp2px(24); + static SIMPLE_TOGGLE_GRID_ROW_HEIGHT = vp2px(162); + static SIMPLE_TOGGLE_GRID_ROW_GAP = vp2px(0); + static DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT = 4; + static SIMPLE_TOGGLE_LAYOUT_MAX_TOGGLE_COUNT = 12; + static SIMPLE_TOGGLE_LAYOUT_MIN_TOGGLE_COUNT = 1; +} + +export type ControlComponentData = ItemComponentData & { + toggleType: string; +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts new file mode 100644 index 00000000..d8a7dc3d --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import Constants from './Constants' + +const TAG = 'ControlCenter-StyleConfiguration'; + +export default class StyleConfiguration { + static getControlCenterComponentStyle() { + const key: string = TAG + "-ControlCenterComponent"; + return StyleManager.getStyle(key, () => { + return { + marginLeft: $r('app.float.control_center_margin_left'), + marginRight: $r('app.float.control_center_margin_right'), + marginTop: $r('app.float.control_center_margin_top'), + titleMarginBottom: $r('app.float.control_center_title_margin_bottom'), + upTitleHeight: $r('app.float.control_center_title_height'), + toggleAreaGap: $r('app.float.control_center_toggle_area_gap'), + simpleToggleLayoutMarginTop: $r('app.float.control_center_simple_toggle_layout_margin_top'), + simpleToggleLayoutMarginBottom: $r('app.float.control_center_simple_toggle_layout_margin_bottom'), + brightnessMarginBottom: $r('app.float.control_center_brightness_margin_bottom'), + componentBorderRadius: $r('app.float.control_center_component_border_radius'), + componentBackgroundColor: $r('app.color.control_center_component_background') + }; + }); + } + + static getControlCenterUpTitleStyle() { + const key: string = TAG + "-ControlCenterUpTitle"; + return StyleManager.getStyle(key, () => { + return { + marginLeft: $r('app.float.control_center_title_margin_left'), + marginRight: $r('app.float.control_center_title_margin_right'), + fontSize: $r('app.float.control_center_title_font_size'), + fontColor: $r("app.color.control_center_title_font_color"), + titleImageColor: $r("app.color.control_center_title_image_color"), + imageWidth: $r('app.float.control_center_title_icon_width'), + imageHeight: $r('app.float.control_center_title_icon_height'), + imageHoverWidth: $r('app.float.control_center_title_icon_hover_width'), + imageHoverHeight: $r('app.float.control_center_title_icon_hover_height'), + imageHoverRadius: $r('app.float.control_center_title_icon_hover_radius'), + imageHoverColor: $r('app.color.control_center_title_icon_hover_color'), + imageTransparentColor: $r('app.color.control_center_title_icon_transparent_color'), + upTitleSpace: $r("app.float.control_center_title_space"), + }; + }); + } + + static getControlCenterComplexToggleLayoutStyle() { + const key: string = TAG + "-ControlCenterComplexToggleLayout"; + return StyleManager.getStyle(key, () => { + return { + columnGap: $r("app.float.control_center_complex_toggle_column_gap"), + rowGap: Constants.COMPLEX_TOGGLE_GRID_ROW_GAP, + rowHeight: Constants.COMPLEX_TOGGLE_GRID_ROW_HEIGHT + }; + }); + } + + static getControlCenterSimpleToggleLayoutStyle() { + const key: string = TAG + "-ControlCenterSimpleToggleLayout"; + return StyleManager.getStyle(key, () => { + return { + marginLeft: $r("app.float.control_center_simple_toggle_layout_margin_left"), + marginRight: $r("app.float.control_center_simple_toggle_layout_margin_right"), + columnGap: $r("app.float.control_center_simple_toggle_column_gap"), + rowGap: Constants.SIMPLE_TOGGLE_GRID_ROW_GAP, + rowHeight: Constants.SIMPLE_TOGGLE_GRID_ROW_HEIGHT + }; + }); + } + + static getSimpleToggleLayoutEditComponentStyle() { + const key: string = TAG + "-SimpleToggleLayoutEditComponent"; + return StyleManager.getStyle(key, () => { + return { + marginLeft: $r('app.float.simple_toggle_edit_margin_left'), + marginRight: $r('app.float.simple_toggle_edit_margin_right'), + marginTop: $r("app.float.simple_toggle_edit_margin_top"), + titleHeight: $r("app.float.simple_toggle_edit_title_height"), + titleMarginBottom: $r("app.float.simple_toggle_edit_title_margin_bottom"), + upGridMarginTop: $r('app.float.simple_toggle_edit_up_grid_margin_top'), + upGridMarginBottom: $r('app.float.simple_toggle_edit_up_grid_margin_bottom'), + gridMarginLeft: $r("app.float.simple_toggle_edit_grid_margin_left"), + gridMarginRight: $r("app.float.simple_toggle_edit_grid_margin_right"), + msgMarginTop: $r('app.float.simple_toggle_edit_msg_margin_top'), + msgMarginBottom: $r('app.float.simple_toggle_edit_msg_margin_bottom'), + btnMarginTop: $r('app.float.simple_toggle_edit_btn_margin_top'), + btnMarginBottom: $r('app.float.simple_toggle_edit_btn_margin_bottom'), + borderRadius: $r('app.float.simple_toggle_edit_border_radius'), + upAreaBgColor: $r("app.color.center_edit_up_area_bg_color"), + downAreaBgColor: $r("app.color.center_edit_down_area_bg_color"), + editBtnFontColor: $r("app.color.simple_toggle_edit_btn_font_color"), + editBtnFontSize: $r("sys.float.ohos_id_text_size_button1"), + editBtnBgColor: $r("app.color.simple_toggle_edit_btn_bg_color"), + editBtnMarginLeft: $r('app.float.simple_toggle_edit_btn_margin_left'), + editBtnMarginRight: $r('app.float.simple_toggle_edit_btn_margin_right'), + editBtnHeight: $r('app.float.simple_toggle_edit_btn_height'), + editBtnSpace: $r('app.float.simple_toggle_edit_btn_space') + }; + }); + } + + static getSimpleToggleLayoutEditUpTitleStyle() { + const key: string = TAG + "-SimpleToggleLayoutEditUpTitle"; + return StyleManager.getStyle(key, () => { + return { + marginLeft: $r('app.float.simple_toggle_edit_title_margin_left'), + imageWidth: $r('app.float.simple_toggle_edit_title_icon_width'), + imageHeight: $r('app.float.simple_toggle_edit_title_icon_height'), + fontColor: $r('app.color.simple_toggle_edit_title_font_color'), + editTitleSpace: $r('app.float.simple_toggle_edit_icon_width'), + titleFontSize: $r('app.float.simple_toggle_edit_title_font_size') + }; + }); + } + + static getSimpleToggleLayoutEditOptMsgStyle() { + const key: string = TAG + "-SimpleToggleLayoutEditOptMsg"; + return StyleManager.getStyle(key, () => { + return { + fontSize: $r('app.float.simple_toggle_edit_opt_msg_font_size'), + fontColor: $r('sys.color.ohos_id_color_text_secondary'), + height: $r('app.float.simple_toggle_edit_opt_msg_height'), + marginLeftRight: $r('app.float.simple_toggle_edit_opt_msg_margin_left_right'), + }; + }); + } + + static getSimpleToggleLayoutEditGridStyle() { + const key: string = TAG + "-SimpleToggleLayoutEditGrid"; + return StyleManager.getStyle(key, () => { + return { + columnGap: $r("app.float.simple_toggle_edit_grid_column_gap"), + rowGap: Constants.SIMPLE_TOGGLE_GRID_ROW_GAP, + rowHeight: Constants.SIMPLE_TOGGLE_GRID_ROW_HEIGHT, + dragBgSize: $r("app.float.simple_toggle_edit_grid_drag_bg_size") + }; + }); + } + + static getControlEditDialogStyle() { + const key: string = TAG + "-ControlEditDialog"; + return StyleManager.getStyle(key, () => { + return { + editDialogHeight: $r("app.float.simple_toggle_edit_dialog_height"), + editDialogWidth: $r("app.float.simple_toggle_edit_dialog_width"), + editDialogFontSize: $r("app.float.simple_toggle_edit_dialog_font_size"), + editDialogBtnMarginLF: $r("app.float.simple_toggle_edit_dialog_btn_margin_lf"), + editDialogFontHeight: $r("app.float.simple_toggle_edit_dialog_font_height"), + editDialogBtnMarginTop: $r("app.float.simple_toggle_edit_dialog_btn_margin_top"), + editDialogButtonSize: $r("app.float.simple_toggle_edit_dialog_btn_font_size"), + editDialogDividerHeight: $r("app.float.simple_toggle_edit_dialog_divider_height"), + editDialogButtonHeight: $r("app.float.simple_toggle_edit_dialog_btn_height"), + editDialogRadius: $r("app.float.simple_toggle_edit_dialog_radius"), + editDialogBtnWidth: $r("app.float.simple_toggle_edit_dialog_btn_width"), + editDialogColor: $r("app.color.center_edit_dialog_color"), + editDialogBtnFontColor: $r("app.color.center_edit_dialog_btn_font_color"), + editDialogBtnBgColor: $r("app.color.center_edit_dialog_btn_bg_color"), + editDialogDividerColor: $r("sys.color.ohos_id_color_secondary"), + editDialogFontMarginTop: $r("app.float.simple_toggle_edit_dialog_font_margin_top"), + editDialogDividerWidth: $r("app.float.simple_toggle_edit_dialog_divider_width") + }; + }); + } +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts new file mode 100644 index 00000000..37e1d810 --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2021-2022 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 Log from "../../../../../../../../common/src/main/ets/default/Log"; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import SwitchUserManager from "../../../../../../../../common/src/main/ets/default/SwitchUserManager"; +import CheckEmptyUtils from "../../../../../../../../common/src/main/ets/default/CheckEmptyUtils"; +import SettingsUtil from "../../../../../../../../common/src/main/ets/default/SettingsUtil"; +import AbilityManager from "../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager"; +import PluginDataSourceAdapter from "../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter"; +import {ItemComponentData} from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; +import Constants, {ControlComponentData} from "../common/Constants"; + +export type ControlCenterListener = { + setComplexToggleLayout: (layout: string[]) => void; + setSimpleToggleLayout: (layout: string[]) => void; + setItemData: (id: string, itemData: ControlComponentData) => void; +} +; + +const TAG = "ControlCenterModel"; +const SETTINGS_CONTROL_SIMPLE_TOGGLE_LAYOUT = "settings.control.simpleToggleLayout"; +const CONTROLCENTER_SOURCE_CONFIG = { + action: "com.ohos.systemui.action.TOGGLE", + filterDatas: [], + loaderConfig: { + MetaSource: { + action: "com.ohos.systemui.action.TOGGLE", + permission: null, + }, + }, +}; + +function parseData(itemData: ItemComponentData): ControlComponentData { + let { toggleType, ...other } = itemData.actionData?.extra; + return { + ...itemData, + toggleType: toggleType ?? Constants.TOGGLE_TYPE_SIMPLE, + actionData: { ...itemData.actionData, extra: undefined }, + }; +} + +export class ControlCenterService { + mIsStart: boolean = false; + mAdapter: PluginDataSourceAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this); + mListener: ControlCenterListener | undefined; + mConfig: any; + mComplexToggleLayoutTemplate: string[]; + mSimpleToggleLayoutTemplate: string[]; + mAllComplexToggles: string[] = []; + mAllSimpleToggles: string[] = []; + mComplexToggleLayout: string[]; + mSimpleToggleLayout: string[]; + + constructor() { + Log.showInfo(TAG, `constructor`) + } + + startService(config): void { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `start ControlCenterService.`); + this.mIsStart = true; + + this.parseConfig(config); + + SwitchUserManager.getInstance().registerListener(this); + CONTROLCENTER_SOURCE_CONFIG.filterDatas = config.MetaToggles; + this.mAdapter.initDataSource(CONTROLCENTER_SOURCE_CONFIG); + } + + stopService(): void { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `stop ControlCenterService.`); + this.mIsStart = false; + this.mAdapter.clearAll(); + } + + parseConfig(config): void { + Log.showInfo(TAG, `parseConfig, config: ${JSON.stringify(config)}`); + this.mConfig = config; + + this.mComplexToggleLayoutTemplate = []; + config.ComplexToggleLayout.forEach((name) => { + this.mComplexToggleLayoutTemplate.push(name); + }); + this.loadSimpleToggleLayoutTemplate(); + Log.showInfo(TAG, + `parseConfig, ComplexToggleLayoutTemplate: ${JSON.stringify(this.mComplexToggleLayoutTemplate)}`) + Log.showInfo(TAG, + `parseConfig, SimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`) + + config.LocalToggles.ComplexToggles.forEach((name) => { + this.mAllComplexToggles.push(name); + }); + Log.showInfo(TAG, `parseConfig, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`) + this.calcComplexToggleLayout(); + config.LocalToggles.SimpleToggles.forEach((name) => { + this.mAllSimpleToggles.push(name); + }); + Log.showInfo(TAG, `parseConfig, allSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`) + this.calcSimpleToggleLayout(); + } + + loadSimpleToggleLayoutTemplate(): void{ + Log.showInfo(TAG, `loadSimpleToggleLayoutTemplate`) + this.mSimpleToggleLayoutTemplate = []; + let simpleToggleLayout = this.getSimpleToggleLayoutFromSettings(); + if (simpleToggleLayout) { + this.mSimpleToggleLayoutTemplate = simpleToggleLayout; + } else { + this.mConfig.DefaultSimpleToggleLayout.forEach((name) => { + this.mSimpleToggleLayoutTemplate.push(name); + }); + this.setSimpleToggleLayoutToSettings(this.mSimpleToggleLayoutTemplate); + } + Log.showInfo(TAG, `loadSimpleToggleLayoutTemplate, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`) + } + + calcComplexToggleLayout(): void { + Log.showInfo(TAG, `calcComplexToggleLayout`) + + let complexToggleLayout: string[] = []; + this.mComplexToggleLayoutTemplate.forEach((name) => { + if (this.mAllComplexToggles.indexOf(name) >= 0) { + complexToggleLayout.push(name); + } + }); + + Log.showInfo(TAG, `calcComplexToggleLayout, complexToggleLayout: ${JSON.stringify(complexToggleLayout)}`) + this.mComplexToggleLayout = complexToggleLayout; + this.mListener?.setComplexToggleLayout(complexToggleLayout); + } + + calcSimpleToggleLayout(): void { + Log.showInfo(TAG, `calcSimpleToggleLayout`) + + let simpleToggleLayout: string[] = []; + this.mSimpleToggleLayoutTemplate.forEach((name) => { + if (this.mAllSimpleToggles.indexOf(name) >= 0) { + simpleToggleLayout.push(name); + } + }); + + Log.showInfo(TAG, `calcSimpleToggleLayout, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`) + this.mSimpleToggleLayout = simpleToggleLayout; + this.mListener?.setSimpleToggleLayout(simpleToggleLayout); + } + + userChange(userInfo) { + Log.showInfo(TAG, `userChange userInfo ` + userInfo); + this.mAdapter.loadData(userInfo.userId); + } + + registerListener(listener: ControlCenterListener) { + Log.showInfo(TAG, `registerListener, listener: ${listener}`); + this.mListener = listener; + } + + initFinish() { + Log.showInfo(TAG, `initFinish`); + SwitchUserManager.getInstance() + .getCurrentUserInfo() + .then((userInfo) => { + this.mAdapter.loadData(userInfo.userId); + }); + } + + onItemAdd(itemData: ItemComponentData): void { + Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); + let controlData: ControlComponentData = parseData(itemData); + let id: string = controlData.id; + this.mListener?.setItemData(id, controlData); + if (controlData.toggleType == Constants.TOGGLE_TYPE_COMPLEX) { + if (this.mAllComplexToggles.indexOf(id) < 0) { + this.mAllComplexToggles.push(id); + Log.showInfo(TAG, `onItemAdd, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`) + this.calcComplexToggleLayout(); + } + } else { + if (this.mAllSimpleToggles.indexOf(id) < 0) { + this.mAllSimpleToggles.push(id); + Log.showInfo(TAG, `onItemAdd, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`) + this.calcSimpleToggleLayout(); + } + } + } + + onItemRemove(itemData: ItemComponentData): void { + Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); + let id: string = itemData.id; + if (this.mAllComplexToggles.indexOf(id) >= 0) { + this.mAllComplexToggles.splice(this.mAllComplexToggles.indexOf(id), 1); + Log.showInfo(TAG, `onItemRemove, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`) + this.calcComplexToggleLayout(); + } else if (this.mAllSimpleToggles.indexOf(id) >= 0) { + this.mAllSimpleToggles.splice(this.mAllSimpleToggles.indexOf(id), 1); + Log.showInfo(TAG, `onItemRemove, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`) + this.calcSimpleToggleLayout(); + } + this.mListener?.setItemData(id, undefined); + } + + getSimpleToggleLayoutFromSettings(): string[] { + Log.showInfo(TAG, `getSimpleToggleLayoutFromSettings`); + let value = SettingsUtil.getValue(SETTINGS_CONTROL_SIMPLE_TOGGLE_LAYOUT); + let simpleToggleLayout: string[] = null; + if (!CheckEmptyUtils.isEmpty(value)) { + simpleToggleLayout = JSON.parse(value); + } + Log.showInfo(TAG, `getSimpleToggleLayoutFromSettings, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); + return simpleToggleLayout; + } + + setSimpleToggleLayoutToSettings(simpleToggleLayout: string[]): void { + Log.showInfo(TAG, `setSimpleToggleLayoutToSettings, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); + let value: string = JSON.stringify(simpleToggleLayout); + SettingsUtil.setValue(SETTINGS_CONTROL_SIMPLE_TOGGLE_LAYOUT, value); + } + + getHidingSimpleToggles(): string[] { + Log.showInfo(TAG, `getHidingSimpleToggles`) + let hidingSimpleToggles: string[] = []; + this.mAllSimpleToggles.forEach((toggleName) => { + if (this.mSimpleToggleLayout.indexOf(toggleName) < 0) { + hidingSimpleToggles.push(toggleName); + } + }); + Log.showInfo(TAG, `getHidingSimpleToggles, hidingSimpleToggles: ${JSON.stringify(hidingSimpleToggles)}`) + return hidingSimpleToggles; + } + + getDefaultSimpleToggleLayout(): string[] { + Log.showInfo(TAG, `getDefaultSimpleToggleLayout`) + let defaultToggles: string[] = []; + this.mConfig.DefaultSimpleToggleLayout.forEach((toggleName) => { + if (this.mAllSimpleToggles.indexOf(toggleName) >= 0) { + defaultToggles.push(toggleName); + } + }); + Log.showInfo(TAG, `getDefaultSimpleToggleLayout, defaultToggles: ${JSON.stringify(defaultToggles)}`) + return defaultToggles; + } + + saveSimpleToggleLayout(layout: string[]): void{ + Log.showInfo(TAG, `saveSimpleToggleLayout, layout: ${JSON.stringify(layout)}`) + this.setSimpleToggleLayoutToSettings(layout); + this.mSimpleToggleLayoutTemplate = []; + layout.forEach((name) => { + this.mSimpleToggleLayoutTemplate.push(name); + }); + Log.showInfo(TAG, `saveSimpleToggleLayout, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`) + this.calcSimpleToggleLayout(); + } +} + +let sControlCenterService = createOrGet(ControlCenterService, TAG); + +export default sControlCenterService as ControlCenterService; \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets index 1e9fa1ce..7cc9e065 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,12 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' -import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' -import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets' -import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase.ets' -import Constants from '../common/Constants.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager' +import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase' +import Constants from '../common/Constants' const TAG = 'ComplexToggleComponent' @@ -27,15 +25,10 @@ export default struct ComplexToggleComponent { @Prop keyId: string @State mItemData: any = {} @State mStatus: boolean = false - @StorageLink("showStatusBar") showStatusBar: boolean = false - private mWindowManager - private mFeatureAbilityManager @State mDefaultTitle: string = '' aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) - this.mWindowManager = new WindowManager() - this.mFeatureAbilityManager = new FeatureAbilityManager() this.linkItemData() } @@ -45,7 +38,7 @@ export default struct ComplexToggleComponent { linkItemData() { Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`) - this.mItemData = AppStorage.Link(this.keyId) + this.mItemData = AppStorage.Link('ControlCenter_' + this.keyId) Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ this.mItemData.get() .iconUrl}`) @@ -64,8 +57,8 @@ export default struct ComplexToggleComponent { iconOnStr: this.mItemData.get() .iconUrl, changeSwitch: $mStatus, - mClickEvent: this.onIconItemClick.bind(this), - mLongClickEvent: this.onIconItemLongPressGesture.bind(this) + mClickEvent: () => this.onIconItemClick(), + mLongClickEvent: () => this.onIconItemLongPressGesture() }) }.width('100%') .height('100%') @@ -73,40 +66,15 @@ export default struct ComplexToggleComponent { onIconItemClick() { Log.showInfo(TAG, `onIconItemClick`) - if (this.mItemData.get().actionData && this.mItemData.get().actionData.clickAction) { - this.startAbility(this.mItemData.get().actionData.clickAction) + if (this.mItemData.get()?.actionData?.clickAction) { + EventManager.publish(this.mItemData.get().actionData.clickAction); } } onIconItemLongPressGesture() { Log.showInfo(TAG, `onIconItemLongPressGesture`) - if (this.mItemData.get().actionData && this.mItemData.get().actionData.longClickAction) { - this.startAbility(this.mItemData.get().actionData.longClickAction) + if (this.mItemData.get()?.actionData?.longClickAction) { + EventManager.publish(this.mItemData.get().actionData.longClickAction); } } - - startAbility(action) { - Log.showInfo(TAG, `startAbility, action: ${action}`) - let actionInfos = action.split('&') - let wantParam = { - parameters: {} - } - for (let actionInfoStr of actionInfos) { - let actionInfo = actionInfoStr.split('=') - if (actionInfo[0] == 'want') { - wantParam['bundleName'] = actionInfo[1].split('/')[0] - wantParam['abilityName'] = actionInfo[1].split('/')[1] - } else { - wantParam.parameters[actionInfo[0]] = actionInfo.length > 1 ? actionInfo[1] : actionInfo[0] - } - } - Log.showInfo(TAG, `startAbility, want: ${JSON.stringify(wantParam)}`) - - this.showStatusBar = true - this.mWindowManager.setWindowMin((result) => { - this.mFeatureAbilityManager.openAbility(TAG, { - want: wantParam - }) - }) - } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets index 95ebc834..83db5105 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,12 +13,12 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import AirPlaneComponent from "../../../../../../../airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets" -import WifiComponent from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiComponent.ets' -import BluetoothComponent from '../../../../../../../bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets' -import Constants from '../common/Constants.ets' -import ComplexToggleComponent from './ComplexToggleComponent.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants' +import AirPlaneComponent from "../../../../../../../airplanecomponent/src/main/ets/default/pages/airplaneComponent" +import WifiComponent from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiComponent' +import BluetoothComponent from '../../../../../../../bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent' +import ComplexToggleComponent from './ComplexToggleComponent' const TAG = 'ComplexToggleLoadComponent' @@ -36,11 +36,11 @@ export default struct ComplexToggleLoadComponent { build() { Column() { - if (this.keyId == Constants.WIFI) { + if (this.keyId == FASlotName.WIFI) { WifiComponent() - } else if (this.keyId == Constants.BLUETOOTH) { + } else if (this.keyId == FASlotName.BLUETOOTH) { BluetoothComponent() - } else if (this.keyId == Constants.AIR_PLANE) { + } else if (this.keyId == FASlotName.AIR_PLANE) { AirPlaneComponent() } else { ComplexToggleComponent({ diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index 74ebb44a..264e93b2 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,15 +13,15 @@ * limitations under the License. */ -import {UpTitle} from './UpTitle.ets' -import {MyBrightness} from '../../../../../../../brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets' -import {MyVol} from '../../../../../../../volumecomponent/src/main/ets/default/pages/volumeComponent.ets' -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import UniformConfig from '../../../../../../../../common/src/main/ets/template/UniformConfig.ets' -import Constants from '../common/Constants.ets' -import ViewModel from '../viewmodel/ControlCenterVM.ets' -import ComplexToggleLoadComponent from './ComplexToggleLoadComponent.ets' -import SimpleToggleLoadComponent from './SimpleToggleLoadComponent.ets' +import UpTitle from './UpTitle' +import MyBrightness from '../../../../../../../brightnesscomponent/src/main/ets/default/pages/brightnessComponent' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Constants from '../common/Constants' +import StyleConfiguration from '../common/StyleConfiguration' +import ViewModel from '../viewmodel/ControlCenterVM' +import ComplexToggleLoadComponent from './ComplexToggleLoadComponent' +import SimpleToggleLoadComponent from './SimpleToggleLoadComponent' +import SimpleToggleLayoutEditComponent from './SimpleToggleLayoutEditComponent' const TAG = 'Control-ControlCenter' const TAG_ControlCenterComplexToggleLayout = 'Control-ControlCenterComplexToggleLayout' @@ -31,31 +31,20 @@ var mUniform; @Component export default struct ControlCenterComponent { - @State mControlCenterComponentConfig: any = {} - @Link showStatusBar: boolean - componentUniform = { - iconOnBG: "#0A59F7", - iconOffBG: "#F5F5F5", - iconOnColor: "#FFFFFF", - iconOffColor: "#404345", - baseColor: "#CCFFFFFF", - circleWidth: '80px', - circleHeight: '80px', - iconWidth: '50px', - iconHeight: '50px', - titleSize: '20px', - iconTitleMargin: 10, - baseBorderRadius: 15, - simpleToggleTitleSize: '18px' - } + private touchMoveCallback: Function + private modeChangeCallback: Function + @State mSimpleToggleColumnCount: number = Constants.DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT + private mControlCenterComponentConfig: any = {} + @State mIsEditSimpleToggleLayout: boolean = false + @State style: any = StyleConfiguration.getControlCenterComponentStyle() + private mWidthPx: number = 0 + private mDisplayingSimpleToggles: string[] = [] + private mHidingSimpleToggles: string[] = [] + private mDefaultDisplaySimpleToggles: string[] = [] + private titleDisplayInside: boolean = false aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear') - // 初始化自定义组件样式 - mUniform = UniformConfig.initParams(this.componentUniform) - - console.log(`------${JSON.stringify(mUniform)}`); - Log.showInfo(TAG, `aboutToAppear, mControlCenterComponentConfig: ${JSON.stringify(this.mControlCenterComponentConfig)}`) ViewModel.initViewModel(this.mControlCenterComponentConfig) } @@ -64,44 +53,125 @@ export default struct ControlCenterComponent { Log.showInfo(TAG, 'aboutToDisappear ') } + onSimpleToggleLayoutEditStart() { + Log.showInfo(TAG, 'onSimpleToggleLayoutEditStart') + this.mDisplayingSimpleToggles = ViewModel.getDisplayingSimpleToggles() + this.mHidingSimpleToggles = ViewModel.getHidingSimpleToggles() + this.mDefaultDisplaySimpleToggles = ViewModel.getDefaultSimpleToggleLayout() + this.setIsEditSimpleToggleLayout(true) + } + + onSimpleToggleLayoutEditEnd() { + Log.showInfo(TAG, 'onSimpleToggleLayoutEditEnd') + this.setIsEditSimpleToggleLayout(false) + } + + setIsEditSimpleToggleLayout(isEdit: boolean): void { + Log.showInfo(TAG, `setIsEditSimpleToggleLayout, isEdit: ${isEdit}`) + animateTo({ + duration: 300, + tempo: 1.0, + curve: Curve.Friction, + delay: 0, + iterations: 1, + playMode: PlayMode.Normal, + onFinish: () => { + Log.showInfo(TAG, `setIsEditSimpleToggleLayout, show anim finish.`) + } + }, () => { + Log.showInfo(TAG, `setIsEditSimpleToggleLayout, animateTo`) + this.mIsEditSimpleToggleLayout = isEdit + }) + if (this.modeChangeCallback) { + this.modeChangeCallback(isEdit) + } + } + + onSaveDisplayingToggles(toggles: string[]): void { + Log.showInfo(TAG, `onSaveDisplayingToggles, toggles: ${JSON.stringify(toggles)}`) + ViewModel.saveSimpleToggleLayout(toggles) + } + build() { Column() { - Column() { - UpTitle({ showStatusBar: $showStatusBar }) - } - .width('100%') - .height($r('app.float.up_title_height')) - .margin({ top: $r('app.float.center_item_margin_top'), - left: $r('app.float.center_item_margin_left'), - right: $r('app.float.center_item_margin_right') }) - - ControlCenterComplexToggleLayout() - ControlCenterSimpleToggleLayout() - Column() { - MyBrightness() - } - .width('100%') - .height($r('app.float.vol_height')) - .margin({ top: $r('app.float.center_item_margin_top'), - left: $r('app.float.center_item_margin_left'), - right: $r('app.float.center_item_margin_right') }) - - Flex() { - MyVol() + if (!this.mIsEditSimpleToggleLayout) { + Column() { + Column().width('100%').height(this.style.marginTop) + Column() { + UpTitle({ + touchMoveCallback: (data) => { + if (this.touchMoveCallback) { + this.touchMoveCallback(data) + } + }, + simpleToggleLayoutEditStartCallback: () => this.onSimpleToggleLayoutEditStart() + }) + } + .width('100%') + .height(this.style.upTitleHeight) + + Column().width('100%').height(this.style.titleMarginBottom) + + Row() { + Column().width(this.style.marginLeft).height(1).layoutWeight(0) + + Column() { + ControlCenterComplexToggleLayout() + + Column().width('100%').height(this.style.toggleAreaGap) + Column() { + Column().width('100%').height(this.style.simpleToggleLayoutMarginTop) + ControlCenterSimpleToggleLayout({ + mColumnCount: this.mSimpleToggleColumnCount + }) + Column().width('100%').height(this.style.simpleToggleLayoutMarginBottom) + + MyBrightness() + + Column().width('100%').height(this.style.brightnessMarginBottom) + } + .width('100%') + .borderRadius(this.style.componentBorderRadius) + .clip(true) + .backgroundColor(this.style.componentBackgroundColor) + } + .layoutWeight(1) + + Column().width(this.style.marginRight).height(1).layoutWeight(0) + }.width('100%') + } + .width('100%') + .transition({ type: TransitionType.Insert, opacity: 0, translate: { x: (-this.mWidthPx * 0.8) + 'px' } }) + .transition({ type: TransitionType.Delete, opacity: 0 }) + } else { + Column() { + SimpleToggleLayoutEditComponent({ + mDisplayingToggles: this.mDisplayingSimpleToggles, + mHidingToggles: this.mHidingSimpleToggles, + mDefaultDisplayToggles: this.mDefaultDisplaySimpleToggles, + simpleToggleLayoutEditEndCallback: () => this.onSimpleToggleLayoutEditEnd(), + onSaveDisplayingToggles: (toggles: string[]) => this.onSaveDisplayingToggles(toggles), + mColumnCount: this.mSimpleToggleColumnCount, + titleDisplayInside: this.titleDisplayInside + }) + } + .width('100%') + .transition({ type: TransitionType.Insert, opacity: 0, translate: { x: this.mWidthPx * 0.8 + 'px' } }) + .transition({ type: TransitionType.Delete, opacity: 0 }) } - .width('100%') - .height($r('app.float.vol_height')) - .margin({ top: $r('app.float.center_item_margin_top'), - left: $r('app.float.center_item_margin_left'), - right: $r('app.float.center_item_margin_right') }) } .width('100%') + .onAreaChange((e, e2) => { + Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + this.mWidthPx = vp2px(e2.width) + }) } } @Component struct ControlCenterComplexToggleLayout { @StorageLink('ControlCenterComplexToggleLayout') mComplexToggleLayout: string[] = [] + @State style: any = StyleConfiguration.getControlCenterComplexToggleLayoutStyle() aboutToAppear() { Log.showInfo(TAG_ControlCenterComplexToggleLayout, `aboutToAppear Start`) @@ -113,38 +183,51 @@ struct ControlCenterComplexToggleLayout { } build() { - Flex({ - direction: FlexDirection.Row, - wrap: FlexWrap.Wrap, - justifyContent: FlexAlign.SpaceBetween, - alignItems: ItemAlign.Start, - alignContent: FlexAlign.Start - }) { - ForEach(this.mComplexToggleLayout, (componentName: string) => { - Row() { - ComplexToggleLoadComponent({ - keyId: componentName - }) + Grid() { + ForEach(this.mComplexToggleLayout, (componentName) => { + GridItem() { + Column() { + ComplexToggleLoadComponent({ + keyId: componentName + }) + }.width('100%') + .height('100%') } - .width('48%') - .height(Constants.COMPLEX_TOGGLE_HEIGHT + Constants.COMPLEX_TOGGLE_UP_DOWN_SPACE) - .margin({ top: Constants.COMPLEX_TOGGLE_UP_DOWN_SPACE }) - }, (componentName: string) => componentName) + }, (componentName) => componentName) } .width('100%') - .height((Math.ceil(this.mComplexToggleLayout.length / 2) * (Constants.COMPLEX_TOGGLE_HEIGHT + Constants.COMPLEX_TOGGLE_UP_DOWN_SPACE)).toString()) - .margin({ - left: $r('app.float.center_item_margin_left'), - right: $r('app.float.center_item_margin_right') - }) + .height(this.calcGridHeight(Math.ceil(this.mComplexToggleLayout.length / 2), this.style.rowHeight, this.style.rowGap)) + .columnsTemplate('1fr 1fr') + .rowsTemplate(this.generateRowsTemplate(Math.ceil(this.mComplexToggleLayout.length / 2))) + .rowsGap(this.style.rowGap + 'px') + .columnsGap(this.style.columnGap) + } + + calcGridHeight(rowCount, rowHeight, rowGap) { + Log.showInfo(TAG_ControlCenterComplexToggleLayout, `calcGridHeight, rowCount: ${rowCount} rowHeight: ${rowHeight} rowGap: ${rowGap}`) + let height = rowCount * rowHeight + (rowCount - 1) * rowGap + if (height < 0) { + height = 0 + } + Log.showInfo(TAG_ControlCenterComplexToggleLayout, `calcGridHeight, height: ${height}`) + return height + 'px' + } + + generateRowsTemplate(rowCount) { + Log.showInfo(TAG_ControlCenterComplexToggleLayout, `generateRowsTemplate, rowCount: ${rowCount}`) + let rowsTemplate = '1fr' + for (let i = 1;i < rowCount; i++) { + rowsTemplate += ' 1fr' + } + return rowsTemplate } } @Component struct ControlCenterSimpleToggleLayout { + @Prop mColumnCount: number @StorageLink('ControlCenterSimpleToggleLayout') mSimpleToggleLayout: string[] = [] - @State mShowLabel: boolean = true - @State mEditMode: boolean = false + @State style: any = StyleConfiguration.getControlCenterSimpleToggleLayoutStyle() aboutToAppear() { Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `aboutToAppear Start`) @@ -156,35 +239,57 @@ struct ControlCenterSimpleToggleLayout { } build() { - Flex({ - direction: FlexDirection.Row, - wrap: FlexWrap.Wrap, - justifyContent: FlexAlign.Start, - alignItems: ItemAlign.Start, - alignContent: FlexAlign.Start - }) { - ForEach(this.mSimpleToggleLayout, (componentName: string) => { - Column() { - SimpleToggleLoadComponent({ - keyId: componentName, - mShowLabel: this.mShowLabel, - mEditMode: this.mEditMode - }) - } - .width('25%') - .height(Constants.SIMPLE_TOGGLE_HEIGHT + Constants.SIMPLE_TOGGLE_UP_DOWN_SPACE) - .margin({ top: Constants.SIMPLE_TOGGLE_UP_DOWN_SPACE }) - }, (componentName: string) => componentName) + Row() { + Column().width(this.style.marginLeft).height(1).layoutWeight(0) + Grid() { + ForEach(this.mSimpleToggleLayout, (componentName) => { + GridItem() { + Column() { + SimpleToggleLoadComponent({ + keyId: componentName + }) + }.width('100%') + .height('100%') + } + }, (componentName) => componentName) + } + .layoutWeight(1) + .height(this.calcGridHeight(Math.ceil(this.mSimpleToggleLayout.length / this.mColumnCount), this.style.rowHeight, this.style.rowGap)) + .columnsTemplate(this.generateColumnsTemplate(this.mColumnCount)) + .rowsTemplate(this.generateRowsTemplate(Math.ceil(this.mSimpleToggleLayout.length / this.mColumnCount))) + .rowsGap(this.style.rowGap + 'px') + .columnsGap(this.style.columnGap) + + Column().width(this.style.marginRight).height(1).layoutWeight(0) } .width('100%') - .height((Math.ceil(this.mSimpleToggleLayout.length / 4) * (Constants.SIMPLE_TOGGLE_HEIGHT + Constants.SIMPLE_TOGGLE_UP_DOWN_SPACE) - + (Math.ceil(this.mSimpleToggleLayout.length / 4) == 0 ? 0 : Constants.SIMPLE_TOGGLE_UP_DOWN_SPACE * 2)).toString()) - .margin({ - left: $r('app.float.center_item_margin_left'), - right: $r('app.float.center_item_margin_right'), - top: Math.ceil(this.mSimpleToggleLayout.length / 4) == 0 ? 0 : Constants.SIMPLE_TOGGLE_UP_TOP_SPACE - }) - .borderRadius(UniformConfig.config.baseBorderRadius) - .backgroundColor(UniformConfig.config.baseColor) + } + + calcGridHeight(rowCount, rowHeight, rowGap) { + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `calcGridHeight, rowCount: ${rowCount} rowHeight: ${rowHeight} rowGap: ${rowGap}`) + let height = rowCount * rowHeight + (rowCount - 1) * rowGap + if (height < 0) { + height = 0 + } + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `calcGridHeight, height: ${height}`) + return height + 'px' + } + + generateColumnsTemplate(columnCount) { + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `generateColumnsTemplate, columnCount: ${columnCount}`) + let columnsTemplate = '1fr' + for (let i = 1;i < columnCount; i++) { + columnsTemplate += ' 1fr' + } + return columnsTemplate + } + + generateRowsTemplate(rowCount) { + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `generateRowsTemplate, rowCount: ${rowCount}`) + let rowsTemplate = '1fr' + for (let i = 1;i < rowCount; i++) { + rowsTemplate += ' 1fr' + } + return rowsTemplate } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index 1c16c0e9..ea0667ef 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,31 +13,25 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' -import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' -import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager' +import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase' const TAG = 'SimpleToggleComponent' @Component export default struct SimpleToggleComponent { - @Prop keyId: string + private keyId: string @State mItemData: any = {} - @StorageLink("showStatusBar") showStatusBar: boolean = false - @Prop mShowLabel: boolean - @Prop mEditMode: boolean - private mWindowManager - private mFeatureAbilityManager + private mEditMode: boolean = false + private mDragMode: boolean = false @State mDefaultIcon: Resource = $r("app.media.icon") @State mDefaultChangeSwitch: boolean = false @State mDefaultLabel: string = '' aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) - Log.showInfo(TAG, `aboutToAppear Start, mShowLabel: ${this.mShowLabel} mEditMode: ${this.mEditMode}`) - this.mWindowManager = new WindowManager() - this.mFeatureAbilityManager = new FeatureAbilityManager() + Log.showInfo(TAG, `aboutToAppear Start, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode}`) this.linkItemData() } @@ -47,65 +41,43 @@ export default struct SimpleToggleComponent { linkItemData() { Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`) - this.mItemData = AppStorage.Link(this.keyId) + this.mItemData = AppStorage.Link('ControlCenter_' + this.keyId) Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ this.mItemData.get() .iconUrl}`) } build() { - SimpleToggleBase({ - mToggleId: this.keyId, - mIcon: $mDefaultIcon, - mIconStr: this.mItemData.get().iconUrl, - mUseIconStr:true, - mChangeSwitch: $mDefaultChangeSwitch, - mLabel: $mDefaultLabel, - mLabelStr: this.mItemData.get().label, - mUseLabelStr: true, - mShowLabel: this.mShowLabel, - mEditMode: this.mEditMode, - mClickEvent: this.onIconItemClick.bind(this), - mLongClickEvent: this.onIconItemLongPressGesture.bind(this) - }) + Column() { + SimpleToggleBase({ + mToggleId: this.keyId, + mIcon: $mDefaultIcon, + mIconStr: this.mItemData.get().iconUrl, + mUseIconStr: true, + mChangeSwitch: this.mDefaultChangeSwitch, + mLabel: $mDefaultLabel, + mLabelStr: this.mItemData.get().label, + mUseLabelStr: true, + mEditMode: this.mEditMode, + mDragMode: this.mDragMode, + mClickEvent: () => this.onIconItemClick(), + mLongClickEvent: () => this.onIconItemLongPressGesture() + }) + }.width('100%') + .height('100%') } onIconItemClick() { Log.showInfo(TAG, `onIconItemClick`) - if (this.mItemData.get().actionData && this.mItemData.get().actionData.clickAction) { - this.startAbility(this.mItemData.get().actionData.clickAction) + if (this.mItemData.get()?.actionData?.clickAction) { + EventManager.publish(this.mItemData.get().actionData.clickAction); } } onIconItemLongPressGesture() { Log.showInfo(TAG, `onIconItemLongPressGesture`) - if (this.mItemData.get().actionData && this.mItemData.get().actionData.longClickAction) { - this.startAbility(this.mItemData.get().actionData.longClickAction) - } - } - - startAbility(action) { - Log.showInfo(TAG, `startAbility, action: ${action}`) - let actionInfos = action.split('&') - let wantParam = { - parameters: {} + if (this.mItemData.get()?.actionData?.longClickAction) { + EventManager.publish(this.mItemData.get().actionData.longClickAction); } - for (let actionInfoStr of actionInfos) { - let actionInfo = actionInfoStr.split('=') - if (actionInfo[0] == 'want') { - wantParam['bundleName'] = actionInfo[1].split('/')[0] - wantParam['abilityName'] = actionInfo[1].split('/')[1] - } else { - wantParam.parameters[actionInfo[0]] = actionInfo.length > 1 ? actionInfo[1] : actionInfo[0] - } - } - Log.showInfo(TAG, `startAbility, want: ${JSON.stringify(wantParam)}`) - - this.showStatusBar = true - this.mWindowManager.setWindowMin((result) => { - this.mFeatureAbilityManager.openAbility(TAG, { - want: wantParam - }) - }) } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets new file mode 100644 index 00000000..ed993a9c --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import Constants from '../common/Constants' +import StyleConfiguration from '../common/StyleConfiguration' +import SimpleToggleLayoutEditGrid from './SimpleToggleLayoutEditGrid' +import SimpleToggleLayoutEditDialogComponent from './SimpleToggleLayoutEditDialogComponent' + +const TAG = 'Control-SimpleToggleLayoutEditComponent' +const TAG_SimpleToggleLayoutEditUpTitle = 'Control-SimpleToggleLayoutEditUpTitle' +const TAG_SimpleToggleLayoutEditOptMsg = 'Control-SimpleToggleLayoutEditOptMsg' + +@Component +export default struct SimpleToggleLayoutEditComponent { + private mDisplayingToggles: string[] = [] + private mHidingToggles: string[] = [] + private mDefaultDisplayToggles: string[] = [] + @Prop mColumnCount: number + private simpleToggleLayoutEditEndCallback: () => void + private onSaveDisplayingToggles: (toggles: string[]) => void + @State mNewDisplayingToggles: string[] = [] + @State mNewHidingToggles: string[] = [] + @State style: any = StyleConfiguration.getSimpleToggleLayoutEditComponentStyle() + @State mOptMsg: Resource = $r('app.string.control_center_simple_toggle_layout_edit_opt_desc') + private mDisplayingTogglesMaxCount: number = Constants.SIMPLE_TOGGLE_LAYOUT_MAX_TOGGLE_COUNT + private mDisplayingTogglesMinCount: number = Constants.SIMPLE_TOGGLE_LAYOUT_MIN_TOGGLE_COUNT + private mHidingTogglesMaxCount: number = 0 + private mHidingTogglesMinCount: number = 0 + @State mCurrentDragToggleName: string = '' + private titleDisplayInside: boolean = false + private backDialogController: CustomDialogController = new CustomDialogController({ + builder: SimpleToggleLayoutEditDialogComponent({ + title: $r("app.string.control_center_simple_toggle_layout_edit_back_confirm"), + leftButton: $r("app.string.control_center_simple_toggle_layout_edit_back_confirm_primary"), + rightButton: $r("app.string.control_center_simple_toggle_layout_edit_back_confirm_secondary"), + leftAction: () => this.callSimpleToggleLayoutEditEnd(), + rightAction: () => this.onFinishBtnClick(null), + }), + autoCancel: false, + offset: { dx: 0, dy: 0 }, + customStyle: true + }); + private resetDialogController: CustomDialogController = new CustomDialogController({ + builder: SimpleToggleLayoutEditDialogComponent({ + title: $r("app.string.control_center_simple_toggle_layout_edit_reset_confirm"), + leftButton: $r("app.string.control_center_simple_toggle_layout_edit_reset_confirm_primary"), + rightButton: $r("app.string.control_center_simple_toggle_layout_edit_reset_confirm_secondary"), + leftAction: () => { + }, + rightAction: () => this.editResetConfirm(), + }), + autoCancel: false, + offset: { dx: 0, dy: 0 }, + customStyle: true + }); + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear') + this.mNewDisplayingToggles = [...this.mDisplayingToggles] + this.mNewHidingToggles = [...this.mHidingToggles] + let allTogglesCount = this.mNewDisplayingToggles.length + this.mNewHidingToggles.length + this.mHidingTogglesMaxCount = allTogglesCount - this.mDisplayingTogglesMinCount + if (this.mHidingTogglesMaxCount < 0) { + this.mHidingTogglesMaxCount = 0 + } + this.mHidingTogglesMinCount = allTogglesCount - this.mDisplayingTogglesMaxCount + if (this.mHidingTogglesMinCount < 0) { + this.mHidingTogglesMinCount = 0 + } + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear ') + } + + build() { + Column() { + Column() + .width('100%') + .height(this.style.marginTop) + + if (!this.titleDisplayInside) { + Column() { + SimpleToggleLayoutEditUpTitle({ + simpleToggleLayoutEditEndCallback: () => this.onSimpleToggleLayoutEditEnd() + }) + } + .width('100%') + .height(this.style.titleHeight) + + Column() + .width('100%') + .height(this.style.titleMarginBottom) + } + + Row() { + Column().width(this.style.marginLeft).height(1).layoutWeight(0) + Column() { + if (this.titleDisplayInside) { + Column() { + SimpleToggleLayoutEditUpTitle({ + simpleToggleLayoutEditEndCallback: () => this.onSimpleToggleLayoutEditEnd() + }) + } + .width('100%') + .height(this.style.titleHeight) + } + Column() { + Column() + .width('100%') + .height(this.style.upGridMarginTop) + + Row() { + Column().width(this.style.gridMarginLeft).height(1).layoutWeight(0) + Column() { + SimpleToggleLayoutEditGrid({ + mToggles: $mNewDisplayingToggles, + mMaxCount: this.mDisplayingTogglesMaxCount, + mMinCount: this.mDisplayingTogglesMinCount, + mColumnCount: this.mColumnCount, + mGlobalDragToggleName: this.mCurrentDragToggleName, + gridTag: 'displaying', + onItemDragStart: (toggleName) => this.onDisplayingGridItemDragStart(toggleName), + onItemDrop: (status) => this.onDisplayingGridItemDrop(status) + }) + }.layoutWeight(1) + + Column().width(this.style.gridMarginRight).height(1).layoutWeight(0) + }.width('100%') + + Column() + .width('100%') + .height(this.style.upGridMarginBottom) + } + .width('100%') + + Column() { + Column() + .width('100%') + .height(this.style.msgMarginTop) + + SimpleToggleLayoutEditOptMsg({ + mOptMsg: $mOptMsg + }) + Column() + .width('100%') + .height(this.style.msgMarginBottom) + + Row() { + Column().width(this.style.gridMarginLeft).height(1).layoutWeight(0) + Column() { + SimpleToggleLayoutEditGrid({ + mToggles: $mNewHidingToggles, + mMaxCount: this.mHidingTogglesMaxCount, + mMinCount: this.mHidingTogglesMinCount, + mColumnCount: this.mColumnCount, + mGlobalDragToggleName: this.mCurrentDragToggleName, + gridTag: 'hiding', + onItemDragStart: (toggleName) => this.onHidingGridItemDragStart(toggleName), + onItemDrop: (status) => this.onHidingGridItemDrop(status) + }) + }.layoutWeight(1) + + Column().width(this.style.gridMarginRight).height(1).layoutWeight(0) + }.width('100%') + + Column() + .width('100%') + .height(this.style.btnMarginTop) + + Row() { + Column().width(this.style.editBtnMarginLeft).height(1).layoutWeight(0) + Grid() { + GridItem() { + Button({ type: ButtonType.Capsule, stateEffect: true }) { + Text($r("app.string.control_center_simple_toggle_layout_edit_reset")) + .fontColor(this.style.editBtnFontColor) + .fontSize(this.style.editBtnFontSize) + } + .backgroundColor(this.style.editBtnBgColor) + .width('100%') + .height('100%') + .onClick(this.onResetBtnClick.bind(this)) + } + + GridItem() { + Button({ type: ButtonType.Capsule, stateEffect: true }) { + Text($r("app.string.control_center_simple_toggle_layout_edit_finish")) + .fontColor(this.style.editBtnFontColor) + .fontSize(this.style.editBtnFontSize) + } + .backgroundColor(this.style.editBtnBgColor) + .width('100%') + .height('100%') + .onClick(this.onFinishBtnClick.bind(this)) + } + } + .layoutWeight(1) + .height(this.style.editBtnHeight) + .columnsTemplate('1fr 1fr') + .rowsTemplate('1fr') + .columnsGap(this.style.editBtnSpace) + + Column().width(this.style.editBtnMarginRight).height(1).layoutWeight(0) + } + .width('100%') + + Column() + .width('100%') + .height(this.style.btnMarginBottom) + } + .width('100%') + .backgroundColor(this.style.downAreaBgColor) + + } + .layoutWeight(1) + .borderRadius(this.style.borderRadius) + .backgroundColor(this.style.upAreaBgColor) + .clip(true) + + Column().width(this.style.marginRight).height(1).layoutWeight(0) + }.width('100%') + + } + .width('100%') + .onTouch(this.onComponentTouch.bind(this)) + } + + onSimpleToggleLayoutEditEnd() { + Log.showInfo(TAG, `onSimpleToggleLayoutEditEnd`) + let changed = JSON.stringify(this.mDisplayingToggles) != JSON.stringify(this.mNewDisplayingToggles) + Log.showInfo(TAG, `onSimpleToggleLayoutEditEnd, changed: ${changed}`) + if (changed) { + this.backDialogController.open() + } else { + this.callSimpleToggleLayoutEditEnd() + } + } + + callSimpleToggleLayoutEditEnd() { + Log.showInfo(TAG, `callSimpleToggleLayoutEditEnd`) + if (this.simpleToggleLayoutEditEndCallback) { + this.simpleToggleLayoutEditEndCallback() + } + } + + onResetBtnClick(event: ClickEvent) { + Log.showInfo(TAG, `onResetBtnClick`) + let equalDefault = JSON.stringify(this.mDefaultDisplayToggles) == JSON.stringify(this.mNewDisplayingToggles) + Log.showInfo(TAG, `onResetBtnClick, equalDefault: ${equalDefault}`) + if (!equalDefault) { + this.resetDialogController.open() + } + } + + editResetConfirm() { + Log.showInfo(TAG, `editResetConfirm`) + this.resetData() + this.callSaveDisplayingToggles() + } + + resetData(): void{ + Log.showInfo(TAG, `resetData`) + let tempDisplayingToggles: string[] = [...this.mDefaultDisplayToggles] + let tempHidingToggles: string[] = [] + this.mDisplayingToggles.forEach((toggleName) => { + if (tempDisplayingToggles.indexOf(toggleName) < 0) { + tempHidingToggles.push(toggleName) + } + }) + this.mHidingToggles.forEach((toggleName) => { + if (tempDisplayingToggles.indexOf(toggleName) < 0) { + tempHidingToggles.push(toggleName) + } + }) + this.mNewDisplayingToggles = tempDisplayingToggles + this.mNewHidingToggles = tempHidingToggles + this.mDisplayingToggles = [...tempDisplayingToggles] + this.mHidingToggles = [...tempHidingToggles] + Log.showInfo(TAG, `resetData, mNewDisplayingToggles: ${JSON.stringify(this.mNewDisplayingToggles)}`) + Log.showInfo(TAG, `resetData, mNewHidingToggles: ${JSON.stringify(this.mNewHidingToggles)}`) + } + + onFinishBtnClick(event: ClickEvent) { + Log.showInfo(TAG, `onFinishBtnClick`) + let changed = JSON.stringify(this.mDisplayingToggles) != JSON.stringify(this.mNewDisplayingToggles) + Log.showInfo(TAG, `onFinishBtnClick, changed: ${changed}`) + if (changed) { + this.callSaveDisplayingToggles() + } + this.callSimpleToggleLayoutEditEnd() + } + + callSaveDisplayingToggles(): void{ + Log.showInfo(TAG, `callSaveDisplayingToggles`) + if (this.onSaveDisplayingToggles) { + this.onSaveDisplayingToggles(this.mNewDisplayingToggles) + } + } + + async onDisplayingGridItemDragStart(toggleName: string): Promise { + Log.showInfo(TAG, `onDisplayingGridItemDragStart, toggleName: ${toggleName}`) + this.mCurrentDragToggleName = toggleName + this.setOptMsg(toggleName) + } + + async onDisplayingGridItemDrop(status: string): Promise { + Log.showInfo(TAG, `onDisplayingGridItemDrop, status: ${status}`) + this.setOptMsg(null) + } + + async onHidingGridItemDragStart(toggleName: string): Promise { + Log.showInfo(TAG, `onHidingGridItemDragStart, toggleName: ${toggleName}`) + this.mCurrentDragToggleName = toggleName + this.setOptMsg(toggleName) + } + + async onHidingGridItemDrop(status: string): Promise { + Log.showInfo(TAG, `onHidingGridItemDrop, status: ${status}`) + this.setOptMsg(null) + } + + setOptMsg(toggleName: string): void { + Log.showInfo(TAG, `setOptMsg, toggleName: ${toggleName}`) + if (!toggleName || toggleName.length == 0) { + this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_desc') + return + } + if (this.mNewDisplayingToggles.indexOf(toggleName) >= 0) { + if (this.mNewDisplayingToggles.length <= this.mDisplayingTogglesMinCount) { + this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_min', this.mDisplayingTogglesMinCount.toString()) + } else { + this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_drag') + } + } else if (this.mNewHidingToggles.indexOf(toggleName) >= 0) { + if (this.mNewDisplayingToggles.length >= this.mDisplayingTogglesMaxCount) { + this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_max', this.mDisplayingTogglesMaxCount.toString()) + } else { + this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_drag') + } + } + } + + onComponentTouch(event: TouchEvent) { + Log.showInfo(TAG, `onComponentTouch`) + event.stopPropagation() + } +} + +@Component +struct SimpleToggleLayoutEditUpTitle { + private simpleToggleLayoutEditEndCallback: Function + @State style: any = StyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle() + + aboutToAppear() { + Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToAppear') + } + + aboutToDisappear() { + Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToDisappear ') + } + + build() { + Row() { + Row() + .width(this.style.marginLeft) + .height('100%') + Image($r('app.media.ic_public_back')) + .objectFit(ImageFit.Contain) + .size({ width: this.style.imageWidth, + height: this.style.imageHeight }) + .fillColor(this.style.fontColor) + .onClick(this.backClick.bind(this)) + Row() + .width(this.style.editTitleSpace) + .height('100%') + Text($r('app.string.control_center_simple_toggle_layout_edit')) + .fontColor(this.style.fontColor) + .fontSize(this.style.titleFontSize) + .fontWeight(FontWeight.Bold) + }.width('100%') + .height('100%') + } + + backClick(event: ClickEvent) { + Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, `backClick, event: ${JSON.stringify(event)}`) + this.simpleToggleLayoutEditEndCallback() + } +} + +@Component +struct SimpleToggleLayoutEditOptMsg { + @Link mOptMsg: Resource + @State style: any = StyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle() + + aboutToAppear() { + Log.showInfo(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToAppear') + } + + aboutToDisappear() { + Log.showInfo(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToDisappear ') + } + + build() { + Row() { + Column().width(this.style.marginLeftRight).height(1).layoutWeight(0) + Column() { + Text(this.mOptMsg) + .fontSize(this.style.fontSize) + .fontColor(this.style.fontColor) + }.layoutWeight(1) + + Column().width(this.style.marginLeftRight).height(1).layoutWeight(0) + } + .width('100%') + .height(this.style.height) + } +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets new file mode 100644 index 00000000..b9f262f4 --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import StyleConfiguration from '../common/StyleConfiguration' + +const TAG = 'Control-SimpleToggleLayoutEditDialogComponent'; + +@CustomDialog +export default struct SimpleToggleLayoutEditDialogComponent { + private title: Resource + private leftButton: Resource + private rightButton: Resource + private controller: CustomDialogController + private leftAction: () => void + private rightAction: () => void + @State style: any = StyleConfiguration.getControlEditDialogStyle() + + build() { + Column() { + Row().height(this.style.editDialogFontMarginTop).layoutWeight(0).width(1) + Row() { + Column() { + Text(this.title) + .fontSize(this.style.editDialogFontSize) + }.layoutWeight(1) + }.width('100%') + .height(this.style.editDialogFontHeight) + + Row().width('100%').height(this.style.editDialogBtnMarginTop) + + Row() { + Column().width(this.style.editDialogBtnMarginLF).height(1).layoutWeight(0) + Row() { + Column() { + Button({ type: ButtonType.Capsule, stateEffect: true }) { + Text(this.leftButton) + .fontColor(this.style.editDialogBtnFontColor) + .fontSize(this.style.editDialogButtonSize) + } + .backgroundColor(this.style.editDialogBtnBgColor) + .width('100%') + .height('100%') + .onClick(() => { + Log.showInfo(TAG, `left button on click`) + if (this.leftAction) { + this.leftAction() + } + this.controller.close(); + }) + }.width(this.style.editDialogBtnWidth) + + Divider() + .vertical(true) + .color(this.style.editDialogDividerColor) + .strokeWidth(this.style.editDialogDividerWidth) + .height(this.style.editDialogDividerHeight) + + Column() { + Button({ type: ButtonType.Capsule, stateEffect: true }) { + Text(this.rightButton) + .fontColor(this.style.editDialogBtnFontColor) + .fontSize(this.style.editDialogButtonSize) + } + .backgroundColor(this.style.editDialogBtnBgColor) + .width('100%') + .height('100%') + .onClick(() => { + Log.showInfo(TAG, `right button on click`) + if (this.rightAction) { + this.rightAction() + } + this.controller.close(); + }) + }.width(this.style.editDialogBtnWidth) + } + .height(this.style.editDialogButtonHeight) + + Column().width(this.style.editDialogBtnMarginLF).height(1).layoutWeight(0) + } + .width('100%') + + Row().width('100%').height(this.style.editDialogBtnMarginTop) + }.height(this.style.editDialogHeight) + .width(this.style.editDialogWidth) + .backgroundColor(this.style.editDialogColor) + .border({ width: 1, color: this.style.editDialogColor, + radius: this.style.editDialogRadius }) + } +} diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets new file mode 100644 index 00000000..d8f214b9 --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import SimpleToggleLoadComponent from './SimpleToggleLoadComponent' +import StyleConfiguration from '../common/StyleConfiguration' + +const TAG = 'Control-SimpleToggleLayoutEditGrid' + +@Component +export default struct SimpleToggleLayoutEditGrid { + @Link mToggles: string[] + private mMaxCount: number = 0 + private mMinCount: number = 0 + @Prop mColumnCount: number + @Prop mGlobalDragToggleName: string + private gridTag: string = '' + private logTag: string = '' + private onItemDragStart: (toggleName: string) => void + private onItemDrop: (status: string) => void + @State style: any = StyleConfiguration.getSimpleToggleLayoutEditGridStyle() + private mCurrentDragToggleName: string = '' + + @Builder DragComponent() { + Column() { + SimpleToggleLoadComponent({ + keyId: this.mCurrentDragToggleName, + mEditMode: true, + mDragMode: true, + }) + } + .width(this.style.dragBgSize) + .height(this.style.dragBgSize) + } + + aboutToAppear() { + this.logTag = TAG + '-' + this.gridTag + Log.showInfo(this.logTag, this.gridTag + 'aboutToAppear') + } + + aboutToDisappear() { + Log.showInfo(this.logTag, 'aboutToDisappear ') + } + + build() { + + Grid() { + ForEach(this.mToggles, (componentName: string) => { + GridItem() { + Column() { + SimpleToggleLoadComponent({ + keyId: componentName, + mEditMode: true + }) + }.width('100%') + .height('100%') + } + }, (componentName: string) => componentName) + if (this.mToggles.length == 0) { + GridItem() { + } + } + } + .width('100%') + .columnsTemplate(this.calcColumnsTemplate(this.mColumnCount)) + .editMode(true) + .maxCount(this.calcMaxRowCount(this.mMaxCount, this.mColumnCount)) + .minCount(this.calcMinRowCount(this.mMinCount, this.mColumnCount)) + .cellLength(this.style.rowHeight) + .rowsGap(this.style.rowGap + 'px') + .columnsGap(this.style.columnGap) + .layoutDirection(1) + .direction(0) + .onItemDragEnter(this.onItemDragEnter.bind(this)) + .onItemDragMove(this.onItemDragMove.bind(this)) + .onItemDragLeave(this.onItemDragLeave.bind(this)) + .onItemDragStart((event, itemIndex) => { + this.onGridItemDragStart(event, itemIndex) + return this.DragComponent + }) + .onItemDrop(this.onGridItemDrop.bind(this)) + } + + calcColumnsTemplate(columnCount: number): string{ + Log.showInfo(this.logTag, `calcColumnsTemplate, columnCount: ${columnCount}`) + let columnsTemplate = '1fr' + for (let i = 1;i < columnCount; i++) { + columnsTemplate += ' 1fr' + } + Log.showInfo(this.logTag, `calcColumnsTemplate, columnsTemplate: ${columnsTemplate}`) + return columnsTemplate + } + + calcMaxRowCount(maxCount: number, columnCount: number): number{ + Log.showInfo(this.logTag, `calcMaxRowCount, maxCount: ${maxCount} columnCount: ${columnCount}`) + let maxRowCount = Math.ceil(maxCount / columnCount) + if (maxRowCount < 1) { + maxRowCount = 1 + } + Log.showInfo(this.logTag, `calcMaxRowCount, maxRowCount: ${maxRowCount}`) + return maxRowCount + } + + calcMinRowCount(minCount: number, columnCount: number): number{ + Log.showInfo(this.logTag, `calcMinRowCount, minCount: ${minCount} columnCount: ${columnCount}`) + let minRowCount = Math.ceil(minCount / columnCount) + if (minRowCount < 1) { + minRowCount = 1 + } + Log.showInfo(this.logTag, `calcMinRowCount, minRowCount: ${minRowCount}`) + return minRowCount + } + + onItemDragEnter(event) { + Log.showInfo(this.logTag, `onItemDragEnter, event: ${JSON.stringify(event)}`) + } + + onItemDragMove(event, itemIndex, insertIndex) { + Log.showInfo(this.logTag, `onItemDragMove, itemIndex: ${itemIndex} insertIndex: ${insertIndex} event: ${JSON.stringify(event)}`) + } + + onItemDragLeave(event, itemIndex) { + Log.showInfo(this.logTag, `onItemDragLeave, itemIndex: ${itemIndex} event: ${JSON.stringify(event)}`) + } + + onGridItemDragStart(event, itemIndex) { + Log.showInfo(this.logTag, `onGridItemDragStart, itemIndex: ${itemIndex} event: ${JSON.stringify(event)}`) + this.mCurrentDragToggleName = this.mToggles[itemIndex] + if (this.onItemDragStart) { + this.onItemDragStart(this.mCurrentDragToggleName) + } + Log.showInfo(this.logTag, `onGridItemDragStart, mCurrentDragToggleName: ${this.mCurrentDragToggleName}`) + } + + onGridItemDrop(event, itemIndex, insertIndex, isSuccess) { + Log.showInfo(this.logTag, `onGridItemDrop, itemIndex: ${itemIndex} insertIndex: ${insertIndex} isSuccess: ${isSuccess} event: ${JSON.stringify(event)}`) + if (!isSuccess) { + this.callOnItemDrop('fail') + return + } + if (itemIndex == insertIndex) { + this.callOnItemDrop('cancel') + return + } + let status = 'success' + let currentDragToggleName = this.mCurrentDragToggleName + let globalDragToggleName = this.mGlobalDragToggleName + Log.showInfo(this.logTag, `onItemDrop, currentDragToggleName: ${currentDragToggleName}`) + Log.showInfo(this.logTag, `onItemDrop, globalDragToggleName: ${globalDragToggleName}`) + if (itemIndex >= 0 && insertIndex >= 0) { // move + Log.showInfo(this.logTag, `onItemDrop, move`) + if (itemIndex > insertIndex) { + this.mToggles.splice(insertIndex, 0, currentDragToggleName) + this.mToggles.splice(itemIndex + 1, 1) + } else { + this.mToggles.splice(insertIndex + 1, 0, currentDragToggleName) + this.mToggles.splice(itemIndex, 1) + } + } else if (itemIndex == -1 && insertIndex >= 0) { // insert + Log.showInfo(this.logTag, `onItemDrop, insert`) + if (this.mToggles.length < this.mMaxCount) { + this.mToggles.splice(insertIndex, 0, globalDragToggleName) + } else { + this.mToggles = JSON.parse(JSON.stringify(this.mToggles)) + status = 'cancel' + } + } else if (itemIndex >= 0 && insertIndex == -1) { // delete + Log.showInfo(this.logTag, `onItemDrop, delete`) + if (this.mToggles.length > this.mMinCount) { + this.mToggles.splice(itemIndex, 1) + } else { + this.mToggles = JSON.parse(JSON.stringify(this.mToggles)) + status = 'cancel' + } + } + this.callOnItemDrop(status) + } + + callOnItemDrop(status: string): void { + Log.showInfo(this.logTag, `callOnItemDrop, status: ${status}`) + if (this.onItemDrop) { + this.onItemDrop(status) + } + this.mCurrentDragToggleName = '' + } +} diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets index 7bc76803..dc5dc946 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,23 +13,23 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import LocationComponent from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets' -import RingModeComponent from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets' -import Constants from '../common/Constants.ets' -import SimpleToggleComponent from './SimpleToggleComponent.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants' +import LocationComponent from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent' +import RingModeComponent from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent' +import SimpleToggleComponent from './SimpleToggleComponent' const TAG = 'SimpleToggleLoadComponent' @Component export default struct SimpleToggleLoadComponent { - @Prop keyId: string - @Prop mShowLabel: boolean - @Prop mEditMode: boolean + private keyId: string + private mEditMode: boolean = false + private mDragMode: boolean = false aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) - Log.showInfo(TAG, `aboutToAppear Start, mShowLabel: ${this.mShowLabel} mEditMode: ${this.mEditMode}`) + Log.showInfo(TAG, `aboutToAppear Start, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode}`) } aboutToDisappear() { @@ -38,25 +38,26 @@ export default struct SimpleToggleLoadComponent { build() { Column() { - if (this.keyId == Constants.LOCATION) { + if (this.keyId == FASlotName.LOCATION) { LocationComponent({ keyId: this.keyId, - mShowLabel: this.mShowLabel, - mEditMode: this.mEditMode + mEditMode: this.mEditMode, + mDragMode: this.mDragMode, }) - } else if (this.keyId == Constants.RING_MODE) { + } else if (this.keyId == FASlotName.RING_MODE) { RingModeComponent({ keyId: this.keyId, - mShowLabel: this.mShowLabel, - mEditMode: this.mEditMode + mEditMode: this.mEditMode, + mDragMode: this.mDragMode, }) } else { SimpleToggleComponent({ keyId: this.keyId, - mShowLabel: this.mShowLabel, - mEditMode: this.mEditMode + mEditMode: this.mEditMode, + mDragMode: this.mDragMode, }) } - } + }.width('100%') + .height('100%') } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets index e28d54d5..7fae5b5a 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,59 +13,137 @@ * limitations under the License. */ -import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; -import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -const TAG = 'Control-UpTitle' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" +import Constants from '../common/Constants' +import StyleConfiguration from '../common/StyleConfiguration' -let mWindowManager; -let mFeatureAbilityManager; +const TAG = 'Control-UpTitle' @Component -export -struct UpTitle { - @Link showStatusBar: boolean +export default struct UpTitle { + private touchMoveCallback: Function + private simpleToggleLayoutEditStartCallback: Function + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 + @State mSettingIsHover: boolean = false + @State mEditIsHover: boolean = false + @State style: any = StyleConfiguration.getControlCenterUpTitleStyle() aboutToAppear() { - Log.showInfo(TAG,'aboutToAppear'); - mWindowManager = new WindowManager(); - mFeatureAbilityManager = new FeatureAbilityManager(); + Log.showInfo(TAG, 'aboutToAppear'); } - aboutToDisappear () { - Log.showInfo(TAG,'aboutToDisappear') + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') } build() { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.End, justifyContent: FlexAlign.SpaceBetween }) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Row() + .width(this.style.marginLeft) + .height('100%') Text($r('app.string.control_center')) - .fontColor($r('app.color.title_font_color')) - .fontSize($r('app.float.title_font_size')) + .fontColor(this.style.fontColor) + .fontSize(this.style.fontSize) + .fontWeight(FontWeight.Bold) } .height('100%') Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - Image($r('app.media.ic_settings')) - .objectFit(ImageFit.Contain) - .size({ width: $r('app.float.notification_settings_width'), - height: $r('app.float.notification_settings_height') }) - .onClick(this.settingClick.bind(this)) + Stack() { + Flex() + .backgroundColor(this.mSettingIsHover ? this.style.imageHoverColor : this.style.imageTransparentColor) + .clip(new Rect({ + width: this.style.imageHoverWidth, + height: this.style.imageHoverHeight + }).radius(this.style.imageHoverRadius)) + .width(this.style.imageHoverWidth) + .height(this.style.imageHoverHeight) + Image($r('app.media.ic_public_settings')) + .objectFit(ImageFit.Contain) + .size({ width: this.style.imageWidth, + height: this.style.imageHeight }) + .fillColor(this.style.titleImageColor) + .onClick(this.settingClick.bind(this)) + .onHover((isHover) => { + this.mSettingIsHover = isHover; + }) + } + .width(this.style.imageHoverWidth) + .height(this.style.imageHoverHeight) + + Row() + .width(this.style.upTitleSpace) + .height('100%') + Stack() { + Flex() + .backgroundColor(this.mEditIsHover ? this.style.imageHoverColor : this.style.imageTransparentColor) + .clip(new Rect({ + width: this.style.imageHoverWidth, + height: this.style.imageHoverHeight + }).radius(this.style.imageHoverRadius)) + .width(this.style.imageHoverWidth) + .height(this.style.imageHoverHeight) + Image($r('app.media.ic_public_edit')) + .objectFit(ImageFit.Contain) + .size({ width: this.style.imageWidth, + height: this.style.imageHeight }) + .fillColor(this.style.titleImageColor) + .onClick(this.editClick.bind(this)) + .onHover((isHover) => { + this.mEditIsHover = isHover; + }) + } + .width(this.style.imageHoverWidth) + .height(this.style.imageHoverHeight) + + Row() + .width(this.style.marginRight) + .height('100%') } .height('100%') - } + .width('100%') + .height('100%') + .onTouch(this.touchEvent.bind(this)) } settingClick() { - this.showStatusBar = true; - mWindowManager.setWindowMin((result)=>{ - mFeatureAbilityManager.openAbility(TAG, { - want: { - bundleName: 'com.ohos.settings', - abilityName: 'com.ohos.settings.MainAbility', + Log.showInfo(TAG, `settingClick`) + EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.MainAbility')) + } + + editClick() { + Log.showInfo(TAG, `editClick`) + if (this.simpleToggleLayoutEditStartCallback) { + this.simpleToggleLayoutEditStartCallback() + } + } + + touchEvent(event: TouchEvent) { + if (event.type == Constants.TOUCHTYPE_DOWN) { + this.startX = event.touches[0].screenX + this.startY = event.touches[0].screenY + Log.showInfo(TAG, `quicklySetting touchStart2=======startX: ${this.startX}, startY: ${this.startY}`) + } else if (event.type == Constants.TOUCHTYPE_MOVE) { + this.moveX = event.touches[0].screenX - this.startX + this.moveY = event.touches[0].screenY - this.startY + } else if (event.type == Constants.TOUCHTYPE_UP) { + Log.showInfo(TAG, `quicklySetting touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`) + if (this.moveX < -30) { + if (this.touchMoveCallback) { + this.touchMoveCallback({ 'direction': 'left' }) } - }); - }); + } else if (this.moveX > 30) { + if (this.touchMoveCallback) { + this.touchMoveCallback({ 'direction': 'right' }) + } + } + } } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts new file mode 100644 index 00000000..b9992ce0 --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import {ControlComponentData} from '../common/Constants'; +import ControlCenterService from '../model/ControlCenterService'; + +export const ControlCenterComplexToggleLayoutKey = "ControlCenterComplexToggleLayout"; + +export const ControlCenterSimpleToggleLayoutKey = "ControlCenterSimpleToggleLayout"; + +const TAG = 'ControlCenterVM'; + +export class ControlCenterVM { + mIsStart: boolean = false; + mComplexToggleLayout: any; + mSimpleToggleLayout: any; + + constructor() { + Log.showInfo(TAG, `constructor`) + this.mComplexToggleLayout = AppStorage.SetAndLink(ControlCenterComplexToggleLayoutKey, []); + this.mSimpleToggleLayout = AppStorage.SetAndLink(ControlCenterSimpleToggleLayoutKey, []); + ControlCenterService.registerListener(this); + } + + initViewModel(config) { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)} `) + this.mIsStart = true; + + ControlCenterService.startService(config); + } + + setComplexToggleLayout(layout: string[]): void{ + Log.showInfo(TAG, `setComplexToggleLayout, layout: ${JSON.stringify(layout)}`) + if (JSON.stringify(layout) != JSON.stringify(this.mComplexToggleLayout.get())) { + this.mComplexToggleLayout.set(layout); + } + Log.showInfo(TAG, `setComplexToggleLayout, mComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`) + } + + setSimpleToggleLayout(layout: string[]): void{ + Log.showInfo(TAG, `setSimpleToggleLayout, layout: ${JSON.stringify(layout)}`) + if (JSON.stringify(layout) != JSON.stringify(this.mSimpleToggleLayout.get())) { + this.mSimpleToggleLayout.set(layout); + } + Log.showInfo(TAG, `setSimpleToggleLayout, mSimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`) + } + + setItemData(id: string, itemData: ControlComponentData): void{ + Log.showInfo(TAG, `setItemData, id: ${id} itemData: ${JSON.stringify(itemData)}`) + let storageKey: string = 'ControlCenter_' + id; + if (itemData) { + AppStorage.SetOrCreate(storageKey, itemData); + } else { + let deleteRs: boolean = AppStorage.Delete(storageKey); + Log.showInfo(TAG, `setItemData, AppStorage.Delete rs: ${deleteRs} `) + } + } + + getDisplayingSimpleToggles(): string[]{ + Log.showInfo(TAG, `getDisplayingSimpleToggles`) + let simpleToggles = this.mSimpleToggleLayout.get(); + Log.showInfo(TAG, `getDisplayingSimpleToggles, simpleToggles: ${JSON.stringify(simpleToggles)}`) + return simpleToggles; + } + + getHidingSimpleToggles(): string[] { + Log.showInfo(TAG, `getHidingSimpleToggles`) + return ControlCenterService.getHidingSimpleToggles(); + } + + getDefaultSimpleToggleLayout() { + Log.showInfo(TAG, `getDefaultSimpleToggleLayout`) + return ControlCenterService.getDefaultSimpleToggleLayout(); + } + + saveSimpleToggleLayout(layout: string[]): void{ + Log.showInfo(TAG, `saveSimpleToggleLayout, layout: ${JSON.stringify(layout)}`) + ControlCenterService.saveSimpleToggleLayout(layout); + } +} + +let sControlCenterVM = createOrGet(ControlCenterVM, TAG); + +export default sControlCenterVM as ControlCenterVM; \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/base/element/color.json b/features/controlcentercomponent/src/main/resources/base/element/color.json index 09f83ab3..3aca4f9d 100644 --- a/features/controlcentercomponent/src/main/resources/base/element/color.json +++ b/features/controlcentercomponent/src/main/resources/base/element/color.json @@ -1,16 +1,56 @@ { "color": [ { - "name": "default_background", - "value": "#66000000" + "name": "control_center_title_font_color", + "value": "#FFFFFF" }, { - "name": "default_font_color", - "value": "#ffffffff" + "name": "control_center_title_image_color", + "value": "#FFFFFF" }, { - "name": "title_font_color", - "value": "#FFF" + "name": "control_center_title_icon_hover_color", + "value": "rgba(0, 0, 0, 0.05)" + }, + { + "name": "control_center_title_icon_transparent_color", + "value": "rgba(255, 255, 255, 0)" + }, + { + "name": "control_center_component_background", + "value": "#99FFFFFF" + }, + { + "name": "center_edit_up_area_bg_color", + "value": "#99FFFFFF" + }, + { + "name": "center_edit_down_area_bg_color", + "value": "#4DFFFFFF" + }, + { + "name": "simple_toggle_edit_btn_font_color", + "value": "#FF0000FF" + }, + { + "name": "simple_toggle_edit_btn_bg_color", + "value": "#0D000000" + }, + { + "name": "simple_toggle_edit_title_font_color", + "value": "#FFFFFFFF" + }, + { + "name": "center_edit_dialog_color", + "value": "#FFFFFFFF" + }, + { + "name": "center_edit_dialog_btn_font_color", + "value": "#FF0000FF" + }, + { + "name": "center_edit_dialog_btn_bg_color", + "value": "#00FFFFFF" } ] } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/base/element/float.json b/features/controlcentercomponent/src/main/resources/base/element/float.json index e7def617..1b9223b5 100644 --- a/features/controlcentercomponent/src/main/resources/base/element/float.json +++ b/features/controlcentercomponent/src/main/resources/base/element/float.json @@ -1,35 +1,260 @@ { "float": [ { - "name": "icon_item_fontsize", - "value": "18" - },{ - "name": "up_title_height", - "value": "83" - },{ - "name": "center_item_margin_top", - "value": "20" - },{ - "name": "center_item_margin_left", - "value": "10" - },{ - "name": "center_item_margin_right", - "value": "10" - },{ - "name": "complex_toggle_height", - "value": "120" - },{ - "name": "vol_height", - "value": "66" - },{ - "name": "title_font_size", - "value": "35" - },{ - "name": "notification_settings_width", - "value": "60" - },{ - "name": "notification_settings_height", - "value": "60" + "name": "control_center_margin_left", + "value": "48vp" + }, + { + "name": "control_center_margin_right", + "value": "48vp" + }, + { + "name": "control_center_margin_top", + "value": "33vp" + }, + { + "name": "control_center_title_height", + "value": "127vp" + }, + { + "name": "control_center_title_margin_bottom", + "value": "0vp" + }, + { + "name": "control_center_toggle_area_gap", + "value": "24vp" + }, + { + "name": "control_center_component_border_radius", + "value": "48vp" + }, + { + "name": "control_center_simple_toggle_layout_margin_top", + "value": "48vp" + }, + { + "name": "control_center_simple_toggle_layout_margin_bottom", + "value": "20vp" + }, + { + "name": "control_center_brightness_margin_bottom", + "value": "44vp" + }, + { + "name": "control_center_complex_toggle_column_gap", + "value": "24vp" + }, + { + "name": "control_center_simple_toggle_layout_margin_left", + "value": "22vp" + }, + { + "name": "control_center_simple_toggle_layout_margin_right", + "value": "22vp" + }, + { + "name": "control_center_simple_toggle_column_gap", + "value": "0vp" + }, + { + "name": "control_center_title_space", + "value": "36vp" + }, + { + "name": "control_center_title_font_size", + "value": "40fp" + }, + { + "name": "control_center_title_icon_width", + "value": "48vp" + }, + { + "name": "control_center_title_icon_height", + "value": "48vp" + }, + { + "name": "control_center_title_icon_hover_width", + "value": "64vp" + }, + { + "name": "control_center_title_icon_hover_height", + "value": "64vp" + }, + { + "name": "control_center_title_icon_hover_radius", + "value": "16vp" + }, + { + "name": "control_center_title_margin_left", + "value": "72vp" + }, + { + "name": "control_center_title_margin_right", + "value": "30vp" + }, + { + "name": "simple_toggle_edit_margin_left", + "value": "48vp" + }, + { + "name": "simple_toggle_edit_margin_right", + "value": "48vp" + }, + { + "name": "simple_toggle_edit_margin_top", + "value": "33vp" + }, + { + "name": "simple_toggle_edit_title_height", + "value": "127vp" + }, + { + "name": "simple_toggle_edit_title_margin_bottom", + "value": "0vp" + }, + { + "name": "simple_toggle_edit_up_grid_margin_top", + "value": "48vp" + }, + { + "name": "simple_toggle_edit_up_grid_margin_bottom", + "value": "24vp" + }, + { + "name": "simple_toggle_edit_msg_margin_top", + "value": "0vp" + }, + { + "name": "simple_toggle_edit_msg_margin_bottom", + "value": "0vp" + }, + { + "name": "simple_toggle_edit_btn_margin_top", + "value": "24vp" + }, + { + "name": "simple_toggle_edit_btn_margin_bottom", + "value": "32vp" + }, + { + "name": "simple_toggle_edit_btn_margin_left", + "value": "32vp" + }, + { + "name": "simple_toggle_edit_btn_margin_right", + "value": "32vp" + }, + { + "name": "simple_toggle_edit_btn_height", + "value": "80vp" + }, + { + "name": "simple_toggle_edit_btn_space", + "value": "32vp" + }, + { + "name": "simple_toggle_edit_border_radius", + "value": "48vp" + }, + { + "name": "simple_toggle_edit_title_margin_left", + "value": "72vp" + }, + { + "name": "simple_toggle_edit_title_icon_width", + "value": "40vp" + }, + { + "name": "simple_toggle_edit_title_icon_height", + "value": "40vp" + }, + { + "name": "simple_toggle_edit_icon_width", + "value": "36vp" + }, + { + "name": "simple_toggle_edit_title_font_size", + "value": "40fp" + }, + { + "name": "simple_toggle_edit_opt_msg_font_size", + "value": "24fp" + }, + { + "name": "simple_toggle_edit_opt_msg_height", + "value": "98vp" + }, + { + "name": "simple_toggle_edit_opt_msg_margin_left_right", + "value": "44vp" + }, + { + "name": "simple_toggle_edit_grid_margin_left", + "value": "18.24vp" + }, + { + "name": "simple_toggle_edit_grid_margin_right", + "value": "18.24vp" + }, + { + "name": "simple_toggle_edit_grid_column_gap", + "value": "0vp" + }, + { + "name": "simple_toggle_edit_grid_drag_bg_size", + "value": "120vp" + }, + { + "name": "simple_toggle_edit_dialog_height", + "value": "217vp" + }, + { + "name": "simple_toggle_edit_dialog_width", + "value": "670vp" + }, + { + "name": "simple_toggle_edit_dialog_font_size", + "value": "22fp" + }, + { + "name": "simple_toggle_edit_dialog_btn_font_size", + "value": "22fp" + }, + { + "name": "simple_toggle_edit_dialog_font_height", + "value": "36vp" + }, + { + "name": "simple_toggle_edit_dialog_btn_width", + "value": "311vp" + }, + { + "name": "simple_toggle_edit_dialog_divider_height", + "value": "36vp" + }, + { + "name": "simple_toggle_edit_dialog_divider_width", + "value": "1vp" + }, + { + "name": "simple_toggle_edit_dialog_btn_margin_lf", + "value": "24vp" + }, + { + "name": "simple_toggle_edit_dialog_btn_margin_top", + "value": "36vp" + }, + { + "name": "simple_toggle_edit_dialog_btn_height", + "value": "56vp" + }, + { + "name": "simple_toggle_edit_dialog_radius", + "value": "36vp" + }, + { + "name": "simple_toggle_edit_dialog_font_margin_top", + "value": "52vp" } ] } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/base/element/string.json b/features/controlcentercomponent/src/main/resources/base/element/string.json index 35b22041..52c0d9f8 100644 --- a/features/controlcentercomponent/src/main/resources/base/element/string.json +++ b/features/controlcentercomponent/src/main/resources/base/element/string.json @@ -3,6 +3,58 @@ { "name": "control_center", "value": "控制中心" + }, + { + "name": "control_center_simple_toggle_layout_edit", + "value": "快捷开关" + }, + { + "name": "control_center_simple_toggle_layout_edit_opt_desc", + "value": "拖动图标进行排序,上方图标将显示在控制中心" + }, + { + "name": "control_center_simple_toggle_layout_edit_opt_drag", + "value": "拖动到此处可移除" + }, + { + "name": "control_center_simple_toggle_layout_edit_opt_max", + "value": "快捷面板最多显示%s个图标" + }, + { + "name": "control_center_simple_toggle_layout_edit_opt_min", + "value": "快捷面板至少显示%s个图标" + }, + { + "name": "control_center_simple_toggle_layout_edit_reset", + "value": "重置" + }, + { + "name": "control_center_simple_toggle_layout_edit_finish", + "value": "完成" + }, + { + "name": "control_center_simple_toggle_layout_edit_reset_confirm", + "value": "是否重置所有开关排序?" + }, + { + "name": "control_center_simple_toggle_layout_edit_reset_confirm_primary", + "value": "取消" + }, + { + "name": "control_center_simple_toggle_layout_edit_reset_confirm_secondary", + "value": "重置" + }, + { + "name": "control_center_simple_toggle_layout_edit_back_confirm", + "value": "是否保存当前修改?" + }, + { + "name": "control_center_simple_toggle_layout_edit_back_confirm_primary", + "value": "不保存" + }, + { + "name": "control_center_simple_toggle_layout_edit_back_confirm_secondary", + "value": "保存" } ] } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg b/features/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg new file mode 100644 index 00000000..ee6ff295 --- /dev/null +++ b/features/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg @@ -0,0 +1,3 @@ + + + diff --git a/features/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg b/features/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg new file mode 100644 index 00000000..e3c90549 --- /dev/null +++ b/features/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_edit + + + + + + + + + + \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg b/features/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg new file mode 100644 index 00000000..ac783474 --- /dev/null +++ b/features/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_settings + + + + + + + + + + \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/en_US/element/string.json b/features/controlcentercomponent/src/main/resources/en_US/element/string.json index 35b22041..e0f69aa1 100644 --- a/features/controlcentercomponent/src/main/resources/en_US/element/string.json +++ b/features/controlcentercomponent/src/main/resources/en_US/element/string.json @@ -2,7 +2,59 @@ "string": [ { "name": "control_center", - "value": "控制中心" + "value": "Control Panel" + }, + { + "name": "control_center_simple_toggle_layout_edit", + "value": "Edit switches" + }, + { + "name": "control_center_simple_toggle_layout_edit_opt_desc", + "value": "Drag the switches to rearrange them. The above switches will be shown in the Control Panel." + }, + { + "name": "control_center_simple_toggle_layout_edit_opt_drag", + "value": "Drag here to remove" + }, + { + "name": "control_center_simple_toggle_layout_edit_opt_max", + "value": "Maximum of %s switches." + }, + { + "name": "control_center_simple_toggle_layout_edit_opt_min", + "value": "Add at least %s switches." + }, + { + "name": "control_center_simple_toggle_layout_edit_reset", + "value": "RESET" + }, + { + "name": "control_center_simple_toggle_layout_edit_finish", + "value": "DONE" + }, + { + "name": "control_center_simple_toggle_layout_edit_reset_confirm", + "value": "Reset switch order?" + }, + { + "name": "control_center_simple_toggle_layout_edit_reset_confirm_primary", + "value": "CANCEL" + }, + { + "name": "control_center_simple_toggle_layout_edit_reset_confirm_secondary", + "value": "RESET" + }, + { + "name": "control_center_simple_toggle_layout_edit_back_confirm", + "value": "Save changes?" + }, + { + "name": "control_center_simple_toggle_layout_edit_back_confirm_primary", + "value": "CANCEL" + }, + { + "name": "control_center_simple_toggle_layout_edit_back_confirm_secondary", + "value": "SAVE" } ] } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json b/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json index 35b22041..52c0d9f8 100644 --- a/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json +++ b/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json @@ -3,6 +3,58 @@ { "name": "control_center", "value": "控制中心" + }, + { + "name": "control_center_simple_toggle_layout_edit", + "value": "快捷开关" + }, + { + "name": "control_center_simple_toggle_layout_edit_opt_desc", + "value": "拖动图标进行排序,上方图标将显示在控制中心" + }, + { + "name": "control_center_simple_toggle_layout_edit_opt_drag", + "value": "拖动到此处可移除" + }, + { + "name": "control_center_simple_toggle_layout_edit_opt_max", + "value": "快捷面板最多显示%s个图标" + }, + { + "name": "control_center_simple_toggle_layout_edit_opt_min", + "value": "快捷面板至少显示%s个图标" + }, + { + "name": "control_center_simple_toggle_layout_edit_reset", + "value": "重置" + }, + { + "name": "control_center_simple_toggle_layout_edit_finish", + "value": "完成" + }, + { + "name": "control_center_simple_toggle_layout_edit_reset_confirm", + "value": "是否重置所有开关排序?" + }, + { + "name": "control_center_simple_toggle_layout_edit_reset_confirm_primary", + "value": "取消" + }, + { + "name": "control_center_simple_toggle_layout_edit_reset_confirm_secondary", + "value": "重置" + }, + { + "name": "control_center_simple_toggle_layout_edit_back_confirm", + "value": "是否保存当前修改?" + }, + { + "name": "control_center_simple_toggle_layout_edit_back_confirm_primary", + "value": "不保存" + }, + { + "name": "control_center_simple_toggle_layout_edit_back_confirm_secondary", + "value": "保存" } ] } \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts b/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts new file mode 100644 index 00000000..12803342 --- /dev/null +++ b/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + +} + +export class LocationData { + isEnabled: boolean; +} \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts new file mode 100644 index 00000000..2d50fbda --- /dev/null +++ b/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' +import Constants from './Constants' + +const TAG = 'location-StyleConfiguration'; + +export default class StyleConfiguration { + static getStartsBarLocationComponentStyle() { + const key: string = TAG + "-startsBarLocation"; + return StyleManager.getStyle(key, () => { + return { + statusBarLocationWidth:$r('app.float.status_bar_location_width'), + statusBarLocationHeight: $r('app.float.status_bar_location_height'), + }; + }); + } +} \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts new file mode 100644 index 00000000..154997ef --- /dev/null +++ b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2021-2022 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 geolocation from '@ohos.geolocation'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; + +const TAG = 'LocationModel'; + +export class LocationService { + mIsStart: boolean = false; + mListener: any; + + startService() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `startService`) + this.mIsStart = true; + this.getServiceState(); + geolocation.on('locationServiceState', (state) => { + Log.showInfo(TAG, `startService locationChange, state: ${JSON.stringify(state)}`) + this.getServiceState(); + }); + } + + stopService() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `stopService`) + this.mIsStart = false; + geolocation.off('locationServiceState', (state) => { + Log.showInfo(TAG, `stopService locationChange, state: ${JSON.stringify(state)}`) + }); + } + + registerListener(listener: { + 'updateServiceState': Function, + }) { + Log.showInfo(TAG, `registerListener, listener: ${listener}`) + this.mListener = listener; + } + + getServiceState() { + Log.showInfo(TAG, `getServiceState`) + geolocation.isLocationEnabled().then((data) => { + Log.showInfo(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`) + this.mListener?.updateServiceState(data); + }); + } + + enableLocation() { + Log.showInfo(TAG, `enableLocation`) + geolocation.enableLocation() + .then((res) => Log.showInfo(TAG, `enableLocation, result: ${JSON.stringify(res)}`)); + } + + disableLocation() { + Log.showInfo(TAG, `disableLocation`) + geolocation.disableLocation() + .then((res) => Log.showInfo(TAG, `disableLocation, result: ${JSON.stringify(res)}`)); + } +} + +let sLocationService = createOrGet(LocationService, TAG); + +export default sLocationService as LocationService; \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets index 3abe22bb..48f97ec4 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,31 +13,28 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' -import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' -import ViewModel from '../viewmodel/LocationVM.ets' -import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" +import {LocationData} from '../common/Constants' +import ViewModel from '../viewmodel/LocationVM' +import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase' const TAG = 'location-ControlCenterSimpleToggleLocationComponent' @Component export default struct ControlCenterSimpleToggleLocationComponent { - @Prop keyId: string - @Prop mShowLabel: boolean - @Prop mEditMode: boolean + private keyId: string + private mEditMode: boolean = false + private mDragMode: boolean = false @State mIcon: Resource = $r("app.media.ic_controlcenter_gps") @State mLabel: Resource = $r("app.string.control_center_complex_toggle_location_title") - @StorageLink('LocationServiceOpenStatus') LocationServiceOpenStatus: boolean = false - @StorageLink("showStatusBar") showStatusBar: boolean = false - private mWindowManager - private mFeatureAbilityManager + @State mLocationData: LocationData = new LocationData() aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear') - this.mWindowManager = new WindowManager() - this.mFeatureAbilityManager = new FeatureAbilityManager() ViewModel.initViewModel() + this.mLocationData = ViewModel.getLocationData() } aboutToDisappear() { @@ -48,19 +45,18 @@ export default struct ControlCenterSimpleToggleLocationComponent { SimpleToggleBase({ mToggleId: this.keyId, mIcon: $mIcon, - mAutoIconColor: true, - mChangeSwitch: $LocationServiceOpenStatus, + mChangeSwitch: this.mLocationData.isEnabled, mLabel: $mLabel, - mShowLabel: this.mShowLabel, mEditMode: this.mEditMode, - mClickEvent: this.mClickEvent.bind(this), - mLongClickEvent: this.mLongClickEvent.bind(this) + mDragMode: this.mDragMode, + mClickEvent: () => this.mClickEvent(), + mLongClickEvent: () => this.mLongClickEvent() }) } mClickEvent() { - Log.showInfo(TAG, `mClickEvent, LocationServiceOpenStatus: ${this.LocationServiceOpenStatus}`) - if (this.LocationServiceOpenStatus) { + Log.showInfo(TAG, `mClickEvent, isEnabled: ${this.mLocationData.isEnabled}`) + if (this.mLocationData.isEnabled) { ViewModel.disableLocation() } else { ViewModel.enableLocation() @@ -68,17 +64,7 @@ export default struct ControlCenterSimpleToggleLocationComponent { } mLongClickEvent() { - Log.showInfo(TAG, `mLongClickEvent, LocationServiceOpenStatus: ${this.LocationServiceOpenStatus}`) - - this.showStatusBar = true - this.mWindowManager.setWindowMin((result) => { - this.mFeatureAbilityManager.openAbility(TAG, { - want: { - bundleName: 'com.ohos.settings', - abilityName: 'com.ohos.settings.MainAbility', - } - }) - }) - + Log.showInfo(TAG, `mLongClickEvent`) + EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.MainAbility')) } } \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets index f199d2aa..c456a363 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,16 +13,21 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../common/Constants.ets' -import ViewModel from '../viewmodel/LocationVM.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' +import Constants from '../common/Constants' +import ViewModel from '../viewmodel/LocationVM' const TAG = 'location-StatusBarIconItemLocationComponent' @Component export default struct StatusBarIconItemLocationComponent { @StorageLink('LocationServiceUseStatus') LocationServiceUseStatus: boolean = false - @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() + @State style: any = StyleConfiguration.getStartsBarLocationComponentStyle() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear') @@ -34,15 +39,17 @@ export default struct StatusBarIconItemLocationComponent { } build() { - Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Row() { if (this.LocationServiceUseStatus) { + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') Image($r("app.media.ic_statusbar_gps")) .objectFit(ImageFit.Contain) - .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) - .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) + .width(this.style.statusBarLocationWidth) + .height(this.style.statusBarLocationHeight) + .fillColor(this.mTintContentInfo.contentColor) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } } - .width(this.LocationServiceUseStatus ? Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient : 0) - .height(this.LocationServiceUseStatus ? Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient : 0) + .height('100%') } } \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts new file mode 100644 index 00000000..4913212e --- /dev/null +++ b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; +import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import {LocationData} from '../common/Constants'; +import LocationService from '../model/LocationService'; + +const TAG = 'LocationVM'; + +export class LocationVM { + mIsStart: boolean = false; + mLocationData: LocationData = { + ...new LocationData() + } + mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.LOCATION); + + constructor() { + Log.showInfo(TAG, `constructor`) + } + + initViewModel() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initViewModel `) + this.mIsStart = true; + this.mLocationData = AppStorage.SetAndLink(TAG + '_LocationData', this.mLocationData).get(); + LocationService.registerListener(this); + LocationService.startService(); + } + + getLocationData(): LocationData { + Log.showInfo(TAG, `getLocationData`) + return this.mLocationData; + } + + updateServiceState(state) { + Log.showInfo(TAG, `updateServiceState, state: ${state} `) + this.mLocationData.isEnabled = state; + } + + enableLocation() { + Log.showInfo(TAG, `enableLocation`) + LocationService.enableLocation(); + } + + disableLocation() { + Log.showInfo(TAG, `disableLocation`) + LocationService.disableLocation(); + } + + getTintContentInfo(): TintContentInfo { + return this.mTintContentInfo; + } +} + +let sLocationVM = createOrGet(LocationVM, TAG); + +export default sLocationVM as LocationVM; \ No newline at end of file diff --git a/features/locationcomponent/src/main/resources/base/element/float.json b/features/locationcomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..2e34baf3 --- /dev/null +++ b/features/locationcomponent/src/main/resources/base/element/float.json @@ -0,0 +1,11 @@ +{ + "float": [ + { + "name": "status_bar_location_width", + "value": "20vp" + },{ + "name": "status_bar_location_height", + "value": "24vp" + } + ] +} \ No newline at end of file diff --git a/features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg b/features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg index 31e59a8a..f6eea851 100644 --- a/features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg +++ b/features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg @@ -1,17 +1,6 @@ - - - ic_statusbar_gps + - + - - - - - - - - - - - \ No newline at end of file + + diff --git a/features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg b/features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg index 48efd6d9..2d166cbe 100644 --- a/features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg +++ b/features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg @@ -1,17 +1,6 @@ - - - ic_statusbar_gps - - - - - - - - - - - - - - \ No newline at end of file + + + + + + diff --git a/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts b/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts new file mode 100644 index 00000000..29e5ff12 --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + + static WH_45_100 = '45%'; + static WH_50_100 = '50%'; + static WH_60_100 = '60%'; + static WH_70_100 = '70%'; + static WH_90_100 = '90%'; + static WH_100_100 = '100%'; + static MAX_LINES_1 = 1; + static MAX_LINES_2 = 2; + static MAX_LINES_3 = 3; + static TIME_EMPTY = '00:00'; + static DATE_YEAR_IDX = 0; + static DATE_MONTH_IDX = 1; + static DATE_DAY_IDX = 2; + static DATE_HOUR_IDX = 3; + static DATE_MINUTE_IDX = 4; +} + +/** + * The type of the Do Not Disturb. + * + * @since 8 + * @systemapi Hide this for inner system use. + */ +export enum DoNotDisturbType { + /** + * Non do not disturb type notification + */ + TYPE_NONE = 0, + + /** + * Execute do not disturb once in the set time period (only watch hours and minutes) + */ + TYPE_ONCE = 1, + + /** + * Execute do not disturb every day with a set time period (only watch hours and minutes) + */ + TYPE_DAILY = 2, + + /** + * Execute in the set time period (specify the time, month, day and hour) + */ + TYPE_CLEARLY = 3, +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts new file mode 100644 index 00000000..ce5c922f --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import Bundle from '@ohos.bundle'; +import ResMgr from '@ohos.resourceManager'; +import SwitchUserManager from '../../../../../../../../common/src/main/ets/default/SwitchUserManager' + +const INDEX = 0; +const IS_INCLUDE_ABILITY_INFO = 0; + +const TAG = 'NotificationManagenment-BundleResourceModel'; + +export default class BundleResourceModel { + private mBundleInfoList: any[]= []; + + async getAllBundleInfos() { + let userId =(await SwitchUserManager.getInstance().getCurrentUserInfo()).userId; + Log.showInfo(TAG, 'getAllBundleInfos entry, userId = :' + userId); + Bundle.getAllBundleInfo(IS_INCLUDE_ABILITY_INFO, userId) + .then((data) => { + this.getIconItem(INDEX, data.length, data); + }); + Log.showInfo(TAG, 'getAllBundleInfos end'); + } + + async getIconItem(index, count, data) { + Log.showInfo(TAG, 'getIconItem data.length' + data.length); + let imageValue = ''; + let label = ''; + let that = this; + Log.showInfo(TAG, 'getIconItem data[index].name :' + data[index].name); + try { + let bundleContext = await AbilityManager.getContext().createBundleContext(data[index].name); + let bundleResourceManager = await bundleContext.resourceManager; + + let appInfo = data[index].appInfo; + if (appInfo.labelId > 0) { + bundleResourceManager.getString(appInfo.labelId, (error, value) => { + Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager value.length:' + value.length); + if (value != null) { + Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() value:' + value); + label = value; + Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() label:' + label); + } else { + Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() error:' + error); + } + }); + } else { + Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager label:' + appInfo.label); + label = appInfo.label; + } + Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager finish label:' + label); + if (appInfo.iconId <= 0) { + this.nextIconItem(index, count, data, this.mBundleInfoList, that) + return + } + bundleResourceManager.getMediaBase64(appInfo.iconId, (error, value) => { + if (error === undefined) { + Log.showInfo(TAG, 'getIconItem ResMgr.getMediaBase64() value:' + value.length); + if (value.length > 0) { + imageValue = value; + Log.showInfo(TAG, 'getIconItem ResMgr.getMediaBase64() imageValue:' + imageValue); + } + this.mBundleInfoList.push({ + appIcon: imageValue, + appTitle: label, + appValue: '', + appArrow: $r('app.media.ic_settings_arrow'), + appSummary: data[index].versionName, + appBundleName: data[index].name, + appIconId: appInfo.iconId, + appUri: 'pages/setEnable', + appUid: data[index].uid, + systemApp: appInfo.systemApp + }); + } + Log.showInfo(TAG, 'getIconItem ResMgr.getMediaBase64() end'); + this.nextIconItem(index, count, data, this.mBundleInfoList, that) + }); + } catch (error) { + Log.showInfo(TAG, 'getIconItem catch error:' + error); + } + Log.showInfo(TAG, 'getIconItem end'); + } + + nextIconItem(index, count, data, bundleInfoList, that) { + if (count - 1 > index) { + Log.showInfo(TAG, 'nextIconItem if index:' + index + ' | count:' + count); + index = index + 1; + that.getIconItem(index, count, data); + } else { + Log.showInfo(TAG, 'nextIconItem else index:' + index + ' | count:' + count); + AppStorage.SetOrCreate('appManagementList', bundleInfoList); + } + } + + async getBundleInfo(bundleName, callback) { + Log.showInfo(TAG, 'getBundleInfo entry'); + let mBundleInfo: any = {}; + let label = ''; + + let userInfo = await SwitchUserManager.getInstance().getCurrentUserInfo() + Log.showInfo(TAG, `getBundleInfo UserID:${JSON.stringify(userInfo)}`); + + Bundle.getBundleInfo(bundleName, IS_INCLUDE_ABILITY_INFO, { + userId: userInfo.userId + }).then((data) => { + Log.showInfo(TAG, `getBundleInfo bundleInfo:${JSON.stringify(data)}`); + ResMgr.getResourceManager(AbilityManager.getContext(), data.name, (error, item) => { + Log.showInfo(TAG, `getBundleInfo getResourceManager getString() item:${JSON.stringify(item)}`); + let appInfo = data.appInfo; + if (appInfo.labelId > 0) { + item.getString(appInfo.labelId, (error, value) => { + if (value != null) { + Log.showInfo(TAG, `getBundleInfo getResourceManager getString() value:${JSON.stringify(value)}`); + mBundleInfo.appTitle = value + } else { + Log.showInfo(TAG, `getBundleInfo getResourceManager getString() error:${JSON.stringify(error)}`); + } + }); + } + mBundleInfo.appTitle = appInfo.label; + mBundleInfo.appValue = '' + mBundleInfo.appArrow = $r('app.media.ic_settings_arrow') + mBundleInfo.appSummary = data.versionName + mBundleInfo.appBundleName = data.name + mBundleInfo.appIconId = appInfo.iconId + mBundleInfo.appUri = '' + mBundleInfo.appUid = data.uid + mBundleInfo.systemApp = appInfo.systemApp + + Log.showInfo(TAG, 'getBundleInfo getResourceManager label:' + label); + if (appInfo.iconId > 0) { + item.getMediaBase64(appInfo.iconId, (error, imageValue) => { + if (!!imageValue) { + Log.showInfo(TAG, 'getBundleInfo getResourceManager getMediaBase64 value:' + imageValue.length); + mBundleInfo.appIcon = imageValue + } + callback(mBundleInfo); + }); + } else { + callback(mBundleInfo); + } + + }); + }); + Log.showInfo(TAG, 'getBundleInfo end'); + } +} + diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts new file mode 100644 index 00000000..6eca12e5 --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import Notification from '@ohos.notification'; +import ConfigData, {DoNotDisturbType} from '../common/constants' +import TimeManager from '../../../../../../../../common/src/main/ets/default/TimeManager'; + +const TAG = 'NotificationManagenment-NoDisturbingModel'; +const MK_DATE_SPLIT = '-'; +const MK_NUM_FILL = '0'; +const VALUE_NUM_FILL = 10; + +export default class NoDisturbingModel { + static getNoDisturbingDate(callback) { + Notification.getDoNotDisturbDate((error, data) => { + if (error.code != 0) { + Log.showInfo(TAG, 'getNoDisturbingDate error:' + JSON.stringify(error)); + } else { + Log.showInfo(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); + let noDisturbingData = {} + noDisturbingData['type'] = data.type + if (data.type == DoNotDisturbType.TYPE_CLEARLY) { + noDisturbingData['begin'] = this.formatDateTime(data.begin) ; + noDisturbingData['end'] = this.formatDateTime(data.end) ; + } else { + noDisturbingData['begin'] = this.formatTime(data.begin) ; + noDisturbingData['end'] = this.formatTime(data.end) ; + } + callback(noDisturbingData) + } + }) + } + + static setNoDisturbingDate(noDisturbingTime, callback) { + let targetDate = {} + targetDate['type'] = noDisturbingTime.type + targetDate['begin'] = noDisturbingTime.begin + targetDate['end'] = noDisturbingTime.end + Log.showInfo(TAG, `Notification.setDoNotDisturbDate targetDate['type'] : ` + JSON.stringify(targetDate['type'])); + Log.showInfo(TAG, `Notification.setDoNotDisturbDate targetDate['begin'] : ` + JSON.stringify(targetDate['begin'])); + Log.showInfo(TAG, `Notification.setDoNotDisturbDate targetDate['end'] : ` + JSON.stringify(targetDate['end'])); + Notification.setDoNotDisturbDate(targetDate, callback) + } + static formatDate (data: Date): string { + let result = data.getFullYear() + MK_DATE_SPLIT; + let numTmp = data.getMonth() + 1; + if (numTmp < VALUE_NUM_FILL) { + result += MK_NUM_FILL; + } + result += (data.getMonth() + 1); + result += MK_DATE_SPLIT; + numTmp = data.getDate(); + if (numTmp < VALUE_NUM_FILL) { + result += MK_NUM_FILL; + } + result += numTmp; + return result; + } + static formatDateTime (data: Date): string { + let result = this.formatDate(data); + result += ' ' + TimeManager.formatTime(data); + return result; + } + static formatTime (data: Date): string { + return TimeManager.formatTime(data); + } + } + diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts new file mode 100644 index 00000000..8628e955 --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import Notification from '@ohos.notification'; + +const TAG = 'NotificationManagenment-NotificationListener'; + + +interface EnableListener { + bundle: string; + onEnableChanged: Function; +} + +export class NotificationListener { + private listeners= new Set(); + + subscribeEnableChanged() { + Log.showInfo(TAG, `subscribeEnableChanged`); + Notification.subscribe({ + onEnabledNotificationChanged: this.handleEnabledNotificationChanged.bind(this) + }, () => { + Log.showInfo(TAG, `subscribeEnableChanged finished`); + }); + } + + unsubscribeEnableChanged() { + Log.showInfo(TAG, `unsubscribeEnableChanged`); + this.unRegisterAll(); + Notification.unsubscribe({ + onEnabledNotificationChanged: this.handleEnabledNotificationChanged.bind(this) + }, () => { + Log.showInfo(TAG, `unsubscribeEnableChanged finished`); + }); + } + + handleEnabledNotificationChanged(data) { + Log.showInfo(TAG, `handleEnabledNotificationChanged data:${JSON.stringify(data)} `); + this.listeners.forEach((listener) => { + Log.showInfo(TAG, `handleEnabledNotificationChanged listener:${listener.bundle}`); + if (!!listener && listener.bundle == data.bundle) { + Log.showInfo(TAG, `handleEnabledNotificationChanged call:${listener.bundle} ${data.enable}`); + listener.onEnableChanged(data.enable); + } + }) + } + + register(listener: EnableListener) { + Log.showInfo(TAG, `register listener:${JSON.stringify(listener)}`) + this.listeners.add(listener); + Log.showInfo(TAG, `register finished`) + } + + unRegister(listener: EnableListener) { + Log.showInfo(TAG, `unRegister`) + this.listeners.delete(listener); + Log.showInfo(TAG, `unRegister finished`) + } + + unRegisterAll() { + Log.showInfo(TAG, `unRegisterAll`) + this.listeners.clear(); + Log.showInfo(TAG, `unRegisterAll finished`) + } + + isNotificationEnabled(bundleOption): Promise { + Log.showInfo(TAG, `isNotificationEnabled bundleOption:${JSON.stringify(bundleOption)} `) + return new Promise((resolve, reject) => { + Notification.isNotificationEnabled(bundleOption, (err, data) => { + Log.showInfo(TAG, `isNotificationEnabled callback data:${JSON.stringify(data)} err:${JSON.stringify(err)}`) + if (!!data) { + resolve(data) + } else { + reject(err) + } + }) + }); + } + + enableNotification(bundleOption, data) { + Log.showInfo(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`) + let enableValue: boolean = data ? true : false + Notification.enableNotification(bundleOption, enableValue, (err, result) => { + Log.showInfo(TAG, `enableNotification err:${JSON.stringify(err)} result:${JSON.stringify(result)} `) + }) + } + + notificationSlotSet(bundleOption, data) { + Log.showInfo(TAG, `notificationSlotSet bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`) + Notification.setSlotByBundle(bundleOption, data, (err, result) => { + Log.showInfo(TAG, `notificationSlotSet err:${JSON.stringify(err)} result:${JSON.stringify(result)} `) + }) + } + + isDistributedEnabled(): Promise { + Log.showInfo(TAG, `isDistributedEnabled`) + return new Promise((resolve, reject) => { + Notification.isDistributedEnabled().then((data) => { + Log.showInfo(TAG, `isDistributedEnabled data:${data}`) + resolve(data); + }).catch((err) => { + Log.showInfo(TAG, `isDistributedEnabled err:${JSON.stringify(err)} `) + reject(err) + }) + }); + } + + enableDistributed(data) { + Log.showInfo(TAG, `enableDistributed data:${JSON.stringify(data)}`) + let enableValue: boolean = data ? true : false + Notification.enableDistributed(enableValue, (err, result) => { + Log.showInfo(TAG, `enableDistributed err:${JSON.stringify(err)} result:${JSON.stringify(result)} `) + }) + } +} + +let notificationListener = new NotificationListener() + +export default notificationListener as NotificationListener + diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets index 0bc13b8b..fb5cc8ca 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,9 +12,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ConfigData from '../../common/constants.ets'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import Notification from '@ohos.notification'; +import ConfigData from '../../common/constants'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import Notification from '../../model/notificationListener'; import Router from '@system.router' const TAG = 'ManagementComponent-AppItemComponent'; @@ -32,87 +32,197 @@ export default struct AppItemComponent { @Prop appSwitch: number; @Prop appBundleName: string; @Prop appUid: number; + @State isCanChange: boolean = true build() { Flex({ justifyContent: FlexAlign.SpaceBetween }) { Row() { - Image(this.appIcon) - .width($r('app.float.appitem_icon_width')) - .height($r('app.float.appitem_icon_height')) - .margin({ right: $r('app.float.appitem_icon_margin_r') }) - .visibility('' === this.appIcon ? Visibility.None : Visibility.Visible) - .objectFit(ImageFit.Contain); + if (this.appSwitch === 2 || this.appSwitch === 3) { + Image(this.appIcon) + .width($r('app.float.appitem_notice_info_icon_width_l')) + .height($r('app.float.appitem_notice_info_icon_height_l')) + .margin({ right: $r('app.float.appitem_icon_info_margin_r') }) + .visibility('' === this.appIcon ? Visibility.None : Visibility.Visible) + .objectFit(ImageFit.Contain); + } else { + Image(this.appIcon) + .width($r('app.float.appitem_notice_info_icon_width')) + .height($r('app.float.appitem_notice_info_icon_height')) + .margin({ right: $r('app.float.appitem_icon_info_list_margin_r') }) + .visibility('' === this.appIcon ? Visibility.None : Visibility.Visible) + .objectFit(ImageFit.Contain); + } Column() { Text(this.appTitle) - .fontColor($r('app.color.appitem_label_fontcolor')) - .fontSize($r('app.float.appitem_label_font')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) .textAlign(TextAlign.Start) .maxLines(ConfigData.MAX_LINES_3) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .margin({ top: $r('app.float.appitem_label_margin_t'), bottom: $r('app.float.appitem_labelmargin_b') }); + .margin({ top: $r('app.float.appitem_label_margin_t'), bottom: $r('app.float.appitem_label_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); Row() { - Text($r('app.string.version')) - .fontColor($r('app.color.appitem_version_fontcolor')) - .fontSize($r('app.float.appitem_version_font')) - .textAlign(TextAlign.Start) - .maxLines(ConfigData.MAX_LINES_1) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .visibility(Visibility.Visible) - .margin({ bottom: $r('app.float.appitem_version_margin_b') }); - Text(this.appSummary) - .fontColor($r('app.color.appitem_version_fontcolor')) - .fontSize($r('app.float.appitem_version_font')) - .textAlign(TextAlign.Start) - .maxLines(ConfigData.MAX_LINES_1) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .visibility(Visibility.Visible) - .margin({ bottom: $r('app.float.appitem_version_margin_b') }); + if (this.appSwitch === 3) { + if (parseInt(this.appValue) == 0) { + Text($r('app.string.slot_unknown')) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .textAlign(TextAlign.Start) + .maxLines(ConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .visibility(Visibility.Visible) + .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + } else if (parseInt(this.appValue) == 1) { + Text($r('app.string.slot_social_communication')) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .textAlign(TextAlign.Start) + .maxLines(ConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .visibility(Visibility.Visible) + .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + } else if (parseInt(this.appValue) == 2) { + Text($r('app.string.slot_service_information')) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .textAlign(TextAlign.Start) + .maxLines(ConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .visibility(Visibility.Visible) + .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + } else if (parseInt(this.appValue) == 3) { + Text($r('app.string.slot_content_information')) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .textAlign(TextAlign.Start) + .maxLines(ConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .visibility(Visibility.Visible) + .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + } else if (parseInt(this.appValue) == 0xFFFF) { + Text($r('app.string.slot_other')) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .textAlign(TextAlign.Start) + .maxLines(ConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .visibility(Visibility.Visible) + .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + } else { + Text('') + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .textAlign(TextAlign.Start) + .maxLines(ConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .visibility(Visibility.Visible) + .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + } + } else { + Text($r('app.string.version')) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .textAlign(TextAlign.Start) + .maxLines(ConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .visibility(Visibility.Visible) + .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + Text(this.appSummary) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .textAlign(TextAlign.Start) + .maxLines(ConfigData.MAX_LINES_1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .visibility(Visibility.Visible) + .margin({ bottom: $r('app.float.appitem_version_margin_b') }); + } } } .alignItems(HorizontalAlign.Start); } .flexShrink(0) + .height(ConfigData.WH_100_100) .alignItems(VerticalAlign.Center) .align(Alignment.Start) Row() { if (this.appSwitch === 0) { Text(this.appValue) - .fontSize($r('app.float.appitem_version_font')) - .fontColor($r('app.color.appitem_version_fontcolor')) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) .margin({ right: $r('app.float.appitem_version_margin_r') }) .align(Alignment.End); Image(this.appArrow) - .width($r('app.float.arrow_icon_width')) - .height($r('app.float.arrow_icon_height')) + .width($r('app.float.itemComp_image_width')) + .height($r('app.float.itemComp_image_height')) .visibility(Visibility.Visible); + } else if (this.appSwitch === 2) { + Text(this.appValue) + .width($r('app.float.itemComp_image_width')) + .height($r('app.float.itemComp_image_height')) + .margin({ right: $r('app.float.appitem_version_margin_r') }) + .align(Alignment.End); + Image($r('app.media.ic_settings_arrow')) + .width($r('app.float.appitem_notice_infopop_icon_width')) + .height($r('app.float.appitem_notice_infopop_icon_height')) + .margin({ right: $r('app.float.appitem_notice_info_icon_margin_r') }) + .visibility(Visibility.None); + } else if (this.appSwitch === 3) { + Text('') + .fontSize($r('app.float.appitem_version_font')) + .fontColor($r('app.color.appitem_version_fontcolor')) + .margin({ right: $r('app.float.appitem_version_margin_r') }) + .align(Alignment.End); + Image($r('app.media.ic_settings_arrow')) + .width($r('app.float.appitem_notice_infopop_icon_width')) + .height($r('app.float.appitem_notice_infopop_icon_height')) + .margin({ right: $r('app.float.appitem_notice_infopop_icon_margin_r') }) + .visibility(Visibility.None); } else { Toggle({ type: ToggleType.Switch, isOn: this.canNotice }) .align(Alignment.End) .width($r('app.float.toggle_comp_width')) .height($r('app.float.toggle_comp_height')) + .enabled(this.isCanChange) .onChange((flag) => { - Log.showInfo(TAG, `Toggle onChange param: ` + this.appBundleName + " data:" + flag) - Notification.enableNotification({ bundle: this.appBundleName, uid: this.appUid }, flag, (err, result) => { - }) + Log.showInfo(TAG, `Toggle onChange param: data:${flag} `); + Notification.enableNotification({ bundle: this.appBundleName, uid: this.appUid }, flag); }) } } - .margin({ right: $r('app.float.page_margin_r') }) + .height(ConfigData.WH_100_100) + .alignItems(VerticalAlign.Center) .align(Alignment.End); } - .margin({ left: $r('app.float.page_margin_l') }) + .height($r('app.float.page_notice_app_item_row_height')) .width(ConfigData.WH_100_100) } aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear`) - Notification.isNotificationEnabled({ bundle: this.appBundleName, uid: this.appUid }) - .then((data) => { - Log.showInfo(TAG, `Notification.isNotificationEnabled:` + data) - this.canNotice = data; - Log.showInfo(TAG, `Notification.isNotificationEnabled isOn:` + this.canNotice) - }); + if (this.appSwitch === 1) { + Notification.subscribeEnableChanged(); + Notification.register({ bundle: this.appBundleName, + onEnableChanged: (stateValue: boolean) => { + Log.showInfo(TAG, `aboutToAppear listener call`) + this.canNotice = stateValue; + } }); + + Notification.isNotificationEnabled({ bundle: this.appBundleName, uid: this.appUid }) + .then((stateValue) => { + Log.showInfo(TAG, `Notification.isNotificationEnabled data:${JSON.stringify(stateValue)}`) + this.canNotice = stateValue; + }) + .catch((error) => { + Log.showInfo(TAG, `Notification.isNotificationEnabled error:${JSON.stringify(error)}`) + }); + } + } + + aboutToDisappear(): void{ + Log.showInfo(TAG, `aboutToDisappear`) + if (this.appSwitch === 1) { + Notification.unsubscribeEnableChanged(); + } } onBackPress() { diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets index 2507083c..2d11fd93 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets @@ -1,6 +1,6 @@ // @ts-nocheck /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ConfigData from '../../common/constants.ets'; -import AppItemComponent from './appItemComponent.ets'; +import ConfigData from '../../common/constants'; +import AppItemComponent from './appItemComponent'; import Router from '@system.router'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import ViewModel from '../../vm/appLstComponentViewModel.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import ViewModel from '../../vm/appLstComponentViewModel' const TAG = 'ManagementComponent-AppLstComponent'; @@ -57,33 +57,35 @@ export default struct AppLstComponent { appUri: item.appUri, appBundleName: item.appBundleName, appUid: item.appUid, - appSwitch: 0 + appSwitch: 0, + isCanChange:item.systemApp }) } .onClick(() => { Log.showInfo(TAG, `onClick`) Router.push({ uri: item.appUri, params: item }); }) - .height($r('app.float.appitem_item_height')); + .height($r('app.float.appitem_item_height')) }); } .divider({ strokeWidth: 1, color: $r('app.color.divider_color'), - startMargin: $r('app.float.divider_margin_l'), - endMargin: $r('app.float.divider_margin_r') + startMargin: $r('app.float.divider_margin_l_info') }) .width(ConfigData.WH_100_100) .height(ConfigData.WH_100_100) + .align(Alignment.Top) .visibility(Visibility.Visible) .zIndex(0) .border({ width: $r('app.float.border_width'), color: Color.White, radius: $r('app.float.border_radius') }) .backgroundColor(Color.White) + .padding({ + left: $r('app.float.itemComp_padding_l'), + right: $r('app.float.itemComp_padding_r') + }) } - .margin({ left: $r('app.float.page_margin_l'), - right: $r('app.float.page_margin_r') }) - .backgroundColor($r('app.color.background_color')) .align(Alignment.Center) .width(ConfigData.WH_100_100) .height(ConfigData.WH_100_100); diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets index e13b2961..57188627 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ConfigData from '../../common/constants.ets'; +import ConfigData from '../../common/constants'; import Router from '@system.router'; @Component @@ -20,17 +20,17 @@ export default struct HeadComponent { private isActive: boolean= true; private icBackIsVisibility: boolean= true; - private headName: string= ''; + @Link headName: string | Resource; @State isTouch: boolean= false; build() { Row() { Image($r('app.media.ic_back')) - .width($r('app.float.appitem_icon_width')) - .height($r('app.float.appitem_icon_height')) + .width($r('app.float.appitem_header_icon_width')) + .height($r('app.float.appitem_header_icon_height')) .borderRadius($r('app.float.image_border_radius')) .margin({ - left: $r('app.float.page_margin_r'), + left: $r('app.float.page_header_icon_margin_l'), top: $r('app.float.page_margin_t'), bottom: $r('app.float.page_margin_b') }) @@ -41,18 +41,18 @@ struct HeadComponent { Router.back(); }) Text(this.headName) - .fontSize($r('app.float.page_title_font')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .fontSize($r('app.float.page_phrases_tittle_font')) .fontWeight(FontWeight.Bold) - .fontColor(Color.Black) .width(ConfigData.WH_100_100) .maxLines(ConfigData.MAX_LINES_1) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .margin({ left: $r('app.float.page_margin_l'), right: $r('app.float.page_margin_r') }); + .margin({ left: $r('app.float.page_header_margin_l'), right: $r('app.float.page_margin_r') }); } .width(ConfigData.WH_100_100) .height($r('app.float.page_title_height')) + .margin({top:$r('app.float.page_header_margin_t')}) .alignItems(VerticalAlign.Center) .align(Alignment.Start) - .backgroundColor( $r('app.color.background_color')) } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets index 05717d66..770643a6 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,45 +12,41 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ConfigData from '../../common/constants.ets'; +import ConfigData from '../../common/constants'; @Component export default struct ItemComponent { - @Prop title: string + @Link title: string | Resource; @Prop value: string - @State arrow: string | PixelMap | Resource= '' + @Link arrow: string | PixelMap | Resource; build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Row() { Text(this.title) - .fontSize($r('app.float.itemComp_titel_font')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) .fontColor($r('app.color.itemComp_title_color')) .width(ConfigData.WH_45_100) .textAlign(TextAlign.Start) .fontWeight(FontWeight.Bold) + Blank() Text(this.value) .fontSize($r('app.float.itemComp_value_font')) .fontColor($r('app.color.itemComp_font_color')) - .width(ConfigData.WH_45_100) - .textAlign(TextAlign.End); Image(this.arrow) .width($r('app.float.itemComp_image_width')) .height($r('app.float.itemComp_image_height')) + .align(Alignment.End) + .margin({left:$r('app.float.itemComp_image_margin_left')}) } .width(ConfigData.WH_100_100) .alignItems(VerticalAlign.Center) - .padding({ left: $r('app.float.itemComp_padding_l') }) + .padding({ left: $r('sys.float.ohos_id_default_padding_start'),right: $r('sys.float.ohos_id_default_padding_end')}) } .width(ConfigData.WH_100_100) .height($r('app.float.itemComp_height')) .border({ width: $r('app.float.border_width'), color: Color.White, radius: $r('app.float.border_radius') }) .backgroundColor(Color.White) - .margin({ - left: $r('app.float.page_margin_l'), - right: $r('app.float.page_margin_r'), - bottom: $r('app.float.itemComp_margin_b') - }) } } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets index 601b9435..f8152088 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,38 +12,91 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import ConfigData from '../../common/constants.ets'; -import ViewModel from '../../vm/noDisturbComponentViewModel.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import ConfigData, {DoNotDisturbType} from '../../common/constants'; +import ViewModel from '../../vm/noDisturbComponentViewModel' const TAG = 'ManagementComponent-NoDisturbComponent'; @Component export default struct NoDisturbComponent { @State mViewModel: ViewModel = new ViewModel() + @State @Watch('onRefresh') refreshRequest: number= 0 + mPrevReapMode: number = 0; + mPrevStartTime: Date= new Date() + mPrevEndTime: Date= new Date() + mPrevGetCnt: number = 0; + mPrevPrompt: string = ''; + @State mRefreshCnt: number = 0; aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() + this.mPrevGetCnt = 0; + this.mRefreshCnt++ + } + + onRefresh(propName: string): void { + Log.showInfo(TAG, `onRefresh`) + this.mViewModel.ViewModelInit() + this.mPrevGetCnt = 0; + this.mRefreshCnt++ } build() { - Flex({ alignItems: ItemAlign.Center,justifyContent: FlexAlign.SpaceBetween }) { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { Row() { Column() { - Text($r('app.string.noDisturb')) - .fontSize($r('app.float.itemComp_titel_font')) - .fontColor($r('app.color.itemComp_title_color')) - .textAlign(TextAlign.Start) - .fontWeight(FontWeight.Bold) - Text(this.mViewModel.prompt) - .fontSize($r('app.float.itemComp_value_font')) - .fontColor($r('app.color.itemComp_font_color')) - .textAlign(TextAlign.Start) + Row() { + Text($r('app.string.noDisturb')) + .fontSize($r('app.float.itemComp_titel_font')) + .fontColor($r('app.color.itemComp_title_color')) + .textAlign(TextAlign.Start) + .fontWeight(FontWeight.Bold) + } + Row() { + if (this.mRefreshCnt > 0) { + if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_ONCE) { + Text($r('app.string.noDisturb_once_label')) + .fontSize($r('app.float.itemComp_value_font')) + .fontColor($r('app.color.itemComp_font_color')) + .textAlign(TextAlign.Start) + Text(this.mViewModel.prompt) + .fontSize($r('app.float.itemComp_value_font')) + .fontColor($r('app.color.itemComp_font_color')) + .textAlign(TextAlign.Start) + } else if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_DAILY) { + Text($r('app.string.noDisturb_daily_label')) + .fontSize($r('app.float.itemComp_value_font')) + .fontColor($r('app.color.itemComp_font_color')) + .textAlign(TextAlign.Start) + Text(this.mViewModel.prompt) + .fontSize($r('app.float.itemComp_value_font')) + .fontColor($r('app.color.itemComp_font_color')) + .textAlign(TextAlign.Start) + } else if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + Text($r('app.string.noDisturb_clearly_label')) + .fontSize($r('app.float.itemComp_value_font')) + .fontColor($r('app.color.itemComp_font_color')) + .textAlign(TextAlign.Start) + Text(this.mViewModel.prompt) + .fontSize($r('app.float.itemComp_value_font')) + .fontColor($r('app.color.itemComp_font_color')) + .textAlign(TextAlign.Start) + } else { + Text($r('app.string.noDisturb_closed')) + .fontSize($r('app.float.itemComp_value_font')) + .fontColor($r('app.color.itemComp_font_color')) + .textAlign(TextAlign.Start) + } + } else { + Blank(); + } + } } - .padding({ left: $r('app.float.itemComp_padding_l') }) .alignItems(HorizontalAlign.Start) } + .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) .flexShrink(1) .align(Alignment.Start) .alignItems(VerticalAlign.Center) @@ -55,23 +108,44 @@ export default struct NoDisturbComponent { .height($r('app.float.toggle_comp_height')) .onChange((data) => { Log.showInfo(TAG, `Toggle onChange param: data = ${data}`) - this.mViewModel.setNoDisturbingDate.bind(this.mViewModel)() + if (this.mPrevGetCnt == 0) { + this.mPrevReapMode = this.mViewModel.repeatMode + if (this.mPrevReapMode == DoNotDisturbType.TYPE_NONE) { + this.mPrevReapMode = DoNotDisturbType.TYPE_DAILY; + this.mPrevStartTime = this.mViewModel.getDateByHHMI(ConfigData.TIME_EMPTY); + this.mPrevEndTime = this.mViewModel.getDateByHHMI(ConfigData.TIME_EMPTY); + } else { + this.mPrevStartTime = this.mViewModel.defaultStartTime; + this.mPrevEndTime = this.mViewModel.defaultEndTime; + } + this.mPrevGetCnt++; + } + this.mViewModel.isEffective = !this.mViewModel.isEffective; + this.mViewModel.repeatMode = this.mViewModel.isEffective ? this.mPrevReapMode : DoNotDisturbType.TYPE_NONE; + if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_NONE) { + this.mViewModel.refreshDate.bind(this.mViewModel)(this.mViewModel.repeatMode, + this.mViewModel.getDateByHHMI(ConfigData.TIME_EMPTY), + this.mViewModel.getDateByHHMI(ConfigData.TIME_EMPTY)); + } else { + this.mViewModel.refreshDate.bind(this.mViewModel)(this.mViewModel.repeatMode, + this.mPrevStartTime, + this.mPrevEndTime); + } + this.mViewModel.setNoDisturbingDate.bind(this.mViewModel)(); + this.mViewModel.setCluesWithoutSetEffect.bind(this.mViewModel)(); + this.mRefreshCnt++ }) + } .flexShrink(0) .align(Alignment.End) .alignItems(VerticalAlign.Center) - .padding({ right: $r('app.float.itemComp_padding_r') }) + .padding({ right: $r('sys.float.ohos_id_max_padding_end') }) } .width(ConfigData.WH_100_100) - .height($r('app.float.itemComp_height')) + .height($r('app.float.itemComp_noDisturb_height')) .border({ width: $r('app.float.border_width'), color: Color.White, radius: $r('app.float.border_radius') }) .backgroundColor(Color.White) - .margin({ - left: $r('app.float.page_margin_l'), - right: $r('app.float.page_margin_r'), - bottom: $r('app.float.itemComp_margin_b') - }) } } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets index 4aeadb8b..a085e3dd 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,44 +12,53 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ConfigData from '../../common/constants.ets'; +import ConfigData from '../../common/constants'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'NotificationManagement-SlotItemComponent'; @Component export default struct SlotItemComponent { - @Prop slotType: number; + @State slotType: number = 0 build() { Flex({ justifyContent: FlexAlign.SpaceBetween }) { Row() { if (this.slotType === 0) { - Text($r('app.string.slot_unknown')).fontColor($r('app.color.background_color')) - .fontSize($r('app.float.slotComp_font')) + Text($r('app.string.slot_unknown')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) .textAlign(TextAlign.Start) } if (this.slotType === 1) { - Text($r('app.string.slot_social_communication')).fontColor($r('app.color.background_color')) - .fontSize($r('app.float.slotComp_font')) + Text($r('app.string.slot_social_communication')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) .textAlign(TextAlign.Start) } if (this.slotType === 2) { - Text($r('app.string.slot_service_information')).fontColor($r('app.color.background_color')) - .fontSize($r('app.float.slotComp_font')) + Text($r('app.string.slot_service_information')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) .textAlign(TextAlign.Start) } if (this.slotType === 3) { - Text($r('app.string.slot_content_information')).fontColor($r('app.color.background_color')) - .fontSize($r('app.float.slotComp_font')) + Text($r('app.string.slot_content_information')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) .textAlign(TextAlign.Start) } if (this.slotType === 0xFFFF) { - Text($r('app.string.slot_other')).fontColor($r('app.color.background_color')) - .fontSize($r('app.float.slotComp_font')) + Text($r('app.string.slot_other')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) .textAlign(TextAlign.Start) } } - .flexShrink(0) .alignItems(VerticalAlign.Center) .align(Alignment.Start) + .padding({ left: $r('app.float.divider_margin_l') }) + .height(ConfigData.WH_100_100) if (this.slotType !== 0) { Row() { @@ -58,11 +67,17 @@ export default struct SlotItemComponent { .height($r('app.float.slotComp_image_height')) .visibility(Visibility.Visible); } - .margin({ right: $r('app.float.page_margin_r') }) - .align(Alignment.End); + .alignItems(VerticalAlign.Center) + .align(Alignment.End) + .padding({ right: $r('app.float.divider_margin_r') }) + .height(ConfigData.WH_100_100) } } - .margin({ left: $r('app.float.page_margin_l') }) - .width(ConfigData.WH_100_100); + .width(ConfigData.WH_100_100) + .height($r('app.float.switchComp_height')) + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToDisAppear`) } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets index 6f1e1b41..81841570 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,45 +12,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ConfigData from '../../common/constants.ets'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import SlotItemComponent from './slotItemComponent.ets'; +import ConfigData from '../../common/constants'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import SlotItemComponent from './slotItemComponent'; import Notification from '@ohos.notification'; import Router from '@system.router' const TAG = 'ManagementComponent-SlotLstComponent'; -@Component -export default -struct SlotLstComponent { - private appBundleName:string =''; - private appUid:number =0; +@Component +export default struct SlotLstComponent { + private appInfo: any= null; @State slotLst: any[] = []; build() { Flex({ justifyContent: FlexAlign.SpaceBetween }) { Column() { - Row(){ + Row() { Text($r('app.string.slotType')) - .fontSize($r('app.float.slotComp_font')) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) .fontWeight(FontWeight.Bold) - .fontColor(Color.Black) .width(ConfigData.WH_100_100) .maxLines(ConfigData.MAX_LINES_1) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .margin({ left: $r('app.float.page_margin_l'), right: $r('app.float.page_margin_r') }); - }.align(Alignment.Start); - Row(){ + .padding({ left: $r('sys.float.ohos_id_max_padding_start'), right: $r('sys.float.ohos_id_max_padding_end')}) + }.height($r('app.float.notice_title_height')) + .margin({ top: $r('app.float.page_notice_part_margin_t')}) + .align(Alignment.Start); + Row() { List() { ForEach(this.slotLst, (item) => { ListItem() { - SlotItemComponent({slotType: item.slotType}) + SlotItemComponent({ slotType: item.type }) } .onClick(() => { Log.showInfo(TAG, `onClick`) + Router.push({ uri: this.appInfo.slotSettingUrl, params: {appInfo:this.appInfo,slotInfo:item} }); }) - // .height($r('app.float.wh_value_70')); }); }.divider({ strokeWidth: 1, @@ -58,33 +58,28 @@ struct SlotLstComponent { startMargin: $r('app.float.divider_margin_l'), endMargin: $r('app.float.divider_margin_r') }).width(ConfigData.WH_100_100) - .margin({ top: $r('app.float.slotComp_margin_t') }) .visibility(Visibility.Visible) - }.align(Alignment.Start); + .zIndex(0) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + } + .padding({ left: $r('sys.float.ohos_id_default_padding_start'), right: $r('sys.float.ohos_id_default_padding_end')}) + .margin({ top: $r('app.float.page_notice_title_margin_t')}) + .align(Alignment.Start); } } - .margin({ left: $r('app.float.page_margin_l') }) .width(ConfigData.WH_100_100); } aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) - Log.showInfo(TAG,`aboutToAppear Notification.getSlotsByBundle bundle:`+ 'bundle:'+ this.appBundleName + 'uid'+this.appUid) - Notification.getSlotsByBundle({bundle:this.appBundleName,uid:this.appUid},(err,data)=>{ - if (err.code!==0){ - Log.showInfo(TAG,`aboutToAppear Notification.getSlotsByBundle err:`+JSON.stringify(err)) - this.slotLst.push({ - slotType: 0 - }); - return - } - Log.showInfo(TAG,`aboutToAppear Notification.getSlotsByBundle data:`+JSON.stringify(data)) + Log.showInfo(TAG, `aboutToAppear Notification.getSlotsByBundle bundle:` + 'bundle:' + this.appInfo.appBundleName + 'uid' + this.appInfo.appUid) + Notification.getSlotsByBundle({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }, (err, data) => { + Log.showInfo(TAG, `aboutToAppear Notification.getSlotsByBundle data:` + JSON.stringify(data)) data.forEach((val, idx, array) => { - Log.showInfo(TAG,`aboutToAppear Notification.getSlotsByBundle data.forEach:`+JSON.stringify(val)) - this.slotLst.push({ - slotType: val.type - }); - }) + Log.showInfo(TAG, `aboutToAppear Notification.getSlotsByBundle data.forEach:` + JSON.stringify(val)) + this.slotLst.push(val); + }) }) } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index 4fef5a36..8fbb3d24 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,51 +12,61 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ConfigData from '../../common/constants.ets'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import Notification from '@ohos.notification'; -import Router from '@system.router' +import ConfigData from '../../common/constants'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; const TAG = 'ManagementComponent-SwitchComponent'; @Component export default struct SwitchComponent { - private title: ''; - private appBundleName: string = ''; - private appUid: number = 0; - @State canNotice: boolean= false + @Link title: string | Resource; + @State describe: string | Resource = ''; + private initializationAction: (params?) => Promise + private settingAction: (params?) => Promise + private register?: (listener) => void + @State isCanChange: boolean = true + @State initState: boolean= false build() { Flex({ justifyContent: FlexAlign.SpaceBetween }) { Row() { - Text(this.title) - .fontSize($r('app.float.switchComp_titel_font')) - .fontColor(Color.Black) - .align(Alignment.Start) + Column() { + Text(this.title) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontWeight(FontWeight.Bold) + .align(Alignment.Start) + Text(this.describe) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .align(Alignment.Start) + .visibility((this.describe ? true : false) ? Visibility.Visible : Visibility.None) + }.alignItems(HorizontalAlign.Start) } .flexShrink(0) .height($r('app.float.switchComp_height')) .alignItems(VerticalAlign.Center) .align(Alignment.Start) .padding({ right: $r('app.float.switchComp_padding_r') }) - .margin({ left: $r('app.float.page_margin_l') }) + .margin({ left: $r('app.float.page_notice_info_label_margin') }) Row() { - Toggle({ type: ToggleType.Switch, isOn: this.canNotice }) + Toggle({ type: ToggleType.Switch, isOn: this.initState }) .align(Alignment.End) .width($r('app.float.toggle_comp_width')) .height($r('app.float.toggle_comp_height')) + .enabled(this.isCanChange) .onChange((data) => { - Log.showInfo(TAG, `Toggle onChange param: ` + this.appBundleName + " data:" + data) - Notification.enableNotification({ bundle: this.appBundleName, uid: this.appUid }, data, (err, result) => { - }) - + Log.showInfo(TAG, `Toggle onChange data:${data}`); + this.initState = data ? true : false; + this.settingAction(data); }) } .alignItems(VerticalAlign.Center) .align(Alignment.End) .padding({ right: $r('app.float.switchComp_padding_r') }) }.width(ConfigData.WH_100_100) + .height($r('app.float.switchComp_height') ) .border({ width: $r('app.float.border_width'), color: Color.White, radius: $r('app.float.border_radius') }) .backgroundColor(Color.White) @@ -64,16 +74,16 @@ export default struct SwitchComponent { aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear`) - Notification.isNotificationEnabled({ bundle: this.appBundleName, uid: this.appUid }) - .then((data) => { - Log.showInfo(TAG, `Notification.isNotificationEnabled:` + data) - this.canNotice = data; - Log.showInfo(TAG, `Notification.isNotificationEnabled isOn:` + this.canNotice) + if (this.register) { + Log.showInfo(TAG, `aboutToAppear register listener`) + this.register((stateValue: boolean) => { + Log.showInfo(TAG, `aboutToAppear listener call`) + this.initState = stateValue; }); - } - - onBackPress() { - Log.showInfo(TAG, `onBackPress`) - Router.back(); + } + this.initializationAction().then((data) => { + Log.showInfo(TAG, `initializationAction:${data}`) + this.initState = data; + }) } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts b/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts new file mode 100644 index 00000000..258836cd --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import BundleResourceModel from '../model/bundleResourceModel'; + + +const TAG = 'ManagementComponent-AppLstComponentViewModel' + +export class AppLstComponentViewModel { + bundleInfoList: any[]= []; + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + let dataModel:BundleResourceModel = new BundleResourceModel() + dataModel.getAllBundleInfos() + } +} + +let appLstComponentViewModel = new AppLstComponentViewModel(); + +export default appLstComponentViewModel as AppLstComponentViewModel; \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts new file mode 100644 index 00000000..9ab93048 --- /dev/null +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil' +import NoDisturbingModel from '../model/noDisturbingModel'; +import ConfigData, {DoNotDisturbType} from '../common/constants' + +const TAG = 'ManagementComponent-NoDisturbComponentViewModel' + +export default class NoDisturbComponentViewModel { + defaultStartTime: Date= new Date() + defaultEndTime: Date= new Date() + startTime: string = '' + endTime: string = '' + repeatMode: number = 0 + repeatName: any = '' + prompt: string + isEffective: boolean + nextDayLabel: string = '' + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + this.getNextDayLabel(); + this.getNoDisturbingDate.bind(this)() + } + + getNoDisturbingDate() { + Log.showInfo(TAG, 'getNoDisturbingDate'); + NoDisturbingModel.getNoDisturbingDate((data) => { + Log.showInfo(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); + this.repeatMode = data.type + this.startTime = data.begin + this.endTime = data.end + Log.showInfo(TAG, `getNoDisturbingDate this.repeatMode : ${this.repeatMode}`) + Log.showInfo(TAG, `getNoDisturbingDate this.startTime : ${this.startTime}`) + Log.showInfo(TAG, `getNoDisturbingDate this.endTime : ${this.endTime}`) + this.repeatName = this.refreshRepeatName(this.repeatMode); + this.setClues.bind(this)() + }) + } + + setNoDisturbingDate() { + Log.showInfo(TAG, 'setNoDisturbingDate'); + if (!this.isEffective) { + this.repeatMode = DoNotDisturbType.TYPE_NONE + } + Log.showInfo(TAG, `this.repeatMode is : ${this.repeatMode}`); + let noDisturbingTime = { + type: this.repeatMode, begin: this.defaultStartTime, end: this.defaultEndTime + } + NoDisturbingModel.setNoDisturbingDate(noDisturbingTime, () => { + Log.showInfo(TAG, 'setNoDisturbingDate is success') + }) + } + + setClues() { + Log.showInfo(TAG, `setClues`) + if (this.repeatMode == DoNotDisturbType.TYPE_DAILY || + this.repeatMode == DoNotDisturbType.TYPE_ONCE || + this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + this.isEffective = true + } else { + this.isEffective = false + } + + this.setCluesWithoutSetEffect(); + Log.showInfo(TAG, `this.prompt : ${this.prompt}`) + } + setCluesWithoutSetEffect() { + Log.showInfo(TAG, `setCluesWithoutSetEffect start`) + if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + this.prompt = this.getDateTimeLabel(this.startTime) + ' - ' + this.getDateTimeLabel(this.endTime) + this.defaultStartTime = this.getDateByDateTime(this.startTime) + this.defaultEndTime = this.getDateByDateTime(this.endTime) + } else if (this.repeatMode == DoNotDisturbType.TYPE_DAILY || this.repeatMode == DoNotDisturbType.TYPE_ONCE) { + if (this.startTime >= this.endTime) { + this.prompt = this.startTime + ' - ' + this.nextDayLabel + this.endTime + } else { + this.prompt = this.startTime + ' - ' + this.endTime + } + this.defaultStartTime = this.getDateByHHMI(this.startTime) + this.defaultEndTime = this.getDateByHHMI(this.endTime) + } else { + this.prompt = '' + this.defaultStartTime = this.getDateByHHMI(this.startTime) + this.defaultEndTime = this.getDateByHHMI(this.endTime) + } + Log.showInfo(TAG, `setCluesWithoutSetEffect end`) + } + refreshDate(repeatMode: number, inputStartTime: Date, inputEndTime: Date) { + this.defaultStartTime = inputStartTime; + this.defaultEndTime = inputEndTime; + if (repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + this.startTime = NoDisturbingModel.formatDateTime(this.defaultStartTime) ; + this.endTime = NoDisturbingModel.formatDateTime(this.defaultEndTime) ; + } else { + this.startTime = NoDisturbingModel.formatTime(this.defaultStartTime) ; + this.endTime = NoDisturbingModel.formatTime(this.defaultEndTime) ; + } + } + refreshRepeatName(inputRepeatMode: number): any { + let result = null; + if (inputRepeatMode == DoNotDisturbType.TYPE_ONCE) { + result = $r('app.string.noDisturb_once'); + } else if (inputRepeatMode == DoNotDisturbType.TYPE_DAILY) { + result = $r('app.string.noDisturb_daily'); + } else if (inputRepeatMode == DoNotDisturbType.TYPE_CLEARLY) { + result = $r('app.string.noDisturb_clearly'); + } else { + result = $r('app.string.noDisturb_none'); + } + return result; + } + + getDateByHHMI(selectDate: string): Date{ + Log.showInfo(TAG, `getDateByHHMI selectDate:` + selectDate) + let tempDate: Date = new Date() + let HHmiArr = selectDate.split(':') + let hour = parseInt(HHmiArr[0]) + let minute = parseInt(HHmiArr[1]) + tempDate = new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate(), + hour, minute); + return tempDate; + } + getDateByDateTime(selectDate: string): Date{ + Log.showInfo(TAG, `getDateByDateTime selectDate:` + selectDate) + let arrayValue = this.getValuesFromDate(selectDate); + let tempDate: Date = new Date() + tempDate = new Date(arrayValue[ConfigData.DATE_YEAR_IDX], arrayValue[ConfigData.DATE_MONTH_IDX] - 1, + arrayValue[ConfigData.DATE_DAY_IDX], arrayValue[ConfigData.DATE_HOUR_IDX], + arrayValue[ConfigData.DATE_MINUTE_IDX]); + return tempDate; + } + getValuesFromDate(selectDate: string) { + let arrayValue = []; + let idxStart = 0; + let chrFlg = false; + if (selectDate) { + for (let idx = 0;idx < selectDate.length + 1;idx++) { + if (isNaN(parseInt(selectDate.substring(idx, idx + 1)))) { + arrayValue.push(parseInt(selectDate.substring(idxStart, idx))); + chrFlg = true + } else if (chrFlg) { + idxStart = idx; + chrFlg = false; + } + } + } + return arrayValue; + } + getDateLabel(selectDate: string) : string{ + let result = ''; + if (selectDate) { + let arrayValue = this.getValuesFromDate(selectDate); + let cutDict = ['年' , '月', '日']; + for (let idx2 = 0;idx2 < cutDict.length;idx2++) { + result += arrayValue[idx2]; + result += cutDict[idx2]; + } + } + return result; + } + getDateTimeLabel(selectDate: string) : string{ + let result = ''; + if (selectDate) { + result += this.getDateLabel(selectDate); + result += ' ' + NoDisturbingModel.formatTime(this.getDateByDateTime(selectDate)); + } + return result; + } + async getNextDayLabel() { + this.nextDayLabel = await ResourceUtil.getString($r("app.string.noDisturb_nextDay")); + } +} + diff --git a/features/managementcomponent/src/main/resources/base/element/color.json b/features/managementcomponent/src/main/resources/base/element/color.json index bc1887d5..448951fc 100644 --- a/features/managementcomponent/src/main/resources/base/element/color.json +++ b/features/managementcomponent/src/main/resources/base/element/color.json @@ -27,6 +27,10 @@ { "name": "itemComp_font_color", "value": "#666666" + }, + { + "name": "font_color_007DFF", + "value": "#007DFF" } ] } \ No newline at end of file diff --git a/features/managementcomponent/src/main/resources/base/element/float.json b/features/managementcomponent/src/main/resources/base/element/float.json index 1f949361..dac8c720 100644 --- a/features/managementcomponent/src/main/resources/base/element/float.json +++ b/features/managementcomponent/src/main/resources/base/element/float.json @@ -2,11 +2,11 @@ "float": [ { "name": "page_margin_l", - "value": "10" + "value": "12pv" }, { "name": "page_margin_r", - "value": "10" + "value": "12pv" }, { "name": "page_margin_t", @@ -18,55 +18,75 @@ }, { "name": "page_title_font", - "value": "24" + "value": "24vp" }, { "name": "page_title_height", - "value": "100" + "value": "56vp" }, { "name": "page_phrases_font", - "value": "18" + "value": "14fp" + }, + { + "name": "page_phrases_padding_t", + "value": "19vp" + }, + { + "name": "applist_hieght", + "value": "476vp" + }, + { + "name": "applist_hieght_bat", + "value": "584vp" + }, + { + "name": "page_header_margin_t", + "value": "24vp" + }, + { + "name": "applist_margin_t", + "value": "12vp" }, { "name": "page_phrases_height", - "value": "40" + "value": "48vp" + }, + { + "name": "page_phrases_tittle_font", + "value": "20fp" }, { "name": "dialog_title_height", - "value": "60" + "value": "60vp" }, { "name": "dialog_title_font", - "value": "28" + "value": "20fp" }, { "name": "dialog_title_margin_l", - "value": "30" + "value": "50" }, { "name": "dialog_button_font", - "value": "24" - }, - { - "name": "dialog_button_height", - "value": "60" + "value": "20fp" }, { "name": "timeDialog_height", - "value": "400" + "value": "310vp" }, { "name": "timeDialog_datePicker_height", - "value": "280" + "value": "200vp" }, { "name": "repeatDialog_cont_font", - "value": "22" + "value": "16fp" }, { "name": "repeatDialog_height", - "value": "250" + "value": "320vp" }, { "name": "border_width", @@ -74,7 +94,7 @@ }, { "name": "border_radius", - "value": "30" + "value": "24vp" }, { "name": "image_border_radius", @@ -82,35 +102,51 @@ }, { "name": "appitem_item_height", - "value": "70" + "value": "72vp" + }, + { + "name": "appitem_header_icon_width", + "value": "20vp" + }, + { + "name": "appitem_header_icon_height", + "value": "18vp" }, { "name": "appitem_icon_width", - "value": "50" + "value": "48vp" }, { "name": "appitem_icon_height", - "value": "50" + "value": "48vp" + }, + { + "name": "appitem_icon_info_margin_r", + "value": "12vp" + }, + { + "name": "appitem_icon_info_list_margin_r", + "value": "16vp" }, { "name": "appitem_icon_margin_r", - "value": "10" + "value": "16vp" }, { "name": "appitem_label_margin_t", "value": "10" }, { - "name": "appitem_labelmargin_b", + "name": "appitem_label_margin_b", "value": "5" }, { "name": "appitem_label_font", - "value": "20" + "value": "20vp" }, { "name": "appitem_version_font", - "value": "18" + "value": "18vp" }, { "name": "appitem_version_margin_b", @@ -130,23 +166,31 @@ }, { "name": "toggle_comp_width", - "value": "60" + "value": "54vp" }, { "name": "toggle_comp_height", - "value": "40" + "value": "36vp" }, { "name": "toggle_check_width", "value": "25" }, + { + "name": "divider_stroke_width", + "value": "1" + }, + { + "name": "divider_margin_l_info", + "value": "76vp" + }, { "name": "divider_margin_l", - "value": "70" + "value": "12vp" }, { "name": "divider_margin_r", - "value": "30" + "value": "12vp" }, { "name": "divider_height", @@ -154,47 +198,63 @@ }, { "name": "itemComp_height", - "value": "120" + "value": "56vp" + }, + { + "name": "itemComp_noDisturb_height", + "value": "72vp" }, { "name": "itemComp_titel_font", - "value": "22" + "value": "20vp" }, { "name": "itemComp_value_font", - "value": "20" + "value": "14fp" }, { "name": "itemComp_image_width", - "value": "40" + "value": "12vp" }, { "name": "itemComp_image_height", - "value": "40" + "value": "24vp" + }, + { + "name": "itemComp_image_margin_left", + "value": "30" }, { "name": "itemComp_padding_l", - "value": "15" + "value": "12vp" }, { "name": "itemComp_padding_r", - "value": "15" + "value": "12vp" }, { "name": "itemComp_margin_b", - "value": "30" + "value": "12vp" }, { "name": "slotComp_font", "value": "20" }, + { + "name": "page_header_icon_margin_l", + "value": "18vp" + }, + { + "name": "page_header_margin_l", + "value": "18vp" + }, { "name": "slotComp_image_width", - "value": "40" + "value": "18vp" }, { "name": "slotComp_image_height", - "value": "40" + "value": "18vp" }, { "name": "slotComp_margin_t", @@ -206,11 +266,87 @@ }, { "name": "switchComp_height", - "value": "70" + "value": "56vp" }, { "name": "switchComp_padding_r", + "value": "12vp" + }, + { + "name": "slotComp_height", + "value": "56vp" + }, + { + "name": "distance_24", "value": "15" + }, + { + "name": "page_notice_title_margin_t", + "value": "8vp" + }, + { + "name": "page_notice_part_margin_t", + "value": "24vp" + }, + { + "name": "page_notice_row_margin_t", + "value": "18vp" + }, + { + "name": "page_notice_app_item_row_height", + "value": "72vp" + }, + { + "name": "appitem_notice_info_icon_width_l", + "value": "64vp" + }, + { + "name": "appitem_notice_info_icon_height_l", + "value": "64vp" + }, + { + "name": "appitem_notice_info_icon_width", + "value": "48vp" + }, + { + "name": "appitem_notice_info_icon_height", + "value": "48vp" + }, + { + "name": "appitem_notice_infopop_icon_width", + "value": "22vp" + }, + { + "name": "appitem_notice_infopop_icon_height", + "value": "22vp" + }, + { + "name": "appitem_notice_infopop_icon_margin_r", + "value": "24vp" + }, + { + "name": "appitem_notice_info_icon_margin_r", + "value": "12vp" + }, + { + "name": "page_notice_info_label_margin", + "value": "12vp" + }, + { + "name": "notice_title_height", + "value": "20vp" + }, + { + "name": "notice_row_height", + "value": "56vp" + }, + { + "name": "noDisturb_margin_lf", + "value": "4vp" + }, + { + "name": "noDisturb_margin_16", + "value": "16vp" } ] } \ No newline at end of file diff --git a/features/managementcomponent/src/main/resources/base/element/string.json b/features/managementcomponent/src/main/resources/base/element/string.json index 4a9215a3..fd504723 100644 --- a/features/managementcomponent/src/main/resources/base/element/string.json +++ b/features/managementcomponent/src/main/resources/base/element/string.json @@ -24,6 +24,13 @@ "name": "noDisturb", "value": "免打扰" }, + { + "name": "noDisturb_opened", + "value": "已启动" + },{ + "name": "noDisturb_closed", + "value": "已关闭" + }, { "name": "slotType", "value": "类别" @@ -48,6 +55,14 @@ "name": "slot_other", "value": "其他" }, + { + "name": "startDate", + "value": "开始日期" + }, + { + "name": "endDate", + "value": "结束日期" + }, { "name": "startTime", "value": "开始时间" @@ -61,9 +76,37 @@ "value": "重复" }, { - "name": "daily", + "name": "noDisturb_once_label", + "value": "仅一次:" + }, + { + "name": "noDisturb_daily_label", + "value": "每天:" + }, + { + "name": "noDisturb_clearly_label", + "value": "自定义:" + }, + { + "name": "noDisturb_none", + "value": "关闭" + }, + { + "name": "noDisturb_once", + "value": "仅一次" + }, + { + "name": "noDisturb_daily", "value": "每天" }, + { + "name": "noDisturb_clearly", + "value": "自定义" + }, + { + "name": "noDisturb_nextDay", + "value": "次日" + }, { "name": "cancel", "value": "取消" @@ -71,6 +114,18 @@ { "name": "confirm", "value": "确定" + }, + { + "name": "notificationStyle", + "value": "提醒方式" + }, + { + "name": "notificationStyle_banner", + "value": "横幅通知" + }, + { + "name": "notificationSound", + "value": "通知铃声" } ] } \ No newline at end of file diff --git a/features/managementcomponent/src/main/resources/en_US/element/string.json b/features/managementcomponent/src/main/resources/en_US/element/string.json index dbb19a68..1faf1367 100644 --- a/features/managementcomponent/src/main/resources/en_US/element/string.json +++ b/features/managementcomponent/src/main/resources/en_US/element/string.json @@ -24,6 +24,14 @@ "name": "noDisturb", "value": "No Disturbing" }, + { + "name": "noDisturb_closed", + "value": "Closed" + }, + { + "name": "noDisturb_opened", + "value": "Opend" + }, { "name": "slotType", "value": "Slot Type" @@ -48,6 +56,14 @@ "name": "slot_other", "value": "Other" }, + { + "name": "startDate", + "value": "Start Date" + }, + { + "name": "endDate", + "value": "End Date" + }, { "name": "startTime", "value": "Start Time" @@ -61,9 +77,37 @@ "value": "Repeat" }, { - "name": "daily", + "name": "noDisturb_once_label", + "value": "Once:" + }, + { + "name": "noDisturb_daily_label", + "value": "Daily:" + }, + { + "name": "noDisturb_clearly_label", + "value": "Clearly:" + }, + { + "name": "noDisturb_none", + "value": "None" + }, + { + "name": "noDisturb_once", + "value": "Once" + }, + { + "name": "noDisturb_daily", "value": "Daily" }, + { + "name": "noDisturb_clearly", + "value": "Clearly" + }, + { + "name": "noDisturb_nextDay", + "value": "Next day " + }, { "name": "cancel", "value": "Cancel" @@ -71,6 +115,18 @@ { "name": "confirm", "value": "Confirm" + }, + { + "name": "notificationStyle", + "value": "Notification Style" + }, + { + "name": "notificationStyle_banner", + "value": "Notification Banner" + }, + { + "name": "notificationSound", + "value": "Notification Sound" } ] } \ No newline at end of file diff --git a/features/managementcomponent/src/main/resources/zh_CN/element/string.json b/features/managementcomponent/src/main/resources/zh_CN/element/string.json index 5473eac6..e6b0e3dc 100644 --- a/features/managementcomponent/src/main/resources/zh_CN/element/string.json +++ b/features/managementcomponent/src/main/resources/zh_CN/element/string.json @@ -24,6 +24,14 @@ "name": "noDisturb", "value": "免打扰" }, + { + "name": "noDisturb_closed", + "value": "已关闭" + }, + { + "name": "noDisturb_opened", + "value": "已启动" + }, { "name": "slotType", "value": "类别" @@ -48,6 +56,14 @@ "name": "slot_other", "value": "其他" }, + { + "name": "startDate", + "value": "开始日期" + }, + { + "name": "endDate", + "value": "结束日期" + }, { "name": "startTime", "value": "开始时间" @@ -61,10 +77,37 @@ "value": "重复" }, { - "name": "daily", + "name": "noDisturb_once_label", + "value": "仅一次:" + }, + { + "name": "noDisturb_daily_label", + "value": "每天:" + }, + { + "name": "noDisturb_clearly_label", + "value": "自定义:" + }, + { + "name": "noDisturb_none", + "value": "关闭" + }, + { + "name": "noDisturb_once", + "value": "仅一次" + }, + { + "name": "noDisturb_daily", "value": "每天" }, - + { + "name": "noDisturb_clearly", + "value": "自定义" + }, + { + "name": "noDisturb_nextDay", + "value": "次日" + }, { "name": "cancel", "value": "取消" @@ -72,6 +115,18 @@ { "name": "confirm", "value": "确定" + }, + { + "name": "notificationStyle", + "value": "提醒方式" + }, + { + "name": "notificationStyle_banner", + "value": "横幅通知" + }, + { + "name": "notificationSound", + "value": "通知铃声" } ] } \ No newline at end of file diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ts new file mode 100644 index 00000000..be7d87ba --- /dev/null +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021-2022 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 STORAGE_NAVIGATION_TYPE = 'navigationType'; + +export class ConfigManager{ + + constructor() { + } + + initConfig() { + var mLayoutConfig = AppStorage.SetAndLink("navigationType", 0); +// mAppStorage.setOrCreate(STORAGE_NAVIGATION_TYPE,TYPE_THREE); + mLayoutConfig.set(3); + } + +} + +let configManager = new ConfigManager(); +export default configManager as ConfigManager; diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts new file mode 100644 index 00000000..a8edb9f2 --- /dev/null +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import commonEvent from '@ohos.commonevent'; +import Constants from './common/constants'; +import Input from '@ohos.multimodalInput.inputEventClient'; +const TAG = 'KeyCodeEvent' + +let res; + +export class KeyCodeEvent { + public sendKeyEvent(keyCode: number, eventType: number) { + Log.showInfo(TAG, `sendKeyEvent keycode: ${keyCode} type: ${eventType}`); + switch (keyCode) { + case Constants.KEYCODE_BACK: + Log.showInfo(TAG, `sendKeyEvent case back type: ${eventType}`); + if (eventType === Constants.KEY_DOWN) { + Log.showInfo(TAG, 'sendKeyEvent, if'); + this.sendBackKeyEventStart(); //down + } else if (eventType === Constants.KEY_UP) { + Log.showInfo(TAG, `sendKeyEvent, else type: ${eventType}`); + this.sentEvnt(); + this.sendBackKeyEventEnd(); //up + } + break; + case Constants.KEYCODE_HOME: + Log.showInfo(TAG, `sendKeyEvent case home type: ${eventType}`); + if (eventType === Constants.KEY_UP) { + Log.showInfo(TAG, 'sendKeyEvent, if'); + this.sentEvnt(); + this.sendHomeKeyEvent(); + } + break; + case Constants.KEYCODE_RECENT: + Log.showInfo(TAG, `sendKeyEvent case recent type: ${eventType}`); + if (eventType === Constants.KEY_UP) { + Log.showInfo(TAG, 'sendKeyEvent, if'); + this.sentEvnt(); + this.sendRecentKeyEvent(); + } + break; + default: + Log.showInfo(TAG, `sendKeyEvent case default keycode: ${keyCode} type: ${eventType}`); + break; + } + } + + private sendBackKeyEventStart() { + Log.showInfo(TAG, 'sendBackKeyEventStart'); + + let keyEvent = { + isPressed: true, + // back keycode + keyCode: 2, + // After consulting the multi-mode subsystem, this parameter proved meaningless and remained unchanged + keyDownDuration: 1, + // This parameter changes with the version, and is currently 10008 + isIntercepted: false + } + res = Input.injectEvent({ + KeyEvent: keyEvent + }); + Log.showInfo(TAG, `injectEventHandler injectEventSync down res: ${res}`); + } + + private sendBackKeyEventEnd() { + Log.showInfo(TAG, 'sendBackKeyEventEnd'); + let keyEvent = { + isPressed: false, + // back keycode + keyCode: 2, + // After consulting the multi-mode subsystem, this parameter proved meaningless and remained unchanged + keyDownDuration: 1, + // This parameter changes with the version, and is currently 10008 + isIntercepted: false + } + res = Input.injectEvent({ + KeyEvent: keyEvent + }); + } + + private sendHomeKeyEvent() { + Log.showInfo(TAG, 'sendHomeKeyEvent'); + Log.showInfo(TAG, 'home click and start ability launcher'); + Log.showInfo(TAG, `startAbility`); + AbilityManager.startAbility({ + bundleName: Constants.LAUNCHER_BUNDLE_NAME, + abilityName: Constants.LAUNCHER_ABILITY_NAME + }); + } + + private sendRecentKeyEvent() { + Log.showInfo(TAG, 'sendRecentKeyEvent'); + commonEvent.publish('CREATE_RECENT_WINDOW_EVENT', (err, data) => { + Log.showInfo(TAG, `publish launcher err ${JSON.stringify(err)}`); + Log.showInfo(TAG, `publish launcher data ${JSON.stringify(data)}`); + }); + + Log.showInfo(TAG, `startAbility`); + AbilityManager.startAbility({ + bundleName: Constants.RECENT_BUNDLE_NAME, + abilityName: Constants.RECENT_ABILITY_NAME + }) + } + + private sentEvnt() { + let commonEventPublishData = { + code: 1, + data: JSON.stringify({ + callType: 1 + }) + } + + commonEvent.publish('SET_STATUSBAR_MIN_EVENT', commonEventPublishData, (err, data) => { + Log.showInfo(TAG, `publish statusbar err ${JSON.stringify(err)}`); + Log.showInfo(TAG, `publish statusbar data ${JSON.stringify(data)}`); + }); + } +} + +let keyCodeEvent = new KeyCodeEvent(); + +export default keyCodeEvent as KeyCodeEvent; diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts new file mode 100644 index 00000000..1facc72b --- /dev/null +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + static TYPE_THREE: number = 3; + static TYPE_ONE: number = 1; + static KEY_DOWN: number = 0; + static KEY_UP: number = 1; + static LAUNCHER_BUNDLE_NAME:string = 'com.ohos.launcher'; + static LAUNCHER_ABILITY_NAME:string = 'com.ohos.launcher.MainAbility'; + static RECENT_BUNDLE_NAME:string = 'com.ohos.launcher'; + static RECENT_ABILITY_NAME:string = 'com.ohos.launcher.recents.MainAbility'; + static KEYCODE_BACK: number = 1; + static KEYCODE_HOME: number = 2; + static KEYCODE_RECENT: number = 3; +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts new file mode 100644 index 00000000..29953759 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import WantAgent from '@ohos.wantAgent'; + +const TAG = 'CommonUtil'; +const DEFAULT_INFO = { + code: 0, + want: '', + permission: '', + extraInfo: {} +}; + +export default class CommonUtil { + static startWant(want, triggerInfo?: any) { + let info = (triggerInfo) ? triggerInfo : DEFAULT_INFO; + Log.showInfo(TAG, `startWant ${JSON.stringify(want)}, info ${JSON.stringify(info)}`); + WantAgent.trigger(want, info, ((err, data) => { + Log.showInfo(TAG, `wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); + })); + } + + static checkVisibilityByUser(notificationUser: number, currentUser: number): boolean{ + return (0 <= notificationUser && notificationUser < 100) || notificationUser == currentUser + } +} + + + diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts new file mode 100644 index 00000000..a2eea8fd --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'ScrollbarManager'; + +export default class ScrollbarManager { + static NotificationScrollBar = new Set(); + + static add(scroller) { + Log.showInfo(TAG, `add`); + let res = ScrollbarManager.NotificationScrollBar.add(scroller); + Log.showInfo(TAG, `add set's size:${res.size}`); + } + + static delete(scroller) { + Log.showInfo(TAG, `delete`); + ScrollbarManager.NotificationScrollBar.delete(scroller); + } + + static clear() { + Log.showInfo(TAG, `clear`); + ScrollbarManager.NotificationScrollBar.clear(); + } + + static restoreOtherScroll(scroller) { + Log.showInfo(TAG, `restoreOtherScroll`); + if (scroller.currentOffset().xOffset > 0) { + ScrollbarManager.NotificationScrollBar.forEach((item) => { + if (item !== scroller && item.currentOffset().xOffset > 0) { + item.scrollEdge(Edge.Start) + } + }) + ScrollbarManager.clear(); + ScrollbarManager.NotificationScrollBar.add(scroller); + } + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts new file mode 100644 index 00000000..85aa6415 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + static NOTIFICATION_TYPE_BASIC: string = '0'; + static NOTIFICATION_TYPE_LONG: string = '1'; + static NOTIFICATION_TYPE_PICTURE: string = '2'; + static NOTIFICATION_TYPE_MULTILINE: string = '4'; + static NOTIFICATION_TYPE_SOCIAL: string = '3'; + static NOTIFICATION_TYPE_MEDIA: string = '5'; + static NOTIFICATION_TYPE_NONE: number = 0; + static NOTIFICATION_TYPE_OPEN: number = 1; + static NOTIFICATION_TYPE_CLOSE: number = 2; + static TEXT_MAX_LENGTH: number = 21; + static TEXT_EXPANDED_MAX_LENGTH: number = 13; + static TOUCH_TYPE_DOWN: number = 0; + static TOUCH_TYPE_UP: number = 1; + static TOUCH_TYPE_MOVE: number = 2; + static HIDDEN_TRANSLATE_X: number = 150; + static DISPLAY_TRANSLATE_X: number = -150; + static REMOVE_TRANSLATE_X: number = 150; + static DEFAULT_MAX_LINES: number= 1; + static SINGLE_LINE: number= 1; + static EXPENDED_MAX_LINES: number= 8; + static CONTENT_LINE_HEIGHT: number = 20; + static SETTING_CONT_HEIGHT = '40vp'; + static SETTING_DIALOG_WITH = '330vp'; + static SETTING_CONTENT_WITH = '100%' + static SETTING_DIALOG_HEIGHT = '192vp'; + static SETTING_DIALOG_WIDTH = '362vp'; + static CONFIRM_DIALOG_HEIGHT = '146vp'; + static CONFIRM_DIALOG_WITH = '280'; + static CONFIRM_BUTTON_WITH = '140'; + static QUICKLY_SETTING_H = 83; + static ERROR_CALLBACK: number = 0; + static SUCCESS_CALLBACK: number = 1; + static KEY_INPUT: string = 'inputAction'; + static FULL_CONTAINER_WIDTH = '100%' +} + +export class NotificationLayout { + static ACTION_HEIGHT = 48; + static ACTION_MARGIN = 12; + static INPUT_IMAGE_SIZE = 24; + static INPUT_TEXT_HEIGHT = 40; + static INPUT_LAYOUT_HEIGHT = 82; + static NOTIFICATION_PIC_SIZE = 40; + static ICON_SIZE = 24; + static TEXT_LINE_HEIGHT = 20; + static BUTTON_SIZE = 40; + static ICON_MARGIN = 12; + static SCROLL_THRESHOLD = 10; + static TITLE_IMAGE_SIZE = 16; + static TITLE_HEIGHT = 40; + static ITEM_MARGIN = 12; + static EXPAND_PADDING_BOTTOM = 20; +} + +export class InputActionButtonData { + isSending: boolean = false; + content: string = ''; +} + +interface RuleData { + isAllowBanner?: boolean; + isAllowSound?: boolean; + isAllowVibrationValues?: boolean; + isAllowStatusBarShow?: boolean; + isAllowNotificationListShow?: boolean; +} + +export interface NotificationItemData { + id: string; + hashcode: string; + userId: number; + uid: number; + contentType: string; + timestamp: number; + time: string; + appName: string; + want: any; + actionButtons: any[]; + bundleName: string; + smallIcon?: PixelMap | string; + largeIcon?: PixelMap | string; + picture?: PixelMap; + title?: string; + text?: string; + additionalText?: string; + briefText?: string; + expandedTitle?: string; + longText?: string; + lines?: any[]; + longTitle?: string; + slotLevel?: any; + source?: number; + versionName?: string; + sound?: string; + vibrationValues?: Array; + notificationFlags?: any; + ruleData?: RuleData; + template?: any; + isOngoing?: boolean; + isUnremovable?: boolean; + isRemoveAllowed?: boolean; + distributedOption?: any; + deviceId?: string; + groupName?: string; +} + +export interface NotificationServiceListener { + onNotificationConsume?: (data: NotificationItemData) => void; + onNotificationLoad?: (data: NotificationItemData) => void; + onNotificationCancel?: (data: NotificationItemData) => void; +} + +export enum ScreenLockStatus { + Locking = 1, + Unlock = 2 +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts new file mode 100644 index 00000000..6fc417c3 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021-2022 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 ReadConfigUtil from '../../../../../../../../../common/src/main/ets/default/ReadConfigUtil'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'NotificationConfig' +/** + * Notification Flow Config: + * limitTotal:Total number of notifications that can be displayed.Beyond the range will not be displayed. + * app:The application configuration that app needs to limit is in this array. + * See the following for specific configuration attributes: + * --bundleName:Application bundleName. + * --canShow:Specifies whether application notifications can be displayed. + * --limit:Specifies the total number of notifications that the application can display. + * Beyond the range will not be displayed. + */ +const Config = { + "limitTotal": 10000, + "app": + [ + { "bundleName": "com.ohos.publishnotifications", "canShow": true, "limit": 100 }, + { "bundleName": "com.ohos.app2", "canShow": true, "limit": 100 } + ] +} + +export class NotificationConfig { + static USE_NOTIFICATION_ICON = true; + + readNotificationConfig(deviceType?: string): any{ + return Config + } +} + +let notificationConfig = new NotificationConfig(); + +export default notificationConfig as NotificationConfig; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts new file mode 100644 index 00000000..f2c94c4f --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import DeviceManager from '@ohos.distributedHardware.deviceManager'; +import DeviceInfo from '@ohos.deviceInfo'; + +const TAG = `NotificationDistributionManager`; + +let distributionManager = null; + +export default class NotificationDistributionManager { + deviceManager = null + + static getInstance() { + Log.showInfo(TAG, `getInstance`); + if (distributionManager == null) { + Log.showInfo(TAG, `getInstance distributionManager new`); + distributionManager = new NotificationDistributionManager(); + distributionManager.initDeviceManager(); + return distributionManager; + } + Log.showInfo(TAG, `getInstance return distributionManager`); + return distributionManager; + } + + constructor() { + Log.showInfo(TAG, `constructor`); + } + + initDeviceManager() { + Log.showInfo(TAG, `initDeviceManager`); + DeviceManager.createDeviceManager("com.ohos.systemui", (err, data) => { + if (err) { + console.info("createDeviceManager err:" + JSON.stringify(err)); + return; + } + console.info("createDeviceManager success"); + this.deviceManager = data; + }); + } + + getTrustedDeviceDeviceName(deviceId) { + Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceId:${deviceId}`); + let deviceName = ''; + let deviceArr:any[] = this.getTrustedDeviceListSync(); + Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceArr:${JSON.stringify(deviceArr)}`); + if (deviceArr && deviceArr.length > 0) { + for (let item of deviceArr) { + Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceArr item:${JSON.stringify(item)}`); + if (item.deviceId == deviceId) { + deviceName = item.deviceName; + break; + } + } + } + return deviceName; + } + + getTrustedDeviceListSync(): Array{ + Log.showInfo(TAG, `getTrustedDeviceListSync`); + return this.deviceManager.getTrustedDeviceListSync(); + } + + getLocalDeviceInfoSync() { + Log.showInfo(TAG, `getLocalDeviceInfoSync`); + return this.deviceManager.getLocalDeviceInfoSync(); + } + + release() { + this.deviceManager.release(); + } +} + +NotificationDistributionManager.getInstance(); \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts new file mode 100644 index 00000000..a67e78be --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2021-2022 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 { NotificationSubscriber } from './notification/notificationSubscriber'; +import Notification from '@ohos.notification'; +import PluginComponentManager from '@ohos.plugincomponent'; +import Systemparameter from '@ohos.systemparameter'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'NotificationManager'; +// Temporary path +const EXTERNAL_JSON_PATH = '/system/etc/notification_template/external.json' +const DEBUG_SETTING_KEY = 'debug.systemui.notificationtemplate'; +const DEBUG_BUNDLE_NAME = 'com.ohos.example.notificationtemplate' +const DEBUG_ABILITY_NAME = 'com.ohos.example.notificationtemplate.MainAbility' +const DEBUG_TEMPLATE_NAME = 'NotificationTemplate' + +export default class NotificationManager { + static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; + static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; + static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; + static TYPE_PICTURE: number = Notification.ContentType.NOTIFICATION_CONTENT_PICTURE; + static NotificationTemplateMap = new Map(); + + static subscribeNotification(tag, subscriber, asyncCallback) { + Log.showInfo(TAG, `subscribeNotification from: ${tag}`); + Notification.subscribe(subscriber, asyncCallback); + } + + static unsubscribeNotification(tag, subscriber) { + Log.showInfo(TAG, `subscribeNotification from: ${tag}`); + Notification.unsubscribe(subscriber); + } + + static removeAll(tag, callback) { + Log.showInfo(TAG, `removeAll from: ${tag}`); + Notification.removeAll(callback); + } + + static remove(tag, hashCode, callback) { + Log.showInfo(TAG, `remove from: ${tag}`); + Notification.remove(hashCode, callback) + } + + static getAllActiveNotifications(tag, callback) { + Log.showInfo(TAG, `getAllActiveNotifications from: ${tag}`); + Notification.getAllActiveNotifications(callback); + } + + static enableNotification(tag, bundleOption, data, callback) { + Log.showInfo(TAG, `enableNotification from: ${tag}`); + Notification.enableNotification(bundleOption, data, callback); + } + + static initNotificationTemplateMap(tag,ownerWant) { + Log.showInfo(TAG, `initNotificationTemplateMap from: ${tag}`); + if (NotificationManager.isDebugMode(tag)) { + NotificationManager.requestDebugTemplate(tag,ownerWant); + } else { + NotificationManager.requestTemplate(tag, ownerWant, '', EXTERNAL_JSON_PATH); + } + } + + static request(tag, param, asyncCallback) { + Log.showInfo(TAG, `request from: ${tag}`); + PluginComponentManager.request(param, (err, data) => { + asyncCallback(err, data); + }); + } + + static push(tag, param, asyncCallback) { + Log.showInfo(TAG, `push from: ${tag}`); + PluginComponentManager.push(param, () => { + asyncCallback(); + }); + } + + static requestListener(tag, ownerWant, asyncCallback) { + Log.showInfo(TAG, `requestListener from: ${tag}`); + PluginComponentManager.on(ownerWant, 'request', (source, name, data) => { + asyncCallback(source, name, data); + }) + } + + static pushListener(tag, ownerWant, asyncCallback) { + Log.showInfo(TAG, `pushListener from: ${tag}`); + PluginComponentManager.on(ownerWant, 'push', (source, template, data, extraData) => { + asyncCallback(source, template, data, extraData); + }); + } + + static requestTemplate(tag, ownerWant, templateName, templatePath) { + Log.showInfo(TAG, `requestTemplate from: ${tag}`); + + let reqWant = { + bundleName: '', + abilityName: '' + }; + let reqData = {} + + let requestParam = { + owner: ownerWant, + want: reqWant, + name: templateName, + data: reqData, + jsonPath: templatePath + }; + + Log.showInfo(TAG, `requestTemplate requestParam: ${JSON.stringify(requestParam)}`) + NotificationManager.request(tag, requestParam, (err, data) => { + Log.showInfo(TAG, `request finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `request finished templateData: ${templateName} data: ${JSON.stringify(data.componentTemplate)}`) + if (data?.componentTemplate?.source) { + Log.showInfo(TAG, `request finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`) + let templates = JSON.parse(data.componentTemplate.source); + Log.showInfo(TAG, `request templates: ${JSON.stringify(templates)}`) + for (let key in templates) { + NotificationManager.NotificationTemplateMap.set(key, { + "source": templates[key], "ability": "" + }); + } + } + }); + } + + static requestDebugTemplate(tag, ownerWant) { + Log.showInfo(TAG, `requestDebugTemplate from: ${tag}`); + let reqWant = { + bundleName: DEBUG_BUNDLE_NAME, + abilityName: DEBUG_ABILITY_NAME + }; + let reqData = {} + let requestParam = { + owner: ownerWant, + want: reqWant, + name: DEBUG_TEMPLATE_NAME, + data: reqData + }; + Log.showInfo(TAG, `requestDebugTemplate requestParam: ${JSON.stringify(requestParam)}`); + NotificationManager.request(tag, requestParam, (err, data) => { + Log.showInfo(TAG, `requestDebugTemplate finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + if (!!data) { + Log.showInfo(TAG, `requestDebugTemplate finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`) + NotificationManager.NotificationTemplateMap.set(DEBUG_TEMPLATE_NAME, data.componentTemplate); + } + }); + } + + static isDebugMode(tag): boolean{ + Log.showInfo(TAG, `isDebugMode from: ${tag}`); + let debug = Systemparameter.getSync(DEBUG_SETTING_KEY, "") + Log.showInfo(TAG, `Systemparameter DEBUG_SETTING: ${debug}`); + return!!debug; + } + +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts new file mode 100644 index 00000000..36ad7983 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2021-2022 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 notification from '@ohos.notification'; +import NotificationSubscriber from '@ohos.notificationSubscriber'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import NotificationManager from './NotificationManager'; +import ParseDataUtil from './ParseDataUtil'; +import RuleController from './rule/RuleController'; +import CommonUtil from '../common/CommonUtil'; +import createOrGet from "../../../../../../../../../common/src/main/ets/default/SingleInstanceHelper"; +import DistributionManager from './NotificationDistributionManager'; +import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; + +const TAG = 'NotificationService'; + +interface NotificationListener { + userId: number; + onNotificationConsume: Function; + onNotificationCancel: (hashcode: number) => void; +} + +/** + * notification service api + */ +export class NotificationService { + mListeners = new Set(); + mSubscriber; + mSortingMap = {}; + + constructor() { + this.subscribeNotification(this.getSubscriber()); + this.loadNotificationTemplate() + } + + public register(listener: NotificationListener) { + let res = this.mListeners.add(listener); + Log.showInfo(TAG, `register, listener size: ${res.size}`); + } + + public unRegister(listener: NotificationListener) { + let res = this.mListeners.delete(listener); + Log.showInfo(TAG, `unRegister, res: ${res}`); + } + + public removeAll() { + Log.showInfo(TAG, 'removeAll start'); + NotificationManager.removeAll(TAG, (data) => { + Log.showInfo(TAG, `removeAll => data: ${JSON.stringify(data)}`); + }); + } + + public remove(code: string) { + NotificationManager.remove(TAG, code, (data) => { + Log.showInfo(TAG, `removeNotificationItem ==> data: ${JSON.stringify(data)}`); + }) + } + + public loadAllNotifications() { + NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { + Log.showInfo(TAG, `getAllActiveNotifications error:${err}}, requestsArr: ${JSON.stringify(requestsArr)}`); + if (Array.isArray(requestsArr)) { + for (let i = 0, len = requestsArr.length; i < len; i++) { + this.handleNotificationAdd(requestsArr[i]); + } + } + }) + } + + getSubscriber() { + if (!this.mSubscriber) { + this.mSubscriber = { + onConsume: this.handleNotificationAddAndSortMap.bind(this), + onCancel: this.handleNotificationCancel.bind(this), + } + } + return this.mSubscriber; + } + + handleNotificationAddAndSortMap(data) { + Log.showInfo(TAG, 'handleNotificationAddAndSortMap, sortingMap' + JSON.stringify(data.sortingMap || {})); + this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; + this.handleNotificationAdd(data?.request); + } + + handleNotificationAdd(request) { + ParseDataUtil.parseData(request, this.mSortingMap).then((intermediateData) => { + Log.showInfo(TAG, `parseData after = ${JSON.stringify(intermediateData)}`); + RuleController.getNotificationData(intermediateData, (finalItemData) => { + Log.showInfo(TAG, `RuleController.getNotificationData after = ${JSON.stringify(finalItemData)}`); + this.mListeners.forEach((listener) => { + Log.showInfo(TAG, `notifcationUserId: ${finalItemData.userId}, listener.userId: ${listener.userId}`); + if (CommonUtil.checkVisibilityByUser(finalItemData.userId, listener.userId)) { + listener.onNotificationConsume(finalItemData); + } + }) + }); + }).catch(errorInfo => Log.showError(TAG, errorInfo)); + } + + handleNotificationCancel(data) { + Log.showInfo(TAG, `handleNotificationCancel hashCode: ${JSON.stringify(data?.request?.hashCode)}`); + this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; + const hashCode = data?.request?.hashCode; + if (!hashCode) { + Log.showError(TAG, `handleNotificationCancel data: ${JSON.stringify(data)}`); + return; + } + this.mListeners.forEach((listener) => listener.onNotificationCancel(hashCode)); + } + + subscribeNotification(subscriber) { + let callback = (err, data) => { + Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + }; + NotificationManager.subscribeNotification(TAG, subscriber, callback); + } + + loadNotificationTemplate() { + Log.showInfo(TAG, 'loadNotificationTemplate start'); + NotificationManager.initNotificationTemplateMap(TAG, globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT]); + } + + getPluginTempLate(templateName) { + Log.showInfo(TAG, `getPluginTempLate param:${templateName}`); + let pluginTempLate = null; + if (NotificationManager.NotificationTemplateMap !== null) { + pluginTempLate = NotificationManager.NotificationTemplateMap.get(templateName); + } + Log.showInfo(TAG, `getPluginTempLate pluginTempLate:${JSON.stringify(pluginTempLate)}`); + return pluginTempLate; + } + + enableNotification(bundleOption, data) { + Log.showInfo(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)} `); + NotificationManager.enableNotification(TAG, bundleOption, data, (result) => { + Log.showInfo(TAG, `enableNotification ==> result: ${JSON.stringify(result)}`); + }); + } + + getTrustedDeviceDeviceName(deviceId) { + Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceId:${JSON.stringify(deviceId)} `); + return DistributionManager.getInstance().getTrustedDeviceDeviceName(deviceId); + } +} + +let notificationService = createOrGet(NotificationService, TAG); + +export default notificationService as NotificationService; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts new file mode 100644 index 00000000..0980f6c0 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import EventManager from "../../../../../../../../../common/src/main/ets/default/event/EventManager"; +import {obtainLocalEvent} from "../../../../../../../../../common/src/main/ets/default/event/EventUtil"; + +const TAG = `NotificationWindowManager`; + +class NotificationWindowManager { + + showNotificationWindow() { + // todo show Notification window + } + + hideNotificationWindow() { + Log.showInfo(TAG, 'hide Notification window'); + EventManager.publish(obtainLocalEvent('hideNotificationWindowEvent', '')); + } +} + +let sNotificationWindowManager = new NotificationWindowManager(); + +export default sNotificationWindowManager as NotificationWindowManager; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts new file mode 100644 index 00000000..927a3289 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2021-2022 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 Notification from '@ohos.notification'; +import AccountManager from '@ohos.account.osAccount'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import BundleManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager'; +import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import DistributionManager from './NotificationDistributionManager'; +import NotificationManager from './NotificationManager'; +import Constants, {NotificationItemData} from '../common/constants'; +import {NotificationConfig} from './NotificationConfig'; + +const TAG = 'Notification_ParseDataUtil'; +let mDate = new Date(); +let appDataMap = new Map(); + +type NotificationContent = { + title: string, + text: string, + additionalText: string, + briefText?: string, + expandedTitle?: string, + longText?: string, + lines?: [], + picture?: any +} + +async function getUserId(uid) { + let userId = await AccountManager.getAccountManager().getOsAccountLocalIdFromUid(uid); + Log.showInfo(TAG, `getOsAccountLocalIdFromUid uid = ${uid}, userId = ${userId}`); + return userId; +} + + +/** + * parse data util class. + */ +export default class ParseDataUtil { + static async parseData(request, sortingMap?) { + if (!request) { + return Promise.reject('consumeCallback request is empty'); + } + Log.showInfo(TAG, `parse data start, want = ${JSON.stringify(request.wantAgent)}`); + Log.showInfo(TAG, `actionButtons = ${JSON.stringify(request.actionButtons)}`); + let userId = await getUserId(request.creatorUid); + let appMessage = await ParseDataUtil.getAppData(request.creatorBundleName, userId); + let notificationItem: NotificationItemData = { + id: request.id, + userId: userId, + uid: request.creatorUid, + hashcode: request.hashCode, + contentType: request?.content?.contentType + '', + timestamp: request.deliveryTime, + time: ParseDataUtil.getStandardTime(request.deliveryTime), + appName: appMessage.appName, + want: request.wantAgent, + bundleName: request.creatorBundleName, + actionButtons: request.actionButtons, + smallIcon: NotificationConfig.USE_NOTIFICATION_ICON ? (request?.smallIcon ?? appMessage.icon) : appMessage.icon, + largeIcon: request.largeIcon, + slotLevel: sortingMap?.sortings[request?.hashCode]?.slot?.level, + source: request.source, + sound: sortingMap?.sortings[request?.hashCode]?.slot?.sound ?? '', + vibrationValues: sortingMap?.sortings[request?.hashCode]?.slot?.vibrationValues ?? [], + notificationFlags: request.notificationFlags, + template: request?.template, + isOngoing: request.isOngoing, + isUnremovable: request.isUnremovable, + isRemoveAllowed: request.isRemoveAllowed, + distributedOption: request.distributedOption, + deviceId: request.deviceId, + groupName: request.groupName??request.hashcode + }; + Log.showInfo(TAG, `notificationItem construct over ====================`); + notificationItem = { + ...notificationItem, ...ParseDataUtil.getContentByType(request?.content?.contentType, request) + } + return notificationItem; + } + + /** + * Get app data by bundleName. + * + * @param {string} bundleName - BundleName of the target app. + * @return {object} appData + */ + static async getAppData(bundleName, userId) { + Log.showInfo(TAG, `getAppName start by ${bundleName}`); + if (appDataMap.has(bundleName)) { + Log.showInfo(TAG, `getAppData success.`); + return appDataMap.get(bundleName); + } + let data = await BundleManager.getBundleInfo(TAG, bundleName, 0, userId); + let labelId = data?.appInfo?.labelId; + let iconId = data?.appInfo?.iconId; + let item = await BundleManager.getResourceManager(TAG, AbilityManager.getContext(), bundleName); + let appMessage = { + appName: await item.getString(labelId), + icon: await item.getMediaBase64(iconId) + }; + if (appMessage.icon != null && appMessage.appName) { + appDataMap.set(bundleName, appMessage); + Log.showInfo(TAG, `getAppData success ${appMessage.appName} by ${bundleName}`); + } + return appMessage; + } + + /** + * Reformat the timestamp to hh:mm. + * + * @param {number} timestamp - Target timestamp. + */ + static getStandardTime(timestamp) { + if (timestamp == 0 || timestamp == undefined || timestamp == null) { + return ''; + } + mDate.setTime(timestamp); + let hoursNumber = mDate.getHours(); + let minutesNumber = mDate.getMinutes(); + let hours = hoursNumber < 10 ? '0' + hoursNumber : hoursNumber; + let minutes = minutesNumber < 10 ? '0' + minutesNumber : minutesNumber; + return hours + ':' + minutes; + } + + static getContentByType(notificationType, request): NotificationContent { + let content = { + title: '', text: '', additionalText: '' + } + + function getContentByKey(keysAndDefault, source) { + if (source) { + keysAndDefault.forEach(([key, defualt]) => { + content[key] = source[key] ?? defualt + }) + } + } + + switch (notificationType) { + case NotificationManager.TYPE_BASIC: + getContentByKey([['title', ''], ['text', ''], ['additionalText', '']], request.content.normal) + break; + case NotificationManager.TYPE_LONG: + getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], + ['expandedTitle', ''], ['longText', '']], request.content.longText) + break; + case NotificationManager.TYPE_MULTI: + getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], + ['longTitle', ''], ['lines', []]], request.content.multiLine) + break; + case NotificationManager.TYPE_PICTURE: + getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], + ['expandedTitle', ''], ['picture', '']], request.content.picture) + break; + default: + Log.showInfo(TAG, 'no match content type'); + break; + } + Log.showInfo(TAG, `notificationType = ${notificationType}, content = ${JSON.stringify(content)}`); + return content + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts new file mode 100644 index 00000000..25a33b41 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2021-2022 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 {NotificationItemData} from '../../common/constants'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import {SlotLevel} from '@ohos.notification'; +import Notification from '@ohos.notification'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import Bundle from '@ohos.bundle'; + +const TAG = 'NotificationRuleController'; + +export class RuleController { + /** + * Check if this notification is allow show or not + * + * @param {notificationItemData} Data of the notification + * @param {callback} Data of the type to show the notification + */ + getNotificationData(notificationItemData: NotificationItemData, callback) { + Log.showInfo(TAG, "getNotificationData start") + + this.isAllowSendNotification(notificationItemData, (isSuccess) => { + if (!isSuccess) { + Log.showInfo(TAG, "user is not allow this to send notification"); + callback(undefined); + return; + } + this.getNotificationDataByApp(notificationItemData, (originalData) => { + Log.showInfo(TAG, `originalData = ${JSON.stringify(originalData)}`); + this.updateNotificationDataBySense(originalData, (finalData) => { + Log.showInfo(TAG, `finalData = ${JSON.stringify(finalData)}`); + callback(finalData); + }); + }); + }); + } + + /** + * Check if user allow the app send notification or not + * + * @param {notificationItemData} The origin notification data + * @param {callback} The user allow the app send notification or not + */ + isAllowSendNotification(notificationItemData, callback) { + Log.showInfo(TAG, "isAllowSendNotification start"); + Notification.isNotificationEnabled({ bundle: notificationItemData.bundleName, uid: notificationItemData.uid }) + .then((flag) => { + Log.showInfo(TAG, `Notification.isNotificationEnabled:` + flag) + callback(flag); + }); + } + + /** + * Check whether sound or vibration is allowed + * + * @param {notificationItemData} The origin notification data + * @param {callback} whether sound or vibration is allowed + */ + + SoundOrVibrate(notificationItemData, callback) { + Log.showInfo(TAG, "SoundOrVibrate start") + let sound = false; + let vibrationValues = false; + if (!CheckEmptyUtils.checkStrIsEmpty(notificationItemData.sound)) { + sound = true; + Log.showInfo(TAG, `notificationItemData.sound is allowed = ${sound}`); + } + if (!CheckEmptyUtils.isEmptyArr(notificationItemData.vibrationValues)) { + vibrationValues = true; + Log.showInfo(TAG, `notificationItemData.vibrationValues is allowed = ${vibrationValues}`); + } + callback(sound, vibrationValues); + } + + + /** + * Get notification data of the notification + * + * @param {notificationItemData} The origin notification data + * @param {callback} The type to show notification + */ + getNotificationDataByApp(notificationItemData, callback) { + Log.showInfo(TAG, "getNotificationDataByApp start") + let mNotificationItemData : NotificationItemData = notificationItemData; + mNotificationItemData.ruleData = { + isAllowBanner: false, + isAllowSound: false, + isAllowVibrationValues: false, + isAllowStatusBarShow : false, + isAllowNotificationListShow : false + }; + Log.showInfo(TAG, `notificationItemData.slotLevel = ${notificationItemData.slotLevel}`); + if (notificationItemData.slotLevel === SlotLevel.LEVEL_HIGH) { + mNotificationItemData.ruleData.isAllowBanner = true; + this.SoundOrVibrate(notificationItemData, (sound, vibrationValues) => { + mNotificationItemData.ruleData.isAllowSound = sound; + mNotificationItemData.ruleData.isAllowVibrationValues = vibrationValues; + }); + mNotificationItemData.ruleData.isAllowStatusBarShow = true; + mNotificationItemData.ruleData.isAllowNotificationListShow = true; + + } else if (notificationItemData.slotLevel === SlotLevel.LEVEL_DEFAULT) { + this.SoundOrVibrate(notificationItemData, (sound, vibrationValues) => { + mNotificationItemData.ruleData.isAllowSound = sound; + mNotificationItemData.ruleData.isAllowVibrationValues = vibrationValues; + }); + mNotificationItemData.ruleData.isAllowStatusBarShow = true; + mNotificationItemData.ruleData.isAllowNotificationListShow = true; + } else if (notificationItemData.slotLevel === SlotLevel.LEVEL_LOW || + notificationItemData.slotLevel === SlotLevel.LEVEL_MIN) { + mNotificationItemData.ruleData.isAllowNotificationListShow = true; + } else { + mNotificationItemData.ruleData.isAllowNotificationListShow = false; + } + Log.showInfo(TAG, `mNotificationItemData.ruleData = ${JSON.stringify(mNotificationItemData.ruleData)}`); + callback(mNotificationItemData); + } + + + + /** + * Check the sense of the phone to update the show type + * + * @param {notificationItemData} The origin notification data + * @param {callback} The final notification data + */ + updateNotificationDataBySense(notificationItemData, callback) { + Log.showInfo(TAG, "updateNotificationDataBySense start") + let mNotificationItemData = notificationItemData; + // TODO Scenario Management + callback(mNotificationItemData); + } + +} + +let ruleController = new RuleController(); + +export default ruleController as RuleController; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index d9dbef0e..e48c7011 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,23 +13,28 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import Constants from '../common/constants.ets'; -import NotificationItem from './item/notificationItem.ets' -import ViewModel from '../viewmodel/ViewModel.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import Constants, {NotificationLayout as Layout} from '../common/constants'; +import NotificationItem from './item/notificationItem' +import GroupNotificationItem from './item/groupItem' +import ViewModel from '../viewmodel/ViewModel' const TAG = 'NoticeItem-NotificationListComponent'; +type NotificationLayoutConfig = { + itemMargin: number; +} + @Component export default struct NotificationListComponent { + @Provide('notificationUpdate') update: number = 0; @StorageLink('notificationList') notificationList: any[] = [] - @StorageProp('maxHeight') maxHeight: number = 0 - @StorageProp('minHeight') minHeight: number = 0 - @State notificationH: number = 0 + private config: NotificationLayoutConfig = { + itemMargin: Layout.ITEM_MARGIN + } aboutToAppear() { Log.showInfo(TAG, `notificationList, aboutToAppear`) - this.notificationH = this.maxHeight - (this.minHeight * 2) - Constants.QUICKLY_SETTING_H; } aboutToDisappear() { @@ -37,37 +42,21 @@ export default struct NotificationListComponent { } build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - if (this.notificationList.length == 0) { - //text: no notification - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { - Text($r('app.string.nonotification_text')) - .fontColor($r('app.color.nonotification_text_color')) + List({ space: this.config.itemMargin }) { + if (this.update && false) { + ListItem() { } - } else { - Stack({ alignContent: Alignment.TopStart }) { - List() { - ForEach(this.notificationList, (item: any) => { - ListItem() { - NotificationItem({ itemData: item }) - } - }, (item: any) => `${item.hashcode}_${item.timestamp}`) + } + ForEach(this.notificationList, (item: any) => { + ListItem() { + if (item.length > 1) { + GroupNotificationItem({ groupData: item }) + } else { + NotificationItem({ itemData: item[0] }) } - .onTouch((event: TouchEvent) => { - Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) - event.stopPropagation(); - }) - - Flex() { //bottom Line - }.width('100%').height('7%') - .opacity($r('app.float.deleteall_image_opacity')) - .position({ x: 0, y: '93%' }) } - .width('100%') - .height('100%') - } + }, (list: any) => JSON.stringify(list.map((item) => item.hashcode))) } .width('100%') - .height(this.notificationH) } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets index 8684ecaf..bfdf349d 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import ViewModel from '../../viewmodel/ViewModel.ets'; -import Constants, {InputActionButtonData} from '../../common/constants.ets'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import ViewModel from '../../viewmodel/ViewModel'; +import Constants, {InputActionButtonData, NotificationLayout as Layout} from '../../common/constants'; const TAG = 'NoticeItem-ActionComponent'; @@ -39,8 +39,8 @@ export default struct ActionComponent { } build() { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - if (CheckEmptyUtils.isEmpty(this.inputData) && !this.inputActionData.isSending) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + if (!this.inputData) { ForEach(this.itemData.actionButtons, (item: any) => { ActionButton({ content: item.title, @@ -56,28 +56,26 @@ export default struct ActionComponent { } else { TextInput({ placeholder: this.placeholder, text: this.inputActionData.content }) .type(InputType.Normal) - .borderRadius(12) .caretColor(Color.Green) - .backgroundColor(Color.White) .enterKeyType(EnterKeyType.Send) - .height($r("app.float.action_button_height")) + .height(Layout.INPUT_TEXT_HEIGHT) .enabled(this.inputActionData.isSending ? false : true) - .width('80%') - .margin({ right: $r("app.float.action_button_padding") }) - ActionButton({ - content: this.inputActionData.isSending ? $r('app.string.Sending') : $r('app.string.enter'), - clickable: !this.inputActionData.isSending, - clickEvent: () => { - ViewModel.clickReply(this.inputData?.inputKey, this.placeholder, this.inputData?.wantAgent); + .flexGrow(1) + .margin({ right: Layout.ACTION_MARGIN }) + Image($r("app.media.send")) + .objectFit(ImageFit.Contain) + .width(Layout.INPUT_IMAGE_SIZE) + .height(Layout.INPUT_IMAGE_SIZE) + .onClick(() => { + ViewModel.clickReply(this.inputData.inputKey, this.placeholder, this.inputData.wantAgent); this.inputActionData = { isSending: true, content: this.placeholder }; AppStorage.SetOrCreate(Constants.KEY_INPUT + this.itemData.id, this.inputActionData); - } - }) + }) } - }.margin({ top: 10 }) + }.height(!this.inputData ? Layout.ACTION_HEIGHT : Layout.INPUT_LAYOUT_HEIGHT) } } @@ -86,31 +84,23 @@ struct ActionButton { @State backgroundColor: Resource = $r("app.color.transparent"); @Prop content: string; clickable: boolean = true; - clickEvent: Function = () => { + clickEvent: () => void = () => { }; - aboutToAppear() { - Log.showInfo(TAG, `ActionButton ${this.content} aboutToAppear Start`); - } - - aboutToDisappear() { - Log.showInfo(TAG, `ActionButton ${this.content} aboutToDisAppear`); - } - build() { Text(this.content) - .fontSize(20) - .height($r("app.float.action_button_height")) - .borderRadius(4) - .fontColor($r("app.color.action_button_color")) - .padding({ left: $r("app.float.action_button_padding"), right: $r("app.float.action_button_padding") }) + .fontSize($r("sys.float.ohos_id_text_size_button2")) + .fontColor($r("sys.color.ohos_id_color_text_primary_activated")) + .borderRadius($r("sys.float.ohos_fa_corner_radius_default_s")) + .height(Layout.ACTION_HEIGHT) + .padding({ left: Layout.ACTION_MARGIN, right: Layout.ACTION_MARGIN }) .backgroundColor(this.backgroundColor) .onTouch((event: TouchEvent) => { if (!this.clickable) { return; } if (event.type == TouchType.Down) { - this.backgroundColor = $r("app.color.action_button_click_color"); + this.backgroundColor = $r("sys.color.ohos_fa_click_effect"); } else if (event.type == TouchType.Up) { this.backgroundColor = $r("app.color.transparent"); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets new file mode 100644 index 00000000..d205b9b4 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import WindowManager, { WindowType } from '../../../../../../../../../../common/src/main/ets/default/WindowManager' +import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import ViewModel from '../../viewmodel/ViewModel'; +import CustomItem from './customItem'; +import titleItem from './titleItem'; +import basicItem from './basicItem'; +import longItem from './longItem'; +import multiItem from './multiItem'; +import pictureItem from './pictureItem'; +import ActionComponent from './actionComponent'; +import DevicesDialog from './devicesDialog'; +import WantAgent from '@ohos.wantAgent'; + +const TAG = 'NoticeItem-BannerNotificationItem' +const INTERVAL = 5 * 1000 + + +@Component +export default struct BannerNotificationItem { + @State want : any = {}; + @Link distributedDeviceName: string; + @Link mBannerNoticeCnt: number; + @Link mLastActionTime: number; + @Link needExpand: boolean; + @Link isExpand: boolean; + @State mCloseEnableFlg: boolean = false; + private nowWant: any; + private onBannerNoticeHide: () => void + private devicesDialogController: CustomDialogController = new CustomDialogController({ + builder: DevicesDialog({ + action: (deviceID) => this.selectedDevice(deviceID) + }), + autoCancel: false, + offset: { dx: 0, dy: 200 } + }); + + mInterval: number = INTERVAL; + mDefaultBannerRect: any; + expandPaddingBottom: number = Layout.EXPAND_PADDING_BOTTOM; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + setAppBgColor('#00000000') + this.mCloseEnableFlg = false; + this.mDefaultBannerRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect'); + setTimeout(() => { + this.hideWindowForTimeout(); + }, this.mInterval); + Log.showInfo(TAG, `aboutToAppear End`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`) + } + + build() { + Column() { + if (this.mBannerNoticeCnt > 0) { + if (this.want.template) { + CustomItem({ customItemData: this.want, isSubItem: false }) + } else { + Row() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Row() { + titleItem({ + notificationSmallIcon: this.want.smallIcon, + notificationName: this.want.appName, + notificationTime: this.want.time, + isExpand: $isExpand, + needExpand: this.needExpand, + distributedDeviceName: this.distributedDeviceName, + isSubItem: false, + clickTitleAction: () => this.refreshLastActionTime() + }) + } + Row() { + Image($r('app.media.ic_close')) + .objectFit(ImageFit.Contain) + .width(Layout.TITLE_IMAGE_SIZE) + .height(Layout.TITLE_IMAGE_SIZE) + .margin({ left: Layout.ICON_MARGIN }) + .visibility(this.mCloseEnableFlg ? Visibility.Visible : Visibility.None) + .onClick(this.clickCloseIcon.bind(this)) + } + } + .margin({ left: 12, right: 12 }) + .height(Layout.TITLE_HEIGHT) + } + Row() { + ContentComponent({ + isExpand: this.isExpand, + itemData: this.want + }); + if (this.isExpand && this.want.actionButtons.length) { + ActionComponent({ itemData: this.want }) + } else { + Blank() + .height(Layout.ITEM_MARGIN) + } + } + .padding({ + bottom: $r('app.float.item_paddingbottom') + }) + .onClick(this.showDevicesDialog.bind(this)) + .onAreaChange((e, e2) => { + Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + let heightEx = parseInt(e['height']); + let heightCur = parseInt(e2['height']); + let heightWin = parseInt(this.mDefaultBannerRect['height']); + if (this.isExpand) { + heightWin = heightWin + (heightCur - heightEx) + this.expandPaddingBottom; + } + let bannerRect = { + top: this.mDefaultBannerRect['top'], + left: this.mDefaultBannerRect['left'], + width: this.mDefaultBannerRect['width'], + height: heightWin + }; + WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, bannerRect); + WindowManager.showWindow(WindowType.BANNER_NOTICE); + }) + } + } else { + Row() { + Blank() + } + } + } + .width('100%') + .height('100%') + .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) + .backgroundColor($r('app.color.notificationitem_background')) + .clip(true) + .onHover((isHover) => { + this.mCloseEnableFlg = isHover; + }) + } + + isCreateNewNotification(notificationCount:number):boolean{ + Log.showInfo(TAG, `isCreateNewNotification, notificationCount: ${notificationCount}`); + return true; + } + + hideWindowForTimeout() { + Log.showInfo(TAG, `check need hide window or not.`) + if ((new Date()).getTime() - this.mLastActionTime >= this.mInterval) { + if (this.mCloseEnableFlg) { + this.mLastActionTime = (new Date()).getTime(); + setTimeout(() => { + this.hideWindowForTimeout(); + }, this.mInterval); + return; + } + this.onBannerNoticeHide(); + } else { + setTimeout(() => { + this.hideWindowForTimeout(); + }, this.mInterval); + } + } + + clickCloseIcon() { + Log.showInfo(TAG, 'clickCloseIcon'); + this.onBannerNoticeHide(); + } + + showDevicesDialog() { + Log.showInfo(TAG, `showDevicesDialog`) + if (!this.want?.distributedOption?.isDistributed) { + ViewModel.clickItem(this.want); + this.onBannerNoticeHide(); + return; + } + let wantAgent = this.want?.want; + if (!!wantAgent) { + WantAgent.getWant(wantAgent).then((wantData) => { + this.nowWant = wantData + if (!wantData?.deviceId) { + this.devicesDialogController.open(); + } else{ + ViewModel.clickItem(this.want); + } + this.onBannerNoticeHide(); + }) + } + } + + selectedDevice(deviceID) { + Log.showInfo(TAG, `selectedDevice deviceID:${deviceID}`) + this.nowWant.deviceId = deviceID; + let triggerInfo = { + code: 0, + want: this.nowWant, + permission: '', + extraInfo: {} + }; + ViewModel.clickDistributionItem(this.want, triggerInfo) + } + + refreshLastActionTime() { + this.mLastActionTime = (new Date()).getTime(); + setTimeout(() => { + this.hideWindowForTimeout(); + }, this.mInterval); + } + +} + +@Component +struct ContentComponent { + @Prop isExpand: boolean; + itemData: any; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToDisappear pict: ${this.itemData.picture}`); + Log.showInfo(TAG, `NotificationItemData: ${JSON.stringify(this.itemData)}`) + } + + build() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Row() { + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC) { + basicItem({ + itemData: this.itemData + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { + longItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { + multiItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_PICTURE) { + pictureItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + }.flexGrow(1) + + if (this.itemData.picture) { + Image(this.itemData.picture) + .objectFit(ImageFit.Contain) + .width(Layout.NOTIFICATION_PIC_SIZE) + .height(Layout.NOTIFICATION_PIC_SIZE) + } + }.margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets index 415d257a..03886ba1 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,28 +13,28 @@ * limitations under the License. */ -import Constants,{NotificationItemData} from '../../common/constants.ets'; - +import Constants, {NotificationItemData, NotificationLayout as Layout} from '../../common/constants'; @Component export default struct BasicItem { @State itemData: NotificationItemData = undefined build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Column() { Text(this.itemData.title) - .maxLines(Constants.DEFAULT_MAX_LINES) + .maxLines(Constants.SINGLE_LINE) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Medium) + .lineHeight(Layout.TEXT_LINE_HEIGHT) Text(this.itemData.text) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Clip }) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - .margin({ top: $r('app.float.content_margin_top') }) - }.width('100%') + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + } + .alignItems(HorizontalAlign.Start) } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets index 96f024fc..782d3fe7 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,8 +13,8 @@ * limitations under the License. */ -import Constants from '../../common/constants.ets'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import Constants from '../../common/constants'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NoticeItem-Confirm'; @@ -30,18 +30,19 @@ export default struct ConfirmDialog { build() { - Column({ space: 30 }) { + Column() { Row() { Text(this.title) .fontSize($r('app.float.confirm_title_fontsize')) .fontWeight(FontWeight.Bold) }.width(Constants.SETTING_DIALOG_WITH) - .margin({ top: 20 }) + .margin({top:$r('app.float.title_font_margin_t')}) Row() { Text($r('app.string.confirm_message', this.bundleName)) .fontSize($r('app.float.confirm_cont_fontsize')) }.width(Constants.SETTING_DIALOG_WITH) + .margin({top:$r('app.float.message_font_margin_t')}) Row() { Column() { @@ -53,7 +54,6 @@ export default struct ConfirmDialog { }) .alignItems(HorizontalAlign.Center) .width(Constants.CONFIRM_BUTTON_WITH) - Divider() .vertical(true) .color($r('app.color.confirm_divider_color')) @@ -63,7 +63,6 @@ export default struct ConfirmDialog { Text($r('app.string.close')) .fontSize($r('app.float.confirm_cont_fontsize')) .fontColor(Color.Red) - }.onClick(() => { Log.showInfo(TAG, `confirm button of TimeDialog on click`) this.controller.close(); @@ -73,8 +72,11 @@ export default struct ConfirmDialog { .width(Constants.CONFIRM_BUTTON_WITH) } .width(Constants.CONFIRM_DIALOG_WITH) - .height($r('app.float.confirm_button_height')) + .margin({top:$r('app.float.confirm_button_margin_t')}) }.height(Constants.CONFIRM_DIALOG_HEIGHT) - + .width(Constants.SETTING_DIALOG_WIDTH) + .backgroundColor('#FFFFFFFF') + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.notification_border_radius') }) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets index ecee556c..ef58955b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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,8 +14,10 @@ */ -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; -import ViewModel from '../../viewmodel/ViewModel.ets'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import ViewModel from '../../viewmodel/ViewModel'; +import NotificationManager from '../../model/NotificationManager'; +import {NotificationLayout as Layout} from '../../common/constants'; const TAG = 'NoticeItem-CustomItem'; @@ -24,19 +26,23 @@ export default struct CustomItem { private customItemData: any = {}; private template: any = {}; private templateData: any = {}; - @State isDebugMode: boolean = false; + private isSubItem: boolean= false; + private isDebugMode: boolean = false; + private clickAction: () => void aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) this.template = ViewModel.getPluginTempLate(this.customItemData.template.name); this.templateData = this.customItemData.template.data; + this.isDebugMode = NotificationManager.isDebugMode(TAG); Log.showInfo(TAG, `template = ${JSON.stringify(this.template)}`) Log.showInfo(TAG, `templateData = ${JSON.stringify(this.templateData)}`) + Log.showInfo(TAG, `isDebugMode = ${this.isDebugMode}`) } build() { - Stack({ alignContent: Alignment.TopStart }) { - Column() { + Stack({ alignContent: Alignment.TopEnd }) { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { PluginComponent({ template: this.template, data: this.templateData @@ -45,31 +51,25 @@ export default struct CustomItem { }).onError(({errcode, msg}) => { Log.showInfo(TAG, `Error code:${errcode} message:${msg}`) }) - .size({ width: 400, height: 130 }) + .size({ width: '100%', height: 110 }) } - .backgroundColor($r('app.color.notificationitem_background')) - .opacity($r('app.float.item_opicaty')) - .borderRadius($r('app.float.item_borderradius')) - .margin({ - left: $r('app.float.item_marginleft'), - right: $r('app.float.item_marginright'), - top: $r('app.float.item_margintop') - }) - .padding({ - left: $r('app.float.item_paddingleft'), - right: $r('app.float.item_paddingright'), - bottom: $r('app.float.item_paddingbottom') + .margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) + .onClick(() => { + this.clickAction(); }) if (this.isDebugMode) { Column() { Text("-- DEBUG --") - .fontSize('32') + .fontSize('20') .fontWeight(FontWeight.Bold) .fontColor(0xCCCCCC) .opacity(0.5) }.margin(10) } + } + .borderRadius(!this.isSubItem ? $r('app.float.item_borderradius') : 0) + .clip(true) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets new file mode 100644 index 00000000..87ae30ea --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2021-2022 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 Constants from '../../common/constants'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import DistributionManager from '../../model/NotificationDistributionManager'; + +const TAG = 'NoticeItem-DevicesDialog'; + + +/** + * Devices dialog + */ +@CustomDialog +export default struct DevicesDialog { + private deviceInfoList: Array; + public controller: CustomDialogController + public action: (deviceID) => void + + build() { + Column({ space: 30 }) { + Row() { + Text($r('app.float.confirm_title_fontsize')) + .fontSize($r('app.float.confirm_title_fontsize')) + .fontWeight(FontWeight.Bold) + }.width(Constants.SETTING_DIALOG_WITH) + .margin({ top: 20 }) + + Column() { + List() { + ForEach(this.deviceInfoList, (item) => { + ListItem() { + Row() { + Column() { + Text(item.deviceName) + .fontSize($r('app.float.setting_cont_fontsize')) + .fontColor($r('app.color.dialog_font_color')) + .height(Constants.SETTING_CONT_HEIGHT) + + }.alignItems(HorizontalAlign.Center) + .width(Constants.FULL_CONTAINER_WIDTH) + } + .width(Constants.SETTING_DIALOG_WITH) + .alignItems(VerticalAlign.Center) + .align(Alignment.Center) + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.setting_border_radius') }) + .backgroundColor($r('app.color.dialog_font_back_color')) + .onClick(() => { + this.action(item.deviceId); + this.controller.close(); + }) + } + }) + } + .divider({ + strokeWidth: 1, + color: $r('app.color.device_divider_color'), + startMargin: $r('app.float.device_divider_margin_l'), + endMargin: $r('app.float.device_divider_margin_r') + }) + .width(Constants.FULL_CONTAINER_WIDTH) + .visibility(Visibility.Visible) + .zIndex(0) + .border({ width: $r('app.float.device_border_width'), color: Color.White, + radius: $r('app.float.device_border_radius') }) + .backgroundColor(Color.White) + } + .margin({ bottom: $r("app.float.device_margin_16") }) + + Row() { + Column() { + Text($r('app.string.cancel')) + .fontSize($r('app.float.device_button_font')) + .fontColor(Color.Blue) + + }.onClick(() => { + this.controller.close(); + }) + .width(Constants.FULL_CONTAINER_WIDTH) + .alignItems(HorizontalAlign.Center) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .margin({ top: $r("app.float.device_margin_16"), bottom: $r("app.float.device_margin_16") }) + + + }.height(Constants.CONFIRM_DIALOG_HEIGHT) + + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.deviceInfoList = DistributionManager.getInstance().getTrustedDeviceListSync(); + Log.showInfo(TAG, `aboutToAppear deviceInfoList:${JSON.stringify(this.deviceInfoList)}`) + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index 93303174..2374770f 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,39 +13,50 @@ * limitations under the License. */ -import Constants from '../../common/constants.ets'; -import basicItem from './basicItem.ets'; -import longItem from './longItem.ets'; -import multiItem from './multiItem.ets'; -import pictureItem from './pictureItem.ets'; -import titleItem from './titleItem.ets'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import ViewModel from '../../viewmodel/ViewModel.ets'; -import ActionComponent from './actionComponent.ets'; +import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import basicItem from './basicItem'; +import longItem from './longItem'; +import multiItem from './multiItem'; +import pictureItem from './pictureItem'; +import titleItem from './titleItem'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import ViewModel from '../../viewmodel/ViewModel'; +import ActionComponent from './actionComponent'; const TAG = 'NoticeItem-GeneralItem'; @Component export default struct GeneralItem { - private generalItemData: any = {} + @Consume('notificationUpdate') updateFlag: number; @State hasPicture: boolean = false - @State isExpand: boolean = false + @State @Watch('expandChange') isExpand: boolean = false @State needExpand: boolean = true + @State distributedDeviceName: string = '' + private itemData: any = {} + private clickAction: () => void + private isSubItem: boolean= false; + + expandChange() { + this.updateFlag++; + } aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) - if (CheckEmptyUtils.isEmpty(this.generalItemData.largeIcon)) { + if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { this.hasPicture = false; } else { this.hasPicture = true; } this.needExpand = this.checkItemNeedExpand() + ViewModel.getDistributedDeviceName(this.itemData).then((deviceName) => { + this.distributedDeviceName = deviceName; + }) } checkItemNeedExpand() { - if (this.generalItemData.contentType === Constants.NOTIFICATION_TYPE_BASIC - && (!(this.generalItemData.actionButtons?.length > 0))) { + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC + && (!(this.itemData.actionButtons?.length > 0))) { return false; } else { return true; @@ -59,75 +70,75 @@ export default struct GeneralItem { build() { Column() { titleItem({ - notificationSmallIcon: this.generalItemData.smallIcon, - notificationName: this.generalItemData.appName, - notificationTime: this.generalItemData.time, + notificationSmallIcon: this.itemData.smallIcon, + notificationName: this.itemData.appName, + notificationTime: this.itemData.time, isExpand: $isExpand, - needExpand: this.needExpand + needExpand: this.needExpand, + distributedDeviceName: this.distributedDeviceName, + isSubItem: this.isSubItem, + clickTitleAction: () => null }) + ContentComponent({ + isExpand: this.isExpand, + itemData: this.itemData + }); - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - if (this.generalItemData.contentType === Constants.NOTIFICATION_TYPE_BASIC) { - basicItem({ - itemData: this.generalItemData - }); - } - if (this.generalItemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { - longItem({ - itemData: this.generalItemData, - isExpand: this.isExpand - }); - } - if (this.generalItemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { - multiItem({ - itemData: this.generalItemData, - isExpand: this.isExpand - }); - } - if (this.generalItemData.contentType === Constants.NOTIFICATION_TYPE_PICTURE) { - pictureItem({ - itemData: this.generalItemData, - isExpand: this.isExpand - }); - } - } - .width(this.hasPicture ? '85%' : '100%') - .margin({ top: $r('app.float.body_margin_top') }) + if (this.isExpand && this.itemData.actionButtons.length) { + ActionComponent({ itemData: this.itemData }) + } else { + Blank() + .height(Layout.ITEM_MARGIN) + } + }.onClick(() => { + this.clickAction(); + }) + } +} + +@Component +struct ContentComponent { + @Prop isExpand: boolean; + itemData: any; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToDisappear pict: ${this.itemData.picture}`); + } - if (this.hasPicture) { - Column() { - Image(this.generalItemData.largeIcon) - .objectFit(ImageFit.Contain) - .width(50) - .height(50) - } - .alignItems(HorizontalAlign.End) - .margin({ top: $r('app.float.body_margin_top') }) - .width('15%') + build() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Row() { + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC) { + basicItem({ + itemData: this.itemData + }); } - } - .onClick(() => { - ViewModel.clickItem(this.generalItemData); - }) + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { + longItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { + multiItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_PICTURE) { + pictureItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + }.flexGrow(1) - if (this.isExpand) { - ActionComponent({ itemData: this.generalItemData }) + if (this.itemData.picture) { + Image(this.itemData.picture) + .objectFit(ImageFit.Contain) + .width(Layout.NOTIFICATION_PIC_SIZE) + .height(Layout.NOTIFICATION_PIC_SIZE) } - } - .backgroundColor($r('app.color.notificationitem_background')) - .opacity($r('app.float.item_opicaty')) - .borderRadius($r('app.float.item_borderradius')) - .margin({ - left: $r('app.float.item_marginleft'), - right: $r('app.float.item_marginright'), - top: $r('app.float.item_margintop') - }) - .padding({ - left: $r('app.float.item_paddingleft'), - right: $r('app.float.item_paddingright'), - bottom: $r('app.float.item_paddingbottom') - }) - + }.margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) } -} +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets new file mode 100644 index 00000000..5e894951 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import NotificationItem from './notificationItem' +import titleItem from './titleItem'; +import IconListComponent, {getIconListSize} from './iconListComponent'; +import ScrollbarManager from '../../common/ScrollbarManager'; + +const TAG = 'NoticeItem-GroupItem'; + +@Component +export default struct GroupItem { + @Consume('notificationUpdate') updateFlag: number; + @State distributedDeviceName: string = '' + @State @Watch('expandChange') toExpand: boolean = false; + private groupData: any[] = [] + private mScroller: Scroller = new Scroller(); + @State mIconAlpha: number = 0; + @State @Watch('scrollEdge') mEdgeEnd: boolean = false; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`); + } + + expandChange() { + this.updateFlag++; + } + + build() { + Stack({ alignContent: Alignment.TopEnd }) { + Scroll(this.mScroller) { + Row() { + Column() { + Row() { + titleItem({ + notificationSmallIcon: this.groupData[0].smallIcon, + notificationName: this.groupData[0].appName, + notificationTime: this.groupData[0].time, + isExpand: $toExpand, + needExpand: true, + distributedDeviceName: this.distributedDeviceName, + clickTitleAction: () => null + }) + }.backgroundColor($r('app.color.notificationitem_background')) + .width(Constants.FULL_CONTAINER_WIDTH) + + Row() { + ContentList({ groupData: this.groupData, toExpand: this.toExpand }) + }.width(Constants.FULL_CONTAINER_WIDTH) + .enabled(!this.mEdgeEnd) + } + .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) + .clip(true) + + Row() { + IconListComponent({ iconAlpha: this.mIconAlpha, itemData: this.groupData[0], isGroup: true }) + }.width(getIconListSize()) + }.alignItems(VerticalAlign.Top) + } + .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) + .clip(true) + .scrollable(ScrollDirection.Horizontal) + .scrollBar(BarState.On) + .onScroll(() => { + this.mIconAlpha += 0.1; + this.mIconAlpha = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize(); + }) + .onScrollEnd(() => { + this.mEdgeEnd = (this.mEdgeEnd && + this.mScroller.currentOffset().xOffset > (getIconListSize() - Layout.SCROLL_THRESHOLD)) + || (!this.mEdgeEnd && this.mScroller.currentOffset().xOffset > Layout.SCROLL_THRESHOLD) + ScrollbarManager.restoreOtherScroll(this.mScroller); + }) + } + .width(Constants.FULL_CONTAINER_WIDTH) + } + + scrollEdge() { + this.mScroller.scrollEdge(this.mEdgeEnd ? Edge.End : Edge.Start) + } +} + + +@Component +struct ContentList { + @State @Watch('remainderChange') groupData: any[] = [] + @Prop toExpand: boolean + @State remainderNum: number= 0 + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.remainderNum = this.groupData.length - 2; + Log.showInfo(TAG, `aboutToAppear remainderNum:${this.remainderNum}`) + } + + build() { + Column() { + if (!this.toExpand) { + Column() { + Row({ space: 5 }) { + Text(this.groupData[0].title) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Medium) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + Text(this.groupData[0].text) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + Blank() + .margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) + }.width(Constants.FULL_CONTAINER_WIDTH) + .margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) + + Row({ space: 5 }) { + Text(this.groupData[1].title) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Medium) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + Text(this.groupData[1].text) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + Blank() + Text('+' + this.remainderNum) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.None }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .visibility((this.remainderNum > 0) ? Visibility.Visible : Visibility.Hidden) + .margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) + + Blank() + .height(Layout.ITEM_MARGIN) + }.width(Constants.FULL_CONTAINER_WIDTH) + .backgroundColor($r('app.color.notificationitem_background')) + .alignItems(HorizontalAlign.Start) + + } else { + List() { + ForEach(this.groupData, (item: any) => { + ListItem() { + NotificationItem({ itemData: item, isSubItem: true }) + } + }, (item: any) => `${item.hashcode}_${item.timestamp}_subitem`) + } + .divider({ + strokeWidth: 1, + color: $r('app.color.device_divider_color') + }) + } + } + .alignItems(HorizontalAlign.Start) + .width(Constants.FULL_CONTAINER_WIDTH) + } + + remainderChange() { + this.remainderNum = this.groupData.length - 2; + Log.showInfo(TAG, `aboutToAppear remainderNum:${this.remainderNum}`) + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets new file mode 100644 index 00000000..f4bf5289 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2021-2022 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 Constants, {NotificationLayout as Layout} from '../../common/constants'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import SettingDialog from './settingDialog'; +import ConfirmDialog from './confirmDialog' +import ViewModel from '../../viewmodel/ViewModel'; + +const TAG = 'NoticeItem-IconListComponent'; +let iconSize: number = 0; + +type IconData = { + src?: Resource; + callback?: () => void +} + +export type NotificationUiConfig = { + iconSize: number; +} + +export function getIconListSize(list?: IconData[]) { + let listSize = list?.length??iconSize; + return listSize * (Layout.BUTTON_SIZE + 2 * Layout.ICON_MARGIN) + Layout.ICON_MARGIN +} + +@Component +export default struct IconListComponent { + private itemData: any = {} + private isGroup: boolean= false; + @Prop iconAlpha: number + private settingDialogController: CustomDialogController = new CustomDialogController({ + builder: SettingDialog({ + itemData: this.itemData, + action: () => this.confirmDialogController.open() + }), + autoCancel: false, + offset: { dx: 0, dy: $r('app.float.setting_dialog_dy') }, + customStyle:true + }); + private confirmDialogController: CustomDialogController = new CustomDialogController({ + builder: ConfirmDialog({ + title: $r('app.string.closeNovice'), + bundleName: this.itemData.name, + action: () => ViewModel.enableNotification(this.itemData, false) + }), + autoCancel: false, + offset: { dx: 0, dy: $r('app.float.confirm_dialog_dy') }, + customStyle:true + }); + private iconConfigs: IconData[] = [ + { + src: $r("app.media.ic_public_settings_filled"), + callback: () => { + Log.showInfo(TAG, `click settings hashcode: ${this.itemData?.hashcode}`); + this.settingDialogController.open() + } + }, { + src: $r("app.media.ic_public_delete_filled"), + callback: () => { + if (!this.isGroup) { + Log.showInfo(TAG, `click delete hashcode: ${this.itemData?.hashcode}`); + ViewModel.removeNotificationItem(this.itemData, true) + } else { + Log.showInfo(TAG, `click delete groupName: ${this.itemData?.groupName}`); + ViewModel.removeGroupNotification(this.itemData, true) + } + } + } + ] + + aboutToAppear() { + Log.showInfo(TAG, `iconConfigs: ${JSON.stringify(this.iconConfigs)}`) + iconSize = this.iconConfigs.length; + } + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.End, justifyContent: FlexAlign.End }) { + ForEach(this.iconConfigs, (item) => { + Button({ type: ButtonType.Circle, stateEffect: true }) { + if (item.src) { + Image(item.src) + .objectFit(ImageFit.Contain) + .fillColor($r("sys.color.ohos_id_color_primary_contrary")) + .width(Layout.ICON_SIZE) + .height(Layout.ICON_SIZE) + } + } + .width(Layout.BUTTON_SIZE) + .height(Layout.BUTTON_SIZE) + .opacity(this.iconAlpha) + .backgroundColor($r("app.color.button_background")) + .margin({ left: Layout.ICON_MARGIN, right: Layout.ICON_MARGIN }) + .onClick(() => item.callback && item.callback()) + }) + } + .margin({ left: Layout.ICON_MARGIN }) + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets index b6151895..badcd6aa 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,7 +13,7 @@ * limitations under the License. */ -import Constants,{NotificationItemData} from '../../common/constants.ets'; +import Constants, {NotificationItemData, NotificationLayout as Layout} from '../../common/constants'; @Component export default @@ -22,22 +22,22 @@ struct LongItem { @Prop isExpand: boolean build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Column() { Text(this.isExpand ? this.itemData.expandedTitle : this.itemData.title) - .maxLines(Constants.DEFAULT_MAX_LINES) + .maxLines(Constants.SINGLE_LINE) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) //not support Resource type + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Medium) + .lineHeight(Layout.TEXT_LINE_HEIGHT) Text(this.isExpand ? this.itemData.longText : this.itemData.text) - .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.DEFAULT_MAX_LINES) + .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.SINGLE_LINE) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .constraintSize({ maxHeight: $r('app.float.notification_expanded_text_maxheight') }) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - .margin({ top: $r('app.float.content_margin_top') }) - }.width('100%') + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + } + .alignItems(HorizontalAlign.Start) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets index 4b972453..806da43a 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,7 +13,7 @@ * limitations under the License. */ -import Constants,{NotificationItemData} from '../../common/constants.ets'; +import Constants, {NotificationItemData, NotificationLayout as Layout} from '../../common/constants'; @Component export default struct MultiItem { @@ -21,31 +21,35 @@ export default struct MultiItem { @Prop isExpand: boolean build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Column() { Text(this.isExpand ? this.itemData.longTitle : this.itemData.title) - .maxLines(Constants.DEFAULT_MAX_LINES) + .maxLines(Constants.SINGLE_LINE) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Medium) + .lineHeight(Layout.TEXT_LINE_HEIGHT) if (this.isExpand) { ForEach(this.itemData.lines, (item: string) => { - Text(`${item}`) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .margin({ top: $r('app.float.content_margin_top') }) + Text(item) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) }, (item: string) => item.toString() ) } else { Text(this.itemData.text) - .fontSize($r('app.float.notification_content_fontsize')) - .maxLines(Constants.DEFAULT_MAX_LINES) + .maxLines(Constants.SINGLE_LINE) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontColor($r('app.color.content_text_color')) - .margin({ top: $r('app.float.content_margin_top') }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) } - }.width('100%') + }.alignItems(HorizontalAlign.Start) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 63bee3a4..2adc430a 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,126 +13,117 @@ * limitations under the License. */ -import Constants from '../../common/constants.ets'; -import GeneralItem from './generalItem.ets'; -import CustomItem from './customItem.ets'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import ViewModel from '../../viewmodel/ViewModel.ets'; -import SettingDialog from './settingDialog.ets'; -import ConfirmDialog from './confirmDialog.ets' +import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import GeneralItem from './generalItem'; +import CustomItem from './customItem'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import ViewModel from '../../viewmodel/ViewModel'; +import DevicesDialog from './devicesDialog'; +import WantAgent from '@ohos.wantAgent'; +import IconListComponent, {getIconListSize} from './iconListComponent'; +import ScrollbarManager from '../../common/ScrollbarManager'; const TAG = 'NoticeItem-NotificationItem'; @Component export default struct NotificationItem { - private itemData: any = {} - @State deleteIconDisplay: boolean = false; + @State mIconAlpha: number = 0; + @State @Watch('scrollEdge') mEdgeEnd: boolean = false; @State itemWidth: string = '100%' - startX: number = 0 - startY: number = 0 - @State moveX: number = 0 - @State moveY: number = 0 - settingDialogController: CustomDialogController = new CustomDialogController({ - builder: SettingDialog({ - itemData: this.itemData, - action: this.showConfirmDialog.bind(this) - }), - autoCancel: false, - offset: { dx: 0, dy: 200 } - }); - confirmDialogController: CustomDialogController = new CustomDialogController({ - builder: ConfirmDialog({ - title: $r('app.string.closeNovice'), - bundleName: this.itemData.name, - action: ViewModel.removeNotificationItem.bind(ViewModel, this.itemData, true) - }), - autoCancel: false, - offset: { dx: 0, dy: 250 } - }); - - aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) - } - - aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`); - } + private itemData: any = {} + private isSubItem: boolean= false; + private mScroller: Scroller = new Scroller(); build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - Row() { - Column() { - if (CheckEmptyUtils.isEmpty(this.itemData.template)) { - GeneralItem({ generalItemData: this.itemData }) - } else { - CustomItem({ customItemData: this.itemData }) - } - } - .onTouch(this.touchNotificationItem.bind(this)) - .width(this.itemWidth) + Stack() { + IconListComponent({ iconAlpha: this.mIconAlpha, itemData: this.itemData }) - if (this.deleteIconDisplay) { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { - Row({ space: 30 }) { - Image($r("app.media.ic_setting")) //setting - .objectFit(ImageFit.Contain) - .width($r('app.float.item_delete_image_width')) - .height($r('app.float.item_delete_image_height')) - .onClick(this.showSettingDialog.bind(this)) - if (this.itemData.isRemoveAllowed) { - Image($r('app.media.delete')) //delete - .objectFit(ImageFit.Contain) - .width($r('app.float.item_delete_image_width')) - .height($r('app.float.item_delete_image_height')) - .onClick(() => { - ViewModel.removeNotificationItem(this.itemData, true); - }) - } - } - } - .width('30%') + Scroll(this.mScroller) { + Row() { + FrontItem({ itemData: this.itemData, isSubItem: this.isSubItem }) + IconListComponent({ iconAlpha: 0, itemData: this.itemData }) } } - } + .scrollable(ScrollDirection.Horizontal) + .scrollBar(BarState.On) + .onScroll(() => { + this.mIconAlpha += 0.1; + this.mIconAlpha = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize(); + }) + .onScrollEnd(() => { + this.mEdgeEnd = (this.mEdgeEnd && + this.mScroller.currentOffset().xOffset > (getIconListSize() - Layout.SCROLL_THRESHOLD)) + || (!this.mEdgeEnd && this.mScroller.currentOffset().xOffset > Layout.SCROLL_THRESHOLD) + ScrollbarManager.restoreOtherScroll(this.mScroller); + }) + }.width(this.itemWidth) + .borderRadius(!this.isSubItem ? $r("sys.float.ohos_id_corner_radius_default_l") : 0) + .clip(!this.isSubItem) } - showSettingDialog() { - Log.showInfo(TAG, `showSettingDialog`) - this.settingDialogController.open() + scrollEdge() { + this.mScroller.scrollEdge(this.mEdgeEnd ? Edge.End : Edge.Start) } +} - showConfirmDialog() { - Log.showInfo(TAG, `showConfirmDialog`) - this.confirmDialogController.open() - } +@Component +struct FrontItem { + private itemData: any = {} + private nowWant: any; + private isSubItem: boolean= false; + private devicesDialogController: CustomDialogController = new CustomDialogController({ + builder: DevicesDialog({ + action: (deviceID) => this.selectedDevice(deviceID) + }), + autoCancel: false, + offset: { dx: 0, dy: 200 } + }); - touchNotificationItem(event: TouchEvent) { - if (event.type == Constants.TOUCH_TYPE_DOWN) { //down - this.startX = event.touches[0].x; - this.startY = event.touches[0].y; - Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`); - } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move - this.moveX = event.touches[0].x - this.startX; - this.moveY = event.touches[0].y - this.startY; - } else if (event.type == Constants.TOUCH_TYPE_UP) { //up - Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); - if (this.deleteIconDisplay) { - if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { - //hidden - this.deleteIconDisplay = false; - this.itemWidth = '100%'; - Log.showInfo(TAG, 'hidden'); - } + build() { + Column() { + if (this.itemData.template?.name) { + CustomItem({ customItemData: this.itemData, clickAction: () => this.showDevicesDialog(), isSubItem: this.isSubItem }) } else { - if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { - this.deleteIconDisplay = true; - this.itemWidth = '70%'; - Log.showInfo(TAG, 'display'); - } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { - ViewModel.removeNotificationItem(this.itemData, true); - } + GeneralItem({ itemData: this.itemData, clickAction: () => this.showDevicesDialog(), isSubItem: this.isSubItem }) } } + .width('100%') + .borderRadius(!this.isSubItem ? $r("sys.float.ohos_id_corner_radius_default_l") : 0) + .backgroundColor($r('app.color.notificationitem_background')) + } + + showDevicesDialog() { + Log.showInfo(TAG, `showDevicesDialog isDistributed: ${this.itemData?.distributedOption?.isDistributed}`) + if (!this.itemData?.distributedOption?.isDistributed) { + ViewModel.clickItem(this.itemData); + return; + } + let wantAgent = this.itemData?.want; + if (!!wantAgent) { + WantAgent.getWant(wantAgent).then((want) => { + this.nowWant = want + Log.showInfo(TAG, `showDevicesDialog want: ${JSON.stringify(this.nowWant)}`) + if (!want?.deviceId) { + this.devicesDialogController.open() + } else { + ViewModel.clickItem(this.itemData); + } + }) + } else { + ViewModel.clickItem(this.itemData); + } + } + + selectedDevice(deviceID) { + Log.showInfo(TAG, `selectedDevice deviceID:${deviceID}`) + this.nowWant.deviceId = deviceID; + let triggerInfo = { + code: 0, + want: this.nowWant, + permission: '', + extraInfo: {} + }; + ViewModel.clickDistributionItem(this.itemData, triggerInfo) } } + diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets index e4c966ea..3c033812 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,8 +13,8 @@ * limitations under the License. */ -import Constants, {NotificationItemData} from '../../common/constants.ets'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import Constants, {NotificationItemData, NotificationLayout as Layout} from '../../common/constants'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; @Component export default struct PictureItem { @@ -22,32 +22,23 @@ export default struct PictureItem { @Prop isExpand: boolean build() { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Text(this.isExpand ? this.itemData.expandedTitle : this.itemData.title) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - Text(this.isExpand ? this.itemData.text : this.itemData.briefText) - .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .constraintSize({ maxHeight: $r('app.float.notification_expanded_text_maxheight') }) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - .margin({ top: $r('app.float.content_margin_top') }) - if (!CheckEmptyUtils.isEmpty(this.itemData.picture) && this.isExpand) { - Column() { - Image(this.itemData.picture) - .objectFit(ImageFit.Contain) - .height($r("app.float.picture_default_height")) - } - .margin({ top: $r('app.float.content_margin_top') }) - } - } + + Column() { + Text(this.isExpand ? this.itemData.expandedTitle : this.itemData.title) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Medium) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + Text(this.isExpand ? this.itemData.briefText : this.itemData.text) + .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) } + .alignItems(HorizontalAlign.Start) } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets index 4c011d83..82569697 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,11 +13,11 @@ * limitations under the License. */ -import Constants,{NotificationItemData} from '../../common/constants.ets'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import FeatureAbilityManager from '../../../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; -import WindowManager from '../../../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import Constants,{NotificationItemData} from '../../common/constants'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import EventManager from "../../../../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainStartAbility} from "../../../../../../../../../../common/src/main/ets/default/event/EventUtil" import Notification from '@ohos.notification'; const TAG = 'NoticeItem-Setting'; @@ -32,9 +32,8 @@ export default struct SettingDialog { public action: () => void build() { - - Column({ space: 30 }) { - Row({ space: 10 }) { + Column({ space: 4 }) { + Row({ space: 4 }) { if (!CheckEmptyUtils.isEmpty(this.itemData.smallIcon)) { Image(this.itemData.smallIcon) .objectFit(ImageFit.Contain) @@ -43,8 +42,10 @@ export default struct SettingDialog { } Text(this.itemData.appName) .fontSize($r('app.float.setting_title_fontsize')) + .fontWeight(500) }.width(Constants.SETTING_DIALOG_WITH) - .margin({ top: 50 }) + .margin( {top: $r('app.float.notification_appname_margin_top')} ) + .height($r('app.float.title_font_height')) Row() { Column() { @@ -52,13 +53,13 @@ export default struct SettingDialog { .fontSize($r('app.float.setting_cont_fontsize')) .fontColor($r('app.color.dialog_font_color')) .height(Constants.SETTING_CONT_HEIGHT) - }.alignItems(HorizontalAlign.Center) .width(Constants.SETTING_CONTENT_WITH) } .width(Constants.SETTING_DIALOG_WITH) .alignItems(VerticalAlign.Center) .align(Alignment.Center) + .margin({ top: $r('app.float.close_notification_margin_top') }) .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.setting_border_radius') }) .backgroundColor($r('app.color.dialog_font_back_color')) @@ -68,17 +69,17 @@ export default struct SettingDialog { Column() { Text($r('app.string.moreSettings')) .fontSize($r('app.float.setting_cont_fontsize')) - .fontColor($r('app.color.dialog_font_color')) + .fontColor($r('app.color.dialog_font_back_color')) .height(Constants.SETTING_CONT_HEIGHT) }.alignItems(HorizontalAlign.Center) .width(Constants.SETTING_CONTENT_WITH) + .align(Alignment.Center) } .width(Constants.SETTING_DIALOG_WITH) .alignItems(VerticalAlign.Center) - .align(Alignment.Center) .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.setting_border_radius') }) - .backgroundColor($r('app.color.dialog_font_back_color')) + .backgroundColor($r('app.color.action_button_click_color')) .onClick(this.openAbility.bind(this)) Row() { @@ -88,11 +89,11 @@ export default struct SettingDialog { .textOverflow({ overflow: TextOverflow.Ellipsis }) .fontSize($r('app.float.setting_cont_fontsize')) .fontColor($r('app.color.dialog_font_back_color')) - .height(Constants.SETTING_CONT_HEIGHT) }.alignItems(HorizontalAlign.Center) .width(Constants.SETTING_CONTENT_WITH) } .width(Constants.SETTING_DIALOG_WITH) + .margin( {top: $r('app.float.notification_cancle_margin_top')} ) .alignItems(VerticalAlign.Center) .align(Alignment.Center) .border({ width: $r('app.float.setting_border_width'), color: Color.White, @@ -100,6 +101,10 @@ export default struct SettingDialog { .backgroundColor($r('app.color.dialog_font_color')) .onClick(this.closeAbility.bind(this)) }.height(Constants.SETTING_DIALOG_HEIGHT) + .width(Constants.SETTING_DIALOG_WIDTH) + .backgroundColor('#FFFFFFFF') + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.notification_border_radius') }) } closeNotification() { @@ -109,18 +114,8 @@ export default struct SettingDialog { openAbility() { Log.showInfo(TAG, ` openAbility:showNotificationManagement`) - let mWindowManager = new WindowManager(); - mWindowManager.setWindowMin((result) => { - Log.showInfo(TAG, `showNotificationManagement setWindowMin`) - let mFeatureAbilityManager = new FeatureAbilityManager() - mFeatureAbilityManager.openAbility(TAG, { - want: { - bundleName: 'com.ohos.systemui', - abilityName: 'com.ohos.systemui.notificationmanagement.MainAbility' - } - }); - }); - AppStorage.Set("showStatusBar", true); + EventManager.publish(obtainStartAbility('com.ohos.systemui', 'com.ohos.systemui.notificationmanagement.MainAbility', + { 'migrateUri': 'pages/setEnable', 'migrateBundle': this.itemData.bundleName })) this.closeAbility() } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets index beaaa7eb..5d894315 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets @@ -1,5 +1,5 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. +/* + * Copyright (c) 2021-2022 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 @@ -13,22 +13,23 @@ * limitations under the License. */ -import Constants from '../../common/constants.ets'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; const TAG = 'NoticeItem-TitleItem'; @Component -export default -struct TitleItem { +export default struct TitleItem { private notificationSmallIcon: PixelMap @Prop notificationName: string @Prop notificationTime: string - @State srcIconDisplay: any = $r('app.media.ic_notification_down') @Link isExpand: boolean @Prop needExpand: boolean @State rowSpace: any = $r('app.float.titleitem_row_space') + @Prop distributedDeviceName: string + private isSubItem: boolean= false; + private clickTitleAction: () => void aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`); @@ -39,37 +40,55 @@ struct TitleItem { } build() { - Row() { - Row({ space: this.rowSpace }) { - if (!CheckEmptyUtils.isEmpty(this.notificationSmallIcon)) { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + if (!this.isSubItem) { + if (this.notificationSmallIcon) { Image(this.notificationSmallIcon) .objectFit(ImageFit.Contain) - .width($r('app.float.title_image_width')) - .height($r('app.float.title_image_height')) - .flexShrink(0) + .width(Layout.TITLE_IMAGE_SIZE) + .height(Layout.TITLE_IMAGE_SIZE) } - Text(this.notificationName) - .maxLines(Constants.DEFAULT_MAX_LINES) - .fontSize($r('app.float.title_name_fontsize')) - .flexShrink(1) - Text(this.notificationTime) - .fontSize($r('app.float.title_time_fontsize')) - .flexShrink(0) + Row() { + Text(this.notificationName) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body3")) + .fontWeight(FontWeight.Regular) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .maxLines(Constants.SINGLE_LINE) + }.margin({ left: 8 }) } - .width(this.needExpand ? '80%' : '100%') + Text(this.notificationTime) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body3")) + .fontWeight(FontWeight.Regular) + .maxLines(Constants.SINGLE_LINE) + .flexGrow(0) + .margin({ left: !this.isSubItem ? 8 : 0, right: 8 }) + Text($r('app.string.distributed_devicename', this.distributedDeviceName)) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body3")) + .fontWeight(FontWeight.Regular) + .maxLines(Constants.SINGLE_LINE) + .visibility((this.distributedDeviceName ? true : false) ? Visibility.Visible : Visibility.None) + + Blank() if (this.needExpand) { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End, alignItems: ItemAlign.Center }) { - Image(this.srcIconDisplay) + if (this.isExpand) { + Image($r('app.media.ic_notification_up')) + .objectFit(ImageFit.Contain) + .width(Layout.TITLE_IMAGE_SIZE) + .height(Layout.TITLE_IMAGE_SIZE) + } else { + Image($r('app.media.ic_notification_down')) .objectFit(ImageFit.Contain) - .width($r('app.float.displayicon_width')) - .height($r('app.float.displayicon_height')) + .width(Layout.TITLE_IMAGE_SIZE) + .height(Layout.TITLE_IMAGE_SIZE) } - .width('20%') } } - .height($r('app.float.titleitem_height')) - .width('100%') + .margin({ left: 12, right: 12 }) + .height(Layout.TITLE_HEIGHT) .onClick(this.clickTitleItem.bind(this)) } @@ -78,10 +97,11 @@ struct TitleItem { if (this.needExpand) { if (this.isExpand) { this.isExpand = false; - this.srcIconDisplay = $r('app.media.ic_notification_down'); } else { this.isExpand = true; - this.srcIconDisplay = $r('app.media.ic_notification_up'); + } + if (this.clickTitleAction) { + this.clickTitleAction(); } } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts new file mode 100644 index 00000000..2a54549e --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -0,0 +1,420 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import SwitchUserManager from '../../../../../../../../../common/src/main/ets/default/SwitchUserManager'; +import media from '@ohos.multimedia.media'; +import vibrator from '@ohos.vibrator'; +import wantAgent from '@ohos.wantAgent'; +import SourceType from '@ohos.notification' +import NotificationService from '../model/NotificationService' +import NotificationWindowManager from '../model/NotificationWindowManager'; +import NotificationConfig from '../model/NotificationConfig'; +import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import AbilityManager from "../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager" +import EventManager from "../../../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainLocalEvent} from "../../../../../../../../../common/src/main/ets/default/event/EventUtil" +import CommonUtil from '../common/CommonUtil'; +import Constants from '../common/constants'; + +const TAG = 'NotificationViewModel'; + +/** + * Notification ViewModel class. + */ +export class ViewModel { + audioPlayer: any; + mNotificationList: any[]; + mCallback: any; + mNotificationCtrl: any = {}; + + constructor() { + Log.showInfo(TAG, `constructor`); + this.mNotificationList = []; + this.audioPlayer = media.createAudioPlayer(); + // this.audioPlayer.src = 'file://system/etc/capture.ogg'; + SwitchUserManager.getInstance().registerListener(this); + this.initFlowControlInfos(); + SwitchUserManager.getInstance() + .getCurrentUserInfo() + .then((userInfo) => this.registerCallback(userInfo.userId)) + .catch((err) => Log.showError(TAG, `Can't get current user, err: ${err}`)); + } + + registerCallback(userId) { + this.mCallback = { + userId: userId, + onNotificationConsume: this.onNotificationConsume.bind(this), + onNotificationCancel: this.onNotificationCancel.bind(this) + } + NotificationService.register(this.mCallback); + } + + unregisterCallback() { + NotificationService.unRegister(this.mCallback); + } + + userChange(userInfo) { + Log.showInfo(TAG, `UserChange, userInfo: ${JSON.stringify(userInfo)}`); + this.unregisterCallback(); + this.mNotificationList.length = 0; + this.initFlowControlInfos(); + this.registerCallback(userInfo.userId); + this.updateNotification(); + NotificationService.loadAllNotifications(); + } + + /** + * notification CancelCallback + * + * @param {Object} data - return notificationItemData. + */ + onNotificationConsume(notificationItemData) { + if (notificationItemData === undefined) { + Log.showInfo(TAG, `onNotificationConsume notificationItemData is undefined`); + return; + } + this.onNotificationCancel(notificationItemData.hashcode) + Log.showInfo(TAG, `onNotificationConsume ${JSON.stringify(notificationItemData)}`); + //Verify the notifications can be displayed + if (!this.isCanShow(notificationItemData.bundleName)) { + //can not displayed + return; + } + + if (notificationItemData.ruleData.isAllowStatusBarShow) { + //TODO statusbar show + } + if (notificationItemData.ruleData.isAllowNotificationListShow) { + this.mNotificationList.unshift(notificationItemData); + Log.showInfo(TAG, `reminder start `); + this.reminderWay(notificationItemData); + Log.showInfo(TAG, `reminder end `); + this.updateFlowControlInfos(notificationItemData.bundleName, true) + } + this.updateNotification(); + } + + /** + * notification CancelCallback + */ + onNotificationCancel(hashCode: string) { + Log.showInfo(TAG, `onNotificationCancel hashCode: ${JSON.stringify(hashCode)}`); + // Common Notification Deletion Logic Processing + for (let i = 0, len = this.mNotificationList.length; i < len; i++) { + if (this.mNotificationList[i].hashcode == hashCode) { + Log.showInfo(TAG, `removeNotificationItem i = ${i}`); + let removeItemArr = this.mNotificationList.splice(i, 1); + Log.showInfo(TAG, `onNotificationCancel removeItemArr= ${JSON.stringify(removeItemArr)}`); + if (!CheckEmptyUtils.isEmpty(removeItemArr)) { + this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + } + this.updateNotification(); + break; + } + } + } + + updateNotification() { + Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(this.mNotificationList)}`); + Log.showInfo(TAG, `updateNotification length: ${this.mNotificationList.length}`); + this.sortNotification() + let notificationList = this.groupByGroupName(); + AppStorage.SetOrCreate('notificationList', notificationList); + } + + groupByGroupName(): any[]{ + Log.showInfo(TAG, `groupByGroupName`); + if (!this.mNotificationList || this.mNotificationList.length < 1) { + return []; + } + let groupArr: any[] = []; + let groups = {}; + this.mNotificationList.forEach((item) => { + const groupName = `${item.bundleName}_${item.groupName}`; + Log.showInfo(TAG, `groupByGroupName groupName:${groupName}`); + if (!groups[groupName] || groups[groupName].length < 1) { + groups[groupName] = []; + groupArr.push(groups[groupName]); + } + groups[groupName].push(item) + }) + Log.showInfo(TAG, `groupByGroupName groupArr:${JSON.stringify(groupArr)}`); + return groupArr; + } + + + /** + * Sort the notifications. + */ + sortNotification() { + Log.showInfo(TAG, `sortNotification`); + if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { + return + } + this.mNotificationList.sort((itemA, itemB) => { + //long term notification come first + if (itemA.source == SourceType.TYPE_CONTINUOUS && itemB.source != SourceType.TYPE_CONTINUOUS) { + return -1 + } + //long term notification come first + if (itemA.source != SourceType.TYPE_CONTINUOUS && itemB.source == SourceType.TYPE_CONTINUOUS) { + return 1 + } + if ((itemA.source == SourceType.TYPE_CONTINUOUS && itemB.source == SourceType.TYPE_CONTINUOUS) || + (itemA.source != SourceType.TYPE_CONTINUOUS && itemB.source != SourceType.TYPE_CONTINUOUS) + ) { + return -1 * (itemA.timestamp - itemB.timestamp) + } + }) + } + + /** + * Remove all notifications. + */ + removeAllNotifications() { + Log.showInfo(TAG, `removeAllNotifications`); + if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { + this.mNotificationList = [] + } else { + let index = this.mNotificationList.length + while (index--) { + Log.showInfo(TAG, `removeAllNotifications isRemoveAllowed: ${index} ${this.mNotificationList[index].isRemoveAllowed} `); + Log.showInfo(TAG, `removeAllNotifications isOngoing: ${index} ${this.mNotificationList[index].isOngoing} `); + Log.showInfo(TAG, `removeAllNotifications isUnremovable: ${index} ${this.mNotificationList[index].isUnremovable} `); + + //Except the Long term notifications + if (this.mNotificationList[index].isRemoveAllowed && + !this.mNotificationList[index].isOngoing && !this.mNotificationList[index].isUnremovable) { + Log.showInfo(TAG, `mNotificationList[${index}].hashcode: ${this.mNotificationList[index].hashcode}`); + let hashCode = this.mNotificationList[index].hashcode + this.removeSysNotificationItem(hashCode) + let removeItemArr = this.mNotificationList.splice(index, 1) + Log.showInfo(TAG, `removeAllNotifications removeItemArr= ${JSON.stringify(removeItemArr)}`); + if (!CheckEmptyUtils.isEmpty(removeItemArr)) { + this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + } + } + } + } + this.updateNotification() + } + + removeNotificationItem(itemData, isDelSysConent) { + Log.showInfo(TAG, `removeNotificationItem, hashcode: ${itemData.hashcode}`); + for (let i = 0, len = this.mNotificationList.length; i < len; i++) { + if (this.mNotificationList[i].hashcode == itemData.hashcode) { + Log.showInfo(TAG, `removeNotificationItem i = ${i}`); + let removeItemArr = this.mNotificationList.splice(i, 1); + Log.showInfo(TAG, `removeNotificationItem removeItemArr= ${JSON.stringify(removeItemArr)}`); + if (!CheckEmptyUtils.isEmpty(removeItemArr)) { + this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + } + break; + } + } + this.updateNotification(); + if (isDelSysConent) { + this.removeSysNotificationItem(itemData.hashcode); + } + AppStorage.Delete(Constants.KEY_INPUT + itemData.id); + } + + removeGroupNotification(itemData, isDelSysConent) { + Log.showInfo(TAG, `removeGroupNotification, groupName: ${itemData.groupName}`); + let groupName = itemData.groupName + for (let i = 0, len = this.mNotificationList.length; i < len; i++) { + if (this.mNotificationList[i].groupName == groupName) { + Log.showInfo(TAG, `removeGroupNotification i = ${i}`); + let id = this.mNotificationList[i].id + let hashcode = this.mNotificationList[i].hashcode + let removeItemArr = this.mNotificationList.splice(i, 1); + Log.showInfo(TAG, `removeGroupNotification removeItemArr= ${JSON.stringify(removeItemArr)}`); + if (!CheckEmptyUtils.isEmpty(removeItemArr)) { + this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + } + if (isDelSysConent) { + this.removeSysNotificationItem(hashcode); + } + AppStorage.Delete(Constants.KEY_INPUT + id); + } + } + this.updateNotification(); + } + + removeSysNotificationItem(hashcode) { + NotificationService.remove(hashcode); + } + + clickItem(itemData, want?: any) { + Log.showInfo(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}`); + NotificationWindowManager.hideNotificationWindow(); + CommonUtil.startWant((want) ? want : itemData.want); + this.removeNotificationItem(itemData, true); + } + + clickReply(inputKey, content, want) { + Log.showInfo(TAG, `clickReply inputKey: ${inputKey}, content: ${content}, want: ${JSON.stringify(want)}`); + let info = { + code: 0, + want: { key: inputKey, data: content }, + permission: '', + extraInfo: {} + } + CommonUtil.startWant(want, info); + } + + initFlowControlInfos() { + Log.showInfo(TAG, 'initFlowControlInfos enter'); + let notificationConfig = NotificationConfig.readNotificationConfig('statusbar') + Log.showInfo(TAG, 'NotificationConfig: ' + JSON.stringify(notificationConfig)); + if (CheckEmptyUtils.isEmpty(notificationConfig)) { + Log.showInfo(TAG, 'NotificationConfig is no definition'); + return + } + this.mNotificationCtrl = { + currentTotal: 0, + limitTotal: notificationConfig.limitTotal, + app: new Map() + } + for (let item of notificationConfig.app) { + let tmp = { + 'canShow': item.canShow, + 'currentNum': 0, + 'limit': item.limit + } + this.mNotificationCtrl['app'].set(item.bundleName, tmp); + } + Log.showInfo(TAG, 'initFlowControlInfos end, mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); + } + + isCanShow(bundleName: string): boolean { + Log.showInfo(TAG, 'isCanShow'); + let result: boolean = true + if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { + let currentTotal = this.mNotificationCtrl['currentTotal'] + let limitTotal = this.mNotificationCtrl['limitTotal'] + Log.showInfo(TAG, `isCanShow Total: currentTotal=${currentTotal},limitTotal=${limitTotal}`); + if (currentTotal + 1 > limitTotal) { + result = false + } else if (this.mNotificationCtrl['app'].has(bundleName)) { + let tmp = this.mNotificationCtrl['app'].get(bundleName) + Log.showInfo(TAG, `isCanShow appTotal: canShow=${tmp['canShow']},tmp['currentNum']=${tmp['currentNum']}`); + if (tmp['canShow'] === false || (tmp['currentNum'] + 1 > tmp['limit'])) { + result = false + } + } + } + Log.showInfo(TAG, `isCanShow :${result}`); + return result; + } + + updateFlowControlInfos(bundleName: string, plusOrMinus: boolean): void { + Log.showInfo(TAG, `updateFlowControlInfos`); + if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { + if (this.mNotificationCtrl['app'].has(bundleName)) { + let tmp = this.mNotificationCtrl['app'].get(bundleName) + if (plusOrMinus) { + tmp['currentNum'] += 1 + } else if (tmp['currentNum'] > 0) { + tmp['currentNum'] -= 1 + } + this.mNotificationCtrl['app'].set(bundleName, tmp) + } + + if (plusOrMinus) { + this.mNotificationCtrl['currentTotal'] += 1 + } else if (this.mNotificationCtrl['currentTotal'] > 0) { + this.mNotificationCtrl['currentTotal'] -= 1 + } + } + + Log.showInfo(TAG, `updateFlowControlInfos:${JSON.stringify(this.mNotificationCtrl)}`); + } + + reminderWay(itemData) { + if (itemData.ruleData.isAllowBanner) { + Log.showInfo(TAG, `banner start `); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'itemData', itemData); + EventManager.publish(obtainLocalEvent('onBannerNoticeShow', { 'itemData': itemData })) + Log.showInfo(TAG, `banner end `); + } + if (itemData.notificationFlags?.soundEnabled != Constants.NOTIFICATION_TYPE_CLOSE) { + if (itemData.ruleData.isAllowSound) { + try { + this.audioPlayer.src = itemData.sound; + Log.showInfo(TAG, `sound start `); + this.audioPlayer.play(); + Log.showInfo(TAG, `sound end `); + } catch (e) { + Log.showInfo(TAG, `sound notificationItem id:${itemData.id} alert error: ${e.toString()}`); + } + } + } + if (itemData.notificationFlags?.vibrationEnabled != Constants.NOTIFICATION_TYPE_CLOSE) { + if (itemData.ruleData.isAllowVibrationValues) { + // Log.showInfo(TAG, `vibrate start`); + // for (let i = 0, len = itemData.vibrationValues.length; i < len; i++) { + // vibrator.vibrate(itemData.vibrationValues[i], function(error){ + // Log.showInfo(TAG, `vibrate id:${i}`); + // if (error) { + // Log.showInfo(TAG, "error.code" + error.code + "error.message" + error.message); + // } else { + // Log.showInfo(TAG, "Callback returned to indicate a successful vibration."); + // } + // }) + // } + } + } + } + + getPluginTempLate(templateName) { + Log.showInfo(TAG, 'getPluginTempLate: ' + templateName); + return NotificationService.getPluginTempLate(templateName) + } + + enableNotification(itemData, enable: boolean) { + Log.showInfo(TAG, `enableNotification, bundleName: ${itemData.bundleName} uid: ${itemData.uid}`); + return NotificationService.enableNotification({ bundle: itemData.bundleName, uid: itemData.uid }, enable); + } + + clickDistributionItem(itemData, triggerInfo) { + Log.showInfo(TAG, `clickDistributionItem wantAgen: ${JSON.stringify(itemData.want)}, triggerInfo: ${JSON.stringify(triggerInfo)}`); + NotificationWindowManager.hideNotificationWindow(); + CommonUtil.startWant(itemData.want, triggerInfo); + this.removeNotificationItem(itemData, true); + } + + //get distributed device name + getDistributedDeviceName(itemData): Promise{ + Log.showInfo(TAG, `getDistributedDeviceName`); + Log.showInfo(TAG, `getDistributedDeviceName itemData want:${JSON.stringify(itemData.want)}`); + Log.showInfo(TAG, `getDistributedDeviceName itemData deviceId:${itemData.deviceId}`); + + return new Promise((resolve) => { + let deviceName: string = ''; + if (itemData.distributedOption?.isDistributed && !!itemData.deviceId) { + deviceName = NotificationService.getTrustedDeviceDeviceName(itemData.deviceId); + resolve(deviceName); + } else { + resolve(deviceName); + } + }); + } +} + +let viewModel = new ViewModel(); + +export default viewModel as ViewModel; \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/color.json b/features/noticeitem/src/main/resources/base/element/color.json index 44d07016..da334c07 100644 --- a/features/noticeitem/src/main/resources/base/element/color.json +++ b/features/noticeitem/src/main/resources/base/element/color.json @@ -2,7 +2,7 @@ "color": [ { "name":"notificationitem_background", - "value":"#ffffff" + "value":"#ffffffff" }, { "name":"title_text_color", @@ -43,6 +43,14 @@ { "name":"transparent", "value":"#00000000" + }, + { + "name": "button_background", + "value": "#4d000000" + }, + { + "name": "device_divider_color", + "value": "#E3E3E3" } ] } \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index 758cca9c..cd07c516 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -28,54 +28,14 @@ "name": "body_margin_top", "value": "10" }, - { - "name": "item_opicaty", - "value": "0.9" - }, { "name": "item_borderradius", "value": "20" }, - { - "name": "item_margintop", - "value": "10" - }, - { - "name": "item_marginleft", - "value": "10" - }, - { - "name": "item_marginright", - "value": "10" - }, - { - "name": "item_paddingleft", - "value": "20" - }, - { - "name": "item_paddingright", - "value": "20" - }, { "name": "item_paddingbottom", "value": "20" }, - { - "name": "item_setting_image_width", - "value": "30" - }, - { - "name": "item_setting_image_height", - "value": "30" - }, - { - "name": "item_delete_image_width", - "value": "30" - }, - { - "name": "item_delete_image_height", - "value": "30" - }, { "name": "titleitem_row_space", "value": "10" @@ -92,6 +52,18 @@ "name": "title_image_height", "value": "30" }, + { + "name": "title_font_height", + "value": "28vp" + }, + { + "name": "title_font_margin_t", + "value": "13vp" + }, + { + "name": "message_font_margin_t", + "value": "14vp" + }, { "name": "title_name_fontsize", "value": "20" @@ -114,11 +86,11 @@ }, { "name": "setting_title_fontsize", - "value": "28" + "value": "40" }, { "name": "setting_cont_fontsize", - "value": "26" + "value": "32" }, { "name": "setting_border_width", @@ -126,7 +98,11 @@ }, { "name": "setting_border_radius", - "value": "30" + "value": "80" + }, + { + "name": "notification_border_radius", + "value": "24vp" }, { "name": "action_button_height", @@ -138,27 +114,75 @@ }, { "name": "picture_default_height", - "value": "100" + "value": "300" }, { "name": "confirm_title_fontsize", - "value": "28" + "value": "40" }, { "name": "confirm_cont_fontsize", - "value": "26" + "value": "32" }, { "name": "confirm_divider_height", - "value": "20" + "value": "44" }, { "name": "confirm_button_height", "value": "60" }, + { + "name": "confirm_button_margin_t", + "value": "23vp" + }, { "name": "icon_item_fontsize", "value": "18" + }, + { + "name": "setting_dialog_dy", + "value": "200" + }, + { + "name": "confirm_dialog_dy", + "value": "250" + }, + { + "name": "close_notification_margin_top", + "value": "15vp" + }, + { + "name": "notification_appname_margin_top", + "value": "11vp" + }, + { + "name": "notification_cancle_margin_top", + "value": "11vp" + }, + { + "name": "device_divider_margin_l", + "value": "70" + }, + { + "name": "device_divider_margin_r", + "value": "30" + }, + { + "name": "device_border_width", + "value": "1" + }, + { + "name": "device_border_radius", + "value": "30" + }, + { + "name": "device_button_font", + "value": "20fp" + }, + { + "name": "device_margin_16", + "value": "16fp" } ] } \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/string.json b/features/noticeitem/src/main/resources/base/element/string.json index b9e748e5..c083768c 100644 --- a/features/noticeitem/src/main/resources/base/element/string.json +++ b/features/noticeitem/src/main/resources/base/element/string.json @@ -39,6 +39,14 @@ { "name": "confirm_message", "value": "是否关掉”%s“的所有通知?" + }, + { + "name": "device_dialog_title", + "value": "设备选择" + }, + { + "name": "distributed_devicename", + "value": "来自”%s“设备" } ] } diff --git a/features/noticeitem/src/main/resources/base/media/ic_close.svg b/features/noticeitem/src/main/resources/base/media/ic_close.svg new file mode 100644 index 00000000..a7f87d23 --- /dev/null +++ b/features/noticeitem/src/main/resources/base/media/ic_close.svg @@ -0,0 +1 @@ +ic \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg b/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg new file mode 100644 index 00000000..9807c565 --- /dev/null +++ b/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_delete_filled + + + + + + + + + + \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg b/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg new file mode 100644 index 00000000..1b0c0940 --- /dev/null +++ b/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_settings_filled + + + + + + + + + + \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/media/send.svg b/features/noticeitem/src/main/resources/base/media/send.svg new file mode 100644 index 00000000..e3e601a1 --- /dev/null +++ b/features/noticeitem/src/main/resources/base/media/send.svg @@ -0,0 +1,16 @@ + + + Public/ic_public_email_send + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/en_US/element/string.json b/features/noticeitem/src/main/resources/en_US/element/string.json index ffb46f1a..765879aa 100644 --- a/features/noticeitem/src/main/resources/en_US/element/string.json +++ b/features/noticeitem/src/main/resources/en_US/element/string.json @@ -39,6 +39,14 @@ { "name": "confirm_message", "value": "Do you want to turn off all notifications of '%s'?" + }, + { + "name": "device_dialog_title", + "value": "Please select a device" + }, + { + "name": "distributed_devicename", + "value": "From the %s" } ] } diff --git a/features/noticeitem/src/main/resources/zh_CN/element/string.json b/features/noticeitem/src/main/resources/zh_CN/element/string.json index b9e748e5..c083768c 100644 --- a/features/noticeitem/src/main/resources/zh_CN/element/string.json +++ b/features/noticeitem/src/main/resources/zh_CN/element/string.json @@ -39,6 +39,14 @@ { "name": "confirm_message", "value": "是否关掉”%s“的所有通知?" + }, + { + "name": "device_dialog_title", + "value": "设备选择" + }, + { + "name": "distributed_devicename", + "value": "来自”%s“设备" } ] } diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts b/features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts new file mode 100644 index 00000000..94aeec81 --- /dev/null +++ b/features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2021-2022 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 audio from '@ohos.multimedia.audio'; + +export default class Constants { +} + +export enum AudioRingMode { + RINGER_MODE_SILENT = audio.AudioRingMode.RINGER_MODE_SILENT, + RINGER_MODE_VIBRATE = audio.AudioRingMode.RINGER_MODE_VIBRATE, + RINGER_MODE_NORMAL = audio.AudioRingMode.RINGER_MODE_NORMAL +} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts new file mode 100644 index 00000000..1faf59c2 --- /dev/null +++ b/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' +import Constants from './Constants' + +const TAG = 'capsule-StyleConfiguration'; + +export default class StyleConfiguration { + static getStatusRingModeComponentStyle() { + const key: string = TAG + "-StatusRingMode"; + return StyleManager.getStyle(key, () => { + return { + statusBarRingModeWidth: $r('app.float.status_bar_ring_mode_width'), + statusBarRingModeHeight: $r('app.float.status_bar_ring_mode_height') + }; + }); + } + + static getControlCenterRingModeComponentStyle() { + const key: string = TAG + "-ControlCenterRingMode"; + return StyleManager.getStyle(key, () => { + return { + onBgColor: $r('app.color.control_center_complex_toggle_ring_mode_on_bg_color') + }; + }); + } +} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts new file mode 100644 index 00000000..004f019f --- /dev/null +++ b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2021-2022 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 audio from '@ohos.multimedia.audio'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import {getAudioManager} from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; + +const TAG = 'RingModeModel'; + +export class RingModeService { + mIsStart: boolean = false; + mListener: any; + mAudioManager: any; + + startService() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `startService`) + this.mIsStart = true; + + this.mAudioManager = getAudioManager(); + + this.getRingerMode(); + + this.mAudioManager.on('ringerModeChange', (data) => { + Log.showInfo(TAG, `startService->ringerModeChange, data: ${JSON.stringify(data)}`) + this.mListener?.updateRingerMode(data); + }); + } + + stopService() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `stopService`) + this.mIsStart = false; + + this.mAudioManager = null; + } + + registerListener(listener: { + 'updateRingerMode': Function + }) { + Log.showInfo(TAG, `registerListener, listener: ${listener}`) + this.mListener = listener; + } + + getRingerMode() { + Log.showInfo(TAG, `getRingerMode`) + this.mAudioManager.getRingerMode((error, action) => { + Log.showInfo(TAG, `getRingerMode, error: ${JSON.stringify(error)} action: ${JSON.stringify(action)}`) + if (error) { + return; + } + this.mListener?.updateRingerMode(action); + }); + } + + setRingerMode(mode) { + Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)}`) + this.mAudioManager.setRingerMode(mode, (err, data) => { + Log.showInfo(TAG, `mAudioManager.setRingerMode, mode: ${JSON.stringify(mode)}`) + }) + } +} + +let sRingModeService = createOrGet(RingModeService, TAG); + +export default sRingModeService as RingModeService; \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets index f52ecfaa..b048cb04 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,32 +13,29 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' -import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' -import {AudioRingMode} from '../common/Constants.ets' -import ViewModel from '../viewmodel/RingModeVM.ets' -import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" +import {AudioRingMode} from '../common/Constants' +import ViewModel from '../viewmodel/RingModeVM' +import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase' +import StyleConfiguration from '../common/StyleConfiguration' const TAG = 'ringmode-ControlCenterSimpleToggleRingModeComponent' @Component export default struct ControlCenterSimpleToggleRingModeComponent { - @Prop keyId: string - @Prop mShowLabel: boolean - @Prop mEditMode: boolean + private keyId: string + private mEditMode: boolean = false + private mDragMode: boolean = false @State mIcon: Resource = $r("app.media.ic_controlcenter_ring_on_filled") @State mLabel: Resource = $r("app.string.control_center_complex_toggle_ring_mode_title_on") @State mDefaultChangeSwitch: boolean = true @StorageLink('RingModeComponentMode') @Watch('onRingModeUpdated') RingModeComponentMode: AudioRingMode = AudioRingMode.RINGER_MODE_NORMAL - @StorageLink("showStatusBar") showStatusBar: boolean = false - private mWindowManager - private mFeatureAbilityManager + @State style: any = StyleConfiguration.getControlCenterRingModeComponentStyle() aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear') - this.mWindowManager = new WindowManager() - this.mFeatureAbilityManager = new FeatureAbilityManager() ViewModel.initViewModel() this.onRingModeUpdated('RingModeComponentMode') } @@ -65,12 +62,13 @@ export default struct ControlCenterSimpleToggleRingModeComponent { SimpleToggleBase({ mToggleId: this.keyId, mIcon: $mIcon, - mChangeSwitch: $mDefaultChangeSwitch, + mChangeSwitch: this.mDefaultChangeSwitch, mLabel: $mLabel, - mShowLabel: this.mShowLabel, + mIconOnBG: this.style.onBgColor, mEditMode: this.mEditMode, - mClickEvent: this.mClickEvent.bind(this), - mLongClickEvent: this.mLongClickEvent.bind(this) + mDragMode: this.mDragMode, + mClickEvent: () => this.mClickEvent(), + mLongClickEvent: () => this.mLongClickEvent() }) } @@ -87,15 +85,6 @@ export default struct ControlCenterSimpleToggleRingModeComponent { mLongClickEvent() { Log.showInfo(TAG, `mLongClickEvent, RingModeComponentMode: ${JSON.stringify(this.RingModeComponentMode)}`) - - this.showStatusBar = true - this.mWindowManager.setWindowMin((result) => { - this.mFeatureAbilityManager.openAbility(TAG, { - want: { - bundleName: 'com.ohos.settings', - abilityName: 'com.ohos.settings.MainAbility', - } - }) - }) + EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.MainAbility')) } } \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets index 9579e196..ac257330 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,16 +13,21 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants, {AudioRingMode} from '../common/Constants.ets' -import ViewModel from '../viewmodel/RingModeVM.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' +import Constants, {AudioRingMode} from '../common/Constants' +import ViewModel from '../viewmodel/RingModeVM' const TAG = 'ringmode-StatusBarIconItemRingModeComponent' @Component export default struct StatusBarIconItemRingModeComponent { @StorageLink('RingModeComponentMode') RingModeComponentMode: AudioRingMode = AudioRingMode.RINGER_MODE_NORMAL - @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @State style: any = StyleConfiguration.getStatusRingModeComponentStyle() private ringModeIcons: any aboutToAppear() { @@ -38,15 +43,17 @@ export default struct StatusBarIconItemRingModeComponent { } build() { - Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Row() { if (this.RingModeComponentMode != AudioRingMode.RINGER_MODE_NORMAL) { + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') Image(this.ringModeIcons[this.RingModeComponentMode.toString()]) .objectFit(ImageFit.Contain) - .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) - .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) + .width(this.style.statusBarRingModeWidth) + .height(this.style.statusBarRingModeHeight) + .fillColor(this.mTintContentInfo.contentColor) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } } - .width(this.RingModeComponentMode != AudioRingMode.RINGER_MODE_NORMAL ? Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient : 0) - .height(this.RingModeComponentMode != AudioRingMode.RINGER_MODE_NORMAL ? Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient : 0) + .height('100%') } } \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts b/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts new file mode 100644 index 00000000..60bc0a5e --- /dev/null +++ b/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; +import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import {AudioRingMode} from '../common/Constants' +import RingModeService from '../model/RingModeService'; + +export const RingModeComponentModeKey = "RingModeComponentMode"; + +const TAG = 'RingModeVM'; + +export class RingModeVM { + mIsStart: boolean = false; + mRingModeComponentMode: any; + mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.RING_MODE); + + constructor() { + Log.showInfo(TAG, `constructor`) + } + + initViewModel() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initViewModel `) + this.mIsStart = true; + + this.mRingModeComponentMode = AppStorage.SetAndLink(RingModeComponentModeKey, AudioRingMode.RINGER_MODE_NORMAL); + + RingModeService.registerListener({ + 'updateRingerMode': this.updateRingerMode.bind(this) + }); + RingModeService.startService(); + } + + updateRingerMode(mode) { + Log.showInfo(TAG, `updateRingerMode, mode: ${JSON.stringify(mode)} `) + this.mRingModeComponentMode.set(mode); + } + + setRingerMode(mode) { + Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)} `) + RingModeService.setRingerMode(mode); + } + + getTintContentInfo(): TintContentInfo { + return this.mTintContentInfo; + } +} + +let sRingModeVM = createOrGet(RingModeVM, TAG); + +export default sRingModeVM as RingModeVM; \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/base/element/color.json b/features/ringmodecomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..35730081 --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "control_center_complex_toggle_ring_mode_on_bg_color", + "value": "#FFFF9800" + } + ] +} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/base/element/float.json b/features/ringmodecomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..0ca48030 --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/base/element/float.json @@ -0,0 +1,11 @@ +{ + "float": [ + { + "name": "status_bar_ring_mode_width", + "value": "27vp" + },{ + "name": "status_bar_ring_mode_height", + "value": "24vp" + } + ] +} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg b/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg index 0c713c55..dd3c5971 100644 --- a/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg +++ b/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg @@ -1,7 +1,6 @@ - - + - + - - \ No newline at end of file + + diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg b/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg index 010fa156..4f2ae548 100644 --- a/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg +++ b/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg @@ -1,9 +1,8 @@ - - - + + - \ No newline at end of file + diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg b/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg index 1fb6b9d1..3f7bb0ea 100644 --- a/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg +++ b/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg @@ -1,11 +1,10 @@ - - + - + - - - + + + - \ No newline at end of file + diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg b/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg index 44f0db0c..162b938a 100644 --- a/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg +++ b/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg @@ -1,7 +1,6 @@ - - + - + - - \ No newline at end of file + + diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg b/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg index 6599e8f5..91b52b22 100644 --- a/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg +++ b/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg @@ -1,11 +1,3 @@ - - - ic_statusbar_vibration_on - - - - - - - - \ No newline at end of file + + + diff --git a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts new file mode 100644 index 00000000..e11f03ce --- /dev/null +++ b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import Constants from './Constants' + +const TAG = 'signal-StyleConfiguration'; + +export default class StyleConfiguration { + static getSignalComponentStyle() { + const key: string = TAG + "-SignalComponent"; + return StyleManager.getStyle(key, () => { + return { + cellularImageWidth: $r('app.float.signal_component_icon_width'), + cellularImageHeight: $r('app.float.signal_component_icon_height'), + statusBarSignalTypeFontSize: $r('app.float.status_bar_signal_type_font_size'), + statusBarSignalUnknownFontSize: $r('app.float.status_bar_signal_unknown_font_size'), + signalTextMaxWeight: $r('app.float.signal_text_max_width'), + netSignalTextMaxWidth: $r('app.float.status_bar_signal_net_signal_text_max_width'), + }; + }); + } +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ts b/features/signalcomponent/src/main/ets/default/common/constants.ts new file mode 100644 index 00000000..59b0e4d9 --- /dev/null +++ b/features/signalcomponent/src/main/ets/default/common/constants.ts @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + + static NETWORK_TYPE_UNKNOWN = 0; + static NETWORK_TYPE_GSM = 1; + static NETWORK_TYPE_CDMA = 2; + static NETWORK_TYPE_W_CDMA = 3; + static NETWORK_TYPE_TDS_CDMA = 4; + static NETWORK_TYPE_LTE = 5; + static NETWORK_TYPE_NR = 6; + + static CELLULAR_SIGNAL_NO = 0; + static CELLULAR_SIGNAL_MIN = 1; + static CELLULAR_SIGNAL_LOW = 2; + static CELLULAR_SIGNAL_HALF = 3; + static CELLULAR_SIGNAL_HIGH = 4; + static CELLULAR_SIGNAL_FULL = 5; + static CELLULAR_NO_SIM_CARD = -1; + + static NET_NULL = 'NULL'; +} diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index a65ea3fb..7eb481f1 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,9 +13,14 @@ * limitations under the License. */ -import Constants from '../common/constants.ets'; -import mSignalModel from '../SignalModel.ets'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/constants'; +import mSignalModel from '../SignalModel'; +import Log from '../../../../../../../common/src/main/ets/default/Log' +import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' +import ViewModel from '../viewmodel/SignalVM' + const TAG = 'SignalComponent-SignalIcon' @Component @@ -24,8 +29,11 @@ struct SignalIcon { @StorageLink('cellularLevel') cellularLevel : number = Constants.CELLULAR_NO_SIM_CARD @StorageLink('cellularType') cellularType : number = Constants.NETWORK_TYPE_UNKNOWN @StorageLink('networkState') networkState : string = Constants.NET_NULL - @StorageLink('StatusCoefficient') StatusCoefficient:number = 1.0 @StorageLink('signalObserved') signalObserved:boolean = false + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @State style: any = StyleConfiguration.getSignalComponentStyle() + aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); if (!this.signalObserved) { @@ -40,29 +48,34 @@ struct SignalIcon { build() { Row() { + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') Text(this.updateNetworkState(this.networkState)) - .fontSize($r('app.float.fontSize_network_state')) - .fontColor($r('app.color.font_color_white')) - .textOverflow({overflow: TextOverflow.Ellipsis}) - .constraintSize({ maxWidth: $r('app.float.signalicon_netstatus_width')}) + .fontSize(this.styleCommon.statusBarFontSize) + .fontColor(this.mTintContentInfo.contentColor) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .constraintSize({ maxWidth: this.style.signalTextMaxWeight}) .flexShrink(0) .maxLines(1) .textAlign(TextAlign.Center) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') Stack({ alignContent: Alignment.TopStart }) { Text(this.updateCellularType(this.cellularType)) - .fontSize($r('app.float.fontSize_cellular_type')) - .fontColor($r('app.color.font_color_white')) - .margin({ top: $r('app.float.margin_cellular_type') }) + .fontSize(this.cellularType == Constants.NETWORK_TYPE_UNKNOWN ? this.style.statusBarSignalUnknownFontSize : this.style.statusBarSignalTypeFontSize) + .fontColor(this.mTintContentInfo.contentColor) + .width(this.style.netSignalTextMaxWidth) + .fontWeight(FontWeight.Bold) + .textAlign(TextAlign.Center) Image(this.updateCellularImage(this.cellularLevel)) - .objectFit(ImageFit.ScaleDown) - .width(`${Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient}px`) - .height(`${Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient}px`) + .objectFit(ImageFit.Contain) + .width(this.style.cellularImageWidth) + .height(this.style.cellularImageHeight) + .fillColor(this.mTintContentInfo.contentColor) }.flexShrink(1) - .width(`${Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient}px`) + + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } - .margin({ left: 5}) - .height(`${Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient}px`) + .height('100%') } /** @@ -76,7 +89,7 @@ struct SignalIcon { let typeString; switch (signalType) { case Constants.NETWORK_TYPE_UNKNOWN: - typeString = ''; + typeString = $r('app.string.signal_null'); break; case Constants.NETWORK_TYPE_GSM: case Constants.NETWORK_TYPE_CDMA: @@ -127,7 +140,7 @@ struct SignalIcon { break; case Constants.CELLULAR_NO_SIM_CARD: default: - cellularImage = $r('app.media.ic_statusbar_signal_null'); + cellularImage = $r('app.media.ic_statusbar_signal_no'); break; } console.info('systemui updateCellularImage = ' + cellularImage); diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ts b/features/signalcomponent/src/main/ets/default/signalModel.ts new file mode 100644 index 00000000..a31c4d6a --- /dev/null +++ b/features/signalcomponent/src/main/ets/default/signalModel.ts @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2021-2022 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 Radio from '@ohos.telephony.radio'; +import Sim from '@ohos.telephony.sim' +import Observer from '@ohos.telephony.observer'; +import Log from "../../../../../../common/src/main/ets/default/Log"; +import CheckEmpty from '../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import Constants from './common/constants' + +const TAG = 'SignalStatus-SignalModel'; +const EMPTY_LEVEL = 0; + +let mSignalCallback; +let signalValue = { + cellularLevel: '', + cellularType: '', + networkState: '' +}; +let isInitObserver = false + +var mLevelLink; +var mTypeLink; +var mStateLink; + +export class SignalModel { + initSignalModel() { + Log.showInfo(TAG, 'initSignalModel'); + mLevelLink = AppStorage.SetAndLink("cellularLevel", Constants.CELLULAR_NO_SIM_CARD); + mTypeLink = AppStorage.SetAndLink("cellularType", Constants.NETWORK_TYPE_UNKNOWN); + mStateLink = AppStorage.SetAndLink("networkState", Constants.NET_NULL); + this.checkCellularStatus(); + } + + uninitSignalModel() { + Log.showInfo(TAG, 'uninitSignalModel'); + this.unInitObserver(); + } + + /** + * Check the connection type and signal level of cellular network + */ + checkCellularStatus() { + let cellularStatus; + let slotId = 0; + Log.showInfo(TAG, 'enter checkCellularStatus ============'); + + Sim.hasSimCard(slotId, (err, value) => { + if (value === true) { + //The interface of getting the cellular signal status is unavailable temporarily + Radio.getSignalInformation(slotId, (err, value) => { + if (err) { + // Failed to call the interface,error is not null + Log.showError(TAG, `failed to getSimState because ${err.message}`); + // When failed to call the interface, set the result as no signal + mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); + mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); + } else { + // Call interface succeed,error is null + Log.showInfo(TAG, `success to getSignalInformation: ${JSON.stringify(value)}`); + // Since the value might be empty, set it as no signal by hand + if (!value || !value.length) { + Log.showError(TAG, 'value from api is empty, set 0'); + mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); + mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); + } else { + Log.showInfo(TAG, 'get signal level by value.'); + mLevelLink.set(value[0].signalLevel); + mTypeLink.set(value[0].signalType); + } + } + + Log.showInfo(TAG, 'enter checknetworkState ============'); + //The interface of getting the cellular signal status is unavailable temporarily + Radio.getNetworkState((err, value) => { + if (err) { + // Failed to call the interface,error is not null + Log.showError(TAG, `failed to getnetworkState because ${err.message}`); + // When failed to call the interface, set the result as no signal + mStateLink.set(Constants.NET_NULL); + } else { + // Call interface succeed,error is null + Log.showInfo(TAG, `success to getnetworkState: ${JSON.stringify(value)}`); + // Since the value might be empty, set it as no signal by hand + if (!value) { + Log.showError(TAG, 'value from api is empty, set 0'); + mStateLink.set(Constants.NET_NULL); + } else { + mStateLink.set(value.longOperatorName); + } + } + }); + }); + if (!isInitObserver) { + this.initObserver(); + } + } else { + Log.showError(TAG, `hasSimCard failed to hasSimCard because`); + mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); + mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); + mStateLink.set(Constants.NET_NULL); + if (!isInitObserver) { + this.initObserver(); + } + } + }); + } + + /** + * init the observer of the cellular and signal + */ + initObserver() { + Log.showInfo(TAG, 'initObserver'); + isInitObserver = true; + Observer.on('signalInfoChange', (signalInfoChange) => { + Log.showInfo(TAG, `signalInfoChange ${JSON.stringify(signalInfoChange)}`); + this.checkCellularStatus(); + }); + Observer.on('networkStateChange', (networkState) => { + Log.showInfo(TAG, `networkStateChange ${JSON.stringify(networkState)}`); + this.checkCellularStatus(); + }); + Observer.on('simStateChange', (simStateInfo) => { + Log.showInfo(TAG, `simStateChange ${JSON.stringify(simStateInfo)}`); + this.checkCellularStatus(); + }); + } + + /** + * Uninit the observer of the cellular and signal + */ + unInitObserver() { + Log.showInfo(TAG, 'unInitObserver'); + Observer.off('signalInfoChange'); + Observer.off('networkStateChange'); + Observer.off('simStateChange'); + isInitObserver = false; + } +} + +let mSignalModel = new SignalModel(); + +export default mSignalModel as SignalModel; \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts b/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts new file mode 100644 index 00000000..d4049dcd --- /dev/null +++ b/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../common/src/main/ets/default/Log'; +import {FASlotName} from '../../../../../../../common/src/main/ets/default/Constants'; +import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import createOrGet from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; + +const TAG = 'SignalVM'; + +export class SignalVM { + mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.SIGNAL); + + constructor() { + Log.showInfo(TAG, `constructor`) + } + + getTintContentInfo(): TintContentInfo { + return this.mTintContentInfo; + } +} + +let sSignalVM = createOrGet(SignalVM, TAG); + +export default sSignalVM as SignalVM; \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/base/element/float.json b/features/signalcomponent/src/main/resources/base/element/float.json index 27e7b6c0..cca6ffd2 100644 --- a/features/signalcomponent/src/main/resources/base/element/float.json +++ b/features/signalcomponent/src/main/resources/base/element/float.json @@ -1,40 +1,28 @@ { "float":[ { - "name":"fontSize_network_state", - "value":"14" + "name":"status_bar_signal_type_font_size", + "value":"10fp" }, { - "name":"fontSize_cellular_type", - "value":"8" + "name":"status_bar_signal_unknown_font_size", + "value":"14fp" }, { - "name":"shrink_network_state", - "value":"0" + "name":"signal_component_icon_width", + "value":"32vp" }, { - "name":"shrink_cellular_type", - "value":"1" + "name":"signal_component_icon_height", + "value":"24vp" }, { - "name":"maxLine_network_state", - "value":"1" + "name":"signal_text_max_width", + "value":"113vp" }, { - "name":"margin_cellular_type", - "value":"1" - }, - { - "name":"signalicon_width", - "value":"120" - }, - { - "name":"signalicon_height", - "value":"50%" - }, - { - "name":"signalicon_netstatus_width", - "value":"113" + "name":"status_bar_signal_net_signal_text_max_width", + "value":"18vp" } ] } \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/base/element/string.json b/features/signalcomponent/src/main/resources/base/element/string.json index 721daed1..8d37879d 100644 --- a/features/signalcomponent/src/main/resources/base/element/string.json +++ b/features/signalcomponent/src/main/resources/base/element/string.json @@ -39,6 +39,10 @@ { "name": "5G", "value": "5G" + }, + { + "name": "signal_null", + "value": "×" } ] } diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg new file mode 100644 index 00000000..f0438a9a --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg new file mode 100644 index 00000000..173489d3 --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg new file mode 100644 index 00000000..c703e2d0 --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg new file mode 100644 index 00000000..cb66ccb4 --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg new file mode 100644 index 00000000..3c796ab5 --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg new file mode 100644 index 00000000..4d1a5bc4 --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/features/signalcomponent/src/main/resources/en_US/element/string.json b/features/signalcomponent/src/main/resources/en_US/element/string.json index 975d682f..fd1cb468 100644 --- a/features/signalcomponent/src/main/resources/en_US/element/string.json +++ b/features/signalcomponent/src/main/resources/en_US/element/string.json @@ -39,6 +39,10 @@ { "name": "5G", "value": "5G" + }, + { + "name": "signal_null", + "value": "×" } ] } diff --git a/features/signalcomponent/src/main/resources/zh_CN/element/string.json b/features/signalcomponent/src/main/resources/zh_CN/element/string.json index e2880d3b..a6d2990b 100644 --- a/features/signalcomponent/src/main/resources/zh_CN/element/string.json +++ b/features/signalcomponent/src/main/resources/zh_CN/element/string.json @@ -38,6 +38,10 @@ { "name": "5G", "value": "5G" + }, + { + "name": "signal_null", + "value": "×" } ] } diff --git a/features/statusbarcomponent/build.gradle b/features/statusbarcomponent/build.gradle index a71ac7c1..57132181 100644 --- a/features/statusbarcomponent/build.gradle +++ b/features/statusbarcomponent/build.gradle @@ -16,12 +16,13 @@ ohos { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - implementation project(':features:signalcomponent') - implementation project(':features:capsulecomponent') - implementation project(':features:wificomponent') - implementation project(':features:bluetoothcomponent') + implementation project(':features:noticeitem') implementation project(':features:batterycomponent') + implementation project(':features:bluetoothcomponent') + implementation project(':features:capsulecomponent') implementation project(':features:clockcomponent') implementation project(':features:locationcomponent') implementation project(':features:ringmodecomponent') + implementation project(':features:signalcomponent') + implementation project(':features:wificomponent') } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts new file mode 100644 index 00000000..77a8d351 --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2021-2022 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 {Event} from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import {ItemComponentData, ActionData} +from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; + +export default class Constants { + static EMPTY_AREA_POSITION_LEFT = 'left'; + static EMPTY_AREA_POSITION_CENTER = 'center'; + static EMPTY_AREA_POSITION_RIGHT = 'right'; + static GROUP_ID_LEFT = 1; + static GROUP_ID_CENTER = 2; + static GROUP_ID_RIGHT = 3; + static VERTICAL_COMPONENT_HEIGHT_VP = 58; +} + +export type StatusBarComponentData = ItemComponentData & { + isShowLabel: boolean; + isShowIcon: boolean; + canSelect: boolean; + relationWindowId: string; + actionData?: ActionData & { + selectedClickAction?: Event; + }; +}; + +export class StatusBarData { + displayWidth: number; + displayHeight: number; + showHorizontal: boolean; + ableToMaximize: boolean; + realWidth: number; + realHeight: number; + left: number; + top: number; +} + +export class StatusBarBackgroundData { + backgroundColor: string = "#FFFF0000"; + width: number = 0; +} + +export class StatusBarComponentGroupContentData { + contentColor: string = "#FFFFFFFF"; + width: number = 0; +} diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts new file mode 100644 index 00000000..0ab0eeeb --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2021-2022 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 display from '@ohos.display' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil' + +const TAG = 'StatusBarConfiguration'; + +var statusbarPosition; +var directionStatus; +var shortSideLength = '0'; + +var maxWidth; +var maxHeight; +var minHeight; +var realWidth; +var realHeight; +var xCoordinate = 0; +var yCoordinate = 0; + +enum Position { + NOT_CONFIGURED, + LEFT_POSITION, + TOP_POSITION, + RIGHT_POSITION, + BOTTOM_POSITION +} + +/** + * Get window size. + */ +class StatusBarConfiguration { + async initStatusBarConfiguration() { + Log.showInfo(TAG, 'initWindowManager'); + minHeight = 0; + + await display.getDefaultDisplay() + .then(dis => { + Log.showInfo(TAG, `initWindowManager dis ${JSON.stringify(dis)}`); + maxWidth = dis.width; + maxHeight = dis.height; + Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); + }) + } + + async getDirectionAndPosition() { + Log.showInfo(TAG, 'getDirectionAndPosition' + 1); + directionStatus = await ResourceUtil.getConfiguration(); + Log.showInfo(TAG, 'getDirectionAndPosition' + 2); + if (directionStatus.direction == -1) { + Log.showInfo(TAG, 'getDirectionAndPosition' + 3); + statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) + shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); + } else if (directionStatus.direction == 1) { + statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) + shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); + } else { + statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_portrait")) + shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_portrait")); + } + Log.showInfo(TAG, 'getDirectionAndPosition' + 4); + shortSideLength = parseInt(shortSideLength) + ''; + Log.showInfo(TAG, 'directionStatus = ' + directionStatus.direction); + Log.showInfo(TAG, 'statusbarPosition = ' + statusbarPosition); + Log.showInfo(TAG, 'lpx2px(parseInt(shortSideLength)) = ' + shortSideLength); + } + +/** + * Get status bar configuration + */ + public async getConfiguration() { + await this.initStatusBarConfiguration(); + await this.getDirectionAndPosition(); + let showHorizontal = false; + let ableToMaximize = false; + if (statusbarPosition == Position.TOP_POSITION || statusbarPosition == Position.BOTTOM_POSITION) { + Log.showInfo(TAG, `showHorizontal1`); + showHorizontal = true; + Log.showInfo(TAG, `showHorizontal2`); + minHeight = parseInt(shortSideLength); + realWidth = maxWidth; + realHeight = parseInt(shortSideLength); + if (statusbarPosition == Position.BOTTOM_POSITION) { + yCoordinate = parseInt(maxHeight) - parseInt(shortSideLength); + } + ableToMaximize = true; + } else if (statusbarPosition == Position.LEFT_POSITION || statusbarPosition == Position.RIGHT_POSITION) { + showHorizontal = false; + ableToMaximize = false; + minHeight = parseInt(shortSideLength); + realWidth = parseInt(shortSideLength); + realHeight = maxHeight; + if (statusbarPosition == Position.RIGHT_POSITION) { + xCoordinate = parseInt(maxWidth) - parseInt(shortSideLength); + } + } else { + realWidth = 0; + realHeight = 0; + } + Log.showInfo(TAG, `initWindowManager xCoordinate ${xCoordinate} yCoordinate ${yCoordinate}`); + Log.showInfo(TAG, `initWindowManager realWidth ${realWidth} realHeight ${realHeight}`); + + var configuration = { + maxWidth: maxWidth, + maxHeight: maxHeight, + minHeight: minHeight, + showHorizontal: showHorizontal, + ableToMaximize: ableToMaximize, + realWidth: realWidth, + realHeight: realHeight, + xCoordinate: xCoordinate, + yCoordinate: yCoordinate + } + return configuration; + } +} + +let statusBarConfiguration = new StatusBarConfiguration(); + +export default statusBarConfiguration; \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts new file mode 100644 index 00000000..8d6cede3 --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import Constants from './Constants'; + +const TAG = 'statusBar-StyleConfiguration'; + +export default class StyleConfiguration { + static getVerticalStatusBarItemLoadComponentStyle() { + const key: string = TAG + "-VerticalStatusBarItemLoadComponent"; + return StyleManager.getStyle(key, () => { + return { + statusBarVerticalComponentHeight: vp2px(Constants.VERTICAL_COMPONENT_HEIGHT_VP), + }; + }); + } + + static getStatusBarNotificationIconStyle() { + const key: string = TAG + "-StatusBarNotificationIcon"; + return StyleManager.getStyle(key, () => { + return { + iconWidth: $r('app.float.status_bar_notification_icon_width'), + iconHeight: $r('app.float.status_bar_notification_icon_height'), + iconSpace: $r('app.float.status_bar_notification_icon_space'), + }; + }); + } + + static getIconItemComponentStyle() { + const key: string = TAG + "-IconItemComponent"; + return StyleManager.getStyle(key, () => { + return { + stackHeight: $r('app.float.status_bar_icon_item_stack_height'), + stackPadding: $r('app.float.status_bar_icon_item_stack_padding'), + stackBorderRadius: $r('app.float.status_bar_icon_item_stack_border_radius'), + stackBgColorSelected: $r('app.color.status_bar_icon_item_stack_bg_color_selected'), + stackBgColorUnSelected: $r('app.color.status_bar_icon_item_stack_bg_color_un_selected'), + componentSpace: $r('app.float.status_bar_icon_item_component_space'), + iconWidth: $r('app.float.status_bar_icon_item_icon_width'), + iconHeight: $r('app.float.status_bar_icon_item_icon_height'), + marginLeft: $r('app.float.status_bar_icon_item_margin_left'), + marginRight: $r('app.float.status_bar_icon_item_margin_right'), + }; + }); + } +} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts new file mode 100644 index 00000000..a0b8992d --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -0,0 +1,349 @@ +/* + * Copyright (c) 2021-2022 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 Log from "../../../../../../../../common/src/main/ets/default/Log"; +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import SwitchUserManager from "../../../../../../../../common/src/main/ets/default/SwitchUserManager"; +import {ItemComponentData, ActionData, PluginType +} from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; +import PluginDataSourceAdapter from "../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter"; +import AbilityManager from "../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager"; +import Constants, {StatusBarData, StatusBarComponentData} from "../common/Constants"; +import {parseEventString} from "../../../../../../../../common/src/main/ets/default/Event/EventUtil"; + +export type StatusBarListener = { + setStatusBarLayout: (layout: string[][]) => void; + setStatusBarEmptyWidth: (width: number) => void; + setItemData: (id: string, itemData: StatusBarComponentData) => void; +}; + +const TAG = "StatusBarModel"; +const STATUSBAR_SOURCE_CONFIG = { + action: "com.ohos.systemui.action.BAR_ICON", + filterDatas: [], + loaderConfig: { + MetaSource: { + action: "com.ohos.systemui.action.BAR_ICON", + permission: null, + }, + }, +}; + +function parseItemData(itemData: ItemComponentData): StatusBarComponentData { + let { isShowLabel, isShowIcon, selectedClickAction, relationWindowId, ...other } = itemData.actionData?.extra; + let selectAction = parseEventString(selectedClickAction); + let statusBarItemData: StatusBarComponentData = { + ...itemData, + isShowLabel: isShowLabel ? isShowLabel !== false : false, + isShowIcon: isShowIcon ? isShowIcon !== false : true, + canSelect: selectAction ? true : false, + relationWindowId: relationWindowId, + actionData: { + ...itemData.actionData, + selectedClickAction: selectAction, + extra: undefined, + }, + }; + return statusBarItemData; +} + +export class StatusBarService { + mIsStart: boolean = false; + mAdapter: PluginDataSourceAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this); + mListener: StatusBarListener | undefined; + mConfig: any; + mStatusBarData: StatusBarData; + mStatusBarLayoutGroupTemplate: string[][] = []; + mStatusBarAllLayout: string[] ; + + constructor() { + Log.showInfo(TAG, `constructor`) + } + + setStatusBarData(data: StatusBarData): void{ + Log.showInfo(TAG, `setStatusBarData`); + this.mStatusBarData = data; + } + + startService(config) { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `start StatusBarService.`); + this.mIsStart = true; + + this.parseConfig(config); + + SwitchUserManager.getInstance().registerListener(this); + STATUSBAR_SOURCE_CONFIG.filterDatas = config.MetaSlots; + this.mAdapter.initDataSource(STATUSBAR_SOURCE_CONFIG); + + Log.showInfo(TAG, `start StatusBarService finish.`); + } + + stopService() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `stop StatusBarService.`); + this.mIsStart = false; + + this.mAdapter.clearAll(); + + Log.showInfo(TAG, `stop StatusBarService finish.`); + } + + parseConfig(config) { + Log.showInfo(TAG, `parseConfig, config: ${JSON.stringify(config)}`); + this.mConfig = config; + + const groupIds = [Constants.GROUP_ID_LEFT, Constants.GROUP_ID_CENTER, Constants.GROUP_ID_RIGHT]; + groupIds.forEach((groupId) => { + for (const groupInfo of config.LayoutGroups) { + if (groupId == groupInfo.id) { + this.mStatusBarLayoutGroupTemplate.push([...groupInfo.Components]); + break; + } + } + }); + Log.showInfo(TAG, + `parseConfig, statusBarLayoutGroupTemplate: ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`) + + this.mStatusBarAllLayout = [...config.LocalSlots]; + this.onDisplayRotate(0); + } + + calcStatusBarLayout() { + Log.showInfo(TAG, `calcStatusBarLayout`) + let statusBarLayout = []; + for (let i = 0;i < this.mStatusBarLayoutGroupTemplate.length; i++) { + let componentsTemplate = this.mStatusBarLayoutGroupTemplate[i]; + let components: string [] = []; + for (let componentTemplate of componentsTemplate) { + if (this.mStatusBarAllLayout.indexOf(componentTemplate) >= 0) { + components.push(componentTemplate); + } + } + statusBarLayout.push(components); + } + Log.showInfo(TAG, `calcStatusBarLayout, statusBarLayout: ${JSON.stringify(statusBarLayout)}`) + this.mListener?.setStatusBarLayout(statusBarLayout); + } + + userChange(userInfo) { + Log.showInfo(TAG, `userChange userInfo ` + userInfo); + this.mAdapter.loadData(userInfo.userId); + } + + initFinish() { + Log.showInfo(TAG, `initFinish`); + SwitchUserManager.getInstance() + .getCurrentUserInfo() + .then((userInfo) => { + this.mAdapter.loadData(userInfo.userId); + }); + } + + registerListener(listener: StatusBarListener | undefined) { + Log.showInfo(TAG, `registerListener, listener: ${listener}`); + this.mListener = listener; + } + + onItemAdd(itemData: ItemComponentData) { + Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); + let statusBarData: StatusBarComponentData = parseItemData(itemData); + let id = itemData.id; + this.mListener?.setItemData(id, statusBarData); + if (this.mStatusBarAllLayout.indexOf(id) < 0) { + this.mStatusBarAllLayout.push(id); + Log.showInfo(TAG, `onItemAdd, mStatusBarAllLayout: ${JSON.stringify(this.mStatusBarAllLayout)}`) + this.calcStatusBarLayout(); + } + } + + onItemRemove(itemData: ItemComponentData) { + Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); + let id = itemData.id; + if (this.mStatusBarAllLayout.indexOf(id) >= 0) { + this.mStatusBarAllLayout.splice(this.mStatusBarAllLayout.indexOf(id), 1); + Log.showInfo(TAG, `onItemRemove, mStatusBarAllLayout: ${JSON.stringify(this.mStatusBarAllLayout)}`) + this.calcStatusBarLayout(); + } + this.mListener?.setItemData(id, undefined); + } + + onDisplayRotate(rotation: number) { + Log.showInfo(TAG, `onDisplayRotate, rotation: ${rotation}`) + let position: string = this.calcEmptyAreaPosition(rotation); + this.onEmptyAreaChange(position, rotation); + } + + calcEmptyAreaPosition(rotation: number): string { + Log.showInfo(TAG, `calcEmptyAreaPosition, rotation: ${rotation}`); + let configEmptyPosition = this.mConfig.emptyPosition; + if (!configEmptyPosition || configEmptyPosition.x1 == configEmptyPosition.x2 || configEmptyPosition.y1 == configEmptyPosition.y2) { + return null; + } + + let statusBarLeft; + let statusBarRight; + if (this.mStatusBarData.showHorizontal) { + statusBarLeft = { + x1: this.mStatusBarData.left, + y1: this.mStatusBarData.top, + x2: this.mStatusBarData.left + this.mStatusBarData.realWidth / 2, + y2: this.mStatusBarData.top + this.mStatusBarData.realHeight + }; + statusBarRight = { + x1: statusBarLeft.x2, + y1: statusBarLeft.y1, + x2: this.mStatusBarData.left + this.mStatusBarData.realWidth, + y2: statusBarLeft.y2 + }; + } else { + statusBarLeft = { + x1: this.mStatusBarData.left, + y1: this.mStatusBarData.top, + x2: this.mStatusBarData.left + this.mStatusBarData.realWidth, + y2: this.mStatusBarData.top + this.mStatusBarData.realHeight / 2 + }; + statusBarRight = { + x1: statusBarLeft.x1, + y1: statusBarLeft.y2, + x2: statusBarLeft.x2, + y2: this.mStatusBarData.top + this.mStatusBarData.realHeight + }; + } + Log.showInfo(TAG, `calcEmptyAreaPosition, statusBarLeft: ${JSON.stringify(statusBarLeft)}`); + Log.showInfo(TAG, `calcEmptyAreaPosition, statusBarRight: ${JSON.stringify(statusBarRight)}`); + + let emptyPosition; + if (rotation == 0) { + emptyPosition = { ...configEmptyPosition }; + } else if (rotation == 90) { + emptyPosition = { + x1: this.mStatusBarData.displayWidth - configEmptyPosition.y2, + y1: configEmptyPosition.x1, + x2: this.mStatusBarData.displayWidth - configEmptyPosition.y1, + y2: configEmptyPosition.x2 + } + } else if (rotation == 180) { + emptyPosition = { + x1: this.mStatusBarData.displayWidth - configEmptyPosition.x2, + y1: this.mStatusBarData.displayHeight - configEmptyPosition.y2, + x2: this.mStatusBarData.displayWidth - configEmptyPosition.x1, + y2: this.mStatusBarData.displayHeight - configEmptyPosition.y1, + } + } else { + emptyPosition = { + x1: configEmptyPosition.y1, + y1: this.mStatusBarData.displayHeight - configEmptyPosition.x2, + x2: configEmptyPosition.y2, + y2: this.mStatusBarData.displayHeight - configEmptyPosition.x1 + } + } + + let isGlandLeft = this.isEmptyAreaGlandStatusBar(emptyPosition, statusBarLeft); + let isGlandRight = this.isEmptyAreaGlandStatusBar(emptyPosition, statusBarRight); + Log.showInfo(TAG, `calcEmptyAreaPosition, gland: ${isGlandLeft} ${isGlandRight}`); + if (isGlandLeft && isGlandRight) { + return Constants.EMPTY_AREA_POSITION_CENTER; + } else if (isGlandLeft) { + return Constants.EMPTY_AREA_POSITION_LEFT; + } else if (isGlandRight) { + return Constants.EMPTY_AREA_POSITION_RIGHT; + } else { + return null; + } + } + + isEmptyAreaGlandStatusBar(emptyPosition, statusBarArea): boolean { + Log.showInfo(TAG, `isEmptyAreaGlandStatusBar, emptyPosition: ${JSON.stringify(emptyPosition)}`); + Log.showInfo(TAG, `isEmptyAreaGlandStatusBar, statusBarArea: ${JSON.stringify(statusBarArea)}`); + let ex1 = emptyPosition.x1; + let ey1 = emptyPosition.y1; + let ex2 = emptyPosition.x2; + let ey2 = emptyPosition.y2; + let x1 = statusBarArea.x1; + let y1 = statusBarArea.y1; + let x2 = statusBarArea.x2; + let y2 = statusBarArea.y2; + + if (ex1 >= x1 && ex1 <= x2 && ey1 >= y1 && ey1 <= y2) { + return true; + } else if (ex2 >= x1 && ex2 <= x2 && ey1 >= y1 && ey1 <= y2) { + return true; + } else if (ex1 >= x1 && ex1 <= x2 && ey2 >= y1 && ey2 <= y2) { + return true; + } else if (ex2 >= x1 && ex2 <= x2 && ey2 >= y1 && ey2 <= y2) { + return true; + } + return false; + } + + onEmptyAreaChange(position: string, rotation: number) { + Log.showInfo(TAG, `onEmptyAreaChange, position: ${position} rotation: ${rotation}`) + this.calcEmptyWidth(rotation); + this.setEmptyAreaToLayoutTemplate(position); + let id = FASlotName.EMPTY; + if (this.mStatusBarAllLayout.indexOf(id) >= 0) { + this.mStatusBarAllLayout.splice(this.mStatusBarAllLayout.indexOf(id), 1); + } + if (position) { + this.mStatusBarAllLayout.push(id); + } + Log.showInfo(TAG, `onEmptyAreaChange, mStatusBarAllLayout: ${JSON.stringify(this.mStatusBarAllLayout)}`) + this.calcStatusBarLayout(); + } + + setEmptyAreaToLayoutTemplate(position: string) { + Log.showInfo(TAG, `setEmptyAreaToLayoutTemplate, position: ${position}`) + for (let i = 0;i < this.mStatusBarLayoutGroupTemplate.length; i++) { + let componentsTemplate = this.mStatusBarLayoutGroupTemplate[i]; + let index = componentsTemplate.indexOf(FASlotName.EMPTY); + if (index >= 0) { + componentsTemplate.splice(index, 1); + break; + } + } + if (position == Constants.EMPTY_AREA_POSITION_LEFT) { + this.mStatusBarLayoutGroupTemplate[0].splice(0, 0, FASlotName.EMPTY); + } else if (position == Constants.EMPTY_AREA_POSITION_CENTER) { + this.mStatusBarLayoutGroupTemplate[1].splice(0, 0, FASlotName.EMPTY); + } else if (position == Constants.EMPTY_AREA_POSITION_RIGHT) { + this.mStatusBarLayoutGroupTemplate[2].push(FASlotName.EMPTY); + } + Log.showInfo(TAG, `setEmptyAreaToLayoutTemplate, template: ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`) + } + + calcEmptyWidth(rotation: number) { + Log.showInfo(TAG, `calcEmptyWidth, rotation: ${rotation}`) + let width: number = 0; + if (this.mConfig.emptyPosition) { + if (rotation == 0 || rotation == 180) { + width = this.mConfig.emptyPosition.x2 - this.mConfig.emptyPosition.x1; + } else { + width = this.mConfig.emptyPosition.y2 - this.mConfig.emptyPosition.y1; + } + } + Log.showInfo(TAG, `calcEmptyWidth, width: ${width}`) + this.mListener?.setStatusBarEmptyWidth(width); + } +} + +let sStatusBarService = createOrGet(StatusBarService, TAG); + +export default sStatusBarService as StatusBarService; \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index 93c196bf..fd119752 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,91 +13,120 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; -import WindowManager from '../../../../../../../../common/src/main/ets/default/WindowManager.ets' -import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets' -import Constants from '../common/Constants.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import EventManager, {unsubscribe} from '../../../../../../../../common/src/main/ets/default/event/EventManager' +import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils' +import {WINDOW_SHOW_HIDE_EVENT} from '../../../../../../../../common/src/main/ets/default/WindowManager' +import {PluginType} from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" +import ViewModel from '../viewmodel/StatusBarVM' +import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' +import MetaIconItemComponent from './MetaIconItemComponent' const TAG = 'IconItemComponent' @Component export default struct IconItemComponent { - @Prop keyId: string - @Prop color: string + private keyId: string @State mItemData: any = {} - private mWindowManager - private mFeatureAbilityManager + @State mItemStatus: any = { + selected: false + } + mClearCallback: unsubscribe | undefined + @State style: any = StyleConfiguration.getIconItemComponentStyle() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId} color:${JSON.stringify(this.color)}`) - this.mItemData = AppStorage.Link(this.keyId) - Log.showInfo(TAG, `aboutToAppear, mItemData: ${this.mItemData.get().iconUrl} ${this.mItemData.get().label}`) - this.mWindowManager = new WindowManager(); - this.mFeatureAbilityManager = new FeatureAbilityManager(); + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId} `) + this.linkItemData() + if (this.mItemData.get()?.relationWindowId) { + this.mClearCallback = EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => this.onWindowChange(args)) + } } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) - let deleteRs: boolean = AppStorage.Delete(this.keyId) - Log.showInfo(TAG, `aboutToDisappear AppStorage.Delete, ${deleteRs} key: ${this.keyId}`) + this.mClearCallback && this.mClearCallback() + this.mClearCallback = undefined + } + + linkItemData() { + Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`) + this.mItemData = AppStorage.Link('StatusBar_' + this.keyId) + Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ + this.mItemData.get() + .iconUrl}`) + this.mItemStatus = AppStorage.SetAndLink('StatusBar_Status_' + this.keyId, { selected: false }).get() } build() { - Row({ space: Constants.STATIC_BAR_ICON_INSIDE_SPACE }) { - if (!CheckEmptyUtils.isEmpty(this.mItemData.get().label)) { - Text(this.mItemData.get() - .label) - .fontColor(this.color) - .fontSize($r('app.float.icon_item_fontsize')) - .textAlign(TextAlign.End) - } - if (!CheckEmptyUtils.isEmpty(this.mItemData.get().iconUrl)) { - Image(this.mItemData.get().iconUrl) - .size({ width: Constants.STATIC_BAR_ICON_WIDTH, height: Constants.STATIC_BAR_ICON_HEIGHT }) + Row() { + Row().width(this.style.marginLeft).height('100%') + Row() { + Row().width(this.style.stackPadding).height('100%') + + if (this.mItemData.get().pluginType == PluginType.META) { + MetaIconItemComponent({ + keyId: this.keyId + }) + } else if (this.mItemData.get().pluginType == PluginType.DATA_ABILITY) { + // TODO: + } else if (this.mItemData.get().pluginType == PluginType.PLUGIN_COMPONENT) { + // TODO: + } + + Row().width(this.style.stackPadding).height('100%') } + .height(this.style.stackHeight) + .borderRadius(this.style.stackBorderRadius) + .backgroundColor(this.mItemStatus.selected ? this.style.stackBgColorSelected : this.style.stackBgColorUnSelected) + .onClick(this.onIconItemClick.bind(this)) + .gesture(LongPressGesture({ repeat: false }).onAction(this.onIconItemLongPressGesture.bind(this))) + .onTouch(this.onIconItemTouch.bind(this)) + + Row().width(this.style.marginRight).height('100%') + }.height('100%') + } + + onWindowChange(args) { + if (this.mItemData.get().canSelect && args?.windowName == this.mItemData.get().relationWindowId) { + this.mItemStatus.selected = args?.isShow } - .margin({ left: Constants.STATIC_BAR_ICON_OUTSIDE_MARGIN, right: Constants.STATIC_BAR_ICON_OUTSIDE_MARGIN }) - .height('100%') - .onClick(this.onIconItemClick.bind(this)) - .gesture(LongPressGesture({ repeat: false }).onAction(this.onIconItemLongPressGesture.bind(this))) } onIconItemClick(event: ClickEvent) { Log.showInfo(TAG, `onIconItemClick`) - if (this.mItemData.get().actionData && this.mItemData.get().actionData.clickAction) { - this.startAbility(this.mItemData.get().actionData.clickAction) + if (!this.mItemStatus.selected) { + this.execClickAction() + } else { + this.execSelectedClickAction() } } - onIconItemLongPressGesture(event: GestureEvent) { - Log.showInfo(TAG, `onIconItemLongPressGesture, event: ${JSON.stringify(event)}`) - if (this.mItemData.get().actionData && this.mItemData.get().actionData.longClickAction) { - this.startAbility(this.mItemData.get().actionData.longClickAction) + execClickAction() { + Log.showInfo(TAG, `execClickAction`) + if (this.mItemData.get()?.actionData?.clickAction) { + EventManager.publish(this.mItemData.get().actionData.clickAction) } } - startAbility(action) { - Log.showInfo(TAG, `startAbility, action: ${action}`) - let actionInfos = action.split('&') - let wantParam = { - parameters: {} + execSelectedClickAction() { + Log.showInfo(TAG, `execSelectedClickAction ${this.mItemData.get()?.actionData?.selectedClickAction}`) + if (this.mItemData.get()?.actionData?.selectedClickAction) { + EventManager.publish(this.mItemData.get().actionData.selectedClickAction) } - for (let actionInfoStr of actionInfos) { - let actionInfo = actionInfoStr.split('=') - if (actionInfo[0] == 'want') { - wantParam['bundleName'] = actionInfo[1].split('/')[0] - wantParam['abilityName'] = actionInfo[1].split('/')[1] - } else { - wantParam.parameters[actionInfo[0]] = actionInfo.length > 1 ? actionInfo[1] : actionInfo[0] - } - } - Log.showInfo(TAG, `startAbility, want: ${JSON.stringify(wantParam)}`) + } - this.mWindowManager.setWindowMin((result) => { - this.mFeatureAbilityManager.openAbility(TAG, { - want: wantParam - }); - }); + onIconItemLongPressGesture(event: GestureEvent) { + Log.showInfo(TAG, `onIconItemLongPressGesture, event: ${JSON.stringify(event)}`) + let longClickEvent = this.mItemData.get().actionData.longClickAction; + longClickEvent && EventManager.publish(longClickEvent); + } + + onIconItemTouch(event: TouchEvent) { + Log.showInfo(TAG, `onIconItemTouch, event: ${JSON.stringify(event)}`) + if (this.mItemData.get()?.actionData?.clickAction || this.mItemData.get()?.actionData?.longClickAction) { + event.stopPropagation() + } } } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets new file mode 100644 index 00000000..a2aec257 --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager' +import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils' +import ViewModel from '../viewmodel/StatusBarVM' +import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' + +const TAG = 'MetaIconItemComponent' + +@Component +export default struct MetaIconItemComponent { + private keyId: string + @State mItemData: any = {} + @State mTintContentInfo: TintContentInfo = new TintContentInfo() + @State style: any = StyleConfiguration.getIconItemComponentStyle() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) + this.linkItemData() + this.mTintContentInfo = ViewModel.getPluginTintContentInfo(this.keyId) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + linkItemData() { + Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`) + this.mItemData = AppStorage.Link('StatusBar_' + this.keyId) + Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ + this.mItemData.get() + .iconUrl}`) + } + + build() { + Row() { + if (this.mItemData.get().isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.get().label)) { + Text(this.mItemData.get() + .label) + .fontColor(this.mTintContentInfo.contentColor) + .fontSize(this.styleCommon.statusBarFontSize) + .textAlign(TextAlign.End) + } + if (this.mItemData.get().isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.get().label)) { + if (this.mItemData.get().isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.get().iconUrl)) { + Row() { + }.height(1).width(this.style.componentSpace) + } + } + if (this.mItemData.get().isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.get().iconUrl)) { + Image(this.mItemData.get() + .iconUrl) + .width(this.style.iconWidth) + .height(this.style.iconHeight) + .fillColor(this.mTintContentInfo.contentColor) + .objectFit(ImageFit.Contain) + } + }.height('100%') + } +} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index d1c7806a..ccf64366 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,40 +13,40 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../common/Constants.ets' -import ViewModel from '../viewmodel/StatusBarVM.ets' -import IconItemComponent from './IconItemComponent.ets' -import BatteryIcon from '../../../../../../../batterycomponent/src/main/ets/default/pages/batteryIcon.ets' -import ClockIcon from '../../../../../../../clockcomponent/src/main/ets/default/pages/clockIcon.ets' -import WifiIcon from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiIcon.ets' -import BluetoothIcon from '../../../../../../../bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets' -import SignalIcon from '../../../../../../../signalcomponent/src/main/ets/default/pages/signalIcon.ets' -import CapsuleIcon from '../../../../../../../capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets' -import LocationIcon from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets' -import RingModeIcon from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import {StatusBarData, StatusBarBackgroundData} from '../common/Constants' +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants' +import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' +import ViewModel from '../viewmodel/StatusBarVM' +import IconItemComponent from './IconItemComponent' +import BatteryIcon from '../../../../../../../batterycomponent/src/main/ets/default/pages/batteryIcon' +import ClockIcon from '../../../../../../../clockcomponent/src/main/ets/default/pages/clockIcon' +import WifiIcon from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiIcon' +import BluetoothIcon from '../../../../../../../bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent' +import SignalIcon from '../../../../../../../signalcomponent/src/main/ets/default/pages/signalIcon' +import CapsuleIcon from '../../../../../../../capsulecomponent/src/main/ets/default/pages/CapsuleIcon' +import LocationIcon from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' +import RingModeIcon from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' const TAG = 'StatusBarComponent' const TAG_StatusBarGroup = 'StatusBarGroup' +const TAG_VerticalStatusBarItemLoadComponent = 'VerticalStatusBarItemLoadComponent' +const TAG_StatusBarItemLoadComponent = 'StatusBarItemLoadComponent' const TAG_StatusBarEmptyIcon = 'StatusBarEmptyIcon' const TAG_StatusBarNotificationIcon = 'StatusBarNotificationIcon' +const TAG_StatusBarBackground = 'StatusBarBackground' @Component export default struct StatusBarComponent { - @State mStatusBarComponentConfig: any = {} - @Prop mStatusBarColor: string + private mStatusBarComponentConfig: any = {} @StorageLink('StatusBarLayout') mStatusBarLayout: any = [[], [], []] - @StorageLink('maxWidth') @Watch('onSizeUpdated') maxWidth: number = 0 - @StorageLink('maxHeight') @Watch('onSizeUpdated') maxHeight: number = 0 - @StorageLink('minHeight') @Watch('onSizeUpdated') minHeight: number = 0 - @StorageLink('StatusBarComponentIsStart') mIsStart: boolean = false - @StorageLink("showHorizontal") showHorizontal: boolean = AppStorage.SetAndLink("showHorizontal", true).get(); + @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`) - if (this.maxWidth > 0 && this.maxHeight > 0 && this.minHeight > 0) { - this.initViewModel() - } + this.initViewModel() Log.showInfo(TAG, `aboutToAppear End`) } @@ -54,70 +54,99 @@ export default struct StatusBarComponent { Log.showInfo(TAG, `aboutToDisappear`) } - onSizeUpdated(propName: string): void { - Log.showInfo(TAG, `onSizeUpdated, propName: ${propName} maxWidth: ${this.maxWidth} maxHeight: ${this.maxHeight} minHeight: ${this.minHeight}`) - if (this.maxWidth == 0 || this.maxHeight == 0 || this.minHeight == 0) { - return - } - this.initViewModel() - } - initViewModel() { Log.showInfo(TAG, `initViewModel`) - if (this.mIsStart) { - return + ViewModel.initViewModel(this.mStatusBarComponentConfig) + } + + build() { + Stack() { + StatusBarBackground() + if (this.mStatusBarData.showHorizontal) { + Row() { + StatusBarGroup({ + mComponents: this.mStatusBarLayout[0], + mLayoutWeight: 1, + mAlignItems: HorizontalAlign.Start + }) + StatusBarGroup({ + mComponents: this.mStatusBarLayout[1], + mLayoutWeight: 0, + mAlignItems: HorizontalAlign.Center + }) + StatusBarGroup({ + mComponents: this.mStatusBarLayout[2], + mLayoutWeight: 1, + mAlignItems: HorizontalAlign.End + }) + } + .width('100%') + .height('100%') + } else { + Column() { + StatusBarGroup({ + mComponents: this.mStatusBarLayout[0], + mLayoutWeight: 1, + mAlignItems: VerticalAlign.Center + }) + StatusBarGroup({ + mComponents: this.mStatusBarLayout[1], + mLayoutWeight: 0, + mAlignItems: VerticalAlign.Center + }) + StatusBarGroup({ + mComponents: this.mStatusBarLayout[2], + mLayoutWeight: 1, + mAlignItems: VerticalAlign.Center + }) + } + .width('100%') + .height('100%') + } } - this.mIsStart = true - ViewModel.initViewModel(this.mStatusBarComponentConfig, { - width: this.maxWidth, - height: this.maxHeight, - statusBarHeight: this.minHeight - }) + .width('100%') + .height('100%') + } +} + +@Component +struct StatusBarBackground { + @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() + @State mBackgroundDatas: StatusBarBackgroundData[] = ViewModel.getBackgroundDatas() + + aboutToAppear() { + Log.showInfo(TAG_StatusBarBackground, `aboutToAppear Start`) + } + + aboutToDisappear() { + Log.showInfo(TAG_StatusBarBackground, `aboutToDisAppear`) } build() { - if (this.showHorizontal) { + if (this.mStatusBarData.showHorizontal) { Row() { - StatusBarGroup({ - mColor: this.mStatusBarColor, - mComponents: this.mStatusBarLayout[0], - mLayoutWeight: 1, - mAlignItems: HorizontalAlign.Start - }) - StatusBarGroup({ - mColor: this.mStatusBarColor, - mComponents: this.mStatusBarLayout[1], - mLayoutWeight: 0, - mAlignItems: HorizontalAlign.Center - }) - StatusBarGroup({ - mColor: this.mStatusBarColor, - mComponents: this.mStatusBarLayout[2], - mLayoutWeight: 1, - mAlignItems: HorizontalAlign.End + ForEach(this.mBackgroundDatas, (data: StatusBarBackgroundData) => { + if (data.width > 0) { + Column() { + } + .width(data.width + 'px') + .height('100%') + .backgroundColor(data.backgroundColor) + } }) } .width('100%') .height('100%') } else { Column() { - StatusBarGroup({ - mColor: this.mStatusBarColor, - mComponents: this.mStatusBarLayout[0], - mLayoutWeight: 1, - mAlignItems: VerticalAlign.Center - }) - StatusBarGroup({ - mColor: this.mStatusBarColor, - mComponents: this.mStatusBarLayout[1], - mLayoutWeight: 0, - mAlignItems: VerticalAlign.Center - }) - StatusBarGroup({ - mColor: this.mStatusBarColor, - mComponents: this.mStatusBarLayout[2], - mLayoutWeight: 1, - mAlignItems: VerticalAlign.Center + ForEach(this.mBackgroundDatas, (data: StatusBarBackgroundData) => { + if (data.width > 0) { + Column() { + } + .width('100%') + .height(data.width + 'px') + .backgroundColor(data.backgroundColor) + } }) } .width('100%') @@ -128,12 +157,10 @@ export default struct StatusBarComponent { @Component struct StatusBarGroup { - @Prop mColor: string @State mComponents: string[] = [] - @State mLayoutWeight: number = 1 - @State mAlignItems: HorizontalAlign = HorizontalAlign.Center; - @StorageLink('StatusBarEmptyWidth') mStatusBarEmptyWidth: any = 0 - @StorageLink("showHorizontal") showHorizontal: boolean = AppStorage.SetAndLink("showHorizontal", true).get(); + private mLayoutWeight: number = 1 + private mAlignItems: HorizontalAlign = HorizontalAlign.Center; + @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() aboutToAppear() { Log.showInfo(TAG_StatusBarGroup, `aboutToAppear Start`) @@ -145,93 +172,115 @@ struct StatusBarGroup { } build() { - if (this.showHorizontal) { + if (this.mStatusBarData.showHorizontal) { Column() { Row() { ForEach(this.mComponents, (componentName: string) => { - Row() { - if (componentName == Constants.EMPTY) { - StatusBarEmptyIcon() - } else if (componentName == Constants.WIFI) { - WifiIcon() - } else if (componentName == Constants.BLUETOOTH) { - BluetoothIcon() - } else if (componentName == Constants.SIGNAL) { - SignalIcon() - } else if (componentName == Constants.CLOCK) { - ClockIcon() - } else if (componentName == Constants.BATTERY) { - BatteryIcon() - } else if (componentName == Constants.CAPSULE) { - CapsuleIcon() - } else if (componentName == Constants.NOTIFICATION) { - StatusBarNotificationIcon() - } else if (componentName == Constants.LOCATION) { - LocationIcon() - } else if (componentName == Constants.RING_MODE) { - RingModeIcon() - } else { - IconItemComponent({ - keyId: componentName, - color: this.mColor - }) - } - } - .height('100%') + StatusBarItemLoadComponent({ + mComponentName: componentName + }) }, (componentName: string) => componentName) - } + }.height('100%') } .alignItems(this.mAlignItems) .layoutWeight(this.mLayoutWeight) + .height('100%') } else { Row() { Column() { ForEach(this.mComponents, (componentName: string) => { - Row() { - if (componentName == Constants.EMPTY) { - StatusBarEmptyIcon() - } else if (componentName == Constants.WIFI) { - WifiIcon() - } else if (componentName == Constants.BLUETOOTH) { - BluetoothIcon() - } else if (componentName == Constants.SIGNAL) { - SignalIcon() - } else if (componentName == Constants.CLOCK) { - ClockIcon() - } else if (componentName == Constants.BATTERY) { - BatteryIcon() - } else if (componentName == Constants.CAPSULE) { - CapsuleIcon() - } else if (componentName == Constants.NOTIFICATION) { - StatusBarNotificationIcon() - } else if (componentName == Constants.LOCATION) { - LocationIcon() - } else if (componentName == Constants.RING_MODE) { - RingModeIcon() - } else { - IconItemComponent({ - keyId: componentName, - color: this.mColor - }) - } - } - .width('100%') - .margin({ - top: $r("app.float.status_bar_vertical_margin"), - bottom: $r("app.float.status_bar_vertical_margin") + VerticalStatusBarItemLoadComponent({ + mComponentName: componentName }) }, (componentName: string) => componentName) - } + }.width('100%') } .alignItems(this.mAlignItems) + .width('100%') .layoutWeight(this.mLayoutWeight) } } } +@Component +struct VerticalStatusBarItemLoadComponent { + private mComponentName: string + @State mComponentHeight: number = 0 + @State style: any = StyleConfiguration.getVerticalStatusBarItemLoadComponentStyle() + + aboutToAppear() { + Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName}`) + } + + aboutToDisappear() { + Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `aboutToDisAppear, mComponentName: ${this.mComponentName}`) + } + + build() { + Row() { + StatusBarItemLoadComponent({ + mComponentName: this.mComponentName + }) + } + .height(this.mComponentHeight + 'px') + .onAreaChange((e, e2) => { + Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `onAreaChange, mComponentName: ${this.mComponentName} e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + this.mComponentHeight = e2.width > 0 ? this.style.statusBarVerticalComponentHeight : 0 + Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `onAreaChange, mComponentName: ${this.mComponentName} mComponentHeight: ${this.mComponentHeight}`); + }) + } +} + +@Component +struct StatusBarItemLoadComponent { + private mComponentName: string + + aboutToAppear() { + Log.showInfo(TAG_StatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName} `) + } + + aboutToDisappear() { + Log.showInfo(TAG_StatusBarGroup, `aboutToDisAppear, mComponentName: ${this.mComponentName} `) + } + + build() { + Row() { + if (this.mComponentName == FASlotName.EMPTY) { + StatusBarEmptyIcon() + } else if (this.mComponentName == FASlotName.WIFI) { + WifiIcon() + } else if (this.mComponentName == FASlotName.BLUETOOTH) { + BluetoothIcon() + } else if (this.mComponentName == FASlotName.SIGNAL) { + SignalIcon() + } else if (this.mComponentName == FASlotName.CLOCK) { + ClockIcon() + } else if (this.mComponentName == FASlotName.BATTERY) { + BatteryIcon() + } else if (this.mComponentName == FASlotName.CAPSULE) { + CapsuleIcon() + } else if (this.mComponentName == FASlotName.NOTIFICATION) { + StatusBarNotificationIcon() + } else if (this.mComponentName == FASlotName.LOCATION) { + LocationIcon() + } else if (this.mComponentName == FASlotName.RING_MODE) { + RingModeIcon() + } else { + IconItemComponent({ + keyId: this.mComponentName + }) + } + }.height('100%') + .onAreaChange((e: Area, e2: Area) => { + ViewModel.updateComponentArea(this.mComponentName, e2) + }) + } +} + @Component struct StatusBarEmptyIcon { @StorageLink('StatusBarEmptyWidth') mStatusBarEmptyWidth: any = 0 + @State mTintContentInfo: TintContentInfo = ViewModel.getEmptyTintContentInfo() aboutToAppear() { Log.showInfo(TAG_StatusBarEmptyIcon, `aboutToAppear Start`) @@ -251,6 +300,9 @@ struct StatusBarEmptyIcon { struct StatusBarNotificationIcon { @StorageLink('notificationList') notificationList: any = [] @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + @State mTintContentInfo: TintContentInfo = ViewModel.getNotificationTintContentInfo() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @State style: any = StyleConfiguration.getStatusBarNotificationIconStyle() aboutToAppear() { Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToAppear Start`) @@ -262,30 +314,41 @@ struct StatusBarNotificationIcon { build() { Row() { + if (this.notificationList.length > 0) { + Row().height(1).width(this.styleCommon.statusBarMarginLeftRight) + } if (this.notificationList.length > 3) { ForEach(this.notificationList.slice(0, 3), (item: any) => { - Image(item.smallIcon) + Image(item[0].smallIcon) .objectFit(ImageFit.ScaleDown) - .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) - .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) - .margin({ right: Constants.STATIC_BAR_ICON_MARGIN }) + .height(this.style.iconHeight) + .width(this.style.iconWidth) + .margin({ right: this.style.iconSpace }) + .fillColor(this.mTintContentInfo.contentColor) }) Row() { Text('...') - .fontSize(20) + .fontSize(this.styleCommon.statusBarFontSize) + .fontColor(this.mTintContentInfo.contentColor) } } else { - ForEach(this.notificationList, (item: any) => { - Image(item.smallIcon) + ForEach(this.notificationList.map((item, index1) => { + return { i: index1, data: item } + }), (item) => { + if (item.i > 0) { + Row().height(1).width(this.style.iconSpace) + } + Image(item.data[0].smallIcon) .objectFit(ImageFit.ScaleDown) - .height(Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient) - .width(Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient) - .margin({ right: Constants.STATIC_BAR_ICON_MARGIN }) + .height(this.style.iconHeight) + .width(this.style.iconWidth) + .fillColor(this.mTintContentInfo.contentColor) }) } + if (this.notificationList.length > 0) { + Row().height(1).width(this.styleCommon.statusBarMarginLeftRight) + } } - .width(this.notificationList.length > 3 ? - (Constants.STATIC_BAR_ICON_WIDTH + Constants.STATIC_BAR_ICON_MARGIN) * 4 : - (Constants.STATIC_BAR_ICON_WIDTH + Constants.STATIC_BAR_ICON_MARGIN) * this.notificationList.length) + .height('100%') } } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts new file mode 100644 index 00000000..18388417 --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -0,0 +1,315 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import WindowManager, {WindowType} from '../../../../../../../../common/src/main/ets/default/WindowManager'; +import TintStateManager, {TintState, TintContentInfo, getOrCreateTintContentInfo +} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import {FASlotName, Rect} from '../../../../../../../../common/src/main/ets/default/Constants'; +import Constants, {StatusBarData, StatusBarBackgroundData, StatusBarComponentGroupContentData, StatusBarComponentData +} from '../common/Constants'; +import StatusBarService from '../model/StatusBarService'; + +export const StatusBarLayoutKey = "StatusBarLayout"; + +export const StatusBarEmptyWidthKey = "StatusBarEmptyWidth"; + +const TAG = 'StatusBarVM'; + +export class StatusBarVM { + mIsStart: boolean = false; + mStatusBarLayout: string[][] = [[], [], []]; + mStatusBarEmptyWidth: any; + mUseCount = 0; + mStatusBarEnable: boolean = true; + mBackgroundDatas: StatusBarBackgroundData[]; + mStatusBarData: StatusBarData = { ...new StatusBarData() } + mComponentAreaMap: Map = new Map(); + mComponentGroupContentDatas: StatusBarComponentGroupContentData[] = [ + new StatusBarComponentGroupContentData(), new StatusBarComponentGroupContentData(), new StatusBarComponentGroupContentData()]; + mEmptyTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.EMPTY); + mNotificationTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.NOTIFICATION); + mUseInWindowName: WindowType = WindowType.STATUS_BAR; + + constructor() { + Log.showInfo(TAG, `constructor`) + this.mStatusBarData = AppStorage.SetAndLink(TAG + '_StatusBarData', this.mStatusBarData).get(); + StatusBarService.setStatusBarData(this.mStatusBarData); + + this.mStatusBarLayout = AppStorage.SetAndLink(StatusBarLayoutKey, this.mStatusBarLayout).get(); + this.mStatusBarEmptyWidth = AppStorage.SetAndLink(StatusBarEmptyWidthKey, 0); + + let defaultBackgroundDatas: StatusBarBackgroundData[] = []; + defaultBackgroundDatas.push(new StatusBarBackgroundData()); + defaultBackgroundDatas.push(new StatusBarBackgroundData()); + defaultBackgroundDatas.push(new StatusBarBackgroundData()); + if (this.mStatusBarData.showHorizontal) { + defaultBackgroundDatas[0].width = this.mStatusBarData.realWidth; + } else { + defaultBackgroundDatas[0].width = this.mStatusBarData.realHeight; + } + this.mBackgroundDatas = AppStorage.SetAndLink(TAG + '_BackgroundDatas', defaultBackgroundDatas).get(); + + StatusBarService.registerListener(this); + } + + install() { + Log.showInfo(TAG, `install, useCount: ${this.mUseCount}`); + if (!this.mUseCount) { + TintStateManager.getInstance().registerListener('status', this); + } + this.mUseCount++; + } + + uninstall() { + Log.showInfo(TAG, `uninstall, useCount: ${this.mUseCount}`); + this.mUseCount--; + if (this.mUseCount) { + TintStateManager.getInstance().unregisterListener('status'); + } + } + + initViewModel(config) { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)}`) + this.mIsStart = true; + + this.install(); + StatusBarService.startService(config); + } + + setStatusBarLayout(layout: string[][]): void{ + Log.showInfo(TAG, `setStatusBarLayout, layout: ${JSON.stringify(layout)}`) + for (let i = 0;i < layout.length; i++) { + if (JSON.stringify(layout[i]) != JSON.stringify(this.mStatusBarLayout[i])) { + this.mStatusBarLayout[i] = layout[i]; + } + } + } + + setStatusBarEmptyWidth(width: number): void{ + Log.showInfo(TAG, `setStatusBarEmptyWidth, width: ${width}`) + this.mStatusBarEmptyWidth.set(width); + } + + setItemData(id: string, itemData: StatusBarComponentData): void{ + Log.showInfo(TAG, `setItemData, id: ${id} itemData: ${JSON.stringify(itemData)}`) + let storageKey: string = 'StatusBar_' + id; + if (itemData) { + AppStorage.SetOrCreate(storageKey, itemData); + } else { + let deleteRs: boolean = AppStorage.Delete(storageKey); + Log.showInfo(TAG, `setItemData, AppStorage.Delete rs: ${deleteRs} `) + } + } + + onTintStateChange(tintState: TintState) { + Log.showInfo(TAG, `onTintStateChange, tintState: ${JSON.stringify(tintState)}`) + if (typeof (tintState.isEnable) == 'boolean') { + this.setStatusBarEnable(tintState.isEnable); + } + if (tintState.backgroundColor) { + this.changeBackground(tintState); + } + if (tintState.contentColor) { + this.changeContent(tintState); + } + } + + setStatusBarEnable(isEnable: boolean) { + Log.showInfo(TAG, `setStatusBarEnable, isEnable ${isEnable}`); + if (this.mStatusBarEnable == isEnable) { + return; + } + this.mStatusBarEnable = isEnable; + this.mStatusBarEnable ? WindowManager.showWindow(WindowType.STATUS_BAR) : WindowManager.hideWindow(WindowType.STATUS_BAR); + } + + changeBackground(tintState: TintState): void{ + Log.showInfo(TAG, `changeBackground, backgroundColor: ${tintState.backgroundColor} region: ${JSON.stringify(tintState.region)}`) + let data = new StatusBarBackgroundData(); + data.backgroundColor = tintState.backgroundColor; + if (this.mStatusBarData.showHorizontal) { + if (!tintState.region) { + data.width = this.mStatusBarData.realWidth; + this.mBackgroundDatas[0] = data; + this.mBackgroundDatas[1] = new StatusBarBackgroundData(); + this.mBackgroundDatas[2] = new StatusBarBackgroundData(); + } else { + data.width = tintState.region.width; + if (tintState.region.left == this.mStatusBarData.left) { + this.mBackgroundDatas[0] = data; + } else if ((tintState.region.left + tintState.region.width) == (this.mStatusBarData.left + this.mStatusBarData.realWidth)) { + this.mBackgroundDatas[2] = data; + } else { + this.mBackgroundDatas[1] = data; + } + } + } else { + if (!tintState.region) { + data.width = this.mStatusBarData.realHeight; + this.mBackgroundDatas[0] = data; + this.mBackgroundDatas[1] = new StatusBarBackgroundData(); + this.mBackgroundDatas[2] = new StatusBarBackgroundData(); + } else { + data.width = tintState.region.height; + if (tintState.region.top == this.mStatusBarData.top) { + this.mBackgroundDatas[0] = data; + } else if ((tintState.region.top + tintState.region.height) == (this.mStatusBarData.top + this.mStatusBarData.realHeight)) { + this.mBackgroundDatas[2] = data; + } else { + this.mBackgroundDatas[1] = data; + } + } + } + Log.showInfo(TAG, `changeBackground, data: ${JSON.stringify(data)}`) + } + + changeContent(tintState: TintState): void{ + Log.showInfo(TAG, `changeContent, contentColor: ${tintState.contentColor} region: ${JSON.stringify(tintState.region)}`) + let data = new StatusBarComponentGroupContentData(); + data.contentColor = tintState.contentColor; + if (this.mStatusBarData.showHorizontal) { + if (!tintState.region) { + data.width = this.mStatusBarData.realWidth; + this.mComponentGroupContentDatas[0] = data; + this.mComponentGroupContentDatas[1] = new StatusBarComponentGroupContentData(); + this.mComponentGroupContentDatas[2] = new StatusBarComponentGroupContentData(); + } else { + data.width = tintState.region.width; + if (tintState.region.left == this.mStatusBarData.left) { + this.mComponentGroupContentDatas[0] = data; + } else if ((tintState.region.left + tintState.region.width) == (this.mStatusBarData.left + this.mStatusBarData.realWidth)) { + this.mComponentGroupContentDatas[2] = data; + } else { + this.mComponentGroupContentDatas[1] = data; + } + } + } else { + if (!tintState.region) { + data.width = this.mStatusBarData.realHeight; + this.mComponentGroupContentDatas[0] = data; + this.mComponentGroupContentDatas[1] = new StatusBarComponentGroupContentData(); + this.mComponentGroupContentDatas[2] = new StatusBarComponentGroupContentData(); + } else { + data.width = tintState.region.height; + if (tintState.region.top == this.mStatusBarData.top) { + this.mComponentGroupContentDatas[0] = data; + } else if ((tintState.region.top + tintState.region.height) == (this.mStatusBarData.top + this.mStatusBarData.realHeight)) { + this.mComponentGroupContentDatas[2] = data; + } else { + this.mComponentGroupContentDatas[1] = data; + } + } + } + Log.showInfo(TAG, `changeContent, data: ${JSON.stringify(data)}`) + + this.mComponentAreaMap.forEach((value: Rect, key: string) => { + this.changeComponentContent(key, value); + }); + } + + changeComponentContent(id: string, area: Rect): void{ + Log.showInfo(TAG, `changeComponentContent, id ${id} area: ${JSON.stringify(area)}`); + if (this.mUseInWindowName != WindowType.STATUS_BAR) { + this.setComponentContent(id, '#FFFFFFFF'); + return; + } + if ((this.mStatusBarData.showHorizontal && area.width == 0) || (!this.mStatusBarData.showHorizontal && area.height == 0)) { + this.setComponentContent(id, '#FFFFFFFF'); + return; + } + let startPos = this.mStatusBarData.showHorizontal ? this.mStatusBarData.left : this.mStatusBarData.top; + for (let group of this.mComponentGroupContentDatas) { + if (group.width == 0) { + continue; + } + let endPos = group.width + startPos; + let componentStartPos: number; + let componentEndPos: number; + if (this.mStatusBarData.showHorizontal) { + componentStartPos = area.left; + componentEndPos = area.left + area.width; + } else { + componentStartPos = area.top; + componentEndPos = area.top + area.height; + } + if (!(componentEndPos <= startPos) && !(componentStartPos >= endPos)) { + this.setComponentContent(id, group.contentColor); + break; + } + startPos = endPos; + } + } + + setComponentContent(id: string, contentColor: string): void{ + Log.showInfo(TAG, `setComponentContent, id ${id} contentColor: ${contentColor}`); + getOrCreateTintContentInfo(id).contentColor = contentColor; + } + + updateComponentArea(id: string, area: Area): void{ + Log.showInfo(TAG, `updateComponentArea, id ${id} area: ${JSON.stringify(area)}`); + let areaInfo = { + left: vp2px(area.globalPos.x as number), + top: vp2px(area.globalPos.y as number), + width: vp2px(area.width as number), + height: vp2px(area.height as number) + }; + this.mComponentAreaMap.set(id, areaInfo); + this.changeComponentContent(id, areaInfo); + } + + setUseInWindowName(name: WindowType): void { + Log.showInfo(TAG, `setUseInWindowName, name ${name}`); + this.mUseInWindowName = name; + this.mComponentAreaMap.forEach((value: Rect, key: string) => { + this.changeComponentContent(key, value); + }); + } + + getStatusBarData(): StatusBarData { + return this.mStatusBarData; + } + + updateStatusBarData(data: StatusBarData): void{ + Log.showInfo(TAG, `updateStatusBarData, data: ${JSON.stringify(data)}`) + for (let key in data) { + this.mStatusBarData[key] = data[key]; + } + } + + getEmptyTintContentInfo(): TintContentInfo{ + return this.mEmptyTintContentInfo; + } + + getNotificationTintContentInfo(): TintContentInfo{ + return this.mNotificationTintContentInfo; + } + + getPluginTintContentInfo(id: string): TintContentInfo{ + return getOrCreateTintContentInfo(id); + } + + getBackgroundDatas(): StatusBarBackgroundData[]{ + return this.mBackgroundDatas; + } +} + +let sStatusBarVM = createOrGet(StatusBarVM, TAG); + +export default sStatusBarVM as StatusBarVM; \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/resources/base/element/color.json b/features/statusbarcomponent/src/main/resources/base/element/color.json index 6b163c9d..990d020b 100644 --- a/features/statusbarcomponent/src/main/resources/base/element/color.json +++ b/features/statusbarcomponent/src/main/resources/base/element/color.json @@ -1,12 +1,12 @@ { "color": [ { - "name": "default_background", - "value": "#66000000" + "name": "status_bar_icon_item_stack_bg_color_selected", + "value": "#3800FF9D" }, { - "name": "default_font_color", - "value": "#ffffffff" + "name": "status_bar_icon_item_stack_bg_color_un_selected", + "value": "#00000000" } ] } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/resources/base/element/float.json b/features/statusbarcomponent/src/main/resources/base/element/float.json index 26c4a1ba..998f5281 100644 --- a/features/statusbarcomponent/src/main/resources/base/element/float.json +++ b/features/statusbarcomponent/src/main/resources/base/element/float.json @@ -1,12 +1,48 @@ { "float": [ { - "name": "icon_item_fontsize", - "value": "18" + "name": "status_bar_icon_item_stack_height", + "value": "34vp" }, { - "name": "status_bar_vertical_margin", - "value": "24" + "name": "status_bar_icon_item_stack_padding", + "value": "4vp" + }, + { + "name": "status_bar_icon_item_stack_border_radius", + "value": "4vp" + }, + { + "name": "status_bar_icon_item_component_space", + "value": "8vp" + }, + { + "name": "status_bar_icon_item_icon_width", + "value": "26vp" + }, + { + "name": "status_bar_icon_item_icon_height", + "value": "26vp" + }, + { + "name": "status_bar_icon_item_margin_left", + "value": "1vp" + }, + { + "name": "status_bar_icon_item_margin_right", + "value": "1vp" + }, + { + "name": "status_bar_notification_icon_width", + "value": "24vp" + }, + { + "name": "status_bar_notification_icon_height", + "value": "24vp" + }, + { + "name": "status_bar_notification_icon_space", + "value": "8vp" } ] } \ No newline at end of file diff --git a/features/volumecomponent/src/main/ets/default/VolumeModel.ts b/features/volumecomponent/src/main/ets/default/VolumeModel.ts new file mode 100644 index 00000000..3f5b5313 --- /dev/null +++ b/features/volumecomponent/src/main/ets/default/VolumeModel.ts @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../common/src/main/ets/default/Log'; +import {getAudioManager}from '../../../../../../common/src/main/ets/default/SingleInstanceHelper'; + +const SYSTEMUI_AUDIOVOLUMETYPE_MEDIA = 'settings.audio.media' +let TAG = 'Control-VolumeModel'; +var mVolumeValue = AppStorage.SetAndLink('VolumeValue', 5); + +export class VolumeModel { + helper: any + uri: string + + init(): void{ + } + + registerVolume() { + } + + unRegisterVolume() { + } + + setVolume(callback) { + Log.showInfo(TAG, 'setVolume'); + let value = parseInt(callback.value); + Log.showInfo(TAG, `setVolume ${value}`); + mVolumeValue.set(value); + } + + getVolume() { + Log.showInfo(TAG, 'getVolume'); + } + + getMaxVolume(callback, volumeType) { + Log.showInfo(TAG, `getMaxVolume volumeType:${volumeType} `); + } + + getMinVolume(callback, volumeType) { + Log.showInfo(TAG, `getMaxVolume volumeType:${volumeType} `); + } +} + +let mVolumeModel = new VolumeModel(); + +export default mVolumeModel as VolumeModel; \ No newline at end of file diff --git a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets index 95372de3..d11b7f37 100644 --- a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets +++ b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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,8 +14,8 @@ */ import audio from '@ohos.multimedia.audio'; -import VolumeModel from '../VolumeModel.ets'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import VolumeModel from '../VolumeModel'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'Control-volumeComponent' const volumeType = audio.AudioVolumeType.MEDIA; diff --git a/features/volumepanelcomponent/.gitignore b/features/volumepanelcomponent/.gitignore new file mode 100644 index 00000000..378eac25 --- /dev/null +++ b/features/volumepanelcomponent/.gitignore @@ -0,0 +1 @@ +build diff --git a/features/volumepanelcomponent/build.gradle b/features/volumepanelcomponent/build.gradle new file mode 100644 index 00000000..ae402d92 --- /dev/null +++ b/features/volumepanelcomponent/build.gradle @@ -0,0 +1,19 @@ +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/config.json b/features/volumepanelcomponent/src/main/config.json new file mode 100644 index 00000000..9413b83c --- /dev/null +++ b/features/volumepanelcomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.volumepanelcomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "volumepanelcomponent", + "moduleType": "har" + }, + "srcPath": "default" + } +} \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts new file mode 100644 index 00000000..61512b2a --- /dev/null +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + static DEFAULT_MAX_VOLUME = 15; + static DEFAULT_MIN_VOLUME = 0; + static DEFAULT_MUTE_STATUS = false; + static DEFAULT_SHOW_STATUS = true; + static HOLD_SHOW = false; + static HOLD_TIME = 2000; +} + +export enum AudioVolumeType { + VOICE_CALL = 0, + RINGTONE = 2, + MEDIA = 3, +} + +export interface VolumeInfo { + volumeType: AudioVolumeType; + volume: number; + isMute: boolean; + updateUi: boolean; +} \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts new file mode 100644 index 00000000..161e531d --- /dev/null +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import Constants from './Constants' + +const TAG = 'volumepanel-StyleConfiguration'; + +export default class StyleConfiguration { + static getVolumePanelComponentStyle() { + const key: string = TAG + "-VolumePanelComponent"; + return StyleManager.getStyle(key, () => { + return { + volumePanelSliderMarginTop: $r('app.float.volume_panel_component_slider_margin_top'), + volumePanSliderWidth: $r('app.float.volume_panel_component_slider_width'), + volumePanSliderHeight: $r('app.float.volume_panel_component_slider_height'), + volumePanelSliderMarginBottom: $r('app.float.volume_panel_component_slider_margin_bottom'), + volumePanelMutBtnIconSize: $r('app.float.volume_panel_component_mute_btn_icon_size'), + volumePanelMutBtnIconMarginBottom: $r('app.float.volume_panel_component_mute_btn_icon_margin_bottom'), + volumePanelMuteBtnHeight: $r('app.float.volume_panel_component_mute_btn_height'), + volumePanelSettingIconSize: $r('app.float.volume_panel_component_setting_icon_size'), + volumePanelBackground: $r('app.color.panel_background'), + volumePanelSliderBlockColor: $r('app.color.volume_slider_block_color'), + volumePanelDividerHeight: $r('app.float.volume_panel_divider_height'), + volumePanelBorderRadius: $r('app.float.volume_panel_border_radius'), + volumeDividerWidth: $r('app.float.volume_divider_width'), + volumeSliderTrackColor: $r('app.color.volume_slider_track_color'), + volumeSelectedColor: $r('app.color.volume_slider_selected_color'), + volumeButtonBackgroundColor: $r('app.color.volume_button_background_color'), + volumePanelRingModeColor: $r('app.color.volume_ring_mode_color'), + volumePanelDividerColor:$r('app.color.volume_divider_color'), + volumePanelSettingColor: $r('sys.color.ohos_id_color_secondary'), + volumePanelSettingButtonSize: $r('app.float.volume_panel_component_setting_btn_icon_size') + + }; + }); + } +} \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts new file mode 100644 index 00000000..2df48624 --- /dev/null +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import getSingleInstance from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import VolumePanelService from '../model/VolumePanelService'; +import {VolumeInfo} from '../common/Constants'; + +const TAG = 'VolumeWindowController' +const SINGLE_STANCE_KEY = 'VolumeWindowController' +const INTERVAL = 3 * 1000 + +export default class VolumeWindowController { + mWindowHandle: any; + mInterval: number = INTERVAL; + mLastActionTime: number; + mIsWindowShown: boolean; + + static getInstance(): VolumeWindowController{ + return getSingleInstance(VolumeWindowController, SINGLE_STANCE_KEY) + } + + constructor() { + VolumePanelService.startService(); + VolumePanelService.registerListener(this); + Log.showInfo(TAG, `constructor done.`) + } + + setInterval(interval) { + this.mInterval = interval; + } + + setWindowHandle(windowHandle) { + Log.showInfo(TAG, `setWindowHandle windowHandle:${windowHandle}`) + this.mWindowHandle = windowHandle; + } + + updateVolumeInfo(volumeInfo: VolumeInfo) { + Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} `) + if (volumeInfo && !volumeInfo.updateUi && !this.mIsWindowShown) { + return; + } + this.setWindowState(true); + this.mLastActionTime = (new Date()).getTime(); + setTimeout(() => { + Log.showInfo(TAG, `check need hide window or not.`) + if ((new Date()).getTime() - this.mLastActionTime >= this.mInterval) { + this.setWindowState(false); + } + }, this.mInterval); + } + + setWindowState(isShow: boolean) { + Log.showInfo(TAG, `setWindowState ${isShow}.`); + if (this.mIsWindowShown == isShow) { + Log.showInfo(TAG, `Neen't set volueme window state.`) + return; + } + if (this.mWindowHandle) { + this.mIsWindowShown = isShow; + (isShow ? this.mWindowHandle.show() : this.mWindowHandle.hide()) + .then(() => { + Log.showInfo(TAG, `updateShowStatus ${isShow}.`); + }) + .catch((err) => Log.showInfo(TAG, `Can't set volueme window: ${err}.`)) + } + } +} \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts new file mode 100644 index 00000000..b2f56036 --- /dev/null +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts @@ -0,0 +1,304 @@ +/* + * Copyright (c) 2021-2022 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 audio from '@ohos.multimedia.audio'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import getSingleInstance, {getAudioManager} +from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import {AudioVolumeType, VolumeInfo} from '../common/Constants'; + +const TAG = 'VolumePanelModel'; +type VolumeListener = { updateVolumeInfo: Function } + +enum InterfaceName { + isMute, + mute, + getVolume, + setVolume +} + +export class VolumePanelService { + mIsStart: boolean = false; + mListeners = new Set(); + mAudioManager = getAudioManager(); + mInterfaceCallQueue = []; + + constructor() { + Log.showInfo(TAG, `constructor`) + } + + startService() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `startService`) + this.mIsStart = true; + Log.showInfo(TAG, `registser volumeChange.`) + this.mAudioManager.on('volumeChange', this.onVolumeChange.bind(this)); + } + + stopService() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `stopService`) + this.mIsStart = false; + } + + registerListener(listener: VolumeListener) { + let res = this.mListeners.add(listener); + Log.showInfo(TAG, `registser VolumeListener ${res}`); + } + + unregisterListener(listener: VolumeListener) { + let res = this.mListeners.delete(listener); + Log.showInfo(TAG, `unregistser VolumeListener ${res}`); + } + + async onVolumeChange(data) { + Log.showInfo(TAG, `onVolumeChange, data: ${JSON.stringify(data)}`) + let volumeType = this.formatAudioVolumeTypeFromInterface(data.volumeType); + this.isMute(volumeType, (volumeType2, data2) => { + Log.showInfo(TAG, `onVolumeChange->isMute, volumeType2: ${volumeType2} data2: ${data2}`) + let volumeInfo: VolumeInfo = { + volumeType: volumeType, + volume: data.volume, + isMute: data2, + updateUi: data.updateUi + }; + this.mListeners.forEach(listener => listener.updateVolumeInfo(volumeInfo)); + }); + } + + isMute(volumeType: AudioVolumeType, callback: Function) { + Log.showInfo(TAG, `isMute, volumeType: ${volumeType}`) + let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); + this.addInterfaceCallQueue({ + interfaceName: InterfaceName.isMute, + params: [interfaceVolumeType], + callbackFunction: (err, data) => { + Log.showInfo(TAG, `isMute, err: ${err} data: ${JSON.stringify(data)}`) + if (err) { + return; + } + callback(volumeType, data); + } + }); + } + + getVolumeInfo(volumeType: AudioVolumeType, callback?: (volumeInfo: VolumeInfo) => void) { + Log.showInfo(TAG, `getVolumeInfo, volumeType: ${volumeType}`) + this.getVolume(volumeType, (volumeType, data) => { + Log.showInfo(TAG, `getVolumeInfo->getVolume, volumeType: ${volumeType} data: ${data}`) + this.isMute(volumeType, (volumeType2, data2) => { + Log.showInfo(TAG, `getVolumeInfo->isMute, volumeType2: ${volumeType2} data2: ${data2}`) + let volumeInfo: VolumeInfo = { + volumeType: volumeType, + volume: data, + isMute: data2, + updateUi: false + }; + this.mListeners.forEach(listener => listener.updateVolumeInfo(volumeInfo)); + if (callback) { + callback(volumeInfo); + } + }); + }); + } + + isActive(volumeType: AudioVolumeType, callback: Function) { + Log.showInfo(TAG, `isActive, volumeType: ${volumeType}`) + let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); + this.mAudioManager.isActive(interfaceVolumeType, (err, data) => { + Log.showInfo(TAG, `isActive, err: ${err} data: ${JSON.stringify(data)}`) + if (err) { + return; + } + callback(volumeType, data); + }); + } + + getVolume(volumeType: AudioVolumeType, callback: Function) { + Log.showInfo(TAG, `getVolume, volumeType: ${volumeType}`) + let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); + this.addInterfaceCallQueue({ + interfaceName: InterfaceName.getVolume, + params: [interfaceVolumeType], + callbackFunction: (err, data) => { + Log.showInfo(TAG, `getVolume, err: ${err} data: ${JSON.stringify(data)}`) + if (err) { + return; + } + callback(volumeType, data); + } + }); + } + + getMaxVolume(volumeType: AudioVolumeType, callback: Function) { + Log.showInfo(TAG, `getMaxVolume, volumeType: ${volumeType}`) + let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); + this.mAudioManager.getMaxVolume(interfaceVolumeType, (err, data) => { + Log.showInfo(TAG, `getMaxVolume, err: ${err} data: ${JSON.stringify(data)}`) + if (err) { + return; + } + callback(volumeType, data); + }); + } + + getMinVolume(volumeType: AudioVolumeType, callback: Function) { + Log.showInfo(TAG, `getMinVolume, volumeType: ${volumeType}`) + let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); + this.mAudioManager.getMinVolume(interfaceVolumeType, (err, data) => { + Log.showInfo(TAG, `getMinVolume, err: ${err} data: ${JSON.stringify(data)}`) + if (err) { + return; + } + callback(volumeType, data); + }); + } + + setVolumeAndMute(volumeType: AudioVolumeType, volume: number, mute: boolean, callback?: () => void) { + Log.showInfo(TAG, `setVolumeAndMute, volumeType: ${volumeType} volume: ${volume} mute: ${mute}`) + if (volume !== undefined && mute !== undefined) { + this.setVolume(volumeType, volume, () => { + Log.showInfo(TAG, `setVolumeAndMute, setVolume callback volumeType: ${volumeType} volume: ${volume} mute: ${mute}`) + this.setMute(volumeType, mute, callback); + }); + } else if (volume !== undefined) { + this.setVolume(volumeType, volume); + } else if (mute !== undefined) { + this.setMute(volumeType, mute, callback); + } + } + + setVolume(volumeType: AudioVolumeType, volume: number, callback?: () => void) { + Log.showInfo(TAG, `setVolume, volumeType: ${volumeType} volume: ${volume}`) + let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); + this.addInterfaceCallQueue({ + interfaceName: InterfaceName.setVolume, + params: [interfaceVolumeType, volume], + callbackFunction: (err) => { + Log.showInfo(TAG, `setVolume, callback volumeType: ${volumeType} volume: ${volume}`) + Log.showInfo(TAG, `setVolume, callback err: ${err} `) + if (err) { + return; + } + if (callback) { + callback(); + } + } + }); + } + + setMute(volumeType: AudioVolumeType, mute: boolean, callback?: () => void) { + Log.showInfo(TAG, `setMute, volumeType: ${volumeType} mute: ${mute}`) + let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); + this.addInterfaceCallQueue({ + interfaceName: InterfaceName.mute, + params: [interfaceVolumeType, mute], + callbackFunction: (err) => { + Log.showInfo(TAG, `setMute, err: ${err}`) + if (err) { + return; + } + this.getVolumeInfo(volumeType, (volumeInfo: VolumeInfo) => { + Log.showInfo(TAG, `setMute, volumeInfo: ${JSON.stringify(volumeInfo)}`) + if (callback) { + callback(); + } + }); + } + }); + } + + formatAudioVolumeTypeFromInterface(audioVolumeType) { + let formatValue; + if (audioVolumeType == audio.AudioVolumeType.VOICE_CALL) { + formatValue = AudioVolumeType.VOICE_CALL; + } else if (audioVolumeType == audio.AudioVolumeType.RINGTONE) { + formatValue = AudioVolumeType.RINGTONE; + } else if (audioVolumeType == audio.AudioVolumeType.MEDIA) { + formatValue = AudioVolumeType.MEDIA; + } + return formatValue; + } + + formatAudioVolumeTypeToInterface(audioVolumeType) { + let formatValue; + if (audioVolumeType == AudioVolumeType.VOICE_CALL) { + formatValue = audio.AudioVolumeType.VOICE_CALL; + } else if (audioVolumeType == AudioVolumeType.RINGTONE) { + formatValue = audio.AudioVolumeType.RINGTONE; + } else if (audioVolumeType == AudioVolumeType.MEDIA) { + formatValue = audio.AudioVolumeType.MEDIA; + } + return formatValue; + } + + addInterfaceCallQueue(data: { + interfaceName: InterfaceName, + params: any[], + callbackFunction: Function + }) { + Log.showInfo(TAG, `addInterfaceCallQueue, interfaceName: ${data.interfaceName} params: ${JSON.stringify(data.params)}`) + this.mInterfaceCallQueue.push(data); + if (this.mInterfaceCallQueue.length == 1) { + this.execInterfaceCallQueueFirst(); + } + } + + execInterfaceCallQueueFirst() { + Log.showInfo(TAG, `execInterfaceCallQueueFirst, ${this.mInterfaceCallQueue.length}`) + let queueData = this.mInterfaceCallQueue[0]; + if (queueData.interfaceName == InterfaceName.isMute) { + this.mAudioManager.isMute(queueData.params[0], (err, data) => { + Log.showInfo(TAG, `execInterfaceCallQueueFirst, isMute callback`) + this.execInterfaceCallQueueNext(); + queueData.callbackFunction(err, data); + }); + } else if (queueData.interfaceName == InterfaceName.mute) { + this.mAudioManager.mute(queueData.params[0], queueData.params[1], (err) => { + Log.showInfo(TAG, `execInterfaceCallQueueFirst, mute callback`) + this.execInterfaceCallQueueNext(); + queueData.callbackFunction(err); + }); + } else if (queueData.interfaceName == InterfaceName.getVolume) { + this.mAudioManager.getVolume(queueData.params[0], (err, data) => { + Log.showInfo(TAG, `execInterfaceCallQueueFirst, getVolume callback`) + this.execInterfaceCallQueueNext(); + queueData.callbackFunction(err, data); + }); + } else if (queueData.interfaceName == InterfaceName.setVolume) { + this.mAudioManager.setVolume(queueData.params[0], queueData.params[1], (err) => { + Log.showInfo(TAG, `execInterfaceCallQueueFirst, setVolume callback`) + this.execInterfaceCallQueueNext(); + queueData.callbackFunction(err); + }); + } + } + + async execInterfaceCallQueueNext() { + Log.showInfo(TAG, `execInterfaceCallQueueNext, ${this.mInterfaceCallQueue.length}`) + this.mInterfaceCallQueue.splice(0, 1); + if (this.mInterfaceCallQueue.length > 0) { + this.execInterfaceCallQueueFirst(); + } + } +} + +let volumePanelService = getSingleInstance(VolumePanelService, TAG); + +export default volumePanelService as VolumePanelService; \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets new file mode 100644 index 00000000..2c061f01 --- /dev/null +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import StyleConfiguration from '../common/StyleConfiguration' +import Constants from '../common/Constants' +import ViewModel from '../viewmodel/VolumePanelVM' +import VolumeWindowController from '../common/VolumeWindowController' + +const TAG = 'VolumePanel-VolumePanelComponent' + +@Component +export default struct VolumePanelComponent { + @StorageLink('VolumePanelMaxVolume') VolumePanelMaxVolume: number = Constants.DEFAULT_MAX_VOLUME + @StorageLink('VolumePanelMinVolume') VolumePanelMinVolume: number = Constants.DEFAULT_MIN_VOLUME + @StorageLink('VolumePanelVolumeValue') VolumePanelVolumeValue: number = Constants.DEFAULT_MIN_VOLUME + @StorageLink('VolumePanelIsMute') VolumePanelIsMute: boolean = Constants.DEFAULT_MUTE_STATUS + @State style: any = StyleConfiguration.getVolumePanelComponentStyle() + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear') + ViewModel.initViewModel() + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') + } + + build() { + Column() { + Column().width('100%').height(this.style.volumePanelSliderMarginTop) + Column() { + Slider({ + value: this.VolumePanelVolumeValue, + min: this.VolumePanelMinVolume, + max: this.VolumePanelMaxVolume, + step: 1, + style: SliderStyle.OutSet, + direction: Axis.Vertical + }) + .height('100%') + .trackThickness(this.style.volumePanSliderWidth) + .blockColor(this.style.volumePanelSliderBlockColor) + .trackColor(this.style.volumeSelectedColor) + .selectedColor(this.style.volumeSliderTrackColor) + .onChange(this.onVolumeChange.bind(this)) + } + .height(this.style.volumePanSliderHeight) + + Column() + .width('100%') + .height(this.style.volumePanelSliderMarginBottom) + Column() { + Button({ type: ButtonType.Normal, stateEffect: true }) { + Column() { + Image(this.getVolumeIcon(this.VolumePanelIsMute, this.VolumePanelVolumeValue, this.VolumePanelMaxVolume, this.VolumePanelMinVolume)) + .width(this.style.volumePanelMutBtnIconSize) + .height(this.style.volumePanelMutBtnIconSize) + .fillColor(this.style.volumePanelRingModeColor) + Column() + .width('100%') + .height(this.style.volumePanelMutBtnIconMarginBottom) + } + } + .width('100%') + .height('100%') + .backgroundColor(this.style.volumeButtonBackgroundColor) + .onClick(this.onMuteBtnClick.bind(this)) + } + .width('100%') + .height(this.style.volumePanelMuteBtnHeight) + + Column() { + Divider() + .vertical(false) + .strokeWidth(this.style.volumePanelDividerHeight) + .color(this.style.volumePanelDividerColor) + .lineCap(LineCapStyle.Square) + } + .width(this.style.volumeDividerWidth) + .height(this.style.volumePanelDividerHeight) + + Column() { + Button({ type: ButtonType.Circle, stateEffect: true }) { + Column() { + Column() + .width('100%') + .height(this.style.volumePanelMutBtnIconMarginBottom) + Image($r('app.media.ic_public_settings')) + .width(this.style.volumePanelSettingIconSize) + .height(this.style.volumePanelSettingIconSize) + .fillColor(this.style.volumePanelSettingColor) + Column() + .width('100%') + .height(this.style.volumePanelMutBtnIconMarginBottom) + } + } + .width('100%') + .height('100%') + .backgroundColor(this.style.volumeButtonBackgroundColor) + .onClick(this.onSettingsBtnClick.bind(this)) + } + .width('100%') + .height(this.style.volumePanelSettingButtonSize) + } + .width('100%') + .height('100%') + .borderRadius(this.style.volumePanelBorderRadius) + .backgroundColor(this.style.volumePanelBackground) + } + + getVolumeIcon(isMute, volume, maxVolume, minVolume) { + Log.showInfo(TAG, `getVolumeIcon, isMute: ${isMute} volume: ${volume} maxVolume: ${maxVolume} minVolume: ${minVolume}`) + let icon + if (isMute) { + icon = $r('app.media.ic_public_mute') + } else { + if (volume <= ((maxVolume - minVolume) / 3 + minVolume)) { + icon = $r('app.media.ic_public_sound_03') + } else if (volume <= (((maxVolume - minVolume) / 3) * 2 + minVolume)) { + icon = $r('app.media.ic_public_sound_02') + } else { + icon = $r('app.media.ic_public_sound_01') + } + } + return icon + } + + onVolumeChange(value: number, mode: SliderChangeMode) { + Log.showInfo(TAG, `onVolumeChange, value: ${value} mode: ${mode}`) + ViewModel.setVolume(value) + } + + onMuteBtnClick(event: ClickEvent) { + Log.showInfo(TAG, `onMuteBtnClick`) + ViewModel.mute() + } + + onSettingsBtnClick(event: ClickEvent) { + Log.showInfo(TAG, `onSettingsBtnClick`) + AbilityManager.startAbility({ + bundleName: 'com.ohos.settings', + abilityName: 'com.ohos.settings.MainAbility', + }); + VolumeWindowController.getInstance().setWindowState(false); + } +} \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts new file mode 100644 index 00000000..57095ce5 --- /dev/null +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import Constants from '../common/Constants' +import {AudioVolumeType, VolumeInfo} from '../common/Constants'; +import VolumePanelService from '../model/VolumePanelService'; +import VolumeWindowController from '../common/VolumeWindowController'; + +export const VolumePanelMaxVolumeKey = "VolumePanelMaxVolume"; + +export const VolumePanelMinVolumeKey = "VolumePanelMinVolume"; + +export const VolumePanelVolumeValueKey = "VolumePanelVolumeValue"; + +export const VolumePanelIsMuteKey = "VolumePanelIsMute"; + +const TAG = 'VolumePanelVM'; + +export class VolumePanelVM { + mIsStart: boolean = false; + mMaxVolume: any; + mMinVolume: any; + mVolumeValue: any; + mIsMute: any; + mAllVolumeTypes = [AudioVolumeType.VOICE_CALL, AudioVolumeType.RINGTONE, AudioVolumeType.MEDIA]; + mVolumeBaseMap = {}; + mCurrentAudioVolumeType: number = AudioVolumeType.MEDIA; + mCurrentAudioVolume: number; + mUpdatingAudioVolume: number; + mVolumeBeforeMute: number; + + constructor() { + Log.showInfo(TAG, `constructor`) + } + + initViewModel() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initViewModel `) + this.mIsStart = true; + + this.mMaxVolume = AppStorage.SetAndLink(VolumePanelMaxVolumeKey, Constants.DEFAULT_MAX_VOLUME); + this.mMinVolume = AppStorage.SetAndLink(VolumePanelMinVolumeKey, Constants.DEFAULT_MIN_VOLUME); + this.mVolumeValue = AppStorage.SetAndLink(VolumePanelVolumeValueKey, Constants.DEFAULT_MIN_VOLUME); + this.mIsMute = AppStorage.SetAndLink(VolumePanelIsMuteKey, Constants.DEFAULT_MUTE_STATUS); + this.mAllVolumeTypes.forEach((volumeType: AudioVolumeType) => { + this.mVolumeBaseMap[volumeType] = { + maxVolume: Constants.DEFAULT_MAX_VOLUME, + minVolume: Constants.DEFAULT_MIN_VOLUME + }; + }); + VolumePanelService.startService(); + VolumePanelService.registerListener(this); + this.mAllVolumeTypes.forEach((volumeType: AudioVolumeType) => { + VolumePanelService.getMaxVolume(volumeType, (volumeType, value) => this.updateMaxVolume(volumeType, value)); + VolumePanelService.getMinVolume(volumeType, (volumeType, value) => this.updateMinVolume(volumeType, value)); + }); + this.getInitVolumeInfo(); + } + + getInitVolumeInfo() { + Log.showInfo(TAG, `getInitVolumeInfo`) + this.getActiveVolumeType(JSON.parse(JSON.stringify(this.mAllVolumeTypes)), (activeVolumeType: AudioVolumeType) => { + Log.showInfo(TAG, `getInitVolumeInfo, activeVolumeType: ${activeVolumeType}`) + if (activeVolumeType == undefined) { + activeVolumeType = AudioVolumeType.MEDIA; + } + this.mCurrentAudioVolumeType = activeVolumeType; + VolumePanelService.getVolumeInfo(activeVolumeType); + }); + } + + getActiveVolumeType(volumeTypes: number[], callback: Function) { + Log.showInfo(TAG, `getActiveVolumeType, volumeTypes: ${JSON.stringify(volumeTypes)}`) + if (volumeTypes.length == 0) { + callback(undefined); + return; + } + VolumePanelService.isActive(volumeTypes[0], (volumeType: AudioVolumeType, data: boolean) => { + Log.showInfo(TAG, `getActiveVolumeType, volumeType: ${volumeType} data: ${data}`) + if (data) { + callback(volumeType); + } else { + volumeTypes.splice(0, 1); + this.getActiveVolumeType(volumeTypes, callback); + } + }); + } + + updateMaxVolume(volumeType: AudioVolumeType, value: number) { + Log.showInfo(TAG, `updateMaxVolume, volumeType: ${volumeType} value: ${value}`) + this.mVolumeBaseMap[volumeType].maxVolume = value; + Log.showInfo(TAG, `updateMaxVolume, mVolumeBaseMap: ${JSON.stringify(this.mVolumeBaseMap)}`) + } + + updateMinVolume(volumeType: AudioVolumeType, value: number) { + Log.showInfo(TAG, `updateMinVolume, volumeType: ${volumeType} value: ${value}`) + this.mVolumeBaseMap[volumeType].minVolume = value; + Log.showInfo(TAG, `updateMinVolume, mVolumeBaseMap: ${JSON.stringify(this.mVolumeBaseMap)}`) + } + + updateVolumeInfo(volumeInfo: VolumeInfo) { + Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} `) + Log.showInfo(TAG, `updateVolumeInfo, mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType} `) + if (!volumeInfo.updateUi && volumeInfo.volumeType != this.mCurrentAudioVolumeType) { + return; + } + let volumeType = volumeInfo.volumeType; + let maxVolume = this.mVolumeBaseMap[volumeType].maxVolume; + let minVolume = this.mVolumeBaseMap[volumeType].minVolume; + this.mMaxVolume.set(maxVolume); + this.mMinVolume.set(minVolume); + Log.showInfo(TAG, `updateVolumeInfo, mMaxVolume: ${this.mMaxVolume.get()} `) + Log.showInfo(TAG, `updateVolumeInfo, mMinVolume: ${this.mMinVolume.get()} `) + + this.mCurrentAudioVolume = volumeInfo.volume; + this.mCurrentAudioVolumeType = volumeType; + Log.showInfo(TAG, `updateVolumeInfo, mCurrentAudioVolume: ${this.mCurrentAudioVolume} `) + Log.showInfo(TAG, `updateVolumeInfo, mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType} `) + + this.mVolumeBeforeMute = minVolume; + this.mIsMute.set(volumeInfo.isMute); + Log.showInfo(TAG, `updateVolumeInfo, mIsMute: ${this.mIsMute.get()} `) + + this.updateDisplayVolume(volumeInfo.isMute ? minVolume : volumeInfo.volume, maxVolume, minVolume); + } + + updateDisplayVolume(volume: number, maxVolume: number, minVolume: number): void{ + Log.showInfo(TAG, `updateDisplayVolume, volume: ${volume} maxVolume: ${maxVolume} minVolume: ${minVolume}`) + let displayVolume: number = maxVolume - volume + minVolume; + this.mVolumeValue.set(displayVolume); + Log.showInfo(TAG, `updateDisplayVolume, mVolumeValue: ${this.mVolumeValue.get()}`) + } + + calcVolumeByDisplayVolume(displayVolume: number): number{ + Log.showInfo(TAG, `calcVolumeByDisplayVolume, displayVolume: ${displayVolume}`) + let volume: number = this.mMaxVolume.get() - displayVolume + this.mMinVolume.get(); + Log.showInfo(TAG, `calcVolumeByDisplayVolume, volume: ${volume}`) + return volume; + } + + setVolume(displayVolume: number) { + Log.showInfo(TAG, `setVolume, displayVolume: ${displayVolume} `) + let volume: number = this.calcVolumeByDisplayVolume(displayVolume); + if (this.mUpdatingAudioVolume != undefined && volume == this.mUpdatingAudioVolume) { + return; + } + this.mUpdatingAudioVolume = volume; + let isMute = volume == this.mMinVolume.get(); + if (isMute == this.mIsMute.get()) { + isMute = undefined; + } + VolumePanelService.setVolumeAndMute(this.mCurrentAudioVolumeType, volume, isMute); + VolumeWindowController.getInstance().updateVolumeInfo(null); + } + + mute() { + Log.showInfo(TAG, `mute, isMute: ${this.mIsMute.get()} mCurrentAudioVolume: ${this.mCurrentAudioVolume}`) + this.mUpdatingAudioVolume = undefined; + let isMute = this.mIsMute.get(); + isMute = !isMute; + let maxVolume: number = this.mMaxVolume.get(); + let minVolume: number = this.mMinVolume.get(); + let volume = isMute ? minVolume : (minVolume == this.mVolumeBeforeMute ? (minVolume + 1) : this.mVolumeBeforeMute); + let currentAudioVolume = this.mCurrentAudioVolume; + let volumeType = this.mCurrentAudioVolumeType; + VolumePanelService.setVolumeAndMute(volumeType, volume, isMute, () => { + Log.showInfo(TAG, `mute, setVolumeAndMute callback`) + if (volumeType == this.mCurrentAudioVolumeType && this.mIsMute.get()) { + this.mVolumeBeforeMute = currentAudioVolume; + } + }); + VolumeWindowController.getInstance().updateVolumeInfo(null); + } +} + +let volumePanelVM = new VolumePanelVM(); + +export default volumePanelVM as VolumePanelVM; \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/resources/base/element/color.json b/features/volumepanelcomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..db93ac8b --- /dev/null +++ b/features/volumepanelcomponent/src/main/resources/base/element/color.json @@ -0,0 +1,32 @@ +{ + "color": [ + { + "name": "panel_background", + "value": "#99FFFFFF" + }, + { + "name": "volume_slider_block_color", + "value": "#FFFFFFFF" + }, + { + "name": "volume_slider_track_color", + "value": "#FFAFEAE7" + }, + { + "name": "volume_slider_selected_color", + "value": "#FF007DFF" + }, + { + "name": "volume_button_background_color", + "value": "#00000000" + }, + { + "name": "volume_ring_mode_color", + "value": "#FF3B58C5" + }, + { + "name": "volume_divider_color", + "value": "#FF9BB792" + } + ] +} diff --git a/features/volumepanelcomponent/src/main/resources/base/element/float.json b/features/volumepanelcomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..08acc113 --- /dev/null +++ b/features/volumepanelcomponent/src/main/resources/base/element/float.json @@ -0,0 +1,53 @@ +{ + "float": [ + { + "name": "volume_panel_component_slider_margin_top", + "value": "40vp" + }, + { + "name": "volume_panel_component_slider_width", + "value": "8vp" + }, + { + "name": "volume_panel_component_slider_height", + "value": "320vp" + }, + { + "name": "volume_panel_border_radius", + "value": "48vp" + }, + { + "name": "volume_panel_component_slider_margin_bottom", + "value": "40vp" + }, + { + "name": "volume_panel_component_mute_btn_icon_size", + "value": "48vp" + }, + { + "name": "volume_panel_component_mute_btn_icon_margin_bottom", + "value": "24vp" + }, + { + "name": "volume_panel_component_mute_btn_height", + "value": "72vp" + }, + { + "name": "volume_panel_component_setting_icon_size", + "value": "48vp" + }, + { + "name": "volume_panel_divider_height", + "value": "1vp" + }, + { + "name": "volume_divider_width", + "value": "68vp" + }, + { + "name": "volume_panel_component_setting_btn_icon_size", + "value": "96vp" + } + + ] +} diff --git a/features/volumepanelcomponent/src/main/resources/base/element/string.json b/features/volumepanelcomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..c1dc1812 --- /dev/null +++ b/features/volumepanelcomponent/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "volume_panel_component_name", + "value": "音量面板" + } + ] +} diff --git a/features/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg b/features/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg new file mode 100644 index 00000000..8b4b1be3 --- /dev/null +++ b/features/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg @@ -0,0 +1,9 @@ + + + ic_mute + + + + + + \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg b/features/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg new file mode 100644 index 00000000..84fbc674 --- /dev/null +++ b/features/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_settings + + + + + + + + + + \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg b/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg new file mode 100644 index 00000000..f2cfdb8e --- /dev/null +++ b/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg @@ -0,0 +1,17 @@ + + + ic_sound_01 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg b/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg new file mode 100644 index 00000000..13f155b1 --- /dev/null +++ b/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg @@ -0,0 +1,18 @@ + + + ic_sound_02 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg b/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg new file mode 100644 index 00000000..b0415299 --- /dev/null +++ b/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/features/volumepanelcomponent/src/main/resources/base/media/icon.png b/features/volumepanelcomponent/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { + return { + statusBarWifiWidth: $r('app.float.status_bar_wifi_width'), + statusBarWifiHeight: $r('app.float.status_bar_wifi_height') + }; + }); + } +} \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/common/constants.ts b/features/wificomponent/src/main/ets/default/common/constants.ts new file mode 100644 index 00000000..4a3bc786 --- /dev/null +++ b/features/wificomponent/src/main/ets/default/common/constants.ts @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021-2022 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 default class constants { + static DEFAULT_WIFI_OPEN_STATUS: boolean = false; + static DEFAULT_WIFI_NAME: string = 'WLAN'; + static DEFAULT_WIFI_INFO: number = 0; + static DEFAULT_WIFI_STATUS: boolean = false; + static WIFI_SIGNAL_NO: number = 0; + static WIFI_SIGNAL_LOW: number = 1; + static WIFI_SIGNAL_MID: number = 2; + static WIFI_SIGNAL_HIGH: number = 3; + static WIFI_SIGNAL_FULL: number = 4; +} + +export enum WifiState { + STATE_OFF = 0, + STATE_ON = 1, + STATE_TURNING_ON = 2, + STATE_TURNING_OFF = 3 +} + +export enum WifiConnectionState { + DISCONNECTED = 0, + CONNECTED = 1 +} diff --git a/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets b/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets index a7e90a43..7885436e 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,12 +13,12 @@ * limitations under the License. */ -import mWifiManger from '../WifiModel.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -import FeatureAbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets' -import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' -import iconTitleBase from '../../../../../../../common/src/main/ets/template/iconTitleBase.ets' -import Constants from '../common/constants.ets' +import mWifiManger from '../WifiModel' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import EventManager from "../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainStartAbility} from "../../../../../../../common/src/main/ets/default/event/EventUtil" +import iconTitleBase from '../../../../../../../common/src/main/ets/template/iconTitleBase' +import Constants from '../common/constants' const TAG = 'Control-wifiComponent' @@ -30,9 +30,6 @@ export default struct WifiComponent { ] @StorageLink('wifiName') wifiName: string = Constants.DEFAULT_WIFI_NAME @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = Constants.DEFAULT_WIFI_OPEN_STATUS - @StorageLink("showStatusBar") showStatusBar: boolean = false - private mWindowManager - private mFeatureAbilityManager mClickEvent() { Log.showInfo(TAG, `mClickEvent, wifiOpenStatus: ${this.wifiOpenStatus}`) @@ -48,22 +45,11 @@ export default struct WifiComponent { mLongClickEvent() { Log.showInfo(TAG, `mLongClickEvent, wifiOpenStatus: ${this.wifiOpenStatus}`) - - this.showStatusBar = true - this.mWindowManager.setWindowMin((result) => { - this.mFeatureAbilityManager.openAbility(TAG, { - want: { - bundleName: 'com.ohos.settings', - abilityName: 'com.ohos.settings.MainAbility', - } - }) - }) + EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.WifiAbility')) } aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear') - this.mWindowManager = new WindowManager() - this.mFeatureAbilityManager = new FeatureAbilityManager() mWifiManger.initWifiModel() } @@ -78,8 +64,8 @@ export default struct WifiComponent { iconOn: this.IconInfo[1], mTitle: $wifiName, changeSwitch: $wifiOpenStatus, - mClickEvent: this.mClickEvent.bind(this), - mLongClickEvent: this.mLongClickEvent.bind(this) + mClickEvent: () => this.mClickEvent(), + mLongClickEvent: () => this.mLongClickEvent() }) }.width('100%') .height('100%') diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index 2483022b..483c8e35 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,9 +13,13 @@ * limitations under the License. */ -import Constants from '../common/constants.ets' -import mWifiModel from '../WifiModel.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/constants' +import mWifiModel from '../WifiModel' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' +import ViewModel from '../viewmodel/WifiVM' const TAG = 'WifiComponent-WifiIcon' @@ -23,7 +27,9 @@ const TAG = 'WifiComponent-WifiIcon' export default struct WifiIcon { @StorageLink('wifiInfo') wifiInfo: number = Constants.DEFAULT_WIFI_INFO @StorageLink('wifiStatus') wifiStatus: boolean = Constants.DEFAULT_WIFI_STATUS - @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @State style: any = StyleConfiguration.getStartsBarWifiComponentStyle() aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) @@ -35,13 +41,18 @@ export default struct WifiIcon { } build() { - Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Row() { if (this.wifiStatus) { - Image(this.getImage(this.wifiInfo)).objectFit(ImageFit.Contain) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + Image(this.getImage(this.wifiInfo)) + .objectFit(ImageFit.Contain) + .width(this.style.statusBarWifiWidth) + .height(this.style.statusBarWifiHeight) + .fillColor(this.mTintContentInfo.contentColor) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } } - .width(this.wifiStatus ? Constants.STATIC_BAR_ICON_WIDTH * this.StatusCoefficient : 0) - .height(this.wifiStatus ? Constants.STATIC_BAR_ICON_HEIGHT * this.StatusCoefficient : 0) + .height('100%') } private getImage(wifiInfo: number) { diff --git a/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts b/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts new file mode 100644 index 00000000..5016f646 --- /dev/null +++ b/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../common/src/main/ets/default/Log'; +import {FASlotName} from '../../../../../../../common/src/main/ets/default/Constants'; +import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import createOrGet from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; + +const TAG = 'WifiVM'; + +export class WifiVM { + mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.WIFI); + + constructor() { + Log.showInfo(TAG, `constructor`) + } + + getTintContentInfo(): TintContentInfo { + return this.mTintContentInfo; + } +} + +let sWifiVM = createOrGet(WifiVM, TAG); + +export default sWifiVM as WifiVM; \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ts b/features/wificomponent/src/main/ets/default/wifiModel.ts new file mode 100644 index 00000000..e25a9e6d --- /dev/null +++ b/features/wificomponent/src/main/ets/default/wifiModel.ts @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2021-2022 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 wifi from '@ohos.wifi'; +import Constants, {WifiState, WifiConnectionState} from './common/constants' +import Log from "../../../../../../common/src/main/ets/default/Log"; + +const TAG = 'WifiComponent-WifiModel'; + +var mWifiInfo; +var mWifiStatus; +var mWifiOpenStatus; +var mWifiName; + +export class WifiModel { + mIsStart: boolean = false; + mListener= null; + + initWifiModel() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initWifiModel`) + this.mIsStart = true; + + mWifiInfo = AppStorage.SetAndLink("wifiInfo", Constants.DEFAULT_WIFI_INFO); + mWifiStatus = AppStorage.SetAndLink("wifiStatus", Constants.DEFAULT_WIFI_STATUS); + mWifiName = AppStorage.SetAndLink("wifiName", Constants.DEFAULT_WIFI_NAME) + mWifiOpenStatus = AppStorage.SetAndLink("wifiOpenStatus", Constants.DEFAULT_WIFI_OPEN_STATUS); + + this.getWifiInfo(); + + wifi.on('wifiStateChange', this.onWifiStateChange.bind(this)); + wifi.on('wifiConnectionChange', this.onWifiConnectionChange.bind(this)); + wifi.on('wifiRssiChange', this.onWifiRssiChange.bind(this)); + } + + uninitWifiModel() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `uninitWifiModel`) + this.mIsStart = false; + + this.mListener.off('wifiRssiChange', (data) => { + Log.showInfo(TAG, `uninitWifiModel->wifiRssiChange, data: ${JSON.stringify(data)}`) + }); + this.mListener.off('wifiConnectionChange', (data) => { + Log.showInfo(TAG, `uninitWifiModel->wifiConnectionChange, data: ${JSON.stringify(data)}`) + }); + this.mListener.off('wifiStateChange', (data) => { + Log.showInfo(TAG, `uninitWifiModel->wifiStateChange, data: ${JSON.stringify(data)}`) + }); + this.mListener = null; + mWifiOpenStatus.set(Constants.DEFAULT_WIFI_OPEN_STATUS); + this.setDisconnectedStatus(); + } + + onWifiStateChange(data) { + Log.showInfo(TAG, `onWifiStateChange, data: ${JSON.stringify(data)}`) + + let isWifiInactive = data == WifiState.STATE_OFF; + mWifiOpenStatus.set(!isWifiInactive); + if (!isWifiInactive) { + this.getWifiConnectInfo(); + } else { + this.setDisconnectedStatus(); + } + } + + onWifiConnectionChange(data) { + Log.showInfo(TAG, `onWifiConnectionChange, data: ${JSON.stringify(data)}`) + + if (data == WifiConnectionState.CONNECTED) { + this.getLinkedInfo(); + } else { + this.setDisconnectedStatus(); + } + } + + onWifiRssiChange(data) { + Log.showInfo(TAG, `onWifiRssiChange, data: ${JSON.stringify(data)}`) + this.getLinkedInfo(); + } + + getWifiInfo() { + Log.showInfo(TAG, `getWifiInfo`) + let isWifiActive = wifi.isWifiActive(); + Log.showInfo(TAG, `getWifiInfo, isWifiActive: ${isWifiActive}`) + mWifiOpenStatus.set(isWifiActive); + if (isWifiActive) { + this.getWifiConnectInfo(); + } else { + this.setDisconnectedStatus(); + } + } + + getWifiConnectInfo() { + Log.showInfo(TAG, `getWifiConnectInfo`) + let isConnected = wifi.isConnected(); + Log.showInfo(TAG, `getWifiConnectInfo, isConnected: ${isConnected}`) + if (isConnected) { + mWifiStatus.set(true); + this.getLinkedInfo(); + } else { + this.setDisconnectedStatus(); + } + } + + getLinkedInfo() { + Log.showInfo(TAG, `getLinkedInfo`) + wifi.getLinkedInfo((err, data) => { + if (wifi.isConnected()) { + mWifiStatus.set(true); + mWifiName.set(data.ssid); + let signalLevel = wifi.getSignalLevel(data.rssi, data.band); + Log.showInfo(TAG, `getLinkedInfo, signalLevel: ${signalLevel}`) + mWifiInfo.set(signalLevel); + } else { + this.setDisconnectedStatus(); + } + }); + } + + setDisconnectedStatus() { + Log.showInfo(TAG, `setDisconnectedStatus`) + mWifiStatus.set(Constants.DEFAULT_WIFI_STATUS); + mWifiInfo.set(Constants.DEFAULT_WIFI_INFO); + mWifiName.set(Constants.DEFAULT_WIFI_NAME); + } + + enableWifi() { + Log.showInfo(TAG, 'enableWifi'); + let result = wifi.enableWifi(); + Log.showInfo(TAG, `enableWifi, result: ${result}`); + } + + disableWifi() { + Log.showInfo(TAG, 'disableWifi'); + let result = wifi.disableWifi(); + Log.showInfo(TAG, `disableWifi, result: ${result}`); + } +} + +let mWifiModel = new WifiModel(); + +export default mWifiModel as WifiModel; \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/element/float.json b/features/wificomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..15f65e97 --- /dev/null +++ b/features/wificomponent/src/main/resources/base/element/float.json @@ -0,0 +1,11 @@ +{ + "float": [ + { + "name": "status_bar_wifi_width", + "value": "24vp" + },{ + "name": "status_bar_wifi_height", + "value": "24vp" + } + ] +} \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg new file mode 100644 index 00000000..3842e2ab --- /dev/null +++ b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg new file mode 100644 index 00000000..7829aa32 --- /dev/null +++ b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg new file mode 100644 index 00000000..ef60272d --- /dev/null +++ b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg new file mode 100644 index 00000000..42e8b4b9 --- /dev/null +++ b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg new file mode 100644 index 00000000..3122653c --- /dev/null +++ b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/wifi.svg b/features/wificomponent/src/main/resources/base/media/wifi.svg index e22c8330..1c2d188d 100644 --- a/features/wificomponent/src/main/resources/base/media/wifi.svg +++ b/features/wificomponent/src/main/resources/base/media/wifi.svg @@ -1,17 +1,6 @@ - - - - ic_notification_wlan - Created with Sketch. - - - - - - - - - - - - \ No newline at end of file + + + + + + diff --git a/features/wificomponent/src/main/resources/base/media/wifi_d.svg b/features/wificomponent/src/main/resources/base/media/wifi_d.svg index e851f5b3..c36aee97 100644 --- a/features/wificomponent/src/main/resources/base/media/wifi_d.svg +++ b/features/wificomponent/src/main/resources/base/media/wifi_d.svg @@ -1,17 +1,6 @@ - - - - ic_notification_wlan - Created with Sketch. - - - - - - - - - - - - \ No newline at end of file + + + + + + -- Gitee From ba87677990ba32cbe54e5a50d1c2b1147deca0b3 Mon Sep 17 00:00:00 2001 From: username <1037761763@qq.com> Date: Mon, 11 Apr 2022 12:58:00 +0800 Subject: [PATCH 058/373] =?UTF-8?q?=E6=9B=B4=E6=96=B0systemui=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: username <1037761763@qq.com> --- .../src/main/ets/default/batteryModel.ets | 155 -------- .../src/main/ets/default/common/constants.ets | 48 --- .../main/ets/com/ohos/common/Constants.ets | 22 -- .../ets/com/ohos/model/BluetoothService.ets | 83 ---- .../ets/com/ohos/viewmodel/BluetoothVM.ets | 55 --- .../main/ets/default/brightnessManager.ets | 72 ---- .../src/main/ets/default/common/constants.ets | 24 -- .../main/ets/default/model/CapsuleModel.ets | 67 ---- .../default/viewmodel/CapsuleViewModel.ets | 169 -------- .../src/main/ets/default/timeModel.ets | 161 -------- .../main/ets/com/ohos/common/Constants.ets | 30 -- .../com/ohos/model/ControlCenterService.ets | 133 ------- .../com/ohos/viewmodel/ControlCenterVM.ets | 142 ------- .../main/ets/com/ohos/common/Constants.ets | 22 -- .../ets/com/ohos/model/LocationService.ets | 87 ----- .../ets/com/ohos/viewmodel/LocationVM.ets | 54 --- .../main/ets/com/ohos/common/constants.ets | 28 -- .../com/ohos/model/bundleResourceModel.ets | 107 ------ .../ets/com/ohos/model/noDisturbingModel.ets | 55 --- .../com/ohos/vm/appLstComponentViewModel.ets | 34 -- .../ohos/vm/noDisturbComponentViewModel.ets | 92 ----- .../ohos/navigationservice/ConfigManager.ets | 32 -- .../ohos/navigationservice/KeyCodeEvent.ets | 136 ------- .../navigationservice/common/constants.ets | 28 -- .../com/ohos/noticeItem/common/CommonUtil.ets | 42 -- .../com/ohos/noticeItem/common/constants.ets | 99 ----- .../noticeItem/model/NotificationConfig.ets | 36 -- .../noticeItem/model/NotificationManager.ets | 125 ------ .../noticeItem/model/NotificationService.ets | 142 ------- .../model/NotificationWindowManager.ets | 39 -- .../ohos/noticeItem/model/ParseDataUtil.ets | 169 -------- .../noticeItem/model/rule/RuleController.ets | 157 -------- .../ohos/noticeItem/viewmodel/ViewModel.ets | 360 ------------------ .../src/main/resources/base/media/delete.png | Bin 4061 -> 0 bytes .../main/resources/base/media/ic_setting.png | Bin 2788 -> 0 bytes .../main/ets/com/ohos/common/Constants.ets | 30 -- .../ets/com/ohos/model/RingModeService.ets | 81 ---- .../ets/com/ohos/viewmodel/RingModeVM.ets | 56 --- .../src/main/ets/default/common/constants.ets | 38 -- .../src/main/ets/default/signalModel.ets | 155 -------- .../base/media/ic_statusbar_signal_1.png | Bin 569 -> 0 bytes .../base/media/ic_statusbar_signal_2.png | Bin 586 -> 0 bytes .../base/media/ic_statusbar_signal_3.png | Bin 598 -> 0 bytes .../base/media/ic_statusbar_signal_4.png | Bin 576 -> 0 bytes .../base/media/ic_statusbar_signal_full.png | Bin 556 -> 0 bytes .../base/media/ic_statusbar_signal_no.png | Bin 529 -> 0 bytes .../base/media/ic_statusbar_signal_null.png | Bin 802 -> 0 bytes .../main/ets/com/ohos/common/Constants.ets | 41 -- .../ohos/common/StatusBarConfiguration.ets | 124 ------ .../ets/com/ohos/model/StatusBarService.ets | 241 ------------ .../ets/com/ohos/viewmodel/StatusBarVM.ets | 235 ------------ .../src/main/ets/default/VolumeModel.ets | 95 ----- .../src/main/ets/default/common/constants.ets | 40 -- .../src/main/ets/default/wifiModel.ets | 161 -------- .../base/media/ic_statusbar_wifi_1.png | Bin 1054 -> 0 bytes .../base/media/ic_statusbar_wifi_2.png | Bin 1043 -> 0 bytes .../base/media/ic_statusbar_wifi_3.png | Bin 1016 -> 0 bytes .../base/media/ic_statusbar_wifi_connect.png | Bin 331 -> 0 bytes .../base/media/ic_statusbar_wifi_full.png | Bin 958 -> 0 bytes .../base/media/ic_statusbar_wifi_no.png | Bin 1087 -> 0 bytes 60 files changed, 4302 deletions(-) delete mode 100644 features/batterycomponent/src/main/ets/default/batteryModel.ets delete mode 100644 features/batterycomponent/src/main/ets/default/common/constants.ets delete mode 100644 features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ets delete mode 100644 features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ets delete mode 100644 features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ets delete mode 100644 features/brightnesscomponent/src/main/ets/default/brightnessManager.ets delete mode 100644 features/capsulecomponent/src/main/ets/default/common/constants.ets delete mode 100644 features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ets delete mode 100644 features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ets delete mode 100644 features/clockcomponent/src/main/ets/default/timeModel.ets delete mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ets delete mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ets delete mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ets delete mode 100644 features/locationcomponent/src/main/ets/com/ohos/common/Constants.ets delete mode 100644 features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ets delete mode 100644 features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ets delete mode 100644 features/managementcomponent/src/main/ets/com/ohos/common/constants.ets delete mode 100644 features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ets delete mode 100644 features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ets delete mode 100644 features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ets delete mode 100644 features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ets delete mode 100644 features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets delete mode 100644 features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets delete mode 100644 features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ets delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ets delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ets delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets delete mode 100644 features/noticeitem/src/main/resources/base/media/delete.png delete mode 100644 features/noticeitem/src/main/resources/base/media/ic_setting.png delete mode 100644 features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ets delete mode 100644 features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ets delete mode 100644 features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ets delete mode 100644 features/signalcomponent/src/main/ets/default/common/constants.ets delete mode 100644 features/signalcomponent/src/main/ets/default/signalModel.ets delete mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.png delete mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.png delete mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.png delete mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.png delete mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.png delete mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.png delete mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_null.png delete mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ets delete mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets delete mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ets delete mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ets delete mode 100644 features/volumecomponent/src/main/ets/default/VolumeModel.ets delete mode 100644 features/wificomponent/src/main/ets/default/common/constants.ets delete mode 100644 features/wificomponent/src/main/ets/default/wifiModel.ets delete mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.png delete mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.png delete mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.png delete mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png delete mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.png delete mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.png diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ets b/features/batterycomponent/src/main/ets/default/batteryModel.ets deleted file mode 100644 index 02b0d11b..00000000 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ets +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../common/src/main/ets/default/Log.ets'; -import Constants from './common/constants.ets'; -import BatteryInfo from '@ohos.batteryInfo'; -import BatterySubscriber from '@ohos.commonEvent'; - -const TAG = 'BatteryComponent-batteryModel'; - -let mProgress = Constants.DEFAULT_PROGRESS; -let mBatteryEventSubscriber = null; -let mBatteryEventSubscribeInfo = { - events: ['usual.event.BATTERY_CHANGED'] -} -var mBatterySoc; -var mBatteryCharging; - -export class BatteryModel { - initBatteryModel() { - Log.showInfo(TAG, 'initBatteryModel'); - mBatterySoc = AppStorage.SetAndLink('batterySoc', 0); - mBatteryCharging = AppStorage.SetAndLink('batteryCharging', false); - Log.showInfo(TAG, 'mBatteryEventSubscriber' + mBatteryEventSubscriber); - if (mBatteryEventSubscriber == null || mBatteryEventSubscriber == undefined) { - this.registerBatteryListener(); - } - this.getBatteryStatus(); - } - - uninitBatteryModel() { - Log.showInfo(TAG, 'uninitBatteryModel'); - this.unregisterBatteryListener(); - } - - /** - * Subscribe Battery events - */ - private registerBatteryListener() { - Log.showInfo(TAG, 'registerBatteryListener start'); - BatterySubscriber.createSubscriber( - mBatteryEventSubscribeInfo, - this.createBatterySubscriberCallBack.bind(this) - ); - } - - /** - * Unsubscribe wifi events - * - */ - private unregisterBatteryListener() { - Log.showInfo(TAG, 'unregisterBatteryListener'); - BatterySubscriber.unsubscribe(mBatteryEventSubscriber, () => { - Log.showInfo(TAG, `unregister Battery Status Listener ===============`); - }); - } - - /** - * Callback of the subscriber - * - * @param {Object} err - error returns from the caller - * @param {Object} data - data returns from the caller - */ - - private createBatterySubscriberCallBack(err, data) { - Log.showInfo(TAG, `Subscriberregister createBatterySubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - mBatteryEventSubscriber = data; - BatterySubscriber.subscribe(mBatteryEventSubscriber, this.batterySubscriberCallBack.bind(this)); - } - - /** - * Callback of the events - * - * @param {Object} err - error returns from the caller - * @param {Object} data - data returns from the caller - */ - private batterySubscriberCallBack(err, data) { - Log.showInfo(TAG, `batterySubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - if (err.code == 0) { - if (data.event == 'usual.event.BATTERY_CHANGED') { - this.getBatteryStatus(); - } - } else { - Log.showInfo(TAG, 'Subscriberregister error when subscribing ========'); - } - } - - - /** - * Get battery status and remaining power - */ - private getBatteryStatus() { - Log.showInfo(TAG, 'getBatteryStatus') - let batterySoc = BatteryInfo.batterySOC; - let batteryCharging = BatteryInfo.chargingStatus; - if (null == batterySoc) { - // Set the battery Soc as full when there is no battery hardware - batterySoc = mProgress; - } - if (batterySoc <= 0) { - // If the result is a negative number, set it as positive number. - batterySoc = Math.abs(batterySoc) * Constants.PERCENT_NUMBER; - } - - Log.showInfo(TAG, 'batterySoc = ' + batterySoc) - - // Set the battery status as charging when there is no battery hardware - this.checkBatteryStatus(batteryCharging, (result) => { - let batteryStatus = result; - mBatterySoc.set(batterySoc); - mBatteryCharging.set(batteryStatus); - }); - } - - /** - * Check the battery charging status - * - * @param {number} charging - the battery charging status - * @param {object} callback - Function callback - */ - private checkBatteryStatus(charging, callback) { - Log.showInfo(TAG, `checkBatteryStatus charging: ${charging}`); - let batteryStatus; - switch (charging) { - case Constants.NONE: - batteryStatus = false; - break; - case Constants.DISABLE: - case Constants.ENABLE: - case Constants.FULL: - batteryStatus = true; - break; - default: - batteryStatus = false; - break; - } - callback(batteryStatus); - } -} - -let mBatteryModel = new BatteryModel(); - -export default mBatteryModel as BatteryModel; \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/common/constants.ets b/features/batterycomponent/src/main/ets/default/common/constants.ets deleted file mode 100644 index d40572fc..00000000 --- a/features/batterycomponent/src/main/ets/default/common/constants.ets +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2021 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 default class Constants { - - //layout params - Icon - static WHOLE_CONTAINER_MARGIN = 2 - static WHOLE_CONTAINER_WIDTH = 100 - static WHOLE_CONTAINER_HEIGHT = 24 - static PIC_CONTAINER_WIDTH = '70%' - static PIC_CONTAINER_HEIGHT = '85%' - //layout params - Pic - static FULL_CONTAINER_WIDTH = '100%' - static FULL_CONTAINER_HEIGHT = '100%' - static BATTERY_BORDER_WIDTH = '88%' - static BATTERY_BORDER_HEIGHT = '80%' - static BATTERY_BORDER_RADIUS = 2 - static BATTERY_BORDER_MARGIN = 2 - static BATTERY_CONTENT_PADDING = 2 - static BATTERY_DECORATOR_WIDTH = '10%' - static BATTERY_DECORATOR_HEIGHT = '50%' - static BATTERY_DECORATOR_MARGIN = 2 - //layout params - Soc - static SOC_FONT_SIZE = 16 - - //value - static BATTERY_LEVEL_LOW = 20 - - static NONE = 0; - static ENABLE = 1; - static DISABLE = 2; - static FULL = 3; - static PERCENT_NUMBER = 100; - static DEFAULT_PROGRESS = 100; - -} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ets deleted file mode 100644 index fb97f9a5..00000000 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ets +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 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 default class Constants { - static STATIC_BAR_ICON_WIDTH = 24; - static STATIC_BAR_ICON_MARGIN = 2; - static STATIC_BAR_ICON_HEIGHT = 24; - static STATIC_BAR_ICON_INSIDE_SPACE = 2; - static STATIC_BAR_ICON_OUTSIDE_MARGIN = 5; -} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ets deleted file mode 100644 index d9bf542b..00000000 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ets +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2021 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 bluetooth from '@ohos.bluetooth'; -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; - -const TAG = 'BluetoothModel'; - -function isBluetoothOpen(state) { - Log.showInfo(TAG, `state change: ${state}`) - return state == bluetooth.BluetoothState.STATE_ON || state == bluetooth.BluetoothState.STATE_BLE_ON; -} - -export class BluetoothService { - mIsStart: boolean = false; - mListener: any; - mIsBluetoothOpen: boolean = false; - - startService() { - if (this.mIsStart) { - return; - } - this.mIsStart = true; - this.mIsBluetoothOpen = isBluetoothOpen(bluetooth.getState()); - bluetooth.on('stateChange', (state) => { - this.mIsBluetoothOpen = isBluetoothOpen(state); - Log.showInfo(TAG, `state change: ${this.mIsBluetoothOpen}`) - // todo !bluetooth bug, this.mListener?.updateState(this.mIsBluetoothOpen); - }); - Log.showInfo(TAG, `startService, mIsBluetoothOpen: ${this.mIsBluetoothOpen}`) - } - - stopService() { - if (!this.mIsStart) { - return; - } - Log.showInfo(TAG, `stopService`) - this.mIsStart = false; - bluetooth.off('stateChange'); - } - - registerListener(listener: { - 'updateState': Function - }) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`) - this.mListener = listener; - this.mListener.updateState(this.mIsBluetoothOpen) - } - - getState(): boolean { - return this.mIsBluetoothOpen; - } - - enableBluetooth(): boolean{ - Log.showInfo(TAG, `enableBluetooth`) - let result = bluetooth.enableBluetooth(); - Log.showInfo(TAG, `enableBluetooth, result: ${result}`) - return result; - } - - disableBluetooth(): boolean{ - Log.showInfo(TAG, `disableBluetooth`) - let result = bluetooth.disableBluetooth(); - Log.showInfo(TAG, `disableBluetooth, result: ${result}`) - return result; - } -} - -let bluetoothService = new BluetoothService(); - -export default bluetoothService as BluetoothService; \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ets deleted file mode 100644 index 165efcd2..00000000 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ets +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2021 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 bluetooth from '@ohos.bluetooth'; -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import BluetoothService from '../model/BluetoothService.ets'; - -export const BluetoothOpenStatusKey = "BluetoothOpenStatus"; - -const TAG = 'BluetoothVM'; - -export class BluetoothVM { - mIsStart: boolean = false; - mBluetoothOpenStatus: any; - - initViewModel() { - if (this.mIsStart) { - return; - } - Log.showInfo(TAG, `initViewModel `) - this.mIsStart = true; - this.mBluetoothOpenStatus = AppStorage.SetAndLink(BluetoothOpenStatusKey, false); - BluetoothService.startService(); - BluetoothService.registerListener(this); - } - - updateState(state: boolean) { - Log.showInfo(TAG, `updateState, state: ${state} this.mBluetoothOpenStatus ${this.mBluetoothOpenStatus}`) - this.mBluetoothOpenStatus.set(state); - } - - enableBluetooth(): boolean{ - return BluetoothService.enableBluetooth(); - } - - disableBluetooth(): boolean{ - return BluetoothService.disableBluetooth(); - } -} - -let bluetoothVM = new BluetoothVM(); - -export default bluetoothVM as BluetoothVM; \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets deleted file mode 100644 index cd60e248..00000000 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ets +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../common/src/main/ets/default/Log.ets'; -import commonEvent from '@ohos.commonEvent'; -import settings from '@ohos.settings'; -import featureAbility from '@ohos.ability.featureAbility'; - -const SYSTEMUI_BRIGHTNESS = 'settings.screen.brightness'; -const TAG = 'Control-brightnessManager'; -var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 150); - -export class brightnessManager { - helper: any - uri: string - - init(): void{ - Log.showInfo(TAG, 'init'); - this.uri = settings.getUri(SYSTEMUI_BRIGHTNESS); - Log.showInfo(TAG, 'settings geturi of brightness is ' + this.uri); - this.helper = featureAbility.acquireDataAbilityHelper(this.uri); - this.getValue(); - } - - registerBrightness() { - this.helper.on("dataChange", this.uri, (err) => { - let data = settings.getValue(this.helper, SYSTEMUI_BRIGHTNESS, '150') - Log.showInfo(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); - mBrightnessValue.set(parseInt(data)); - }) - } - - unRegisterBrightness() { - this.helper.off("dataChange", this.uri, (err) => { - Log.showInfo(TAG, `unregister brightness helper`); - }) - } - - getValue() { - Log.showInfo(TAG, 'getValue'); - let data = settings.getValue(this.helper, SYSTEMUI_BRIGHTNESS, '150'); - Log.showInfo(TAG, `settings getValue ${parseInt(data)}`); - mBrightnessValue.set(parseInt(data)); - } - - setValue(callback) { - Log.showInfo(TAG, 'setValue'); - let value = parseInt(callback.value); - Log.showInfo(TAG, `setValue ${value}`); - mBrightnessValue.set(value); - Log.showInfo(TAG, `brightness setValue ${value} end`); - settings.setValue(this.helper, SYSTEMUI_BRIGHTNESS, callback.value.toString()); - Log.showInfo(TAG, `settings setValue ${callback.value} end`); - } -} - - -let mBrightnessManager = new brightnessManager(); - -export default mBrightnessManager as brightnessManager; \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/common/constants.ets b/features/capsulecomponent/src/main/ets/default/common/constants.ets deleted file mode 100644 index 60fe5aa2..00000000 --- a/features/capsulecomponent/src/main/ets/default/common/constants.ets +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2021 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 default class Constants { - static STATIC_BAR_ICON_WIDTH = 24; - static STATIC_BAR_ICON_HEIGHT = 24 ; - static TOUCH_TYPE_DOWN: number = 0; - static TOUCH_TYPE_UP: number = 1; - static TOUCH_TYPE_MOVE: number = 2; - static DEFAULT_MAX_LINES: number= 1; - static CAPSULE_HEIGHT_MULTIPLE = 2; -} diff --git a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ets b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ets deleted file mode 100644 index 7d1f2d07..00000000 --- a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ets +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2021 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 commonEvent from '@ohos.commonEvent'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' - -const TAG = 'CapsuleModel'; - -let commonEventSubscribeInfo = { - events: ['CAPSULE_EVENT_CALL_UI'] -}; -let commonEventSubscriber = null; - -export class CapsuleModel { - mCallback: any; - - registerCallback(callback) { - Log.showInfo(TAG, 'registerCallback'); - this.mCallback = callback; - if (commonEventSubscriber == null) { - commonEvent.createSubscriber( - commonEventSubscribeInfo, - this.createCapsuleSubscriberCallBack.bind(this) - ); - } - } - - createCapsuleSubscriberCallBack(err, data) { - commonEventSubscriber = data; - commonEvent.subscribe(commonEventSubscriber, (err, data) => { - Log.showInfo(TAG, `createCapsuleSubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - if (err.code == 0) { - const processingData = JSON.parse(data.data); - if (processingData) { - Log.showInfo(TAG, `createCapsuleSubscriberCallBack processingData: ${JSON.stringify(processingData)} `); - this.mCallback.onStateChange(processingData); - } - } else { - Log.showError(TAG, 'date is err'); - } - }); - } - - unregisterCallback() { - if (commonEventSubscriber != null) { - commonEvent.unsubscribe(commonEventSubscriber, () => { - Log.showInfo(TAG, 'Subscriberregister unregister Capsule Status Listener ==============='); - }); - } - } -} - -let mCapsuleModel = new CapsuleModel(); - -export default mCapsuleModel as CapsuleModel; \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ets b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ets deleted file mode 100644 index cbfe8d72..00000000 --- a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ets +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (c) 2021 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 CapsuleModel from '../model/CapsuleModel.ets' -import FeatureAbility from '@ohos.ability.featureAbility'; -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -import Rsm from '@ohos.resourceManager'; - -let sCapsuleViewModel; - -const SEC_VAL = 1000; -const MIN_VAL = 60 * SEC_VAL; -const TAG = "CapsuleViewModel"; - -function fixInteger(num) { - return (num >= 10) ? String(num) : '0' + num; -} - -function parseTime(num) { - return fixInteger(Math.floor(num / MIN_VAL)) + ":" + fixInteger(Math.floor((num % MIN_VAL) / SEC_VAL); -} - -export const VIEW_MODEL_ID = "CapsuleViewModelVm"; - -export enum CallState { - CALL_ACTIVE, //通话中* - CALL_HOLDING, //通话保持 - CALL_DIALING, //拨号开始 - CALL_ALERTING, //正在呼出 - CALL_INCOMING, //来电* - CALL_WAITING, //第三方来电* - CALL_DISCONNECTED, //挂断完成 * - CALL_DISCONNECTING, //正在挂断 - CALL_IDLE //空闲 -} - -export default class CapsuleViewModel { - mText: string = "00:00"; - mStartTime: number = 0; - mCallState: CallState = CallState.CALL_DISCONNECTED; - mIsBackground: boolean = false; - mWantBundleName: string = ""; - mWantAbilityName: string = ""; - mTimeMeter: any; - mCallback: any; - - initViewModel() { - this.mCallback = { - "onStateChange": this.onStateChange.bind(this) - } - CapsuleModel.registerCallback(this.mCallback); - } - - onStateChange(data) { - Log.showInfo(TAG, `onStateChange, data: ${JSON.stringify(data)}`); - this.mIsBackground = data.isBackground; - this.mWantBundleName = data.wantBundleName; - this.mWantAbilityName = data.wantAbilityName; - if (data.callState == CallState.CALL_INCOMING || data.callState == CallState.CALL_WAITING) { - this.mStartTime = 0; - let id = JSON.parse(JSON.stringify($r("app.string.incoming_call"))).id; - let resourceMgr = Rsm.getResourceManager('com.ohos.systemui'); - resourceMgr.then((result) => { - result.getString(id).then((resource) => { - this.mText = resource; - Log.showInfo(TAG, 'getStringById resource : ' + resource); - }) - .catch((err) => { - Log.showInfo(TAG, 'getStringById err : ' + JSON.stringify(err)); - }); - }); - } else if (data.callState == CallState.CALL_ACTIVE) { - clearTimeout(this.mTimeMeter); - if (this.mCallState != CallState.CALL_ACTIVE) { - this.mStartTime = new Date().valueOf(); - } - this.mCallState = data.callState; - - let startTime; - let commonTimeDiff = new Date().valueOf() - data.startTime; - let localTimeDiff = new Date().valueOf() - this.mStartTime; - if (commonTimeDiff < 0) { - if (localTimeDiff < 0) { - startTime = new Date().valueOf(); - } else { - startTime = this.mStartTime; - } - } else { - startTime = data.startTime; - } - - this.startUpdateTime(startTime); - } else if (data.callState == CallState.CALL_DISCONNECTED){ - clearTimeout(this.mTimeMeter); - this.mStartTime = 0; - this.mIsBackground = false; - this.mText = ""; - Log.showInfo(TAG, `cannot show`); - } else { - this.mStartTime = 0; - let id = JSON.parse(JSON.stringify($r("app.string.communicate_by_phone"))).id; - let resourceMgr = Rsm.getResourceManager('com.ohos.systemui'); - resourceMgr.then((result) => { - result.getString(id).then((resource) => { - this.mText = resource; - Log.showInfo(TAG, 'getStringById resource : ' + resource); - }) - - - .catch((err) => { - Log.showInfo(TAG, 'getStringById err : ' + JSON.stringify(err)); - }); - }); - } - this.mCallState = data.callState; - } - - startUpdateTime(startTime) { - if (!this.mIsBackground || this.mCallState != CallState.CALL_ACTIVE) { - return; - } - let val = new Date().valueOf() - startTime.valueOf(); - if (val < 0) { - val = 0; - } - this.mText = parseTime(val); - this.mTimeMeter = setTimeout(() => { - this.startUpdateTime(startTime); - }, 1000 - val % 1000); - } - - onClickEvent() { - if (this.mIsBackground) { - this.mIsBackground = false; - } - Log.showInfo(TAG, `onClickEvent `); - let result = FeatureAbility.startAbility({ - want: { - bundleName: this.mWantBundleName, - abilityName: this.mWantAbilityName - } - }) - .then(data => - Log.showInfo(TAG, `onClickEvent promise then: ${JSON.stringify(data)}`)) - .catch(error => - Log.showError(TAG, `onClickEvent promise catch: ${JSON.stringify(error)}`)); - Log.showInfo(TAG, `onClickEvent openAbility result: ${result}`); - } - - static getInstance() { - if (sCapsuleViewModel == null) { - sCapsuleViewModel = new CapsuleViewModel(); - AppStorage.SetAndLink(VIEW_MODEL_ID, sCapsuleViewModel); - } - return sCapsuleViewModel; - } -} \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/timeModel.ets b/features/clockcomponent/src/main/ets/default/timeModel.ets deleted file mode 100644 index 988ed82a..00000000 --- a/features/clockcomponent/src/main/ets/default/timeModel.ets +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../common/src/main/ets/default/Log.ets' -import featureAbility from '@ohos.ability.featureAbility' -import settings from '@ohos.settings'; - -const SHORT_LENGTH = 1; -const LOOP_TIME = 3000; -const TAG = 'ClockComponent-timeModel'; - -var timeInterval = null; - -var mTimeLink; -var mDayLink; -var mWeekDayLink; -var mMonthLink; -var misUsing24hFormat: boolean = true; - -export class TimeModel { - /** - * Init Time Model - * - */ - initTimeModel() { - Log.showInfo(TAG, 'initTimeModel'); - if (timeInterval === null || timeInterval === undefined) { - Log.showInfo(TAG, 'first initTimeModel'); - mTimeLink = AppStorage.SetAndLink('time', ''); - mDayLink = AppStorage.SetAndLink('day', ''); - mWeekDayLink = AppStorage.SetAndLink('weekDay', ''); - mMonthLink = AppStorage.SetAndLink('month', ''); - this.getCurrentDate(); - } - this.listenTimeFormat(); - } - - listenTimeFormat() { - Log.showInfo(TAG, 'listenTimeFormat') - let urivar = null; - let helper = null; - try { - urivar = settings.getUri('settings.time.format') - helper = featureAbility.acquireDataAbilityHelper(urivar); - } catch (e) { - Log.showInfo(TAG, `settings getValue error: ${e.toString()}`); - } - - helper.on("dataChange", urivar, (err) => { - if (err.code !== 0) { - Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); - return; - } else { - let getRetValue = settings.getValue(helper, 'settings.time.format', '24') - Log.showInfo(TAG, 'observer reveive notifychange on success format = ' + getRetValue) - if (getRetValue === '12') { - misUsing24hFormat = false; - } else if (getRetValue === '24') { - misUsing24hFormat = true; - } - this.updateTime(new Date()); - } - Log.showInfo(TAG, 'observer reveive notifychange on success data : ' + JSON.stringify(err)) - }) - } - - unInitTimeModel() { - Log.showInfo(TAG, 'unInitTimeModel'); - } - - /** - * Get current date and time. - * - */ - private getCurrentDate() { - Log.showInfo(TAG, 'getCurrentDate'); - this.getDate(); - timeInterval = setInterval(() => { - this.getDate(); - }, LOOP_TIME); - } - - private getDate() { - Log.showInfo(TAG, 'getDate'); - let date = new Date(); - Log.showInfo(TAG, `getCurrentDate ${date.toTimeString()}`); - this.updateTime(date); - this.updateDay(date); - this.updateWeekDay(date); - this.updateMonth(date); - Log.showInfo(TAG, `updateTime time ${mTimeLink.get()} - updateDay day: ${mDayLink.get()} - updateWeekDay weekDay: ${mWeekDayLink.get()} - updateMonth month: ${mMonthLink.get()}`); - } - - /** - * Update Time. - * - * @param {Object} date - Object of Date. - */ - private updateTime(dateTime) { - let hours = dateTime.getHours(); - Log.showInfo(TAG, 'updateTime' + misUsing24hFormat); - if (!misUsing24hFormat && hours > 12) { - hours = hours % 12; - } - let minutes = dateTime.getMinutes(); - mTimeLink.set(`${this.fill(hours)}:${this.fill(minutes)}`); - Log.showInfo(TAG, 'updateTime set' + `${this.fill(hours)}:${this.fill(minutes)}`); - } - - fill(value) { - return (value > 9 ? "" : "0") + value; - } - - /** - * Update Day. - * - * @param {Object} date - Object of Date. - */ - private updateDay(date) { - let day = date.getDate(); - mDayLink.set(day); - } - - /** - * Update WeekDay. - * - * @param {Object} date - Object of Date. - */ - private updateWeekDay(date) { - let weekDay = date.getDay(); - mWeekDayLink.set(weekDay); - } - - /** - * Update Month. - * - * @param {Object} date - Object of Date. - */ - private updateMonth(date) { - let month = (date.getMonth() + 1); - mMonthLink.set(month); - } -} - -let timeModel = new TimeModel(); - -export default timeModel as TimeModel; \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ets b/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ets deleted file mode 100644 index 96602f76..00000000 --- a/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ets +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2021 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 default class Constants { - static WIFI = 'wifi'; - static BLUETOOTH = 'bluetooth'; - static AIR_PLANE = 'air_plane'; - static LOCATION = 'location'; - static RING_MODE = 'ring_mode'; - static COMPLEX_TOGGLE_HEIGHT = px2vp(100); - static COMPLEX_TOGGLE_UP_DOWN_SPACE = px2vp(20); - static SIMPLE_TOGGLE_HEIGHT = px2vp(110); - static SIMPLE_TOGGLE_UP_DOWN_SPACE = px2vp(20); - static SIMPLE_TOGGLE_UP_TOP_SPACE = px2vp(40); - static SIMPLE_TOGGLE_ICON_WIDTH = px2vp(50); - static SIMPLE_TOGGLE_ICON_HEIGHT = px2vp(50); - static SIMPLE_TOGGLE_INSIDE_SPACE = px2vp(10); -} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ets b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ets deleted file mode 100644 index ae4397a3..00000000 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ets +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2021 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 Resmgr from '@ohos.resourceManager'; -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import SwitchUserManager from '../../../../../../../../common/src/main/ets/default/SwitchUserManager.ets'; -import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import PluginDataSourceAdapter from '../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets'; -import Constants from '../common/Constants.ets'; - -const TAG = 'ControlCenterModel'; - -let CONTROLCENTER_SOURCE_CONFIG = { - "MetaSource": { - "action": "com.ohos.systemui.action.TOGGLE", - "permission": null, - "filterIds": [] - }, - // "pluginSource": { "pluginUrl": "xxx/xxx/xx" } -} - -export class ControlCenterService { - mIsStart: boolean = false; - mAdapter: PluginDataSourceAdapter; - mListener: any; - - startService(filterIds: string[]) { - if (this.mIsStart) { - return; - } - Log.showInfo(TAG, `start ControlCenterService.`) - this.mIsStart = true; - this.mAdapter = new PluginDataSourceAdapter(TAG); - this.mAdapter.registerListener({ - 'initFinish': this.loadData.bind(this), - 'addItem': this.onItemAdd.bind(this), - 'removeItem': this.onItemRemove.bind(this) - }); - SwitchUserManager.getInstance().registerListener(this); - { - CONTROLCENTER_SOURCE_CONFIG.MetaSource.filterIds = filterIds; - } - this.mAdapter.initDataSource(CONTROLCENTER_SOURCE_CONFIG); - } - - stopService() { - if (!this.mIsStart) { - return; - } - Log.showInfo(TAG, `stop ControlCenterService.`) - this.mIsStart = false; - this?.mAdapter.unregisterListener(); - this?.mAdapter.clearAll(); - } - - userChange(userInfo) { - Log.showInfo(TAG, `userChange userInfo ` + userInfo); - this.loadData(userInfo.userId); - } - - loadData(userId) { - Log.showInfo(TAG, `loadData`) - if (userId === null || userId === undefined) { - SwitchUserManager.getInstance().getCurrentUserInfo().then((userInfo) => { - this.mAdapter.loadData(userInfo.userId); - }); - } else { - this.mAdapter.loadData(userId); - } - } - - registerListener(listener: { - 'addItem': Function, - 'removeItem': Function - }) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`) - this.mListener = listener; - } - - onItemAdd(itemData) { - Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`) - if (!CheckEmptyUtils.isEmpty(itemData.label) || !CheckEmptyUtils.isEmpty(itemData.iconUrl)) { - if (!CheckEmptyUtils.isEmpty(itemData.label)) { - itemData.label = decodeURIComponent(itemData.label); - } - this.mListener?.addItem(itemData); - - } else { - Resmgr.getResourceManager(itemData.bundleName) - .then(mgr => { - mgr.getString(itemData.abilityLabelId, (error, value) => { - Log.showInfo(TAG, `onItemAdd mgr.getString, error: ${JSON.stringify(error)} value: ${JSON.stringify(value)}`) - if (error != null) { - return; - } - itemData.label = value; - mgr.getMediaBase64(itemData.abilityIconId, (error, value) => { - Log.showInfo(TAG, `onItemAdd mgr.getMediaBase64, error: ${JSON.stringify(error)} value: ${JSON.stringify(value)}`) - if (error != null) { - return; - } - itemData.iconUrl = value; - this.mListener?.addItem(itemData); - }); - }); - }) - .catch(e => { - Log.showInfo(TAG, `onItemAdd Resmgr.getResourceManager, e: ${JSON.stringify(e)}`) - }); - } - } - - onItemRemove(itemData) { - Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`) - this.mListener?.removeItem(itemData); - } -} - -let controlCenterService = new ControlCenterService(); - -export default controlCenterService as ControlCenterService; \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ets b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ets deleted file mode 100644 index 085a4a92..00000000 --- a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ets +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import Constants from '../common/Constants.ets'; -import ControlCenterService from '../model/ControlCenterService.ets'; - -export const ControlCenterComplexToggleLayoutKey = "ControlCenterComplexToggleLayout"; - -export const ControlCenterSimpleToggleLayoutKey = "ControlCenterSimpleToggleLayout"; - -const TAG = 'ControlCenterVM'; - -export class ControlCenterVM { - mConfig: any; - mIsStart: boolean = false; - mComplexToggleLayoutTemplate: string[]; - mSimpleToggleLayoutTemplate: string[]; - mComplexToggleLayout: any; - mSimpleToggleLayout: any; - mAllSimpleToggles: string[] = []; - - initViewModel(config) { - if (this.mIsStart) { - return; - } - Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)} `) - this.mIsStart = true; - this.mConfig = config; - - this.parseConfig(config); - this.calcControlCenterLayout(); - - ControlCenterService.registerListener({ - 'addItem': this.onItemAdd.bind(this), - 'removeItem': this.onItemRemove.bind(this) - }); - let filterIds: string[] = []; - config.MetaToggles.forEach((metaToggle) => { - filterIds.push(metaToggle.id) - }); - ControlCenterService.startService(filterIds); - } - - parseConfig(config) { - Log.showInfo(TAG, `parseConfig, config: ${JSON.stringify(config)}`) - - this.mComplexToggleLayout = AppStorage.SetAndLink(ControlCenterComplexToggleLayoutKey, []); - this.mSimpleToggleLayout = AppStorage.SetAndLink(ControlCenterSimpleToggleLayoutKey, []); - Log.showInfo(TAG, - `parseConfig, ComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`) - Log.showInfo(TAG, - `parseConfig, SimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`) - - this.mComplexToggleLayoutTemplate = []; - config.ComplexToggleLayout.forEach((name) => { - this.mComplexToggleLayoutTemplate.push(name); - }); - this.mSimpleToggleLayoutTemplate = []; - config.TempDBSimpleToggleLayout.forEach((name) => { - this.mSimpleToggleLayoutTemplate.push(name); - }); - Log.showInfo(TAG, - `parseConfig, ComplexToggleLayoutTemplate: ${JSON.stringify(this.mComplexToggleLayoutTemplate)}`) - Log.showInfo(TAG, - `parseConfig, SimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`) - - config.LocalToggles.forEach((name) => { - this.mAllSimpleToggles.push(name); - }); - Log.showInfo(TAG, `parseConfig, allSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`) - } - - onItemAdd(itemData) { - Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`) - AppStorage.SetOrCreate(itemData.id, itemData); - if (this.mAllSimpleToggles.indexOf(itemData.id) < 0) { - this.mAllSimpleToggles.push(itemData.id); - this.calcControlCenterLayout(); - } - Log.showInfo(TAG, `onItemAdd, ComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`) - Log.showInfo(TAG, `onItemAdd, SimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`) - } - - onItemRemove(itemData) { - Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`) - if (this.mAllSimpleToggles.indexOf(itemData.id) >= 0) { - this.mAllSimpleToggles.splice(this.mAllSimpleToggles.indexOf(itemData.id), 1); - this.calcControlCenterLayout(); - let deleteRs: boolean = AppStorage.Delete(itemData.id) - Log.showInfo(TAG, `onItemRemove AppStorage.Delete(Simple), id: ${itemData.id} ${deleteRs} `) - } - Log.showInfo(TAG, `onItemRemove, ComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`) - Log.showInfo(TAG, `onItemRemove, SimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`) - } - - calcControlCenterLayout() { - Log.showInfo(TAG, `calcControlCenterLayout`) - - let complexToggleLayout: string[] = []; - this.mComplexToggleLayoutTemplate.forEach((name) => { - if (this.mAllSimpleToggles.indexOf(name) >= 0) { - complexToggleLayout.push(name); - } - }); - let simpleToggleLayout: string[] = []; - this.mSimpleToggleLayoutTemplate.forEach((name) => { - if (this.mAllSimpleToggles.indexOf(name) >= 0) { - simpleToggleLayout.push(name); - } - }); - - Log.showInfo(TAG, `calcControlCenterLayout, complexToggleLayout: ${JSON.stringify(complexToggleLayout)}`) - Log.showInfo(TAG, `calcControlCenterLayout, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`) - - - if (JSON.stringify(complexToggleLayout) != JSON.stringify(this.mComplexToggleLayout.get())) { - this.mComplexToggleLayout.set(complexToggleLayout); - } - if (JSON.stringify(simpleToggleLayout) != JSON.stringify(this.mSimpleToggleLayout.get())) { - this.mSimpleToggleLayout.set(simpleToggleLayout); - } - Log.showInfo(TAG, `calcControlCenterLayout, mComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`) - Log.showInfo(TAG, `calcControlCenterLayout, mSimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`) - } -} - -let controlCenterVM = new ControlCenterVM(); - -export default controlCenterVM as ControlCenterVM; \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ets b/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ets deleted file mode 100644 index fb97f9a5..00000000 --- a/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ets +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 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 default class Constants { - static STATIC_BAR_ICON_WIDTH = 24; - static STATIC_BAR_ICON_MARGIN = 2; - static STATIC_BAR_ICON_HEIGHT = 24; - static STATIC_BAR_ICON_INSIDE_SPACE = 2; - static STATIC_BAR_ICON_OUTSIDE_MARGIN = 5; -} \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ets b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ets deleted file mode 100644 index b43c0ba2..00000000 --- a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ets +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2021 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 geolocation from '@ohos.geolocation'; -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; - -const TAG = 'LocationModel'; - -export class LocationService { - mIsStart: boolean = false; - mListener: any; - mLocationEventListener = geolocation?. LocationEventListener ? new (geolocation?.LocationEventListener)() : - { - on: (...args) => { - }, - off: (...args) => { - } - }; - - startService() { - if (this.mIsStart) { - return; - } - Log.showInfo(TAG, `startService`) - Log.showInfo(TAG, `LocationEventListener = ` + geolocation.LocationEventListener) - this.mIsStart = true; - this.getServiceState(); - this.mLocationEventListener.on('locationServiceState', (state) => { - Log.showInfo(TAG, `startService locationChange, state: ${JSON.stringify(state)}`) - this.mListener?.updateServiceState(state); - }); - } - - stopService() { - if (!this.mIsStart) { - return; - } - Log.showInfo(TAG, `stopService`) - this.mIsStart = false; - this.mLocationEventListener.off('locationServiceState', (state) => { - Log.showInfo(TAG, `stopService locationChange, state: ${JSON.stringify(state)}`) - }); - } - - registerListener(listener: { - 'updateServiceState': Function, - }) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`) - this.mListener = listener; - } - - getServiceState() { - Log.showInfo(TAG, `getServiceState`) - geolocation.isLocationEnabled().then((data) => { - Log.showInfo(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`) - this.mListener?.updateServiceState(data); - }); - } - - enableLocation() { - Log.showInfo(TAG, `enableLocation`) - geolocation.enableLocation() - .then((res) => Log.showInfo(TAG, `enableLocation, result: ${JSON.stringify(res)}`)); - } - - disableLocation() { - Log.showInfo(TAG, `disableLocation`) - geolocation.disableLocation() - .then((res) => Log.showInfo(TAG, `disableLocation, result: ${JSON.stringify(res)}`)); - } -} - -let locationService = new LocationService(); - -export default locationService as LocationService; \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ets b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ets deleted file mode 100644 index c2f001dd..00000000 --- a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ets +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import LocationService from '../model/LocationService.ets'; - -export const LocationServiceOpenStatusKey = "LocationServiceOpenStatus"; - -const TAG = 'LocationVM'; - -export class LocationVM { - mIsStart: boolean = false; - - initViewModel() { - if (this.mIsStart) { - return; - } - Log.showInfo(TAG, `initViewModel `) - this.mIsStart = true; - LocationService.registerListener(this); - LocationService.startService(); - } - - updateServiceState(state) { - Log.showInfo(TAG, `updateServiceState, state: ${state} `) - AppStorage.SetOrCreate(LocationServiceOpenStatusKey, state); - } - - enableLocation() { - Log.showInfo(TAG, `enableLocation`) - LocationService.enableLocation(); - } - - disableLocation() { - Log.showInfo(TAG, `disableLocation`) - LocationService.disableLocation(); - } -} - -let locationVM = new LocationVM(); - -export default locationVM as LocationVM; \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/common/constants.ets b/features/managementcomponent/src/main/ets/com/ohos/common/constants.ets deleted file mode 100644 index 64f152fb..00000000 --- a/features/managementcomponent/src/main/ets/com/ohos/common/constants.ets +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2021 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 default class Constants { - - static WH_45_100 = '45%'; - static WH_50_100 = '50%'; - static WH_70_100 = '70%'; - static WH_90_100 = '90%'; - static WH_100_100 = '100%'; - static MAX_LINES_1 = 1; - static MAX_LINES_2 = 2; - static MAX_LINES_3 = 3; - static NEXT_DAY_NAME = '次日' - static EVERY_DAY_NAME = '每天:' -} \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ets b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ets deleted file mode 100644 index da422125..00000000 --- a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ets +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import Bundle from '@ohos.bundle'; -import ResMgr from '@ohos.resourceManager'; - -const INDEX = 0; -const IS_INCLUDE_ABILITY_INFO = 0; - -const TAG = 'NotificationManagenment-BundleResourceModel'; - -export default class BundleResourceModel { - private mBundleInfoList: any[]= []; - - getAllBundleInfos() { - Log.showInfo(TAG, 'getAllBundleInfos entry'); - Bundle.getAllBundleInfo(IS_INCLUDE_ABILITY_INFO) - .then((data) => { - this.getIconItem(INDEX, data.length, data); - }); - Log.showInfo(TAG, 'getAllBundleInfos end'); - } - - getIconItem(index, count, data) { - Log.showInfo(TAG, 'getIconItem data.length' + data.length); - let imageValue = ''; - let label = ''; - let that = this; - Log.showInfo(TAG, 'getIconItem data[index].name :' + data[index].name); - try { - ResMgr.getResourceManager(data[index].name, (error, item) => { - let appInfo = data[index].appInfo; - if (appInfo.labelId > 0) { - item.getString(appInfo.labelId, (error, value) => { - Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager value.length:' + value.length); - if (value != null) { - Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() value:' + value); - label = value; - Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() label:' + label); - } else { - Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() error:' + error); - } - }); - } else { - Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager label:' + appInfo.label); - label = appInfo.label; - } - Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager finish label:' + label); - if (appInfo.iconId <= 0) { - this.nextIconItem(index, count, data, this.mBundleInfoList, that) - return - } - item.getMediaBase64(appInfo.iconId, (error, value) => { - if (error === undefined) { - Log.showInfo(TAG, 'getIconItem ResMgr.getMediaBase64() value:' + value.length); - if (value.length > 0) { - imageValue = value; - Log.showInfo(TAG, 'getIconItem ResMgr.getMediaBase64() imageValue:' + imageValue); - } - this.mBundleInfoList.push({ - appIcon: imageValue, - appTitle: label, - appValue: '', - appArrow: $r('app.media.ic_settings_arrow'), - appSummary: data[index].versionName, - appBundleName: data[index].name, - appIconId: appInfo.iconId, - appUri: 'pages/setEnable', - appUid: data[index].uid, - }); - } - Log.showInfo(TAG, 'getIconItem ResMgr.getMediaBase64() end'); - this.nextIconItem(index, count, data, this.mBundleInfoList, that) - }); - - }); - } catch (error) { - Log.showInfo(TAG, 'getIconItem catch error:' + error); - } - Log.showInfo(TAG, 'getIconItem end'); - } - - nextIconItem(index, count, data, bundleInfoList, that) { - if (count - 1 > index) { - Log.showInfo(TAG, 'nextIconItem if index:' + index + ' | count:' + count); - index = index + 1; - that.getIconItem(index, count, data); - } else { - Log.showInfo(TAG, 'nextIconItem else index:' + index + ' | count:' + count); - AppStorage.SetOrCreate('appManagementList', bundleInfoList); - } - - } -} - diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ets b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ets deleted file mode 100644 index 062c6b7c..00000000 --- a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ets +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import Notification from '@ohos.notification'; -import DateAndTime from '../../../../../../../../common/src/main/ets/default/DateAndTimeUtil.ets'; - -const TAG = 'NotificationManagenment-NoDisturbingModel'; - -export default class NoDisturbingModel { - static getNoDisturbingDate(callback) { - //TODO:Interface in preparation - // Notification.getDoNotDisturbDate((error, data) => { - // if (error != undefined && error != null) { - // Log.showInfo(TAG, 'getNoDisturbingDate error:' + JSON.stringify(error)); - // } else { - // Log.showInfo(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); - // let noDisturbingData = {} - // noDisturbingData['type'] = data.type - // noDisturbingData['begin'] = DateAndTime.concatTime(data.begin.getHours(), data.begin.getMinutes()); - // noDisturbingData['end'] = DateAndTime.concatTime(data.end.getHours(), data.end.getMinutes()); - // callback(noDisturbingData) - // } - // }) - //TODO: Temporary code. - let noDisturbingData = {} - noDisturbingData['type'] = 0 - noDisturbingData['begin'] = DateAndTime.concatTime(22, 0); - noDisturbingData['end'] = DateAndTime.concatTime(7, 0) - callback(noDisturbingData) - } - - static setNoDisturbingDate(noDisturbingTime, callback) { - //TODO:Interface in preparation - //let targetDate : DoNotDisturbDate - //targetDate.type = noDisturbingTime.type - //targetDate.begin = noDisturbingTime.begin - //targetDate.end = noDisturbingTime.end - //Notification.setDoNotDisturbDate(targetDate, callback) - //TODO: Temporary code. - callback(null,null) - } -} - diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ets b/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ets deleted file mode 100644 index fefe48ba..00000000 --- a/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ets +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import BundleResourceModel from '../model/bundleResourceModel.ets'; - - -const TAG = 'ManagementComponent-AppLstComponentViewModel' - -export class AppLstComponentViewModel { - bundleInfoList: any[]= []; - - ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); - let dataModel:BundleResourceModel = new BundleResourceModel() - dataModel.getAllBundleInfos() - } -} - -let appLstComponentViewModel = new AppLstComponentViewModel(); - -export default appLstComponentViewModel as AppLstComponentViewModel; \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ets b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ets deleted file mode 100644 index e6bec1f4..00000000 --- a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ets +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import NoDisturbingModel from '../model/noDisturbingModel.ets'; -import ConfigData from '../common/constants.ets' - -const TAG = 'ManagementComponent-NoDisturbComponentViewModel' - -export default class NoDisturbComponentViewModel { - defaultStartTime: Date= new Date() - defaultEndTime: Date= new Date() - startTime: string = '' - endTime: string = '' - repeatMode: number = 0 - prompt: string - isEffective: boolean - - ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); - this.getNoDisturbingDate.bind(this)() - this.setClues.bind(this)() - } - - getNoDisturbingDate() { - Log.showInfo(TAG, 'getNoDisturbingDate'); - NoDisturbingModel.getNoDisturbingDate((data) => { - Log.showInfo(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); - this.repeatMode = data.type - this.startTime = data.begin - this.endTime = data.end - }) - } - - setNoDisturbingDate() { - - if (!this.isEffective) { - this.repeatMode = 0 - } - - let noDisturbingTime = { - type: this.repeatMode, begin: this.defaultStartTime, end: this.defaultEndTime - } - NoDisturbingModel.setNoDisturbingDate(noDisturbingTime, () => { - Log.showInfo(TAG, 'setNoDisturbingDate is success') - }) - } - - setClues() { - Log.showInfo(TAG, `setClues`) - let repeadName - if (this.repeatMode == 2) { - this.isEffective = true - repeadName = ConfigData.EVERY_DAY_NAME - } else { - this.isEffective = false - repeadName = '' - } - - if (this.startTime > this.endTime) { - this.prompt = repeadName + this.startTime + ' - ' + ConfigData.NEXT_DAY_NAME + this.endTime - } else { - this.prompt = repeadName + this.startTime + ' - ' + this.endTime - } - this.defaultStartTime = this.getDateByHHMI(this.startTime) - this.defaultEndTime = this.getDateByHHMI(this.endTime) - } - - getDateByHHMI(selectDate: string): Date{ - Log.showInfo(TAG, `getDateByHHMI selectDate:` + selectDate) - let tempDate: Date = new Date() - let HHmiArr = selectDate.split(':') - let hour = parseInt(HHmiArr[0]) - let minute = parseInt(HHmiArr[1]) - tempDate = new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDay(), - hour, minute, tempDate.getSeconds()) - return tempDate; - } -} - diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets b/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets deleted file mode 100644 index 271a77df..00000000 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ets +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2021 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 STORAGE_NAVIGATION_TYPE = 'navigationType'; - -export class ConfigManager{ - - constructor() { - } - - initConfig() { - var mLayoutConfig = AppStorage.SetAndLink("navigationType", 0); -// mAppStorage.setOrCreate(STORAGE_NAVIGATION_TYPE,TYPE_THREE); - mLayoutConfig.set(3); - } - -} - -let configManager = new ConfigManager(); -export default configManager as ConfigManager; diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets deleted file mode 100644 index fc8252a1..00000000 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ets +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import commonevent from '@ohos.commonevent'; -import Constants from './common/constants.ets'; -import FeatureAbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; -import Input from '@ohos.multimodalInput.inputEventClient'; -import featureAbility from '@ohos.ability.featureAbility'; -const TAG = 'KeyCodeEvent' - -let res; -let mFeatureAbilityManager = new FeatureAbilityManager(); - -export class KeyCodeEvent { - public sendKeyEvent(keyCode: number, eventType: number) { - Log.showInfo(TAG, `sendKeyEvent keycode: ${keyCode} type: ${eventType}`); - switch (keyCode) { - case Constants.KEYCODE_BACK: - Log.showInfo(TAG, `sendKeyEvent case back type: ${eventType}`); - if (eventType === Constants.KEY_DOWN) { - Log.showInfo(TAG, 'sendKeyEvent, if'); - this.sendBackKeyEventStart(); //down - } else if (eventType === Constants.KEY_UP) { - Log.showInfo(TAG, `sendKeyEvent, else type: ${eventType}`); - this.sentEvnt(); - this.sendBackKeyEventEnd(); //up - } - break; - case Constants.KEYCODE_HOME: - Log.showInfo(TAG, `sendKeyEvent case home type: ${eventType}`); - if (eventType === Constants.KEY_UP) { - Log.showInfo(TAG, 'sendKeyEvent, if'); - this.sentEvnt(); - this.sendHomeKeyEvent(); - } - break; - case Constants.KEYCODE_RECENT: - Log.showInfo(TAG, `sendKeyEvent case recent type: ${eventType}`); - if (eventType === Constants.KEY_UP) { - Log.showInfo(TAG, 'sendKeyEvent, if'); - this.sentEvnt(); - this.sendRecentKeyEvent(); - } - break; - default: - Log.showInfo(TAG, `sendKeyEvent case default keycode: ${keyCode} type: ${eventType}`); - break; - } - } - - private sendBackKeyEventStart() { - Log.showInfo(TAG, 'sendBackKeyEventStart'); - - let keyEvent = { - isPressed: true, - // back keycode - keyCode: 2, - // After consulting the multi-mode subsystem, this parameter proved meaningless and remained unchanged - keyDownDuration: 1, - // This parameter changes with the version, and is currently 10008 - isIntercepted: false - } - res = Input.injectEvent({ - KeyEvent: keyEvent - }); - Log.showInfo(TAG, `injectEventHandler injectEventSync down res: ${res}`); - } - - private sendBackKeyEventEnd() { - Log.showInfo(TAG, 'sendBackKeyEventEnd'); - let keyEvent = { - isPressed: false, - // back keycode - keyCode: 2, - // After consulting the multi-mode subsystem, this parameter proved meaningless and remained unchanged - keyDownDuration: 1, - // This parameter changes with the version, and is currently 10008 - isIntercepted: false - } - res = Input.injectEvent({ - KeyEvent: keyEvent - }); - } - - private sendHomeKeyEvent() { - Log.showInfo(TAG, 'sendHomeKeyEvent'); - Log.showInfo(TAG, 'home click and start ability launcher'); - mFeatureAbilityManager.openAbility(TAG, { - want: { - bundleName: Constants.LAUNCHER_BUNDLE_NAME, - abilityName: Constants.LAUNCHER_ABILITY_NAME - } - }); - } - - private sendRecentKeyEvent() { - Log.showInfo(TAG, 'sendRecentKeyEvent'); - mFeatureAbilityManager.openAbility(TAG, { - want: { - bundleName: Constants.RECENT_BUNDLE_NAME, - abilityName: Constants.RECENT_ABILITY_NAME - } - }); - } - - private sentEvnt() { - let commonEventPublishData = { - code: 1, - data: JSON.stringify({ - callType: 1 - }) - } - - commonevent.publish('SET_STATUSBAR_MIN_EVENT', commonEventPublishData, (err, data) => { - console.log(`sendEvent err ${JSON.stringify(err)}`); - console.log(`sendEvent data ${JSON.stringify(data)}`); - }); - } -} - -let keyCodeEvent = new KeyCodeEvent(); - -export default keyCodeEvent as KeyCodeEvent; diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ets b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ets deleted file mode 100644 index c154329d..00000000 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ets +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2021 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 default class Constants { - static TYPE_THREE: number = 3; - static TYPE_ONE: number = 1; - static KEY_DOWN: number = 0; - static KEY_UP: number = 1; - static LAUNCHER_BUNDLE_NAME:string = 'com.ohos.launcher'; - static LAUNCHER_ABILITY_NAME:string = 'com.ohos.launcher.MainAbility'; - static RECENT_BUNDLE_NAME:string = 'com.ohos.launcher'; - static RECENT_ABILITY_NAME:string = 'com.ohos.launcher.recents.MainAbility'; - static KEYCODE_BACK: number = 1; - static KEYCODE_HOME: number = 2; - static KEYCODE_RECENT: number = 3; -} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ets deleted file mode 100644 index 24599ccb..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ets +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import WantAgent from '@ohos.wantAgent'; - -const TAG = 'CommonUtil'; -const DEFAULT_INFO = { - code: 0, - want: '', - permission: '', - extraInfo: {} -}; - -export default class CommonUtil { - static startWant(want, triggerInfo?: any) { - let info = (triggerInfo) ? triggerInfo : DEFAULT_INFO; - Log.showInfo(TAG, `startWant ${JSON.stringify(want)}, info ${JSON.stringify(info)}`); - WantAgent.trigger(want, triggerInfo, ((err, data) => { - Log.showInfo(TAG, `wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); - })); - } - - static checkVisibilityByUser(notificationUser: number, currentUser: number): boolean{ - return (0 <= notificationUser && notificationUser < 100) || notificationUser == currentUser - } -} - - - diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets deleted file mode 100644 index 5283abb0..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2021 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 default class Constants { - static NOTIFICATION_TYPE_BASIC: string = '0'; - static NOTIFICATION_TYPE_LONG: string = '1'; - static NOTIFICATION_TYPE_PICTURE: string = '2'; - static NOTIFICATION_TYPE_MULTILINE: string = '4'; - static NOTIFICATION_TYPE_SOCIAL: string = '3'; - static NOTIFICATION_TYPE_MEDIA: string = '5'; - static TEXT_MAX_LENGTH: number = 21; - static TEXT_EXPANDED_MAX_LENGTH: number = 13; - static TOUCH_TYPE_DOWN: number = 0; - static TOUCH_TYPE_UP: number = 1; - static TOUCH_TYPE_MOVE: number = 2; - static HIDDEN_TRANSLATE_X: number = 150; - static DISPLAY_TRANSLATE_X: number = -150; - static REMOVE_TRANSLATE_X: number = 150; - static DEFAULT_MAX_LINES: number= 1; - static EXPENDED_MAX_LINES: number= 8; - static CONTENT_LINE_HEIGHT: number = 20; - static SETTING_CONT_HEIGHT = '50'; - static SETTING_DIALOG_WITH = '80%'; - static SETTING_CONTENT_WITH = '100%' - static SETTING_DIALOG_HEIGHT = '380'; - static CONFIRM_DIALOG_HEIGHT = '250' - static CONFIRM_DIALOG_WITH = '80%' - static CONFIRM_BUTTON_WITH = '50%' - static QUICKLY_SETTING_H = 83; - static ERROR_CALLBACK: number = 0; - static SUCCESS_CALLBACK: number = 1; - static KEY_INPUT: string = 'inputAction'; -} - -export class InputActionButtonData { - isSending: boolean = false; - content: string = ''; -} - -interface RuleData { - isAllowBanner?: boolean; - isAllowSound?: boolean; - isAllowVibrationValues?: boolean; - isAllowStatusBarShow?: boolean; - isAllowNotificationListShow?: boolean; -} - -export interface NotificationItemData { - id: string; - hashcode: string; - userId: number; - contentType: string; - timestamp: number; - time: string; - appName: string; - want: any; - actionButtons: any[]; - bundleName: string; - smallIcon?: PixelMap | string; - largeIcon?: PixelMap | string; - picture?: PixelMap; - title?: string; - text?: string; - additionalText?: string; - briefText?: string; - expandedTitle?: string; - longText?: string; - lines?: any[]; - longTitle?: string; - slotLevel?: any; - source?: number; - versionName?: string; - sound?: string; - vibrationValues?: Array; - ruleData?: RuleData; - template?: any; - isOngoing?: boolean; - isUnremovable?: boolean; - isRemoveAllowed?: boolean; -} - -export interface NotificationServiceListener { - onNotificationConsume?: (data: NotificationItemData) => void; - onNotificationLoad?: (data: NotificationItemData) => void; - onNotificationCancel?: (data: NotificationItemData) => void; -} - diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets deleted file mode 100644 index 10ab1659..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2021 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 ReadConfigUtil from '../../../../../../../../../common/src/main/ets/default/ReadConfigUtil.ets'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; - -const FILE_URI = '/data/accounts/account_0/applications/com.ohos.systemui' -+ '/com.ohos.systemui.statusbar/assets/{0}/resources/rawfile/notificationConfig.json' - -const TAG = 'NotificationConfig' - -export class NotificationConfig { - static USE_NOTIFICATION_ICON = true; - - readNotificationConfig(deviceType: string): any{ - Log.showInfo(TAG, `readSlidingLength deviceType:${deviceType}`); - let notificationConfig = ReadConfigUtil.ReadConfigFile(FILE_URI.replace('{0}', deviceType)) - return notificationConfig - } -} - -let notificationConfig = new NotificationConfig(); - -export default notificationConfig as NotificationConfig; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets deleted file mode 100644 index f8fbecab..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2021 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 { NotificationSubscriber } from './notification/notificationSubscriber'; -import Notification from '@ohos.notification'; -import PluginComponentManager from '@ohos.plugincomponent' -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; - -const TAG = 'NotificationManager'; -// Temporary path -const EXTERNAL_JSON_PATH = '/system/etc/NotificationTemplate/external.json' - -export default class NotificationManager { - static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; - static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; - static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; - static TYPE_PICTURE: number = Notification.ContentType.NOTIFICATION_CONTENT_PICTURE; - static NotificationTemplateMap = null; - - static subscribeNotification(tag, subscriber, asyncCallback) { - Log.showInfo(TAG, `subscribeNotification from: ${tag}`); - Notification.subscribe(subscriber, asyncCallback); - } - - static unsubscribeNotification(tag, subscriber) { - Log.showInfo(TAG, `subscribeNotification from: ${tag}`); - Notification.unsubscribe(subscriber); - } - - static removeAll(tag, callback) { - Log.showInfo(TAG, `removeAll from: ${tag}`); - Notification.removeAll(callback); - } - - static remove(tag, hashCode, callback) { - Log.showInfo(TAG, `remove from: ${tag}`); - Notification.remove(hashCode, callback) - } - - static getAllActiveNotifications(tag, callback) { - Log.showInfo(TAG, `getAllActiveNotifications from: ${tag}`); - Notification.getAllActiveNotifications(callback); - } - - static initNotificationTemplateMap(tag) { - Log.showInfo(TAG, `initNotificationTemplateMap from: ${tag}`); - if (NotificationManager.NotificationTemplateMap === null) { - NotificationManager.NotificationTemplateMap = new Map() - NotificationManager.requestTemplate(tag, '', EXTERNAL_JSON_PATH); - } - } - - static request(tag, param, asyncCallback) { - Log.showInfo(TAG, `request from: ${tag}`); - PluginComponentManager.request(param, (err, data) => { - asyncCallback(err, data); - }); - } - - static push(tag, param, asyncCallback) { - Log.showInfo(TAG, `push from: ${tag}`); - PluginComponentManager.push(param, () => { - asyncCallback(); - }); - } - - static requestListener(tag, asyncCallback) { - Log.showInfo(TAG, `requestListener from: ${tag}`); - PluginComponentManager.on('request', (source, name, data) => { - asyncCallback(source, name, data); - }) - } - - static pushListener(tag, asyncCallback) { - Log.showInfo(TAG, `pushListener from: ${tag}`); - PluginComponentManager.on('push', (source, template, data, extraData) => { - asyncCallback(source, template, data, extraData); - }); - } - - static requestTemplate(tag, templateName, templatePath) { - Log.showInfo(TAG, `requestTemplate from: ${tag}`); - - let reqWant = { - bundleName: '', - abilityName: '' - }; - let reqData = {} - - let requestParam = { - want: reqWant, - name: templateName, - data: reqData, - jsonPath: templatePath - }; - - NotificationManager.request(tag, requestParam, (err, data) => { - Log.showInfo(TAG, `request finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) - Log.showInfo(TAG, `request finished templateData: ${templateName} data: ${JSON.stringify(data.componentTemplate)}`) - if (data !== null && data !== undefined) { - Log.showInfo(TAG, `request finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`) - let templates = JSON.parse(data.componentTemplate.source); - Log.showInfo(TAG, `request templates: ${JSON.stringify(templates)}`) - for (let key in templates) { - NotificationManager.NotificationTemplateMap.set(key, { - "source": templates[key], "ability": "" - }); - } - } - Log.showInfo(TAG, `request finished notificationTemplateMap: ${JSON.stringify(NotificationManager.NotificationTemplateMap)}`) - }); - } -} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets deleted file mode 100644 index 1e7b3f74..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2021 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 notification from '@ohos.notification'; -import NotificationSubscriber from '@ohos.notificationSubscriber'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import NotificationManager from './NotificationManager.ets'; -import ParseDataUtil from './ParseDataUtil.ets'; -import RuleController from './rule/RuleController.ets'; -import CommonUtil from '../common/CommonUtil.ets'; - -const TAG = 'NotificationService'; - -interface NotificationListener { - userId: number; - onNotificationConsume: Function; - onNotificationCancel: Function; -} - -/** - * notification service api - */ -export class NotificationService { - mListeners = new Set(); - mSubscriber; - mSortingMap = {}; - - constructor() { - this.subscribeNotification(this.getSubscriber()); - this.loadNotificationTemplate() - } - - public register(listener: NotificationListener) { - let res = this.mListeners.add(listener); - Log.showInfo(TAG, `register, listener size: ${res.size}`); - } - - public unRegister(listener: NotificationListener) { - let res = this.mListeners.delete(listener); - Log.showInfo(TAG, `unRegister, res: ${res}`); - } - - public removeAll() { - Log.showInfo(TAG, 'removeAll start'); - NotificationManager.removeAll(TAG, (data) => { - Log.showInfo(TAG, `removeAll => data: ${JSON.stringify(data)}`); - }); - } - - public remove(code: string) { - NotificationManager.remove(TAG, code, (data) => { - Log.showInfo(TAG, `removeNotificationItem ==> data: ${JSON.stringify(data)}`); - }) - } - - public loadAllNotifications() { - NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { - Log.showInfo(TAG, `getAllActiveNotifications error:${err}}, requestsArr: ${JSON.stringify(requestsArr)}`); - if (Array.isArray(requestsArr)) { - for (let i = 0, len = requestsArr.length; i < len; i++) { - this.handleNotificationAdd(requestsArr[i]); - } - } - }) - } - - getSubscriber() { - if (!this.mSubscriber) { - this.mSubscriber = { - onConsume: this.handleNotificationAddAndSortMap.bind(this), - onCancel: this.handleNotificationCancel.bind(this), - } - } - return this.mSubscriber; - } - - handleNotificationAddAndSortMap(data) { - Log.showInfo(TAG, 'handleNotificationAddAndSortMap, sortingMap' + JSON.stringify(data.sortingMap || {})); - this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; - this.handleNotificationAdd(data?.request); - } - - handleNotificationAdd(request) { - ParseDataUtil.parseData(request, this.mSortingMap).then((intermediateData) => { - Log.showInfo(TAG, `parseData after = ${JSON.stringify(intermediateData)}`); - RuleController.getNotificationData(intermediateData, (finalItemData) => { - Log.showInfo(TAG, `RuleController.getNotificationData after = ${JSON.stringify(finalItemData)}`); - this.mListeners.forEach((listener) => { - Log.showInfo(TAG, `notifcationUserId: ${finalItemData.userId}, listener.userId: ${listener.userId}`); - if (CommonUtil.checkVisibilityByUser(finalItemData.userId, listener.userId)) { - listener.onNotificationConsume(finalItemData); - } - }) - }); - }).catch(errorInfo => Log.showError(TAG, errorInfo)); - } - - handleNotificationCancel(data) { - console.info("===>handleNotificationCancel data : ==> " + `data:${JSON.stringify(data)}`); - ParseDataUtil.parseData(data, this.mSortingMap) - .then((record) => this.mListeners.forEach((listener) => listener.onNotificationCancel(record))) - .catch(errorInfo => Log.showError(TAG, errorInfo)); - } - - subscribeNotification(subscriber) { - let callback = (err, data) => { - Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) - }; - NotificationManager.subscribeNotification(TAG, subscriber, callback); - } - - loadNotificationTemplate() { - Log.showInfo(TAG, 'loadNotificationTemplate start'); - NotificationManager.initNotificationTemplateMap(TAG); - } - - getPluginTempLate(templateName) { - Log.showInfo(TAG, `getPluginTempLate param:${templateName}`); - let pluginTempLate = null; - if (NotificationManager.NotificationTemplateMap !== null) { - pluginTempLate = NotificationManager.NotificationTemplateMap.get(templateName); - } - Log.showInfo(TAG, `getPluginTempLate pluginTempLate:${JSON.stringify(pluginTempLate)}`); - return pluginTempLate; - } -} - -let notificationService = new NotificationService(); - -export default notificationService as NotificationService; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ets deleted file mode 100644 index a25ce2d2..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ets +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; - -const TAG = `NotificationWindowManager`; - -class NotificationWindowManager { - mWindowManager: WindowManager = new WindowManager(); - - showNotificationWindow() { - // todo show Notification window - } - - hideNotificationWindow() { - Log.showInfo(TAG, 'hide Notification window'); - AppStorage.Set("showStatusBar", true); - this.mWindowManager.setWindowMin((result) => { - Log.showInfo(TAG, `setWindowMin ${result}`); - }); - } -} - -let sNotificationWindowManager = new NotificationWindowManager(); - -export default sNotificationWindowManager as NotificationWindowManager; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets deleted file mode 100644 index f5ee18a9..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (c) 2021 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 Notification from '@ohos.notification'; -import AccountManager from '@ohos.account.osAccount'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import BundleManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager.ets'; -import NotificationManager from './NotificationManager.ets'; -import Constants, {NotificationItemData} from '../common/constants.ets'; -import {NotificationConfig} from './NotificationConfig.ets'; - -const TAG = 'Notification_ParseDataUtil'; -let mDate = new Date(); -let appDataMap = new Map(); - -type NotificationContent = { - title: string, - text: string, - additionalText: string, - briefText?: string, - expandedTitle?: string, - longText?: string, - lines?: [], - picture?: any -} - -async function getUserId(uid) { - Log.showInfo(TAG, `getOsAccountLocalIdFromUid request.creatorUid = ${uid}`); - let userId = 0; - userId = await AccountManager.getAccountManager().getOsAccountLocalIdFromUid(uid); - Log.showInfo(TAG, `getOsAccountLocalIdFromUid userId = ${userId}`); - return userId; -} - - -/** - * parse data util class. - */ -export default class ParseDataUtil { - static async parseData(request, sortingMap?) { - if (!request) { - return Promise.reject('consumeCallback request is empty'); - } - Log.showInfo(TAG, `parse data start, want = ${JSON.stringify(request.wantAgent)}`); - Log.showInfo(TAG, `actionButtons = ${JSON.stringify(request.actionButtons)}`); - let [appMessage, userId] = - await Promise.all([ParseDataUtil.getAppData(request.creatorBundleName), getUserId(request.creatorUid)]); - let notificationItem: NotificationItemData = { - id: request.id, - userId: userId, - hashcode: request.hashCode, - contentType: request?.content?.contentType + '', - timestamp: request.deliveryTime, - time: ParseDataUtil.getStandardTime(request.deliveryTime), - appName: appMessage.appName, - want: request.wantAgent, - bundleName: request.creatorBundleName, - actionButtons: request.actionButtons, - smallIcon: NotificationConfig.USE_NOTIFICATION_ICON ? (request?.smallIcon ?? appMessage.icon) : appMessage.icon, - largeIcon: request.largeIcon, - slotLevel: sortingMap?.sortings[request?.hashCode]?.slot?.level, - source: request.source, - sound: sortingMap?.sortings[request?.hashCode]?.slot?.sound ?? '', - vibrationValues: sortingMap?.sortings[request?.hashCode]?.slot?.vibrationValues ?? [], - template: request?.template, - isOngoing: request.isOngoing, - isUnremovable: request.isUnremovable, - isRemoveAllowed: request.isRemoveAllowed - }; - Log.showInfo(TAG, `notificationItem construct over ====================`); - notificationItem = { - ...notificationItem, ...ParseDataUtil.getContentByType(request?.content?.contentType, request) - } - return notificationItem; - } - - /** - * Get app data by bundleName. - * - * @param {string} bundleName - BundleName of the target app. - * @return {object} appData - */ - static async getAppData(bundleName) { - Log.showInfo(TAG, `getAppName start by ${bundleName}`); - if (appDataMap.has(bundleName)) { - Log.showInfo(TAG, `getAppData success.`); - return appDataMap.get(bundleName); - } - let data = await BundleManager.getBundleInfo(TAG, bundleName, 0); - let labelId = data?.appInfo?.labelId; - let iconId = data?.appInfo?.iconId; - let item = await BundleManager.getResourceManager(TAG, bundleName); - let appMessage = { - appName: await item.getString(labelId), - icon: await item.getMediaBase64(iconId) - }; - if (appMessage.icon != null && appMessage.appName) { - appDataMap.set(bundleName, appMessage); - Log.showInfo(TAG, `getAppData success ${appMessage.appName} by ${bundleName}`); - } - return appMessage; - } - - /** - * Reformat the timestamp to hh:mm. - * - * @param {number} timestamp - Target timestamp. - */ - static getStandardTime(timestamp) { - if (timestamp == 0 || timestamp == undefined || timestamp == null) { - return ''; - } - mDate.setTime(timestamp); - let hoursNumber = mDate.getHours(); - let minutesNumber = mDate.getMinutes(); - let hours = hoursNumber < 10 ? '0' + hoursNumber : hoursNumber; - let minutes = minutesNumber < 10 ? '0' + minutesNumber : minutesNumber; - return hours + ':' + minutes; - } - - static getContentByType(notificationType, request): NotificationContent { - let content = { - title: '', text: '', additionalText: '' - } - - function getContentByKey(keysAndDefault, source) { - if (source) { - keysAndDefault.forEach(([key, defualt]) => { - content[key] = source[key] ?? defualt - }) - } - } - - switch (notificationType) { - case NotificationManager.TYPE_BASIC: - getContentByKey([['title', ''], ['text', ''], ['additionalText', '']], request.content.normal) - break; - case NotificationManager.TYPE_LONG: - getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], - ['expandedTitle', ''], ['longText', '']], request.content.longText) - break; - case NotificationManager.TYPE_MULTI: - getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], - ['longTitle', ''], ['lines', []]], request.content.multiLine) - break; - case NotificationManager.TYPE_PICTURE: - getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], - ['expandedTitle', ''], ['picture', '']], request.content.picture) - break; - default: - Log.showInfo(TAG, 'no match content type'); - break; - } - Log.showInfo(TAG, `notificationType = ${notificationType}, content = ${JSON.stringify(content)}`); - return content - } -} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets deleted file mode 100644 index 28644d74..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2021 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 {NotificationItemData} from '../../common/constants.ets'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; -import {SlotLevel} from '@ohos.notification'; -import Notification from '@ohos.notification'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import Bundle from '@ohos.bundle'; - -const TAG = 'NotificationRuleController'; - -export class RuleController { - /** - * Check if this notification is allow show or not - * - * @param {notificationItemData} Data of the notification - * @param {callback} Data of the type to show the notification - */ - getNotificationData(notificationItemData: NotificationItemData, callback) { - Log.showInfo(TAG, "getNotificationData start") - Log.showInfo(TAG, `notificationItemData = ${JSON.stringify(notificationItemData)}`); - - this.isAllowSendNotification(notificationItemData, (isSuccess) => { - if (!isSuccess) { - Log.showInfo(TAG, "user is not allow this to send notification"); - callback(undefined); - return; - } - this.getNotificationDataByApp(notificationItemData, (originalData) => { - Log.showInfo(TAG, `originalData = ${JSON.stringify(originalData)}`); - this.updateNotificationDataBySense(originalData, (finalData) => { - Log.showInfo(TAG, `finalData = ${JSON.stringify(finalData)}`); - callback(finalData); - }); - }); - }); - } - - /** - * Check if user allow the app send notification or not - * - * @param {notificationItemData} The origin notification data - * @param {callback} The user allow the app send notification or not - */ - isAllowSendNotification(notificationItemData, callback) { - Log.showInfo(TAG, "isAllowSendNotification start"); - Bundle.getBundleInfo(notificationItemData.bundleName, 0) - .then((data) => { - Log.showInfo(TAG, `getBundleInfo : ${JSON.stringify(data)}`) - Notification.isNotificationEnabled({ bundle: notificationItemData.bundleName, uid: data.uid }) - .then((flag) => { - Log.showInfo(TAG, `Notification.isNotificationEnabled:` + flag) - callback(flag); - }); - }); - - } - - /** - * Check whether sound or vibration is allowed - * - * @param {notificationItemData} The origin notification data - * @param {callback} whether sound or vibration is allowed - */ - - SoundOrVibrate(notificationItemData, callback) { - Log.showInfo(TAG, "SoundOrVibrate start") - let sound = false; - let vibrationValues = false; - if (!CheckEmptyUtils.checkStrIsEmpty(notificationItemData.sound)) { - sound = true; - Log.showInfo(TAG, `notificationItemData.sound is allowed = ${sound}`); - } - if (!CheckEmptyUtils.isEmptyArr(notificationItemData.vibrationValues)) { - vibrationValues = true; - Log.showInfo(TAG, `notificationItemData.vibrationValues is allowed = ${vibrationValues}`); - } - callback(sound, vibrationValues); - } - - - /** - * Get notification data of the notification - * - * @param {notificationItemData} The origin notification data - * @param {callback} The type to show notification - */ - getNotificationDataByApp(notificationItemData, callback) { - Log.showInfo(TAG, "getNotificationDataByApp start") - let mNotificationItemData : NotificationItemData = notificationItemData; - mNotificationItemData.ruleData = { - isAllowBanner: false, - isAllowSound: false, - isAllowVibrationValues: false, - isAllowStatusBarShow : false, - isAllowNotificationListShow : false - }; - Log.showInfo(TAG, `notificationItemData.slotLevel = ${notificationItemData.slotLevel}`); - if (notificationItemData.slotLevel === SlotLevel.LEVEL_HIGH) { - mNotificationItemData.ruleData.isAllowBanner = true; - this.SoundOrVibrate(notificationItemData, (sound, vibrationValues) => { - mNotificationItemData.ruleData.isAllowSound = sound; - mNotificationItemData.ruleData.isAllowVibrationValues = vibrationValues; - }); - mNotificationItemData.ruleData.isAllowStatusBarShow = true; - mNotificationItemData.ruleData.isAllowNotificationListShow = true; - - } else if (notificationItemData.slotLevel === SlotLevel.LEVEL_DEFAULT) { - this.SoundOrVibrate(notificationItemData, (sound, vibrationValues) => { - mNotificationItemData.ruleData.isAllowSound = sound; - mNotificationItemData.ruleData.isAllowVibrationValues = vibrationValues; - }); - mNotificationItemData.ruleData.isAllowStatusBarShow = true; - mNotificationItemData.ruleData.isAllowNotificationListShow = true; - } else if (notificationItemData.slotLevel === SlotLevel.LEVEL_LOW || - notificationItemData.slotLevel === SlotLevel.LEVEL_MIN) { - mNotificationItemData.ruleData.isAllowNotificationListShow = true; - } else { - mNotificationItemData.ruleData.isAllowNotificationListShow = false; - } - Log.showInfo(TAG, `mNotificationItemData.ruleData = ${JSON.stringify(mNotificationItemData.ruleData)}`); - callback(mNotificationItemData); - } - - - - /** - * Check the sense of the phone to update the show type - * - * @param {notificationItemData} The origin notification data - * @param {callback} The final notification data - */ - updateNotificationDataBySense(notificationItemData, callback) { - Log.showInfo(TAG, "updateNotificationDataBySense start") - let mNotificationItemData = notificationItemData; - // TODO Scenario Management - callback(mNotificationItemData); - } - -} - -let ruleController = new RuleController(); - -export default ruleController as RuleController; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets deleted file mode 100644 index 55335c7a..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import SwitchUserManager from '../../../../../../../../../common/src/main/ets/default/SwitchUserManager.ets'; -import media from '@ohos.multimedia.media'; -import vibrator from '@ohos.vibrator'; -import wantAgent from '@ohos.wantAgent'; -import SourceType from '@ohos.notification' -import NotificationService from '../model/NotificationService.ets' -import NotificationWindowManager from '../model/NotificationWindowManager.ets'; -import NotificationConfig from '../model/NotificationConfig.ets'; -import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import CommonUtil from '../common/CommonUtil.ets'; -import Constants from '../common/constants.ets'; - -const TAG = 'NotificationViewModel'; -const GROUP_THRESHOLD = 10; - -/** - * Notification ViewModel class. - */ -export class ViewModel { - audioPlayer: any; - mNotificationList: any[]; - mAppNotificationCount = new Map(); - mCallback: any; - mNotificationCtrl: any = {}; - - constructor() { - this.mNotificationList = AppStorage.SetAndLink('notificationList', []).get(); - this.audioPlayer = media.createAudioPlayer(); -// this.audioPlayer.src = 'file://system/etc/capture.ogg'; - SwitchUserManager.getInstance().registerListener(this); - this.initFlowControlInfos(); - SwitchUserManager.getInstance().getCurrentUserInfo().then((userInfo) => { - this.registerCallback(userInfo.userId); - }) - } - - registerCallback(userId) { - this.mCallback = { - userId: userId, - onNotificationConsume: this.onNotificationConsume.bind(this), - onNotificationCancel: this.onNotificationCancel.bind(this) - } - NotificationService.register(this.mCallback); - } - - unregisterCallback() { - NotificationService.unRegister(this.mCallback); - } - - userChange(userInfo) { - Log.showInfo(TAG, `UserChange, userInfo: ${JSON.stringify(userInfo)}`); - this.unregisterCallback(); - this.mNotificationList.length = 0; - this.initFlowControlInfos(); - this.registerCallback(userInfo.userId); - NotificationService.loadAllNotifications(); - } - - /** - * notification CancelCallback - * - * @param {Object} data - return notificationItemData. - */ - onNotificationConsume(notificationItemData) { - if (notificationItemData === undefined) { - Log.showInfo(TAG, `onNotificationConsume notificationItemData is undefined`); - return; - } - this.onNotificationCancel(notificationItemData) - Log.showInfo(TAG, `onNotificationConsume ${JSON.stringify(notificationItemData)}`); - //Verify the notifications can be displayed - if (!this.isCanShow(notificationItemData.bundleName)) { - //can not displayed - return; - } - if (!this.mAppNotificationCount.has(notificationItemData.appName)) { - this.mAppNotificationCount.set(notificationItemData.appName, 0); - } - this.mAppNotificationCount[notificationItemData.appName] += 1; - if (this.mAppNotificationCount[notificationItemData.appName] >= GROUP_THRESHOLD) { - this.groupNotification(notificationItemData, this.mAppNotificationCount[notificationItemData.appName]); - } else { - if (notificationItemData.ruleData.isAllowStatusBarShow) { - //TODO statusbar show - } - if (notificationItemData.ruleData.isAllowNotificationListShow) { - this.mNotificationList.unshift(notificationItemData); - Log.showInfo(TAG, `reminder start `); - this.reminderWay(notificationItemData); - Log.showInfo(TAG, `reminder end `); - this.updateFlowControlInfos(notificationItemData.bundleName, true) - } - this.updateNotification(); - } - } - - /** - * notification CancelCallback - */ - onNotificationCancel(notificationItemData) { - Log.showInfo(TAG, `onNotificationCancel ${JSON.stringify(notificationItemData)}`); - if (this.mAppNotificationCount[notificationItemData.appName] >= GROUP_THRESHOLD) { - //Group Notification Deletion Logic Processing - return; - } - // Common Notification Deletion Logic Processing - for (let i = 0, len = this.mNotificationList.length; i < len; i++) { - if (this.mNotificationList[i].hashcode == notificationItemData.hashcode) { - Log.showInfo(TAG, `removeNotificationItem i = ${i}`); - this.mAppNotificationCount[notificationItemData.appName] -= 1; - let removeItemArr = this.mNotificationList.splice(i, 1); - Log.showInfo(TAG, `onNotificationCancel removeItemArr= ${JSON.stringify(removeItemArr)}`); - if (!CheckEmptyUtils.isEmpty(removeItemArr)) { - this.updateFlowControlInfos(removeItemArr[0].bundleName, false) - } - break; - } - } - } - - - /** - * notification CancelCallback - * - * @param {Object} data - return notificationItemData. - */ - groupNotification(notificationItemData, num) { - if (num == GROUP_THRESHOLD) { - //Group Notification Conversion - } else { - //Group Notification Add - } - } - - updateNotification() { - Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(this.mNotificationList)}`); - Log.showInfo(TAG, `updateNotification length: ${this.mNotificationList.length}`); - this.sortNotification() - let listLink = AppStorage.Link('notificationList'); - listLink.set(this.mNotificationList); - Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(listLink.get())}`); - } - - /** - * Sort the notifications. - */ - sortNotification() { - Log.showInfo(TAG, `sortNotification`); - if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { - return - } - this.mNotificationList.sort((itemA, itemB) => { - //long term notification come first - if (itemA.source == SourceType.TYPE_CONTINUOUS && itemB.source != SourceType.TYPE_CONTINUOUS) { - return -1 - } - //long term notification come first - if (itemA.source != SourceType.TYPE_CONTINUOUS && itemB.source == SourceType.TYPE_CONTINUOUS) { - return 1 - } - if ((itemA.source == SourceType.TYPE_CONTINUOUS && itemB.source == SourceType.TYPE_CONTINUOUS) || - (itemA.source != SourceType.TYPE_CONTINUOUS && itemB.source != SourceType.TYPE_CONTINUOUS) - ) { - return -1 * (itemA.timestamp - itemB.timestamp) - } - }) - } - - /** - * Remove all notifications. - */ - removeAllNotifications() { - if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { - this.mNotificationList = [] - } else { - let index = this.mNotificationList.length - while (index--) { - Log.showInfo(TAG, `mNotificationList[${index}].source: ${this.mNotificationList[index].source}`); - //Except the Long term notifications - if (this.mNotificationList[index].isRemoveAllowed && - !this.mNotificationList[index].isOngoing && !this.mNotificationList[index].isUnremovable) { - Log.showInfo(TAG, `mNotificationList[${index}].hashcode: ${this.mNotificationList[index].hashcode}`); - let hashCode = this.mNotificationList[index].hashcode - this.removeSysNotificationItem(hashCode) - let removeItemArr = this.mNotificationList.splice(index, 1) - Log.showInfo(TAG, `removeAllNotifications removeItemArr= ${JSON.stringify(removeItemArr)}`); - if (!CheckEmptyUtils.isEmpty(removeItemArr)) { - this.updateFlowControlInfos(removeItemArr[0].bundleName, false) - } - } - } - } - this.updateNotification() - } - - removeNotificationItem(itemData, isDelSysConent) { - Log.showInfo(TAG, `removeNotificationItem, hashcode: ${itemData.hashcode}`); - for (let i = 0, len = this.mNotificationList.length; i < len; i++) { - if (this.mNotificationList[i].hashcode == itemData.hashcode) { - Log.showInfo(TAG, `removeNotificationItem i = ${i}`); - this.mAppNotificationCount[itemData.appName] -= 1; - let removeItemArr = this.mNotificationList.splice(i, 1); - Log.showInfo(TAG, `removeNotificationItem removeItemArr= ${JSON.stringify(removeItemArr)}`); - if (!CheckEmptyUtils.isEmpty(removeItemArr)) { - this.updateFlowControlInfos(removeItemArr[0].bundleName, false) - } - break; - } - } - this.updateNotification(); - if (isDelSysConent) { - this.removeSysNotificationItem(itemData.hashcode); - } - AppStorage.Delete(Constants.KEY_INPUT + itemData.id); - } - - removeSysNotificationItem(hashcode) { - NotificationService.remove(hashcode); - } - - clickItem(itemData, want?: any) { - Log.showInfo(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}`); - NotificationWindowManager.hideNotificationWindow(); - CommonUtil.startWant((want) ? want : itemData.want); - this.removeNotificationItem(itemData, true); - } - - clickReply(inputKey, content, want) { - Log.showInfo(TAG, `clickReply inputKey: ${inputKey}, content: ${content}, want: ${JSON.stringify(want)}`); - let info = { - code: 0, - want: { key: inputKey, data: content }, - permission: '', - extraInfo: {} - } - CommonUtil.startWant(want, info); - } - - initFlowControlInfos() { - Log.showInfo(TAG, 'initFlowControlInfos enter'); - let notificationConfig = NotificationConfig.readNotificationConfig('statusbar') - Log.showInfo(TAG, 'NotificationConfig: ' + JSON.stringify(notificationConfig)); - if (CheckEmptyUtils.isEmpty(notificationConfig)) { - Log.showInfo(TAG, 'NotificationConfig is no definition'); - return - } - this.mNotificationCtrl = { - currentTotal: 0, - limitTotal: notificationConfig.limitTotal, - app: new Map() - } - for (let item of notificationConfig.app) { - let tmp = { - 'canShow': item.canShow, - 'currentNum': 0, - 'limit': item.limit - } - this.mNotificationCtrl['app'].set(item.bundleName, tmp); - } - Log.showInfo(TAG, 'initFlowControlInfos end, mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); - } - - isCanShow(bundleName: string): boolean { - Log.showInfo(TAG, 'isCanShow'); - let result: boolean = true - if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { - let currentTotal = this.mNotificationCtrl['currentTotal'] - let limitTotal = this.mNotificationCtrl['limitTotal'] - Log.showInfo(TAG, `isCanShow Total: currentTotal=${currentTotal},limitTotal=${limitTotal}`); - if (currentTotal + 1 > limitTotal) { - result = false - } else if (this.mNotificationCtrl['app'].has(bundleName)) { - let tmp = this.mNotificationCtrl['app'].get(bundleName) - Log.showInfo(TAG, `isCanShow appTotal: canShow=${tmp['canShow']},tmp['currentNum']=${tmp['currentNum']}`); - if (tmp['canShow'] === false || (tmp['currentNum'] + 1 > tmp['limit'])) { - result = false - } - } - } - Log.showInfo(TAG, `isCanShow :${result}`); - return result; - } - - updateFlowControlInfos(bundleName: string, plusOrMinus: boolean): void { - Log.showInfo(TAG, `updateFlowControlInfos`); - if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { - if (this.mNotificationCtrl['app'].has(bundleName)) { - let tmp = this.mNotificationCtrl['app'].get(bundleName) - if (plusOrMinus) { - tmp['currentNum'] += 1 - } else if (tmp['currentNum'] > 0) { - tmp['currentNum'] -= 1 - } - this.mNotificationCtrl['app'].set(bundleName, tmp) - } - - if (plusOrMinus) { - this.mNotificationCtrl['currentTotal'] += 1 - } else if (this.mNotificationCtrl['currentTotal'] > 0) { - this.mNotificationCtrl['currentTotal'] -= 1 - } - } - - Log.showInfo(TAG, `updateFlowControlInfos:${JSON.stringify(this.mNotificationCtrl)}`); - } - - reminderWay(itemData) { - if (itemData.ruleData.isAllowBanner) { - //TODO banner notification - } - if (itemData.ruleData.isAllowSound) { - try { - this.audioPlayer.src = itemData.sound; - Log.showInfo(TAG, `sound start `); - this.audioPlayer.play(); - Log.showInfo(TAG, `sound end `); - } catch (e) { - Log.showInfo(TAG, `sound notificationItem id:${itemData.id} alert error: ${e.toString()}`); - } - } - if (itemData.ruleData.isAllowVibrationValues) { - Log.showInfo(TAG, `vibrate start`); - for (let i = 0, len = itemData.vibrationValues.length; i < len; i++) { - vibrator.vibrate(itemData.vibrationValues[i], function(error){ - Log.showInfo(TAG, `vibrate id:${i}`); - if (error) { - Log.showInfo(TAG, "error.code" + error.code + "error.message" + error.message); - } else { - Log.showInfo(TAG, "Callback returned to indicate a successful vibration."); - } - }) - } - } - } - - getPluginTempLate(templateName) { - Log.showInfo(TAG, 'getPluginTempLate: ' + templateName); - return NotificationService.getPluginTempLate(templateName) - } -} - -let viewModel = new ViewModel(); - -export default viewModel as ViewModel; \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/media/delete.png b/features/noticeitem/src/main/resources/base/media/delete.png deleted file mode 100644 index 143463751f103bbf00d204cbbd40982b9a5a6ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4061 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 P00000NkvXXu0mjf(|(n6 diff --git a/features/noticeitem/src/main/resources/base/media/ic_setting.png b/features/noticeitem/src/main/resources/base/media/ic_setting.png deleted file mode 100644 index 8d30e3686f820dcfd0ba79e8193aec4f0271ee27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2788 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 { - Log.showInfo(TAG, `startService->ringerModeChange, data: ${JSON.stringify(data)}`) - this.mListener?.updateRingerMode(data); - }); - } - - stopService() { - if (!this.mIsStart) { - return; - } - Log.showInfo(TAG, `stopService`) - this.mIsStart = false; - - this.mAudioManager = null; - } - - registerListener(listener: { - 'updateRingerMode': Function - }) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`) - this.mListener = listener; - } - - getRingerMode() { - Log.showInfo(TAG, `getRingerMode`) - this.mAudioManager.getRingerMode((error, action) => { - Log.showInfo(TAG, `getRingerMode, error: ${JSON.stringify(error)} action: ${JSON.stringify(action)}`) - if (error) { - return; - } - this.mListener?.updateRingerMode(action); - }); - } - - setRingerMode(mode) { - Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)}`) - this.mAudioManager.setRingerMode(mode, (err, data) => { - Log.showInfo(TAG, `mAudioManager.setRingerMode, mode: ${JSON.stringify(mode)}`) - }) - } -} - -let ringModeService = new RingModeService(); - -export default ringModeService as RingModeService; \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ets b/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ets deleted file mode 100644 index 93bc477e..00000000 --- a/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ets +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import {AudioRingMode} from '../common/Constants.ets' -import RingModeService from '../model/RingModeService.ets'; - -export const RingModeComponentModeKey = "RingModeComponentMode"; - -const TAG = 'RingModeVM'; - -export class RingModeVM { - mIsStart: boolean = false; - mRingModeComponentMode: any; - - initViewModel() { - if (this.mIsStart) { - return; - } - Log.showInfo(TAG, `initViewModel `) - this.mIsStart = true; - - this.mRingModeComponentMode = AppStorage.SetAndLink(RingModeComponentModeKey, AudioRingMode.RINGER_MODE_NORMAL); - - RingModeService.registerListener({ - 'updateRingerMode': this.updateRingerMode.bind(this) - }); - RingModeService.startService(); - } - - updateRingerMode(mode) { - Log.showInfo(TAG, `updateRingerMode, mode: ${JSON.stringify(mode)} `) - this.mRingModeComponentMode.set(mode); - } - - setRingerMode(mode) { - Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)} `) - RingModeService.setRingerMode(mode); - } -} - -let ringModeVM = new RingModeVM(); - -export default ringModeVM as RingModeVM; \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ets b/features/signalcomponent/src/main/ets/default/common/constants.ets deleted file mode 100644 index a03c0174..00000000 --- a/features/signalcomponent/src/main/ets/default/common/constants.ets +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2021 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 default class Constants { - - static NETWORK_TYPE_UNKNOWN = 0; - static NETWORK_TYPE_GSM = 1; - static NETWORK_TYPE_CDMA = 2; - static NETWORK_TYPE_W_CDMA = 3; - static NETWORK_TYPE_TDS_CDMA = 4; - static NETWORK_TYPE_LTE = 5; - static NETWORK_TYPE_NR = 6; - - static CELLULAR_SIGNAL_NO = 0; - static CELLULAR_SIGNAL_MIN = 1; - static CELLULAR_SIGNAL_LOW = 2; - static CELLULAR_SIGNAL_HALF = 3; - static CELLULAR_SIGNAL_HIGH = 4; - static CELLULAR_SIGNAL_FULL = 5; - static CELLULAR_NO_SIM_CARD = -1; - - static STATIC_BAR_ICON_WIDTH = 24; - static STATIC_BAR_ICON_HEIGHT = 24 ; - - static NET_NULL = 'NULL'; -} diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ets b/features/signalcomponent/src/main/ets/default/signalModel.ets deleted file mode 100644 index 597e4a72..00000000 --- a/features/signalcomponent/src/main/ets/default/signalModel.ets +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2021 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 Radio from '@ohos.telephony.radio'; -import Sim from '@ohos.telephony.sim' -import Observer from '@ohos.telephony.observer'; -import Log from "../../../../../../common/src/main/ets/default/Log.ets"; -import CheckEmpty from '../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import Constants from './common/constants.ets' - -const TAG = 'SignalStatus-SignalModel'; -const EMPTY_LEVEL = 0; - -let mSignalCallback; -let signalValue = { - cellularLevel: '', - cellularType: '', - networkState: '' -}; -let isInitObserver = false - -var mLevelLink; -var mTypeLink; -var mStateLink; - -export class SignalModel - -{ - - initSignalModel() { - Log.showInfo(TAG, 'initSignalModel'); - mLevelLink = AppStorage.SetAndLink("cellularLevel", Constants.CELLULAR_NO_SIM_CARD); - mTypeLink = AppStorage.SetAndLink("cellularType", Constants.NETWORK_TYPE_UNKNOWN); - mStateLink = AppStorage.SetAndLink("networkState", Constants.NET_NULL); - this.checkCellularStatus(); - } - - uninitSignalModel() { - Log.showInfo(TAG, 'uninitSignalModel'); - this.unInitObserver(); - } - - /** - * Check the connection type and signal level of cellular network - */ - checkCellularStatus() { - let cellularStatus; - let slotId = 0; - Log.showInfo(TAG, 'enter checkCellularStatus ============'); - - Sim.hasSimCard(slotId, (err, value) => { - if (value === true) { - //The interface of getting the cellular signal status is unavailable temporarily - Radio.getSignalInformation(slotId, (err, value) => { - if (err) { - // Failed to call the interface,error is not null - Log.showError(TAG, `failed to getSimState because ${err.message}`); - // When failed to call the interface, set the result as no signal - mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); - mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); - } else { - // Call interface succeed,error is null - Log.showInfo(TAG, `success to getSignalInformation: ${JSON.stringify(value)}`); - // Since the value might be empty, set it as no signal by hand - if (CheckEmpty.isEmpty(value)) { - Log.showError(TAG, 'value from api is empty, set 0'); - mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); - mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); - }else{ - mLevelLink.set(value[0].signalLevel); - mTypeLink.set(value[0].signalType); - } - } - - Log.showInfo(TAG, 'enter checknetworkState ============'); - //The interface of getting the cellular signal status is unavailable temporarily - Radio.getNetworkState((err, value) => { - if (err) { - // Failed to call the interface,error is not null - Log.showError(TAG, `failed to getnetworkState because ${err.message}`); - // When failed to call the interface, set the result as no signal - mStateLink.set(Constants.NET_NULL); - } else { - // Call interface succeed,error is null - Log.showInfo(TAG, `success to getnetworkState: ${JSON.stringify(value)}`); - // Since the value might be empty, set it as no signal by hand - if (CheckEmpty.isEmpty(value)) { - Log.showError(TAG, 'value from api is empty, set 0'); - mStateLink.set(Constants.NET_NULL); - }else{ - mStateLink.set(value.longOperatorName); - } - } - }); - }); - if(!isInitObserver){ - this.initObserver(); - } - } else { - Log.showError(TAG, `hasSimCard failed to hasSimCard because`); - mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); - mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); - mStateLink.set(Constants.NET_NULL); - if(!isInitObserver){ - this.initObserver(); - } - } - }); - } - - /** - * init the observer of the cellular and signal - */ - initObserver() { - Log.showInfo(TAG, 'initObserver'); - isInitObserver = true; - Observer.on('signalInfoChange', (signalInfoChange) => { - Log.showInfo(TAG, `signalInfoChange ${JSON.stringify(signalInfoChange)}`); - this.checkCellularStatus(); - }); - Observer.on('networkStateChange', (networkState) => { - Log.showInfo(TAG, `networkStateChange ${JSON.stringify(networkState)}`); - this.checkCellularStatus(); - }); - Observer.on('simStateChange', (simStateInfo) => { - Log.showInfo(TAG, `simStateChange ${JSON.stringify(simStateInfo)}`); - this.checkCellularStatus(); - }); - } - - /** - * Uninit the observer of the cellular and signal - */ - unInitObserver() { - Log.showInfo(TAG, 'unInitObserver'); - Observer.off('signalInfoChange'); - Observer.off('networkStateChange'); - Observer.off('simStateChange'); - isInitObserver = false; - } -} -let mSignalModel = new SignalModel(); -export default mSignalModel as SignalModel; \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.png b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.png deleted file mode 100644 index 682eb1a3b5292c03954e20309c05f84811101ea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmV-90>=G`P)Px$^GQTORA>e5S-naGF%Z605mZnF75}if#==4it$hY--{{`KM-Y4kE3vb&u@F29 zE!DyU5zcQk-i^az2#Y{;+&Yk4ZT?UDgl}S#b1SXm7vRFY?2$g0DlO90m{k4xWS^C;n7C6?u z&@DvZ7a^30uBrR6uzAfBN`S!gCT-rAL=Pp91XP_#l|Y?rr5Nj60UXR}$UbB(1%S{w ztpos?%HtK}2J#5|G&Epre=7k5Bfv){=q#>1qqpYbBCsWpZVEfQ=^~IFpbLPDz^jJwtidRpO7vB=NSFMJkFR-YMPx%1W80eRA>e5S-naGF%aHW5!6OO#Xl5mECdfhYhU54eF|U0!Z#3~K=c)?#O@j! z3qdWk^QZ7Yg!3CnLKt>;b~l^NDhUk9?961oZ?ehV<&q?}Sbm&gM{s5pS6z~U-xXU6jmi4d$&z6BfgC{uad6>FNzy?p)xo-G$ zm4E>#4gNfV+@+D2H(|$SrFVS_@`_FRRcFp%1OR>;fHxKBE$G*ENQ8Wa?30BGNvl!0 zg(SdNpX;T_gd|W3pyU(@NEPyJul3%Q1*MM3HTVx9_c&#~%f^=V^F{#R=Kx~Q0y2Z~ zt)(|I^tlJ-8NvmoH=_C^z~}bz)tx74q$+Jr5(%_f?W|l*D}a+`7czjnK~A$0_?GokU=jAzfj5a8)7@9H0b1BJjZ` z_!M;8|A+Zj(IsCqwM5_op6|vxNzSY>4Q-wL$X_?Q)3<>zG+ YFBx8Vg^O7+Hvj+t07*qoM6N<$g6H!6Px%5J^NqRA>e5S-nccKoCw;6s^QU`~d|KECde=Z7sykB3JtqzJ`VP0^$?s`3hFH z*Vqbbp`Aa4Hp2N0WaHd$x!KERlPJ6Ju`}73+3%aZ#4{H~VT2BZ4ulSb4mflmcF6Ub z+UxaZu)zZG702;&-e!#ykdog6>4}v1Jw)6M5-~RDVgs%%f`cJXbXM{>HB|s7Pu!)S z>1nEfjG$)xc>%dcqbVoQ|QLAAp*j?h`R#J7shqi zhc>yR#P~dceMX)*9gITEHrA(rDM4aV_@%f$1(ZTiD-r}~9rC^IbOLzNYy(~36*%=x zc2IpM0VsF@w18RQ7$OqPl@3<{TY|0h#d7(ss{r#y$}n@SXX;qbm2YUx%rfx*3&4#z z4zz%I%cfKsHuMBQnqKeS0$tz<{!yjuEH)b|0Qp3CC#^%@WlmDNF_R`>SukA^e(kO% zpmu^90ZqWWDDa{9Jf7Q>CUd_|OWOLFymZkmvyVrM-J9zTY3#c~mfH!B?e2r|ZCzw`&4%YiNvdGPSwTN7+A2^6Z k7@-591EB+<1BE;A1E}hN9$>h+lmGw#07*qoM6N<$f<5~Sp8x;= diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.png b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.png deleted file mode 100644 index c9dd4399cbbc7ef49da00ee253951196b9008e64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 576 zcmV-G0>AxPx$`bk7VRA>e5nY~KHKoG|h6$J|w3-JTAvG%ag)8CI^3lh{rM!Q)L%haBU3?2A*&>tC-p6u<Y=E0|^qZWGtpMOJ2^`jkJ;1NLQO5~uOaP$HEU+cC zdzSCqY*N4iqg-UZliQ>KCqOAk1xOW&-5+%Y=rIW!!1}P|7-FKm2LQYe;9Hp4Fm9uL z99l%o6*#ouiTfxtJmrfiV2%OLGCznLQ$P?vDTxY@DipilYX$J6*@X>ZZ!p@N)qZ#h z0PQub1EbB@IYiL*xYom0zz(D3KI;ze`U)^FDMRL)&*X7F*FK>$nPcGp7l0dc8rFfW zI2NVWu(2xuX!^W&4;#W>;Gfn?=P=n=0T@rfdwCw(%UtB`)|?~(8;o?F`Hj1hfW`qO z07<|HOYkZ9cD&uDVUvvgX7g~r=#~WBAo9J4PLeCDO-Px$=1D|BRA>e5SvyVxF%ZoH0*L|;1qDdZP!mzW1rQxY5G5ri;0DwbQEreM5N<)6 zD*y-JbAjc}Y8?$jc5PwLI-s#M^30As^WN;P*KvA1YgPfPfK|XM5K)05Vy^1cvMl$J z;1cp&6vd-zvedx|JmekX+Awtv)p$UC>yX#|M^nP3CP(J$n)uxI9?5|{z>DSw{8 zijSeDAJ6vy@ed#qtTZp0xst~Q_#t~y-=Nd7SvBZ)%vY(-C;Oa_&zd za%GV#PY{Wm1cCti1{ncgg|z*ucL2-B05XA$Aln*b)V>1%dxQ~=W78}pS3GO>j7>q1%;QuFp7jqfXhwKCvrPE=p zcL1Q*f#wM^g}lPP?i5`>vQ`3^Pk>MAIJB3!ul0rLd<6Cc(p_O^H+=-M1M~s#5s-(f zpCX{N`FO6=G&xqPx$%Sl8*RA>e5Sv^YxF%Z2K!7uOw6cokc8bKQi8!LairJaq9g~f4j{sIp~Sl>Wg z=7!yy>?U&?VHO55n`Gv_mt@$F$;2;Lz!h)>T!91ys)V_wQ|r3kM}l+MvZ|^@SF$1r z1n^G)y&ZsmfW%uHiLJJq1>Cy;hClEG=ei41sRTH9!Y=)WPpJeNfLi0<6X;wTjd_lK z99G)vd$3O&(yt*gM>X9+J9cjDI5PqOe*zE>49Ef6FU-%k zwx~F%1PDC8q|f_I+NlIgK=ldg1p26DF;-mx9L$QU4Q$5(Kx)jjWfY*P{}FZ!gIm9% zRL)bA=A5ssz-0hWIq6yEmKr5p8i8E_wzzGi5fJ#xb2S1#0&*X}&sa*s$Md%ATY;nz zpzrcL*lcAso`0B68@P;ek3b+EUK#Bstdz@|c T54}mU00000NkvXXu0mjfR3PJd diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_null.png b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_null.png deleted file mode 100644 index 393332d93db62b4edccc026035b563d717cfc227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 802 zcmV+-1Ks?IP)Px%+(|@1RA>e5n7xY>K@i1vR8UX+I8g9Vyv0b=K>Wl&^a2qBGlL5Z)PKm>%s?R8|4Fod}y>}9Y4B->yn zB*>%UZ-YAp&e(mezQY<7`X%PFV*V848VN@v7?-gJpbsQF!TFIE|3|03%cMDB^pYAP z@QmoMW`!ehg}DLf11B3O&z%uD+TxYUx5w#g31nHO;#YuA;uUj!;ADuhLi`Um(bZT> zKt)j0M+TpSt#62NgSgLjvMW7EK!p?}?oTLcwQ2F(qa~nDvoIldaQd$Z6c_gKgltdn zm%7u0xY9Ih)LAY9jn}aokq8nXvEOY8j%@BRuZHkL+ zN#yw7oA^%D+Q&wbFZo#9q>{7XDfV|;l}O;fz}zZ$gS~G3UFfw0RDeh@2$h0gci~Z$ z6LPwk$H5l(MC`AsxR|*hfu_kRev!3mlTP-bymrQ{#?T#z*+(7B$`NbKN^g^ZpF5jX z(Ke62iS_*#dLr_WD&C53 zTVE@BEP+;vnkH!?FwJST5gU90bec@v2JCL5fY_Y1ZIq(rzX}ck%=|5_@=NTdvs@o~ z0>_HtwWof|oR%_A5+bn2D|YTaMj--T{qtvr2yA;LPh(FLt8Hw&)qP*7q!0nUF4|<9 zrPciYF}C6q@1)JOZjaH$92->%oku^^^iQj;;{CT2hF|Z!d%-vSKdrOPwRWGRrxQpg gkWL_-K;skm10%@>ZUgv9T>t<807*qoM6N<$f@*7dc>n+a diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ets b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ets deleted file mode 100644 index 14ce7678..00000000 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ets +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2021 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 default class Constants { - static EMPTY = 'empty'; - static WIFI = 'wifi'; - static BLUETOOTH = 'bluetooth'; - static SIGNAL = 'signal'; - static CLOCK = 'clock'; - static BATTERY = 'battery'; - static CAPSULE = 'capsule' - static NOTIFICATION = 'notification'; - static LOCATION = 'location' - static RING_MODE = 'ring_mode'; - - static STATIC_BAR_ICON_WIDTH = 24; - static STATIC_BAR_ICON_MARGIN = 2; - static STATIC_BAR_ICON_HEIGHT = 24; - static STATIC_BAR_ICON_INSIDE_SPACE = 2; - static STATIC_BAR_ICON_OUTSIDE_MARGIN = 5; - - static EMPTY_AREA_POSITION_LEFT = 'left'; - static EMPTY_AREA_POSITION_CENTER = 'center'; - static EMPTY_AREA_POSITION_RIGHT = 'right'; - - static GROUP_ID_LEFT = 1; - static GROUP_ID_CENTER = 2; - static GROUP_ID_RIGHT = 3; -} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets deleted file mode 100644 index 83a00c8a..00000000 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ets +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2021 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 display from '@ohos.display' -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil.ets' - -const TAG = 'StatusBarConfiguration'; - -var statusbarPosition; -var directionStatus; -var shortSideLength = '0'; - -var maxWidth; -var maxHeight; -var minHeight; -var realWidth; -var realHeight; -var xCoordinate = 0; -var yCoordinate = 0; - -enum Position { - NOT_CONFIGURED, - LEFT_POSITION, - TOP_POSITION, - RIGHT_POSITION, - BOTTOM_POSITION -} - -/** - * Get window size. - */ -class StatusBarConfiguration { - async initStatusBarConfiguration() { - Log.showInfo(TAG, 'initWindowManager'); - minHeight = AppStorage.SetAndLink("minHeight", 0); - - await display.getDefaultDisplay() - .then(dis => { - maxWidth = dis.width; - maxHeight = dis.height; - Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight.get()}`); - }) - } - - async getDirectionAndPosition() { - Log.showInfo(TAG, 'getDirectionAndPosition' + 1); - directionStatus = await ResourceUtil.getConfiguration(); - Log.showInfo(TAG, 'getDirectionAndPosition' + 2); - if (directionStatus.direction == -1) { - Log.showInfo(TAG, 'getDirectionAndPosition' + 3); - statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) - shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); - } else if (directionStatus.direction == 1) { - statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) - shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); - } else { - statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_portrait")) - shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_portrait")); - } - Log.showInfo(TAG, 'getDirectionAndPosition' + 4); - shortSideLength = parseInt(shortSideLength) + ''; - Log.showInfo(TAG, 'directionStatus = ' + directionStatus.direction); - Log.showInfo(TAG, 'statusbarPosition = ' + statusbarPosition); - Log.showInfo(TAG, 'lpx2px(parseInt(shortSideLength)) = ' + shortSideLength); - } - -/** - * Get status bar configuration - */ - public async getConfiguration() { - await this.initStatusBarConfiguration(); - await this.getDirectionAndPosition(); - if (statusbarPosition == Position.TOP_POSITION || statusbarPosition == Position.BOTTOM_POSITION) { - AppStorage.Set("showHorizontal", true); - minHeight.set(parseInt(shortSideLength)); - realWidth = maxWidth; - realHeight = parseInt(shortSideLength); - if (statusbarPosition == Position.BOTTOM_POSITION) { - yCoordinate = parseInt(maxHeight) - parseInt(shortSideLength); - } else { - AppStorage.Set("ableToMaximize", true); - } - } else if (statusbarPosition == Position.LEFT_POSITION || statusbarPosition == Position.RIGHT_POSITION) { - AppStorage.Set("showHorizontal", false); - AppStorage.Set("ableToMaximize", false); - minHeight.set(parseInt(shortSideLength)); - realWidth = parseInt(shortSideLength); - realHeight = maxHeight; - if (statusbarPosition == Position.RIGHT_POSITION) { - xCoordinate = parseInt(maxWidth) - parseInt(shortSideLength); - } - } else { - realWidth = 0; - realHeight = 0; - } - Log.showInfo(TAG, `initWindowManager xCoordinate ${xCoordinate} yCoordinate ${yCoordinate}`); - Log.showInfo(TAG, `initWindowManager realWidth ${realWidth} realHeight ${realHeight}`); - - var configuration = { - realWidth: realWidth, - realHeight: realHeight, - xCoordinate: xCoordinate, - yCoordinate: yCoordinate - } - return configuration; - } -} - -let statusBarConfiguration = new StatusBarConfiguration(); - -export default statusBarConfiguration; \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ets b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ets deleted file mode 100644 index 41c3c440..00000000 --- a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ets +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 2021 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 Resmgr from '@ohos.resourceManager'; -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import SwitchUserManager from '../../../../../../../../common/src/main/ets/default/SwitchUserManager.ets'; -import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import PluginDataSourceAdapter from '../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ets'; -import Constants from '../common/Constants.ets'; - -const TAG = 'StatusBarModel'; - -let STATUSBAR_SOURCE_CONFIG = { - "MetaSource": { - "action": "com.ohos.systemui.action.BAR_ICON", - "permission": null, - "filterIds": [] - }, - // "pluginSource": { "pluginUrl": "xxx/xxx/xx" } -} - -export class StatusBarService { - mIsStart: boolean = false; - mAdapter: PluginDataSourceAdapter; - mListener: any; - mEmptyPosition: any; - mMaxWidth: number; - mMaxHeight: number; - mStatusBarHeight: number; - - startService(filterIds: string[]) { - if (this.mIsStart) { - return; - } - Log.showInfo(TAG, `start StatusBarService.`) - this.mIsStart = true; - this.mAdapter = new PluginDataSourceAdapter(TAG); - this.mAdapter.registerListener({ - 'initFinish': this.loadData.bind(this), - 'addItem': this.onItemAdd.bind(this), - 'removeItem': this.onItemRemove.bind(this) - }); - SwitchUserManager.getInstance().registerListener(this); - { - STATUSBAR_SOURCE_CONFIG.MetaSource.filterIds = filterIds; - } - this.mAdapter.initDataSource(STATUSBAR_SOURCE_CONFIG); - } - - stopService() { - if (!this.mIsStart) { - return; - } - Log.showInfo(TAG, `stop StatusBarService.`) - this.mIsStart = false; - this?.mAdapter.unregisterListener(); - this?.mAdapter.clearAll(); - } - - userChange(userInfo) { - Log.showInfo(TAG, `userChange userInfo ` + userInfo); - this.loadData(userInfo.userId); - } - - loadData(userId) { - Log.showInfo(TAG, `loadData`) - if (userId === null || userId === undefined) { - SwitchUserManager.getInstance().getCurrentUserInfo().then((userInfo) => { - this.mAdapter.loadData(userInfo.userId); - }); - } else { - this.mAdapter.loadData(userId); - } - } - - registerListener(listener: { - 'addItem': Function, - 'removeItem': Function, - 'onEmptyAreaChange': Function - }) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`) - this.mListener = listener; - } - - onItemAdd(itemData) { - Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`) - if (!CheckEmptyUtils.isEmpty(itemData.label) || !CheckEmptyUtils.isEmpty(itemData.iconUrl)) { - if (!CheckEmptyUtils.isEmpty(itemData.label)) { - itemData.label = decodeURIComponent(itemData.label); - } - this.mListener?.addItem(itemData); - - } else { - Resmgr.getResourceManager(itemData.bundleName) - .then(mgr => { - mgr.getString(itemData.abilityLabelId, (error, value) => { - Log.showInfo(TAG, `onItemAdd mgr.getString, error: ${JSON.stringify(error)} value: ${JSON.stringify(value)}`) - if (error != null) { - return; - } - itemData.label = value; - mgr.getMediaBase64(itemData.abilityIconId, (error, value) => { - Log.showInfo(TAG, `onItemAdd mgr.getMediaBase64, error: ${JSON.stringify(error)} value: ${JSON.stringify(value)}`) - if (error != null) { - return; - } - itemData.iconUrl = value; - this.mListener?.addItem(itemData); - }); - }); - }) - .catch(e => { - Log.showInfo(TAG, `onItemAdd Resmgr.getResourceManager, e: ${JSON.stringify(e)}`) - }); - } - } - - onItemRemove(itemData) { - Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`) - this.mListener?.removeItem(itemData); - } - - initEmptyArea(emptyPosition: any, windowSize: any) { - Log.showInfo(TAG, `initEmptyArea, emptyPosition: ${JSON.stringify(emptyPosition)} windowSize: ${JSON.stringify(windowSize)}`) - this.mEmptyPosition = emptyPosition; - this.mMaxWidth = windowSize.width; - this.mMaxHeight = windowSize.height; - this.mStatusBarHeight = windowSize.statusBarHeight; - - const defaultRotation = 0; - let position: string = null; - if (emptyPosition && (emptyPosition.x1 != emptyPosition.x2 || emptyPosition.y1 != emptyPosition.y2)) { - position = this.calcEmptyAreaPosition(defaultRotation); - } - let res = { "position": position, "rotation": defaultRotation }; - Log.showInfo(TAG, `initEmptyArea, res: ${JSON.stringify(res)}`) - return res; - } - - calcEmptyAreaPosition(rotation: number): string{ - Log.showInfo(TAG, `calcEmptyAreaPosition, rotation: ${rotation}`) - - let statusBarLeftX1: number; - let statusBarLeftY1: number; - let statusBarLeftX2: number; - let statusBarLeftY2: number; - let statusBarRightX1: number; - let statusBarRightY1: number; - let statusBarRightX2: number; - let statusBarRightY2: number; - if (rotation == 0) { - statusBarLeftX1 = 0; - statusBarLeftY1 = 0; - statusBarLeftX2 = this.mMaxWidth / 2; - statusBarLeftY2 = this.mStatusBarHeight; - statusBarRightX1 = this.mMaxWidth / 2; - statusBarRightY1 = 0; - statusBarRightX2 = this.mMaxWidth; - statusBarRightY2 = this.mStatusBarHeight; - } else if (rotation == 90) { - statusBarLeftX1 = this.mMaxWidth - this.mStatusBarHeight; - statusBarLeftY1 = 0; - statusBarLeftX2 = this.mMaxWidth; - statusBarLeftY2 = this.mMaxHeight / 2; - statusBarRightX1 = this.mMaxWidth - this.mStatusBarHeight; - statusBarRightY1 = this.mMaxHeight / 2; - statusBarRightX2 = this.mMaxWidth; - statusBarRightY2 = this.mMaxHeight; - } else if (rotation == 180) { - statusBarLeftX1 = this.mMaxWidth / 2; - statusBarLeftY1 = this.mMaxHeight - this.mStatusBarHeight; - statusBarLeftX2 = this.mMaxWidth; - statusBarLeftY2 = this.mMaxHeight; - statusBarRightX1 = 0; - statusBarRightY1 = this.mMaxHeight - this.mStatusBarHeight; - statusBarRightX2 = this.mMaxWidth / 2; - statusBarRightY2 = this.mMaxHeight; - } else if (rotation == 270) { - statusBarLeftX1 = 0; - statusBarLeftY1 = this.mMaxHeight / 2; - statusBarLeftX2 = this.mStatusBarHeight; - statusBarLeftY2 = this.mMaxHeight; - statusBarRightX1 = 0; - statusBarRightY1 = 0; - statusBarRightX2 = this.mStatusBarHeight; - statusBarRightY2 = this.mMaxHeight / 2; - } else { - return null; - } - Log.showInfo(TAG, `calcEmptyAreaPosition, leftxy: ${statusBarLeftX1} ${statusBarLeftY1} ${statusBarLeftX2} ${statusBarLeftY2}`) - Log.showInfo(TAG, `calcEmptyAreaPosition, rightxy: ${statusBarRightX1} ${statusBarRightY1} ${statusBarRightX2} ${statusBarRightY2}`) - - let isGlandLeft = this.isEmptyAreaGlandStatusBar(statusBarLeftX1, statusBarLeftY1, statusBarLeftX2, statusBarLeftY2); - let isGlandRight = this.isEmptyAreaGlandStatusBar(statusBarRightX1, statusBarRightY1, statusBarRightX2, statusBarRightY2); - Log.showInfo(TAG, `calcEmptyAreaPosition, gland: ${isGlandLeft} ${isGlandRight}`) - if (isGlandLeft && isGlandRight) { - return Constants.EMPTY_AREA_POSITION_CENTER; - } else if (isGlandLeft) { - return Constants.EMPTY_AREA_POSITION_LEFT; - } else if (isGlandRight) { - return Constants.EMPTY_AREA_POSITION_RIGHT; - } else { - return null; - } - } - - isEmptyAreaGlandStatusBar(x1, y1, x2, y2): boolean{ - Log.showInfo(TAG, `isEmptyAreaGlandStatusBar, xy: ${x1} ${y1} ${x2} ${y2}`) - let ex1 = this.mEmptyPosition.x1; - let ey1 = this.mEmptyPosition.y1; - let ex2 = this.mEmptyPosition.x2; - let ey2 = this.mEmptyPosition.y2; - - if (ex1 >= x1 && ex1 <= x2 && ey1 >= y1 && ey1 <= y2) { - return true; - } else if (ex2 >= x1 && ex2 <= x2 && ey1 >= y1 && ey1 <= y2) { - return true; - } else if (ex1 >= x1 && ex1 <= x2 && ey2 >= y1 && ey2 <= y2) { - return true; - } else if (ex2 >= x1 && ex2 <= x2 && ey2 >= y1 && ey2 <= y2) { - return true; - } - return false; - } -} - -let statusBarService = new StatusBarService(); - -export default statusBarService as StatusBarService; \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ets b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ets deleted file mode 100644 index 14df9780..00000000 --- a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ets +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import Constants from '../common/Constants.ets'; -import StatusBarService from '../model/StatusBarService.ets'; - -export const StatusBarLayoutKey = "StatusBarLayout"; - -export const StatusBarEmptyWidthKey = "StatusBarEmptyWidth"; - -const TAG = 'StatusBarVM'; - -export class StatusBarVM { - mConfig: any; - mIsStart: boolean = false; - mStatusBarLayoutGroupTemplate: any[] = []; - mStatusBarLayout: any; - mStatusBarEmptyWidth: any; - - initViewModel(config, windowSize) { - if (this.mIsStart) { - return; - } - Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)} windowSize: ${JSON.stringify(windowSize)}`) - this.mIsStart = true; - this.mConfig = config; - - StatusBarService.registerListener({ - 'addItem': this.onItemAdd.bind(this), - 'removeItem': this.onItemRemove.bind(this), - 'onEmptyAreaChange': this.onEmptyAreaChange.bind(this) - }); - - let localSlotIds = this.parseConfig(config); - - let emptyAreaInfo = StatusBarService.initEmptyArea(config.emptyPosition, windowSize); - Log.showInfo(TAG, `initViewModel initEmptyArea.callback, emptyAreaInfo: ${JSON.stringify(emptyAreaInfo)}`) - if (emptyAreaInfo.position) { - this.updateStatusBarLayoutGroupTemplateOnEmptyAreaChange(emptyAreaInfo.position); - localSlotIds.push(Constants.EMPTY); - this.calcStatusBarEmptyWidth(emptyAreaInfo.rotation); - } - - this.calcStatusBarLayout(localSlotIds); - - let filterIds: string[] = []; - for (let metaIconKey of config.metaIconKeys) { - let includeFlg = false; - for (let components of this.mStatusBarLayoutGroupTemplate) { - if (components.indexOf(metaIconKey.metaIconId) >= 0) { - includeFlg = true; - break; - } - } - if (includeFlg) { - filterIds.push(metaIconKey.metaIconId); - } - } - StatusBarService.startService(filterIds); - } - - parseConfig(config) { - Log.showInfo(TAG, `parseConfig, config: ${JSON.stringify(config)}`) - - this.mStatusBarLayout = AppStorage.SetAndLink(StatusBarLayoutKey, [[], [], []]); - this.mStatusBarEmptyWidth = AppStorage.SetAndLink( - StatusBarEmptyWidthKey, config.emptyPosition.x2 - config.emptyPosition.x1); - Log.showInfo(TAG, - `parseConfig, statusBarLayout: ${JSON.stringify(this.mStatusBarLayout.get())}`) - Log.showInfo(TAG, - `parseConfig, statusBarEmptyWidth: ${JSON.stringify(this.mStatusBarEmptyWidth.get())}`) - - const groupIds = [Constants.GROUP_ID_LEFT, Constants.GROUP_ID_CENTER, Constants.GROUP_ID_RIGHT]; - for (const groupId of groupIds) { - for (const groupInfo of config.LayoutGroups) { - if (groupId == groupInfo.id) { - let components = []; - for (let component of groupInfo.Components) { - let componentId = component; - for (let metaIconKey of config.metaIconKeys) { - if (component == metaIconKey.layoutId) { - componentId = metaIconKey.metaIconId; - break; - } - } - components.push(componentId); - } - this.mStatusBarLayoutGroupTemplate.push(components); - } - } - } - Log.showInfo(TAG, - `parseConfig, statusBarLayoutGroupTemplate: ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`) - - let localSlotIds = []; - config.LocalSlots.forEach((name) => { - localSlotIds.push(name); - }); - Log.showInfo(TAG, `parseConfig, localSlotIds: ${JSON.stringify(localSlotIds)}`) - return localSlotIds; - } - - onItemAdd(itemData) { - Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`) - AppStorage.SetOrCreate(itemData.id, itemData); - let dispIds = this.getDispIds(); - if (dispIds.indexOf(itemData.id) < 0) { - dispIds.push(itemData.id); - this.calcStatusBarLayout(dispIds); - } - Log.showInfo(TAG, `onItemAdd, statusBarLayout: ${JSON.stringify(this.mStatusBarLayout.get())}`) - } - - onItemRemove(itemData) { - Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`) - let dispIds = this.getDispIds(); - if (dispIds.indexOf(itemData.id) >= 0) { - dispIds.splice(dispIds.indexOf(itemData.id), 1); - this.calcStatusBarLayout(dispIds); - } - Log.showInfo(TAG, `onItemRemove, statusBarLayout: ${JSON.stringify(this.mStatusBarLayout.get())}`) - } - - onEmptyAreaChange(position: string, rotation: number) { - Log.showInfo(TAG, `onEmptyAreaChange, position: ${position} rotation: ${rotation}`) - - this.updateStatusBarLayoutGroupTemplateOnEmptyAreaChange(position); - - let dispIds = this.getDispIds(); - if (dispIds.indexOf(Constants.EMPTY) >= 0) { - dispIds.splice(dispIds.indexOf(Constants.EMPTY), 1); - } - if (position == Constants.EMPTY_AREA_POSITION_LEFT) { - dispIds.push(Constants.EMPTY); - } else if (position == Constants.EMPTY_AREA_POSITION_CENTER) { - dispIds.push(Constants.EMPTY); - } else if (position == Constants.EMPTY_AREA_POSITION_RIGHT) { - dispIds.push(Constants.EMPTY); - } - Log.showInfo(TAG, - `onEmptyAreaChange, dispIds: ${JSON.stringify(dispIds)}`) - - this.calcStatusBarEmptyWidth(rotation); - - this.calcStatusBarLayout(dispIds); - } - - updateStatusBarLayoutGroupTemplateOnEmptyAreaChange(position: string) { - Log.showInfo(TAG, `updateStatusBarLayoutGroupTemplateOnEmptyAreaChange, position: ${position}`) - for (let i = 0;i < this.mStatusBarLayoutGroupTemplate.length; i++) { - let componentsTemplate = this.mStatusBarLayoutGroupTemplate[i]; - let index = componentsTemplate.indexOf(Constants.EMPTY); - if (index >= 0) { - componentsTemplate.splice(index, 1); - break; - } - } - Log.showInfo(TAG, `updateStatusBarLayoutGroupTemplateOnEmptyAreaChange, ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`) - - if (position == Constants.EMPTY_AREA_POSITION_LEFT) { - this.mStatusBarLayoutGroupTemplate[0].splice(0, 0, Constants.EMPTY); - } else if (position == Constants.EMPTY_AREA_POSITION_CENTER) { - this.mStatusBarLayoutGroupTemplate[1].splice(0, 0, Constants.EMPTY); - } else if (position == Constants.EMPTY_AREA_POSITION_RIGHT) { - this.mStatusBarLayoutGroupTemplate[2].push(Constants.EMPTY); - } - Log.showInfo(TAG, - `updateStatusBarLayoutGroupTemplateOnEmptyAreaChange, ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`) - } - - calcStatusBarEmptyWidth(rotation: number) { - Log.showInfo(TAG, `calcStatusBarEmptyWidth, rotation: ${rotation}`) - if (rotation == 0 || rotation == 180) { - this.mStatusBarEmptyWidth.set(this.mConfig.emptyPosition.x2 - this.mConfig.emptyPosition.x1); - } else { - this.mStatusBarEmptyWidth.set(this.mConfig.emptyPosition.y2 - this.mConfig.emptyPosition.y1); - } - Log.showInfo(TAG, - `calcStatusBarEmptyWidth, statusBarEmptyWidth: ${JSON.stringify(this.mStatusBarEmptyWidth.get())}`) - } - - calcStatusBarLayout(dispIds: string[]) { - Log.showInfo(TAG, `calcStatusBarLayout, dispIds: ${JSON.stringify(dispIds)}`) - - let statusBarLayout = []; - for (let i = 0;i < this.mStatusBarLayoutGroupTemplate.length; i++) { - let componentsTemplate = this.mStatusBarLayoutGroupTemplate[i]; - let components: string [] = []; - for (let componentTemplate of componentsTemplate) { - if (dispIds.indexOf(componentTemplate) >= 0) { - components.push(componentTemplate); - } - } - statusBarLayout.push(components); - } - Log.showInfo(TAG, `calcStatusBarLayout, statusBarLayout: ${JSON.stringify(statusBarLayout)}`) - - let statusBarLayoutCurrent = this.mStatusBarLayout.get(); - for (let i = 0;i < statusBarLayout.length; i++) { - if (JSON.stringify(statusBarLayout[i]) != JSON.stringify(statusBarLayoutCurrent[i])) { - statusBarLayoutCurrent[i] = statusBarLayout[i]; - } - } - Log.showInfo(TAG, `calcStatusBarLayout, statusBarLayoutCurrent: ${JSON.stringify(statusBarLayoutCurrent)}`) - } - - getDispIds(): string[] { - Log.showInfo(TAG, `getDispIds`) - let dispIds: string[] = []; - for (let ids of this.mStatusBarLayout.get()) { - for (let id of ids) { - dispIds.push(id); - } - } - Log.showInfo(TAG, `getDispIds, dispIds: ${JSON.stringify(dispIds)}`) - return dispIds; - } -} - -let statusBarVM = new StatusBarVM(); - -export default statusBarVM as StatusBarVM; \ No newline at end of file diff --git a/features/volumecomponent/src/main/ets/default/VolumeModel.ets b/features/volumecomponent/src/main/ets/default/VolumeModel.ets deleted file mode 100644 index 49a47cf7..00000000 --- a/features/volumecomponent/src/main/ets/default/VolumeModel.ets +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2021 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 audio from '@ohos.multimedia.audio'; -import Log from '../../../../../../common/src/main/ets/default/Log.ets'; -import settings from '@ohos.settings'; -import featureAbility from '@ohos.ability.featureAbility'; - -const SYSTEMUI_AUDIOVOLUMETYPE_MEDIA = 'settings.audio.media' -let TAG = 'Control-VolumeModel'; -var mVolumeValue = AppStorage.SetAndLink('VolumeValue', 5); - -export class VolumeModel { - helper: any - uri: string - - init(): void{ - Log.showInfo(TAG, 'init'); - this.uri = settings.getUri(SYSTEMUI_AUDIOVOLUMETYPE_MEDIA); - Log.showInfo(TAG, 'settings geturi of audio.AudioVolumeType.MEDIA is ' + this.uri); - this.helper = featureAbility.acquireDataAbilityHelper(this.uri); - this.getVolume(); - } - - registerVolume() { - this.helper.on("dataChange", this.uri, (err) => { - let data = settings.getValue(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, '5') - Log.showInfo(TAG, `after audio.AudioVolumeType.MEDIA datachange settings getValue ${parseInt(data)}`); - mVolumeValue.set(parseInt(data)); - }) - } - - unRegisterVolume() { - this.helper.off("dataChange", this.uri, (err) => { - Log.showInfo(TAG, `unregister audio.AudioVolumeType.MEDIA helper`); - }) - } - - setVolume(callback){ - Log.showInfo(TAG, 'setVolume'); - let value = parseInt(callback.value); - Log.showInfo(TAG, `setVolume ${value}`); - mVolumeValue.set(value); - Log.showInfo(TAG, `mVolumeValue setVolume ${value} end`); - settings.setValue(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, callback.value.toString()); - Log.showInfo(TAG, `settings setVolume ${callback.value} end`); - } - - getVolume() { - Log.showInfo(TAG, 'getVolume'); - let data = settings.getValue(this.helper, SYSTEMUI_AUDIOVOLUMETYPE_MEDIA, '5'); - Log.showInfo(TAG, `settings getVolume ${parseInt(data)}`); - mVolumeValue.set(parseInt(data)); - } - - getMaxVolume(callback, volumeType) { - Log.showInfo(TAG, `getMaxVolume volumeType:${volumeType} `); - audio.getAudioManager().getMaxVolume(volumeType, (err, value) => { - if (err) { - Log.showInfo(TAG, `Failed to obtain the volume. ${err.message}`); - return; - } - Log.showInfo(TAG, 'getMaxVolume Callback invoked to indicate that the volume is obtained.' + value); - callback.maxValue = value; - }) - } - - getMinVolume(callback, volumeType) { - Log.showInfo(TAG, `getMaxVolume volumeType:${volumeType} `); - audio.getAudioManager().getMinVolume(volumeType, (err, value) => { - if (err) { - Log.showInfo(TAG, `Failed to obtain the volume. ${err.message}`); - return; - } - Log.showInfo(TAG, 'getMinVolume Callback invoked to indicate that the volume is obtained.' + value); - callback.minValue = value; - }) - } -} - -let mVolumeModel = new VolumeModel(); - -export default mVolumeModel as VolumeModel; \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/common/constants.ets b/features/wificomponent/src/main/ets/default/common/constants.ets deleted file mode 100644 index 91072e3b..00000000 --- a/features/wificomponent/src/main/ets/default/common/constants.ets +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2021 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 default class constants { - static DEFAULT_WIFI_OPEN_STATUS: boolean = false; - static DEFAULT_WIFI_NAME: string = 'WLAN'; - static DEFAULT_WIFI_INFO: number = 0; - static DEFAULT_WIFI_STATUS: boolean = false; - static WIFI_SIGNAL_NO: number = 0; - static WIFI_SIGNAL_LOW: number = 1; - static WIFI_SIGNAL_MID: number = 2; - static WIFI_SIGNAL_HIGH: number = 3; - static WIFI_SIGNAL_FULL: number = 4; - static STATIC_BAR_ICON_WIDTH = 24; - static STATIC_BAR_ICON_HEIGHT = 24; -} - -export enum WifiState { - STATE_OFF = 0, - STATE_ON = 1, - STATE_TURNING_ON = 2, - STATE_TURNING_OFF = 3 -} - -export enum WifiConnectionState { - DISCONNECTED = 0, - CONNECTED = 1 -} diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ets b/features/wificomponent/src/main/ets/default/wifiModel.ets deleted file mode 100644 index a6526037..00000000 --- a/features/wificomponent/src/main/ets/default/wifiModel.ets +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2021 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 wifi from '@ohos.wifi'; -import {EventListener} from '@ohos.wifi'; -import Constants, {WifiState, WifiConnectionState} from './common/constants.ets' -import Log from "../../../../../../common/src/main/ets/default/Log.ets"; - -const TAG = 'WifiComponent-WifiModel'; - -var mWifiInfo; -var mWifiStatus; -var mWifiOpenStatus; -var mWifiName; - -export class WifiModel { - mIsStart: boolean = false; - mListener= null; - - initWifiModel() { - if (this.mIsStart) { - return; - } - Log.showInfo(TAG, `initWifiModel`) - this.mIsStart = true; - - mWifiInfo = AppStorage.SetAndLink("wifiInfo", Constants.DEFAULT_WIFI_INFO); - mWifiStatus = AppStorage.SetAndLink("wifiStatus", Constants.DEFAULT_WIFI_STATUS); - mWifiName = AppStorage.SetAndLink("wifiName", Constants.DEFAULT_WIFI_NAME) - mWifiOpenStatus = AppStorage.SetAndLink("wifiOpenStatus", Constants.DEFAULT_WIFI_OPEN_STATUS); - - this.getWifiInfo(); - - this.mListener = new EventListener(); - this.mListener.on('wifiStateChange', this.onWifiStateChange.bind(this)); - this.mListener.on('wifiConnectionChange', this.onWifiConnectionChange.bind(this)); - this.mListener.on('wifiRssiChange', this.onWifiRssiChange.bind(this)); - } - - uninitWifiModel() { - if (!this.mIsStart) { - return; - } - Log.showInfo(TAG, `uninitWifiModel`) - this.mIsStart = false; - - this.mListener.off('wifiRssiChange', (data) => { - Log.showInfo(TAG, `uninitWifiModel->wifiRssiChange, data: ${JSON.stringify(data)}`) - }); - this.mListener.off('wifiConnectionChange', (data) => { - Log.showInfo(TAG, `uninitWifiModel->wifiConnectionChange, data: ${JSON.stringify(data)}`) - }); - this.mListener.off('wifiStateChange', (data) => { - Log.showInfo(TAG, `uninitWifiModel->wifiStateChange, data: ${JSON.stringify(data)}`) - }); - this.mListener = null; - mWifiOpenStatus.set(Constants.DEFAULT_WIFI_OPEN_STATUS); - this.setDisconnectedStatus(); - } - - onWifiStateChange(data) { - Log.showInfo(TAG, `onWifiStateChange, data: ${JSON.stringify(data)}`) - - let isWifiInactive = data == WifiState.STATE_OFF; - mWifiOpenStatus.set(!isWifiInactive); - if (!isWifiInactive) { - this.getWifiConnectInfo(); - } else { - this.setDisconnectedStatus(); - } - } - - onWifiConnectionChange(data) { - Log.showInfo(TAG, `onWifiConnectionChange, data: ${JSON.stringify(data)}`) - - if (data == WifiConnectionState.CONNECTED) { - this.getLinkedInfo(); - } else { - this.setDisconnectedStatus(); - } - } - - onWifiRssiChange(data) { - Log.showInfo(TAG, `onWifiRssiChange, data: ${JSON.stringify(data)}`) - this.getLinkedInfo(); - } - - getWifiInfo() { - Log.showInfo(TAG, `getWifiInfo`) - let isWifiActive = wifi.isWifiActive(); - Log.showInfo(TAG, `getWifiInfo, isWifiActive: ${isWifiActive}`) - mWifiOpenStatus.set(isWifiActive); - if (isWifiActive) { - this.getWifiConnectInfo(); - } else { - this.setDisconnectedStatus(); - } - } - - getWifiConnectInfo() { - Log.showInfo(TAG, `getWifiConnectInfo`) - let isConnected = wifi.isConnected(); - Log.showInfo(TAG, `getWifiConnectInfo, isConnected: ${isConnected}`) - if (isConnected) { - mWifiStatus.set(true); - this.getLinkedInfo(); - } else { - this.setDisconnectedStatus(); - } - } - - getLinkedInfo() { - Log.showInfo(TAG, `getLinkedInfo`) - wifi.getLinkedInfo((data) => { - Log.showInfo(TAG, `getLinkedInfo, data: ${JSON.stringify(data)}`) - if (data.connState == wifi.ConnState.CONNECTED) { - mWifiName.set(data.ssid); - let signalLevel = wifi.getSignalLevel(data.rssi, data.band); - Log.showInfo(TAG, `getLinkedInfo, signalLevel: ${signalLevel}`) - mWifiInfo.set(signalLevel); - } else { - this.setDisconnectedStatus(); - } - }); - } - - setDisconnectedStatus() { - Log.showInfo(TAG, `setDisconnectedStatus`) - mWifiStatus.set(Constants.DEFAULT_WIFI_STATUS); - mWifiInfo.set(Constants.DEFAULT_WIFI_INFO); - mWifiName.set(Constants.DEFAULT_WIFI_NAME); - } - - enableWifi() { - Log.showInfo(TAG, 'enableWifi'); - let result = wifi.enableWifi(); - Log.showInfo(TAG, `enableWifi, result: ${result}`); - } - - disableWifi() { - Log.showInfo(TAG, 'disableWifi'); - let result = wifi.disableWifi(); - Log.showInfo(TAG, `disableWifi, result: ${result}`); - } -} - -let mWifiModel = new WifiModel(); - -export default mWifiModel as WifiModel; \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.png b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.png deleted file mode 100644 index f6be54757910150fd87177a70b7cbff6c8a8e360..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1054 zcmV+(1mXLMP)Px&*hxe|RA>e5m)ma*Q51(;chU;#7DTI3w;;iTC-Er$0spFa7B3R_OGG18DN+aM=8W}4l7_RN_%r=^uy$**V6zO4INd$*^jp~eG^2O1AF9%wwUf<4f?7`o5S&i2D+ z2k>`&fOU+eZ{TZy4~$>;_V)VQ6?J3)3a>%xE}+t41L%alaOic0Neuc?mq{%HP<$-{ z4rIu^TUTb$exo!dFywpDrg*-R0VuAAhrtk74cgH!HsopJUeij0SNYL~ezN`)Ji!pt zu9Vsufb#p`Z~~Y%DN^7RFcsc_&qW^0BDj$~+kvS!0E!$U-@EXd;J1(p4M3O*tGEWF zXp%`oK7|lHUYn3%L^NUu>;@^)fP2VD)<@C+7;oj!X|O55@db0EFq}@Tbv%X4%^V&9 zdlF1OF?SQ0@8h)=12RVE*cj)lhi}8A>(&=55q=}TkMC1pOE}NiC|`{om&$8%Ggkfy zbB{P&nkt!aQ^KOp?*oSOcYtlvl>6vpid=)wHP()RgTWqkQnv+>PZ{uvO&<1uUEmf> zEzl$(%!0H|WUk_Ei8FcspMbZ8zkrz2Q4iUtT%(~goKv?2)RIE3a?sp2C-qiKPiEb7 zJApZCy>vtGIBZSX6j}&b-aSTjnmse|hNJ=Urtlkvwm}PgTR6W6;_5+L5h{j~Y7>y@W-*pVQ2!pWb=L(IvafCUpO&DSn2EkDf-pD`TdASP1 zP@#7FO^ZD5y$fz2#NUo7Gkgp~>_lfkf5uE%m8ebxY-K~hJRL`PGF?zcp60sBcxD#( zu+vyOiQg^6IU`^+tgol+Yx|IsNo51vTt+Bh>m3GrLD5rNL!JX)nzgzOXOh&l0hz}~ z;BJvu|XU&*9x_c}%-Uz#Q7=9lUe@%*7+V7kQ0 z>)lB(_rF25*H-D1V;2aWHo&($#z9BatpVR7sa`-23i5l5h-t_%5I&h>9udp(&(Is? zI}@u}{(Bi2g%>D3k=WKU#W^2;8sYQ7f=+g(mV^J}L{||gb4V5)yOZQ=bLDs$<&T5= zAScJi|Jbt3|DxyyFq&%~{5n_ZAD(||B1)bQl#Ykz7hAd1o4i{YeI*Ra)=G~3#U)%m z0H$NtXLDX$%b!s85|{~$aC~VgG+)X#I*7s-GNrH3Mmv5kEQR3>&&C6d2O1AF9+>mM YZ%5XX0CwHeR{#J207*qoM6N<$f{IY=fdBvi diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.png b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.png deleted file mode 100644 index e3c5d4fcba24ad80a1283c185a3cd2bcd8f07bbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1043 zcmV+u1nm2XP)Px&%}GQ-RA>e5m&n&<3LD4-5RV z(OQ+20$!t+2>Q+ZC>SOXm0d%M3;^f%qTvKk*|UE@4MDKr3#$zeIJ09;gssV$$vh%%m-u%R7M5Zz!maFGIdiw$RgI0HcOR)kK2 zO%9D8;0>X$=9o*(!scd#4}(1pB|qT3z~)zbE)amH=qwBEdX?}ilw>~oY$wcj?052h z3T!d?jJ3;8?Zmn2TD56AKMe0Z!VOEsGp>?Q)BE=U!-YFQ$EHf|yO=K09D1HHcMKdd z*2pLMwrJ;F0Zgz+!V=Ia@DinJP$ywb4XHknaycGJ$oS{~IJ(vNiwK?)HOM;I)ov&m z;>ou~6euChBB^-C7|g0Ol@heCj`rMpMFT4T+$y}%iOy~un= zp^iZ{_%@T@gz;x|s8MH<=t>j-&g+CY36vF^w8gp)w9Tqh|J#S*LO*C%wR6g--Dj{0 z+U?f_@lh{vD0Toie*}d`9ZHokHTf8Zb@@aRx^#J!ftpl1YLgC(A)D!XPZGc-6qrr_ zuhHODFs5;0A`tDuesCO^H}X6>AH-2;Iux~DW#QMo?t zu_(z7=qT$3s?!R_o#lcv(y2b_0jl>pP+trJ)wkXQgq(IjyP^IXWnJWlTtG<{1`d?L zEieJXsLI4`5cYkQ#f5aTIMW7hfH@GCW?6U>n024dfh9_-0Ph_vpO8s5l_l0?)IWSy|8fFSGhu73pi!dH(;OUSYpD-vizOpETCRw(IxLXYvf>8OSq`XJDB!@E4hkVaAza+eiQa N002ovPDHLkV1in9-}nFk diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.png b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.png deleted file mode 100644 index 3b126bc67ed9ff2df66034657eba6047b3826b69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1016 zcmVPx&vPnciRA>e5n9EC5K^(`undPIRu!lsN6;hE!wJ#%xpxPNi5v_tiY1yU-`VVT= zLRz(o7D0;^5)>+KOEaVpNqd2s7?zp#xP88KE=+T0yyx6|yjU$s0om`D!daK zp&W9_9|mN$jmBzQX~HXXlS6*fKMEsEMB8pr$vFX%--d_%pl#z41)KtHh0ieOt6;E# zRgBpP+IqF%D~SBQ#McL|Uhz(VU`kktYXUAAN2w*BB8Vy;S%{$((Igt74qT!M3=+fn zd^jh7;|&-chH8h$Pw0kmIOFKcTSd%u7&pOIhm%=!&x!fP?#r4$;OGbg?foj_ew-A1 z^w~+6_rzbr{UKOy>S=40d+oxx_OvoRr&tEAN_sg2`A0It5oRHz}wDXvySr zCAQE*yQAQHlE3aL`55{Ra3$o7tFh1yqu`QjPQyZ!M47fCedqoPIG>X+v1ALH{4AKF zm55jH-fKh{q`fb$2>99y1BUd!db#N`8)v4px=Vb@4yi4 z0qk_2CD`exybOB2?l8`KbY~gIp&)?|C!BQT&}_u-<)4(bv>tcna@=js~vB;S`u(a>uxr zkGoKOp?a-W=^t?K{WVn|+_!96i=TNAkwo-PbQK=Kg|LY*_IzL?+t4RrSpUmv+>*^c zsBBYE4Sm5m&;OFF7RfimE69l2`e7@5A<;@0&SY*}rOWppV8xp_NwyeC+fBVj$13`4 zj9c_k?vus(d^W|^Q}SAvu}dH5^gp1|7m{rQeJ^B0?Y5=Jd?}C7?If(vM@bjQ=-9tz m@;9kKQh}rbNd-!%0)GKa~60+7BevL9R^{>w;^3X z&tcIc38B^<9WJX2SbJUOI4-=R?dq7gXZz<9H|CyL=e05ZQ|h<+|7YgkRMpV3nV zx}zc3^^8>kYjoGA=EK<@@49B>=A@)`?U}M=*@1(W(3wAXhqV%sM z<);f5H`OeQzHv>={)WIo?mrH>N8z90L;+t&5DvDvqxncelwvtDnm{r-UW|#=MI2 diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.png b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.png deleted file mode 100644 index c9a373a1c19759a434c052134c9a90c8a4ba41e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 zcmV;v13~Px&cu7P-RA>e5m`z9(Q547D%RVd%4C!N$wh9Y1f@l}LC@iSJg(38@3<9HewJ3uY zEs7SkY9X~~RkY{}Txd|J1Vx)fiONk%5$ZyUQY-59``e5R^X@$Fo0<1`!u;Xq+`0Fh zbI%-S?wxt5RHCE;Nd=M$Bo#<1uz)L&jwAPMHoKWP`=All!CKFeW@;S9JjWs0J?V7% z9mhxtbpa&2f>~Rj*PBi|tDLXL&L0-RUD zoq*_n>3;-!VQJV&nShrYYeR8T+*V`4Tsu{DQZAL!U_ z5hj(wP`82Uetkv1mdm1wIqKmh_%%&OPT>|CveDAG%+sHxeGNKT=6-wnbDB(0PvLPG*_(&7_CwG%N`lSH7T&{{ddZvYVW0 z3;QlZ`bGF?UEvnhOn9Jx!rqt)7)Xg$F^1qqR07*qoM6N<$g2$b`lmGw# diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.png b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.png deleted file mode 100644 index 9811a1815ae3446594fd6656e65097e34cb89226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1087 zcmV-F1i<@=P)Px&`AI}URA>e5m~C$iQ546!o}VfxDhO4nr-TG)yz&8jVjn=fk)Q|>P19DYQdOi> z(XxKOn%zwA+?k!(-A2fq;c`-Hx?}>Siqt6szNF`fZ;n) za4tbBx>a@N@tdV-fg@{qOyPJb2Qb_SkAe}f9dx2!Fto}>Udu{{xB1e6elkA;rf|fv zE2NGNVEkz$Tm_a*j8wP;EQR-AH7|lm2KT~q6j*vgATJ=weTu9(esd|;0hDR5hU-9# z78o?;ODHkol?feYL?=eT2@oS4c!rK>e?%QX@L?9+0Q({m=NX$s;BsWH>mhU=Wbqg{ z842aRT^1U!{vAVW4L*u6y zd&%O$Qc09s5;lG7Jm9f?2Doina$g*bk#oqo&)g+&KE2i|r{lg$$v~v&XD1!}B#{h&m85rQZ?gHfVz%Nsss8`2#X+)YU4oDmj4h z?hx02Q3=Tudmfl(>$G+E;j!HhX4T9Y(Xh`L8Zg^WaN?~mWvH|R7=HnQ7b8NAm`(l~ z#U4H#30WRqXMjy=MniJLm<$JF?^PVQgMf6?Z!{WXvncbqGU13>I14U=^ohKV%)4a- zrVZ-EZ&|eJ-m~B#O8o7b633@;#GU9S7)*qzs}xnqfLqxJuuf-D9xWG)QKq%7F|KI> zFLpZXPU3rpSZ4;zhW#}IU&o7_LP|Rza}i;HTkj}11@f-iI`Rg1)2y`HuqH}9JCHErY$_PXjzow&6 z%o&+Y>fgi2EX-s0T!bw%#5ym3I^p%fhK}w`nT7x3Ku;Mc3P_Tj{Rz*?Rz-PB9Kd)F zGEY{&t|UKTJh@Asup6sN{E6KNODxN0!FW&9anLeeW}nBCIp6z6eRlxM{J`;44#}}z zKYl`)(K~sDsp3HTRv9iWnhSYLy>CSZ{6vgh^c-`puhe%3XjCt36CnMK;Isddajvhl zCA*Lo(y-RN|EZAtS9<1y{LfVVw~jy^fjRH -- Gitee From 780844b2ef73801bf8c4e94708fc2b2333bee28d Mon Sep 17 00:00:00 2001 From: r00498791 Date: Mon, 11 Apr 2022 13:01:36 +0800 Subject: [PATCH 059/373] update signature Signed-off-by: r00498791 --- signature/systemui.p7b | Bin 3436 -> 3637 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/signature/systemui.p7b b/signature/systemui.p7b index 7a68d3ce4b72d244c2e68b8348286bb6f5fbf667..2db090e729d460597b7fdec2868b12aba27532e6 100644 GIT binary patch delta 424 zcmaDOwN=K!po!0rjZ>@5qwPB{BRkWACO##gkQ@^uqam*WHydX{n+IbmGYb==K@;mG zghIvzO{|AmnppR5blA*NpO~CetYlTKl$eu~U!Izx3*kpAlLIHUU?}kP3vmr{bPkDkbPn^3G(;xaSc+6 z-TZ;&4ST(bfw`fvfvKTolz~3n!<;OJN-PRdwOcA|I_}jkE?E6J>Sdf}%%j~(7Ky7o z>sLG!eDz4<6SCfT^lBpZt=tJOX#I_m*dXQdj@5qwPB{BRkWACf-P(P$&~4qam*WHydX{n+IbmGYb==K@%${ zLLuXVCYE0;O)TFwI&5ayyodEAd%cmNse!qnk&#)Hfj(RzCySvHi$d(vS%y_Xv6;O~ z)-de~Hum7F3$S3FHtEn>p-n3%ocQs>fQyX-=!A2&EX+(S?gp+*3Z*rEF_l{q7L_Od zU7WG5yu79|sjB9nfrXg3=7E1jx_wNF3@eszC~enlI$9wSZ+e4AO7QMitD}>5q(&?$ M{dgejZD#Ch0P7!4hyVZp -- Gitee From ec8944a7b3a548d9bc8c2a20a1a31c8819dea988 Mon Sep 17 00:00:00 2001 From: zhuchengfeng <940848916@qq.com> Date: Mon, 11 Apr 2022 14:46:45 +0800 Subject: [PATCH 060/373] update Signed-off-by: zhuchengfeng <940848916@qq.com> --- .gitignore | 4 +- OAT.xml | 2 - README_zh.md | 27 +- ...CheckEmptyUtils.ets => CheckEmptyUtils.ts} | 2 +- common/src/main/ets/default/Constants.ts | 32 ++ .../{DateTimeCommon.ets => DateTimeCommon.ts} | 2 +- common/src/main/ets/default/Decorators.ts | 45 +++ .../src/main/ets/default/{Log.ets => Log.ts} | 25 +- .../{ReadConfigUtil.ets => ReadConfigUtil.ts} | 4 +- ...reenLockCommon.ets => ScreenLockCommon.ts} | 8 +- .../src/main/ets/default/ScreenLockManager.ts | 63 ++++ .../main/ets/default/SingleInstanceHelper.ts | 36 ++ .../main/ets/default/StyleConfiguration.ts | 32 ++ common/src/main/ets/default/StyleManager.ts | 41 ++ .../src/main/ets/default/SwitchUserManager.ts | 107 ++++++ common/src/main/ets/default/TimeManager.ts | 120 ++++++ common/src/main/ets/default/WindowManager.ets | 87 ----- common/src/main/ets/default/WindowManager.ts | 130 +++++++ .../default/abilitymanager/abilityManager.ts | 68 ++++ .../default/abilitymanager/bundleManager.ts | 50 +-- ...tyManager.ets => featureAbilityManager.ts} | 6 +- ...tionManager.ets => notificationManager.ts} | 14 +- .../default/commonEvent/CommonEventManager.ts | 97 +++++ common/src/main/ets/default/event/EventBus.ts | 76 ++++ .../main/ets/default/event/EventManager.ts | 92 +++++ .../src/main/ets/default/event/EventUtil.ts | 81 ++++ entry/src/main/ets/AbilityStage.ts | 2 +- .../src/main/ets/default/batteryModel.ets | 152 -------- .../src/main/ets/default/batteryModel.ts | 99 +++++ .../ets/default/common/StyleConfiguration.ts | 49 +++ .../src/main/ets/default/common/constants.ets | 48 --- .../src/main/ets/default/common/constants.ts | 19 + .../main/ets/default/pages/batteryIcon.ets | 47 ++- .../src/main/ets/default/pages/batteryPic.ets | 56 +-- .../src/main/ets/default/pages/batterySoc.ets | 17 +- .../main/resources/base/element/color.json | 16 +- .../main/resources/base/element/float.json | 40 +- features/clockcomponent/.gitignore | 1 + .../build.gradle | 0 features/clockcomponent/src/main/config.json | 23 ++ .../src/main/ets/default/app.ets} | 14 +- .../ets/default/common/StyleConfiguration.ts | 29 ++ .../src/main/ets/default/pages/clockIcon.ets | 63 ++++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/float.json | 8 + .../main/resources/base/element/string.json | 12 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 12 + .../main/resources/zh_CN/element/string.json | 12 + .../ets/com/ohos/view/component/dateTime.ets | 18 +- .../main/ets/com/ohos/vm/dateTimeViewModel.ts | 88 ++--- .../main/resources/base/element/float.json | 7 +- features/noticeitem/build.gradle | 1 - .../com/ohos/noticeItem/common/CommonUtil.ts | 42 +++ .../noticeItem/common/ScrollbarManager.ts | 50 +++ .../common/{constants.ets => constants.ts} | 80 +++- .../com/ohos/noticeItem/item/basicItem.ets | 41 -- .../com/ohos/noticeItem/item/multiItem.ets | 52 --- .../ohos/noticeItem/item/notificationItem.ets | 224 ----------- .../com/ohos/noticeItem/item/titleItem.ets | 89 ----- ...cationConfig.ets => NotificationConfig.ts} | 38 +- .../model/NotificationDistributionManager.ts | 87 +++++ ...tionManager.ets => NotificationManager.ts} | 120 +++++- ...tionService.ets => NotificationService.ts} | 153 ++++---- .../model/NotificationWindowManager.ts | 35 ++ .../ohos/noticeItem/model/ParseDataUtil.ets | 164 -------- .../ohos/noticeItem/model/ParseDataUtil.ts | 176 +++++++++ .../noticeItem/model/rule/RuleController.ets | 119 ------ .../noticeItem/model/rule/RuleController.ts | 150 ++++++++ .../view/NotificationListComponent.ets | 62 ++- .../noticeItem/view/item/actionComponent.ets | 115 ++++++ .../view/item/bannerNotificationItem.ets | 272 +++++++++++++ .../ohos/noticeItem/view/item/basicItem.ets | 34 +- .../noticeItem/view/item/confirmDialog.ets | 20 +- .../ohos/noticeItem/view/item/customItem.ets | 79 ++++ .../noticeItem/view/item/devicesDialog.ets | 91 +++++ .../ohos/noticeItem/view/item/generalItem.ets | 144 +++++++ .../ohos/noticeItem/view/item/groupItem.ets | 193 ++++++++++ .../view/item/iconListComponent.ets | 111 ++++++ .../ohos/noticeItem/view/item/longItem.ets | 30 +- .../ohos/noticeItem/view/item/multiItem.ets | 38 +- .../noticeItem/view/item/notificationItem.ets | 280 +++++--------- .../item/pictureItem.ets} | 40 +- .../noticeItem/view/item/settingDialog.ets | 49 ++- .../ohos/noticeItem/view/item/titleItem.ets | 82 ++-- .../viewmodel/{ViewModel.ets => ViewModel.ts} | 289 +++++++++----- .../main/resources/base/element/color.json | 22 +- .../main/resources/base/element/float.json | 84 ++++- .../main/resources/base/element/string.json | 16 + .../src/main/resources/base/media/delete.png | Bin 4061 -> 0 bytes .../main/resources/base/media/ic_close.svg | 1 + .../base/media/ic_public_delete_filled.svg | 13 + .../base/media/ic_public_settings_filled.svg | 13 + .../main/resources/base/media/ic_setting.png | Bin 2788 -> 0 bytes .../src/main/resources/base/media/send.svg | 16 + .../main/resources/en_US/element/string.json | 16 + .../main/resources/zh_CN/element/string.json | 16 + .../NotificationService.ets | 357 ------------------ .../main/resources/base/element/string.json | 8 - features/screenlock/build.gradle | 4 + .../main/ets/com/ohos/common/constants.ets | 5 + .../ohos/data/{userData.ets => userData.ts} | 6 +- .../main/ets/com/ohos/model/accountsModel.ets | 103 ----- .../main/ets/com/ohos/model/accountsModel.ts | 229 +++++++++++ .../ets/com/ohos/model/screenLockModel.ets | 194 ---------- .../ets/com/ohos/model/screenLockModel.ts | 69 ++++ .../ets/com/ohos/model/screenLockService.ets | 232 ------------ .../ets/com/ohos/model/screenLockService.ts | 328 ++++++++++++++++ ...screenlockStyle.ets => screenlockStyle.ts} | 50 +-- .../ets/com/ohos/view/component/accounts.ets | 31 +- .../com/ohos/view/component/batterySoc.ets | 26 +- .../ets/com/ohos/view/component/customPSD.ets | 76 ++-- .../com/ohos/view/component/digitalPSD.ets | 21 +- .../ets/com/ohos/view/component/lockIcon.ets | 16 +- .../ets/com/ohos/view/component/mixedPSD.ets | 17 +- .../com/ohos/view/component/numkeyBoard.ets | 46 +-- .../ets/com/ohos/view/component/statusBar.ets | 30 +- .../src/main/ets/com/ohos/vm/StatusBarVM.ts | 54 +++ ...untsViewModel.ets => accountsViewModel.ts} | 23 +- .../main/ets/com/ohos/vm/baseViewModel.ets | 108 ------ .../src/main/ets/com/ohos/vm/baseViewModel.ts | 120 ++++++ .../ets/com/ohos/vm/batterySocViewModel.ets | 2 +- .../ets/com/ohos/vm/customPSDViewModel.ets | 100 ----- .../ets/com/ohos/vm/customPSDViewModel.ts | 98 +++++ .../main/ets/com/ohos/vm/dateTimeViewModel.ts | 72 ++++ .../ets/com/ohos/vm/digitalPSDViewModel.ets | 96 ----- .../ets/com/ohos/vm/digitalPSDViewModel.ts | 99 +++++ ...IconViewModel.ets => lockIconViewModel.ts} | 66 ++-- ...dPSDViewModel.ets => mixedPSDViewModel.ts} | 10 +- .../main/resources/base/element/float.json | 11 +- .../main/resources/base/element/string.json | 20 + .../resources/base/media/ic_hollow_dot.svg | 13 + .../resources/base/media/ic_solid_dot.svg | 13 + .../main/resources/en_US/element/string.json | 20 + .../main/resources/zh_CN/element/string.json | 23 +- .../src/main/ets/com/ohos/common/constants.ts | 1 + .../ets/com/ohos/view/component/shortcut.ets | 14 +- .../main/ets/com/ohos/vm/shortcutViewModel.ts | 2 +- .../main/resources/base/element/float.json | 8 + features/signalcomponent/.gitignore | 1 + features/signalcomponent/build.gradle | 19 + features/signalcomponent/src/main/config.json | 23 ++ .../src/main/ets/default/app.ets | 23 ++ .../ets/default/common/StyleConfiguration.ts | 35 ++ .../src/main/ets/default/common/constants.ts} | 45 +-- .../src/main/ets/default/pages/signalIcon.ets | 168 +++++++++ .../src/main/ets/default/signalModel.ts | 155 ++++++++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/float.json | 28 ++ .../main/resources/base/element/string.json | 48 +++ .../base/media/ic_statusbar_signal_1.svg | 6 + .../base/media/ic_statusbar_signal_2.svg | 6 + .../base/media/ic_statusbar_signal_3.svg | 6 + .../base/media/ic_statusbar_signal_4.svg | 6 + .../base/media/ic_statusbar_signal_full.svg | 5 + .../base/media/ic_statusbar_signal_no.svg | 5 + .../media/ic_statusbar_signal_roaming.png | Bin 0 -> 411 bytes .../base/media/ic_statusbar_signal_wait.png | Bin 0 -> 442 bytes .../base/media/ic_statusbar_wifi_connect.png | Bin 0 -> 331 bytes .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/en_US/element/string.json | 48 +++ .../main/resources/zh_CN/element/string.json | 47 +++ .../ets/com/ohos/view/component/wallpaper.ets | 5 +- .../ets/com/ohos/vm/wallpaperViewModel.ts | 3 +- features/wificomponent/.gitignore | 1 + features/wificomponent/build.gradle | 19 + .../src/main/config.json | 10 +- .../src/main/ets/default/app.ets | 23 ++ .../ets/default/common/StyleConfiguration.ts | 29 +- .../src/main/ets/default/common/constants.ts | 38 ++ .../src/main/ets/default/pages/wifiIcon.ets | 86 +++++ .../src/main/ets/default/wifiModel.ts | 159 ++++++++ .../main/resources/base/element/float.json | 11 + .../base/media/ic_statusbar_wifi_1.svg | 12 + .../base/media/ic_statusbar_wifi_2.svg | 12 + .../base/media/ic_statusbar_wifi_3.svg | 12 + .../base/media/ic_statusbar_wifi_full.svg | 12 + .../base/media/ic_statusbar_wifi_no.svg | 12 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes product/pc/src/main/config.json | 48 ++- product/pc/src/main/ets/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 60 ++- .../pc/src/main/ets/ServiceExtAbility/app.ets | 2 +- .../common/StyleConfiguration.ts | 29 ++ .../ServiceExtAbility/common/StyleManager.ts | 113 ++++++ .../common/{constants.ets => constants.ts} | 7 + .../pages/customPassword.ets | 30 +- .../pages/customscreenlock.ets | 3 +- .../pages/digitalPassword.ets | 29 +- .../ets/ServiceExtAbility/pages/index.ets | 40 +- .../pages/journalscreenlock.ets | 3 +- .../ServiceExtAbility/pages/mixedPassword.ets | 17 +- .../pages/slidescreenlock.ets | 87 ++++- .../{indexViewModel.ets => indexViewModel.ts} | 59 +-- .../vm/slideScreenLockViewModel.ts} | 105 ++++-- .../main/resources/base/element/color.json | 4 + .../main/resources/base/element/float.json | 38 +- product/phone/src/main/config.json | 51 ++- product/phone/src/main/ets/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 60 ++- .../src/main/ets/ServiceExtAbility/app.ets | 2 +- .../common/StyleConfiguration.ts | 29 ++ .../ServiceExtAbility/common/StyleManager.ts | 51 +++ .../common/{constants.ets => constants.ts} | 5 +- .../pages/customPassword.ets | 60 +++ .../pages/customscreenlock.ets | 3 +- .../pages/digitalPassword.ets | 17 +- .../ets/ServiceExtAbility/pages/index.ets | 41 +- .../pages/journalscreenlock.ets | 3 +- .../ServiceExtAbility/pages/mixedPassword.ets | 17 +- .../pages/slidescreenlock.ets | 77 +++- .../{indexViewModel.ets => indexViewModel.ts} | 14 +- .../vm/slideScreenLockViewModel.ts} | 106 ++++-- .../main/resources/base/element/float.json | 8 + settings.gradle | 5 +- 215 files changed, 7572 insertions(+), 3440 deletions(-) rename common/src/main/ets/default/{CheckEmptyUtils.ets => CheckEmptyUtils.ts} (96%) create mode 100644 common/src/main/ets/default/Constants.ts rename common/src/main/ets/default/{DateTimeCommon.ets => DateTimeCommon.ts} (97%) create mode 100644 common/src/main/ets/default/Decorators.ts rename common/src/main/ets/default/{Log.ets => Log.ts} (63%) rename common/src/main/ets/default/{ReadConfigUtil.ets => ReadConfigUtil.ts} (95%) rename common/src/main/ets/default/{ScreenLockCommon.ets => ScreenLockCommon.ts} (91%) create mode 100644 common/src/main/ets/default/ScreenLockManager.ts create mode 100644 common/src/main/ets/default/SingleInstanceHelper.ts create mode 100644 common/src/main/ets/default/StyleConfiguration.ts create mode 100644 common/src/main/ets/default/StyleManager.ts create mode 100644 common/src/main/ets/default/SwitchUserManager.ts create mode 100644 common/src/main/ets/default/TimeManager.ts delete mode 100644 common/src/main/ets/default/WindowManager.ets create mode 100644 common/src/main/ets/default/WindowManager.ts create mode 100644 common/src/main/ets/default/abilitymanager/abilityManager.ts rename features/batterycomponent/src/main/ets/com/ohos/common/constants.ets => common/src/main/ets/default/abilitymanager/bundleManager.ts (36%) rename common/src/main/ets/default/abilitymanager/{featureAbilityManager.ets => featureAbilityManager.ts} (94%) rename common/src/main/ets/default/abilitymanager/{notificationManager.ets => notificationManager.ts} (80%) create mode 100644 common/src/main/ets/default/commonEvent/CommonEventManager.ts create mode 100644 common/src/main/ets/default/event/EventBus.ts create mode 100644 common/src/main/ets/default/event/EventManager.ts create mode 100644 common/src/main/ets/default/event/EventUtil.ts delete mode 100644 features/batterycomponent/src/main/ets/default/batteryModel.ets create mode 100644 features/batterycomponent/src/main/ets/default/batteryModel.ts create mode 100644 features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts delete mode 100644 features/batterycomponent/src/main/ets/default/common/constants.ets create mode 100644 features/batterycomponent/src/main/ets/default/common/constants.ts create mode 100644 features/clockcomponent/.gitignore rename features/{notificationservice => clockcomponent}/build.gradle (100%) create mode 100644 features/clockcomponent/src/main/config.json rename features/{noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets => clockcomponent/src/main/ets/default/app.ets} (80%) create mode 100644 features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts create mode 100644 features/clockcomponent/src/main/ets/default/pages/clockIcon.ets create mode 100644 features/clockcomponent/src/main/resources/base/element/color.json create mode 100644 features/clockcomponent/src/main/resources/base/element/float.json create mode 100644 features/clockcomponent/src/main/resources/base/element/string.json create mode 100644 features/clockcomponent/src/main/resources/base/media/icon.png create mode 100644 features/clockcomponent/src/main/resources/en_US/element/string.json create mode 100644 features/clockcomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts rename features/noticeitem/src/main/ets/com/ohos/noticeItem/common/{constants.ets => constants.ts} (50%) delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets rename features/noticeitem/src/main/ets/com/ohos/noticeItem/model/{NotificationConfig.ets => NotificationConfig.ts} (46%) create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts rename features/noticeitem/src/main/ets/com/ohos/noticeItem/model/{NotificationManager.ets => NotificationManager.ts} (30%) rename features/noticeitem/src/main/ets/com/ohos/noticeItem/model/{NotificationService.ets => NotificationService.ts} (31%) create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts delete mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets rename features/noticeitem/src/main/ets/com/ohos/noticeItem/{item/longItem.ets => view/item/pictureItem.ets} (45%) rename features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/{ViewModel.ets => ViewModel.ts} (46%) delete mode 100644 features/noticeitem/src/main/resources/base/media/delete.png create mode 100644 features/noticeitem/src/main/resources/base/media/ic_close.svg create mode 100644 features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg create mode 100644 features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg delete mode 100644 features/noticeitem/src/main/resources/base/media/ic_setting.png create mode 100644 features/noticeitem/src/main/resources/base/media/send.svg delete mode 100644 features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets delete mode 100644 features/notificationservice/src/main/resources/base/element/string.json rename features/screenlock/src/main/ets/com/ohos/data/{userData.ets => userData.ts} (90%) delete mode 100644 features/screenlock/src/main/ets/com/ohos/model/accountsModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts delete mode 100644 features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts delete mode 100644 features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts rename features/screenlock/src/main/ets/com/ohos/model/{screenlockStyle.ets => screenlockStyle.ts} (56%) create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts rename features/screenlock/src/main/ets/com/ohos/vm/{accountsViewModel.ets => accountsViewModel.ts} (68%) delete mode 100644 features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts delete mode 100644 features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ts delete mode 100644 features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts rename features/screenlock/src/main/ets/com/ohos/vm/{lockIconViewModel.ets => lockIconViewModel.ts} (34%) rename features/screenlock/src/main/ets/com/ohos/vm/{mixedPSDViewModel.ets => mixedPSDViewModel.ts} (89%) create mode 100644 features/screenlock/src/main/resources/base/media/ic_hollow_dot.svg create mode 100644 features/screenlock/src/main/resources/base/media/ic_solid_dot.svg create mode 100644 features/shortcutcomponent/src/main/resources/base/element/float.json create mode 100644 features/signalcomponent/.gitignore create mode 100644 features/signalcomponent/build.gradle create mode 100644 features/signalcomponent/src/main/config.json create mode 100644 features/signalcomponent/src/main/ets/default/app.ets create mode 100644 features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts rename features/{notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets => signalcomponent/src/main/ets/default/common/constants.ts} (51%) create mode 100644 features/signalcomponent/src/main/ets/default/pages/signalIcon.ets create mode 100644 features/signalcomponent/src/main/ets/default/signalModel.ts create mode 100644 features/signalcomponent/src/main/resources/base/element/color.json create mode 100644 features/signalcomponent/src/main/resources/base/element/float.json create mode 100644 features/signalcomponent/src/main/resources/base/element/string.json create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png create mode 100644 features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png create mode 100644 features/signalcomponent/src/main/resources/base/media/icon.png create mode 100644 features/signalcomponent/src/main/resources/en_US/element/string.json create mode 100644 features/signalcomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/wificomponent/.gitignore create mode 100644 features/wificomponent/build.gradle rename features/{notificationservice => wificomponent}/src/main/config.json (66%) create mode 100644 features/wificomponent/src/main/ets/default/app.ets rename common/src/main/ets/default/abilitymanager/bundleManager.ets => features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts (50%) create mode 100644 features/wificomponent/src/main/ets/default/common/constants.ts create mode 100644 features/wificomponent/src/main/ets/default/pages/wifiIcon.ets create mode 100644 features/wificomponent/src/main/ets/default/wifiModel.ts create mode 100644 features/wificomponent/src/main/resources/base/element/float.json create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg create mode 100644 features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg create mode 100644 features/wificomponent/src/main/resources/base/media/icon.png create mode 100644 product/pc/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts create mode 100644 product/pc/src/main/ets/ServiceExtAbility/common/StyleManager.ts rename product/pc/src/main/ets/ServiceExtAbility/common/{constants.ets => constants.ts} (80%) rename product/pc/src/main/ets/ServiceExtAbility/vm/{indexViewModel.ets => indexViewModel.ts} (50%) rename product/{phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets => pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts} (30%) create mode 100644 product/phone/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts create mode 100644 product/phone/src/main/ets/ServiceExtAbility/common/StyleManager.ts rename product/phone/src/main/ets/ServiceExtAbility/common/{constants.ets => constants.ts} (88%) create mode 100644 product/phone/src/main/ets/ServiceExtAbility/pages/customPassword.ets rename product/phone/src/main/ets/ServiceExtAbility/vm/{indexViewModel.ets => indexViewModel.ts} (78%) rename product/{pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets => phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts} (30%) create mode 100644 product/phone/src/main/resources/base/element/float.json diff --git a/.gitignore b/.gitignore index a51007f7..e5948eb9 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,8 @@ /features/shortcutcomponent/build/ /features/wallpapercomponent/build/ /features/noticeitem/build/ -/features/notificationservice/build/ /features/screenlock/build/ /.idea /.gradle -local.properties \ No newline at end of file +local.properties +tsconfig.json \ No newline at end of file diff --git a/OAT.xml b/OAT.xml index f5f960f1..9ce70fdb 100644 --- a/OAT.xml +++ b/OAT.xml @@ -67,8 +67,6 @@ - - diff --git a/README_zh.md b/README_zh.md index e41fad43..07e8d454 100644 --- a/README_zh.md +++ b/README_zh.md @@ -3,7 +3,7 @@ ## 简介 ### 内容介绍 -锁屏应用是OpenHarmony中预置的系统应用,为用户提供锁屏的基础能力,提供滑动解锁、密码解锁等解锁能力,以及锁屏页面的信息展示能力。 +锁屏应用是OpenHarmony中预置的系统应用,为用户提供锁屏的基础能力。提供滑动解锁、密码解锁等解锁能力,以及锁屏页面的信息展示能力。 ### 架构图介绍 @@ -11,29 +11,25 @@ feature ``` -1.在开机流程、亮屏流程、灭屏流程中添加加锁流程及所对应的解锁流程,实现和系统的交互。\ -2.通过时间日期组件、通知组件、状态栏组件、lockIcon和快捷开关组件,实现不要的信息展示。\ +1.在开机流程、亮屏流程、灭屏流程中添加加锁流程及所对应的解锁流程,实现与系统交互。\ +2.通过时间日期组件、通知组件、状态栏组件、lockIcon和快捷开关组件,实现相关的信息展示。\ 3.支持数字解锁、图案解锁、人脸解锁和密码混合解锁。 ``` common ``` -通用接口,实现日志打印,外部接口管理等功能 +通用接口,实现日志打印,外部接口管理等功能。 ``` ## 目录 ``` /applications/standard/screenlock - ├── build.gradle # 全局编译配置文件 - ├── settings.gradle # 编译模块配置文件 - ├── LICENSE # 许可文件 ├── common # 通用工具类目录 - ├── signature # 证书文件目录 + ├── entry # entry模块目录 ├── features # 子组件目录 │ ├── batterycomponent # 电池组件 + │ ├── clockcomponent # 时钟组件 │ ├── datetimecomponent # 日期时间组件 - │ ├── shortcutcomponent # 快捷开关组件 - │ ├── wallpapercomponent # 壁纸组件 │ ├── noticeitem # 通知子组件 │ ├── notificationservice # 通知服务组件 │ ├── screenlock # 锁屏组件 @@ -41,11 +37,18 @@ common │ ├── model # 数据管理 │ ├── view # 组件样式管理 │ ├── vm # 数据样式绑定管理 + │ ├── shortcutcomponent # 快捷开关组件 + │ ├── wallpapercomponent # 壁纸组件 + │ ├── wificomponent # wifi组件 ├── product # 锁屏总体功能目录 │ ├── pc # 模块目录 - │ ├── pages/slidesrceenlock # 滑动锁屏 + │ ├── pages/slidesrceenlock # 滑动锁屏 │ ├── phone # 模块目录 - │ ├── pages/slidesrceenlock # 滑动锁屏 + │ ├── pages/slidesrceenlock # 滑动锁屏 + ├── signature # 证书文件目录 + ├── build.gradle # 全局编译配置文件 + ├── LICENSE # 许可文件 + ├── settings.gradle # 编译模块配置文件 ``` ## 相关仓 diff --git a/common/src/main/ets/default/CheckEmptyUtils.ets b/common/src/main/ets/default/CheckEmptyUtils.ts similarity index 96% rename from common/src/main/ets/default/CheckEmptyUtils.ets rename to common/src/main/ets/default/CheckEmptyUtils.ts index fb5f3ff5..5061c49c 100644 --- a/common/src/main/ets/default/CheckEmptyUtils.ets +++ b/common/src/main/ets/default/CheckEmptyUtils.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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/common/src/main/ets/default/Constants.ts b/common/src/main/ets/default/Constants.ts new file mode 100644 index 00000000..01314333 --- /dev/null +++ b/common/src/main/ets/default/Constants.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021-2022 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 WindowNameMap = { + 2112: 'navigation', + 2108: 'status', + 2111: 'volume' +}; + +export interface Rect { + left: number; + top: number; + width: number; + height: number; +}; + +export type WindowType = 'status' | 'navigation'; + +export default class Constants { + static URI_VAR: string = 'dataability:///com.ohos.settingsdata.DataAbility'; +} \ No newline at end of file diff --git a/common/src/main/ets/default/DateTimeCommon.ets b/common/src/main/ets/default/DateTimeCommon.ts similarity index 97% rename from common/src/main/ets/default/DateTimeCommon.ets rename to common/src/main/ets/default/DateTimeCommon.ts index 6efe425d..0d1ab716 100644 --- a/common/src/main/ets/default/DateTimeCommon.ets +++ b/common/src/main/ets/default/DateTimeCommon.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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/common/src/main/ets/default/Decorators.ts b/common/src/main/ets/default/Decorators.ts new file mode 100644 index 00000000..85cf5c58 --- /dev/null +++ b/common/src/main/ets/default/Decorators.ts @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 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 Log from "./Log"; + +const TAG = "Decorators"; + +export function debounce(timeout: number) { + return function inner(target: any, propKey: string, descriptor: PropertyDescriptor) { + let curFunc: number = 0; + const original = descriptor.value; + descriptor.value = function (...args: string[]) { + Log.showInfo(TAG, `debounce invoke ${propKey} curFunc: ${curFunc}`); + curFunc && clearTimeout(curFunc); + curFunc = setTimeout(() => original.call(this, ...args), timeout); + }; + }; +} + +export function throttle(waitTime: number) { + return function inner(target: any, propKey: string, descriptor: PropertyDescriptor) { + let lastTime: number = 0; + const original = descriptor.value; + descriptor.value = function (...args: string[]) { + let curTime = Date.now(); + Log.showInfo(TAG, `throttle invoke ${propKey} timeInterval: ${curTime - lastTime}`); + if (curTime - lastTime >= waitTime) { + original.call(this, ...args); + lastTime = curTime; + } + }; + }; +} diff --git a/common/src/main/ets/default/Log.ets b/common/src/main/ets/default/Log.ts similarity index 63% rename from common/src/main/ets/default/Log.ets rename to common/src/main/ets/default/Log.ts index 4a1a4289..855d0e43 100644 --- a/common/src/main/ets/default/Log.ets +++ b/common/src/main/ets/default/Log.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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,19 +14,34 @@ */ const TAG = 'ScreenLock-Default'; +const FILTER_KEYS = [ + new RegExp('hide', "gi") +] + +export function filterKey(target: any, propKey: string, descriptor: PropertyDescriptor) { + const original = descriptor.value; + descriptor.value = function (...args: string[]) { + let filterResult = args.map((str) => { + let tempStr = str + FILTER_KEYS.forEach((filterKey) => tempStr = tempStr.replace(filterKey, "**")) + return tempStr + }); + const result = original.call(this, ...filterResult); + return result; + }; +} /** * Basic log class */ export default class Log { - /** * print info level log * * @param {string} tag - Page or class tag * @param {string} log - Log needs to be printed */ - static showInfo(tag, log) { + static showInfo(tag: string, log: string) { console.info(`${TAG} tag: ${tag} --> ${log}`); } @@ -36,7 +51,7 @@ export default class Log { * @param {string} tag - Page or class tag * @param {string} log - Log needs to be printed */ - static showDebug(tag, log) { + static showDebug(tag: string, log: string) { console.debug(`${TAG} tag: ${tag} --> ${log}`); } @@ -46,7 +61,7 @@ export default class Log { * @param {string} tag - Page or class tag * @param {string} log - Log needs to be printed */ - static showError(tag, log) { + static showError(tag: string, log: string) { console.error(`${TAG} tag: ${tag} --> ${log}`); } } diff --git a/common/src/main/ets/default/ReadConfigUtil.ets b/common/src/main/ets/default/ReadConfigUtil.ts similarity index 95% rename from common/src/main/ets/default/ReadConfigUtil.ets rename to common/src/main/ets/default/ReadConfigUtil.ts index 587704de..c7eb8b90 100644 --- a/common/src/main/ets/default/ReadConfigUtil.ets +++ b/common/src/main/ets/default/ReadConfigUtil.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from './Log.ets'; +import Log from './Log'; import FileIo from '@ohos.fileio'; const DFAULT_SIZE = 4096; diff --git a/common/src/main/ets/default/ScreenLockCommon.ets b/common/src/main/ets/default/ScreenLockCommon.ts similarity index 91% rename from common/src/main/ets/default/ScreenLockCommon.ets rename to common/src/main/ets/default/ScreenLockCommon.ts index ec39b0b1..5fa38967 100644 --- a/common/src/main/ets/default/ScreenLockCommon.ets +++ b/common/src/main/ets/default/ScreenLockCommon.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from './Log.ets'; +import Log from './Log'; import FileIo from '@ohos.fileio'; const TAG = 'ScreenLock-ScreenLockCommon'; @@ -21,7 +21,9 @@ const CHAR_CODE_AT_INDEX = 0; export enum ScreenLockStatus { Locking = 1, - Unlock = 2 + Unlock = 2, + RecognizingFace = 3, + FaceNotRecognized = 4 } export function ReadConfigFile(fileName) { diff --git a/common/src/main/ets/default/ScreenLockManager.ts b/common/src/main/ets/default/ScreenLockManager.ts new file mode 100644 index 00000000..d38431d5 --- /dev/null +++ b/common/src/main/ets/default/ScreenLockManager.ts @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2022 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 commonEvent from "@ohos.commonEvent"; +import { CommonEventSubscriber } from "commonEvent/commonEventSubscriber"; +import createOrGet from "./SingleInstanceHelper"; +import EventManager from "./event/EventManager"; +import Log from "./Log"; +import { obtainLocalEvent } from "./event/EventUtil"; +import { debounce } from "./Decorators"; +export const SCREEN_CHANGE_EVENT = "screenChangeEvent"; + +const TAG = "ScreenLockManager"; +const SCREEN_COMMON_EVENT_INFO = { + events: [commonEvent.Support.COMMON_EVENT_SCREEN_OFF, commonEvent.Support.COMMON_EVENT_SCREEN_ON], +}; +const debounceTimeout = 500; + +class ScreenLockManager { + mSubscriber: CommonEventSubscriber | undefined; + + async init() { + this.mSubscriber = await commonEvent.createSubscriber(SCREEN_COMMON_EVENT_INFO); + commonEvent.subscribe(this.mSubscriber, (err, data) => { + if (err.code != 0) { + Log.showError(TAG, `Can't handle screen change, err: ${JSON.stringify(err)}`); + return; + } + Log.showDebug(TAG, `screenChange, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + switch (data.event) { + case commonEvent.Support.COMMON_EVENT_SCREEN_OFF: + this.notifyScreenEvent(false); + break; + case commonEvent.Support.COMMON_EVENT_SCREEN_ON: + this.notifyScreenEvent(true); + break; + default: + Log.showError(TAG, `unknow event`); + } + }); + } + + @debounce(debounceTimeout) + notifyScreenEvent(isScreenOn: boolean) { + EventManager.publish(obtainLocalEvent(SCREEN_CHANGE_EVENT, isScreenOn)); + Log.showDebug(TAG, `publish ${SCREEN_CHANGE_EVENT} screenState: ${isScreenOn}`); + } +} + +let sScreenLockManager = createOrGet(ScreenLockManager, TAG); +export default sScreenLockManager as ScreenLockManager; \ No newline at end of file diff --git a/common/src/main/ets/default/SingleInstanceHelper.ts b/common/src/main/ets/default/SingleInstanceHelper.ts new file mode 100644 index 00000000..b4ffcae7 --- /dev/null +++ b/common/src/main/ets/default/SingleInstanceHelper.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2021-2022 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 Log from './Log'; +import audio from '@ohos.multimedia.audio'; + +const TAG = "SingleInstanceHelper"; +const AUDIO_MANAGER_KEY = 'MultiMediaAudioManager'; + +export default function createOrGet(objectClass: { new(): T }, storageKey: string): T { + if (!globalThis[storageKey]) { + globalThis[storageKey] = new objectClass(); + Log.showInfo(TAG, `Create key of ${storageKey}`); + } + return globalThis[storageKey]; +} + +export function getAudioManager() { + if (!globalThis[AUDIO_MANAGER_KEY]) { + globalThis[AUDIO_MANAGER_KEY] = audio.getAudioManager(); + Log.showInfo(TAG, `Create Audio Manager.`); + } + return globalThis[AUDIO_MANAGER_KEY]; +} diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts new file mode 100644 index 00000000..1d8f3e26 --- /dev/null +++ b/common/src/main/ets/default/StyleConfiguration.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from './StyleManager'; + +const TAG = 'Common-StyleConfiguration'; + +export default class StyleConfiguration { + static getCommonStyle() { + const key: string = TAG + "-Common"; + return StyleManager.getStyle(key, () => { + return { + statusBarFontSize: '16fp', + statusBarIconWidth: '24vp', + statusBarIconHeight: '24vp', + statusBarMarginLeftRight: '5vp', + }; + }); + } +} \ No newline at end of file diff --git a/common/src/main/ets/default/StyleManager.ts b/common/src/main/ets/default/StyleManager.ts new file mode 100644 index 00000000..d9e49622 --- /dev/null +++ b/common/src/main/ets/default/StyleManager.ts @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2021-2022 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 Log from './Log'; + +const TAG = 'Common-StyleManager'; + +export class StyleManager { + mAbilityPageName: string = ''; + + setAbilityPageName(name: string): void{ + Log.showInfo(TAG, `setAbilityPageName, name: ${name}`); + this.mAbilityPageName = name; + } + + getStyle(key: string, generateDefaultFunction: Function) { + let newKey = this.mAbilityPageName + '-' + key; + if (!AppStorage.Has(newKey)) { + let defaultStyle = generateDefaultFunction(); + AppStorage.SetOrCreate(newKey, defaultStyle); + Log.showInfo(TAG, `Create storageKey of ${newKey}`); + } + return AppStorage.Get(newKey); + } +} + +let styleManager = new StyleManager(); + +export default styleManager as StyleManager; \ No newline at end of file diff --git a/common/src/main/ets/default/SwitchUserManager.ts b/common/src/main/ets/default/SwitchUserManager.ts new file mode 100644 index 00000000..d390d75e --- /dev/null +++ b/common/src/main/ets/default/SwitchUserManager.ts @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2021-2022 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 AccountManager from "@ohos.account.osAccount"; +import Log from "./Log"; +import getSingleInstance from "./SingleInstanceHelper"; + +const TAG = "SwitchUserManager"; +const SUBSCRIBE_KEY = "SystemUiAccount"; +const USER_CHANGE_EVENT = "activate"; +const DELAY_TIME = 50 * 1000; +export const INVALID_USER_ID = -1; + +type AccountInfo = { + localId: number; + localName: string; + photo: string; +}; +export type UserChangeListener = { + userChange: (data: UserInfo) => void; +}; + +export class UserInfo { + userId: number = INVALID_USER_ID; + userName: string = ""; + userIcon: string | Resource = ""; + [key: string]: any; +} + +async function getCurrentAccountInfo(): Promise { + let accountInfos = await AccountManager.getAccountManager().queryAllCreatedOsAccounts(); + for (let accountInfo of accountInfos) { + Log.showInfo(TAG, `accountInfo: ${accountInfo.localId}, isActive: ${accountInfo.isActived}`); + if (accountInfo.isActived) { + return accountInfo; + } + } + return Promise.reject("Can't get active userInfo."); +} + +function parseAccountInfo(accountInfo: AccountInfo): UserInfo { + return { + userId: accountInfo.localId, + userName: accountInfo.localName, + userIcon: accountInfo.photo, + }; +} + +export default class SwitchUserManager { + mUserInfo: UserInfo = new UserInfo(); + mListeners = new Set(); + mHasWait: boolean = false; + + static getInstance(): SwitchUserManager { + return getSingleInstance(SwitchUserManager, TAG); + } + + constructor() { + Log.showInfo(TAG, `SwitchUserManager constructor`); + AccountManager.getAccountManager().on(USER_CHANGE_EVENT, SUBSCRIBE_KEY, this.handleUserChange.bind(this)); + } + + public async getCurrentUserInfo(): Promise { + if (this.mUserInfo.userId == INVALID_USER_ID) { + !this.mHasWait && (await new Promise((resolve) => setTimeout(resolve, DELAY_TIME))); + this.mHasWait = true; + this.mUserInfo = parseAccountInfo(await getCurrentAccountInfo()); + } + Log.showInfo(TAG, `getCurrentUserInfo userId: ${this.mUserInfo.userId}`); + return this.mUserInfo; + } + + public registerListener(listener: UserChangeListener) { + this.mListeners.add(listener); + } + + public unregisterListener(listener: UserChangeListener) { + this.mListeners.delete(listener); + } + + handleUserChange(accountId: number): void { + AccountManager.getAccountManager() + .queryOsAccountById(accountId) + .then((accountInfo) => { + Log.showInfo(TAG, `userChange, accountInfo: ${JSON.stringify(accountInfo)}`); + this.mUserInfo = parseAccountInfo(accountInfo); + this.notifyUserChange(); + }) + .catch((err) => Log.showError(TAG, `Can't query account by ${accountId}, err: ${err}`)); + } + + notifyUserChange() { + this.mListeners.forEach((listener) => listener.userChange(this.mUserInfo)); + } +} \ No newline at end of file diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts new file mode 100644 index 00000000..7fbdf1f1 --- /dev/null +++ b/common/src/main/ets/default/TimeManager.ts @@ -0,0 +1,120 @@ +/** + * Copyright (c) 2021-2022 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 settings from "@ohos.settings"; +import commonEvent from "@ohos.commonEvent"; +import featureAbility from "@ohos.ability.featureAbility"; +import { DataAbilityHelper } from "ability/dataAbilityHelper"; +import Log from "./Log"; +import EventManager from "./event/EventManager"; +import createOrGet from "./SingleInstanceHelper"; +import { obtainLocalEvent } from "./event/EventUtil"; +import { CommonEventManager, getCommonEventManager, POLICY } from "./commonEvent/CommonEventManager"; + +export const TIME_CHANGE_EVENT = "Time_Change_Event"; + +export type TimeEventArgs = { + date: Date; + timeFormat: boolean; +}; + +const TAG = "TimeManager"; +const URI_VAR = "dataability:///com.ohos.settingsdata.DataAbility"; +const TIME_FORMAT_KEY = "settings.time.format"; +const TIME_SUBSCRIBE_INFO = { + events: [ + commonEvent.Support.COMMON_EVENT_TIME_CHANGED, + commonEvent.Support.COMMON_EVENT_TIMEZONE_CHANGED, + commonEvent.Support.COMMON_EVENT_TIME_TICK, + ], +}; + +function fill(value: number) { + return (value > 9 ? "" : "0") + value; +} + +export function concatTime(h: number, m: number) { + return `${fill(h)}:${fill(m)}`; +} + +class TimeManager { + private mUse24hFormat: boolean = false; + private mSettingsHelper?: DataAbilityHelper; + private mManager?: CommonEventManager; + + public init(context: any) { + this.mManager = getCommonEventManager( + TAG, + TIME_SUBSCRIBE_INFO, + () => this.notifyTimeChange(), + (isSubscribe) => isSubscribe && this.notifyTimeChange() + ); + this.mManager.subscriberCommonEvent(); + this.mManager.applyPolicy([POLICY.SCREEN_POLICY]); + this.initTimeFormat(context); + } + + public release() { + this.mManager?.release(); + this.mManager = undefined; + this.mSettingsHelper?.off("dataChange", settings.getUriSync(TIME_FORMAT_KEY)); + } + + public formatTime(date: Date) { + return concatTime(date.getHours() % (this.mUse24hFormat ? 24 : 12), date.getMinutes()); + } + + private initTimeFormat(context: any) { + Log.showInfo(TAG, "initTimeFormat"); + this.mSettingsHelper = featureAbility.acquireDataAbilityHelper(context, URI_VAR); + + const handleTimeFormatChange = () => { + if (!this.mSettingsHelper) { + Log.showError(TAG, `Can't get dataAbility helper.`); + return; + } + let timeString = settings.getValueSync(this.mSettingsHelper, TIME_FORMAT_KEY, "24"); + Log.showDebug(TAG, `timeFormat change: ${timeString}`); + this.mUse24hFormat = timeString == "24"; + this.notifyTimeChange(); + }; + + try { + this.mSettingsHelper.on("dataChange", settings.getUriSync(TIME_FORMAT_KEY), (err) => { + if (err.code !== 0) { + Log.showError(TAG, `failed to getAbilityWant, code: ${err.code}.`); + return; + } + handleTimeFormatChange(); + }); + } catch (e) { + Log.showError(TAG, `Can't listen timeformate change.`); + } + handleTimeFormatChange(); + } + + private notifyTimeChange() { + Log.showInfo(TAG, "notifyTimeChange"); + let args: TimeEventArgs = { + date: new Date(), + timeFormat: this.mUse24hFormat, + }; + EventManager.publish(obtainLocalEvent(TIME_CHANGE_EVENT, args)); + } +} + +let sTimeManager = createOrGet(TimeManager, TAG); + +export default sTimeManager as TimeManager; diff --git a/common/src/main/ets/default/WindowManager.ets b/common/src/main/ets/default/WindowManager.ets deleted file mode 100644 index 3d0e42c0..00000000 --- a/common/src/main/ets/default/WindowManager.ets +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Window from '@ohos.window'; -import display from '@ohos.display' -import Log from './Log.ets'; - -const TAG = 'WindowManager'; -//const STATUS_BAR_H = 0.07; -const STATUS_BAR_H = 0.03; - -var maxWidth; -var maxHeight; -var minHeight; -var quicklySettingH; -var notificationH; - -/** - * Manage window size changes. - */ -export default class WindowManager { - initWindowManager() { - Log.showInfo(TAG, 'initWindowManager '); - maxWidth = AppStorage.SetAndLink("maxWidth", 0); - maxHeight = AppStorage.SetAndLink("maxHeight", 0); - minHeight = AppStorage.SetAndLink("minHeight", 0); - - display.getDefaultDisplay() - .then(dis => { - maxWidth.set(dis.width); - maxHeight.set(dis.height); - minHeight.set(this.getStatusBarDefaultHeight(dis.height)); - - Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth.get()} maxHeight ${maxHeight.get()} minHeight ${minHeight.get()}`); - }) - } - - /** - * Set the window to the maximum size. - * - * @param {Object} callback - Callback function. - */ - setWindowMax(callback) { - Log.showInfo(TAG, 'enter setWindowMax ================='); - Window.getTopWindow() - .then((windowData) => { - windowData.resetSize(maxWidth.get(), maxHeight.get()) - .then((result) => { - Log.showInfo(TAG, result); - callback(result); - }); - }); - } - - /** - * Set the window to the minimum size. - * - * @param {Object} callback - Callback function. - */ - setWindowMin(callback) { - Log.showInfo(TAG, 'enter setWindowMin ================='); - Window.getTopWindow() - .then((windowData) => { - windowData.resetSize(maxWidth.get(), minHeight.get()) - .then((result) => { - Log.showInfo(TAG, result); - callback(result); - }); - }); - } - - getStatusBarDefaultHeight(maxheight) { - return parseInt((maxheight * STATUS_BAR_H).toString()) - } -} \ No newline at end of file diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts new file mode 100644 index 00000000..9d6f0a90 --- /dev/null +++ b/common/src/main/ets/default/WindowManager.ts @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Window from "@ohos.window"; +import Log from "./Log"; +import EventManager from "./event/EventManager"; +import { obtainLocalEvent } from "./event/EventUtil"; +import { Rect } from "./Constants"; +import createOrGet from "./SingleInstanceHelper"; + +export type WindowInfo = { + visibility: boolean; + rect: Rect; +}; +export enum WindowType { + STATUS_BAR = "SystemUi_StatusBar", + NAVIGATION_BAR = "SystemUi_NavigationBar", + DROPDOWN_PANEL = "SystemUi_DropdownPanel", + NOTIFICATION_PANEL = "SystemUi_NotificationPanel", + CONTROL_PANEL = "SystemUi_ControlPanel", + VOLUME_PANEL = "SystemUi_VolumePanel", + BANNER_NOTICE = 'SystemUi_BannerNotice' +} + +export const WINDOW_SHOW_HIDE_EVENT = "WindowShowHideEvent"; +export const WINDOW_RESIZE_EVENT = "WindowResizeEvent"; + +type WindowHandle = typeof Window.Window; +const TAG = "WindowManager"; +const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: number } = { + SystemUi_StatusBar: 2108, + SystemUi_NavigationBar: 2112, + SystemUi_DropdownPanel: 2109, + SystemUi_NotificationPanel: 2111, + SystemUi_ControlPanel: 2111, + SystemUi_VolumePanel: 2111, + SystemUi_BannerNotice: 2111, +}; +const DEFAULT_WINDOW_INFO: WindowInfo = { + visibility: false, + rect: { left: 0, top: 0, width: 0, height: 0 }, +}; + +/** + * Manage window size changes. + */ +class WindowManager { + mWindowInfos: Map = new Map(); + + async createWindow(context: any, name: WindowType, rect: Rect, loadContent: string): Promise { + Log.showInfo(TAG, `createWindow name: ${name}, rect: ${JSON.stringify(rect)}, url: ${loadContent}`); + let winHandle = await Window.create(context, name, SYSTEM_WINDOW_TYPE_MAP[name]); + await winHandle.moveTo(rect.left, rect.top); + await winHandle.resetSize(rect.width, rect.height); + await winHandle.loadContent(loadContent); + this.mWindowInfos.set(name, { visibility: false, rect }); + Log.showInfo(TAG, `create window[${name}] success.`); + return winHandle; + } + + async resetSizeWindow(name: WindowType, rect: Rect): Promise { + let window = await Window.find(name); + await window.moveTo(rect.left, rect.top); + await window.resetSize(rect.width, rect.height); + this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), rect }); + EventManager.publish( + obtainLocalEvent(WINDOW_RESIZE_EVENT, { + windowName: name, + rect, + }) + ); + Log.showInfo(TAG, `resize window[${name}] success, rect: ${JSON.stringify(rect)}.`); + } + + async showWindow(name: WindowType): Promise { + let window = await Window.find(name); + await window.show(); + this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), visibility: true }); + EventManager.publish( + obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { + windowName: name, + isShow: true, + }) + ); + Log.showInfo(TAG, `show window[${name}] success.`); + } + + async hideWindow(name: WindowType): Promise { + let window = await Window.find(name); + await window.hide(); + this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), visibility: false }); + EventManager.publish( + obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { + windowName: name, + isShow: false, + }) + ); + Log.showInfo(TAG, `hide window[${name}] success.`); + } + + getWindowInfo(name: WindowType): WindowInfo | undefined { + return this.mWindowInfos.get(name); + } + + // function need remove + setWindowInfo(configInfo) { + Log.showInfo(TAG, `setWindowInfo, configInfo ${JSON.stringify(configInfo)}`); + let maxWidth = AppStorage.SetAndLink("maxWidth", configInfo.maxWidth); + let maxHeight = AppStorage.SetAndLink("maxHeight", configInfo.maxHeight); + let minHeight = AppStorage.SetAndLink("minHeight", configInfo.minHeight); + maxWidth.set(configInfo.maxWidth); + maxHeight.set(configInfo.maxHeight); + minHeight.set(configInfo.minHeight); + } +} + +let sWindowManager = createOrGet(WindowManager, TAG); +export default sWindowManager as WindowManager; diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/common/src/main/ets/default/abilitymanager/abilityManager.ts new file mode 100644 index 00000000..8178f346 --- /dev/null +++ b/common/src/main/ets/default/abilitymanager/abilityManager.ts @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../Log'; + +const TAG = 'AbilityManager'; + +export default class AbilityManager { + static ABILITY_NAME_ENTRY = 'SystemUi_Entry'; + static ABILITY_NAME_STATUS_BAR = 'SystemUi_StatusBar'; + static ABILITY_NAME_NAVIGATION_BAR = 'SystemUi_NavigationBar'; + static ABILITY_NAME_VOLUME_PANEL = 'SystemUi_VolumePanel'; + static ABILITY_NAME_NOTIFICATION_MANAGEMENT = 'SystemUi_NotificationManagement'; + static ABILITY_NAME_DROPDOWN_PANEL = 'SystemUi_DropdownPanel'; + static ABILITY_NAME_NOTIFICATION_PANEL = 'SystemUi_NotificationPanel'; + static ABILITY_NAME_CONTROL_PANEL = 'SystemUi_ControlPanel'; + static ABILITY_NAME_BANNER_NOTICE = 'SystemUi_BannerNotice'; + static ABILITY_NAME_SCREEN_LOCK = 'SystemUi_ScreenLock'; + + static setContext(abilityName: string, context) { + Log.showInfo(TAG, `setContext, abilityName: ${abilityName}`); + globalThis[abilityName + '_Context'] = context; + } + + static getContext(abilityName?: string) { + Log.showInfo(TAG, `getContext, abilityName: ${abilityName}`); + if (!abilityName) { + abilityName = AbilityManager.ABILITY_NAME_ENTRY; + } + return globalThis[abilityName + '_Context']; + } + + static setAbilityData(abilityName, key, data) { + Log.showInfo(TAG, `setAbilityData, abilityName: ${abilityName} key: ${key} data: ${JSON.stringify(data)}`); + globalThis[abilityName + '_data_' + key] = data; + } + + static getAbilityData(abilityName, key) { + Log.showInfo(TAG, `getAbilityData, abilityName: ${abilityName} key: ${key} `); + return globalThis[abilityName + '_data_' + key]; + } + + static startAbility(want, callback?: Function) { + Log.showInfo(TAG, `startAbility, want: ${JSON.stringify(want)}`); + let context = AbilityManager.getContext(); + context.startAbility(want).then(() => { + Log.showInfo(TAG, `startAbility, then`); + if (callback) { + callback(null); + } + }).catch((error) => { + Log.showInfo(TAG, `startAbility, error: ${JSON.stringify(error)}`); + callback(error); + }) + } +} diff --git a/features/batterycomponent/src/main/ets/com/ohos/common/constants.ets b/common/src/main/ets/default/abilitymanager/bundleManager.ts similarity index 36% rename from features/batterycomponent/src/main/ets/com/ohos/common/constants.ets rename to common/src/main/ets/default/abilitymanager/bundleManager.ts index d40572fc..b38fdc5b 100644 --- a/features/batterycomponent/src/main/ets/com/ohos/common/constants.ets +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,36 +13,26 @@ * limitations under the License. */ -export default class Constants { +import BundleMgr from "@ohos.bundle"; +import Context from "application/ServiceExtensionContext"; +import Log from "../Log"; +import SwitchUserManager from "../SwitchUserManager"; - //layout params - Icon - static WHOLE_CONTAINER_MARGIN = 2 - static WHOLE_CONTAINER_WIDTH = 100 - static WHOLE_CONTAINER_HEIGHT = 24 - static PIC_CONTAINER_WIDTH = '70%' - static PIC_CONTAINER_HEIGHT = '85%' - //layout params - Pic - static FULL_CONTAINER_WIDTH = '100%' - static FULL_CONTAINER_HEIGHT = '100%' - static BATTERY_BORDER_WIDTH = '88%' - static BATTERY_BORDER_HEIGHT = '80%' - static BATTERY_BORDER_RADIUS = 2 - static BATTERY_BORDER_MARGIN = 2 - static BATTERY_CONTENT_PADDING = 2 - static BATTERY_DECORATOR_WIDTH = '10%' - static BATTERY_DECORATOR_HEIGHT = '50%' - static BATTERY_DECORATOR_MARGIN = 2 - //layout params - Soc - static SOC_FONT_SIZE = 16 +const TAG = "BRManager"; - //value - static BATTERY_LEVEL_LOW = 20 - - static NONE = 0; - static ENABLE = 1; - static DISABLE = 2; - static FULL = 3; - static PERCENT_NUMBER = 100; - static DEFAULT_PROGRESS = 100; +export default class BundleManager { + static async getResourceManager(tag: string, context: Context, bundleName: string) { + Log.showInfo(TAG, `getResourceManager from: ${tag}`); + let bundleContext = await context.createBundleContext(bundleName); + return await bundleContext.resourceManager; + } + static async getBundleInfo(tag: string, bundleName: string, getInfo: + any, requestId?: number) { + let userInfo = { + userId: requestId ?? (await SwitchUserManager.getInstance().getCurrentUserInfo()).userId, + }; + Log.showInfo(TAG, `getBundleInfo from: ${tag}, userId: ${userInfo.userId}`); + return await BundleMgr.getBundleInfo(bundleName, getInfo, userInfo); + } } \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ets b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts similarity index 94% rename from common/src/main/ets/default/abilitymanager/featureAbilityManager.ets rename to common/src/main/ets/default/abilitymanager/featureAbilityManager.ts index b5490160..876cd06f 100644 --- a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ets +++ b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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,14 +14,14 @@ */ import FeatureAbility from '@ohos.ability.featureAbility'; -import Log from '../Log.ets'; +import Log from '../Log'; const TAG = 'FeatureAbilityManager'; export default class FeatureAbilityManager { openAbility(tag, want) { - Log.showInfo(TAG, `openAbility from: ${tag}`); + Log.showInfo(TAG, `openAbility from: ${tag}`)); let result = FeatureAbility.startAbility(want) .then(data => Log.showInfo(TAG, `tag: ${tag} promise then: ${JSON.stringify(data)}`)) diff --git a/common/src/main/ets/default/abilitymanager/notificationManager.ets b/common/src/main/ets/default/abilitymanager/notificationManager.ts similarity index 80% rename from common/src/main/ets/default/abilitymanager/notificationManager.ets rename to common/src/main/ets/default/abilitymanager/notificationManager.ts index 8c90ac65..ad137fc6 100644 --- a/common/src/main/ets/default/abilitymanager/notificationManager.ets +++ b/common/src/main/ets/default/abilitymanager/notificationManager.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -15,7 +15,7 @@ //import { NotificationSubscriber } from './notification/notificationSubscriber'; import Notification from '@ohos.notification'; -import Log from '../Log.ets'; +import Log from '../Log'; const TAG = 'NotificationManager'; @@ -27,27 +27,27 @@ export default class NotificationManager { static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; static subscribeNotification(tag, subscriber, asyncCallback) { - Log.showInfo(TAG, `subscribeNotification from: ${tag}`); + Log.showInfo(TAG, `subscribeNotification from: ${tag}`)); Notification.subscribe(subscriber, asyncCallback); } static unsubscribeNotification(tag, subscriber) { - Log.showInfo(TAG, `subscribeNotification from: ${tag}`); + Log.showInfo(TAG, `subscribeNotification from: ${tag}`)); Notification.unsubscribe(subscriber); } static removeAll(tag, callback) { - Log.showInfo(TAG, `removeAll from: ${tag}`); + Log.showInfo(TAG, `removeAll from: ${tag}`)); Notification.removeAll(callback); } static remove(tag, hashCode, callback) { - Log.showInfo(TAG, `remove from: ${tag}`); + Log.showInfo(TAG, `remove from: ${tag}`)); Notification.remove(hashCode, callback) } static getAllActiveNotifications(tag, callback) { - Log.showInfo(TAG, `getAllActiveNotifications from: ${tag}`); + Log.showInfo(TAG, `getAllActiveNotifications from: ${tag}`)); Notification.getAllActiveNotifications(callback); } diff --git a/common/src/main/ets/default/commonEvent/CommonEventManager.ts b/common/src/main/ets/default/commonEvent/CommonEventManager.ts new file mode 100644 index 00000000..bdd974a7 --- /dev/null +++ b/common/src/main/ets/default/commonEvent/CommonEventManager.ts @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2021-2022 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 commonEvent from "@ohos.commonEvent"; +import { CommonEventData } from "commonEvent/commonEventData"; +import EventManager from "../event/EventManager"; +import Log from "../Log"; +import { SCREEN_CHANGE_EVENT } from "../ScreenLockManager"; + +export type CommonEventManager = { + subscriberCommonEvent: () => Promise; + unSubscriberCommonEvent: () => void; + applyPolicy: (policys: Array) => void; + release: () => void; +}; + +export enum POLICY { + SCREEN_POLICY = "screenOnOffPolicy", +} + +type ClearPolicy = () => void; +type InnerManager = { subscriberCommonEvent: () => void; unSubscriberCommonEvent: () => void }; +const policyMap: { [key in POLICY]: (manager: InnerManager) => ClearPolicy } = { + screenOnOffPolicy: ScreenPolicy, +}; + +export function getCommonEventManager( + tag: string, + subscribeInfos: { events: Array }, + commonEventCallback: (data: CommonEventData) => void, + subscribeStateChange?: (isSubscribe: boolean) => void +): CommonEventManager { + const TAG = `CommonEvent_${tag}`; + const SUBSCRIBE_INFOS = subscribeInfos; + let unSubcribers: Array<() => void> = []; + let policyClearCb: Map | undefined = undefined; + + async function subscriberCommonEvent() { + Log.showInfo(TAG, "registerSubscriber start"); + let subscriber = await commonEvent.createSubscriber(SUBSCRIBE_INFOS); + commonEvent.subscribe(subscriber, (err, data) => { + if (err.code != 0) { + Log.showError(TAG, `Can't handle common event, err: ${JSON.stringify(err)}`); + return; + } + Log.showInfo(TAG, `handle common event: ${data.event}`); + commonEventCallback(data); + }); + unSubcribers.push(() => commonEvent.unsubscribe(subscriber)); + subscribeStateChange && subscribeStateChange(true); + Log.showInfo(TAG, `registerSubscriber success, size: ${unSubcribers.length}`); + } + + function unSubscriberCommonEvent() { + Log.showInfo(TAG, `UnSubcribers size: ${unSubcribers.length}`); + unSubcribers.forEach((unsubscribe) => unsubscribe()); + unSubcribers.length = 0; + subscribeStateChange && subscribeStateChange(false); + } + + function applyPolicy(policys: Array) { + const innerManager = { subscriberCommonEvent, unSubscriberCommonEvent }; + policyClearCb = policyClearCb ?? new Map(); + policys.forEach((policy) => { + if (policyClearCb) { + !policyClearCb.has(policy) && policyClearCb.set(policy, policyMap[policy](innerManager)); + Log.showInfo(TAG, `apply policy: ${policy}`); + } + }); + } + + function release() { + policyClearCb?.forEach((cb) => cb()); + policyClearCb?.clear(); + unSubscriberCommonEvent(); + } + + return { subscriberCommonEvent, unSubscriberCommonEvent, applyPolicy, release }; +} + +function ScreenPolicy(manager: InnerManager): ClearPolicy { + return EventManager.subscribe(SCREEN_CHANGE_EVENT, (isScreenOn: boolean) => { + isScreenOn ? manager.subscriberCommonEvent() : manager.unSubscriberCommonEvent(); + }); +} diff --git a/common/src/main/ets/default/event/EventBus.ts b/common/src/main/ets/default/event/EventBus.ts new file mode 100644 index 00000000..9195cc25 --- /dev/null +++ b/common/src/main/ets/default/event/EventBus.ts @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2022 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 Log from "../Log"; + +export type Callback = (args: any) => void; +const TAG = "EventBus"; + +export interface EventBus { + on(event: T | T[], cb: Callback): () => void; + once(event: T, cb: Callback): () => void; + off(event: T | T[] | undefined, cb: Callback): void; + emit(event: T, args: any): void; +} + +export function createEventBus(): EventBus { + let _cbs: { [key: string]: Set } = {}; + + function on(events: T | T[], cb: Callback): () => void { + if (Array.isArray(events)) { + events.forEach((e) => on(e, cb)); + } else { + (_cbs[events] || (_cbs[events] = new Set())).add(cb); + Log.showInfo(TAG, `add event[${events}] callback, size: ${_cbs[events]?.size}`); + } + return () => off(events, cb); + } + + function once(event: T, cb: Callback): () => void { + let newCallback = (args: any) => { + cb(args); + removeSelf(); + }; + function removeSelf() { + off(event, newCallback); + } + return on(event, newCallback); + } + + function off(event: T | T[] | undefined, cb: Callback) { + if (!event) { + _cbs = {}; + Log.showInfo(TAG, `remove event[${event}] all callback`); + return; + } + if (Array.isArray(event)) { + event.forEach((e) => off(e, cb)); + return; + } + _cbs[event]?.delete(cb); + Log.showInfo(TAG, `remove event[${event}] callback, size: ${_cbs[event]?.size}`); + } + + function emit(event: T, args: any) { + _cbs[event]?.forEach((cb) => cb(args)); + } + + function stickyEmit(event: T, argument: any[]) {} + return { + on, + once, + off, + emit, + }; +} \ No newline at end of file diff --git a/common/src/main/ets/default/event/EventManager.ts b/common/src/main/ets/default/event/EventManager.ts new file mode 100644 index 00000000..cb0aa2d4 --- /dev/null +++ b/common/src/main/ets/default/event/EventManager.ts @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2022 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 ServiceExtensionContext from "application/ServiceExtensionContext"; +import Log from "../Log"; +import createOrGet from "../SingleInstanceHelper"; +import { EventParser, START_ABILITY_EVENT, Event, LocalEvent } from "./EventUtil"; +import { Callback, createEventBus, EventBus } from "./EventBus"; + +export type unsubscribe = () => void; +export type Events = string | string[]; + +const TAG = "EventManager"; + +class EventManager { + mEventBus: EventBus; + eventParser: EventParser; + mContext: ServiceExtensionContext | undefined; + + constructor() { + this.mEventBus = createEventBus(); + this.eventParser = { + local: this.publishLocalEvent, + ability: this.startAbility, + commonEvent: this.publishCommonEvent, + remote: this.publishRemoteEvent, + }; + } + + setContext(ctx: ServiceExtensionContext) { + this.mContext = ctx; + } + + publish(event: Event): boolean { + return this.eventParser[event.target].call(this, event.data); + } + + subscribe(eventType: Events, callback: Callback): unsubscribe { + return this.mEventBus.on(eventType, callback); + } + + subscribeOnce(eventType: string, callback: Callback): unsubscribe { + return this.mEventBus.once(eventType, callback); + } + + private publishLocalEvent(data: LocalEvent): boolean { + Log.showInfo(TAG, `publish localEvent type: ${data.eventName}`); + if (data.eventName) { + this.mEventBus.emit(data.eventName, data.args); + return true; + } + return false; + } + + private startAbility(data: { [key: string]: any }): boolean { + Log.showInfo(TAG, `start Ability: ${data.abilityName}`); + if (data.bundleName && data.abilityName && this.mContext) { + this.mEventBus.emit(START_ABILITY_EVENT, { abilityName: data.abilityName }); + this.mContext.startAbility({ + bundleName: data.bundleName, + abilityName: data.abilityName, + parameters: data.args??undefined + }); + return true; + } + return false; + } + + private publishRemoteEvent(data: { [key: string]: any }): boolean { + return false; + } + + private publishCommonEvent(data: { [key: string]: any }): boolean { + return false; + } +} + +let sEventManager = createOrGet(EventManager, TAG); + +export default sEventManager as EventManager; \ No newline at end of file diff --git a/common/src/main/ets/default/event/EventUtil.ts b/common/src/main/ets/default/event/EventUtil.ts new file mode 100644 index 00000000..33ba707e --- /dev/null +++ b/common/src/main/ets/default/event/EventUtil.ts @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2022 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 Log from "../Log"; + +export type EventTarget = "local" | "remote" | "ability" | "commonEvent"; +export type Event = { + target: EventTarget; + data: { [key: string]: any }; +}; +export type EventParser = { + [key in EventTarget]: (data: any) => boolean; +}; +export type LocalEvent = { + eventName: string; + args: any; +}; + +export const START_ABILITY_EVENT = "startAbilityEvent"; +export const PUBLISH_COMMON_EVENT = "publishCommonEvent"; + +const TAG = "EventUtil"; +const LOCAL_EVENT_TYPE = "local"; +const START_ABILITY_TYPE = "ability"; + +export function obtainLocalEvent(event: string, args: any): Event & { data: LocalEvent } { + return { + target: LOCAL_EVENT_TYPE, + data: { + eventName: event, + args, + }, + }; +} + +export function obtainStartAbility(bundleName: string, abilityName: string, args?: any): Event { + return { + target: START_ABILITY_TYPE, + data: { + bundleName, + abilityName, + args + }, + }; +} + +export function parseEventString(eventString: string | undefined): Event | undefined { + // string must be "local=eventName|args" or "ability=bundleName|abilityName" + if (!eventString) { + return; + } + let [eventType, eventData] = eventString.split("="); + if (eventType == LOCAL_EVENT_TYPE && eventData) { + let [localEventName, args] = eventData.split("|"); + if (localEventName) { + Log.showDebug(TAG, `parseEventData name:${localEventName}, args: ${args}`); + return obtainLocalEvent(localEventName, args); + } + } + if (eventType == START_ABILITY_TYPE && eventData) { + let [bundleName, abilityName] = eventData.split("|"); + if (bundleName && abilityName) { + Log.showDebug(TAG, `parseEventData bundleName:${bundleName}, abilityName: ${abilityName}`); + return obtainStartAbility(bundleName, abilityName); + } + } + Log.showError(TAG, `Can't parse event data: ${eventString}`); + return undefined; +} diff --git a/entry/src/main/ets/AbilityStage.ts b/entry/src/main/ets/AbilityStage.ts index 6a0eb2f8..037862f7 100644 --- a/entry/src/main/ets/AbilityStage.ts +++ b/entry/src/main/ets/AbilityStage.ts @@ -14,7 +14,7 @@ */ import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../common/src/main/ets/default/Log' const TAG = "MainAbilityStage" diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ets b/features/batterycomponent/src/main/ets/default/batteryModel.ets deleted file mode 100644 index 481c4377..00000000 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ets +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../common/src/main/ets/default/Log.ets'; -import Constants from './common/constants.ets'; -import BatteryInfo from '@ohos.batteryInfo'; -import BatterySubscriber from '@ohos.commonEvent'; - -const TAG = 'BatteryComponent-batteryModel'; - -let mProgress = Constants.DEFAULT_PROGRESS; -let mBatteryEventSubscriber = null; -let mBatteryEventSubscribeInfo = { - events: ['usual.event.BATTERY_CHANGED'] -} -var mBatterySoc; -var mBatteryCharging; - -export class BatteryModel { - initBatteryModel() { - Log.showInfo(TAG, 'initBatteryModel'); - mBatterySoc = AppStorage.SetAndLink('batterySoc', 0); - mBatteryCharging = AppStorage.SetAndLink('batteryCharging', false); - if (mBatteryEventSubscriber == null) { - this.registerBatteryListener(); - } - this.getBatteryStatus(); - } - - uninitBatteryModel() { - Log.showInfo(TAG, 'uninitBatteryModel'); - this.unregisterBatteryListener(); - } - - /** - * Subscribe Battery events - */ - private registerBatteryListener() { - Log.showInfo(TAG, 'registerBatteryListener start'); - BatterySubscriber.createSubscriber( - mBatteryEventSubscribeInfo, - this.createBatterySubscriberCallBack.bind(this) - ); - } - - /** - * Unsubscribe wifi events - * - */ - private unregisterBatteryListener() { - Log.showInfo(TAG, 'unregisterBatteryListener'); - BatterySubscriber.unsubscribe(mBatteryEventSubscriber, () => { - Log.showInfo(TAG, `unregister Battery Status Listener ===============`); - }); - } - - /** - * Callback of the subscriber - * - * @param {Object} err - error returns from the caller - * @param {Object} data - data returns from the caller - */ - - private createBatterySubscriberCallBack(err, data) { - Log.showInfo(TAG, `Subscriberregister createBatterySubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - mBatteryEventSubscriber = data; - BatterySubscriber.subscribe(mBatteryEventSubscriber, this.batterySubscriberCallBack.bind(this)); - } - - - /** - * Callback of the events - * - * @param {Object} err - error returns from the caller - * @param {Object} data - data returns from the caller - */ - - private batterySubscriberCallBack(err, data) { - Log.showInfo(TAG, `batterySubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - if (err.code == 0) { - if (data.event == 'usual.event.BATTERY_CHANGED') { - this.getBatteryStatus(); - } - } else { - Log.showInfo(TAG, 'Subscriberregister error when subscribing ========'); - } - } - - - /** - * Get battery status and remaining power - */ - private getBatteryStatus() { - Log.showInfo(TAG,'getBatteryStatus') - let batterySoc = BatteryInfo.batterySOC; - let batteryCharging = BatteryInfo.chargingStatus; - if (null == batterySoc) { - // Set the battery Soc as full when there is no battery hardware - batterySoc = mProgress; - } - if (batterySoc <= 0) { - // If the result is a negative number, set it as positive number. - batterySoc = Math.abs(batterySoc) * Constants.PERCENT_NUMBER; - } - // Set the battery status as charging when there is no battery hardware - this.checkBatteryStatus(batteryCharging, (result) => { - let batteryStatus = result; - mBatterySoc.set(batterySoc); - mBatteryCharging.set(batteryStatus); - }); - } - - /** - * Check the battery charging status - * - * @param {number} charging - the battery charging status - * @param {object} callback - Function callback - */ - private checkBatteryStatus(charging, callback) { - Log.showInfo(TAG, `checkBatteryStatus charging: ${charging}`); - let batteryStatus; - switch (charging) { - case Constants.NONE: - batteryStatus = false; - break; - case Constants.DISABLE: - case Constants.ENABLE: - case Constants.FULL: - batteryStatus = true; - break; - default: - batteryStatus = false; - break; - } - callback(batteryStatus); - } -} - -let mBatteryModel = new BatteryModel(); -export default mBatteryModel as BatteryModel; diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts new file mode 100644 index 00000000..90a4642e --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2022 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 BatteryInfo from "@ohos.batteryInfo"; +import commonEvent from "@ohos.commonEvent"; +import createOrGet from "../../../../../../common/src/main/ets/default/SingleInstanceHelper"; +import Constants from "./common/constants"; +import Log from "../../../../../../common/src/main/ets/default/Log"; +import { CommonEventData } from "commonEvent/commonEventData"; +import { + CommonEventManager, + getCommonEventManager, + POLICY, +} from "../../../../../../common/src/main/ets/default/commonEvent/CommonEventManager"; + +const TAG = "BatteryComponent-batteryModel"; +const DEFAULT_PROGRESS = 100; +const SUBSCRIBE_INFO = { + events: [commonEvent.Support.COMMON_EVENT_BATTERY_CHANGED], +}; + +function getChargingStatus(state: typeof BatteryInfo.BatteryChargeState): boolean { + Log.showInfo(TAG, `charging status update: ${state}`); + let batteryStatus = false; + switch (state) { + case BatteryInfo.BatteryChargeState.DISABLE: + case BatteryInfo.BatteryChargeState.ENABLE: + case BatteryInfo.BatteryChargeState.FULL: + batteryStatus = true; + break; + default: + batteryStatus = false; + break; + } + return batteryStatus; +} + +export class BatteryModel { + private mBatterySoc: any; + private mBatteryCharging: any; + private mManager?: CommonEventManager; + + initBatteryModel() { + if (this.mManager) { + return; + } + this.mManager = getCommonEventManager( + TAG, + SUBSCRIBE_INFO, + () => this.updateBatteryStatus(), + (isSubscribe: boolean) => isSubscribe && this.updateBatteryStatus() + ); + Log.showInfo(TAG, "initBatteryModel"); + this.mBatterySoc = AppStorage.SetAndLink("batterySoc", 0); + this.mBatteryCharging = AppStorage.SetAndLink("batteryCharging", false); + this.mManager.subscriberCommonEvent(); + this.mManager.applyPolicy([POLICY.SCREEN_POLICY]); + } + + unInitBatteryModel() { + Log.showInfo(TAG, "unInitBatteryModel"); + this.mManager?.release(); + this.mManager = undefined; + } + + /** + * Get battery status and remaining power + */ + private updateBatteryStatus() { + Log.showInfo(TAG, "updateBatteryStatus"); + let batterySoc = BatteryInfo.batterySOC ?? DEFAULT_PROGRESS; + let batteryCharging = BatteryInfo.chargingStatus; + if (batterySoc <= 0) { + // If the result is a negative number, set it as positive number. + batterySoc = Math.abs(batterySoc) * Constants.PERCENT_NUMBER; + } + + Log.showInfo(TAG, "batterySoc = " + batterySoc); + + // Set the battery status as charging when there is no battery hardware + this.mBatterySoc.set(batterySoc); + this.mBatteryCharging.set(getChargingStatus(batteryCharging)); + } +} + +let mBatteryModel = createOrGet(BatteryModel, TAG); +export default mBatteryModel as BatteryModel; diff --git a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts new file mode 100644 index 00000000..23be8d20 --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import Constants from './Constants' + +const TAG = 'battery-StyleConfiguration'; + +export default class StyleConfiguration { + static getBatteryComponentStyle() { + const key: string = TAG + "-BatteryComponent"; + return StyleManager.getStyle(key, () => { + return { + componentGap: $r('app.float.battery_component_gap') + }; + }); + } + + static getBatteryPicStyle() { + const key: string = TAG + "-BatteryPicComponent"; + return StyleManager.getStyle(key, () => { + return { + picGap: $r('app.float.battery_component_pic_gap'), + picBodyWidth: $r('app.float.battery_component_pic_body_width'), + picBodyHeight: $r('app.float.battery_component_pic_body_height'), + picBodyPadding: $r('app.float.battery_component_pic_body_padding'), + picBodyBorderWidth: $r('app.float.battery_component_pic_body_border_width'), + picBorderRadius: $r('app.float.battery_component_pic_border_radius'), + picHeadBorderRadius: $r('app.float.battery_component_pic_head_radius'), + picChargingColor: $r('app.color.battery_component_pic_charging_color'), + picLevelLowColor: $r('app.color.battery_component_pic_level_low_color'), + picHeadWidth: $r('app.float.battery_component_pic_head_width'), + picHeadHeight: $r('app.float.battery_component_pic_head_height'), + }; + }); + } +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/common/constants.ets b/features/batterycomponent/src/main/ets/default/common/constants.ets deleted file mode 100644 index d40572fc..00000000 --- a/features/batterycomponent/src/main/ets/default/common/constants.ets +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2021 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 default class Constants { - - //layout params - Icon - static WHOLE_CONTAINER_MARGIN = 2 - static WHOLE_CONTAINER_WIDTH = 100 - static WHOLE_CONTAINER_HEIGHT = 24 - static PIC_CONTAINER_WIDTH = '70%' - static PIC_CONTAINER_HEIGHT = '85%' - //layout params - Pic - static FULL_CONTAINER_WIDTH = '100%' - static FULL_CONTAINER_HEIGHT = '100%' - static BATTERY_BORDER_WIDTH = '88%' - static BATTERY_BORDER_HEIGHT = '80%' - static BATTERY_BORDER_RADIUS = 2 - static BATTERY_BORDER_MARGIN = 2 - static BATTERY_CONTENT_PADDING = 2 - static BATTERY_DECORATOR_WIDTH = '10%' - static BATTERY_DECORATOR_HEIGHT = '50%' - static BATTERY_DECORATOR_MARGIN = 2 - //layout params - Soc - static SOC_FONT_SIZE = 16 - - //value - static BATTERY_LEVEL_LOW = 20 - - static NONE = 0; - static ENABLE = 1; - static DISABLE = 2; - static FULL = 3; - static PERCENT_NUMBER = 100; - static DEFAULT_PROGRESS = 100; - -} \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/common/constants.ts b/features/batterycomponent/src/main/ets/default/common/constants.ts new file mode 100644 index 00000000..30f651a3 --- /dev/null +++ b/features/batterycomponent/src/main/ets/default/common/constants.ts @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2021-2022 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 default class Constants { + static BATTERY_LEVEL_LOW = 20 + static PERCENT_NUMBER = 100; +} diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index 05a18b38..e62c6693 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,12 +13,16 @@ * limitations under the License. */ -import mBatteryModel from '../batteryModel.ets'; -import BatteryPic from './batteryPic.ets' +import mBatteryModel from '../batteryModel'; +import BatteryPic from './batteryPic' import BatterySoc from './batterySoc' -import Constants from '../common/constants.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' - +import Constants from '../common/constants' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' +import {StatusBarGroupComponentData +} from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' +import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vM/StatusBarVM' const TAG = 'BatteryComponent-batteryIcon' @@ -26,34 +30,29 @@ const TAG = 'BatteryComponent-batteryIcon' export default struct BatteryIcon { @StorageLink('batterySoc') batterySoc: number = 100 @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + private mGroupId: string = '' + @State mStatusBarGroupComponentData: StatusBarGroupComponentData = new StatusBarGroupComponentData() + @State style: any = StyleConfiguration.getBatteryComponentStyle() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { + this.mStatusBarGroupComponentData = StatusBarVM.getStatusBarGroupComponentData(this.mGroupId) mBatteryModel.initBatteryModel(); Log.showInfo(TAG, 'aboutToAppear'); } aboutToDisappear() { - mBatteryModel.uninitBatteryModel(); Log.showInfo(TAG, 'aboutToDisappear'); } build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - BatterySoc() - } - - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - BatteryPic() - } -// .width('70%') -// .height('100%') - .width('40%') - .height('42%') - .margin({right:$r('app.float.battery_margin')}) + Row() { + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + BatterySoc({ mContentColor: this.mStatusBarGroupComponentData.contentColor }) + Row().width(this.style.componentGap).height('100%') + BatteryPic({ mContentColor: this.mStatusBarGroupComponentData.contentColor }) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } - .width(Constants.WHOLE_CONTAINER_WIDTH * this.StatusCoefficient) - .height(Constants.WHOLE_CONTAINER_HEIGHT * this.StatusCoefficient) - .margin($r('app.float.whole_container_margin')) + .height('100%') } -} +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets index d7eb72c9..bd675b20 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,8 +13,10 @@ * limitations under the License. */ -import Constants from '../common/constants.ets' -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Constants from '../common/constants' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import StyleConfiguration from '../common/StyleConfiguration' + const TAG = 'BatteryComponent-batteryPic' @Component @@ -22,6 +24,9 @@ export default struct BatteryPic { @StorageLink('batterySoc') batterySoc: number = 100 @StorageLink('batteryCharging') batteryCharging : boolean = false + @Prop mContentColor: string + @State style: any = StyleConfiguration.getBatteryPicStyle() + aboutToAppear(){ Log.showInfo(TAG,'aboutToAppear Start'); } @@ -32,45 +37,48 @@ struct BatteryPic { build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Row() { + Row() { + Row() { } .height('100%') - .width(this.batterySoc + '%') + .width((this.batterySoc < 100 ? this.batterySoc: 100) + '%') .backgroundColor(this.getBatteryColor(this.batterySoc, this.batteryCharging)) } - .width('88%') - .height('100%') + .width(this.style.picBodyWidth) + .height(this.style.picBodyHeight) .backgroundColor($r('app.color.battery_background')) - .border({ width: $r('app.float.battery_border_width'), - color: $r('app.color.battery_border'), - radius: $r('app.float.battery_border_radius'), + .border({ width: this.style.picBodyBorderWidth, + color: this.mContentColor, + radius: this.style.picBorderRadius, style: BorderStyle.Solid }) - .padding($r('app.float.battery_content_padding')) + .padding(this.style.picBodyPadding) + + Row() { + + } + .width(this.style.picGap) + .height(1) - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Row() { } - .width('10%') - .height('50%') - .backgroundColor($r('app.color.battery_border')) - .borderRadius($r('app.float.battery_border_radius')) - .margin({ left: $r('app.float.battery_decorator_margin') }) + .width(this.style.picHeadWidth) + .height(this.style.picHeadHeight) + .backgroundColor(this.mContentColor) + .borderRadius(this.style.picHeadBorderRadius) } - .width('100%') - .height('100%') } private getBatteryColor(val, charging) { Log.showInfo(TAG, `getBatteryColor, val: ${ val } charging: ${ charging } `); if (charging) { - return $r('app.color.battery_charging_color'); + return this.style.picChargingColor; } else if (val <= Constants.BATTERY_LEVEL_LOW) { - return $r('app.color.battery_low_color'); + return this.style.picLevelLowColor; } else { - return $r('app.color.battery_default_color'); + return this.mContentColor; } } } diff --git a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets index e76d44f8..fc268cef 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,12 +13,16 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' + const TAG = 'BatteryComponent-batterySoc' @Component export default struct BatterySoc { @StorageLink('batterySoc') batterySoc: number = 100 + @Prop mContentColor: string + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear(){ Log.showInfo(TAG,'aboutToAppear Start'); @@ -29,11 +33,8 @@ struct BatterySoc { } build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - Text(this.batterySoc + '%') - .height('100%') - .fontColor($r('app.color.battery_default_color')) - .fontSize($r('app.float.fontSize_network_state')) - } + Text(this.batterySoc + '%') + .fontColor(this.mContentColor) + .fontSize(this.styleCommon.statusBarFontSize) } } diff --git a/features/batterycomponent/src/main/resources/base/element/color.json b/features/batterycomponent/src/main/resources/base/element/color.json index d86a7a33..e4dfb894 100644 --- a/features/batterycomponent/src/main/resources/base/element/color.json +++ b/features/batterycomponent/src/main/resources/base/element/color.json @@ -1,18 +1,14 @@ { "color": [ { - "name": "battery_low_color", + "name": "battery_component_pic_level_low_color", "value": "#ff0000" - },{ - "name": "battery_default_color", - "value": "#ffffff" - },{ - "name": "battery_charging_color", + }, + { + "name": "battery_component_pic_charging_color", "value": "#00ff21" - },{ - "name": "battery_border", - "value": "#fff" - },{ + }, + { "name": "battery_background", "value": "#00000000" } diff --git a/features/batterycomponent/src/main/resources/base/element/float.json b/features/batterycomponent/src/main/resources/base/element/float.json index 42f42300..0bd8930e 100644 --- a/features/batterycomponent/src/main/resources/base/element/float.json +++ b/features/batterycomponent/src/main/resources/base/element/float.json @@ -1,36 +1,44 @@ { "float": [ { - "name": "fontSize_network_state", - "value": "16" + "name": "battery_component_gap", + "value": "8.5vp" }, { - "name": "whole_container_width", - "value": "100" + "name": "battery_component_pic_gap", + "value": "2vp" }, { - "name": "whole_container_margin", - "value": "2" + "name": "battery_component_pic_body_height", + "value": "19vp" }, { - "name": "battery_decorator_margin", - "value": "2" + "name": "battery_component_pic_body_width", + "value": "34.5vp" }, { - "name": "battery_border_radius", - "value": "2" + "name": "battery_component_pic_body_padding", + "value": "2vp" }, { - "name": "battery_content_padding", - "value": "2" + "name": "battery_component_pic_body_border_width", + "value": "1vp" }, { - "name": "battery_border_width", - "value": "1" + "name": "battery_component_pic_border_radius", + "value": "2vp" }, { - "name": "battery_margin", - "value": "20" + "name": "battery_component_pic_head_radius", + "value": "2vp" + }, + { + "name": "battery_component_pic_head_width", + "value": "3vp" + }, + { + "name": "battery_component_pic_head_height", + "value": "10vp" } ] } \ No newline at end of file diff --git a/features/clockcomponent/.gitignore b/features/clockcomponent/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/clockcomponent/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/notificationservice/build.gradle b/features/clockcomponent/build.gradle similarity index 100% rename from features/notificationservice/build.gradle rename to features/clockcomponent/build.gradle diff --git a/features/clockcomponent/src/main/config.json b/features/clockcomponent/src/main/config.json new file mode 100644 index 00000000..4d324788 --- /dev/null +++ b/features/clockcomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.clockcomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "clockcomponent", + "moduleType": "har" + }, + "srcPath": "default" + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets b/features/clockcomponent/src/main/ets/default/app.ets similarity index 80% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets rename to features/clockcomponent/src/main/ets/default/app.ets index ddf8ff81..2a3b6238 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/RuleData.ets +++ b/features/clockcomponent/src/main/ets/default/app.ets @@ -13,9 +13,11 @@ * limitations under the License. */ -export interface RuleData { - isAllowBanner:boolean; - sound:string; - vibration:string; - isAllowLockScreen:boolean; -} \ No newline at end of file +export default { + onCreate() { + console.info('Application onCreate') + }, + onDestroy() { + console.info('Application onDestroy') + }, +} diff --git a/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts new file mode 100644 index 00000000..0d70e4e5 --- /dev/null +++ b/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; + +const TAG = 'clock-StyleConfiguration'; + +export default class StyleConfiguration { + static getClockComponentStyle() { + const key: string = TAG + "-ClockComponent"; + return StyleManager.getStyle(key, () => { + return { + statusBarClockMaxWidth: $r('app.float.status_bar_clock_width') + }; + }); + } +} \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets new file mode 100644 index 00000000..b864ea8b --- /dev/null +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../common/src/main/ets/default/Log' +import StyleConfiguration from '../common/StyleConfiguration' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import {StatusBarGroupComponentData} from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' +import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vm/StatusBarVM' +import TimeManager, { + TimeEventArgs, + TIME_CHANGE_EVENT, +} from '../../../../../../../common/src/main/ets/default/TimeManager' +import EventManager, {unsubscribe} from '../../../../../../../common/src/main/ets/default/event/EventManager' + +const TAG = 'ClockComponent-clockIcon'; + +@Component +export default struct ClockIcon { + @State mTime: string = '16:01' + private mGroupId: string = '' + @State mStatusBarGroupComponentData: StatusBarGroupComponentData = new StatusBarGroupComponentData() + @State style: any = StyleConfiguration.getClockComponentStyle() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + unSubscriber?: unsubscribe; + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear'); + this.mStatusBarGroupComponentData = StatusBarVM.getStatusBarGroupComponentData(this.mGroupId) + this.unSubscriber = EventManager.subscribe(TIME_CHANGE_EVENT, (args: TimeEventArgs) => { + this.mTime = TimeManager.formatTime(args.date); + }); + this.mTime = TimeManager.formatTime(new Date()); + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear'); + this.unSubscriber && this.unSubscriber(); + this.unSubscriber = undefined; + } + + build() { + Row() { + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + Text(this.mTime) + .fontColor(this.mStatusBarGroupComponentData.contentColor) + .fontSize(this.styleCommon.statusBarFontSize) + .width(this.style.statusBarClockMaxWidth) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + } + } +} \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/base/element/color.json b/features/clockcomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..fd00ddfa --- /dev/null +++ b/features/clockcomponent/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "clock_text_color", + "value": "#fff" + } + ] +} \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/base/element/float.json b/features/clockcomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..4ee9f179 --- /dev/null +++ b/features/clockcomponent/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "status_bar_clock_width", + "value": "60vp" + } + ] +} \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/base/element/string.json b/features/clockcomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..2c0dec28 --- /dev/null +++ b/features/clockcomponent/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "clockcomponent_MainAbility", + "value": "clockcomponent_MainAbility" + }, + { + "name": "mainability_description", + "value": "ETS_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/base/media/icon.png b/features/clockcomponent/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { + this.setDateTime(args.date) + }); Log.showInfo(TAG, 'ViewModelInit end'); } - private timeFormatMonitor(): void { - Log.showInfo(TAG, 'timeFormatMonitor'); - let urivar = settings.getUri('settings.time.format') - let helper = featureAbility.acquireDataAbilityHelper(urivar); - this.checkTimeFormat(helper); - helper.on("dataChange", urivar, (err) => { - if (err.code !== 0) { - Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); - return; - } else { - this.checkTimeFormat(helper); - } - Log.showInfo(TAG, 'observer reveive notifychange on success data : ' + JSON.stringify(err)) - }) - } - - private checkTimeFormat(helper) { - Log.showInfo(TAG, 'checkTimeFormat'); - let getRetValue = settings.getValue(helper, 'settings.time.format', '24') - if (getRetValue === '12') { - this.isUsing24hFormat = false; - } else if (getRetValue === '24') { - this.isUsing24hFormat = true; - } - } - - private setDateTime() { + private setDateTime(date?: Date) { Log.showInfo(TAG, `setDateTime`) - this.timeVal = DateTimeCommon.getSystemTime(this.isUsing24hFormat) + this.timeVal = sTimeManager.formatTime(date ?? new Date()) this.dateVal = DateTimeCommon.getSystemDate() this.weekVal = DateTimeCommon.getSystemWeek() } + private createSubscriberCallBack(err, data) { + Log.showInfo(TAG, "start createSubscriberCallBack " + JSON.stringify(data)) + mEventSubscriber = data + commonEvent.subscribe(data, this.setDateTime.bind(this)); + Log.showInfo(TAG, "start createSubscriberCallBack finish") + } + stopPolling() { Log.showInfo(TAG, `stopPolling start`) - Log.showInfo(TAG, `stopPolling setDateTimeHandle:${this.setDateTimeHandle}`); - if (this.setDateTimeHandle > 0) { - clearInterval(this.setDateTimeHandle) - this.setDateTimeHandle = -1 - Log.showInfo(TAG, `stopPolling setDateTimeHandle new :${this.setDateTimeHandle}`); - } + commonEvent.unsubscribe(mEventSubscriber); + this.unSubscriber && this.unSubscriber(); + this.unSubscriber = undefined; Log.showInfo(TAG, `stopPolling end`) } - - onStatusChange(lockStatus: ScreenLockStatus): void { - Log.showInfo(TAG, `onStatusChange lockStatus:${lockStatus}`); - Log.showInfo(TAG, `onStatusChange setDateTimeHandle:${this.setDateTimeHandle}`); - if (lockStatus == ScreenLockStatus.Locking) { - if (this.setDateTimeHandle <= 0) { - this.setDateTimeHandle = setInterval(this.setDateTime.bind(this), Constants.INTERVAL); - Log.showInfo(TAG, `onStatusChange setDateTimeHandle new:${this.setDateTimeHandle}`); - } - } else { - this.stopPolling(); - } - } } diff --git a/features/datetimecomponent/src/main/resources/base/element/float.json b/features/datetimecomponent/src/main/resources/base/element/float.json index 9322ab7f..5c5ee149 100644 --- a/features/datetimecomponent/src/main/resources/base/element/float.json +++ b/features/datetimecomponent/src/main/resources/base/element/float.json @@ -14,7 +14,12 @@ }, { "name": "date_fontsize", - "value": "18" + "value": "36" + }, + { + "name": "date_week_area_height", + "value": "48" } + ] } \ No newline at end of file diff --git a/features/noticeitem/build.gradle b/features/noticeitem/build.gradle index 8d6704cb..ae402d92 100644 --- a/features/noticeitem/build.gradle +++ b/features/noticeitem/build.gradle @@ -1,5 +1,4 @@ apply plugin: 'com.huawei.ohos.library' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 ohos { compileSdkVersion rootProject.ext.version.compileSdk defaultConfig { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts new file mode 100644 index 00000000..29953759 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import WantAgent from '@ohos.wantAgent'; + +const TAG = 'CommonUtil'; +const DEFAULT_INFO = { + code: 0, + want: '', + permission: '', + extraInfo: {} +}; + +export default class CommonUtil { + static startWant(want, triggerInfo?: any) { + let info = (triggerInfo) ? triggerInfo : DEFAULT_INFO; + Log.showInfo(TAG, `startWant ${JSON.stringify(want)}, info ${JSON.stringify(info)}`); + WantAgent.trigger(want, info, ((err, data) => { + Log.showInfo(TAG, `wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); + })); + } + + static checkVisibilityByUser(notificationUser: number, currentUser: number): boolean{ + return (0 <= notificationUser && notificationUser < 100) || notificationUser == currentUser + } +} + + + diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts new file mode 100644 index 00000000..a2eea8fd --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'ScrollbarManager'; + +export default class ScrollbarManager { + static NotificationScrollBar = new Set(); + + static add(scroller) { + Log.showInfo(TAG, `add`); + let res = ScrollbarManager.NotificationScrollBar.add(scroller); + Log.showInfo(TAG, `add set's size:${res.size}`); + } + + static delete(scroller) { + Log.showInfo(TAG, `delete`); + ScrollbarManager.NotificationScrollBar.delete(scroller); + } + + static clear() { + Log.showInfo(TAG, `clear`); + ScrollbarManager.NotificationScrollBar.clear(); + } + + static restoreOtherScroll(scroller) { + Log.showInfo(TAG, `restoreOtherScroll`); + if (scroller.currentOffset().xOffset > 0) { + ScrollbarManager.NotificationScrollBar.forEach((item) => { + if (item !== scroller && item.currentOffset().xOffset > 0) { + item.scrollEdge(Edge.Start) + } + }) + ScrollbarManager.clear(); + ScrollbarManager.NotificationScrollBar.add(scroller); + } + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts similarity index 50% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets rename to features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts index f59e8b68..85aa6415 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -16,10 +16,13 @@ export default class Constants { static NOTIFICATION_TYPE_BASIC: string = '0'; static NOTIFICATION_TYPE_LONG: string = '1'; - static NOTIFICATION_TYPE_IMAGE: string = '2'; + static NOTIFICATION_TYPE_PICTURE: string = '2'; static NOTIFICATION_TYPE_MULTILINE: string = '4'; static NOTIFICATION_TYPE_SOCIAL: string = '3'; static NOTIFICATION_TYPE_MEDIA: string = '5'; + static NOTIFICATION_TYPE_NONE: number = 0; + static NOTIFICATION_TYPE_OPEN: number = 1; + static NOTIFICATION_TYPE_CLOSE: number = 2; static TEXT_MAX_LENGTH: number = 21; static TEXT_EXPANDED_MAX_LENGTH: number = 13; static TOUCH_TYPE_DOWN: number = 0; @@ -29,23 +32,60 @@ export default class Constants { static DISPLAY_TRANSLATE_X: number = -150; static REMOVE_TRANSLATE_X: number = 150; static DEFAULT_MAX_LINES: number= 1; + static SINGLE_LINE: number= 1; static EXPENDED_MAX_LINES: number= 8; static CONTENT_LINE_HEIGHT: number = 20; - static SETTING_CONT_HEIGHT = '50'; - static SETTING_DIALOG_WITH = '80%'; + static SETTING_CONT_HEIGHT = '40vp'; + static SETTING_DIALOG_WITH = '330vp'; static SETTING_CONTENT_WITH = '100%' - static SETTING_DIALOG_HEIGHT = '380'; - static CONFIRM_DIALOG_HEIGHT = '250' - static CONFIRM_DIALOG_WITH = '80%' - static CONFIRM_BUTTON_WITH = '50%' + static SETTING_DIALOG_HEIGHT = '192vp'; + static SETTING_DIALOG_WIDTH = '362vp'; + static CONFIRM_DIALOG_HEIGHT = '146vp'; + static CONFIRM_DIALOG_WITH = '280'; + static CONFIRM_BUTTON_WITH = '140'; static QUICKLY_SETTING_H = 83; static ERROR_CALLBACK: number = 0; static SUCCESS_CALLBACK: number = 1; + static KEY_INPUT: string = 'inputAction'; + static FULL_CONTAINER_WIDTH = '100%' +} + +export class NotificationLayout { + static ACTION_HEIGHT = 48; + static ACTION_MARGIN = 12; + static INPUT_IMAGE_SIZE = 24; + static INPUT_TEXT_HEIGHT = 40; + static INPUT_LAYOUT_HEIGHT = 82; + static NOTIFICATION_PIC_SIZE = 40; + static ICON_SIZE = 24; + static TEXT_LINE_HEIGHT = 20; + static BUTTON_SIZE = 40; + static ICON_MARGIN = 12; + static SCROLL_THRESHOLD = 10; + static TITLE_IMAGE_SIZE = 16; + static TITLE_HEIGHT = 40; + static ITEM_MARGIN = 12; + static EXPAND_PADDING_BOTTOM = 20; +} + +export class InputActionButtonData { + isSending: boolean = false; + content: string = ''; +} + +interface RuleData { + isAllowBanner?: boolean; + isAllowSound?: boolean; + isAllowVibrationValues?: boolean; + isAllowStatusBarShow?: boolean; + isAllowNotificationListShow?: boolean; } export interface NotificationItemData { id: string; hashcode: string; + userId: number; + uid: number; contentType: string; timestamp: number; time: string; @@ -53,8 +93,9 @@ export interface NotificationItemData { want: any; actionButtons: any[]; bundleName: string; - smallIcon?: Resource | string; - largeIcon?: Resource | string; + smallIcon?: PixelMap | string; + largeIcon?: PixelMap | string; + picture?: PixelMap; title?: string; text?: string; additionalText?: string; @@ -66,11 +107,26 @@ export interface NotificationItemData { slotLevel?: any; source?: number; versionName?: string; + sound?: string; + vibrationValues?: Array; + notificationFlags?: any; + ruleData?: RuleData; + template?: any; + isOngoing?: boolean; + isUnremovable?: boolean; + isRemoveAllowed?: boolean; + distributedOption?: any; + deviceId?: string; + groupName?: string; } export interface NotificationServiceListener { onNotificationConsume?: (data: NotificationItemData) => void; - onNotificationLoad?:(data: NotificationItemData) => void; - onNotificationCancel?:(data: NotificationItemData) => void; + onNotificationLoad?: (data: NotificationItemData) => void; + onNotificationCancel?: (data: NotificationItemData) => void; } +export enum ScreenLockStatus { + Locking = 1, + Unlock = 2 +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets deleted file mode 100644 index c7e08ae6..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/basicItem.ets +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2021 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 Constants from '../common/constants.ets'; -import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; - -@Component -export default struct BasicItem { - @State itemData: NotificationItemData= undefined - - build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Text(this.itemData.title) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - Text(this.itemData.text) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Clip }) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - .margin({ top: $r('app.float.content_margin_top') }) - }.width('100%') - } -} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets deleted file mode 100644 index 2cf14928..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/multiItem.ets +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2021 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 Constants from '../common/constants.ets'; -import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; - -@Component -export default struct MultiItem { - @State itemData: NotificationItemData= undefined - @Prop isExpand: boolean - - build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Text(this.isExpand ? this.itemData.longTitle : this.itemData.title) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - if (this.isExpand) { - ForEach(this.itemData.lines, - (item: string) => { - Text(`${item}`) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .margin({ top: $r('app.float.content_margin_top') }) - }, (item: string) => item.toString() - ) - } else { - Text(this.itemData.text) - .fontSize($r('app.float.notification_content_fontsize')) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontColor($r('app.color.content_text_color')) - .margin({ top: $r('app.float.content_margin_top') }) - } - }.width('100%') - } -} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets deleted file mode 100644 index 3b07e1fc..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/notificationItem.ets +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) 2021 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 Constants from '../common/constants.ets'; -import basicItem from './basicItem.ets'; -import longItem from './longItem.ets'; -import multiItem from './multiItem.ets'; -import titleItem from './titleItem'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import mNotificationService from '../../../../../../../../../features/notificationService/src/main/ets/com/ohos/notificationservice/NotificationService.ets' -import WantAgent from '@ohos.wantAgent'; -import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; -import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; - -const TAG = 'NoticeItem-NotificationItem'; -let mWindowManager; - -@Component -export default struct NotificationItem { - @Link showStatusBar: boolean - private itemData: NotificationItemData - @State hasPicture: boolean = false - @State isExpand: boolean = false - @State needExpand: boolean = true - @State deleteIconDisplay: boolean = false; - @State itemWidth: string = '100%' - startX: number = 0 - startY: number = 0 - @State moveX: number = 0 - @State moveY: number = 0 - - aboutToAppear() { - Log.showInfo(TAG, `aboutToDisAppear Start`) - mWindowManager = new WindowManager(); - if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { - this.hasPicture = false; - } else { - this.hasPicture = true; - } - this.needExpand=this.checkItemNeedExpand() - } - - checkItemNeedExpand(){ - if(this.itemData.contentType===Constants.NOTIFICATION_TYPE_BASIC&&(!(this.itemData.actionButtons?.length>0))){ - return false; - }else{ - return true; - } - } - - aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`); - } - - build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - Row() { - Column() { - titleItem({ - notificationSmallIcon: this.itemData.smallIcon, - notificationName: this.itemData.name, - notificationTime: this.itemData.time, - isExpand: $isExpand, - needExpand: this.needExpand - }) - - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC) { - basicItem({ - itemData: this.itemData - }); - } - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { - longItem({ - itemData: this.itemData, - isExpand: this.isExpand - }); - } - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { - multiItem({ - itemData: this.itemData, - isExpand: this.isExpand - }); - } - } - .width(this.hasPicture ? '85%' : '100%') - .margin({ top: $r('app.float.body_margin_top') }) - - if (this.hasPicture) { - Column() { - Image(this.itemData.largeIcon) - .objectFit(ImageFit.Contain) - .width(50) - .height(50) - } - .alignItems(HorizontalAlign.End) - .width('15%') - } - }.onClick(this.clickItem.bind(this)) - - if(this.isExpand){ - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - ForEach(this.itemData.actionButtons, (item: any) => { - Text(item.title) - .fontSize(20) - .height(30) - .fontColor(Color.Blue) - .margin({ right: 20 }) - .onClick(() => { - Log.showInfo(TAG, `clickbuttonEvent: ${JSON.stringify(item.wantAgent)}`) - this.startTargetAbility(item.wantAgent) - }) - }) - } - .margin({ top: 10 }) - } - } - .backgroundColor($r('app.color.notificationitem_background')) - .opacity($r('app.float.item_opicaty')) - .borderRadius($r('app.float.item_borderradius')) - .margin({ - left: $r('app.float.item_marginleft'), - right: $r('app.float.item_marginright'), - top: $r('app.float.item_margintop') - }) - .padding({ - left: $r('app.float.item_paddingleft'), - right: $r('app.float.item_paddingright'), - bottom: $r('app.float.item_paddingbottom') - }) - .onTouch(this.touchNotificationItem.bind(this)) - .width(this.itemWidth) - - if (this.deleteIconDisplay) { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { - Image($r('app.media.delete')) //delete - .objectFit(ImageFit.Contain) - .width($r('app.float.item_delete_image_width')) - .height($r('app.float.item_delete_image_height')) - .onClick(() => { - this.removeNotificationItem(this.itemData.hashcode); - }) - } - .width('30%') - } - } - } - } - - touchNotificationItem(event: TouchEvent) { - if (event.type == Constants.TOUCH_TYPE_DOWN) { //down - this.startX = event.touches[0].x; - this.startY = event.touches[0].y; - Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`); - } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move - this.moveX = event.touches[0].x - this.startX; - this.moveY = event.touches[0].y - this.startY; - } else if (event.type == Constants.TOUCH_TYPE_UP) { //up - Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); - if (this.deleteIconDisplay) { - if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { - //hidden - this.deleteIconDisplay = false; - this.itemWidth = '100%'; - Log.showInfo(TAG, 'hidden'); - } - } else { - if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { - this.deleteIconDisplay = true; - this.itemWidth = '70%'; - Log.showInfo(TAG, 'display'); - } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { - this.removeNotificationItem(this.itemData.hashcode); - } - } - } - } - - removeNotificationItem(hashCode: string) { - Log.showInfo(TAG, 'removeNotificationItem'); - mNotificationService.removeNotificationItem(hashCode, true); - } - - clickItem() { - Log.showInfo(TAG, 'click Item'); - this.startTargetAbility(this.itemData.want); - } - - startTargetAbility(want) { - Log.showInfo(TAG, 'startTargetAbility'); - //close window - this.showStatusBar = true; - mWindowManager.setWindowMin((result) => { - Log.showInfo(TAG, `setWindowMin ${result}`); - }); - //open app - Log.showInfo(TAG, `itemClick wantAgent ${JSON.stringify(this.itemData.want)} id: ${this.itemData.id}`); - let TriggerInfo = { - code: 0, - want: '', - permission: '', - extraInfo: {} - }; - WantAgent.trigger(want, TriggerInfo, ((err, data) => { - Log.showInfo(TAG, `itemClick wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); - })); - //remove notification - this.removeNotificationItem(this.itemData.hashcode); - } -} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets deleted file mode 100644 index c2d73539..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/titleItem.ets +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2021 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 Constants from '../common/constants.ets'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; - -const TAG = 'NoticeItem-TitleItem'; - -@Component -export default -struct TitleItem { - private notificationSmallIcon: PixelMap - @Prop notificationName: string - @Prop notificationTime: string - @State srcIconDisplay: any = $r('app.media.ic_notification_down') - @Link isExpand: boolean - @Prop needExpand: boolean - @State rowSpace: any = $r('app.float.titleitem_row_space') - - aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`); - } - - aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`); - } - - build() { - Row() { - Row({ space: this.rowSpace }) { - if (!CheckEmptyUtils.isEmpty(this.notificationSmallIcon)) { - Image(this.notificationSmallIcon) - .objectFit(ImageFit.Contain) - .width($r('app.float.title_image_width')) - .height($r('app.float.title_image_height')) - .flexShrink(0) - } - Text(this.notificationName) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.title_name_fontsize')) - .flexShrink(1) - Text(this.notificationTime) - .fontSize($r('app.float.title_time_fontsize')) - .flexShrink(0) - } - .width(this.needExpand ? '80%' : '100%') - - if (this.needExpand) { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End, alignItems: ItemAlign.Center }) { - Image(this.srcIconDisplay) - .objectFit(ImageFit.Contain) - .width($r('app.float.displayicon_width')) - .height($r('app.float.displayicon_height')) - } - .width('20%') - } - } - .height($r('app.float.titleitem_height')) - .width('100%') - .onClick(this.clickTitleItem.bind(this)) - } - - clickTitleItem() { - Log.showInfo(TAG, 'clickTitleItem'); - if (this.needExpand) { - if (this.isExpand) { - this.isExpand = false; - this.srcIconDisplay = $r('app.media.ic_notification_down'); - } else { - this.isExpand = true; - this.srcIconDisplay = $r('app.media.ic_notification_up'); - } - } - } -} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts similarity index 46% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets rename to features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts index 10ab1659..3ef07047 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,22 +13,36 @@ * limitations under the License. */ -import ReadConfigUtil from '../../../../../../../../../common/src/main/ets/default/ReadConfigUtil.ets'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; - -const FILE_URI = '/data/accounts/account_0/applications/com.ohos.systemui' -+ '/com.ohos.systemui.statusbar/assets/{0}/resources/rawfile/notificationConfig.json' +import ReadConfigUtil from '../../../../../../../../../common/src/main/ets/default/ReadConfigUtil'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NotificationConfig' +/** + * Notification Flow Config: + * limitTotal:Total number of notifications that can be displayed.Beyond the range will not be displayed. + * app:The application configuration that app needs to limit is in this array. + * See the following for specific configuration attributes: + * --bundleName:Application bundleName. + * --canShow:Specifies whether application notifications can be displayed. + * --limit:Specifies the total number of notifications that the application can display. + * Beyond the range will not be displayed. + */ +const Config = { + "limitTotal": 10000, + "app": + [ + { "bundleName": "com.ohos.publishnotifications", "canShow": true, "limit": 100 }, + { "bundleName": "com.ohos.app2", "canShow": true, "limit": 100 } + ] +} + export class NotificationConfig { - static USE_NOTIFICATION_ICON = true; + static USE_NOTIFICATION_ICON = true; - readNotificationConfig(deviceType: string): any{ - Log.showInfo(TAG, `readSlidingLength deviceType:${deviceType}`); - let notificationConfig = ReadConfigUtil.ReadConfigFile(FILE_URI.replace('{0}', deviceType)) - return notificationConfig - } + readNotificationConfig(deviceType?: string): any{ + return Config + } } let notificationConfig = new NotificationConfig(); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts new file mode 100644 index 00000000..f2c94c4f --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import DeviceManager from '@ohos.distributedHardware.deviceManager'; +import DeviceInfo from '@ohos.deviceInfo'; + +const TAG = `NotificationDistributionManager`; + +let distributionManager = null; + +export default class NotificationDistributionManager { + deviceManager = null + + static getInstance() { + Log.showInfo(TAG, `getInstance`); + if (distributionManager == null) { + Log.showInfo(TAG, `getInstance distributionManager new`); + distributionManager = new NotificationDistributionManager(); + distributionManager.initDeviceManager(); + return distributionManager; + } + Log.showInfo(TAG, `getInstance return distributionManager`); + return distributionManager; + } + + constructor() { + Log.showInfo(TAG, `constructor`); + } + + initDeviceManager() { + Log.showInfo(TAG, `initDeviceManager`); + DeviceManager.createDeviceManager("com.ohos.systemui", (err, data) => { + if (err) { + console.info("createDeviceManager err:" + JSON.stringify(err)); + return; + } + console.info("createDeviceManager success"); + this.deviceManager = data; + }); + } + + getTrustedDeviceDeviceName(deviceId) { + Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceId:${deviceId}`); + let deviceName = ''; + let deviceArr:any[] = this.getTrustedDeviceListSync(); + Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceArr:${JSON.stringify(deviceArr)}`); + if (deviceArr && deviceArr.length > 0) { + for (let item of deviceArr) { + Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceArr item:${JSON.stringify(item)}`); + if (item.deviceId == deviceId) { + deviceName = item.deviceName; + break; + } + } + } + return deviceName; + } + + getTrustedDeviceListSync(): Array{ + Log.showInfo(TAG, `getTrustedDeviceListSync`); + return this.deviceManager.getTrustedDeviceListSync(); + } + + getLocalDeviceInfoSync() { + Log.showInfo(TAG, `getLocalDeviceInfoSync`); + return this.deviceManager.getLocalDeviceInfoSync(); + } + + release() { + this.deviceManager.release(); + } +} + +NotificationDistributionManager.getInstance(); \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts similarity index 30% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets rename to features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index 201b113c..8d77e847 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -15,16 +15,24 @@ //import { NotificationSubscriber } from './notification/notificationSubscriber'; import Notification from '@ohos.notification'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import PluginComponentManager from '@ohos.plugincomponent'; +import Systemparameter from '@ohos.systemparameter'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NotificationManager'; - +// Temporary path +const EXTERNAL_JSON_PATH = '/system/etc/NotificationTemplate/external.json' +const DEBUG_SETTING_KEY = 'debug.systemui.notificationtemplate'; +const DEBUG_BUNDLE_NAME = 'com.ohos.example.notificationtemplate' +const DEBUG_ABILITY_NAME = 'com.ohos.example.notificationtemplate.MainAbility' +const DEBUG_TEMPLATE_NAME = 'NotificationTemplate' export default class NotificationManager { - static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; + static TYPE_PICTURE: number = Notification.ContentType.NOTIFICATION_CONTENT_PICTURE; + static NotificationTemplateMap = new Map(); static subscribeNotification(tag, subscriber, asyncCallback) { Log.showInfo(TAG, `subscribeNotification from: ${tag}`); @@ -51,4 +59,108 @@ export default class NotificationManager { Notification.getAllActiveNotifications(callback); } + static enableNotification(tag, bundleOption, data, callback) { + Log.showInfo(TAG, `enableNotification from: ${tag}`); + Notification.enableNotification(bundleOption, data, callback); + } + + static initNotificationTemplateMap(tag) { + Log.showInfo(TAG, `initNotificationTemplateMap from: ${tag}`); + if (NotificationManager.isDebugMode(tag)) { + NotificationManager.requestDebugTemplate(tag); + } else { + NotificationManager.requestTemplate(tag, '', EXTERNAL_JSON_PATH); + } + } + + static request(tag, param, asyncCallback) { + Log.showInfo(TAG, `request from: ${tag}`); + PluginComponentManager.request(param, (err, data) => { + asyncCallback(err, data); + }); + } + + static push(tag, param, asyncCallback) { + Log.showInfo(TAG, `push from: ${tag}`); + PluginComponentManager.push(param, () => { + asyncCallback(); + }); + } + + static requestListener(tag, asyncCallback) { + Log.showInfo(TAG, `requestListener from: ${tag}`); + PluginComponentManager.on('request', (source, name, data) => { + asyncCallback(source, name, data); + }) + } + + static pushListener(tag, asyncCallback) { + Log.showInfo(TAG, `pushListener from: ${tag}`); + PluginComponentManager.on('push', (source, template, data, extraData) => { + asyncCallback(source, template, data, extraData); + }); + } + + static requestTemplate(tag, templateName, templatePath) { + Log.showInfo(TAG, `requestTemplate from: ${tag}`); + + let reqWant = { + bundleName: '', + abilityName: '' + }; + let reqData = {} + + let requestParam = { + want: reqWant, + name: templateName, + data: reqData, + jsonPath: templatePath + }; + + Log.showInfo(TAG, `requestTemplate requestParam: ${JSON.stringify(requestParam)}`) + NotificationManager.request(tag, requestParam, (err, data) => { + Log.showInfo(TAG, `request finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `request finished templateData: ${templateName} data: ${JSON.stringify(data.componentTemplate)}`) + if (data !== null && data !== undefined) { + Log.showInfo(TAG, `request finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`) + let templates = JSON.parse(data.componentTemplate.source); + Log.showInfo(TAG, `request templates: ${JSON.stringify(templates)}`) + for (let key in templates) { + NotificationManager.NotificationTemplateMap.set(key, { + "source": templates[key], "ability": "" + }); + } + } + }); + } + + static requestDebugTemplate(tag) { + Log.showInfo(TAG, `requestDebugTemplate from: ${tag}`); + let reqWant = { + bundleName: DEBUG_BUNDLE_NAME, + abilityName: DEBUG_ABILITY_NAME + }; + let reqData = {} + let requestParam = { + want: reqWant, + name: DEBUG_TEMPLATE_NAME, + data: reqData + }; + Log.showInfo(TAG, `requestDebugTemplate requestParam: ${JSON.stringify(requestParam)}`); + NotificationManager.request(tag, requestParam, (err, data) => { + Log.showInfo(TAG, `requestDebugTemplate finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + if (!!data) { + Log.showInfo(TAG, `requestDebugTemplate finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`) + NotificationManager.NotificationTemplateMap.set(DEBUG_TEMPLATE_NAME, data.componentTemplate); + } + }); + } + + static isDebugMode(tag): boolean{ + Log.showInfo(TAG, `isDebugMode from: ${tag}`); + let debug = Systemparameter.getSync(DEBUG_SETTING_KEY, "") + Log.showInfo(TAG, `Systemparameter DEBUG_SETTING: ${debug}`); + return!!debug; + } + } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts similarity index 31% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets rename to features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index 3dc91759..74f1facb 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -15,121 +15,146 @@ import notification from '@ohos.notification'; import NotificationSubscriber from '@ohos.notificationSubscriber'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import NotificationManager from './NotificationManager.ets'; -import ParseDataUtil from './ParseDataUtil.ets'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import NotificationManager from './NotificationManager'; +import ParseDataUtil from './ParseDataUtil'; +import RuleController from './rule/RuleController'; +import CommonUtil from '../common/CommonUtil'; +import createOrGet from "../../../../../../../../../common/src/main/ets/default/SingleInstanceHelper"; +import DistributionManager from './NotificationDistributionManager'; const TAG = 'NotificationService'; -let mSubscriber; -let listeners; +interface NotificationListener { + userId: number; + onNotificationConsume: Function; + onNotificationCancel: (hashcode: number) => void; +} /** * notification service api */ export class NotificationService { - constructor() { - listeners = []; - this.init(); - } + mListeners = new Set(); + mSubscriber; + mSortingMap = {}; - init() { - this.loadAllNotifications(); + constructor() { this.subscribeNotification(this.getSubscriber()); + this.loadNotificationTemplate() } - public register(listener) { - Log.showInfo(TAG, "register listener") - listeners.push(listener); + public register(listener: NotificationListener) { + let res = this.mListeners.add(listener); + Log.showInfo(TAG, `register, listener size: ${res.size}`); } - public unRegister(listener) { - Log.showInfo(TAG, "unRegister listener") - let removedIndex = listeners.indexOf(listener); - if (removedIndex == -1) { - Log.showInfo(TAG, "unRegister listener, listener is not found"); - return; - } - listeners.splice(removedIndex, 1) - Log.showInfo(TAG, "unRegister listener success"); + public unRegister(listener: NotificationListener) { + let res = this.mListeners.delete(listener); + Log.showInfo(TAG, `unRegister, res: ${res}`); } - - public removeAll(){ + public removeAll() { Log.showInfo(TAG, 'removeAll start'); NotificationManager.removeAll(TAG, (data) => { Log.showInfo(TAG, `removeAll => data: ${JSON.stringify(data)}`); }); } - public remove(code: string) { - NotificationManager.remove(TAG, code,(data) => { + NotificationManager.remove(TAG, code, (data) => { Log.showInfo(TAG, `removeNotificationItem ==> data: ${JSON.stringify(data)}`); }) } public loadAllNotifications() { NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { - Log.showInfo(TAG, `getAllActiveNotifications err: ${JSON.stringify(err)}`); - Log.showInfo(TAG, `getAllActiveNotifications requestsArr: ${JSON.stringify(requestsArr)}`); + Log.showInfo(TAG, `getAllActiveNotifications error:${err}}, requestsArr: ${JSON.stringify(requestsArr)}`); if (Array.isArray(requestsArr)) { - for(let i = 0,len = requestsArr.length; i< len; i++) { - this.handleNotificationLoad(requestsArr[i]); + for (let i = 0, len = requestsArr.length; i < len; i++) { + this.handleNotificationAdd(requestsArr[i]); } } }) } getSubscriber() { - if (mSubscriber == null || mSubscriber == undefined) { - mSubscriber = { - onConsume: this.handleNotificationAdd.bind(this), + if (!this.mSubscriber) { + this.mSubscriber = { + onConsume: this.handleNotificationAddAndSortMap.bind(this), onCancel: this.handleNotificationCancel.bind(this), } } - return mSubscriber; + return this.mSubscriber; } - handleNotificationAdd(data) { - Log.showInfo(TAG, 'handleNotificationAdd started'); - Log.showInfo(TAG, 'sortingMap' + JSON.stringify(data.sortingMap||{})); - Log.showInfo(TAG, JSON.stringify(data)); - ParseDataUtil.parseData(data, (err, record) => { - Log.showInfo(TAG, `parseData after = ${JSON.stringify(record)}`); - Log.showInfo(TAG, `listeners.length = ${JSON.stringify(data)}`); - for(let i = 0,len = listeners.length; i< len; i++) { - Log.showInfo(TAG, `notify listener ` + i); - listeners[i].onNotificationConsume(record); - } - }); + handleNotificationAddAndSortMap(data) { + Log.showInfo(TAG, 'handleNotificationAddAndSortMap, sortingMap' + JSON.stringify(data.sortingMap || {})); + this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; + this.handleNotificationAdd(data?.request); } - handleNotificationCancel(data) { - console.info("===>handleNotificationCancel data : ==> " + `data:${JSON.stringify(data)}`); - ParseDataUtil.parseData(data, (err, record) => { - for(let i = 0,len = listeners.length; i< len; i++) { - listeners[i].onNotificationCancel(record); - } - }); + handleNotificationAdd(request) { + ParseDataUtil.parseData(request, this.mSortingMap).then((intermediateData) => { + Log.showInfo(TAG, `parseData after = ${JSON.stringify(intermediateData)}`); + RuleController.getNotificationData(intermediateData, (finalItemData) => { + Log.showInfo(TAG, `RuleController.getNotificationData after = ${JSON.stringify(finalItemData)}`); + this.mListeners.forEach((listener) => { + Log.showInfo(TAG, `notifcationUserId: ${finalItemData.userId}, listener.userId: ${listener.userId}`); + if (CommonUtil.checkVisibilityByUser(finalItemData.userId, listener.userId)) { + listener.onNotificationConsume(finalItemData); + } + }) + }); + }).catch(errorInfo => Log.showError(TAG, errorInfo)); } - handleNotificationLoad(data) { - console.info("===>handleNotificationLoad data : ==> " + `data:${JSON.stringify(data)}`); - ParseDataUtil.parseData(data, (err, record) => { - for(let i = 0,len = listeners.length; i< len; i++) { - listeners[i].onNotificationLoad(record); - } - }); + handleNotificationCancel(data) { + Log.showInfo(TAG, `handleNotificationCancel hashCode: ${JSON.stringify(data?.request?.hashCode)}`); + this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; + const hashCode = data?.request?.hashCode; + if (!hashCode) { + Log.showError(TAG, `handleNotificationCancel data: ${JSON.stringify(data)}`); + return; + } + this.mListeners.forEach((listener) => listener.onNotificationCancel(hashCode)); } subscribeNotification(subscriber) { - let callback = (err,data) => { + let callback = (err, data) => { Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) }; NotificationManager.subscribeNotification(TAG, subscriber, callback); } + + loadNotificationTemplate() { + Log.showInfo(TAG, 'loadNotificationTemplate start'); + NotificationManager.initNotificationTemplateMap(TAG); + } + + getPluginTempLate(templateName) { + Log.showInfo(TAG, `getPluginTempLate param:${templateName}`); + let pluginTempLate = null; + if (NotificationManager.NotificationTemplateMap !== null) { + pluginTempLate = NotificationManager.NotificationTemplateMap.get(templateName); + } + Log.showInfo(TAG, `getPluginTempLate pluginTempLate:${JSON.stringify(pluginTempLate)}`); + return pluginTempLate; + } + + enableNotification(bundleOption, data) { + Log.showInfo(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)} `); + NotificationManager.enableNotification(TAG, bundleOption, data, (result) => { + Log.showInfo(TAG, `enableNotification ==> result: ${JSON.stringify(result)}`); + }); + } + + getTrustedDeviceDeviceName(deviceId) { + Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceId:${JSON.stringify(deviceId)} `); + return DistributionManager.getInstance().getTrustedDeviceDeviceName(deviceId); + } } -let notificationService = new NotificationService(); +let notificationService = createOrGet(NotificationService, TAG); + export default notificationService as NotificationService; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts new file mode 100644 index 00000000..5c379faa --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import EventManager from "../../../../../../../../../common/src/main/ets/default/event/EventManager"; +import {obtainLocalEvent} from "../../../../../../../../../common/src/main/ets/default/event/EventUtil"; + +const TAG = `NotificationWindowManager`; + +class NotificationWindowManager { + + showNotificationWindow() { + } + + hideNotificationWindow() { + Log.showInfo(TAG, 'hide Notification window'); + EventManager.publish(obtainLocalEvent('hideNotificationWindowEvent', '')); + } +} + +let sNotificationWindowManager = new NotificationWindowManager(); + +export default sNotificationWindowManager as NotificationWindowManager; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets deleted file mode 100644 index 976d734f..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ets +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (c) 2021 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 Notification from '@ohos.notification'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import BundleManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager.ets'; -import NotificationManager from './NotificationManager.ets'; -import Constants,{NotificationItemData} from '../common/constants.ets'; -import {NotificationConfig} from './NotificationConfig.ets'; - -let mDate; -let mAppName; -let mEmptyArray; -const TAG = 'Notification_ParseDataUtil'; -mDate = new Date(); -mAppName = new Map(); -mEmptyArray = []; -let appDataMap = new Map(); - -/** - * parse data util class. - */ -export default class ParseDataUtil { - static parseData(data, callback) { - let request = data?.request; - if (request == null || request == undefined) { - Log.showInfo(TAG, 'consumeCallback request is empty'); - callback(Constants.ERROR_CALLBACK, undefined); - return; - } - let slotLevel; - try { - slotLevel = data?.sortingMap?.sortings[request.hashCode]?.slot.level; - } catch (e) { - Log.showInfo(TAG, `slot level get error: ${e.toString()}`); - } - Log.showInfo(TAG, `want = ${JSON.stringify(request.wantAgent)}`); - Log.showInfo(TAG, `actionButtons = ${JSON.stringify(request.actionButtons)}`); - Log.showInfo(TAG, `largeIcon = ${request.largeIcon}`); - ParseDataUtil.getAppData(request.creatorBundleName, (err, appMessage) => { - let notificationItem: NotificationItemData = { - id: request.id, - hashcode: request.hashCode, - contentType: request?.content?.contentType + '', - timestamp: request.deliveryTime, - time: ParseDataUtil.getStandardTime(request.deliveryTime), - appName: appMessage.appName, - want: request.wantAgent, - bundleName: request.creatorBundleName, - actionButtons: request.actionButtons, - smallIcon: NotificationConfig.USE_NOTIFICATION_ICON ? (request?.smallIcon ?? appMessage.icon) : appMessage.icon, - largeIcon: request.largeIcon, - slotLevel: slotLevel, - source: request.source - }; - Log.showInfo(TAG, `notificationItem construct over ====================`); - switch (request?.content?.contentType) { - case NotificationManager.TYPE_BASIC: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_BASIC_TEXT ====================`); - notificationItem.title = request.content.normal?.title ?? ''; - notificationItem.text = request.content.normal?.text ?? ''; - notificationItem.additionalText = request.content.normal?.additionalText ?? ''; - break; - case NotificationManager.TYPE_LONG: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_LONG_TEXT ====================`); - notificationItem.title = request.content.longText?.title ?? ''; - notificationItem.text = request.content.longText?.text ?? ''; - notificationItem.additionalText = request.content.longText?.additionalText ?? ''; - notificationItem.briefText = request.content.longText?.briefText ?? ''; - notificationItem.expandedTitle = request.content.longText?.expandedTitle ?? ''; - notificationItem.longText = request.content.longText?.longText ?? ''; - break; - case NotificationManager.TYPE_MULTI: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_MULTILINE ====================`); - notificationItem.title = request.content.multiLine?.title ?? ''; - notificationItem.text = request.content.multiLine?.text ?? ''; - notificationItem.additionalText = request.content.multiLine?.additionalText ?? ''; - notificationItem.briefText = request.content.multiLine?.briefText ?? ''; - notificationItem.longTitle = request.content.multiLine?.longTitle ?? ''; - notificationItem.lines = request.content.multiLine?.lines ?? mEmptyArray; - Log.showInfo(TAG, `multilines: ${JSON.stringify(request.content.multiLine?.lines)}`) - break; - default: - Log.showInfo(TAG, 'no match content type'); - break; - } - callback(Constants.SUCCESS_CALLBACK, notificationItem); - }) - } - - /** - * Get app data by bundleName. - * - * @param {string} bundleName - BundleName of the target app. - * @return {object} appData - */ - static getAppData(bundleName, callback) { - Log.showInfo(TAG, 'getAppName start ===================='); - if (appDataMap.has(bundleName)) { - callback(Constants.SUCCESS_CALLBACK,appDataMap.get(bundleName)); - return; - } - BundleManager.getBundleInfo(TAG, bundleName, 0, (data) => { - Log.showInfo(TAG, `getBundleInfo` + JSON.stringify(data)); - let labelId = data.appInfo.labelId; - let iconId = data.appInfo.iconId; - let appName = ''; - BundleManager.getResourceManager(TAG, bundleName, (item) => { - Log.showInfo(TAG, `BundleManager.getResourceManager ${BundleManager.getResourceManager}`); - item.getString(labelId, (error, value) => { - Log.showInfo(TAG, `getString` + JSON.stringify(value)); - if (value != null && value != undefined) { - appName = value - } - item.getMediaBase64(iconId, (error, MediaValue) => { - Log.showInfo(TAG, `getMediaBase64` + JSON.stringify(MediaValue)); - if (MediaValue != null) { - let appMessage = { - 'appName': appName, - 'icon': MediaValue - } - Log.showInfo(TAG, `appDataMap set appInfo, appName = ` + JSON.stringify(appName)); - if (appName != null && appName != undefined && appName != '') { - appDataMap.set(bundleName, appMessage); - } - Log.showInfo(TAG, `getAppData success, appMessage ` + JSON.stringify(appMessage)); - callback(Constants.SUCCESS_CALLBACK,appDataMap.get(bundleName)); - } - }); - }) - }) - }); - } - - /** - * Reformat the timestamp to hh:mm. - * - * @param {number} timestamp - Target timestamp. - */ - static getStandardTime(timestamp) { - Log.showInfo(TAG, 'getStandardTime start ===================='); - if (timestamp == 0 || timestamp == undefined || timestamp == null) { - return ''; - } - mDate.setTime(timestamp); - let hoursNumber = mDate.getHours(); - let minutesNumber = mDate.getMinutes(); - let hours = hoursNumber < 10 ? '0' + hoursNumber : hoursNumber; - let minutes = minutesNumber < 10 ? '0' + minutesNumber : minutesNumber; - return hours + ':' + minutes; - } -} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts new file mode 100644 index 00000000..499e2ca0 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2021-2022 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 Notification from '@ohos.notification'; +import AccountManager from '@ohos.account.osAccount'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import BundleManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager'; +import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import DistributionManager from './NotificationDistributionManager'; +import NotificationManager from './NotificationManager'; +import Constants, {NotificationItemData} from '../common/constants'; +import {NotificationConfig} from './NotificationConfig'; + +const TAG = 'Notification_ParseDataUtil'; +let mDate = new Date(); +let appDataMap = new Map(); + +type NotificationContent = { + title: string, + text: string, + additionalText: string, + briefText?: string, + expandedTitle?: string, + longText?: string, + lines?: [], + picture?: any +} + +async function getUserId(uid) { + let userId = await AccountManager.getAccountManager().getOsAccountLocalIdFromUid(uid); + Log.showInfo(TAG, `getOsAccountLocalIdFromUid uid = ${uid}, userId = ${userId}`); + return userId; +} + + +/** + * parse data util class. + */ +export default class ParseDataUtil { + static async parseData(request, sortingMap?) { + if (!request) { + return Promise.reject('consumeCallback request is empty'); + } + Log.showInfo(TAG, `parse data start, want = ${JSON.stringify(request.wantAgent)}`); + Log.showInfo(TAG, `actionButtons = ${JSON.stringify(request.actionButtons)}`); + let userId = await getUserId(request.creatorUid); + let appMessage = await ParseDataUtil.getAppData(request.creatorBundleName, userId); + let notificationItem: NotificationItemData = { + id: request.id, + userId: userId, + uid: request.creatorUid, + hashcode: request.hashCode, + contentType: request?.content?.contentType + '', + timestamp: request.deliveryTime, + time: ParseDataUtil.getStandardTime(request.deliveryTime), + appName: appMessage.appName, + want: request.wantAgent, + bundleName: request.creatorBundleName, + actionButtons: request.actionButtons, + smallIcon: NotificationConfig.USE_NOTIFICATION_ICON ? (request?.smallIcon ?? appMessage.icon) : appMessage.icon, + largeIcon: request.largeIcon, + slotLevel: sortingMap?.sortings[request?.hashCode]?.slot?.level, + source: request.source, + sound: sortingMap?.sortings[request?.hashCode]?.slot?.sound ?? '', + vibrationValues: sortingMap?.sortings[request?.hashCode]?.slot?.vibrationValues ?? [], + notificationFlags: request.notificationFlags, + template: request?.template, + isOngoing: request.isOngoing, + isUnremovable: request.isUnremovable, + isRemoveAllowed: request.isRemoveAllowed, + distributedOption: request.distributedOption, + deviceId: request.deviceId, + groupName: request.groupName??request.hashcode + }; + Log.showInfo(TAG, `notificationItem construct over ====================`); + notificationItem = { + ...notificationItem, ...ParseDataUtil.getContentByType(request?.content?.contentType, request) + } + return notificationItem; + } + + /** + * Get app data by bundleName. + * + * @param {string} bundleName - BundleName of the target app. + * @return {object} appData + */ + static async getAppData(bundleName, userId) { + Log.showInfo(TAG, `getAppName start by ${bundleName}`); + if (appDataMap.has(bundleName)) { + Log.showInfo(TAG, `getAppData success.`); + return appDataMap.get(bundleName); + } + let data = await BundleManager.getBundleInfo(TAG, bundleName, 0, userId); + let labelId = data?.appInfo?.labelId; + let iconId = data?.appInfo?.iconId; + let context = AbilityManager.getContext()??AbilityManager.getContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK); + let item = await BundleManager.getResourceManager(TAG, context, bundleName); + let appMessage = { + appName: labelId > 0 ? await item.getString(labelId) : '', + icon: iconId > 0 ? await item.getMediaBase64(iconId) : null + }; + if (appMessage.icon != null && appMessage.appName) { + appDataMap.set(bundleName, appMessage); + Log.showInfo(TAG, `getAppData success ${appMessage.appName} by ${bundleName}`); + } + + return appMessage; + } + + /** + * Reformat the timestamp to hh:mm. + * + * @param {number} timestamp - Target timestamp. + */ + static getStandardTime(timestamp) { + if (timestamp == 0 || timestamp == undefined || timestamp == null) { + return ''; + } + mDate.setTime(timestamp); + let hoursNumber = mDate.getHours(); + let minutesNumber = mDate.getMinutes(); + let hours = hoursNumber < 10 ? '0' + hoursNumber : hoursNumber; + let minutes = minutesNumber < 10 ? '0' + minutesNumber : minutesNumber; + return hours + ':' + minutes; + } + + static getContentByType(notificationType, request): NotificationContent { + let content = { + title: '', text: '', additionalText: '' + } + + function getContentByKey(keysAndDefault, source) { + if (source) { + keysAndDefault.forEach(([key, defualt]) => { + content[key] = source[key] ?? defualt + }) + } + } + + switch (notificationType) { + case NotificationManager.TYPE_BASIC: + getContentByKey([['title', ''], ['text', ''], ['additionalText', '']], request.content.normal) + break; + case NotificationManager.TYPE_LONG: + getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], + ['expandedTitle', ''], ['longText', '']], request.content.longText) + break; + case NotificationManager.TYPE_MULTI: + getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], + ['longTitle', ''], ['lines', []]], request.content.multiLine) + break; + case NotificationManager.TYPE_PICTURE: + getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], + ['expandedTitle', ''], ['picture', '']], request.content.picture) + break; + default: + Log.showInfo(TAG, 'no match content type'); + break; + } + Log.showInfo(TAG, `notificationType = ${notificationType}, content = ${JSON.stringify(content)}`); + return content + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets deleted file mode 100644 index d0578417..00000000 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ets +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2021 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 {NotificationItemData} from '../../common/constants.ets' -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; - -const TAG = 'RuleController'; - -export default class RuleController { - - - /** - * Check if this notification is allow show or not - * - * @param {notificationItemData} Data of the notification - * @param {callback} Data of the type to show the notification - */ - static getNotificationData(notificationItemData, callback) { - if (typeof notificationItemData !== NotificationItemData) { - Log.showInfo(TAG, "type is not NotificationItemData") - callback(undefined) - return - } - - this.this.isAllowSendNotification(notificationItemData.name, 0, "", (isSuccess) => { - if (!isSuccess) { - Log.showInfo(TAG, "user is not allow this to send notification") - callback(undefined) - return - } - this.isTooMuchNotification((isSuccess) => { - if (!isSuccess) { - Log.showInfo(TAG, "There are too much notification") - callback(undefined) - return - } - this.isAppTooMuchNotification(notificationItemData.name, 0, (isSuccess) => { - if (!isSuccess) { - Log.showInfo(TAG, "There are too much notification") - callback(undefined) - } - this.getNotificationDataByApp(notificationItemData.name, 0, "", (originData) => { - this.updateNotificationDataBySense(originData, (finialData) => { - callback(finalData) - }); - }); - }); - }); - }); - } - - /** - * Check if user allow the app send notification or not - * - * @param {name} Package name of the app - * @param {uid} Uid of the app to distinguish twin app - * @param {channelId} The channel id of the app which is used to send notification - * @param {callback} The user allow the app send notification or not - */ - private static isAllowSendNotification(name, uid, channelId, callback) { - // TODO 权限管理 - } - - /** - * Check there have been too much notification that there is no need to show another - * - * - * @param {callback} Send too much notification or not - */ - private static isTooMuchNotification(callback) { - // TODO 通知总条数显示限制 - } - - /** - * Check if the app send too much notification to can not show another from this app - * - * - * @param {name} Package name of the app - * @param {uid} Uid of the app to distinguish twin app - * @param {callback} Send too much notification or not - */ - private static isAppTooMuchNotification(name, uid, callback) { - // TODO 单应用通知显示限制 - } - - /** - * Get notification data of the notification channel - * - * @param {name} Package name of the app which send notification - * @param {uid} Uid of the app which send notification to distinguish twin app - * @param {channelId} The channel id of the app which is used to send notification - * @param {callback} The type to show notification - */ - private static getNotificationDataByApp(name, uid, channelId, callback) { - // TODO 提醒方式 - } - - /** - * Check the sense of the phone to update the show type - * - * @param {notificationData} The origin notification data - * @param {callback} The finial notification data - */ - private static updateNotificationDataBySense(notificationData, callback) { - // TODO 场景管理 - } -} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts new file mode 100644 index 00000000..5a0902fa --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2021-2022 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 {NotificationItemData} from '../../common/constants'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import {SlotLevel} from '@ohos.notification'; +import Notification from '@ohos.notification'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import Bundle from '@ohos.bundle'; + +const TAG = 'NotificationRuleController'; + +export class RuleController { + /** + * Check if this notification is allow show or not + * + * @param {notificationItemData} Data of the notification + * @param {callback} Data of the type to show the notification + */ + getNotificationData(notificationItemData: NotificationItemData, callback) { + Log.showInfo(TAG, "getNotificationData start") + + this.isAllowSendNotification(notificationItemData, (isSuccess) => { + if (!isSuccess) { + Log.showInfo(TAG, "user is not allow this to send notification"); + callback(undefined); + return; + } + this.getNotificationDataByApp(notificationItemData, (originalData) => { + Log.showInfo(TAG, `originalData = ${JSON.stringify(originalData)}`); + this.updateNotificationDataBySense(originalData, (finalData) => { + Log.showInfo(TAG, `finalData = ${JSON.stringify(finalData)}`); + callback(finalData); + }); + }); + }); + } + + /** + * Check if user allow the app send notification or not + * + * @param {notificationItemData} The origin notification data + * @param {callback} The user allow the app send notification or not + */ + isAllowSendNotification(notificationItemData, callback) { + Log.showInfo(TAG, "isAllowSendNotification start"); + Notification.isNotificationEnabled({ bundle: notificationItemData.bundleName, uid: notificationItemData.uid }) + .then((flag) => { + Log.showInfo(TAG, `Notification.isNotificationEnabled:` + flag) + callback(flag); + }); + } + + /** + * Check whether sound or vibration is allowed + * + * @param {notificationItemData} The origin notification data + * @param {callback} whether sound or vibration is allowed + */ + + SoundOrVibrate(notificationItemData, callback) { + Log.showInfo(TAG, "SoundOrVibrate start") + let sound = false; + let vibrationValues = false; + if (!CheckEmptyUtils.checkStrIsEmpty(notificationItemData.sound)) { + sound = true; + Log.showInfo(TAG, `notificationItemData.sound is allowed = ${sound}`); + } + if (!CheckEmptyUtils.isEmptyArr(notificationItemData.vibrationValues)) { + vibrationValues = true; + Log.showInfo(TAG, `notificationItemData.vibrationValues is allowed = ${vibrationValues}`); + } + callback(sound, vibrationValues); + } + + + /** + * Get notification data of the notification + * + * @param {notificationItemData} The origin notification data + * @param {callback} The type to show notification + */ + getNotificationDataByApp(notificationItemData, callback) { + Log.showInfo(TAG, "getNotificationDataByApp start") + let mNotificationItemData : NotificationItemData = notificationItemData; + mNotificationItemData.ruleData = { + isAllowBanner: false, + isAllowSound: false, + isAllowVibrationValues: false, + isAllowStatusBarShow : false, + isAllowNotificationListShow : false + }; + Log.showInfo(TAG, `notificationItemData.slotLevel = ${notificationItemData.slotLevel}`); + if (notificationItemData.slotLevel === SlotLevel.LEVEL_HIGH) { + mNotificationItemData.ruleData.isAllowBanner = true; + this.SoundOrVibrate(notificationItemData, (sound, vibrationValues) => { + mNotificationItemData.ruleData.isAllowSound = sound; + mNotificationItemData.ruleData.isAllowVibrationValues = vibrationValues; + }); + mNotificationItemData.ruleData.isAllowStatusBarShow = true; + mNotificationItemData.ruleData.isAllowNotificationListShow = true; + + } else if (notificationItemData.slotLevel === SlotLevel.LEVEL_DEFAULT) { + this.SoundOrVibrate(notificationItemData, (sound, vibrationValues) => { + mNotificationItemData.ruleData.isAllowSound = sound; + mNotificationItemData.ruleData.isAllowVibrationValues = vibrationValues; + }); + mNotificationItemData.ruleData.isAllowStatusBarShow = true; + mNotificationItemData.ruleData.isAllowNotificationListShow = true; + } else if (notificationItemData.slotLevel === SlotLevel.LEVEL_LOW || + notificationItemData.slotLevel === SlotLevel.LEVEL_MIN) { + mNotificationItemData.ruleData.isAllowNotificationListShow = true; + } else { + mNotificationItemData.ruleData.isAllowNotificationListShow = false; + } + Log.showInfo(TAG, `mNotificationItemData.ruleData = ${JSON.stringify(mNotificationItemData.ruleData)}`); + callback(mNotificationItemData); + } + + + + /** + * Check the sense of the phone to update the show type + * + * @param {notificationItemData} The origin notification data + * @param {callback} The final notification data + */ + updateNotificationDataBySense(notificationItemData, callback) { + Log.showInfo(TAG, "updateNotificationDataBySense start") + let mNotificationItemData = notificationItemData; + callback(mNotificationItemData); + } + +} + +let ruleController = new RuleController(); + +export default ruleController as RuleController; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index 2cafbbfa..e48c7011 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,24 +13,28 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; -import Constants from '../common/constants.ets'; -import NotificationItem from './item/notificationItem.ets' -import ViewModel from '../viewmodel/ViewModel.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import Constants, {NotificationLayout as Layout} from '../common/constants'; +import NotificationItem from './item/notificationItem' +import GroupNotificationItem from './item/groupItem' +import ViewModel from '../viewmodel/ViewModel' const TAG = 'NoticeItem-NotificationListComponent'; +type NotificationLayoutConfig = { + itemMargin: number; +} + @Component export default struct NotificationListComponent { + @Provide('notificationUpdate') update: number = 0; @StorageLink('notificationList') notificationList: any[] = [] - @StorageProp('maxHeight') maxHeight: number = 0 - @StorageProp('minHeight') minHeight: number = 0 - @State notificationH: number = 0 - + private config: NotificationLayoutConfig = { + itemMargin: Layout.ITEM_MARGIN + } aboutToAppear() { Log.showInfo(TAG, `notificationList, aboutToAppear`) - this.notificationH = this.maxHeight - (this.minHeight * 2) - Constants.QUICKLY_SETTING_H; } aboutToDisappear() { @@ -38,37 +42,21 @@ export default struct NotificationListComponent { } build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - if (this.notificationList.length == 0) { - //text: no notification - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { - Text($r('app.string.nonotification_text')) - .fontColor($r('app.color.nonotification_text_color')) + List({ space: this.config.itemMargin }) { + if (this.update && false) { + ListItem() { } - } else { - Stack({ alignContent: Alignment.TopStart }) { - List() { - ForEach(this.notificationList, (item: any) => { - ListItem() { - NotificationItem({ itemData: item }) - } - }, (item: any) => item.hashcode.toString()) + } + ForEach(this.notificationList, (item: any) => { + ListItem() { + if (item.length > 1) { + GroupNotificationItem({ groupData: item }) + } else { + NotificationItem({ itemData: item[0] }) } - .onTouch((event: TouchEvent) => { - Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) - event.stopPropagation(); - }) - - Flex() { //bottom Line - }.width('100%').height('7%') - .opacity($r('app.float.deleteall_image_opacity')) - .position({ x: 0, y: '93%' }) } - .width('100%') - .height('100%') - } + }, (list: any) => JSON.stringify(list.map((item) => item.hashcode))) } .width('100%') - .height(this.notificationH) } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets new file mode 100644 index 00000000..bfdf349d --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import ViewModel from '../../viewmodel/ViewModel'; +import Constants, {InputActionButtonData, NotificationLayout as Layout} from '../../common/constants'; + +const TAG = 'NoticeItem-ActionComponent'; + +@Component +export default struct ActionComponent { + @State showInputText: boolean = false; + @State placeholder: string = ''; + @State inputData: any = undefined; + @State inputActionData: InputActionButtonData = new InputActionButtonData(); + private itemData: any = undefined; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`); + let actionData = AppStorage.Get(Constants.KEY_INPUT + this.itemData.id); + this.inputActionData = (actionData instanceof InputActionButtonData) ? actionData : this.inputActionData; + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`); + } + + build() { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { + if (!this.inputData) { + ForEach(this.itemData.actionButtons, (item: any) => { + ActionButton({ + content: item.title, + clickEvent: () => { + if (CheckEmptyUtils.isEmpty(item.userInput)) { + ViewModel.clickItem(this.itemData, item.wantAgent); + } else { + this.inputData = { inputKey: item.userInput.inputKey, wantAgent: item.wantAgent }; + } + } + }) + }) + } else { + TextInput({ placeholder: this.placeholder, text: this.inputActionData.content }) + .type(InputType.Normal) + .caretColor(Color.Green) + .enterKeyType(EnterKeyType.Send) + .height(Layout.INPUT_TEXT_HEIGHT) + .enabled(this.inputActionData.isSending ? false : true) + .flexGrow(1) + .margin({ right: Layout.ACTION_MARGIN }) + Image($r("app.media.send")) + .objectFit(ImageFit.Contain) + .width(Layout.INPUT_IMAGE_SIZE) + .height(Layout.INPUT_IMAGE_SIZE) + .onClick(() => { + ViewModel.clickReply(this.inputData.inputKey, this.placeholder, this.inputData.wantAgent); + this.inputActionData = { + isSending: true, + content: this.placeholder + }; + AppStorage.SetOrCreate(Constants.KEY_INPUT + this.itemData.id, this.inputActionData); + }) + } + }.height(!this.inputData ? Layout.ACTION_HEIGHT : Layout.INPUT_LAYOUT_HEIGHT) + } +} + +@Component +struct ActionButton { + @State backgroundColor: Resource = $r("app.color.transparent"); + @Prop content: string; + clickable: boolean = true; + clickEvent: () => void = () => { + }; + + build() { + Text(this.content) + .fontSize($r("sys.float.ohos_id_text_size_button2")) + .fontColor($r("sys.color.ohos_id_color_text_primary_activated")) + .borderRadius($r("sys.float.ohos_fa_corner_radius_default_s")) + .height(Layout.ACTION_HEIGHT) + .padding({ left: Layout.ACTION_MARGIN, right: Layout.ACTION_MARGIN }) + .backgroundColor(this.backgroundColor) + .onTouch((event: TouchEvent) => { + if (!this.clickable) { + return; + } + if (event.type == TouchType.Down) { + this.backgroundColor = $r("sys.color.ohos_fa_click_effect"); + } else if (event.type == TouchType.Up) { + this.backgroundColor = $r("app.color.transparent"); + } + }) + .onClick(() => { + if (!this.clickable) { + return; + } + this.clickEvent(); + }) + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets new file mode 100644 index 00000000..d205b9b4 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import WindowManager, { WindowType } from '../../../../../../../../../../common/src/main/ets/default/WindowManager' +import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import ViewModel from '../../viewmodel/ViewModel'; +import CustomItem from './customItem'; +import titleItem from './titleItem'; +import basicItem from './basicItem'; +import longItem from './longItem'; +import multiItem from './multiItem'; +import pictureItem from './pictureItem'; +import ActionComponent from './actionComponent'; +import DevicesDialog from './devicesDialog'; +import WantAgent from '@ohos.wantAgent'; + +const TAG = 'NoticeItem-BannerNotificationItem' +const INTERVAL = 5 * 1000 + + +@Component +export default struct BannerNotificationItem { + @State want : any = {}; + @Link distributedDeviceName: string; + @Link mBannerNoticeCnt: number; + @Link mLastActionTime: number; + @Link needExpand: boolean; + @Link isExpand: boolean; + @State mCloseEnableFlg: boolean = false; + private nowWant: any; + private onBannerNoticeHide: () => void + private devicesDialogController: CustomDialogController = new CustomDialogController({ + builder: DevicesDialog({ + action: (deviceID) => this.selectedDevice(deviceID) + }), + autoCancel: false, + offset: { dx: 0, dy: 200 } + }); + + mInterval: number = INTERVAL; + mDefaultBannerRect: any; + expandPaddingBottom: number = Layout.EXPAND_PADDING_BOTTOM; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + setAppBgColor('#00000000') + this.mCloseEnableFlg = false; + this.mDefaultBannerRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect'); + setTimeout(() => { + this.hideWindowForTimeout(); + }, this.mInterval); + Log.showInfo(TAG, `aboutToAppear End`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`) + } + + build() { + Column() { + if (this.mBannerNoticeCnt > 0) { + if (this.want.template) { + CustomItem({ customItemData: this.want, isSubItem: false }) + } else { + Row() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Row() { + titleItem({ + notificationSmallIcon: this.want.smallIcon, + notificationName: this.want.appName, + notificationTime: this.want.time, + isExpand: $isExpand, + needExpand: this.needExpand, + distributedDeviceName: this.distributedDeviceName, + isSubItem: false, + clickTitleAction: () => this.refreshLastActionTime() + }) + } + Row() { + Image($r('app.media.ic_close')) + .objectFit(ImageFit.Contain) + .width(Layout.TITLE_IMAGE_SIZE) + .height(Layout.TITLE_IMAGE_SIZE) + .margin({ left: Layout.ICON_MARGIN }) + .visibility(this.mCloseEnableFlg ? Visibility.Visible : Visibility.None) + .onClick(this.clickCloseIcon.bind(this)) + } + } + .margin({ left: 12, right: 12 }) + .height(Layout.TITLE_HEIGHT) + } + Row() { + ContentComponent({ + isExpand: this.isExpand, + itemData: this.want + }); + if (this.isExpand && this.want.actionButtons.length) { + ActionComponent({ itemData: this.want }) + } else { + Blank() + .height(Layout.ITEM_MARGIN) + } + } + .padding({ + bottom: $r('app.float.item_paddingbottom') + }) + .onClick(this.showDevicesDialog.bind(this)) + .onAreaChange((e, e2) => { + Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + let heightEx = parseInt(e['height']); + let heightCur = parseInt(e2['height']); + let heightWin = parseInt(this.mDefaultBannerRect['height']); + if (this.isExpand) { + heightWin = heightWin + (heightCur - heightEx) + this.expandPaddingBottom; + } + let bannerRect = { + top: this.mDefaultBannerRect['top'], + left: this.mDefaultBannerRect['left'], + width: this.mDefaultBannerRect['width'], + height: heightWin + }; + WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, bannerRect); + WindowManager.showWindow(WindowType.BANNER_NOTICE); + }) + } + } else { + Row() { + Blank() + } + } + } + .width('100%') + .height('100%') + .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) + .backgroundColor($r('app.color.notificationitem_background')) + .clip(true) + .onHover((isHover) => { + this.mCloseEnableFlg = isHover; + }) + } + + isCreateNewNotification(notificationCount:number):boolean{ + Log.showInfo(TAG, `isCreateNewNotification, notificationCount: ${notificationCount}`); + return true; + } + + hideWindowForTimeout() { + Log.showInfo(TAG, `check need hide window or not.`) + if ((new Date()).getTime() - this.mLastActionTime >= this.mInterval) { + if (this.mCloseEnableFlg) { + this.mLastActionTime = (new Date()).getTime(); + setTimeout(() => { + this.hideWindowForTimeout(); + }, this.mInterval); + return; + } + this.onBannerNoticeHide(); + } else { + setTimeout(() => { + this.hideWindowForTimeout(); + }, this.mInterval); + } + } + + clickCloseIcon() { + Log.showInfo(TAG, 'clickCloseIcon'); + this.onBannerNoticeHide(); + } + + showDevicesDialog() { + Log.showInfo(TAG, `showDevicesDialog`) + if (!this.want?.distributedOption?.isDistributed) { + ViewModel.clickItem(this.want); + this.onBannerNoticeHide(); + return; + } + let wantAgent = this.want?.want; + if (!!wantAgent) { + WantAgent.getWant(wantAgent).then((wantData) => { + this.nowWant = wantData + if (!wantData?.deviceId) { + this.devicesDialogController.open(); + } else{ + ViewModel.clickItem(this.want); + } + this.onBannerNoticeHide(); + }) + } + } + + selectedDevice(deviceID) { + Log.showInfo(TAG, `selectedDevice deviceID:${deviceID}`) + this.nowWant.deviceId = deviceID; + let triggerInfo = { + code: 0, + want: this.nowWant, + permission: '', + extraInfo: {} + }; + ViewModel.clickDistributionItem(this.want, triggerInfo) + } + + refreshLastActionTime() { + this.mLastActionTime = (new Date()).getTime(); + setTimeout(() => { + this.hideWindowForTimeout(); + }, this.mInterval); + } + +} + +@Component +struct ContentComponent { + @Prop isExpand: boolean; + itemData: any; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToDisappear pict: ${this.itemData.picture}`); + Log.showInfo(TAG, `NotificationItemData: ${JSON.stringify(this.itemData)}`) + } + + build() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Row() { + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC) { + basicItem({ + itemData: this.itemData + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { + longItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { + multiItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_PICTURE) { + pictureItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + }.flexGrow(1) + + if (this.itemData.picture) { + Image(this.itemData.picture) + .objectFit(ImageFit.Contain) + .width(Layout.NOTIFICATION_PIC_SIZE) + .height(Layout.NOTIFICATION_PIC_SIZE) + } + }.margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets index d2751d7a..03886ba1 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,28 +13,28 @@ * limitations under the License. */ -import Constants,{NotificationItemData} from '../../common/constants.ets'; - +import Constants, {NotificationItemData, NotificationLayout as Layout} from '../../common/constants'; @Component export default struct BasicItem { - @State itemData: NotificationItemData= undefined + @State itemData: NotificationItemData = undefined build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Column() { Text(this.itemData.title) - .maxLines(Constants.DEFAULT_MAX_LINES) + .maxLines(Constants.SINGLE_LINE) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Medium) + .lineHeight(Layout.TEXT_LINE_HEIGHT) Text(this.itemData.text) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Clip }) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - .margin({ top: $r('app.float.content_margin_top') }) - }.width('100%') + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + } + .alignItems(HorizontalAlign.Start) } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets index 96f024fc..782d3fe7 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,8 +13,8 @@ * limitations under the License. */ -import Constants from '../../common/constants.ets'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; +import Constants from '../../common/constants'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NoticeItem-Confirm'; @@ -30,18 +30,19 @@ export default struct ConfirmDialog { build() { - Column({ space: 30 }) { + Column() { Row() { Text(this.title) .fontSize($r('app.float.confirm_title_fontsize')) .fontWeight(FontWeight.Bold) }.width(Constants.SETTING_DIALOG_WITH) - .margin({ top: 20 }) + .margin({top:$r('app.float.title_font_margin_t')}) Row() { Text($r('app.string.confirm_message', this.bundleName)) .fontSize($r('app.float.confirm_cont_fontsize')) }.width(Constants.SETTING_DIALOG_WITH) + .margin({top:$r('app.float.message_font_margin_t')}) Row() { Column() { @@ -53,7 +54,6 @@ export default struct ConfirmDialog { }) .alignItems(HorizontalAlign.Center) .width(Constants.CONFIRM_BUTTON_WITH) - Divider() .vertical(true) .color($r('app.color.confirm_divider_color')) @@ -63,7 +63,6 @@ export default struct ConfirmDialog { Text($r('app.string.close')) .fontSize($r('app.float.confirm_cont_fontsize')) .fontColor(Color.Red) - }.onClick(() => { Log.showInfo(TAG, `confirm button of TimeDialog on click`) this.controller.close(); @@ -73,8 +72,11 @@ export default struct ConfirmDialog { .width(Constants.CONFIRM_BUTTON_WITH) } .width(Constants.CONFIRM_DIALOG_WITH) - .height($r('app.float.confirm_button_height')) + .margin({top:$r('app.float.confirm_button_margin_t')}) }.height(Constants.CONFIRM_DIALOG_HEIGHT) - + .width(Constants.SETTING_DIALOG_WIDTH) + .backgroundColor('#FFFFFFFF') + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.notification_border_radius') }) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets new file mode 100644 index 00000000..2f58674e --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import ViewModel from '../../viewmodel/ViewModel'; +import NotificationManager from '../../model/NotificationManager'; + +const TAG = 'NoticeItem-CustomItem'; + +@Component +export default struct CustomItem { + private customItemData: any = {}; + private template: any = {}; + private templateData: any = {}; + private isSubItem: boolean= false; + @State isDebugMode: boolean = false; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + this.template = ViewModel.getPluginTempLate(this.customItemData.template.name); + this.templateData = this.customItemData.template.data; + this.isDebugMode = NotificationManager.isDebugMode(TAG); + Log.showInfo(TAG, `template = ${JSON.stringify(this.template)}`) + Log.showInfo(TAG, `templateData = ${JSON.stringify(this.templateData)}`) + Log.showInfo(TAG, `isDebugMode = ${this.isDebugMode}`) + } + + build() { + Stack({ alignContent: Alignment.TopStart }) { + Column() { + PluginComponent({ + template: this.template, + data: this.templateData + }).onComplete(() => { + Log.showInfo(TAG, `Complete`) + }).onError(({errcode, msg}) => { + Log.showInfo(TAG, `Error code:${errcode} message:${msg}`) + }) + .size({ width: 400, height: 130 }) + } + .backgroundColor($r('app.color.notificationitem_background')) + .opacity($r('app.float.item_opicaty')) + .borderRadius(!this.isSubItem ? $r('app.float.item_borderradius') : 0) + .margin({ + left: $r('app.float.item_marginleft'), + right: $r('app.float.item_marginright'), + top: $r('app.float.item_margintop') + }) + .padding({ + left: $r('app.float.item_paddingleft'), + right: $r('app.float.item_paddingright'), + bottom: $r('app.float.item_paddingbottom') + }) + + if (this.isDebugMode) { + Column() { + Text("-- DEBUG --") + .fontSize('32') + .fontWeight(FontWeight.Bold) + .fontColor(0xCCCCCC) + .opacity(0.5) + }.margin(10) + } + } + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets new file mode 100644 index 00000000..ef91bbef --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2021-2022 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 Constants from '../../common/constants'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import DistributionManager from '../../model/NotificationDistributionManager'; + +const TAG = 'NoticeItem-DevicesDialog'; + + +/** + * Devices dialog + */ +@CustomDialog +export default struct DevicesDialog { + private deviceInfoList: Array; + public controller: CustomDialogController + public action: (deviceID) => void + + build() { + Column({ space: 30 }) { + Row() { + Text($r('app.float.confirm_title_fontsize')) + .fontSize($r('app.float.confirm_title_fontsize')) + .fontWeight(FontWeight.Bold) + }.width(Constants.SETTING_DIALOG_WITH) + .margin({ top: 20 }) + + Column() { + List() { + ForEach(this.deviceInfoList, (item) => { + ListItem() { + Row() { + Column() { + Text(item.deviceName) + .fontSize($r('app.float.setting_cont_fontsize')) + .fontColor($r('app.color.dialog_font_color')) + .height(Constants.SETTING_CONT_HEIGHT) + + }.alignItems(HorizontalAlign.Center) + .width(Constants.FULL_CONTAINER_WIDTH) + } + .width(Constants.SETTING_DIALOG_WITH) + .alignItems(VerticalAlign.Center) + .align(Alignment.Center) + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.setting_border_radius') }) + .backgroundColor($r('app.color.dialog_font_back_color')) + .onClick(() => { + this.action(item.deviceId); + this.controller.close(); + }) + } + }) + } + .divider({ + strokeWidth: 1, + color: $r('app.color.device_divider_color'), + startMargin: $r('app.float.device_divider_margin_l'), + endMargin: $r('app.float.device_divider_margin_r') + }) + .width('100%') + .height('100%') + .visibility(Visibility.Visible) + .zIndex(0) + .border({ width: $r('app.float.device_border_width'), color: Color.White, + radius: $r('app.float.device_border_radius') }) + .backgroundColor(Color.White) + } + }.height(Constants.CONFIRM_DIALOG_HEIGHT) + + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.deviceInfoList = DistributionManager.getInstance().getTrustedDeviceListSync(); + Log.showInfo(TAG, `aboutToAppear deviceInfoList:${JSON.stringify(this.deviceInfoList)}`) + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets new file mode 100644 index 00000000..2374770f --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2021-2022 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 Constants, {NotificationLayout as Layout} from '../../common/constants'; +import basicItem from './basicItem'; +import longItem from './longItem'; +import multiItem from './multiItem'; +import pictureItem from './pictureItem'; +import titleItem from './titleItem'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import ViewModel from '../../viewmodel/ViewModel'; +import ActionComponent from './actionComponent'; + +const TAG = 'NoticeItem-GeneralItem'; + +@Component +export default struct GeneralItem { + @Consume('notificationUpdate') updateFlag: number; + @State hasPicture: boolean = false + @State @Watch('expandChange') isExpand: boolean = false + @State needExpand: boolean = true + @State distributedDeviceName: string = '' + private itemData: any = {} + private clickAction: () => void + private isSubItem: boolean= false; + + expandChange() { + this.updateFlag++; + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) + if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { + this.hasPicture = false; + } else { + this.hasPicture = true; + } + this.needExpand = this.checkItemNeedExpand() + ViewModel.getDistributedDeviceName(this.itemData).then((deviceName) => { + this.distributedDeviceName = deviceName; + }) + } + + checkItemNeedExpand() { + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC + && (!(this.itemData.actionButtons?.length > 0))) { + return false; + } else { + return true; + } + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`); + } + + build() { + Column() { + titleItem({ + notificationSmallIcon: this.itemData.smallIcon, + notificationName: this.itemData.appName, + notificationTime: this.itemData.time, + isExpand: $isExpand, + needExpand: this.needExpand, + distributedDeviceName: this.distributedDeviceName, + isSubItem: this.isSubItem, + clickTitleAction: () => null + }) + ContentComponent({ + isExpand: this.isExpand, + itemData: this.itemData + }); + + if (this.isExpand && this.itemData.actionButtons.length) { + ActionComponent({ itemData: this.itemData }) + } else { + Blank() + .height(Layout.ITEM_MARGIN) + } + }.onClick(() => { + this.clickAction(); + }) + } +} + +@Component +struct ContentComponent { + @Prop isExpand: boolean; + itemData: any; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToDisappear pict: ${this.itemData.picture}`); + } + + build() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Row() { + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC) { + basicItem({ + itemData: this.itemData + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { + longItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { + multiItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_PICTURE) { + pictureItem({ + itemData: this.itemData, + isExpand: this.isExpand + }); + } + }.flexGrow(1) + + if (this.itemData.picture) { + Image(this.itemData.picture) + .objectFit(ImageFit.Contain) + .width(Layout.NOTIFICATION_PIC_SIZE) + .height(Layout.NOTIFICATION_PIC_SIZE) + } + }.margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets new file mode 100644 index 00000000..5e894951 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import NotificationItem from './notificationItem' +import titleItem from './titleItem'; +import IconListComponent, {getIconListSize} from './iconListComponent'; +import ScrollbarManager from '../../common/ScrollbarManager'; + +const TAG = 'NoticeItem-GroupItem'; + +@Component +export default struct GroupItem { + @Consume('notificationUpdate') updateFlag: number; + @State distributedDeviceName: string = '' + @State @Watch('expandChange') toExpand: boolean = false; + private groupData: any[] = [] + private mScroller: Scroller = new Scroller(); + @State mIconAlpha: number = 0; + @State @Watch('scrollEdge') mEdgeEnd: boolean = false; + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`); + } + + expandChange() { + this.updateFlag++; + } + + build() { + Stack({ alignContent: Alignment.TopEnd }) { + Scroll(this.mScroller) { + Row() { + Column() { + Row() { + titleItem({ + notificationSmallIcon: this.groupData[0].smallIcon, + notificationName: this.groupData[0].appName, + notificationTime: this.groupData[0].time, + isExpand: $toExpand, + needExpand: true, + distributedDeviceName: this.distributedDeviceName, + clickTitleAction: () => null + }) + }.backgroundColor($r('app.color.notificationitem_background')) + .width(Constants.FULL_CONTAINER_WIDTH) + + Row() { + ContentList({ groupData: this.groupData, toExpand: this.toExpand }) + }.width(Constants.FULL_CONTAINER_WIDTH) + .enabled(!this.mEdgeEnd) + } + .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) + .clip(true) + + Row() { + IconListComponent({ iconAlpha: this.mIconAlpha, itemData: this.groupData[0], isGroup: true }) + }.width(getIconListSize()) + }.alignItems(VerticalAlign.Top) + } + .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) + .clip(true) + .scrollable(ScrollDirection.Horizontal) + .scrollBar(BarState.On) + .onScroll(() => { + this.mIconAlpha += 0.1; + this.mIconAlpha = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize(); + }) + .onScrollEnd(() => { + this.mEdgeEnd = (this.mEdgeEnd && + this.mScroller.currentOffset().xOffset > (getIconListSize() - Layout.SCROLL_THRESHOLD)) + || (!this.mEdgeEnd && this.mScroller.currentOffset().xOffset > Layout.SCROLL_THRESHOLD) + ScrollbarManager.restoreOtherScroll(this.mScroller); + }) + } + .width(Constants.FULL_CONTAINER_WIDTH) + } + + scrollEdge() { + this.mScroller.scrollEdge(this.mEdgeEnd ? Edge.End : Edge.Start) + } +} + + +@Component +struct ContentList { + @State @Watch('remainderChange') groupData: any[] = [] + @Prop toExpand: boolean + @State remainderNum: number= 0 + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.remainderNum = this.groupData.length - 2; + Log.showInfo(TAG, `aboutToAppear remainderNum:${this.remainderNum}`) + } + + build() { + Column() { + if (!this.toExpand) { + Column() { + Row({ space: 5 }) { + Text(this.groupData[0].title) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Medium) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + Text(this.groupData[0].text) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + Blank() + .margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) + }.width(Constants.FULL_CONTAINER_WIDTH) + .margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) + + Row({ space: 5 }) { + Text(this.groupData[1].title) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Medium) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + Text(this.groupData[1].text) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + Blank() + Text('+' + this.remainderNum) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.None }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .visibility((this.remainderNum > 0) ? Visibility.Visible : Visibility.Hidden) + .margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) + + Blank() + .height(Layout.ITEM_MARGIN) + }.width(Constants.FULL_CONTAINER_WIDTH) + .backgroundColor($r('app.color.notificationitem_background')) + .alignItems(HorizontalAlign.Start) + + } else { + List() { + ForEach(this.groupData, (item: any) => { + ListItem() { + NotificationItem({ itemData: item, isSubItem: true }) + } + }, (item: any) => `${item.hashcode}_${item.timestamp}_subitem`) + } + .divider({ + strokeWidth: 1, + color: $r('app.color.device_divider_color') + }) + } + } + .alignItems(HorizontalAlign.Start) + .width(Constants.FULL_CONTAINER_WIDTH) + } + + remainderChange() { + this.remainderNum = this.groupData.length - 2; + Log.showInfo(TAG, `aboutToAppear remainderNum:${this.remainderNum}`) + } +} diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets new file mode 100644 index 00000000..f4bf5289 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2021-2022 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 Constants, {NotificationLayout as Layout} from '../../common/constants'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import SettingDialog from './settingDialog'; +import ConfirmDialog from './confirmDialog' +import ViewModel from '../../viewmodel/ViewModel'; + +const TAG = 'NoticeItem-IconListComponent'; +let iconSize: number = 0; + +type IconData = { + src?: Resource; + callback?: () => void +} + +export type NotificationUiConfig = { + iconSize: number; +} + +export function getIconListSize(list?: IconData[]) { + let listSize = list?.length??iconSize; + return listSize * (Layout.BUTTON_SIZE + 2 * Layout.ICON_MARGIN) + Layout.ICON_MARGIN +} + +@Component +export default struct IconListComponent { + private itemData: any = {} + private isGroup: boolean= false; + @Prop iconAlpha: number + private settingDialogController: CustomDialogController = new CustomDialogController({ + builder: SettingDialog({ + itemData: this.itemData, + action: () => this.confirmDialogController.open() + }), + autoCancel: false, + offset: { dx: 0, dy: $r('app.float.setting_dialog_dy') }, + customStyle:true + }); + private confirmDialogController: CustomDialogController = new CustomDialogController({ + builder: ConfirmDialog({ + title: $r('app.string.closeNovice'), + bundleName: this.itemData.name, + action: () => ViewModel.enableNotification(this.itemData, false) + }), + autoCancel: false, + offset: { dx: 0, dy: $r('app.float.confirm_dialog_dy') }, + customStyle:true + }); + private iconConfigs: IconData[] = [ + { + src: $r("app.media.ic_public_settings_filled"), + callback: () => { + Log.showInfo(TAG, `click settings hashcode: ${this.itemData?.hashcode}`); + this.settingDialogController.open() + } + }, { + src: $r("app.media.ic_public_delete_filled"), + callback: () => { + if (!this.isGroup) { + Log.showInfo(TAG, `click delete hashcode: ${this.itemData?.hashcode}`); + ViewModel.removeNotificationItem(this.itemData, true) + } else { + Log.showInfo(TAG, `click delete groupName: ${this.itemData?.groupName}`); + ViewModel.removeGroupNotification(this.itemData, true) + } + } + } + ] + + aboutToAppear() { + Log.showInfo(TAG, `iconConfigs: ${JSON.stringify(this.iconConfigs)}`) + iconSize = this.iconConfigs.length; + } + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.End, justifyContent: FlexAlign.End }) { + ForEach(this.iconConfigs, (item) => { + Button({ type: ButtonType.Circle, stateEffect: true }) { + if (item.src) { + Image(item.src) + .objectFit(ImageFit.Contain) + .fillColor($r("sys.color.ohos_id_color_primary_contrary")) + .width(Layout.ICON_SIZE) + .height(Layout.ICON_SIZE) + } + } + .width(Layout.BUTTON_SIZE) + .height(Layout.BUTTON_SIZE) + .opacity(this.iconAlpha) + .backgroundColor($r("app.color.button_background")) + .margin({ left: Layout.ICON_MARGIN, right: Layout.ICON_MARGIN }) + .onClick(() => item.callback && item.callback()) + }) + } + .margin({ left: Layout.ICON_MARGIN }) + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets index b6151895..badcd6aa 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,7 +13,7 @@ * limitations under the License. */ -import Constants,{NotificationItemData} from '../../common/constants.ets'; +import Constants, {NotificationItemData, NotificationLayout as Layout} from '../../common/constants'; @Component export default @@ -22,22 +22,22 @@ struct LongItem { @Prop isExpand: boolean build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Column() { Text(this.isExpand ? this.itemData.expandedTitle : this.itemData.title) - .maxLines(Constants.DEFAULT_MAX_LINES) + .maxLines(Constants.SINGLE_LINE) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) //not support Resource type + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Medium) + .lineHeight(Layout.TEXT_LINE_HEIGHT) Text(this.isExpand ? this.itemData.longText : this.itemData.text) - .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.DEFAULT_MAX_LINES) + .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.SINGLE_LINE) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .constraintSize({ maxHeight: $r('app.float.notification_expanded_text_maxheight') }) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - .margin({ top: $r('app.float.content_margin_top') }) - }.width('100%') + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + } + .alignItems(HorizontalAlign.Start) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets index 4b972453..806da43a 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,7 +13,7 @@ * limitations under the License. */ -import Constants,{NotificationItemData} from '../../common/constants.ets'; +import Constants, {NotificationItemData, NotificationLayout as Layout} from '../../common/constants'; @Component export default struct MultiItem { @@ -21,31 +21,35 @@ export default struct MultiItem { @Prop isExpand: boolean build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + Column() { Text(this.isExpand ? this.itemData.longTitle : this.itemData.title) - .maxLines(Constants.DEFAULT_MAX_LINES) + .maxLines(Constants.SINGLE_LINE) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Medium) + .lineHeight(Layout.TEXT_LINE_HEIGHT) if (this.isExpand) { ForEach(this.itemData.lines, (item: string) => { - Text(`${item}`) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .margin({ top: $r('app.float.content_margin_top') }) + Text(item) + .maxLines(Constants.SINGLE_LINE) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) }, (item: string) => item.toString() ) } else { Text(this.itemData.text) - .fontSize($r('app.float.notification_content_fontsize')) - .maxLines(Constants.DEFAULT_MAX_LINES) + .maxLines(Constants.SINGLE_LINE) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontColor($r('app.color.content_text_color')) - .margin({ top: $r('app.float.content_margin_top') }) + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) } - }.width('100%') + }.alignItems(HorizontalAlign.Start) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 8f84a5bc..e3ef3156 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,215 +13,117 @@ * limitations under the License. */ -import Constants,{NotificationItemData} from '../../common/constants.ets'; -import basicItem from './basicItem.ets'; -import longItem from './longItem.ets'; -import multiItem from './multiItem.ets'; -import titleItem from './titleItem.ets'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import GeneralItem from './generalItem'; +import CustomItem from './customItem'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import ViewModel from '../../viewmodel/ViewModel'; +import DevicesDialog from './devicesDialog'; import WantAgent from '@ohos.wantAgent'; -import ViewModel from '../../viewmodel/ViewModel.ets'; -import SettingDialog from './settingDialog.ets'; -import ConfirmDialog from './confirmDialog.ets' +import IconListComponent, {getIconListSize} from './iconListComponent'; +import ScrollbarManager from '../../common/ScrollbarManager'; const TAG = 'NoticeItem-NotificationItem'; @Component export default struct NotificationItem { - private itemData: any = {} - @State hasPicture: boolean = false - @State isExpand: boolean = false - @State needExpand: boolean = true - @State deleteIconDisplay : boolean = false; + @State mIconAlpha: number = 0; + @State @Watch('scrollEdge') mEdgeEnd: boolean = false; @State itemWidth: string = '100%' - startX: number = 0 - startY: number = 0 - @State moveX: number = 0 - @State moveY: number = 0 - - settingDialogController: CustomDialogController = new CustomDialogController({ - builder: SettingDialog({ - itemData: this.itemData, - action: this.showConfirmDialog.bind(this) - }), - autoCancel: false, - offset: { dx: 0, dy: 200 } - }); + private itemData: any = {} + private isSubItem: boolean= false; + private mScroller: Scroller = new Scroller(); - confirmDialogController: CustomDialogController = new CustomDialogController({ - builder: ConfirmDialog({ - title: $r('app.string.closeNovice'), - bundleName: this.itemData.name, - action: ViewModel.removeNotificationItem.bind(ViewModel,this.itemData,true) - }), - autoCancel: false, - offset: { dx: 0, dy: 250 } - }); + build() { + Stack() { + IconListComponent({ iconAlpha: this.mIconAlpha, itemData: this.itemData }) - aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) - if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { - this.hasPicture = false; - } else { - this.hasPicture = true; - } - this.needExpand=this.checkItemNeedExpand() + Scroll(this.mScroller) { + Row() { + FrontItem({ itemData: this.itemData, isSubItem: this.isSubItem }) + IconListComponent({ iconAlpha: 0, itemData: this.itemData }) + } + } + .scrollable(ScrollDirection.Horizontal) + .scrollBar(BarState.On) + .onScroll(() => { + this.mIconAlpha += 0.1; + this.mIconAlpha = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize(); + }) + .onScrollEnd(() => { + this.mEdgeEnd = (this.mEdgeEnd && + this.mScroller.currentOffset().xOffset > (getIconListSize() - Layout.SCROLL_THRESHOLD)) + || (!this.mEdgeEnd && this.mScroller.currentOffset().xOffset > Layout.SCROLL_THRESHOLD) + ScrollbarManager.restoreOtherScroll(this.mScroller); + }) + }.width(this.itemWidth) + .borderRadius(!this.isSubItem ? $r("sys.float.ohos_id_corner_radius_default_l") : 0) + .clip(!this.isSubItem) } - checkItemNeedExpand(){ - if(this.itemData.contentType===Constants.NOTIFICATION_TYPE_BASIC&&(!(this.itemData.actionButtons?.length>0))){ - return false; - }else{ - return true; - } + scrollEdge() { + this.mScroller.scrollEdge(this.mEdgeEnd ? Edge.End : Edge.Start) } +} - aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`); - } +@Component +struct FrontItem { + private itemData: any = {} + private nowWant: any; + private isSubItem: boolean= false; + private devicesDialogController: CustomDialogController = new CustomDialogController({ + builder: DevicesDialog({ + action: (deviceID) => this.selectedDevice(deviceID) + }), + autoCancel: false, + offset: { dx: 0, dy: 200 } + }); build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - Row() { - Column() { - titleItem({ - notificationSmallIcon: this.itemData.smallIcon, - notificationName: this.itemData.appName, - notificationTime: this.itemData.time, - isExpand: $isExpand, - needExpand: this.needExpand - }) - - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_BASIC) { - basicItem({ - itemData: this.itemData - }); - } - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { - longItem({ - itemData: this.itemData, - isExpand: this.isExpand - }); - } - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { - multiItem({ - itemData: this.itemData, - isExpand: this.isExpand - }); - } - } - .width(this.hasPicture ? '85%' : '100%') - .margin({ top: $r('app.float.body_margin_top') }) - - if (this.hasPicture) { - Column() { - Image(this.itemData.largeIcon) - .objectFit(ImageFit.Contain) - .width(50) - .height(50) - } - .alignItems(HorizontalAlign.End) - .width('15%') - } - } - .onClick(() => { - ViewModel.startTargetAbility(this.itemData); - }) - - if (this.isExpand) { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { - ForEach(this.itemData.actionButtons, (item: any) => { - Text(item.title) - .fontSize(20) - .height(30) - .fontColor(Color.Blue) - .margin({ right: 20 }) - .onClick(() => { - ViewModel.startTargetAbility(this.itemData); - }) - }) - } - .margin({ top: 10 }) - } - } - .backgroundColor($r('app.color.notificationitem_background')) - .opacity($r('app.float.item_opicaty')) - .borderRadius($r('app.float.item_borderradius')) - .margin({ - left: $r('app.float.item_marginleft'), - right: $r('app.float.item_marginright'), - top: $r('app.float.item_margintop') - }) - .padding({ - left: $r('app.float.item_paddingleft'), - right: $r('app.float.item_paddingright'), - bottom: $r('app.float.item_paddingbottom') - }) - .onTouch(this.touchNotificationItem.bind(this)) - .width(this.itemWidth) - - if (this.deleteIconDisplay) { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { - Row({ space: 30 }) { - Image($r("app.media.ic_setting")) //setting - .objectFit(ImageFit.Contain) - .width($r('app.float.item_delete_image_width')) - .height($r('app.float.item_delete_image_height')) - .onClick(this.showSettingDialog.bind(this)) - Image($r('app.media.delete')) //delete - .objectFit(ImageFit.Contain) - .width($r('app.float.item_delete_image_width')) - .height($r('app.float.item_delete_image_height')) - .onClick(() => { - ViewModel.removeNotificationItem(this.itemData, true); - }) - } - } - .width('30%') - } + Column() { + if (this.itemData.template) { + CustomItem({ customItemData: this.itemData, isSubItem: this.isSubItem }) + } else { + GeneralItem({ itemData: this.itemData, clickAction: () => this.showDevicesDialog(), isSubItem: this.isSubItem }) } } + .width('100%') + .borderRadius(!this.isSubItem ? $r("sys.float.ohos_id_corner_radius_default_l") : 0) + .backgroundColor($r('app.color.notificationitem_background')) } - showSettingDialog() { - Log.showInfo(TAG, `showSettingDialog`) - this.settingDialogController.open() - } - - showConfirmDialog() { - Log.showInfo(TAG, `showConfirmDialog`) - this.confirmDialogController.open() - } - touchNotificationItem(event: TouchEvent) { - if (event.type == Constants.TOUCH_TYPE_DOWN) { //down - this.startX = event.touches[0].x; - this.startY = event.touches[0].y; - Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`); - } else if (event.type == Constants.TOUCH_TYPE_MOVE) { //move - this.moveX = event.touches[0].x - this.startX; - this.moveY = event.touches[0].y - this.startY; - } else if (event.type == Constants.TOUCH_TYPE_UP) { //up - Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`); - if (this.deleteIconDisplay) { - if (this.moveX > Constants.HIDDEN_TRANSLATE_X) { - //hidden - this.deleteIconDisplay = false; - this.itemWidth = '100%'; - Log.showInfo(TAG, 'hidden'); - } - } else { - if (this.moveX < Constants.DISPLAY_TRANSLATE_X) { - this.deleteIconDisplay = true; - this.itemWidth = '70%'; - Log.showInfo(TAG, 'display'); - } else if (this.moveX > Constants.REMOVE_TRANSLATE_X) { - ViewModel.removeNotificationItem(this.itemData, true); + showDevicesDialog() { + Log.showInfo(TAG, `showDevicesDialog isDistributed: ${this.itemData?.distributedOption?.isDistributed}`) + if (!this.itemData?.distributedOption?.isDistributed) { + ViewModel.clickItem(this.itemData); + return; + } + let wantAgent = this.itemData?.want; + if (!!wantAgent) { + WantAgent.getWant(wantAgent).then((want) => { + this.nowWant = want + Log.showInfo(TAG, `showDevicesDialog want: ${JSON.stringify(this.nowWant)}`) + if (!want?.deviceId) { + this.devicesDialogController.open() + } else { + ViewModel.clickItem(this.itemData); } - } + }) + } else { + ViewModel.clickItem(this.itemData); } } + selectedDevice(deviceID) { + Log.showInfo(TAG, `selectedDevice deviceID:${deviceID}`) + this.nowWant.deviceId = deviceID; + let triggerInfo = { + code: 0, + want: this.nowWant, + permission: '', + extraInfo: {} + }; + ViewModel.clickDistributionItem(this.itemData, triggerInfo) + } } + diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets similarity index 45% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets rename to features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets index 04ee4abf..3c033812 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/item/longItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,32 +13,32 @@ * limitations under the License. */ -import Constants from '../common/constants.ets'; -import {NotificationItemData} from '../../../../../../../../notificationService/src/main/ets/com/ohos/notificationservice/common/constants.ets'; +import Constants, {NotificationItemData, NotificationLayout as Layout} from '../../common/constants'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; @Component -export default -struct LongItem { +export default struct PictureItem { @State itemData: NotificationItemData= undefined @Prop isExpand: boolean build() { - Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) { + + Column() { Text(this.isExpand ? this.itemData.expandedTitle : this.itemData.title) - .maxLines(Constants.DEFAULT_MAX_LINES) + .maxLines(Constants.SINGLE_LINE) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.notification_title_fontsize')) - .fontColor($r('app.color.title_text_color')) - .fontWeight(FontWeight.Bold) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) //not support Resource type - Text(this.isExpand ? this.itemData.longText : this.itemData.text) - .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.DEFAULT_MAX_LINES) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Medium) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + Text(this.isExpand ? this.itemData.briefText : this.itemData.text) + .maxLines(this.isExpand ? Constants.EXPENDED_MAX_LINES : Constants.SINGLE_LINE) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .constraintSize({ maxHeight: $r('app.float.notification_expanded_text_maxheight') }) - .fontSize($r('app.float.notification_content_fontsize')) - .fontColor($r('app.color.content_text_color')) - .lineHeight(Constants.CONTENT_LINE_HEIGHT) - .margin({ top: $r('app.float.content_margin_top') }) - }.width('100%') + .fontColor($r("sys.color.ohos_fa_text_secondary")) + .fontSize($r("sys.float.ohos_id_text_size_body2")) + .fontWeight(FontWeight.Regular) + .lineHeight(Layout.TEXT_LINE_HEIGHT) + } + .alignItems(HorizontalAlign.Start) } -} +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets index 4c011d83..82569697 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,11 +13,11 @@ * limitations under the License. */ -import Constants,{NotificationItemData} from '../../common/constants.ets'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; -import FeatureAbilityManager from '../../../../../../../../../../common/src/main/ets/default/abilitymanager/featureAbilityManager.ets'; -import WindowManager from '../../../../../../../../../../common/src/main/ets/default/WindowManager.ets' +import Constants,{NotificationItemData} from '../../common/constants'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import EventManager from "../../../../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainStartAbility} from "../../../../../../../../../../common/src/main/ets/default/event/EventUtil" import Notification from '@ohos.notification'; const TAG = 'NoticeItem-Setting'; @@ -32,9 +32,8 @@ export default struct SettingDialog { public action: () => void build() { - - Column({ space: 30 }) { - Row({ space: 10 }) { + Column({ space: 4 }) { + Row({ space: 4 }) { if (!CheckEmptyUtils.isEmpty(this.itemData.smallIcon)) { Image(this.itemData.smallIcon) .objectFit(ImageFit.Contain) @@ -43,8 +42,10 @@ export default struct SettingDialog { } Text(this.itemData.appName) .fontSize($r('app.float.setting_title_fontsize')) + .fontWeight(500) }.width(Constants.SETTING_DIALOG_WITH) - .margin({ top: 50 }) + .margin( {top: $r('app.float.notification_appname_margin_top')} ) + .height($r('app.float.title_font_height')) Row() { Column() { @@ -52,13 +53,13 @@ export default struct SettingDialog { .fontSize($r('app.float.setting_cont_fontsize')) .fontColor($r('app.color.dialog_font_color')) .height(Constants.SETTING_CONT_HEIGHT) - }.alignItems(HorizontalAlign.Center) .width(Constants.SETTING_CONTENT_WITH) } .width(Constants.SETTING_DIALOG_WITH) .alignItems(VerticalAlign.Center) .align(Alignment.Center) + .margin({ top: $r('app.float.close_notification_margin_top') }) .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.setting_border_radius') }) .backgroundColor($r('app.color.dialog_font_back_color')) @@ -68,17 +69,17 @@ export default struct SettingDialog { Column() { Text($r('app.string.moreSettings')) .fontSize($r('app.float.setting_cont_fontsize')) - .fontColor($r('app.color.dialog_font_color')) + .fontColor($r('app.color.dialog_font_back_color')) .height(Constants.SETTING_CONT_HEIGHT) }.alignItems(HorizontalAlign.Center) .width(Constants.SETTING_CONTENT_WITH) + .align(Alignment.Center) } .width(Constants.SETTING_DIALOG_WITH) .alignItems(VerticalAlign.Center) - .align(Alignment.Center) .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.setting_border_radius') }) - .backgroundColor($r('app.color.dialog_font_back_color')) + .backgroundColor($r('app.color.action_button_click_color')) .onClick(this.openAbility.bind(this)) Row() { @@ -88,11 +89,11 @@ export default struct SettingDialog { .textOverflow({ overflow: TextOverflow.Ellipsis }) .fontSize($r('app.float.setting_cont_fontsize')) .fontColor($r('app.color.dialog_font_back_color')) - .height(Constants.SETTING_CONT_HEIGHT) }.alignItems(HorizontalAlign.Center) .width(Constants.SETTING_CONTENT_WITH) } .width(Constants.SETTING_DIALOG_WITH) + .margin( {top: $r('app.float.notification_cancle_margin_top')} ) .alignItems(VerticalAlign.Center) .align(Alignment.Center) .border({ width: $r('app.float.setting_border_width'), color: Color.White, @@ -100,6 +101,10 @@ export default struct SettingDialog { .backgroundColor($r('app.color.dialog_font_color')) .onClick(this.closeAbility.bind(this)) }.height(Constants.SETTING_DIALOG_HEIGHT) + .width(Constants.SETTING_DIALOG_WIDTH) + .backgroundColor('#FFFFFFFF') + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.notification_border_radius') }) } closeNotification() { @@ -109,18 +114,8 @@ export default struct SettingDialog { openAbility() { Log.showInfo(TAG, ` openAbility:showNotificationManagement`) - let mWindowManager = new WindowManager(); - mWindowManager.setWindowMin((result) => { - Log.showInfo(TAG, `showNotificationManagement setWindowMin`) - let mFeatureAbilityManager = new FeatureAbilityManager() - mFeatureAbilityManager.openAbility(TAG, { - want: { - bundleName: 'com.ohos.systemui', - abilityName: 'com.ohos.systemui.notificationmanagement.MainAbility' - } - }); - }); - AppStorage.Set("showStatusBar", true); + EventManager.publish(obtainStartAbility('com.ohos.systemui', 'com.ohos.systemui.notificationmanagement.MainAbility', + { 'migrateUri': 'pages/setEnable', 'migrateBundle': this.itemData.bundleName })) this.closeAbility() } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets index beaaa7eb..5d894315 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets @@ -1,5 +1,5 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. +/* + * Copyright (c) 2021-2022 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 @@ -13,22 +13,23 @@ * limitations under the License. */ -import Constants from '../../common/constants.ets'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log.ets'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; const TAG = 'NoticeItem-TitleItem'; @Component -export default -struct TitleItem { +export default struct TitleItem { private notificationSmallIcon: PixelMap @Prop notificationName: string @Prop notificationTime: string - @State srcIconDisplay: any = $r('app.media.ic_notification_down') @Link isExpand: boolean @Prop needExpand: boolean @State rowSpace: any = $r('app.float.titleitem_row_space') + @Prop distributedDeviceName: string + private isSubItem: boolean= false; + private clickTitleAction: () => void aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`); @@ -39,37 +40,55 @@ struct TitleItem { } build() { - Row() { - Row({ space: this.rowSpace }) { - if (!CheckEmptyUtils.isEmpty(this.notificationSmallIcon)) { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + if (!this.isSubItem) { + if (this.notificationSmallIcon) { Image(this.notificationSmallIcon) .objectFit(ImageFit.Contain) - .width($r('app.float.title_image_width')) - .height($r('app.float.title_image_height')) - .flexShrink(0) + .width(Layout.TITLE_IMAGE_SIZE) + .height(Layout.TITLE_IMAGE_SIZE) } - Text(this.notificationName) - .maxLines(Constants.DEFAULT_MAX_LINES) - .fontSize($r('app.float.title_name_fontsize')) - .flexShrink(1) - Text(this.notificationTime) - .fontSize($r('app.float.title_time_fontsize')) - .flexShrink(0) + Row() { + Text(this.notificationName) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body3")) + .fontWeight(FontWeight.Regular) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .maxLines(Constants.SINGLE_LINE) + }.margin({ left: 8 }) } - .width(this.needExpand ? '80%' : '100%') + Text(this.notificationTime) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body3")) + .fontWeight(FontWeight.Regular) + .maxLines(Constants.SINGLE_LINE) + .flexGrow(0) + .margin({ left: !this.isSubItem ? 8 : 0, right: 8 }) + Text($r('app.string.distributed_devicename', this.distributedDeviceName)) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body3")) + .fontWeight(FontWeight.Regular) + .maxLines(Constants.SINGLE_LINE) + .visibility((this.distributedDeviceName ? true : false) ? Visibility.Visible : Visibility.None) + + Blank() if (this.needExpand) { - Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End, alignItems: ItemAlign.Center }) { - Image(this.srcIconDisplay) + if (this.isExpand) { + Image($r('app.media.ic_notification_up')) + .objectFit(ImageFit.Contain) + .width(Layout.TITLE_IMAGE_SIZE) + .height(Layout.TITLE_IMAGE_SIZE) + } else { + Image($r('app.media.ic_notification_down')) .objectFit(ImageFit.Contain) - .width($r('app.float.displayicon_width')) - .height($r('app.float.displayicon_height')) + .width(Layout.TITLE_IMAGE_SIZE) + .height(Layout.TITLE_IMAGE_SIZE) } - .width('20%') } } - .height($r('app.float.titleitem_height')) - .width('100%') + .margin({ left: 12, right: 12 }) + .height(Layout.TITLE_HEIGHT) .onClick(this.clickTitleItem.bind(this)) } @@ -78,10 +97,11 @@ struct TitleItem { if (this.needExpand) { if (this.isExpand) { this.isExpand = false; - this.srcIconDisplay = $r('app.media.ic_notification_down'); } else { this.isExpand = true; - this.srcIconDisplay = $r('app.media.ic_notification_up'); + } + if (this.clickTitleAction) { + this.clickTitleAction(); } } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts similarity index 46% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets rename to features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index e6d35b46..888d1695 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,44 +13,51 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import SwitchUserManager from '../../../../../../../../../common/src/main/ets/default/SwitchUserManager'; import media from '@ohos.multimedia.media'; -import NotificationService from '../model/NotificationService.ets' +import vibrator from '@ohos.vibrator'; import wantAgent from '@ohos.wantAgent'; -import WindowManager from '../../../../../../../../../common/src/main/ets/default/WindowManager.ets'; import SourceType from '@ohos.notification' -import NotificationConfig from '../model/NotificationConfig.ets'; -import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils.ets'; +import NotificationService from '../model/NotificationService' +import NotificationWindowManager from '../model/NotificationWindowManager'; +import NotificationConfig from '../model/NotificationConfig'; +import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import AbilityManager from "../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager" +import EventManager from "../../../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainLocalEvent} from "../../../../../../../../../common/src/main/ets/default/event/EventUtil" +import CommonUtil from '../common/CommonUtil'; +import Constants from '../common/constants'; const TAG = 'NotificationViewModel'; -const GROUP_THRESHOLD = 10; + /** * Notification ViewModel class. */ export class ViewModel { - mWindowManager: WindowManager - audioPlayer: any + audioPlayer: any; mNotificationList: any[]; - mAppNotificationCount: any; mCallback: any; - mNotificationCtrl: any = {} + mNotificationCtrl: any = {}; constructor() { - this.mWindowManager = new WindowManager(); - let tempLink = AppStorage.SetAndLink('notificationList', []); - this.mNotificationList = tempLink.get(); - this.mAppNotificationCount = new Map(); + Log.showInfo(TAG, `constructor`); + this.mNotificationList = []; this.audioPlayer = media.createAudioPlayer(); - this.audioPlayer.src = 'file://system/etc/Light.ogg'; - this.registerCallback(); - this.loadFlowControlInfos() + // this.audioPlayer.src = 'file://system/etc/capture.ogg'; + SwitchUserManager.getInstance().registerListener(this); + this.initFlowControlInfos(); + SwitchUserManager.getInstance() + .getCurrentUserInfo() + .then((userInfo) => this.registerCallback(userInfo.userId)) + .catch((err) => Log.showError(TAG, `Can't get current user, err: ${err}`)); } - registerCallback() { + registerCallback(userId) { this.mCallback = { + userId: userId, onNotificationConsume: this.onNotificationConsume.bind(this), - onNotificationCancel: this.onNotificationCancel.bind(this), - onNotificationLoad: this.onNotificationLoad.bind(this) + onNotificationCancel: this.onNotificationCancel.bind(this) } NotificationService.register(this.mCallback); } @@ -59,6 +66,15 @@ export class ViewModel { NotificationService.unRegister(this.mCallback); } + userChange(userInfo) { + Log.showInfo(TAG, `UserChange, userInfo: ${JSON.stringify(userInfo)}`); + this.unregisterCallback(); + this.mNotificationList.length = 0; + this.initFlowControlInfos(); + this.registerCallback(userInfo.userId); + this.updateNotification(); + NotificationService.loadAllNotifications(); + } /** * notification CancelCallback @@ -66,77 +82,78 @@ export class ViewModel { * @param {Object} data - return notificationItemData. */ onNotificationConsume(notificationItemData) { + if (notificationItemData === undefined) { + Log.showInfo(TAG, `onNotificationConsume notificationItemData is undefined`); + return; + } + this.onNotificationCancel(notificationItemData.hashcode) Log.showInfo(TAG, `onNotificationConsume ${JSON.stringify(notificationItemData)}`); //Verify the notifications can be displayed if (!this.isCanShow(notificationItemData.bundleName)) { //can not displayed return; } - if (!this.mAppNotificationCount.has(notificationItemData.appName)) { - this.mAppNotificationCount.set(notificationItemData.appName, 0); + + if (notificationItemData.ruleData.isAllowStatusBarShow) { } - this.mAppNotificationCount[notificationItemData.appName] += 1; - if (this.mAppNotificationCount[notificationItemData.appName] >= GROUP_THRESHOLD) { - this.groupNotification(notificationItemData, this.mAppNotificationCount[notificationItemData.appName]); - } else { - // Todo 排序插入 + if (notificationItemData.ruleData.isAllowNotificationListShow) { this.mNotificationList.unshift(notificationItemData); + Log.showInfo(TAG, `reminder start `); + this.reminderWay(notificationItemData); + Log.showInfo(TAG, `reminder end `); this.updateFlowControlInfos(notificationItemData.bundleName, true) - this.updateNotification(); } - // Todo doAction(notificationItemData); 根据ruleData做处理 + this.updateNotification(); } /** * notification CancelCallback */ - onNotificationCancel(notificationItemData) { - Log.showInfo(TAG, `onNotificationCancel ${JSON.stringify(notificationItemData)}`); - if (this.mAppNotificationCount[notificationItemData.appName] >= GROUP_THRESHOLD) { - // 组通知删除逻辑处理 - return; - } - // 普通通知删除逻辑处理 + onNotificationCancel(hashCode: string) { + Log.showInfo(TAG, `onNotificationCancel hashCode: ${JSON.stringify(hashCode)}`); + // Common Notification Deletion Logic Processing for (let i = 0, len = this.mNotificationList.length; i < len; i++) { - if (this.mNotificationList[i].hashcode == notificationItemData.hashcode) { - Log.showInfo(TAG, `onNotificationCancel i = ${i}`); - this.mAppNotificationCount[notificationItemData.appName] -= 1; + if (this.mNotificationList[i].hashcode == hashCode) { + Log.showInfo(TAG, `removeNotificationItem i = ${i}`); let removeItemArr = this.mNotificationList.splice(i, 1); Log.showInfo(TAG, `onNotificationCancel removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { this.updateFlowControlInfos(removeItemArr[0].bundleName, false) } + this.updateNotification(); break; } } } - onNotificationLoad() { - + updateNotification() { + Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(this.mNotificationList)}`); + Log.showInfo(TAG, `updateNotification length: ${this.mNotificationList.length}`); + this.sortNotification() + let notificationList = this.groupByGroupName(); + AppStorage.SetOrCreate('notificationList', notificationList); } - - /** - * notification CancelCallback - * - * @param {Object} data - return notificationItemData. - */ - groupNotification(notificationItemData, num) { - if (num == GROUP_THRESHOLD) { - // 组通知转化 - } else { - // 组通知添加 + groupByGroupName(): any[]{ + Log.showInfo(TAG, `groupByGroupName`); + if (!this.mNotificationList || this.mNotificationList.length < 1) { + return []; } + let groupArr: any[] = []; + let groups = {}; + this.mNotificationList.forEach((item) => { + const groupName = `${item.bundleName}_${item.groupName}`; + Log.showInfo(TAG, `groupByGroupName groupName:${groupName}`); + if (!groups[groupName] || groups[groupName].length < 1) { + groups[groupName] = []; + groupArr.push(groups[groupName]); + } + groups[groupName].push(item) + }) + Log.showInfo(TAG, `groupByGroupName groupArr:${JSON.stringify(groupArr)}`); + return groupArr; } - updateNotification() { - Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(this.mNotificationList)}`); - Log.showInfo(TAG, `updateNotification len: ${this.mNotificationList.length}`); - this.sortNotification() - let listLink = AppStorage.Link('notificationList'); - listLink.set(this.mNotificationList); - Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(listLink.get())}`); - } /** * Sort the notifications. @@ -167,15 +184,19 @@ export class ViewModel { * Remove all notifications. */ removeAllNotifications() { + Log.showInfo(TAG, `removeAllNotifications`); if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { this.mNotificationList = [] } else { - let index = this.mNotificationList.length while (index--) { - Log.showInfo(TAG, `mNotificationList[${index}].source: ${this.mNotificationList[index].source}`); + Log.showInfo(TAG, `removeAllNotifications isRemoveAllowed: ${index} ${this.mNotificationList[index].isRemoveAllowed} `); + Log.showInfo(TAG, `removeAllNotifications isOngoing: ${index} ${this.mNotificationList[index].isOngoing} `); + Log.showInfo(TAG, `removeAllNotifications isUnremovable: ${index} ${this.mNotificationList[index].isUnremovable} `); + //Except the Long term notifications - if (this.mNotificationList[index].source != SourceType.TYPE_CONTINUOUS) { + if (this.mNotificationList[index].isRemoveAllowed && + !this.mNotificationList[index].isOngoing && !this.mNotificationList[index].isUnremovable) { Log.showInfo(TAG, `mNotificationList[${index}].hashcode: ${this.mNotificationList[index].hashcode}`); let hashCode = this.mNotificationList[index].hashcode this.removeSysNotificationItem(hashCode) @@ -194,9 +215,7 @@ export class ViewModel { Log.showInfo(TAG, `removeNotificationItem, hashcode: ${itemData.hashcode}`); for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].hashcode == itemData.hashcode) { - Log.showInfo(TAG, `this.mNotificationList[i].hashcode=${this.mNotificationList[i].hashcode}, itemData.hashcode=${itemData.hashcode}`); Log.showInfo(TAG, `removeNotificationItem i = ${i}`); - this.mAppNotificationCount[itemData.appName] -= 1; let removeItemArr = this.mNotificationList.splice(i, 1); Log.showInfo(TAG, `removeNotificationItem removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { @@ -209,48 +228,66 @@ export class ViewModel { if (isDelSysConent) { this.removeSysNotificationItem(itemData.hashcode); } + AppStorage.Delete(Constants.KEY_INPUT + itemData.id); + } + removeGroupNotification(itemData, isDelSysConent) { + Log.showInfo(TAG, `removeGroupNotification, groupName: ${itemData.groupName}`); + let groupName = itemData.groupName + for (let i = 0, len = this.mNotificationList.length; i < len; i++) { + if (this.mNotificationList[i].groupName == groupName) { + Log.showInfo(TAG, `removeGroupNotification i = ${i}`); + let id = this.mNotificationList[i].id + let hashcode = this.mNotificationList[i].hashcode + let removeItemArr = this.mNotificationList.splice(i, 1); + Log.showInfo(TAG, `removeGroupNotification removeItemArr= ${JSON.stringify(removeItemArr)}`); + if (!CheckEmptyUtils.isEmpty(removeItemArr)) { + this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + } + if (isDelSysConent) { + this.removeSysNotificationItem(hashcode); + } + AppStorage.Delete(Constants.KEY_INPUT + id); + } + } + this.updateNotification(); } removeSysNotificationItem(hashcode) { NotificationService.remove(hashcode); } - startTargetAbility(itemData) { - Log.showInfo(TAG, 'startTargetAbility'); - //close window - AppStorage.Set("showStatusBar", true); - this.mWindowManager.setWindowMin((result) => { - Log.showInfo(TAG, `setWindowMin ${result}`); - }); - //open app - Log.showInfo(TAG, `itemClick wantAgent ${JSON.stringify(itemData.want)} id: ${itemData.id}`); - let TriggerInfo = { + clickItem(itemData, want?: any) { + Log.showInfo(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}`); + NotificationWindowManager.hideNotificationWindow(); + CommonUtil.startWant((want) ? want : itemData.want); + this.removeNotificationItem(itemData, true); + } + + clickReply(inputKey, content, want) { + Log.showInfo(TAG, `clickReply inputKey: ${inputKey}, content: ${content}, want: ${JSON.stringify(want)}`); + let info = { code: 0, - want: '', + want: { key: inputKey, data: content }, permission: '', extraInfo: {} - }; - wantAgent.trigger(itemData.want, TriggerInfo, ((err, data) => { - Log.showInfo(TAG, `itemClick wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); - })); - //remove notification - this.removeNotificationItem(itemData, true); + } + CommonUtil.startWant(want, info); } - loadFlowControlInfos() { - Log.showInfo(TAG, 'loadFlowControlInfos enter'); + initFlowControlInfos() { + Log.showInfo(TAG, 'initFlowControlInfos enter'); let notificationConfig = NotificationConfig.readNotificationConfig('statusbar') Log.showInfo(TAG, 'NotificationConfig: ' + JSON.stringify(notificationConfig)); if (CheckEmptyUtils.isEmpty(notificationConfig)) { Log.showInfo(TAG, 'NotificationConfig is no definition'); - Log.showInfo(TAG, 'loadFlowControlInfos end'); return } - - this.mNotificationCtrl['currentTotal'] = 0; - this.mNotificationCtrl['limitTotal'] = notificationConfig.limitTotal - this.mNotificationCtrl['app'] = new Map(); + this.mNotificationCtrl = { + currentTotal: 0, + limitTotal: notificationConfig.limitTotal, + app: new Map() + } for (let item of notificationConfig.app) { let tmp = { 'canShow': item.canShow, @@ -259,8 +296,7 @@ export class ViewModel { } this.mNotificationCtrl['app'].set(item.bundleName, tmp); } - Log.showInfo(TAG, 'mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); - Log.showInfo(TAG, 'loadFlowControlInfos end'); + Log.showInfo(TAG, 'initFlowControlInfos end, mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); } isCanShow(bundleName: string): boolean { @@ -307,6 +343,75 @@ export class ViewModel { Log.showInfo(TAG, `updateFlowControlInfos:${JSON.stringify(this.mNotificationCtrl)}`); } + reminderWay(itemData) { + if (itemData.ruleData.isAllowBanner) { + Log.showInfo(TAG, `banner start `); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'itemData', itemData); + EventManager.publish(obtainLocalEvent('onBannerNoticeShow', { 'itemData': itemData })) + Log.showInfo(TAG, `banner end `); + } + if (itemData.notificationFlags?.soundEnabled != Constants.NOTIFICATION_TYPE_CLOSE) { + if (itemData.ruleData.isAllowSound) { + try { + this.audioPlayer.src = itemData.sound; + Log.showInfo(TAG, `sound start `); + this.audioPlayer.play(); + Log.showInfo(TAG, `sound end `); + } catch (e) { + Log.showInfo(TAG, `sound notificationItem id:${itemData.id} alert error: ${e.toString()}`); + } + } + } + if (itemData.notificationFlags?.vibrationEnabled != Constants.NOTIFICATION_TYPE_CLOSE) { + if (itemData.ruleData.isAllowVibrationValues) { + // Log.showInfo(TAG, `vibrate start`); + // for (let i = 0, len = itemData.vibrationValues.length; i < len; i++) { + // vibrator.vibrate(itemData.vibrationValues[i], function(error){ + // Log.showInfo(TAG, `vibrate id:${i}`); + // if (error) { + // Log.showInfo(TAG, "error.code" + error.code + "error.message" + error.message); + // } else { + // Log.showInfo(TAG, "Callback returned to indicate a successful vibration."); + // } + // }) + // } + } + } + } + + getPluginTempLate(templateName) { + Log.showInfo(TAG, 'getPluginTempLate: ' + templateName); + return NotificationService.getPluginTempLate(templateName) + } + + enableNotification(itemData, enable: boolean) { + Log.showInfo(TAG, `enableNotification, bundleName: ${itemData.bundleName} uid: ${itemData.uid}`); + return NotificationService.enableNotification({ bundle: itemData.bundleName, uid: itemData.uid }, enable); + } + + clickDistributionItem(itemData, triggerInfo) { + Log.showInfo(TAG, `clickDistributionItem wantAgen: ${JSON.stringify(itemData.want)}, triggerInfo: ${JSON.stringify(triggerInfo)}`); + NotificationWindowManager.hideNotificationWindow(); + CommonUtil.startWant(itemData.want, triggerInfo); + this.removeNotificationItem(itemData, true); + } + + //get distributed device name + getDistributedDeviceName(itemData): Promise{ + Log.showInfo(TAG, `getDistributedDeviceName`); + Log.showInfo(TAG, `getDistributedDeviceName itemData want:${JSON.stringify(itemData.want)}`); + Log.showInfo(TAG, `getDistributedDeviceName itemData deviceId:${itemData.deviceId}`); + + return new Promise((resolve) => { + let deviceName: string = ''; + if (itemData.distributedOption?.isDistributed && !!itemData.deviceId) { + deviceName = NotificationService.getTrustedDeviceDeviceName(itemData.deviceId); + resolve(deviceName); + } else { + resolve(deviceName); + } + }); + } } let viewModel = new ViewModel(); diff --git a/features/noticeitem/src/main/resources/base/element/color.json b/features/noticeitem/src/main/resources/base/element/color.json index b1f4afa9..8a700e4e 100644 --- a/features/noticeitem/src/main/resources/base/element/color.json +++ b/features/noticeitem/src/main/resources/base/element/color.json @@ -2,7 +2,7 @@ "color": [ { "name":"notificationitem_background", - "value":"#ffffff" + "value":"#F2F1F3F5" }, { "name":"title_text_color", @@ -24,6 +24,10 @@ "name":"dialog_font_color", "value":"#ffffff" }, + { + "name": "action_button_color", + "value": "#007DFF" + }, { "name":"dialog_font_back_color", "value":"#0759f6" @@ -31,6 +35,22 @@ { "name": "confirm_divider_color", "value": "#E3E3E3" + }, + { + "name":"action_button_click_color", + "value":"#0D000000" + }, + { + "name":"transparent", + "value":"#00000000" + }, + { + "name": "button_background", + "value": "#4d000000" + }, + { + "name": "device_divider_color", + "value": "#E3E3E3" } ] } \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index ba70de74..4adf75a2 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -92,6 +92,18 @@ "name": "title_image_height", "value": "30" }, + { + "name": "title_font_height", + "value": "28vp" + }, + { + "name": "title_font_margin_t", + "value": "13vp" + }, + { + "name": "message_font_margin_t", + "value": "14vp" + }, { "name": "title_name_fontsize", "value": "20" @@ -114,11 +126,11 @@ }, { "name": "setting_title_fontsize", - "value": "28" + "value": "40" }, { "name": "setting_cont_fontsize", - "value": "26" + "value": "32" }, { "name": "setting_border_width", @@ -126,23 +138,83 @@ }, { "name": "setting_border_radius", - "value": "30" + "value": "80" + }, + { + "name": "notification_border_radius", + "value": "24vp" + }, + { + "name": "action_button_height", + "value": "48" + }, + { + "name": "action_button_padding", + "value": "12" + }, + { + "name": "picture_default_height", + "value": "300" }, { "name": "confirm_title_fontsize", - "value": "28" + "value": "40" }, { "name": "confirm_cont_fontsize", - "value": "26" + "value": "32" }, { "name": "confirm_divider_height", - "value": "20" + "value": "44" }, { "name": "confirm_button_height", "value": "60" + }, + { + "name": "confirm_button_margin_t", + "value": "23vp" + }, + { + "name": "icon_item_fontsize", + "value": "18" + }, + { + "name": "setting_dialog_dy", + "value": "200" + }, + { + "name": "confirm_dialog_dy", + "value": "250" + }, + { + "name": "close_notification_margin_top", + "value": "15vp" + }, + { + "name": "notification_appname_margin_top", + "value": "11vp" + }, + { + "name": "notification_cancle_margin_top", + "value": "11vp" + }, + { + "name": "device_divider_margin_l", + "value": "70" + }, + { + "name": "device_divider_margin_r", + "value": "30" + }, + { + "name": "device_border_width", + "value": "1" + }, + { + "name": "device_border_radius", + "value": "30" } ] } \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/string.json b/features/noticeitem/src/main/resources/base/element/string.json index 16b52e48..c083768c 100644 --- a/features/noticeitem/src/main/resources/base/element/string.json +++ b/features/noticeitem/src/main/resources/base/element/string.json @@ -20,6 +20,14 @@ "name": "cancel", "value": "取消" }, + { + "name": "enter", + "value": "回复" + }, + { + "name": "Sending", + "value": "发送中" + }, { "name": "close", "value": "关闭" @@ -31,6 +39,14 @@ { "name": "confirm_message", "value": "是否关掉”%s“的所有通知?" + }, + { + "name": "device_dialog_title", + "value": "设备选择" + }, + { + "name": "distributed_devicename", + "value": "来自”%s“设备" } ] } diff --git a/features/noticeitem/src/main/resources/base/media/delete.png b/features/noticeitem/src/main/resources/base/media/delete.png deleted file mode 100644 index 143463751f103bbf00d204cbbd40982b9a5a6ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4061 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 P00000NkvXXu0mjf(|(n6 diff --git a/features/noticeitem/src/main/resources/base/media/ic_close.svg b/features/noticeitem/src/main/resources/base/media/ic_close.svg new file mode 100644 index 00000000..a7f87d23 --- /dev/null +++ b/features/noticeitem/src/main/resources/base/media/ic_close.svg @@ -0,0 +1 @@ +ic \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg b/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg new file mode 100644 index 00000000..9807c565 --- /dev/null +++ b/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_delete_filled + + + + + + + + + + \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg b/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg new file mode 100644 index 00000000..1b0c0940 --- /dev/null +++ b/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_settings_filled + + + + + + + + + + \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/media/ic_setting.png b/features/noticeitem/src/main/resources/base/media/ic_setting.png deleted file mode 100644 index 8d30e3686f820dcfd0ba79e8193aec4f0271ee27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2788 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 + + Public/ic_public_email_send + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/en_US/element/string.json b/features/noticeitem/src/main/resources/en_US/element/string.json index c0e1c1f5..765879aa 100644 --- a/features/noticeitem/src/main/resources/en_US/element/string.json +++ b/features/noticeitem/src/main/resources/en_US/element/string.json @@ -20,6 +20,14 @@ "name": "cancel", "value": "Cancel" }, + { + "name": "enter", + "value": "enter" + }, + { + "name": "Sending", + "value": "Sending" + }, { "name": "close", "value": "Turn Off" @@ -31,6 +39,14 @@ { "name": "confirm_message", "value": "Do you want to turn off all notifications of '%s'?" + }, + { + "name": "device_dialog_title", + "value": "Please select a device" + }, + { + "name": "distributed_devicename", + "value": "From the %s" } ] } diff --git a/features/noticeitem/src/main/resources/zh_CN/element/string.json b/features/noticeitem/src/main/resources/zh_CN/element/string.json index 16b52e48..c083768c 100644 --- a/features/noticeitem/src/main/resources/zh_CN/element/string.json +++ b/features/noticeitem/src/main/resources/zh_CN/element/string.json @@ -20,6 +20,14 @@ "name": "cancel", "value": "取消" }, + { + "name": "enter", + "value": "回复" + }, + { + "name": "Sending", + "value": "发送中" + }, { "name": "close", "value": "关闭" @@ -31,6 +39,14 @@ { "name": "confirm_message", "value": "是否关掉”%s“的所有通知?" + }, + { + "name": "device_dialog_title", + "value": "设备选择" + }, + { + "name": "distributed_devicename", + "value": "来自”%s“设备" } ] } diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets b/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets deleted file mode 100644 index 6b03a2c4..00000000 --- a/features/notificationservice/src/main/ets/com/ohos/notificationservice/NotificationService.ets +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright (c) 2021 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 NotificationManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/notificationManager.ets'; -import BundleManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager.ets'; -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import Constants,{NotificationItemData} from './common/constants.ets'; -import {SlotLevel} from '@ohos.notification' -import Media from '@ohos.multimedia.media' - -const TAG = 'NotificationService'; - -let mNotificationList; -let mSubscriber; -let mDate; -let mAppName; -let mEmptyArray; - -/** - * Responsible for notification binding and interaction between View and Model. - */ -export class NotificationService { - media:any - constructor() { - let tempLink = AppStorage.SetAndLink('notificationList', []) - mNotificationList = tempLink.get() - Log.showInfo(TAG, `NotificationService constructor ${JSON.stringify(mNotificationList)}`) - this.media=Media.createAudioPlayer() - this.media.src='file://system/etc/Light.ogg' - } - - initNotificationService() { - Log.showInfo(TAG, 'initNotificationCenter') - mDate = new Date(); - mAppName = new Map(); - mEmptyArray = []; - if (mSubscriber == undefined || mSubscriber == null) { - this.createNotificationCallback(); - Log.showInfo(TAG, `initNotificationCenter, if: ${JSON.stringify(mSubscriber)}`); - } - this.getAllActiveNotifications(); - Log.showInfo(TAG, 'initNotificationCenter end') - } - - updateNotification() { - Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(mNotificationList)}`); - Log.showInfo(TAG, `updateNotification len: ${mNotificationList.length}`); - let listLink = AppStorage.Link('notificationList'); - listLink.set(mNotificationList); - Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(listLink.get())}`); - } - - /** - * Call the method to receive notification events. - */ - createNotificationCallback() { - Log.showInfo(TAG, 'createNotificationCallback enter ===================='); - mSubscriber = { - onConsume: this.consumeCallback.bind(this), - onCancel: this.OnCancelCallback.bind(this) - } - Log.showInfo(TAG, `createNotificationCallback, ${JSON.stringify(mSubscriber)}`); - Log.showInfo(TAG, `createNotificationCallback, ${JSON.stringify(mSubscriber.onConsume)}`); - Log.showInfo(TAG, `createNotificationCallback, ${JSON.stringify(mSubscriber.onCancel)}`); - NotificationManager.subscribeNotification(TAG, mSubscriber, this.subscribeCallback.bind(this)); - Log.showInfo(TAG, 'createNotificationCallback end ===================='); - } - - /** - * Call the method before current process finished. - */ - async unRegisterNotificationSubscriber() { - if (mSubscriber != undefined && mSubscriber != null) { - NotificationManager.unsubscribeNotification(TAG, mSubscriber); - } - } - - /** - * The callback method that will be called after receiving a notification - * - * @param {Object} err - Error may occur. - * @param {Object} data - Callback data. - */ - consumeCallback(err, data) { - Log.showInfo(TAG, 'consumeCallback started'); - Log.showInfo(TAG, 'sortingMap' + JSON.stringify(data.sortingMap||{})) - Log.showInfo(TAG, JSON.stringify(data)); - let request = data?.request; - if (request == null || request == undefined) { - Log.showInfo(TAG, 'consumeCallback request is empty'); - return; - } - let sortingMap = data?.sortingMap; - if (sortingMap == null || sortingMap == undefined) { - Log.showInfo(TAG, 'consumeCallback sortingMap is empty'); - return; - } - this.handleRequest(request,sortingMap,Constants.GET_NEW_NOTIFICATION); - } - - parseRequest(request,appName,icon){ - Log.showInfo(TAG, `want = ${JSON.stringify(request.wantAgent)}`); - Log.showInfo(TAG, `actionButtons = ${JSON.stringify(request.actionButtons)}`); - Log.showInfo(TAG, `largeIcon = ${request.largeIcon}`); - let notificationItem:NotificationItemData = { - id: request.id, - hashcode: request.hashCode, - contentType: request?.content?.contentType + '', - timestamp: request.deliveryTime, - time: this.getStandardTime(request.deliveryTime), - name: appName, - want: request.wantAgent, - bundleName: request.creatorBundleName, - actionButtons: request.actionButtons, - smallIcon: icon, - largeIcon: request.largeIcon, - }; - switch (request?.content?.contentType) { - case NotificationManager.TYPE_BASIC: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_BASIC_TEXT ====================`); - notificationItem.title = request.content.normal?.title ?? ''; - notificationItem.text = request.content.normal?.text ?? ''; - notificationItem.additionalText = request.content.normal?.additionalText ?? ''; - break; - case NotificationManager.TYPE_LONG: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_LONG_TEXT ====================`); - notificationItem.title = request.content.longText?.title ?? ''; - notificationItem.text = request.content.longText?.text ?? ''; - notificationItem.additionalText = request.content.longText?.additionalText ?? ''; - notificationItem.briefText = request.content.longText?.briefText ?? ''; - notificationItem.expandedTitle = request.content.longText?.expandedTitle ?? ''; - notificationItem.longText = request.content.longText?.longText ?? ''; - break; - case NotificationManager.TYPE_MULTI: - Log.showInfo(TAG, `contentType NOTIFICATION_CONTENT_MULTILINE ====================`); - notificationItem.title = request.content.multiLine?.title ?? ''; - notificationItem.text = request.content.multiLine?.text ?? ''; - notificationItem.additionalText = request.content.multiLine?.additionalText ?? ''; - notificationItem.briefText = request.content.multiLine?.briefText ?? ''; - notificationItem.longTitle = request.content.multiLine?.longTitle ?? ''; - notificationItem.lines = request.content.multiLine?.lines ?? mEmptyArray; - Log.showInfo(TAG, `multilines: ${JSON.stringify(request.content.multiLine?.lines)}`) - break; - default: - Log.showInfo(TAG, 'no match content type'); - break; - } - return notificationItem - } - - handleRequest(request,sortingMap, processType) { - Log.showInfo(TAG, `request : ${JSON.stringify(request)}`) - Log.showInfo(TAG, `processType : ${processType}`) - let contentType = request?.content?.contentType; - if (contentType == null || contentType == undefined) { - Log.showInfo(TAG, 'Request contentType is empty'); - return; - } - let slotLevel; - try{ - slotLevel=sortingMap?.sortings[request.hashCode]?.slot.level; - }catch(e){ - Log.showInfo(TAG, `slot level get error: ${e.toString()}`); - } - Log.showInfo(TAG, `slotLevel = ${slotLevel}`); - this.getAppName(request.creatorBundleName, (AppName) => { - Log.showInfo(TAG, `notificationItem AppName = ${JSON.stringify(AppName)}`); - let notificationItem:NotificationItemData = this.parseRequest(request,AppName.appName,AppName.icon) - Log.showInfo(TAG, `notificationItem = ${JSON.stringify(notificationItem)}`); - if(slotLevel===SlotLevel.LEVEL_HIGH){ - try{ - this.media.play() - }catch(e){ - Log.showInfo(TAG, `notificationItem id${notificationItem.id} alert error: ${e.toString()}`); - } - } - switch (processType) { - case Constants.GET_NEW_NOTIFICATION: - this.removeNotificationItem(notificationItem['hashcode'], false); - mNotificationList.unshift(notificationItem); -// mNotificationList.sort(this.compare('timestamp')); - this.updateNotification(); - break; - case Constants.GET_EXIST_NOTIFICATION: - mNotificationList.unshift(notificationItem); - this.updateNotification(); - break; - default: - Log.showInfo(TAG, 'no match process type'); - break; - } - }); - } - - /** - * Get app name with bundleName. - * - * @param {string} bundleName - BundleName of the target app. - */ - getAppName(bundleName, callback) { - Log.showInfo(TAG, 'getAppName start ===================='); - if (mAppName.has(bundleName)) { - callback(mAppName.get(bundleName)); - Log.showInfo(TAG, 'HAS BUNDLENAME'); - } else { - BundleManager.getBundleInfo(TAG, bundleName, 0, (data) => { - Log.showInfo(TAG, `getBundleInfo` + JSON.stringify(data)); - let labelId = data.appInfo.labelId; - let iconId = data.appInfo.iconId; - let appName = ''; - BundleManager.getResourceManager(TAG, bundleName, (item) => { - Log.showInfo(TAG, `BundleManager.getResourceManager ${BundleManager.getResourceManager}`); - item.getString(labelId, (error, value) => { - Log.showInfo(TAG, `getString` + JSON.stringify(value)); - if (value != null && value != undefined) { - appName = value - } - item.getMediaBase64(iconId, (error, MediaValue) => { - Log.showInfo(TAG, `getMediaBase64` + JSON.stringify(MediaValue)); - if (MediaValue != null) { - let appMessage = { - 'appName': appName, - 'icon': MediaValue - } - if (appName != null && appName != undefined && appName != '') { - mAppName.set(bundleName, appMessage); - } - callback(appMessage); - } - }); - }) - }) - }); - Log.showInfo(TAG, 'getAppName end ===================='); - } - } - - /** - * notification CancelCallback - * - * @param {Object} err - return err Message. - * @param {Object} data - return data Message. - */ - OnCancelCallback(err, data) { - console.info("===>OnCancelCallback data : ==> " + ` err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); - this.removeNotificationItem(data.request.hashCode, false); - } - - onUpdateCallback(err, data) { - Log.showInfo(TAG, `onUpdateCallback = ${JSON.stringify(data.request)}`); - } - - /** - * The callback will be called after registered callback. - * - * @param {Object} err - Error may occur. - * @param {Object} data - Callback data. - */ - subscribeCallback(err, data) { - Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) - } - - /** - * Reformat the timestamp to hh:mm. - * - * @param {number} timestamp - Target timestamp. - */ - getStandardTime(timestamp) { - Log.showInfo(TAG, 'getStandardTime start ===================='); - if (timestamp == 0 || timestamp == undefined || timestamp == null) { - return ''; - } - mDate.setTime(timestamp); - let hoursNumber = mDate.getHours(); - let minutesNumber = mDate.getMinutes(); - let hours = hoursNumber < 10 ? '0' + hoursNumber : hoursNumber; - let minutes = minutesNumber < 10 ? '0' + minutesNumber : minutesNumber; - return hours + ':' + minutes; - } - - /** - * Compare method will be used when sorting a two-dimensional array. - * - * @param {string} property - Property in the object will be sorted. - */ - compare(params) { - return function (item1, item2) { - var itemTime1 = item1[params]; - var itemTime2 = item2[params]; - return itemTime2 - itemTime1; - } - } - - /** - * Remove all notifications. - */ - removeAllNotifications() { - mNotificationList = [] - this.updateNotification() - NotificationManager.removeAll(TAG, (err, data) => { - Log.showInfo(TAG, `removeAll , err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - }); - } - - removeNotificationItem(hashCode, isDelSysConent) { - Log.showInfo(TAG, `removeNotificationItem start, hashCode: ${hashCode}`); - for (let i = 0, len = mNotificationList.length; i < len; i++) { - if (mNotificationList[i].hashcode == hashCode) { - Log.showInfo(TAG, `removeNotificationItem i = ${i}`); - mNotificationList.splice(i, 1); - // mNotificationList.pop(i); - break; - } - } - this.updateNotification() - if (isDelSysConent) { - this.removeSysNotificationItem(hashCode); - } - } - - removeSysNotificationItem(hashCode) { - NotificationManager.remove(TAG, hashCode, (err, data) => { - Log.showInfo(TAG, `removeNotificationItem, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - }) - Log.showInfo(TAG, `removeNotificationItem end, length: ${mNotificationList.length}`); - } - - getAllActiveNotifications() { - Log.showInfo(TAG, `getAllActiveNotifications`); - NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { - Log.showInfo(TAG, `getAllActiveNotifications err: ${JSON.stringify(err)}`); - Log.showInfo(TAG, `getAllActiveNotifications requestsArr: ${JSON.stringify(requestsArr)}`); - if (Array.isArray(requestsArr)) { - for(let i = 0,len = requestsArr.length; i< len; i++) { - this.handleRequest(requestsArr[i],null, Constants.GET_EXIST_NOTIFICATION); - } - } else { - mNotificationList = []; - } - }) - } -} - -let notificationService = new NotificationService(); -export default notificationService as NotificationService; \ No newline at end of file diff --git a/features/notificationservice/src/main/resources/base/element/string.json b/features/notificationservice/src/main/resources/base/element/string.json deleted file mode 100644 index 04635cab..00000000 --- a/features/notificationservice/src/main/resources/base/element/string.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "string": [ - { - "name": "quicklysetting_library", - "value": "quicklysetting_library" - } - ] -} diff --git a/features/screenlock/build.gradle b/features/screenlock/build.gradle index 771c40b2..21f9ef72 100644 --- a/features/screenlock/build.gradle +++ b/features/screenlock/build.gradle @@ -19,4 +19,8 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) implementation project(':common') implementation project(':features:batterycomponent') + implementation project(':features:clockcomponent') + implementation project(':features:wificomponent') + implementation project(':features:signalcomponent') + } diff --git a/features/screenlock/src/main/ets/com/ohos/common/constants.ets b/features/screenlock/src/main/ets/com/ohos/common/constants.ets index 60addc47..540a56c0 100644 --- a/features/screenlock/src/main/ets/com/ohos/common/constants.ets +++ b/features/screenlock/src/main/ets/com/ohos/common/constants.ets @@ -62,4 +62,9 @@ export default class Constants { //max password length static PASSWORD_MAX_LEN = 32 + static ACCOUNT_SPACE = 24 +} +export class StatusBarGroupComponentData { + backgroundColor: string = "#00000000"; + contentColor: string = "#FFFFFFFF"; } \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/data/userData.ets b/features/screenlock/src/main/ets/com/ohos/data/userData.ts similarity index 90% rename from features/screenlock/src/main/ets/com/ohos/data/userData.ets rename to features/screenlock/src/main/ets/com/ohos/data/userData.ts index 47f7fdc2..e32a0d5c 100644 --- a/features/screenlock/src/main/ets/com/ohos/data/userData.ets +++ b/features/screenlock/src/main/ets/com/ohos/data/userData.ts @@ -14,7 +14,7 @@ */ export interface UserData { - userId:number; - userName:string; - userIconPath:string; + userId: number; + userName: string; + userIconPath: string; } \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ets b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ets deleted file mode 100644 index f7d00b23..00000000 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ets +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2022 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 account_osAccount from '@ohos.account.osAccount' -import commonEvent from '@ohos.commonEvent'; -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import {UserData} from '../data/userData.ets' - -const TAG = "ScreenLock-AccountsModel" -const TYPE_ADMIN = 0; -const TYPE_NORMAL = 1; -const TYPE_GUEST = 2; - -let mCommonEventSubscribeInfo = { - events: [ - commonEvent.Support.COMMON_EVENT_USER_ADDED, - commonEvent.Support.COMMON_EVENT_USER_REMOVED - ] -}; - -let mEventSubscriber - -export default class AccountsModel { - modelInit() { - Log.showInfo(TAG, "start ModelInit") - this.getAllUsers() - commonEvent.createSubscriber(mCommonEventSubscribeInfo, this.createSubscriberCallBack.bind(this)); - Log.showInfo(TAG, "start ModelInit finish") - } - - private createSubscriberCallBack(err, data) { - Log.showInfo(TAG, "start createSubscriberCallBack " + JSON.stringify(data)) - mEventSubscriber = data - commonEvent.subscribe(data, this.getAllUsers.bind(this)); - Log.showInfo(TAG, "start createSubscriberCallBack finish") - } - - private getAllUsers() { - Log.showInfo(TAG, "start getAllUsers") - let tempLink = AppStorage.SetAndLink('userList', []); - let accountList = tempLink.get(); - let count = accountList.length; - accountList.splice(0, count) - Log.showInfo(TAG, "start query") - account_osAccount.getAccountManager().queryAllCreatedOsAccounts().then((list) => { - Log.showInfo(TAG, "start sort") - list.sort(this.sortAccount.bind(this)); - for (const user of list) { - Log.showInfo(TAG, "start get user" + JSON.stringify(user)) - if (user.isActived) { - AppStorage.SetOrCreate('userId', user.localId) - } - account_osAccount.getAccountManager().getOsAccountProfilePhoto(user.localId).then((path) => { - Log.showInfo(TAG, "start get photo:" + path) - let userData: UserData = { - userId: user.localId, - userName: user.localName, - userIconPath: path - } - accountList.push(userData) - }) - } - }) - } - - private sortAccount(info1, info2): number { - if (info1.isActived || info2.isActived) { - return info1.isActived ? -1 : 1; - } else if (info1.type.ADMIN == TYPE_ADMIN || info2.type.ADMIN == TYPE_ADMIN) { - return info1.type.ADMIN == TYPE_ADMIN ? -1 : 1; - } else if ( info1.type.GUEST == TYPE_GUEST || info2.type.GUEST == TYPE_GUEST) { - return info1.type.GUEST == TYPE_GUEST ? 1 : -1; - } else { - return info2.localId - info1.localId; - } - } - - - onUserSwitch(userId: number) { - Log.showInfo(TAG, "onUserSwitch:" + userId) - account_osAccount.getAccountManager().activateOsAccount(userId).then(() => { - Log.showInfo(TAG, "activateOsAccount") - }) - Log.showInfo(TAG, "onUserSwitch:" + userId + "finish") - } - - modelFinish() { - Log.showInfo(TAG, "start modelFinish") - commonEvent.unsubscribe(mEventSubscriber); - } -} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts new file mode 100644 index 00000000..dbd6c1ba --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2022 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 osAccount from '@ohos.account.osAccount' +import commonEvent from '@ohos.commonEvent'; +import util from '@ohos.util'; +import {Callback} from 'basic'; +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import {UserData} from '../data/userData' + +const TAG = "ScreenLock-AccountsModel" +const TYPE_ADMIN = 0; +const TYPE_NORMAL = 1; +const TYPE_GUEST = 2; + +export enum AuthType { + //Authentication type pin. + PIN = 1, + //Authentication type face. + FACE = 2 +} + +export enum AuthSubType { + //Authentication sub type six number pin. + PIN_SIX = 10000, + //Authentication sub type self defined number pin. + PIN_NUMBER = 10001, + //Authentication sub type mixed number pin. + PIN_MIXED = 10002, + //Authentication sub type 2D face. + FACE_2D = 20000, + //Authentication sub type 3D face. + FACE_3D = 20001 +} + +export enum AuthTurstLevel { + //Authentication result trusted level 1. + ATL1 = 10000, + //Authentication result trusted level 2. + ATL2 = 20000, + //Authentication result trusted level 3. + ATL3 = 30000, + //Authentication result trusted level 4. + ATL4 = 40000 +} + +export enum GetPropertyType { + //Authentication remain times. + AUTH_SUB_TYPE = 1, + //Authentication remain times. + REMAIN_TIMES = 2, + //Authentication remain times. + FREEZING_TIME = 3 +} + +export enum ResultCode { + //success + SUCCESS = 0, + //fails + FAIL = 1, +} + +let mCurrentUserId: number = 100 + +export default class AccountsModel { + userAuthManager = new osAccount.UserAuth(); + pinAuthManager = new osAccount.PINAuth(); + + modelInit() { + Log.showInfo(TAG, "start ModelInit") + Log.showInfo(TAG, "start ModelInit finish") + } + + eventListener(typeName: "activate" | "activating", name: string, callback: Callback) { + Log.showInfo(TAG, `eventListener:typeName ${typeName}`); + osAccount.getAccountManager().on(typeName, name, (userId: number) => { + Log.showInfo(TAG, `on ${typeName} callback userId = ${userId}`) + mCurrentUserId = userId + callback() + }) + } + + eventCancelListener(typeName: "activate" | "activating", name: string) { + Log.showInfo(TAG, `eventCancleListener:typeName ${typeName}`); + osAccount.getAccountManager().off(typeName, name) + } + + updateAllUsers() { + this.clearAllUsers() + // add later to avoid list not refresh + setTimeout(() => { + this.addAllUsers() + }, 100); + } + + private clearAllUsers() { + AppStorage.SetOrCreate('userList', []); + } + + private addAllUsers() { + Log.showInfo(TAG, "start getAllUsers") + let tempLink = AppStorage.SetAndLink('userList', []); + let accountList = tempLink.get(); + let accountMap = new Map(); + Log.showInfo(TAG, "start query") + osAccount.getAccountManager().queryAllCreatedOsAccounts().then((list) => { + Log.showInfo(TAG, "start sort") + list.sort(this.sortAccount.bind(this)); + for (const user of list) { + Log.showInfo(TAG, "start get user" + JSON.stringify(user)) + if (user.isActived) { + mCurrentUserId = user.localId + } + let userData: UserData = { + userId: user.localId, + userName: user.localName, + userIconPath: "" + } + accountList.push(userData) + accountMap.set(user.localId, userData) + osAccount.getAccountManager().getOsAccountProfilePhoto(user.localId).then((path) => { + Log.showInfo(TAG, "start get photo:" + path) + accountMap.get(user.localId).userIconPath = path + }) + } + }) + } + + private sortAccount(info1, info2): number { + if (info1.isActived || info2.isActived) { + return info1.isActived ? -1 : 1; + } else if (info1.type.ADMIN == TYPE_ADMIN || info2.type.ADMIN == TYPE_ADMIN) { + return info1.type.ADMIN == TYPE_ADMIN ? -1 : 1; + } else if (info1.type.GUEST == TYPE_GUEST || info2.type.GUEST == TYPE_GUEST) { + return info1.type.GUEST == TYPE_GUEST ? 1 : -1; + } else { + return info2.localId - info1.localId; + } + } + + onUserSwitch(userId: number) { + Log.showInfo(TAG, "onUserSwitch:" + userId) + osAccount.getAccountManager().activateOsAccount(userId).then(() => { + Log.showInfo(TAG, "activateOsAccount") + }) + Log.showInfo(TAG, "onUserSwitch:" + userId + "finish") + } + + authUser(challenge, authType: AuthType, authLevel: number, callback) { + Log.showInfo(TAG, `authUser param: userId ${mCurrentUserId} challenge ${challenge}`); + this.userAuthManager.authUser(mCurrentUserId, challenge, authType, authLevel, { + onResult: (result, extraInfo) => { + Log.showInfo(TAG, `authUser UserAuthManager.authUser onResult`); + callback(result, extraInfo); + }, + onAcquireInfo: (moduleId, acquire, extraInfo) => { + Log.showInfo(TAG, `authUser UserAuthManager.authUser onAcquireInfo`); + } + } + ) + } + + getAuthProperty(authType, callback) { + Log.showInfo(TAG, `getAuthProperty param: authType ${authType}`); + let keyArray = [GetPropertyType.AUTH_SUB_TYPE, GetPropertyType.REMAIN_TIMES, GetPropertyType.FREEZING_TIME] + let request = { + 'authType': authType, + 'keys': keyArray + } + this.userAuthManager.getProperty(request).then((properties) => { + Log.showInfo(TAG, `getAuthProperty properties ${JSON.stringify(properties)}`); + callback(properties) + }) + } + + registerPWDInputer(password: string): Promise { + Log.showInfo(TAG, `registerPWDInputer`); + let result = this.registerInputer(password); + if (result) { + return Promise.resolve(); + } else { + return Promise.reject(); + } + } + + private registerInputer(password: string): boolean { + Log.showInfo(TAG, `registerInputer`); + let result = this.pinAuthManager.registerInputer({ + onGetData: (passType, inputData) => { + Log.showInfo(TAG, `registerInputer onSetData passType:${passType}`); + let textEncoder = new util.TextEncoder(); + let uint8PW = textEncoder.encode(password); + Log.showInfo(TAG, `registerInputer onSetData call`); + inputData.onSetData(passType, uint8PW); + } + }) + Log.showInfo(TAG, `registerInputer result:${result} `); + return result; + } + + unregisterInputer() { + Log.showInfo(TAG, `unregisterInputer`); + this.pinAuthManager.unregisterInputer(); + } + + modelFinish() { + Log.showInfo(TAG, "start modelFinish") + } + + isActivateAccount(callback: Callback) { + Log.showInfo(TAG, `isActivateAccount userId:${mCurrentUserId}`) + osAccount.getAccountManager().isOsAccountActived(mCurrentUserId).then((isActivate) => { + Log.showInfo(TAG, `isActivateAccount userId:${mCurrentUserId} result: ${isActivate}`) + callback(isActivate) + }) + } +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ets b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ets deleted file mode 100644 index 6e9d3377..00000000 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ets +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import ScreenLockMar from '@ohos.screenlock'; -import windowManager from '@ohos.window' -import Constants from '../common/constants.ets' -import UserIDM from '@ohos.useridm' -import UserAuth from '@ohos.userauth' -import PinAuth from '@ohos.pinauth' -import util from '@ohos.util'; - -const TAG = 'ScreenLock-ScreenLockModel'; - -export enum AuthType { - //Authentication type pin. - PIN = 1, - //Authentication type face. - FACE = 2 -} - -export enum AuthSubType { - //Authentication sub type six number pin. - PIN_SIX = 10000, - //Authentication sub type self defined number pin. - PIN_NUMBER = 10001, - //Authentication sub type mixed number pin. - PIN_MIXED = 10002, - //Authentication sub type 2D face. - FACE_2D = 20000, - //Authentication sub type 3D face. - FACE_3D = 20001 -} - -export enum AuthTurstLevel { - //Authentication result trusted level 1. - ATL1 = 10000, - //Authentication result trusted level 2. - ATL2 = 20000, - //Authentication result trusted level 3. - ATL3 = 30000, - //Authentication result trusted level 4. - ATL4 = 40000 -} - -export enum GetPropertyType { - //Authentication remain times. - AUTH_SUB_TYPE = 1, - //Authentication remain times. - REMAIN_TIMES = 2, - //Authentication remain times. - FREEZING_TIME = 3 -} - -export enum ResultCode { - //success - SUCCESS = 0, - //fails - FAIL = 1, -} - -export default class ScreenLockModel { - static UserIdentityManager = new UserIDM.UserIdentityManager(); - static UserAuthManager = new UserAuth.UserAuth(); - static PINAuthManager = new PinAuth.PINAuth(); - - static eventListener(typeName: string, callback) { - Log.showInfo(TAG, `eventListener:typeName ${typeName}`); - ScreenLockMar.on(typeName, (err, data) => { - Log.showInfo(TAG, `eventListener:callback err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); - callback(data); - }) - } - - static sendScreenLockEvent(typeName: string, typeNo: number, callback) { - Log.showInfo(TAG, `sendScreenLockEvent: typeName ${typeName} typeNo ${typeNo} `); - ScreenLockMar.sendScreenLockEvent(typeName, typeNo, (err, data) => { - Log.showInfo(TAG, `sendScreenLockEvent:callback err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); - callback(err, data); - }) - } - - static showScreenLockWindow(callback) { - Log.showInfo(TAG, 'showScreenLockWindow'); - windowManager.find(Constants.WIN_NAME).then((win) => { - Log.showInfo(TAG, 'find window finish'); - win.show().then(() => { - Log.showInfo(TAG, `window show`); - callback(); - }) - }) - } - - static hiddenScreenLockWindow(callback) { - Log.showInfo(TAG, 'hiddenScreenLockWindow'); - windowManager.find(Constants.WIN_NAME).then((win) => { - Log.showInfo(TAG, 'find window finish'); - win.hide().then(() => { - Log.showInfo(TAG, `window hide`); - callback(); - }) - }) - } - - static openIDMSession(callback) { - Log.showInfo(TAG, 'openIDMSession'); - ScreenLockModel.UserIdentityManager.openSession().then((credentialId) => { - Log.showInfo(TAG, `openIDMSession credentialId:${credentialId}`); - callback(credentialId); - }).catch((error) => { - Log.showInfo(TAG, `openIDMSession error:${JSON.stringify(error)}`); - }) - } - - static closeIDMSession() { - Log.showInfo(TAG, 'closeIDMSession'); - ScreenLockModel.UserIdentityManager.closeSession(); - } - - static authUser(userId: number, challenge, callback) { - Log.showInfo(TAG, `authUser param: userId ${userId} challenge ${challenge}`); - ScreenLockModel.UserAuthManager.authUser(userId, challenge, AuthType.PIN, - AuthTurstLevel.ATL4, { - onResult: (result, extraInfo) => { - Log.showInfo(TAG, `authUser UserAuthManager.authUser onResult`); - callback(result, extraInfo); - }, - onAcquireInfo: (moduleId, acquire, extraInfo) => { - Log.showInfo(TAG, `authUser UserAuthManager.authUser onAcquireInfo`); - } - } - ) - } - - static getAuthProperty(authType, keyArray, callback) { - Log.showInfo(TAG, `getAuthProperty param: authType ${authType} keyArray ${keyArray}`); - let request = { - 'authType': authType, - 'keys': keyArray - } - ScreenLockModel.UserAuthManager.getProperty(request).then((properties) => { - Log.showInfo(TAG, `getAuthProperty properties ${JSON.stringify(properties)}`); - callback(properties) - }) - } - - static registerPWDInputer(passType, password): Promise { - Log.showInfo(TAG, `registerPWDInputer`); - return new Promise(function (resolve, reject) { - let result = ScreenLockModel.registerInputer(passType, password); - if (!result) { - Log.showInfo(TAG, `registerPWDInputer again`); - ScreenLockModel.unregisterInputer(); - ScreenLockModel.registerInputer(passType, password); - } - if (result) { - resolve(); - } else { - reject(); - } - }) - } - - static registerInputer(passType, password): boolean { - Log.showInfo(TAG, `registerInputer`); - let result = ScreenLockModel.PINAuthManager.registerInputer({ - onGetData: (passType, inputData) => { - Log.showInfo(TAG, `registerInputer onSetData passType:${passType}`); - let textEncoder = new util.TextEncoder(); - let uint8PW = textEncoder.encode(password); - Log.showInfo(TAG, `registerInputer onSetData call`); - inputData.onSetData(passType, uint8PW); - } - }) - Log.showInfo(TAG, `registerInputer result:${result} `); - return result; - } - - static unregisterInputer() { - Log.showInfo(TAG, `unregisterInputer`); - ScreenLockModel.PINAuthManager.unregisterInputer(); - } -} diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts new file mode 100644 index 00000000..940f9060 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import ScreenLockMar from '@ohos.screenlock'; +import windowManager from '@ohos.window' +import Constants from '../common/constants' +import { Callback } from 'basic'; + +const TAG = 'ScreenLock-ScreenLockModel'; + +export default class ScreenLockModel { + eventListener(typeName: string, callback:Callback) { + Log.showInfo(TAG, `eventListener:typeName ${typeName}`); + ScreenLockMar.on(typeName, (err, data) => { + Log.showInfo(TAG, `eventListener:callback err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); + callback(); + }) + Log.showInfo(TAG, `eventListener:typeName ${typeName} finish`); + } + + eventCancelListener(typeName: string) { + Log.showInfo(TAG, `eventCancleListener:typeName ${typeName}`); + ScreenLockMar.off(typeName, (err, data) => { + Log.showInfo(TAG, `eventCancleListener:callback err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); + }) + } + + sendScreenLockEvent(typeName: string, typeNo: number, callback) { + Log.showInfo(TAG, `sendScreenLockEvent: typeName ${typeName} typeNo ${typeNo} `); + ScreenLockMar.sendScreenLockEvent(typeName, typeNo, (err, data) => { + Log.showInfo(TAG, `sendScreenLockEvent:callback err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); + callback(err, data); + }) + } + + showScreenLockWindow(callback:Callback) { + Log.showInfo(TAG, 'showScreenLockWindow'); + windowManager.find(Constants.WIN_NAME).then((win) => { + Log.showInfo(TAG, 'find window finish'); + win.show().then(() => { + Log.showInfo(TAG, `window show`); + callback(); + }) + }) + } + + hiddenScreenLockWindow(callback:Callback) { + Log.showInfo(TAG, 'hiddenScreenLockWindow'); + windowManager.find(Constants.WIN_NAME).then((win) => { + Log.showInfo(TAG, 'find window finish'); + win.hide().then(() => { + Log.showInfo(TAG, `window hide`); + callback(); + }) + }) + } +} diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets deleted file mode 100644 index c925330d..00000000 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets'; -import ScreenLockModel, {AuthType, AuthSubType, GetPropertyType} from './screenLockModel'; -import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets'; -import Router from '@system.router'; - -const TAG = 'ScreenLock-ScreenLockService'; -const URI_DIGITALPASSWORD = 'pages/digitalPassword' -const URI_MIXEDPASSWORD = 'pages/mixedPassword' -const URI_CUSTOMPASSWORD = 'pages/customPassword' - - -//Event type name -const EVENT_BEGIN_WAKEUP: string = 'beginWakeUp' //设备将要唤醒 -const EVENT_END_WAKEUP: string = 'endWakeUp' //设备唤醒 -const EVENT_BEGIN_SCREENON: string = 'beginScreenOn' //开始亮屏 -const EVENT_END_SCREENON: string = 'endScreenOn' //设备亮屏 -const EVENT_BEGIN_SCREENOFF: string = 'beginScreenOff' //开始灭屏 -const EVENT_END_SCREENOFF: string = 'endScreenOff' //设备灭屏 -const EVENT_UNLOCK_SCREEN: string = 'unlockScreen' //请求屏幕解锁 -const EVENT_BEGIN_EXITANIMATION: string = 'beginExitAnimation' //动画结束 -const EVENT_BEGIN_SLEEP: string = 'beginSleep' // 设备将要休眠 -const EVENT_END_SLEEP: string = 'endSleep' //设备休眠 -const EVENT_CHANGE_USER: string = 'changeUser' //切换用户 -const EVENT_SCREENLOCK_ENABLE: string = 'screenlockEnabled' //锁屏锁屏应用是否可用 - -const UNLOCK_SCREEN_RESULT: string = 'unlockScreenResult' //请求解锁 -const SCREENLOCK_DRAW_DONE: string = 'screenDrawDone' // 解锁界面绘制完成 -const CHALLENGE_INT = 0 - -const MAIN_USER = 100 - -export enum UnlockResult { - Success = 0, - Fail = 1, - Cancel = 2 -} - -export {AuthSubType}; - -export class ScreenLockService { - init() { - Log.showInfo(TAG, 'init'); - this.lockScreen(); - this.monitorEvents(); - } - - monitorEvents() { - Log.showInfo(TAG, 'registered events start'); - - //设备将要唤醒 - ScreenLockModel.eventListener(EVENT_BEGIN_WAKEUP, (data) => { - Log.showInfo(TAG, `EVENT_BEGIN_WAKEUP event data:${JSON.stringify(data)}`); - this.lockScreen(); - }) - - //设备唤醒 - ScreenLockModel.eventListener(EVENT_END_WAKEUP, (data) => { - Log.showInfo(TAG, `EVENT_END_WAKEUP event data:${JSON.stringify(data)}`); - this.lockScreen(); - }) - - //开始亮屏 - ScreenLockModel.eventListener(EVENT_BEGIN_SCREENON, (data) => { - Log.showInfo(TAG, `EVENT_BEGIN_SCREENON event data:${JSON.stringify(data)}`); - this.lockScreen(); - }) - - //设备亮屏 - ScreenLockModel.eventListener(EVENT_END_SCREENON, (data) => { - Log.showInfo(TAG, `EVENT_END_SCREENON event data:${JSON.stringify(data)}`); - this.lockScreen(); - }) - - //设备将要休眠 - ScreenLockModel.eventListener(EVENT_BEGIN_SLEEP, (data) => { - Log.showInfo(TAG, `EVENT_BEGIN_SLEEP event data:${JSON.stringify(data)}`); - this.lockScreen(); - }) - - //设备休眠 - ScreenLockModel.eventListener(EVENT_END_SLEEP, (data) => { - Log.showInfo(TAG, `EVENT_END_SLEEP event data:${JSON.stringify(data)}`); - this.lockScreen(); - }) - - //设备灭屏 - ScreenLockModel.eventListener(EVENT_END_SCREENOFF, (data) => { - Log.showInfo(TAG, `EVENT_END_SCREENOFF event data:${JSON.stringify(data)}`); - this.lockScreen(); - }) - - //切换用户 - ScreenLockModel.eventListener(EVENT_CHANGE_USER, (data) => { - Log.showInfo(TAG, `EVENT_CHANGE_USER event data:${JSON.stringify(data)}`); - this.lockScreen(); - }) - - //接收到屏幕解锁请求 - ScreenLockModel.eventListener(EVENT_UNLOCK_SCREEN, (data) => { - Log.showInfo(TAG, `EVENT_UNLOCK_SCREEN event data:${JSON.stringify(data)}`); - this.unlockScreen(); - }); - - Log.showInfo(TAG, 'registered events end'); - } - - lockScreen() { - Log.showInfo(TAG, `lockScreen`); - let status = AppStorage.Link('lockStatus') - Log.showInfo(TAG, `lockScreen lockStatus.get:${status?.get()}`); - let length = Router.getLength() - Log.showInfo(TAG, `Router.getLength: ${length}`) - for (let index = 1;index < length; index++) { - Log.showInfo(TAG, `back to index`); - Router.back(); - } - if (!!status && status.get() == ScreenLockStatus.Locking) { - Log.showInfo(TAG, `lockScreen return`); - return; - } - //set the lockStatus to 'locking' - AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Locking); - //lock the screen - ScreenLockModel.showScreenLockWindow(() => { - Log.showInfo(TAG, `showScreenLockWindow finish`); - }); - } - - unlockScreen() { - Log.showInfo(TAG, `unlockScreen`); - ScreenLockModel.getAuthProperty(AuthType.PIN, [GetPropertyType.AUTH_SUB_TYPE, GetPropertyType.REMAIN_TIMES, - GetPropertyType.FREEZING_TIME], (properties) => { - Log.showInfo(TAG, `unlockScreen:AUTH_SUB_TYPE:${properties.authSubType}`); - switch (properties.authSubType) { - case AuthSubType.PIN_SIX: - Log.showInfo(TAG, `unlockScreen Router.push:digitalPassword`); - Router.push({ uri: URI_DIGITALPASSWORD }); - break; - case AuthSubType.PIN_MIXED: - Log.showInfo(TAG, `unlockScreen Router.push:mixedPassword`); - Router.push({ uri: URI_MIXEDPASSWORD }); - break; - case AuthSubType.PIN_NUMBER: - Log.showInfo(TAG, `unlockScreen Router.push:customPassword`); - Router.push({ uri: URI_CUSTOMPASSWORD }); - break; - default: - Log.showInfo(TAG, `unlock the screen`); - this.unlocking(); - } - }); - } - - unlocking() { - Log.showInfo(TAG, `unlocking`); - let status = AppStorage.Link('lockStatus') - Log.showInfo(TAG, `unlocking lockStatus:${JSON.stringify(status?.get())}`); - if (!!status && status.get() == ScreenLockStatus.Unlock) { - Log.showInfo(TAG, `unlocking return`); - return; - } - //set the lockStatus to 'Unlock' - AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Unlock); - //unlock the screen - ScreenLockModel.hiddenScreenLockWindow(() => { - Log.showInfo(TAG, `hiddenScreenLockWindow finish`); - //notify the base service that the unlock is completed - this.notifyScreenResult(UnlockResult.Success); - }); - } - - notifyScreenResult(result: UnlockResult) { - Log.showInfo(TAG, `notifyScreenResult`); - ScreenLockModel.sendScreenLockEvent(UNLOCK_SCREEN_RESULT, result, (error, data) => { - Log.showInfo(TAG, `notifyScreenResult: error:${JSON.stringify(error)} data:${JSON.stringify(data)}`); - }); - } - - notifyDrawDone() { - Log.showInfo(TAG, `notifyDrawDone`); - //notify the base service that the screen is loaded - ScreenLockModel.sendScreenLockEvent(SCREENLOCK_DRAW_DONE, 0, (error, result) => { - Log.showInfo(TAG, `notifyDrawDone: error:${JSON.stringify(error)} result:${JSON.stringify(result)}`); - }); - } - - authUser(authSubType: AuthSubType, passwordData: number[] | string, callback): void { - Log.showInfo(TAG, `authUser authSubType:${authSubType}`); - let password: string = ''; - if (typeof passwordData == 'string') { - password = passwordData; - } else { - password = passwordData.join(''); - } - ScreenLockModel.registerPWDInputer(authSubType, password).then(() => { - Log.showInfo(TAG, `registerPWDInputer success`); - let userIdLink = AppStorage.Link('userId'); - ScreenLockModel.authUser(userIdLink?.get() ?? MAIN_USER, CHALLENGE_INT, (result, extraInfo) => { - Log.showInfo(TAG, `authUser callback:${result} extraInfo:${JSON.stringify(extraInfo)}`); - ScreenLockModel.unregisterInputer(); - callback(result, extraInfo); - }) - }).catch(() => { - Log.showInfo(TAG, `registerPWDInputer fails`); - }) - } - - goBack() { - Log.showInfo(TAG, `goBack`); - Router.back(); - ScreenLockModel.unregisterInputer(); - } -} - - -let screenLockService = new ScreenLockService(); - -export default screenLockService as ScreenLockService; \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts new file mode 100644 index 00000000..86782840 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -0,0 +1,328 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import ScreenLockModel from './screenLockModel'; +import AccountModel, {AuthType, AuthSubType, AuthTurstLevel} from './accountsModel' +import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper' +import Router from '@system.router'; +import commonEvent from '@ohos.commonEvent'; +import {Callback} from 'basic'; + +const TAG = 'ScreenLock-ScreenLockService'; +const URI_DIGITALPASSWORD = 'pages/digitalPassword' +const URI_MIXEDPASSWORD = 'pages/mixedPassword' +const URI_CUSTOMPASSWORD = 'pages/customPassword' + + +//Event type name +const EVENT_BEGIN_WAKEUP: string = 'beginWakeUp' +const EVENT_END_WAKEUP: string = 'endWakeUp' +const EVENT_BEGIN_SCREENON: string = 'beginScreenOn' +const EVENT_END_SCREEN_ON: string = 'endScreenOn' +const EVENT_BEGIN_SCREENOFF: string = 'beginScreenOff' +const EVENT_END_SCREENOFF: string = 'endScreenOff' +const EVENT_UNLOCK_SCREEN: string = 'unlockScreen' +const EVENT_BEGIN_EXITANIMATION: string = 'beginExitAnimation' +const EVENT_BEGIN_SLEEP: string = 'beginSleep' +const EVENT_END_SLEEP: string = 'endSleep' +const EVENT_CHANGE_USER: string = 'changeUser' +const EVENT_SCREENLOCK_ENABLE: string = 'screenlockEnabled' + +const UNLOCK_SCREEN_RESULT: string = 'unlockScreenResult' +const SCREENLOCK_DRAW_DONE: string = 'screenDrawDone' + +const ACTIVATING_TYPE = "activating" +const ACTIVATE_TYPE = "activate" +const ACTIVATING_EVENT = "activatingEvent" +const ACTIVATE_EVENT = "activateEvent" + +const CHALLENGE_INT = 0 + +const MAIN_USER = 100 + +export {AuthType, AuthSubType}; + +export enum UnlockResult { + Success = 0, + Fail = 1, + Cancel = 2 +} + +let mRouterPath: string = "" + +let mWillRecognizeFace: boolean = false + +let mUnLockBeginAnimation: Callback> = (callback: Callback) => { + callback() +} + +export class ScreenLockService { + accountModel: AccountModel = new AccountModel() + screenLockModel: ScreenLockModel = new ScreenLockModel() + + init() { + Log.showInfo(TAG, 'init'); + this.accountModel.modelInit(); + this.monitorEvents(); + this.accountModel.updateAllUsers() + this.checkPinAuthProperty(() => { + Log.showInfo(TAG, `checkPinAuthProperty back`) + this.authUserByFace() + }) + } + + monitorEvents() { + Log.showInfo(TAG, 'registered events start'); + + //Bright screen + this.screenLockModel.eventListener(EVENT_END_SCREEN_ON, () => { + Log.showInfo(TAG, `EVENT_END_SCREEN_ON event`); + this.authUserByFace() + AppStorage.SetOrCreate('deviceStatus', EVENT_END_SCREEN_ON); + }) + + //The device is going to sleep + this.screenLockModel.eventListener(EVENT_BEGIN_SLEEP, () => { + Log.showInfo(TAG, `EVENT_BEGIN_SLEEP event`); + this.accountModel.updateAllUsers() + this.lockScreen(); + AppStorage.SetOrCreate('deviceStatus', EVENT_BEGIN_SLEEP); + }) + + this.accountModel.eventListener(ACTIVATING_TYPE, ACTIVATING_EVENT, () => { + Log.showInfo(TAG, `ACTIVATING_TYPE event`); + this.lockScreen(); + }) + + this.accountModel.eventListener(ACTIVATE_TYPE, ACTIVATE_EVENT, () => { + Log.showInfo(TAG, `ACTIVATE_TYPE event`); + this.accountModel.updateAllUsers() + this.checkPinAuthProperty(() => { + Log.showInfo(TAG, `checkPinAuthProperty back`) + this.authUserByFace() + }) + }) + + //unlock request was received + this.screenLockModel.eventListener(EVENT_UNLOCK_SCREEN, () => { + Log.showInfo(TAG, `EVENT_UNLOCK_SCREEN event`); + this.unlockScreen(); + }); + + Log.showInfo(TAG, 'registered events end'); + } + + lockScreen() { + Log.showInfo(TAG, `lockScreen`); + let length = Router.getLength() + Log.showInfo(TAG, `Router.getLength: ${length}`) + for (let index = 1;index < length; index++) { + Log.showInfo(TAG, `back to index`); + Router.back(); + } + //lock the screen + this.screenLockModel.showScreenLockWindow(() => { + Log.showInfo(TAG, `showScreenLockWindow finish`); + this.checkPinAuthProperty(() => { + }); + this.publish("common.event.LOCK_SCREEN"); + }); + } + + private checkPinAuthProperty(callback: Callback) { + Log.showInfo(TAG, "checkPinAuthProperty") + this.accountModel.getAuthProperty(AuthType.PIN, (properties) => { + Log.showInfo(TAG, `checkPinAuthProperty:AUTH_SUB_TYPE:${properties.authSubType}`); + switch (properties.authSubType) { + case AuthSubType.PIN_SIX: + Log.showInfo(TAG, "AuthSubType.PIN_SIX") + AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Locking); + mRouterPath = URI_DIGITALPASSWORD; + this.checkFaceAuthProperty(() => { + callback() + }) + break; + case AuthSubType.PIN_MIXED: + Log.showInfo(TAG, "AuthSubType.PIN_MIXED") + AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Locking); + mRouterPath = URI_MIXEDPASSWORD; + this.checkFaceAuthProperty(() => { + callback() + }) + break; + case AuthSubType.PIN_NUMBER: + Log.showInfo(TAG, "AuthSubType.PIN_NUMBER") + AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Locking); + mRouterPath = URI_CUSTOMPASSWORD; + this.checkFaceAuthProperty(() => { + callback() + }) + break; + default: + Log.showInfo(TAG, "lockStatus: unlocked") + AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Unlock); + mWillRecognizeFace = false + } + }) + } + + private checkFaceAuthProperty(callback: Callback) { + Log.showInfo(TAG, "checkFaceAuthProperty") + this.accountModel.getAuthProperty(AuthType.FACE, (properties) => { + Log.showInfo(TAG, `checkFaceAuthProperty:AUTH_SUB_TYPE:${properties.authSubType}`); + switch (properties.authSubType) { + case AuthSubType.FACE_2D: + case AuthSubType.FACE_3D: + mWillRecognizeFace = true + callback() + break; + default: + mWillRecognizeFace = false + } + }) + } + + unlockScreen() { + Log.showInfo(TAG, `unlockScreen`); + this.accountModel.isActivateAccount((isActivate: boolean) => { + if (!isActivate) { + Log.showInfo(TAG, "isActivitings") + return + } + mUnLockBeginAnimation(() => { + let status = AppStorage.Link('lockStatus') + Log.showInfo(TAG, `unlocking lockStatus:${JSON.stringify(status?.get())}`); + if (status?.get() == ScreenLockStatus.Unlock) { + Log.showInfo(TAG, `unlock the screen`); + this.unlocking(); + } else { + Log.showInfo(TAG, `unlockScreen Router.push`); + Router.push({ uri: mRouterPath }); + } + }) + }) + } + + unlocking() { + Log.showInfo(TAG, `unlocking`); + //set the lockStatus to 'Unlock' + AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Unlock); + //unlock the screen + this.screenLockModel.hiddenScreenLockWindow(() => { + Log.showInfo(TAG, `hiddenScreenLockWindow finish`); + //notify the base service that the unlock is completed + this.notifyScreenResult(UnlockResult.Success); + this.publish("common.event.UNLOCK_SCREEN"); + }); + } + + notifyScreenResult(result: UnlockResult) { + Log.showInfo(TAG, `notifyScreenResult`); + this.screenLockModel.sendScreenLockEvent(UNLOCK_SCREEN_RESULT, result, (error, data) => { + Log.showInfo(TAG, `notifyScreenResult: error:${JSON.stringify(error)} data:${JSON.stringify(data)}`); + }); + } + + notifyDrawDone() { + Log.showInfo(TAG, `notifyDrawDone`); + //notify the base service that the screen is loaded + this.screenLockModel.sendScreenLockEvent(SCREENLOCK_DRAW_DONE, 0, (error, result) => { + Log.showInfo(TAG, `notifyDrawDone: error:${JSON.stringify(error)} result:${JSON.stringify(result)}`); + }); + } + + authUser(authSubType: AuthSubType, passwordData: number[] | string, callback): void { + Log.showInfo(TAG, `authUser authSubType:${authSubType}`); + let password: string = ''; + if (typeof passwordData == 'string') { + password = passwordData; + } else { + password = passwordData.join(''); + } + this.accountModel.registerPWDInputer(password).then(() => { + Log.showInfo(TAG, `registerPWDInputer success`); + this.accountModel.authUser(CHALLENGE_INT, AuthType.PIN, AuthTurstLevel.ATL4, (result, extraInfo) => { + Log.showInfo(TAG, `authUser callback:${result} extraInfo:${JSON.stringify(extraInfo)}`); + this.accountModel.unregisterInputer(); + callback(result, extraInfo); + }) + }).catch(() => { + Log.showInfo(TAG, `registerPWDInputer fails`); + }) + } + + authUserByFace() { + if (!mWillRecognizeFace) { + Log.showInfo(TAG, "Recognize face is not support") + return + } + Log.showInfo(TAG, `authUserByFace`); + this.accountModel.authUser(CHALLENGE_INT, AuthType.FACE, AuthTurstLevel.ATL1, (result, extraInfo) => { + Log.showInfo(TAG, `authUserByFace callback:${result} extraInfo:${JSON.stringify(extraInfo)}`); + if (result == 0) { + AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Unlock); + this.unlockScreen() + } else { + AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.FaceNotRecognized); + } + }) + } + + onUserSwitch(userId: number) { + this.accountModel.onUserSwitch(userId) + } + + goBack() { + Log.showInfo(TAG, `goBack`); + Router.back(); + this.accountModel.unregisterInputer(); + } + + destroy() { + this.screenLockModel.eventCancelListener(EVENT_END_SCREEN_ON); + this.screenLockModel.eventCancelListener(EVENT_BEGIN_SLEEP); + this.screenLockModel.eventCancelListener(EVENT_CHANGE_USER); + this.screenLockModel.eventCancelListener(EVENT_UNLOCK_SCREEN); + this.accountModel.eventCancelListener(ACTIVATING_TYPE, ACTIVATING_EVENT); + this.accountModel.eventCancelListener(ACTIVATE_TYPE, ACTIVATE_EVENT) + this.accountModel.modelFinish() + } + + setUnlockAnimation(beginAnimation: Callback>) { + mUnLockBeginAnimation = beginAnimation; + } + + getAuthProperty(authType, callback) { + Log.showInfo(TAG, `getAuthProperty param: authType ${authType}`); + this.accountModel.getAuthProperty(authType, (properties) => { + callback(properties); + }) + } + + private publish(eventName:string) { + commonEvent.publish(eventName, (error, value) => { + if (error != null) { + Log.showError(TAG, 'Operation failed. Cause: ' + JSON.stringify(error)); + } else { + Log.showInfo(TAG, 'publish common event success. ' + JSON.stringify(value)); + } + }); + } +} + +let screenLockService = createOrGet(ScreenLockService, TAG); + +export default screenLockService as ScreenLockService; \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts similarity index 56% rename from features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets rename to features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts index 6916ec70..93ec41cc 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets +++ b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,8 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import {ReadConfigFile} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import {ReadConfigFile} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon' const FILE_URI = '/data/accounts/account_0/applications/com.ohos.screenlock' @@ -22,31 +22,31 @@ const TAG = 'ScreenLock-ScreenlockStyle'; export enum LockStyleMode { - SlideScreenLock = 1, - JournalScreenLock = 2, - CustomScreenLock = 3 + SlideScreenLock = 1, + JournalScreenLock = 2, + CustomScreenLock = 3 } class ScreenlockStyle { - private screenMode: LockStyleMode = LockStyleMode.SlideScreenLock - - setMode(mode: LockStyleMode): number { - Log.showInfo(TAG, 'setMode:${mode}'); - return this.screenMode = mode - } - - getMode(): number { - Log.showInfo(TAG, 'getMode'); - return this.screenMode - } - - readMode(deviceType: string): number{ - Log.showInfo(TAG, `readMode deviceType:${deviceType}`); - let modeJson = ReadConfigFile(FILE_URI.replace('{0}', deviceType)) - Log.showInfo(TAG, `ReadConfigFile content:` + JSON.stringify(modeJson)); - this.screenMode = modeJson.mode - return this.screenMode - } + private screenMode: LockStyleMode = LockStyleMode.SlideScreenLock + + setMode(mode: LockStyleMode): number { + Log.showInfo(TAG, 'setMode:${mode}'); + return this.screenMode = mode + } + + getMode(): number { + Log.showInfo(TAG, 'getMode'); + return this.screenMode + } + + readMode(deviceType: string): number{ + Log.showInfo(TAG, `readMode deviceType:${deviceType}`); + let modeJson = ReadConfigFile(FILE_URI.replace('{0}', deviceType)) + Log.showInfo(TAG, `ReadConfigFile content:` + JSON.stringify(modeJson)); + this.screenMode = modeJson.mode + return this.screenMode + } } let screenlockStyle = new ScreenlockStyle() diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets index 60eae9f1..8f2a7aa0 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -import ViewModel from '../../vm/accountsViewModel.ets' -import Constants from '../../common/constants.ets' -import {UserData} from '../../data/userData.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import ViewModel from '../../vm/accountsViewModel' +import Constants from '../../common/constants' +import {UserData} from '../../data/userData' const TAG = 'ScreenLock-Accounts' @@ -27,26 +27,25 @@ export default struct Accounts { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - this.mViewModel.viewModelInit() } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) - this.mViewModel.viewModelFinish() } build() { Row() { - List() { - ForEach(this.accountList, (item: any) => { - ListItem() { - UserItem({ userItem: item, viewModel: this.mViewModel }) - } - }) + if (this.accountList.length > 1) { + List({ space: Constants.ACCOUNT_SPACE }) { + ForEach(this.accountList, (item: any) => { + ListItem() { + UserItem({ userItem: item, viewModel: this.mViewModel }) + } + }) + } + .listDirection(Axis.Horizontal) } - .listDirection(Axis.Horizontal) } - } } @@ -69,10 +68,10 @@ struct UserItem { Text(this.userItem.userName) .fontSize(Constants.SHORTCUT_TEXT_SIZE) .fontColor($r('app.color.shortcut_text_color')) - //.fontWeight(FontWeight.Bold) + .margin({ top: $r("app.float.accounts_block") }) } .onClick(event => { - this.viewModel.onUserSwitch(this.userItem.userId) + this.viewModel.onUserClick(this.userItem.userId) }) } } \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets index c72444e8..6bfaec81 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets @@ -13,24 +13,38 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -import ViewModel from '../../vm/batterySocViewModel.ets' -import Constants from '../../common/constants.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import Constants from '../../common/constants' const TAG = 'ScreenLock-BatterySoc' @Component export default struct BatterySoc { - @State mViewModel: ViewModel = new ViewModel() + @StorageLink('batterySoc') @Watch('onBatterySocChanged') batterySoc: number = 100 + @StorageLink('batteryCharging') @Watch('onBatterySocChanged') batteryCharging: boolean = false + @State batterySocText: string | Resource = '' aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - this.mViewModel.ViewModelInit() + this.onBatterySocChanged(''); } build() { - Text(this.mViewModel.batterySocStr) + Text(this.batterySocText) .fontSize($r('app.float.batterysoc_fontsize')) .fontColor($r('app.color.batterysoc_text_color')) } + + onBatterySocChanged(propName: string): void { + Log.showInfo(TAG, `onBatterySocChanged batterySoc:${this.batterySoc} batteryCharging:${this.batteryCharging}` ) + if (this.batteryCharging) { + if (this.batterySoc < 100) { + this.batterySocText = $r('app.string.charging', this.batterySoc + '%'); + } else { + this.batterySocText = $r('app.string.charge_full') + } + } else { + this.batterySocText = $r('app.string.battery_soc', this.batterySoc + '%'); + } + } } \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index 47c017c3..92d6d4a2 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,23 +13,28 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../../common/constants.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard.ets' -import ViewModel from '../../vm/customPSDViewModel.ets' +import ViewModel , {AuthType} from '../../vm/customPSDViewModel' const TAG = 'ScreenLock-CustomPSD' @Component export default struct CustomPSD { @State mViewModel: ViewModel = new ViewModel() + @StorageLink('passwordArr') passwordArr: any[] = this.mViewModel.passwordArr aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.checkFreezingTime(AuthType.PIN, (data) => { + Log.showInfo(TAG, `onClick callback is called`) + }); } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) + this.mViewModel.clearPassword() } build() { @@ -45,41 +50,39 @@ export default struct CustomPSD { .width($r('app.float.custompsd_prompt_width')) .height($r('app.float.custompsd_prompt_height')) - TextInput({ placeholder: '', text: this.mViewModel.password }) - .type(InputType.Password) - .maxLength(Constants.PASSWORD_MAX_LEN) - .fontSize($r('app.float.custompsd_prompt_fontsize')) - .width($r('app.float.custompsd_input_width')) - .height($r('app.float.custompsd_input_height')) - .backgroundColor(Color.White) - .enterKeyType(EnterKeyType.Done) - .border({ width: 2, color: Color.Gray, radius: 15 }) - .enabled(false) - .margin({ bottom: $r('app.float.custompsd_input_margin_bottom') }) - - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { - Text($r('app.string.emergency_call')) - .fontSize($r('app.float.custompsd_prompt_fontsize')) - .fontWeight(FontWeight.Bold) - .fontColor(Color.White) - .textAlign(TextAlign.Center) - .textOverflow({ overflow: TextOverflow.None }) - .onClick(this.mViewModel.onCallPhone.bind(this.mViewModel)) + Stack({ alignContent: Alignment.Center }) { + Text() + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + .backgroundColor(Color.Gray) + .borderRadius($r('app.float.custompsd_input_radius')) - Text($r('app.string.done')) - .fontSize($r('app.float.custompsd_prompt_fontsize')) - .fontWeight(FontWeight.Bold) - .fontColor(Color.White) - .textAlign(TextAlign.Center) - .textOverflow({ overflow: TextOverflow.None }) - .onClick(() => { - Log.showInfo(TAG, `onClick`) - this.mViewModel.onAuthPassword(() => { - Log.showInfo(TAG, `onClick callback promptText:${JSON.stringify(this.mViewModel.prompt)}`) - }); + List({ space: Constants.DIGITALPSD_IC_DIAMETER }) { + ForEach(this.passwordArr, (item) => { + ListItem() { + Image($r("app.media.ic_solid_dot")) + .width(Constants.DIGITALPSD_IC_DIAMETER) + .height(Constants.DIGITALPSD_IC_DIAMETER) + } }) + } + .listDirection(Axis.Horizontal) + .height(Constants.DIGITALPSD_IC_DIAMETER) } - .width(Constants.HALF_CONTAINER_WIDTH) + .width($r('app.float.custompsd_input_width')) + .height($r('app.float.custompsd_input_height')) + + Button($r('app.string.done'), { type: ButtonType.Capsule, stateEffect: true }) + .width($r('app.float.custompsd_input_width')) + .height($r('app.float.custompsd_input_height')) + .enabled(this.passwordArr.length > 1) + .onClick(() => { + Log.showInfo(TAG, `onClick`) + this.mViewModel.onAuthPassword(() => { + Log.showInfo(TAG, `onClick callback promptText:${JSON.stringify(this.mViewModel.prompt)}`) + }); + }) + .margin({ top: $r('sys.float.ohos_id_elements_margin_vertical_l') }) } .width(Constants.FULL_CONTAINER_WIDTH) .height($r('app.float.custompsd_input_area_height')) @@ -87,6 +90,7 @@ export default struct CustomPSD { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { NumkeyBoard({ + viewModel: this.mViewModel, onKeypress: (index, callback) => this.mViewModel.onKeyPress(index, callback) }) } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets index ba506167..1bf5b531 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../../common/constants.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard.ets' -import ViewModel from '../../vm/digitalPSDViewModel.ets' +import ViewModel, {AuthType} from '../../vm/digitalPSDViewModel' const TAG = 'ScreenLock-DigitalPSD' @@ -27,10 +27,14 @@ export default struct DigitalPSD { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.checkFreezingTime(AuthType.PIN, (data) => { + Log.showInfo(TAG, `onClick callback is called`) + }); } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) + this.mViewModel.clearPassword() } build() { @@ -49,13 +53,9 @@ export default struct DigitalPSD { Grid() { ForEach(this.passwdMaskArr, (item) => { GridItem() { - Column() - .backgroundColor(item) - .clip(new Circle({ width: Constants.DIGITALPSD_IC_DIAMETER, height: Constants.DIGITALPSD_IC_DIAMETER })) + Image(item) .width(Constants.DIGITALPSD_IC_DIAMETER) .height(Constants.DIGITALPSD_IC_DIAMETER) - .border({ width: 2, color: $r('app.color.circle_background'), radius: 45 }) - .alignItems(HorizontalAlign.Center) } }) } @@ -66,11 +66,12 @@ export default struct DigitalPSD { } .margin({ bottom: $r('app.float.digitalpsd_passwdmask_margin_bottom') }) .width(Constants.FULL_CONTAINER_WIDTH) - .height( $r('app.float.digitalpsd_input_area_height')) + .height($r('app.float.digitalpsd_input_area_height')) .flexShrink(1) Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { NumkeyBoard({ + viewModel: this.mViewModel, onKeypress: (index, callback) => this.mViewModel.onKeyPress(index, callback) }) } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets index da2c37a5..3153527d 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -import {ScreenLockStatus} from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' -import ViewModel from '../../vm/lockIconViewModel.ets' -import Constants from '../../common/constants.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import {ScreenLockStatus} from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon' +import ViewModel from '../../vm/lockIconViewModel' +import Constants from '../../common/constants' const TAG = 'ScreenLock-LockIcon' @@ -42,6 +42,12 @@ export default struct LockIcon { .fontColor($r('app.color.lock_prompt_color')) } .width(Constants.FULL_CONTAINER_WIDTH) + .gesture(GestureGroup(GestureMode.Exclusive, TapGesture({ count: 2 }) + .onAction((event: GestureEvent) => { + Log.showInfo(TAG, 'double click'); + this.mViewModel.onRecognizeFace(this.lockStatus); + }) + )) } onStatusChange(propName: string): void { diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets index 552b0cc4..82c77c53 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,9 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../../common/constants.ets' -import ViewModel from '../../vm/mixedPSDViewModel.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import Constants from '../../common/constants' +import ViewModel, {AuthType}from '../../vm/mixedPSDViewModel' const TAG = 'ScreenLock-MixedPSD' @@ -25,10 +25,14 @@ export default struct MixedPSD { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.checkFreezingTime(AuthType.PIN, (data) => { + Log.showInfo(TAG, `onClick callback is called`) + }); } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) + this.mViewModel.clearPassword() } build() { @@ -55,6 +59,11 @@ export default struct MixedPSD { .border({ width: 2, color: Color.Gray, radius: 15 }) .enabled(!this.mViewModel.inhibitInput) .onChange(this.mViewModel.onInputChange.bind(this.mViewModel)) + .onSubmit((entryKey) => { + this.mViewModel.onAuthPassword(() => { + Log.showInfo(TAG, `onSubmit callback prompt:${this.mViewModel.prompt} inhibitInput:${this.mViewModel.inhibitInput}`) + }) + }) .margin({ bottom: $r('app.float.mixedpsd_input_margin_bottom') }) Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets index 3372a6fe..0d87aa74 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets @@ -13,13 +13,15 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../../common/constants.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import Constants from '../../common/constants' +import BaseViewModel from '../../vm/baseViewModel' const TAG = 'ScreenLock-NumkeyBoard' @Component export default struct NumkeyBoard { + private viewModel: BaseViewModel private onKeypress: (params, callback) => void; @StorageLink('numKeyboard') numKeyboard: any[] = Constants.NUMKEY_BOARD; @@ -78,42 +80,24 @@ export default struct NumkeyBoard { .height($r('app.float.digitalpsd_row_height')) } - if (item.bkg) { - if (item.value == Constants.CALL_PHONE || - item.value == Constants.GO_BACK || - item.value == Constants.DEL_PWD) { - Column() - .backgroundColor(Color.Gray) - .opacity(0.5) - .clip(new Rect({ - width: Constants.DIGITALPSD_BUTTON_RECT_WH, - height: Constants.DIGITALPSD_BUTTON_RECT_HH - })) + if (item.value == Constants.CALL_PHONE || + item.value == Constants.GO_BACK || + item.value == Constants.DEL_PWD) { + Column() { + Button({ type: ButtonType.Normal, stateEffect: true }) + .backgroundColor("#00FFFFFF") .width(Constants.DIGITALPSD_BUTTON_RECT_WH) .height(Constants.DIGITALPSD_BUTTON_RECT_HH) - } else { - Column() - .backgroundColor(Color.Gray) - .opacity(0.5) - .clip(new Circle({ - width: Constants.DIGITALPSD_BUTTON_DIAMETER, - height: Constants.DIGITALPSD_BUTTON_DIAMETER - })) + } + } else { + Column() { + Button({ type: ButtonType.Circle, stateEffect: !this.viewModel.inhibitInput }) + .backgroundColor("#00FFFFFF") .width(Constants.DIGITALPSD_BUTTON_DIAMETER) .height(Constants.DIGITALPSD_BUTTON_DIAMETER) } } } - .onTouch((event: TouchEvent) => { - Log.showInfo(TAG, `onTouch`) - if (event.type == TouchType.Down) { - Log.showInfo(TAG, `TouchType.Down`) - item.bkg = true; - } else if (event.type == TouchType.Up) { - Log.showInfo(TAG, `TouchType.Up`) - item.bkg = false - } - }) .onClick(() => { Log.showInfo(TAG, `onClick:${item.index}`) setTimeout(this.onKeypress.bind(this), 0, item.index, (data) => { diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets index 551971d4..b310ab31 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,22 +13,32 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../../common/constants.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import ViewModel from '../../vm/StatusBarVM' +import Constants from '../../common/constants' import BatteryIcon from '../../../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' +import ClockIcon from '../../../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' +import WifiIcon from '../../../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' +import SignalIcon from '../../../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon' const TAG = 'ScreenLock-StatusBar' @Component export default struct statusBar { - @StorageLink('minHeight') minHeight: number = 0 - build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - BatteryIcon() - } - .width(Constants.FULL_CONTAINER_WIDTH) - .height(this.minHeight) + Row(){ + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + SignalIcon() + WifiIcon() + }.width(Constants.HALF_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + BatteryIcon() + ClockIcon() + }.width(Constants.HALF_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + }.width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) } aboutToAppear() { diff --git a/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts b/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts new file mode 100644 index 00000000..4b7bdc16 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import WindowManager, { WindowType } from '../../../../../../../../common/src/main/ets/default/WindowManager'; +import Constants, {StatusBarGroupComponentData} from '../common/Constants'; + +const TAG = 'StatusBarVM'; + +export class StatusBarVM { + mConfig: any; + mIsStart: boolean = false; + mStatusBarLayoutGroupTemplate: any[] = []; + mStatusBarLayout: any; + mStatusBarEmptyWidth: any; + mUseCount = 0; + mStatusBarEnable: boolean = true; + mDefaultStatusBarGroupComponentData: StatusBarGroupComponentData= { + ...new StatusBarGroupComponentData() + }; + mStatusBarGroupComponentDataMap = {}; + mWindowWidth = AppStorage.SetAndLink("maxWidth", 0); + + + setStatusBarEnable(isEnable: boolean) { + Log.showInfo(TAG, `setStatusBarEnable, isEnable ${isEnable}`); + if (this.mStatusBarEnable == isEnable) { + return; + } + this.mStatusBarEnable = isEnable; + this.mStatusBarEnable ? WindowManager.showWindow(WindowType.STATUS_BAR) : WindowManager.hideWindow(WindowType.STATUS_BAR); + } + + getStatusBarGroupComponentData(groupId: string): StatusBarGroupComponentData{ + Log.showInfo(TAG, `getStatusBarGroupComponentData, groupId: ${groupId}`); + return this.mStatusBarGroupComponentDataMap[groupId] ?? this.mDefaultStatusBarGroupComponentData; + } +} + +let statusBarVM = new StatusBarVM(); + +export default statusBarVM as StatusBarVM; \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts similarity index 68% rename from features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ets rename to features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts index eaea1129..6718d2aa 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ets +++ b/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts @@ -13,25 +13,14 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import Model from '../model/accountsModel.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import ScreenLockService from '../model/screenLockService' const TAG = "ScreenLock-AccountsViewModel" export default class accountsViewModel { - private mModel = new Model() - - viewModelInit() { - Log.showInfo(TAG, "viewModelInit") - this.mModel.modelInit() - } - - onUserSwitch(userId: number) { - this.mModel.onUserSwitch(userId) - } - - viewModelFinish() { - Log.showInfo(TAG, "viewModelFinish") - this.mModel.modelFinish() - } + onUserClick(userId: number) { + Log.showInfo(TAG, `onUserClick userId: ${userId}`) + ScreenLockService.onUserSwitch(userId) + } } \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ets deleted file mode 100644 index d5afff2c..00000000 --- a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ets +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../common/constants.ets' -import service, {UnlockResult, AuthSubType} from '../model/screenLockService.ets' - -const TAG = 'ScreenLock-BaseViewModel' -const MINUTE_NM = '分钟' -const SECOND_NM = "秒" -const TRY_AGAIN = "后重试" - -export {service, UnlockResult, AuthSubType} - -export default class BaseViewModel { - prompt: Resource | string; - inhibitInput: boolean = false; - countdownHandle: number = -1; - freezingMillisecond: number = 0; - - constructor() { - this.ViewModelInit() - } - - ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); - this.prompt = $r('app.string.input'); - } - - countdown(callback) { - Log.showInfo(TAG, `countdown`) - let promptText: Resource | string = ''; - this.freezingMillisecond -= Constants.INTERVAL; - Log.showInfo(TAG, `countdown freezingMillisecond:${this.freezingMillisecond}`) - if (this.freezingMillisecond > 0) { - promptText = this.getFreezingTimeNm(); - promptText += TRY_AGAIN; - } else { - Log.showInfo(TAG, `countdown clearInterval`) - clearInterval(this.countdownHandle) - this.countdownHandle = -1 - this.inhibitInput = false - promptText = $r('app.string.input'); - } - Log.showInfo(TAG, `countdown promptText:${promptText}`) - this.prompt = promptText; - this.updateStorage(callback) - } - - changePrompt(remainTimes, freezingTime, callback) { - Log.showInfo(TAG, `changePrompt remainTimes:${remainTimes} freezingTime:${freezingTime}`) - let promptText: Resource | string = $r('app.string.incorrect'); - this.freezingMillisecond = freezingTime - - if (0 < remainTimes && remainTimes <= 2) { - if (!!this.freezingMillisecond && this.freezingMillisecond != 0) { - promptText = $r('app.string.incorrect_promp_freezing', remainTimes, this.getFreezingTimeNm()); - } else { - promptText = $r('app.string.incorrect_promp_times', remainTimes); - } - } else if (0 == remainTimes) { - if (!!this.freezingMillisecond && this.freezingMillisecond != 0) { - this.inhibitInput = true - promptText = $r('app.string.input_promp', this.getFreezingTimeNm()); - this.countdownHandle = setInterval(this.countdown.bind(this), Constants.INTERVAL, callback); - } - } - this.prompt = promptText; - this.updateStorage(callback) - //notify the base service that the unlock is fail - service.notifyScreenResult(UnlockResult.Fail); - Log.showInfo(TAG, `changePrompt end`) - } - - getFreezingTimeNm(): string { - Log.showInfo(TAG, `getFreezingTimeNm start`) - let minute = Math.floor(this.freezingMillisecond / (60 * 1000)); - Log.showInfo(TAG, `getFreezingTimeNm minute:${minute}`) - let second = Math.round((this.freezingMillisecond % (60 * 1000)) / 1000); - Log.showInfo(TAG, `getFreezingTimeNm second:${second}`) - let timeName = ''; - if (minute != 0) { - timeName += minute + MINUTE_NM - } - if (second != 0) { - timeName += second + SECOND_NM - } - Log.showInfo(TAG, `getFreezingTimeNm end`) - return timeName; - } - - updateStorage(callback) { - Log.showInfo(TAG, `updateStorage`) - callback() - } -} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts new file mode 100644 index 00000000..30181955 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import Constants from '../common/constants' +import service, {UnlockResult, AuthType, AuthSubType} from '../model/screenLockService' + +const TAG = 'ScreenLock-BaseViewModel' +const MINUTE_NM = '分钟' +const SECOND_NM = "秒" +const TRY_AGAIN = "后重试" + +export {service, UnlockResult, AuthType, AuthSubType} + +export default class BaseViewModel { + prompt: Resource | string; + inhibitInput: boolean = false; + countdownHandle: number = -1; + freezingMillisecond: number = 0; + + constructor() { + this.ViewModelInit() + } + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + this.prompt = $r('app.string.input'); + } + + countdown(callback) { + Log.showInfo(TAG, `countdown`) + let promptText: Resource | string = ''; + this.freezingMillisecond -= Constants.INTERVAL; + Log.showInfo(TAG, `countdown freezingMillisecond:${this.freezingMillisecond}`) + if (this.freezingMillisecond > 0) { + promptText = this.getFreezingTimeNm(); + promptText += TRY_AGAIN; + } else { + Log.showInfo(TAG, `countdown clearInterval`) + clearInterval(this.countdownHandle) + this.countdownHandle = -1 + this.inhibitInput = false + promptText = $r('app.string.input'); + } + Log.showInfo(TAG, `countdown promptText:${promptText}`) + this.prompt = promptText; + this.updateStorage(callback) + } + + changePrompt(remainTimes, freezingTime, callback) { + Log.showInfo(TAG, `changePrompt remainTimes:${remainTimes} freezingTime:${freezingTime}`) + let promptText: Resource | string = $r('app.string.incorrect'); + this.freezingMillisecond = freezingTime + + if (0 < remainTimes && remainTimes <= 2) { + if (!!this.freezingMillisecond && this.freezingMillisecond != 0) { + promptText = $r('app.string.incorrect_promp_freezing', remainTimes, this.getFreezingTimeNm()); + } else { + promptText = $r('app.string.incorrect_promp_times', remainTimes); + } + } else if (0 == remainTimes) { + if (!!this.freezingMillisecond && this.freezingMillisecond != 0) { + this.inhibitInput = true + promptText = $r('app.string.input_promp', this.getFreezingTimeNm()); + this.countdownHandle = setInterval(this.countdown.bind(this), Constants.INTERVAL, callback); + } + } + this.prompt = promptText; + this.updateStorage(callback) + //notify the base service that the unlock is fail + service.notifyScreenResult(UnlockResult.Fail); + Log.showInfo(TAG, `changePrompt end`) + } + + getFreezingTimeNm(): string { + Log.showInfo(TAG, `getFreezingTimeNm start`) + let minute = Math.floor(this.freezingMillisecond / (60 * 1000)); + Log.showInfo(TAG, `getFreezingTimeNm minute:${minute}`) + let second = Math.round((this.freezingMillisecond % (60 * 1000)) / 1000); + Log.showInfo(TAG, `getFreezingTimeNm second:${second}`) + let timeName = ''; + if (minute != 0) { + timeName += minute + MINUTE_NM + } + if (second != 0) { + timeName += second + SECOND_NM + } + Log.showInfo(TAG, `getFreezingTimeNm end`) + return timeName; + } + + updateStorage(callback) { + Log.showInfo(TAG, `updateStorage`) + callback() + } + + checkFreezingTime(authType, callback?) { + let callBackFun = Function; + if (callback) callBackFun = callback; + service.getAuthProperty(authType, (properties) => { + if (properties.freezingTime > 0) { + this.inhibitInput = true + //Clear the entered password + this.changePrompt(properties.remainTimes, properties.freezingTime, callBackFun) + } + }) + } +} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets index f088f107..c844e00d 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets +++ b/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-BatterySocViewModel' diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ets deleted file mode 100644 index 13613d8c..00000000 --- a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ets +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../common/constants.ets' -import BaseViewModel, {service, UnlockResult, AuthSubType} from './baseViewModel.ets' - -const TAG = 'ScreenLock-CustomPSDViewModel' - -export default class CustomPSDViewModel extends BaseViewModel { - password: string= ''; - passwordArr: any[] = []; - numKeyboard: any[] = Constants.NUMKEY_BOARD; - - constructor() { - super(); - } - - ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); - super.ViewModelInit(); - } - - onKeyPress(index, callback) { - Log.showInfo(TAG, `onKeyPress start param: ${index}`) - let keyValue = this.numKeyboard[index].value; - if (keyValue >= 0 && !this.inhibitInput) { - if (this.passwordArr.length < Constants.PASSWORD_MAX_LEN) { - this.passwordArr.push(keyValue); - this.password = this.passwordArr.join(''); - this.numKeyboard[11].row1 = $r('app.string.delete'); - this.numKeyboard[11].value = Constants.DEL_PWD; - this.updateStorage(callback); - } - } else if (keyValue == Constants.DEL_PWD) { - this.passwordArr.pop() - this.password = this.passwordArr.join(''); - if (this.passwordArr.length == 0) { - this.numKeyboard[11].row1 = $r('app.string.back'); - this.numKeyboard[11].value = Constants.GO_BACK; - } - this.updateStorage(callback); - } else if (keyValue == Constants.GO_BACK) { - service.goBack(); - } else if (keyValue == Constants.CALL_PHONE) { - //TODO:call telephone - } - Log.showInfo(TAG, `onKeyPress end`) - } - - onCallPhone() { - Log.showInfo(TAG, 'onCallPhone'); - //TODO:call telephone - } - - onAuthPassword(callback) { - Log.showInfo(TAG, `onAuthPassword`); - if (this.passwordArr.length == 0 || this.inhibitInput) { - this.updateStorage(callback); - return; - } - service.authUser(AuthSubType.PIN_MIXED, this.passwordArr, (result, extraInfo) => { - this.clearPassword(); - if (result == 0) { - //unlock the screen - service.unlocking(); - } else { - //Clear the entered password - super.changePrompt(extraInfo.remainTimes, extraInfo.freezingTime, callback); - } - }); - } - - private clearPassword() { - Log.showInfo(TAG, `clearPassword`) - this.passwordArr = []; - this.password = this.passwordArr.join(''); - this.numKeyboard[11].row1 = $r('app.string.back'); - this.numKeyboard[11].value = Constants.GO_BACK; - } - - updateStorage(callback) { - Log.showInfo(TAG, `updateStorage child`) - //refresh the page - AppStorage.SetOrCreate('numKeyboard', this.numKeyboard); - super.updateStorage(callback) - } -} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts new file mode 100644 index 00000000..d2248d6f --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import Constants from '../common/constants' +import BaseViewModel, {service, UnlockResult,AuthType, AuthSubType} from './baseViewModel' + +const TAG = 'ScreenLock-CustomPSDViewModel' +export {AuthType} + +export default class CustomPSDViewModel extends BaseViewModel { + passwordArr: any[] = []; + numKeyboard: any[] = Constants.NUMKEY_BOARD; + + constructor() { + super(); + } + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + super.ViewModelInit(); + } + + onKeyPress(index, callback) { + Log.showInfo(TAG, `onKeyPress start param: ${index}`) + let keyValue = this.numKeyboard[index].value; + if (keyValue >= 0 && !this.inhibitInput) { + if (this.passwordArr.length < Constants.PASSWORD_MAX_LEN) { + this.passwordArr.push(keyValue); + this.numKeyboard[11].row1 = $r('app.string.delete'); + this.numKeyboard[11].value = Constants.DEL_PWD; + this.updateStorage(callback); + } + } else if (keyValue == Constants.DEL_PWD) { + this.passwordArr.pop() + if (this.passwordArr.length == 0) { + this.numKeyboard[11].row1 = $r('app.string.back'); + this.numKeyboard[11].value = Constants.GO_BACK; + } + this.updateStorage(callback); + } else if (keyValue == Constants.GO_BACK) { + service.goBack(); + } else if (keyValue == Constants.CALL_PHONE) { + } + Log.showInfo(TAG, `onKeyPress end`) + } + + onCallPhone() { + Log.showInfo(TAG, 'onCallPhone'); + } + + onAuthPassword(callback) { + Log.showInfo(TAG, `onAuthPassword`); + if (this.passwordArr.length == 0 || this.inhibitInput) { + this.updateStorage(callback); + return; + } + service.authUser(AuthSubType.PIN_MIXED, this.passwordArr, (result, extraInfo) => { + this.clearPassword(); + if (result == 0) { + //unlock the screen + service.unlocking(); + } else { + //Clear the entered password + super.changePrompt(extraInfo.remainTimes, extraInfo.freezingTime, callback); + } + }); + } + + clearPassword() { + Log.showInfo(TAG, `clearPassword`) + this.passwordArr = []; + this.numKeyboard[11].row1 = $r('app.string.back'); + this.numKeyboard[11].value = Constants.GO_BACK; + this.updateStorage(() => { + }) + } + + updateStorage(callback) { + Log.showInfo(TAG, `updateStorage child`) + //refresh the page + AppStorage.SetOrCreate('passwordArr', this.passwordArr); + AppStorage.SetOrCreate('numKeyboard', this.numKeyboard); + super.updateStorage(callback) + } +} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ts new file mode 100644 index 00000000..714a1266 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ts @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import DateTimeCommon from '../../../../../../../../common/src/main/ets/default/DateTimeCommon' +import Constants from '../common/constants' +import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon' +import ScreenLockModel from '../model/screenLockModel' + +const TAG = 'ScreenLock-DateTimeViewModel' + +/** + * DateTimeViewModel class + */ +export default class DateTimeViewModel { + timeVal: string = '' + dateVal: any = {} + weekVal: any = {} + setDateTimeHandle: number = -1 + isUsing24hFormat: boolean= false + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + + this.setDateTime.bind(this)() + this.setDateTimeHandle = setInterval(this.setDateTime.bind(this), Constants.INTERVAL); + Log.showInfo(TAG, 'ViewModelInit end'); + } + + setDateTime() { + Log.showInfo(TAG, `setDateTime`) + this.timeVal = DateTimeCommon.getSystemTime(this.isUsing24hFormat) + this.dateVal = DateTimeCommon.getSystemDate() + this.weekVal = DateTimeCommon.getSystemWeek() + } + + stopPolling() { + Log.showInfo(TAG, `stopPolling start`) + Log.showInfo(TAG, `stopPolling setDateTimeHandle:${this.setDateTimeHandle}`); + if (this.setDateTimeHandle > 0) { + clearInterval(this.setDateTimeHandle) + this.setDateTimeHandle = -1 + Log.showInfo(TAG, `stopPolling setDateTimeHandle new :${this.setDateTimeHandle}`); + } + Log.showInfo(TAG, `stopPolling end`) + } + + onStatusChange(lockStatus: ScreenLockStatus): void { + Log.showInfo(TAG, `onStatusChange lockStatus:${lockStatus}`); + Log.showInfo(TAG, `onStatusChange setDateTimeHandle:${this.setDateTimeHandle}`); + if (lockStatus == ScreenLockStatus.Locking) { + if (this.setDateTimeHandle <= 0) { + this.setDateTimeHandle = setInterval(this.setDateTime.bind(this), Constants.INTERVAL); + Log.showInfo(TAG, `onStatusChange setDateTimeHandle new:${this.setDateTimeHandle}`); + } + } else { + this.stopPolling(); + } + } +} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ets deleted file mode 100644 index 019a4dde..00000000 --- a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ets +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../common/constants.ets' -import BaseViewModel, {service, UnlockResult, AuthSubType} from './baseViewModel.ets' - -const TAG = 'ScreenLock-DigitalPSDViewModel' - -const PW_LEN = 6 - - -export default class DigitalPSDViewModel extends BaseViewModel { - password: number[]= [] - passwdMaskArr: any[]; - numKeyboard: any[] = Constants.NUMKEY_BOARD; - - constructor() { - super(); - } - - ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); - this.passwdMaskArr = new Array(PW_LEN).fill($r('app.color.circle_background_transparent')); - super.ViewModelInit(); - } - - onKeyPress(index, callback) { - Log.showInfo(TAG, `onKeyPress start param: ${index}`) - let keyValue = this.numKeyboard[index].value; - if (keyValue >= 0 && !this.inhibitInput) { - if (this.password.length < PW_LEN) { - this.password.push(keyValue); - this.passwdMaskArr[this.password.length-1] = $r('app.color.circle_background'); - this.numKeyboard[11].row1 = $r('app.string.delete'); - this.numKeyboard[11].value = Constants.DEL_PWD; - this.updateStorage(callback); - } - if (this.password.length >= PW_LEN) { - service.authUser(AuthSubType.PIN_SIX, this.password, (result, extraInfo) => { - this.clearPassword() - if (result == 0) { - //unlock the screen - service.unlocking(); - } else { - //Clear the entered password - super.changePrompt(extraInfo.remainTimes, extraInfo.freezingTime, callback) - } - }) - } - } else if (keyValue == Constants.DEL_PWD) { - this.passwdMaskArr[this.password.length-1] = $r('app.color.circle_background_transparent'); - this.password.pop() - if (this.password.length == 0) { - this.numKeyboard[11].row1 = $r('app.string.back'); - this.numKeyboard[11].value = Constants.GO_BACK; - } - this.updateStorage(callback); - } else if (keyValue == Constants.GO_BACK) { - service.goBack(); - } else if (keyValue == Constants.CALL_PHONE) { - //TODO:call telephone - } - - Log.showInfo(TAG, `onKeyPress end`) - } - - private clearPassword() { - Log.showInfo(TAG, `clearPassword`) - this.password = []; - this.passwdMaskArr = new Array(PW_LEN).fill($r('app.color.circle_background_transparent')); - AppStorage.SetOrCreate('passwdMaskArr', this.passwdMaskArr); - this.numKeyboard[11].row1 = $r('app.string.back'); - this.numKeyboard[11].value = Constants.GO_BACK; - } - - updateStorage(callback) { - Log.showInfo(TAG, `updateStorage child`) - //refresh the page - AppStorage.SetOrCreate('passwdMaskArr', this.passwdMaskArr); - AppStorage.SetOrCreate('numKeyboard', this.numKeyboard); - super.updateStorage(callback) - } -} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts new file mode 100644 index 00000000..4ad5e7ec --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import Constants from '../common/constants' +import BaseViewModel, {service, UnlockResult, AuthType, AuthSubType} from './baseViewModel' + +const TAG = 'ScreenLock-DigitalPSDViewModel' + +const PW_LEN = 6 + + +export {AuthType} + +export default class DigitalPSDViewModel extends BaseViewModel { + password: number[]= [] + passwdMaskArr: any[]; + numKeyboard: any[] = Constants.NUMKEY_BOARD; + + constructor() { + super(); + } + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + this.passwdMaskArr = new Array(PW_LEN).fill($r('app.media.ic_hollow_dot')); + super.ViewModelInit(); + } + + onKeyPress(index, callback) { + Log.showInfo(TAG, `onKeyPress start param: ${index}`) + let keyValue = this.numKeyboard[index].value; + if (keyValue >= 0 && !this.inhibitInput) { + if (this.password.length < PW_LEN) { + this.password.push(keyValue); + this.passwdMaskArr[this.password.length-1] = $r('app.media.ic_solid_dot'); + this.numKeyboard[11].row1 = $r('app.string.delete'); + this.numKeyboard[11].value = Constants.DEL_PWD; + this.updateStorage(callback); + } + if (this.password.length >= PW_LEN) { + service.authUser(AuthSubType.PIN_SIX, this.password, (result, extraInfo) => { + this.clearPassword() + if (result == 0) { + //unlock the screen + service.unlocking(); + } else { + //Clear the entered password + super.changePrompt(extraInfo.remainTimes, extraInfo.freezingTime, callback) + } + }) + } + } else if (keyValue == Constants.DEL_PWD) { + this.passwdMaskArr[this.password.length-1] = $r('app.media.ic_hollow_dot'); + this.password.pop() + if (this.password.length == 0) { + this.numKeyboard[11].row1 = $r('app.string.back'); + this.numKeyboard[11].value = Constants.GO_BACK; + } + this.updateStorage(callback); + } else if (keyValue == Constants.GO_BACK) { + service.goBack(); + } else if (keyValue == Constants.CALL_PHONE) { + } + + Log.showInfo(TAG, `onKeyPress end`) + } + + clearPassword() { + Log.showInfo(TAG, `clearPassword`) + this.password = []; + this.passwdMaskArr = new Array(PW_LEN).fill($r('app.media.ic_hollow_dot')); + AppStorage.SetOrCreate('passwdMaskArr', this.passwdMaskArr); + this.numKeyboard[11].row1 = $r('app.string.back'); + this.numKeyboard[11].value = Constants.GO_BACK; + this.updateStorage(() => { + }) + } + + updateStorage(callback) { + Log.showInfo(TAG, `updateStorage child`) + //refresh the page + AppStorage.SetOrCreate('passwdMaskArr', this.passwdMaskArr); + AppStorage.SetOrCreate('numKeyboard', this.numKeyboard); + super.updateStorage(callback) + } +} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts similarity index 34% rename from features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ets rename to features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts index ac2aa5cf..26a798fd 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ets +++ b/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,36 +13,52 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon' +import screenLockService from '../model/screenLockService' const TAG = 'ScreenLock-LockIconViewModel' export default class LockIconViewModel { - cutMessage: any= {} - iconPath: any= {} + cutMessage: any= {} + iconPath: any= {} - ViewModelInit(): void{ - Log.showInfo(TAG, `ViewModelInit`); - this.iconPath = $r('app.media.ic_public_lock_filled'); - this.cutMessage = $r('app.string.lock_prompt') - } - - onStatusChange(lockStatus: ScreenLockStatus): void { - Log.showInfo(TAG, `onStatusChange lockStatus:${lockStatus}`); - switch (lockStatus) { - case ScreenLockStatus.Locking: - this.iconPath = $r('app.media.ic_public_lock_filled'); - this.cutMessage = $r('app.string.lock_prompt') - break; - case ScreenLockStatus.Unlock: - this.iconPath = $r('app.media.ic_public_unlock_filled'); - this.cutMessage = $r('app.string.unlock_prompt') - break; - default: + ViewModelInit(): void{ + Log.showInfo(TAG, `ViewModelInit`); this.iconPath = $r('app.media.ic_public_lock_filled'); this.cutMessage = $r('app.string.lock_prompt') - break; } - } + + onStatusChange(lockStatus: ScreenLockStatus): void { + Log.showInfo(TAG, `onStatusChange lockStatus:${lockStatus}`); + switch (lockStatus) { + case ScreenLockStatus.Locking: + this.iconPath = $r('app.media.ic_public_lock_filled'); + this.cutMessage = $r('app.string.lock_prompt') + break; + case ScreenLockStatus.Unlock: + this.iconPath = $r('app.media.ic_public_unlock_filled'); + this.cutMessage = $r('app.string.unlock_prompt') + break; + case ScreenLockStatus.RecognizingFace: + this.iconPath = $r('app.media.ic_public_unlock_filled'); + this.cutMessage = $r('app.string.recognizing_face') + break; + case ScreenLockStatus.FaceNotRecognized: + this.iconPath = $r('app.media.ic_public_unlock_filled'); + this.cutMessage = $r('app.string.face_not_recognized') + break; + default: + this.iconPath = $r('app.media.ic_public_lock_filled'); + this.cutMessage = $r('app.string.lock_prompt') + break; + } + } + + onRecognizeFace(lockStatus: ScreenLockStatus) { + Log.showInfo(TAG, `onRecognizeFace lockStatus: ${lockStatus}`); + if (lockStatus == ScreenLockStatus.FaceNotRecognized) { + screenLockService.authUserByFace() + } + } } \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts similarity index 89% rename from features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ets rename to features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts index a1daefcc..33ac3c69 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ets +++ b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,10 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' -import BaseViewModel, {service, UnlockResult, AuthSubType} from './baseViewModel.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' +import BaseViewModel, {service, UnlockResult,AuthType, AuthSubType} from './baseViewModel' const TAG = 'ScreenLock-MixedPSDViewModel' +export {AuthType} export default class MixedPSDViewModel extends BaseViewModel { password: string= ''; @@ -37,7 +38,6 @@ export default class MixedPSDViewModel extends BaseViewModel { onCallPhone() { Log.showInfo(TAG, 'onCallPhone'); - //TODO:call telephone } onAuthPassword(callback) { @@ -58,7 +58,7 @@ export default class MixedPSDViewModel extends BaseViewModel { }); } - private clearPassword() { + clearPassword() { Log.showInfo(TAG, `clearPassword`) this.password = ''; } diff --git a/features/screenlock/src/main/resources/base/element/float.json b/features/screenlock/src/main/resources/base/element/float.json index af9d4ee0..56eab30e 100644 --- a/features/screenlock/src/main/resources/base/element/float.json +++ b/features/screenlock/src/main/resources/base/element/float.json @@ -44,6 +44,10 @@ "name": "accounts_name_fontsize", "value": "24" }, + { + "name": "accounts_block", + "value": "8" + }, { "name": "digitalpsd_prompt_fontsize", "value": "32" @@ -66,7 +70,7 @@ }, { "name": "digitalpsd_passwdmask_height", - "value": "24" + "value": "24vp" }, { "name": "digitalpsd_passwdmask_margin_bottom", @@ -128,7 +132,6 @@ "name": "mixedpsd_input_margin_bottom", "value": "128" }, - { "name": "custompsd_prompt_fontsize", "value": "32" @@ -153,6 +156,10 @@ "name": "custompsd_input_height", "value": "72" }, + { + "name": "custompsd_input_radius", + "value": "36" + }, { "name": "custompsd_input_margin_bottom", "value": "90" diff --git a/features/screenlock/src/main/resources/base/element/string.json b/features/screenlock/src/main/resources/base/element/string.json index cdf39bde..02b8ab7a 100644 --- a/features/screenlock/src/main/resources/base/element/string.json +++ b/features/screenlock/src/main/resources/base/element/string.json @@ -8,6 +8,18 @@ "name": "unlock_prompt", "value": "上滑解锁" }, + { + "name": "recognizing_face", + "value": "正在识别人脸" + }, + { + "name": "face_not_recognized", + "value": "未识别成功, 双击重试" + }, + { + "name": "yyyy_mm_dd", + "value": "%d/%d/%d" + }, { "name": "nonotification_text", "value": "无通知" @@ -51,6 +63,14 @@ { "name": "charge_full", "value": "已充满" + }, + { + "name": "charging", + "value": "正在充电%s" + }, + { + "name": "battery_soc", + "value": "目前电量%s" } ] } \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/media/ic_hollow_dot.svg b/features/screenlock/src/main/resources/base/media/ic_hollow_dot.svg new file mode 100644 index 00000000..95f82903 --- /dev/null +++ b/features/screenlock/src/main/resources/base/media/ic_hollow_dot.svg @@ -0,0 +1,13 @@ + + + Rectangle 9 Copy 3 + + + + + + + + + + \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/media/ic_solid_dot.svg b/features/screenlock/src/main/resources/base/media/ic_solid_dot.svg new file mode 100644 index 00000000..fdc18e75 --- /dev/null +++ b/features/screenlock/src/main/resources/base/media/ic_solid_dot.svg @@ -0,0 +1,13 @@ + + + Rectangle 9 Copy 5 + + + + + + + + + + \ No newline at end of file diff --git a/features/screenlock/src/main/resources/en_US/element/string.json b/features/screenlock/src/main/resources/en_US/element/string.json index 54af8d5f..15aa5158 100644 --- a/features/screenlock/src/main/resources/en_US/element/string.json +++ b/features/screenlock/src/main/resources/en_US/element/string.json @@ -8,6 +8,18 @@ "name": "unlock_prompt", "value": "Please slide to unlock" }, + { + "name": "recognizing_face", + "value": "Recognizing face..." + }, + { + "name": "face_not_recognized", + "value": "Face not recognized. Touch twice to try again" + }, + { + "name": "yyyy_mm_dd", + "value": "%d/%d/%d" + }, { "name": "nonotification_text", "value": "No Notification" @@ -51,6 +63,14 @@ { "name": "charge_full", "value": "Already full" + }, + { + "name": "charging", + "value": "Charging %s" + }, + { + "name": "battery_soc", + "value": "Battery Level %s" } ] } \ No newline at end of file diff --git a/features/screenlock/src/main/resources/zh_CN/element/string.json b/features/screenlock/src/main/resources/zh_CN/element/string.json index 907d2dd1..6a9f4564 100644 --- a/features/screenlock/src/main/resources/zh_CN/element/string.json +++ b/features/screenlock/src/main/resources/zh_CN/element/string.json @@ -8,7 +8,19 @@ "name": "unlock_prompt", "value": "上滑解锁" }, - { + { + "name": "recognizing_face", + "value": "正在识别人脸" + }, + { + "name": "face_not_recognized", + "value": "未识别成功, 双击重试" + }, + { + "name": "yyyy_mm_dd", + "value": "%d年%d月%d日" + }, + { "name": "nonotification_text", "value": "无通知" }, @@ -44,7 +56,6 @@ "name": "delete", "value": "删除" }, - { "name": "done", "value": "确定" @@ -52,6 +63,14 @@ { "name": "charge_full", "value": "已充满" + }, + { + "name": "charging", + "value": "正在充电%s" + }, + { + "name": "battery_soc", + "value": "目前电量%s" } ] } \ No newline at end of file diff --git a/features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts b/features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts index 75102961..553ba454 100644 --- a/features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts +++ b/features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts @@ -15,6 +15,7 @@ export default class Constants { //Shortcut params + static SHORTCUT_SPACE = 24 static SHORTCUT_CIRCLE_WIDTH = '80px' static SHORTCUT_CIRCLE_HEIGHT = '80px' static SHORTCUT_TEXT_SIZE = '24px' diff --git a/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets b/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets index 2bdf9967..933da1e2 100644 --- a/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets +++ b/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' import ViewModel from '../../vm/shortcutViewModel' import power from '@ohos.power' @@ -33,7 +33,7 @@ export default struct Shortcut { } build() { - Row({ space: '30px' }) { + Row({ space: Constants.SHORTCUT_SPACE }) { ShortcutComponent({ mTag: 'ScreenLock-Shutdown', mIcon: this.shutdownIcon, @@ -68,7 +68,7 @@ struct ShortcutComponent { } build() { - Column() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) { Stack() { Flex() .backgroundColor($r('app.color.shortcut_icon_color')) @@ -80,17 +80,11 @@ struct ShortcutComponent { .objectFit(ImageFit.Contain) } - Column() - .width(Constants.SHORTCUT_CIRCLE_WIDTH) - .height(Constants.SHORTCUT_BLOCK_HEIGHT) - Text(this.mLabel) .fontSize(Constants.SHORTCUT_TEXT_SIZE) .fontColor($r('app.color.shortcut_text_color')) - .width(Constants.SHORTCUT_TEXT_WIDTH) - .height(Constants.SHORTCUT_TEXT_HEIGHT) + .margin({ top: $r("app.float.shortcut_block") }) } - .width(Constants.SHORTCUT_CIRCLE_WIDTH) .onClick(this.onItemClick.bind(this)) } diff --git a/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts b/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts index acdcf3e3..943db61f 100644 --- a/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts +++ b/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../../common/src/main/ets/default/Log' import Constants from '../common/constants' import power from '@ohos.power' diff --git a/features/shortcutcomponent/src/main/resources/base/element/float.json b/features/shortcutcomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..ca1adcf6 --- /dev/null +++ b/features/shortcutcomponent/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "shortcut_block", + "value": "8" + } + ] +} \ No newline at end of file diff --git a/features/signalcomponent/.gitignore b/features/signalcomponent/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/features/signalcomponent/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/features/signalcomponent/build.gradle b/features/signalcomponent/build.gradle new file mode 100644 index 00000000..ae402d92 --- /dev/null +++ b/features/signalcomponent/build.gradle @@ -0,0 +1,19 @@ +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion rootProject.ext.version.compileSdk + defaultConfig { + compatibleSdkVersion rootProject.ext.version.compatibleSdk + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/config.json b/features/signalcomponent/src/main/config.json new file mode 100644 index 00000000..051c1f42 --- /dev/null +++ b/features/signalcomponent/src/main/config.json @@ -0,0 +1,23 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.ohos.systemui.signalcomponent", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "signalcomponent", + "moduleType": "har" + }, + "srcPath": "default" + } +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/app.ets b/features/signalcomponent/src/main/ets/default/app.ets new file mode 100644 index 00000000..4d568aa2 --- /dev/null +++ b/features/signalcomponent/src/main/ets/default/app.ets @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 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 default { + onCreate() { + console.info('SystemUI statusBar Application onDestroy') + }, + onDestroy() { + console.info('SystemUI statusBar Application onDestroy') + }, +} diff --git a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts new file mode 100644 index 00000000..e11f03ce --- /dev/null +++ b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import Constants from './Constants' + +const TAG = 'signal-StyleConfiguration'; + +export default class StyleConfiguration { + static getSignalComponentStyle() { + const key: string = TAG + "-SignalComponent"; + return StyleManager.getStyle(key, () => { + return { + cellularImageWidth: $r('app.float.signal_component_icon_width'), + cellularImageHeight: $r('app.float.signal_component_icon_height'), + statusBarSignalTypeFontSize: $r('app.float.status_bar_signal_type_font_size'), + statusBarSignalUnknownFontSize: $r('app.float.status_bar_signal_unknown_font_size'), + signalTextMaxWeight: $r('app.float.signal_text_max_width'), + netSignalTextMaxWidth: $r('app.float.status_bar_signal_net_signal_text_max_width'), + }; + }); + } +} \ No newline at end of file diff --git a/features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets b/features/signalcomponent/src/main/ets/default/common/constants.ts similarity index 51% rename from features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets rename to features/signalcomponent/src/main/ets/default/common/constants.ts index 8f1432f4..59b0e4d9 100644 --- a/features/notificationservice/src/main/ets/com/ohos/notificationservice/common/constants.ets +++ b/features/signalcomponent/src/main/ets/default/common/constants.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -12,29 +12,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + export default class Constants { - static GET_NEW_NOTIFICATION: number = 0; - static GET_EXIST_NOTIFICATION: number = 1; -} -export interface NotificationItemData{ - id:string; - hashcode:string; - contentType:string; - timestamp:string; - time:string; - name:string; - want:any; - actionButtons:any[]; - bundleName:string; - smallIcon?:Resource|string; - largeIcon?:Resource|string; - title?:string; - text?:string; - additionalText?:string; - briefText?:string; - expandedTitle?:string; - longText?:string; - lines?:any[]; - longTitle?:string; -} \ No newline at end of file + static NETWORK_TYPE_UNKNOWN = 0; + static NETWORK_TYPE_GSM = 1; + static NETWORK_TYPE_CDMA = 2; + static NETWORK_TYPE_W_CDMA = 3; + static NETWORK_TYPE_TDS_CDMA = 4; + static NETWORK_TYPE_LTE = 5; + static NETWORK_TYPE_NR = 6; + + static CELLULAR_SIGNAL_NO = 0; + static CELLULAR_SIGNAL_MIN = 1; + static CELLULAR_SIGNAL_LOW = 2; + static CELLULAR_SIGNAL_HALF = 3; + static CELLULAR_SIGNAL_HIGH = 4; + static CELLULAR_SIGNAL_FULL = 5; + static CELLULAR_NO_SIM_CARD = -1; + + static NET_NULL = 'NULL'; +} diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets new file mode 100644 index 00000000..cf0b9300 --- /dev/null +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2021-2022 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 Constants from '../common/constants'; +import mSignalModel from '../SignalModel'; +import Log from '../../../../../../../common/src/main/ets/default/Log' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' +import {StatusBarGroupComponentData +} from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' +import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vm/StatusBarVM' +const TAG = 'SignalComponent-SignalIcon' + +@Component +export default +struct SignalIcon { + @StorageLink('cellularLevel') cellularLevel : number = Constants.CELLULAR_NO_SIM_CARD + @StorageLink('cellularType') cellularType : number = Constants.NETWORK_TYPE_UNKNOWN + @StorageLink('networkState') networkState : string = Constants.NET_NULL + @StorageLink('signalObserved') signalObserved:boolean = false + private mGroupId: string = '' + @State mStatusBarGroupComponentData: StatusBarGroupComponentData = new StatusBarGroupComponentData() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @State style: any = StyleConfiguration.getSignalComponentStyle() + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear'); + this.mStatusBarGroupComponentData = StatusBarVM.getStatusBarGroupComponentData(this.mGroupId) + if (!this.signalObserved) { + mSignalModel.initSignalModel(); + this.signalObserved = true; + } + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear'); + } + + build() { + Row() { + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + Text(this.updateNetworkState(this.networkState)) + .fontSize(this.styleCommon.statusBarFontSize) + .fontColor(this.mStatusBarGroupComponentData.contentColor) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .constraintSize({ maxWidth: this.style.signalTextMaxWeight}) + .flexShrink(0) + .maxLines(1) + .textAlign(TextAlign.Center) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + + Stack({ alignContent: Alignment.TopStart }) { + Text(this.updateCellularType(this.cellularType)) + .fontSize(this.cellularType == Constants.NETWORK_TYPE_UNKNOWN ? this.style.statusBarSignalUnknownFontSize : this.style.statusBarSignalTypeFontSize) + .fontColor(this.mStatusBarGroupComponentData.contentColor) + .width(this.style.netSignalTextMaxWidth) + .fontWeight(FontWeight.Bold) + .textAlign(TextAlign.Center) + Image(this.updateCellularImage(this.cellularLevel)) + .objectFit(ImageFit.Contain) + .width(this.style.cellularImageWidth) + .height(this.style.cellularImageHeight) + .fillColor(this.mStatusBarGroupComponentData.contentColor) + }.flexShrink(1) + + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + } + .height('100%') + } + +/** + * Get the string of cellular type + * + * @param {number} type - number of cellular type + * @return {string} typeString type of cellular type + */ + private updateCellularType(signalType) : string { + Log.showInfo(TAG, `updateCellularType, signalType: ${ signalType }`); + let typeString; + switch (signalType) { + case Constants.NETWORK_TYPE_UNKNOWN: + typeString = $r('app.string.signal_null'); + break; + case Constants.NETWORK_TYPE_GSM: + case Constants.NETWORK_TYPE_CDMA: + typeString = $r('app.string.2G'); + break; + case Constants.NETWORK_TYPE_W_CDMA: + case Constants.NETWORK_TYPE_TDS_CDMA: + typeString = $r('app.string.3G'); + break; + case Constants.NETWORK_TYPE_LTE: + typeString = $r('app.string.4G'); + break; + case Constants.NETWORK_TYPE_NR: + default: + typeString = $r('app.string.5G'); + break; + } + return typeString; + } + +/** + * Get the cellular signal image + * + * @param {number} level - signal level from signalModel + * @return {string} cellularImage image of cellular signal + */ + private updateCellularImage(level) { + Log.showInfo(TAG, `updateCellularImage, level: ${level}`); + let cellularImage; + switch (level) { + case Constants.CELLULAR_SIGNAL_NO: + cellularImage = $r('app.media.ic_statusbar_signal_no'); + break; + case Constants.CELLULAR_SIGNAL_MIN: + cellularImage = $r('app.media.ic_statusbar_signal_1'); + break; + case Constants.CELLULAR_SIGNAL_LOW: + cellularImage = $r('app.media.ic_statusbar_signal_2'); + break; + case Constants.CELLULAR_SIGNAL_HALF: + cellularImage = $r('app.media.ic_statusbar_signal_3'); + break; + case Constants.CELLULAR_SIGNAL_HIGH: + cellularImage = $r('app.media.ic_statusbar_signal_4'); + break; + case Constants.CELLULAR_SIGNAL_FULL: + cellularImage = $r('app.media.ic_statusbar_signal_full'); + break; + case Constants.CELLULAR_NO_SIM_CARD: + default: + cellularImage = $r('app.media.ic_statusbar_signal_no'); + break; + } + console.info('systemui updateCellularImage = ' + cellularImage); + return cellularImage; + } + +/** + * Get the NetworkState signal name + * + * @param {string} netWorkState - network state from signal model + * @return {string} vendor's name or signal state + */ + private updateNetworkState(netWorkState) { + Log.showInfo(TAG, `updateNetworkState, netWorkState: ${netWorkState}`); + let networkStateName; + if(netWorkState == Constants.NET_NULL){ + networkStateName = $r('app.string.net_null'); + }else { + networkStateName = netWorkState; + } + return networkStateName; + } +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ts b/features/signalcomponent/src/main/ets/default/signalModel.ts new file mode 100644 index 00000000..a31c4d6a --- /dev/null +++ b/features/signalcomponent/src/main/ets/default/signalModel.ts @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2021-2022 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 Radio from '@ohos.telephony.radio'; +import Sim from '@ohos.telephony.sim' +import Observer from '@ohos.telephony.observer'; +import Log from "../../../../../../common/src/main/ets/default/Log"; +import CheckEmpty from '../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import Constants from './common/constants' + +const TAG = 'SignalStatus-SignalModel'; +const EMPTY_LEVEL = 0; + +let mSignalCallback; +let signalValue = { + cellularLevel: '', + cellularType: '', + networkState: '' +}; +let isInitObserver = false + +var mLevelLink; +var mTypeLink; +var mStateLink; + +export class SignalModel { + initSignalModel() { + Log.showInfo(TAG, 'initSignalModel'); + mLevelLink = AppStorage.SetAndLink("cellularLevel", Constants.CELLULAR_NO_SIM_CARD); + mTypeLink = AppStorage.SetAndLink("cellularType", Constants.NETWORK_TYPE_UNKNOWN); + mStateLink = AppStorage.SetAndLink("networkState", Constants.NET_NULL); + this.checkCellularStatus(); + } + + uninitSignalModel() { + Log.showInfo(TAG, 'uninitSignalModel'); + this.unInitObserver(); + } + + /** + * Check the connection type and signal level of cellular network + */ + checkCellularStatus() { + let cellularStatus; + let slotId = 0; + Log.showInfo(TAG, 'enter checkCellularStatus ============'); + + Sim.hasSimCard(slotId, (err, value) => { + if (value === true) { + //The interface of getting the cellular signal status is unavailable temporarily + Radio.getSignalInformation(slotId, (err, value) => { + if (err) { + // Failed to call the interface,error is not null + Log.showError(TAG, `failed to getSimState because ${err.message}`); + // When failed to call the interface, set the result as no signal + mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); + mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); + } else { + // Call interface succeed,error is null + Log.showInfo(TAG, `success to getSignalInformation: ${JSON.stringify(value)}`); + // Since the value might be empty, set it as no signal by hand + if (!value || !value.length) { + Log.showError(TAG, 'value from api is empty, set 0'); + mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); + mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); + } else { + Log.showInfo(TAG, 'get signal level by value.'); + mLevelLink.set(value[0].signalLevel); + mTypeLink.set(value[0].signalType); + } + } + + Log.showInfo(TAG, 'enter checknetworkState ============'); + //The interface of getting the cellular signal status is unavailable temporarily + Radio.getNetworkState((err, value) => { + if (err) { + // Failed to call the interface,error is not null + Log.showError(TAG, `failed to getnetworkState because ${err.message}`); + // When failed to call the interface, set the result as no signal + mStateLink.set(Constants.NET_NULL); + } else { + // Call interface succeed,error is null + Log.showInfo(TAG, `success to getnetworkState: ${JSON.stringify(value)}`); + // Since the value might be empty, set it as no signal by hand + if (!value) { + Log.showError(TAG, 'value from api is empty, set 0'); + mStateLink.set(Constants.NET_NULL); + } else { + mStateLink.set(value.longOperatorName); + } + } + }); + }); + if (!isInitObserver) { + this.initObserver(); + } + } else { + Log.showError(TAG, `hasSimCard failed to hasSimCard because`); + mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); + mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); + mStateLink.set(Constants.NET_NULL); + if (!isInitObserver) { + this.initObserver(); + } + } + }); + } + + /** + * init the observer of the cellular and signal + */ + initObserver() { + Log.showInfo(TAG, 'initObserver'); + isInitObserver = true; + Observer.on('signalInfoChange', (signalInfoChange) => { + Log.showInfo(TAG, `signalInfoChange ${JSON.stringify(signalInfoChange)}`); + this.checkCellularStatus(); + }); + Observer.on('networkStateChange', (networkState) => { + Log.showInfo(TAG, `networkStateChange ${JSON.stringify(networkState)}`); + this.checkCellularStatus(); + }); + Observer.on('simStateChange', (simStateInfo) => { + Log.showInfo(TAG, `simStateChange ${JSON.stringify(simStateInfo)}`); + this.checkCellularStatus(); + }); + } + + /** + * Uninit the observer of the cellular and signal + */ + unInitObserver() { + Log.showInfo(TAG, 'unInitObserver'); + Observer.off('signalInfoChange'); + Observer.off('networkStateChange'); + Observer.off('simStateChange'); + isInitObserver = false; + } +} + +let mSignalModel = new SignalModel(); + +export default mSignalModel as SignalModel; \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/base/element/color.json b/features/signalcomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..e94c75cd --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "font_color_white", + "value": "#fff" + } + ] +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/base/element/float.json b/features/signalcomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..cca6ffd2 --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/element/float.json @@ -0,0 +1,28 @@ +{ + "float":[ + { + "name":"status_bar_signal_type_font_size", + "value":"10fp" + }, + { + "name":"status_bar_signal_unknown_font_size", + "value":"14fp" + }, + { + "name":"signal_component_icon_width", + "value":"32vp" + }, + { + "name":"signal_component_icon_height", + "value":"24vp" + }, + { + "name":"signal_text_max_width", + "value":"113vp" + }, + { + "name":"status_bar_signal_net_signal_text_max_width", + "value":"18vp" + } + ] +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/base/element/string.json b/features/signalcomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..8d37879d --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/element/string.json @@ -0,0 +1,48 @@ +{ + "string": [ + { + "name": "signalcomponent", + "value": "signalcomponent" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "china_mobile", + "value": "中国移动" + }, + { + "name": "china_telecom", + "value": "中国电信" + }, + { + "name": "china_unicom", + "value": "中国联通" + }, + { + "name": "net_null", + "value": "没有 SIM 卡" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + }, + { + "name": "signal_null", + "value": "×" + } + ] +} diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg new file mode 100644 index 00000000..f0438a9a --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg new file mode 100644 index 00000000..173489d3 --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg new file mode 100644 index 00000000..c703e2d0 --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg new file mode 100644 index 00000000..cb66ccb4 --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg new file mode 100644 index 00000000..3c796ab5 --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg new file mode 100644 index 00000000..4d1a5bc4 --- /dev/null +++ b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png new file mode 100644 index 0000000000000000000000000000000000000000..c37dc10f00c0b991f31faf014841cf015c33684c GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T|AsMW1 zr|r*Tauhgb>uGgStNy^P_6?#FMVve)-}~+{vHSx2h4Kqd0!I#AJEhio!_(qmL#x@T zpSs)Gn>|we64(6@yY@40Z{hx*ckd+W9d~3>abQv@U~YV{|Bgo2svr9l-`#Z7H*j|p z$T?bNrpoo>*dCL*jT+p>+6wcFo{K;E8sK7>`tR-~6V@#ovL%b(l-Ikism>KMVSRJ) zySBw!uI-`=eU~h2IPySIu!9xIT*dHZkM-7jEti*GxH;KC$A6)~_3Se#ISTXE#@cJ} z*mPF+UzlH^?zAyY$yC>*_3)C^811vZGV^m+X)fr!(|5kS@_qXL)S{J|2P9=Urpr6c z_6%iw@l)QS^ndG}6%SSQj$V2f9NMt`=J$_+8#B{w?^*gX&dgezef&j$z`ROZ$3KTk m{2!cOZ#aR06Bo+hn8VPgo36`mR;~mLZ3a(QKbLh*2~7YkC#n4a literal 0 HcmV?d00001 diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png new file mode 100644 index 0000000000000000000000000000000000000000..11a8958a11189755d4328343ef68453f27411739 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T*yPaTIC&-l?5c*qkBay7^*~k>r&$Ly!18Z`L!$ld*I$=K*~7KJU*Af*d#L=Z)eW|&9^-1WKCL{L`wsFSMNNuj zo;@#oKi6*J``r=D+vFAZzdX&!wO{D@!naFz?&iD0QN=Umih7i5_KI$&tpRsscd#-Q z@Yya7c<9U0nzdN6`r2Cd5~;llLuAh^iB8~VdttH5|H-oZkB+~IoGy1Fo4K|lf7aKj z-Y-~KUrcMfYxp_V_`XkZxavrqt&mjfgarZk{)LRCI6 Y|5;yC(^}(m1{fI(p00i_>zopr0MHz`#sB~S literal 0 HcmV?d00001 diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a905dfc0f9c219e48db7edb5ca93b1041766f5 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g;!3HGxU+kX;q!^2X+?^QKos)S9a~60+7BevL9R^{>w;^3X z&tcIc38B^<9WJX2SbJUOI4-=R?dq7gXZz<9H|CyL=e05ZQ|h<+|7YgkRMpV3nV zx}zc3^^8>kYjoGA=EK<@@49B>=A@)`?U}M=*@1(W(3wAXhqV%sM z<);f5H`OeQzHv>={)WIo?mrH>N8z90L;+t&5DvDvqxncelwvtDnm{r-UW|#=MI2 literal 0 HcmV?d00001 diff --git a/features/signalcomponent/src/main/resources/base/media/icon.png b/features/signalcomponent/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { + return { + statusBarWifiWidth: $r('app.float.status_bar_wifi_width'), + statusBarWifiHeight: $r('app.float.status_bar_wifi_height') + }; + }); } - } \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/common/constants.ts b/features/wificomponent/src/main/ets/default/common/constants.ts new file mode 100644 index 00000000..4a3bc786 --- /dev/null +++ b/features/wificomponent/src/main/ets/default/common/constants.ts @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021-2022 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 default class constants { + static DEFAULT_WIFI_OPEN_STATUS: boolean = false; + static DEFAULT_WIFI_NAME: string = 'WLAN'; + static DEFAULT_WIFI_INFO: number = 0; + static DEFAULT_WIFI_STATUS: boolean = false; + static WIFI_SIGNAL_NO: number = 0; + static WIFI_SIGNAL_LOW: number = 1; + static WIFI_SIGNAL_MID: number = 2; + static WIFI_SIGNAL_HIGH: number = 3; + static WIFI_SIGNAL_FULL: number = 4; +} + +export enum WifiState { + STATE_OFF = 0, + STATE_ON = 1, + STATE_TURNING_ON = 2, + STATE_TURNING_OFF = 3 +} + +export enum WifiConnectionState { + DISCONNECTED = 0, + CONNECTED = 1 +} diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets new file mode 100644 index 00000000..6b6712eb --- /dev/null +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2021-2022 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 Constants from '../common/constants' +import mWifiModel from '../WifiModel' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' +import {StatusBarGroupComponentData +} from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' +import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vM/StatusBarVM' + +const TAG = 'WifiComponent-WifiIcon' + +@Component +export default struct WifiIcon { + @StorageLink('wifiInfo') wifiInfo: number = Constants.DEFAULT_WIFI_INFO + @StorageLink('wifiStatus') wifiStatus: boolean = Constants.DEFAULT_WIFI_STATUS + private mGroupId: string = '' + @State mStatusBarGroupComponentData: StatusBarGroupComponentData = new StatusBarGroupComponentData() + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @State style: any = StyleConfiguration.getStartsBarWifiComponentStyle() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + this.mStatusBarGroupComponentData = StatusBarVM.getStatusBarGroupComponentData(this.mGroupId) + mWifiModel.initWifiModel() + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Row() { + if (this.wifiStatus) { + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + Image(this.getImage(this.wifiInfo)) + .objectFit(ImageFit.Contain) + .width(this.style.statusBarWifiWidth) + .height(this.style.statusBarWifiHeight) + .fillColor(this.mStatusBarGroupComponentData.contentColor) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + } + } + .height('100%') + } + + private getImage(wifiInfo: number) { + Log.showInfo(TAG, `getImage, wifiInfo: ${JSON.stringify(wifiInfo)}`) + let wifiImage; + switch (wifiInfo) { + case Constants.WIFI_SIGNAL_NO: + wifiImage = $r('app.media.ic_statusbar_wifi_no'); + break; + case Constants.WIFI_SIGNAL_LOW: + wifiImage = $r('app.media.ic_statusbar_wifi_1'); + break; + case Constants.WIFI_SIGNAL_MID: + wifiImage = $r('app.media.ic_statusbar_wifi_2'); + break; + case Constants.WIFI_SIGNAL_HIGH: + wifiImage = $r('app.media.ic_statusbar_wifi_3'); + break; + case Constants.WIFI_SIGNAL_FULL: + wifiImage = $r('app.media.ic_statusbar_wifi_full'); + break; + default: + wifiImage = $r('app.media.ic_statusbar_wifi_no'); + break; + } + return wifiImage; + } +} diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ts b/features/wificomponent/src/main/ets/default/wifiModel.ts new file mode 100644 index 00000000..e25a9e6d --- /dev/null +++ b/features/wificomponent/src/main/ets/default/wifiModel.ts @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2021-2022 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 wifi from '@ohos.wifi'; +import Constants, {WifiState, WifiConnectionState} from './common/constants' +import Log from "../../../../../../common/src/main/ets/default/Log"; + +const TAG = 'WifiComponent-WifiModel'; + +var mWifiInfo; +var mWifiStatus; +var mWifiOpenStatus; +var mWifiName; + +export class WifiModel { + mIsStart: boolean = false; + mListener= null; + + initWifiModel() { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, `initWifiModel`) + this.mIsStart = true; + + mWifiInfo = AppStorage.SetAndLink("wifiInfo", Constants.DEFAULT_WIFI_INFO); + mWifiStatus = AppStorage.SetAndLink("wifiStatus", Constants.DEFAULT_WIFI_STATUS); + mWifiName = AppStorage.SetAndLink("wifiName", Constants.DEFAULT_WIFI_NAME) + mWifiOpenStatus = AppStorage.SetAndLink("wifiOpenStatus", Constants.DEFAULT_WIFI_OPEN_STATUS); + + this.getWifiInfo(); + + wifi.on('wifiStateChange', this.onWifiStateChange.bind(this)); + wifi.on('wifiConnectionChange', this.onWifiConnectionChange.bind(this)); + wifi.on('wifiRssiChange', this.onWifiRssiChange.bind(this)); + } + + uninitWifiModel() { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, `uninitWifiModel`) + this.mIsStart = false; + + this.mListener.off('wifiRssiChange', (data) => { + Log.showInfo(TAG, `uninitWifiModel->wifiRssiChange, data: ${JSON.stringify(data)}`) + }); + this.mListener.off('wifiConnectionChange', (data) => { + Log.showInfo(TAG, `uninitWifiModel->wifiConnectionChange, data: ${JSON.stringify(data)}`) + }); + this.mListener.off('wifiStateChange', (data) => { + Log.showInfo(TAG, `uninitWifiModel->wifiStateChange, data: ${JSON.stringify(data)}`) + }); + this.mListener = null; + mWifiOpenStatus.set(Constants.DEFAULT_WIFI_OPEN_STATUS); + this.setDisconnectedStatus(); + } + + onWifiStateChange(data) { + Log.showInfo(TAG, `onWifiStateChange, data: ${JSON.stringify(data)}`) + + let isWifiInactive = data == WifiState.STATE_OFF; + mWifiOpenStatus.set(!isWifiInactive); + if (!isWifiInactive) { + this.getWifiConnectInfo(); + } else { + this.setDisconnectedStatus(); + } + } + + onWifiConnectionChange(data) { + Log.showInfo(TAG, `onWifiConnectionChange, data: ${JSON.stringify(data)}`) + + if (data == WifiConnectionState.CONNECTED) { + this.getLinkedInfo(); + } else { + this.setDisconnectedStatus(); + } + } + + onWifiRssiChange(data) { + Log.showInfo(TAG, `onWifiRssiChange, data: ${JSON.stringify(data)}`) + this.getLinkedInfo(); + } + + getWifiInfo() { + Log.showInfo(TAG, `getWifiInfo`) + let isWifiActive = wifi.isWifiActive(); + Log.showInfo(TAG, `getWifiInfo, isWifiActive: ${isWifiActive}`) + mWifiOpenStatus.set(isWifiActive); + if (isWifiActive) { + this.getWifiConnectInfo(); + } else { + this.setDisconnectedStatus(); + } + } + + getWifiConnectInfo() { + Log.showInfo(TAG, `getWifiConnectInfo`) + let isConnected = wifi.isConnected(); + Log.showInfo(TAG, `getWifiConnectInfo, isConnected: ${isConnected}`) + if (isConnected) { + mWifiStatus.set(true); + this.getLinkedInfo(); + } else { + this.setDisconnectedStatus(); + } + } + + getLinkedInfo() { + Log.showInfo(TAG, `getLinkedInfo`) + wifi.getLinkedInfo((err, data) => { + if (wifi.isConnected()) { + mWifiStatus.set(true); + mWifiName.set(data.ssid); + let signalLevel = wifi.getSignalLevel(data.rssi, data.band); + Log.showInfo(TAG, `getLinkedInfo, signalLevel: ${signalLevel}`) + mWifiInfo.set(signalLevel); + } else { + this.setDisconnectedStatus(); + } + }); + } + + setDisconnectedStatus() { + Log.showInfo(TAG, `setDisconnectedStatus`) + mWifiStatus.set(Constants.DEFAULT_WIFI_STATUS); + mWifiInfo.set(Constants.DEFAULT_WIFI_INFO); + mWifiName.set(Constants.DEFAULT_WIFI_NAME); + } + + enableWifi() { + Log.showInfo(TAG, 'enableWifi'); + let result = wifi.enableWifi(); + Log.showInfo(TAG, `enableWifi, result: ${result}`); + } + + disableWifi() { + Log.showInfo(TAG, 'disableWifi'); + let result = wifi.disableWifi(); + Log.showInfo(TAG, `disableWifi, result: ${result}`); + } +} + +let mWifiModel = new WifiModel(); + +export default mWifiModel as WifiModel; \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/element/float.json b/features/wificomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..15f65e97 --- /dev/null +++ b/features/wificomponent/src/main/resources/base/element/float.json @@ -0,0 +1,11 @@ +{ + "float": [ + { + "name": "status_bar_wifi_width", + "value": "24vp" + },{ + "name": "status_bar_wifi_height", + "value": "24vp" + } + ] +} \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg new file mode 100644 index 00000000..3842e2ab --- /dev/null +++ b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg new file mode 100644 index 00000000..7829aa32 --- /dev/null +++ b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg new file mode 100644 index 00000000..ef60272d --- /dev/null +++ b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg new file mode 100644 index 00000000..42e8b4b9 --- /dev/null +++ b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg new file mode 100644 index 00000000..3122653c --- /dev/null +++ b/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/base/media/icon.png b/features/wificomponent/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { - this.createWindow(Constants.WIN_NAME, dis.width, dis.height) - }) + AbilityManager.setContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK, this.context) + sTimeManager.init(this.context) + this.statusBarWindow() + this.createWindow(Constants.WIN_NAME) } - private createWindow(name: string, width: number, height: number) { + private createWindow(name: string) { Log.showInfo(TAG, `createWindow name:${name}`) windowManager.create(this.context, name, 2110).then((win) => { Log.showInfo(TAG, "before begin " + name + " window show!") - win.resetSize(width, height).then(() => { - Log.showInfo(TAG, name + " window resetSize in then! ") - win.loadContent("pages/index").then(() => { - Log.showInfo(TAG, name + " window loadContent in then! ") - win.setFullScreen(true).then(() => { - Log.showInfo(TAG, name + " window setFullScreen in then! ") - win.show().then(() => { - Log.showInfo(TAG, "then begin " + name + " window show in then! "); - }) - }) + win.loadContent("pages/index").then(() => { + Log.showInfo(TAG, name + " window loadContent in then! ") + win.show().then(() => { + Log.showInfo(TAG, "then begin " + name + " window show in then! "); }) }) }, (error) => { @@ -51,8 +49,36 @@ class ServiceExtAbility extends ServiceExtension { Log.showInfo(TAG, name + " after window create") } + private async statusBarWindow() { + let dis = await display.getDefaultDisplay(); + Log.showInfo(TAG, `api8New onCreate, dis: ${JSON.stringify(dis)}`); + let rect; + if (dis.width > dis.height) { // Pad、PC horizontalScreen Mode + rect = { + left: 0, + top: 0, + width: '100%', + height: (44 * dis.width) / 1280, + } + } else { // Phone verticalScreen Mode + rect = { + left: 0, + top: 0, + width: '100%', + height: (44 * dis.width) / 800 + } + } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "rect", rect); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "dis", { + width: dis.width, + height: dis.height, + }); + Log.showInfo(TAG, `createWindow success.`); + } + onDestroy() { Log.showInfo(TAG, 'api8New onDestroy'); + sTimeManager.release() } } diff --git a/product/pc/src/main/ets/ServiceExtAbility/app.ets b/product/pc/src/main/ets/ServiceExtAbility/app.ets index f523e785..1eb4676f 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/app.ets +++ b/product/pc/src/main/ets/ServiceExtAbility/app.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../common/src/main/ets/default/Log.ets'; +import Log from '../../../../../../common/src/main/ets/default/Log'; const TAG = 'ScreenLock-App' diff --git a/product/pc/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts b/product/pc/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts new file mode 100644 index 00000000..d4ba7d61 --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'Lock_StatusBar-StyleConfiguration'; + +export default class StyleConfiguration { + static getIndexStyle() { + Log.showInfo(TAG, `setStyle`) + const key: string = TAG + "-Index"; + return StyleManager.getStyle(key, () => { + return {}; + }); + } +} \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/common/StyleManager.ts b/product/pc/src/main/ets/ServiceExtAbility/common/StyleManager.ts new file mode 100644 index 00000000..b42a9515 --- /dev/null +++ b/product/pc/src/main/ets/ServiceExtAbility/common/StyleManager.ts @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import CommonStyleConfiguration from '../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import BatteryStyleConfiguration from '../../../../../../../features/batterycomponent/src/main/ets/default/common/StyleConfiguration' +import WifiStyleConfiguration from '../../../../../../../features/wificomponent/src/main/ets/default/common/StyleConfiguration' +import SignalStyleConfiguration from '../../../../../../../features/signalcomponent/src/main/ets/default/common/StyleConfiguration' +import ClockStyleConfiguration from '../../../../../../../features/clockComponent/src/main/ets/default/common/StyleConfiguration'; +import IndexStyleConfiguration from './StyleConfiguration' + +const TAG = 'Lock-StatusBar-StyleManager'; + +export default class StyleManager { + static STANDARD_DISPLAY_WIDTH: number = 1280; + static STANDARD_DISPLAY_HEIGHT: number = 800; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + + static setStyle() { + Log.showInfo(TAG, `setStyle`) + let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'dis'); + Log.showInfo(TAG, `configMaxWidth${JSON.stringify(dis.width)}`) + StyleManager.maxWidth = dis.width; + + // Common + { + Log.showInfo(TAG, `setStyle_Common`) + let style: any = CommonStyleConfiguration.getCommonStyle(); + style.statusBarFontSize = StyleManager.calcScaleSizePx(14); + style.statusBarMarginLeftRight = StyleManager.calcScaleSizePx(10); + Log.showInfo(TAG, `setStyle ${JSON.stringify(style.statusBarFontSize)}`) + Log.showInfo(TAG, `setStyle ${JSON.stringify(style.statusBarMarginLeftRight)}`) + } + + // Clock + { + let style: any = ClockStyleConfiguration.getClockComponentStyle(); + style.statusBarClockMaxWidth = StyleManager.calcScaleSizePx(37); + Log.showInfo(TAG, `statusBarClockMaxWidth ${JSON.stringify(style.statusBarClockMaxWidth)}`) + + } + + // Battery-Icon + { + let style: any = BatteryStyleConfiguration.getBatteryComponentStyle(); + style.componentGap = StyleManager.calcScaleSizePx(6); + } + + // Battery-Pic + { + let style: any = BatteryStyleConfiguration.getBatteryPicStyle(); + style.picGap = StyleManager.calcScaleSizePx(1); + style.picBodyWidth = StyleManager.calcScaleSizePx(18.75); + style.picBodyHeight = StyleManager.calcScaleSizePx(10.83); + style.picBodyPadding = StyleManager.calcScaleSizePx(1); + style.picBodyBorderWidth = StyleManager.calcScaleSizePx(1); + style.picBorderRadius = StyleManager.calcScaleSizePx(2); + style.picHeadBorderRadius = StyleManager.calcScaleSizePx(1); + style.picChargingColor = '#00ff21'; + style.picLevelLowColor = '#ff0000'; + style.picHeadWidth = StyleManager.calcScaleSizePx(1.5); + style.picHeadHeight = StyleManager.calcScaleSizePx(5); + Log.showInfo(TAG, `picHeadHeight: ${JSON.stringify(style.picHeadHeight)}`) + + } + + // Signal-Icon + { + let style: any = SignalStyleConfiguration.getSignalComponentStyle(); + style.cellularImageWidth = StyleManager.calcScaleSizePx(25); + style.cellularImageHeight = StyleManager.calcScaleSizePx(20); + style.statusBarSignalTypeFontSize = StyleManager.calcScaleSizePx(7); + style.statusBarSignalUnknownFontSize = StyleManager.calcScaleSizePx(12); + style.signalTextMaxWeight = StyleManager.calcScaleSizePx(100); + style.netSignalTextMaxWidth = StyleManager.calcScaleSizePx(18); + } + + + // Wifi-Icon + { + let style: any = WifiStyleConfiguration.getStartsBarWifiComponentStyle(); + style.statusBarWifiWidth = StyleManager.calcScaleSizePx(20); + style.statusBarWifiHeight = StyleManager.calcScaleSizePx(20); + Log.showInfo(TAG, `statusBarWifiHeight ${JSON.stringify(style.statusBarWifiHeight)}`) + } + + } + + static number2px(n: number): string { + return n.toString() + 'px'; + } + + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/common/constants.ets b/product/pc/src/main/ets/ServiceExtAbility/common/constants.ts similarity index 80% rename from product/pc/src/main/ets/ServiceExtAbility/common/constants.ets rename to product/pc/src/main/ets/ServiceExtAbility/common/constants.ts index 28ddc9ee..d215d71a 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/common/constants.ets +++ b/product/pc/src/main/ets/ServiceExtAbility/common/constants.ts @@ -24,7 +24,14 @@ export default class Constants { static FULL_CONTAINER_WIDTH = '100%' static FULL_CONTAINER_HEIGHT = '100%' static NOTIFICATION_AREA_WIDTH = '96%' + static NOTIFICATION_LIST_AREA_WIDTH = '834' static NOTIFICATION_AREA_HEIGHT = '40%' static PASSWORD_AREA_WIDTH = '33.33%' + static NOTIFICATION_LIST_AREA_HEIGHT = '300' + + static STATUS_ABOUT_TO_APPEAR = 1 + static STATUS_ABOUT_TO_DISAPPEAR = 2 + static STATUS_ON_PAGE_SHOW = 3 + static STATUS_ON_PAGE_HIDE = 4 } \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/customPassword.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/customPassword.ets index 86a3f782..3f710526 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/customPassword.ets +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/customPassword.ets @@ -13,18 +13,28 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' import CustomPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets' -import Constants from '../common/constants.ets' +import Constants from '../common/constants' +import StyleManager from '../common/StyleManager' const TAG = 'ScreenLock-CustomPassword' @Entry @Component export default struct CustomPassword { + @State mHeightPx: number = 44 + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + this.mHeightPx = configInfo.height + StyleManager.setStyle() } aboutToDisappear() { @@ -33,13 +43,15 @@ export default struct CustomPassword { build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Column() { - StatusBar() - } - Column() { - CustomPSD() - } - .width(Constants.PASSWORD_AREA_WIDTH) + Column() { + StatusBar() + } + .height(this.mHeightPx + 'px') + + Column() { + CustomPSD() + } + .width(Constants.PASSWORD_AREA_WIDTH) } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets index 803f2692..0f958475 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets @@ -13,11 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-CustomScreenlock' -//TODO:Custom screenlock @Entry @Component export default struct CustomScreenlock { diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets index dc56c5ee..94eb455a 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets @@ -13,18 +13,28 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' import DigitalPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets' -import Constants from '../common/constants.ets' +import Constants from '../common/constants' +import StyleManager from '../common/StyleManager' const TAG = 'ScreenLock-DigitalPassword' @Entry @Component export default struct DigitalPassword { + @State mHeightPx: number = 44 + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + StyleManager.setStyle() } aboutToDisappear() { @@ -33,13 +43,14 @@ export default struct DigitalPassword { build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Column() { - StatusBar() - } - Column() { - DigitalPSD() - } - .width(Constants.PASSWORD_AREA_WIDTH) + Column() { + StatusBar() + }.height(this.mHeightPx + 'px' ) + + Column() { + DigitalPSD() + } + .width(Constants.PASSWORD_AREA_WIDTH) } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/index.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/index.ets index f5011a98..70a77120 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/index.ets +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/index.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,12 +13,17 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -import {LockStyleMode} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets' -import ViewModel from '../vm/indexViewModel.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import {LockStyleMode} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' +import ViewModel from '../vm/indexViewModel' import SlideScreenLock from './slidescreenlock.ets' import CustomScreenLock from './customscreenlock.ets' import JournalScreenLock from './journalscreenlock.ets' +import Constants from '../common/constants' +import StyleManager from '../common/StyleManager' +import Router from '@system.router'; const TAG = 'ScreenLock-Entry'; @@ -26,35 +31,56 @@ const TAG = 'ScreenLock-Entry'; @Component struct Index { @State mViewModel: ViewModel = new ViewModel() + @State pageStatus: number = Constants.STATUS_ABOUT_TO_APPEAR + @State mHeightPx: number = 0 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + this.mHeightPx = configInfo.height + StyleManager.setStyle() + this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR this.mViewModel.ViewModelInit() } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisAppear`) + this.pageStatus = Constants.STATUS_ABOUT_TO_DISAPPEAR + this.mViewModel.ViewModelDestroy() } onPageShow() { Log.showInfo(TAG, `onPageShow`) + this.pageStatus = Constants.STATUS_ON_PAGE_SHOW this.mViewModel.onPageShow(); } onPageHide() { Log.showInfo(TAG, `onPageHide`) + this.pageStatus = Constants.STATUS_ON_PAGE_HIDE + } + + onBackPress():boolean { + let length = Router.getLength() + Log.showInfo(TAG, `onBackPress length: ${length}`) + if (length > 1) { + Router.back() + return false + } + return true } build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { if (this.mViewModel.mode == LockStyleMode.SlideScreenLock) { // Slide of lock screen - SlideScreenLock() + SlideScreenLock({ pageStatus: this.pageStatus , mHeightPx:this.mHeightPx}) } else if (this.mViewModel.mode == LockStyleMode.JournalScreenLock) { - // TODO:Journal of lock screen JournalScreenLock() } else if (this.mViewModel.mode == LockStyleMode.CustomScreenLock) { - // TODO:Custom lock screen CustomScreenLock() } } diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets index b5fbd768..8622e40e 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets @@ -13,11 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-JournalScreenlock' -//TODO:Journal Screenlock @Entry @Component export default struct JournalScreenlock { diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets index 40328ddb..2f2f73f8 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets @@ -13,18 +13,28 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' import MixedPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/MixedPSD.ets' -import Constants from '../common/constants.ets' +import Constants from '../common/constants' +import StyleManager from '../common/StyleManager' const TAG = 'ScreenLock-MixedPassword' @Entry @Component export default struct MixedPassword { + @State mHeightPx: number = 44 + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + StyleManager.setStyle() } aboutToDisappear() { @@ -35,7 +45,8 @@ export default struct MixedPassword { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Column() { StatusBar() - } + }.height(this.mHeightPx + 'px' ) + Column() { MixedPSD() } diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets b/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets index 96e7fa00..94c89bc0 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets +++ b/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' import Accounts from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets' import DateTime from '../../../../../../../features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets' import BatterySoc from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets' @@ -22,8 +22,8 @@ import Wallpaper from '../../../../../../../features/wallpapercomponent/src/main import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets' import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' import Shortcut from '../../../../../../../features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets' -import Constants from '../common/constants.ets' -import ViewModel from '../vm/slideScreenLockViewModel.ets' +import Constants from '../common/constants' +import ViewModel from '../vm/slideScreenLockViewModel' const TAG = 'ScreenLock-SlideScreenlock' @@ -31,6 +31,10 @@ const TAG = 'ScreenLock-SlideScreenlock' @Component export default struct SlideScreenlock { @State mViewModel: ViewModel = new ViewModel() + @StorageLink('batteryCharging') @Watch('onCharging') batteryCharging: boolean = false + @Prop @Watch("onStatusChange") pageStatus: number + @StorageLink('deviceStatus') @Watch('onDeviceStatusChange') deviceStatus: string = "" + private mHeightPx : number = 44 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) @@ -44,11 +48,29 @@ export default struct SlideScreenlock { } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) + .scale({ + x: this.mViewModel.backgroundScale, + y: this.mViewModel.backgroundScale + }) + .animation({ + duration: this.mViewModel.duration, // animation duration + curve: Curve.Linear, // animation curve + delay: 0, // animation delay + iterations: 1, // times of play + playMode: PlayMode.Normal // animation mode + }) Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { Column() { StatusBar() } + .height(this.mHeightPx + 'px' ) + } + + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Column() { + } + .height($r('app.float.status_bar_height')) Column() { Row() { @@ -59,32 +81,71 @@ export default struct SlideScreenlock { .width(Constants.NOTIFICATION_AREA_WIDTH) .height($r('app.float.shortcut_area_height')) } + .margin({ top: $r('app.float.shortcut_area_margin_top') }) Column() { LockIcon() }.height($r('app.float.lockicon_area_height')) Column() { - DateTime({ isShowData: false }) + DateTime({ isShowDate: !this.mViewModel.toggleShow }) + if (this.mViewModel.toggleShow) { + Column() { + BatterySoc() + }.height($r('app.float.batterysoc_area_height')) + } }.height($r('app.float.datetime_area_height')) .margin({ top: $r('app.float.datetime_margin_top') }) Column() { - BatterySoc() - }.height($r('app.float.batterysoc_area_height')) - - Column() { - Stack({ alignContent: Alignment.TopStart }) { - NotificationListComponent() - } + NotificationListComponent() } - .width(Constants.NOTIFICATION_AREA_WIDTH) + .alignItems(HorizontalAlign.Center) + .width(Constants.NOTIFICATION_LIST_AREA_WIDTH) + .height(Constants.NOTIFICATION_LIST_AREA_HEIGHT) + .margin({ top: $r('app.float.notificationList_margin_top') }) } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) + .opacity(this.mViewModel.elementAlpha) + .scale({ + x: this.mViewModel.elementScale, + y: this.mViewModel.elementScale + }) + .animation({ + duration: this.mViewModel.duration, // animation duration + curve: Curve.Linear, // animation curve + delay: 0, // animation delay + iterations: 1, // times of play + playMode: PlayMode.Normal // animation mode + }) .onTouch((event) => { this.mViewModel.touchEvent(event) }) } } + + onCharging(propName: string): void { + Log.showInfo(TAG, `onCharging ${this.batteryCharging}`) + this.mViewModel.toggleDisplay(this.batteryCharging); + } + + onStatusChange(propName: string): void { + Log.showInfo(TAG, `onStatusChange ${this.pageStatus}`) + switch (this.pageStatus) { + case Constants.STATUS_ON_PAGE_SHOW: + this.mViewModel.onPageShow(); + break; + default: + } + } + + onDeviceStatusChange(propName: string): void{ + Log.showInfo(TAG, `onDeviceStatusChange ${this.deviceStatus}`) + if (this.deviceStatus == "endScreenOn") { + if (this.batteryCharging) { + this.mViewModel.toggleDisplay(this.batteryCharging); + } + } + } } \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets b/product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ts similarity index 50% rename from product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets rename to product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ts index 924e616d..c9d44dbd 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets +++ b/product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,35 +13,40 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import ScreenlockStyle, {LockStyleMode -} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets' -import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets' +} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' +import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' const TAG = 'ScreenLock-IndexViewModel' export default class IndexViewModel { - mode: LockStyleMode = LockStyleMode.SlideScreenLock - - ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); - this.serviceInit(); - this.mode = this.getMode(); - Log.showInfo(TAG, `ViewModelInit this.mode=${this.mode}`); - } - - serviceInit() { - Log.showInfo(TAG, `monitorEvents`) - ScreenLockService.init(); - } - - getMode(): number { - Log.showInfo(TAG, `getMode`) - return ScreenlockStyle.readMode("pc") - } - - onPageShow() { - Log.showInfo(TAG, `onPageShow`) - ScreenLockService.notifyDrawDone(); - } + mode: LockStyleMode = LockStyleMode.SlideScreenLock + + ViewModelInit(): void{ + Log.showInfo(TAG, 'ViewModelInit'); + this.serviceInit(); + this.mode = this.getMode(); + Log.showInfo(TAG, `ViewModelInit this.mode=${this.mode}`); + } + + serviceInit() { + Log.showInfo(TAG, `monitorEvents`) + ScreenLockService.init(); + } + + getMode(): number { + Log.showInfo(TAG, `getMode`) + return ScreenlockStyle.readMode("pc") + } + + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + ScreenLockService.notifyDrawDone(); + } + + ViewModelDestroy() { + Log.showInfo(TAG, 'ViewModelDestroy'); + ScreenLockService.destroy() + } } \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets b/product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts similarity index 30% rename from product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets rename to product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts index c2973aa4..93f1aa96 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets +++ b/product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts @@ -13,48 +13,79 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import {ReadConfigFile} from '../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' -import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets' -import Constants from '../common/constants.ets' -import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import {ReadConfigFile} from '../../../../../../../common/src/main/ets/default/ScreenLockCommon' +import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' +import Constants from '../common/constants' +import {Callback} from 'basic'; const TAG = 'ScreenLock-SlideScreenLockViewModel' //Height of notification area. const NOTIFICATION_MAXHEIGHT = 500 -const SLIDING_LENGTH = 200 +const SLIDING_LENGTH = 244 +const DELAY_TIME = 3 * 1000 export default class SlideScreenLockViewModel { - startX: number = 0 - startY: number = 0 - moveX: number = 0 - moveY: number = 0 - slidingLength: number = 0 - - ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); - let mWindowManager = new WindowManager(); - mWindowManager.initWindowManager(); - this.slidingLength = SLIDING_LENGTH - AppStorage.SetOrCreate('maxHeight', NOTIFICATION_MAXHEIGHT); - } - - unlockScreen(): void{ - ScreenLockService.unlockScreen() - } - - touchEvent(event: TouchEvent) { - Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) - if (event.type == Constants.TOUCHTYPE_DOWN) { - this.startX = event.touches[0].screenX - this.startY = event.touches[0].screenY - } else if (event.type == Constants.TOUCHTYPE_UP) { - this.moveX = event.touches[0].screenX - this.startX - this.moveY = event.touches[0].screenY - this.startY - Log.showInfo(TAG, `Touch Event slidingLength:${this.slidingLength}`) - if (Math.abs(this.moveY) > this.slidingLength) { - this.unlockScreen() - } + startX: number = 0 + startY: number = 0 + moveX: number = 0 + moveY: number = 0 + slidingLength: number = 0 + elementAlpha: number = 1 + elementScale: number = 1 + backgroundScale: number = 1.1 + duration: number= 250 + toggleShow: boolean = false + + ViewModelInit(): void{ + Log.showInfo(TAG, `ViewModelInit`); + ScreenLockService.setUnlockAnimation((callback: Callback) => { + this.elementAlpha = 0 + this.elementScale = 0.85 + this.backgroundScale = 1 + setTimeout(() => { + callback() + }, 250); + }) + this.slidingLength = SLIDING_LENGTH + } + + unlockScreen(): void{ + ScreenLockService.unlockScreen() + } + + touchEvent(event: TouchEvent) { + Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) + if (event.type == Constants.TOUCHTYPE_DOWN) { + this.startX = event.touches[0].screenX + this.startY = event.touches[0].screenY + } else if (event.type == Constants.TOUCHTYPE_MOVE) { + this.moveX = event.touches[0].screenX - this.startX + this.moveY = event.touches[0].screenY - this.startY + } else if (event.type == Constants.TOUCHTYPE_UP) { + Log.showInfo(TAG, `Touch Event slidingLength:${this.slidingLength}`) + if (Math.abs(this.moveY) > this.slidingLength) { + this.unlockScreen() + } + this.moveX = 0 + this.moveY = 0 + } + + event.stopPropagation(); + } + + toggleDisplay(batteryCharging?) { + Log.showInfo(TAG, `toggleDisplay charging:${batteryCharging}`); + this.toggleShow = true; + setTimeout(() => { + this.toggleShow = false; + Log.showInfo(TAG, `toggleDisplay setTimeout: ${this.toggleShow}`); + }, DELAY_TIME); + } + + onPageShow(): void { + this.elementAlpha = 1 + this.elementScale = 1 + this.backgroundScale = 1.1 } - } } \ No newline at end of file diff --git a/product/pc/src/main/resources/base/element/color.json b/product/pc/src/main/resources/base/element/color.json index 7498b868..07a53558 100644 --- a/product/pc/src/main/resources/base/element/color.json +++ b/product/pc/src/main/resources/base/element/color.json @@ -11,6 +11,10 @@ { "name": "page_background", "value": "#19181B" + }, + { + "name":"notificationitem_background", + "value":"#99D8F8E7" } ] } \ No newline at end of file diff --git a/product/pc/src/main/resources/base/element/float.json b/product/pc/src/main/resources/base/element/float.json index 1dc2f112..aaf9b3a7 100644 --- a/product/pc/src/main/resources/base/element/float.json +++ b/product/pc/src/main/resources/base/element/float.json @@ -7,7 +7,7 @@ }, { "name": "datetime_area_height", - "value": "192" + "value": "240" }, { "name": "datetime_margin_top", @@ -17,9 +17,45 @@ "name": "batterysoc_area_height", "value": "48" }, + { + "name": "shortcut_area_margin_top", + "value": "24" + }, { "name": "shortcut_area_height", "value": "120" + }, + { + "name": "notificationList_margin_top", + "value": "32" + }, + { + "name": "title_font_height", + "value": "28vp" + }, + { + "name": "title_font_margin_t", + "value": "13vp" + }, + { + "name": "setting_cont_fontsize", + "value": "32" + }, + { + "name": "close_notification_margin_top", + "value": "15vp" + }, + { + "name": "notification_appname_margin_top", + "value": "11vp" + }, + { + "name": "notification_cancle_margin_top", + "value": "11vp" + }, + { + "name": "status_bar_height", + "value": "48vp" } ] } \ No newline at end of file diff --git a/product/phone/src/main/config.json b/product/phone/src/main/config.json index 25b4443c..e427f5fb 100644 --- a/product/phone/src/main/config.json +++ b/product/phone/src/main/config.json @@ -2,16 +2,21 @@ "app": { "bundleName": "com.ohos.screenlock", "vendor": "ohos", + "singleton": true, "version": { - "code": 1, - "name": "1.0" + "code": 2, + "name": "1.1" } }, "deviceConfig": { + "default": { + "keepAlive": true + } }, "module": { "package": "com.ohos.screenlock", "name": ".MyApplication", + "mainAbility": ".ServiceExtAbility", "deviceType": [ "phone" ], @@ -39,6 +44,45 @@ }, { "name": "ohos.permission.NOTIFICATION_CONTROLLER" + }, + { + "name": "ohos.permission.GET_WALLPAPER" + }, + { + "name": "ohos.permission.READ_MEDIA" + }, + { + "name": "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED" + }, + { + "name": "ohos.permission.GET_WIFI_INFO" + }, + { + "name": "ohos.permission.SET_WIFI_INFO" + }, + { + "name": "ohos.permission.MANAGE_WIFI_CONNECTION" + }, + { + "name": "ohos.permission.GET_NETWORK_INFO" + }, + { + "name": "ohos.permission.USE_BLUETOOTH" + }, + { + "name": "ohos.permission.DISCOVER_BLUETOOTH" + }, + { + "name": "ohos.permission.MANAGE_BLUETOOTH" + }, + { + "name": "ohos.permission.CAPTURE_SCREEN" + }, + { + "name": "ohos.permission.MANAGE_SECURE_SETTINGS" + }, + { + "name": "ohos.permission.SET_WALLPAPER" } ], "abilities": [ @@ -63,7 +107,8 @@ "pages": [ "pages/index", "pages/digitalPassword", - "pages/mixedPassword" + "pages/mixedPassword", + "pages/customPassword" ], "name": "ServiceExtAbility", "window": { diff --git a/product/phone/src/main/ets/AbilityStage.ts b/product/phone/src/main/ets/AbilityStage.ts index 9b937cbe..f9b1f6e2 100644 --- a/product/phone/src/main/ets/AbilityStage.ts +++ b/product/phone/src/main/ets/AbilityStage.ts @@ -14,7 +14,7 @@ */ import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../common/src/main/ets/default/Log' const TAG = "ScreenLock-MainAbilityStage" diff --git a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index fa520217..87e77c3c 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -16,33 +16,30 @@ import ServiceExtension from '@ohos.application.ServiceExtensionAbility' import windowManager from '@ohos.window' import display from '@ohos.display' -import Log from '../../../../../../common/src/main/ets/default/Log.ets' -import Constants from '../../../../../../features/screenlock/src/main/ets/com/ohos/common/constants.ets' +import Log from '../../../../../../common/src/main/ets/default/Log' +import Constants from '../../../../../../features/screenlock/src/main/ets/com/ohos/common/constants' +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import sTimeManager from '../../../../../../common/src/main/ets/default/TimeManager' const TAG = "ScreenLock-ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { onCreate(want) { Log.showInfo(TAG, 'onCreate, want:' + want.abilityName); - display.getDefaultDisplay().then(dis => { - this.createWindow(Constants.WIN_NAME, dis.width, dis.height) - }) + AbilityManager.setContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK, this.context) + sTimeManager.init(this.context) + this.statusBarWindow() + this.createWindow(Constants.WIN_NAME) } - private createWindow(name: string, width: number, height: number) { + private createWindow(name: string) { Log.showInfo(TAG, `createWindow name:${name}`) windowManager.create(this.context, name, 2110).then((win) => { Log.showInfo(TAG, "before begin " + name + " window show!") - win.resetSize(width, height).then(() => { - Log.showInfo(TAG, name + " window resetSize in then! ") - win.loadContent("pages/index").then(() => { - Log.showInfo(TAG, name + " window loadContent in then! ") - win.setFullScreen(true).then(() => { - Log.showInfo(TAG, name + " window setFullScreen in then! ") - win.show().then(() => { - Log.showInfo(TAG, "then begin " + name + " window show in then! "); - }) - }) + win.loadContent("pages/index").then(() => { + Log.showInfo(TAG, name + " window loadContent in then! ") + win.show().then(() => { + Log.showInfo(TAG, "then begin " + name + " window show in then! "); }) }) }, (error) => { @@ -50,9 +47,38 @@ class ServiceExtAbility extends ServiceExtension { }) Log.showInfo(TAG, name + " after window create") } + private async statusBarWindow() { + let dis = await display.getDefaultDisplay(); + Log.showInfo(TAG, `api8New onCreate, dis: ${JSON.stringify(dis)}`); + let rect; + if (dis.width > dis.height) { // Pad、PC horizontalScreen Mode + rect = { + left: 0, + top: 0, + width: '100%', + height: (48 * dis.width) / 1280, + } + } else { // Phone verticalScreen Mode + rect = { + left: 0, + top: 0, + width: '100%', + height: (48 * dis.width) / 720 + } + } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "rect", rect); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "dis", { + width: dis.width, + height: dis.height, + }); + Log.showInfo(TAG, `createWindow success.`); + } + onDestroy() { Log.showInfo(TAG, 'api8New onDestroy'); + sTimeManager.release() + } } diff --git a/product/phone/src/main/ets/ServiceExtAbility/app.ets b/product/phone/src/main/ets/ServiceExtAbility/app.ets index f523e785..1eb4676f 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/app.ets +++ b/product/phone/src/main/ets/ServiceExtAbility/app.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../common/src/main/ets/default/Log.ets'; +import Log from '../../../../../../common/src/main/ets/default/Log'; const TAG = 'ScreenLock-App' diff --git a/product/phone/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts b/product/phone/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts new file mode 100644 index 00000000..d4ba7d61 --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'Lock_StatusBar-StyleConfiguration'; + +export default class StyleConfiguration { + static getIndexStyle() { + Log.showInfo(TAG, `setStyle`) + const key: string = TAG + "-Index"; + return StyleManager.getStyle(key, () => { + return {}; + }); + } +} \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/common/StyleManager.ts b/product/phone/src/main/ets/ServiceExtAbility/common/StyleManager.ts new file mode 100644 index 00000000..aa97f7ad --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/common/StyleManager.ts @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import IndexStyleConfiguration from './StyleConfiguration' + +const TAG = 'StatusBar-StyleManager'; + +export default class StyleManager { + static STANDARD_DISPLAY_WIDTH: number = 720; + static STANDARD_DISPLAY_HEIGHT: number = 1280; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + + static setStyle() { + Log.showInfo(TAG, `setStyle`) + + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'dis'); + StyleManager.maxWidth = config.maxWidth; + + // xxx + { + + } + + } + + static number2px(n: number): string { + return n.toString() + 'px'; + } + + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/common/constants.ets b/product/phone/src/main/ets/ServiceExtAbility/common/constants.ts similarity index 88% rename from product/phone/src/main/ets/ServiceExtAbility/common/constants.ets rename to product/phone/src/main/ets/ServiceExtAbility/common/constants.ts index cc61ce9f..cf527346 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/common/constants.ets +++ b/product/phone/src/main/ets/ServiceExtAbility/common/constants.ts @@ -30,5 +30,8 @@ export default class Constants { static PASSWORD_AREA_WIDTH = '95%' - + static STATUS_ABOUT_TO_APPEAR = 1 + static STATUS_ABOUT_TO_DISAPPEAR = 2 + static STATUS_ON_PAGE_SHOW = 3 + static STATUS_ON_PAGE_HIDE = 4 } \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/customPassword.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/customPassword.ets new file mode 100644 index 00000000..7ad20cca --- /dev/null +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/customPassword.ets @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2022 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 Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' +import CustomPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets' +import Constants from '../common/constants' +import StyleManager from '../common/StyleManager' + +const TAG = 'ScreenLock-CustomPassword' + +@Entry +@Component +export default struct CustomPassword { + @State mHeightPx: number = 48 + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + this.mHeightPx = configInfo.height + StyleManager.setStyle() + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Column() { + StatusBar() + }.height(this.mHeightPx + 'px' ) + + Column() { + CustomPSD() + } + .width(Constants.PASSWORD_AREA_WIDTH) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + .backgroundColor($r('app.color.page_background')) + } +} \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets index 803f2692..0f958475 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets @@ -13,11 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-CustomScreenlock' -//TODO:Custom screenlock @Entry @Component export default struct CustomScreenlock { diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets index 646878a8..42c14748 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets @@ -13,18 +13,29 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' import DigitalPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets' -import Constants from '../common/constants.ets' +import Constants from '../common/constants' +import StyleManager from '../common/StyleManager' const TAG = 'ScreenLock-DigitalPassword' @Entry @Component export default struct DigitalPassword { + @State mHeightPx: number = 48 + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + this.mHeightPx = configInfo.height + StyleManager.setStyle() } aboutToDisappear() { @@ -35,7 +46,7 @@ export default struct DigitalPassword { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Column() { StatusBar() - } + }.height(this.mHeightPx + 'px' ) Column() { DigitalPSD() } diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/index.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/index.ets index f5011a98..844ec652 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/index.ets +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/index.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,12 +13,17 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' -import {LockStyleMode} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets' -import ViewModel from '../vm/indexViewModel.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import {LockStyleMode} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' +import ViewModel from '../vm/indexViewModel' import SlideScreenLock from './slidescreenlock.ets' import CustomScreenLock from './customscreenlock.ets' import JournalScreenLock from './journalscreenlock.ets' +import Constants from '../common/constants' +import StyleManager from '../common/StyleManager' +import Router from '@system.router'; const TAG = 'ScreenLock-Entry'; @@ -26,35 +31,55 @@ const TAG = 'ScreenLock-Entry'; @Component struct Index { @State mViewModel: ViewModel = new ViewModel() - + @State pageStatus: number = Constants.STATUS_ABOUT_TO_APPEAR + @State mHeightPx: number = 48 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) + this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR this.mViewModel.ViewModelInit() + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + this.mHeightPx = configInfo.height + StyleManager.setStyle() } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisAppear`) + this.pageStatus = Constants.STATUS_ABOUT_TO_DISAPPEAR + this.mViewModel.ViewModelDestroy() } onPageShow() { Log.showInfo(TAG, `onPageShow`) + this.pageStatus = Constants.STATUS_ON_PAGE_SHOW this.mViewModel.onPageShow(); } onPageHide() { Log.showInfo(TAG, `onPageHide`) + this.pageStatus = Constants.STATUS_ON_PAGE_HIDE + } + + onBackPress():boolean { + let length = Router.getLength() + Log.showInfo(TAG, `onBackPress length: ${length}`) + if (length > 1) { + Router.back() + return false + } + return true } build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { if (this.mViewModel.mode == LockStyleMode.SlideScreenLock) { // Slide of lock screen - SlideScreenLock() + SlideScreenLock({ pageStatus: this.pageStatus, mHeightPx: this.mHeightPx }) } else if (this.mViewModel.mode == LockStyleMode.JournalScreenLock) { - // TODO:Journal of lock screen JournalScreenLock() } else if (this.mViewModel.mode == LockStyleMode.CustomScreenLock) { - // TODO:Custom lock screen CustomScreenLock() } } diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets index b5fbd768..8622e40e 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets @@ -13,11 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-JournalScreenlock' -//TODO:Journal Screenlock @Entry @Component export default struct JournalScreenlock { diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets index 40328ddb..85b8d975 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets @@ -13,18 +13,29 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' import MixedPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/MixedPSD.ets' -import Constants from '../common/constants.ets' +import Constants from '../common/constants' +import StyleManager from '../common/StyleManager' const TAG = 'ScreenLock-MixedPassword' @Entry @Component export default struct MixedPassword { + @State mHeightPx: number = 48 + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + this.mHeightPx = configInfo.height + StyleManager.setStyle() } aboutToDisappear() { @@ -36,6 +47,8 @@ export default struct MixedPassword { Column() { StatusBar() } + .height(this.mHeightPx + 'px' ) + Column() { MixedPSD() } diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets b/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets index b56e03b5..b69d2a02 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,15 +13,15 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log' import Accounts from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets' import DateTime from '../../../../../../../features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets' import LockIcon from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets' import Wallpaper from '../../../../../../../features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets' import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets' import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' -import Constants from '../common/constants.ets' -import ViewModel from '../vm/slideScreenLockViewModel.ets' +import Constants from '../common/constants' +import ViewModel from '../vm/slideScreenLockViewModel' const TAG = 'ScreenLock-SlideScreenlock' @@ -29,7 +29,10 @@ const TAG = 'ScreenLock-SlideScreenlock' @Component export default struct SlideScreenlock { @State mViewModel: ViewModel = new ViewModel() - + @StorageLink('batteryCharging') @Watch('onCharging') batteryCharging: boolean = false + @Prop @Watch("onStatusChange") pageStatus: number + @StorageLink('deviceStatus') @Watch('onDeviceStatusChange') deviceStatus: string = "" + private mHeightPx : number = 48 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() @@ -42,33 +45,89 @@ export default struct SlideScreenlock { } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) + .scale({ + x: this.mViewModel.backgroundScale, + y: this.mViewModel.backgroundScale + }) + .animation({ + duration: this.mViewModel.duration, // animation duration + curve: Curve.Linear, // animation curve + delay: 0, // animation delay + iterations: 1, // times of play + playMode: PlayMode.Normal // animation mode + }) Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { Column() { StatusBar() } + .height(this.mHeightPx + 'px' ) + .onAreaChange((e, e2) => { + Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + }) + } + + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Column() { + } + .height($r('app.float.status_bar_height')) Column() { LockIcon() }.height(Constants.LOCKICON_AREA_WIDTH) Column() { - DateTime() + DateTime({ isShowDate: true }) }.height(Constants.DATETIME_AREA_WIDTH) Column() { - Stack({ alignContent: Alignment.TopStart }) { - NotificationListComponent() - } + NotificationListComponent() } + .alignItems(HorizontalAlign.Center) .width(Constants.NOTIFICATION_AREA_WIDTH) // .height(Constants.NOTIFICATION_AREA_HEIGHT) } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) + .opacity(this.mViewModel.elementAlpha) + .scale({ + x: this.mViewModel.elementScale, + y: this.mViewModel.elementScale + }) + .animation({ + duration: this.mViewModel.duration, // animation duration + curve: Curve.Linear, // animation curve + delay: 0, // animation delay + iterations: 1, // times of play + playMode: PlayMode.Normal // animation mode + }) .onTouch((event) => { this.mViewModel.touchEvent(event) }) } } + + onCharging(propName: string): void { + Log.showInfo(TAG, `onCharging ${this.batteryCharging}`) + this.mViewModel.toggleDisplay(this.batteryCharging); + } + + onStatusChange(propName: string): void { + Log.showInfo(TAG, `onStatusChange ${this.pageStatus}`) + switch (this.pageStatus) { + case Constants.STATUS_ON_PAGE_SHOW: + this.mViewModel.onPageShow(); + break; + default: + } + } + + onDeviceStatusChange(propName: string): void{ + Log.showInfo(TAG, `onDeviceStatusChange ${this.deviceStatus}`) + if (this.deviceStatus == "endScreenOn") { + if (this.batteryCharging) { + this.mViewModel.toggleDisplay(); + } + } + } } \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets b/product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ts similarity index 78% rename from product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets rename to product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ts index e59e97ed..8fc9c3e4 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ets +++ b/product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,10 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import ScreenlockStyle, {LockStyleMode -} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ets' -import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import ScreenlockStyle, {LockStyleMode} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' +import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' const TAG = 'ScreenLock-IndexViewModel' @@ -44,4 +43,9 @@ export default class IndexViewModel { Log.showInfo(TAG, `onPageShow`) ScreenLockService.notifyDrawDone(); } + + ViewModelDestroy() { + Log.showInfo(TAG, 'ViewModelDestroy'); + ScreenLockService.destroy() + } } \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets b/product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts similarity index 30% rename from product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets rename to product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts index c84e738c..a4cfed30 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ets +++ b/product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts @@ -13,51 +13,77 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log.ets'; -import {ReadConfigFile} from '../../../../../../../common/src/main/ets/default/ScreenLockCommon.ets' -import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService.ets' -import Constants from '../common/constants.ets' -import WindowManager from '../../../../../../../common/src/main/ets/default/WindowManager.ets' +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import {ReadConfigFile} from '../../../../../../../common/src/main/ets/default/ScreenLockCommon' +import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' +import Constants from '../common/constants' +import {Callback} from 'basic'; const TAG = 'ScreenLock-SlideScreenLockViewModel' //Height of notification area. const NOTIFICATION_MAXHEIGHT = 500 -const SLIDING_LENGTH = 200 - +const SLIDING_LENGTH = 150 +const DELAY_TIME = 3 * 1000 export default class SlideScreenLockViewModel { - startX: number = 0 - startY: number = 0 - moveX: number = 0 - moveY: number = 0 - slidingLength: number = 0 - - ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); - let mWindowManager = new WindowManager(); - mWindowManager.initWindowManager(); - this.slidingLength = SLIDING_LENGTH - Log.showInfo(TAG, `ViewModelInit slidingLength:${this.slidingLength}`); - AppStorage.SetOrCreate('maxHeight', NOTIFICATION_MAXHEIGHT); - } - - unlockScreen(): void{ - ScreenLockService.unlockScreen() - } - - touchEvent(event: TouchEvent) { - Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) - if (event.type == Constants.TOUCHTYPE_DOWN) { - this.startX = event.touches[0].screenX - this.startY = event.touches[0].screenY - } else if (event.type == Constants.TOUCHTYPE_UP) { - this.moveX = event.touches[0].screenX - this.startX - this.moveY = event.touches[0].screenY - this.startY - Log.showInfo(TAG, `Touch Event slidingLength:${this.slidingLength}`) - if (Math.abs(this.moveY) > this.slidingLength) { - this.unlockScreen() - } + startX: number = 0 + startY: number = 0 + moveX: number = 0 + moveY: number = 0 + slidingLength: number = 0 + elementAlpha: number = 1 + elementScale: number = 1 + backgroundScale: number = 1.1 + duration: number= 250 + toggleShow: boolean = false + + ViewModelInit(): void{ + Log.showInfo(TAG, `ViewModelInit`); + ScreenLockService.setUnlockAnimation((callback: Callback) => { + this.elementAlpha = 0 + this.elementScale = 0.85 + this.backgroundScale = 1 + setTimeout(() => { + callback() + }, 250); + }) + this.slidingLength = SLIDING_LENGTH + } + + unlockScreen(): void{ + ScreenLockService.unlockScreen() + } + + touchEvent(event: TouchEvent) { + Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) + if (event.type == Constants.TOUCHTYPE_DOWN) { + this.startX = event.touches[0].screenX + this.startY = event.touches[0].screenY + } else if (event.type == Constants.TOUCHTYPE_MOVE) { + this.moveX = event.touches[0].screenX - this.startX + this.moveY = event.touches[0].screenY - this.startY + } else if (event.type == Constants.TOUCHTYPE_UP) { + Log.showInfo(TAG, `Touch Event slidingLength:${this.slidingLength}`) + if (Math.abs(this.moveY) > this.slidingLength) { + this.unlockScreen() + } + this.moveX = 0 + this.moveY = 0 + } + } + + toggleDisplay(batteryCharging?) { + Log.showInfo(TAG, `toggleDisplay charging:${batteryCharging}`); + this.toggleShow = true; + setTimeout(() => { + this.toggleShow = false; + Log.showInfo(TAG, `toggleDisplay setTimeout: ${this.toggleShow}`); + }, DELAY_TIME); + } + + onPageShow(): void { + this.elementAlpha = 1 + this.elementScale = 1 + this.backgroundScale = 1.1 } - event.stopPropagation(); - } } \ No newline at end of file diff --git a/product/phone/src/main/resources/base/element/float.json b/product/phone/src/main/resources/base/element/float.json new file mode 100644 index 00000000..37ca3093 --- /dev/null +++ b/product/phone/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "status_bar_height", + "value": "24vp" + } + ] +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index f1565a62..68cb7704 100644 --- a/settings.gradle +++ b/settings.gradle @@ -13,7 +13,8 @@ * limitations under the License. */ include ':entry', ':phone', ':pc', ':common', ':features:screenlock', - ':features:noticeitem', ':features:notificationservice', ':features:batterycomponent', - ':features:datetimecomponent', ':features:wallpapercomponent', ':features:shortcutcomponent' + ':features:noticeitem', ':features:batterycomponent', + ':features:datetimecomponent', ':features:wallpapercomponent', ':features:shortcutcomponent', + ':features:clockcomponent', ':features:wificomponent', ':features:signalcomponent' project(':phone').projectDir = new File('./product/phone') project(':pc').projectDir = new File('./product/pc') \ No newline at end of file -- Gitee From 2202c1a6dc8acf84df06eb4c5974557de043b28c Mon Sep 17 00:00:00 2001 From: r00498791 Date: Mon, 11 Apr 2022 15:09:58 +0800 Subject: [PATCH 061/373] remove download link Signed-off-by: r00498791 --- doc/Instructions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Instructions.md b/doc/Instructions.md index 9ad3abb5..a655fe3c 100644 --- a/doc/Instructions.md +++ b/doc/Instructions.md @@ -17,7 +17,7 @@ ``` ### 环境搭建 -打开DevEco Studio链接下载安装,安装步骤及安装说明详见下载地址([下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download)) +安装DevEco Studio ## 基础开发说明 ### 系统接口调用 -- Gitee From e4ff5dbf8aebba2f6ef7555d3a905542231e6f97 Mon Sep 17 00:00:00 2001 From: zhuchengfeng <940848916@qq.com> Date: Thu, 14 Apr 2022 10:00:17 +0800 Subject: [PATCH 062/373] datetime and commonEvent problem Signed-off-by: zhuchengfeng <940848916@qq.com> --- .../src/main/ets/com/ohos/vm/dateTimeViewModel.ts | 6 +++--- .../src/main/ets/com/ohos/model/screenLockService.ts | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts b/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts index a7cd57d3..e1582d17 100644 --- a/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts +++ b/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts @@ -49,14 +49,14 @@ export default class DateTimeViewModel { this.setDateTime.bind(this)() commonEvent.createSubscriber(mCommonEventSubscribeInfo, this.createSubscriberCallBack.bind(this)); this.unSubscriber = EventManager.subscribe(TIME_CHANGE_EVENT, (args: TimeEventArgs) => { - this.setDateTime(args.date) + this.setDateTime() }); Log.showInfo(TAG, 'ViewModelInit end'); } - private setDateTime(date?: Date) { + private setDateTime() { Log.showInfo(TAG, `setDateTime`) - this.timeVal = sTimeManager.formatTime(date ?? new Date()) + this.timeVal = sTimeManager.formatTime(new Date()) this.dateVal = DateTimeCommon.getSystemDate() this.weekVal = DateTimeCommon.getSystemWeek() } diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 86782840..cde1069c 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -312,9 +312,10 @@ export class ScreenLockService { }) } - private publish(eventName:string) { + private publish(eventName: string) { + Log.showInfo(TAG, `publish event name: ${eventName}`) commonEvent.publish(eventName, (error, value) => { - if (error != null) { + if (error.code) { Log.showError(TAG, 'Operation failed. Cause: ' + JSON.stringify(error)); } else { Log.showInfo(TAG, 'publish common event success. ' + JSON.stringify(value)); -- Gitee From 4130b6360a0b1a97243883b2d74a35f04f69c2b7 Mon Sep 17 00:00:00 2001 From: zhuchengfeng <940848916@qq.com> Date: Sun, 24 Apr 2022 10:09:18 +0800 Subject: [PATCH 063/373] update api9 Signed-off-by: zhuchengfeng <940848916@qq.com> --- .gitattributes | 15 - .gitignore | 17 +- AppScope/app.json5 | 15 + AppScope/resources/base/element/string.json | 8 + AppScope/resources/base/media/app_icon.png | Bin 0 -> 6790 bytes build-profile.json5 | 90 + build.gradle | 40 - common/.gitignore | 3 + common/build-profile.json5 | 5 + common/build.gradle | 21 - common/hvigorfile.js | 3 + common/index.ets | 1 + common/package-lock.json | 5 + common/package.json | 14 + common/src/main/config.json | 24 - .../main/ets/components/MainPage/MainPage.ets | 17 + common/src/main/ets/default/TimeManager.ts | 26 +- common/src/main/module.json5 | 11 + entry/.gitignore | 3 +- entry/build-profile.json5 | 13 + entry/build.gradle | 22 - entry/hvigorfile.js | 2 + entry/package-lock.json | 5 + entry/package.json | 14 + entry/proguard-rules.pro | 1 - entry/src/main/config.json | 64 - entry/src/main/ets/AbilityStage.ts | 25 - .../src/main/ets/Application/AbilityStage.ts | 7 + entry/src/main/ets/MainAbility/MainAbility.ts | 49 +- entry/src/main/ets/MainAbility/app.ets | 23 - .../src/main/ets/MainAbility/pages/index.ets | 28 - entry/src/main/ets/pages/index.ets | 17 + entry/src/main/module.json5 | 37 + .../main/resources/base/element/string.json | 12 +- .../resources/base/profile/main_pages.json | 5 + features/batterycomponent/.gitignore | 4 +- features/batterycomponent/build-profile.json5 | 5 + features/batterycomponent/build.gradle | 19 - features/batterycomponent/hvigorfile.js | 3 + features/batterycomponent/index.ets | 1 + features/batterycomponent/package-lock.json | 5 + features/batterycomponent/package.json | 14 + .../batterycomponent/src/main/config.json | 23 - .../main/ets/components/MainPage/MainPage.ets | 17 + .../src/main/ets/default/app.ets | 23 - .../batterycomponent/src/main/module.json5 | 11 + features/clockcomponent/.gitignore | 4 +- features/clockcomponent/build-profile.json5 | 5 + features/clockcomponent/build.gradle | 19 - features/clockcomponent/hvigorfile.js | 3 + features/clockcomponent/index.ets | 1 + features/clockcomponent/package-lock.json | 5 + features/clockcomponent/package.json | 14 + features/clockcomponent/src/main/config.json | 23 - .../main/ets/components/MainPage/MainPage.ets | 17 + .../src/main/ets/default/pages/clockIcon.ets | 2 +- features/clockcomponent/src/main/module.json5 | 11 + features/datetimecomponent/.gitignore | 3 + .../datetimecomponent/build-profile.json5 | 5 + features/datetimecomponent/build.gradle | 21 - features/datetimecomponent/hvigorfile.js | 3 + features/datetimecomponent/index.ets | 1 + features/datetimecomponent/package-lock.json | 5 + features/datetimecomponent/package.json | 14 + .../datetimecomponent/src/main/config.json | 23 - .../main/ets/com/ohos/vm/dateTimeViewModel.ts | 15 +- .../main/ets/components/MainPage/MainPage.ets | 17 + .../datetimecomponent/src/main/module.json5 | 11 + features/noticeitem/.gitignore | 3 + features/noticeitem/build-profile.json5 | 5 + features/noticeitem/build.gradle | 19 - features/noticeitem/hvigorfile.js | 3 + features/noticeitem/index.ets | 1 + features/noticeitem/package-lock.json | 5 + features/noticeitem/package.json | 14 + features/noticeitem/src/main/config.json | 24 - .../noticeItem/view/item/confirmDialog.ets | 2 +- .../main/ets/components/MainPage/MainPage.ets | 17 + features/noticeitem/src/main/module.json5 | 11 + features/screenlock/.gitignore | 3 + features/screenlock/build-profile.json5 | 5 + features/screenlock/build.gradle | 26 - features/screenlock/hvigorfile.js | 3 + features/screenlock/index.ets | 1 + features/screenlock/package-lock.json | 5 + features/screenlock/package.json | 14 + features/screenlock/src/main/config.json | 23 - .../main/ets/com/ohos/common/constants.ets | 70 - .../src/main/ets/com/ohos/common/constants.ts | 142 ++ .../ets/com/ohos/model/screenLockModel.ts | 32 +- .../ets/com/ohos/model/screenLockService.ts | 1 - .../ets/com/ohos/view/component/customPSD.ets | 6 +- .../com/ohos/view/component/digitalPSD.ets | 6 +- .../ets/com/ohos/view/component/mixedPSD.ets | 4 +- .../com/ohos/view/component/numkeyBoard.ets | 2 +- .../src/main/ets/com/ohos/vm/baseViewModel.ts | 65 +- .../ets/com/ohos/vm/customPSDViewModel.ts | 6 +- .../main/ets/com/ohos/vm/dateTimeViewModel.ts | 72 - .../ets/com/ohos/vm/digitalPSDViewModel.ts | 8 +- .../main/ets/com/ohos/vm/mixedPSDViewModel.ts | 6 +- .../main/ets/components/MainPage/MainPage.ets | 17 + features/screenlock/src/main/module.json5 | 11 + features/shortcutcomponent/.gitignore | 3 + .../shortcutcomponent/build-profile.json5 | 5 + features/shortcutcomponent/build.gradle | 21 - features/shortcutcomponent/hvigorfile.js | 3 + features/shortcutcomponent/index.ets | 1 + features/shortcutcomponent/package-lock.json | 5 + features/shortcutcomponent/package.json | 14 + .../shortcutcomponent/src/main/config.json | 23 - .../main/ets/components/MainPage/MainPage.ets | 17 + .../shortcutcomponent/src/main/module.json5 | 11 + features/signalcomponent/.gitignore | 4 +- features/signalcomponent/build-profile.json5 | 5 + features/signalcomponent/build.gradle | 19 - features/signalcomponent/hvigorfile.js | 3 + features/signalcomponent/index.ets | 1 + features/signalcomponent/package-lock.json | 5 + features/signalcomponent/package.json | 14 + features/signalcomponent/src/main/config.json | 23 - .../main/ets/components/MainPage/MainPage.ets | 17 + .../signalcomponent/src/main/module.json5 | 11 + features/wallpapercomponent/.gitignore | 3 + .../wallpapercomponent/build-profile.json5 | 5 + features/wallpapercomponent/build.gradle | 21 - features/wallpapercomponent/hvigorfile.js | 3 + features/wallpapercomponent/index.ets | 1 + features/wallpapercomponent/package-lock.json | 5 + features/wallpapercomponent/package.json | 14 + .../wallpapercomponent/src/main/config.json | 23 - .../main/ets/components/MainPage/MainPage.ets | 17 + .../wallpapercomponent/src/main/module.json5 | 11 + .../main/resources/base/element/string.json | 8 + features/wificomponent/.gitignore | 4 +- features/wificomponent/build-profile.json5 | 5 + features/wificomponent/build.gradle | 19 - features/wificomponent/hvigorfile.js | 3 + features/wificomponent/index.ets | 1 + features/wificomponent/package-lock.json | 5 + features/wificomponent/package.json | 14 + features/wificomponent/src/main/config.json | 23 - .../main/ets/components/MainPage/MainPage.ets | 17 + features/wificomponent/src/main/module.json5 | 11 + .../main/resources/base/element/string.json | 8 + figures/screenlock.png | Bin 27998 -> 0 bytes gradle.properties | 10 - gradlew | 183 -- gradlew.bat | 103 - hvigorfile.js | 2 + package-lock.json | 1657 +++++++++++++++++ package.json | 18 + product/pc/.gitignore | 3 + product/pc/build-profile.json5 | 13 + product/pc/hvigorfile.js | 2 + product/pc/package-lock.json | 38 + product/pc/package.json | 25 + .../ets/{ => Application}/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 5 +- .../pc/src/main/ets/ServiceExtAbility/app.ets | 26 - .../common/StyleConfiguration.ts | 4 +- .../common/StyleManager.ts | 14 +- .../common/constants.ts | 0 .../pages/customPassword.ets | 10 +- .../src/main/ets}/pages/customscreenlock.ets | 3 +- .../pages/digitalPassword.ets | 10 +- .../src/main/ets}/pages/index.ets | 29 +- .../pages/journalscreenlock.ets | 3 +- .../pages/mixedPassword.ets | 10 +- .../pages/slidescreenlock.ets | 19 +- .../vm/indexViewModel.ts | 6 +- .../vm/slideScreenLockViewModel.ts | 6 +- .../pc/src/main/{config.json => module.json5} | 71 +- .../main/resources/base/element/string.json | 6 +- .../resources/base/profile/main_pages.json | 8 + product/phone/.gitignore | 3 + product/phone/build-profile.json5 | 13 + product/phone/hvigorfile.js | 2 + product/phone/package-lock.json | 38 + product/phone/package.json | 25 + .../src/main/ets/Application/AbilityStage.ts | 7 + .../src/main/ets/ServiceExtAbility/app.ets | 26 - .../common/StyleConfiguration.ts | 4 +- .../common/StyleManager.ts | 4 +- .../common/constants.ts | 0 .../pages/customPassword.ets | 10 +- .../src/main/ets}/pages/customscreenlock.ets | 3 +- .../pages/digitalPassword.ets | 10 +- .../src/main/ets}/pages/index.ets | 39 +- .../pages/journalscreenlock.ets | 3 +- .../pages/mixedPassword.ets | 10 +- .../pages/slidescreenlock.ets | 15 +- .../vm/indexViewModel.ts | 6 +- .../vm/slideScreenLockViewModel.ts | 6 +- .../src/main/{config.json => module.json5} | 71 +- .../main/resources/base/element/string.json | 6 +- .../resources/base/profile/main_pages.json | 8 + settings.gradle | 20 - signature/screenlock.p7b | Bin 3438 -> 3639 bytes 198 files changed, 3117 insertions(+), 1545 deletions(-) delete mode 100644 .gitattributes create mode 100644 AppScope/app.json5 create mode 100644 AppScope/resources/base/element/string.json create mode 100644 AppScope/resources/base/media/app_icon.png create mode 100644 build-profile.json5 delete mode 100644 build.gradle create mode 100644 common/.gitignore create mode 100644 common/build-profile.json5 delete mode 100644 common/build.gradle create mode 100644 common/hvigorfile.js create mode 100644 common/index.ets create mode 100644 common/package-lock.json create mode 100644 common/package.json delete mode 100644 common/src/main/config.json create mode 100644 common/src/main/ets/components/MainPage/MainPage.ets create mode 100644 common/src/main/module.json5 create mode 100644 entry/build-profile.json5 delete mode 100644 entry/build.gradle create mode 100644 entry/hvigorfile.js create mode 100644 entry/package-lock.json create mode 100644 entry/package.json delete mode 100644 entry/proguard-rules.pro delete mode 100644 entry/src/main/config.json delete mode 100644 entry/src/main/ets/AbilityStage.ts create mode 100644 entry/src/main/ets/Application/AbilityStage.ts delete mode 100644 entry/src/main/ets/MainAbility/app.ets delete mode 100644 entry/src/main/ets/MainAbility/pages/index.ets create mode 100644 entry/src/main/ets/pages/index.ets create mode 100644 entry/src/main/module.json5 create mode 100644 entry/src/main/resources/base/profile/main_pages.json create mode 100644 features/batterycomponent/build-profile.json5 delete mode 100644 features/batterycomponent/build.gradle create mode 100644 features/batterycomponent/hvigorfile.js create mode 100644 features/batterycomponent/index.ets create mode 100644 features/batterycomponent/package-lock.json create mode 100644 features/batterycomponent/package.json delete mode 100644 features/batterycomponent/src/main/config.json create mode 100644 features/batterycomponent/src/main/ets/components/MainPage/MainPage.ets delete mode 100644 features/batterycomponent/src/main/ets/default/app.ets create mode 100644 features/batterycomponent/src/main/module.json5 create mode 100644 features/clockcomponent/build-profile.json5 delete mode 100644 features/clockcomponent/build.gradle create mode 100644 features/clockcomponent/hvigorfile.js create mode 100644 features/clockcomponent/index.ets create mode 100644 features/clockcomponent/package-lock.json create mode 100644 features/clockcomponent/package.json delete mode 100644 features/clockcomponent/src/main/config.json create mode 100644 features/clockcomponent/src/main/ets/components/MainPage/MainPage.ets create mode 100644 features/clockcomponent/src/main/module.json5 create mode 100644 features/datetimecomponent/.gitignore create mode 100644 features/datetimecomponent/build-profile.json5 delete mode 100644 features/datetimecomponent/build.gradle create mode 100644 features/datetimecomponent/hvigorfile.js create mode 100644 features/datetimecomponent/index.ets create mode 100644 features/datetimecomponent/package-lock.json create mode 100644 features/datetimecomponent/package.json delete mode 100644 features/datetimecomponent/src/main/config.json create mode 100644 features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets create mode 100644 features/datetimecomponent/src/main/module.json5 create mode 100644 features/noticeitem/.gitignore create mode 100644 features/noticeitem/build-profile.json5 delete mode 100644 features/noticeitem/build.gradle create mode 100644 features/noticeitem/hvigorfile.js create mode 100644 features/noticeitem/index.ets create mode 100644 features/noticeitem/package-lock.json create mode 100644 features/noticeitem/package.json delete mode 100644 features/noticeitem/src/main/config.json create mode 100644 features/noticeitem/src/main/ets/components/MainPage/MainPage.ets create mode 100644 features/noticeitem/src/main/module.json5 create mode 100644 features/screenlock/.gitignore create mode 100644 features/screenlock/build-profile.json5 delete mode 100644 features/screenlock/build.gradle create mode 100644 features/screenlock/hvigorfile.js create mode 100644 features/screenlock/index.ets create mode 100644 features/screenlock/package-lock.json create mode 100644 features/screenlock/package.json delete mode 100644 features/screenlock/src/main/config.json delete mode 100644 features/screenlock/src/main/ets/com/ohos/common/constants.ets create mode 100644 features/screenlock/src/main/ets/com/ohos/common/constants.ts delete mode 100644 features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ts create mode 100644 features/screenlock/src/main/ets/components/MainPage/MainPage.ets create mode 100644 features/screenlock/src/main/module.json5 create mode 100644 features/shortcutcomponent/.gitignore create mode 100644 features/shortcutcomponent/build-profile.json5 delete mode 100644 features/shortcutcomponent/build.gradle create mode 100644 features/shortcutcomponent/hvigorfile.js create mode 100644 features/shortcutcomponent/index.ets create mode 100644 features/shortcutcomponent/package-lock.json create mode 100644 features/shortcutcomponent/package.json delete mode 100644 features/shortcutcomponent/src/main/config.json create mode 100644 features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets create mode 100644 features/shortcutcomponent/src/main/module.json5 create mode 100644 features/signalcomponent/build-profile.json5 delete mode 100644 features/signalcomponent/build.gradle create mode 100644 features/signalcomponent/hvigorfile.js create mode 100644 features/signalcomponent/index.ets create mode 100644 features/signalcomponent/package-lock.json create mode 100644 features/signalcomponent/package.json delete mode 100644 features/signalcomponent/src/main/config.json create mode 100644 features/signalcomponent/src/main/ets/components/MainPage/MainPage.ets create mode 100644 features/signalcomponent/src/main/module.json5 create mode 100644 features/wallpapercomponent/.gitignore create mode 100644 features/wallpapercomponent/build-profile.json5 delete mode 100644 features/wallpapercomponent/build.gradle create mode 100644 features/wallpapercomponent/hvigorfile.js create mode 100644 features/wallpapercomponent/index.ets create mode 100644 features/wallpapercomponent/package-lock.json create mode 100644 features/wallpapercomponent/package.json delete mode 100644 features/wallpapercomponent/src/main/config.json create mode 100644 features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets create mode 100644 features/wallpapercomponent/src/main/module.json5 create mode 100644 features/wallpapercomponent/src/main/resources/base/element/string.json create mode 100644 features/wificomponent/build-profile.json5 delete mode 100644 features/wificomponent/build.gradle create mode 100644 features/wificomponent/hvigorfile.js create mode 100644 features/wificomponent/index.ets create mode 100644 features/wificomponent/package-lock.json create mode 100644 features/wificomponent/package.json delete mode 100644 features/wificomponent/src/main/config.json create mode 100644 features/wificomponent/src/main/ets/components/MainPage/MainPage.ets create mode 100644 features/wificomponent/src/main/module.json5 create mode 100644 features/wificomponent/src/main/resources/base/element/string.json delete mode 100644 figures/screenlock.png delete mode 100644 gradle.properties delete mode 100644 gradlew delete mode 100644 gradlew.bat create mode 100644 hvigorfile.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 product/pc/.gitignore create mode 100644 product/pc/build-profile.json5 create mode 100644 product/pc/hvigorfile.js create mode 100644 product/pc/package-lock.json create mode 100644 product/pc/package.json rename product/pc/src/main/ets/{ => Application}/AbilityStage.ts (92%) delete mode 100644 product/pc/src/main/ets/ServiceExtAbility/app.ets rename product/pc/src/main/ets/{ServiceExtAbility => }/common/StyleConfiguration.ts (84%) rename product/pc/src/main/ets/{ServiceExtAbility => }/common/StyleManager.ts (84%) rename product/pc/src/main/ets/{ServiceExtAbility => }/common/constants.ts (100%) rename product/pc/src/main/ets/{ServiceExtAbility => }/pages/customPassword.ets (76%) rename product/{phone/src/main/ets/ServiceExtAbility => pc/src/main/ets}/pages/customscreenlock.ets (92%) rename product/pc/src/main/ets/{ServiceExtAbility => }/pages/digitalPassword.ets (76%) rename product/{phone/src/main/ets/ServiceExtAbility => pc/src/main/ets}/pages/index.ets (77%) rename product/pc/src/main/ets/{ServiceExtAbility => }/pages/journalscreenlock.ets (92%) rename product/pc/src/main/ets/{ServiceExtAbility => }/pages/mixedPassword.ets (77%) rename product/pc/src/main/ets/{ServiceExtAbility => }/pages/slidescreenlock.ets (81%) rename product/pc/src/main/ets/{ServiceExtAbility => }/vm/indexViewModel.ts (83%) rename product/pc/src/main/ets/{ServiceExtAbility => }/vm/slideScreenLockViewModel.ts (91%) rename product/pc/src/main/{config.json => module.json5} (56%) create mode 100644 product/pc/src/main/resources/base/profile/main_pages.json create mode 100644 product/phone/.gitignore create mode 100644 product/phone/build-profile.json5 create mode 100644 product/phone/hvigorfile.js create mode 100644 product/phone/package-lock.json create mode 100644 product/phone/package.json create mode 100644 product/phone/src/main/ets/Application/AbilityStage.ts delete mode 100644 product/phone/src/main/ets/ServiceExtAbility/app.ets rename product/phone/src/main/ets/{ServiceExtAbility => }/common/StyleConfiguration.ts (84%) rename product/phone/src/main/ets/{ServiceExtAbility => }/common/StyleManager.ts (89%) rename product/phone/src/main/ets/{ServiceExtAbility => }/common/constants.ts (100%) rename product/phone/src/main/ets/{ServiceExtAbility => }/pages/customPassword.ets (77%) rename product/{pc/src/main/ets/ServiceExtAbility => phone/src/main/ets}/pages/customscreenlock.ets (92%) rename product/phone/src/main/ets/{ServiceExtAbility => }/pages/digitalPassword.ets (77%) rename product/{pc/src/main/ets/ServiceExtAbility => phone/src/main/ets}/pages/index.ets (65%) rename product/phone/src/main/ets/{ServiceExtAbility => }/pages/journalscreenlock.ets (92%) rename product/phone/src/main/ets/{ServiceExtAbility => }/pages/mixedPassword.ets (77%) rename product/phone/src/main/ets/{ServiceExtAbility => }/pages/slidescreenlock.ets (83%) rename product/phone/src/main/ets/{ServiceExtAbility => }/vm/indexViewModel.ts (84%) rename product/phone/src/main/ets/{ServiceExtAbility => }/vm/slideScreenLockViewModel.ts (90%) rename product/phone/src/main/{config.json => module.json5} (56%) create mode 100644 product/phone/src/main/resources/base/profile/main_pages.json delete mode 100644 settings.gradle diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 51c63e29..00000000 --- a/.gitattributes +++ /dev/null @@ -1,15 +0,0 @@ -*.tgz filter=lfs diff=lfs merge=lfs -text -*.trp filter=lfs diff=lfs merge=lfs -text -*.apk filter=lfs diff=lfs merge=lfs -text -*.jar filter=lfs diff=lfs merge=lfs -text -*.mp4 filter=lfs diff=lfs merge=lfs -text -*.zip filter=lfs diff=lfs merge=lfs -text -*.asm filter=lfs diff=lfs merge=lfs -text -*.8svn filter=lfs diff=lfs merge=lfs -text -*.9svn filter=lfs diff=lfs merge=lfs -text -*.dylib filter=lfs diff=lfs merge=lfs -text -*.exe filter=lfs diff=lfs merge=lfs -text -*.a filter=lfs diff=lfs merge=lfs -text -*.so filter=lfs diff=lfs merge=lfs -text -*.bin filter=lfs diff=lfs merge=lfs -text -*.dll filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index e5948eb9..9f6d3499 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,5 @@ -/product/phone/build -/product/pc/build -/common/build -/build/ -/features/batterycomponent/build/ -/features/datetimecomponent/build/ -/features/shortcutcomponent/build/ -/features/wallpapercomponent/build/ -/features/noticeitem/build/ -/features/screenlock/build/ +/node_modules +/local.properties /.idea -/.gradle -local.properties -tsconfig.json \ No newline at end of file +**/build +/features/**/build \ No newline at end of file diff --git a/AppScope/app.json5 b/AppScope/app.json5 new file mode 100644 index 00000000..7baec669 --- /dev/null +++ b/AppScope/app.json5 @@ -0,0 +1,15 @@ +{ + "app": { + "bundleName": "com.ohos.screenlock", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name", + "distributedNotificationEnabled": true, + "singleton": true, + "keepAlive":true, + "minAPIVersion": 9, + "targetAPIVersion": 9 + } +} diff --git a/AppScope/resources/base/element/string.json b/AppScope/resources/base/element/string.json new file mode 100644 index 00000000..0b640493 --- /dev/null +++ b/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "ScreenLock" + } + ] +} diff --git a/AppScope/resources/base/media/app_icon.png b/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { - if (!this.mSettingsHelper) { - Log.showError(TAG, `Can't get dataAbility helper.`); - return; - } - let timeString = settings.getValueSync(this.mSettingsHelper, TIME_FORMAT_KEY, "24"); - Log.showDebug(TAG, `timeFormat change: ${timeString}`); - this.mUse24hFormat = timeString == "24"; - this.notifyTimeChange(); - }; - try { this.mSettingsHelper.on("dataChange", settings.getUriSync(TIME_FORMAT_KEY), (err) => { if (err.code !== 0) { Log.showError(TAG, `failed to getAbilityWant, code: ${err.code}.`); return; } - handleTimeFormatChange(); }); } catch (e) { Log.showError(TAG, `Can't listen timeformate change.`); } - handleTimeFormatChange(); + this.handleTimeFormatChange(); } + private handleTimeFormatChange() { + Log.showInfo(TAG, "handleTimeFormatChange") + if (!this.mSettingsHelper) { + Log.showError(TAG, `Can't get dataAbility helper.`); + return; + } + let timeString = settings.getValueSync(this.mSettingsHelper, TIME_FORMAT_KEY, "24"); + Log.showDebug(TAG, `timeFormat change: ${timeString}`); + this.mUse24hFormat = timeString == "24"; + this.notifyTimeChange(); + }; + private notifyTimeChange() { Log.showInfo(TAG, "notifyTimeChange"); let args: TimeEventArgs = { diff --git a/common/src/main/module.json5 b/common/src/main/module.json5 new file mode 100644 index 00000000..064cd174 --- /dev/null +++ b/common/src/main/module.json5 @@ -0,0 +1,11 @@ +{ + "module": { + "name": "common", + "type": "har", + "deviceTypes": [ + "phone", + "tablet" + ], + "uiSyntax": "ets" + } +} diff --git a/entry/.gitignore b/entry/.gitignore index 7d5b7a94..4f9a9738 100644 --- a/entry/.gitignore +++ b/entry/.gitignore @@ -1,2 +1,3 @@ -/build /node_modules +/.preview +/build \ No newline at end of file diff --git a/entry/build-profile.json5 b/entry/build-profile.json5 new file mode 100644 index 00000000..7dc37bb9 --- /dev/null +++ b/entry/build-profile.json5 @@ -0,0 +1,13 @@ +{ + "apiType": 'stageMode', + "buildOption": { + }, + "targets": [ + { + "name": "default", + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/entry/build.gradle b/entry/build.gradle deleted file mode 100644 index 1b24503d..00000000 --- a/entry/build.gradle +++ /dev/null @@ -1,22 +0,0 @@ -apply plugin: 'com.huawei.ohos.hap' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - - - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} diff --git a/entry/hvigorfile.js b/entry/hvigorfile.js new file mode 100644 index 00000000..d7720ee6 --- /dev/null +++ b/entry/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/entry/package-lock.json b/entry/package-lock.json new file mode 100644 index 00000000..15bc7145 --- /dev/null +++ b/entry/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "entry", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/entry/package.json b/entry/package.json new file mode 100644 index 00000000..c7685ac4 --- /dev/null +++ b/entry/package.json @@ -0,0 +1,14 @@ +{ + "license": "ISC", + "devDependencies": {}, + "name": "entry", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "description": "example description", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} diff --git a/entry/proguard-rules.pro b/entry/proguard-rules.pro deleted file mode 100644 index f7666e47..00000000 --- a/entry/proguard-rules.pro +++ /dev/null @@ -1 +0,0 @@ -# config module specific ProGuard rules here. \ No newline at end of file diff --git a/entry/src/main/config.json b/entry/src/main/config.json deleted file mode 100644 index 1a9fe809..00000000 --- a/entry/src/main/config.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.screenlock", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.screenlock", - "name": ".MyApplication", - "deviceType": [ - "phone","tablet" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "entry", - "moduleType": "entry", - "installationFree": false - }, - "abilities": [ - { - "skills": [ - { - "entities": [ - "entity.system.home" - ], - "actions": [ - "action.system.home" - ] - } - ], - "visible": true, - "name": "com.ohos.screenlock.MainAbility", - "icon": "$media:icon", - "description": "$string:mainability_description", - "label": "$string:entry_MainAbility", - "type": "page", - "launchType": "standard", - "srcPath": "MainAbility", - "srcLanguage": "ets" - } - ], - "js": [ - { - "mode": { - "syntax": "ets", - "type": "pageAbility" - }, - "pages": [ - "pages/index" - ], - "name": "MainAbility", - "window": { - "designWidth": 720, - "autoDesignWidth": false - } - } - ], - "srcPath": "MainAbility" - } -} \ No newline at end of file diff --git a/entry/src/main/ets/AbilityStage.ts b/entry/src/main/ets/AbilityStage.ts deleted file mode 100644 index 037862f7..00000000 --- a/entry/src/main/ets/AbilityStage.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../common/src/main/ets/default/Log' - -const TAG = "MainAbilityStage" - -export default class MainAbilityStage extends AbilityStage { - onCreate() { - Log.showInfo(TAG, "onCreate") - } -} \ No newline at end of file diff --git a/entry/src/main/ets/Application/AbilityStage.ts b/entry/src/main/ets/Application/AbilityStage.ts new file mode 100644 index 00000000..32dfe93c --- /dev/null +++ b/entry/src/main/ets/Application/AbilityStage.ts @@ -0,0 +1,7 @@ +import AbilityStage from "@ohos.application.AbilityStage" + +export default class MyAbilityStage extends AbilityStage { + onCreate() { + console.log("[Demo] MyAbilityStage onCreate") + } +} \ No newline at end of file diff --git a/entry/src/main/ets/MainAbility/MainAbility.ts b/entry/src/main/ets/MainAbility/MainAbility.ts index 6033b14c..edb91307 100644 --- a/entry/src/main/ets/MainAbility/MainAbility.ts +++ b/entry/src/main/ets/MainAbility/MainAbility.ts @@ -1,43 +1,34 @@ -/* - * Copyright (c) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Ability from "@ohos.application.Ability" +import Ability from '@ohos.application.Ability' export default class MainAbility extends Ability { onCreate(want, launchParam) { - console.info('API8 A onCreate') + console.log("[Demo] MainAbility onCreate") + globalThis.abilityWant = want; } - onWindowStageCreate(windowStage) { - console.info('API8 A onWindowStageCreate') - windowStage.setUIContent(this.content, "pages/index", null) + onDestroy() { + console.log("[Demo] MainAbility onDestroy") } - onForeground() { - console.info('API8 A onForeground') - } + onWindowStageCreate(windowStage) { + // Main window is created, set main page for this ability + console.log("[Demo] MainAbility onWindowStageCreate") - onBackground() { - console.info('API8 A onBackground') + windowStage.setUIContent(this.context, "pages/index", null) } onWindowStageDestroy() { - console.info('API8 A onWindowStageDestroy') + // Main window is destroyed, release UI related resources + console.log("[Demo] MainAbility onWindowStageDestroy") } - onDestroy() { - console.info('API8 A onDestroy') + onForeground() { + // Ability has brought to foreground + console.log("[Demo] MainAbility onForeground") + } + + onBackground() { + // Ability has back to background + console.log("[Demo] MainAbility onBackground") } -} \ No newline at end of file +}; diff --git a/entry/src/main/ets/MainAbility/app.ets b/entry/src/main/ets/MainAbility/app.ets deleted file mode 100644 index cebf2a45..00000000 --- a/entry/src/main/ets/MainAbility/app.ets +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2022 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 default { - onCreate() { - console.info('Application onCreate') - }, - onDestroy() { - console.info('Application onDestroy') - }, -} diff --git a/entry/src/main/ets/MainAbility/pages/index.ets b/entry/src/main/ets/MainAbility/pages/index.ets deleted file mode 100644 index 31a1320e..00000000 --- a/entry/src/main/ets/MainAbility/pages/index.ets +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2022 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. - */ - -@Entry -@Component -struct Index { - build() { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Text('Hello World API8 A') - .fontSize(50) - .fontWeight(FontWeight.Bold) - } - .width('100%') - .height('100%') - } -} \ No newline at end of file diff --git a/entry/src/main/ets/pages/index.ets b/entry/src/main/ets/pages/index.ets new file mode 100644 index 00000000..d6ca48cf --- /dev/null +++ b/entry/src/main/ets/pages/index.ets @@ -0,0 +1,17 @@ +@Entry +@Component +struct Index { + @State message: string = 'Hello World' + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + } + .height('100%') + } +} \ No newline at end of file diff --git a/entry/src/main/module.json5 b/entry/src/main/module.json5 new file mode 100644 index 00000000..035cdc75 --- /dev/null +++ b/entry/src/main/module.json5 @@ -0,0 +1,37 @@ +{ + "module": { + "name": "entry", + "type": "entry", + "srcEntrance": "./ets/Application/AbilityStage.ts", + "description": "$string:entry_desc", + "mainElement": "MainAbility", + "deviceTypes": [ + "phone", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "uiSyntax": "ets", + "abilities": [ + { + "name": "MainAbility", + "srcEntrance": "./ets/MainAbility/MainAbility.ts", + "description": "$string:MainAbility_desc", + "icon": "$media:icon", + "label": "$string:MainAbility_label", + "visible": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json index bc3df790..490210a3 100644 --- a/entry/src/main/resources/base/element/string.json +++ b/entry/src/main/resources/base/element/string.json @@ -1,12 +1,16 @@ { "string": [ { - "name": "entry_MainAbility", - "value": "entry_MainAbility" + "name": "entry_desc", + "value": "description" }, { - "name": "mainability_description", - "value": "eTS_Empty Ability" + "name": "MainAbility_desc", + "value": "description" + }, + { + "name": "MainAbility_label", + "value": "label" } ] } \ No newline at end of file diff --git a/entry/src/main/resources/base/profile/main_pages.json b/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 00000000..feec276e --- /dev/null +++ b/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/index" + ] +} diff --git a/features/batterycomponent/.gitignore b/features/batterycomponent/.gitignore index 796b96d1..4f9a9738 100644 --- a/features/batterycomponent/.gitignore +++ b/features/batterycomponent/.gitignore @@ -1 +1,3 @@ -/build +/node_modules +/.preview +/build \ No newline at end of file diff --git a/features/batterycomponent/build-profile.json5 b/features/batterycomponent/build-profile.json5 new file mode 100644 index 00000000..35dff6d5 --- /dev/null +++ b/features/batterycomponent/build-profile.json5 @@ -0,0 +1,5 @@ +{ + "apiType": "stageMode", + "buildOption": { + } +} diff --git a/features/batterycomponent/build.gradle b/features/batterycomponent/build.gradle deleted file mode 100644 index e2d5bfb6..00000000 --- a/features/batterycomponent/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} diff --git a/features/batterycomponent/hvigorfile.js b/features/batterycomponent/hvigorfile.js new file mode 100644 index 00000000..42ed4b4a --- /dev/null +++ b/features/batterycomponent/hvigorfile.js @@ -0,0 +1,3 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks + diff --git a/features/batterycomponent/index.ets b/features/batterycomponent/index.ets new file mode 100644 index 00000000..1bb64ac2 --- /dev/null +++ b/features/batterycomponent/index.ets @@ -0,0 +1 @@ +export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/batterycomponent/package-lock.json b/features/batterycomponent/package-lock.json new file mode 100644 index 00000000..ab0b8890 --- /dev/null +++ b/features/batterycomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/batterycomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/batterycomponent/package.json b/features/batterycomponent/package.json new file mode 100644 index 00000000..62c24fe2 --- /dev/null +++ b/features/batterycomponent/package.json @@ -0,0 +1,14 @@ +{ + "license": "ISC", + "types": "", + "devDependencies": {}, + "name": "@ohos/batterycomponent", + "description": "a npm package which contains arkUI2.0 page", + "ohos": { + "org": "" + }, + "main": "index.ets", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} diff --git a/features/batterycomponent/src/main/config.json b/features/batterycomponent/src/main/config.json deleted file mode 100644 index bf82fe61..00000000 --- a/features/batterycomponent/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.batterycomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "batterycomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/components/MainPage/MainPage.ets b/features/batterycomponent/src/main/ets/components/MainPage/MainPage.ets new file mode 100644 index 00000000..0f540304 --- /dev/null +++ b/features/batterycomponent/src/main/ets/components/MainPage/MainPage.ets @@ -0,0 +1,17 @@ +@Entry +@Component +export struct MainPage { + @State message: string = 'Hello World' + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + } + .height('100%') + } +} diff --git a/features/batterycomponent/src/main/ets/default/app.ets b/features/batterycomponent/src/main/ets/default/app.ets deleted file mode 100644 index 2a3b6238..00000000 --- a/features/batterycomponent/src/main/ets/default/app.ets +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2021 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 default { - onCreate() { - console.info('Application onCreate') - }, - onDestroy() { - console.info('Application onDestroy') - }, -} diff --git a/features/batterycomponent/src/main/module.json5 b/features/batterycomponent/src/main/module.json5 new file mode 100644 index 00000000..50dd6bac --- /dev/null +++ b/features/batterycomponent/src/main/module.json5 @@ -0,0 +1,11 @@ +{ + "module": { + "name": "batterycomponent", + "type": "har", + "deviceTypes": [ + "phone", + "tablet" + ], + "uiSyntax": "ets" + } +} diff --git a/features/clockcomponent/.gitignore b/features/clockcomponent/.gitignore index c795b054..4f9a9738 100644 --- a/features/clockcomponent/.gitignore +++ b/features/clockcomponent/.gitignore @@ -1 +1,3 @@ -build \ No newline at end of file +/node_modules +/.preview +/build \ No newline at end of file diff --git a/features/clockcomponent/build-profile.json5 b/features/clockcomponent/build-profile.json5 new file mode 100644 index 00000000..35dff6d5 --- /dev/null +++ b/features/clockcomponent/build-profile.json5 @@ -0,0 +1,5 @@ +{ + "apiType": "stageMode", + "buildOption": { + } +} diff --git a/features/clockcomponent/build.gradle b/features/clockcomponent/build.gradle deleted file mode 100644 index ae402d92..00000000 --- a/features/clockcomponent/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} \ No newline at end of file diff --git a/features/clockcomponent/hvigorfile.js b/features/clockcomponent/hvigorfile.js new file mode 100644 index 00000000..42ed4b4a --- /dev/null +++ b/features/clockcomponent/hvigorfile.js @@ -0,0 +1,3 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks + diff --git a/features/clockcomponent/index.ets b/features/clockcomponent/index.ets new file mode 100644 index 00000000..1bb64ac2 --- /dev/null +++ b/features/clockcomponent/index.ets @@ -0,0 +1 @@ +export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/clockcomponent/package-lock.json b/features/clockcomponent/package-lock.json new file mode 100644 index 00000000..f5ba2591 --- /dev/null +++ b/features/clockcomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/clockcomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/clockcomponent/package.json b/features/clockcomponent/package.json new file mode 100644 index 00000000..57bd9d78 --- /dev/null +++ b/features/clockcomponent/package.json @@ -0,0 +1,14 @@ +{ + "license": "ISC", + "types": "", + "devDependencies": {}, + "name": "@ohos/clockcomponent", + "description": "a npm package which contains arkUI2.0 page", + "ohos": { + "org": "" + }, + "main": "index.ets", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} diff --git a/features/clockcomponent/src/main/config.json b/features/clockcomponent/src/main/config.json deleted file mode 100644 index 4d324788..00000000 --- a/features/clockcomponent/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.clockcomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "clockcomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/components/MainPage/MainPage.ets b/features/clockcomponent/src/main/ets/components/MainPage/MainPage.ets new file mode 100644 index 00000000..0f540304 --- /dev/null +++ b/features/clockcomponent/src/main/ets/components/MainPage/MainPage.ets @@ -0,0 +1,17 @@ +@Entry +@Component +export struct MainPage { + @State message: string = 'Hello World' + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + } + .height('100%') + } +} diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index b864ea8b..b95ad4dd 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log' -import StyleConfiguration from '../common/StyleConfiguration' +import StyleConfiguration from '../common/styleconfiguration' import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' import {StatusBarGroupComponentData} from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vm/StatusBarVM' diff --git a/features/clockcomponent/src/main/module.json5 b/features/clockcomponent/src/main/module.json5 new file mode 100644 index 00000000..a68c71e3 --- /dev/null +++ b/features/clockcomponent/src/main/module.json5 @@ -0,0 +1,11 @@ +{ + "module": { + "name": "clockcomponent", + "type": "har", + "deviceTypes": [ + "phone", + "tablet" + ], + "uiSyntax": "ets" + } +} diff --git a/features/datetimecomponent/.gitignore b/features/datetimecomponent/.gitignore new file mode 100644 index 00000000..4f9a9738 --- /dev/null +++ b/features/datetimecomponent/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.preview +/build \ No newline at end of file diff --git a/features/datetimecomponent/build-profile.json5 b/features/datetimecomponent/build-profile.json5 new file mode 100644 index 00000000..35dff6d5 --- /dev/null +++ b/features/datetimecomponent/build-profile.json5 @@ -0,0 +1,5 @@ +{ + "apiType": "stageMode", + "buildOption": { + } +} diff --git a/features/datetimecomponent/build.gradle b/features/datetimecomponent/build.gradle deleted file mode 100644 index 390462f7..00000000 --- a/features/datetimecomponent/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - implementation project(':common') -} diff --git a/features/datetimecomponent/hvigorfile.js b/features/datetimecomponent/hvigorfile.js new file mode 100644 index 00000000..42ed4b4a --- /dev/null +++ b/features/datetimecomponent/hvigorfile.js @@ -0,0 +1,3 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks + diff --git a/features/datetimecomponent/index.ets b/features/datetimecomponent/index.ets new file mode 100644 index 00000000..1bb64ac2 --- /dev/null +++ b/features/datetimecomponent/index.ets @@ -0,0 +1 @@ +export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/datetimecomponent/package-lock.json b/features/datetimecomponent/package-lock.json new file mode 100644 index 00000000..113177a8 --- /dev/null +++ b/features/datetimecomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/datetimecomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/datetimecomponent/package.json b/features/datetimecomponent/package.json new file mode 100644 index 00000000..7dce3cbb --- /dev/null +++ b/features/datetimecomponent/package.json @@ -0,0 +1,14 @@ +{ + "license": "ISC", + "types": "", + "devDependencies": {}, + "name": "@ohos/datetimecomponent", + "description": "a npm package which contains arkUI2.0 page", + "ohos": { + "org": "" + }, + "main": "index.ets", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} diff --git a/features/datetimecomponent/src/main/config.json b/features/datetimecomponent/src/main/config.json deleted file mode 100644 index 7addd44a..00000000 --- a/features/datetimecomponent/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.screenlock", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.screenlock.datetimecomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "datetimecomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts b/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts index e1582d17..f885a794 100644 --- a/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts +++ b/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts @@ -46,17 +46,22 @@ export default class DateTimeViewModel { ViewModelInit(): void{ Log.showInfo(TAG, 'ViewModelInit'); - this.setDateTime.bind(this)() + this.getAndSetDateTime.bind(this)() commonEvent.createSubscriber(mCommonEventSubscribeInfo, this.createSubscriberCallBack.bind(this)); this.unSubscriber = EventManager.subscribe(TIME_CHANGE_EVENT, (args: TimeEventArgs) => { - this.setDateTime() + this.setDateTime(args.date) }); Log.showInfo(TAG, 'ViewModelInit end'); } - private setDateTime() { + private getAndSetDateTime() { + Log.showInfo(TAG, `getAndSetDateTime`) + this.setDateTime(new Date()) + } + + private setDateTime(date: Date) { Log.showInfo(TAG, `setDateTime`) - this.timeVal = sTimeManager.formatTime(new Date()) + this.timeVal = sTimeManager.formatTime(date) this.dateVal = DateTimeCommon.getSystemDate() this.weekVal = DateTimeCommon.getSystemWeek() } @@ -64,7 +69,7 @@ export default class DateTimeViewModel { private createSubscriberCallBack(err, data) { Log.showInfo(TAG, "start createSubscriberCallBack " + JSON.stringify(data)) mEventSubscriber = data - commonEvent.subscribe(data, this.setDateTime.bind(this)); + commonEvent.subscribe(data, this.getAndSetDateTime.bind(this)); Log.showInfo(TAG, "start createSubscriberCallBack finish") } diff --git a/features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets b/features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets new file mode 100644 index 00000000..0f540304 --- /dev/null +++ b/features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets @@ -0,0 +1,17 @@ +@Entry +@Component +export struct MainPage { + @State message: string = 'Hello World' + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + } + .height('100%') + } +} diff --git a/features/datetimecomponent/src/main/module.json5 b/features/datetimecomponent/src/main/module.json5 new file mode 100644 index 00000000..ae47cb13 --- /dev/null +++ b/features/datetimecomponent/src/main/module.json5 @@ -0,0 +1,11 @@ +{ + "module": { + "name": "datetimecomponent", + "type": "har", + "deviceTypes": [ + "phone", + "tablet" + ], + "uiSyntax": "ets" + } +} diff --git a/features/noticeitem/.gitignore b/features/noticeitem/.gitignore new file mode 100644 index 00000000..4f9a9738 --- /dev/null +++ b/features/noticeitem/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.preview +/build \ No newline at end of file diff --git a/features/noticeitem/build-profile.json5 b/features/noticeitem/build-profile.json5 new file mode 100644 index 00000000..35dff6d5 --- /dev/null +++ b/features/noticeitem/build-profile.json5 @@ -0,0 +1,5 @@ +{ + "apiType": "stageMode", + "buildOption": { + } +} diff --git a/features/noticeitem/build.gradle b/features/noticeitem/build.gradle deleted file mode 100644 index ae402d92..00000000 --- a/features/noticeitem/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} \ No newline at end of file diff --git a/features/noticeitem/hvigorfile.js b/features/noticeitem/hvigorfile.js new file mode 100644 index 00000000..42ed4b4a --- /dev/null +++ b/features/noticeitem/hvigorfile.js @@ -0,0 +1,3 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks + diff --git a/features/noticeitem/index.ets b/features/noticeitem/index.ets new file mode 100644 index 00000000..1bb64ac2 --- /dev/null +++ b/features/noticeitem/index.ets @@ -0,0 +1 @@ +export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/noticeitem/package-lock.json b/features/noticeitem/package-lock.json new file mode 100644 index 00000000..331b59a0 --- /dev/null +++ b/features/noticeitem/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/noticeitem", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/noticeitem/package.json b/features/noticeitem/package.json new file mode 100644 index 00000000..01d0d82b --- /dev/null +++ b/features/noticeitem/package.json @@ -0,0 +1,14 @@ +{ + "license": "ISC", + "types": "", + "devDependencies": {}, + "name": "@ohos/noticeitem", + "description": "a npm package which contains arkUI2.0 page", + "ohos": { + "org": "" + }, + "main": "index.ets", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} diff --git a/features/noticeitem/src/main/config.json b/features/noticeitem/src/main/config.json deleted file mode 100644 index 9d4eb9ec..00000000 --- a/features/noticeitem/src/main/config.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": { - }, - "module": { - "package": "com.ohos.noticeItem", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "noticeitem", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets index 782d3fe7..3b64ac37 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -23,7 +23,7 @@ const TAG = 'NoticeItem-Confirm'; */ @CustomDialog export default struct ConfirmDialog { - private title: string + private title: string | Resource private bundleName: string public controller: CustomDialogController public action: () => void diff --git a/features/noticeitem/src/main/ets/components/MainPage/MainPage.ets b/features/noticeitem/src/main/ets/components/MainPage/MainPage.ets new file mode 100644 index 00000000..0f540304 --- /dev/null +++ b/features/noticeitem/src/main/ets/components/MainPage/MainPage.ets @@ -0,0 +1,17 @@ +@Entry +@Component +export struct MainPage { + @State message: string = 'Hello World' + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + } + .height('100%') + } +} diff --git a/features/noticeitem/src/main/module.json5 b/features/noticeitem/src/main/module.json5 new file mode 100644 index 00000000..3a02970d --- /dev/null +++ b/features/noticeitem/src/main/module.json5 @@ -0,0 +1,11 @@ +{ + "module": { + "name": "noticeitem", + "type": "har", + "deviceTypes": [ + "phone", + "tablet" + ], + "uiSyntax": "ets" + } +} diff --git a/features/screenlock/.gitignore b/features/screenlock/.gitignore new file mode 100644 index 00000000..4f9a9738 --- /dev/null +++ b/features/screenlock/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.preview +/build \ No newline at end of file diff --git a/features/screenlock/build-profile.json5 b/features/screenlock/build-profile.json5 new file mode 100644 index 00000000..35dff6d5 --- /dev/null +++ b/features/screenlock/build-profile.json5 @@ -0,0 +1,5 @@ +{ + "apiType": "stageMode", + "buildOption": { + } +} diff --git a/features/screenlock/build.gradle b/features/screenlock/build.gradle deleted file mode 100644 index 21f9ef72..00000000 --- a/features/screenlock/build.gradle +++ /dev/null @@ -1,26 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - implementation project(':common') - implementation project(':features:batterycomponent') - implementation project(':features:clockcomponent') - implementation project(':features:wificomponent') - implementation project(':features:signalcomponent') - -} diff --git a/features/screenlock/hvigorfile.js b/features/screenlock/hvigorfile.js new file mode 100644 index 00000000..42ed4b4a --- /dev/null +++ b/features/screenlock/hvigorfile.js @@ -0,0 +1,3 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks + diff --git a/features/screenlock/index.ets b/features/screenlock/index.ets new file mode 100644 index 00000000..1bb64ac2 --- /dev/null +++ b/features/screenlock/index.ets @@ -0,0 +1 @@ +export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/screenlock/package-lock.json b/features/screenlock/package-lock.json new file mode 100644 index 00000000..f026727d --- /dev/null +++ b/features/screenlock/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/screenlock", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/screenlock/package.json b/features/screenlock/package.json new file mode 100644 index 00000000..9374c485 --- /dev/null +++ b/features/screenlock/package.json @@ -0,0 +1,14 @@ +{ + "license": "ISC", + "types": "", + "devDependencies": {}, + "name": "@ohos/screenlock", + "description": "a npm package which contains arkUI2.0 page", + "ohos": { + "org": "" + }, + "main": "index.ets", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} diff --git a/features/screenlock/src/main/config.json b/features/screenlock/src/main/config.json deleted file mode 100644 index 22f124fc..00000000 --- a/features/screenlock/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.screenlock", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.screenlock", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "screenlock", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/common/constants.ets b/features/screenlock/src/main/ets/com/ohos/common/constants.ets deleted file mode 100644 index 540a56c0..00000000 --- a/features/screenlock/src/main/ets/com/ohos/common/constants.ets +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2021 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 default class Constants { - static WIN_NAME = "ScreenLockWindow" - - //Shortcut params - static SHORTCUT_CIRCLE_WIDTH = '80px' - static SHORTCUT_CIRCLE_HEIGHT = '80px' - static SHORTCUT_TEXT_SIZE = '24px' - static SHORTCUT_TEXT_WIDTH = '48px' - static SHORTCUT_TEXT_HEIGHT = '34px' - static SHORTCUT_BLOCK_HEIGHT = '10px' - static SHORTCUT_HEIGHT = '150px' - - //layout params - Pic - static FULL_CONTAINER_WIDTH = '100%' - static FULL_CONTAINER_HEIGHT = '100%' - static HALF_CONTAINER_WIDTH = '50%' - - //The refresh interval - static INTERVAL = 1000 - - //digitalpssword mask diameter - static DIGITALPSD_IC_DIAMETER = 12 - - //digitalpssword keybord background diameter - static DIGITALPSD_BUTTON_DIAMETER = 60 - - //digitalpssword keybord background diameter - static DIGITALPSD_BUTTON_RECT_WH = 100 - static DIGITALPSD_BUTTON_RECT_HH = 50 - - //digital keybord - static CALL_PHONE = -1 - static DEL_PWD = -2 - static GO_BACK = -3 - static NUMKEY_BOARD = [{index: 0, row1: '1', row2: ' ', value: 1, bkg: false}, - {index: 1, row1: '2', row2: 'ABC', value: 2, bkg: false}, - {index: 2, row1: '3', row2: 'DEF', value: 3, bkg: false}, - {index: 3, row1: '4', row2: 'GHI', value: 4, bkg: false}, - {index: 4, row1: '5', row2: 'JKL', value: 5, bkg: false}, - {index: 5, row1: '6', row2: 'MNO', value: 6, bkg: false}, - {index: 6, row1: '7', row2: 'PQRS', value: 7, bkg: false}, - {index: 7, row1: '8', row2: 'TUV', value: 8, bkg: false}, - {index: 8, row1: '9', row2: 'WXYZ', value: 9, bkg: false}, - {index: 9, row1: $r('app.string.emergency_call'), row2: '', value: Constants.CALL_PHONE, bkg: false}, - {index: 10,row1: '0', row2: '+', value: 0, bkg: false}, - {index: 11,row1: $r('app.string.back'), row2: '', value: Constants.GO_BACK, bkg: false}]; - //max password length - static PASSWORD_MAX_LEN = 32 - - static ACCOUNT_SPACE = 24 -} -export class StatusBarGroupComponentData { - backgroundColor: string = "#00000000"; - contentColor: string = "#FFFFFFFF"; -} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/common/constants.ts b/features/screenlock/src/main/ets/com/ohos/common/constants.ts new file mode 100644 index 00000000..2d9e6876 --- /dev/null +++ b/features/screenlock/src/main/ets/com/ohos/common/constants.ts @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2021 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 default class Constants { + static WIN_NAME = "ScreenLockWindow" + + //Shortcut params + static SHORTCUT_CIRCLE_WIDTH = '80px' + static SHORTCUT_CIRCLE_HEIGHT = '80px' + static SHORTCUT_TEXT_SIZE = '24px' + static SHORTCUT_TEXT_WIDTH = '48px' + static SHORTCUT_TEXT_HEIGHT = '34px' + static SHORTCUT_BLOCK_HEIGHT = '10px' + static SHORTCUT_HEIGHT = '150px' + + //layout params - Pic + static FULL_CONTAINER_WIDTH = '100%' + static FULL_CONTAINER_HEIGHT = '100%' + static HALF_CONTAINER_WIDTH = '50%' + + //The refresh interval + static INTERVAL = 1000 + + //digitalpssword mask diameter + static DIGITALPSD_IC_DIAMETER = 12 + + //digitalpssword keybord background diameter + static DIGITALPSD_BUTTON_DIAMETER = 60 + + //digitalpssword keybord background diameter + static DIGITALPSD_BUTTON_RECT_WH = 100 + static DIGITALPSD_BUTTON_RECT_HH = 50 + + //digital keybord + static CALL_PHONE = -1 + static DEL_PWD = -2 + static GO_BACK = -3 + static NUMKEY_BOARD = [{ + index: 0, + row1: '1', + row2: ' ', + value: 1, + bkg: false + }, + { + index: 1, + row1: '2', + row2: 'ABC', + value: 2, + bkg: false + }, + { + index: 2, + row1: '3', + row2: 'DEF', + value: 3, + bkg: false + }, + { + index: 3, + row1: '4', + row2: 'GHI', + value: 4, + bkg: false + }, + { + index: 4, + row1: '5', + row2: 'JKL', + value: 5, + bkg: false + }, + { + index: 5, + row1: '6', + row2: 'MNO', + value: 6, + bkg: false + }, + { + index: 6, + row1: '7', + row2: 'PQRS', + value: 7, + bkg: false + }, + { + index: 7, + row1: '8', + row2: 'TUV', + value: 8, + bkg: false + }, + { + index: 8, + row1: '9', + row2: 'WXYZ', + value: 9, + bkg: false + }, + { + index: 9, + row1: $r('app.string.emergency_call'), + row2: '', + value: Constants.CALL_PHONE, + bkg: false + }, + { + index: 10, + row1: '0', + row2: '+', + value: 0, + bkg: false + }, + { + index: 11, + row1: $r('app.string.back'), + row2: '', + value: Constants.GO_BACK, + bkg: false + }]; + //max password length + static PASSWORD_MAX_LEN = 32 + static ACCOUNT_SPACE = 24 +} + +export class StatusBarGroupComponentData { + backgroundColor: string = "#00000000"; + contentColor: string = "#FFFFFFFF"; +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index 940f9060..a64f314c 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -21,20 +21,32 @@ import { Callback } from 'basic'; const TAG = 'ScreenLock-ScreenLockModel'; export default class ScreenLockModel { - eventListener(typeName: string, callback:Callback) { + eventListener(typeName: string, callback: Callback) { Log.showInfo(TAG, `eventListener:typeName ${typeName}`); - ScreenLockMar.on(typeName, (err, data) => { - Log.showInfo(TAG, `eventListener:callback err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); - callback(); - }) + switch (typeName) { + case "endScreenOn": + case "unlockScreen": + ScreenLockMar.on(typeName, () => { + Log.showInfo(TAG, `eventListener:callback`); + callback(); + }) + break; + case "beginSleep": + ScreenLockMar.on(typeName, (userId: number) => { + Log.showInfo(TAG, `eventListener:callback userId:${userId}`); + callback(); + }) + break; + default: + Log.showError(TAG, `eventListener:typeName ${typeName}`) + } + Log.showInfo(TAG, `eventListener:typeName ${typeName} finish`); } eventCancelListener(typeName: string) { Log.showInfo(TAG, `eventCancleListener:typeName ${typeName}`); - ScreenLockMar.off(typeName, (err, data) => { - Log.showInfo(TAG, `eventCancleListener:callback err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); - }) + // As off has some problem and there is no case to cancel, do nothing } sendScreenLockEvent(typeName: string, typeNo: number, callback) { @@ -45,7 +57,7 @@ export default class ScreenLockModel { }) } - showScreenLockWindow(callback:Callback) { + showScreenLockWindow(callback: Callback) { Log.showInfo(TAG, 'showScreenLockWindow'); windowManager.find(Constants.WIN_NAME).then((win) => { Log.showInfo(TAG, 'find window finish'); @@ -56,7 +68,7 @@ export default class ScreenLockModel { }) } - hiddenScreenLockWindow(callback:Callback) { + hiddenScreenLockWindow(callback: Callback) { Log.showInfo(TAG, 'hiddenScreenLockWindow'); windowManager.find(Constants.WIN_NAME).then((win) => { Log.showInfo(TAG, 'find window finish'); diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index cde1069c..8cb3a5b5 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -294,7 +294,6 @@ export class ScreenLockService { destroy() { this.screenLockModel.eventCancelListener(EVENT_END_SCREEN_ON); this.screenLockModel.eventCancelListener(EVENT_BEGIN_SLEEP); - this.screenLockModel.eventCancelListener(EVENT_CHANGE_USER); this.screenLockModel.eventCancelListener(EVENT_UNLOCK_SCREEN); this.accountModel.eventCancelListener(ACTIVATING_TYPE, ACTIVATING_EVENT); this.accountModel.eventCancelListener(ACTIVATE_TYPE, ACTIVATE_EVENT) diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index 92d6d4a2..104f9e3d 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -15,8 +15,8 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' -import NumkeyBoard from './numkeyBoard.ets' -import ViewModel , {AuthType} from '../../vm/customPSDViewModel' +import NumkeyBoard from './numkeyBoard' +import ViewModel from '../../vm/customPSDViewModel' const TAG = 'ScreenLock-CustomPSD' @@ -27,7 +27,7 @@ export default struct CustomPSD { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - this.mViewModel.checkFreezingTime(AuthType.PIN, (data) => { + this.mViewModel.checkFreezingTime(() => { Log.showInfo(TAG, `onClick callback is called`) }); } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets index 1bf5b531..3ad93895 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -15,8 +15,8 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' -import NumkeyBoard from './numkeyBoard.ets' -import ViewModel, {AuthType} from '../../vm/digitalPSDViewModel' +import NumkeyBoard from './numkeyBoard' +import ViewModel from '../../vm/digitalPSDViewModel' const TAG = 'ScreenLock-DigitalPSD' @@ -27,7 +27,7 @@ export default struct DigitalPSD { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - this.mViewModel.checkFreezingTime(AuthType.PIN, (data) => { + this.mViewModel.checkFreezingTime(() => { Log.showInfo(TAG, `onClick callback is called`) }); } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets index 82c77c53..82bd579d 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets @@ -15,7 +15,7 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' -import ViewModel, {AuthType}from '../../vm/mixedPSDViewModel' +import ViewModel from '../../vm/mixedPSDViewModel' const TAG = 'ScreenLock-MixedPSD' @@ -25,7 +25,7 @@ export default struct MixedPSD { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - this.mViewModel.checkFreezingTime(AuthType.PIN, (data) => { + this.mViewModel.checkFreezingTime(() => { Log.showInfo(TAG, `onClick callback is called`) }); } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets index 0d87aa74..d94dbd19 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets @@ -100,7 +100,7 @@ export default struct NumkeyBoard { } .onClick(() => { Log.showInfo(TAG, `onClick:${item.index}`) - setTimeout(this.onKeypress.bind(this), 0, item.index, (data) => { + setTimeout(this.onKeypress.bind(this), 0, item.index, () => { Log.showInfo(TAG, `onClick callback is called`) }); }) diff --git a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts index 30181955..5cc35b7e 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts @@ -16,6 +16,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log' import Constants from '../common/constants' import service, {UnlockResult, AuthType, AuthSubType} from '../model/screenLockService' +import {Callback} from 'basic'; const TAG = 'ScreenLock-BaseViewModel' const MINUTE_NM = '分钟' @@ -27,8 +28,6 @@ export {service, UnlockResult, AuthType, AuthSubType} export default class BaseViewModel { prompt: Resource | string; inhibitInput: boolean = false; - countdownHandle: number = -1; - freezingMillisecond: number = 0; constructor() { this.ViewModelInit() @@ -39,42 +38,42 @@ export default class BaseViewModel { this.prompt = $r('app.string.input'); } - countdown(callback) { + countdown() { Log.showInfo(TAG, `countdown`) - let promptText: Resource | string = ''; - this.freezingMillisecond -= Constants.INTERVAL; - Log.showInfo(TAG, `countdown freezingMillisecond:${this.freezingMillisecond}`) - if (this.freezingMillisecond > 0) { - promptText = this.getFreezingTimeNm(); - promptText += TRY_AGAIN; - } else { - Log.showInfo(TAG, `countdown clearInterval`) - clearInterval(this.countdownHandle) - this.countdownHandle = -1 - this.inhibitInput = false - promptText = $r('app.string.input'); - } - Log.showInfo(TAG, `countdown promptText:${promptText}`) - this.prompt = promptText; - this.updateStorage(callback) + service.getAuthProperty(AuthType.PIN, (properties) => { + let promptText: Resource | string = ''; + let freezingMillisecond = properties.freezingTime; + Log.showInfo(TAG, `countdown freezingMillisecond:${freezingMillisecond}`) + if (freezingMillisecond > 0) { + promptText = this.getFreezingTimeNm(freezingMillisecond); + promptText += TRY_AGAIN; + setTimeout(this.countdown.bind(this), Constants.INTERVAL) + } else { + Log.showInfo(TAG, `countdown clearInterval`) + this.inhibitInput = false + promptText = $r('app.string.input'); + } + Log.showInfo(TAG, `countdown promptText:${promptText}`) + this.prompt = promptText; + }) } - changePrompt(remainTimes, freezingTime, callback) { + changePrompt(remainTimes, freezingTime, callback: Callback) { Log.showInfo(TAG, `changePrompt remainTimes:${remainTimes} freezingTime:${freezingTime}`) let promptText: Resource | string = $r('app.string.incorrect'); - this.freezingMillisecond = freezingTime if (0 < remainTimes && remainTimes <= 2) { - if (!!this.freezingMillisecond && this.freezingMillisecond != 0) { - promptText = $r('app.string.incorrect_promp_freezing', remainTimes, this.getFreezingTimeNm()); + if (freezingTime > 0) { + let freezingTimeNm = this.getFreezingTimeNm(freezingTime) + promptText = $r('app.string.incorrect_promp_freezing', remainTimes, freezingTimeNm); } else { promptText = $r('app.string.incorrect_promp_times', remainTimes); } } else if (0 == remainTimes) { - if (!!this.freezingMillisecond && this.freezingMillisecond != 0) { + if (freezingTime > 0) { this.inhibitInput = true - promptText = $r('app.string.input_promp', this.getFreezingTimeNm()); - this.countdownHandle = setInterval(this.countdown.bind(this), Constants.INTERVAL, callback); + promptText = $r('app.string.input_promp', this.getFreezingTimeNm(freezingTime)); + setTimeout(this.countdown.bind(this), Constants.INTERVAL) } } this.prompt = promptText; @@ -84,11 +83,11 @@ export default class BaseViewModel { Log.showInfo(TAG, `changePrompt end`) } - getFreezingTimeNm(): string { + getFreezingTimeNm(freezingMillisecond: number): string { Log.showInfo(TAG, `getFreezingTimeNm start`) - let minute = Math.floor(this.freezingMillisecond / (60 * 1000)); + let minute = Math.floor(freezingMillisecond / (60 * 1000)); Log.showInfo(TAG, `getFreezingTimeNm minute:${minute}`) - let second = Math.round((this.freezingMillisecond % (60 * 1000)) / 1000); + let second = Math.round((freezingMillisecond % (60 * 1000)) / 1000); Log.showInfo(TAG, `getFreezingTimeNm second:${second}`) let timeName = ''; if (minute != 0) { @@ -106,14 +105,12 @@ export default class BaseViewModel { callback() } - checkFreezingTime(authType, callback?) { - let callBackFun = Function; - if (callback) callBackFun = callback; - service.getAuthProperty(authType, (properties) => { + checkFreezingTime(callback: Callback) { + service.getAuthProperty(AuthType.PIN, (properties) => { if (properties.freezingTime > 0) { this.inhibitInput = true //Clear the entered password - this.changePrompt(properties.remainTimes, properties.freezingTime, callBackFun) + this.changePrompt(properties.remainTimes, properties.freezingTime, callback) } }) } diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts index d2248d6f..3ff02956 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts @@ -15,10 +15,10 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log' import Constants from '../common/constants' -import BaseViewModel, {service, UnlockResult,AuthType, AuthSubType} from './baseViewModel' +import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' +import {Callback} from 'basic'; const TAG = 'ScreenLock-CustomPSDViewModel' -export {AuthType} export default class CustomPSDViewModel extends BaseViewModel { passwordArr: any[] = []; @@ -61,7 +61,7 @@ export default class CustomPSDViewModel extends BaseViewModel { Log.showInfo(TAG, 'onCallPhone'); } - onAuthPassword(callback) { + onAuthPassword(callback: Callback) { Log.showInfo(TAG, `onAuthPassword`); if (this.passwordArr.length == 0 || this.inhibitInput) { this.updateStorage(callback); diff --git a/features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ts deleted file mode 100644 index 714a1266..00000000 --- a/features/screenlock/src/main/ets/com/ohos/vm/dateTimeViewModel.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' -import DateTimeCommon from '../../../../../../../../common/src/main/ets/default/DateTimeCommon' -import Constants from '../common/constants' -import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon' -import ScreenLockModel from '../model/screenLockModel' - -const TAG = 'ScreenLock-DateTimeViewModel' - -/** - * DateTimeViewModel class - */ -export default class DateTimeViewModel { - timeVal: string = '' - dateVal: any = {} - weekVal: any = {} - setDateTimeHandle: number = -1 - isUsing24hFormat: boolean= false - - ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); - - this.setDateTime.bind(this)() - this.setDateTimeHandle = setInterval(this.setDateTime.bind(this), Constants.INTERVAL); - Log.showInfo(TAG, 'ViewModelInit end'); - } - - setDateTime() { - Log.showInfo(TAG, `setDateTime`) - this.timeVal = DateTimeCommon.getSystemTime(this.isUsing24hFormat) - this.dateVal = DateTimeCommon.getSystemDate() - this.weekVal = DateTimeCommon.getSystemWeek() - } - - stopPolling() { - Log.showInfo(TAG, `stopPolling start`) - Log.showInfo(TAG, `stopPolling setDateTimeHandle:${this.setDateTimeHandle}`); - if (this.setDateTimeHandle > 0) { - clearInterval(this.setDateTimeHandle) - this.setDateTimeHandle = -1 - Log.showInfo(TAG, `stopPolling setDateTimeHandle new :${this.setDateTimeHandle}`); - } - Log.showInfo(TAG, `stopPolling end`) - } - - onStatusChange(lockStatus: ScreenLockStatus): void { - Log.showInfo(TAG, `onStatusChange lockStatus:${lockStatus}`); - Log.showInfo(TAG, `onStatusChange setDateTimeHandle:${this.setDateTimeHandle}`); - if (lockStatus == ScreenLockStatus.Locking) { - if (this.setDateTimeHandle <= 0) { - this.setDateTimeHandle = setInterval(this.setDateTime.bind(this), Constants.INTERVAL); - Log.showInfo(TAG, `onStatusChange setDateTimeHandle new:${this.setDateTimeHandle}`); - } - } else { - this.stopPolling(); - } - } -} diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts index 4ad5e7ec..e83bf679 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -15,15 +15,13 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log' import Constants from '../common/constants' -import BaseViewModel, {service, UnlockResult, AuthType, AuthSubType} from './baseViewModel' +import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' +import {Callback} from 'basic'; const TAG = 'ScreenLock-DigitalPSDViewModel' const PW_LEN = 6 - -export {AuthType} - export default class DigitalPSDViewModel extends BaseViewModel { password: number[]= [] passwdMaskArr: any[]; @@ -39,7 +37,7 @@ export default class DigitalPSDViewModel extends BaseViewModel { super.ViewModelInit(); } - onKeyPress(index, callback) { + onKeyPress(index, callback: Callback) { Log.showInfo(TAG, `onKeyPress start param: ${index}`) let keyValue = this.numKeyboard[index].value; if (keyValue >= 0 && !this.inhibitInput) { diff --git a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts index 33ac3c69..215cdb79 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts @@ -14,10 +14,10 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log' -import BaseViewModel, {service, UnlockResult,AuthType, AuthSubType} from './baseViewModel' +import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' +import {Callback} from 'basic'; const TAG = 'ScreenLock-MixedPSDViewModel' -export {AuthType} export default class MixedPSDViewModel extends BaseViewModel { password: string= ''; @@ -40,7 +40,7 @@ export default class MixedPSDViewModel extends BaseViewModel { Log.showInfo(TAG, 'onCallPhone'); } - onAuthPassword(callback) { + onAuthPassword(callback: Callback) { Log.showInfo(TAG, `onAuthPassword`); if (!this.password || this.inhibitInput) { callback(); diff --git a/features/screenlock/src/main/ets/components/MainPage/MainPage.ets b/features/screenlock/src/main/ets/components/MainPage/MainPage.ets new file mode 100644 index 00000000..0f540304 --- /dev/null +++ b/features/screenlock/src/main/ets/components/MainPage/MainPage.ets @@ -0,0 +1,17 @@ +@Entry +@Component +export struct MainPage { + @State message: string = 'Hello World' + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + } + .height('100%') + } +} diff --git a/features/screenlock/src/main/module.json5 b/features/screenlock/src/main/module.json5 new file mode 100644 index 00000000..21e2f167 --- /dev/null +++ b/features/screenlock/src/main/module.json5 @@ -0,0 +1,11 @@ +{ + "module": { + "name": "screenlock", + "type": "har", + "deviceTypes": [ + "phone", + "tablet" + ], + "uiSyntax": "ets" + } +} diff --git a/features/shortcutcomponent/.gitignore b/features/shortcutcomponent/.gitignore new file mode 100644 index 00000000..4f9a9738 --- /dev/null +++ b/features/shortcutcomponent/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.preview +/build \ No newline at end of file diff --git a/features/shortcutcomponent/build-profile.json5 b/features/shortcutcomponent/build-profile.json5 new file mode 100644 index 00000000..35dff6d5 --- /dev/null +++ b/features/shortcutcomponent/build-profile.json5 @@ -0,0 +1,5 @@ +{ + "apiType": "stageMode", + "buildOption": { + } +} diff --git a/features/shortcutcomponent/build.gradle b/features/shortcutcomponent/build.gradle deleted file mode 100644 index 390462f7..00000000 --- a/features/shortcutcomponent/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - implementation project(':common') -} diff --git a/features/shortcutcomponent/hvigorfile.js b/features/shortcutcomponent/hvigorfile.js new file mode 100644 index 00000000..42ed4b4a --- /dev/null +++ b/features/shortcutcomponent/hvigorfile.js @@ -0,0 +1,3 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks + diff --git a/features/shortcutcomponent/index.ets b/features/shortcutcomponent/index.ets new file mode 100644 index 00000000..1bb64ac2 --- /dev/null +++ b/features/shortcutcomponent/index.ets @@ -0,0 +1 @@ +export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/shortcutcomponent/package-lock.json b/features/shortcutcomponent/package-lock.json new file mode 100644 index 00000000..fef5628d --- /dev/null +++ b/features/shortcutcomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/shortcutcomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/shortcutcomponent/package.json b/features/shortcutcomponent/package.json new file mode 100644 index 00000000..3c45ae0b --- /dev/null +++ b/features/shortcutcomponent/package.json @@ -0,0 +1,14 @@ +{ + "license": "ISC", + "types": "", + "devDependencies": {}, + "name": "@ohos/shortcutcomponent", + "description": "a npm package which contains arkUI2.0 page", + "ohos": { + "org": "" + }, + "main": "index.ets", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} diff --git a/features/shortcutcomponent/src/main/config.json b/features/shortcutcomponent/src/main/config.json deleted file mode 100644 index 7c44dd34..00000000 --- a/features/shortcutcomponent/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.screenlock", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.screenlock.shortcutcomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "shortcutcomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets b/features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets new file mode 100644 index 00000000..0f540304 --- /dev/null +++ b/features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets @@ -0,0 +1,17 @@ +@Entry +@Component +export struct MainPage { + @State message: string = 'Hello World' + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + } + .height('100%') + } +} diff --git a/features/shortcutcomponent/src/main/module.json5 b/features/shortcutcomponent/src/main/module.json5 new file mode 100644 index 00000000..08e77959 --- /dev/null +++ b/features/shortcutcomponent/src/main/module.json5 @@ -0,0 +1,11 @@ +{ + "module": { + "name": "shortcutcomponent", + "type": "har", + "deviceTypes": [ + "phone", + "tablet" + ], + "uiSyntax": "ets" + } +} diff --git a/features/signalcomponent/.gitignore b/features/signalcomponent/.gitignore index c795b054..4f9a9738 100644 --- a/features/signalcomponent/.gitignore +++ b/features/signalcomponent/.gitignore @@ -1 +1,3 @@ -build \ No newline at end of file +/node_modules +/.preview +/build \ No newline at end of file diff --git a/features/signalcomponent/build-profile.json5 b/features/signalcomponent/build-profile.json5 new file mode 100644 index 00000000..35dff6d5 --- /dev/null +++ b/features/signalcomponent/build-profile.json5 @@ -0,0 +1,5 @@ +{ + "apiType": "stageMode", + "buildOption": { + } +} diff --git a/features/signalcomponent/build.gradle b/features/signalcomponent/build.gradle deleted file mode 100644 index ae402d92..00000000 --- a/features/signalcomponent/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} \ No newline at end of file diff --git a/features/signalcomponent/hvigorfile.js b/features/signalcomponent/hvigorfile.js new file mode 100644 index 00000000..42ed4b4a --- /dev/null +++ b/features/signalcomponent/hvigorfile.js @@ -0,0 +1,3 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks + diff --git a/features/signalcomponent/index.ets b/features/signalcomponent/index.ets new file mode 100644 index 00000000..1bb64ac2 --- /dev/null +++ b/features/signalcomponent/index.ets @@ -0,0 +1 @@ +export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/signalcomponent/package-lock.json b/features/signalcomponent/package-lock.json new file mode 100644 index 00000000..8782c092 --- /dev/null +++ b/features/signalcomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/signalcomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/signalcomponent/package.json b/features/signalcomponent/package.json new file mode 100644 index 00000000..321952a0 --- /dev/null +++ b/features/signalcomponent/package.json @@ -0,0 +1,14 @@ +{ + "license": "ISC", + "types": "", + "devDependencies": {}, + "name": "@ohos/signalcomponent", + "description": "a npm package which contains arkUI2.0 page", + "ohos": { + "org": "" + }, + "main": "index.ets", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} diff --git a/features/signalcomponent/src/main/config.json b/features/signalcomponent/src/main/config.json deleted file mode 100644 index 051c1f42..00000000 --- a/features/signalcomponent/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.signalcomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "signalcomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/components/MainPage/MainPage.ets b/features/signalcomponent/src/main/ets/components/MainPage/MainPage.ets new file mode 100644 index 00000000..0f540304 --- /dev/null +++ b/features/signalcomponent/src/main/ets/components/MainPage/MainPage.ets @@ -0,0 +1,17 @@ +@Entry +@Component +export struct MainPage { + @State message: string = 'Hello World' + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + } + .height('100%') + } +} diff --git a/features/signalcomponent/src/main/module.json5 b/features/signalcomponent/src/main/module.json5 new file mode 100644 index 00000000..6552c5dd --- /dev/null +++ b/features/signalcomponent/src/main/module.json5 @@ -0,0 +1,11 @@ +{ + "module": { + "name": "signalcomponent", + "type": "har", + "deviceTypes": [ + "phone", + "tablet" + ], + "uiSyntax": "ets" + } +} diff --git a/features/wallpapercomponent/.gitignore b/features/wallpapercomponent/.gitignore new file mode 100644 index 00000000..4f9a9738 --- /dev/null +++ b/features/wallpapercomponent/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.preview +/build \ No newline at end of file diff --git a/features/wallpapercomponent/build-profile.json5 b/features/wallpapercomponent/build-profile.json5 new file mode 100644 index 00000000..35dff6d5 --- /dev/null +++ b/features/wallpapercomponent/build-profile.json5 @@ -0,0 +1,5 @@ +{ + "apiType": "stageMode", + "buildOption": { + } +} diff --git a/features/wallpapercomponent/build.gradle b/features/wallpapercomponent/build.gradle deleted file mode 100644 index 390462f7..00000000 --- a/features/wallpapercomponent/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - implementation project(':common') -} diff --git a/features/wallpapercomponent/hvigorfile.js b/features/wallpapercomponent/hvigorfile.js new file mode 100644 index 00000000..42ed4b4a --- /dev/null +++ b/features/wallpapercomponent/hvigorfile.js @@ -0,0 +1,3 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks + diff --git a/features/wallpapercomponent/index.ets b/features/wallpapercomponent/index.ets new file mode 100644 index 00000000..1bb64ac2 --- /dev/null +++ b/features/wallpapercomponent/index.ets @@ -0,0 +1 @@ +export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/wallpapercomponent/package-lock.json b/features/wallpapercomponent/package-lock.json new file mode 100644 index 00000000..0556d065 --- /dev/null +++ b/features/wallpapercomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/wallpapercomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/wallpapercomponent/package.json b/features/wallpapercomponent/package.json new file mode 100644 index 00000000..a9b279f1 --- /dev/null +++ b/features/wallpapercomponent/package.json @@ -0,0 +1,14 @@ +{ + "license": "ISC", + "types": "", + "devDependencies": {}, + "name": "@ohos/wallpapercomponent", + "description": "a npm package which contains arkUI2.0 page", + "ohos": { + "org": "" + }, + "main": "index.ets", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} diff --git a/features/wallpapercomponent/src/main/config.json b/features/wallpapercomponent/src/main/config.json deleted file mode 100644 index 8183c58b..00000000 --- a/features/wallpapercomponent/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.screenlock", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.screenlock.wallpapercomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "wallpapercomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets b/features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets new file mode 100644 index 00000000..0f540304 --- /dev/null +++ b/features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets @@ -0,0 +1,17 @@ +@Entry +@Component +export struct MainPage { + @State message: string = 'Hello World' + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + } + .height('100%') + } +} diff --git a/features/wallpapercomponent/src/main/module.json5 b/features/wallpapercomponent/src/main/module.json5 new file mode 100644 index 00000000..6c741cda --- /dev/null +++ b/features/wallpapercomponent/src/main/module.json5 @@ -0,0 +1,11 @@ +{ + "module": { + "name": "wallpapercomponent", + "type": "har", + "deviceTypes": [ + "phone", + "tablet" + ], + "uiSyntax": "ets" + } +} diff --git a/features/wallpapercomponent/src/main/resources/base/element/string.json b/features/wallpapercomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..1e76de0c --- /dev/null +++ b/features/wallpapercomponent/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "page_show", + "value": "page from npm package" + } + ] +} diff --git a/features/wificomponent/.gitignore b/features/wificomponent/.gitignore index c795b054..4f9a9738 100644 --- a/features/wificomponent/.gitignore +++ b/features/wificomponent/.gitignore @@ -1 +1,3 @@ -build \ No newline at end of file +/node_modules +/.preview +/build \ No newline at end of file diff --git a/features/wificomponent/build-profile.json5 b/features/wificomponent/build-profile.json5 new file mode 100644 index 00000000..35dff6d5 --- /dev/null +++ b/features/wificomponent/build-profile.json5 @@ -0,0 +1,5 @@ +{ + "apiType": "stageMode", + "buildOption": { + } +} diff --git a/features/wificomponent/build.gradle b/features/wificomponent/build.gradle deleted file mode 100644 index ae402d92..00000000 --- a/features/wificomponent/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} \ No newline at end of file diff --git a/features/wificomponent/hvigorfile.js b/features/wificomponent/hvigorfile.js new file mode 100644 index 00000000..42ed4b4a --- /dev/null +++ b/features/wificomponent/hvigorfile.js @@ -0,0 +1,3 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks + diff --git a/features/wificomponent/index.ets b/features/wificomponent/index.ets new file mode 100644 index 00000000..1bb64ac2 --- /dev/null +++ b/features/wificomponent/index.ets @@ -0,0 +1 @@ +export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/wificomponent/package-lock.json b/features/wificomponent/package-lock.json new file mode 100644 index 00000000..a2feca7a --- /dev/null +++ b/features/wificomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/wificomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/wificomponent/package.json b/features/wificomponent/package.json new file mode 100644 index 00000000..884c8bd0 --- /dev/null +++ b/features/wificomponent/package.json @@ -0,0 +1,14 @@ +{ + "license": "ISC", + "types": "", + "devDependencies": {}, + "name": "@ohos/wificomponent", + "description": "a npm package which contains arkUI2.0 page", + "ohos": { + "org": "" + }, + "main": "index.ets", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} diff --git a/features/wificomponent/src/main/config.json b/features/wificomponent/src/main/config.json deleted file mode 100644 index 29c6ccec..00000000 --- a/features/wificomponent/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.wificomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "wificomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/components/MainPage/MainPage.ets b/features/wificomponent/src/main/ets/components/MainPage/MainPage.ets new file mode 100644 index 00000000..0f540304 --- /dev/null +++ b/features/wificomponent/src/main/ets/components/MainPage/MainPage.ets @@ -0,0 +1,17 @@ +@Entry +@Component +export struct MainPage { + @State message: string = 'Hello World' + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + } + .height('100%') + } +} diff --git a/features/wificomponent/src/main/module.json5 b/features/wificomponent/src/main/module.json5 new file mode 100644 index 00000000..ead4df09 --- /dev/null +++ b/features/wificomponent/src/main/module.json5 @@ -0,0 +1,11 @@ +{ + "module": { + "name": "wificomponent", + "type": "har", + "deviceTypes": [ + "phone", + "tablet" + ], + "uiSyntax": "ets" + } +} diff --git a/features/wificomponent/src/main/resources/base/element/string.json b/features/wificomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..1e76de0c --- /dev/null +++ b/features/wificomponent/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "page_show", + "value": "page from npm package" + } + ] +} diff --git a/figures/screenlock.png b/figures/screenlock.png deleted file mode 100644 index 0ee29b696ec2ce14e9179ffd5595618c7ac7004a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27998 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 62bd9b9c..00000000 --- a/gradlew.bat +++ /dev/null @@ -1,103 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/hvigorfile.js b/hvigorfile.js new file mode 100644 index 00000000..5f2735e3 --- /dev/null +++ b/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').appTasks \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..4b3e412b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1657 @@ +{ + "name": "screenlock", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/hvigor": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.0.6.tgz", + "integrity": "sha512-jjp7vpvUOMW1Nf7TdyhOtonwWHoSyBJLUiZTQqIx/GJV4UJyIqsiURUOqFwncQ4L7PDdeHuWly4uEelknYeWhg==", + "requires": { + "@ohos/hvigor-base": "1.0.6", + "interpret": "1.4.0", + "liftoff": "4.0.0", + "mute-stdout": "1.0.0", + "pretty-hrtime": "1.0.0", + "v8flags": "3.2.0", + "yargs": "7.1.0" + } + }, + "@ohos/hvigor-base": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.0.6.tgz", + "integrity": "sha512-cRDnWICTxmpNiFb9clIioqP5Oik1seLCICztXVhZqultrHuxwTheCRUZrHwlpyWdkSB2Al+FFBqmSwzIgZX4IQ==", + "requires": { + "json5": "2.2.0", + "log4js": "6.4.1", + "undertaker": "1.2.1" + } + }, + "@ohos/hvigor-ohos-plugin": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.0.6.tgz", + "integrity": "sha512-MAAi8uJxMzODUoSSNfBr+fU4HQ20dfQtkje9I+X4asc7qY2kAplW/q9f5XS8IOvv8zhC8OcSgsAXOAJuLMstOQ==", + "requires": { + "@ohos/hvigor-base": "1.0.6", + "@ohos/sdkmanager-common": "1.1.3", + "ajv": "8.10.0", + "archiver": "5.3.0", + "execa": "5.1.1", + "fs-extra": "10.0.0", + "glob": "7.2.0", + "iconv-lite": "0.6.3", + "json5": "2.2.0", + "lodash": "4.17.21", + "pretty-hrtime": "1.0.3", + "resolve-package-path": "4.0.3" + }, + "dependencies": { + "fs-extra": { + "version": "10.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + } + } + }, + "@ohos/sdkmanager-common": { + "version": "1.1.3", + "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-1.1.3.tgz", + "integrity": "sha512-d2uhVauDDJZIUvyyaWWoavG4N/jLyfF5IH5kEXKV6R8HNf3606H1zDQzA+UZtOfwwJFXhD9djRjnVFNB8xc7aw==" + }, + "ajv": { + "version": "8.10.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "archiver": { + "version": "5.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/archiver/-/archiver-5.3.0.tgz", + "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.0", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "requires": { + "is-number": "^4.0.0" + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "async": { + "version": "3.2.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "requires": { + "async-done": "^1.2.2" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://repo.huaweicloud.com/repository/npm/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://repo.huaweicloud.com/repository/npm/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "crc-32": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/crc-32/-/crc-32-1.2.1.tgz", + "integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.3.1" + } + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "date-format": { + "version": "4.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/date-format/-/date-format-4.0.6.tgz", + "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.59", + "resolved": "https://repo.huaweicloud.com/repository/npm/es5-ext/-/es5-ext-0.10.59.tgz", + "integrity": "sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "5.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + } + }, + "flagged-respawn": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==" + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "hypium": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/hypium/-/hypium-1.0.0.tgz", + "integrity": "sha512-nl+RQVv2AU/5FvFRhsXyWO5wh+2huhdqRZ3bszBWZzW+kpNI3AT4ydvVRYIfaQbYwV4UlX/rSc7BtFjLAezhow==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://repo.huaweicloud.com/repository/npm/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "4.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "liftoff": { + "version": "4.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "requires": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "object.map": "^1.0.1", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "log4js": { + "version": "6.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "requires": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stdout": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=" + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "requires": { + "once": "^1.3.2" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pretty-hrtime": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz", + "integrity": "sha1-9ualItPmBwRSK/Db5oVu0g515Nw=" + }, + "printj": { + "version": "1.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/printj/-/printj-1.3.1.tgz", + "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-glob": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "requires": { + "resolve": "^1.20.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-package-path": { + "version": "4.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-package-path/-/resolve-package-path-4.0.3.tgz", + "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==", + "requires": { + "path-root": "^0.1.1" + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" + }, + "streamroller": { + "version": "3.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/streamroller/-/streamroller-3.0.6.tgz", + "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "requires": { + "date-format": "^4.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + }, + "dependencies": { + "is-number": { + "version": "7.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + } + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..774d59b8 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "license":"ISC", + "devDependencies":{}, + "name":"screenlock", + "ohos":{ + "org":"huawei", + "directoryLevel":"project", + "buildTool":"hvigor" + }, + "description":"example description", + "repository":{}, + "version":"1.0.0", + "dependencies":{ + "@ohos/hvigor-ohos-plugin":"1.0.6", + "hypium":"^1.0.0", + "@ohos/hvigor":"1.0.6" + } +} \ No newline at end of file diff --git a/product/pc/.gitignore b/product/pc/.gitignore new file mode 100644 index 00000000..4f9a9738 --- /dev/null +++ b/product/pc/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.preview +/build \ No newline at end of file diff --git a/product/pc/build-profile.json5 b/product/pc/build-profile.json5 new file mode 100644 index 00000000..7dc37bb9 --- /dev/null +++ b/product/pc/build-profile.json5 @@ -0,0 +1,13 @@ +{ + "apiType": 'stageMode', + "buildOption": { + }, + "targets": [ + { + "name": "default", + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/product/pc/hvigorfile.js b/product/pc/hvigorfile.js new file mode 100644 index 00000000..d7720ee6 --- /dev/null +++ b/product/pc/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/product/pc/package-lock.json b/product/pc/package-lock.json new file mode 100644 index 00000000..5293cb93 --- /dev/null +++ b/product/pc/package-lock.json @@ -0,0 +1,38 @@ +{ + "name": "pc", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/batterycomponent": { + "version": "file:../../features/batterycomponent" + }, + "@ohos/clockcomponent": { + "version": "file:../../features/clockcomponent" + }, + "@ohos/common": { + "version": "file:../../common" + }, + "@ohos/datetimecomponent": { + "version": "file:../../features/datetimecomponent" + }, + "@ohos/noticeitem": { + "version": "file:../../features/noticeitem" + }, + "@ohos/screenlock": { + "version": "file:../../features/screenlock" + }, + "@ohos/shortcutcomponent": { + "version": "file:../../features/shortcutcomponent" + }, + "@ohos/signalcomponent": { + "version": "file:../../features/signalcomponent" + }, + "@ohos/wallpapercomponent": { + "version": "file:../../features/wallpapercomponent" + }, + "@ohos/wificomponent": { + "version": "file:../../features/wificomponent" + } + } +} diff --git a/product/pc/package.json b/product/pc/package.json new file mode 100644 index 00000000..1bb1ae67 --- /dev/null +++ b/product/pc/package.json @@ -0,0 +1,25 @@ +{ + "license": "ISC", + "devDependencies": {}, + "name": "pc", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "description": "example description", + "repository": {}, + "version": "1.0.0", + "dependencies": { + "@ohos/wificomponent": "file:../../features/wificomponent", + "@ohos/screenlock": "file:../../features/screenlock", + "@ohos/signalcomponent": "file:../../features/signalcomponent", + "@ohos/clockcomponent": "file:../../features/clockcomponent", + "@ohos/datetimecomponent": "file:../../features/datetimecomponent", + "@ohos/batterycomponent": "file:../../features/batterycomponent", + "@ohos/common": "file:../../common", + "@ohos/noticeitem": "file:../../features/noticeitem", + "@ohos/shortcutcomponent": "file:../../features/shortcutcomponent", + "@ohos/wallpapercomponent": "file:../../features/wallpapercomponent" + } +} diff --git a/product/pc/src/main/ets/AbilityStage.ts b/product/pc/src/main/ets/Application/AbilityStage.ts similarity index 92% rename from product/pc/src/main/ets/AbilityStage.ts rename to product/pc/src/main/ets/Application/AbilityStage.ts index f9b1f6e2..7df13e65 100644 --- a/product/pc/src/main/ets/AbilityStage.ts +++ b/product/pc/src/main/ets/Application/AbilityStage.ts @@ -14,7 +14,7 @@ */ import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../common/src/main/ets/default/Log' const TAG = "ScreenLock-MainAbilityStage" diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 06d27e8c..0f08194a 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -50,10 +50,11 @@ class ServiceExtAbility extends ServiceExtension { } private async statusBarWindow() { + Log.showInfo(TAG, `statusBarWindow`); let dis = await display.getDefaultDisplay(); - Log.showInfo(TAG, `api8New onCreate, dis: ${JSON.stringify(dis)}`); + Log.showInfo(TAG, `getDefaultDisplay, dis: ${JSON.stringify(dis)}`); let rect; - if (dis.width > dis.height) { // Pad、PC horizontalScreen Mode + if (dis.width > dis.height) { // PadPC horizontalScreen Mode rect = { left: 0, top: 0, diff --git a/product/pc/src/main/ets/ServiceExtAbility/app.ets b/product/pc/src/main/ets/ServiceExtAbility/app.ets deleted file mode 100644 index 1eb4676f..00000000 --- a/product/pc/src/main/ets/ServiceExtAbility/app.ets +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../common/src/main/ets/default/Log'; - -const TAG = 'ScreenLock-App' - -export default { - onCreate() { - Log.showInfo(TAG, 'Application onCreate'); - }, - onDestroy() { - Log.showInfo(TAG, 'Application onDestroy'); - }, -} diff --git a/product/pc/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts b/product/pc/src/main/ets/common/StyleConfiguration.ts similarity index 84% rename from product/pc/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts rename to product/pc/src/main/ets/common/StyleConfiguration.ts index d4ba7d61..3fa9a07e 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts +++ b/product/pc/src/main/ets/common/StyleConfiguration.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; +import StyleManager from '../../../../../../common/src/main/ets/default/StyleManager'; +import Log from '../../../../../../common/src/main/ets/default/Log'; const TAG = 'Lock_StatusBar-StyleConfiguration'; diff --git a/product/pc/src/main/ets/ServiceExtAbility/common/StyleManager.ts b/product/pc/src/main/ets/common/StyleManager.ts similarity index 84% rename from product/pc/src/main/ets/ServiceExtAbility/common/StyleManager.ts rename to product/pc/src/main/ets/common/StyleManager.ts index b42a9515..0918bfe1 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/common/StyleManager.ts +++ b/product/pc/src/main/ets/common/StyleManager.ts @@ -13,13 +13,13 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import CommonStyleConfiguration from '../../../../../../../common/src/main/ets/default/StyleConfiguration'; -import BatteryStyleConfiguration from '../../../../../../../features/batterycomponent/src/main/ets/default/common/StyleConfiguration' -import WifiStyleConfiguration from '../../../../../../../features/wificomponent/src/main/ets/default/common/StyleConfiguration' -import SignalStyleConfiguration from '../../../../../../../features/signalcomponent/src/main/ets/default/common/StyleConfiguration' -import ClockStyleConfiguration from '../../../../../../../features/clockComponent/src/main/ets/default/common/StyleConfiguration'; +import Log from '../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import CommonStyleConfiguration from '../../../../../../common/src/main/ets/default/StyleConfiguration'; +import BatteryStyleConfiguration from '../../../../../../features/batterycomponent/src/main/ets/default/common/StyleConfiguration' +import WifiStyleConfiguration from '../../../../../../features/wificomponent/src/main/ets/default/common/StyleConfiguration' +import SignalStyleConfiguration from '../../../../../../features/signalcomponent/src/main/ets/default/common/StyleConfiguration' +import ClockStyleConfiguration from '../../../../../../features/clockcomponent/src/main/ets/default/common/StyleConfiguration'; import IndexStyleConfiguration from './StyleConfiguration' const TAG = 'Lock-StatusBar-StyleManager'; diff --git a/product/pc/src/main/ets/ServiceExtAbility/common/constants.ts b/product/pc/src/main/ets/common/constants.ts similarity index 100% rename from product/pc/src/main/ets/ServiceExtAbility/common/constants.ts rename to product/pc/src/main/ets/common/constants.ts diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/customPassword.ets b/product/pc/src/main/ets/pages/customPassword.ets similarity index 76% rename from product/pc/src/main/ets/ServiceExtAbility/pages/customPassword.ets rename to product/pc/src/main/ets/pages/customPassword.ets index 3f710526..961b8f92 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/customPassword.ets +++ b/product/pc/src/main/ets/pages/customPassword.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' -import CustomPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets' +import Log from '../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' +import CustomPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/customPSD' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets b/product/pc/src/main/ets/pages/customscreenlock.ets similarity index 92% rename from product/phone/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets rename to product/pc/src/main/ets/pages/customscreenlock.ets index 0f958475..514cb35e 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets +++ b/product/pc/src/main/ets/pages/customscreenlock.ets @@ -13,11 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-CustomScreenlock' -@Entry @Component export default struct CustomScreenlock { build() { diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets b/product/pc/src/main/ets/pages/digitalPassword.ets similarity index 76% rename from product/pc/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets rename to product/pc/src/main/ets/pages/digitalPassword.ets index 94eb455a..97751fcc 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets +++ b/product/pc/src/main/ets/pages/digitalPassword.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' -import DigitalPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets' +import Log from '../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' +import DigitalPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/index.ets b/product/pc/src/main/ets/pages/index.ets similarity index 77% rename from product/phone/src/main/ets/ServiceExtAbility/pages/index.ets rename to product/pc/src/main/ets/pages/index.ets index 844ec652..af48245b 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/index.ets +++ b/product/pc/src/main/ets/pages/index.ets @@ -13,14 +13,14 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import {LockStyleMode} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' +import Log from '../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import {LockStyleMode} from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' import ViewModel from '../vm/indexViewModel' -import SlideScreenLock from './slidescreenlock.ets' -import CustomScreenLock from './customscreenlock.ets' -import JournalScreenLock from './journalscreenlock.ets' +import SlideScreenLock from './slidescreenlock' +import CustomScreenLock from './customscreenlock' +import JournalScreenLock from './journalscreenlock' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' import Router from '@system.router'; @@ -32,17 +32,22 @@ const TAG = 'ScreenLock-Entry'; struct Index { @State mViewModel: ViewModel = new ViewModel() @State pageStatus: number = Constants.STATUS_ABOUT_TO_APPEAR - @State mHeightPx: number = 48 + @State mHeightPx: number = 0 + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR - this.mViewModel.ViewModelInit() - setAppBgColor('#00000000') + try { + setAppBgColor('#00000000') + } catch (error) { + Log.showInfo(TAG, `setAppBgColor error:` + JSON.stringify(error)); + } CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height StyleManager.setStyle() + this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR + this.mViewModel.ViewModelInit() } aboutToDisappear() { @@ -62,7 +67,7 @@ struct Index { this.pageStatus = Constants.STATUS_ON_PAGE_HIDE } - onBackPress():boolean { + onBackPress(): boolean { let length = Router.getLength() Log.showInfo(TAG, `onBackPress length: ${length}`) if (length > 1) { diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets b/product/pc/src/main/ets/pages/journalscreenlock.ets similarity index 92% rename from product/pc/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets rename to product/pc/src/main/ets/pages/journalscreenlock.ets index 8622e40e..e4359658 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets +++ b/product/pc/src/main/ets/pages/journalscreenlock.ets @@ -13,11 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-JournalScreenlock' -@Entry @Component export default struct JournalScreenlock { build() { diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets b/product/pc/src/main/ets/pages/mixedPassword.ets similarity index 77% rename from product/pc/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets rename to product/pc/src/main/ets/pages/mixedPassword.ets index 2f2f73f8..77e25deb 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets +++ b/product/pc/src/main/ets/pages/mixedPassword.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' -import MixedPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/MixedPSD.ets' +import Log from '../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' +import MixedPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/MixedPSD' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets b/product/pc/src/main/ets/pages/slidescreenlock.ets similarity index 81% rename from product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets rename to product/pc/src/main/ets/pages/slidescreenlock.ets index 94c89bc0..086df03e 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets +++ b/product/pc/src/main/ets/pages/slidescreenlock.ets @@ -13,21 +13,20 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import Accounts from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets' -import DateTime from '../../../../../../../features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets' -import BatterySoc from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets' -import LockIcon from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets' -import Wallpaper from '../../../../../../../features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets' -import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets' -import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' -import Shortcut from '../../../../../../../features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets' +import Log from '../../../../../../common/src/main/ets/default/Log' +import Accounts from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts' +import DateTime from '../../../../../../features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime' +import BatterySoc from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/batterySoc' +import LockIcon from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/lockIcon' +import Wallpaper from '../../../../../../features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper' +import NotificationListComponent from '../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent' +import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' +import Shortcut from '../../../../../../features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut' import Constants from '../common/constants' import ViewModel from '../vm/slideScreenLockViewModel' const TAG = 'ScreenLock-SlideScreenlock' -@Entry @Component export default struct SlideScreenlock { @State mViewModel: ViewModel = new ViewModel() diff --git a/product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ts b/product/pc/src/main/ets/vm/indexViewModel.ts similarity index 83% rename from product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ts rename to product/pc/src/main/ets/vm/indexViewModel.ts index c9d44dbd..9dd21fc2 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/vm/indexViewModel.ts +++ b/product/pc/src/main/ets/vm/indexViewModel.ts @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; +import Log from '../../../../../../common/src/main/ets/default/Log'; import ScreenlockStyle, {LockStyleMode -} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' -import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' +} from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' +import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' const TAG = 'ScreenLock-IndexViewModel' diff --git a/product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts similarity index 91% rename from product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts rename to product/pc/src/main/ets/vm/slideScreenLockViewModel.ts index 93f1aa96..9786ea2d 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts +++ b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import {ReadConfigFile} from '../../../../../../../common/src/main/ets/default/ScreenLockCommon' -import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' +import Log from '../../../../../../common/src/main/ets/default/Log'; +import {ReadConfigFile} from '../../../../../../common/src/main/ets/default/ScreenLockCommon' +import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' import Constants from '../common/constants' import {Callback} from 'basic'; diff --git a/product/pc/src/main/config.json b/product/pc/src/main/module.json5 similarity index 56% rename from product/pc/src/main/config.json rename to product/pc/src/main/module.json5 index 08a446d9..aeae5a37 100644 --- a/product/pc/src/main/config.json +++ b/product/pc/src/main/module.json5 @@ -1,32 +1,18 @@ { - "app": { - "bundleName": "com.ohos.screenlock", - "vendor": "ohos", - "singleton": true, - "version": { - "code": 2, - "name": "1.1" - } - }, - "deviceConfig": { - "default": { - "keepAlive": true - } - }, "module": { - "package": "com.ohos.screenlock", - "name": ".MyApplication", - "mainAbility": ".ServiceExtAbility", - "deviceType": [ + "name": "pc", + "type": "feature", + "srcEntrance": "./ets/Application/AbilityStage.ts", + "description": "$string:pc_desc", + "mainElement": "ServiceExtAbility", + "deviceTypes": [ "tablet" ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "pc", - "moduleType": "feature", - "installationFree": false - }, - "reqPermissions": [ + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "uiSyntax": "ets", + "requestPermissions": [ { "name": "ohos.permission.MANAGE_LOCAL_ACCOUNTS" }, @@ -85,36 +71,15 @@ "name": "ohos.permission.SET_WALLPAPER" } ], - "abilities": [ + "extensionAbilities": [ { - "label": "$string:app_name", - "launchType": "singleton", - "srcPath": "ServiceExtAbility", - "name": ".ServiceExtAbility", - "icon": "$media:icon", - "srcLanguage": "ets", - "description": "$string:description_mainability", - "type": "service", - "visible": true - } - ], - "js": [ - { - "mode": { - "syntax": "ets", - "type": "pageAbility" - }, - "pages": [ - "pages/index", - "pages/digitalPassword", - "pages/mixedPassword", - "pages/customPassword" - ], "name": "ServiceExtAbility", - "window": { - "designWidth": 720, - "autoDesignWidth": false - } + "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", + "description": "$string:MainAbility_desc", + "icon": "$media:icon", + "label": "$string:app_name", + "visible": true, + "type": "service" } ] } diff --git a/product/pc/src/main/resources/base/element/string.json b/product/pc/src/main/resources/base/element/string.json index baf627c4..f97e581a 100644 --- a/product/pc/src/main/resources/base/element/string.json +++ b/product/pc/src/main/resources/base/element/string.json @@ -1,11 +1,15 @@ { "string": [ + { + "name": "pc_desc", + "value": "description" + }, { "name": "app_name", "value": "ScreenLock" }, { - "name": "mainability_description", + "name": "MainAbility_desc", "value": "JS_Phone_Empty Feature Ability" }, { diff --git a/product/pc/src/main/resources/base/profile/main_pages.json b/product/pc/src/main/resources/base/profile/main_pages.json new file mode 100644 index 00000000..37cf7015 --- /dev/null +++ b/product/pc/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,8 @@ +{ + "src": [ + "pages/index", + "pages/digitalPassword", + "pages/mixedPassword", + "pages/customPassword" + ] +} diff --git a/product/phone/.gitignore b/product/phone/.gitignore new file mode 100644 index 00000000..4f9a9738 --- /dev/null +++ b/product/phone/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.preview +/build \ No newline at end of file diff --git a/product/phone/build-profile.json5 b/product/phone/build-profile.json5 new file mode 100644 index 00000000..7dc37bb9 --- /dev/null +++ b/product/phone/build-profile.json5 @@ -0,0 +1,13 @@ +{ + "apiType": 'stageMode', + "buildOption": { + }, + "targets": [ + { + "name": "default", + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/product/phone/hvigorfile.js b/product/phone/hvigorfile.js new file mode 100644 index 00000000..d7720ee6 --- /dev/null +++ b/product/phone/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/product/phone/package-lock.json b/product/phone/package-lock.json new file mode 100644 index 00000000..0c8c8498 --- /dev/null +++ b/product/phone/package-lock.json @@ -0,0 +1,38 @@ +{ + "name": "phone", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/batterycomponent": { + "version": "file:../../features/batterycomponent" + }, + "@ohos/clockcomponent": { + "version": "file:../../features/clockcomponent" + }, + "@ohos/common": { + "version": "file:../../common" + }, + "@ohos/datetimecomponent": { + "version": "file:../../features/datetimecomponent" + }, + "@ohos/noticeitem": { + "version": "file:../../features/noticeitem" + }, + "@ohos/screenlock": { + "version": "file:../../features/screenlock" + }, + "@ohos/shortcutcomponent": { + "version": "file:../../features/shortcutcomponent" + }, + "@ohos/signalcomponent": { + "version": "file:../../features/signalcomponent" + }, + "@ohos/wallpapercomponent": { + "version": "file:../../features/wallpapercomponent" + }, + "@ohos/wificomponent": { + "version": "file:../../features/wificomponent" + } + } +} diff --git a/product/phone/package.json b/product/phone/package.json new file mode 100644 index 00000000..0e97cee6 --- /dev/null +++ b/product/phone/package.json @@ -0,0 +1,25 @@ +{ + "license": "ISC", + "devDependencies": {}, + "name": "phone", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "description": "example description", + "repository": {}, + "version": "1.0.0", + "dependencies": { + "@ohos/wificomponent": "file:../../features/wificomponent", + "@ohos/screenlock": "file:../../features/screenlock", + "@ohos/signalcomponent": "file:../../features/signalcomponent", + "@ohos/clockcomponent": "file:../../features/clockcomponent", + "@ohos/datetimecomponent": "file:../../features/datetimecomponent", + "@ohos/batterycomponent": "file:../../features/batterycomponent", + "@ohos/common": "file:../../common", + "@ohos/noticeitem": "file:../../features/noticeitem", + "@ohos/shortcutcomponent": "file:../../features/shortcutcomponent", + "@ohos/wallpapercomponent": "file:../../features/wallpapercomponent" + } +} diff --git a/product/phone/src/main/ets/Application/AbilityStage.ts b/product/phone/src/main/ets/Application/AbilityStage.ts new file mode 100644 index 00000000..32dfe93c --- /dev/null +++ b/product/phone/src/main/ets/Application/AbilityStage.ts @@ -0,0 +1,7 @@ +import AbilityStage from "@ohos.application.AbilityStage" + +export default class MyAbilityStage extends AbilityStage { + onCreate() { + console.log("[Demo] MyAbilityStage onCreate") + } +} \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/app.ets b/product/phone/src/main/ets/ServiceExtAbility/app.ets deleted file mode 100644 index 1eb4676f..00000000 --- a/product/phone/src/main/ets/ServiceExtAbility/app.ets +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2021 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 Log from '../../../../../../common/src/main/ets/default/Log'; - -const TAG = 'ScreenLock-App' - -export default { - onCreate() { - Log.showInfo(TAG, 'Application onCreate'); - }, - onDestroy() { - Log.showInfo(TAG, 'Application onDestroy'); - }, -} diff --git a/product/phone/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts b/product/phone/src/main/ets/common/StyleConfiguration.ts similarity index 84% rename from product/phone/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts rename to product/phone/src/main/ets/common/StyleConfiguration.ts index d4ba7d61..3fa9a07e 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts +++ b/product/phone/src/main/ets/common/StyleConfiguration.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; +import StyleManager from '../../../../../../common/src/main/ets/default/StyleManager'; +import Log from '../../../../../../common/src/main/ets/default/Log'; const TAG = 'Lock_StatusBar-StyleConfiguration'; diff --git a/product/phone/src/main/ets/ServiceExtAbility/common/StyleManager.ts b/product/phone/src/main/ets/common/StyleManager.ts similarity index 89% rename from product/phone/src/main/ets/ServiceExtAbility/common/StyleManager.ts rename to product/phone/src/main/ets/common/StyleManager.ts index aa97f7ad..5a6c851f 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/common/StyleManager.ts +++ b/product/phone/src/main/ets/common/StyleManager.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import Log from '../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import IndexStyleConfiguration from './StyleConfiguration' const TAG = 'StatusBar-StyleManager'; diff --git a/product/phone/src/main/ets/ServiceExtAbility/common/constants.ts b/product/phone/src/main/ets/common/constants.ts similarity index 100% rename from product/phone/src/main/ets/ServiceExtAbility/common/constants.ts rename to product/phone/src/main/ets/common/constants.ts diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/customPassword.ets b/product/phone/src/main/ets/pages/customPassword.ets similarity index 77% rename from product/phone/src/main/ets/ServiceExtAbility/pages/customPassword.ets rename to product/phone/src/main/ets/pages/customPassword.ets index 7ad20cca..b5e4d779 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/customPassword.ets +++ b/product/phone/src/main/ets/pages/customPassword.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' -import CustomPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets' +import Log from '../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' +import CustomPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/customPSD' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets b/product/phone/src/main/ets/pages/customscreenlock.ets similarity index 92% rename from product/pc/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets rename to product/phone/src/main/ets/pages/customscreenlock.ets index 0f958475..514cb35e 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/customscreenlock.ets +++ b/product/phone/src/main/ets/pages/customscreenlock.ets @@ -13,11 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-CustomScreenlock' -@Entry @Component export default struct CustomScreenlock { build() { diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets b/product/phone/src/main/ets/pages/digitalPassword.ets similarity index 77% rename from product/phone/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets rename to product/phone/src/main/ets/pages/digitalPassword.ets index 42c14748..264e0257 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/digitalPassword.ets +++ b/product/phone/src/main/ets/pages/digitalPassword.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' -import DigitalPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets' +import Log from '../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' +import DigitalPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' diff --git a/product/pc/src/main/ets/ServiceExtAbility/pages/index.ets b/product/phone/src/main/ets/pages/index.ets similarity index 65% rename from product/pc/src/main/ets/ServiceExtAbility/pages/index.ets rename to product/phone/src/main/ets/pages/index.ets index 70a77120..51cfbeff 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/pages/index.ets +++ b/product/phone/src/main/ets/pages/index.ets @@ -13,14 +13,14 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import {LockStyleMode} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' +import Log from '../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import {LockStyleMode} from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' import ViewModel from '../vm/indexViewModel' -import SlideScreenLock from './slidescreenlock.ets' -import CustomScreenLock from './customscreenlock.ets' -import JournalScreenLock from './journalscreenlock.ets' +import SlideScreenLock from './slidescreenlock' +import CustomScreenLock from './customscreenlock' +import JournalScreenLock from './journalscreenlock' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' import Router from '@system.router'; @@ -32,18 +32,23 @@ const TAG = 'ScreenLock-Entry'; struct Index { @State mViewModel: ViewModel = new ViewModel() @State pageStatus: number = Constants.STATUS_ABOUT_TO_APPEAR - @State mHeightPx: number = 0 + @State mHeightPx: number = 48 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - setAppBgColor('#00000000') - CommonStyleManager.setAbilityPageName(TAG) - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') - Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) - this.mHeightPx = configInfo.height - StyleManager.setStyle() - this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR this.mViewModel.ViewModelInit() + this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR + try { + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + this.mHeightPx = configInfo.height + StyleManager.setStyle() + this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR + } catch (error) { + Log.showInfo(TAG, `set status error:` + JSON.stringify(error)); + } } aboutToDisappear() { @@ -63,7 +68,7 @@ struct Index { this.pageStatus = Constants.STATUS_ON_PAGE_HIDE } - onBackPress():boolean { + onBackPress(): boolean { let length = Router.getLength() Log.showInfo(TAG, `onBackPress length: ${length}`) if (length > 1) { @@ -77,7 +82,7 @@ struct Index { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { if (this.mViewModel.mode == LockStyleMode.SlideScreenLock) { // Slide of lock screen - SlideScreenLock({ pageStatus: this.pageStatus , mHeightPx:this.mHeightPx}) + SlideScreenLock({ pageStatus: this.pageStatus, mHeightPx: this.mHeightPx }) } else if (this.mViewModel.mode == LockStyleMode.JournalScreenLock) { JournalScreenLock() } else if (this.mViewModel.mode == LockStyleMode.CustomScreenLock) { diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets b/product/phone/src/main/ets/pages/journalscreenlock.ets similarity index 92% rename from product/phone/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets rename to product/phone/src/main/ets/pages/journalscreenlock.ets index 8622e40e..e4359658 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/journalscreenlock.ets +++ b/product/phone/src/main/ets/pages/journalscreenlock.ets @@ -13,11 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-JournalScreenlock' -@Entry @Component export default struct JournalScreenlock { build() { diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets b/product/phone/src/main/ets/pages/mixedPassword.ets similarity index 77% rename from product/phone/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets rename to product/phone/src/main/ets/pages/mixedPassword.ets index 85b8d975..611d4d80 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/mixedPassword.ets +++ b/product/phone/src/main/ets/pages/mixedPassword.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' -import MixedPSD from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/MixedPSD.ets' +import Log from '../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' +import MixedPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/MixedPSD' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' diff --git a/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets similarity index 83% rename from product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets rename to product/phone/src/main/ets/pages/slidescreenlock.ets index b69d2a02..2151567b 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -13,19 +13,18 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import Accounts from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets' -import DateTime from '../../../../../../../features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets' -import LockIcon from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets' -import Wallpaper from '../../../../../../../features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets' -import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets' -import StatusBar from '../../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets' +import Log from '../../../../../../common/src/main/ets/default/Log' +import Accounts from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts' +import DateTime from '../../../../../../features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime' +import LockIcon from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/lockIcon' +import Wallpaper from '../../../../../../features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper' +import NotificationListComponent from '../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent' +import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' import Constants from '../common/constants' import ViewModel from '../vm/slideScreenLockViewModel' const TAG = 'ScreenLock-SlideScreenlock' -@Entry @Component export default struct SlideScreenlock { @State mViewModel: ViewModel = new ViewModel() diff --git a/product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ts b/product/phone/src/main/ets/vm/indexViewModel.ts similarity index 84% rename from product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ts rename to product/phone/src/main/ets/vm/indexViewModel.ts index 8fc9c3e4..8e766de8 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/vm/indexViewModel.ts +++ b/product/phone/src/main/ets/vm/indexViewModel.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import ScreenlockStyle, {LockStyleMode} from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' -import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' +import Log from '../../../../../../common/src/main/ets/default/Log'; +import ScreenlockStyle, {LockStyleMode} from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' +import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' const TAG = 'ScreenLock-IndexViewModel' diff --git a/product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts similarity index 90% rename from product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts rename to product/phone/src/main/ets/vm/slideScreenLockViewModel.ts index a4cfed30..87d1cc91 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/vm/slideScreenLockViewModel.ts +++ b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import {ReadConfigFile} from '../../../../../../../common/src/main/ets/default/ScreenLockCommon' -import ScreenLockService from '../../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' +import Log from '../../../../../../common/src/main/ets/default/Log'; +import {ReadConfigFile} from '../../../../../../common/src/main/ets/default/ScreenLockCommon' +import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' import Constants from '../common/constants' import {Callback} from 'basic'; diff --git a/product/phone/src/main/config.json b/product/phone/src/main/module.json5 similarity index 56% rename from product/phone/src/main/config.json rename to product/phone/src/main/module.json5 index e427f5fb..f97d9d38 100644 --- a/product/phone/src/main/config.json +++ b/product/phone/src/main/module.json5 @@ -1,32 +1,18 @@ { - "app": { - "bundleName": "com.ohos.screenlock", - "vendor": "ohos", - "singleton": true, - "version": { - "code": 2, - "name": "1.1" - } - }, - "deviceConfig": { - "default": { - "keepAlive": true - } - }, "module": { - "package": "com.ohos.screenlock", - "name": ".MyApplication", - "mainAbility": ".ServiceExtAbility", - "deviceType": [ + "name": "phone", + "type": "feature", + "srcEntrance": "./ets/Application/AbilityStage.ts", + "description": "$string:phone_desc", + "mainElement": "ServiceExtAbility", + "deviceTypes": [ "phone" ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "phone", - "moduleType": "feature", - "installationFree": false - }, - "reqPermissions": [ + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "uiSyntax": "ets", + "requestPermissions": [ { "name": "ohos.permission.MANAGE_LOCAL_ACCOUNTS" }, @@ -85,36 +71,15 @@ "name": "ohos.permission.SET_WALLPAPER" } ], - "abilities": [ + "extensionAbilities": [ { - "label": "$string:app_name", - "launchType": "singleton", - "srcPath": "ServiceExtAbility", - "name": ".ServiceExtAbility", - "icon": "$media:icon", - "srcLanguage": "ets", - "description": "$string:description_mainability", - "type": "service", - "visible": true - } - ], - "js": [ - { - "mode": { - "syntax": "ets", - "type": "pageAbility" - }, - "pages": [ - "pages/index", - "pages/digitalPassword", - "pages/mixedPassword", - "pages/customPassword" - ], "name": "ServiceExtAbility", - "window": { - "designWidth": 720, - "autoDesignWidth": false - } + "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", + "description": "$string:MainAbility_desc", + "icon": "$media:icon", + "label": "$string:app_name", + "visible": true, + "type": "service" } ] } diff --git a/product/phone/src/main/resources/base/element/string.json b/product/phone/src/main/resources/base/element/string.json index ba1906b7..154373d9 100644 --- a/product/phone/src/main/resources/base/element/string.json +++ b/product/phone/src/main/resources/base/element/string.json @@ -1,11 +1,15 @@ { "string": [ + { + "name": "phone_desc", + "value": "description" + }, { "name": "app_name", "value": "ScreenLock" }, { - "name": "mainability_description", + "name": "MainAbility_desc", "value": "JS_Phone_Empty Feature Ability" }, { diff --git a/product/phone/src/main/resources/base/profile/main_pages.json b/product/phone/src/main/resources/base/profile/main_pages.json new file mode 100644 index 00000000..37cf7015 --- /dev/null +++ b/product/phone/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,8 @@ +{ + "src": [ + "pages/index", + "pages/digitalPassword", + "pages/mixedPassword", + "pages/customPassword" + ] +} diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 68cb7704..00000000 --- a/settings.gradle +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2021 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 ':entry', ':phone', ':pc', ':common', ':features:screenlock', - ':features:noticeitem', ':features:batterycomponent', - ':features:datetimecomponent', ':features:wallpapercomponent', ':features:shortcutcomponent', - ':features:clockcomponent', ':features:wificomponent', ':features:signalcomponent' -project(':phone').projectDir = new File('./product/phone') -project(':pc').projectDir = new File('./product/pc') \ No newline at end of file diff --git a/signature/screenlock.p7b b/signature/screenlock.p7b index 78b2f15abe87b6d4dec897ba496f8d9e8341a67b..6596e1b905e027b66c42dad68135d6a271eb47f3 100644 GIT binary patch delta 424 zcmaDSwOz)+po!0zjZ>@5qwPB{BRkWACO#FQkOC7Uqam*WHydX{n+IbmGYb==K@;m0 zghIvzO{_;*nph8RblA#LpO~CetYlTKl$eu~U!Izx3*kpAlLIHUU?}kP3vmr{bPkDkbPn^3G(;xaSc+6 z-TaB=4ST(bp_zfDfuV^>lz~3n!<;OJN-PQmUq8%XJvb%Iq2@*Sm#ZJ1+1JeSuhNse z@F}tQy7VFSasw_l4q#B8vt?msVsSTcWm0hc^VgwFY}Uew#?6y&8qS+G`IlYRp{X-$ zS^C1CsAUB|W>RGMaidwl;yugv-RYIVS1OtXH!Hn7XS$5}_=&Z@o0Sy=o;U&kmQ0iB delta 224 zcmdlk^G?dapouq&jZ>@5qwPB{BRkWACf;bEP&gAKqam*WHydX{n+IbmGYb==K@%&G z3scCrpo!%VOB2hFjSgE`Ht%D7$zE?{Xlh_=VrpO-WuOmN$jM@;#G)V+HDg*sdu9Bo z;(1dGV_F}tuUPc)>3{b->(73-d!s2n$AF8C18DL&TNY*}7Iy Date: Sun, 24 Apr 2022 10:17:47 +0800 Subject: [PATCH 064/373] signature Signed-off-by: zhuchengfeng <940848916@qq.com> --- signature/screenlock.p7b | Bin 3639 -> 3640 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/signature/screenlock.p7b b/signature/screenlock.p7b index 6596e1b905e027b66c42dad68135d6a271eb47f3..5c12ab6d37c56a46542a24539145897f9a54da86 100644 GIT binary patch delta 129 zcmV-{0Dk|s9Jm}8FoF&=1_>&LNQUK9l+kt_U(T zFfuVVF))*`4L?apFh&9)0EO{GK(%+%Z(dmY^PAZ$pEirMV`PXi&&LNQU=J(Kzjt_U$U zFgY+WG&Ga24L?XnFhv3&Mg09hb{3kUku!sn*)g7$llnet!j+gk1ddnaCTdgT0wDnS i*nCQE#1INg%`-3AO5adA$q%v3l -- Gitee From 68c197937cba26b0eed98a7cb634db754b901983 Mon Sep 17 00:00:00 2001 From: zhuchengfeng <940848916@qq.com> Date: Sun, 24 Apr 2022 10:49:16 +0800 Subject: [PATCH 065/373] signature Signed-off-by: zhuchengfeng <940848916@qq.com> --- OAT.xml | 6 ++++++ common/index.ets | 15 +++++++++++++++ .../src/main/ets/components/MainPage/MainPage.ets | 15 +++++++++++++++ entry/src/main/ets/Application/AbilityStage.ts | 15 +++++++++++++++ entry/src/main/ets/MainAbility/MainAbility.ts | 15 +++++++++++++++ entry/src/main/ets/pages/index.ets | 15 +++++++++++++++ features/batterycomponent/index.ets | 15 +++++++++++++++ .../src/main/ets/components/MainPage/MainPage.ets | 15 +++++++++++++++ features/clockcomponent/index.ets | 15 +++++++++++++++ .../src/main/ets/components/MainPage/MainPage.ets | 15 +++++++++++++++ features/datetimecomponent/index.ets | 15 +++++++++++++++ .../src/main/ets/components/MainPage/MainPage.ets | 15 +++++++++++++++ features/noticeitem/index.ets | 15 +++++++++++++++ .../src/main/ets/components/MainPage/MainPage.ets | 15 +++++++++++++++ features/screenlock/index.ets | 15 +++++++++++++++ .../src/main/ets/components/MainPage/MainPage.ets | 15 +++++++++++++++ features/shortcutcomponent/index.ets | 15 +++++++++++++++ .../src/main/ets/components/MainPage/MainPage.ets | 15 +++++++++++++++ features/signalcomponent/index.ets | 15 +++++++++++++++ .../src/main/ets/components/MainPage/MainPage.ets | 15 +++++++++++++++ features/wallpapercomponent/index.ets | 15 +++++++++++++++ .../src/main/ets/components/MainPage/MainPage.ets | 15 +++++++++++++++ .../src/main/ets/Application/AbilityStage.ts | 15 +++++++++++++++ 23 files changed, 336 insertions(+) diff --git a/OAT.xml b/OAT.xml index 9ce70fdb..07f6ce00 100644 --- a/OAT.xml +++ b/OAT.xml @@ -77,6 +77,12 @@ + + + + + + diff --git a/common/index.ets b/common/index.ets index 1bb64ac2..2cf6651f 100644 --- a/common/index.ets +++ b/common/index.ets @@ -1 +1,16 @@ +/* + * Copyright (c) 2021-2022 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 { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/common/src/main/ets/components/MainPage/MainPage.ets b/common/src/main/ets/components/MainPage/MainPage.ets index 0f540304..05e7347d 100644 --- a/common/src/main/ets/components/MainPage/MainPage.ets +++ b/common/src/main/ets/components/MainPage/MainPage.ets @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 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. + */ + @Entry @Component export struct MainPage { diff --git a/entry/src/main/ets/Application/AbilityStage.ts b/entry/src/main/ets/Application/AbilityStage.ts index 32dfe93c..ef2476ea 100644 --- a/entry/src/main/ets/Application/AbilityStage.ts +++ b/entry/src/main/ets/Application/AbilityStage.ts @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import AbilityStage from "@ohos.application.AbilityStage" export default class MyAbilityStage extends AbilityStage { diff --git a/entry/src/main/ets/MainAbility/MainAbility.ts b/entry/src/main/ets/MainAbility/MainAbility.ts index edb91307..220392de 100644 --- a/entry/src/main/ets/MainAbility/MainAbility.ts +++ b/entry/src/main/ets/MainAbility/MainAbility.ts @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import Ability from '@ohos.application.Ability' export default class MainAbility extends Ability { diff --git a/entry/src/main/ets/pages/index.ets b/entry/src/main/ets/pages/index.ets index d6ca48cf..f32a5a18 100644 --- a/entry/src/main/ets/pages/index.ets +++ b/entry/src/main/ets/pages/index.ets @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 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. + */ + @Entry @Component struct Index { diff --git a/features/batterycomponent/index.ets b/features/batterycomponent/index.ets index 1bb64ac2..2cf6651f 100644 --- a/features/batterycomponent/index.ets +++ b/features/batterycomponent/index.ets @@ -1 +1,16 @@ +/* + * Copyright (c) 2021-2022 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 { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/batterycomponent/src/main/ets/components/MainPage/MainPage.ets b/features/batterycomponent/src/main/ets/components/MainPage/MainPage.ets index 0f540304..05e7347d 100644 --- a/features/batterycomponent/src/main/ets/components/MainPage/MainPage.ets +++ b/features/batterycomponent/src/main/ets/components/MainPage/MainPage.ets @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 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. + */ + @Entry @Component export struct MainPage { diff --git a/features/clockcomponent/index.ets b/features/clockcomponent/index.ets index 1bb64ac2..2cf6651f 100644 --- a/features/clockcomponent/index.ets +++ b/features/clockcomponent/index.ets @@ -1 +1,16 @@ +/* + * Copyright (c) 2021-2022 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 { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/clockcomponent/src/main/ets/components/MainPage/MainPage.ets b/features/clockcomponent/src/main/ets/components/MainPage/MainPage.ets index 0f540304..05e7347d 100644 --- a/features/clockcomponent/src/main/ets/components/MainPage/MainPage.ets +++ b/features/clockcomponent/src/main/ets/components/MainPage/MainPage.ets @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 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. + */ + @Entry @Component export struct MainPage { diff --git a/features/datetimecomponent/index.ets b/features/datetimecomponent/index.ets index 1bb64ac2..2cf6651f 100644 --- a/features/datetimecomponent/index.ets +++ b/features/datetimecomponent/index.ets @@ -1 +1,16 @@ +/* + * Copyright (c) 2021-2022 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 { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets b/features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets index 0f540304..05e7347d 100644 --- a/features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets +++ b/features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 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. + */ + @Entry @Component export struct MainPage { diff --git a/features/noticeitem/index.ets b/features/noticeitem/index.ets index 1bb64ac2..2cf6651f 100644 --- a/features/noticeitem/index.ets +++ b/features/noticeitem/index.ets @@ -1 +1,16 @@ +/* + * Copyright (c) 2021-2022 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 { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/noticeitem/src/main/ets/components/MainPage/MainPage.ets b/features/noticeitem/src/main/ets/components/MainPage/MainPage.ets index 0f540304..05e7347d 100644 --- a/features/noticeitem/src/main/ets/components/MainPage/MainPage.ets +++ b/features/noticeitem/src/main/ets/components/MainPage/MainPage.ets @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 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. + */ + @Entry @Component export struct MainPage { diff --git a/features/screenlock/index.ets b/features/screenlock/index.ets index 1bb64ac2..2cf6651f 100644 --- a/features/screenlock/index.ets +++ b/features/screenlock/index.ets @@ -1 +1,16 @@ +/* + * Copyright (c) 2021-2022 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 { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/screenlock/src/main/ets/components/MainPage/MainPage.ets b/features/screenlock/src/main/ets/components/MainPage/MainPage.ets index 0f540304..05e7347d 100644 --- a/features/screenlock/src/main/ets/components/MainPage/MainPage.ets +++ b/features/screenlock/src/main/ets/components/MainPage/MainPage.ets @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 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. + */ + @Entry @Component export struct MainPage { diff --git a/features/shortcutcomponent/index.ets b/features/shortcutcomponent/index.ets index 1bb64ac2..2cf6651f 100644 --- a/features/shortcutcomponent/index.ets +++ b/features/shortcutcomponent/index.ets @@ -1 +1,16 @@ +/* + * Copyright (c) 2021-2022 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 { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets b/features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets index 0f540304..05e7347d 100644 --- a/features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets +++ b/features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 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. + */ + @Entry @Component export struct MainPage { diff --git a/features/signalcomponent/index.ets b/features/signalcomponent/index.ets index 1bb64ac2..2cf6651f 100644 --- a/features/signalcomponent/index.ets +++ b/features/signalcomponent/index.ets @@ -1 +1,16 @@ +/* + * Copyright (c) 2021-2022 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 { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/signalcomponent/src/main/ets/components/MainPage/MainPage.ets b/features/signalcomponent/src/main/ets/components/MainPage/MainPage.ets index 0f540304..05e7347d 100644 --- a/features/signalcomponent/src/main/ets/components/MainPage/MainPage.ets +++ b/features/signalcomponent/src/main/ets/components/MainPage/MainPage.ets @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 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. + */ + @Entry @Component export struct MainPage { diff --git a/features/wallpapercomponent/index.ets b/features/wallpapercomponent/index.ets index 1bb64ac2..2cf6651f 100644 --- a/features/wallpapercomponent/index.ets +++ b/features/wallpapercomponent/index.ets @@ -1 +1,16 @@ +/* + * Copyright (c) 2021-2022 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 { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets b/features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets index 0f540304..05e7347d 100644 --- a/features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets +++ b/features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 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. + */ + @Entry @Component export struct MainPage { diff --git a/product/phone/src/main/ets/Application/AbilityStage.ts b/product/phone/src/main/ets/Application/AbilityStage.ts index 32dfe93c..ef2476ea 100644 --- a/product/phone/src/main/ets/Application/AbilityStage.ts +++ b/product/phone/src/main/ets/Application/AbilityStage.ts @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import AbilityStage from "@ohos.application.AbilityStage" export default class MyAbilityStage extends AbilityStage { -- Gitee From 6425145ec114a7e57c27291f32fda36211ee8d29 Mon Sep 17 00:00:00 2001 From: zhuchengfeng <940848916@qq.com> Date: Sun, 24 Apr 2022 10:58:57 +0800 Subject: [PATCH 066/373] copyright Signed-off-by: zhuchengfeng <940848916@qq.com> --- features/wificomponent/index.ets | 15 +++++++++++++++ .../src/main/ets/components/MainPage/MainPage.ets | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/features/wificomponent/index.ets b/features/wificomponent/index.ets index 1bb64ac2..2cf6651f 100644 --- a/features/wificomponent/index.ets +++ b/features/wificomponent/index.ets @@ -1 +1,16 @@ +/* + * Copyright (c) 2021-2022 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 { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/features/wificomponent/src/main/ets/components/MainPage/MainPage.ets b/features/wificomponent/src/main/ets/components/MainPage/MainPage.ets index 0f540304..05e7347d 100644 --- a/features/wificomponent/src/main/ets/components/MainPage/MainPage.ets +++ b/features/wificomponent/src/main/ets/components/MainPage/MainPage.ets @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021-2022 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. + */ + @Entry @Component export struct MainPage { -- Gitee From bb40246da143d3c2a5a90ff9dca0012a9aaf3ffe Mon Sep 17 00:00:00 2001 From: r00498791 Date: Mon, 25 Apr 2022 20:39:39 +0800 Subject: [PATCH 067/373] API9 Signed-off-by: r00498791 --- .gitignore | 11 +- AppScope/app.json5 | 15 + AppScope/resources/base/element/string.json | 8 + AppScope/resources/base/media/app_icon.png | Bin 0 -> 6790 bytes build-profile.json5 | 113 + build.gradle | 48 - common/build-profile.json5 | 11 + .../default/app.ets => common/hvigorfile.js | 14 +- common/package-lock.json | 5 + common/package.json | 12 + common/src/main/config.json | 23 - .../default/abilitymanager/abilityManager.ts | 1 + .../PluginDataSourceAdapter.ts | 6 +- common/src/main/module.json5 | 10 + doc/Instructions.md | 2 +- entry/pc/.gitignore | 1 - entry/pc/build-profile.json5 | 11 + entry/pc/build.gradle | 12 - .../default/app.ets => entry/pc/hvigorfile.js | 14 +- entry/pc/package-lock.json | 5 + entry/pc/package.json | 12 +- .../src/main/ets/Application}/AbilityStage.ts | 2 +- .../pc/src/main/ets/ServiceExtAbility/app.ets | 24 - .../{ServiceExtAbility => }/pages/index.ets | 0 .../pc/src/main/{config.json => module.json5} | 51 +- .../resources/base/profile/main_pages.json | 5 + entry/phone/.gitignore | 1 - entry/phone/build-profile.json5 | 11 + entry/phone/build.gradle | 12 - .../app.ets => entry/phone/hvigorfile.js | 14 +- entry/phone/package-lock.json | 5 + entry/phone/package.json | 12 +- .../src/main/ets/Application}/AbilityStage.ts | 3 +- .../src/main/ets/ServiceExtAbility/app.ets | 24 - .../{ServiceExtAbility => }/pages/index.ets | 0 .../src/main/{config.json => module.json5} | 54 +- .../resources/base/profile/main_pages.json | 5 + features/airplanecomponent/.gitignore | 1 - .../airplanecomponent/build-profile.json5 | 11 + features/airplanecomponent/build.gradle | 19 - features/airplanecomponent/hvigorfile.js | 17 + features/airplanecomponent/package.json | 12 + .../airplanecomponent/src/main/config.json | 24 - .../airplanecomponent/src/main/module.json5 | 10 + features/autorotatecomponent/.gitignore | 1 - .../autorotatecomponent/build-profile.json5 | 11 + features/autorotatecomponent/build.gradle | 19 - features/autorotatecomponent/hvigorfile.js | 17 + features/autorotatecomponent/package.json | 12 + .../autorotatecomponent/src/main/config.json | 23 - .../autorotatecomponent/src/main/module.json5 | 10 + features/batterycomponent/.gitignore | 1 - features/batterycomponent/build-profile.json5 | 11 + features/batterycomponent/build.gradle | 19 - features/batterycomponent/hvigorfile.js | 17 + features/batterycomponent/package.json | 12 + .../batterycomponent/src/main/config.json | 23 - .../batterycomponent/src/main/module.json5 | 10 + features/bluetoothcomponent/.gitignore | 1 - .../bluetoothcomponent/build-profile.json5 | 11 + features/bluetoothcomponent/build.gradle | 19 - features/bluetoothcomponent/hvigorfile.js | 17 + features/bluetoothcomponent/package.json | 12 + .../bluetoothcomponent/src/main/config.json | 23 - .../bluetoothcomponent/src/main/module.json5 | 10 + features/brightnesscomponent/.gitignore | 1 - .../brightnesscomponent/build-profile.json5 | 11 + features/brightnesscomponent/build.gradle | 19 - features/brightnesscomponent/hvigorfile.js | 17 + features/brightnesscomponent/package.json | 12 + .../brightnesscomponent/src/main/config.json | 24 - .../brightnesscomponent/src/main/module.json5 | 10 + features/capsulecomponent/.gitignore | 1 - features/capsulecomponent/build-profile.json5 | 11 + features/capsulecomponent/build.gradle | 19 - features/capsulecomponent/hvigorfile.js | 17 + features/capsulecomponent/package-lock.json | 5 + features/capsulecomponent/package.json | 11 + .../capsulecomponent/src/main/config.json | 33 - .../ets/default/common/StyleConfiguration.ts | 2 +- .../ets/default/viewmodel/CapsuleViewModel.ts | 2 +- .../capsulecomponent/src/main/module.json5 | 10 + .../main/resources/base/element/color.json | 2 +- features/clockcomponent/.gitignore | 1 - features/clockcomponent/build-profile.json5 | 11 + features/clockcomponent/build.gradle | 19 - features/clockcomponent/hvigorfile.js | 17 + features/clockcomponent/package.json | 12 + features/clockcomponent/src/main/config.json | 23 - features/clockcomponent/src/main/module.json5 | 10 + features/controlcentercomponent/.gitignore | 1 - .../build-profile.json5 | 11 + features/controlcentercomponent/build.gradle | 26 - features/controlcentercomponent/hvigorfile.js | 17 + features/controlcentercomponent/package.json | 12 + .../src/main/config.json | 24 - .../com/ohos/model/ControlCenterService.ts | 6 +- .../com/ohos/pages/ControlCenterComponent.ets | 5 +- .../ets/com/ohos/viewmodel/ControlCenterVM.ts | 4 +- .../src/main/module.json5 | 10 + features/locationcomponent/.gitignore | 1 - .../locationcomponent/build-profile.json5 | 11 + features/locationcomponent/build.gradle | 19 - features/locationcomponent/hvigorfile.js | 17 + features/locationcomponent/package.json | 12 + .../locationcomponent/src/main/config.json | 23 - .../locationcomponent/src/main/module.json5 | 10 + features/managementcomponent/.gitignore | 1 - .../managementcomponent/build-profile.json5 | 11 + features/managementcomponent/build.gradle | 19 - features/managementcomponent/hvigorfile.js | 17 + features/managementcomponent/package.json | 12 + .../managementcomponent/src/main/config.json | 24 - .../ohos/view/component/appLstComponent.ets | 3 +- .../ohos/view/component/slotLstComponent.ets | 1 + .../ohos/view/component/switchComponent.ets | 2 +- .../managementcomponent/src/main/module.json5 | 10 + .../main/resources/base/element/float.json | 8 + features/navigationservice/.gitignore | 2 - .../navigationservice/build-profile.json5 | 11 + features/navigationservice/build.gradle | 20 - features/navigationservice/hvigorfile.js | 17 + features/navigationservice/package.json | 12 + .../navigationservice/src/main/config.json | 23 - .../navigationservice/src/main/module.json5 | 10 + features/noticeitem/.gitignore | 1 - features/noticeitem/build-profile.json5 | 11 + features/noticeitem/build.gradle | 19 - features/noticeitem/hvigorfile.js | 17 + features/noticeitem/package.json | 12 + features/noticeitem/src/main/config.json | 24 - .../view/NotificationListComponent.ets | 1 + .../view/item/bannerNotificationItem.ets | 4 +- .../noticeItem/view/item/confirmDialog.ets | 23 +- .../ohos/noticeItem/view/item/customItem.ets | 2 +- .../noticeItem/view/item/devicesDialog.ets | 1 + .../ohos/noticeItem/view/item/groupItem.ets | 1 + .../noticeItem/view/item/settingDialog.ets | 26 +- features/noticeitem/src/main/module.json5 | 10 + .../main/resources/base/element/float.json | 54 +- features/ringmodecomponent/.gitignore | 1 - .../ringmodecomponent/build-profile.json5 | 11 + features/ringmodecomponent/build.gradle | 19 - features/ringmodecomponent/hvigorfile.js | 17 + features/ringmodecomponent/package.json | 12 + .../ringmodecomponent/src/main/config.json | 23 - .../ringmodecomponent/src/main/module.json5 | 10 + .../main/resources/base/element/float.json | 3 +- features/signalcomponent/.gitignore | 1 - features/signalcomponent/build-profile.json5 | 11 + features/signalcomponent/build.gradle | 19 - features/signalcomponent/hvigorfile.js | 17 + features/signalcomponent/package.json | 12 + features/signalcomponent/src/main/config.json | 23 - .../src/main/ets/default/app.ets | 23 - .../signalcomponent/src/main/module.json5 | 10 + features/statusbarcomponent/.gitignore | 1 - .../statusbarcomponent/build-profile.json5 | 11 + features/statusbarcomponent/build.gradle | 28 - features/statusbarcomponent/hvigorfile.js | 17 + features/statusbarcomponent/package-lock.json | 5 + features/statusbarcomponent/package.json | 12 + .../statusbarcomponent/src/main/config.json | 24 - .../ets/com/ohos/model/StatusBarService.ts | 6 +- .../ets/com/ohos/pages/StatusBarComponent.ets | 9 +- .../ets/com/ohos/viewmodel/StatusBarVM.ts | 8 +- .../statusbarcomponent/src/main/module.json5 | 10 + features/volumecomponent/.gitignore | 1 - features/volumecomponent/build-profile.json5 | 11 + features/volumecomponent/build.gradle | 20 - features/volumecomponent/hvigorfile.js | 17 + features/volumecomponent/package.json | 12 + features/volumecomponent/src/main/config.json | 24 - .../src/main/ets/default/app.ets | 23 - .../volumecomponent/src/main/module.json5 | 10 + features/volumepanelcomponent/.gitignore | 1 - .../volumepanelcomponent/build-profile.json5 | 11 + features/volumepanelcomponent/build.gradle | 19 - features/volumepanelcomponent/hvigorfile.js | 17 + features/volumepanelcomponent/package.json | 12 + .../volumepanelcomponent/src/main/config.json | 23 - .../src/main/module.json5 | 10 + features/wificomponent/.gitignore | 1 - features/wificomponent/build-profile.json5 | 11 + features/wificomponent/build.gradle | 19 - features/wificomponent/hvigorfile.js | 17 + features/wificomponent/package.json | 12 + features/wificomponent/src/main/config.json | 23 - .../src/main/ets/default/app.ets | 23 - features/wificomponent/src/main/module.json5 | 10 + .../main/ets/default/app.ets => hvigorfile.js | 14 +- package-lock.json | 3982 +++++++++++++++++ package.json | 14 + product/default/navigationBar/.gitignore | 1 - .../default/navigationBar/build-profile.json5 | 11 + product/default/navigationBar/build.gradle | 16 - product/default/navigationBar/hvigorfile.js | 17 + .../default/navigationBar/package-lock.json | 11 + product/default/navigationBar/package.json | 14 +- .../navigationBar/src/main/config.json | 52 - .../ets/{ => Application}/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../src/main/ets/ServiceExtAbility/app.ets | 31 - .../common/NavBarConfiguration.ts | 4 +- .../common/StyleConfiguration.ts | 2 +- .../common/StyleManager.ts | 6 +- .../common/constants.ts | 0 .../common/utils/configReader.ts | 2 +- .../{ServiceExtAbility => }/i18n/en-US.json | 0 .../{ServiceExtAbility => }/i18n/zh-CN.json | 0 .../{ServiceExtAbility => }/pages/index.ets | 13 +- .../pages/keyButton.ets | 4 +- .../pages/oneLayout.ets | 4 +- .../pages/threeLayout.ets | 4 +- .../viewmodel/NavigationBarViewModel.ts | 12 +- .../navigationBar/src/main/module.json5 | 27 + .../resources/base/profile/main_pages.json | 5 + .../default/notificationmanagement/.gitignore | 1 - .../build-profile.json5 | 11 + .../notificationmanagement/build.gradle | 16 - .../notificationmanagement/hvigorfile.js | 17 + .../notificationmanagement/package-lock.json | 11 + .../notificationmanagement/package.json | 14 +- .../src/main/config.json | 58 - .../ets/{ => Application}/AbilityStage.ts | 2 +- .../src/main/ets/MainAbility/MainAbility.ts | 7 + .../src/main/ets/MainAbility/app.ets | 23 - .../ets/{MainAbility => }/common/constants.ts | 0 .../pages/batchSetEnable.ets | 14 +- .../ets/{MainAbility => }/pages/noDisturb.ets | 29 +- .../{MainAbility => }/pages/noDisturbPre.ets | 10 +- .../pages/notificationManagenment.ets | 18 +- .../ets/{MainAbility => }/pages/setEnable.ets | 12 +- .../{MainAbility => }/pages/slotSetting.ets | 12 +- .../vm/noDisturbViewModel.ts | 8 +- .../vm/notificationManagenmentViewModel.ts | 20 +- .../src/main/module.json5 | 27 + .../resources/base/profile/main_pages.json | 10 + product/default/volumepanel/.gitignore | 1 - .../default/volumepanel/build-profile.json5 | 11 + product/default/volumepanel/build.gradle | 16 - product/default/volumepanel/hvigorfile.js | 17 + product/default/volumepanel/package-lock.json | 11 + product/default/volumepanel/package.json | 14 +- .../default/volumepanel/src/main/config.json | 56 - .../ets/{ => Application}/AbilityStage.ts | 29 +- .../ets/ServiceExtAbility/pages/index.ets | 50 - .../main/ets}/common/StyleConfiguration.ts | 4 +- .../common/StyleManager.ts | 6 +- .../common/constants.ts | 0 .../app.ets => pages/index.ets} | 44 +- .../default/volumepanel/src/main/module.json5 | 27 + .../resources/base/profile/main_pages.json | 5 + product/pc/controlpanel/.gitignore | 1 - product/pc/controlpanel/build-profile.json5 | 11 + product/pc/controlpanel/build.gradle | 22 - product/pc/controlpanel/hvigorfile.js | 17 + product/pc/controlpanel/package-lock.json | 11 + product/pc/controlpanel/package.json | 14 +- product/pc/controlpanel/src/main/config.json | 67 - .../ets/{ => Application}/AbilityStage.ts | 2 +- .../src/main/ets/ServiceExtAbility/app.ets | 23 - .../pages/common/ControlCenterConfig.ts | 2 +- .../pages/common/StyleConfiguration.ts | 2 +- .../pages/common/StyleManager.ts | 14 +- .../pages/common/constants.ts | 0 .../{ServiceExtAbility => }/pages/control.ets | 7 +- .../{ServiceExtAbility => }/pages/index.ets | 16 +- .../ets}/workers/PluginDataSourceWorker.js | 6 +- product/pc/controlpanel/src/main/module.json5 | 40 + .../main/resources/base/element/color.json | 16 + .../main/resources/base/element/float.json | 52 + .../main/resources/base/element/string.json | 24 + .../main/resources/base/media/airplane.svg | 14 + .../main/resources/base/media/airplane_d.svg | 14 + .../base/media/ic_brightness_plus.svg | 12 + .../base/media/ic_brightness_reduce.svg | 12 + .../base/media/ic_controlcenter_bt.svg | 3 + .../base/media/ic_controlcenter_bt_d.svg | 3 + .../base/media/ic_controlcenter_gps.svg | 6 + .../ic_controlcenter_ring_off_filled.svg | 6 + .../media/ic_controlcenter_ring_on_filled.svg | 8 + .../ic_controlcenter_vibration_filled.svg | 10 + .../src/main/resources/base/media/wifi.svg | 6 + .../src/main/resources/base/media/wifi_d.svg | 6 + .../resources/base/profile/main_pages.json | 5 + .../main/resources/en_US/element/string.json | 24 + .../main/resources/zh_CN/element/string.json | 24 + product/pc/notificationpanel/.gitignore | 1 - .../pc/notificationpanel/build-profile.json5 | 11 + product/pc/notificationpanel/build.gradle | 15 - product/pc/notificationpanel/hvigorfile.js | 17 + .../pc/notificationpanel/package-lock.json | 11 + product/pc/notificationpanel/package.json | 14 +- .../pc/notificationpanel/src/main/config.json | 70 - .../ets/{ => Application}/AbilityStage.ts | 2 +- .../src/main/ets/ServiceExtAbility/app.ets | 23 - .../pages/bannerNotification.ets | 14 +- .../pages/common/StyleConfiguration.ts | 2 +- .../pages/common/StyleManager.ts | 6 +- .../pages/common/constants.ts | 0 .../{ServiceExtAbility => }/pages/index.ets | 10 +- .../pages/notification.ets | 10 +- .../notificationpanel/src/main/module.json5 | 40 + .../main/resources/base/element/float.json | 44 +- .../resources/base/profile/main_pages.json | 6 + product/pc/statusbar/.gitignore | 1 - product/pc/statusbar/build-profile.json5 | 11 + product/pc/statusbar/build.gradle | 28 - product/pc/statusbar/hvigorfile.js | 17 + product/pc/statusbar/package-lock.json | 11 + product/pc/statusbar/package.json | 14 +- product/pc/statusbar/src/main/config.json | 51 - .../ets/{ => Application}/AbilityStage.ts | 2 +- .../src/main/ets/ServiceExtAbility/app.ets | 38 - .../pages/common/StatusbarConfig.ts | 2 +- .../ets/pages}/common/StyleConfiguration.ts | 4 +- .../pages/common/StyleManager.ts | 30 +- .../pages/common/constants.ts | 0 .../{ServiceExtAbility => }/pages/index.ets | 11 +- .../ets}/workers/PluginDataSourceWorker.js | 6 +- product/pc/statusbar/src/main/module.json5 | 27 + .../main/resources/base/element/color.json | 28 + .../main/resources/base/element/float.json | 124 + .../main/resources/base/element/string.json | 24 + .../resources/base/media/ic_status_bt.svg | 3 + .../resources/base/media/ic_statusbar_gps.svg | 6 + .../base/media/ic_statusbar_phone.svg | 11 + .../media/ic_statusbar_ring_off_filled.svg | 6 + .../base/media/ic_statusbar_signal_1.svg | 6 + .../base/media/ic_statusbar_signal_2.svg | 6 + .../base/media/ic_statusbar_signal_3.svg | 6 + .../base/media/ic_statusbar_signal_4.svg | 6 + .../base/media/ic_statusbar_signal_full.svg | 5 + .../base/media/ic_statusbar_signal_no.svg | 5 + .../media/ic_statusbar_signal_roaming.png | Bin 0 -> 411 bytes .../base/media/ic_statusbar_signal_wait.png | Bin 0 -> 442 bytes .../base/media/ic_statusbar_vibration_on.svg | 3 + .../base/media/ic_statusbar_wifi_1.svg | 12 + .../base/media/ic_statusbar_wifi_2.svg | 12 + .../base/media/ic_statusbar_wifi_3.svg | 12 + .../base/media/ic_statusbar_wifi_connect.png | Bin 0 -> 331 bytes .../base/media/ic_statusbar_wifi_full.svg | 12 + .../base/media/ic_statusbar_wifi_no.svg | 12 + .../resources/base/profile/main_pages.json | 5 + .../main/resources/en_US/element/string.json | 24 + .../main/resources/zh_CN/element/string.json | 24 + .../phone/dropdownpanel/build-profile.json5 | 11 + product/phone/dropdownpanel/build.gradle | 28 - product/phone/dropdownpanel/hvigorfile.js | 17 + product/phone/dropdownpanel/package-lock.json | 38 + product/phone/dropdownpanel/package.json | 23 +- .../phone/dropdownpanel/src/main/config.json | 54 - .../ets/{ => Application}/AbilityStage.ts | 2 +- .../src/main/ets/ServiceExtAbility/app.ets | 23 - .../pages/bannerNotification.ets | 14 +- .../pages/common/ControlCenterConfig.ts | 2 +- .../pages/common/StyleConfiguration.ts | 4 +- .../pages/common/StyleManager.ts | 20 +- .../pages/common/constants.ts | 0 .../pages/common/navigationEvent.ts | 2 +- .../{ServiceExtAbility => }/pages/control.ets | 21 +- .../{ServiceExtAbility => }/pages/index.ets | 22 +- .../pages/notification.ets | 28 +- .../ets}/workers/PluginDataSourceWorker.js | 6 +- .../phone/dropdownpanel/src/main/module.json5 | 27 + .../main/resources/base/element/color.json | 19 +- .../main/resources/base/element/float.json | 52 + .../main/resources/base/element/string.json | 24 + .../main/resources/base/media/airplane.svg | 14 + .../main/resources/base/media/airplane_d.svg | 14 + .../base/media/ic_brightness_plus.svg | 12 + .../base/media/ic_brightness_reduce.svg | 12 + .../base/media/ic_controlcenter_bt.svg | 3 + .../base/media/ic_controlcenter_bt_d.svg | 3 + .../base/media/ic_controlcenter_gps.svg | 6 + .../ic_controlcenter_ring_off_filled.svg | 6 + .../media/ic_controlcenter_ring_on_filled.svg | 8 + .../ic_controlcenter_vibration_filled.svg | 10 + .../src/main/resources/base/media/wifi.svg | 6 + .../src/main/resources/base/media/wifi_d.svg | 6 + .../resources/base/profile/main_pages.json | 5 + .../main/resources/en_US/element/string.json | 24 + .../main/resources/zh_CN/element/string.json | 24 + product/phone/statusbar/build-profile.json5 | 11 + product/phone/statusbar/build.gradle | 24 - product/phone/statusbar/hvigorfile.js | 17 + product/phone/statusbar/package-lock.json | 11 + product/phone/statusbar/package.json | 14 +- product/phone/statusbar/src/main/config.json | 51 - .../src/main/ets/Application}/AbilityStage.ts | 5 +- .../ServiceExtAbility/ServiceExtAbility.ts | 1 - .../src/main/ets/ServiceExtAbility/app.ets | 38 - .../pages/common/StatusbarConfig.ts | 2 +- .../pages/common/StyleConfiguration.ts | 2 +- .../pages/common/StyleManager.ts | 6 +- .../pages/common/constants.ts | 0 .../{ServiceExtAbility => }/pages/index.ets | 35 +- .../ets}/workers/PluginDataSourceWorker.js | 6 +- product/phone/statusbar/src/main/module.json5 | 27 + .../main/resources/base/element/color.json | 28 + .../main/resources/base/element/float.json | 124 + .../main/resources/base/element/string.json | 32 +- .../resources/base/media/ic_status_bt.svg | 3 + .../resources/base/media/ic_statusbar_gps.svg | 6 + .../base/media/ic_statusbar_phone.svg | 11 + .../media/ic_statusbar_ring_off_filled.svg | 6 + .../base/media/ic_statusbar_signal_1.svg | 6 + .../base/media/ic_statusbar_signal_2.svg | 6 + .../base/media/ic_statusbar_signal_3.svg | 6 + .../base/media/ic_statusbar_signal_4.svg | 6 + .../base/media/ic_statusbar_signal_full.svg | 5 + .../base/media/ic_statusbar_signal_no.svg | 5 + .../media/ic_statusbar_signal_roaming.png | Bin 0 -> 411 bytes .../base/media/ic_statusbar_signal_wait.png | Bin 0 -> 442 bytes .../base/media/ic_statusbar_vibration_on.svg | 3 + .../base/media/ic_statusbar_wifi_1.svg | 12 + .../base/media/ic_statusbar_wifi_2.svg | 12 + .../base/media/ic_statusbar_wifi_3.svg | 12 + .../base/media/ic_statusbar_wifi_connect.png | Bin 0 -> 331 bytes .../base/media/ic_statusbar_wifi_full.svg | 12 + .../base/media/ic_statusbar_wifi_no.svg | 12 + .../resources/base/profile/main_pages.json | 5 + .../main/resources/en_US/element/string.json | 32 +- .../main/resources/zh_CN/element/string.json | 32 +- settings.gradle | 34 - 426 files changed, 7631 insertions(+), 2399 deletions(-) create mode 100644 AppScope/app.json5 create mode 100644 AppScope/resources/base/element/string.json create mode 100644 AppScope/resources/base/media/app_icon.png create mode 100644 build-profile.json5 delete mode 100755 build.gradle create mode 100644 common/build-profile.json5 rename features/batterycomponent/src/main/ets/default/app.ets => common/hvigorfile.js (71%) create mode 100644 common/package-lock.json create mode 100644 common/package.json delete mode 100644 common/src/main/config.json create mode 100644 common/src/main/module.json5 delete mode 100644 entry/pc/.gitignore create mode 100644 entry/pc/build-profile.json5 delete mode 100644 entry/pc/build.gradle rename features/brightnesscomponent/src/main/ets/default/app.ets => entry/pc/hvigorfile.js (71%) create mode 100644 entry/pc/package-lock.json rename entry/{phone/src/main/ets => pc/src/main/ets/Application}/AbilityStage.ts (92%) delete mode 100644 entry/pc/src/main/ets/ServiceExtAbility/app.ets rename entry/pc/src/main/ets/{ServiceExtAbility => }/pages/index.ets (100%) rename entry/pc/src/main/{config.json => module.json5} (58%) create mode 100644 entry/pc/src/main/resources/base/profile/main_pages.json delete mode 100644 entry/phone/.gitignore create mode 100644 entry/phone/build-profile.json5 delete mode 100644 entry/phone/build.gradle rename features/clockcomponent/src/main/ets/default/app.ets => entry/phone/hvigorfile.js (71%) create mode 100644 entry/phone/package-lock.json rename {product/phone/statusbar/src/main/ets => entry/phone/src/main/ets/Application}/AbilityStage.ts (95%) delete mode 100644 entry/phone/src/main/ets/ServiceExtAbility/app.ets rename entry/phone/src/main/ets/{ServiceExtAbility => }/pages/index.ets (100%) rename entry/phone/src/main/{config.json => module.json5} (57%) create mode 100644 entry/phone/src/main/resources/base/profile/main_pages.json delete mode 100644 features/airplanecomponent/.gitignore create mode 100644 features/airplanecomponent/build-profile.json5 delete mode 100644 features/airplanecomponent/build.gradle create mode 100644 features/airplanecomponent/hvigorfile.js create mode 100644 features/airplanecomponent/package.json delete mode 100644 features/airplanecomponent/src/main/config.json create mode 100644 features/airplanecomponent/src/main/module.json5 delete mode 100644 features/autorotatecomponent/.gitignore create mode 100644 features/autorotatecomponent/build-profile.json5 delete mode 100644 features/autorotatecomponent/build.gradle create mode 100644 features/autorotatecomponent/hvigorfile.js create mode 100644 features/autorotatecomponent/package.json delete mode 100644 features/autorotatecomponent/src/main/config.json create mode 100644 features/autorotatecomponent/src/main/module.json5 delete mode 100644 features/batterycomponent/.gitignore create mode 100644 features/batterycomponent/build-profile.json5 delete mode 100644 features/batterycomponent/build.gradle create mode 100644 features/batterycomponent/hvigorfile.js create mode 100644 features/batterycomponent/package.json delete mode 100644 features/batterycomponent/src/main/config.json create mode 100644 features/batterycomponent/src/main/module.json5 delete mode 100644 features/bluetoothcomponent/.gitignore create mode 100644 features/bluetoothcomponent/build-profile.json5 delete mode 100644 features/bluetoothcomponent/build.gradle create mode 100644 features/bluetoothcomponent/hvigorfile.js create mode 100644 features/bluetoothcomponent/package.json delete mode 100644 features/bluetoothcomponent/src/main/config.json create mode 100644 features/bluetoothcomponent/src/main/module.json5 delete mode 100644 features/brightnesscomponent/.gitignore create mode 100644 features/brightnesscomponent/build-profile.json5 delete mode 100644 features/brightnesscomponent/build.gradle create mode 100644 features/brightnesscomponent/hvigorfile.js create mode 100644 features/brightnesscomponent/package.json delete mode 100644 features/brightnesscomponent/src/main/config.json create mode 100644 features/brightnesscomponent/src/main/module.json5 delete mode 100644 features/capsulecomponent/.gitignore create mode 100644 features/capsulecomponent/build-profile.json5 delete mode 100644 features/capsulecomponent/build.gradle create mode 100644 features/capsulecomponent/hvigorfile.js create mode 100644 features/capsulecomponent/package-lock.json create mode 100644 features/capsulecomponent/package.json delete mode 100644 features/capsulecomponent/src/main/config.json create mode 100644 features/capsulecomponent/src/main/module.json5 delete mode 100644 features/clockcomponent/.gitignore create mode 100644 features/clockcomponent/build-profile.json5 delete mode 100644 features/clockcomponent/build.gradle create mode 100644 features/clockcomponent/hvigorfile.js create mode 100644 features/clockcomponent/package.json delete mode 100644 features/clockcomponent/src/main/config.json create mode 100644 features/clockcomponent/src/main/module.json5 delete mode 100644 features/controlcentercomponent/.gitignore create mode 100644 features/controlcentercomponent/build-profile.json5 delete mode 100644 features/controlcentercomponent/build.gradle create mode 100644 features/controlcentercomponent/hvigorfile.js create mode 100644 features/controlcentercomponent/package.json delete mode 100644 features/controlcentercomponent/src/main/config.json create mode 100644 features/controlcentercomponent/src/main/module.json5 delete mode 100644 features/locationcomponent/.gitignore create mode 100644 features/locationcomponent/build-profile.json5 delete mode 100644 features/locationcomponent/build.gradle create mode 100644 features/locationcomponent/hvigorfile.js create mode 100644 features/locationcomponent/package.json delete mode 100644 features/locationcomponent/src/main/config.json create mode 100644 features/locationcomponent/src/main/module.json5 delete mode 100644 features/managementcomponent/.gitignore create mode 100644 features/managementcomponent/build-profile.json5 delete mode 100644 features/managementcomponent/build.gradle create mode 100644 features/managementcomponent/hvigorfile.js create mode 100644 features/managementcomponent/package.json delete mode 100644 features/managementcomponent/src/main/config.json create mode 100644 features/managementcomponent/src/main/module.json5 delete mode 100644 features/navigationservice/.gitignore create mode 100644 features/navigationservice/build-profile.json5 delete mode 100644 features/navigationservice/build.gradle create mode 100644 features/navigationservice/hvigorfile.js create mode 100644 features/navigationservice/package.json delete mode 100644 features/navigationservice/src/main/config.json create mode 100644 features/navigationservice/src/main/module.json5 delete mode 100644 features/noticeitem/.gitignore create mode 100644 features/noticeitem/build-profile.json5 delete mode 100644 features/noticeitem/build.gradle create mode 100644 features/noticeitem/hvigorfile.js create mode 100644 features/noticeitem/package.json delete mode 100644 features/noticeitem/src/main/config.json create mode 100644 features/noticeitem/src/main/module.json5 delete mode 100644 features/ringmodecomponent/.gitignore create mode 100644 features/ringmodecomponent/build-profile.json5 delete mode 100644 features/ringmodecomponent/build.gradle create mode 100644 features/ringmodecomponent/hvigorfile.js create mode 100644 features/ringmodecomponent/package.json delete mode 100644 features/ringmodecomponent/src/main/config.json create mode 100644 features/ringmodecomponent/src/main/module.json5 delete mode 100644 features/signalcomponent/.gitignore create mode 100644 features/signalcomponent/build-profile.json5 delete mode 100644 features/signalcomponent/build.gradle create mode 100644 features/signalcomponent/hvigorfile.js create mode 100644 features/signalcomponent/package.json delete mode 100644 features/signalcomponent/src/main/config.json delete mode 100644 features/signalcomponent/src/main/ets/default/app.ets create mode 100644 features/signalcomponent/src/main/module.json5 delete mode 100644 features/statusbarcomponent/.gitignore create mode 100644 features/statusbarcomponent/build-profile.json5 delete mode 100644 features/statusbarcomponent/build.gradle create mode 100644 features/statusbarcomponent/hvigorfile.js create mode 100644 features/statusbarcomponent/package-lock.json create mode 100644 features/statusbarcomponent/package.json delete mode 100644 features/statusbarcomponent/src/main/config.json create mode 100644 features/statusbarcomponent/src/main/module.json5 delete mode 100644 features/volumecomponent/.gitignore create mode 100644 features/volumecomponent/build-profile.json5 delete mode 100644 features/volumecomponent/build.gradle create mode 100644 features/volumecomponent/hvigorfile.js create mode 100644 features/volumecomponent/package.json delete mode 100644 features/volumecomponent/src/main/config.json delete mode 100644 features/volumecomponent/src/main/ets/default/app.ets create mode 100644 features/volumecomponent/src/main/module.json5 delete mode 100644 features/volumepanelcomponent/.gitignore create mode 100644 features/volumepanelcomponent/build-profile.json5 delete mode 100644 features/volumepanelcomponent/build.gradle create mode 100644 features/volumepanelcomponent/hvigorfile.js create mode 100644 features/volumepanelcomponent/package.json delete mode 100644 features/volumepanelcomponent/src/main/config.json create mode 100644 features/volumepanelcomponent/src/main/module.json5 delete mode 100644 features/wificomponent/.gitignore create mode 100644 features/wificomponent/build-profile.json5 delete mode 100644 features/wificomponent/build.gradle create mode 100644 features/wificomponent/hvigorfile.js create mode 100644 features/wificomponent/package.json delete mode 100644 features/wificomponent/src/main/config.json delete mode 100644 features/wificomponent/src/main/ets/default/app.ets create mode 100644 features/wificomponent/src/main/module.json5 rename features/airplanecomponent/src/main/ets/default/app.ets => hvigorfile.js (71%) create mode 100644 package-lock.json create mode 100644 package.json delete mode 100644 product/default/navigationBar/.gitignore create mode 100644 product/default/navigationBar/build-profile.json5 delete mode 100644 product/default/navigationBar/build.gradle create mode 100644 product/default/navigationBar/hvigorfile.js create mode 100644 product/default/navigationBar/package-lock.json delete mode 100644 product/default/navigationBar/src/main/config.json rename product/default/navigationBar/src/main/ets/{ => Application}/AbilityStage.ts (92%) delete mode 100644 product/default/navigationBar/src/main/ets/ServiceExtAbility/app.ets rename product/default/navigationBar/src/main/ets/{ServiceExtAbility => }/common/NavBarConfiguration.ts (97%) rename product/default/navigationBar/src/main/ets/{ServiceExtAbility => }/common/StyleConfiguration.ts (93%) rename product/default/navigationBar/src/main/ets/{ServiceExtAbility => }/common/StyleManager.ts (92%) rename product/default/navigationBar/src/main/ets/{ServiceExtAbility => }/common/constants.ts (100%) rename product/default/navigationBar/src/main/ets/{ServiceExtAbility => }/common/utils/configReader.ts (96%) rename product/default/navigationBar/src/main/ets/{ServiceExtAbility => }/i18n/en-US.json (100%) rename product/default/navigationBar/src/main/ets/{ServiceExtAbility => }/i18n/zh-CN.json (100%) rename product/default/navigationBar/src/main/ets/{ServiceExtAbility => }/pages/index.ets (81%) rename product/default/navigationBar/src/main/ets/{ServiceExtAbility => }/pages/keyButton.ets (92%) rename product/default/navigationBar/src/main/ets/{ServiceExtAbility => }/pages/oneLayout.ets (93%) rename product/default/navigationBar/src/main/ets/{ServiceExtAbility => }/pages/threeLayout.ets (95%) rename product/default/navigationBar/src/main/ets/{ServiceExtAbility => }/viewmodel/NavigationBarViewModel.ts (91%) create mode 100644 product/default/navigationBar/src/main/module.json5 create mode 100644 product/default/navigationBar/src/main/resources/base/profile/main_pages.json delete mode 100644 product/default/notificationmanagement/.gitignore create mode 100644 product/default/notificationmanagement/build-profile.json5 delete mode 100644 product/default/notificationmanagement/build.gradle create mode 100644 product/default/notificationmanagement/hvigorfile.js create mode 100644 product/default/notificationmanagement/package-lock.json delete mode 100644 product/default/notificationmanagement/src/main/config.json rename product/default/notificationmanagement/src/main/ets/{ => Application}/AbilityStage.ts (92%) delete mode 100644 product/default/notificationmanagement/src/main/ets/MainAbility/app.ets rename product/default/notificationmanagement/src/main/ets/{MainAbility => }/common/constants.ts (100%) rename product/default/notificationmanagement/src/main/ets/{MainAbility => }/pages/batchSetEnable.ets (84%) rename product/default/notificationmanagement/src/main/ets/{MainAbility => }/pages/noDisturb.ets (95%) rename product/default/notificationmanagement/src/main/ets/{MainAbility => }/pages/noDisturbPre.ets (84%) rename product/default/notificationmanagement/src/main/ets/{MainAbility => }/pages/notificationManagenment.ets (88%) rename product/default/notificationmanagement/src/main/ets/{MainAbility => }/pages/setEnable.ets (85%) rename product/default/notificationmanagement/src/main/ets/{MainAbility => }/pages/slotSetting.ets (91%) rename product/default/notificationmanagement/src/main/ets/{MainAbility => }/vm/noDisturbViewModel.ts (91%) rename product/default/notificationmanagement/src/main/ets/{MainAbility => }/vm/notificationManagenmentViewModel.ts (70%) create mode 100644 product/default/notificationmanagement/src/main/module.json5 create mode 100644 product/default/notificationmanagement/src/main/resources/base/profile/main_pages.json delete mode 100644 product/default/volumepanel/.gitignore create mode 100644 product/default/volumepanel/build-profile.json5 delete mode 100644 product/default/volumepanel/build.gradle create mode 100644 product/default/volumepanel/hvigorfile.js create mode 100644 product/default/volumepanel/package-lock.json delete mode 100644 product/default/volumepanel/src/main/config.json rename product/default/volumepanel/src/main/ets/{ => Application}/AbilityStage.ts (36%) delete mode 100644 product/default/volumepanel/src/main/ets/ServiceExtAbility/pages/index.ets rename product/{pc/statusbar/src/main/ets/ServiceExtAbility/pages => default/volumepanel/src/main/ets}/common/StyleConfiguration.ts (85%) rename product/default/volumepanel/src/main/ets/{ServiceExtAbility => }/common/StyleManager.ts (90%) rename product/default/volumepanel/src/main/ets/{ServiceExtAbility => }/common/constants.ts (100%) rename product/default/volumepanel/src/main/ets/{ServiceExtAbility/app.ets => pages/index.ets} (60%) create mode 100644 product/default/volumepanel/src/main/module.json5 create mode 100644 product/default/volumepanel/src/main/resources/base/profile/main_pages.json delete mode 100644 product/pc/controlpanel/.gitignore create mode 100644 product/pc/controlpanel/build-profile.json5 delete mode 100644 product/pc/controlpanel/build.gradle create mode 100644 product/pc/controlpanel/hvigorfile.js create mode 100644 product/pc/controlpanel/package-lock.json delete mode 100644 product/pc/controlpanel/src/main/config.json rename product/pc/controlpanel/src/main/ets/{ => Application}/AbilityStage.ts (92%) delete mode 100644 product/pc/controlpanel/src/main/ets/ServiceExtAbility/app.ets rename product/pc/controlpanel/src/main/ets/{ServiceExtAbility => }/pages/common/ControlCenterConfig.ts (94%) rename product/pc/controlpanel/src/main/ets/{ServiceExtAbility => }/pages/common/StyleConfiguration.ts (90%) rename product/pc/controlpanel/src/main/ets/{ServiceExtAbility => }/pages/common/StyleManager.ts (95%) rename product/pc/controlpanel/src/main/ets/{ServiceExtAbility => }/pages/common/constants.ts (100%) rename product/pc/controlpanel/src/main/ets/{ServiceExtAbility => }/pages/control.ets (81%) rename product/pc/controlpanel/src/main/ets/{ServiceExtAbility => }/pages/index.ets (89%) rename product/pc/{statusbar/src/main/ets/ServiceExtAbility => controlpanel/src/main/ets}/workers/PluginDataSourceWorker.js (90%) create mode 100644 product/pc/controlpanel/src/main/module.json5 create mode 100644 product/pc/controlpanel/src/main/resources/base/media/airplane.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/airplane_d.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/ic_brightness_plus.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/ic_brightness_reduce.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_gps.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/wifi.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/wifi_d.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/profile/main_pages.json delete mode 100644 product/pc/notificationpanel/.gitignore create mode 100644 product/pc/notificationpanel/build-profile.json5 delete mode 100644 product/pc/notificationpanel/build.gradle create mode 100644 product/pc/notificationpanel/hvigorfile.js create mode 100644 product/pc/notificationpanel/package-lock.json delete mode 100644 product/pc/notificationpanel/src/main/config.json rename product/pc/notificationpanel/src/main/ets/{ => Application}/AbilityStage.ts (92%) delete mode 100644 product/pc/notificationpanel/src/main/ets/ServiceExtAbility/app.ets rename product/pc/notificationpanel/src/main/ets/{ServiceExtAbility => }/pages/bannerNotification.ets (85%) rename product/pc/notificationpanel/src/main/ets/{ServiceExtAbility => }/pages/common/StyleConfiguration.ts (90%) rename product/pc/notificationpanel/src/main/ets/{ServiceExtAbility => }/pages/common/StyleManager.ts (86%) rename product/pc/notificationpanel/src/main/ets/{ServiceExtAbility => }/pages/common/constants.ts (100%) rename product/pc/notificationpanel/src/main/ets/{ServiceExtAbility => }/pages/index.ets (91%) rename product/pc/notificationpanel/src/main/ets/{ServiceExtAbility => }/pages/notification.ets (86%) create mode 100644 product/pc/notificationpanel/src/main/module.json5 create mode 100644 product/pc/notificationpanel/src/main/resources/base/profile/main_pages.json delete mode 100644 product/pc/statusbar/.gitignore create mode 100644 product/pc/statusbar/build-profile.json5 delete mode 100644 product/pc/statusbar/build.gradle create mode 100644 product/pc/statusbar/hvigorfile.js create mode 100644 product/pc/statusbar/package-lock.json delete mode 100644 product/pc/statusbar/src/main/config.json rename product/pc/statusbar/src/main/ets/{ => Application}/AbilityStage.ts (92%) delete mode 100644 product/pc/statusbar/src/main/ets/ServiceExtAbility/app.ets rename product/pc/statusbar/src/main/ets/{ServiceExtAbility => }/pages/common/StatusbarConfig.ts (95%) rename product/{default/volumepanel/src/main/ets/ServiceExtAbility => pc/statusbar/src/main/ets/pages}/common/StyleConfiguration.ts (92%) rename product/pc/statusbar/src/main/ets/{ServiceExtAbility => }/pages/common/StyleManager.ts (83%) rename product/pc/statusbar/src/main/ets/{ServiceExtAbility => }/pages/common/constants.ts (100%) rename product/pc/statusbar/src/main/ets/{ServiceExtAbility => }/pages/index.ets (82%) rename product/{phone/dropdownpanel/src/main/ets/ServiceExtAbility => pc/statusbar/src/main/ets}/workers/PluginDataSourceWorker.js (90%) create mode 100644 product/pc/statusbar/src/main/module.json5 create mode 100644 product/pc/statusbar/src/main/resources/base/element/float.json create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_status_bt.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg create mode 100644 product/pc/statusbar/src/main/resources/base/profile/main_pages.json create mode 100644 product/phone/dropdownpanel/build-profile.json5 delete mode 100644 product/phone/dropdownpanel/build.gradle create mode 100644 product/phone/dropdownpanel/hvigorfile.js create mode 100644 product/phone/dropdownpanel/package-lock.json delete mode 100644 product/phone/dropdownpanel/src/main/config.json rename product/phone/dropdownpanel/src/main/ets/{ => Application}/AbilityStage.ts (92%) delete mode 100644 product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/app.ets rename product/phone/dropdownpanel/src/main/ets/{ServiceExtAbility => }/pages/bannerNotification.ets (85%) rename product/phone/dropdownpanel/src/main/ets/{ServiceExtAbility => }/pages/common/ControlCenterConfig.ts (94%) rename product/phone/dropdownpanel/src/main/ets/{ServiceExtAbility => }/pages/common/StyleConfiguration.ts (95%) rename product/phone/dropdownpanel/src/main/ets/{ServiceExtAbility => }/pages/common/StyleManager.ts (94%) rename product/phone/dropdownpanel/src/main/ets/{ServiceExtAbility => }/pages/common/constants.ts (100%) rename product/phone/dropdownpanel/src/main/ets/{ServiceExtAbility => }/pages/common/navigationEvent.ts (96%) rename product/phone/dropdownpanel/src/main/ets/{ServiceExtAbility => }/pages/control.ets (74%) rename product/phone/dropdownpanel/src/main/ets/{ServiceExtAbility => }/pages/index.ets (91%) rename product/phone/dropdownpanel/src/main/ets/{ServiceExtAbility => }/pages/notification.ets (82%) rename product/phone/{statusbar/src/main/ets/ServiceExtAbility => dropdownpanel/src/main/ets}/workers/PluginDataSourceWorker.js (90%) create mode 100644 product/phone/dropdownpanel/src/main/module.json5 create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/airplane.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/wifi.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json create mode 100644 product/phone/statusbar/build-profile.json5 delete mode 100644 product/phone/statusbar/build.gradle create mode 100644 product/phone/statusbar/hvigorfile.js create mode 100644 product/phone/statusbar/package-lock.json delete mode 100644 product/phone/statusbar/src/main/config.json rename {entry/pc/src/main/ets => product/phone/statusbar/src/main/ets/Application}/AbilityStage.ts (88%) delete mode 100644 product/phone/statusbar/src/main/ets/ServiceExtAbility/app.ets rename product/phone/statusbar/src/main/ets/{ServiceExtAbility => }/pages/common/StatusbarConfig.ts (96%) rename product/phone/statusbar/src/main/ets/{ServiceExtAbility => }/pages/common/StyleConfiguration.ts (90%) rename product/phone/statusbar/src/main/ets/{ServiceExtAbility => }/pages/common/StyleManager.ts (85%) rename product/phone/statusbar/src/main/ets/{ServiceExtAbility => }/pages/common/constants.ts (100%) rename product/phone/statusbar/src/main/ets/{ServiceExtAbility => }/pages/index.ets (73%) rename product/{pc/controlpanel/src/main/ets/ServiceExtAbility => phone/statusbar/src/main/ets}/workers/PluginDataSourceWorker.js (90%) create mode 100644 product/phone/statusbar/src/main/module.json5 create mode 100644 product/phone/statusbar/src/main/resources/base/element/float.json create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg create mode 100644 product/phone/statusbar/src/main/resources/base/profile/main_pages.json delete mode 100755 settings.gradle diff --git a/.gitignore b/.gitignore index 1f53d195..1984fa82 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,14 @@ .gradle .idea build +node_modules/ local.properties -signature/systemui_provision_verified.json \ No newline at end of file +signature/systemui_provision_verified.json +product/default/volumepanel/node_modules +product/default/notificationmanagement/node_modules +product/default/navigationBar/node_modules +product/pc/controlpanel/node_modules +product/pc/notificationpanel/node_modules +product/pc/statusbar/node_modules +product/phone/dropdownpanel/node_modules +product/phone/statusbar/node_modules \ No newline at end of file diff --git a/AppScope/app.json5 b/AppScope/app.json5 new file mode 100644 index 00000000..52356e8a --- /dev/null +++ b/AppScope/app.json5 @@ -0,0 +1,15 @@ +{ + "app": { + "bundleName": "com.ohos.systemui", + "vendor": "ohos", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name", + "distributedNotificationEnabled": true, + "singleton": true, + "keepAlive": true, + "minAPIVersion": 8, + "targetAPIVersion": 9 + } +} diff --git a/AppScope/resources/base/element/string.json b/AppScope/resources/base/element/string.json new file mode 100644 index 00000000..4f238bb1 --- /dev/null +++ b/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "SystemUI" + } + ] +} diff --git a/AppScope/resources/base/media/app_icon.png b/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); - this.mWidthPx = vp2px(e2.width) + this.mWidthPx = vp2px(Number(e2.width)) }) } } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts index b9992ce0..8e576c27 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts @@ -36,14 +36,14 @@ export class ControlCenterVM { ControlCenterService.registerListener(this); } - initViewModel(config) { + initViewModel(config, moduleName) { if (this.mIsStart) { return; } Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)} `) this.mIsStart = true; - ControlCenterService.startService(config); + ControlCenterService.startService(config, moduleName); } setComplexToggleLayout(layout: string[]): void{ diff --git a/features/controlcentercomponent/src/main/module.json5 b/features/controlcentercomponent/src/main/module.json5 new file mode 100644 index 00000000..667d7369 --- /dev/null +++ b/features/controlcentercomponent/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "controlcentercomponent", + "type": "har", + "deviceTypes": [ + "phone", + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/features/locationcomponent/.gitignore b/features/locationcomponent/.gitignore deleted file mode 100644 index c795b054..00000000 --- a/features/locationcomponent/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build \ No newline at end of file diff --git a/features/locationcomponent/build-profile.json5 b/features/locationcomponent/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/features/locationcomponent/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/features/locationcomponent/build.gradle b/features/locationcomponent/build.gradle deleted file mode 100644 index ae402d92..00000000 --- a/features/locationcomponent/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} \ No newline at end of file diff --git a/features/locationcomponent/hvigorfile.js b/features/locationcomponent/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/features/locationcomponent/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/features/locationcomponent/package.json b/features/locationcomponent/package.json new file mode 100644 index 00000000..9e322712 --- /dev/null +++ b/features/locationcomponent/package.json @@ -0,0 +1,12 @@ +{ + "name": "@ohos/locationcomponent", + "version": "1.0.0", + "description": "a npm package which contains locationcomponent function", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "module" + }, + "dependencies": { + } +} diff --git a/features/locationcomponent/src/main/config.json b/features/locationcomponent/src/main/config.json deleted file mode 100644 index 3afe78f5..00000000 --- a/features/locationcomponent/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.locationcomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "locationcomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/locationcomponent/src/main/module.json5 b/features/locationcomponent/src/main/module.json5 new file mode 100644 index 00000000..a0c8129e --- /dev/null +++ b/features/locationcomponent/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "locationcomponent", + "type": "har", + "deviceTypes": [ + "phone", + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/features/managementcomponent/.gitignore b/features/managementcomponent/.gitignore deleted file mode 100644 index 796b96d1..00000000 --- a/features/managementcomponent/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/features/managementcomponent/build-profile.json5 b/features/managementcomponent/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/features/managementcomponent/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/features/managementcomponent/build.gradle b/features/managementcomponent/build.gradle deleted file mode 100644 index ae402d92..00000000 --- a/features/managementcomponent/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} \ No newline at end of file diff --git a/features/managementcomponent/hvigorfile.js b/features/managementcomponent/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/features/managementcomponent/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/features/managementcomponent/package.json b/features/managementcomponent/package.json new file mode 100644 index 00000000..84fd61df --- /dev/null +++ b/features/managementcomponent/package.json @@ -0,0 +1,12 @@ +{ + "name": "@ohos/managementcomponent", + "version": "1.0.0", + "description": "a npm package which contains managementcomponent function", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "module" + }, + "dependencies": { + } +} diff --git a/features/managementcomponent/src/main/config.json b/features/managementcomponent/src/main/config.json deleted file mode 100644 index 0bc56962..00000000 --- a/features/managementcomponent/src/main/config.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": { - }, - "module": { - "package": "com.ohos.managementcomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "managementcomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets index 2d11fd93..38b98301 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets @@ -74,7 +74,6 @@ export default struct AppLstComponent { startMargin: $r('app.float.divider_margin_l_info') }) .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100) .align(Alignment.Top) .visibility(Visibility.Visible) .zIndex(0) @@ -88,6 +87,6 @@ export default struct AppLstComponent { } .align(Alignment.Center) .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100); + .flexShrink(1) } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets index 81841570..de2088b3 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets @@ -63,6 +63,7 @@ export default struct SlotLstComponent { .border({ width: $r('app.float.border_width'), color: Color.White, radius: $r('app.float.border_radius') }) .backgroundColor(Color.White) + .flexShrink(1) } .padding({ left: $r('sys.float.ohos_id_default_padding_start'), right: $r('sys.float.ohos_id_default_padding_end')}) .margin({ top: $r('app.float.page_notice_title_margin_t')}) diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index 8fbb3d24..4c4f5a56 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -22,7 +22,7 @@ export default struct SwitchComponent { @Link title: string | Resource; @State describe: string | Resource = ''; private initializationAction: (params?) => Promise - private settingAction: (params?) => Promise + private settingAction: (params?) => void private register?: (listener) => void @State isCanChange: boolean = true @State initState: boolean= false diff --git a/features/managementcomponent/src/main/module.json5 b/features/managementcomponent/src/main/module.json5 new file mode 100644 index 00000000..cc94d2fc --- /dev/null +++ b/features/managementcomponent/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "managementcomponent", + "type": "har", + "deviceTypes": [ + "phone", + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/resources/base/element/float.json b/features/managementcomponent/src/main/resources/base/element/float.json index dac8c720..146dbab9 100644 --- a/features/managementcomponent/src/main/resources/base/element/float.json +++ b/features/managementcomponent/src/main/resources/base/element/float.json @@ -36,10 +36,18 @@ "name": "applist_hieght", "value": "476vp" }, + { + "name": "applist_hieght_phone", + "value": "800vp" + }, { "name": "applist_hieght_bat", "value": "584vp" }, + { + "name": "applist_hieght_bat_phone", + "value": "1022vp" + }, { "name": "page_header_margin_t", "value": "24vp" diff --git a/features/navigationservice/.gitignore b/features/navigationservice/.gitignore deleted file mode 100644 index 7d5b7a94..00000000 --- a/features/navigationservice/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build -/node_modules diff --git a/features/navigationservice/build-profile.json5 b/features/navigationservice/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/features/navigationservice/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/features/navigationservice/build.gradle b/features/navigationservice/build.gradle deleted file mode 100644 index a690a302..00000000 --- a/features/navigationservice/build.gradle +++ /dev/null @@ -1,20 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - testImplementation 'junit:junit:4.13' -} diff --git a/features/navigationservice/hvigorfile.js b/features/navigationservice/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/features/navigationservice/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/features/navigationservice/package.json b/features/navigationservice/package.json new file mode 100644 index 00000000..bbc4bf10 --- /dev/null +++ b/features/navigationservice/package.json @@ -0,0 +1,12 @@ +{ + "name": "@ohos/navigationservice", + "version": "1.0.0", + "description": "a npm package which contains navigationservice function", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "module" + }, + "dependencies": { + } +} diff --git a/features/navigationservice/src/main/config.json b/features/navigationservice/src/main/config.json deleted file mode 100644 index 89d83e1f..00000000 --- a/features/navigationservice/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui_ace_new", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": { - }, - "module": { - "package": "com.ohos.navigationservice", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "navigationservice", - "moduleType": "har" - } - } -} \ No newline at end of file diff --git a/features/navigationservice/src/main/module.json5 b/features/navigationservice/src/main/module.json5 new file mode 100644 index 00000000..9d98a2cb --- /dev/null +++ b/features/navigationservice/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "navigationservice", + "type": "har", + "deviceTypes": [ + "phone", + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/features/noticeitem/.gitignore b/features/noticeitem/.gitignore deleted file mode 100644 index c795b054..00000000 --- a/features/noticeitem/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build \ No newline at end of file diff --git a/features/noticeitem/build-profile.json5 b/features/noticeitem/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/features/noticeitem/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/features/noticeitem/build.gradle b/features/noticeitem/build.gradle deleted file mode 100644 index ae402d92..00000000 --- a/features/noticeitem/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} \ No newline at end of file diff --git a/features/noticeitem/hvigorfile.js b/features/noticeitem/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/features/noticeitem/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/features/noticeitem/package.json b/features/noticeitem/package.json new file mode 100644 index 00000000..6085f2e3 --- /dev/null +++ b/features/noticeitem/package.json @@ -0,0 +1,12 @@ +{ + "name": "@ohos/noticeitem", + "version": "1.0.0", + "description": "a npm package which contains noticeitem function", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "module" + }, + "dependencies": { + } +} diff --git a/features/noticeitem/src/main/config.json b/features/noticeitem/src/main/config.json deleted file mode 100644 index 9d4eb9ec..00000000 --- a/features/noticeitem/src/main/config.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": { - }, - "module": { - "package": "com.ohos.noticeItem", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "noticeitem", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index e48c7011..1ed225a6 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -58,5 +58,6 @@ export default struct NotificationListComponent { }, (list: any) => JSON.stringify(list.map((item) => item.hashcode))) } .width('100%') + .flexShrink(1) } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index d205b9b4..407ed6db 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -121,8 +121,8 @@ export default struct BannerNotificationItem { .onClick(this.showDevicesDialog.bind(this)) .onAreaChange((e, e2) => { Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); - let heightEx = parseInt(e['height']); - let heightCur = parseInt(e2['height']); + let heightEx = parseInt(String(e['height'])); + let heightCur = parseInt(String(e2['height'])); let heightWin = parseInt(this.mDefaultBannerRect['height']); if (this.isExpand) { heightWin = heightWin + (heightCur - heightEx) + this.expandPaddingBottom; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets index 782d3fe7..2e0f1e12 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -23,7 +23,7 @@ const TAG = 'NoticeItem-Confirm'; */ @CustomDialog export default struct ConfirmDialog { - private title: string + private title: string | Resource private bundleName: string public controller: CustomDialogController public action: () => void @@ -35,14 +35,14 @@ export default struct ConfirmDialog { Text(this.title) .fontSize($r('app.float.confirm_title_fontsize')) .fontWeight(FontWeight.Bold) - }.width(Constants.SETTING_DIALOG_WITH) - .margin({top:$r('app.float.title_font_margin_t')}) + }.width($r('app.float.confirm_dialog_row_width')) + .margin({ top: $r('app.float.title_font_margin_t') }) Row() { Text($r('app.string.confirm_message', this.bundleName)) .fontSize($r('app.float.confirm_cont_fontsize')) - }.width(Constants.SETTING_DIALOG_WITH) - .margin({top:$r('app.float.message_font_margin_t')}) + }.width($r('app.float.confirm_dialog_row_width')) + .margin({ top: $r('app.float.message_font_margin_t') }) Row() { Column() { @@ -53,7 +53,8 @@ export default struct ConfirmDialog { this.controller.close(); }) .alignItems(HorizontalAlign.Center) - .width(Constants.CONFIRM_BUTTON_WITH) + .width($r('app.float.confirm_dialog_button_width')) + Divider() .vertical(true) .color($r('app.color.confirm_divider_color')) @@ -69,12 +70,12 @@ export default struct ConfirmDialog { this.action(); }) .alignItems(HorizontalAlign.Center) - .width(Constants.CONFIRM_BUTTON_WITH) + .width($r('app.float.confirm_dialog_button_width')) } - .width(Constants.CONFIRM_DIALOG_WITH) - .margin({top:$r('app.float.confirm_button_margin_t')}) - }.height(Constants.CONFIRM_DIALOG_HEIGHT) - .width(Constants.SETTING_DIALOG_WIDTH) + .width($r('app.float.confirm_dialog_width')) + .margin({ top: $r('app.float.confirm_button_margin_t') }) + }.height($r('app.float.confirm_dialog_height')) + .width($r('app.float.confirm_dialog_width')) .backgroundColor('#FFFFFFFF') .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.notification_border_radius') }) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets index ef58955b..4dd19e78 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -51,7 +51,7 @@ export default struct CustomItem { }).onError(({errcode, msg}) => { Log.showInfo(TAG, `Error code:${errcode} message:${msg}`) }) - .size({ width: '100%', height: 110 }) + .size({ width: 200, height: 110 }) } .margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) .onClick(() => { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets index 87ae30ea..6b8fce71 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets @@ -77,6 +77,7 @@ export default struct DevicesDialog { .border({ width: $r('app.float.device_border_width'), color: Color.White, radius: $r('app.float.device_border_radius') }) .backgroundColor(Color.White) + .flexShrink(1) } .margin({ bottom: $r("app.float.device_margin_16") }) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 5e894951..cc0dab78 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -180,6 +180,7 @@ struct ContentList { strokeWidth: 1, color: $r('app.color.device_divider_color') }) + .flexShrink(1) } } .alignItems(HorizontalAlign.Start) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets index 82569697..351febca 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Constants,{NotificationItemData} from '../../common/constants'; +import Constants, {NotificationItemData} from '../../common/constants'; import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; import EventManager from "../../../../../../../../../../common/src/main/ets/default/event/EventManager" @@ -43,8 +43,8 @@ export default struct SettingDialog { Text(this.itemData.appName) .fontSize($r('app.float.setting_title_fontsize')) .fontWeight(500) - }.width(Constants.SETTING_DIALOG_WITH) - .margin( {top: $r('app.float.notification_appname_margin_top')} ) + }.width($r('app.float.setting_dialog_row_width')) + .margin({ top: $r('app.float.notification_appname_margin_top') }) .height($r('app.float.title_font_height')) Row() { @@ -52,11 +52,11 @@ export default struct SettingDialog { Text($r('app.string.closeNotification')) .fontSize($r('app.float.setting_cont_fontsize')) .fontColor($r('app.color.dialog_font_color')) - .height(Constants.SETTING_CONT_HEIGHT) + .height($r('app.float.setting_dialog_row_height')) }.alignItems(HorizontalAlign.Center) .width(Constants.SETTING_CONTENT_WITH) } - .width(Constants.SETTING_DIALOG_WITH) + .width($r('app.float.setting_dialog_row_width')) .alignItems(VerticalAlign.Center) .align(Alignment.Center) .margin({ top: $r('app.float.close_notification_margin_top') }) @@ -70,12 +70,12 @@ export default struct SettingDialog { Text($r('app.string.moreSettings')) .fontSize($r('app.float.setting_cont_fontsize')) .fontColor($r('app.color.dialog_font_back_color')) - .height(Constants.SETTING_CONT_HEIGHT) + .height($r('app.float.setting_dialog_row_height')) }.alignItems(HorizontalAlign.Center) .width(Constants.SETTING_CONTENT_WITH) .align(Alignment.Center) } - .width(Constants.SETTING_DIALOG_WITH) + .width($r('app.float.setting_dialog_row_width')) .alignItems(VerticalAlign.Center) .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.setting_border_radius') }) @@ -92,18 +92,18 @@ export default struct SettingDialog { }.alignItems(HorizontalAlign.Center) .width(Constants.SETTING_CONTENT_WITH) } - .width(Constants.SETTING_DIALOG_WITH) - .margin( {top: $r('app.float.notification_cancle_margin_top')} ) + .width($r('app.float.setting_dialog_row_width')) + .margin({ top: $r('app.float.notification_cancle_margin_top') }) .alignItems(VerticalAlign.Center) .align(Alignment.Center) .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.setting_border_radius') }) .backgroundColor($r('app.color.dialog_font_color')) .onClick(this.closeAbility.bind(this)) - }.height(Constants.SETTING_DIALOG_HEIGHT) - .width(Constants.SETTING_DIALOG_WIDTH) - .backgroundColor('#FFFFFFFF') - .border({ width: $r('app.float.setting_border_width'), color: Color.White, + }.height($r('app.float.setting_dialog_height')) + .width($r('app.float.setting_dialog_width')) + .backgroundColor('#FFFFFFFF') + .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.notification_border_radius') }) } diff --git a/features/noticeitem/src/main/module.json5 b/features/noticeitem/src/main/module.json5 new file mode 100644 index 00000000..30c58a0a --- /dev/null +++ b/features/noticeitem/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "noticeitem", + "type": "har", + "deviceTypes": [ + "phone", + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index cd07c516..243d6b67 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -46,23 +46,23 @@ }, { "name": "title_image_width", - "value": "30" + "value": "48vp" }, { "name": "title_image_height", - "value": "30" + "value": "48vp" }, { "name": "title_font_height", - "value": "28vp" + "value": "56vp" }, { "name": "title_font_margin_t", - "value": "13vp" + "value": "20vp" }, { "name": "message_font_margin_t", - "value": "14vp" + "value": "35vp" }, { "name": "title_name_fontsize", @@ -86,11 +86,11 @@ }, { "name": "setting_title_fontsize", - "value": "40" + "value": "40fp" }, { "name": "setting_cont_fontsize", - "value": "32" + "value": "32fp" }, { "name": "setting_border_width", @@ -100,6 +100,38 @@ "name": "setting_border_radius", "value": "80" }, + { + "name": "setting_dialog_height", + "value": "384vp" + }, + { + "name": "setting_dialog_width", + "value": "672vp" + }, + { + "name": "setting_dialog_row_width", + "value": "608vp" + }, + { + "name": "setting_dialog_row_height", + "value": "80vp" + }, + { + "name": "confirm_dialog_height", + "value": "284vp" + }, + { + "name": "confirm_dialog_width", + "value": "672vp" + }, + { + "name": "confirm_dialog_row_width", + "value": "576vp" + }, + { + "name": "confirm_dialog_button_width", + "value": "362vp" + }, { "name": "notification_border_radius", "value": "24vp" @@ -134,7 +166,7 @@ }, { "name": "confirm_button_margin_t", - "value": "23vp" + "value": "50vp" }, { "name": "icon_item_fontsize", @@ -150,15 +182,15 @@ }, { "name": "close_notification_margin_top", - "value": "15vp" + "value": "34vp" }, { "name": "notification_appname_margin_top", - "value": "11vp" + "value": "22vp" }, { "name": "notification_cancle_margin_top", - "value": "11vp" + "value": "22vp" }, { "name": "device_divider_margin_l", diff --git a/features/ringmodecomponent/.gitignore b/features/ringmodecomponent/.gitignore deleted file mode 100644 index 378eac25..00000000 --- a/features/ringmodecomponent/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/features/ringmodecomponent/build-profile.json5 b/features/ringmodecomponent/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/features/ringmodecomponent/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/features/ringmodecomponent/build.gradle b/features/ringmodecomponent/build.gradle deleted file mode 100644 index ae402d92..00000000 --- a/features/ringmodecomponent/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} \ No newline at end of file diff --git a/features/ringmodecomponent/hvigorfile.js b/features/ringmodecomponent/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/features/ringmodecomponent/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/features/ringmodecomponent/package.json b/features/ringmodecomponent/package.json new file mode 100644 index 00000000..6a97454d --- /dev/null +++ b/features/ringmodecomponent/package.json @@ -0,0 +1,12 @@ +{ + "name": "@ohos/ringmodecomponent", + "version": "1.0.0", + "description": "a npm package which contains ringmodecomponent function", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "module" + }, + "dependencies": { + } +} diff --git a/features/ringmodecomponent/src/main/config.json b/features/ringmodecomponent/src/main/config.json deleted file mode 100644 index ff04f851..00000000 --- a/features/ringmodecomponent/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.ringmodecomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "ringmodecomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/module.json5 b/features/ringmodecomponent/src/main/module.json5 new file mode 100644 index 00000000..2baab273 --- /dev/null +++ b/features/ringmodecomponent/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "ringmodecomponent", + "type": "har", + "deviceTypes": [ + "phone", + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/base/element/float.json b/features/ringmodecomponent/src/main/resources/base/element/float.json index 0ca48030..b9db5349 100644 --- a/features/ringmodecomponent/src/main/resources/base/element/float.json +++ b/features/ringmodecomponent/src/main/resources/base/element/float.json @@ -3,7 +3,8 @@ { "name": "status_bar_ring_mode_width", "value": "27vp" - },{ + }, + { "name": "status_bar_ring_mode_height", "value": "24vp" } diff --git a/features/signalcomponent/.gitignore b/features/signalcomponent/.gitignore deleted file mode 100644 index c795b054..00000000 --- a/features/signalcomponent/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build \ No newline at end of file diff --git a/features/signalcomponent/build-profile.json5 b/features/signalcomponent/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/features/signalcomponent/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/features/signalcomponent/build.gradle b/features/signalcomponent/build.gradle deleted file mode 100644 index ae402d92..00000000 --- a/features/signalcomponent/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} \ No newline at end of file diff --git a/features/signalcomponent/hvigorfile.js b/features/signalcomponent/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/features/signalcomponent/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/features/signalcomponent/package.json b/features/signalcomponent/package.json new file mode 100644 index 00000000..7fd4b627 --- /dev/null +++ b/features/signalcomponent/package.json @@ -0,0 +1,12 @@ +{ + "name": "@ohos/signalcomponent", + "version": "1.0.0", + "description": "a npm package which contains signalcomponent function", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "module" + }, + "dependencies": { + } +} diff --git a/features/signalcomponent/src/main/config.json b/features/signalcomponent/src/main/config.json deleted file mode 100644 index 051c1f42..00000000 --- a/features/signalcomponent/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.signalcomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "signalcomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/app.ets b/features/signalcomponent/src/main/ets/default/app.ets deleted file mode 100644 index 4d568aa2..00000000 --- a/features/signalcomponent/src/main/ets/default/app.ets +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2021 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 default { - onCreate() { - console.info('SystemUI statusBar Application onDestroy') - }, - onDestroy() { - console.info('SystemUI statusBar Application onDestroy') - }, -} diff --git a/features/signalcomponent/src/main/module.json5 b/features/signalcomponent/src/main/module.json5 new file mode 100644 index 00000000..f9183fb0 --- /dev/null +++ b/features/signalcomponent/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "signalcomponent", + "type": "har", + "deviceTypes": [ + "phone", + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/features/statusbarcomponent/.gitignore b/features/statusbarcomponent/.gitignore deleted file mode 100644 index 378eac25..00000000 --- a/features/statusbarcomponent/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/features/statusbarcomponent/build-profile.json5 b/features/statusbarcomponent/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/features/statusbarcomponent/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/features/statusbarcomponent/build.gradle b/features/statusbarcomponent/build.gradle deleted file mode 100644 index 57132181..00000000 --- a/features/statusbarcomponent/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - implementation project(':features:noticeitem') - implementation project(':features:batterycomponent') - implementation project(':features:bluetoothcomponent') - implementation project(':features:capsulecomponent') - implementation project(':features:clockcomponent') - implementation project(':features:locationcomponent') - implementation project(':features:ringmodecomponent') - implementation project(':features:signalcomponent') - implementation project(':features:wificomponent') -} \ No newline at end of file diff --git a/features/statusbarcomponent/hvigorfile.js b/features/statusbarcomponent/hvigorfile.js new file mode 100644 index 00000000..922125d1 --- /dev/null +++ b/features/statusbarcomponent/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/statusbarcomponent/package-lock.json b/features/statusbarcomponent/package-lock.json new file mode 100644 index 00000000..74264d3f --- /dev/null +++ b/features/statusbarcomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/statusbarcomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/statusbarcomponent/package.json b/features/statusbarcomponent/package.json new file mode 100644 index 00000000..abb68bd9 --- /dev/null +++ b/features/statusbarcomponent/package.json @@ -0,0 +1,12 @@ +{ + "devDependencies": {}, + "name": "@ohos/statusbarcomponent", + "description": "a npm package which contains statusbarcomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": {} +} diff --git a/features/statusbarcomponent/src/main/config.json b/features/statusbarcomponent/src/main/config.json deleted file mode 100644 index aac814b5..00000000 --- a/features/statusbarcomponent/src/main/config.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": { - }, - "module": { - "package": "com.ohos.systemui.statusbarcomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "statusbarcomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts index a0b8992d..b1c8d308 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -62,7 +62,8 @@ function parseItemData(itemData: ItemComponentData): StatusBarComponentData { export class StatusBarService { mIsStart: boolean = false; - mAdapter: PluginDataSourceAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this); +// mAdapter: PluginDataSourceAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this); + mAdapter: PluginDataSourceAdapter; mListener: StatusBarListener | undefined; mConfig: any; mStatusBarData: StatusBarData; @@ -78,7 +79,7 @@ export class StatusBarService { this.mStatusBarData = data; } - startService(config) { + startService(config, moduleName) { if (this.mIsStart) { return; } @@ -89,6 +90,7 @@ export class StatusBarService { SwitchUserManager.getInstance().registerListener(this); STATUSBAR_SOURCE_CONFIG.filterDatas = config.MetaSlots; + this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); this.mAdapter.initDataSource(STATUSBAR_SOURCE_CONFIG); Log.showInfo(TAG, `start StatusBarService finish.`); diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index ccf64366..73c24a09 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -43,10 +43,11 @@ export default struct StatusBarComponent { private mStatusBarComponentConfig: any = {} @StorageLink('StatusBarLayout') mStatusBarLayout: any = [[], [], []] @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() + private moduleName: string = '' aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`) - this.initViewModel() + this.initViewModel(this.moduleName) Log.showInfo(TAG, `aboutToAppear End`) } @@ -54,9 +55,9 @@ export default struct StatusBarComponent { Log.showInfo(TAG, `aboutToDisappear`) } - initViewModel() { + initViewModel(moduleName) { Log.showInfo(TAG, `initViewModel`) - ViewModel.initViewModel(this.mStatusBarComponentConfig) + ViewModel.initViewModel(this.mStatusBarComponentConfig, moduleName) } build() { @@ -159,7 +160,7 @@ struct StatusBarBackground { struct StatusBarGroup { @State mComponents: string[] = [] private mLayoutWeight: number = 1 - private mAlignItems: HorizontalAlign = HorizontalAlign.Center; + private mAlignItems: any = HorizontalAlign.Center; @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() aboutToAppear() { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index 18388417..efd6ccbb 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -82,7 +82,7 @@ export class StatusBarVM { } } - initViewModel(config) { + initViewModel(config, moduleName) { if (this.mIsStart) { return; } @@ -90,7 +90,7 @@ export class StatusBarVM { this.mIsStart = true; this.install(); - StatusBarService.startService(config); + StatusBarService.startService(config, moduleName); } setStatusBarLayout(layout: string[][]): void{ @@ -265,8 +265,8 @@ export class StatusBarVM { updateComponentArea(id: string, area: Area): void{ Log.showInfo(TAG, `updateComponentArea, id ${id} area: ${JSON.stringify(area)}`); let areaInfo = { - left: vp2px(area.globalPos.x as number), - top: vp2px(area.globalPos.y as number), + left: vp2px(area.globalPosition.x as number), + top: vp2px(area.globalPosition.y as number), width: vp2px(area.width as number), height: vp2px(area.height as number) }; diff --git a/features/statusbarcomponent/src/main/module.json5 b/features/statusbarcomponent/src/main/module.json5 new file mode 100644 index 00000000..ee1ae93a --- /dev/null +++ b/features/statusbarcomponent/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "statusbarcomponent", + "type": "har", + "deviceTypes": [ + "phone", + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/features/volumecomponent/.gitignore b/features/volumecomponent/.gitignore deleted file mode 100644 index c795b054..00000000 --- a/features/volumecomponent/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build \ No newline at end of file diff --git a/features/volumecomponent/build-profile.json5 b/features/volumecomponent/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/features/volumecomponent/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/features/volumecomponent/build.gradle b/features/volumecomponent/build.gradle deleted file mode 100644 index c9b4bee5..00000000 --- a/features/volumecomponent/build.gradle +++ /dev/null @@ -1,20 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - -} diff --git a/features/volumecomponent/hvigorfile.js b/features/volumecomponent/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/features/volumecomponent/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/features/volumecomponent/package.json b/features/volumecomponent/package.json new file mode 100644 index 00000000..a1e652ce --- /dev/null +++ b/features/volumecomponent/package.json @@ -0,0 +1,12 @@ +{ + "name": "@ohos/volumecomponent", + "version": "1.0.0", + "description": "a npm package which contains volumecomponent function", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "module" + }, + "dependencies": { + } +} diff --git a/features/volumecomponent/src/main/config.json b/features/volumecomponent/src/main/config.json deleted file mode 100644 index 12cd750a..00000000 --- a/features/volumecomponent/src/main/config.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": { - }, - "module": { - "package": "com.ohos.systemui.volumecomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "volumecomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/volumecomponent/src/main/ets/default/app.ets b/features/volumecomponent/src/main/ets/default/app.ets deleted file mode 100644 index 2a3b6238..00000000 --- a/features/volumecomponent/src/main/ets/default/app.ets +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2021 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 default { - onCreate() { - console.info('Application onCreate') - }, - onDestroy() { - console.info('Application onDestroy') - }, -} diff --git a/features/volumecomponent/src/main/module.json5 b/features/volumecomponent/src/main/module.json5 new file mode 100644 index 00000000..21b406db --- /dev/null +++ b/features/volumecomponent/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "volumecomponent", + "type": "har", + "deviceTypes": [ + "phone", + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/features/volumepanelcomponent/.gitignore b/features/volumepanelcomponent/.gitignore deleted file mode 100644 index 378eac25..00000000 --- a/features/volumepanelcomponent/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/features/volumepanelcomponent/build-profile.json5 b/features/volumepanelcomponent/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/features/volumepanelcomponent/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/features/volumepanelcomponent/build.gradle b/features/volumepanelcomponent/build.gradle deleted file mode 100644 index ae402d92..00000000 --- a/features/volumepanelcomponent/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} \ No newline at end of file diff --git a/features/volumepanelcomponent/hvigorfile.js b/features/volumepanelcomponent/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/features/volumepanelcomponent/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/features/volumepanelcomponent/package.json b/features/volumepanelcomponent/package.json new file mode 100644 index 00000000..81b0d14e --- /dev/null +++ b/features/volumepanelcomponent/package.json @@ -0,0 +1,12 @@ +{ + "name": "@ohos/volumepanelcomponent", + "version": "1.0.0", + "description": "a npm package which contains volumepanelcomponent function", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "module" + }, + "dependencies": { + } +} diff --git a/features/volumepanelcomponent/src/main/config.json b/features/volumepanelcomponent/src/main/config.json deleted file mode 100644 index 9413b83c..00000000 --- a/features/volumepanelcomponent/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.volumepanelcomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "volumepanelcomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/module.json5 b/features/volumepanelcomponent/src/main/module.json5 new file mode 100644 index 00000000..5b7f8d9f --- /dev/null +++ b/features/volumepanelcomponent/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "volumepanelcomponent", + "type": "har", + "deviceTypes": [ + "phone", + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/features/wificomponent/.gitignore b/features/wificomponent/.gitignore deleted file mode 100644 index c795b054..00000000 --- a/features/wificomponent/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build \ No newline at end of file diff --git a/features/wificomponent/build-profile.json5 b/features/wificomponent/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/features/wificomponent/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/features/wificomponent/build.gradle b/features/wificomponent/build.gradle deleted file mode 100644 index ae402d92..00000000 --- a/features/wificomponent/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -apply plugin: 'com.huawei.ohos.library' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - buildTypes { - release { - proguardOpt { - proguardEnabled false - rulesFiles 'proguard-rules.pro' - } - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) -} \ No newline at end of file diff --git a/features/wificomponent/hvigorfile.js b/features/wificomponent/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/features/wificomponent/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/features/wificomponent/package.json b/features/wificomponent/package.json new file mode 100644 index 00000000..0e529447 --- /dev/null +++ b/features/wificomponent/package.json @@ -0,0 +1,12 @@ +{ + "name": "@ohos/wificomponent", + "version": "1.0.0", + "description": "a npm package which contains wificomponent function", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "module" + }, + "dependencies": { + } +} diff --git a/features/wificomponent/src/main/config.json b/features/wificomponent/src/main/config.json deleted file mode 100644 index 29c6ccec..00000000 --- a/features/wificomponent/src/main/config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.wificomponent", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "wificomponent", - "moduleType": "har" - }, - "srcPath": "default" - } -} \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/app.ets b/features/wificomponent/src/main/ets/default/app.ets deleted file mode 100644 index 2a3b6238..00000000 --- a/features/wificomponent/src/main/ets/default/app.ets +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2021 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 default { - onCreate() { - console.info('Application onCreate') - }, - onDestroy() { - console.info('Application onDestroy') - }, -} diff --git a/features/wificomponent/src/main/module.json5 b/features/wificomponent/src/main/module.json5 new file mode 100644 index 00000000..896f0c68 --- /dev/null +++ b/features/wificomponent/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "wificomponent", + "type": "har", + "deviceTypes": [ + "phone", + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/features/airplanecomponent/src/main/ets/default/app.ets b/hvigorfile.js similarity index 71% rename from features/airplanecomponent/src/main/ets/default/app.ets rename to hvigorfile.js index 2a3b6238..22fbe15e 100644 --- a/features/airplanecomponent/src/main/ets/default/app.ets +++ b/hvigorfile.js @@ -1,5 +1,5 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. +/** + * Copyright (c) 2022 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 @@ -13,11 +13,5 @@ * limitations under the License. */ -export default { - onCreate() { - console.info('Application onCreate') - }, - onDestroy() { - console.info('Application onDestroy') - }, -} +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').appTasks \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..2997e9ae --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3982 @@ +{ + "name": "systemui", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "systemui", + "version": "1.0.0", + "dependencies": { + "@ohos/hvigor": "1.0.6", + "@ohos/hvigor-ohos-plugin": "1.0.6" + }, + "devDependencies": {} + }, + "node_modules/@ohos/hvigor": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.0.6.tgz", + "integrity": "sha512-jjp7vpvUOMW1Nf7TdyhOtonwWHoSyBJLUiZTQqIx/GJV4UJyIqsiURUOqFwncQ4L7PDdeHuWly4uEelknYeWhg==", + "dependencies": { + "@ohos/hvigor-base": "1.0.6", + "interpret": "1.4.0", + "liftoff": "4.0.0", + "mute-stdout": "1.0.0", + "pretty-hrtime": "1.0.0", + "v8flags": "3.2.0", + "yargs": "7.1.0" + } + }, + "node_modules/@ohos/hvigor-base": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.0.6.tgz", + "integrity": "sha512-cRDnWICTxmpNiFb9clIioqP5Oik1seLCICztXVhZqultrHuxwTheCRUZrHwlpyWdkSB2Al+FFBqmSwzIgZX4IQ==", + "dependencies": { + "json5": "2.2.0", + "log4js": "6.4.1", + "undertaker": "1.2.1" + } + }, + "node_modules/@ohos/hvigor-ohos-plugin": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.0.6.tgz", + "integrity": "sha512-MAAi8uJxMzODUoSSNfBr+fU4HQ20dfQtkje9I+X4asc7qY2kAplW/q9f5XS8IOvv8zhC8OcSgsAXOAJuLMstOQ==", + "dependencies": { + "@ohos/hvigor-base": "1.0.6", + "@ohos/sdkmanager-common": "1.1.3", + "ajv": "8.10.0", + "archiver": "5.3.0", + "execa": "5.1.1", + "fs-extra": "10.0.0", + "glob": "7.2.0", + "iconv-lite": "0.6.3", + "json5": "2.2.0", + "lodash": "4.17.21", + "pretty-hrtime": "1.0.3", + "resolve-package-path": "4.0.3" + } + }, + "node_modules/@ohos/hvigor-ohos-plugin/node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@ohos/hvigor-ohos-plugin/node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@ohos/sdkmanager-common": { + "version": "1.1.3", + "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-1.1.3.tgz", + "integrity": "sha512-d2uhVauDDJZIUvyyaWWoavG4N/jLyfF5IH5kEXKV6R8HNf3606H1zDQzA+UZtOfwwJFXhD9djRjnVFNB8xc7aw==" + }, + "node_modules/ajv": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/archiver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", + "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.0", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "license": "MIT", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "license": "MIT", + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "license": "MIT", + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "license": "MIT", + "dependencies": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "license": "MIT", + "dependencies": { + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "license": "MIT" + }, + "node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "license": "MIT", + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "license": "MIT", + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "license": "MIT", + "dependencies": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/date-format": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.6.tgz", + "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "license": "MIT", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es5-ext": { + "version": "0.10.60", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz", + "integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "license": "ISC", + "dependencies": { + "type": "^2.5.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==", + "license": "ISC" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "license": "MIT", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/fined": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/flagged-respawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", + "license": "MIT", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "license": "ISC" + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "license": "MIT", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "license": "MIT" + }, + "node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "license": "ISC" + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "license": "ISC" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "license": "MIT" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "license": "MIT", + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "license": "MIT", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftoff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "license": "MIT", + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "object.map": "^1.0.1", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "license": "MIT" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "license": "MIT" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "license": "MIT" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", + "license": "MIT" + }, + "node_modules/log4js": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/mute-stdout": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "license": "MIT", + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "license": "MIT", + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "license": "MIT", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "license": "MIT", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "license": "MIT", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "license": "MIT", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "license": "MIT", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz", + "integrity": "sha1-9ualItPmBwRSK/Db5oVu0g515Nw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "license": "MIT", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "license": "MIT", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "license": "ISC" + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-package-path": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/resolve-package-path/-/resolve-package-path-4.0.3.tgz", + "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==", + "license": "MIT", + "dependencies": { + "path-root": "^0.1.1" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "license": "CC0-1.0" + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "license": "MIT" + }, + "node_modules/streamroller": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.6.tgz", + "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "license": "MIT", + "dependencies": { + "date-format": "^4.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.0.1" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "license": "MIT", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex-range/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "license": "ISC" + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undertaker": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "license": "MIT" + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "license": "ISC" + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "license": "MIT", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "license": "ISC" + }, + "node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "license": "MIT", + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "node_modules/yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "license": "ISC", + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + }, + "dependencies": { + "@ohos/hvigor": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.0.6.tgz", + "integrity": "sha512-jjp7vpvUOMW1Nf7TdyhOtonwWHoSyBJLUiZTQqIx/GJV4UJyIqsiURUOqFwncQ4L7PDdeHuWly4uEelknYeWhg==", + "requires": { + "@ohos/hvigor-base": "1.0.6", + "interpret": "1.4.0", + "liftoff": "4.0.0", + "mute-stdout": "1.0.0", + "pretty-hrtime": "1.0.0", + "v8flags": "3.2.0", + "yargs": "7.1.0" + } + }, + "@ohos/hvigor-base": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.0.6.tgz", + "integrity": "sha512-cRDnWICTxmpNiFb9clIioqP5Oik1seLCICztXVhZqultrHuxwTheCRUZrHwlpyWdkSB2Al+FFBqmSwzIgZX4IQ==", + "requires": { + "json5": "2.2.0", + "log4js": "6.4.1", + "undertaker": "1.2.1" + } + }, + "@ohos/hvigor-ohos-plugin": { + "version": "1.0.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.0.6.tgz", + "integrity": "sha512-MAAi8uJxMzODUoSSNfBr+fU4HQ20dfQtkje9I+X4asc7qY2kAplW/q9f5XS8IOvv8zhC8OcSgsAXOAJuLMstOQ==", + "requires": { + "@ohos/hvigor-base": "1.0.6", + "@ohos/sdkmanager-common": "1.1.3", + "ajv": "8.10.0", + "archiver": "5.3.0", + "execa": "5.1.1", + "fs-extra": "10.0.0", + "glob": "7.2.0", + "iconv-lite": "0.6.3", + "json5": "2.2.0", + "lodash": "4.17.21", + "pretty-hrtime": "1.0.3", + "resolve-package-path": "4.0.3" + }, + "dependencies": { + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + } + } + }, + "@ohos/sdkmanager-common": { + "version": "1.1.3", + "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-1.1.3.tgz", + "integrity": "sha512-d2uhVauDDJZIUvyyaWWoavG4N/jLyfF5IH5kEXKV6R8HNf3606H1zDQzA+UZtOfwwJFXhD9djRjnVFNB8xc7aw==" + }, + "ajv": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "archiver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", + "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.0", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "requires": { + "is-number": "^4.0.0" + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "requires": { + "async-done": "^1.2.2" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "date-format": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.6.tgz", + "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.60", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz", + "integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + } + }, + "flagged-respawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==" + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "liftoff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "requires": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "object.map": "^1.0.1", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "log4js": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "requires": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stdout": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=" + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "requires": { + "once": "^1.3.2" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pretty-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz", + "integrity": "sha1-9ualItPmBwRSK/Db5oVu0g515Nw=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "requires": { + "resolve": "^1.20.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-package-path": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/resolve-package-path/-/resolve-package-path-4.0.3.tgz", + "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==", + "requires": { + "path-root": "^0.1.1" + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" + }, + "streamroller": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.6.tgz", + "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "requires": { + "date-format": "^4.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + }, + "dependencies": { + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + } + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..9b49e599 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "devDependencies":{}, + "name":"systemui", + "ohos":{ + "org":"huawei", + "directoryLevel":"project", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{ + "@ohos/hvigor-ohos-plugin":"1.0.6", + "@ohos/hvigor":"1.0.6" + } +} \ No newline at end of file diff --git a/product/default/navigationBar/.gitignore b/product/default/navigationBar/.gitignore deleted file mode 100644 index c795b054..00000000 --- a/product/default/navigationBar/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build \ No newline at end of file diff --git a/product/default/navigationBar/build-profile.json5 b/product/default/navigationBar/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/product/default/navigationBar/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/product/default/navigationBar/build.gradle b/product/default/navigationBar/build.gradle deleted file mode 100644 index 9ca65e26..00000000 --- a/product/default/navigationBar/build.gradle +++ /dev/null @@ -1,16 +0,0 @@ -apply plugin: 'com.huawei.ohos.hap' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - entryModules "phone_entry,pc_entry" -} - -dependencies { - entryImplementation project(':phone_entry') - entryImplementation project(':pc_entry') - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - testCompile 'junit:junit:4.12' - implementation project(':features:navigationservice') -} diff --git a/product/default/navigationBar/hvigorfile.js b/product/default/navigationBar/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/product/default/navigationBar/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/product/default/navigationBar/package-lock.json b/product/default/navigationBar/package-lock.json new file mode 100644 index 00000000..f8dee654 --- /dev/null +++ b/product/default/navigationBar/package-lock.json @@ -0,0 +1,11 @@ +{ + "name": "default_navigationBar", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/navigationservice": { + "version": "file:../../../features/navigationservice" + } + } +} diff --git a/product/default/navigationBar/package.json b/product/default/navigationBar/package.json index 0967ef42..a810f144 100644 --- a/product/default/navigationBar/package.json +++ b/product/default/navigationBar/package.json @@ -1 +1,13 @@ -{} +{ + "devDependencies": {}, + "name": "default_navigationBar", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/navigationservice": "file:../../../features/navigationservice" + } +} diff --git a/product/default/navigationBar/src/main/config.json b/product/default/navigationBar/src/main/config.json deleted file mode 100644 index 21b0b03b..00000000 --- a/product/default/navigationBar/src/main/config.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1, - "name": "1.0" - }, - "singleton": true - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.navigationbar", - "name": ".MyApplication", - "deviceType": [ - "phone", "tablet" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "default_navigationBar", - "moduleType": "feature" - }, - "abilities": [ - { - "visible": true, - "name": "com.ohos.systemui.navigationbar.ServiceExtAbility", - "icon": "$media:icon", - "description": "$string:mainability_description", - "label": "$string:app_name", - "type": "service", - "launchType": "singleton", - "srcPath": "ServiceExtAbility", - "srcLanguage": "ets" - } - ], - "js": [ - {"mode": { - "syntax": "ets", - "type": "pageAbility" - }, - "pages": [ - "pages/index" - ], - "name": "ServiceExtAbility", - "window": { - "designWidth": 720, - "autoDesignWidth": false - } - } - ] - } -} \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/AbilityStage.ts b/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts similarity index 92% rename from product/default/navigationBar/src/main/ets/AbilityStage.ts rename to product/default/navigationBar/src/main/ets/Application/AbilityStage.ts index e89d59b8..7c1ded02 100644 --- a/product/default/navigationBar/src/main/ets/AbilityStage.ts +++ b/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "NavigationBar_AbilityStage" export default class MainAbilityStage extends AbilityStage { diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 1aba4bcc..394ce35e 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -17,7 +17,7 @@ import ServiceExtension from '@ohos.application.ServiceExtensionAbility' import Log from '../../../../../../../common/src/main/ets/default/Log' import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import NavBarConfiguration from './common/NavBarConfiguration' +import NavBarConfiguration from '../common/navbarconfiguration' const TAG = "NavigationBar_ServiceExtAbility" diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/app.ets b/product/default/navigationBar/src/main/ets/ServiceExtAbility/app.ets deleted file mode 100644 index 72ec8953..00000000 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/app.ets +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2021 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 AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import configManager from '../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager' - -let mConfigManager = configManager - -export default { - async onCreate() { - console.info('SystemUI navigationBar Application onCreate') - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config') - AppStorage.SetAndLink("showNavHorizontal", configInfo.showNavHorizontal) - mConfigManager.initConfig() - }, - onDestroy() { - console.info('SystemUI navigationBar Application onDestroy') - }, -} \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/NavBarConfiguration.ts b/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts similarity index 97% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/common/NavBarConfiguration.ts rename to product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts index 53cad273..54317156 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/NavBarConfiguration.ts +++ b/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts @@ -14,8 +14,8 @@ */ import display from '@ohos.display'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import ResourceUtil from '../../../../../../../common/src/main/ets/default/resourceutil'; const TAG = 'NavBarConfiguration'; var directionNav; diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts b/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts similarity index 93% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts rename to product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts index 5156bc40..30dc0c38 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts +++ b/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../common/src/main/ets/default/stylemanager'; const TAG = 'NavigationBar-StyleConfiguration'; diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleManager.ts b/product/default/navigationBar/src/main/ets/common/StyleManager.ts similarity index 92% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleManager.ts rename to product/default/navigationBar/src/main/ets/common/StyleManager.ts index 4782e759..b5d56d67 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/StyleManager.ts +++ b/product/default/navigationBar/src/main/ets/common/StyleManager.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import StyleConfiguration from './StyleConfiguration' +import Log from '../../../../../../../common/src/main/ets/default/log'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; +import StyleConfiguration from './styleconfiguration' const TAG = 'StatusBar-StyleManager'; diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/constants.ts b/product/default/navigationBar/src/main/ets/common/constants.ts similarity index 100% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/common/constants.ts rename to product/default/navigationBar/src/main/ets/common/constants.ts diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/utils/configReader.ts b/product/default/navigationBar/src/main/ets/common/utils/configReader.ts similarity index 96% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/common/utils/configReader.ts rename to product/default/navigationBar/src/main/ets/common/utils/configReader.ts index c230742d..ec880832 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/common/utils/configReader.ts +++ b/product/default/navigationBar/src/main/ets/common/utils/configReader.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import Fileio from '@ohos.fileio'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../../common/src/main/ets/default/log' const DEFAULT_LAYOUT_INFO_FILE_PATH = "/data/accounts/account_0/applications/com.ohos.systemui/" + "com.ohos.systemui.navigationbar/assets/default_navigationBar/resources/rawfile/navigationBarLayoutConfig.json"; diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/i18n/en-US.json b/product/default/navigationBar/src/main/ets/i18n/en-US.json similarity index 100% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/i18n/en-US.json rename to product/default/navigationBar/src/main/ets/i18n/en-US.json diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/i18n/zh-CN.json b/product/default/navigationBar/src/main/ets/i18n/zh-CN.json similarity index 100% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/i18n/zh-CN.json rename to product/default/navigationBar/src/main/ets/i18n/zh-CN.json diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/index.ets b/product/default/navigationBar/src/main/ets/pages/index.ets similarity index 81% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/index.ets rename to product/default/navigationBar/src/main/ets/pages/index.ets index c53ccd38..9af0780c 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/index.ets +++ b/product/default/navigationBar/src/main/ets/pages/index.ets @@ -14,17 +14,18 @@ */ import Three from './threeLayout' -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' import NavigationBarViewModel from '../viewmodel/NavigationBarViewModel'; import {NavigationBarComponentData} from '../common/constants' import StyleManager from '../common/StyleManager' +import configManager from '../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager' const STORAGE_NAVIGATION_TYPE = 'navigationType' const TAG = 'NavigationBar-Index'; - +let mConfigManager = configManager @Entry @Component struct Index { @@ -40,10 +41,12 @@ struct Index { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config') + AppStorage.SetAndLink("showNavHorizontal", configInfo.showNavHorizontal) + mConfigManager.initConfig() setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config') if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode StyleManager.setPadStyle() } else { // Phone Mode diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/keyButton.ets b/product/default/navigationBar/src/main/ets/pages/keyButton.ets similarity index 92% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/keyButton.ets rename to product/default/navigationBar/src/main/ets/pages/keyButton.ets index 6629e4b0..af21119d 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/keyButton.ets +++ b/product/default/navigationBar/src/main/ets/pages/keyButton.ets @@ -13,8 +13,8 @@ * limitations under the License. */ -import keyCodeEvent from '../../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import keyCodeEvent from '../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import Constants from '../common/constants' import StyleConfiguration from '../common/StyleConfiguration' import NavigationBarViewModel from '../viewmodel/NavigationBarViewModel'; diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/oneLayout.ets b/product/default/navigationBar/src/main/ets/pages/oneLayout.ets similarity index 93% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/oneLayout.ets rename to product/default/navigationBar/src/main/ets/pages/oneLayout.ets index 0909c6e9..8bdf6d7c 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/oneLayout.ets +++ b/product/default/navigationBar/src/main/ets/pages/oneLayout.ets @@ -13,9 +13,9 @@ * limitations under the License. */ -import keyButton from './keyButton'; +import keyButton from './keybutton'; import Constants from '../common/constants' -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import Log from '../../../../../../../common/src/main/ets/default/log'; const TAG = 'NavigationBar-OneLayout'; let KeyCodeArr: any[] = [ diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/threeLayout.ets b/product/default/navigationBar/src/main/ets/pages/threeLayout.ets similarity index 95% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/threeLayout.ets rename to product/default/navigationBar/src/main/ets/pages/threeLayout.ets index 4af6d62f..33d72b0a 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/pages/threeLayout.ets +++ b/product/default/navigationBar/src/main/ets/pages/threeLayout.ets @@ -13,9 +13,9 @@ * limitations under the License. */ -import keyButton from './keyButton'; +import keyButton from './keybutton'; import Constants from '../common/constants' -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import Log from '../../../../../../../common/src/main/ets/default/log'; const TAG = 'NavigationBar-ThreeLayout'; let KeyCodeArr: any[] = [ diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts similarity index 91% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/viewmodel/NavigationBarViewModel.ts rename to product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index 6643e0c5..dd99caaa 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -13,16 +13,16 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import WindowManager, { WindowType } from '../../../../../../../../common/src/main/ets/default/WindowManager'; -import getSingleInstance from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager'; +import getSingleInstance from '../../../../../../../common/src/main/ets/default/singleinstancehelper'; import TintStateManager, {TintState, TintStateListener -} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +} from '../../../../../../../common/src/main/ets/default/tintstatemanager'; import {NavigationBarComponentData} from '../common/constants'; import featureAbility from '@ohos.ability.featureAbility'; import settings from '@ohos.settings'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import CommonConstants from "../../../../../../../../common/src/main/ets/default/Constants"; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; +import CommonConstants from "../../../../../../../common/src/main/ets/default/constants"; const TAG = 'NavigationBarViewModel'; diff --git a/product/default/navigationBar/src/main/module.json5 b/product/default/navigationBar/src/main/module.json5 new file mode 100644 index 00000000..2ab07ce1 --- /dev/null +++ b/product/default/navigationBar/src/main/module.json5 @@ -0,0 +1,27 @@ +{ + "module": { + "name": "default_navigationBar", + "type": "feature", + "srcEntrance": "./ets/Application/AbilityStage.ts", + "description": "$string:mainability_description", + "mainElement": "navigationbar.ServiceExtAbility", + "deviceTypes": [ + "phone", "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "uiSyntax": "ets", + "pages": "$profile:main_pages", + "extensionAbilities": [ + { + "visible": true, + "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", + "name": "com.ohos.systemui.navigationbar.ServiceExtAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "service" + } + ] + } +} \ No newline at end of file diff --git a/product/default/navigationBar/src/main/resources/base/profile/main_pages.json b/product/default/navigationBar/src/main/resources/base/profile/main_pages.json new file mode 100644 index 00000000..feec276e --- /dev/null +++ b/product/default/navigationBar/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/index" + ] +} diff --git a/product/default/notificationmanagement/.gitignore b/product/default/notificationmanagement/.gitignore deleted file mode 100644 index c795b054..00000000 --- a/product/default/notificationmanagement/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build \ No newline at end of file diff --git a/product/default/notificationmanagement/build-profile.json5 b/product/default/notificationmanagement/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/product/default/notificationmanagement/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/product/default/notificationmanagement/build.gradle b/product/default/notificationmanagement/build.gradle deleted file mode 100644 index d1dfd5a6..00000000 --- a/product/default/notificationmanagement/build.gradle +++ /dev/null @@ -1,16 +0,0 @@ -apply plugin: 'com.huawei.ohos.hap' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - entryModules "phone_entry,pc_entry" -} - -dependencies { - entryImplementation project(':phone_entry') - entryImplementation project(':pc_entry') - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - testCompile 'junit:junit:4.12' - implementation project(':features:managementcomponent') -} diff --git a/product/default/notificationmanagement/hvigorfile.js b/product/default/notificationmanagement/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/product/default/notificationmanagement/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/product/default/notificationmanagement/package-lock.json b/product/default/notificationmanagement/package-lock.json new file mode 100644 index 00000000..8f0bdacc --- /dev/null +++ b/product/default/notificationmanagement/package-lock.json @@ -0,0 +1,11 @@ +{ + "name": "default_notificationmanagement", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/managementcomponent": { + "version": "file:../../../features/managementcomponent" + } + } +} diff --git a/product/default/notificationmanagement/package.json b/product/default/notificationmanagement/package.json index 0967ef42..00fbfd94 100644 --- a/product/default/notificationmanagement/package.json +++ b/product/default/notificationmanagement/package.json @@ -1 +1,13 @@ -{} +{ + "devDependencies": {}, + "name": "default_notificationmanagement", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/managementcomponent": "file:../../../features/managementcomponent" + } +} diff --git a/product/default/notificationmanagement/src/main/config.json b/product/default/notificationmanagement/src/main/config.json deleted file mode 100644 index 40e2b12f..00000000 --- a/product/default/notificationmanagement/src/main/config.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1, - "name": "1.0" - }, - "singleton": true - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.notificationmanagement", - "name": ".MyApplication", - "deviceType": [ - "phone", "tablet" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "default_notificationmanagement", - "moduleType": "feature" - }, - "abilities": [ - { - "visible": true, - "name": "com.ohos.systemui.notificationmanagement.MainAbility", - "icon": "$media:icon", - "description": "$string:mainability_description", - "label": "$string:app_name", - "type": "page", - "launchType": "singleton", - "srcPath": "MainAbility", - "srcLanguage": "ets" - } - ], - "js": [ - { - "mode": { - "syntax": "ets", - "type": "pageAbility" - }, - "name": "MainAbility", - "window": { - "designWidth": 720, - "autoDesignWidth": false - }, - "pages": [ - "pages/notificationManagenment", - "pages/batchSetEnable", - "pages/noDisturb", - "pages/setEnable", - "pages/noDisturbPre", - "pages/slotSetting" - ] - } - ] - } -} \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/AbilityStage.ts b/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts similarity index 92% rename from product/default/notificationmanagement/src/main/ets/AbilityStage.ts rename to product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts index affea733..788ef5b3 100644 --- a/product/default/notificationmanagement/src/main/ets/AbilityStage.ts +++ b/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "NotificationManagement_AbilityStage" export default class MainAbilityStage extends AbilityStage { diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts index 5c236b8c..cab2e4d7 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts @@ -15,6 +15,7 @@ import Ability from '@ohos.application.Ability' import Log from '../../../../../../../common/src/main/ets/default/Log' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import display from "@ohos.display"; const TAG = "NotificationManagement-MainAbility" @@ -22,6 +23,12 @@ export default class MainAbility extends Ability { onCreate(want, launchParam) { Log.showInfo(TAG, "MainAbility onCreate") globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = want; + display.getDefaultDisplay().then((dis) => { + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_APP_LIST, "dis", { + width: dis.width, + height: dis.height, + }); + }); } onDestroy() { diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/app.ets b/product/default/notificationmanagement/src/main/ets/MainAbility/app.ets deleted file mode 100644 index 2a3b6238..00000000 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/app.ets +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2021 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 default { - onCreate() { - console.info('Application onCreate') - }, - onDestroy() { - console.info('Application onDestroy') - }, -} diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/common/constants.ts b/product/default/notificationmanagement/src/main/ets/common/constants.ts similarity index 100% rename from product/default/notificationmanagement/src/main/ets/MainAbility/common/constants.ts rename to product/default/notificationmanagement/src/main/ets/common/constants.ts diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/batchSetEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets similarity index 84% rename from product/default/notificationmanagement/src/main/ets/MainAbility/pages/batchSetEnable.ets rename to product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets index cceb4fee..80d2b369 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/batchSetEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets @@ -14,17 +14,19 @@ */ //import Window from '@ohos.window'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; -import AppItemComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; +import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appitemcomponent'; import ConfigData from '../common/constants'; import Router from '@system.router' +import ViewModel from '../vm/notificationManagenmentViewModel' const TAG = 'NotificationManagement-BatchSetEnable'; @Entry @Component export default struct BatchSetEnable { + @State mViewModel: ViewModel = new ViewModel(); @StorageLink('appManagementList') appList: any[]= []; @State headName:Resource = $r('app.string.notificationManagement') @@ -61,7 +63,7 @@ export default struct BatchSetEnable { endMargin: $r('app.float.divider_margin_r') }) .width(ConfigData.WH_100_100) - .height($r('app.float.applist_hieght_bat')) + .height(this.mViewModel.isPhone?$r('app.float.applist_hieght_bat_phone'):$r('app.float.applist_hieght_bat')) .padding({ left: $r('app.float.itemComp_padding_l'), right: $r('app.float.itemComp_padding_r') }) .align(Alignment.Top) .backgroundColor(Color.White) @@ -73,14 +75,13 @@ export default struct BatchSetEnable { } .padding({ left: $r('sys.float.ohos_id_default_padding_start'), right: $r('sys.float.ohos_id_default_padding_start') }) .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100) + .flexShrink(1) .useSizeType({ xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } }); } .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100); } } .backgroundColor($r("sys.color.ohos_id_color_sub_background")) @@ -91,6 +92,7 @@ export default struct BatchSetEnable { aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear`) + this.mViewModel.ViewModelInit(); } onBackPress() { diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets similarity index 95% rename from product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturb.ets rename to product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index e2f148e9..cf6c59a9 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -13,15 +13,15 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; import ConfigData from '../common/constants'; import Router from '@system.router' -import { concatTime } from '../../../../../../../../common/src/main/ets/default/TimeManager'; -import ItemComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; -import {DoNotDisturbType} from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; -import NoDisturbingModel from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel'; -import ViewModel from '../vm/noDisturbViewModel' +import { concatTime } from '../../../../../../../common/src/main/ets/default/timemanager'; +import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemcomponent'; +import {DoNotDisturbType} from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; +import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/nodisturbingmodel'; +import ViewModel from '../vm/nodisturbviewmodel' const TAG = 'NotificationManagement-NoDisturb'; const GROUP_REPEAT_MODE = 'repeatMode' @@ -140,6 +140,7 @@ export default struct NoDisturb { radius: $r('app.float.border_radius') }) .backgroundColor(Color.White) .margin({ bottom: $r('app.float.itemComp_margin_b')}) + .flexShrink(1) List() { ListItem() { Row() { @@ -175,6 +176,7 @@ export default struct NoDisturb { radius: $r('app.float.border_radius') }) .backgroundColor(Color.White) .margin({ bottom: $r('app.float.itemComp_margin_b')}) + .flexShrink(1) } else { Row() { ItemComponent({ @@ -278,7 +280,7 @@ struct DateDialog { public controller: CustomDialogController public action: (data) => void private selectedDate: string = '' - private title: string = '' + private title: string | Resource = '' private defaultDate: Date = new Date() private minDate: Date = new Date('2008-01-01'); private maxDate: Date = new Date('2037-12-31'); @@ -292,8 +294,7 @@ struct DateDialog { .textAlign(TextAlign.Center) .fontSize($r('app.float.dialog_title_font')) .fontWeight(FontWeight.Medium) - DatePicker({ start: this.minDate, end: this.maxDate, selected: this.defaultDate, type: DatePickerType.Date }) - .useMilitaryTime(false) + DatePicker({ start: this.minDate, end: this.maxDate, selected: this.defaultDate }) .onChange((date: DatePickerResult) => { let dateSource = new Date(date.year, date.month, date.day); this.selectedDate = NoDisturbingModel.formatDate(dateSource); @@ -349,7 +350,7 @@ struct TimeDialog { public controller: CustomDialogController public action: (data) => void private selectedTime: string = '' - private title: string = '' + private title: string | Resource = '' private defaultDate: Date = new Date() build() { @@ -361,9 +362,9 @@ struct TimeDialog { .textAlign(TextAlign.Center) .fontSize($r('app.float.dialog_title_font')) .fontWeight(FontWeight.Medium) - DatePicker({ selected: this.defaultDate, type: DatePickerType.Time }) + TimePicker({ selected: this.defaultDate, }) .useMilitaryTime(false) - .onChange((date: DatePickerResult) => { + .onChange((date: TimePickerResult) => { this.selectedTime = concatTime(date.hour, date.minute); }) .width(ConfigData.WH_100_100) @@ -416,7 +417,7 @@ struct TimeDialog { struct RepeatModeDialog { public controller: CustomDialogController public action: (data) => void - private title: string= '' + private title: string | Resource = '' private prevModeSetCnt: number = 0 @State selectMode: number = DoNotDisturbType.TYPE_NONE itSelectedBefore: number = -1 diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturbPre.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets similarity index 84% rename from product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturbPre.ets rename to product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets index 0ecea6bc..de148a55 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/noDisturbPre.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets @@ -15,11 +15,11 @@ //import Window from '@ohos.window'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; -import NoDisturbComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent'; -import ItemComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; -import ConfigData from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; +import NoDisturbComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/nodisturbcomponent'; +import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemcomponent'; +import ConfigData from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; import Router from '@system.router'; const TAG = 'NotificationManagement-NoDisturbPre'; diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets similarity index 88% rename from product/default/notificationmanagement/src/main/ets/MainAbility/pages/notificationManagenment.ets rename to product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index 5707292a..bd0cfeb3 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -15,16 +15,16 @@ //import Window from '@ohos.window'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; -import NoDisturbComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent'; -import ItemComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; +import NoDisturbComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/nodisturbcomponent'; +import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemcomponent'; import ConfigData from '../common/constants'; -import AppLstComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent'; +import AppLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/applstcomponent'; import Router from '@system.router'; -import ViewModel from '../vm/notificationManagenmentViewModel' -import Notification from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; -import SwitchComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; +import ViewModel from '../vm/notificationmanagenmentviewmodel' +import Notification from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationlistener'; +import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchcomponent'; const TAG = 'NotificationManagement-Main'; @@ -148,7 +148,7 @@ export default struct notificationManagenment { Column() { AppLstComponent() }.width(ConfigData.WH_100_100) - .height($r('app.float.applist_hieght')) + .height(this.mViewModel.isPhone?$r('app.float.applist_hieght_phone'):$r('app.float.applist_hieght')) .margin({top:$r('app.float.applist_margin_t')}); } diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/setEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets similarity index 85% rename from product/default/notificationmanagement/src/main/ets/MainAbility/pages/setEnable.ets rename to product/default/notificationmanagement/src/main/ets/pages/setEnable.ets index e2340bd2..499a5d04 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/setEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets @@ -14,14 +14,14 @@ */ //import Window from '@ohos.window'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; -import AppItemComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; -import SwitchComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; -import SlotLstComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; +import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appitemcomponent'; +import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchcomponent'; +import SlotLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/slotlstcomponent'; import ConfigData from '../common/constants'; import Router from '@system.router' -import Notification from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; +import Notification from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationlistener'; const TAG = 'NotificationManagement-SetEnable'; diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/slotSetting.ets b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets similarity index 91% rename from product/default/notificationmanagement/src/main/ets/MainAbility/pages/slotSetting.ets rename to product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets index bf6eee85..27e5574d 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/pages/slotSetting.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets @@ -13,14 +13,14 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; -import AppItemComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; -import SwitchComponent from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; +import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appitemcomponent'; +import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchcomponent'; import ConfigData from '../common/constants'; -import NotificationConfigData from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; +import NotificationConfigData from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; import Router from '@system.router' -import Notification from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; +import Notification from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationlistener'; import {SlotLevel} from '@ohos.notification'; const TAG = 'NotificationManagement-SlotSetting'; diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/vm/noDisturbViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts similarity index 91% rename from product/default/notificationmanagement/src/main/ets/MainAbility/vm/noDisturbViewModel.ts rename to product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts index 35858d00..42b8ad00 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/vm/noDisturbViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts @@ -14,10 +14,10 @@ */ import ConfigData from '../common/constants'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import NoDisturbingModel from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel'; -import NoDisturbComponentViewModel from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel'; -import FeaturesConfigData, {DoNotDisturbType} from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/nodisturbingmodel'; +import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/nodisturbcomponentviewmodel'; +import FeaturesConfigData, {DoNotDisturbType} from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; const TAG = 'NotificationManagement-NoDisturbViewModel' const CONST_DAY_LENGTH = 24*3600*1000 diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/vm/notificationManagenmentViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts similarity index 70% rename from product/default/notificationmanagement/src/main/ets/MainAbility/vm/notificationManagenmentViewModel.ts rename to product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts index 7428c96c..8b46792b 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/vm/notificationManagenmentViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts @@ -14,20 +14,21 @@ */ import ConfigData from '../common/constants'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import BundleResourceModel from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel'; -import NoDisturbComponentViewModel from '../../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel' +import Log from '../../../../../../../common/src/main/ets/default/log'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' +import BundleResourceModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/bundleresourcemodel'; +import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/nodisturbcomponentviewmodel' import Router from '@system.router'; const TAG = 'NotificationManagement-NotificationManagenmentViewModel' export default class NotificationManagenmentViewModel extends NoDisturbComponentViewModel { - + isPhone = false; ViewModelInit(): void{ Log.showInfo(TAG, 'ViewModelInit'); super.ViewModelInit(); this.MigrateTo(); + this.judgeDeviceType(); } RefreshNoDisturbState() { @@ -57,6 +58,13 @@ export default class NotificationManagenmentViewModel extends NoDisturbComponent //clear want globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = null; } -} + judgeDeviceType(){ + Log.showInfo(TAG, "judgeDeviceType"); + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_APP_LIST, 'dis'); + Log.showInfo(TAG, `judgeDeviceType, configInfo: ${configInfo} `); + if (configInfo.width < configInfo.height) { + this.isPhone = true; + } + } } \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/module.json5 b/product/default/notificationmanagement/src/main/module.json5 new file mode 100644 index 00000000..c007e48c --- /dev/null +++ b/product/default/notificationmanagement/src/main/module.json5 @@ -0,0 +1,27 @@ +{ + "module": { + "name": "default_notificationmanagement", + "type": "feature", + "srcEntrance": "./ets/Application/AbilityStage.ts", + "description": "$string:mainability_description", + "mainElement": "notificationmanagement.MainAbility", + "deviceTypes": [ + "phone", "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "uiSyntax": "ets", + "pages": "$profile:main_pages", + "abilities": [ + { + "visible": true, + "srcEntrance": "./ets/MainAbility/MainAbility.ts", + "name": "com.ohos.systemui.notificationmanagement.MainAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "launchType": "singleton" + } + ] + } +} \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/resources/base/profile/main_pages.json b/product/default/notificationmanagement/src/main/resources/base/profile/main_pages.json new file mode 100644 index 00000000..8928bf82 --- /dev/null +++ b/product/default/notificationmanagement/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,10 @@ +{ + "src": [ + "pages/notificationManagenment", + "pages/batchSetEnable", + "pages/noDisturb", + "pages/setEnable", + "pages/noDisturbPre", + "pages/slotSetting" + ] +} diff --git a/product/default/volumepanel/.gitignore b/product/default/volumepanel/.gitignore deleted file mode 100644 index 378eac25..00000000 --- a/product/default/volumepanel/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/product/default/volumepanel/build-profile.json5 b/product/default/volumepanel/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/product/default/volumepanel/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/product/default/volumepanel/build.gradle b/product/default/volumepanel/build.gradle deleted file mode 100644 index f04efab4..00000000 --- a/product/default/volumepanel/build.gradle +++ /dev/null @@ -1,16 +0,0 @@ -apply plugin: 'com.huawei.ohos.hap' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - entryModules "phone_entry,pc_entry" -} - -dependencies { - entryImplementation project(':phone_entry') - entryImplementation project(':pc_entry') - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - testCompile 'junit:junit:4.12' - implementation project(':features:volumepanelcomponent') -} \ No newline at end of file diff --git a/product/default/volumepanel/hvigorfile.js b/product/default/volumepanel/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/product/default/volumepanel/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/product/default/volumepanel/package-lock.json b/product/default/volumepanel/package-lock.json new file mode 100644 index 00000000..dff3e4e8 --- /dev/null +++ b/product/default/volumepanel/package-lock.json @@ -0,0 +1,11 @@ +{ + "name": "default_volumepanel", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/volumepanelcomponent": { + "version": "file:../../../features/volumepanelcomponent" + } + } +} diff --git a/product/default/volumepanel/package.json b/product/default/volumepanel/package.json index 0967ef42..823aba76 100644 --- a/product/default/volumepanel/package.json +++ b/product/default/volumepanel/package.json @@ -1 +1,13 @@ -{} +{ + "devDependencies": {}, + "name": "default_volumepanel", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/volumepanelcomponent": "file:../../../features/volumepanelcomponent" + } +} diff --git a/product/default/volumepanel/src/main/config.json b/product/default/volumepanel/src/main/config.json deleted file mode 100644 index 19a549b2..00000000 --- a/product/default/volumepanel/src/main/config.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1, - "name": "1.0" - }, - "singleton": true - }, - "deviceConfig": { - "default": { - "keepAlive": true - } - }, - "module": { - "package": "com.ohos.systemui.volumepanel", - "name": ".MyApplication", - "deviceType": [ - "phone", "tablet" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "default_volumepanel", - "moduleType": "feature" - }, - "abilities": [ - { - "visible": true, - "name": "com.ohos.systemui.volumepanel.ServiceExtAbility", - "icon": "$media:icon", - "description": "$string:mainability_description", - "label": "$string:app_name", - "type": "service", - "launchType": "singleton", - "srcPath": "ServiceExtAbility", - "srcLanguage": "ets" - } - ], - "js": [ - {"mode": { - "syntax": "ets", - "type": "pageAbility" - }, - "pages": [ - "pages/index" - ], - "name": "ServiceExtAbility", - "window": { - "designWidth": 720, - "autoDesignWidth": false - } - } - ] - } -} \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/AbilityStage.ts b/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts similarity index 36% rename from product/default/volumepanel/src/main/ets/AbilityStage.ts rename to product/default/volumepanel/src/main/ets/Application/AbilityStage.ts index fcdeeba1..9fccb6e4 100644 --- a/product/default/volumepanel/src/main/ets/AbilityStage.ts +++ b/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts @@ -13,11 +13,36 @@ * limitations under the License. */ import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../common/src/main/ets/default/log' +//import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' +//import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' const TAG = "volume_AbilityStage" export default class MainAbilityStage extends AbilityStage { - onCreate() { + async onCreate() { Log.showInfo(TAG, "onCreate") +// let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis') +// let volumeRect; +// if (configInfo.width > configInfo.height) { // Pad、PC Mode +// const realWidth = 48; +// const realHeight = 284; +// volumeRect = { +// left: configInfo.width - vp2px(16) - vp2px(realWidth), +// top: (configInfo.height - vp2px(realHeight) ) / 2, +// width: vp2px(realWidth) , +// height: vp2px(realHeight) +// } +// } else { // Phone Mode +// const realWidth = 96; +// const realHeight = 568; +// volumeRect = { +// left: configInfo.width - vp2px(32) - vp2px(realWidth), +// top: configInfo.height * 0.1, +// width: vp2px(realWidth) , +// height: vp2px(realHeight) +// } +// } +// AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'rect', volumeRect) +// WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); } } \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/pages/index.ets b/product/default/volumepanel/src/main/ets/ServiceExtAbility/pages/index.ets deleted file mode 100644 index d5a0618e..00000000 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/pages/index.ets +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 Constants from '../common/constants' -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' -import VolumePanelComponent from '../../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent' -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StyleManager from '../common/StyleManager' - -const TAG = 'VolumePanel-Index' - -@Entry -@Component -struct Index { - aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) - setAppBgColor('#00000000') - CommonStyleManager.setAbilityPageName(TAG) - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis') - Log.showInfo(TAG, `configInfo Start, configInfo ${JSON.stringify(configInfo)}`); - if (configInfo.width > configInfo.height) { // Pad、PC Mode - StyleManager.setStyle() - } - } - - aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`) - } - - build() { - Column() { - VolumePanelComponent() - } - .width('100%') - .height('100%') - } -} diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts b/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts similarity index 85% rename from product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts rename to product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts index 9c7d17d3..591ba062 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts +++ b/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../common/src/main/ets/default/stylemanager'; -const TAG = 'StatusBar-StyleConfiguration'; +const TAG = 'VolumePanel-StyleConfiguration'; export default class StyleConfiguration { static getIndexStyle() { diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleManager.ts b/product/default/volumepanel/src/main/ets/common/StyleManager.ts similarity index 90% rename from product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleManager.ts rename to product/default/volumepanel/src/main/ets/common/StyleManager.ts index f074b6d1..38b1f34e 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleManager.ts +++ b/product/default/volumepanel/src/main/ets/common/StyleManager.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import StyleConfiguration from '../../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration' +import Log from '../../../../../../../common/src/main/ets/default/log'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; +import StyleConfiguration from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/styleconfiguration' const TAG = 'VolumePanel-StyleManager'; diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/constants.ts b/product/default/volumepanel/src/main/ets/common/constants.ts similarity index 100% rename from product/default/volumepanel/src/main/ets/ServiceExtAbility/common/constants.ts rename to product/default/volumepanel/src/main/ets/common/constants.ts diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/app.ets b/product/default/volumepanel/src/main/ets/pages/index.ets similarity index 60% rename from product/default/volumepanel/src/main/ets/ServiceExtAbility/app.ets rename to product/default/volumepanel/src/main/ets/pages/index.ets index 8a989da2..89de0209 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/app.ets +++ b/product/default/volumepanel/src/main/ets/pages/index.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2022 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 @@ -13,12 +13,22 @@ * limitations under the License. */ +import Constants from '../common/constants' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import VolumePanelComponent from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager' +import StyleManager from '../common/StyleManager' +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' -export default { - onCreate() { - console.info('SystemUI volumePanel Application onCreate') + +const TAG = 'VolumePanel-Index' + +@Entry +@Component +struct Index { + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start`) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis') let volumeRect; if (configInfo.width > configInfo.height) { // Pad、PC Mode @@ -42,8 +52,24 @@ export default { } AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'rect', volumeRect) WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); - }, - onDestroy() { - console.info('SystemUI volumePanel Application onDestroy') - }, + + setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + Log.showInfo(TAG, `configInfo Start, configInfo ${JSON.stringify(configInfo)}`); + if (configInfo.width > configInfo.height) { // Pad、PC Mode + StyleManager.setStyle() + } + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`) + } + + build() { + Column() { + VolumePanelComponent() + } + .width('100%') + .height('100%') + } } diff --git a/product/default/volumepanel/src/main/module.json5 b/product/default/volumepanel/src/main/module.json5 new file mode 100644 index 00000000..1d0ff71a --- /dev/null +++ b/product/default/volumepanel/src/main/module.json5 @@ -0,0 +1,27 @@ +{ + "module": { + "name": "default_volumepanel", + "type": "feature", + "srcEntrance": "./ets/Application/AbilityStage.ts", + "description": "$string:mainability_description", + "mainElement": "volumepanel.ServiceExtAbility", + "deviceTypes": [ + "phone", "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "uiSyntax": "ets", + "pages": "$profile:main_pages", + "extensionAbilities": [ + { + "visible": true, + "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", + "name": "com.ohos.systemui.volumepanel.ServiceExtAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "service" + } + ] + } +} \ No newline at end of file diff --git a/product/default/volumepanel/src/main/resources/base/profile/main_pages.json b/product/default/volumepanel/src/main/resources/base/profile/main_pages.json new file mode 100644 index 00000000..feec276e --- /dev/null +++ b/product/default/volumepanel/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/index" + ] +} diff --git a/product/pc/controlpanel/.gitignore b/product/pc/controlpanel/.gitignore deleted file mode 100644 index c795b054..00000000 --- a/product/pc/controlpanel/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build \ No newline at end of file diff --git a/product/pc/controlpanel/build-profile.json5 b/product/pc/controlpanel/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/product/pc/controlpanel/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/product/pc/controlpanel/build.gradle b/product/pc/controlpanel/build.gradle deleted file mode 100644 index 37139a6a..00000000 --- a/product/pc/controlpanel/build.gradle +++ /dev/null @@ -1,22 +0,0 @@ -apply plugin: 'com.huawei.ohos.hap' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - entryModules "pc_entry" -} - -dependencies { - entryImplementation project(':pc_entry') - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - testCompile 'junit:junit:4.12' - implementation project(':features:controlcentercomponent') - implementation project(':features:airplanecomponent') - implementation project(':features:autorotatecomponent') - implementation project(':features:bluetoothcomponent') - implementation project(':features:brightnesscomponent') - implementation project(':features:locationcomponent') - implementation project(':features:ringmodecomponent') - implementation project(':features:wificomponent') -} diff --git a/product/pc/controlpanel/hvigorfile.js b/product/pc/controlpanel/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/product/pc/controlpanel/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/product/pc/controlpanel/package-lock.json b/product/pc/controlpanel/package-lock.json new file mode 100644 index 00000000..2b28127b --- /dev/null +++ b/product/pc/controlpanel/package-lock.json @@ -0,0 +1,11 @@ +{ + "name": "pc_controlpanel", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/controlcentercomponent": { + "version": "file:../../../features/controlcentercomponent" + } + } +} diff --git a/product/pc/controlpanel/package.json b/product/pc/controlpanel/package.json index 0967ef42..1c6379c7 100644 --- a/product/pc/controlpanel/package.json +++ b/product/pc/controlpanel/package.json @@ -1 +1,13 @@ -{} +{ + "devDependencies": {}, + "name": "pc_controlpanel", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/controlcentercomponent": "file:../../../features/controlcentercomponent" + } +} diff --git a/product/pc/controlpanel/src/main/config.json b/product/pc/controlpanel/src/main/config.json deleted file mode 100644 index 8b39a12d..00000000 --- a/product/pc/controlpanel/src/main/config.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1, - "name": "1.0" - }, - "singleton": true - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.controlpanel", - "name": ".MyApplication", - "deviceType": [ - "tablet" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "pc_controlpanel", - "moduleType": "feature" - }, - "abilities": [ - { - "visible": true, - "skills": [ - { - "actions": [ - "com.ohos.systemui.action.BAR_ICON" - ] - } - ], - "name": "com.ohos.systemui.controlpanel.ServiceExtAbility", - "icon": "$media:ic_controlcenter_oh", - "description": "$string:mainability_description", - "label": "$string:app_name", - "type": "service", - "launchType": "singleton", - "srcPath": "ServiceExtAbility", - "srcLanguage": "ets", - "metaData": { - "customizeData" : [ - { - "name": "com.ohos.systemui.action.BAR_ICON", - "value": "", - "extra": "\"pluginType\":\"1\",\"clickAction\":\"local=showControlCenter\",\"selectedClickAction\":\"local=hideControlCenter\",\"relationWindowId\":\"SystemUi_ControlPanel\"" - } - ] - } - } - ], - "js": [ - { - "mode": { - "syntax": "ets", - "type": "pageAbility" - }, - "name": "ServiceExtAbility", - "window": { - "designWidth": 1280, - "autoDesignWidth": false - }, - "pages": ["pages/index"] - } - ] - } -} \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/AbilityStage.ts b/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts similarity index 92% rename from product/pc/controlpanel/src/main/ets/AbilityStage.ts rename to product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts index 858fe570..a32f8d75 100644 --- a/product/pc/controlpanel/src/main/ets/AbilityStage.ts +++ b/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "ControlPanel_AbilityStage" export default class MainAbilityStage extends AbilityStage { diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/app.ets b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/app.ets deleted file mode 100644 index 5d2d9ef2..00000000 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/app.ets +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2021 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 default { - onCreate() { - console.info('SystemUI ControlPanel Application onCreate') - }, - onDestroy() { - console.info('SystemUI ControlPanel Application onDestroy') - }, -} diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts b/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts similarity index 94% rename from product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts rename to product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts index 44173d27..b7600690 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {FASlotName} from '../../../../../../../../../common/src/main/ets/default/Constants'; +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; type pluginIconData = { id: string; diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts similarity index 90% rename from product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts rename to product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts index e54b8095..e76a15e3 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../../common/src/main/ets/default/stylemanager'; const TAG = 'ControlPanel-StyleConfiguration'; diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts similarity index 95% rename from product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts rename to product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts index ec385fe1..3a155700 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts @@ -13,13 +13,13 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import CommonTemplateStyleConfiguration from '../../../../../../../../../common/src/main/ets/template/common/StyleConfiguration'; -import ControlCenterStyleConfiguration from '../../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration' -import BrightnessStyleConfiguration from '../../../../../../../../../features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration' -import RingModeStyleConfiguration from '../../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration' -import IndexStyleConfiguration from './StyleConfiguration' +import Log from '../../../../../../../../common/src/main/ets/default/log'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; +import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/styleconfiguration'; +import ControlCenterStyleConfiguration from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/styleconfiguration' +import BrightnessStyleConfiguration from '../../../../../../../../features/brightnesscomponent/src/main/ets/default/common/styleconfiguration' +import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/styleconfiguration' +import IndexStyleConfiguration from './styleconfiguration' const TAG = 'ControlPanel-StyleManager'; diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts b/product/pc/controlpanel/src/main/ets/pages/common/constants.ts similarity index 100% rename from product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts rename to product/pc/controlpanel/src/main/ets/pages/common/constants.ts diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/control.ets b/product/pc/controlpanel/src/main/ets/pages/control.ets similarity index 81% rename from product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/control.ets rename to product/pc/controlpanel/src/main/ets/pages/control.ets index 0ec03116..a07a4b2f 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/control.ets +++ b/product/pc/controlpanel/src/main/ets/pages/control.ets @@ -12,8 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ControlCenterComponent from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent' -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import ControlCenterComponent from '../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent' +import Log from '../../../../../../../common/src/main/ets/default/Log' import Constants from './common/constants' import ControlCenterConfig from './common/ControlCenterConfig'; @@ -37,7 +37,8 @@ export default struct Control { mControlCenterComponentConfig: ControlCenterConfig, mSimpleToggleColumnCount: Constants.DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT, modeChangeCallback: (isEdit) => this.modeChangeCallback(isEdit), - titleDisplayInside: true + titleDisplayInside: true, + moduleName: 'pc_controlpanel', }) } .width('100%') diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets similarity index 89% rename from product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/index.ets rename to product/pc/controlpanel/src/main/ets/pages/index.ets index 568bca21..9474e2a7 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -14,22 +14,22 @@ */ import image from "@ohos.multimedia.image" -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' -import HeightConfigUtils from '../../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/AbilityManager' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/AbilityManager' import StyleConfiguration from './common/StyleConfiguration' import StyleManager from './common/StyleManager' import ControlCenterComponent from './control' import WindowManager, { WindowType, WINDOW_SHOW_HIDE_EVENT, -} from "../../../../../../../../common/src/main/ets/default/WindowManager"; -import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager"; -import {START_ABILITY_EVENT} from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +} from "../../../../../../../common/src/main/ets/default/WindowManager"; +import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager"; +import {START_ABILITY_EVENT} from "../../../../../../../common/src/main/ets/default/event/EventUtil"; import MultimodalInputManager, { MultiKeyCode, -} from "../../../../../../../../common/src/main/ets/default/MultimodalInputManager"; +} from "../../../../../../../common/src/main/ets/default/MultimodalInputManager"; const TAG = 'ControlPanel-Index' diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js similarity index 90% rename from product/pc/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js rename to product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index 3135d74c..967798c6 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -14,10 +14,10 @@ */ import worker from "@ohos.worker"; -import Log from "../../../../../../../../common/src/main/ets/default/Log"; +import Log from "../../../../../../../common/src/main/ets/default/log"; import PluginDataSourceManager -from "../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager"; -import Constants, { obtainMsg } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; +from "../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager"; +import Constants, { obtainMsg } from "../../../../../../../common/src/main/ets/plugindatasource/common/constants"; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; diff --git a/product/pc/controlpanel/src/main/module.json5 b/product/pc/controlpanel/src/main/module.json5 new file mode 100644 index 00000000..8e663898 --- /dev/null +++ b/product/pc/controlpanel/src/main/module.json5 @@ -0,0 +1,40 @@ +{ + "module": { + "name": "pc_controlpanel", + "type": "feature", + "srcEntrance": "./ets/Application/AbilityStage.ts", + "description": "$string:mainability_description", + "mainElement": "controlpanel.ServiceExtAbility", + "deviceTypes": [ + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "uiSyntax": "ets", + "pages": "$profile:main_pages", + "extensionAbilities": [ + { + "visible": true, + "skills": [ + { + "actions": [ + "com.ohos.systemui.action.BAR_ICON" + ] + } + ], + "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", + "name": "com.ohos.systemui.controlpanel.ServiceExtAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "service", + "metadata": [ + { + "name": "com.ohos.systemui.action.BAR_ICON", + "value": "\"pluginType\":\"1\",\"clickAction\":\"local=showControlCenter\",\"selectedClickAction\":\"local=hideControlCenter\",\"relationWindowId\":\"SystemUi_ControlPanel\"" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/resources/base/element/color.json b/product/pc/controlpanel/src/main/resources/base/element/color.json index 242e5372..36be7095 100644 --- a/product/pc/controlpanel/src/main/resources/base/element/color.json +++ b/product/pc/controlpanel/src/main/resources/base/element/color.json @@ -7,6 +7,22 @@ { "name": "default_font_color", "value": "#000000" + }, + { + "name": "brightness_slider_block_color", + "value": "#FFFFFFFF" + }, + { + "name": "brightness_slider_track_color", + "value": "#1A000000" + }, + { + "name": "brightness_slider_selected_color", + "value": "#FF007DFF" + }, + { + "name": "control_center_complex_toggle_ring_mode_on_bg_color", + "value": "#FFFF9800" } ] } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/resources/base/element/float.json b/product/pc/controlpanel/src/main/resources/base/element/float.json index 8cda5658..8af13100 100644 --- a/product/pc/controlpanel/src/main/resources/base/element/float.json +++ b/product/pc/controlpanel/src/main/resources/base/element/float.json @@ -3,6 +3,58 @@ { "name": "default_border_radius", "value": "24vp" + }, + { + "name": "brightness_margin_left", + "value": "26vp" + }, + { + "name": "brightness_margin_right", + "value": "26vp" + }, + { + "name": "brightness_component_gap", + "value": "26vp" + }, + { + "name": "brightness_reduce_width", + "value": "44vp" + }, + { + "name": "brightness_reduce_height", + "value": "44vp" + }, + { + "name": "brightness_plus_width", + "value": "44vp" + }, + { + "name": "brightness_plus_height", + "value": "44vp" + }, + { + "name": "brightness_height", + "value": "44vp" + }, + { + "name": "brightness_slider_height", + "value": "40vp" + }, + { + "name": "status_bar_location_width", + "value": "20vp" + }, + { + "name": "status_bar_location_height", + "value": "24vp" + }, + { + "name": "status_bar_ring_mode_width", + "value": "27vp" + }, + { + "name": "status_bar_ring_mode_height", + "value": "24vp" } ] } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/resources/base/element/string.json b/product/pc/controlpanel/src/main/resources/base/element/string.json index 6e983a57..db3fc9a5 100644 --- a/product/pc/controlpanel/src/main/resources/base/element/string.json +++ b/product/pc/controlpanel/src/main/resources/base/element/string.json @@ -7,6 +7,30 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "airplane_mode", + "value": "飞行模式" + }, + { + "name": "control_center_complex_toggle_bluetooth_title", + "value": "蓝牙" + }, + { + "name": "control_center_complex_toggle_location_title", + "value": "位置信息" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_on", + "value": "响铃" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_off", + "value": "静音" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_vibration", + "value": "振动" } ] } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/resources/base/media/airplane.svg b/product/pc/controlpanel/src/main/resources/base/media/airplane.svg new file mode 100644 index 00000000..d648b9f9 --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/airplane.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/resources/base/media/airplane_d.svg b/product/pc/controlpanel/src/main/resources/base/media/airplane_d.svg new file mode 100644 index 00000000..ad2180b1 --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/airplane_d.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_brightness_plus.svg b/product/pc/controlpanel/src/main/resources/base/media/ic_brightness_plus.svg new file mode 100644 index 00000000..e6763c2a --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/ic_brightness_plus.svg @@ -0,0 +1,12 @@ + + + diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_brightness_reduce.svg b/product/pc/controlpanel/src/main/resources/base/media/ic_brightness_reduce.svg new file mode 100644 index 00000000..d1fa819a --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/ic_brightness_reduce.svg @@ -0,0 +1,12 @@ + + + diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt.svg b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt.svg new file mode 100644 index 00000000..0ae8745d --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg new file mode 100644 index 00000000..2be2692c --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_gps.svg b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_gps.svg new file mode 100644 index 00000000..f6eea851 --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_gps.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg new file mode 100644 index 00000000..dd3c5971 --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg new file mode 100644 index 00000000..4f2ae548 --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg new file mode 100644 index 00000000..3f7bb0ea --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/product/pc/controlpanel/src/main/resources/base/media/wifi.svg b/product/pc/controlpanel/src/main/resources/base/media/wifi.svg new file mode 100644 index 00000000..1c2d188d --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/wifi.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/controlpanel/src/main/resources/base/media/wifi_d.svg b/product/pc/controlpanel/src/main/resources/base/media/wifi_d.svg new file mode 100644 index 00000000..c36aee97 --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/wifi_d.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/controlpanel/src/main/resources/base/profile/main_pages.json b/product/pc/controlpanel/src/main/resources/base/profile/main_pages.json new file mode 100644 index 00000000..feec276e --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/index" + ] +} diff --git a/product/pc/controlpanel/src/main/resources/en_US/element/string.json b/product/pc/controlpanel/src/main/resources/en_US/element/string.json index 6e983a57..149ca86b 100644 --- a/product/pc/controlpanel/src/main/resources/en_US/element/string.json +++ b/product/pc/controlpanel/src/main/resources/en_US/element/string.json @@ -7,6 +7,30 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "airplane_mode", + "value": "Airplane mode" + }, + { + "name": "control_center_complex_toggle_bluetooth_title", + "value": "Bluetooth" + }, + { + "name": "control_center_complex_toggle_location_title", + "value": "Location" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_on", + "value": "Sound" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_off", + "value": "Silent" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_vibration", + "value": "Vibration" } ] } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/resources/zh_CN/element/string.json b/product/pc/controlpanel/src/main/resources/zh_CN/element/string.json index 6e983a57..db3fc9a5 100644 --- a/product/pc/controlpanel/src/main/resources/zh_CN/element/string.json +++ b/product/pc/controlpanel/src/main/resources/zh_CN/element/string.json @@ -7,6 +7,30 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "airplane_mode", + "value": "飞行模式" + }, + { + "name": "control_center_complex_toggle_bluetooth_title", + "value": "蓝牙" + }, + { + "name": "control_center_complex_toggle_location_title", + "value": "位置信息" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_on", + "value": "响铃" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_off", + "value": "静音" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_vibration", + "value": "振动" } ] } \ No newline at end of file diff --git a/product/pc/notificationpanel/.gitignore b/product/pc/notificationpanel/.gitignore deleted file mode 100644 index c795b054..00000000 --- a/product/pc/notificationpanel/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build \ No newline at end of file diff --git a/product/pc/notificationpanel/build-profile.json5 b/product/pc/notificationpanel/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/product/pc/notificationpanel/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/product/pc/notificationpanel/build.gradle b/product/pc/notificationpanel/build.gradle deleted file mode 100644 index 7c4bc65d..00000000 --- a/product/pc/notificationpanel/build.gradle +++ /dev/null @@ -1,15 +0,0 @@ -apply plugin: 'com.huawei.ohos.hap' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - entryModules "pc_entry" -} - -dependencies { - entryImplementation project(':pc_entry') - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - testCompile 'junit:junit:4.12' - implementation project(':features:noticeitem') -} diff --git a/product/pc/notificationpanel/hvigorfile.js b/product/pc/notificationpanel/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/product/pc/notificationpanel/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/product/pc/notificationpanel/package-lock.json b/product/pc/notificationpanel/package-lock.json new file mode 100644 index 00000000..a2834bb6 --- /dev/null +++ b/product/pc/notificationpanel/package-lock.json @@ -0,0 +1,11 @@ +{ + "name": "pc_notificationpanel", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/noticeitem": { + "version": "file:../../../features/noticeitem" + } + } +} diff --git a/product/pc/notificationpanel/package.json b/product/pc/notificationpanel/package.json index 0967ef42..e8701387 100644 --- a/product/pc/notificationpanel/package.json +++ b/product/pc/notificationpanel/package.json @@ -1 +1,13 @@ -{} +{ + "devDependencies": {}, + "name": "pc_notificationpanel", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/noticeitem": "file:../../../features/noticeitem" + } +} diff --git a/product/pc/notificationpanel/src/main/config.json b/product/pc/notificationpanel/src/main/config.json deleted file mode 100644 index 4f88ef4a..00000000 --- a/product/pc/notificationpanel/src/main/config.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1, - "name": "1.0" - }, - "singleton": true - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.notificationpanel", - "name": ".MyApplication", - "deviceType": [ - "tablet" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "pc_notificationpanel", - "moduleType": "feature" - }, - "abilities": [ - { - "visible": true, - "skills": [ - { - "actions": [ - "com.ohos.systemui.action.BAR_ICON" - ] - } - ], - "name": "com.ohos.systemui.notificationpanel.ServiceExtAbility", - "icon": "$media:ic_message_filled", - "description": "$string:mainability_description", - "label": "$string:app_name", - "type": "service", - "launchType": "singleton", - "srcPath": "ServiceExtAbility", - "srcLanguage": "ets", - "metaData": { - "customizeData" : [ - { - "name": "com.ohos.systemui.action.BAR_ICON", - "value": "", - "extra": "\"pluginType\":\"1\",\"clickAction\":\"local=showNotificationPanel\",\"selectedClickAction\":\"local=hideNotificationPanel\",\"relationWindowId\":\"SystemUi_NotificationPanel\"" - } - ] - } - } - ], - "js": [ - { - "mode": { - "syntax": "ets", - "type": "pageAbility" - }, - "name": "ServiceExtAbility", - "window": { - "designWidth": 1280, - "autoDesignWidth": false - }, - "pages": [ - "pages/index", - "pages/bannerNotification" - ] - } - ] - } -} \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/AbilityStage.ts b/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts similarity index 92% rename from product/pc/notificationpanel/src/main/ets/AbilityStage.ts rename to product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts index 8ea97b1e..38c5cf94 100644 --- a/product/pc/notificationpanel/src/main/ets/AbilityStage.ts +++ b/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "NotificationPanel_AbilityStage" export default class MainAbilityStage extends AbilityStage { diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/app.ets b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/app.ets deleted file mode 100644 index 08c517ce..00000000 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/app.ets +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2021 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 default { - onCreate() { - console.info('SystemUI NotificationPanel Application onCreate') - }, - onDestroy() { - console.info('SystemUI NotificationPanel Application onDestroy') - }, -} diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets similarity index 85% rename from product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets rename to product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets index db316176..4cc8324e 100644 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets @@ -13,13 +13,13 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import WindowManager, { WindowType } from '../../../../../../../../common/src/main/ets/default/WindowManager' -import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager" -import BannerNotification from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem' -import ViewModel from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel'; -import NotificationConstants, { ScreenLockStatus } from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants'; +import Log from '../../../../../../../common/src/main/ets/default/log' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' +import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager" +import BannerNotification from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/item/bannernotificationitem' +import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/viewmodel'; +import NotificationConstants, { ScreenLockStatus } from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/common/constants'; const TAG = 'NotificationPanel-BannerNotification' diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts b/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts similarity index 90% rename from product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts rename to product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts index 8368748a..ad56a49e 100644 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts +++ b/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../../common/src/main/ets/default/stylemanager'; const TAG = 'NotificationPanel-StyleConfiguration'; diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts b/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts similarity index 86% rename from product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts rename to product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts index b581c3ad..873a848c 100644 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts +++ b/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import IndexStyleConfiguration from './StyleConfiguration' +import Log from '../../../../../../../../common/src/main/ets/default/log'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; +import IndexStyleConfiguration from './styleconfiguration' const TAG = 'NotificationPanel-StyleManager'; diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts b/product/pc/notificationpanel/src/main/ets/pages/common/constants.ts similarity index 100% rename from product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts rename to product/pc/notificationpanel/src/main/ets/pages/common/constants.ts diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/index.ets b/product/pc/notificationpanel/src/main/ets/pages/index.ets similarity index 91% rename from product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/index.ets rename to product/pc/notificationpanel/src/main/ets/pages/index.ets index be9e5acd..bdbb04ac 100644 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/index.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/index.ets @@ -14,17 +14,17 @@ */ import image from "@ohos.multimedia.image" -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../common/src/main/ets/default/Log' import Notification from './notification' import WindowManager, { WindowType, WINDOW_SHOW_HIDE_EVENT, -} from "../../../../../../../../common/src/main/ets/default/WindowManager"; -import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager"; -import {START_ABILITY_EVENT} from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +} from "../../../../../../../common/src/main/ets/default/WindowManager"; +import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager"; +import {START_ABILITY_EVENT} from "../../../../../../../common/src/main/ets/default/event/EventUtil"; import MultimodalInputManager, { MultiKeyCode, -} from "../../../../../../../../common/src/main/ets/default/MultimodalInputManager"; +} from "../../../../../../../common/src/main/ets/default/MultimodalInputManager"; const TAG = 'NotificationPanel-Index' const SHOW_EVENT = "showNotificationPanel"; diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/notification.ets b/product/pc/notificationpanel/src/main/ets/pages/notification.ets similarity index 86% rename from product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/notification.ets rename to product/pc/notificationpanel/src/main/ets/pages/notification.ets index e976dd11..cccb68e6 100644 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/pages/notification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/notification.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager" -import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" -import NotificationListComponent from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent' -import ViewModel from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel' +import Log from '../../../../../../../common/src/main/ets/default/log' +import EventManager from "../../../../../../../common/src/main/ets/default/event/eventmanager" +import {obtainStartAbility} from "../../../../../../../common/src/main/ets/default/event/eventutil" +import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/notificationlistcomponent' +import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/viewmodel' const TAG = 'NotificationPanel-notification' const NO_NOTIFICATION_TOP_MARGIN = 40; diff --git a/product/pc/notificationpanel/src/main/module.json5 b/product/pc/notificationpanel/src/main/module.json5 new file mode 100644 index 00000000..b39d3459 --- /dev/null +++ b/product/pc/notificationpanel/src/main/module.json5 @@ -0,0 +1,40 @@ +{ + "module": { + "name": "pc_notificationpanel", + "type": "feature", + "srcEntrance": "./ets/Application/AbilityStage.ts", + "description": "$string:mainability_description", + "mainElement": "notificationpanel.ServiceExtAbility", + "deviceTypes": [ + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "uiSyntax": "ets", + "pages": "$profile:main_pages", + "extensionAbilities": [ + { + "visible": true, + "skills": [ + { + "actions": [ + "com.ohos.systemui.action.BAR_ICON" + ] + } + ], + "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", + "name": "com.ohos.systemui.notificationpanel.ServiceExtAbility", + "icon": "$media:ic_message_filled", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "service", + "metadata": [ + { + "name": "com.ohos.systemui.action.BAR_ICON", + "value": "\"pluginType\":\"1\",\"clickAction\":\"local=showNotificationPanel\",\"selectedClickAction\":\"local=hideNotificationPanel\",\"relationWindowId\":\"SystemUi_NotificationPanel\"" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/resources/base/element/float.json b/product/pc/notificationpanel/src/main/resources/base/element/float.json index b640ff0d..ec8ec0fe 100644 --- a/product/pc/notificationpanel/src/main/resources/base/element/float.json +++ b/product/pc/notificationpanel/src/main/resources/base/element/float.json @@ -74,19 +74,19 @@ }, { "name": "confirm_title_fontsize", - "value": "20vp" + "value": "20fp" }, { "name": "title_image_width", - "value": "28vp" + "value": "24vp" }, { "name": "title_image_height", - "value": "28vp" + "value": "24vp" }, { "name": "setting_cont_fontsize", - "value": "32" + "value": "16fp" }, { "name": "close_notification_margin_top", @@ -115,6 +115,42 @@ { "name": "applist_hieght", "value": "361vp" + }, + { + "name": "setting_dialog_height", + "value": "192vp" + }, + { + "name": "setting_dialog_width", + "value": "362vp" + }, + { + "name": "setting_dialog_row_width", + "value": "330vp" + }, + { + "name": "setting_dialog_row_height", + "value": "40vp" + }, + { + "name": "confirm_dialog_height", + "value": "146vp" + }, + { + "name": "confirm_dialog_width", + "value": "362vp" + }, + { + "name": "confirm_dialog_row_width", + "value": "330vp" + }, + { + "name": "confirm_dialog_button_width", + "value": "181vp" + }, + { + "name": "confirm_cont_fontsize", + "value": "16fp" } ] } \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/resources/base/profile/main_pages.json b/product/pc/notificationpanel/src/main/resources/base/profile/main_pages.json new file mode 100644 index 00000000..f368d3c2 --- /dev/null +++ b/product/pc/notificationpanel/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,6 @@ +{ + "src": [ + "pages/index", + "pages/bannerNotification" + ] +} diff --git a/product/pc/statusbar/.gitignore b/product/pc/statusbar/.gitignore deleted file mode 100644 index c795b054..00000000 --- a/product/pc/statusbar/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build \ No newline at end of file diff --git a/product/pc/statusbar/build-profile.json5 b/product/pc/statusbar/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/product/pc/statusbar/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/product/pc/statusbar/build.gradle b/product/pc/statusbar/build.gradle deleted file mode 100644 index 05e81063..00000000 --- a/product/pc/statusbar/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ -apply plugin: 'com.huawei.ohos.hap' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - entryModules "pc_entry" -} - -dependencies { - entryImplementation project(':pc_entry') - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - testCompile 'junit:junit:4.12' - implementation project(':features:statusbarcomponent') - implementation project(':features:controlcentercomponent') - implementation project(':features:signalcomponent') - implementation project(':features:capsulecomponent') - implementation project(':features:airplanecomponent') - implementation project(':features:brightnesscomponent') - implementation project(':features:wificomponent') - implementation project(':features:bluetoothcomponent') - implementation project(':features:volumecomponent') - implementation project(':features:batterycomponent') - implementation project(':features:clockcomponent') - implementation project(':features:noticeitem') - implementation project(':features:locationcomponent') - implementation project(':features:ringmodecomponent') -} diff --git a/product/pc/statusbar/hvigorfile.js b/product/pc/statusbar/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/product/pc/statusbar/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/product/pc/statusbar/package-lock.json b/product/pc/statusbar/package-lock.json new file mode 100644 index 00000000..a2fbe4a0 --- /dev/null +++ b/product/pc/statusbar/package-lock.json @@ -0,0 +1,11 @@ +{ + "name": "pc_statusbar", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/statusbarcomponent": { + "version": "file:../../../features/statusbarcomponent" + } + } +} diff --git a/product/pc/statusbar/package.json b/product/pc/statusbar/package.json index 0967ef42..98f6cc77 100644 --- a/product/pc/statusbar/package.json +++ b/product/pc/statusbar/package.json @@ -1 +1,13 @@ -{} +{ + "devDependencies": {}, + "name": "pc_statusbar", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/statusbarcomponent": "file:../../../features/statusbarcomponent" + } +} diff --git a/product/pc/statusbar/src/main/config.json b/product/pc/statusbar/src/main/config.json deleted file mode 100644 index f4e61969..00000000 --- a/product/pc/statusbar/src/main/config.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1, - "name": "1.0" - }, - "singleton": true - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.statusbar", - "name": ".MyApplication", - "deviceType": [ - "tablet" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "pc_statusbar", - "moduleType": "feature" - }, - "abilities": [ - { - "visible": true, - "name": "com.ohos.systemui.statusbar.ServiceExtAbility", - "icon": "$media:icon", - "description": "$string:mainability_description", - "label": "$string:app_name", - "type": "service", - "launchType": "singleton", - "srcPath": "ServiceExtAbility", - "srcLanguage": "ets" - } - ], - "js": [ - { - "mode": { - "syntax": "ets", - "type": "pageAbility" - }, - "name": "ServiceExtAbility", - "window": { - "designWidth": 1280, - "autoDesignWidth": false - }, - "pages": ["pages/index"] - } - ] - } -} \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/AbilityStage.ts b/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts similarity index 92% rename from product/pc/statusbar/src/main/ets/AbilityStage.ts rename to product/pc/statusbar/src/main/ets/Application/AbilityStage.ts index 398c19d0..4d550466 100644 --- a/product/pc/statusbar/src/main/ets/AbilityStage.ts +++ b/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "StatusBar_AbilityStage" export default class MainAbilityStage extends AbilityStage { diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/app.ets b/product/pc/statusbar/src/main/ets/ServiceExtAbility/app.ets deleted file mode 100644 index c4ae2372..00000000 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/app.ets +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StatusBarVM from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' -import {StatusBarData} from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants' - -export default { - async onCreate() { - console.info('SystemUI statusBar Application onCreate') - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config') - let statusBarData: StatusBarData = new StatusBarData(); - statusBarData.displayWidth = configInfo.maxWidth; - statusBarData.displayHeight = configInfo.maxHeight; - statusBarData.showHorizontal = configInfo.showHorizontal; - statusBarData.ableToMaximize = configInfo.ableToMaximize; - statusBarData.realWidth = configInfo.realWidth; - statusBarData.realHeight = configInfo.realHeight; - statusBarData.left = configInfo.xCoordinate; - statusBarData.top = configInfo.yCoordinate; - StatusBarVM.updateStatusBarData(statusBarData); - }, - onDestroy() { - console.info('SystemUI statusBar Application onDestroy') - }, -} diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts b/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts similarity index 95% rename from product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts rename to product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts index 2d8f0016..208fd147 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {FASlotName} from '../../../../../../../../../common/src/main/ets/default/Constants'; +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/constants'; type LayoutGroup = { id: number; diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts similarity index 92% rename from product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts rename to product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts index b410ff8d..176b293b 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/common/StyleConfiguration.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../../common/src/main/ets/default/stylemanager'; -const TAG = 'VolumePanel-StyleConfiguration'; +const TAG = 'StatusBar-StyleConfiguration'; export default class StyleConfiguration { static getIndexStyle() { diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts similarity index 83% rename from product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts rename to product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts index 7205ead7..b8788c7b 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -13,21 +13,21 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import CommonStyleConfiguration from '../../../../../../../../../common/src/main/ets/default/StyleConfiguration'; -import StatusBarStyleConfiguration from '../../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration' -import BatteryStyleConfiguration from '../../../../../../../../../features/batterycomponent/src/main/ets/default/common/StyleConfiguration' -import ClockStyleConfiguration from '../../../../../../../../../features/clockcomponent/src/main/ets/default/common/StyleConfiguration' -import WifiStyleConfiguration from '../../../../../../../../../features/wificomponent/src/main/ets/default/common/StyleConfiguration' -import BluetoothStyleConfiguration from '../../../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration' -import SignalStyleConfiguration from '../../../../../../../../../features/signalcomponent/src/main/ets/default/common/StyleConfiguration' -import CapsuleStyleConfiguration from '../../../../../../../../../features/capsulecomponent/src/main/ets/default/common/StyleConfiguration' -import LocationStyleConfiguration from '../../../../../../../../../features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration' -import RingModeStyleConfiguration from '../../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration' -import IndexStyleConfiguration from './StyleConfiguration' - -const TAG = 'StatusBar-StyleManager'; +import Log from '../../../../../../../../common/src/main/ets/default/log'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; +import CommonStyleConfiguration from '../../../../../../../../common/src/main/ets/default/styleconfiguration'; +import StatusBarStyleConfiguration from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/styleconfiguration' +import BatteryStyleConfiguration from '../../../../../../../../features/batterycomponent/src/main/ets/default/common/styleconfiguration' +import ClockStyleConfiguration from '../../../../../../../../features/clockcomponent/src/main/ets/default/common/styleconfiguration' +import WifiStyleConfiguration from '../../../../../../../../features/wificomponent/src/main/ets/default/common/styleconfiguration' +import BluetoothStyleConfiguration from '../../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/common/styleconfiguration' +import SignalStyleConfiguration from '../../../../../../../../features/signalcomponent/src/main/ets/default/common/styleconfiguration' +import CapsuleStyleConfiguration from '../../../../../../../../features/capsulecomponent/src/main/ets/default/common/styleconfiguration' +import LocationStyleConfiguration from '../../../../../../../../features/locationcomponent/src/main/ets/com/ohos/common/styleconfiguration' +import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/styleconfiguration' +import IndexStyleConfiguration from './styleconfiguration' + +const TAG = './styleconfigurationer'; export default class StyleManager { static STANDARD_DISPLAY_WIDTH: number = 1280; diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/constants.ts b/product/pc/statusbar/src/main/ets/pages/common/constants.ts similarity index 100% rename from product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/common/constants.ts rename to product/pc/statusbar/src/main/ets/pages/common/constants.ts diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets b/product/pc/statusbar/src/main/ets/pages/index.ets similarity index 82% rename from product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets rename to product/pc/statusbar/src/main/ets/pages/index.ets index b07025e3..98d9ff1b 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets +++ b/product/pc/statusbar/src/main/ets/pages/index.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' -import HeightConfigUtils from '../../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' -import StatusBarComponent from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' +import StatusBarComponent from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' import StyleManager from './common/StyleManager' import StatusbarConfig from './common/StatusbarConfig' @@ -64,7 +64,8 @@ struct Index { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { StatusBarComponent({ - mStatusBarComponentConfig: StatusbarConfig + mStatusBarComponentConfig: StatusbarConfig, + moduleName: 'pc_statusbar' }) } .width('100%') diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js similarity index 90% rename from product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js rename to product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 3135d74c..967798c6 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js +++ b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -14,10 +14,10 @@ */ import worker from "@ohos.worker"; -import Log from "../../../../../../../../common/src/main/ets/default/Log"; +import Log from "../../../../../../../common/src/main/ets/default/log"; import PluginDataSourceManager -from "../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager"; -import Constants, { obtainMsg } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; +from "../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager"; +import Constants, { obtainMsg } from "../../../../../../../common/src/main/ets/plugindatasource/common/constants"; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; diff --git a/product/pc/statusbar/src/main/module.json5 b/product/pc/statusbar/src/main/module.json5 new file mode 100644 index 00000000..36c0ccd6 --- /dev/null +++ b/product/pc/statusbar/src/main/module.json5 @@ -0,0 +1,27 @@ +{ + "module": { + "name": "pc_statusbar", + "type": "feature", + "srcEntrance": "./ets/Application/AbilityStage.ts", + "description": "$string:mainability_description", + "mainElement": "statusbar.ServiceExtAbility", + "deviceTypes": [ + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "uiSyntax": "ets", + "pages": "$profile:main_pages", + "extensionAbilities": [ + { + "visible": true, + "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", + "name": "com.ohos.systemui.statusbar.ServiceExtAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "service" + } + ] + } +} \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/element/color.json b/product/pc/statusbar/src/main/resources/base/element/color.json index 6b163c9d..3889b9ce 100644 --- a/product/pc/statusbar/src/main/resources/base/element/color.json +++ b/product/pc/statusbar/src/main/resources/base/element/color.json @@ -7,6 +7,34 @@ { "name": "default_font_color", "value": "#ffffffff" + }, + { + "name": "battery_component_pic_level_low_color", + "value": "#ff0000" + }, + { + "name": "battery_component_pic_charging_color", + "value": "#00ff21" + }, + { + "name": "battery_background", + "value": "#00000000" + }, + { + "name": "capsule_background_color", + "value": "#64BB5C" + }, + { + "name" : "green_capsule_text_color", + "value" : "#ccFFFFFF" + }, + { + "name": "background_color", + "value": "#0xDCDCDC" + }, + { + "name": "control_center_complex_toggle_ring_mode_on_bg_color", + "value": "#FFFF9800" } ] } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/element/float.json b/product/pc/statusbar/src/main/resources/base/element/float.json new file mode 100644 index 00000000..b1620ac3 --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/element/float.json @@ -0,0 +1,124 @@ +{ + "float": [ + { + "name": "status_bar_clock_width", + "value": "60vp" + }, + { + "name": "battery_component_gap", + "value": "8.5vp" + }, + { + "name": "battery_component_pic_gap", + "value": "2vp" + }, + { + "name": "battery_component_pic_body_height", + "value": "19vp" + }, + { + "name": "battery_component_pic_body_width", + "value": "34.5vp" + }, + { + "name": "battery_component_pic_body_padding", + "value": "2vp" + }, + { + "name": "battery_component_pic_body_border_width", + "value": "1vp" + }, + { + "name": "battery_component_pic_border_radius", + "value": "2vp" + }, + { + "name": "battery_component_pic_head_radius", + "value": "2vp" + }, + { + "name": "battery_component_pic_head_width", + "value": "3vp" + }, + { + "name": "battery_component_pic_head_height", + "value": "10vp" + }, + { + "name": "green_capsule_phone_width", + "value": "15vp" + }, + { + "name": "green_capsule_phone_height", + "value": "15vp" + }, + { + "name": "green_capsule_height", + "value": "48vp" + }, + { + "name": "green_capsule_text_left_right", + "value": "10vp" + }, + { + "name": "green_capsule_radius", + "value": "24vp" + }, + { + "name":"signal_component_icon_width", + "value":"32vp" + }, + { + "name":"signal_component_icon_height", + "value":"24vp" + }, + { + "name":"status_bar_signal_unknown_font_size", + "value":"14fp" + }, + { + "name":"signal_text_max_width", + "value":"113vp" + }, + { + "name":"status_bar_signal_net_signal_text_max_width", + "value":"18vp" + }, + { + "name": "status_bar_bluetooth_width", + "value": "18vp" + }, + { + "name": "status_bar_bluetooth_height", + "value": "24vp" + }, + { + "name": "status_bar_ring_mode_width", + "value": "27vp" + }, + { + "name": "status_bar_ring_mode_height", + "value": "24vp" + }, + { + "name":"status_bar_signal_type_font_size", + "value":"10fp" + }, + { + "name": "status_bar_wifi_width", + "value": "24vp" + }, + { + "name": "status_bar_wifi_height", + "value": "24vp" + }, + { + "name": "status_bar_location_width", + "value": "20vp" + }, + { + "name": "status_bar_location_height", + "value": "24vp" + } + ] +} \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/element/string.json b/product/pc/statusbar/src/main/resources/base/element/string.json index 85243901..06f5d7fd 100644 --- a/product/pc/statusbar/src/main/resources/base/element/string.json +++ b/product/pc/statusbar/src/main/resources/base/element/string.json @@ -23,6 +23,30 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "net_null", + "value": "没有 SIM 卡" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + }, + { + "name": "signal_null", + "value": "×" } ] } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_status_bt.svg b/product/pc/statusbar/src/main/resources/base/media/ic_status_bt.svg new file mode 100644 index 00000000..0527fb75 --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_status_bt.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg new file mode 100644 index 00000000..2d166cbe --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg new file mode 100644 index 00000000..a6bac17a --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg new file mode 100644 index 00000000..162b938a --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg new file mode 100644 index 00000000..f0438a9a --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg new file mode 100644 index 00000000..173489d3 --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg new file mode 100644 index 00000000..c703e2d0 --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg new file mode 100644 index 00000000..cb66ccb4 --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg new file mode 100644 index 00000000..3c796ab5 --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg new file mode 100644 index 00000000..4d1a5bc4 --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png new file mode 100644 index 0000000000000000000000000000000000000000..c37dc10f00c0b991f31faf014841cf015c33684c GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T|AsMW1 zr|r*Tauhgb>uGgStNy^P_6?#FMVve)-}~+{vHSx2h4Kqd0!I#AJEhio!_(qmL#x@T zpSs)Gn>|we64(6@yY@40Z{hx*ckd+W9d~3>abQv@U~YV{|Bgo2svr9l-`#Z7H*j|p z$T?bNrpoo>*dCL*jT+p>+6wcFo{K;E8sK7>`tR-~6V@#ovL%b(l-Ikism>KMVSRJ) zySBw!uI-`=eU~h2IPySIu!9xIT*dHZkM-7jEti*GxH;KC$A6)~_3Se#ISTXE#@cJ} z*mPF+UzlH^?zAyY$yC>*_3)C^811vZGV^m+X)fr!(|5kS@_qXL)S{J|2P9=Urpr6c z_6%iw@l)QS^ndG}6%SSQj$V2f9NMt`=J$_+8#B{w?^*gX&dgezef&j$z`ROZ$3KTk m{2!cOZ#aR06Bo+hn8VPgo36`mR;~mLZ3a(QKbLh*2~7YkC#n4a literal 0 HcmV?d00001 diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png new file mode 100644 index 0000000000000000000000000000000000000000..11a8958a11189755d4328343ef68453f27411739 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T*yPaTIC&-l?5c*qkBay7^*~k>r&$Ly!18Z`L!$ld*I$=K*~7KJU*Af*d#L=Z)eW|&9^-1WKCL{L`wsFSMNNuj zo;@#oKi6*J``r=D+vFAZzdX&!wO{D@!naFz?&iD0QN=Umih7i5_KI$&tpRsscd#-Q z@Yya7c<9U0nzdN6`r2Cd5~;llLuAh^iB8~VdttH5|H-oZkB+~IoGy1Fo4K|lf7aKj z-Y-~KUrcMfYxp_V_`XkZxavrqt&mjfgarZk{)LRCI6 Y|5;yC(^}(m1{fI(p00i_>zopr0MHz`#sB~S literal 0 HcmV?d00001 diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg new file mode 100644 index 00000000..91b52b22 --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg new file mode 100644 index 00000000..3842e2ab --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg new file mode 100644 index 00000000..7829aa32 --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg new file mode 100644 index 00000000..ef60272d --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a905dfc0f9c219e48db7edb5ca93b1041766f5 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g;!3HGxU+kX;q!^2X+?^QKos)S9a~60+7BevL9R^{>w;^3X z&tcIc38B^<9WJX2SbJUOI4-=R?dq7gXZz<9H|CyL=e05ZQ|h<+|7YgkRMpV3nV zx}zc3^^8>kYjoGA=EK<@@49B>=A@)`?U}M=*@1(W(3wAXhqV%sM z<);f5H`OeQzHv>={)WIo?mrH>N8z90L;+t&5DvDvqxncelwvtDnm{r-UW|#=MI2 literal 0 HcmV?d00001 diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg new file mode 100644 index 00000000..42e8b4b9 --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg new file mode 100644 index 00000000..3122653c --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/profile/main_pages.json b/product/pc/statusbar/src/main/resources/base/profile/main_pages.json new file mode 100644 index 00000000..feec276e --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/index" + ] +} diff --git a/product/pc/statusbar/src/main/resources/en_US/element/string.json b/product/pc/statusbar/src/main/resources/en_US/element/string.json index 85243901..3cca72ae 100644 --- a/product/pc/statusbar/src/main/resources/en_US/element/string.json +++ b/product/pc/statusbar/src/main/resources/en_US/element/string.json @@ -23,6 +23,30 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "net_null", + "value": "No SIM" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + }, + { + "name": "signal_null", + "value": "×" } ] } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/zh_CN/element/string.json b/product/pc/statusbar/src/main/resources/zh_CN/element/string.json index 85243901..06f5d7fd 100644 --- a/product/pc/statusbar/src/main/resources/zh_CN/element/string.json +++ b/product/pc/statusbar/src/main/resources/zh_CN/element/string.json @@ -23,6 +23,30 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "net_null", + "value": "没有 SIM 卡" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + }, + { + "name": "signal_null", + "value": "×" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/build-profile.json5 b/product/phone/dropdownpanel/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/product/phone/dropdownpanel/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/build.gradle b/product/phone/dropdownpanel/build.gradle deleted file mode 100644 index 8646180b..00000000 --- a/product/phone/dropdownpanel/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ -apply plugin: 'com.huawei.ohos.hap' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - entryModules "phone_entry" -} - -dependencies { - entryImplementation project(':phone_entry') - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - testCompile 'junit:junit:4.12' - implementation project(':features:noticeitem') - implementation project(':features:controlcentercomponent') - implementation project(':features:statusbarcomponent') - implementation project(':features:airplanecomponent') - implementation project(':features:autorotatecomponent') - implementation project(':features:batterycomponent') - implementation project(':features:bluetoothcomponent') - implementation project(':features:brightnesscomponent') - implementation project(':features:capsulecomponent') - implementation project(':features:clockcomponent') - implementation project(':features:locationcomponent') - implementation project(':features:ringmodecomponent') - implementation project(':features:signalcomponent') - implementation project(':features:wificomponent') -} diff --git a/product/phone/dropdownpanel/hvigorfile.js b/product/phone/dropdownpanel/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/product/phone/dropdownpanel/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/product/phone/dropdownpanel/package-lock.json b/product/phone/dropdownpanel/package-lock.json new file mode 100644 index 00000000..c8408215 --- /dev/null +++ b/product/phone/dropdownpanel/package-lock.json @@ -0,0 +1,38 @@ +{ + "name": "phone_dropdownpanel", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/batterycomponent": { + "version": "file:../../../features/batterycomponent" + }, + "@ohos/bluetoothcomponent": { + "version": "file:../../../features/bluetoothcomponent" + }, + "@ohos/clockcomponent": { + "version": "file:../../../features/clockcomponent" + }, + "@ohos/controlcentercomponent": { + "version": "file:../../../features/controlcentercomponent" + }, + "@ohos/locationcomponent": { + "version": "file:../../../features/locationcomponent" + }, + "@ohos/noticeitem": { + "version": "file:../../../features/noticeitem" + }, + "@ohos/ringmodecomponent": { + "version": "file:../../../features/ringmodecomponent" + }, + "@ohos/signalcomponent": { + "version": "file:../../../features/signalcomponent" + }, + "@ohos/statusbarcomponent": { + "version": "file:../../../features/statusbarcomponent" + }, + "@ohos/wificomponent": { + "version": "file:../../../features/wificomponent" + } + } +} diff --git a/product/phone/dropdownpanel/package.json b/product/phone/dropdownpanel/package.json index 0967ef42..3f7165d1 100644 --- a/product/phone/dropdownpanel/package.json +++ b/product/phone/dropdownpanel/package.json @@ -1 +1,22 @@ -{} +{ + "devDependencies": {}, + "name": "phone_dropdownpanel", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/statusbarcomponent": "file:../../../features/statusbarcomponent", + "@ohos/wificomponent": "file:../../../features/wificomponent", + "@ohos/bluetoothcomponent": "file:../../../features/bluetoothcomponent", + "@ohos/signalcomponent": "file:../../../features/signalcomponent", + "@ohos/clockcomponent": "file:../../../features/clockcomponent", + "@ohos/locationcomponent": "file:../../../features/locationcomponent", + "@ohos/batterycomponent": "file:../../../features/batterycomponent", + "@ohos/controlcentercomponent": "file:../../../features/controlcentercomponent", + "@ohos/ringmodecomponent": "file:../../../features/ringmodecomponent", + "@ohos/noticeitem": "file:../../../features/noticeitem" + } +} diff --git a/product/phone/dropdownpanel/src/main/config.json b/product/phone/dropdownpanel/src/main/config.json deleted file mode 100644 index d7b4ecf5..00000000 --- a/product/phone/dropdownpanel/src/main/config.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1, - "name": "1.0" - }, - "singleton": true - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.dropdownpanel", - "name": ".MyApplication", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "phone_dropdownpanel", - "moduleType": "feature" - }, - "abilities": [ - { - "visible": true, - "name": "com.ohos.systemui.dropdownpanel.ServiceExtAbility", - "icon": "$media:icon", - "description": "$string:mainability_description", - "label": "$string:app_name", - "type": "service", - "launchType": "singleton", - "srcPath": "ServiceExtAbility", - "srcLanguage": "ets" - } - ], - "js": [ - { - "mode": { - "syntax": "ets", - "type": "pageAbility" - }, - "name": "ServiceExtAbility", - "window": { - "designWidth": 720, - "autoDesignWidth": false - }, - "pages": [ - "pages/index", - "pages/bannerNotification" - ] - } - ] - } -} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/AbilityStage.ts b/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts similarity index 92% rename from product/phone/dropdownpanel/src/main/ets/AbilityStage.ts rename to product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts index 4fade194..20bb96f4 100644 --- a/product/phone/dropdownpanel/src/main/ets/AbilityStage.ts +++ b/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "DropdownPanel_AbilityStage" export default class MainAbilityStage extends AbilityStage { diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/app.ets b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/app.ets deleted file mode 100644 index ed566992..00000000 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/app.ets +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2021 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 default { - async onCreate() { - console.info('SystemUI dropdownPanel Application onCreate') - }, - onDestroy() { - console.info('SystemUI dropdownPanel Application onDestroy') - }, -} diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets similarity index 85% rename from product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets rename to product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets index a6cf1d7f..b00451fb 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/bannerNotification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets @@ -13,13 +13,13 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import WindowManager, { WindowType } from '../../../../../../../../common/src/main/ets/default/WindowManager' -import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager" -import BannerNotification from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem' -import ViewModel from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel'; -import NotificationConstants, { ScreenLockStatus } from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants'; +import Log from '../../../../../../../common/src/main/ets/default/log' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' +import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager" +import BannerNotification from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/item/bannernotificationitem' +import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/viewmodel'; +import NotificationConstants, { ScreenLockStatus } from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/common/constants'; const TAG = 'DropdownPanel-BannerNotification' diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts similarity index 94% rename from product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts rename to product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts index 44173d27..b7600690 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/ControlCenterConfig.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {FASlotName} from '../../../../../../../../../common/src/main/ets/default/Constants'; +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; type pluginIconData = { id: string; diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts similarity index 95% rename from product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts rename to product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts index 9ddd4f1f..82adcad5 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../../common/src/main/ets/default/StyleManager'; -import Constants from './Constants' +import StyleManager from '../../../../../../../../common/src/main/ets/default/stylemanager'; +import Constants from './constants' const TAG = 'DropdownPanel-StyleConfiguration'; diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts similarity index 94% rename from product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts rename to product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts index e3611acc..50f349a9 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts @@ -13,15 +13,15 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import CommonTemplateStyleConfiguration from '../../../../../../../../../common/src/main/ets/template/common/StyleConfiguration'; -import ControlCenterStyleConfiguration from '../../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration'; -import DropdownPanelStyleConfiguration from './StyleConfiguration' -import BrightnessStyleConfiguration from '../../../../../../../../../features/brightnessComponent/src/main/ets/default/common/StyleConfiguration'; -import ClockStyleConfiguration from '../../../../../../../../../features/clockComponent/src/main/ets/default/common/StyleConfiguration'; -import RingModeStyleConfiguration from '../../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration' -import IndexStyleConfiguration from './StyleConfiguration' +import Log from '../../../../../../../../common/src/main/ets/default/log'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; +import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/styleconfiguration'; +import ControlCenterStyleConfiguration from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/styleconfiguration'; +import DropdownPanelStyleConfiguration from './styleconfiguration' +import BrightnessStyleConfiguration from '../../../../../../../../features/brightnesscomponent/src/main/ets/default/common/styleconfiguration'; +import ClockStyleConfiguration from '../../../../../../../../features/clockcomponent/src/main/ets/default/common/styleconfiguration'; +import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/styleconfiguration' +import IndexStyleConfiguration from './styleconfiguration' const TAG = 'DropdownPanel-StyleManager'; @@ -100,7 +100,7 @@ export default class StyleManager { style.borderRadius = StyleManager.calcScaleSizePx(48); style.backgroundColor = '#99FFFFFF'; style.textMargin = StyleManager.calcScaleSizePx(8); - style.textHoverHeight = StyleManager.calcScaleSizePx(36); + style.textHoverHeight = StyleManager.calcScaleSizePx(52); style.textHoverWidth = StyleManager.calcScaleSizePx(136); style.textHoverRadius = StyleManager.calcScaleSizePx(8); style.hoverColor = 'rgba(0, 0, 0, 0.05)'; diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/constants.ts rename to product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/navigationEvent.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts similarity index 96% rename from product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/navigationEvent.ts rename to product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts index ec3165f0..c2a99a61 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/common/navigationEvent.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts @@ -14,7 +14,7 @@ */ import commonEvent from '@ohos.commonEvent'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../../common/src/main/ets/default/log' const TAG = 'navigationEvent'; diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/control.ets b/product/phone/dropdownpanel/src/main/ets/pages/control.ets similarity index 74% rename from product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/control.ets rename to product/phone/dropdownpanel/src/main/ets/pages/control.ets index 3708e159..075d7b70 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/control.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/control.ets @@ -12,15 +12,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ControlCenterComponent from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent' -import BatteryIcon from '../../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon' -import ClockIcon from '../../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon' -import WifiIcon from '../../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon' -import BluetoothIcon from '../../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent' -import SignalIcon from '../../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon' -import LocationIcon from '../../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' -import RingModeIcon from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import ControlCenterComponent from '../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent' +import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon' +import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon' +import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon' +import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent' +import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon' +import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' +import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' +import Log from '../../../../../../../common/src/main/ets/default/Log' import Constants from './common/constants' import StyleConfiguration from './common/StyleConfiguration' import ControlCenterConfig from './common/ControlCenterConfig'; @@ -57,7 +57,8 @@ export default struct Control { Column() { ControlCenterComponent({ touchMoveCallback: (data)=>this.controlCenterTouchMoveCallback(data), - mControlCenterComponentConfig: ControlCenterConfig + mControlCenterComponentConfig: ControlCenterConfig, + moduleName: 'phone_dropdownpanel', }) } .width('100%') diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets similarity index 91% rename from product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/index.ets rename to product/phone/dropdownpanel/src/main/ets/pages/index.ets index 50a7496c..1266a1b5 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -15,23 +15,23 @@ import screenshot from "@ohos.screenshot" import image from "@ohos.multimedia.image" -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../common/src/main/ets/default/Log' import WindowManager, -{WindowType, WINDOW_SHOW_HIDE_EVENT} from '../../../../../../../../common/src/main/ets/default/WindowManager' -import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager" -import {START_ABILITY_EVENT} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' -import MultimodalInputManager from '../../../../../../../../common/src/main/ets/default/MultimodalInputManager' -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import HeightConfigUtils from '../../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' -import StatusBarVM from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' +{WindowType, WINDOW_SHOW_HIDE_EVENT} from '../../../../../../../common/src/main/ets/default/WindowManager' +import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager" +import {START_ABILITY_EVENT} from "../../../../../../../common/src/main/ets/default/event/EventUtil" +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import MultimodalInputManager from '../../../../../../../common/src/main/ets/default/MultimodalInputManager' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' +import StatusBarVM from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' import NavigationEvent from './common/navigationEvent' import Notification from './notification' import ControlCenterComponent from './control' import StyleManager from './common/StyleManager' import featureAbility from '@ohos.ability.featureAbility'; import settings from '@ohos.settings'; -import CommonConstants from "../../../../../../../../common/src/main/ets/default/Constants"; +import CommonConstants from "../../../../../../../common/src/main/ets/default/Constants"; const TAG = 'DropdownPanel-Index' @@ -317,7 +317,7 @@ struct Index { .opacity(this.backgroundOpacity) .onAreaChange((e, e2) => { Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); - this.mWidthPx = vp2px(e2.width) + this.mWidthPx = vp2px(Number(e2.width)) }) } } diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets similarity index 82% rename from product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/notification.ets rename to product/phone/dropdownpanel/src/main/ets/pages/notification.ets index ad0dee75..899d6653 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -13,21 +13,21 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager" -import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" +import Log from '../../../../../../../common/src/main/ets/default/log' +import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager" +import {obtainStartAbility} from "../../../../../../../common/src/main/ets/default/event/eventutil" import Constants from './common/constants' -import BatteryIcon from '../../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon' -import ClockIcon from '../../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon' -import WifiIcon from '../../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon' -import BluetoothIcon from '../../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent' -import SignalIcon from '../../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon' -import LocationIcon from '../../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' -import RingModeIcon from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' -import NotificationListComponent from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent' -import ViewModel from '../../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel' -import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil' -import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT } from '../../../../../../../../common/src/main/ets/default/TimeManager' +import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryicon' +import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockicon' +import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiicon' +import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/statusbariconitembluetoothcomponent' +import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalicon' +import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/statusbariconitemlocationcomponent' +import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/statusbariconitemringmodecomponent' +import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/notificationlistcomponent' +import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/viewmodel' +import ResourceUtil from '../../../../../../../common/src/main/ets/default/resourceutil' +import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT } from '../../../../../../../common/src/main/ets/default/timemanager' const TAG = 'DropdownPanel-notification' const GRID_SIZE = 6; diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js similarity index 90% rename from product/phone/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js rename to product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js index 3135d74c..967798c6 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js +++ b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -14,10 +14,10 @@ */ import worker from "@ohos.worker"; -import Log from "../../../../../../../../common/src/main/ets/default/Log"; +import Log from "../../../../../../../common/src/main/ets/default/log"; import PluginDataSourceManager -from "../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager"; -import Constants, { obtainMsg } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; +from "../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager"; +import Constants, { obtainMsg } from "../../../../../../../common/src/main/ets/plugindatasource/common/constants"; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; diff --git a/product/phone/dropdownpanel/src/main/module.json5 b/product/phone/dropdownpanel/src/main/module.json5 new file mode 100644 index 00000000..0af93fca --- /dev/null +++ b/product/phone/dropdownpanel/src/main/module.json5 @@ -0,0 +1,27 @@ +{ + "module": { + "name": "phone_dropdownpanel", + "type": "feature", + "srcEntrance": "./ets/Application/AbilityStage.ts", + "description": "$string:mainability_description", + "mainElement": "dropdownpanel.ServiceExtAbility", + "deviceTypes": [ + "phone" + ], + "deliveryWithInstall": true, + "installationFree": false, + "uiSyntax": "ets", + "pages": "$profile:main_pages", + "extensionAbilities": [ + { + "visible": true, + "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", + "name": "com.ohos.systemui.dropdownpanel.ServiceExtAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "service" + } + ] + } +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/color.json b/product/phone/dropdownpanel/src/main/resources/base/element/color.json index 24157404..6751f30d 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/color.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/color.json @@ -15,9 +15,26 @@ { "name": "quickly_setting_date_font_color", "value": "#ffffffff" - },{ + }, + { "name": "statusbar_background_color", "value": "#1a262626" + }, + { + "name": "brightness_slider_block_color", + "value": "#FFFFFFFF" + }, + { + "name": "brightness_slider_track_color", + "value": "#1A000000" + }, + { + "name": "brightness_slider_selected_color", + "value": "#FF007DFF" + }, + { + "name": "control_center_complex_toggle_ring_mode_on_bg_color", + "value": "#FFFF9800" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/float.json b/product/phone/dropdownpanel/src/main/resources/base/element/float.json index 76a0e294..8f400c91 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/float.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/float.json @@ -55,6 +55,58 @@ { "name": "delete_all_image_opacity", "value": "0.9" + }, + { + "name": "brightness_margin_left", + "value": "26vp" + }, + { + "name": "brightness_margin_right", + "value": "26vp" + }, + { + "name": "brightness_component_gap", + "value": "26vp" + }, + { + "name": "brightness_reduce_width", + "value": "44vp" + }, + { + "name": "brightness_reduce_height", + "value": "44vp" + }, + { + "name": "brightness_plus_width", + "value": "44vp" + }, + { + "name": "brightness_plus_height", + "value": "44vp" + }, + { + "name": "brightness_height", + "value": "44vp" + }, + { + "name": "brightness_slider_height", + "value": "40vp" + }, + { + "name": "status_bar_location_width", + "value": "20vp" + }, + { + "name": "status_bar_location_height", + "value": "24vp" + }, + { + "name": "status_bar_ring_mode_width", + "value": "27vp" + }, + { + "name": "status_bar_ring_mode_height", + "value": "24vp" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/string.json b/product/phone/dropdownpanel/src/main/resources/base/element/string.json index 128a7ac0..f9d8b148 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/string.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/string.json @@ -47,6 +47,30 @@ { "name": "no_notification", "value": "没有通知" + }, + { + "name": "airplane_mode", + "value": "飞行模式" + }, + { + "name": "control_center_complex_toggle_bluetooth_title", + "value": "蓝牙" + }, + { + "name": "control_center_complex_toggle_location_title", + "value": "位置信息" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_on", + "value": "响铃" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_off", + "value": "静音" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_vibration", + "value": "振动" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/airplane.svg b/product/phone/dropdownpanel/src/main/resources/base/media/airplane.svg new file mode 100644 index 00000000..d648b9f9 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/airplane.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg b/product/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg new file mode 100644 index 00000000..ad2180b1 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg new file mode 100644 index 00000000..e6763c2a --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg @@ -0,0 +1,12 @@ + + + diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg new file mode 100644 index 00000000..d1fa819a --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg @@ -0,0 +1,12 @@ + + + diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg new file mode 100644 index 00000000..0ae8745d --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg new file mode 100644 index 00000000..2be2692c --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg new file mode 100644 index 00000000..f6eea851 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg new file mode 100644 index 00000000..dd3c5971 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg new file mode 100644 index 00000000..4f2ae548 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg new file mode 100644 index 00000000..3f7bb0ea --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/wifi.svg b/product/phone/dropdownpanel/src/main/resources/base/media/wifi.svg new file mode 100644 index 00000000..1c2d188d --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/wifi.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg b/product/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg new file mode 100644 index 00000000..c36aee97 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json b/product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json new file mode 100644 index 00000000..feec276e --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/index" + ] +} diff --git a/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json b/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json index 371576df..9a826cab 100644 --- a/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json +++ b/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json @@ -47,6 +47,30 @@ { "name": "no_notification", "value": "No Notification" + }, + { + "name": "airplane_mode", + "value": "Airplane mode" + }, + { + "name": "control_center_complex_toggle_bluetooth_title", + "value": "Bluetooth" + }, + { + "name": "control_center_complex_toggle_location_title", + "value": "Location" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_on", + "value": "Sound" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_off", + "value": "Silent" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_vibration", + "value": "Vibration" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json b/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json index 128a7ac0..f9d8b148 100644 --- a/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json +++ b/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json @@ -47,6 +47,30 @@ { "name": "no_notification", "value": "没有通知" + }, + { + "name": "airplane_mode", + "value": "飞行模式" + }, + { + "name": "control_center_complex_toggle_bluetooth_title", + "value": "蓝牙" + }, + { + "name": "control_center_complex_toggle_location_title", + "value": "位置信息" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_on", + "value": "响铃" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_off", + "value": "静音" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_vibration", + "value": "振动" } ] } \ No newline at end of file diff --git a/product/phone/statusbar/build-profile.json5 b/product/phone/statusbar/build-profile.json5 new file mode 100644 index 00000000..3f685bd2 --- /dev/null +++ b/product/phone/statusbar/build-profile.json5 @@ -0,0 +1,11 @@ +{ + "apiType": 'stageMode', + "buildOption": { + "arkEnable": true + }, + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/product/phone/statusbar/build.gradle b/product/phone/statusbar/build.gradle deleted file mode 100644 index bb633a4f..00000000 --- a/product/phone/statusbar/build.gradle +++ /dev/null @@ -1,24 +0,0 @@ -apply plugin: 'com.huawei.ohos.hap' -ohos { - compileSdkVersion rootProject.ext.version.compileSdk - defaultConfig { - compatibleSdkVersion rootProject.ext.version.compatibleSdk - } - entryModules "phone_entry" -} - -dependencies { - entryImplementation project(':phone_entry') - implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) - testCompile 'junit:junit:4.12' - implementation project(':features:statusbarcomponent') - implementation project(':features:noticeitem') - implementation project(':features:batterycomponent') - implementation project(':features:bluetoothcomponent') - implementation project(':features:capsulecomponent') - implementation project(':features:clockcomponent') - implementation project(':features:locationcomponent') - implementation project(':features:ringmodecomponent') - implementation project(':features:signalcomponent') - implementation project(':features:wificomponent') -} diff --git a/product/phone/statusbar/hvigorfile.js b/product/phone/statusbar/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/product/phone/statusbar/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/product/phone/statusbar/package-lock.json b/product/phone/statusbar/package-lock.json new file mode 100644 index 00000000..9e7e3ba3 --- /dev/null +++ b/product/phone/statusbar/package-lock.json @@ -0,0 +1,11 @@ +{ + "name": "phone_statusbar", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/statusbarcomponent": { + "version": "file:../../../features/statusbarcomponent" + } + } +} diff --git a/product/phone/statusbar/package.json b/product/phone/statusbar/package.json index 0967ef42..6200748b 100644 --- a/product/phone/statusbar/package.json +++ b/product/phone/statusbar/package.json @@ -1 +1,13 @@ -{} +{ + "devDependencies": {}, + "name": "phone_statusbar", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/statusbarcomponent": "file:../../../features/statusbarcomponent" + } +} diff --git a/product/phone/statusbar/src/main/config.json b/product/phone/statusbar/src/main/config.json deleted file mode 100644 index 85329c56..00000000 --- a/product/phone/statusbar/src/main/config.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "version": { - "code": 1, - "name": "1.0" - }, - "singleton": true - }, - "deviceConfig": {}, - "module": { - "package": "com.ohos.systemui.statusbar", - "name": ".MyApplication", - "deviceType": [ - "phone" - ], - "distro": { - "deliveryWithInstall": true, - "moduleName": "phone_statusbar", - "moduleType": "feature" - }, - "abilities": [ - { - "visible": true, - "name": "com.ohos.systemui.statusbar.ServiceExtAbility", - "icon": "$media:icon", - "description": "$string:mainability_description", - "label": "$string:app_name", - "type": "service", - "launchType": "singleton", - "srcPath": "ServiceExtAbility", - "srcLanguage": "ets" - } - ], - "js": [ - { - "mode": { - "syntax": "ets", - "type": "pageAbility" - }, - "name": "ServiceExtAbility", - "window": { - "designWidth": 720, - "autoDesignWidth": false - }, - "pages": ["pages/index"] - } - ] - } -} \ No newline at end of file diff --git a/entry/pc/src/main/ets/AbilityStage.ts b/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts similarity index 88% rename from entry/pc/src/main/ets/AbilityStage.ts rename to product/phone/statusbar/src/main/ets/Application/AbilityStage.ts index 288fb504..9164e500 100644 --- a/entry/pc/src/main/ets/AbilityStage.ts +++ b/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts @@ -13,10 +13,9 @@ * limitations under the License. */ import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../common/src/main/ets/default/Log' - -const TAG = "SystemUI_AbilityStage" +import Log from '../../../../../../../common/src/main/ets/default/Log' +const TAG = "StatusBar_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { Log.showInfo(TAG, "onCreate") diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 0229ecce..7cd14d0c 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -19,7 +19,6 @@ import WindowManager, { WindowType } from '../../../../../../../common/src/main/ import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StatusBarConfiguration from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; - const TAG = "StatusBar_ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/app.ets b/product/phone/statusbar/src/main/ets/ServiceExtAbility/app.ets deleted file mode 100644 index 58395908..00000000 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/app.ets +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2021 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 AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StatusBarVM from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' -import {StatusBarData} from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants' - -export default { - async onCreate() { - console.info('SystemUI statusBar Application onCreate') - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config') - let statusBarData: StatusBarData = new StatusBarData(); - statusBarData.displayWidth = configInfo.maxWidth; - statusBarData.displayHeight = configInfo.maxHeight; - statusBarData.showHorizontal = configInfo.showHorizontal; - statusBarData.ableToMaximize = configInfo.ableToMaximize; - statusBarData.realWidth = configInfo.realWidth; - statusBarData.realHeight = configInfo.realHeight; - statusBarData.left = configInfo.xCoordinate; - statusBarData.top = configInfo.yCoordinate; - StatusBarVM.updateStatusBarData(statusBarData); - }, - onDestroy() { - console.info('SystemUI statusBar Application onDestroy') - }, -} diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts b/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts similarity index 96% rename from product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts rename to product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts index 0dc0910a..a4b7dc91 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StatusbarConfig.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {FASlotName} from '../../../../../../../../../common/src/main/ets/default/Constants'; +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/constants'; type LayoutGroup = { id: number; diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts b/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts similarity index 90% rename from product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts rename to product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts index 9c7d17d3..176b293b 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleConfiguration.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../../common/src/main/ets/default/stylemanager'; const TAG = 'StatusBar-StyleConfiguration'; diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts similarity index 85% rename from product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts rename to product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts index 9059434e..52c4f840 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/StyleManager.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import IndexStyleConfiguration from './StyleConfiguration' +import Log from '../../../../../../../../common/src/main/ets/default/log'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; +import IndexStyleConfiguration from './styleconfiguration' const TAG = 'StatusBar-StyleManager'; diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/constants.ts b/product/phone/statusbar/src/main/ets/pages/common/constants.ts similarity index 100% rename from product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/common/constants.ts rename to product/phone/statusbar/src/main/ets/pages/common/constants.ts diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets similarity index 73% rename from product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets rename to product/phone/statusbar/src/main/ets/pages/index.ets index a4d80d68..6fd4c44f 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -13,19 +13,20 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../common/src/main/ets/default/Log' import WindowManager, {WindowType, WINDOW_SHOW_HIDE_EVENT -} from '../../../../../../../../common/src/main/ets/default/WindowManager' -import EventManager, {unsubscribe} from "../../../../../../../../common/src/main/ets/default/event/EventManager" -import {obtainLocalEvent} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' -import HeightConfigUtils from '../../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' -import StatusBarComponent from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' -import StatusBarVM from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' -import {StatusBarData} from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants' +} from '../../../../../../../common/src/main/ets/default/WindowManager' +import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainLocalEvent} from "../../../../../../../common/src/main/ets/default/event/EventUtil" +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' +import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' +import StatusBarComponent from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' +import StatusBarVM from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' +import {StatusBarData} from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants' import Constants from './common/constants' import StyleManager from './common/StyleManager' import StatusbarConfig from './common/StatusbarConfig' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' const TAG = 'StatusBar-Index' const SLIDING_STATUS_BAR_DISTANCE = 30 @@ -51,6 +52,19 @@ struct Index { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, start`); + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config') + let statusBarData: StatusBarData = new StatusBarData(); + statusBarData.displayWidth = configInfo.maxWidth; + statusBarData.displayHeight = configInfo.maxHeight; + statusBarData.showHorizontal = configInfo.showHorizontal; + statusBarData.ableToMaximize = configInfo.ableToMaximize; + statusBarData.realWidth = configInfo.realWidth; + statusBarData.realHeight = configInfo.realHeight; + statusBarData.left = configInfo.xCoordinate; + statusBarData.top = configInfo.yCoordinate; + StatusBarVM.updateStatusBarData(statusBarData); + this.mStatusBarData = StatusBarVM.getStatusBarData() + setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) StyleManager.setStyle() @@ -82,7 +96,8 @@ struct Index { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { StatusBarComponent({ - mStatusBarComponentConfig: StatusbarConfig + mStatusBarComponentConfig: StatusbarConfig, + moduleName: 'phone_statusbar' }) } .width('100%') diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js similarity index 90% rename from product/pc/controlpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js rename to product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 3135d74c..967798c6 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/workers/PluginDataSourceWorker.js +++ b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -14,10 +14,10 @@ */ import worker from "@ohos.worker"; -import Log from "../../../../../../../../common/src/main/ets/default/Log"; +import Log from "../../../../../../../common/src/main/ets/default/log"; import PluginDataSourceManager -from "../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager"; -import Constants, { obtainMsg } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; +from "../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager"; +import Constants, { obtainMsg } from "../../../../../../../common/src/main/ets/plugindatasource/common/constants"; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; diff --git a/product/phone/statusbar/src/main/module.json5 b/product/phone/statusbar/src/main/module.json5 new file mode 100644 index 00000000..57494f67 --- /dev/null +++ b/product/phone/statusbar/src/main/module.json5 @@ -0,0 +1,27 @@ +{ + "module": { + "name": "phone_statusbar", + "type": "feature", + "srcEntrance": "./ets/Application/AbilityStage.ts", + "description": "$string:mainability_description", + "mainElement": "statusbar.ServiceExtAbility", + "deviceTypes": [ + "phone" + ], + "deliveryWithInstall": true, + "installationFree": false, + "uiSyntax": "ets", + "pages": "$profile:main_pages", + "extensionAbilities": [ + { + "visible": true, + "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", + "name": "com.ohos.systemui.statusbar.ServiceExtAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "service" + } + ] + } +} \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/element/color.json b/product/phone/statusbar/src/main/resources/base/element/color.json index 6b163c9d..3889b9ce 100644 --- a/product/phone/statusbar/src/main/resources/base/element/color.json +++ b/product/phone/statusbar/src/main/resources/base/element/color.json @@ -7,6 +7,34 @@ { "name": "default_font_color", "value": "#ffffffff" + }, + { + "name": "battery_component_pic_level_low_color", + "value": "#ff0000" + }, + { + "name": "battery_component_pic_charging_color", + "value": "#00ff21" + }, + { + "name": "battery_background", + "value": "#00000000" + }, + { + "name": "capsule_background_color", + "value": "#64BB5C" + }, + { + "name" : "green_capsule_text_color", + "value" : "#ccFFFFFF" + }, + { + "name": "background_color", + "value": "#0xDCDCDC" + }, + { + "name": "control_center_complex_toggle_ring_mode_on_bg_color", + "value": "#FFFF9800" } ] } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/element/float.json b/product/phone/statusbar/src/main/resources/base/element/float.json new file mode 100644 index 00000000..b1620ac3 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/element/float.json @@ -0,0 +1,124 @@ +{ + "float": [ + { + "name": "status_bar_clock_width", + "value": "60vp" + }, + { + "name": "battery_component_gap", + "value": "8.5vp" + }, + { + "name": "battery_component_pic_gap", + "value": "2vp" + }, + { + "name": "battery_component_pic_body_height", + "value": "19vp" + }, + { + "name": "battery_component_pic_body_width", + "value": "34.5vp" + }, + { + "name": "battery_component_pic_body_padding", + "value": "2vp" + }, + { + "name": "battery_component_pic_body_border_width", + "value": "1vp" + }, + { + "name": "battery_component_pic_border_radius", + "value": "2vp" + }, + { + "name": "battery_component_pic_head_radius", + "value": "2vp" + }, + { + "name": "battery_component_pic_head_width", + "value": "3vp" + }, + { + "name": "battery_component_pic_head_height", + "value": "10vp" + }, + { + "name": "green_capsule_phone_width", + "value": "15vp" + }, + { + "name": "green_capsule_phone_height", + "value": "15vp" + }, + { + "name": "green_capsule_height", + "value": "48vp" + }, + { + "name": "green_capsule_text_left_right", + "value": "10vp" + }, + { + "name": "green_capsule_radius", + "value": "24vp" + }, + { + "name":"signal_component_icon_width", + "value":"32vp" + }, + { + "name":"signal_component_icon_height", + "value":"24vp" + }, + { + "name":"status_bar_signal_unknown_font_size", + "value":"14fp" + }, + { + "name":"signal_text_max_width", + "value":"113vp" + }, + { + "name":"status_bar_signal_net_signal_text_max_width", + "value":"18vp" + }, + { + "name": "status_bar_bluetooth_width", + "value": "18vp" + }, + { + "name": "status_bar_bluetooth_height", + "value": "24vp" + }, + { + "name": "status_bar_ring_mode_width", + "value": "27vp" + }, + { + "name": "status_bar_ring_mode_height", + "value": "24vp" + }, + { + "name":"status_bar_signal_type_font_size", + "value":"10fp" + }, + { + "name": "status_bar_wifi_width", + "value": "24vp" + }, + { + "name": "status_bar_wifi_height", + "value": "24vp" + }, + { + "name": "status_bar_location_width", + "value": "20vp" + }, + { + "name": "status_bar_location_height", + "value": "24vp" + } + ] +} \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/element/string.json b/product/phone/statusbar/src/main/resources/base/element/string.json index 6857b5fe..59ebb9ee 100644 --- a/product/phone/statusbar/src/main/resources/base/element/string.json +++ b/product/phone/statusbar/src/main/resources/base/element/string.json @@ -8,14 +8,14 @@ "name": "status_bar_size_landscape", "value": "48" }, - { - "name": "status_bar_position_portrait", - "value": "1" - }, { "name": "status_bar_position_landscape", "value": "2" }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, { "name": "app_name", "value": "SystemUI" @@ -23,6 +23,30 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "net_null", + "value": "没有 SIM 卡" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + }, + { + "name": "signal_null", + "value": "×" } ] } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg b/product/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg new file mode 100644 index 00000000..0527fb75 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg new file mode 100644 index 00000000..2d166cbe --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg new file mode 100644 index 00000000..a6bac17a --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg new file mode 100644 index 00000000..162b938a --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg new file mode 100644 index 00000000..f0438a9a --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg new file mode 100644 index 00000000..173489d3 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg new file mode 100644 index 00000000..c703e2d0 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg new file mode 100644 index 00000000..cb66ccb4 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg new file mode 100644 index 00000000..3c796ab5 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg new file mode 100644 index 00000000..4d1a5bc4 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png new file mode 100644 index 0000000000000000000000000000000000000000..c37dc10f00c0b991f31faf014841cf015c33684c GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T|AsMW1 zr|r*Tauhgb>uGgStNy^P_6?#FMVve)-}~+{vHSx2h4Kqd0!I#AJEhio!_(qmL#x@T zpSs)Gn>|we64(6@yY@40Z{hx*ckd+W9d~3>abQv@U~YV{|Bgo2svr9l-`#Z7H*j|p z$T?bNrpoo>*dCL*jT+p>+6wcFo{K;E8sK7>`tR-~6V@#ovL%b(l-Ikism>KMVSRJ) zySBw!uI-`=eU~h2IPySIu!9xIT*dHZkM-7jEti*GxH;KC$A6)~_3Se#ISTXE#@cJ} z*mPF+UzlH^?zAyY$yC>*_3)C^811vZGV^m+X)fr!(|5kS@_qXL)S{J|2P9=Urpr6c z_6%iw@l)QS^ndG}6%SSQj$V2f9NMt`=J$_+8#B{w?^*gX&dgezef&j$z`ROZ$3KTk m{2!cOZ#aR06Bo+hn8VPgo36`mR;~mLZ3a(QKbLh*2~7YkC#n4a literal 0 HcmV?d00001 diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png new file mode 100644 index 0000000000000000000000000000000000000000..11a8958a11189755d4328343ef68453f27411739 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T*yPaTIC&-l?5c*qkBay7^*~k>r&$Ly!18Z`L!$ld*I$=K*~7KJU*Af*d#L=Z)eW|&9^-1WKCL{L`wsFSMNNuj zo;@#oKi6*J``r=D+vFAZzdX&!wO{D@!naFz?&iD0QN=Umih7i5_KI$&tpRsscd#-Q z@Yya7c<9U0nzdN6`r2Cd5~;llLuAh^iB8~VdttH5|H-oZkB+~IoGy1Fo4K|lf7aKj z-Y-~KUrcMfYxp_V_`XkZxavrqt&mjfgarZk{)LRCI6 Y|5;yC(^}(m1{fI(p00i_>zopr0MHz`#sB~S literal 0 HcmV?d00001 diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg new file mode 100644 index 00000000..91b52b22 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg new file mode 100644 index 00000000..3842e2ab --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg new file mode 100644 index 00000000..7829aa32 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg new file mode 100644 index 00000000..ef60272d --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a905dfc0f9c219e48db7edb5ca93b1041766f5 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g;!3HGxU+kX;q!^2X+?^QKos)S9a~60+7BevL9R^{>w;^3X z&tcIc38B^<9WJX2SbJUOI4-=R?dq7gXZz<9H|CyL=e05ZQ|h<+|7YgkRMpV3nV zx}zc3^^8>kYjoGA=EK<@@49B>=A@)`?U}M=*@1(W(3wAXhqV%sM z<);f5H`OeQzHv>={)WIo?mrH>N8z90L;+t&5DvDvqxncelwvtDnm{r-UW|#=MI2 literal 0 HcmV?d00001 diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg new file mode 100644 index 00000000..42e8b4b9 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg new file mode 100644 index 00000000..3122653c --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/profile/main_pages.json b/product/phone/statusbar/src/main/resources/base/profile/main_pages.json new file mode 100644 index 00000000..feec276e --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/index" + ] +} diff --git a/product/phone/statusbar/src/main/resources/en_US/element/string.json b/product/phone/statusbar/src/main/resources/en_US/element/string.json index 6857b5fe..f3f51fab 100644 --- a/product/phone/statusbar/src/main/resources/en_US/element/string.json +++ b/product/phone/statusbar/src/main/resources/en_US/element/string.json @@ -8,14 +8,14 @@ "name": "status_bar_size_landscape", "value": "48" }, - { - "name": "status_bar_position_portrait", - "value": "1" - }, { "name": "status_bar_position_landscape", "value": "2" }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, { "name": "app_name", "value": "SystemUI" @@ -23,6 +23,30 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "net_null", + "value": "No SIM" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + }, + { + "name": "signal_null", + "value": "×" } ] } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/zh_CN/element/string.json b/product/phone/statusbar/src/main/resources/zh_CN/element/string.json index 6857b5fe..59ebb9ee 100644 --- a/product/phone/statusbar/src/main/resources/zh_CN/element/string.json +++ b/product/phone/statusbar/src/main/resources/zh_CN/element/string.json @@ -8,14 +8,14 @@ "name": "status_bar_size_landscape", "value": "48" }, - { - "name": "status_bar_position_portrait", - "value": "1" - }, { "name": "status_bar_position_landscape", "value": "2" }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, { "name": "app_name", "value": "SystemUI" @@ -23,6 +23,30 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "net_null", + "value": "没有 SIM 卡" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + }, + { + "name": "signal_null", + "value": "×" } ] } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle deleted file mode 100755 index c7d80338..00000000 --- a/settings.gradle +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2021 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 ':common', - ':phone_entry', ':phone_statusbar', ':phone_dropdownpanel', - ':pc_entry', ':pc_statusbar', ':pc_controlpanel', ':pc_notificationpanel', - ':default_navigationBar', ':default_notificationmanagement', ':default_volumepanel', - ':features:capsulecomponent', ':features:batterycomponent', ':features:clockcomponent', - ':features:signalcomponent', ':features:wificomponent', ':features:navigationservice', ':features:noticeitem', - ':features:airplanecomponent', ':features:brightnesscomponent', ':features:volumecomponent', ':features:managementcomponent', - ':features:statusbarcomponent', ':features:controlcentercomponent', ':features:bluetoothcomponent', ':features:locationcomponent', - ':features:ringmodecomponent', ':features:volumepanelcomponent', ':features:autorotatecomponent' -project(':phone_entry').projectDir = new File('./entry/phone') -project(':phone_statusbar').projectDir = new File('./product/phone/statusbar') -project(':phone_dropdownpanel').projectDir = new File('./product/phone/dropdownpanel') -project(':pc_entry').projectDir = new File('./entry/pc') -project(':pc_statusbar').projectDir = new File('./product/pc/statusbar') -project(':pc_controlpanel').projectDir = new File('./product/pc/controlpanel') -project(':pc_notificationpanel').projectDir = new File('./product/pc/notificationpanel') -project(':default_navigationBar').projectDir = new File('./product/default/navigationBar') -project(':default_notificationmanagement').projectDir = new File('./product/default/notificationmanagement') -project(':default_volumepanel').projectDir = new File('./product/default/volumepanel') \ No newline at end of file -- Gitee From dab96b360e30992abf4a311cc01d2605a02bff59 Mon Sep 17 00:00:00 2001 From: supeng Date: Mon, 25 Apr 2022 21:10:30 +0800 Subject: [PATCH 068/373] update OAT.xml Signed-off-by: supeng --- OAT.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OAT.xml b/OAT.xml index 17c700ac..ba0d46d0 100644 --- a/OAT.xml +++ b/OAT.xml @@ -81,6 +81,12 @@ + + + + + + -- Gitee From dcdc90c807a1514c0116428f05945bd0fd5c72e5 Mon Sep 17 00:00:00 2001 From: supeng Date: Mon, 25 Apr 2022 21:27:32 +0800 Subject: [PATCH 069/373] update instructions.md Signed-off-by: supeng --- doc/Instructions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Instructions.md b/doc/Instructions.md index 9ad3abb5..6a508e3e 100644 --- a/doc/Instructions.md +++ b/doc/Instructions.md @@ -17,7 +17,7 @@ ``` ### 环境搭建 -打开DevEco Studio链接下载安装,安装步骤及安装说明详见下载地址([下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download)) +安装DevEco Studio ## 基础开发说明 ### 系统接口调用 -- Gitee From 535b41ec3d048c8f7986dba55c65798edd02b18e Mon Sep 17 00:00:00 2001 From: zhuchengfeng <940848916@qq.com> Date: Wed, 27 Apr 2022 11:11:43 +0800 Subject: [PATCH 070/373] screen on and off quickly problem Signed-off-by: zhuchengfeng <940848916@qq.com> --- .../src/main/ets/com/ohos/model/accountsModel.ts | 7 +++---- .../src/main/ets/com/ohos/model/screenLockService.ts | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index dbd6c1ba..0b57bc67 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -111,12 +111,10 @@ export default class AccountsModel { private addAllUsers() { Log.showInfo(TAG, "start getAllUsers") - let tempLink = AppStorage.SetAndLink('userList', []); - let accountList = tempLink.get(); - let accountMap = new Map(); - Log.showInfo(TAG, "start query") osAccount.getAccountManager().queryAllCreatedOsAccounts().then((list) => { Log.showInfo(TAG, "start sort") + let accountList = []; + let accountMap = new Map(); list.sort(this.sortAccount.bind(this)); for (const user of list) { Log.showInfo(TAG, "start get user" + JSON.stringify(user)) @@ -135,6 +133,7 @@ export default class AccountsModel { accountMap.get(user.localId).userIconPath = path }) } + AppStorage.SetOrCreate('userList', accountList); }) } diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 8cb3a5b5..c1cb148f 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -97,8 +97,8 @@ export class ScreenLockService { //The device is going to sleep this.screenLockModel.eventListener(EVENT_BEGIN_SLEEP, () => { Log.showInfo(TAG, `EVENT_BEGIN_SLEEP event`); - this.accountModel.updateAllUsers() this.lockScreen(); + this.accountModel.updateAllUsers() AppStorage.SetOrCreate('deviceStatus', EVENT_BEGIN_SLEEP); }) -- Gitee From 5ead2e269c0ef90c90a190ecdfe70519b076cc68 Mon Sep 17 00:00:00 2001 From: r00498791 Date: Mon, 9 May 2022 13:11:00 +0800 Subject: [PATCH 071/373] Fix the problem of notification panel and control panel icon display Signed-off-by: r00498791 --- OAT.xml | 10 +-- .../PluginDataSourceAdapter.ts | 6 +- .../PluginDataSourceManager.ts | 11 ++- .../common/BundleParseUtil.ts | 83 +++++++++++++++---- entry/pc/src/main/module.json5 | 6 ++ entry/phone/src/main/module.json5 | 6 ++ .../com/ohos/model/ControlCenterService.ts | 6 +- .../com/ohos/pages/ControlCenterComponent.ets | 3 +- .../ets/com/ohos/viewmodel/ControlCenterVM.ts | 4 +- .../ets/com/ohos/model/StatusBarService.ts | 6 +- .../ets/com/ohos/pages/StatusBarComponent.ets | 7 +- .../ets/com/ohos/viewmodel/StatusBarVM.ts | 4 +- .../src/main/ets/pages/control.ets | 1 - product/pc/controlpanel/src/main/module.json5 | 2 +- product/pc/statusbar/package-lock.json | 24 ++++++ product/pc/statusbar/package.json | 10 ++- .../pc/statusbar/src/main/ets/pages/index.ets | 16 +++- .../src/main/ets/pages/control.ets | 1 - .../statusbar/src/main/ets/pages/index.ets | 3 +- 19 files changed, 157 insertions(+), 52 deletions(-) diff --git a/OAT.xml b/OAT.xml index ba0d46d0..90fc5c2c 100644 --- a/OAT.xml +++ b/OAT.xml @@ -82,11 +82,11 @@ - - - - - + + + + + diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts index 1528574a..2928aaf1 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts @@ -26,21 +26,19 @@ export type pluginWorkerListener = { }; const TAG = "PluginDataSourceAdapter"; +const WORKER_JS_URL = "workers/PluginDataSourceWorker.js"; export default class PluginDataSourceAdapter { mContext: Context; mWorker: any; mName: string; mListener: pluginWorkerListener; - mModuleName: string; - constructor(name: string, context: Context, listener: pluginWorkerListener, moduleName: string) { + constructor(name: string, context: Context, listener: pluginWorkerListener) { Log.showInfo(TAG, `constructor, name: ${name}`); this.mName = name; this.mContext = context; this.mListener = listener; - this.mModuleName = moduleName; - const WORKER_JS_URL = this.mModuleName + "/ets/workers/PluginDataSourceWorker.js"; this.mWorker = new worker.Worker(WORKER_JS_URL, { type: "classic", name: this.mName, diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts index a5e6a102..97295e39 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts @@ -25,6 +25,7 @@ import { registerBundleListener, } from "./common/BundleParseUtil"; import { AbilityInfo } from "bundle/abilityInfo"; +import { ExtensionAbilityInfo } from "bundle/extensionAbilityInfo"; export type PluginListener = { onItemAdd: (itemData: ItemComponentData) => void; @@ -85,16 +86,20 @@ export default class PluginDataSourceManager { } async loadData(userId: number) { + Log.showInfo(TAG, `loadData, userId: ${userId}`); + Log.showInfo(TAG, `loadData, this.mUserId: ${this.mUserId}`); if (this.mUserId != userId) { this.mUserId = userId; this.mLoaders.forEach((sourceLoader) => sourceLoader.clearData()); let abilityInfos = await queryAbility(this.mAction, this.mUserId); + Log.showInfo(TAG, `loadData, abilityInfos: ${JSON.stringify(abilityInfos)}`); abilityInfos.forEach((info) => this.notifyAbilityAdd(info)); } this.mLoaders.forEach((sourceLoader) => sourceLoader.reloadData(this.mUserId)); } - private notifyAbilityAdd(info: AbilityInfo) { + private notifyAbilityAdd(info: AbilityInfo | ExtensionAbilityInfo) { + Log.showInfo(TAG, `notifyAbilityAdd, info: ${JSON.stringify(info)}`); let itemId = this.mFilterDatas.get(info.name); if (!itemId) { Log.showInfo(TAG, `notifyAbilityAdd, can't find itemId, ability:${info.name}`); @@ -104,8 +109,8 @@ export default class PluginDataSourceManager { ...info, itemId: itemId, }; - if (!abilityInfo.metaData || !abilityInfo.metaData.length) { - Log.showInfo(TAG, `Can't find metaData, abilityId: ${abilityInfo.name}`); + if ((!abilityInfo.metaData || !abilityInfo.metaData.length) && (!abilityInfo.metadata || !abilityInfo.metadata.length) ) { + Log.showInfo(TAG, `Can't find metadata, abilityId: ${abilityInfo.name}`); return; } this.mLoaders.forEach((loader) => loader.onAbilityAdd(abilityInfo)); diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts index 50ac335e..a5d435d8 100644 --- a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts +++ b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts @@ -14,6 +14,7 @@ */ import bundleManager from "@ohos.bundle"; +import { ExtensionAbilityInfo } from "bundle/extensionAbilityInfo"; import commonEvent from "@ohos.commonEvent"; import { AbilityInfo } from "bundle/abilityInfo"; import Log from "../../default/Log"; @@ -47,32 +48,84 @@ const BUNDLE_SUBSCRIBE_INFO = { ], }; -export async function queryAbility(action: string, userId: number, bundleName?: string): Promise> { +export async function queryAbility(action: string, userId: number, bundleName?: string): Promise> { + Log.showInfo(TAG, `queryAbility, action: ${action} , userId: ${userId}`); if (bundleName) { - return await bundleManager.queryAbilityByWant( - { - action: action, - bundleName: bundleName, - }, - DEFAULT_BUNDLE_FLAG, - userId - ); + Log.showInfo(TAG, `queryAbility, bundleName: ${bundleName}`); + let abilitys = []; + try { + abilitys = await bundleManager.queryAbilityByWant( + { + action: action, + bundleName: bundleName, + }, + DEFAULT_BUNDLE_FLAG, + userId + ); + } catch (error) { + Log.showInfo(TAG, `queryAbility, queryAbilityByWant error: ${JSON.stringify(error)}`); + } + let extensionAbilitys = []; + try { + extensionAbilitys = await bundleManager.queryExtensionAbilityInfosByWant( + { + action: action, + bundleName: bundleName, + }, + DEFAULT_BUNDLE_FLAG, + userId + ); + } catch (error) { + Log.showInfo(TAG, `queryAbility, queryExtensionAbilityInfosByWant error: ${JSON.stringify(error)}`); + } + Log.showInfo(TAG, `queryAbility, end`); + let rets = [...abilitys, ...extensionAbilitys]; + Log.showInfo(TAG, `queryAbility, rets: ${JSON.stringify(rets)}`); + return rets; + } + let abilitys = []; + try { + abilitys = await bundleManager.queryAbilityByWant({ action: action }, DEFAULT_BUNDLE_FLAG, userId); + } catch (error) { + Log.showInfo(TAG, `queryAbility, queryAbilityByWant error: ${JSON.stringify(error)}`); } - return await bundleManager.queryAbilityByWant({ action: action }, DEFAULT_BUNDLE_FLAG, userId); + let extensionAbilitys = []; + try { + extensionAbilitys = await bundleManager.queryExtensionAbilityInfosByWant({ action: action }, DEFAULT_BUNDLE_FLAG, userId); + } catch (error) { + Log.showInfo(TAG, `queryAbility, queryExtensionAbilityInfosByWant error: ${JSON.stringify(error)}`); + } + Log.showInfo(TAG, `queryAbility, end`); + let rets = [...abilitys, ...extensionAbilitys]; + Log.showInfo(TAG, `queryAbility, rets: ${JSON.stringify(rets)}`); + return rets; } + export function filterAbilityInfo(info: AbilityInfoWithId, filterKey: string): PluginData | undefined { - let pluginDatas = info.metaData.filter((data) => data.name == filterKey); + Log.showInfo(TAG, `filterAbilityInfo, info: ${JSON.stringify(info)} filterKey: ${filterKey}`); + let pluginDatas = []; + if(info.metaData && info.metaData.length){ + pluginDatas = info.metaData.filter((data) => data.name == filterKey); + } else if(info.metadata && info.metadata.length){ + pluginDatas = info.metadata.filter((data) => data.name == filterKey); + } + Log.showInfo(TAG, `filterAbilityInfo, pluginDatas: ${JSON.stringify(pluginDatas)}`); if (!pluginDatas.length) { - Log.showDebug(TAG, `filterKey: ${filterKey}, metaData: ${JSON.stringify(info.metaData.values)}`); + Log.showDebug(TAG, `filterKey: ${filterKey}, metadata: ${JSON.stringify(info.metadata.values)}`); return undefined; } - let pluginData = JSON.parse("{" + pluginDatas[0].extra + "}"); + let pluginData; + if(pluginDatas[0].value && pluginDatas[0].value.length > 0){ + pluginData = JSON.parse("{" + pluginDatas[0].value + "}"); + } else if(pluginDatas[0].extra && pluginDatas[0].extra.length > 0){ + pluginData = JSON.parse("{" + pluginDatas[0].extra + "}"); + } if (!pluginData) { - Log.showError(TAG, `Can't parse pluginData: ${pluginDatas[0]}, filterKey: ${filterKey}`); + Log.showError(TAG, `Can't parse pluginData: ${pluginDatas[0]}, filterKey: ${filterKey}`); return undefined; } - Log.showInfo(TAG, `createItemComponentData, pluginData: ${JSON.stringify(pluginData)}`); + Log.showInfo(TAG, `filterAbilityInfo, pluginData: ${JSON.stringify(pluginData)}`); return pluginData; } diff --git a/entry/pc/src/main/module.json5 b/entry/pc/src/main/module.json5 index 4ac09da3..c1efd44a 100644 --- a/entry/pc/src/main/module.json5 +++ b/entry/pc/src/main/module.json5 @@ -62,6 +62,12 @@ }, { "name": "ohos.permission.MANAGE_SECURE_SETTINGS" + }, + { + "name": "ohos.permission.ACCESS_NOTIFICATION_POLICY" + }, + { + "name": "ohos.permission.MODIFY_AUDIO_SETTINGS" } ] } diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index 5c9b5ff7..94485653 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -62,6 +62,12 @@ }, { "name": "ohos.permission.MANAGE_SECURE_SETTINGS" + }, + { + "name": "ohos.permission.ACCESS_NOTIFICATION_POLICY" + }, + { + "name": "ohos.permission.MODIFY_AUDIO_SETTINGS" } ] } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index c77e855f..37e1d810 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -54,8 +54,7 @@ function parseData(itemData: ItemComponentData): ControlComponentData { export class ControlCenterService { mIsStart: boolean = false; -// mAdapter: PluginDataSourceAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this); - mAdapter: PluginDataSourceAdapter; + mAdapter: PluginDataSourceAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this); mListener: ControlCenterListener | undefined; mConfig: any; mComplexToggleLayoutTemplate: string[]; @@ -69,7 +68,7 @@ export class ControlCenterService { Log.showInfo(TAG, `constructor`) } - startService(config, moduleName): void { + startService(config): void { if (this.mIsStart) { return; } @@ -80,7 +79,6 @@ export class ControlCenterService { SwitchUserManager.getInstance().registerListener(this); CONTROLCENTER_SOURCE_CONFIG.filterDatas = config.MetaToggles; - this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); this.mAdapter.initDataSource(CONTROLCENTER_SOURCE_CONFIG); } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index 79e76cd9..3fda4f8e 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -42,12 +42,11 @@ export default struct ControlCenterComponent { private mHidingSimpleToggles: string[] = [] private mDefaultDisplaySimpleToggles: string[] = [] private titleDisplayInside: boolean = false - private moduleName: string = '' aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear') Log.showInfo(TAG, `aboutToAppear, mControlCenterComponentConfig: ${JSON.stringify(this.mControlCenterComponentConfig)}`) - ViewModel.initViewModel(this.mControlCenterComponentConfig, this.moduleName) + ViewModel.initViewModel(this.mControlCenterComponentConfig) } aboutToDisappear() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts index 8e576c27..b9992ce0 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts @@ -36,14 +36,14 @@ export class ControlCenterVM { ControlCenterService.registerListener(this); } - initViewModel(config, moduleName) { + initViewModel(config) { if (this.mIsStart) { return; } Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)} `) this.mIsStart = true; - ControlCenterService.startService(config, moduleName); + ControlCenterService.startService(config); } setComplexToggleLayout(layout: string[]): void{ diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts index b1c8d308..a0b8992d 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -62,8 +62,7 @@ function parseItemData(itemData: ItemComponentData): StatusBarComponentData { export class StatusBarService { mIsStart: boolean = false; -// mAdapter: PluginDataSourceAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this); - mAdapter: PluginDataSourceAdapter; + mAdapter: PluginDataSourceAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this); mListener: StatusBarListener | undefined; mConfig: any; mStatusBarData: StatusBarData; @@ -79,7 +78,7 @@ export class StatusBarService { this.mStatusBarData = data; } - startService(config, moduleName) { + startService(config) { if (this.mIsStart) { return; } @@ -90,7 +89,6 @@ export class StatusBarService { SwitchUserManager.getInstance().registerListener(this); STATUSBAR_SOURCE_CONFIG.filterDatas = config.MetaSlots; - this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); this.mAdapter.initDataSource(STATUSBAR_SOURCE_CONFIG); Log.showInfo(TAG, `start StatusBarService finish.`); diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index 73c24a09..9e5593d5 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -43,11 +43,10 @@ export default struct StatusBarComponent { private mStatusBarComponentConfig: any = {} @StorageLink('StatusBarLayout') mStatusBarLayout: any = [[], [], []] @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() - private moduleName: string = '' aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`) - this.initViewModel(this.moduleName) + this.initViewModel() Log.showInfo(TAG, `aboutToAppear End`) } @@ -55,9 +54,9 @@ export default struct StatusBarComponent { Log.showInfo(TAG, `aboutToDisappear`) } - initViewModel(moduleName) { + initViewModel() { Log.showInfo(TAG, `initViewModel`) - ViewModel.initViewModel(this.mStatusBarComponentConfig, moduleName) + ViewModel.initViewModel(this.mStatusBarComponentConfig) } build() { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index efd6ccbb..1d5c1171 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -82,7 +82,7 @@ export class StatusBarVM { } } - initViewModel(config, moduleName) { + initViewModel(config) { if (this.mIsStart) { return; } @@ -90,7 +90,7 @@ export class StatusBarVM { this.mIsStart = true; this.install(); - StatusBarService.startService(config, moduleName); + StatusBarService.startService(config); } setStatusBarLayout(layout: string[][]): void{ diff --git a/product/pc/controlpanel/src/main/ets/pages/control.ets b/product/pc/controlpanel/src/main/ets/pages/control.ets index a07a4b2f..3418cfbc 100644 --- a/product/pc/controlpanel/src/main/ets/pages/control.ets +++ b/product/pc/controlpanel/src/main/ets/pages/control.ets @@ -38,7 +38,6 @@ export default struct Control { mSimpleToggleColumnCount: Constants.DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT, modeChangeCallback: (isEdit) => this.modeChangeCallback(isEdit), titleDisplayInside: true, - moduleName: 'pc_controlpanel', }) } .width('100%') diff --git a/product/pc/controlpanel/src/main/module.json5 b/product/pc/controlpanel/src/main/module.json5 index 8e663898..9e47a3f7 100644 --- a/product/pc/controlpanel/src/main/module.json5 +++ b/product/pc/controlpanel/src/main/module.json5 @@ -24,7 +24,7 @@ ], "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", "name": "com.ohos.systemui.controlpanel.ServiceExtAbility", - "icon": "$media:icon", + "icon": "$media:ic_controlcenter_oh", "description": "$string:mainability_description", "label": "$string:app_name", "type": "service", diff --git a/product/pc/statusbar/package-lock.json b/product/pc/statusbar/package-lock.json index a2fbe4a0..9df1d802 100644 --- a/product/pc/statusbar/package-lock.json +++ b/product/pc/statusbar/package-lock.json @@ -4,8 +4,32 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@ohos/batterycomponent": { + "version": "file:../../../features/batterycomponent" + }, + "@ohos/bluetoothcomponent": { + "version": "file:../../../features/bluetoothcomponent" + }, + "@ohos/capsulecomponent": { + "version": "file:../../../features/capsulecomponent" + }, + "@ohos/clockcomponent": { + "version": "file:../../../features/clockcomponent" + }, + "@ohos/locationcomponent": { + "version": "file:../../../features/locationcomponent" + }, + "@ohos/ringmodecomponent": { + "version": "file:../../../features/ringmodecomponent" + }, + "@ohos/signalcomponent": { + "version": "file:../../../features/signalcomponent" + }, "@ohos/statusbarcomponent": { "version": "file:../../../features/statusbarcomponent" + }, + "@ohos/wificomponent": { + "version": "file:../../../features/wificomponent" } } } diff --git a/product/pc/statusbar/package.json b/product/pc/statusbar/package.json index 98f6cc77..3c1d464d 100644 --- a/product/pc/statusbar/package.json +++ b/product/pc/statusbar/package.json @@ -8,6 +8,14 @@ }, "version": "1.0.0", "dependencies": { - "@ohos/statusbarcomponent": "file:../../../features/statusbarcomponent" + "@ohos/statusbarcomponent": "file:../../../features/statusbarcomponent", + "@ohos/wificomponent": "file:../../../features/wificomponent", + "@ohos/bluetoothcomponent": "file:../../../features/bluetoothcomponent", + "@ohos/signalcomponent": "file:../../../features/signalcomponent", + "@ohos/clockcomponent": "file:../../../features/clockcomponent", + "@ohos/locationcomponent": "file:../../../features/locationcomponent", + "@ohos/batterycomponent": "file:../../../features/batterycomponent", + "@ohos/ringmodecomponent": "file:../../../features/ringmodecomponent", + "@ohos/capsulecomponent": "file:../../../features/capsulecomponent" } } diff --git a/product/pc/statusbar/src/main/ets/pages/index.ets b/product/pc/statusbar/src/main/ets/pages/index.ets index 98d9ff1b..1d73180a 100644 --- a/product/pc/statusbar/src/main/ets/pages/index.ets +++ b/product/pc/statusbar/src/main/ets/pages/index.ets @@ -19,6 +19,9 @@ import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/ import StatusBarComponent from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' import StyleManager from './common/StyleManager' import StatusbarConfig from './common/StatusbarConfig' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBarVM from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' +import {StatusBarData} from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants' const TAG = 'StatusBar-Index' @@ -37,6 +40,18 @@ struct Index { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, start`); + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config') + let statusBarData: StatusBarData = new StatusBarData(); + statusBarData.displayWidth = configInfo.maxWidth; + statusBarData.displayHeight = configInfo.maxHeight; + statusBarData.showHorizontal = configInfo.showHorizontal; + statusBarData.ableToMaximize = configInfo.ableToMaximize; + statusBarData.realWidth = configInfo.realWidth; + statusBarData.realHeight = configInfo.realHeight; + statusBarData.left = configInfo.xCoordinate; + statusBarData.top = configInfo.yCoordinate; + StatusBarVM.updateStatusBarData(statusBarData); + setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) StyleManager.setStyle() @@ -65,7 +80,6 @@ struct Index { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { StatusBarComponent({ mStatusBarComponentConfig: StatusbarConfig, - moduleName: 'pc_statusbar' }) } .width('100%') diff --git a/product/phone/dropdownpanel/src/main/ets/pages/control.ets b/product/phone/dropdownpanel/src/main/ets/pages/control.ets index 075d7b70..eaeb9e43 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/control.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/control.ets @@ -58,7 +58,6 @@ export default struct Control { ControlCenterComponent({ touchMoveCallback: (data)=>this.controlCenterTouchMoveCallback(data), mControlCenterComponentConfig: ControlCenterConfig, - moduleName: 'phone_dropdownpanel', }) } .width('100%') diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index 6fd4c44f..1d24c94a 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -40,7 +40,7 @@ struct Index { startY: number = 0 @State moveX: number = 0 @State moveY: number = 0 - @State mStatusBarData: StatusBarData = StatusBarVM.getStatusBarData() + @State mStatusBarData: StatusBarData = new StatusBarData() @StorageLink('StatusMinH') StatusMinH: number = 24 @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 mClearCallback: unsubscribe | undefined @@ -97,7 +97,6 @@ struct Index { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { StatusBarComponent({ mStatusBarComponentConfig: StatusbarConfig, - moduleName: 'phone_statusbar' }) } .width('100%') -- Gitee From b5b3efc78b9e0c4816afb01eb3ee9583fc1d4359 Mon Sep 17 00:00:00 2001 From: r00498791 Date: Mon, 9 May 2022 21:21:29 +0800 Subject: [PATCH 072/373] fix notification and volumepanel problem Signed-off-by: r00498791 --- .../src/main/resources/base/element/float.json | 2 +- .../src/main/ets/com/ohos/common/Constants.ts | 1 + .../src/main/ets/com/ohos/model/VolumePanelService.ts | 4 ++++ .../src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts | 4 ++-- .../phone/dropdownpanel/src/main/ets/pages/notification.ets | 2 +- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/features/managementcomponent/src/main/resources/base/element/float.json b/features/managementcomponent/src/main/resources/base/element/float.json index 146dbab9..95c96582 100644 --- a/features/managementcomponent/src/main/resources/base/element/float.json +++ b/features/managementcomponent/src/main/resources/base/element/float.json @@ -34,7 +34,7 @@ }, { "name": "applist_hieght", - "value": "476vp" + "value": "404vp" }, { "name": "applist_hieght_phone", diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts index 61512b2a..227a40b8 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -26,6 +26,7 @@ export enum AudioVolumeType { VOICE_CALL = 0, RINGTONE = 2, MEDIA = 3, + VOICE_ASSISTANT = 9 } export interface VolumeInfo { diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts index b2f56036..8b92ca31 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts @@ -232,6 +232,8 @@ export class VolumePanelService { formatValue = AudioVolumeType.RINGTONE; } else if (audioVolumeType == audio.AudioVolumeType.MEDIA) { formatValue = AudioVolumeType.MEDIA; + } else if (audioVolumeType == audio.AudioVolumeType.VOICE_ASSISTANT) { + formatValue = AudioVolumeType.VOICE_ASSISTANT; } return formatValue; } @@ -244,6 +246,8 @@ export class VolumePanelService { formatValue = audio.AudioVolumeType.RINGTONE; } else if (audioVolumeType == AudioVolumeType.MEDIA) { formatValue = audio.AudioVolumeType.MEDIA; + } else if (audioVolumeType == AudioVolumeType.VOICE_ASSISTANT) { + formatValue = audio.AudioVolumeType.VOICE_ASSISTANT; } return formatValue; } diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts index 57095ce5..5d345eb6 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts @@ -15,7 +15,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import Constants from '../common/Constants' -import {AudioVolumeType, VolumeInfo} from '../common/Constants'; +import { AudioVolumeType, VolumeInfo } from '../common/Constants'; import VolumePanelService from '../model/VolumePanelService'; import VolumeWindowController from '../common/VolumeWindowController'; @@ -35,7 +35,7 @@ export class VolumePanelVM { mMinVolume: any; mVolumeValue: any; mIsMute: any; - mAllVolumeTypes = [AudioVolumeType.VOICE_CALL, AudioVolumeType.RINGTONE, AudioVolumeType.MEDIA]; + mAllVolumeTypes = [AudioVolumeType.VOICE_CALL, AudioVolumeType.RINGTONE, AudioVolumeType.MEDIA, AudioVolumeType.VOICE_ASSISTANT]; mVolumeBaseMap = {}; mCurrentAudioVolumeType: number = AudioVolumeType.MEDIA; mCurrentAudioVolume: number; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 899d6653..3447619b 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -199,7 +199,7 @@ struct CenterTitle { this.mTime = TimeManager.formatTime(date); let timeString = (date.getMonth() + 1) + (await ResourceUtil.getString($r('app.string.month'))); timeString += date.getDate() + (await ResourceUtil.getString($r('app.string.month'))); - timeString += await ResourceUtil.getString(Constants.WEEKDAY_LIST[date.getMonth()]); + timeString += await ResourceUtil.getString(Constants.WEEKDAY_LIST[date.getDay() - 1]); this.mTimeString = timeString; } -- Gitee From e7909dfa1963df59a8ce10dc6eedea189c20cae0 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 10 May 2022 09:39:21 +0800 Subject: [PATCH 073/373] UX adaptation Signed-off-by: jiangyingjie --- .../com/ohos/pages/VolumePanelComponent.ets | 6 +- .../base/media/ic_public_sound_04.svg | 9 +++ .../main/resources/phone/element/color.json | 32 +++++++++++ .../main/resources/phone/element/float.json | 56 +++++++++++++++++++ .../volumepanel/src/main/ets/pages/index.ets | 6 +- 5 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg create mode 100644 features/volumepanelcomponent/src/main/resources/phone/element/color.json create mode 100644 features/volumepanelcomponent/src/main/resources/phone/element/float.json diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets index 2c061f01..6b475323 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets @@ -69,7 +69,7 @@ export default struct VolumePanelComponent { Image(this.getVolumeIcon(this.VolumePanelIsMute, this.VolumePanelVolumeValue, this.VolumePanelMaxVolume, this.VolumePanelMinVolume)) .width(this.style.volumePanelMutBtnIconSize) .height(this.style.volumePanelMutBtnIconSize) - .fillColor(this.style.volumePanelRingModeColor) + .fillColor($r('sys.color.ohos_id_color_activated')) Column() .width('100%') .height(this.style.volumePanelMutBtnIconMarginBottom) @@ -87,7 +87,7 @@ export default struct VolumePanelComponent { Divider() .vertical(false) .strokeWidth(this.style.volumePanelDividerHeight) - .color(this.style.volumePanelDividerColor) + .color($r('sys.color.ohos_id_color_fourth')) .lineCap(LineCapStyle.Square) } .width(this.style.volumeDividerWidth) @@ -132,6 +132,8 @@ export default struct VolumePanelComponent { icon = $r('app.media.ic_public_sound_03') } else if (volume <= (((maxVolume - minVolume) / 3) * 2 + minVolume)) { icon = $r('app.media.ic_public_sound_02') + } else if (volume == (maxVolume - minVolume)) { + icon = $r('app.media.ic_public_sound_04') } else { icon = $r('app.media.ic_public_sound_01') } diff --git a/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg b/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg new file mode 100644 index 00000000..c0c7c2a8 --- /dev/null +++ b/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg @@ -0,0 +1,9 @@ + + + ic_sound_04 + + + + + + \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/resources/phone/element/color.json b/features/volumepanelcomponent/src/main/resources/phone/element/color.json new file mode 100644 index 00000000..9d0df293 --- /dev/null +++ b/features/volumepanelcomponent/src/main/resources/phone/element/color.json @@ -0,0 +1,32 @@ +{ + "color": [ + { + "name": "panel_background", + "value": "#F2FFFFFF" + }, + { + "name": "volume_slider_block_color", + "value": "#FFFFFFFF" + }, + { + "name": "volume_slider_track_color", + "value": "#E1E3E6" + }, + { + "name": "volume_slider_selected_color", + "value": "#FF007DFF" + }, + { + "name": "volume_button_background_color", + "value": "#00000000" + }, + { + "name": "volume_ring_mode_color", + "value": "#FF3B58C5" + }, + { + "name": "volume_divider_color", + "value": "#FF9BB792" + } + ] +} diff --git a/features/volumepanelcomponent/src/main/resources/phone/element/float.json b/features/volumepanelcomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..59849c81 --- /dev/null +++ b/features/volumepanelcomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,56 @@ + + + +{ + "float": [ + { + "name": "volume_panel_component_slider_margin_top", + "value": "20vp" + }, + { + "name": "volume_panel_component_slider_width", + "value": "4vp" + }, + { + "name": "volume_panel_component_slider_height", + "value": "160vp" + }, + { + "name": "volume_panel_border_radius", + "value": "24vp" + }, + { + "name": "volume_panel_component_slider_margin_bottom", + "value": "20vp" + }, + { + "name": "volume_panel_component_mute_btn_icon_size", + "value": "24vp" + }, + { + "name": "volume_panel_component_mute_btn_icon_margin_bottom", + "value": "12vp" + }, + { + "name": "volume_panel_component_mute_btn_height", + "value": "36vp" + }, + { + "name": "volume_panel_component_setting_icon_size", + "value": "24vp" + }, + { + "name": "volume_panel_divider_height", + "value": "1vp" + }, + { + "name": "volume_divider_width", + "value": "32vp" + }, + { + "name": "volume_panel_component_setting_btn_icon_size", + "value": "48vp" + } + + ] +} diff --git a/product/default/volumepanel/src/main/ets/pages/index.ets b/product/default/volumepanel/src/main/ets/pages/index.ets index 89de0209..d49503cb 100644 --- a/product/default/volumepanel/src/main/ets/pages/index.ets +++ b/product/default/volumepanel/src/main/ets/pages/index.ets @@ -41,10 +41,10 @@ struct Index { height: vp2px(realHeight) } } else { // Phone Mode - const realWidth = 96; - const realHeight = 568; + const realWidth = 48; + const realHeight = 284; volumeRect = { - left: configInfo.width - vp2px(32) - vp2px(realWidth), + left: configInfo.width - vp2px(16) - vp2px(realWidth), top: configInfo.height * 0.1, width: vp2px(realWidth) , height: vp2px(realHeight) -- Gitee From 0117af67e6cf257b721e470a6d6ae4ee6ea679e8 Mon Sep 17 00:00:00 2001 From: username <1037761763@qq.com> Date: Wed, 11 May 2022 15:51:49 +0800 Subject: [PATCH 074/373] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=95=BF=E6=97=B6?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: username <1037761763@qq.com> --- .../src/main/ets/com/ohos/noticeItem/common/constants.ts | 1 + .../src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts | 4 ++-- .../src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts | 6 ++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts index 85aa6415..fde0c197 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts @@ -118,6 +118,7 @@ export interface NotificationItemData { distributedOption?: any; deviceId?: string; groupName?: string; + tapDismissed?: boolean; } export interface NotificationServiceListener { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index 927a3289..286c031d 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -44,7 +44,6 @@ async function getUserId(uid) { return userId; } - /** * parse data util class. */ @@ -82,7 +81,8 @@ export default class ParseDataUtil { isRemoveAllowed: request.isRemoveAllowed, distributedOption: request.distributedOption, deviceId: request.deviceId, - groupName: request.groupName??request.hashcode + groupName: request.groupName??request.hashcode, + tapDismissed: request.tapDismissed }; Log.showInfo(TAG, `notificationItem construct over ====================`); notificationItem = { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index 2a54549e..21f00914 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -259,10 +259,12 @@ export class ViewModel { } clickItem(itemData, want?: any) { - Log.showInfo(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}, tapDismissed: ${itemData.tapDismissed}`); NotificationWindowManager.hideNotificationWindow(); CommonUtil.startWant((want) ? want : itemData.want); - this.removeNotificationItem(itemData, true); + if (itemData.tapDismissed) { + this.removeNotificationItem(itemData, true); + } } clickReply(inputKey, content, want) { -- Gitee From 7f66c704a903021700de23f634290cb52ba0b480 Mon Sep 17 00:00:00 2001 From: panshunli Date: Wed, 11 May 2022 18:20:08 +0800 Subject: [PATCH 075/373] =?UTF-8?q?=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83ux?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: panshunli --- .../pages/SimpleToggleLayoutEditComponent.ets | 4 +++- .../src/main/ets/com/ohos/pages/UpTitle.ets | 2 +- .../src/main/ets/pages/common/StyleManager.ts | 14 +++++++------- .../dropdownpanel/src/main/ets/pages/index.ets | 4 ++-- .../main/resources/phone/element/color.json | 8 ++++++++ .../phone/media/dropdownpanel_bgc.png | Bin 0 -> 417965 bytes 6 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 product/phone/dropdownpanel/src/main/resources/phone/element/color.json create mode 100644 product/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets index ed993a9c..05d4a813 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets @@ -189,6 +189,7 @@ export default struct SimpleToggleLayoutEditComponent { Text($r("app.string.control_center_simple_toggle_layout_edit_reset")) .fontColor(this.style.editBtnFontColor) .fontSize(this.style.editBtnFontSize) + .fontWeight(FontWeight.Medium) } .backgroundColor(this.style.editBtnBgColor) .width('100%') @@ -201,6 +202,7 @@ export default struct SimpleToggleLayoutEditComponent { Text($r("app.string.control_center_simple_toggle_layout_edit_finish")) .fontColor(this.style.editBtnFontColor) .fontSize(this.style.editBtnFontSize) + .fontWeight(FontWeight.Medium) } .backgroundColor(this.style.editBtnBgColor) .width('100%') @@ -390,7 +392,7 @@ struct SimpleToggleLayoutEditUpTitle { Text($r('app.string.control_center_simple_toggle_layout_edit')) .fontColor(this.style.fontColor) .fontSize(this.style.titleFontSize) - .fontWeight(FontWeight.Bold) + .fontWeight(FontWeight.Medium) }.width('100%') .height('100%') } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets index 7fae5b5a..32dc9917 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets @@ -50,7 +50,7 @@ export default struct UpTitle { Text($r('app.string.control_center')) .fontColor(this.style.fontColor) .fontSize(this.style.fontSize) - .fontWeight(FontWeight.Bold) + .fontWeight(FontWeight.Medium) } .height('100%') diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts index 50f349a9..b24043c3 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts @@ -42,7 +42,7 @@ export default class StyleManager { let style: any = ControlCenterStyleConfiguration.getControlCenterComponentStyle(); style.marginLeft = StyleManager.calcScaleSizePx(48); style.marginRight = StyleManager.calcScaleSizePx(48); - style.marginTop = StyleManager.calcScaleSizePx(33); + style.marginTop = StyleManager.calcScaleSizePx(36); style.upTitleHeight = StyleManager.calcScaleSizePx(127); style.titleMarginBottom = StyleManager.calcScaleSizePx(0); style.toggleAreaGap = StyleManager.calcScaleSizePx(24); @@ -57,7 +57,7 @@ export default class StyleManager { { let style: any = ControlCenterStyleConfiguration.getControlCenterUpTitleStyle(); style.marginLeft = StyleManager.calcScaleSizePx(72); - style.marginRight = StyleManager.calcScaleSizePx(30); + style.marginRight = StyleManager.calcScaleSizePx(72); style.fontSize = StyleManager.calcScaleSizePx(40); style.fontColor = "#FFFFFFFF"; style.imageWidth = StyleManager.calcScaleSizePx(48); @@ -96,7 +96,7 @@ export default class StyleManager { style.marginRight = StyleManager.calcScaleSizePx(16); style.componentGap = StyleManager.calcScaleSizePx(8); style.titleSize = StyleManager.calcScaleSizePx(24); - style.titleColor = $r("sys.color.ohos_id_color_text_secondary"); + style.titleColor = $r("sys.color.ohos_id_color_text_primary"); style.borderRadius = StyleManager.calcScaleSizePx(48); style.backgroundColor = '#99FFFFFF'; style.textMargin = StyleManager.calcScaleSizePx(8); @@ -114,7 +114,7 @@ export default class StyleManager { style.circleHeight = StyleManager.calcScaleSizePx(96); style.iconWidth = StyleManager.calcScaleSizePx(48); style.iconHeight = StyleManager.calcScaleSizePx(48); - style.iconOffBG = '#1A000000'; + style.iconOffBG = '#1A182431'; style.iconOnBG = '#FF007DFF'; style.iconOnColor = '#FFFFFFFF'; style.iconOffColor = $r("sys.color.ohos_id_color_secondary"); @@ -133,13 +133,13 @@ export default class StyleManager { style.dragCircleHeight = StyleManager.calcScaleSizePx(120); style.dragIconWidth = StyleManager.calcScaleSizePx(72); style.dragIconHeight = StyleManager.calcScaleSizePx(72); - style.iconOffBG = '#1A000000'; + style.iconOffBG = '#1A182431'; style.iconOnBG = '#FF007DFF'; style.iconOnColor = '#FFFFFFFF'; style.iconOffColor = $r("sys.color.ohos_id_color_secondary"); style.componentGap = StyleManager.calcScaleSizePx(10); style.titleSize = StyleManager.calcScaleSizePx(24); - style.titleColor = $r("sys.color.ohos_id_color_text_secondary"); + style.titleColor = $r("sys.color.ohos_id_color_text_primary"); style.textHoverWidth = StyleManager.calcScaleSizePx(136); style.textHoverHeight = StyleManager.calcScaleSizePx(36); style.textHoverRadius = StyleManager.calcScaleSizePx(8); @@ -161,7 +161,7 @@ export default class StyleManager { style.brightnessHeight = StyleManager.calcScaleSizePx(44); style.sliderHeight = StyleManager.calcScaleSizePx(40); style.sliderBlockColor = '#FFFFFFFF'; - style.sliderTrackColor = '#0D000000'; + style.sliderTrackColor = '#1A182431'; style.selectedColor = '#FF007DFF'; } diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index 1266a1b5..e4214b69 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -279,11 +279,11 @@ struct Index { build() { Stack({ alignContent: Alignment.Top }) { if (this.mBackground) { - Image(this.mBackground) + Image($r("app.media.dropdownpanel_bgc")) .width('100%') .height('100%') .objectFit(ImageFit.Fill) - .blur(20) + .blur(25) .opacity(this.backgroundOpacity) } Column() { diff --git a/product/phone/dropdownpanel/src/main/resources/phone/element/color.json b/product/phone/dropdownpanel/src/main/resources/phone/element/color.json new file mode 100644 index 00000000..38963e6c --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/phone/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "default_background", + "value": "#999999" + } + ] +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png b/product/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png new file mode 100644 index 0000000000000000000000000000000000000000..006af30147b653e802e7b45d1a5fd9c10c12f32c GIT binary patch literal 417965 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 He%> Date: Mon, 22 Aug 2022 10:48:40 +0800 Subject: [PATCH 244/373] =?UTF-8?q?[systemui]=E4=BF=AE=E6=94=B9=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E7=AE=A1=E7=90=86=E9=A1=B5=E5=BC=B9=E6=A1=86UX?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../main/resources/base/element/float.json | 26 +- .../main/resources/phone/element/float.json | 26 +- .../src/main/ets/pages/noDisturb.ets | 476 ++++++++++-------- .../src/main/ets/pages/index.ets | 20 +- 4 files changed, 279 insertions(+), 269 deletions(-) diff --git a/features/managementcomponent/src/main/resources/base/element/float.json b/features/managementcomponent/src/main/resources/base/element/float.json index 3be998b0..234a2f75 100644 --- a/features/managementcomponent/src/main/resources/base/element/float.json +++ b/features/managementcomponent/src/main/resources/base/element/float.json @@ -66,35 +66,23 @@ }, { "name": "dialog_title_height", - "value": "60vp" - }, - { - "name": "dialog_title_font", - "value": "20fp" + "value": "56vp" }, { "name": "dialog_title_margin_l", "value": "50" }, - { - "name": "dialog_button_font", - "value": "20fp" - }, - { - "name": "timeDialog_height", - "value": "310vp" - }, { "name": "timeDialog_datePicker_height", "value": "200vp" }, { - "name": "repeatDialog_cont_font", - "value": "16fp" + "name": "repeatDialog_width", + "value": "410vp" }, { - "name": "repeatDialog_height", - "value": "320vp" + "name": "repeatDialog_padding", + "value": "24vp" }, { "name": "border_width", @@ -182,7 +170,7 @@ }, { "name": "toggle_check_width", - "value": "25" + "value": "24vp" }, { "name": "divider_stroke_width", @@ -202,7 +190,7 @@ }, { "name": "divider_height", - "value": "20" + "value": "20vp" }, { "name": "itemComp_height", diff --git a/features/managementcomponent/src/main/resources/phone/element/float.json b/features/managementcomponent/src/main/resources/phone/element/float.json index 24ea9b6e..f0d0874b 100644 --- a/features/managementcomponent/src/main/resources/phone/element/float.json +++ b/features/managementcomponent/src/main/resources/phone/element/float.json @@ -66,35 +66,19 @@ }, { "name": "dialog_title_height", - "value": "60vp" - }, - { - "name": "dialog_title_font", - "value": "20fp" + "value": "56vp" }, { "name": "dialog_title_margin_l", "value": "50" }, - { - "name": "dialog_button_font", - "value": "20fp" - }, - { - "name": "timeDialog_height", - "value": "310vp" - }, { "name": "timeDialog_datePicker_height", "value": "200vp" }, { - "name": "repeatDialog_cont_font", - "value": "16fp" - }, - { - "name": "repeatDialog_height", - "value": "320vp" + "name": "repeatDialog_padding", + "value": "12vp" }, { "name": "border_width", @@ -182,7 +166,7 @@ }, { "name": "toggle_check_width", - "value": "25" + "value": "24vp" }, { "name": "divider_stroke_width", @@ -202,7 +186,7 @@ }, { "name": "divider_height", - "value": "20" + "value": "20vp" }, { "name": "itemComp_height", diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index 8c204076..5c535a54 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -16,13 +16,14 @@ import Log from '../../../../../../../common/src/main/ets/default/Log'; import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; import ConfigData from '../common/constants'; -import Router from '@system.router' +import deviceInfo from '@ohos.deviceInfo'; import { concatTime } from '../../../../../../../common/src/main/ets/default/timemanager'; import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemcomponent'; import {DoNotDisturbType} from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/nodisturbingmodel'; import ViewModel from '../vm/nodisturbviewmodel' +const deviceTypeInfo = deviceInfo.deviceType const TAG = 'NotificationManagement-NoDisturb'; const GROUP_REPEAT_MODE = 'repeatMode' @@ -46,8 +47,11 @@ export default struct NoDisturb { title: $r('app.string.startDate'), defaultDate: this.mViewModel.defaultStartTime }), + autoCancel: false, cancel: ()=>this.mViewModel.onCancel(), - autoCancel: false + alignment: deviceTypeInfo === "phone" ? DialogAlignment.Bottom : DialogAlignment.Center, + offset: ({ dx: 0, dy: deviceTypeInfo === "phone" ? '-16dp' : 0 }), + customStyle: true }); startTimeDialogController: CustomDialogController = new CustomDialogController({ builder: TimeDialog({ @@ -55,8 +59,11 @@ export default struct NoDisturb { title: $r('app.string.startTime'), defaultDate: this.mViewModel.defaultStartTime }), + autoCancel: false, cancel: ()=>this.mViewModel.onCancel(), - autoCancel: false + alignment: deviceTypeInfo === "phone" ? DialogAlignment.Bottom : DialogAlignment.Center, + offset: ({ dx: 0, dy: deviceTypeInfo === "phone" ? '-16dp' : 0 }), + customStyle: true }); endDateDialogController: CustomDialogController = new CustomDialogController({ builder: DateDialog({ @@ -64,8 +71,11 @@ export default struct NoDisturb { title: $r('app.string.endDate'), defaultDate: this.mViewModel.defaultEndTime }), + autoCancel: false, cancel: ()=>this.mViewModel.onCancel(), - autoCancel: false + alignment: deviceTypeInfo === "phone" ? DialogAlignment.Bottom : DialogAlignment.Center, + offset: ({ dx: 0, dy: deviceTypeInfo === "phone" ? '-16dp' : 0 }), + customStyle: true }); endTimeDialogController: CustomDialogController = new CustomDialogController({ builder: TimeDialog({ @@ -73,17 +83,23 @@ export default struct NoDisturb { title: $r('app.string.endTime'), defaultDate: this.mViewModel.defaultEndTime }), + autoCancel: false, cancel: ()=>this.mViewModel.onCancel(), - autoCancel: false + alignment: deviceTypeInfo === "phone" ? DialogAlignment.Bottom : DialogAlignment.Center, + offset: ({ dx: 0, dy: deviceTypeInfo === "phone" ? '-16dp' : 0 }), + customStyle: true }); repeatDialogController: CustomDialogController = new CustomDialogController({ builder: RepeatModeDialog({ - action:(data)=> this.setRepeatMode(data), + action: (data) => this.setRepeatMode(data), title: $r('app.string.repeat'), selectMode: this.mViewModel.repeatMode }), - cancel: ()=>this.mViewModel.onCancel(), - autoCancel: false + autoCancel: false, + cancel: () => this.mViewModel.onCancel(), + alignment: deviceTypeInfo === "phone" ? DialogAlignment.Bottom : DialogAlignment.Center, + offset: ({ dx: 0, dy: 0 }), + customStyle: true }); build() { @@ -287,57 +303,66 @@ struct DateDialog { build() { Column() { Column() { - Text(this.title) - .height($r('app.float.dialog_title_height')) - .width(ConfigData.WH_100_100) - .textAlign(TextAlign.Center) - .fontSize($r('app.float.dialog_title_font')) - .fontWeight(FontWeight.Medium) - DatePicker({ start: this.minDate, end: this.maxDate, selected: this.defaultDate }) - .onChange((date: DatePickerResult) => { - let dateSource = new Date(date.year, date.month, date.day); - this.selectedDate = NoDisturbingModel.formatDate(dateSource); - }) - .width(ConfigData.WH_100_100) - .height($r('app.float.timeDialog_datePicker_height')) - } - - Row() { Column() { - Text($r('app.string.cancel')) - .fontSize($r('app.float.dialog_button_font')) - .fontColor(Color.Blue) + Text(this.title) + .height($r('app.float.dialog_title_height')) + .width(ConfigData.WH_100_100) + .textAlign(TextAlign.Center) + .fontSize($r("sys.float.ohos_id_text_size_headline8")) + .fontWeight(FontWeight.Medium) + DatePicker({ start: this.minDate, end: this.maxDate, selected: this.defaultDate }) + .onChange((date: DatePickerResult) => { + let dateSource = new Date(date.year, date.month, date.day); + this.selectedDate = NoDisturbingModel.formatDate(dateSource); + }) + .width(ConfigData.WH_100_100) + .height($r('app.float.timeDialog_datePicker_height')) + } - }.onClick(() => { - this.controller.close(); - }) - .alignItems(HorizontalAlign.Center) - .width(ConfigData.WH_50_100); - Divider() - .vertical(true) - .color($r('app.color.divider_color')) - .strokeWidth(1) - .height($r('app.float.divider_height')) - Column() { - Text($r('app.string.confirm')) - .fontSize($r('app.float.dialog_button_font')) - .fontColor(Color.Blue) + Row() { + Column() { + Text($r('app.string.cancel')) + .fontSize($r("sys.float.ohos_id_text_size_button1")) + .fontColor($r("app.color.font_color_007DFF")) + .fontWeight(FontWeight.Medium) - }.onClick(() => { - Log.showDebug(TAG, `confirm button of DateDialog on click`) - this.controller.close(); - if(this.selectedDate != '') { - this.action(this.selectedDate); - } - }) - .alignItems(HorizontalAlign.Center) - .width(ConfigData.WH_50_100) + }.onClick(() => { + this.controller.close(); + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100); + Divider() + .vertical(true) + .color($r('app.color.divider_color')) + .strokeWidth(1) + .height($r('app.float.divider_height')) + Column() { + Text($r('app.string.confirm')) + .fontSize($r("sys.float.ohos_id_text_size_button1")) + .fontColor($r("app.color.font_color_007DFF")) + .fontWeight(FontWeight.Medium) + }.onClick(() => { + Log.showDebug(TAG, `confirm button of DateDialog on click`) + this.controller.close(); + if(this.selectedDate != '') { + this.action(this.selectedDate); + } + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100) + } + .width(ConfigData.WH_100_100) + .margin({top: $r("app.float.noDisturb_margin_16"), bottom: $r("app.float.noDisturb_margin_16")}) } - .width(ConfigData.WH_100_100) - .margin({top: $r("app.float.noDisturb_margin_16"), bottom: $r("app.float.noDisturb_margin_16")}) + .padding({ + left: $r("app.float.repeatDialog_padding"), + right: $r("app.float.repeatDialog_padding") + }) + .alignItems(HorizontalAlign.Center) + .backgroundColor($r("sys.color.ohos_id_color_dialog_bg")) + .borderRadius($r("app.float.border_radius")) } - .height($r('app.float.timeDialog_height')) - .width(ConfigData.WH_100_100) + .width(deviceTypeInfo === "phone" ? ConfigData.WH_100_100 : $r("app.float.repeatDialog_width")) } } @@ -355,57 +380,65 @@ struct TimeDialog { build() { Column() { Column() { - Text(this.title) - .height($r('app.float.dialog_title_height')) - .width(ConfigData.WH_100_100) - .textAlign(TextAlign.Center) - .fontSize($r('app.float.dialog_title_font')) - .fontWeight(FontWeight.Medium) - TimePicker({ selected: this.defaultDate, }) - .useMilitaryTime(false) - .onChange((date: TimePickerResult) => { - this.selectedTime = concatTime(date.hour, date.minute); - }) - .width(ConfigData.WH_100_100) - .height($r('app.float.timeDialog_datePicker_height')) - } - - Row() { - Column() { - Text($r('app.string.cancel')) - .fontSize($r('app.float.dialog_button_font')) - .fontColor(Color.Blue) - - }.onClick(() => { - this.controller.close(); - }) - .alignItems(HorizontalAlign.Center) - .width(ConfigData.WH_50_100); - Divider() - .vertical(true) - .color($r('app.color.divider_color')) - .strokeWidth(1) - .height($r('app.float.divider_height')) Column() { - Text($r('app.string.confirm')) - .fontSize($r('app.float.dialog_button_font')) - .fontColor(Color.Blue) + Text(this.title) + .height($r('app.float.dialog_title_height')) + .width(ConfigData.WH_100_100) + .textAlign(TextAlign.Center) + .fontSize($r("sys.float.ohos_id_text_size_headline8")) + .fontWeight(FontWeight.Medium) + TimePicker({ selected: this.defaultDate, }) + .useMilitaryTime(false) + .onChange((date: TimePickerResult) => { + this.selectedTime = concatTime(date.hour, date.minute); + }) + .width(ConfigData.WH_100_100) + .height($r('app.float.timeDialog_datePicker_height')) + }.padding({ left: $r('sys.float.ohos_id_max_padding_start'), right: $r('sys.float.ohos_id_max_padding_end') }) - }.onClick(() => { - Log.showDebug(TAG, `confirm button of TimeDialog on click`) - this.controller.close(); - if(this.selectedTime != '') { - this.action(this.selectedTime); - } - }) - .alignItems(HorizontalAlign.Center) - .width(ConfigData.WH_50_100) + Row() { + Column() { + Text($r('app.string.cancel')) + .fontSize($r("sys.float.ohos_id_text_size_button1")) + .fontColor($r("app.color.font_color_007DFF")) + .fontWeight(FontWeight.Medium) + }.onClick(() => { + this.controller.close(); + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100); + Divider() + .vertical(true) + .color($r('app.color.divider_color')) + .strokeWidth(1) + .height($r('app.float.divider_height')) + Column() { + Text($r('app.string.confirm')) + .fontSize($r("sys.float.ohos_id_text_size_button1")) + .fontColor($r("app.color.font_color_007DFF")) + .fontWeight(FontWeight.Medium) + }.onClick(() => { + Log.showDebug(TAG, `confirm button of TimeDialog on click`) + this.controller.close(); + if(this.selectedTime != '') { + this.action(this.selectedTime); + } + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100) + } + .width(ConfigData.WH_100_100) + .margin({ top: $r("app.float.noDisturb_margin_16"), bottom: $r("app.float.noDisturb_margin_16") }) } - .width(ConfigData.WH_100_100) - .margin({top: $r("app.float.noDisturb_margin_16"), bottom: $r("app.float.noDisturb_margin_16")}) + .padding({ + left: $r("app.float.repeatDialog_padding"), + right: $r("app.float.repeatDialog_padding") + }) + .alignItems(HorizontalAlign.Center) + .backgroundColor($r("sys.color.ohos_id_color_dialog_bg")) + .borderRadius($r("app.float.border_radius")) } - .height($r('app.float.timeDialog_height')) - .width(ConfigData.WH_100_100) + .width(deviceTypeInfo === "phone" ? ConfigData.WH_100_100 : $r("app.float.repeatDialog_width")) } } @@ -423,129 +456,134 @@ struct RepeatModeDialog { build() { Column() { Column() { - Text(this.title) - .height($r('app.float.dialog_title_height')) - .width(ConfigData.WH_100_100) - .textAlign(TextAlign.Center) - .fontSize($r('app.float.dialog_title_font')) - .fontWeight(FontWeight.Medium) - Row() { - Text($r('app.string.noDisturb_none')) - .fontSize($r('app.float.repeatDialog_cont_font')) - .fontColor(Color.Black) - .width(ConfigData.WH_70_100) - .textAlign(TextAlign.Start) - .align(Alignment.Start) - Radio({ value: '' + DoNotDisturbType.TYPE_NONE, group: GROUP_REPEAT_MODE }) - .checked(this.selectMode == DoNotDisturbType.TYPE_NONE) - .align(Alignment.End) - .width($r('app.float.toggle_check_width')) - .height($r('app.float.toggle_check_width')) - .onClick(() => { - if (this.prevModeSetCnt == 0) { - this.itSelectedBefore = this.selectMode; - } - this.prevModeSetCnt++ - this.selectMode = DoNotDisturbType.TYPE_NONE; - }) - } - Row() { - Text($r('app.string.noDisturb_once')) - .fontSize($r('app.float.repeatDialog_cont_font')) - .fontColor(Color.Black) - .width(ConfigData.WH_70_100) - .textAlign(TextAlign.Start) - .align(Alignment.Start) - Radio({ value: '' + DoNotDisturbType.TYPE_ONCE, group: GROUP_REPEAT_MODE }) - .checked(this.selectMode == DoNotDisturbType.TYPE_ONCE) - .align(Alignment.End) - .width($r('app.float.toggle_check_width')) - .height($r('app.float.toggle_check_width')) - .onClick(() => { - if (this.prevModeSetCnt == 0) { - this.itSelectedBefore = this.selectMode; - } - this.prevModeSetCnt++ - this.selectMode = DoNotDisturbType.TYPE_ONCE; - }) - } - Row() { - Text($r('app.string.noDisturb_daily')) - .fontSize($r('app.float.repeatDialog_cont_font')) - .fontColor(Color.Black) - .width(ConfigData.WH_70_100) - .textAlign(TextAlign.Start) - .align(Alignment.Start) - Radio({ value: '' + DoNotDisturbType.TYPE_DAILY, group: GROUP_REPEAT_MODE }) - .checked(this.selectMode == DoNotDisturbType.TYPE_DAILY) - .align(Alignment.End) - .width($r('app.float.toggle_check_width')) - .height($r('app.float.toggle_check_width')) - .onClick(() => { - if (this.prevModeSetCnt == 0) { - this.itSelectedBefore = this.selectMode; - } - this.prevModeSetCnt++ - this.selectMode = DoNotDisturbType.TYPE_DAILY; - }) - } - Row() { - Text($r('app.string.noDisturb_clearly')) - .fontSize($r('app.float.repeatDialog_cont_font')) - .fontColor(Color.Black) - .width(ConfigData.WH_70_100) - .textAlign(TextAlign.Start) - .align(Alignment.Start) - Radio({ value: '' + DoNotDisturbType.TYPE_CLEARLY, group: GROUP_REPEAT_MODE }) - .checked(this.selectMode == DoNotDisturbType.TYPE_CLEARLY) - .align(Alignment.End) - .width($r('app.float.toggle_check_width')) - .height($r('app.float.toggle_check_width')) - .onClick(() => { - if (this.prevModeSetCnt == 0) { - this.itSelectedBefore = this.selectMode; - } - this.prevModeSetCnt++ - this.selectMode = DoNotDisturbType.TYPE_CLEARLY; - }) - } - } - - Row() { Column() { - Text($r('app.string.cancel')) - .fontSize($r('app.float.dialog_button_font')) - .fontColor($r("app.color.font_color_007DFF")) + Text(this.title) + .width(ConfigData.WH_100_100) + .height($r('app.float.dialog_title_height')) + .fontFamily("HarmonyHeiTi") + .textAlign(TextAlign.Center) + .fontSize($r("sys.float.ohos_id_text_size_headline8")) + .fontWeight(FontWeight.Medium) - }.onClick(() => { - this.controller.close(); - }) - .alignItems(HorizontalAlign.Center) - .width(ConfigData.WH_50_100); - Divider() - .vertical(true) - .color($r('app.color.divider_color')) - .strokeWidth(1) - .height($r('app.float.divider_height')) - Column() { - Text($r('app.string.confirm')) - .fontSize($r('app.float.dialog_button_font')) - .fontColor($r("app.color.font_color_007DFF")) + Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { + Text($r('app.string.noDisturb_none')) + .fontFamily("HarmonyHeiTi") + .fontSize($r("sys.float.ohos_id_text_size_body1")) + .fontWeight(FontWeight.Medium) + Radio({ value: '' + DoNotDisturbType.TYPE_NONE, group: GROUP_REPEAT_MODE }) + .checked(this.selectMode == DoNotDisturbType.TYPE_NONE) + .width($r('app.float.toggle_check_width')) + .height($r('app.float.toggle_check_width')) + } + .height($r("app.float.appitem_icon_height")) + .onClick(() => { + if (this.prevModeSetCnt == 0) { + this.itSelectedBefore = this.selectMode; + } + this.prevModeSetCnt++ + this.selectMode = DoNotDisturbType.TYPE_NONE; + }) - }.onClick(() => { - Log.showDebug(TAG, `confirm button of TimeDialog on click`) - this.controller.close(); - if (this.itSelectedBefore != -1 && this.itSelectedBefore != this.selectMode){ - this.action(this.selectMode); + Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { + Text($r('app.string.noDisturb_once')) + .fontFamily("HarmonyHeiTi") + .fontSize($r("sys.float.ohos_id_text_size_body1")) + .fontWeight(FontWeight.Medium) + Radio({ value: '' + DoNotDisturbType.TYPE_ONCE, group: GROUP_REPEAT_MODE }) + .checked(this.selectMode == DoNotDisturbType.TYPE_ONCE) + .width($r('app.float.toggle_check_width')) + .height($r('app.float.toggle_check_width')) } - }) - .alignItems(HorizontalAlign.Center) - .width(ConfigData.WH_50_100) + .height($r("app.float.appitem_icon_height")) + .onClick(() => { + if (this.prevModeSetCnt == 0) { + this.itSelectedBefore = this.selectMode; + } + this.prevModeSetCnt++ + this.selectMode = DoNotDisturbType.TYPE_ONCE; + }) + + Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { + Text($r('app.string.noDisturb_daily')) + .fontFamily("HarmonyHeiTi") + .fontSize($r("sys.float.ohos_id_text_size_body1")) + .fontWeight(FontWeight.Medium) + Radio({ value: '' + DoNotDisturbType.TYPE_DAILY, group: GROUP_REPEAT_MODE }) + .checked(this.selectMode == DoNotDisturbType.TYPE_DAILY) + .width($r('app.float.toggle_check_width')) + .height($r('app.float.toggle_check_width')) + } + .height($r("app.float.appitem_icon_height")) + .onClick(() => { + if (this.prevModeSetCnt == 0) { + this.itSelectedBefore = this.selectMode; + } + this.prevModeSetCnt++ + this.selectMode = DoNotDisturbType.TYPE_DAILY; + }) + + Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { + Text($r('app.string.noDisturb_clearly')) + .fontFamily("HarmonyHeiTi") + .fontSize($r("sys.float.ohos_id_text_size_body1")) + .fontWeight(FontWeight.Medium) + Radio({ value: '' + DoNotDisturbType.TYPE_CLEARLY, group: GROUP_REPEAT_MODE }) + .checked(this.selectMode == DoNotDisturbType.TYPE_CLEARLY) + .width($r('app.float.toggle_check_width')) + .height($r('app.float.toggle_check_width')) + } + .height($r("app.float.appitem_icon_height")) + .onClick(() => { + if (this.prevModeSetCnt == 0) { + this.itSelectedBefore = this.selectMode; + } + this.prevModeSetCnt++ + this.selectMode = DoNotDisturbType.TYPE_CLEARLY; + }) + } + + Row() { + Column() { + Text($r('app.string.cancel')) + .fontSize($r("sys.float.ohos_id_text_size_button1")) + .fontColor($r("sys.color.ohos_id_color_text_primary_activated")) + .fontWeight(FontWeight.Medium) + }.onClick(() => { + this.controller.close(); + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100); + Divider() + .vertical(true) + .color($r('app.color.divider_color')) + .strokeWidth(1) + .height($r('app.float.divider_height')) + Column() { + Text($r('app.string.confirm')) + .fontSize($r("sys.float.ohos_id_text_size_button1")) + .fontColor($r("sys.color.ohos_id_color_text_primary_activated")) + .fontWeight(FontWeight.Medium) + }.onClick(() => { + Log.showDebug(TAG, `confirm button of TimeDialog on click`) + this.controller.close(); + if (this.itSelectedBefore != -1 && this.itSelectedBefore != this.selectMode) { + this.action(this.selectMode); + } + }) + .alignItems(HorizontalAlign.Center) + .width(ConfigData.WH_50_100) + } + .width(ConfigData.WH_100_100) + .margin({ top: $r("app.float.noDisturb_margin_16"), bottom: $r("app.float.noDisturb_margin_16") }) } - .width(ConfigData.WH_100_100) - .margin({top: $r("app.float.noDisturb_margin_16"), bottom: $r("app.float.noDisturb_margin_16")}) + .padding({ + left: $r("app.float.repeatDialog_padding"), + right: $r("app.float.repeatDialog_padding") + }) + .alignItems(HorizontalAlign.Center) + .backgroundColor($r("sys.color.ohos_id_color_dialog_bg")) + .borderRadius($r("app.float.border_radius")) } - .height($r('app.float.repeatDialog_height')) - .width(ConfigData.WH_100_100) + .width(deviceTypeInfo === "phone" ? ConfigData.WH_100_100 : $r("app.float.repeatDialog_width")) } } diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index 7183ba51..2b4bfba2 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -67,11 +67,11 @@ const HIDE_ANIM_CONFIG = { @Entry @Component struct Index { - @State showComponentName: string = undefined - @State componentOptAreaHeightPX: number = 0 - @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + @State showComponentName: string = undefined; + @State componentOptAreaHeightPX: number = 0; + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0; mCallback: any; - mClearCallbacks: unsubscribe[] + mClearCallbacks: unsubscribe[]; settingDataKey = 'settings.display.navigationbar_status'; urivar: string = null; helper: any = null; @@ -79,12 +79,12 @@ struct Index { navigationBarWidth: number = 0; mNeedUpdate: boolean = false; mWidthPx: number = 0; - @State mNotificationInsert: any = {} - @State mNotificationDelete: any = {} - @State mControlCenterInsert: any = {} - @State mControlCenterDelete: any = {} - @State componentOptAreaTranslateY: string = '0px' - @State backgroundOpacity: number = 0 + @State mNotificationInsert: any = {}; + @State mNotificationDelete: any = {}; + @State mControlCenterInsert: any = {}; + @State mControlCenterDelete: any = {}; + @State componentOptAreaTranslateY: string = '0px'; + @State backgroundOpacity: number = 0; onBackPress(): boolean { return true -- Gitee From 41fa9e8309eb79bb7258a234d5779e40d33e3dce Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 23 Aug 2022 16:21:46 +0800 Subject: [PATCH 245/373] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../com/ohos/noticeItem/model/NotificationManager.ts | 5 +++-- .../com/ohos/noticeItem/model/NotificationService.ts | 4 ++-- .../ohos/noticeItem/viewmodel/NotificationViewModel.ts | 10 +++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index 54dd02d2..b6c3afc7 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -50,9 +50,10 @@ export default class NotificationManager { Notification.removeAll(callback); } - static remove(tag: string, hashCode, callback): void { + static remove(tag: string, hashCode,callback, isClickItem?: boolean): void { Log.showInfo(TAG, `remove from: ${tag}`); - Notification.remove(hashCode, callback); + var clickValue = isClickItem == true ? Notification.RemoveReason.CLICK_REASON_REMOVE : Notification.RemoveReason.CANCEL_REASON_REMOVE; + Notification.remove(hashCode, clickValue, callback); } static getAllActiveNotifications(tag: string, callback): void { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index c0ab244b..52ff09a7 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -59,10 +59,10 @@ export class NotificationService { }); } - remove(code: string): void { + remove(code: string, isClickItem?: boolean): void { NotificationManager.remove(TAG, code, (data) => { Log.showInfo(TAG, `removeNotificationItem ==> data: ${JSON.stringify(data)}`); - }); + }, isClickItem); } loadAllNotifications(): void { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts index 0ae3ecba..c6cccda8 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts @@ -208,7 +208,7 @@ export class NotificationViewModel { this.updateNotification(); } - removeNotificationItem(itemData: NotificationItemData, isDelSysConent: boolean): void { + removeNotificationItem(itemData: NotificationItemData, isDelSysConent: boolean, isClickItem?: boolean): void { Log.showInfo(TAG, `removeNotificationItem, hashcode: ${itemData.hashcode}`); for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].hashcode == itemData.hashcode) { @@ -221,7 +221,7 @@ export class NotificationViewModel { } this.updateNotification(); if (isDelSysConent) { - this.removeSysNotificationItem(itemData.hashcode); + this.removeSysNotificationItem(itemData.hashcode, isClickItem); } AppStorage.Delete(Constants.KEY_INPUT + itemData.id); } @@ -247,8 +247,8 @@ export class NotificationViewModel { this.updateNotification(); } - removeSysNotificationItem(hashcode: string): void { - NotificationService.remove(hashcode); + removeSysNotificationItem(hashcode: string, isClickItem?: boolean): void { + NotificationService.remove(hashcode, isClickItem); } clickItem(itemData: NotificationItemData, want?: any): void { @@ -256,7 +256,7 @@ export class NotificationViewModel { NotificationWindowManager.hideNotificationWindow(); CommonUtil.startWant((want) ? want : itemData.want); if (itemData.tapDismissed) { - this.removeNotificationItem(itemData, true); + this.removeNotificationItem(itemData, true, true); } } -- Gitee From f8f84934980d9a9caadc4326424cdb92726488b4 Mon Sep 17 00:00:00 2001 From: zhangyimin Date: Fri, 26 Aug 2022 11:10:04 +0800 Subject: [PATCH 246/373] =?UTF-8?q?[ScreenLock]=E8=A7=A3=E5=86=B3=E5=A4=9A?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=88=87=E6=8D=A2=E7=95=8C=E9=9D=A2=E4=B8=8D?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangyimin --- .../main/ets/com/ohos/model/accountsModel.ts | 32 ++++++++---------- .../ets/com/ohos/view/component/accounts.ets | 28 +++++++++------ signature/{screenlock.p7b => systemui.p7b} | Bin 3640 -> 3922 bytes 3 files changed, 32 insertions(+), 28 deletions(-) rename signature/{screenlock.p7b => systemui.p7b} (47%) diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index de5125c1..1353cda3 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -18,17 +18,21 @@ import osAccount from '@ohos.account.osAccount' import commonEvent from '@ohos.commonEvent'; import util from '@ohos.util'; import {Callback} from 'basic'; -import Trace from '../../../../../../../../common/src/main/ets/default/Trace' -import {SysFaultLogger, FaultID} from '../../../../../../../../common/src/main/ets/default/SysFaultLogger' -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Trace from '../../../../../../../../common/src/main/ets/default/Trace'; +import {SysFaultLogger, FaultID} from '../../../../../../../../common/src/main/ets/default/SysFaultLogger'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; import { CommonEventManager, getCommonEventManager } from "../../../../../../../../common/src/main/ets/default/commonEvent/CommonEventManager"; -import {UserData} from '../data/userData' +import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager"; +import { obtainLocalEvent } from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import {UserData} from '../data/userData'; const TAG = "ScreenLock-AccountsModel" const TYPE_ADMIN = 0; const TYPE_NORMAL = 1; const TYPE_GUEST = 2; +export const ACCOUNTS_REFRESH_EVENT = "Accounts_Refresh_Event"; + export enum AuthType { //Authentication type pin. PIN = 1, @@ -131,26 +135,18 @@ export default class AccountsModel { @SysFaultLogger({FAULT_ID: FaultID.ACCOUNT_SYSTEM, MSG: "call func off failed"}) eventCancelListener(typeName: "activate" | "activating", name: string) { Log.showInfo(TAG, `eventCancleListener:typeName ${typeName}`); - osAccount.getAccountManager().off(typeName, name) + osAccount.getAccountManager().off(typeName, name); } updateAllUsers() { - this.clearAllUsers() - // add later to avoid list not refresh - setTimeout(() => { - this.addAllUsers() - }, 100); - } - - private clearAllUsers() { - AppStorage.SetOrCreate('userList', []); + this.addAllUsers(); } @SysFaultLogger({FAULT_ID: FaultID.ACCOUNT_SYSTEM, MSG: "call func queryAllCreatedOsAccounts failed"}) private addAllUsers() { Log.showDebug(TAG, "start getAllUsers"); osAccount.getAccountManager().queryAllCreatedOsAccounts().then((list) => { - Log.showDebug(TAG, "start sort") + Log.showDebug(TAG, "start sort"); let accountList = []; let accountMap = new Map(); list.sort(this.sortAccount.bind(this)); @@ -167,11 +163,11 @@ export default class AccountsModel { accountList.push(userData) accountMap.set(user.localId, userData) osAccount.getAccountManager().getOsAccountProfilePhoto(user.localId).then((path) => { - Log.showDebug(TAG, "start get photo:" + path) - accountMap.get(user.localId).userIconPath = path + Log.showDebug(TAG, "start get photo:" + path); + accountMap.get(user.localId).userIconPath = path; }) } - AppStorage.SetOrCreate('userList', accountList); + EventManager.publish(obtainLocalEvent(ACCOUNTS_REFRESH_EVENT, accountList)); }) } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets index 8f2a7aa0..5c53ab13 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets @@ -13,24 +13,32 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log' -import ViewModel from '../../vm/accountsViewModel' -import Constants from '../../common/constants' -import {UserData} from '../../data/userData' +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import ViewModel from '../../vm/accountsViewModel'; +import Constants from '../../common/constants'; +import {UserData} from '../../data/userData'; +import { ACCOUNTS_REFRESH_EVENT } from '../../model/accountsModel' +import EventManager, { unsubscribe } from '../../../../../../../../../common/src/main/ets/default/event/EventManager'; const TAG = 'ScreenLock-Accounts' @Component export default struct Accounts { - @StorageLink("userList") accountList: UserData[] = [] - private mViewModel: ViewModel = new ViewModel() + @State accountList: UserData[] = []; + private mViewModel: ViewModel = new ViewModel(); + unSubscriber?: unsubscribe; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`); + this.unSubscriber = EventManager.subscribe(ACCOUNTS_REFRESH_EVENT, (data) => { + this.accountList = data; + }); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`); + this.unSubscriber && this.unSubscriber(); + this.unSubscriber = undefined; } build() { @@ -51,7 +59,7 @@ export default struct Accounts { @Component struct UserItem { - private userItem: any; + @State userItem: any = {}; private viewModel: ViewModel; build() { @@ -71,7 +79,7 @@ struct UserItem { .margin({ top: $r("app.float.accounts_block") }) } .onClick(event => { - this.viewModel.onUserClick(this.userItem.userId) + this.viewModel.onUserClick(this.userItem.userId); }) } } \ No newline at end of file diff --git a/signature/screenlock.p7b b/signature/systemui.p7b similarity index 47% rename from signature/screenlock.p7b rename to signature/systemui.p7b index 5c12ab6d37c56a46542a24539145897f9a54da86..0d2f710536bab1ba6f0518deecc0b18073a25382 100644 GIT binary patch delta 923 zcmZ8gT}TvB6mE8RM%NT6=)wM2FZ~(KI+L!hiPb)cYY)~#_RzA}-JQF7Yi90ce$+)o zSW2unSqMQYq1Wo6K>8sFtcMK=Dx{Z!z_)tnNi!d+JF_!e%sd^=`Of!!=iD<-_kTDz zBbAzmgy`|v^z6?jt}e7xYCgkKy&;a1o1~pW^vZ0SL*Yn>lS;yme?V@jBz%pOgwIn= z4KenCab%d7=%Nla1Wv_(9GBt}I1#AkiQ-gcKM%Vo6%}k+2F}@*({B~2+fU39tXpW* zfKIwbWZPI_1oQOhj86?!tYE9ivYr>$k4`KxhYG}S^%6au$*#o7MA8$kL14i`hU2I! z+0)tG!4Os2Y2Tsm$3QBACaM|9owapEMIzP>@w2)?FhawsUkg7};RI?*FXyW|;qTRHn-|UVZ5>r= zXOwI}g>6K`rgJ3$t@0}0qQx>nJj2@V;{bXMyVqdoP<7{b$D;-w$0`~{VjfbM!z#8g zV$>Osa=fP~9X8PgAJji-A>9!NOy{w%A@C`w#PyZ88z0Uj<%HBNNwR!dYOmdRG$MmY z?8c+vS8J=2E6eNCcgwe)ZB709l*ta(%`F;zFAf}@dmuFk_3ZC?*B1$gA_G!?sCCE2 z)#uBkeWGP)^G#)F`+D}}?jx6OZY^lH>tDC+*{-yQVnSv95cr+iJ6L(Ee)+zzYjN{V T^U(XvwQu+Fy^nv+t)Ko2hzkp+ delta 679 zcmY*XO=uHA80{vz8`Ic;icqPD9T16R<7`aQq@q>}H3y+L6^o6N-AP=t*;#frNn=|A zD+Z;fvVx+B6+8%DgedAosoIlRia!(&UW?$R{uB{GoQ-Y8%fR>My*KaszIn6b@%9FE z!U-|Brevc-J5`2H$9?-b&Mzm(do(V z1|T%288$9j$Y$%_#C)Q&W4Vk3*JGBN7x9aW>Y<=*DDwjOau{f#y4YBvfg z$H-YiV^py)Hguwtmk-hlXW_~krJCCkwz#i^{ccE%xEV1rbebvGE{V}LurN!kDK_)??`Fi~GLwoo z4`7zG_CzfM>7dmUSP?sqK!-cXRt-z;;Q)3U;lV~Co`7*VCBsv2@A|rfybSoA=F0Ll zVfM=Lfr(EizQ12yIy7;8__;n-)?+}-bzh9P}EEELTGX6>dj|Q=NaYxu@|FHE?gF^j=6Jpr#2UjJO0-ji({W7 MWAeS9zs=moKVISLXaE2J -- Gitee From 340bf1d2a2b78c36af1118114da3ac7dbda55ad1 Mon Sep 17 00:00:00 2001 From: yangpeng85 Date: Fri, 26 Aug 2022 15:50:23 +0800 Subject: [PATCH 247/373] support notify lockScreenResult event Signed-off-by: yangpeng85 --- .../ets/com/ohos/model/screenLockModel.ts | 8 ++++- .../ets/com/ohos/model/screenLockService.ts | 30 ++++++++++++++++--- .../src/main/ets/com/ohos/vm/baseViewModel.ts | 2 +- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index 53d1a9da..e3d0a4c8 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -47,7 +47,13 @@ export default class ScreenLockModel { data:${JSON.stringify(data)}`); callback(); }) - break; + break; + case "lockScreen": + ScreenLockMar.on(typeName, () => { + Log.showInfo(TAG, `eventListener:callback`); + callback(); + }) + break; default: Log.showError(TAG, `eventListener:typeName ${typeName}`) } diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 0a9be437..6f925dc4 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -39,6 +39,7 @@ const EVENT_END_SCREEN_ON: string = 'endScreenOn' const EVENT_BEGIN_SCREENOFF: string = 'beginScreenOff' const EVENT_END_SCREENOFF: string = 'endScreenOff' const EVENT_UNLOCK_SCREEN: string = 'unlockScreen' +const EVENT_LOCK_SCREEN: string = 'lockScreen' const EVENT_BEGIN_EXITANIMATION: string = 'beginExitAnimation' const EVENT_BEGIN_SLEEP: string = 'beginSleep' const EVENT_END_SLEEP: string = 'endSleep' @@ -46,6 +47,7 @@ const EVENT_CHANGE_USER: string = 'changeUser' const EVENT_SCREENLOCK_ENABLE: string = 'screenlockEnabled' const EVENT_SYSTEM_READY: string = 'systemReady' +const LOCK_SCREEN_RESULT: string = 'lockScreenResult' const UNLOCK_SCREEN_RESULT: string = 'unlockScreenResult' const SCREENLOCK_DRAW_DONE: string = 'screenDrawDone' @@ -69,6 +71,12 @@ export enum UnlockResult { Cancel = 2 } +export enum LockResult { + Success = 0, + Fail = 1, + Cancel = 2 +} + let mRouterPath: string = "" let mWillRecognizeFace: boolean = false @@ -144,6 +152,12 @@ export class ScreenLockService { this.unlockScreen(); }); + //lock request was received + this.screenLockModel.eventListener(EVENT_LOCK_SCREEN, () => { + Log.showInfo(TAG, `EVENT_LOCK_SCREEN event`); + this.lockScreen(); + }); + Log.showDebug(TAG, 'registered events end'); } @@ -165,6 +179,7 @@ export class ScreenLockService { if (this.currentLockStatus == ScreenLockStatus.Locking) { Log.showInfo(TAG, `had locked, no need to publish lock_screen`); } else { + this.notifyLockScreenResult(LockResult.Success) this.publishByUser("common.event.LOCK_SCREEN", this.accountModel.getCurrentUserId()); this.currentLockStatus = ScreenLockStatus.Locking; } @@ -249,15 +264,22 @@ export class ScreenLockService { this.screenLockModel.hiddenScreenLockWindow(() => { Log.showInfo(TAG, `hiddenScreenLockWindow finish`); //notify the base service that the unlock is completed - this.notifyScreenResult(UnlockResult.Success); + this.notifyUnlockScreenResult(UnlockResult.Success); this.publishByUser("common.event.UNLOCK_SCREEN", this.accountModel.getCurrentUserId()); }); } - notifyScreenResult(result: UnlockResult) { - Log.showInfo(TAG, `notifyScreenResult`); + notifyUnlockScreenResult(result: UnlockResult) { + Log.showInfo(TAG, `notifyUnlockScreenResult`); this.screenLockModel.sendScreenLockEvent(UNLOCK_SCREEN_RESULT, result, (error, data) => { - Log.showInfo(TAG, `notifyScreenResult: error:${JSON.stringify(error)} data:${JSON.stringify(data)}`); + Log.showInfo(TAG, `notifyUnlockScreenResult: error:${JSON.stringify(error)} data:${JSON.stringify(data)}`); + }); + } + + notifyLockScreenResult(result: LockResult) { + Log.showInfo(TAG, `notifyLockScreenResult`); + this.screenLockModel.sendScreenLockEvent(LOCK_SCREEN_RESULT, result, (error, data) => { + Log.showInfo(TAG, `notifyLockScreenResult: error:${JSON.stringify(error)} data:${JSON.stringify(data)}`); }); } diff --git a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts index 46842f72..49545d20 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts @@ -79,7 +79,7 @@ export default class BaseViewModel { this.prompt = promptText; this.updateStorage(callback) //notify the base service that the unlock is fail - service.notifyScreenResult(UnlockResult.Fail); + service.notifyUnlockScreenResult(UnlockResult.Fail); } getFreezingTimeNm(freezingMillisecond: number): string { -- Gitee From d1f30d250c35f3d5d77df93fd341dbc099c61da4 Mon Sep 17 00:00:00 2001 From: zhangyimin Date: Sat, 27 Aug 2022 09:39:00 +0800 Subject: [PATCH 248/373] =?UTF-8?q?[ScreenLock]=E8=A7=A3=E5=86=B3=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=AF=86=E7=A0=81=E8=BE=93=E5=85=A5=E4=B8=80?= =?UTF-8?q?=E4=BD=8D=E4=B8=8D=E8=83=BD=E7=A1=AE=E8=AE=A4=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangyimin --- .../src/main/ets/com/ohos/view/component/customPSD.ets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index 8c8a5b53..8ebfb7ae 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -88,8 +88,8 @@ export default struct CustomPSD { }) .width($r('app.float.custompsd_input_width')) .height($r("app.float.custompsd_button_height")) - .enabled(this.passwordArr.length > 1) - .opacity(deviceInfo.deviceType === 'tablet' ? 1 : (this.passwordArr.length > 1 ? 1 : 0.4)) + .enabled(this.passwordArr.length >= 1) + .opacity(deviceInfo.deviceType === 'tablet' ? 1 : (this.passwordArr.length >= 1 ? 1 : 0.4)) .onClick(() => { Log.showInfo(TAG, `onClick`) this.mViewModel.onAuthPassword(() => { -- Gitee From fb14fe5015f6dc9a9c9c56aa37dca5d7fa565304 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 27 Aug 2022 10:04:28 +0800 Subject: [PATCH 249/373] =?UTF-8?q?SystemUI=E5=BA=94=E7=94=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0TRACE=E5=92=8C=E6=95=85=E9=9A=9C=E6=89=93=E7=82=B9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- build-profile.json5 | 14 +++++ common/src/main/ets/default/SysFaultLogger.ts | 56 +++++++++++++++++++ common/src/main/ets/default/Trace.ts | 5 +- .../main/ets/default/event/EventManager.ts | 19 ++++++- .../ets/com/ohos/model/AutoRotateService.ts | 1 + .../ets/default/viewmodel/CapsuleViewModel.ts | 4 ++ .../com/ohos/pages/SimpleToggleComponent.ets | 6 +- .../com/ohos/noticeItem/common/CommonUtil.ts | 2 + .../noticeItem/model/NotificationService.ts | 7 ++- .../viewmodel/NotificationViewModel.ts | 2 + .../com/ohos/common/VolumeWindowController.ts | 7 +++ .../ets/workers/PluginDataSourceWorker.js | 5 +- .../statusbar/src/main/ets/pages/index.ets | 2 +- 13 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 common/src/main/ets/default/SysFaultLogger.ts diff --git a/build-profile.json5 b/build-profile.json5 index c64def10..463b7a29 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -7,6 +7,20 @@ "name": "default", "signingConfig": "release" } + ], + "signingConfigs": [ + { + "name": "release", + "material": { + "certpath": "C:/Users/l30020847/AppData/Local/OpenHarmony/OpenHarmonyApplication.cer", + "storePassword": "00000016A910492840C49C5DD81DF554C2C5CA27175637D18559733DEA85C9589C409EA2A1EA", + "keyAlias": "OpenHarmony Application Release", + "keyPassword": "00000016697ADFF60E8918B63C523DCF3775AD0BC721C23255CAC96A8993E60B8F556B293FAD", + "profile": "C:/Users/l30020847/AppData/Local/OpenHarmony/systemui.p7b", + "signAlg": "SHA256withECDSA", + "storeFile": "C:/Users/l30020847/AppData/Local/OpenHarmony/OpenHarmony.p12" + } + } ] }, "modules": [ diff --git a/common/src/main/ets/default/SysFaultLogger.ts b/common/src/main/ets/default/SysFaultLogger.ts new file mode 100644 index 00000000..7f663317 --- /dev/null +++ b/common/src/main/ets/default/SysFaultLogger.ts @@ -0,0 +1,56 @@ +// @ts-nocheck +/* + * Copyright (c) 2022 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 Log from "./Log"; +import hiSysEvent from '@ohos.hiSysEvent' + +const TAG = 'SystemFaultLogger'; +const APP_DOMAIN: string = "CoreApp"; +const APP_LOG_NAME: string = "ScreenLockFault"; + +export enum FaultID { + META_DIAGRAM_JUMP = "META_DIAGRAM_JUMP", + WORKER_ERROR = "WORKER_ABNORMAL_OCCURRENCE", + NOTIFICATION_ADD = "FAILED_NOTIFICATION_ADD" +} + +export function WriteFaultLog(logParam: object) { + const sysEventInfo = { + domain: APP_DOMAIN, + name: APP_LOG_NAME, + eventType: hiSysEvent.EventType.FAULT, + params: logParam + } + Log.showInfo(TAG, "fault log params is : " + JSON.stringify(sysEventInfo)) + hiSysEvent.write(sysEventInfo, (err, val) => { + Log.showInfo(TAG, "fault log params is : " + JSON.stringify(sysEventInfo)) + Log.showInfo(TAG, `write fault log result: ${val}`) + }) +} + +export function SysFaultLogger(logParam: object) { + return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + const originalFunc = descriptor.value; + descriptor.value = function(...args) { + try { + originalFunc.apply(this, args); + } catch (err: any) { + Log.showInfo(TAG, "catch error in execute: " + propertyKey); + WriteFaultLog(logParam); + } + }; + }; +} \ No newline at end of file diff --git a/common/src/main/ets/default/Trace.ts b/common/src/main/ets/default/Trace.ts index 17c7596a..c62d797f 100644 --- a/common/src/main/ets/default/Trace.ts +++ b/common/src/main/ets/default/Trace.ts @@ -20,8 +20,11 @@ import Log from './Log'; * Add method trace. Modify RECORD_TRACE before using. */ export default class Trace { - static readonly CORE_METHOD_START_DROPDOWNPANEL = 'startDropdownpanel'; + static readonly CORE_METHOD_START_DROPDOWNPANEL = 'startDropdownPanel'; static readonly CORE_METHOD_START_TOUCHEVENT = 'startTouchEvent'; + static readonly CORE_METHOD_CLICK_CAPSULE = 'clickCapsuleEvent'; + static readonly CORE_METHOD_CLICK_NOTIFICATION = 'clickNotificationEvent'; + static readonly CORE_METHOD_START_VOLUMEPANEL = 'startVolumePanel'; private static readonly TRACE_TAG = 'Systemui:Trace'; private static readonly RECORD_TRACE = true; diff --git a/common/src/main/ets/default/event/EventManager.ts b/common/src/main/ets/default/event/EventManager.ts index 656ed282..a7c2da06 100644 --- a/common/src/main/ets/default/event/EventManager.ts +++ b/common/src/main/ets/default/event/EventManager.ts @@ -18,6 +18,9 @@ import Log from "../Log"; import createOrGet from "../SingleInstanceHelper"; import { EventParser, START_ABILITY_EVENT, Event, LocalEvent } from "./EventUtil"; import { Callback, createEventBus, EventBus } from "./EventBus"; +import { BusinessError } from 'basic'; +import {PluginType} from "../../plugindatasource/common/Constants"; +import {WriteFaultLog, FaultID} from '../SysFaultLogger'; export type unsubscribe = () => void; export type Events = string | string[]; @@ -43,8 +46,9 @@ class EventManager { this.mContext = ctx; } - publish(event: Event): boolean { - return this.eventParser[event.target].call(this, event.data); + publish(event: Event, pluginType?: PluginType): boolean { + Log.showInfo(TAG, `PUBLISH : event: ${JSON.stringify(event)}`) + return this.eventParser[event.target].call(this, event.data, pluginType); } subscribe(eventType: Events, callback: Callback): unsubscribe { @@ -64,7 +68,8 @@ class EventManager { return false; } - private startAbility(data: { [key: string]: any }): boolean { + private startAbility(data: { [key: string]: any }, pluginType?: PluginType): boolean { + Log.showInfo(TAG, `start : data: ${JSON.stringify(data)}`) Log.showDebug(TAG, `start Ability: ${data.abilityName}`); if (data.bundleName && data.abilityName && this.mContext) { this.mEventBus.emit(START_ABILITY_EVENT, { abilityName: data.abilityName }); @@ -72,6 +77,14 @@ class EventManager { bundleName: data.bundleName, abilityName: data.abilityName, parameters: data.args??undefined + }).then(() => { + Log.showInfo(TAG, 'startAbility, then'); + WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "onclick", FAULT_ID: FaultID.META_DIAGRAM_JUMP, MSG: "jump ability failure"}) + }).catch((error: BusinessError) => { + Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); + if (pluginType == PluginType.META) { + WriteFaultLog({TARGET_API:data.bundleName, FAULT_ID: FaultID.META_DIAGRAM_JUMP, MSG: "jump ability failure"}) + } }); return true; } diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts index dbd0230b..ea91b67c 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts index cc0f3026..1ee68b31 100644 --- a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts +++ b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts @@ -17,6 +17,7 @@ import CapsuleModel from '../model/CapsuleModel'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil'; +import Trace from '../../../../../../../common/src/main/ets/default/Trace' let sCapsuleViewModel; @@ -121,6 +122,7 @@ export default class CapsuleViewModel { } onClickEvent() { + Trace.start(Trace.CORE_METHOD_CLICK_CAPSULE); if (this.mIsBackground) { this.mIsBackground = false; } @@ -129,6 +131,8 @@ export default class CapsuleViewModel { AbilityManager.startAbility({ bundleName: this.mWantBundleName, abilityName: this.mWantAbilityName + }, () => { + Trace.end(Trace.CORE_METHOD_CLICK_CAPSULE); }); } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index 922b77c6..ccb1f3d3 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -81,7 +81,11 @@ export default struct SimpleToggleComponent { onIconItemClick() { Log.showDebug(TAG, `onIconItemClick`); if (this.mItemData.get()?.actionData?.clickAction) { - EventManager.publish(this.mItemData.get().actionData.clickAction); + if (this.mItemData.get().pluginType == PluginType.META) { + EventManager.publish(this.mItemData.get().actionData.clickAction, this.mItemData.get().pluginType); + } else { + EventManager.publish(this.mItemData.get().actionData.clickAction); + } }; } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts index 84e89d17..4f2eb2c6 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -14,6 +14,7 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import Trace from '../../../../../../../../../common/src/main/ets/default/Trace' import WantAgent from '@ohos.wantAgent'; const TAG = 'CommonUtil'; @@ -29,6 +30,7 @@ export default class CommonUtil { let info = (triggerInfo) ? triggerInfo : DEFAULT_INFO; Log.showDebug(TAG, `startWant ${JSON.stringify(want)}, info ${JSON.stringify(info)}`); WantAgent.trigger(want, info, ((data) => { + Trace.end(Trace.CORE_METHOD_CLICK_NOTIFICATION); Log.showInfo(TAG, `wantAgent trigger data ${JSON.stringify(data)}`); })); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index 52ff09a7..f05ee0f4 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -21,6 +21,7 @@ import CommonUtil from '../common/CommonUtil'; import createOrGet from '../../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; import DistributionManager from './NotificationDistributionManager'; import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import {WriteFaultLog, FaultID} from '../../../../../../../../../common/src/main/ets/default/SysFaultLogger'; const TAG = 'NotificationService'; @@ -104,7 +105,11 @@ export class NotificationService { } }); }); - }).catch(errorInfo => Log.showError(TAG, `error: ${JSON.stringify(errorInfo)}`)); + }).catch((errorInfo) => { + WriteFaultLog({CORE_SYSTEM: request.creatorBundleName, TARGET_API: "add", FAULT_ID: FaultID.META_DIAGRAM_JUMP + , MSG: "Failed to handle notification addition"}) + Log.showError(TAG, `error: ${JSON.stringify(errorInfo)}`) + }); } handleNotificationCancel(data): void { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts index c6cccda8..a84d3e9b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts @@ -26,6 +26,7 @@ import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/defa import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import EventManager from '../../../../../../../../../common/src/main/ets/default/event/EventManager'; import {obtainLocalEvent} from '../../../../../../../../../common/src/main/ets/default/event/EventUtil'; +import Trace from '../../../../../../../../../common/src/main/ets/default/Trace' import CommonUtil from '../common/CommonUtil'; import Constants,{NotificationItemData} from '../common/constants'; @@ -254,6 +255,7 @@ export class NotificationViewModel { clickItem(itemData: NotificationItemData, want?: any): void { Log.showInfo(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}, tapDismissed: ${itemData.tapDismissed}`); NotificationWindowManager.hideNotificationWindow(); + Trace.start(Trace.CORE_METHOD_CLICK_NOTIFICATION); CommonUtil.startWant((want) ? want : itemData.want); if (itemData.tapDismissed) { this.removeNotificationItem(itemData, true, true); diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts index 4e7ddc06..ba285cb4 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts @@ -15,6 +15,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import getSingleInstance from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import Trace from '../../../../../../../../common/src/main/ets/default/Trace' import VolumePanelService from '../model/VolumePanelService'; import { VolumeInfo } from '../common/Constants'; @@ -64,6 +65,9 @@ export default class VolumeWindowController { setWindowState(isShow: boolean): void { Log.showInfo(TAG, `setWindowState ${isShow}.`); + if (isShow) { + Trace.start(Trace.CORE_METHOD_START_VOLUMEPANEL); + } if (this.mIsWindowShown == isShow) { Log.showInfo(TAG, `Neen't set volueme window state.`); return; @@ -72,6 +76,9 @@ export default class VolumeWindowController { this.mIsWindowShown = isShow; (isShow ? this.mWindowHandle.show() : this.mWindowHandle.hide()) .then(() => { + if (isShow) { + Trace.end(Trace.CORE_METHOD_START_VOLUMEPANEL); + } Log.showInfo(TAG, `updateShowStatus ${isShow}.`); }) .catch((err) => Log.showError(TAG, `Can't set volueme window: ${JSON.stringify(err)}.`)); diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index 9cb540a3..1fb39066 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -17,6 +17,7 @@ import worker from '@ohos.worker'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; +import {WriteFaultLog, FaultID} from '../../../../../../../common/src/main/ets/default/SysFaultLogger'; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; @@ -90,8 +91,8 @@ parentPort.onmessageerror = function () { }; parentPort.onerror = function (data) { + WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "systemui", FAULT_ID: FaultID.WORKER_ERROR, MSG: "Abnormal occurrence"}) Log.showError( - TAG, - `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index a1b2659c..fae2994d 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -119,7 +119,7 @@ struct Index { } touchEvent(event: TouchEvent) { - Trace.start(Trace.CORE_METHOD_START_TOUCHEVENT) + Trace.start(Trace.CORE_METHOD_START_TOUCHEVENT); Log.showDebug(TAG, 'touchEvent' + event.touches) if (event.type == Constants.TOUCHTYPE_DOWN) { //down this.startX = event.touches[0].screenX -- Gitee From c574a5baf6a2a6892615281e996ad1556aa3859c Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 27 Aug 2022 10:07:40 +0800 Subject: [PATCH 250/373] =?UTF-8?q?SystemUI=E5=BA=94=E7=94=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0TRACE=E5=92=8C=E6=95=85=E9=9A=9C=E6=89=93=E7=82=B9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- build-profile.json5 | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/build-profile.json5 b/build-profile.json5 index 463b7a29..c64def10 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -7,20 +7,6 @@ "name": "default", "signingConfig": "release" } - ], - "signingConfigs": [ - { - "name": "release", - "material": { - "certpath": "C:/Users/l30020847/AppData/Local/OpenHarmony/OpenHarmonyApplication.cer", - "storePassword": "00000016A910492840C49C5DD81DF554C2C5CA27175637D18559733DEA85C9589C409EA2A1EA", - "keyAlias": "OpenHarmony Application Release", - "keyPassword": "00000016697ADFF60E8918B63C523DCF3775AD0BC721C23255CAC96A8993E60B8F556B293FAD", - "profile": "C:/Users/l30020847/AppData/Local/OpenHarmony/systemui.p7b", - "signAlg": "SHA256withECDSA", - "storeFile": "C:/Users/l30020847/AppData/Local/OpenHarmony/OpenHarmony.p12" - } - } ] }, "modules": [ -- Gitee From 8a9a88ef35d3828a1dd073c6ce04adfbbd8d39fa Mon Sep 17 00:00:00 2001 From: gaochao Date: Sat, 27 Aug 2022 10:10:15 +0800 Subject: [PATCH 251/373] =?UTF-8?q?[screenlock]=20=E5=88=87full=5Fsdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: gaochao --- README.md | 23 + .../noticeItem/model/NotificationManager.ts | 2 +- .../noticeItem/view/item/actionComponent.ets | 8 +- .../ets/com/ohos/model/screenLockService.ts | 2 +- .../ets/com/ohos/view/component/customPSD.ets | 4 +- .../main/resources/base/element/color.json | 104 ++++ .../main/resources/base/element/float.json | 489 +++++++++++++++++ .../main/resources/base/element/string.json | 200 +++++++ .../main/resources/base/media/delete_all.png | Bin 0 -> 4061 bytes .../main/resources/base/media/ic_close.svg | 1 + .../resources/base/media/ic_hollow_dot.svg | 13 + .../base/media/ic_notification_down.png | Bin 0 -> 204 bytes .../base/media/ic_notification_up.png | Bin 0 -> 204 bytes .../base/media/ic_public_delete_filled.svg | 13 + .../base/media/ic_public_lock_filled.svg | 13 + .../base/media/ic_public_settings_filled.svg | 13 + .../base/media/ic_public_unlock_filled.svg | 13 + .../resources/base/media/ic_solid_dot.svg | 13 + .../base/media/ic_statusbar_signal_1.svg | 6 + .../base/media/ic_statusbar_signal_2.svg | 6 + .../base/media/ic_statusbar_signal_3.svg | 6 + .../base/media/ic_statusbar_signal_4.svg | 6 + .../base/media/ic_statusbar_signal_full.svg | 5 + .../base/media/ic_statusbar_signal_no.svg | 5 + .../media/ic_statusbar_signal_roaming.png | Bin 0 -> 411 bytes .../base/media/ic_statusbar_signal_wait.png | Bin 0 -> 442 bytes .../base/media/ic_statusbar_wifi_1.svg | 12 + .../base/media/ic_statusbar_wifi_2.svg | 12 + .../base/media/ic_statusbar_wifi_3.svg | 12 + .../base/media/ic_statusbar_wifi_connect.png | Bin 0 -> 331 bytes .../base/media/ic_statusbar_wifi_full.svg | 12 + .../base/media/ic_statusbar_wifi_no.svg | 12 + .../resources/base/media/ic_user_portrait.svg | 16 + .../pc/src/main/resources/base/media/lock.png | Bin 0 -> 4173 bytes .../src/main/resources/base/media/reboot.svg | 30 + .../pc/src/main/resources/base/media/send.svg | 16 + .../main/resources/base/media/shutdown.svg | 14 + .../src/main/resources/base/media/unlock.png | Bin 0 -> 4458 bytes .../main/resources/base/element/color.json | 112 ++++ .../main/resources/base/element/float.json | 512 ++++++++++++++++++ .../main/resources/base/element/string.json | 196 +++++++ .../main/resources/base/media/delete_all.png | Bin 0 -> 4061 bytes .../main/resources/base/media/ic_close.svg | 1 + .../resources/base/media/ic_hollow_dot.svg | 13 + .../base/media/ic_notification_down.png | Bin 0 -> 204 bytes .../base/media/ic_notification_up.png | Bin 0 -> 204 bytes .../base/media/ic_public_delete_filled.svg | 13 + .../base/media/ic_public_lock_filled.svg | 13 + .../base/media/ic_public_settings_filled.svg | 13 + .../base/media/ic_public_unlock_filled.svg | 13 + .../resources/base/media/ic_solid_dot.svg | 13 + .../base/media/ic_statusbar_signal_1.svg | 6 + .../base/media/ic_statusbar_signal_2.svg | 6 + .../base/media/ic_statusbar_signal_3.svg | 6 + .../base/media/ic_statusbar_signal_4.svg | 6 + .../base/media/ic_statusbar_signal_full.svg | 5 + .../base/media/ic_statusbar_signal_no.svg | 5 + .../media/ic_statusbar_signal_roaming.png | Bin 0 -> 411 bytes .../base/media/ic_statusbar_signal_wait.png | Bin 0 -> 442 bytes .../base/media/ic_statusbar_wifi_1.svg | 12 + .../base/media/ic_statusbar_wifi_2.svg | 12 + .../base/media/ic_statusbar_wifi_3.svg | 12 + .../base/media/ic_statusbar_wifi_connect.png | Bin 0 -> 331 bytes .../base/media/ic_statusbar_wifi_full.svg | 12 + .../base/media/ic_statusbar_wifi_no.svg | 12 + .../resources/base/media/ic_user_portrait.svg | 16 + .../src/main/resources/base/media/lock.png | Bin 0 -> 4173 bytes .../src/main/resources/base/media/reboot.svg | 30 + .../src/main/resources/base/media/send.svg | 16 + .../main/resources/base/media/shutdown.svg | 14 + .../src/main/resources/base/media/unlock.png | Bin 0 -> 4458 bytes 71 files changed, 2142 insertions(+), 8 deletions(-) create mode 100644 README.md create mode 100644 product/pc/src/main/resources/base/media/delete_all.png create mode 100644 product/pc/src/main/resources/base/media/ic_close.svg create mode 100644 product/pc/src/main/resources/base/media/ic_hollow_dot.svg create mode 100644 product/pc/src/main/resources/base/media/ic_notification_down.png create mode 100644 product/pc/src/main/resources/base/media/ic_notification_up.png create mode 100644 product/pc/src/main/resources/base/media/ic_public_delete_filled.svg create mode 100644 product/pc/src/main/resources/base/media/ic_public_lock_filled.svg create mode 100644 product/pc/src/main/resources/base/media/ic_public_settings_filled.svg create mode 100644 product/pc/src/main/resources/base/media/ic_public_unlock_filled.svg create mode 100644 product/pc/src/main/resources/base/media/ic_solid_dot.svg create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_signal_1.svg create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_signal_2.svg create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_signal_3.svg create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_signal_4.svg create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_signal_full.svg create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_signal_no.svg create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_signal_roaming.png create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_signal_wait.png create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_wifi_1.svg create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_wifi_2.svg create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_wifi_3.svg create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_wifi_connect.png create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_wifi_full.svg create mode 100644 product/pc/src/main/resources/base/media/ic_statusbar_wifi_no.svg create mode 100644 product/pc/src/main/resources/base/media/ic_user_portrait.svg create mode 100644 product/pc/src/main/resources/base/media/lock.png create mode 100644 product/pc/src/main/resources/base/media/reboot.svg create mode 100644 product/pc/src/main/resources/base/media/send.svg create mode 100644 product/pc/src/main/resources/base/media/shutdown.svg create mode 100644 product/pc/src/main/resources/base/media/unlock.png create mode 100644 product/phone/src/main/resources/base/media/delete_all.png create mode 100644 product/phone/src/main/resources/base/media/ic_close.svg create mode 100644 product/phone/src/main/resources/base/media/ic_hollow_dot.svg create mode 100644 product/phone/src/main/resources/base/media/ic_notification_down.png create mode 100644 product/phone/src/main/resources/base/media/ic_notification_up.png create mode 100644 product/phone/src/main/resources/base/media/ic_public_delete_filled.svg create mode 100644 product/phone/src/main/resources/base/media/ic_public_lock_filled.svg create mode 100644 product/phone/src/main/resources/base/media/ic_public_settings_filled.svg create mode 100644 product/phone/src/main/resources/base/media/ic_public_unlock_filled.svg create mode 100644 product/phone/src/main/resources/base/media/ic_solid_dot.svg create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg create mode 100644 product/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg create mode 100644 product/phone/src/main/resources/base/media/ic_user_portrait.svg create mode 100644 product/phone/src/main/resources/base/media/lock.png create mode 100644 product/phone/src/main/resources/base/media/reboot.svg create mode 100644 product/phone/src/main/resources/base/media/send.svg create mode 100644 product/phone/src/main/resources/base/media/shutdown.svg create mode 100644 product/phone/src/main/resources/base/media/unlock.png diff --git a/README.md b/README.md new file mode 100644 index 00000000..6f440021 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# OpenHarmony_desktop_application + + + +**黄区对应分支** + +openharmony/gitee_build_wagner_master_mirror_dev + + + +**对应仓库:** + +锁屏/screenlock + +系统UI/systemui + +桌面/launcher + + + +**相关committer:** + +苏鹏 00565270,倪茂森 00564676,杨鹏 00464702 \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index 21876f5d..e78c6d7e 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -15,7 +15,7 @@ //import { NotificationSubscriber } from './notification/notificationSubscriber'; import Notification from '@ohos.notification'; -import PluginComponentManager from '@ohos.plugincomponent'; +import PluginComponentManager from '@ohos.pluginComponent'; import Systemparameter from '@ohos.systemparameter'; import Log from '../../../../../../../../../common/src/main/ets/default/Log'; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets index bfdf349d..e0b3b672 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets @@ -81,7 +81,7 @@ export default struct ActionComponent { @Component struct ActionButton { - @State backgroundColor: Resource = $r("app.color.transparent"); + @State isTouched: boolean = false; @Prop content: string; clickable: boolean = true; clickEvent: () => void = () => { @@ -94,15 +94,15 @@ struct ActionButton { .borderRadius($r("sys.float.ohos_fa_corner_radius_default_s")) .height(Layout.ACTION_HEIGHT) .padding({ left: Layout.ACTION_MARGIN, right: Layout.ACTION_MARGIN }) - .backgroundColor(this.backgroundColor) + .backgroundColor(this.isTouched ? $r("sys.color.ohos_fa_click_effect") : $r("app.color.transparent")) .onTouch((event: TouchEvent) => { if (!this.clickable) { return; } if (event.type == TouchType.Down) { - this.backgroundColor = $r("sys.color.ohos_fa_click_effect"); + this.isTouched = true; } else if (event.type == TouchType.Up) { - this.backgroundColor = $r("app.color.transparent"); + this.isTouched = false; } }) .onClick(() => { diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 0a9be437..7bd587b9 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -21,7 +21,7 @@ import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/defa import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper' import Router from '@system.router'; import commonEvent from '@ohos.commonEvent'; -import hiDebug from '@ohos.hiDebug'; +import hiDebug from '@ohos.hidebug'; import { CommonEventPublishData } from 'commonEvent/commonEventPublishData'; import {Callback} from 'basic'; diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index 8c8a5b53..8ebfb7ae 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -88,8 +88,8 @@ export default struct CustomPSD { }) .width($r('app.float.custompsd_input_width')) .height($r("app.float.custompsd_button_height")) - .enabled(this.passwordArr.length > 1) - .opacity(deviceInfo.deviceType === 'tablet' ? 1 : (this.passwordArr.length > 1 ? 1 : 0.4)) + .enabled(this.passwordArr.length >= 1) + .opacity(deviceInfo.deviceType === 'tablet' ? 1 : (this.passwordArr.length >= 1 ? 1 : 0.4)) .onClick(() => { Log.showInfo(TAG, `onClick`) this.mViewModel.onAuthPassword(() => { diff --git a/product/pc/src/main/resources/base/element/color.json b/product/pc/src/main/resources/base/element/color.json index 07a53558..3abcaac3 100644 --- a/product/pc/src/main/resources/base/element/color.json +++ b/product/pc/src/main/resources/base/element/color.json @@ -15,6 +15,110 @@ { "name":"notificationitem_background", "value":"#99D8F8E7" + }, + { + "name": "battery_component_pic_level_low_color", + "value": "#ff0000" + }, + { + "name": "battery_component_pic_charging_color", + "value": "#00ff21" + }, + { + "name": "battery_background", + "value": "#00000000" + }, + { + "name": "date_time_color", + "value": "#ffffff" + }, + { + "name":"title_text_color", + "value":"#222D37" + }, + { + "name":"content_text_color", + "value":"#FF435563" + }, + { + "name":"name_text_color", + "value":"#435563" + }, + { + "name": "nonotification_text_color", + "value": "#ffffffff" + }, + { + "name":"dialog_font_color", + "value":"#ffffff" + }, + { + "name": "action_button_color", + "value": "#007DFF" + }, + { + "name":"dialog_font_back_color", + "value":"#0759f6" + }, + { + "name":"dialog_back_color", + "value":"#FF0000FF" + }, + { + "name": "confirm_divider_color", + "value": "#E3E3E3" + }, + { + "name": "confirm_text_color", + "value": "#FFFF0000" + }, + { + "name":"action_button_click_color", + "value":"#0D000000" + }, + { + "name": "button_background", + "value": "#4d000000" + }, + { + "name": "device_divider_color", + "value": "#E3E3E3" + }, + { + "name": "lock_prompt_color", + "value": "#ffffff" + }, + { + "name": "circle_background", + "value": "#ffffff" + }, + { + "name": "circle_background_transparent", + "value": "#00ffffff" + }, + { + "name": "batterysoc_text_color", + "value": "#ffffff" + }, + { + "name": "accounts_text_color", + "value": "#ffffff" + }, + { + "name": "lock_ic_color", + "value": "#ffffff" + }, + { + "name": "shortcut_icon_color", + "value": "rgba(255, 255, 255, 0.5)" + }, + { + "name": "shortcut_text_color", + "value": "#ffffff" + }, + { + "name": "font_color_white", + "value": "#fff" } ] } \ No newline at end of file diff --git a/product/pc/src/main/resources/base/element/float.json b/product/pc/src/main/resources/base/element/float.json index d7d54c64..eb358eb5 100644 --- a/product/pc/src/main/resources/base/element/float.json +++ b/product/pc/src/main/resources/base/element/float.json @@ -171,6 +171,495 @@ { "name": "status_bar_clock_margin", "value": "0" + }, + { + "name": "status_bar_clock_width", + "value": "60vp" + }, + { + "name": "time_fontsize", + "value": "148" + }, + { + "name": "time_fontWeight", + "value": "400" + }, + { + "name": "time_top_margin", + "value": "10" + }, + { + "name": "time_bottom_margin", + "value": "10" + }, + { + "name": "date_fontsize", + "value": "36" + }, + { + "name": "date_week_area_height", + "value": "48" + }, + { + "name": "date_lunar_calendar_height", + "value": "0" + }, + { + "name": "date_lunar_calendar_fontSize", + "value": "14fp" + }, + { + "name": "date_lunar_calendar_top_margin", + "value": "6vp" + }, + { + "name": "notificationList_width", + "value": "834vp" + }, + { + "name": "notification_title_fontsize", + "value": "20" + }, + { + "name": "notification_expanded_text_maxheight", + "value": "295" + }, + { + "name": "notification_content_fontsize", + "value": "20" + }, + { + "name": "notification_content_lineheight", + "value": "20" + }, + { + "name": "notification_content_maxlines", + "value": "1" + }, + { + "name": "content_margin_top", + "value": "10" + }, + { + "name": "body_margin_top", + "value": "10" + }, + { + "name": "item_opicaty", + "value": "0.9" + }, + { + "name": "item_borderradius", + "value": "20" + }, + { + "name": "item_margintop", + "value": "10" + }, + { + "name": "item_marginleft", + "value": "10" + }, + { + "name": "item_marginright", + "value": "10" + }, + { + "name": "item_paddingleft", + "value": "20" + }, + { + "name": "item_paddingright", + "value": "20" + }, + { + "name": "item_paddingbottom", + "value": "20" + }, + { + "name": "item_setting_image_width", + "value": "30" + }, + { + "name": "item_setting_image_height", + "value": "30" + }, + { + "name": "item_delete_image_width", + "value": "30" + }, + { + "name": "item_delete_image_height", + "value": "30" + }, + { + "name": "titleitem_row_space", + "value": "10" + }, + { + "name": "titleitem_height", + "value": "50" + }, + { + "name": "title_image_width", + "value": "30" + }, + { + "name": "title_image_height", + "value": "30" + }, + { + "name": "title_image_left_margin", + "value": "0" + }, + { + "name": "title_image_right_margin", + "value": "0" + }, + { + "name": "message_font_margin_t", + "value": "14vp" + }, + { + "name": "title_name_fontsize", + "value": "20" + }, + { + "name": "title_time_fontsize", + "value": "20" + }, + { + "name": "displayicon_width", + "value": "20" + }, + { + "name": "displayicon_height", + "value": "20" + }, + { + "name": "deleteall_image_opacity", + "value": "0.9" + }, + { + "name": "setting_title_fontsize", + "value": "40" + }, + { + "name": "setting_cont_height", + "value": "40vp" + }, + { + "name": "setting_cont_width", + "value": "300vp" + }, + { + "name": "setting_border_width", + "value": "1" + }, + { + "name": "setting_border_radius", + "value": "80" + }, + { + "name": "notification_border_radius", + "value": "24vp" + }, + { + "name": "action_button_height", + "value": "48" + }, + { + "name": "action_button_padding", + "value": "12" + }, + { + "name": "picture_default_height", + "value": "300" + }, + { + "name": "confirm_title_fontsize", + "value": "40" + }, + { + "name": "confirm_title_width", + "value": "330vp" + }, + { + "name": "confirm_cont_fontsize", + "value": "32" + }, + { + "name": "confirm_divider_height", + "value": "44" + }, + { + "name": "confirm_button_height", + "value": "60" + }, + { + "name": "confirm_button_margin_t", + "value": "23vp" + }, + { + "name": "confirm_button_width", + "value": "140" + }, + { + "name": "icon_item_fontsize", + "value": "18" + }, + { + "name": "setting_dialog_dy", + "value": "200" + }, + { + "name": "setting_dialog_width", + "value": "330vp" + }, + { + "name": "setting_dialog_Width", + "value": "362vp" + }, + { + "name": "confirm_dialog_dy", + "value": "250" + }, + { + "name": "device_divider_margin_l", + "value": "70" + }, + { + "name": "device_divider_margin_r", + "value": "30" + }, + { + "name": "device_border_width", + "value": "1" + }, + { + "name": "device_border_radius", + "value": "30" + }, + { + "name": "device_image_radius", + "value": "0" + }, + { + "name": "lockicon_width", + "value": "40" + }, + { + "name": "lockicon_height", + "value": "45" + }, + { + "name": "lockicon_top_margin", + "value": "10" + }, + { + "name": "lockicon_bottom_margin", + "value": "10" + }, + { + "name": "lockicon_right_margin", + "value": "0" + }, + { + "name": "lock_prompt_fontsize", + "value": "32" + }, + { + "name": "lock_Text_top_margin", + "value": "0" + }, + { + "name": "batterysoc_fontsize", + "value": "36" + }, + { + "name": "accounts_component_height", + "value": "120" + }, + { + "name": "accounts_ic_width", + "value": "72" + }, + { + "name": "accounts_ic_height", + "value": "72" + }, + { + "name": "accounts_name_fontsize", + "value": "24" + }, + { + "name": "accounts_block", + "value": "8" + }, + { + "name": "digitalpsd_prompt_fontsize", + "value": "32" + }, + { + "name": "digitalpsd_prompt_margin_bottom", + "value": "48" + }, + { + "name": "digitalpsd_prompt_width", + "value": "800" + }, + { + "name": "digitalpsd_prompt_height", + "value": "72" + }, + { + "name": "digitalpsd_passwdmask_width", + "value": "400" + }, + { + "name": "digitalpsd_passwdmask_height", + "value": "24vp" + }, + { + "name": "digitalpsd_passwdmask_margin_bottom", + "value": "128" + }, + { + "name": "digitalpsd_input_area_height", + "value": "200" + }, + { + "name": "digitalpsd_row1_fontsize", + "value": "48" + }, + { + "name": "digitalpsd_row2_fontsize", + "value": "24" + }, + { + "name": "digitalpsd_row_height", + "value": "200" + }, + { + "name": "digitalpsd_key_area_height", + "value": "800" + }, + { + "name": "digitalpsd_key_area_margin_bottom", + "value": "64" + }, + { + "name": "mixedpsd_prompt_fontsize", + "value": "32" + }, + { + "name": "mixedpsd_prompt_text_fontsize", + "value": "32" + }, + { + "name": "mixedpsd_prompt_margin_bottom", + "value": "48" + }, + { + "name": "mixedpsd_prompt_margin_top", + "value": "0" + }, + { + "name": "mixedpsd_prompt_width", + "value": "800" + }, + { + "name": "mixedpsd_prompt_height", + "value": "72" + }, + { + "name": "mixedpsd_input_maxlen", + "value": "30" + }, + { + "name": "mixedpsd_input_width", + "value": "600" + }, + { + "name": "mixedpsd_input_height", + "value": "72" + }, + { + "name": "mixedpsd_input_margin_bottom", + "value": "128" + }, + { + "name": "custompsd_prompt_fontsize", + "value": "32" + }, + { + "name": "custompsd_prompt_margin_bottom", + "value": "48" + }, + { + "name": "custompsd_prompt_width", + "value": "800" + }, + { + "name": "custompsd_prompt_height", + "value": "72" + }, + { + "name": "custompsd_input_width", + "value": "600" + }, + { + "name": "custompsd_input_height", + "value": "72" + }, + { + "name": "custompsd_input_radius", + "value": "36" + }, + { + "name": "custompsd_input_margin_bottom", + "value": "90" + }, + { + "name": "custompsd_passwdmask_margin_bottom", + "value": "128" + }, + { + "name": "custompsd_input_area_height", + "value": "400" + }, + { + "name": "custompsd_key_area_height", + "value": "800" + }, + { + "name": "custompsd_key_area_margin_bottom", + "value": "64" + }, + { + "name": "custompsd_text_opacity", + "value": "1" + }, + { + "name": "custompsd_digitalpsd_ic_diameter", + "value": "12vp" + }, + { + "name": "custompsd_button_height", + "value": "36vp" + }, + { + "name": "numkeyBoard_text_opacity", + "value": "1" + }, + { + "name": "numkeyBoard_rowsGap", + "value": "0" + }, + { + "name": "shortcut_block", + "value": "8" } + ] } \ No newline at end of file diff --git a/product/pc/src/main/resources/base/element/string.json b/product/pc/src/main/resources/base/element/string.json index f97e581a..e939d42c 100644 --- a/product/pc/src/main/resources/base/element/string.json +++ b/product/pc/src/main/resources/base/element/string.json @@ -15,6 +15,206 @@ { "name": "description_mainability", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "monday", + "value": "星期一" + }, + { + "name": "tuesday", + "value": "星期二" + }, + { + "name": "wednesday", + "value": "星期三" + }, + { + "name": "thursday", + "value": "星期四" + }, + { + "name": "friday", + "value": "星期五" + }, + { + "name": "saturday", + "value": "星期六" + }, + { + "name": "sunday", + "value": "星期日" + }, + { + "name": "yyyy_mm_dd", + "value": "%d/%d/%d" + }, + { + "name": "mm_dd", + "value": "%d/%d" + }, + { + "name": "noticeitem", + "value": "noticeitem" + }, + { + "name": "nonotification_text", + "value": "无通知" + }, + { + "name": "closeNotification", + "value": "关闭通知" + }, + { + "name": "moreSettings", + "value": "更多设置" + }, + { + "name": "cancel", + "value": "取消" + }, + { + "name": "enter", + "value": "回复" + }, + { + "name": "Sending", + "value": "发送中" + }, + { + "name": "close", + "value": "关闭" + }, + { + "name": "closeNovice", + "value": "关闭通知" + }, + { + "name": "confirm_message", + "value": "是否关掉”%s“的所有通知?" + }, + { + "name": "device_dialog_title", + "value": "设备选择" + }, + { + "name": "distributed_devicename", + "value": "来自”%s“设备" + }, + { + "name": "lock_prompt", + "value": "屏幕锁定中" + }, + { + "name": "unlock_prompt", + "value": "上滑解锁" + }, + { + "name": "recognizing_face", + "value": "正在识别人脸" + }, + { + "name": "face_not_recognized", + "value": "未识别成功, 双击重试" + }, + { + "name": "input", + "value": "输入密码" + }, + { + "name": "incorrect", + "value": "密码错误" + }, + { + "name": "incorrect_promp_times", + "value": "密码错误,还可尝试%d次" + }, + { + "name": "incorrect_promp_freezing", + "value": "密码错误,还可尝试%d次,失败后将锁定%s" + }, + { + "name": "input_promp", + "value": "请%s后重试" + }, + { + "name": "emergency_call", + "value": "紧急呼叫" + }, + { + "name": "back", + "value": "返回" + }, + { + "name": "delete", + "value": "删除" + }, + { + "name": "done", + "value": "确定" + }, + { + "name": "charge_full", + "value": "已充满" + }, + { + "name": "charging", + "value": "正在充电%s" + }, + { + "name": "battery_soc", + "value": "目前电量%s" + }, + { + "name": "shutdown", + "value": "关机" + }, + { + "name": "reboot", + "value": "重启" + }, + { + "name": "signalcomponent", + "value": "signalcomponent" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "china_mobile", + "value": "中国移动" + }, + { + "name": "china_telecom", + "value": "中国电信" + }, + { + "name": "china_unicom", + "value": "中国联通" + }, + { + "name": "net_null", + "value": "没有 SIM 卡" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + }, + { + "name": "signal_null", + "value": "×" } ] } \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/delete_all.png b/product/pc/src/main/resources/base/media/delete_all.png new file mode 100644 index 0000000000000000000000000000000000000000..143463751f103bbf00d204cbbd40982b9a5a6ec1 GIT binary patch literal 4061 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 P00000NkvXXu0mjf(|(n6 literal 0 HcmV?d00001 diff --git a/product/pc/src/main/resources/base/media/ic_close.svg b/product/pc/src/main/resources/base/media/ic_close.svg new file mode 100644 index 00000000..a7f87d23 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_close.svg @@ -0,0 +1 @@ +ic \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/ic_hollow_dot.svg b/product/pc/src/main/resources/base/media/ic_hollow_dot.svg new file mode 100644 index 00000000..95f82903 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_hollow_dot.svg @@ -0,0 +1,13 @@ + + + Rectangle 9 Copy 3 + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/ic_notification_down.png b/product/pc/src/main/resources/base/media/ic_notification_down.png new file mode 100644 index 0000000000000000000000000000000000000000..690ffa8c311a2ec33de3612a5f063c67758e3410 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0D$(}BbArXh)PCdzcKtX`{E?a6& zVCJ;A6^(xu$+T>kQS0)l=3uge0)t|Uz}DY$BAX5c1O#r}S{Cqv z%UWioea@159hwT8H;eY&@o6=Fymm&!Bz2?86^jiYMfJFx?EWii{x9>J2=^D;vr2zw zXD!^fGq22Oz)k!c~3>pn$p)g zpH3!z=69`%KchE){kjvI1%J%hetqZM56sLA4AF&5i(2PiwMi8@40IlYr>mdKI;Vst E09jyCt^fc4 literal 0 HcmV?d00001 diff --git a/product/pc/src/main/resources/base/media/ic_public_delete_filled.svg b/product/pc/src/main/resources/base/media/ic_public_delete_filled.svg new file mode 100644 index 00000000..9807c565 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_public_delete_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_delete_filled + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/ic_public_lock_filled.svg b/product/pc/src/main/resources/base/media/ic_public_lock_filled.svg new file mode 100644 index 00000000..66cc5da1 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_public_lock_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_lock_filled + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/ic_public_settings_filled.svg b/product/pc/src/main/resources/base/media/ic_public_settings_filled.svg new file mode 100644 index 00000000..1b0c0940 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_public_settings_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_settings_filled + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/ic_public_unlock_filled.svg b/product/pc/src/main/resources/base/media/ic_public_unlock_filled.svg new file mode 100644 index 00000000..2b301ebc --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_public_unlock_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_unlock_filled + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/ic_solid_dot.svg b/product/pc/src/main/resources/base/media/ic_solid_dot.svg new file mode 100644 index 00000000..fdc18e75 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_solid_dot.svg @@ -0,0 +1,13 @@ + + + Rectangle 9 Copy 5 + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_1.svg b/product/pc/src/main/resources/base/media/ic_statusbar_signal_1.svg new file mode 100644 index 00000000..f0438a9a --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_statusbar_signal_1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_2.svg b/product/pc/src/main/resources/base/media/ic_statusbar_signal_2.svg new file mode 100644 index 00000000..173489d3 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_statusbar_signal_2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_3.svg b/product/pc/src/main/resources/base/media/ic_statusbar_signal_3.svg new file mode 100644 index 00000000..c703e2d0 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_statusbar_signal_3.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_4.svg b/product/pc/src/main/resources/base/media/ic_statusbar_signal_4.svg new file mode 100644 index 00000000..cb66ccb4 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_statusbar_signal_4.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_full.svg b/product/pc/src/main/resources/base/media/ic_statusbar_signal_full.svg new file mode 100644 index 00000000..3c796ab5 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_statusbar_signal_full.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_no.svg b/product/pc/src/main/resources/base/media/ic_statusbar_signal_no.svg new file mode 100644 index 00000000..4d1a5bc4 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_statusbar_signal_no.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/product/pc/src/main/resources/base/media/ic_statusbar_signal_roaming.png new file mode 100644 index 0000000000000000000000000000000000000000..c37dc10f00c0b991f31faf014841cf015c33684c GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T|AsMW1 zr|r*Tauhgb>uGgStNy^P_6?#FMVve)-}~+{vHSx2h4Kqd0!I#AJEhio!_(qmL#x@T zpSs)Gn>|we64(6@yY@40Z{hx*ckd+W9d~3>abQv@U~YV{|Bgo2svr9l-`#Z7H*j|p z$T?bNrpoo>*dCL*jT+p>+6wcFo{K;E8sK7>`tR-~6V@#ovL%b(l-Ikism>KMVSRJ) zySBw!uI-`=eU~h2IPySIu!9xIT*dHZkM-7jEti*GxH;KC$A6)~_3Se#ISTXE#@cJ} z*mPF+UzlH^?zAyY$yC>*_3)C^811vZGV^m+X)fr!(|5kS@_qXL)S{J|2P9=Urpr6c z_6%iw@l)QS^ndG}6%SSQj$V2f9NMt`=J$_+8#B{w?^*gX&dgezef&j$z`ROZ$3KTk m{2!cOZ#aR06Bo+hn8VPgo36`mR;~mLZ3a(QKbLh*2~7YkC#n4a literal 0 HcmV?d00001 diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_wait.png b/product/pc/src/main/resources/base/media/ic_statusbar_signal_wait.png new file mode 100644 index 0000000000000000000000000000000000000000..11a8958a11189755d4328343ef68453f27411739 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T*yPaTIC&-l?5c*qkBay7^*~k>r&$Ly!18Z`L!$ld*I$=K*~7KJU*Af*d#L=Z)eW|&9^-1WKCL{L`wsFSMNNuj zo;@#oKi6*J``r=D+vFAZzdX&!wO{D@!naFz?&iD0QN=Umih7i5_KI$&tpRsscd#-Q z@Yya7c<9U0nzdN6`r2Cd5~;llLuAh^iB8~VdttH5|H-oZkB+~IoGy1Fo4K|lf7aKj z-Y-~KUrcMfYxp_V_`XkZxavrqt&mjfgarZk{)LRCI6 Y|5;yC(^}(m1{fI(p00i_>zopr0MHz`#sB~S literal 0 HcmV?d00001 diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/product/pc/src/main/resources/base/media/ic_statusbar_wifi_1.svg new file mode 100644 index 00000000..3842e2ab --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_statusbar_wifi_1.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/product/pc/src/main/resources/base/media/ic_statusbar_wifi_2.svg new file mode 100644 index 00000000..7829aa32 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_statusbar_wifi_2.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/product/pc/src/main/resources/base/media/ic_statusbar_wifi_3.svg new file mode 100644 index 00000000..ef60272d --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_statusbar_wifi_3.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/product/pc/src/main/resources/base/media/ic_statusbar_wifi_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a905dfc0f9c219e48db7edb5ca93b1041766f5 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g;!3HGxU+kX;q!^2X+?^QKos)S9a~60+7BevL9R^{>w;^3X z&tcIc38B^<9WJX2SbJUOI4-=R?dq7gXZz<9H|CyL=e05ZQ|h<+|7YgkRMpV3nV zx}zc3^^8>kYjoGA=EK<@@49B>=A@)`?U}M=*@1(W(3wAXhqV%sM z<);f5H`OeQzHv>={)WIo?mrH>N8z90L;+t&5DvDvqxncelwvtDnm{r-UW|#=MI2 literal 0 HcmV?d00001 diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/product/pc/src/main/resources/base/media/ic_statusbar_wifi_full.svg new file mode 100644 index 00000000..42e8b4b9 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_statusbar_wifi_full.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/product/pc/src/main/resources/base/media/ic_statusbar_wifi_no.svg new file mode 100644 index 00000000..3122653c --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_statusbar_wifi_no.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/ic_user_portrait.svg b/product/pc/src/main/resources/base/media/ic_user_portrait.svg new file mode 100644 index 00000000..26a66b69 --- /dev/null +++ b/product/pc/src/main/resources/base/media/ic_user_portrait.svg @@ -0,0 +1,16 @@ + + + IC/ic_user_portrait + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/lock.png b/product/pc/src/main/resources/base/media/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..9163d2c95f410a497382dfb83fac1799c57baca9 GIT binary patch literal 4173 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 + + 编组 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/send.svg b/product/pc/src/main/resources/base/media/send.svg new file mode 100644 index 00000000..e3e601a1 --- /dev/null +++ b/product/pc/src/main/resources/base/media/send.svg @@ -0,0 +1,16 @@ + + + Public/ic_public_email_send + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/shutdown.svg b/product/pc/src/main/resources/base/media/shutdown.svg new file mode 100644 index 00000000..b81ff013 --- /dev/null +++ b/product/pc/src/main/resources/base/media/shutdown.svg @@ -0,0 +1,14 @@ + + + 开关 + + + + + + + + + + + \ No newline at end of file diff --git a/product/pc/src/main/resources/base/media/unlock.png b/product/pc/src/main/resources/base/media/unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6a03806e5232a4dae1107c410d54d9a5cc2e0d GIT binary patch literal 4458 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 literal 0 HcmV?d00001 diff --git a/product/phone/src/main/resources/base/element/color.json b/product/phone/src/main/resources/base/element/color.json index c8f7d55a..3abcaac3 100644 --- a/product/phone/src/main/resources/base/element/color.json +++ b/product/phone/src/main/resources/base/element/color.json @@ -4,9 +4,121 @@ "name":"transparent", "value":"#00000000" }, + { + "name": "operation_ic_backgroundColor", + "value": "#FFFFFF" + }, { "name": "page_background", "value": "#19181B" + }, + { + "name":"notificationitem_background", + "value":"#99D8F8E7" + }, + { + "name": "battery_component_pic_level_low_color", + "value": "#ff0000" + }, + { + "name": "battery_component_pic_charging_color", + "value": "#00ff21" + }, + { + "name": "battery_background", + "value": "#00000000" + }, + { + "name": "date_time_color", + "value": "#ffffff" + }, + { + "name":"title_text_color", + "value":"#222D37" + }, + { + "name":"content_text_color", + "value":"#FF435563" + }, + { + "name":"name_text_color", + "value":"#435563" + }, + { + "name": "nonotification_text_color", + "value": "#ffffffff" + }, + { + "name":"dialog_font_color", + "value":"#ffffff" + }, + { + "name": "action_button_color", + "value": "#007DFF" + }, + { + "name":"dialog_font_back_color", + "value":"#0759f6" + }, + { + "name":"dialog_back_color", + "value":"#FF0000FF" + }, + { + "name": "confirm_divider_color", + "value": "#E3E3E3" + }, + { + "name": "confirm_text_color", + "value": "#FFFF0000" + }, + { + "name":"action_button_click_color", + "value":"#0D000000" + }, + { + "name": "button_background", + "value": "#4d000000" + }, + { + "name": "device_divider_color", + "value": "#E3E3E3" + }, + { + "name": "lock_prompt_color", + "value": "#ffffff" + }, + { + "name": "circle_background", + "value": "#ffffff" + }, + { + "name": "circle_background_transparent", + "value": "#00ffffff" + }, + { + "name": "batterysoc_text_color", + "value": "#ffffff" + }, + { + "name": "accounts_text_color", + "value": "#ffffff" + }, + { + "name": "lock_ic_color", + "value": "#ffffff" + }, + { + "name": "shortcut_icon_color", + "value": "rgba(255, 255, 255, 0.5)" + }, + { + "name": "shortcut_text_color", + "value": "#ffffff" + }, + { + "name": "font_color_white", + "value": "#fff" } ] } \ No newline at end of file diff --git a/product/phone/src/main/resources/base/element/float.json b/product/phone/src/main/resources/base/element/float.json index cc060f43..4d95bfc2 100644 --- a/product/phone/src/main/resources/base/element/float.json +++ b/product/phone/src/main/resources/base/element/float.json @@ -135,6 +135,518 @@ { "name": "accounts_area_height", "value": "80vp" + }, + { + "name": "status_bar_clock_width", + "value": "2vp" + }, + { + "name": "time_fontsize", + "value": "72fp" + }, + { + "name": "time_fontWeight", + "value": "300" + }, + { + "name": "time_top_margin", + "value": "11vp" + }, + { + "name": "time_bottom_margin", + "value": "3vp" + }, + { + "name": "date_fontsize", + "value": "18fp" + }, + { + "name": "date_week_area_height", + "value": "24vp" + }, + { + "name": "date_lunar_calendar_height", + "value": "19vp" + }, + { + "name": "date_lunar_calendar_fontSize", + "value": "14fp" + }, + { + "name": "date_lunar_calendar_top_margin", + "value": "6vp" + }, + { + "name": "notificationList_width", + "value": "336vp" + }, + { + "name": "notification_title_fontsize", + "value": "20" + }, + { + "name": "notification_expanded_text_maxheight", + "value": "295" + }, + { + "name": "notification_content_fontsize", + "value": "20" + }, + { + "name": "notification_content_lineheight", + "value": "20" + }, + { + "name": "notification_content_maxlines", + "value": "1" + }, + { + "name": "content_margin_top", + "value": "10" + }, + { + "name": "body_margin_top", + "value": "10" + }, + { + "name": "item_opicaty", + "value": "0.9" + }, + { + "name": "item_borderradius", + "value": "20" + }, + { + "name": "item_margintop", + "value": "10" + }, + { + "name": "item_marginleft", + "value": "10" + }, + { + "name": "item_marginright", + "value": "10" + }, + { + "name": "item_paddingleft", + "value": "20" + }, + { + "name": "item_paddingright", + "value": "20" + }, + { + "name": "item_paddingbottom", + "value": "20" + }, + { + "name": "item_setting_image_width", + "value": "30" + }, + { + "name": "item_setting_image_height", + "value": "30" + }, + { + "name": "item_delete_image_width", + "value": "30" + }, + { + "name": "item_delete_image_height", + "value": "30" + }, + { + "name": "titleitem_row_space", + "value": "10" + }, + { + "name": "titleitem_height", + "value": "50" + }, + { + "name": "title_image_width", + "value": "24vp" + }, + { + "name": "title_image_height", + "value": "24vp" + }, + { + "name": "title_image_left_margin", + "value": "24vp" + }, + { + "name": "title_image_right_margin", + "value": "8vp" + }, + { + "name": "title_font_height", + "value": "28vp" + }, + { + "name": "title_font_margin_t", + "value": "13vp" + }, + { + "name": "message_font_margin_t", + "value": "23vp" + }, + { + "name": "title_name_fontsize", + "value": "20" + }, + { + "name": "title_time_fontsize", + "value": "20" + }, + { + "name": "displayicon_width", + "value": "20" + }, + { + "name": "displayicon_height", + "value": "20" + }, + { + "name": "deleteall_image_opacity", + "value": "0.9" + }, + { + "name": "setting_title_fontsize", + "value": "20fp" + }, + { + "name": "setting_cont_fontsize", + "value": "16fp" + }, + { + "name": "setting_cont_height", + "value": "40vp" + }, + { + "name": "setting_cont_width", + "value": "288vp" + }, + { + "name": "setting_border_width", + "value": "1" + }, + { + "name": "setting_border_radius", + "value": "80" + }, + { + "name": "notification_border_radius", + "value": "24vp" + }, + { + "name": "action_button_height", + "value": "48" + }, + { + "name": "action_button_padding", + "value": "12" + }, + { + "name": "picture_default_height", + "value": "300" + }, + { + "name": "confirm_title_fontsize", + "value": "20fp" + }, + { + "name": "confirm_title_width", + "value": "288vp" + }, + { + "name": "confirm_cont_fontsize", + "value": "16fp" + }, + { + "name": "confirm_divider_height", + "value": "24vp" + }, + { + "name": "confirm_button_height", + "value": "60" + }, + { + "name": "confirm_button_margin_t", + "value": "23vp" + }, + { + "name": "confirm_button_width", + "value": "128fp" + }, + { + "name": "icon_item_fontsize", + "value": "18" + }, + { + "name": "setting_dialog_dy", + "value": "288vp" + }, + { + "name": "setting_dialog_width", + "value": "304vp" + }, + { + "name": "setting_dialog_Width", + "value": "336vp" + }, + { + "name": "confirm_dialog_dy", + "value": "310vp" + }, + { + "name": "close_notification_margin_top", + "value": "17vp" + }, + { + "name": "notification_appname_margin_top", + "value": "11vp" + }, + { + "name": "notification_cancle_margin_top", + "value": "9vp" + }, + { + "name": "device_divider_margin_l", + "value": "70" + }, + { + "name": "device_divider_margin_r", + "value": "30" + }, + { + "name": "device_border_width", + "value": "1" + }, + { + "name": "device_border_radius", + "value": "30" + }, + { + "name": "device_image_radius", + "value": "12vp" + }, + { + "name": "lockicon_width", + "value": "16vp" + }, + { + "name": "lockicon_height", + "value": "16vp" + }, + { + "name": "lockicon_top_margin", + "value": "60vp" + }, + { + "name": "lockicon_bottom_margin", + "value": "10" + }, + { + "name": "lockicon_right_margin", + "value": "4vp" + }, + { + "name": "lock_prompt_fontsize", + "value": "14vp" + }, + { + "name": "lock_Text_top_margin", + "value": "58vp" + }, + { + "name": "batterysoc_fontsize", + "value": "36" + }, + { + "name": "accounts_component_height", + "value": "120" + }, + { + "name": "accounts_ic_width", + "value": "72" + }, + { + "name": "accounts_ic_height", + "value": "72" + }, + { + "name": "accounts_name_fontsize", + "value": "24" + }, + { + "name": "accounts_block", + "value": "8" + }, + { + "name": "digitalpsd_prompt_fontsize", + "value": "16vp" + }, + { + "name": "digitalpsd_prompt_margin_bottom", + "value": "24vp" + }, + { + "name": "digitalpsd_prompt_width", + "value": "800" + }, + { + "name": "digitalpsd_prompt_height", + "value": "22vp" + }, + { + "name": "digitalpsd_passwdmask_width", + "value": "192vp" + }, + { + "name": "digitalpsd_passwdmask_height", + "value": "12vp" + }, + { + "name": "digitalpsd_passwdmask_margin_bottom", + "value": "151vp" + }, + { + "name": "digitalpsd_input_area_height", + "value": "60vp" + }, + { + "name": "digitalpsd_row1_fontsize", + "value": "28vp" + }, + { + "name": "digitalpsd_row2_fontsize", + "value": "12vp" + }, + { + "name": "digitalpsd_row_height", + "value": "54vp" + }, + { + "name": "digitalpsd_key_area_height", + "value": "800" + }, + { + "name": "digitalpsd_key_area_margin_bottom", + "value": "52vp" + }, + { + "name": "mixedpsd_prompt_fontsize", + "value": "16fp" + }, + { + "name": "mixedpsd_prompt_margin_top", + "value": "239vp" + }, + { + "name": "mixedpsd_prompt_text_fontsize", + "value": "20fp" + }, + { + "name": "mixedpsd_prompt_margin_bottom", + "value": "24vp" + }, + { + "name": "mixedpsd_prompt_width", + "value": "800" + }, + { + "name": "mixedpsd_prompt_height", + "value": "72" + }, + { + "name": "mixedpsd_input_maxlen", + "value": "30" + }, + { + "name": "mixedpsd_input_width", + "value": "288vp" + }, + { + "name": "mixedpsd_input_height", + "value": "36vp" + }, + { + "name": "mixedpsd_input_margin_bottom", + "value": "16vp" + }, + { + "name": "custompsd_prompt_fontsize", + "value": "16vp" + }, + { + "name": "custompsd_prompt_margin_bottom", + "value": "24vp" + }, + { + "name": "custompsd_prompt_width", + "value": "800" + }, + { + "name": "custompsd_prompt_height", + "value": "22vp" + }, + { + "name": "custompsd_input_width", + "value": "288vp" + }, + { + "name": "custompsd_input_height", + "value": "36vp" + }, + { + "name": "custompsd_input_radius", + "value": "18vp" + }, + { + "name": "custompsd_input_margin_bottom", + "value": "90" + }, + { + "name": "custompsd_passwdmask_margin_bottom", + "value": "71vp" + }, + { + "name": "custompsd_input_area_height", + "value": "138vp" + }, + { + "name": "custompsd_key_area_height", + "value": "800" + }, + { + "name": "custompsd_key_area_margin_bottom", + "value": "52vp" + }, + { + "name": "custompsd_text_opacity", + "value": "0.2" + }, + { + "name": "custompsd_digitalpsd_ic_diameter", + "value": "9vp" + }, + { + "name": "custompsd_button_height", + "value": "40vp" + }, + { + "name": "numkeyBoard_text_opacity", + "value": "0.6" + }, + { + "name": "numkeyBoard_rowsGap", + "value": "22vp" + }, + { + "name": "shortcut_block", + "value": "8" } ] } \ No newline at end of file diff --git a/product/phone/src/main/resources/base/element/string.json b/product/phone/src/main/resources/base/element/string.json index 154373d9..4fd36b80 100644 --- a/product/phone/src/main/resources/base/element/string.json +++ b/product/phone/src/main/resources/base/element/string.json @@ -19,6 +19,202 @@ { "name": "input", "value": "输入密码" + }, + { + "name": "monday", + "value": "星期一" + }, + { + "name": "tuesday", + "value": "星期二" + }, + { + "name": "wednesday", + "value": "星期三" + }, + { + "name": "thursday", + "value": "星期四" + }, + { + "name": "friday", + "value": "星期五" + }, + { + "name": "saturday", + "value": "星期六" + }, + { + "name": "sunday", + "value": "星期日" + }, + { + "name": "yyyy_mm_dd", + "value": "%d/%d/%d" + }, + { + "name": "mm_dd", + "value": "%d/%d" + }, + { + "name": "noticeitem", + "value": "noticeitem" + }, + { + "name": "nonotification_text", + "value": "无通知" + }, + { + "name": "closeNotification", + "value": "关闭通知" + }, + { + "name": "moreSettings", + "value": "更多设置" + }, + { + "name": "cancel", + "value": "取消" + }, + { + "name": "enter", + "value": "回复" + }, + { + "name": "Sending", + "value": "发送中" + }, + { + "name": "close", + "value": "关闭" + }, + { + "name": "closeNovice", + "value": "关闭通知" + }, + { + "name": "confirm_message", + "value": "是否关掉”%s“的所有通知?" + }, + { + "name": "device_dialog_title", + "value": "设备选择" + }, + { + "name": "distributed_devicename", + "value": "来自”%s“设备" + }, + { + "name": "lock_prompt", + "value": "屏幕锁定中" + }, + { + "name": "unlock_prompt", + "value": "上滑解锁" + }, + { + "name": "recognizing_face", + "value": "正在识别人脸" + }, + { + "name": "face_not_recognized", + "value": "未识别成功, 双击重试" + }, + { + "name": "incorrect", + "value": "密码错误" + }, + { + "name": "incorrect_promp_times", + "value": "密码错误,还可尝试%d次" + }, + { + "name": "incorrect_promp_freezing", + "value": "密码错误,还可尝试%d次,失败后将锁定%s" + }, + { + "name": "input_promp", + "value": "请%s后重试" + }, + { + "name": "emergency_call", + "value": "紧急呼叫" + }, + { + "name": "back", + "value": "返回" + }, + { + "name": "delete", + "value": "删除" + }, + { + "name": "done", + "value": "确定" + }, + { + "name": "charge_full", + "value": "已充满" + }, + { + "name": "charging", + "value": "正在充电%s" + }, + { + "name": "battery_soc", + "value": "目前电量%s" + }, + { + "name": "shutdown", + "value": "关机" + }, + { + "name": "reboot", + "value": "重启" + }, + { + "name": "signalcomponent", + "value": "signalcomponent" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "china_mobile", + "value": "中国移动" + }, + { + "name": "china_telecom", + "value": "中国电信" + }, + { + "name": "china_unicom", + "value": "中国联通" + }, + { + "name": "net_null", + "value": "没有 SIM 卡" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + }, + { + "name": "signal_null", + "value": "×" } ] } \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/delete_all.png b/product/phone/src/main/resources/base/media/delete_all.png new file mode 100644 index 0000000000000000000000000000000000000000..143463751f103bbf00d204cbbd40982b9a5a6ec1 GIT binary patch literal 4061 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 P00000NkvXXu0mjf(|(n6 literal 0 HcmV?d00001 diff --git a/product/phone/src/main/resources/base/media/ic_close.svg b/product/phone/src/main/resources/base/media/ic_close.svg new file mode 100644 index 00000000..a7f87d23 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_close.svg @@ -0,0 +1 @@ +ic \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/ic_hollow_dot.svg b/product/phone/src/main/resources/base/media/ic_hollow_dot.svg new file mode 100644 index 00000000..95f82903 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_hollow_dot.svg @@ -0,0 +1,13 @@ + + + Rectangle 9 Copy 3 + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/ic_notification_down.png b/product/phone/src/main/resources/base/media/ic_notification_down.png new file mode 100644 index 0000000000000000000000000000000000000000..690ffa8c311a2ec33de3612a5f063c67758e3410 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0D$(}BbArXh)PCdzcKtX`{E?a6& zVCJ;A6^(xu$+T>kQS0)l=3uge0)t|Uz}DY$BAX5c1O#r}S{Cqv z%UWioea@159hwT8H;eY&@o6=Fymm&!Bz2?86^jiYMfJFx?EWii{x9>J2=^D;vr2zw zXD!^fGq22Oz)k!c~3>pn$p)g zpH3!z=69`%KchE){kjvI1%J%hetqZM56sLA4AF&5i(2PiwMi8@40IlYr>mdKI;Vst E09jyCt^fc4 literal 0 HcmV?d00001 diff --git a/product/phone/src/main/resources/base/media/ic_public_delete_filled.svg b/product/phone/src/main/resources/base/media/ic_public_delete_filled.svg new file mode 100644 index 00000000..9807c565 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_public_delete_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_delete_filled + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/ic_public_lock_filled.svg b/product/phone/src/main/resources/base/media/ic_public_lock_filled.svg new file mode 100644 index 00000000..66cc5da1 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_public_lock_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_lock_filled + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/ic_public_settings_filled.svg b/product/phone/src/main/resources/base/media/ic_public_settings_filled.svg new file mode 100644 index 00000000..1b0c0940 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_public_settings_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_settings_filled + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/ic_public_unlock_filled.svg b/product/phone/src/main/resources/base/media/ic_public_unlock_filled.svg new file mode 100644 index 00000000..2b301ebc --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_public_unlock_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_unlock_filled + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/ic_solid_dot.svg b/product/phone/src/main/resources/base/media/ic_solid_dot.svg new file mode 100644 index 00000000..fdc18e75 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_solid_dot.svg @@ -0,0 +1,13 @@ + + + Rectangle 9 Copy 5 + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg b/product/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg new file mode 100644 index 00000000..f0438a9a --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg b/product/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg new file mode 100644 index 00000000..173489d3 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg b/product/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg new file mode 100644 index 00000000..c703e2d0 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg b/product/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg new file mode 100644 index 00000000..cb66ccb4 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg b/product/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg new file mode 100644 index 00000000..3c796ab5 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg b/product/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg new file mode 100644 index 00000000..4d1a5bc4 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/product/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png new file mode 100644 index 0000000000000000000000000000000000000000..c37dc10f00c0b991f31faf014841cf015c33684c GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T|AsMW1 zr|r*Tauhgb>uGgStNy^P_6?#FMVve)-}~+{vHSx2h4Kqd0!I#AJEhio!_(qmL#x@T zpSs)Gn>|we64(6@yY@40Z{hx*ckd+W9d~3>abQv@U~YV{|Bgo2svr9l-`#Z7H*j|p z$T?bNrpoo>*dCL*jT+p>+6wcFo{K;E8sK7>`tR-~6V@#ovL%b(l-Ikism>KMVSRJ) zySBw!uI-`=eU~h2IPySIu!9xIT*dHZkM-7jEti*GxH;KC$A6)~_3Se#ISTXE#@cJ} z*mPF+UzlH^?zAyY$yC>*_3)C^811vZGV^m+X)fr!(|5kS@_qXL)S{J|2P9=Urpr6c z_6%iw@l)QS^ndG}6%SSQj$V2f9NMt`=J$_+8#B{w?^*gX&dgezef&j$z`ROZ$3KTk m{2!cOZ#aR06Bo+hn8VPgo36`mR;~mLZ3a(QKbLh*2~7YkC#n4a literal 0 HcmV?d00001 diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png b/product/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png new file mode 100644 index 0000000000000000000000000000000000000000..11a8958a11189755d4328343ef68453f27411739 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T*yPaTIC&-l?5c*qkBay7^*~k>r&$Ly!18Z`L!$ld*I$=K*~7KJU*Af*d#L=Z)eW|&9^-1WKCL{L`wsFSMNNuj zo;@#oKi6*J``r=D+vFAZzdX&!wO{D@!naFz?&iD0QN=Umih7i5_KI$&tpRsscd#-Q z@Yya7c<9U0nzdN6`r2Cd5~;llLuAh^iB8~VdttH5|H-oZkB+~IoGy1Fo4K|lf7aKj z-Y-~KUrcMfYxp_V_`XkZxavrqt&mjfgarZk{)LRCI6 Y|5;yC(^}(m1{fI(p00i_>zopr0MHz`#sB~S literal 0 HcmV?d00001 diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg new file mode 100644 index 00000000..3842e2ab --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg new file mode 100644 index 00000000..7829aa32 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg new file mode 100644 index 00000000..ef60272d --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a905dfc0f9c219e48db7edb5ca93b1041766f5 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g;!3HGxU+kX;q!^2X+?^QKos)S9a~60+7BevL9R^{>w;^3X z&tcIc38B^<9WJX2SbJUOI4-=R?dq7gXZz<9H|CyL=e05ZQ|h<+|7YgkRMpV3nV zx}zc3^^8>kYjoGA=EK<@@49B>=A@)`?U}M=*@1(W(3wAXhqV%sM z<);f5H`OeQzHv>={)WIo?mrH>N8z90L;+t&5DvDvqxncelwvtDnm{r-UW|#=MI2 literal 0 HcmV?d00001 diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg new file mode 100644 index 00000000..42e8b4b9 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg new file mode 100644 index 00000000..3122653c --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg @@ -0,0 +1,12 @@ + + + Public/ic_wlan + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/ic_user_portrait.svg b/product/phone/src/main/resources/base/media/ic_user_portrait.svg new file mode 100644 index 00000000..26a66b69 --- /dev/null +++ b/product/phone/src/main/resources/base/media/ic_user_portrait.svg @@ -0,0 +1,16 @@ + + + IC/ic_user_portrait + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/lock.png b/product/phone/src/main/resources/base/media/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..9163d2c95f410a497382dfb83fac1799c57baca9 GIT binary patch literal 4173 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 + + 编组 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/send.svg b/product/phone/src/main/resources/base/media/send.svg new file mode 100644 index 00000000..e3e601a1 --- /dev/null +++ b/product/phone/src/main/resources/base/media/send.svg @@ -0,0 +1,16 @@ + + + Public/ic_public_email_send + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/shutdown.svg b/product/phone/src/main/resources/base/media/shutdown.svg new file mode 100644 index 00000000..b81ff013 --- /dev/null +++ b/product/phone/src/main/resources/base/media/shutdown.svg @@ -0,0 +1,14 @@ + + + 开关 + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/unlock.png b/product/phone/src/main/resources/base/media/unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6a03806e5232a4dae1107c410d54d9a5cc2e0d GIT binary patch literal 4458 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 literal 0 HcmV?d00001 -- Gitee From 86687c6537b43ab865178481cb10ca995fdea5a5 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 27 Aug 2022 10:23:11 +0800 Subject: [PATCH 252/373] =?UTF-8?q?SystemUI=E5=BA=94=E7=94=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0TRACE=E5=92=8C=E6=95=85=E9=9A=9C=E6=89=93=E7=82=B9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- common/src/main/ets/default/event/EventManager.ts | 3 ++- .../src/main/ets/workers/PluginDataSourceWorker.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/common/src/main/ets/default/event/EventManager.ts b/common/src/main/ets/default/event/EventManager.ts index a7c2da06..b7c0e2a5 100644 --- a/common/src/main/ets/default/event/EventManager.ts +++ b/common/src/main/ets/default/event/EventManager.ts @@ -79,7 +79,8 @@ class EventManager { parameters: data.args??undefined }).then(() => { Log.showInfo(TAG, 'startAbility, then'); - WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "onclick", FAULT_ID: FaultID.META_DIAGRAM_JUMP, MSG: "jump ability failure"}) + WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "onclick" + , FAULT_ID: FaultID.META_DIAGRAM_JUMP, MSG: "jump ability failure"}) }).catch((error: BusinessError) => { Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); if (pluginType == PluginType.META) { diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index 1fb39066..dea3361b 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -91,7 +91,8 @@ parentPort.onmessageerror = function () { }; parentPort.onerror = function (data) { - WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "systemui", FAULT_ID: FaultID.WORKER_ERROR, MSG: "Abnormal occurrence"}) + WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "systemui", FAULT_ID: FaultID.WORKER_ERROR + , MSG: "Abnormal occurrence"}) Log.showError( TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); -- Gitee From 6df092960f9374ffbcd3a791c04c4c79f942d767 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 27 Aug 2022 10:40:56 +0800 Subject: [PATCH 253/373] =?UTF-8?q?SystemUI=E5=BA=94=E7=94=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0TRACE=E5=92=8C=E6=95=85=E9=9A=9C=E6=89=93=E7=82=B9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../src/main/ets/workers/PluginDataSourceWorker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index dea3361b..6110b4a2 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -91,8 +91,8 @@ parentPort.onmessageerror = function () { }; parentPort.onerror = function (data) { - WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "systemui", FAULT_ID: FaultID.WORKER_ERROR - , MSG: "Abnormal occurrence"}) + WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "systemui" + , FAULT_ID: FaultID.WORKER_ERROR, MSG: "Abnormal occurrence"}) Log.showError( TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); -- Gitee From 34be9603f5f3102cc02375c572669a7bbe0a6093 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 27 Aug 2022 10:43:46 +0800 Subject: [PATCH 254/373] =?UTF-8?q?SystemUI=E5=BA=94=E7=94=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0TRACE=E5=92=8C=E6=95=85=E9=9A=9C=E6=89=93=E7=82=B9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- common/src/main/ets/default/event/EventManager.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/common/src/main/ets/default/event/EventManager.ts b/common/src/main/ets/default/event/EventManager.ts index b7c0e2a5..bdd5462d 100644 --- a/common/src/main/ets/default/event/EventManager.ts +++ b/common/src/main/ets/default/event/EventManager.ts @@ -79,8 +79,6 @@ class EventManager { parameters: data.args??undefined }).then(() => { Log.showInfo(TAG, 'startAbility, then'); - WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "onclick" - , FAULT_ID: FaultID.META_DIAGRAM_JUMP, MSG: "jump ability failure"}) }).catch((error: BusinessError) => { Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); if (pluginType == PluginType.META) { -- Gitee From ea29981644dffca79a7ec21eef866790e7d3acc9 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 27 Aug 2022 11:16:28 +0800 Subject: [PATCH 255/373] =?UTF-8?q?SystemUI=E5=BA=94=E7=94=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0TRACE=E5=92=8C=E6=95=85=E9=9A=9C=E6=89=93=E7=82=B9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../src/main/ets/workers/PluginDataSourceWorker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index 6110b4a2..60e865ad 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -91,9 +91,9 @@ parentPort.onmessageerror = function () { }; parentPort.onerror = function (data) { - WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "systemui" - , FAULT_ID: FaultID.WORKER_ERROR, MSG: "Abnormal occurrence"}) Log.showError( TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); + WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "systemui" + , FAULT_ID: FaultID.WORKER_ERROR, MSG: "Abnormal occurrence"}); }; \ No newline at end of file -- Gitee From 6f0d83d678da987fca58bf17db3a0bdfabd53bb6 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 27 Aug 2022 11:22:36 +0800 Subject: [PATCH 256/373] =?UTF-8?q?SystemUI=E5=BA=94=E7=94=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0TRACE=E5=92=8C=E6=95=85=E9=9A=9C=E6=89=93=E7=82=B9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../src/main/ets/workers/PluginDataSourceWorker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index 60e865ad..7a02d381 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -94,6 +94,6 @@ parentPort.onerror = function (data) { Log.showError( TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); - WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "systemui" - , FAULT_ID: FaultID.WORKER_ERROR, MSG: "Abnormal occurrence"}); + WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "systemui", FAULT_ID: FaultID.WORKER_ERROR + , MSG: "Abnormal occurrence"}); }; \ No newline at end of file -- Gitee From cd6a844a88a77f78e42dcf7f53c4f519bb26236e Mon Sep 17 00:00:00 2001 From: zhangyimin Date: Sat, 27 Aug 2022 11:37:44 +0800 Subject: [PATCH 257/373] =?UTF-8?q?[ScreenLock]=E5=A2=9E=E5=8A=A0=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E5=88=A0=E9=99=A4=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangyimin --- .../com/ohos/noticeItem/model/NotificationManager.ts | 5 +++-- .../com/ohos/noticeItem/model/NotificationService.ts | 4 ++-- .../ets/com/ohos/noticeItem/viewmodel/ViewModel.ts | 10 +++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index 21876f5d..82030056 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -49,9 +49,10 @@ export default class NotificationManager { Notification.removeAll(callback); } - static remove(tag, hashCode, callback) { + static remove(tag, hashCode, callback, isClickItem?: boolean) { Log.showInfo(TAG, `remove from: ${tag}`); - Notification.remove(hashCode, callback) + var clickValue = isClickItem == true ? Notification.RemoveReason.CLICK_REASON_REMOVE : Notification.RemoveReason.CANCEL_REASON_REMOVE; + Notification.remove(hashCode, clickValue, callback); } static getAllActiveNotifications(tag, callback) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index 37f84f42..41b8c6f0 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -59,10 +59,10 @@ export class NotificationService { }); } - public remove(code: string) { + public remove(code: string, isClickItem?: boolean) { NotificationManager.remove(TAG, code, (data) => { Log.showInfo(TAG, `removeNotificationItem ==> data: ${JSON.stringify(data)}`); - }) + }, isClickItem); } public loadAllNotifications() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index 5e252349..feebea1d 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -208,7 +208,7 @@ export class ViewModel { this.updateNotification() } - removeNotificationItem(itemData, isDelSysConent) { + removeNotificationItem(itemData, isDelSysConent, isClickItem?: boolean) { Log.showDebug(TAG, `removeNotificationItem, hashcode: ${itemData.hashcode}`); for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].hashcode == itemData.hashcode) { @@ -223,7 +223,7 @@ export class ViewModel { } this.updateNotification(); if (isDelSysConent) { - this.removeSysNotificationItem(itemData.hashcode); + this.removeSysNotificationItem(itemData.hashcode, isClickItem); } AppStorage.Delete(Constants.KEY_INPUT + itemData.id); } @@ -250,15 +250,15 @@ export class ViewModel { this.updateNotification(); } - removeSysNotificationItem(hashcode) { - NotificationService.remove(hashcode); + removeSysNotificationItem(hashcode, isClickItem?: boolean) { + NotificationService.remove(hashcode, isClickItem); } clickItem(itemData, want?: any) { Log.showDebug(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}`); NotificationWindowManager.hideNotificationWindow(); CommonUtil.startWant((want) ? want : itemData.want); - this.removeNotificationItem(itemData, true); + this.removeNotificationItem(itemData, true, true); } clickReply(inputKey, content, want) { -- Gitee From a278cb3f48e66b82bf8d0babdabe8778fcff7787 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 27 Aug 2022 11:38:01 +0800 Subject: [PATCH 258/373] =?UTF-8?q?SystemUI=E5=BA=94=E7=94=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0TRACE=E5=92=8C=E6=95=85=E9=9A=9C=E6=89=93=E7=82=B9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- common/src/main/ets/default/SysFaultLogger.ts | 4 ++-- common/src/main/ets/default/event/EventManager.ts | 4 ++-- .../main/ets/com/ohos/noticeItem/model/NotificationService.ts | 4 ++-- .../src/main/ets/workers/PluginDataSourceWorker.js | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/common/src/main/ets/default/SysFaultLogger.ts b/common/src/main/ets/default/SysFaultLogger.ts index 7f663317..dd27b8c1 100644 --- a/common/src/main/ets/default/SysFaultLogger.ts +++ b/common/src/main/ets/default/SysFaultLogger.ts @@ -27,7 +27,7 @@ export enum FaultID { NOTIFICATION_ADD = "FAILED_NOTIFICATION_ADD" } -export function WriteFaultLog(logParam: object) { +export function writeFaultLog(logParam: object) { const sysEventInfo = { domain: APP_DOMAIN, name: APP_LOG_NAME, @@ -49,7 +49,7 @@ export function SysFaultLogger(logParam: object) { originalFunc.apply(this, args); } catch (err: any) { Log.showInfo(TAG, "catch error in execute: " + propertyKey); - WriteFaultLog(logParam); + writeFaultLog(logParam); } }; }; diff --git a/common/src/main/ets/default/event/EventManager.ts b/common/src/main/ets/default/event/EventManager.ts index bdd5462d..8c257105 100644 --- a/common/src/main/ets/default/event/EventManager.ts +++ b/common/src/main/ets/default/event/EventManager.ts @@ -20,7 +20,7 @@ import { EventParser, START_ABILITY_EVENT, Event, LocalEvent } from "./EventUtil import { Callback, createEventBus, EventBus } from "./EventBus"; import { BusinessError } from 'basic'; import {PluginType} from "../../plugindatasource/common/Constants"; -import {WriteFaultLog, FaultID} from '../SysFaultLogger'; +import {writeFaultLog, FaultID} from '../SysFaultLogger'; export type unsubscribe = () => void; export type Events = string | string[]; @@ -82,7 +82,7 @@ class EventManager { }).catch((error: BusinessError) => { Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); if (pluginType == PluginType.META) { - WriteFaultLog({TARGET_API:data.bundleName, FAULT_ID: FaultID.META_DIAGRAM_JUMP, MSG: "jump ability failure"}) + writeFaultLog({TARGET_API:data.bundleName, FAULT_ID: FaultID.META_DIAGRAM_JUMP, MSG: "jump ability failure"}) } }); return true; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index f05ee0f4..be0b5b87 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -21,7 +21,7 @@ import CommonUtil from '../common/CommonUtil'; import createOrGet from '../../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; import DistributionManager from './NotificationDistributionManager'; import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import {WriteFaultLog, FaultID} from '../../../../../../../../../common/src/main/ets/default/SysFaultLogger'; +import {writeFaultLog, FaultID} from '../../../../../../../../../common/src/main/ets/default/SysFaultLogger'; const TAG = 'NotificationService'; @@ -106,7 +106,7 @@ export class NotificationService { }); }); }).catch((errorInfo) => { - WriteFaultLog({CORE_SYSTEM: request.creatorBundleName, TARGET_API: "add", FAULT_ID: FaultID.META_DIAGRAM_JUMP + writeFaultLog({CORE_SYSTEM: request.creatorBundleName, TARGET_API: "add", FAULT_ID: FaultID.META_DIAGRAM_JUMP , MSG: "Failed to handle notification addition"}) Log.showError(TAG, `error: ${JSON.stringify(errorInfo)}`) }); diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index 7a02d381..e5046dd9 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -17,7 +17,7 @@ import worker from '@ohos.worker'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; -import {WriteFaultLog, FaultID} from '../../../../../../../common/src/main/ets/default/SysFaultLogger'; +import {writeFaultLog, FaultID} from '../../../../../../../common/src/main/ets/default/SysFaultLogger'; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; @@ -94,6 +94,6 @@ parentPort.onerror = function (data) { Log.showError( TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); - WriteFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "systemui", FAULT_ID: FaultID.WORKER_ERROR + writeFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "systemui", FAULT_ID: FaultID.WORKER_ERROR , MSG: "Abnormal occurrence"}); }; \ No newline at end of file -- Gitee From baeadb55d6e0329b88e484f47e34bd290f6f87cb Mon Sep 17 00:00:00 2001 From: zhangyimin Date: Mon, 29 Aug 2022 10:39:56 +0800 Subject: [PATCH 259/373] =?UTF-8?q?[ScreenLock]=E4=BF=AE=E5=A4=8D=E5=9C=A8?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=B8=AD=E5=88=87=E6=8D=A2=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=97=B6=E9=94=81=E5=B1=8F=E9=9C=B2=E5=87=BA=E6=A1=8C=E9=9D=A2?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangyimin --- README.md | 23 ------------------- .../pc/src/main/ets/pages/slidescreenlock.ets | 1 + .../main/resources/base/element/color.json | 4 ++++ .../src/main/ets/pages/slidescreenlock.ets | 1 + .../main/resources/base/element/color.json | 4 ++++ 5 files changed, 10 insertions(+), 23 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 6f440021..00000000 --- a/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# OpenHarmony_desktop_application - - - -**黄区对应分支** - -openharmony/gitee_build_wagner_master_mirror_dev - - - -**对应仓库:** - -锁屏/screenlock - -系统UI/systemui - -桌面/launcher - - - -**相关committer:** - -苏鹏 00565270,倪茂森 00564676,杨鹏 00464702 \ No newline at end of file diff --git a/product/pc/src/main/ets/pages/slidescreenlock.ets b/product/pc/src/main/ets/pages/slidescreenlock.ets index 879ceeb2..f3f442e5 100644 --- a/product/pc/src/main/ets/pages/slidescreenlock.ets +++ b/product/pc/src/main/ets/pages/slidescreenlock.ets @@ -60,6 +60,7 @@ export default struct SlideScreenlock { Wallpaper() } } + .backgroundColor($r('app.color.screenlock_backgroundcolor')) .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) .scale({ diff --git a/product/pc/src/main/resources/base/element/color.json b/product/pc/src/main/resources/base/element/color.json index 3abcaac3..3e4d76d0 100644 --- a/product/pc/src/main/resources/base/element/color.json +++ b/product/pc/src/main/resources/base/element/color.json @@ -119,6 +119,10 @@ { "name": "font_color_white", "value": "#fff" + }, + { + "name": "screenlock_backgroundcolor", + "value": "#000000" } ] } \ No newline at end of file diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets index 808b76e2..ea71598f 100644 --- a/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -58,6 +58,7 @@ export default struct SlideScreenlock { Wallpaper() } } + .backgroundColor($r('app.color.screenlock_backgroundcolor')) .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) .scale({ diff --git a/product/phone/src/main/resources/base/element/color.json b/product/phone/src/main/resources/base/element/color.json index 3abcaac3..3e4d76d0 100644 --- a/product/phone/src/main/resources/base/element/color.json +++ b/product/phone/src/main/resources/base/element/color.json @@ -119,6 +119,10 @@ { "name": "font_color_white", "value": "#fff" + }, + { + "name": "screenlock_backgroundcolor", + "value": "#000000" } ] } \ No newline at end of file -- Gitee From 68a4f4f93b8a178a5bdd77e3e776aa8693054a17 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Mon, 29 Aug 2022 11:38:59 +0800 Subject: [PATCH 260/373] Modify variable names Signed-off-by: xuchangzhou --- .../ohos/noticeItem/view/item/SwipeLayout.ets | 28 +++++++++---------- .../ohos/noticeItem/view/item/groupItem.ets | 2 +- .../noticeItem/view/item/notificationItem.ets | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets index 24c41403..92342e7b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets @@ -34,7 +34,7 @@ export default struct SwipeLayout { //需要配置项 - id: string = 'id default';//需要配置 + swipeLayoutId: string = 'id default';//需要配置 bottomLeftWidth: number = 0;//需要配置 bottomRightWidth: number = 0;//需要配置 leftThreshold: number = 0;//需要配置 @@ -50,7 +50,7 @@ export default struct SwipeLayout { @State bottomLeftX: number = 0; @State deleteCenterX: number = 0; @State rotateAngel: number = 0; - @State scale: number = 1; + @State deleteButtonScale: number = 1; @State surfaceOpacity: number = 1; @State bottomLeftOpacity: number = 0;//透明度默认值为0 @State bottomRightOpacity: number = 0;//透明度默认值为0 @@ -101,7 +101,7 @@ export default struct SwipeLayout { aboutToDisappear(){ Log.showInfo(TAG, `aboutToDisappear`); - FocusCallBack.deleteCallback(this.id); + FocusCallBack.deleteCallback(this.swipeLayoutId); } build(){ @@ -148,8 +148,8 @@ export default struct SwipeLayout { .width(Layout.BUTTON_SIZE) .height(Layout.BUTTON_SIZE) .scale({ - x: this.scale, - y: this.scale, + x: this.deleteButtonScale, + y: this.deleteButtonScale, z: 1, centerX: '50%', centerY: '50%' @@ -168,7 +168,7 @@ export default struct SwipeLayout { .width('100%') .onTouch( (touchEvent: TouchEvent) => { if (touchEvent.type == TouchType.Down) {//eventCaptureFlag - if(this.registerEventCapture != null && this.registerEventCapture(this.id)){ + if(this.registerEventCapture != null && this.registerEventCapture(this.swipeLayoutId)){ this.eventCaptureFlag = false;//使用标志位,实现该部分逻辑只在down中执行一次 return;//表示询问过父组件后,如果该事件由父组件消费, 则本组件不会继续执行以后的逻辑。 如果上层的各级父组件都不消费,那么就由本组件消费 } @@ -182,13 +182,13 @@ export default struct SwipeLayout { this.startY = touchEvent.touches[0].screenY; this.lastTouchX = touchEvent.touches[0].screenX;//上一次move的坐标,用于计算增量 if (!AppStorage.Has('swipelayout')) { - AppStorage.SetOrCreate('swipelayout', this.id);//通过加appstorage的校验,可以防止嵌套使用时父组件由于阻止冒泡事件失效而触发滑动 + AppStorage.SetOrCreate('swipelayout', this.swipeLayoutId);//通过加appstorage的校验,可以防止嵌套使用时父组件由于阻止冒泡事件失效而触发滑动 } } else if (touchEvent.type == TouchType.Move) { if(this.eventCaptureFlag == false){ return;//本控件不消费该事件,因此不执行move中的逻辑 } - if (AppStorage.Get('swipelayout') != this.id){//只有匹配的id才允许被滑动,防止嵌套使用时父组件由于阻止冒泡事件失效而触发滑动 + if (AppStorage.Get('swipelayout') != this.swipeLayoutId){//只有匹配的id才允许被滑动,防止嵌套使用时父组件由于阻止冒泡事件失效而触发滑动 return; } //如果有子组件被touch,那么父组件开头的就返回 @@ -196,7 +196,7 @@ export default struct SwipeLayout { this.responseSwipeEvent = (Math.abs(touchEvent.touches[0].screenX - this.startX) > Math.abs(touchEvent.touches[0].screenY - this.startY));//如果x方向移动较多(这里取四十五度为分界),那么就认为响应左滑 this.angelCalFlag = true; //改变角度标志位, 表示角度已经判断过了,之后无需重复判断 - FocusCallBack.setCallback(this.id, this.loseFocusCallback.bind(this));//将上一次滑动的控件弹回 + FocusCallBack.setCallback(this.swipeLayoutId, this.loseFocusCallback.bind(this));//将上一次滑动的控件弹回 } if(this.responseSwipeEvent == false) { return; @@ -212,7 +212,7 @@ export default struct SwipeLayout { //是否整体进入屏幕 if(this.bottomLeftX > this.rightThreshold){//1、在右侧阈值的右侧,即底层的图标尚未完全进入屏幕 ----|左侧阈值|-------|右侧阈值| --here-- this.rotateAngel = 0; - this.scale = 1; + this.deleteButtonScale = 1; this.deleteCenterX = this.bottomLeftX + this.bottomLeftWidth + Layout.BUTTON_SIZE/2; } else if (this.bottomLeftX > this.leftThreshold && this.bottomLeftX < this.rightThreshold) {//2、在左侧和右侧阈值的内,需要对边界值做处理 ----|左侧阈值|----here---|右侧阈值| ---- if(this.bottomLeftOpacity == 0){//如果是在左侧阈值,且向右滑动,那么就需要显示其余按钮 @@ -226,13 +226,13 @@ export default struct SwipeLayout { this.bottomLeftWidthMoving = (this.rightThreshold - this.bottomLeftX) * (1 - this.rateDelete) + this.bottomLeftWidth; this.deleteCenterX = this.bottomLeftX + this.bottomLeftWidthMoving + Layout.BUTTON_SIZE/2; this.rotateAngel = 12 - 12 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); - this.scale = 1.05 - 0.05 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); + this.deleteButtonScale = 1.05 - 0.05 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); }) } else {//在非突变处,那么就跟手 this.bottomLeftWidthMoving = (this.rightThreshold - this.bottomLeftX) * (1 - this.rateDelete) + this.bottomLeftWidth; this.deleteCenterX = this.bottomLeftX + this.bottomLeftWidthMoving + Layout.BUTTON_SIZE/2; this.rotateAngel = 12 - 12 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); - this.scale = 1.05 - 0.05 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); + this.deleteButtonScale = 1.05 - 0.05 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); } } else {//3. 小于最左边的阈值 --here--|左侧阈值|-------|右侧阈值| ---- @@ -246,7 +246,7 @@ export default struct SwipeLayout { this.bottomLeftOpacity = 0; this.deleteCenterX = (this.bottomLeftX + this.surfaceWidth)/2; this.rotateAngel = 17; - this.scale = 1.2; + this.deleteButtonScale = 1.2; }) } else { this.deleteCenterX = (this.bottomLeftX + this.surfaceWidth)/2; @@ -262,7 +262,7 @@ export default struct SwipeLayout { return; } if(this.bottomLeftX > this.rightThreshold){//在阈值2右侧,尚未完全进入屏幕 - FocusCallBack.deleteCallback(this.id) + FocusCallBack.deleteCallback(this.swipeLayoutId) animateTo({ duration: 200, curve: Curve.Friction, diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 91a97c1e..f9b726c0 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -136,7 +136,7 @@ export default struct GroupItem { build() { Column(){ SwipeLayout({ - id: getId(this.groupData[0], true), + swipeLayoutId: getId(this.groupData[0], true), bottomLeftWidth: 80,//可调参 bottomRightWidth: 60,//可调参 leftThreshold: 100,//可调参 diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 50e0c7e0..5635e89c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -64,7 +64,7 @@ export default struct NotificationItem { build() { Column(){ SwipeLayout({ - id: getId(this.itemData, false), + swipeLayoutId: getId(this.itemData, false), bottomLeftWidth: 80, bottomRightWidth: 60, leftThreshold: 100, -- Gitee From 0ec97eaec99de9fc03c49961afa93165dc401d1a Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Mon, 29 Aug 2022 17:22:32 +0800 Subject: [PATCH 261/373] =?UTF-8?q?SystemUI=E4=BA=AE=E5=BA=A6=E6=9D=A1?= =?UTF-8?q?=E5=92=8C=E4=BD=8D=E7=BD=AE=E4=BF=A1=E6=81=AF=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../src/main/ets/default/brightnessManager.ts | 7 +------ .../ControlCenterSimpleToggleLocationComponent.ets | 9 ++++----- .../src/main/ets/com/ohos/viewmodel/LocationVM.ts | 11 ++++++----- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index 8c2489c2..4aafb1e8 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -66,12 +66,7 @@ export class brightnessManager { let value = parseInt(callback.value); Log.showInfo(TAG, `setValue ${value}`); mBrightnessValue.set(value); - if(sliderChangeMode === this.SLIDER_CHANG_MODE_MOVING){ - Brightness.setValue(callback.value); - }else{ - settings.setValueSync(this.helper, SYSTEMUI_BRIGHTNESS, callback.value.toString()); - Log.showInfo(TAG, `settings setValue ${callback.value} end`); - } + Brightness.setValue(callback.value); } getMin(){ diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets index f19825cd..42cd97af 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets @@ -29,12 +29,11 @@ export default struct ControlCenterSimpleToggleLocationComponent { private mDragMode: boolean = false; @State mIcon: Resource = $r("app.media.ic_controlcenter_gps"); @State mLabel: Resource = $r("app.string.control_center_complex_toggle_location_title"); - @State mLocationData: LocationData = new LocationData(); + @StorageLink('LocationVM_LocationData') LocationStatus: boolean = false aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); ViewModel.initViewModel(); - this.mLocationData = ViewModel.getLocationData(); } aboutToDisappear() { @@ -45,7 +44,7 @@ export default struct ControlCenterSimpleToggleLocationComponent { SimpleToggleBase({ mToggleId: this.keyId, mIcon: $mIcon, - mChangeSwitch: this.mLocationData.isEnabled, + mChangeSwitch: this.LocationStatus, mLabel: $mLabel, mEditMode: this.mEditMode, mDragMode: this.mDragMode, @@ -55,8 +54,8 @@ export default struct ControlCenterSimpleToggleLocationComponent { } mClickEvent() { - Log.showDebug(TAG, `mClickEvent, isEnabled: ${this.mLocationData.isEnabled}`); - if (this.mLocationData.isEnabled) { + Log.showDebug(TAG, `mClickEvent, isEnabled: ${this.LocationStatus}`); + if (this.LocationStatus) { ViewModel.disableLocation(); } else { ViewModel.enableLocation(); diff --git a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts index 1ed90cf0..2e769480 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts @@ -14,6 +14,7 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import SwitchUserManager from '../../../../../../../../common/src/main/ets/default/SwitchUserManager'; import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; import { TintContentInfo, getOrCreateTintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager'; @@ -28,6 +29,7 @@ export class LocationVM { mLocationData: LocationData = { ...new LocationData() }; + mLocationStatus:SubscribedAbstractProperty; mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.LOCATION); constructor() { @@ -40,19 +42,18 @@ export class LocationVM { }; Log.showInfo(TAG, 'initViewModel '); this.mIsStart = true; - this.mLocationData = AppStorage.SetAndLink(TAG + '_LocationData', this.mLocationData).get(); + SwitchUserManager.getInstance().registerListener(this); LocationService.registerListener(this); LocationService.startService(); } - getLocationData(): LocationData { - Log.showDebug(TAG, 'getLocationData'); - return this.mLocationData; + userChange():void{ + LocationService.getServiceState() } updateServiceState(state: boolean): void { Log.showInfo(TAG, `updateServiceState, state: ${state} `); - this.mLocationData.isEnabled = state; + AppStorage.SetOrCreate(TAG + '_LocationData', state) } enableLocation(): void { -- Gitee From 21d47ad864e2fff01f8127528060701a142494f7 Mon Sep 17 00:00:00 2001 From: lizhi Date: Mon, 29 Aug 2022 18:10:52 +0800 Subject: [PATCH 262/373] =?UTF-8?q?[systemui]=E4=BF=AE=E5=A4=8DSwipeLayout?= =?UTF-8?q?=E7=9A=84position=E5=B1=9E=E6=80=A7=E5=AF=BC=E8=87=B4=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E9=87=8D=E5=8F=A0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../ohos/noticeItem/view/item/SwipeLayout.ets | 126 +++++++++--------- .../ohos/noticeItem/view/item/groupItem.ets | 9 +- .../view/item/iconListComponent.ets | 4 +- .../noticeItem/view/item/notificationItem.ets | 1 - 4 files changed, 70 insertions(+), 70 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets index 92342e7b..49d93350 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets @@ -23,37 +23,35 @@ const TAG = 'SwipeLayout'; export default struct SwipeLayout { angelCalFlag: boolean = false; responseSwipeEvent: boolean = false; - surfaceWidth: number = -1;//通过获取当前控件宽度而获得 - rightThreshold: number = 0;//通过bottom控件的总宽度计算得出 + surfaceWidth: number = -1; + rightThreshold: number = 0; startX: number = 0; startY: number = 0; lastTouchX: number = 0; - rateSurface: number = 1/1.3;//跟手 - rateDelete: number = 1/6;//右侧删除图标移动比例 - eventCaptureFlag: boolean = true;//false代表控件不消费该事件,true代表所有其他情况 + rateSurface: number = 1/1.3; + rateDelete: number = 1/6; + eventCaptureFlag: boolean = true; + swipeLayoutId: string = 'id default'; + bottomLeftWidth: number = 0; + bottomRightWidth: number = 0; + leftThreshold: number = 0; + bottomHeight: number = 92; + deleteButtonCallback: any; + @BuilderParam SurfaceComponent?: () => void; + @BuilderParam BottomLeftComponent?: () => void; + registerEventCapture: (id: string) => boolean = null; - //需要配置项 - swipeLayoutId: string = 'id default';//需要配置 - bottomLeftWidth: number = 0;//需要配置 - bottomRightWidth: number = 0;//需要配置 - leftThreshold: number = 0;//需要配置 - bottomHeight: number = 92;//需要配置,与外层的其他图标控件的高度保持一致 - deleteButtonCallback: any;// 需要配置 - @BuilderParam SurfaceComponent?: () => void;//需要配置 - @BuilderParam BottomLeftComponent?: () => void;//需要配置。根据UX设计,删除图标时固定的,其他图标要可配置,故这里采用由上层控件传入要配置的图标 - registerEventCapture: (id: string) => boolean = null;//需要配置 注入父组件的事件捕获逻辑 - - //页面位置position坐标、透明度、宽高等状态变量 + // Page offset, opacity, width height status variable. @State overallX: number = 0; @State surfaceX: number = 0; @State bottomLeftX: number = 0; - @State deleteCenterX: number = 0; + @State deleteLeftX: number = 0; @State rotateAngel: number = 0; @State deleteButtonScale: number = 1; @State surfaceOpacity: number = 1; - @State bottomLeftOpacity: number = 0;//透明度默认值为0 - @State bottomRightOpacity: number = 0;//透明度默认值为0 + @State bottomLeftOpacity: number = 0; + @State bottomRightOpacity: number = 0; @State bottomLeftWidthMoving: number = 0; initState(): void{ @@ -61,7 +59,7 @@ export default struct SwipeLayout { this.bottomLeftWidthMoving = this.bottomLeftWidth; this.surfaceX = 0; this.bottomLeftX = 0 + this.surfaceWidth; - this.deleteCenterX = 0 + this.surfaceWidth + this.bottomLeftWidth + Layout.BUTTON_SIZE/2; + this.deleteLeftX = 0 + this.surfaceWidth + this.bottomLeftWidth; this.surfaceOpacity = 1;; this.bottomLeftOpacity = 1;; this.bottomRightOpacity = 1;; @@ -113,7 +111,7 @@ export default struct SwipeLayout { } .zIndex(1) .width('100%') - .position({ x: this.surfaceX }) + .offset({ x: this.surfaceX }) .opacity(this.surfaceOpacity) //Bottom Left Component @@ -123,7 +121,7 @@ export default struct SwipeLayout { .justifyContent(FlexAlign.Center) .width(this.bottomLeftWidthMoving) .opacity(this.bottomLeftOpacity) - .position({ x: this.bottomLeftX }) + .offset({ x: this.bottomLeftX - this.surfaceWidth }) .zIndex(0) Row(){ @@ -159,63 +157,64 @@ export default struct SwipeLayout { .width(Layout.BUTTON_SIZE) .height(this.bottomHeight) .clip(false) - .markAnchor({ x: Layout.BUTTON_SIZE/2}) - .position({ x: this.deleteCenterX }) + .offset({ x: this.deleteLeftX - this.surfaceWidth - this.bottomLeftWidthMoving }) } .width('100%') - .position({ x: this.overallX }) + .offset({ x: this.overallX }) } .width('100%') .onTouch( (touchEvent: TouchEvent) => { - if (touchEvent.type == TouchType.Down) {//eventCaptureFlag + if (touchEvent.type == TouchType.Down) { if(this.registerEventCapture != null && this.registerEventCapture(this.swipeLayoutId)){ - this.eventCaptureFlag = false;//使用标志位,实现该部分逻辑只在down中执行一次 - return;//表示询问过父组件后,如果该事件由父组件消费, 则本组件不会继续执行以后的逻辑。 如果上层的各级父组件都不消费,那么就由本组件消费 + // If the event is consumed by the parent component, the component does not proceed with subsequent logic. + // If none of the parent components at the upper level consume it, the component consumes it. + this.eventCaptureFlag = false; + return; } if(this.surfaceWidth == -1){ - this.surfaceWidth = Number(touchEvent.target.area.width)//获取父组件的宽度,然后对滑动动效中所用的尺寸数据进行初始化 - this.initState() + this.surfaceWidth = Number(touchEvent.target.area.width); + this.initState(); } - this.responseSwipeEvent = false;//初始化标记,是否响应滑动事件 - this.angelCalFlag = false;//初始化角度判断的标记 - this.startX = touchEvent.touches[0].screenX;//记录下手指落下时的坐标 + this.responseSwipeEvent = false; + this.angelCalFlag = false; // Angle judgment flag bit + this.startX = touchEvent.touches[0].screenX; this.startY = touchEvent.touches[0].screenY; - this.lastTouchX = touchEvent.touches[0].screenX;//上一次move的坐标,用于计算增量 + this.lastTouchX = touchEvent.touches[0].screenX; if (!AppStorage.Has('swipelayout')) { - AppStorage.SetOrCreate('swipelayout', this.swipeLayoutId);//通过加appstorage的校验,可以防止嵌套使用时父组件由于阻止冒泡事件失效而触发滑动 + // By adding Appstorage verification, you can prevent the parent component from sliding when the nesting is used because the prevent bubbling event fails. + AppStorage.SetOrCreate('swipelayout', this.swipeLayoutId); } } else if (touchEvent.type == TouchType.Move) { if(this.eventCaptureFlag == false){ - return;//本控件不消费该事件,因此不执行move中的逻辑 + return; } - if (AppStorage.Get('swipelayout') != this.swipeLayoutId){//只有匹配的id才允许被滑动,防止嵌套使用时父组件由于阻止冒泡事件失效而触发滑动 + if (AppStorage.Get('swipelayout') != this.swipeLayoutId){ return; } - //如果有子组件被touch,那么父组件开头的就返回 if(this.angelCalFlag == false){ - this.responseSwipeEvent = (Math.abs(touchEvent.touches[0].screenX - this.startX) > Math.abs(touchEvent.touches[0].screenY - this.startY));//如果x方向移动较多(这里取四十五度为分界),那么就认为响应左滑 - this.angelCalFlag = true; //改变角度标志位, 表示角度已经判断过了,之后无需重复判断 + this.responseSwipeEvent = (Math.abs(touchEvent.touches[0].screenX - this.startX) > Math.abs(touchEvent.touches[0].screenY - this.startY)); + this.angelCalFlag = true; - FocusCallBack.setCallback(this.swipeLayoutId, this.loseFocusCallback.bind(this));//将上一次滑动的控件弹回 + FocusCallBack.setCallback(this.swipeLayoutId, this.loseFocusCallback.bind(this)); } if(this.responseSwipeEvent == false) { return; } - //走到这里,角度判断过了,响应左滑也判断过了,那么先阻塞滑动事件传递,只让自己消费 - touchEvent.stopPropagation();//bug:这里阻塞事件传递的逻辑没有用,父组件还是会收到,故用storage配合组件id判断子组件是否被滑动 + touchEvent.stopPropagation(); - //计算跟手距离 - let followHand = this.rateSurface * (touchEvent.touches[0].screenX - this.lastTouchX);//根据跟手系数计算出的surface应该改移动的距离,为增量距离 + // Calculate the distance following your finger. + let followHand = this.rateSurface * (touchEvent.touches[0].screenX - this.lastTouchX); this.surfaceX = this.surfaceX + followHand; this.bottomLeftX = this.bottomLeftX + followHand; - //是否整体进入屏幕 - if(this.bottomLeftX > this.rightThreshold){//1、在右侧阈值的右侧,即底层的图标尚未完全进入屏幕 ----|左侧阈值|-------|右侧阈值| --here-- + if(this.bottomLeftX > this.rightThreshold){ + // 1. To the right of the right threshold, the underlying icon has not yet fully entered the screen this.rotateAngel = 0; this.deleteButtonScale = 1; - this.deleteCenterX = this.bottomLeftX + this.bottomLeftWidth + Layout.BUTTON_SIZE/2; - } else if (this.bottomLeftX > this.leftThreshold && this.bottomLeftX < this.rightThreshold) {//2、在左侧和右侧阈值的内,需要对边界值做处理 ----|左侧阈值|----here---|右侧阈值| ---- - if(this.bottomLeftOpacity == 0){//如果是在左侧阈值,且向右滑动,那么就需要显示其余按钮 + this.deleteLeftX = this.bottomLeftX + this.bottomLeftWidth; + } else if (this.bottomLeftX > this.leftThreshold && this.bottomLeftX < this.rightThreshold) { + // 2. Within the threshold on the left and the threshold on the right + if(this.bottomLeftOpacity == 0){ animateTo({ duration: 200, curve: Curve.Friction, @@ -224,19 +223,20 @@ export default struct SwipeLayout { }, () => { this.bottomLeftOpacity = 1; this.bottomLeftWidthMoving = (this.rightThreshold - this.bottomLeftX) * (1 - this.rateDelete) + this.bottomLeftWidth; - this.deleteCenterX = this.bottomLeftX + this.bottomLeftWidthMoving + Layout.BUTTON_SIZE/2; + this.deleteLeftX = this.bottomLeftX + this.bottomLeftWidthMoving; this.rotateAngel = 12 - 12 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); this.deleteButtonScale = 1.05 - 0.05 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); }) - } else {//在非突变处,那么就跟手 + } else { this.bottomLeftWidthMoving = (this.rightThreshold - this.bottomLeftX) * (1 - this.rateDelete) + this.bottomLeftWidth; - this.deleteCenterX = this.bottomLeftX + this.bottomLeftWidthMoving + Layout.BUTTON_SIZE/2; + this.deleteLeftX = this.bottomLeftX + this.bottomLeftWidthMoving; this.rotateAngel = 12 - 12 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); this.deleteButtonScale = 1.05 - 0.05 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); } - } else {//3. 小于最左边的阈值 --here--|左侧阈值|-------|右侧阈值| ---- - if (this.bottomLeftOpacity == 1){// 如果是在向左滑动,那么就需要隐藏掉其余按钮 + } else { + // 3. Less than the leftmost threshold + if (this.bottomLeftOpacity == 1){ animateTo({ duration: 200, curve: Curve.Friction, @@ -244,24 +244,24 @@ export default struct SwipeLayout { }, }, () => { this.bottomLeftOpacity = 0; - this.deleteCenterX = (this.bottomLeftX + this.surfaceWidth)/2; + this.deleteLeftX = (this.bottomLeftX + this.surfaceWidth)/2 - this.deleteButtonScale * Layout.BUTTON_SIZE/2; this.rotateAngel = 17; this.deleteButtonScale = 1.2; }) } else { - this.deleteCenterX = (this.bottomLeftX + this.surfaceWidth)/2; + this.deleteLeftX = (this.bottomLeftX + this.surfaceWidth)/2 - this.deleteButtonScale * Layout.BUTTON_SIZE/2; } } this.lastTouchX = touchEvent.touches[0].screenX; } else if (touchEvent.type == TouchType.Up) { - this.eventCaptureFlag = true;//将标志位置为true,默认控件响应滑动 - AppStorage.Delete('swipelayout');//删除该字段,这样group会有左滑的机会 + this.eventCaptureFlag = true; + AppStorage.Delete('swipelayout'); if(this.responseSwipeEvent == false) { return; } - if(this.bottomLeftX > this.rightThreshold){//在阈值2右侧,尚未完全进入屏幕 + if(this.bottomLeftX > this.rightThreshold){ FocusCallBack.deleteCallback(this.swipeLayoutId) animateTo({ duration: 200, @@ -271,7 +271,7 @@ export default struct SwipeLayout { }, () => { this.surfaceX = 0; this.bottomLeftX = 0 + this.surfaceWidth; - this.deleteCenterX = 0 + this.surfaceWidth + this.bottomLeftWidth + Layout.BUTTON_SIZE/2;// 垃圾桶控件左侧x坐标 + this.deleteLeftX = 0 + this.surfaceWidth + this.bottomLeftWidth; }) } else if (this.bottomLeftX > this.leftThreshold && this.bottomLeftX < this.rightThreshold) { animateTo({ @@ -282,7 +282,7 @@ export default struct SwipeLayout { }, () => { this.bottomLeftOpacity = 1; this.bottomLeftX = this.rightThreshold; - this.deleteCenterX = this.bottomLeftX + this.bottomLeftWidth + Layout.BUTTON_SIZE/2; + this.deleteLeftX = this.bottomLeftX + this.bottomLeftWidth; this.surfaceX = this.bottomLeftX - this.surfaceWidth; this.bottomLeftWidthMoving = this.bottomLeftWidth; this.rotateAngel = 0; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index f9b726c0..0e2b21a2 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -137,10 +137,10 @@ export default struct GroupItem { Column(){ SwipeLayout({ swipeLayoutId: getId(this.groupData[0], true), - bottomLeftWidth: 80,//可调参 - bottomRightWidth: 60,//可调参 - leftThreshold: 100,//可调参 - bottomHeight: 92,//可调参 + bottomLeftWidth: 80, + bottomRightWidth: 60, + leftThreshold: 100, + bottomHeight: 92, deleteButtonCallback: this.deleteButtonCallback.bind(this), SurfaceComponent: this.SurfaceComponent.bind(this), BottomLeftComponent: this.BottomLeftComponent.bind(this), @@ -148,7 +148,6 @@ export default struct GroupItem { }) } .width(Constants.FULL_CONTAINER_WIDTH) - .height(this.toExpand ? this.groupData.length * 93 - 1 + 42 : 92)//bug: 在swipelayout中使用position属性,若此处不指定高度值,使用了position属性的swipelayout无法正常显示。 .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) .clip(true) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets index af4b2dc7..5994a0ac 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -143,7 +143,7 @@ export struct BottomLeftItem { }); build(){ - Flex({justifyContent: FlexAlign.SpaceEvenly, alignItems: ItemAlign.Center}) { + Row() { Button({ type: ButtonType.Circle, stateEffect: true }) { Image($r("app.media.ic_public_settings_filled")) .objectFit(ImageFit.Contain) @@ -157,5 +157,7 @@ export struct BottomLeftItem { .height(Layout.BUTTON_SIZE) } .height(this.height) + .justifyContent(FlexAlign.SpaceEvenly) + .alignItems(VerticalAlign.Center) } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 5635e89c..6cc022e3 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -76,7 +76,6 @@ export default struct NotificationItem { }) } .width(this.itemWidth) - .height(92)//bug: 在子控件swipelayout中使用position属性,若此处不指定高度值,使用了position属性的swipelayout无法正常显示。 .borderRadius(!this.isSubItem ? $r("sys.float.ohos_id_corner_radius_default_l") : 0) .clip(!this.isSubItem) } -- Gitee From 8bd8a2767d679bf33446fddd73cc63b731dd954a Mon Sep 17 00:00:00 2001 From: lizhi Date: Wed, 31 Aug 2022 17:01:50 +0800 Subject: [PATCH 263/373] =?UTF-8?q?[systemui]=E4=BF=AE=E5=A4=8D=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E5=AF=BC=E8=88=AA=E9=94=AEcrash=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts | 5 ----- .../main/ets/com/ohos/navigationservice/common/constants.ts | 2 -- 2 files changed, 7 deletions(-) diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts index d78b50cf..2a61e6a4 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts @@ -101,11 +101,6 @@ export class KeyCodeEvent { commonEvent.publish('CREATE_RECENT_WINDOW_EVENT', (err, data) => { Log.showInfo(TAG, `publish launcher err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); }); - - AbilityManager.startAbility({ - bundleName: Constants.RECENT_BUNDLE_NAME, - abilityName: Constants.RECENT_ABILITY_NAME - }) } private sentEvnt() { diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts index 1facc72b..20070d6c 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts @@ -20,8 +20,6 @@ export default class Constants { static KEY_UP: number = 1; static LAUNCHER_BUNDLE_NAME:string = 'com.ohos.launcher'; static LAUNCHER_ABILITY_NAME:string = 'com.ohos.launcher.MainAbility'; - static RECENT_BUNDLE_NAME:string = 'com.ohos.launcher'; - static RECENT_ABILITY_NAME:string = 'com.ohos.launcher.recents.MainAbility'; static KEYCODE_BACK: number = 1; static KEYCODE_HOME: number = 2; static KEYCODE_RECENT: number = 3; -- Gitee From 56d3f1a3e58d99ec49ef717273f15c5e613093cc Mon Sep 17 00:00:00 2001 From: lizhi Date: Thu, 1 Sep 2022 14:35:37 +0800 Subject: [PATCH 264/373] =?UTF-8?q?[systemui]=E6=B7=BB=E5=8A=A0=E6=BB=91?= =?UTF-8?q?=E5=8A=A8=E5=88=A0=E9=99=A4=E6=8C=89=E9=92=AE=E5=BC=80=E7=9B=96?= =?UTF-8?q?=E5=8A=A8=E7=94=BB=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../ohos/noticeItem/view/item/SwipeLayout.ets | 43 +++++++++++++------ .../media/ic_public_delete_body_filled.svg | 7 +++ .../media/ic_public_delete_lids_filled.svg | 7 +++ 3 files changed, 44 insertions(+), 13 deletions(-) create mode 100644 features/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg create mode 100644 features/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets index 49d93350..d1214480 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets @@ -126,19 +126,36 @@ export default struct SwipeLayout { Row(){ Button({ type: ButtonType.Circle, stateEffect: true }) { - Image($r("app.media.ic_public_delete_filled")) - .objectFit(ImageFit.Contain) - .fillColor($r("sys.color.ohos_id_color_primary_contrary")) - .width(Layout.ICON_SIZE) - .height(Layout.ICON_SIZE) - .rotate({ - x: 0, - y: 0, - z: 1, - centerX: '50%', - centerY: '50%', - angle: this.rotateAngel - }) + Stack() { + Image($r("app.media.ic_public_delete_lids_filled")) + .objectFit(ImageFit.Contain) + .fillColor($r("sys.color.ohos_id_color_primary_contrary")) + .width(Layout.ICON_SIZE) + .height(Layout.ICON_SIZE) + .rotate({ + x: 0, + y: 0, + z: 1, + centerX: '89.45%', + centerY: '17.71%', + angle: this.rotateAngel + }) + Image($r("app.media.ic_public_delete_body_filled")) + .objectFit(ImageFit.Contain) + .fillColor($r("sys.color.ohos_id_color_primary_contrary")) + .width(Layout.ICON_SIZE) + .height(Layout.ICON_SIZE) + .rotate({ + x: 0, + y: 0, + z: 1, + centerX: '82.94%', + centerY: '29.17%', + angle: -this.rotateAngel + }) + } + .width(Layout.ICON_SIZE) + .height(Layout.ICON_SIZE) } .backgroundColor($r("app.color.button_background")) .zIndex(1) diff --git a/features/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg b/features/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg new file mode 100644 index 00000000..54e64211 --- /dev/null +++ b/features/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg @@ -0,0 +1,7 @@ + + + 垃圾桶桶身 + + + + \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg b/features/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg new file mode 100644 index 00000000..78741609 --- /dev/null +++ b/features/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg @@ -0,0 +1,7 @@ + + + 垃圾桶盖子 + + + + \ No newline at end of file -- Gitee From d179a8f8595c66680e82fc3d6d7af44bdab78977 Mon Sep 17 00:00:00 2001 From: lizhi Date: Thu, 1 Sep 2022 16:39:01 +0800 Subject: [PATCH 265/373] =?UTF-8?q?[systemui]=E4=BF=AE=E6=94=B9=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=BA=A2=E5=87=BA=E9=A2=91=E7=B9=81=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=97=A0=E5=93=8D=E5=BA=94=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99?= =?UTF-8?q?=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- AppScope/app.json5 | 2 -- .../com/ohos/noticeItem/model/NotificationService.ts | 7 +++---- .../ets/com/ohos/noticeItem/model/ParseDataUtil.ts | 1 - .../com/ohos/noticeItem/model/rule/RuleController.ts | 11 ++--------- .../noticeItem/viewmodel/NotificationViewModel.ts | 11 ++++------- 5 files changed, 9 insertions(+), 23 deletions(-) diff --git a/AppScope/app.json5 b/AppScope/app.json5 index 52356e8a..2143e68f 100644 --- a/AppScope/app.json5 +++ b/AppScope/app.json5 @@ -7,8 +7,6 @@ "icon": "$media:app_icon", "label": "$string:app_name", "distributedNotificationEnabled": true, - "singleton": true, - "keepAlive": true, "minAPIVersion": 8, "targetAPIVersion": 9 } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index be0b5b87..ccce9dac 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -88,18 +88,17 @@ export class NotificationService { } handleNotificationAddAndSortMap(data): void { - Log.showDebug(TAG, 'handleNotificationAddAndSortMap, sortingMap' + JSON.stringify(data.sortingMap || {})); + Log.showInfo(TAG, 'handleNotificationAddAndSortMap'); this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; this.handleNotificationAdd(data?.request); } handleNotificationAdd(request): void { ParseDataUtil.parseData(request, this.mSortingMap).then((intermediateData) => { - Log.showInfo(TAG, `parseData after = ${JSON.stringify(intermediateData)}`); + Log.showInfo(TAG, `parseData id=${intermediateData?.id}, timestamp=${intermediateData?.timestamp}, bundleName=${intermediateData?.bundleName}`); RuleController.getNotificationData(intermediateData, (finalItemData) => { - Log.showInfo(TAG, `RuleController.getNotificationData after = ${JSON.stringify(finalItemData)}`); this.mListeners.forEach((listener) => { - Log.showInfo(TAG, `notifcationUserId: ${finalItemData.userId}, listener.userId: ${listener.userId}`); + Log.showInfo(TAG, `notifcationUserId: ${finalItemData?.userId}, listener.userId: ${listener?.userId}`); if (CommonUtil.checkVisibilityByUser(finalItemData.userId, listener.userId)) { listener.onNotificationConsume(finalItemData); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index 6169dab4..ed05ceea 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -84,7 +84,6 @@ export default class ParseDataUtil { smallIcon: NotificationConfig.USE_NOTIFICATION_ICON ? (request?.smallIcon ?? appMessage.icon) : appMessage.icon, tapDismissed: request.tapDismissed }; - Log.showInfo(TAG, `notificationItem construct over`); notificationItem = { ...notificationItem, ...ParseDataUtil.getContentByType(request?.content?.contentType, request) }; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts index 9d2e932c..23213d07 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts @@ -29,18 +29,14 @@ export class RuleController { * @param {callback} Data of the type to show the notification */ getNotificationData(notificationItemData: NotificationItemData, callback): void { - Log.showInfo(TAG, 'getNotificationData start'); - this.isAllowSendNotification(notificationItemData, (isSuccess) => { if (!isSuccess) { - Log.showInfo(TAG, 'user is not allow this to send notification'); + Log.showWarn(TAG, 'user is not allow this to send notification'); callback(undefined); return; } this.getNotificationDataByApp(notificationItemData, (originalData) => { - Log.showDebug(TAG, `originalData = ${JSON.stringify(originalData)}`); this.updateNotificationDataBySense(originalData, (finalData) => { - Log.showDebug(TAG, `finalData = ${JSON.stringify(finalData)}`); callback(finalData); }); }); @@ -54,7 +50,6 @@ export class RuleController { * @param {callback} The user allow the app send notification or not */ isAllowSendNotification(notificationItemData, callback): void { - Log.showInfo(TAG, 'isAllowSendNotification start'); Notification.isNotificationEnabled({ bundle: notificationItemData.bundleName, uid: notificationItemData.uid }) .then((flag) => { Log.showInfo(TAG, `Notification.isNotificationEnabled: ${flag}`); @@ -92,7 +87,6 @@ export class RuleController { * @param {callback} The type to show notification */ getNotificationDataByApp(notificationItemData, callback): void { - Log.showInfo(TAG, 'getNotificationDataByApp start'); let mNotificationItemData : NotificationItemData = notificationItemData; mNotificationItemData.ruleData = { isAllowBanner: false, @@ -124,7 +118,7 @@ export class RuleController { } else { mNotificationItemData.ruleData.isAllowNotificationListShow = false; } - Log.showDebug(TAG, `mNotificationItemData.ruleData = ${JSON.stringify(mNotificationItemData.ruleData)}`); + Log.showInfo(TAG, `mNotificationItemData.ruleData = ${JSON.stringify(mNotificationItemData.ruleData)}`); callback(mNotificationItemData); } @@ -137,7 +131,6 @@ export class RuleController { * @param {callback} The final notification data */ updateNotificationDataBySense(notificationItemData, callback): void { - Log.showInfo(TAG, 'updateNotificationDataBySense start'); let mNotificationItemData = notificationItemData; // TODO Scenario Management callback(mNotificationItemData); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts index a84d3e9b..e3795749 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts @@ -88,7 +88,7 @@ export class NotificationViewModel { return; } this.onNotificationCancel(notificationItemData.hashcode); - Log.showInfo(TAG, `onNotificationConsume ${JSON.stringify(notificationItemData)}`); + Log.showDebug(TAG, `onNotificationConsume ${JSON.stringify(notificationItemData)}`); //Verify the notifications can be displayed if (!this.isCanShow(notificationItemData.bundleName)) { //can not displayed @@ -128,29 +128,28 @@ export class NotificationViewModel { } updateNotification(): void { - Log.showInfo(TAG, `updateNotification length: ${this.mNotificationList.length} list: ${JSON.stringify(this.mNotificationList)}`); this.sortNotification(); let notificationList = this.groupByGroupName(); + Log.showInfo(TAG, `updateNotification length: ${notificationList.length}`); AppStorage.SetOrCreate('notificationList', notificationList); } groupByGroupName(): any[]{ - Log.showInfo(TAG, 'groupByGroupName'); if (!this.mNotificationList || this.mNotificationList.length < 1) { + Log.showWarn(TAG, 'groupByGroupName, list is empty.'); return []; } let groupArr: any[] = []; let groups = {}; this.mNotificationList.forEach((item) => { const groupName = `${item.bundleName}_${item.groupName}`; - Log.showInfo(TAG, `groupByGroupName groupName:${groupName}`); + Log.showDebug(TAG, `groupByGroupName, groupName:${groupName}`); if (!groups[groupName] || groups[groupName].length < 1) { groups[groupName] = []; groupArr.push(groups[groupName]); } groups[groupName].push(item); }); - Log.showInfo(TAG, `groupByGroupName groupArr:${JSON.stringify(groupArr)}`); return groupArr; } @@ -319,7 +318,6 @@ export class NotificationViewModel { } updateFlowControlInfos(bundleName: string, plusOrMinus: boolean): void { - Log.showInfo(TAG, 'updateFlowControlInfos'); if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { if (this.mNotificationCtrl['app'].has(bundleName)) { let tmp = this.mNotificationCtrl['app'].get(bundleName); @@ -337,7 +335,6 @@ export class NotificationViewModel { this.mNotificationCtrl['currentTotal'] -= 1; } } - Log.showInfo(TAG, `updateFlowControlInfos:${JSON.stringify(this.mNotificationCtrl)}`); } -- Gitee From 436f4bc985c843b7d9f1299f9a3237c50f98647e Mon Sep 17 00:00:00 2001 From: zhangyimin Date: Thu, 1 Sep 2022 17:15:11 +0800 Subject: [PATCH 266/373] =?UTF-8?q?[ScreenLock]=E6=97=A5=E5=BF=97=E6=95=B4?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangyimin --- AppScope/app.json5 | 2 -- common/src/main/ets/default/SysFaultLogger.ts | 4 +-- .../noticeItem/model/NotificationService.ts | 23 +++++++------- .../ohos/noticeItem/model/ParseDataUtil.ts | 1 - .../noticeItem/model/rule/RuleController.ts | 24 ++++++-------- .../ohos/noticeItem/viewmodel/ViewModel.ts | 31 +++++++++---------- 6 files changed, 37 insertions(+), 48 deletions(-) diff --git a/AppScope/app.json5 b/AppScope/app.json5 index 52356e8a..2143e68f 100644 --- a/AppScope/app.json5 +++ b/AppScope/app.json5 @@ -7,8 +7,6 @@ "icon": "$media:app_icon", "label": "$string:app_name", "distributedNotificationEnabled": true, - "singleton": true, - "keepAlive": true, "minAPIVersion": 8, "targetAPIVersion": 9 } diff --git a/common/src/main/ets/default/SysFaultLogger.ts b/common/src/main/ets/default/SysFaultLogger.ts index 6ed8e734..bb5597ae 100644 --- a/common/src/main/ets/default/SysFaultLogger.ts +++ b/common/src/main/ets/default/SysFaultLogger.ts @@ -18,8 +18,8 @@ import Log from "./Log"; import hiSysEvent from '@ohos.hiSysEvent' const TAG = 'SystemFaultLogger'; -const APP_DOMAIN: string = "CoreApp"; -const APP_LOG_NAME: string = "ScreenLockFault"; +const APP_DOMAIN: string = "SYSTEMUI_APP"; +const APP_LOG_NAME: string = "SCREENLOCK_FAULT"; interface LogParam { FAULT_ID: string, diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index 41b8c6f0..aadc1752 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -86,29 +86,28 @@ export class NotificationService { return this.mSubscriber; } - handleNotificationAddAndSortMap(data) { - Log.showInfo(TAG, 'handleNotificationAddAndSortMap, sortingMap' + JSON.stringify(data.sortingMap || {})); + handleNotificationAddAndSortMap(data): void { + Log.showInfo(TAG, 'handleNotificationAddAndSortMap'); this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; this.handleNotificationAdd(data?.request); } - handleNotificationAdd(request) { + handleNotificationAdd(request): void { ParseDataUtil.parseData(request, this.mSortingMap).then((intermediateData) => { - Log.showInfo(TAG, `parseData after = ${JSON.stringify(intermediateData)}`); + Log.showInfo(TAG, `parseData id=${intermediateData?.id}, timestamp=${intermediateData?.timestamp}, bundleName=${intermediateData?.bundleName}`); RuleController.getNotificationData(intermediateData, (finalItemData) => { - Log.showInfo(TAG, `RuleController.getNotificationData after = ${JSON.stringify(finalItemData)}`); this.mListeners.forEach((listener) => { - Log.showInfo(TAG, `notifcationUserId: ${finalItemData.userId}, listener.userId: ${listener.userId}`); + Log.showInfo(TAG, `notifcationUserId: ${finalItemData?.userId}, listener.userId: ${listener?.userId}`); if (CommonUtil.checkVisibilityByUser(finalItemData.userId, listener.userId)) { listener.onNotificationConsume(finalItemData); } - }) + }); }); }).catch(errorInfo => Log.showError(TAG, errorInfo)); } handleNotificationCancel(data) { - Log.showInfo(TAG, `handleNotificationCancel hashCode: ${JSON.stringify(data?.request?.hashCode)}`); + Log.showDebug(TAG, `handleNotificationCancel hashCode: ${JSON.stringify(data?.request?.hashCode)}`); this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; const hashCode = data?.request?.hashCode; if (!hashCode) { @@ -140,10 +139,10 @@ export class NotificationService { return pluginTempLate; } - enableNotification(bundleOption, data) { - Log.showInfo(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)} `); - NotificationManager.enableNotification(TAG, bundleOption, data, (result) => { - Log.showInfo(TAG, `enableNotification ==> result: ${JSON.stringify(result)}`); + enableNotification(bundleOption, data: boolean): void { + Log.showDebug(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)} `); + NotificationManager.enableNotification(TAG, bundleOption, data, () => { + Log.showInfo(TAG, 'enableNotification succeed'); }); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index c2a7d276..0e474325 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -82,7 +82,6 @@ export default class ParseDataUtil { deviceId: request.deviceId, groupName: request.groupName??request.hashcode }; - Log.showDebug(TAG, `notificationItem construct over`); notificationItem = { ...notificationItem, ...ParseDataUtil.getContentByType(request?.content?.contentType, request) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts index 56e4311b..6e9cefec 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts @@ -30,19 +30,15 @@ export class RuleController { * @param {notificationItemData} Data of the notification * @param {callback} Data of the type to show the notification */ - getNotificationData(notificationItemData: NotificationItemData, callback) { - Log.showDebug(TAG, "getNotificationData start") - + getNotificationData(notificationItemData: NotificationItemData, callback): void { this.isAllowSendNotification(notificationItemData, (isSuccess) => { if (!isSuccess) { - Log.showDebug(TAG, "user is not allow this to send notification"); + Log.showWarn(TAG, 'user is not allow this to send notification'); callback(undefined); return; } this.getNotificationDataByApp(notificationItemData, (originalData) => { - Log.showDebug(TAG, `originalData = ${JSON.stringify(originalData)}`); this.updateNotificationDataBySense(originalData, (finalData) => { - Log.showDebug(TAG, `finalData = ${JSON.stringify(finalData)}`); callback(finalData); }); }); @@ -55,11 +51,10 @@ export class RuleController { * @param {notificationItemData} The origin notification data * @param {callback} The user allow the app send notification or not */ - isAllowSendNotification(notificationItemData, callback) { - Log.showDebug(TAG, "isAllowSendNotification start"); + isAllowSendNotification(notificationItemData, callback): void { Notification.isNotificationEnabled({ bundle: notificationItemData.bundleName, uid: notificationItemData.uid }) .then((flag) => { - Log.showInfo(TAG, `Notification.isNotificationEnabled:` + flag) + Log.showInfo(TAG, `Notification.isNotificationEnabled: ${flag}`); callback(flag); }); } @@ -93,8 +88,7 @@ export class RuleController { * @param {notificationItemData} The origin notification data * @param {callback} The type to show notification */ - getNotificationDataByApp(notificationItemData, callback) { - Log.showDebug(TAG, "getNotificationDataByApp start") + getNotificationDataByApp(notificationItemData, callback): void { let mNotificationItemData : NotificationItemData = notificationItemData; mNotificationItemData.ruleData = { isAllowBanner: false, @@ -103,7 +97,7 @@ export class RuleController { isAllowStatusBarShow : false, isAllowNotificationListShow : false }; - Log.showDebug(TAG, `notificationItemData.slotLevel = ${notificationItemData.slotLevel}`); + Log.showInfo(TAG, `notificationItemData.slotLevel = ${notificationItemData.slotLevel}`); if (notificationItemData.slotLevel === SlotLevel.LEVEL_HIGH) { mNotificationItemData.ruleData.isAllowBanner = true; this.SoundOrVibrate(notificationItemData, (sound, vibrationValues) => { @@ -126,7 +120,7 @@ export class RuleController { } else { mNotificationItemData.ruleData.isAllowNotificationListShow = false; } - Log.showDebug(TAG, `mNotificationItemData.ruleData = ${JSON.stringify(mNotificationItemData.ruleData)}`); + Log.showInfo(TAG, `mNotificationItemData.ruleData = ${JSON.stringify(mNotificationItemData.ruleData)}`); callback(mNotificationItemData); } @@ -138,9 +132,9 @@ export class RuleController { * @param {notificationItemData} The origin notification data * @param {callback} The final notification data */ - updateNotificationDataBySense(notificationItemData, callback) { - Log.showDebug(TAG, "updateNotificationDataBySense start") + updateNotificationDataBySense(notificationItemData, callback): void { let mNotificationItemData = notificationItemData; + // TODO Scenario Management callback(mNotificationItemData); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index feebea1d..8186ff68 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -82,10 +82,10 @@ export class ViewModel { */ onNotificationConsume(notificationItemData) { if (notificationItemData === undefined) { - Log.showDebug(TAG, `onNotificationConsume notificationItemData is undefined`); + Log.showError(TAG, 'onNotificationConsume notificationItemData is undefined'); return; } - this.onNotificationCancel(notificationItemData.hashcode) + this.onNotificationCancel(notificationItemData.hashcode); Log.showDebug(TAG, `onNotificationConsume ${JSON.stringify(notificationItemData)}`); //Verify the notifications can be displayed if (!this.isCanShow(notificationItemData.bundleName)) { @@ -94,6 +94,7 @@ export class ViewModel { } if (notificationItemData.ruleData.isAllowStatusBarShow) { + //TODO statusbar show } if (notificationItemData.ruleData.isAllowNotificationListShow) { this.mNotificationList.unshift(notificationItemData); @@ -108,15 +109,15 @@ export class ViewModel { /** * notification CancelCallback */ - onNotificationCancel(hashCode: string) { - Log.showDebug(TAG, `onNotificationCancel hashCode: ${hashCode}`); + onNotificationCancel(hashCode: string): void { + Log.showInfo(TAG, `onNotificationCancel hashCode: ` + hashCode); + // Common Notification Deletion Logic Processing for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].hashcode == hashCode) { let removeItemArr = this.mNotificationList.splice(i, 1); - Log.showDebug(TAG, `onNotificationCancel removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { - this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + this.updateFlowControlInfos(removeItemArr[0].bundleName, false); } this.updateNotification(); break; @@ -124,30 +125,29 @@ export class ViewModel { } } - updateNotification() { - Log.showDebug(TAG, `updateNotification length: ${this.mNotificationList.length}`); - this.sortNotification() + updateNotification(): void { + this.sortNotification(); let notificationList = this.groupByGroupName(); + Log.showInfo(TAG, `updateNotification length: ${notificationList.length}`); AppStorage.SetOrCreate('notificationListSc', notificationList); } groupByGroupName(): any[]{ - Log.showDebug(TAG, `groupByGroupName`); if (!this.mNotificationList || this.mNotificationList.length < 1) { + Log.showWarn(TAG, 'groupByGroupName, list is empty.'); return []; } let groupArr: any[] = []; let groups = {}; this.mNotificationList.forEach((item) => { const groupName = `${item.bundleName}_${item.groupName}`; - Log.showDebug(TAG, `groupByGroupName groupName:${groupName}`); + Log.showDebug(TAG, `groupByGroupName, groupName:${groupName}`); if (!groups[groupName] || groups[groupName].length < 1) { groups[groupName] = []; groupArr.push(groups[groupName]); } - groups[groupName].push(item) - }) - Log.showDebug(TAG, `groupByGroupName groupArr:${JSON.stringify(groupArr)}`); + groups[groupName].push(item); + }); return groupArr; } @@ -232,7 +232,7 @@ export class ViewModel { Log.showDebug(TAG, `removeGroupNotification, groupName: ${itemData.groupName}`); let groupName = itemData.groupName for (let i = 0, len = this.mNotificationList.length; i < len; i++) { - if (this.mNotificationList[i].groupName == groupName) { + if (this.mNotificationList[i]?.groupName == groupName) { Log.showDebug(TAG, `removeGroupNotification i = ${i}`); let id = this.mNotificationList[i].id let hashcode = this.mNotificationList[i].hashcode @@ -318,7 +318,6 @@ export class ViewModel { } updateFlowControlInfos(bundleName: string, plusOrMinus: boolean): void { - Log.showDebug(TAG, `updateFlowControlInfos`); if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { if (this.mNotificationCtrl['app'].has(bundleName)) { let tmp = this.mNotificationCtrl['app'].get(bundleName) -- Gitee From 1ab4fe9f5263c3979069eeddfbd6df6fb735f180 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Sat, 3 Sep 2022 17:34:14 +0800 Subject: [PATCH 267/373] Fixing frame drops in animations Signed-off-by: xuchangzhou --- .../controlpanel/src/main/ets/pages/index.ets | 35 +++++-------------- .../src/main/ets/pages/index.ets | 35 +++++-------------- 2 files changed, 18 insertions(+), 52 deletions(-) diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index 5c558d62..22d18015 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -33,22 +33,6 @@ import display from "@ohos.display" const TAG = 'ControlPanel-Index' const SHOW_EVENT = "showControlCenter"; const HIDE_EVENT = "hideControlCenter"; -const SHOW_ANIM_CONFIG = { - duration: 300, - tempo: 1.0, - curve: Curve.Friction, - delay: 0, - iterations: 1, - playMode: PlayMode.Normal -}; -const HIDE_ANIM_CONFIG = { - duration: 200, - tempo: 1.0, - curve: Curve.EaseOut, - delay: 0, - iterations: 1, - playMode: PlayMode.Normal, -} let mHeightConfigUtils @@ -194,21 +178,20 @@ struct Index { //show animation animateTo({ duration: 200, - curve: Curve.Friction, - onFinish: () => { - animateTo({ - duration:100, - curve: Curve.Friction - }, () =>{ - this.mWidthSize = 1; - this.mHeightSize = 1; - }) - }, + curve: Curve.Friction }, () => { this.mOpacity = 1; this.mWidthSize = 1.03; this.mHeightSize = 1.03; }) + animateTo({ + duration:100, + curve: Curve.Friction, + delay: 200 + }, () =>{ + this.mWidthSize = 1; + this.mHeightSize = 1; + }) } hideAnimation(){ diff --git a/product/pc/notificationpanel/src/main/ets/pages/index.ets b/product/pc/notificationpanel/src/main/ets/pages/index.ets index 3017b60c..4de47d30 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/index.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/index.ets @@ -31,22 +31,6 @@ import display from "@ohos.display" const TAG = 'NotificationPanel-Index' const SHOW_EVENT = "showNotificationPanel"; const HIDE_EVENT = "hideNotificationPanel"; -const SHOW_ANIM_CONFIG = { - duration: 300, - tempo: 1.0, - curve: Curve.Friction, - delay: 0, - iterations: 1, - playMode: PlayMode.Normal, -} -const HIDE_ANIM_CONFIG = { - duration: 200, - tempo: 1.0, - curve: Curve.EaseOut, - delay: 0, - iterations: 1, - playMode: PlayMode.Normal, -} @Entry @Component @@ -164,21 +148,20 @@ struct Index { //show animation animateTo({ duration: 200, - curve: Curve.Friction, - onFinish: () => { - animateTo({ - duration:100, - curve: Curve.Friction - }, () =>{ - this.mWidthSize = 1; - this.mHeightSize = 1; - }) - }, + curve: Curve.Friction }, () => { this.mOpacity = 1; this.mWidthSize = 1.03; this.mHeightSize = 1.03; }) + animateTo({ + duration:100, + curve: Curve.Friction, + delay: 200 + }, () =>{ + this.mWidthSize = 1; + this.mHeightSize = 1; + }) } hideAnimation(){ -- Gitee From 79ad7e30b342dcc3c6734d1b43960e5e28843bb7 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Mon, 5 Sep 2022 16:39:56 +0800 Subject: [PATCH 268/373] =?UTF-8?q?SystemUI=E4=BB=A3=E7=A0=81=E5=90=88?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- common/src/main/ets/default/SysFaultLogger.ts | 5 ++- .../main/ets/default/event/EventManager.ts | 2 +- .../src/main/ets/com/ohos/common/Constants.ts | 25 --------------- .../main/ets/com/ohos/model/NFCModeService.ts | 32 ++++++++++--------- .../ControlCenterSimpleToggleNFComponent.ets | 16 +++++----- .../pages/StatusBarIconItemNFComponent.ets | 6 ++-- .../main/ets/com/ohos/viewmodel/NFCModeVM.ts | 10 +++--- 7 files changed, 36 insertions(+), 60 deletions(-) delete mode 100644 features/nfccomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/common/src/main/ets/default/SysFaultLogger.ts b/common/src/main/ets/default/SysFaultLogger.ts index dd27b8c1..0e8a191e 100644 --- a/common/src/main/ets/default/SysFaultLogger.ts +++ b/common/src/main/ets/default/SysFaultLogger.ts @@ -18,9 +18,8 @@ import Log from "./Log"; import hiSysEvent from '@ohos.hiSysEvent' const TAG = 'SystemFaultLogger'; -const APP_DOMAIN: string = "CoreApp"; -const APP_LOG_NAME: string = "ScreenLockFault"; - +const APP_DOMAIN: string = "SYSTEMUI_APP"; +const APP_LOG_NAME: string = "SYSTEMUI_FAULT"; export enum FaultID { META_DIAGRAM_JUMP = "META_DIAGRAM_JUMP", WORKER_ERROR = "WORKER_ABNORMAL_OCCURRENCE", diff --git a/common/src/main/ets/default/event/EventManager.ts b/common/src/main/ets/default/event/EventManager.ts index 8c257105..0d5357a2 100644 --- a/common/src/main/ets/default/event/EventManager.ts +++ b/common/src/main/ets/default/event/EventManager.ts @@ -82,7 +82,7 @@ class EventManager { }).catch((error: BusinessError) => { Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); if (pluginType == PluginType.META) { - writeFaultLog({TARGET_API:data.bundleName, FAULT_ID: FaultID.META_DIAGRAM_JUMP, MSG: "jump ability failure"}) + writeFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API:data.bundleName, FAULT_ID: FaultID.META_DIAGRAM_JUMP, MSG: "jump ability failure"}) } }); return true; diff --git a/features/nfccomponent/src/main/ets/com/ohos/common/Constants.ts b/features/nfccomponent/src/main/ets/com/ohos/common/Constants.ts deleted file mode 100644 index 422dc35e..00000000 --- a/features/nfccomponent/src/main/ets/com/ohos/common/Constants.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 nfcController from '@ohos.nfc.controller'; - -export default class Constants { -} -export enum NFCMode { - NFC_MODE_OFF = 1, - NFC_MODE_TURNING_ON = 2, - NFC_MODE_ON = 3, - NFC_MODE_TURNING_OFF = 4 -} \ No newline at end of file diff --git a/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts b/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts index 72ffc464..1cfbbbcb 100644 --- a/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts +++ b/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts @@ -13,16 +13,15 @@ * limitations under the License. */ -import nfcController from '@ohos.nfc.controller'; +import NfcController from '@ohos.nfc.controller'; import { BusinessError } from 'basic'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import { NFCMode } from '../common/Constants'; const TAG = 'NFCModel'; export interface NFCModeStatusListener { - updateNFCMode(status: NFCMode): void; + updateNFCMode(status: NfcController.NfcState): void; } export class NFCModeService { @@ -37,13 +36,15 @@ export class NFCModeService { Log.showInfo(TAG, 'startService'); this.mIsStart = true; - this.mNFCManager = nfcController + this.mNFCManager = NfcController this.getNFCMode(); - this.mNFCManager.on('nfcStateChange', (data: NFCMode) => { + this.mNFCManager.on('nfcStateChange', (data: NfcController.NfcState) => { Log.showInfo(TAG, `startService->nfcStateChange, data: ${JSON.stringify(data)}`); - this.mListeners.forEach(listener => listener.updateNFCMode(data)); + if(data == NfcController.NfcState.STATE_OFF || data == NfcController.NfcState.STATE_ON) { + this.mListeners.forEach(listener => listener.updateNFCMode(data)); + } }); } @@ -59,12 +60,12 @@ export class NFCModeService { registerListener(listener: NFCModeStatusListener): void { let res = this.mListeners.add(listener); - Log.showInfo(TAG, `registser nfcMode Listener ${res}`); + Log.showInfo(TAG, `registser NfcState Listener ${res}`); } unregisterListener(listener: NFCModeStatusListener): void { let res = this.mListeners.delete(listener); - Log.showInfo(TAG, `unregistser nfcMode Listener ${res}`); + Log.showInfo(TAG, `unregistser NfcState Listener ${res}`); } getNFCMode(): void { @@ -73,16 +74,17 @@ export class NFCModeService { this.mListeners.forEach(listener => listener.updateNFCMode(action)); } - setNFCMode(mode: NFCMode): void { + setNFCMode(mode: NfcController.NfcState): void { Log.showInfo(TAG, `setNFCMode, mode: ${JSON.stringify(mode)}`); + let isSucceed = false; switch (mode) { - case NFCMode.NFC_MODE_OFF: - this.mNFCManager.openNfc(); - Log.showInfo(TAG, `openNFC`); + case NfcController.NfcState.STATE_OFF: + isSucceed = this.mNFCManager.openNfc(); + Log.showInfo(TAG, `openNFC` + isSucceed); break; - case NFCMode.NFC_MODE_ON: - this.mNFCManager.closeNfc(); - Log.showInfo(TAG, `closeNFC`); + case NfcController.NfcState.STATE_ON: + isSucceed = this.mNFCManager.closeNfc(); + Log.showInfo(TAG, `closeNFC` + isSucceed); break; default: break; diff --git a/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets b/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets index f54e31d2..9b9a5741 100644 --- a/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets +++ b/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets @@ -16,7 +16,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager"; import { obtainStartAbility } from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; -import { NFCMode } from '../common/Constants'; +import NfcController from '@ohos.nfc.controller'; import ViewModel from '../viewmodel/NFCModeVM'; import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase'; @@ -30,7 +30,7 @@ export default struct ControlCenterSimpleToggleNFComponent { @State mIcon: Resource = $r("app.media.ic_notification_nfc_filled"); @State mLabel: Resource = $r("app.string.control_center_complex_toggle_nfc_mode_title"); @State mDefaultChangeSwitch: boolean = false; - @StorageLink('NFCModeComponentMode') @Watch('onNFCModeUpdated') NFCModeComponentMode: NFCMode = NFCMode.NFC_MODE_OFF; + @StorageLink('NFCModeComponentMode') @Watch('onNFCModeUpdated') NFCModeComponentMode: NfcController.NfcState = NfcController.NfcState.STATE_OFF; aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); ViewModel.initViewModel(); @@ -43,9 +43,9 @@ export default struct ControlCenterSimpleToggleNFComponent { onNFCModeUpdated(propName: string): void { Log.showInfo(TAG, `onNFCModeUpdated, propName: ${propName} NFCModeComponentMode: ${JSON.stringify(this.NFCModeComponentMode)}`); - if (this.NFCModeComponentMode == NFCMode.NFC_MODE_OFF) { + if (this.NFCModeComponentMode == NfcController.NfcState.STATE_OFF) { this.mDefaultChangeSwitch = false; - } else if (this.NFCModeComponentMode == NFCMode.NFC_MODE_ON) { + } else if (this.NFCModeComponentMode == NfcController.NfcState.STATE_ON) { this.mDefaultChangeSwitch = true; } } @@ -64,10 +64,10 @@ export default struct ControlCenterSimpleToggleNFComponent { mClickEvent() { Log.showInfo(TAG, `mClickEvent---${this.NFCModeComponentMode}`); - if (this.NFCModeComponentMode == NFCMode.NFC_MODE_OFF) { - ViewModel.setNFCMode(NFCMode.NFC_MODE_OFF) - } else if (this.NFCModeComponentMode == NFCMode.NFC_MODE_ON) { - ViewModel.setNFCMode(NFCMode.NFC_MODE_ON) + if (this.NFCModeComponentMode == NfcController.NfcState.STATE_OFF) { + ViewModel.setNFCMode(NfcController.NfcState.STATE_OFF) + } else if (this.NFCModeComponentMode == NfcController.NfcState.STATE_ON) { + ViewModel.setNFCMode(NfcController.NfcState.STATE_ON) } } } \ No newline at end of file diff --git a/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets b/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets index 6e9f7c2d..dcceb94b 100644 --- a/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets +++ b/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets @@ -18,14 +18,14 @@ import { TintContentInfo } from '../../../../../../../../common/src/main/ets/def import StyleConfigurationCommon, { CommonStyle } from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; import StyleConfiguration, { StatusRingModeComponentStyle } from '../common/StyleConfiguration'; -import Constants, { NFCMode } from '../common/Constants'; +import NfcController from '@ohos.nfc.controller'; import ViewModel from '../viewmodel/NFCModeVM'; const TAG = 'nfcmode-StatusBarIconItemNFCModeComponent'; @Component export default struct StatusBarIconItemNFCModeComponent { - @StorageLink('NFCModeComponentMode') NFCModeComponentMode: NFCMode = NFCMode.NFC_MODE_OFF; + @StorageLink('NFCModeComponentMode') NFCModeComponentMode: NfcController.NfcState = NfcController.NfcState.STATE_OFF; @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle(); @State style: StatusRingModeComponentStyle = StyleConfiguration.getStatusRingModeComponentStyle(); @@ -44,7 +44,7 @@ export default struct StatusBarIconItemNFCModeComponent { build() { Row() { - if (this.NFCModeComponentMode != NFCMode.NFC_MODE_OFF) { + if (this.NFCModeComponentMode != NfcController.NfcState.STATE_OFF) { Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') Image(this.ringModeIcons['0']) .objectFit(ImageFit.Contain) diff --git a/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts b/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts index 08af953f..b44d2acc 100644 --- a/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts +++ b/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts @@ -19,8 +19,8 @@ import { FASlotName } from '../../../../../../../../common/src/main/ets/default/ import { TintContentInfo, getOrCreateTintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import { NFCMode } from '../common/Constants'; import NFCModeService from '../model/NFCModeService'; +import NfcController from '@ohos.nfc.controller'; export const NFC_MODE_COMPONENT_MODE_KEY = 'NFCModeComponentMode'; @@ -28,7 +28,7 @@ const TAG = 'NFCModeVM'; export class NFCModeVM { mIsStart = false; - mNFCModeComponentMode: SubscribedAbstractProperty; + mNFCModeComponentMode: SubscribedAbstractProperty; mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.NFC); constructor() { @@ -42,18 +42,18 @@ export class NFCModeVM { Log.showInfo(TAG, 'initViewModel '); this.mIsStart = true; - this.mNFCModeComponentMode = AppStorage.SetAndLink(NFC_MODE_COMPONENT_MODE_KEY, NFCMode.NFC_MODE_OFF); + this.mNFCModeComponentMode = AppStorage.SetAndLink(NFC_MODE_COMPONENT_MODE_KEY, NfcController.NfcState.STATE_OFF); NFCModeService.registerListener(this); NFCModeService.startService(); } - updateNFCMode(mode: NFCMode): void { + updateNFCMode(mode: NfcController.NfcState): void { Log.showInfo(TAG, `updateNFCMode, mode: ${JSON.stringify(mode)} `); this.mNFCModeComponentMode.set(mode); } - setNFCMode(mode: NFCMode): void { + setNFCMode(mode: NfcController.NfcState): void { Log.showInfo(TAG, `setNFCMode, mode: ${JSON.stringify(mode)} `); NFCModeService.setNFCMode(mode); } -- Gitee From aafa4cda82143ac223964c113b3e48d7d3ad1804 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 6 Sep 2022 11:06:16 +0800 Subject: [PATCH 269/373] =?UTF-8?q?1=E3=80=81=E5=B4=A9=E6=BA=83=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D=202=E3=80=81NFC=E8=81=94=E5=8A=A8?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../src/main/ets/default/abilitymanager/abilityManager.ts | 6 ++++-- .../src/main/ets/default/viewmodel/CapsuleViewModel.ts | 2 +- .../src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts | 2 +- .../src/main/ets/com/ohos/pages/VolumePanelComponent.ets | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/common/src/main/ets/default/abilitymanager/abilityManager.ts index 36bb9909..e905d30b 100644 --- a/common/src/main/ets/default/abilitymanager/abilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/abilityManager.ts @@ -83,9 +83,11 @@ export default class AbilityManager { return globalThis[abilityName + '_ContextName']; } - static startAbility(want: Want, callback?: (error?: BusinessError) => void): void { + static startAbility(context: ServiceExtensionContext, want: Want, callback?: (error?: BusinessError) => void): void { Log.showDebug(TAG, `startAbility, want: ${JSON.stringify(want)}`); - let context: ServiceExtensionContext = AbilityManager.getContext(); + if (context == null) { + context = AbilityManager.getContext(); + } context.startAbility(want).then(() => { Log.showInfo(TAG, 'startAbility, then'); if (callback) { diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts index 1ee68b31..76165646 100644 --- a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts +++ b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts @@ -128,7 +128,7 @@ export default class CapsuleViewModel { } Log.showDebug(TAG, `onClickEvent `); Log.showDebug(TAG, `startAbility`); - AbilityManager.startAbility({ + AbilityManager.startAbility(AbilityManager.getContext(AbilityManager.ABILITY_NAME_STATUS_BAR), { bundleName: this.mWantBundleName, abilityName: this.mWantAbilityName }, () => { diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts index 2a61e6a4..ccd9c40d 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts @@ -91,7 +91,7 @@ export class KeyCodeEvent { } private sendHomeKeyEvent() { - AbilityManager.startAbility({ + AbilityManager.startAbility(AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR), { bundleName: Constants.LAUNCHER_BUNDLE_NAME, abilityName: Constants.LAUNCHER_ABILITY_NAME }); diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets index 4578ba6a..80dacda8 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets @@ -154,7 +154,7 @@ export default struct VolumePanelComponent { onSettingsBtnClick(event: ClickEvent) { Log.showInfo(TAG, `onSettingsBtnClick`); - AbilityManager.startAbility({ + AbilityManager.startAbility(AbilityManager.getContext(AbilityManager.ABILITY_NAME_VOLUME_PANEL), { bundleName: 'com.ohos.settings', abilityName: 'com.ohos.settings.MainAbility', }); -- Gitee From 5a081942c552029559db46d94dadbcdf17cd17af Mon Sep 17 00:00:00 2001 From: gaochao Date: Tue, 13 Sep 2022 17:06:23 +0800 Subject: [PATCH 270/373] =?UTF-8?q?[systemui]=E5=8D=8F=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E8=A2=AB=E6=8E=A7=E7=AB=AF=E9=9F=B3=E9=87=8F=E6=9D=A1=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: gaochao --- .../src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts index 58a911b0..aa650992 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts @@ -114,7 +114,7 @@ export class VolumePanelVM { updateVolumeInfo(volumeInfo: VolumeInfo): void { Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} , mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType}`); - if (!volumeInfo.updateUi && volumeInfo.volumeType != this.mCurrentAudioVolumeType) { + if (!volumeInfo.updateUi) { return; } let volumeType = volumeInfo.volumeType; -- Gitee From aec8fb89a6a2ed85dfcb12bd54adc22485e51004 Mon Sep 17 00:00:00 2001 From: gaochao Date: Tue, 13 Sep 2022 17:11:16 +0800 Subject: [PATCH 271/373] =?UTF-8?q?[systemui]gradlew=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: gaochao --- gradlew | 199 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 180 insertions(+), 19 deletions(-) diff --git a/gradlew b/gradlew index 8641d8e8..2fe81a7d 100755 --- a/gradlew +++ b/gradlew @@ -1,22 +1,183 @@ -function npm_install { - cd $1 - npm install -} +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://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. +# -npm config set registry http://mirrors.tools.huawei.com/npm/ -npm config set @ohos:registry https://cmc.centralrepo.rnd.huawei.com/artifactory/api/npm/product_npm/ -npm config set strict-ssl false -npm config set sslVerify false +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" -npm_install "$APP_HOME" -npm_install "$APP_HOME/product/default/navigationBar" -npm_install "$APP_HOME/product/default/notificationmanagement" -npm_install "$APP_HOME/product/default/volumepanel" -npm_install "$APP_HOME/product/pc/controlpanel" -npm_install "$APP_HOME/product/pc/notificationpanel" -npm_install "$APP_HOME/product/pc/statusbar" - -cd $APP_HOME -cp ./compile-resource.js ./node_modules/@ohos/hvigor-ohos-plugin/src/tasks/compile-resource.js -node ./node_modules/@ohos/hvigor/bin/hvigor.js --mode module assembleHap \ No newline at end of file +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" -- Gitee From afd786782cdead770b7285e8831dd1d69152b6fb Mon Sep 17 00:00:00 2001 From: lizhi Date: Wed, 14 Sep 2022 15:32:03 +0800 Subject: [PATCH 272/373] =?UTF-8?q?[systemui]=E8=A7=A3=E5=86=B3=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E7=AE=A1=E7=90=86=E5=85=8D=E6=89=93=E6=89=B0=E5=BC=B9?= =?UTF-8?q?=E6=A1=86=E9=80=89=E9=A1=B9=EF=BC=8C=E9=80=89=E6=8B=A9=E6=97=A0?= =?UTF-8?q?=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../src/main/ets/pages/noDisturb.ets | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index 5c535a54..8476f965 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -21,23 +21,23 @@ import { concatTime } from '../../../../../../../common/src/main/ets/default/tim import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemcomponent'; import {DoNotDisturbType} from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/nodisturbingmodel'; -import ViewModel from '../vm/nodisturbviewmodel' +import ViewModel from '../vm/nodisturbviewmodel'; -const deviceTypeInfo = deviceInfo.deviceType +const deviceTypeInfo = deviceInfo.deviceType; const TAG = 'NotificationManagement-NoDisturb'; -const GROUP_REPEAT_MODE = 'repeatMode' +const GROUP_REPEAT_MODE = 'repeatMode'; @Entry @Component export default struct NoDisturb { - @State mViewModel: ViewModel = new ViewModel() - @State headName:Resource = $r('app.string.noDisturb') - @State repeatTitle:Resource = $r('app.string.repeat') - @State startDateTitle:Resource = $r('app.string.startDate') - @State endDateTitle:Resource = $r('app.string.endDate') - @State startTitle:Resource = $r('app.string.startTime') - @State endTitle:Resource = $r('app.string.endTime') - @State arrow: string | PixelMap | Resource = $r('app.media.ic_settings_arrow') + @State mViewModel: ViewModel = new ViewModel(); + @State headName:Resource = $r('app.string.noDisturb'); + @State repeatTitle:Resource = $r('app.string.repeat'); + @State startDateTitle:Resource = $r('app.string.startDate'); + @State endDateTitle:Resource = $r('app.string.endDate'); + @State startTitle:Resource = $r('app.string.startTime'); + @State endTitle:Resource = $r('app.string.endTime'); + @State arrow: string | PixelMap | Resource = $r('app.media.ic_settings_arrow'); @State mRefreshCnt: number = 0; mPrevData: string = ''; @@ -472,6 +472,7 @@ struct RepeatModeDialog { .fontWeight(FontWeight.Medium) Radio({ value: '' + DoNotDisturbType.TYPE_NONE, group: GROUP_REPEAT_MODE }) .checked(this.selectMode == DoNotDisturbType.TYPE_NONE) + .touchable(false) .width($r('app.float.toggle_check_width')) .height($r('app.float.toggle_check_width')) } @@ -491,6 +492,7 @@ struct RepeatModeDialog { .fontWeight(FontWeight.Medium) Radio({ value: '' + DoNotDisturbType.TYPE_ONCE, group: GROUP_REPEAT_MODE }) .checked(this.selectMode == DoNotDisturbType.TYPE_ONCE) + .touchable(false) .width($r('app.float.toggle_check_width')) .height($r('app.float.toggle_check_width')) } @@ -510,6 +512,7 @@ struct RepeatModeDialog { .fontWeight(FontWeight.Medium) Radio({ value: '' + DoNotDisturbType.TYPE_DAILY, group: GROUP_REPEAT_MODE }) .checked(this.selectMode == DoNotDisturbType.TYPE_DAILY) + .touchable(false) .width($r('app.float.toggle_check_width')) .height($r('app.float.toggle_check_width')) } @@ -529,6 +532,7 @@ struct RepeatModeDialog { .fontWeight(FontWeight.Medium) Radio({ value: '' + DoNotDisturbType.TYPE_CLEARLY, group: GROUP_REPEAT_MODE }) .checked(this.selectMode == DoNotDisturbType.TYPE_CLEARLY) + .touchable(false) .width($r('app.float.toggle_check_width')) .height($r('app.float.toggle_check_width')) } -- Gitee From 56e668bd90bc092e00d1bf9df75568623aca46c1 Mon Sep 17 00:00:00 2001 From: lizhi Date: Thu, 15 Sep 2022 20:21:37 +0800 Subject: [PATCH 273/373] =?UTF-8?q?[systemui]=E8=A7=A3=E5=86=B3=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E5=95=86=E6=98=BE=E7=A4=BA=E5=92=8C=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../src/main/ets/default/common/constants.ts | 28 +++- .../src/main/ets/default/pages/signalIcon.ets | 28 ++-- .../src/main/ets/default/signalModel.ts | 123 +++++++++--------- 3 files changed, 102 insertions(+), 77 deletions(-) diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ts b/features/signalcomponent/src/main/ets/default/common/constants.ts index c7200cbe..b62b8c0a 100644 --- a/features/signalcomponent/src/main/ets/default/common/constants.ts +++ b/features/signalcomponent/src/main/ets/default/common/constants.ts @@ -14,13 +14,24 @@ */ export default class Constants { - static readonly NETWORK_TYPE_UNKNOWN = 0; - static readonly NETWORK_TYPE_GSM = 1; - static readonly NETWORK_TYPE_CDMA = 2; - static readonly NETWORK_TYPE_W_CDMA = 3; - static readonly NETWORK_TYPE_TDS_CDMA = 4; - static readonly NETWORK_TYPE_LTE = 5; - static readonly NETWORK_TYPE_NR = 6; + static readonly RADIO_TECHNOLOGY_UNKNOWN = 0; + static readonly RADIO_TECHNOLOGY_GSM = 1; + static readonly RADIO_TECHNOLOGY_1XRTT = 2; + static readonly RADIO_TECHNOLOGY_WCDMA = 3; + static readonly RADIO_TECHNOLOGY_HSPA = 4; + static readonly RADIO_TECHNOLOGY_HSPAP = 5; + static readonly RADIO_TECHNOLOGY_TD_SCDMA = 6; + static readonly RADIO_TECHNOLOGY_EVDO = 7; + static readonly RADIO_TECHNOLOGY_EHRPD = 8; + static readonly RADIO_TECHNOLOGY_LTE = 9; + static readonly RADIO_TECHNOLOGY_LTE_CA = 10; + static readonly RADIO_TECHNOLOGY_IWLAN = 11; + static readonly RADIO_TECHNOLOGY_NR = 12; + + static readonly REG_STATE_NO_SERVICE = 0; + static readonly REG_STATE_IN_SERVICE = 1; + static readonly REG_STATE_EMERGENCY_CALL_ONLY = 2; + static readonly REG_STATE_POWER_OFF = 3; static readonly CELLULAR_SIGNAL_NO = 0; static readonly CELLULAR_SIGNAL_MIN = 1; @@ -31,4 +42,7 @@ export default class Constants { static readonly CELLULAR_NO_SIM_CARD = -1; static readonly NET_NULL = 'NULL'; + + // Events for Subscribing to Notifications + static readonly COMMON_EVENT_SPN_INFO_CHANGED = "usual.event.SPN_INFO_CHANGED"; } diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 2442e4cd..3d7e61a4 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -27,7 +27,7 @@ const TAG = 'SignalComponent-SignalIcon' @Component export default struct SignalIcon { @StorageLink('cellularLevel') cellularLevel: number = Constants.CELLULAR_NO_SIM_CARD - @StorageLink('cellularType') cellularType: number = Constants.NETWORK_TYPE_UNKNOWN + @StorageLink('cellularType') cellularType: number = Constants.RADIO_TECHNOLOGY_UNKNOWN @StorageLink('networkState') networkState: string = Constants.NET_NULL @StorageLink('signalObserved') signalObserved: boolean = false @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() @@ -62,7 +62,7 @@ export default struct SignalIcon { Stack({ alignContent: Alignment.TopStart }) { Text(this.updateCellularType(this.cellularType)) - .fontSize(this.cellularType == Constants.NETWORK_TYPE_UNKNOWN ? this.style.statusBarSignalUnknownFontSize : this.style.statusBarSignalTypeFontSize) + .fontSize(this.cellularType == Constants.RADIO_TECHNOLOGY_UNKNOWN ? this.style.statusBarSignalUnknownFontSize : this.style.statusBarSignalTypeFontSize) .fontColor(this.mTintContentInfo.contentColor) .width(this.style.netSignalTextMaxWidth) .fontWeight(FontWeight.Bold) @@ -92,24 +92,32 @@ export default struct SignalIcon { Log.showInfo(TAG, `updateCellularType, signalType: ${signalType}`); let typeString; switch (signalType) { - case Constants.NETWORK_TYPE_UNKNOWN: + case Constants.RADIO_TECHNOLOGY_UNKNOWN: typeString = $r('app.string.signal_null'); break; - case Constants.NETWORK_TYPE_GSM: - case Constants.NETWORK_TYPE_CDMA: + case Constants.RADIO_TECHNOLOGY_GSM: + case Constants.RADIO_TECHNOLOGY_1XRTT: typeString = $r('app.string.2G'); break; - case Constants.NETWORK_TYPE_W_CDMA: - case Constants.NETWORK_TYPE_TDS_CDMA: + case Constants.RADIO_TECHNOLOGY_WCDMA: + case Constants.RADIO_TECHNOLOGY_HSPA: + case Constants.RADIO_TECHNOLOGY_HSPAP: + case Constants.RADIO_TECHNOLOGY_TD_SCDMA: + case Constants.RADIO_TECHNOLOGY_EVDO: + case Constants.RADIO_TECHNOLOGY_EHRPD: typeString = $r('app.string.3G'); break; - case Constants.NETWORK_TYPE_LTE: + case Constants.RADIO_TECHNOLOGY_LTE: + case Constants.RADIO_TECHNOLOGY_LTE_CA: + case Constants.RADIO_TECHNOLOGY_IWLAN: typeString = $r('app.string.4G'); break; - case Constants.NETWORK_TYPE_NR: - default: + case Constants.RADIO_TECHNOLOGY_NR: typeString = $r('app.string.5G'); break; + default: + typeString = $r('app.string.signal_null'); + break; } return typeString; } diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ts b/features/signalcomponent/src/main/ets/default/signalModel.ts index 844f73a0..2b5fb422 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ts +++ b/features/signalcomponent/src/main/ets/default/signalModel.ts @@ -13,37 +13,64 @@ * limitations under the License. */ +import commonEvent from "@ohos.commonEvent"; import Radio from '@ohos.telephony.radio'; -import Sim from '@ohos.telephony.sim' +import Sim from '@ohos.telephony.sim'; import Observer from '@ohos.telephony.observer'; import Log from "../../../../../../common/src/main/ets/default/Log"; -import CheckEmpty from '../../../../../../common/src/main/ets/default/CheckEmptyUtils'; -import Constants from './common/constants' +import Constants from './common/constants'; const TAG = 'SignalStatus-SignalModel'; -const EMPTY_LEVEL = 0; -let mSignalCallback; -let signalValue = { - cellularLevel: '', - cellularType: '', - networkState: '' -}; -let isInitObserver = false +let isInitObserver = false; +let commonEventData = null; var mLevelLink; var mTypeLink; var mStateLink; export class SignalModel { - initSignalModel() { - Log.showInfo(TAG, 'initSignalModel'); + constructor() { mLevelLink = AppStorage.SetAndLink("cellularLevel", Constants.CELLULAR_NO_SIM_CARD); - mTypeLink = AppStorage.SetAndLink("cellularType", Constants.NETWORK_TYPE_UNKNOWN); + mTypeLink = AppStorage.SetAndLink("cellularType", Constants.RADIO_TECHNOLOGY_UNKNOWN); mStateLink = AppStorage.SetAndLink("networkState", Constants.NET_NULL); + this.addSubscriberListener(); + } + + initSignalModel() { + Log.showInfo(TAG, 'initSignalModel'); this.checkCellularStatus(); } + /** + * add mms app subscriber + */ + async addSubscriberListener() { + let events = [Constants.COMMON_EVENT_SPN_INFO_CHANGED]; + let commonEventSubscribeInfo = { + events: events + }; + commonEvent.createSubscriber(commonEventSubscribeInfo, this.createSubscriberCallBack.bind(this)); + } + + createSubscriberCallBack(err, data) { + commonEventData = data; + commonEvent.subscribe(commonEventData, this.subscriberCallBack.bind(this)); + } + + subscriberCallBack(err, data) { + Log.showInfo(TAG, `subscriberCallBack, err: ${JSON.stringify(err.message)}, event: ${data.event}`); + if (data.event === Constants.COMMON_EVENT_SPN_INFO_CHANGED) { + Log.showInfo(TAG, `receive stateLink: ${data?.parameters?.CUR_PLMN}`); + if (data?.parameters?.CUR_PLMN) { + mStateLink.set(data.parameters.CUR_PLMN); + } else { + Log.showError(TAG, `get stateLink failed.`); + mStateLink.set(Constants.NET_NULL); + } + } + } + uninitSignalModel() { Log.showInfo(TAG, 'uninitSignalModel'); this.unInitObserver(); @@ -53,66 +80,42 @@ export class SignalModel { * Check the connection type and signal level of cellular network */ checkCellularStatus() { - let cellularStatus; let slotId = 0; - Sim.hasSimCard(slotId, (err, value) => { if (value === true) { - //The interface of getting the cellular signal status is unavailable temporarily - Radio.getSignalInformation(slotId, (err, value) => { - if (err) { - // Failed to call the interface,error is not null - Log.showError(TAG, `failed to getSimState because ${err.message}`); - // When failed to call the interface, set the result as no signal + Radio.getNetworkState((err, value) => { + if (err || !value) { + Log.showError(TAG, `failed to getnetworkState because ${err.message}`); + mTypeLink.set(Constants.RADIO_TECHNOLOGY_UNKNOWN); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); - mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); } else { - // Call interface succeed,error is null - Log.showInfo(TAG, `success to getSignalInformation: ${JSON.stringify(value)}`); - // Since the value might be empty, set it as no signal by hand - if (!value || !value.length) { - Log.showError(TAG, 'value from api is empty, set 0'); + Log.showInfo(TAG, `success to getnetworkState: ${JSON.stringify(value)}`); + // If there is no service, no signal is displayed. + if (value.regState != Constants.REG_STATE_IN_SERVICE) { + mTypeLink.set(Constants.RADIO_TECHNOLOGY_UNKNOWN); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); - mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); } else { - Log.showInfo(TAG, 'get signal level by value.'); - mLevelLink.set(value[0].signalLevel); - mTypeLink.set(value[0].signalType); + mTypeLink.set(value.cfgTech); + Radio.getSignalInformation(slotId, (err, value) => { + if (err || !value || !value.length) { + Log.showError(TAG, `failed to getSimState because ${err.message}`); + mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); + } else { + Log.showInfo(TAG, `success to getSignalInfo: ${JSON.stringify(value)}`); + mLevelLink.set(value[0].signalLevel); + } + }); } } - - Log.showInfo(TAG, 'enter checknetworkState ============'); - //The interface of getting the cellular signal status is unavailable temporarily - Radio.getNetworkState((err, value) => { - if (err) { - // Failed to call the interface,error is not null - Log.showError(TAG, `failed to getnetworkState because ${err.message}`); - // When failed to call the interface, set the result as no signal - mStateLink.set(Constants.NET_NULL); - } else { - // Call interface succeed,error is null - Log.showInfo(TAG, `success to getnetworkState: ${JSON.stringify(value)}`); - // Since the value might be empty, set it as no signal by hand - if (!value) { - Log.showError(TAG, 'value from api is empty, set 0'); - mStateLink.set(Constants.NET_NULL); - } else { - mStateLink.set(value.longOperatorName); - } - } - }); }); - if (!isInitObserver) { - this.initObserver(); - } } else { Log.showError(TAG, `hasSimCard failed to hasSimCard because`); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); - mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); + mTypeLink.set(Constants.RADIO_TECHNOLOGY_UNKNOWN); mStateLink.set(Constants.NET_NULL); - if (!isInitObserver) { - this.initObserver(); - } + } + if (!isInitObserver) { + this.initObserver(); } }); } -- Gitee From 3f7872e48df0de130f774271b4775dcb96603fb1 Mon Sep 17 00:00:00 2001 From: lizhi Date: Thu, 15 Sep 2022 20:28:58 +0800 Subject: [PATCH 274/373] =?UTF-8?q?[screenlock]=E8=A7=A3=E5=86=B3=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E5=95=86=E6=98=BE=E7=A4=BA=E5=92=8C=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../src/main/ets/default/common/constants.ts | 43 ++++-- .../src/main/ets/default/pages/signalIcon.ets | 37 +++-- .../src/main/ets/default/signalModel.ts | 136 +++++++++--------- 3 files changed, 121 insertions(+), 95 deletions(-) diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ts b/features/signalcomponent/src/main/ets/default/common/constants.ts index 59b0e4d9..b62b8c0a 100644 --- a/features/signalcomponent/src/main/ets/default/common/constants.ts +++ b/features/signalcomponent/src/main/ets/default/common/constants.ts @@ -14,22 +14,35 @@ */ export default class Constants { + static readonly RADIO_TECHNOLOGY_UNKNOWN = 0; + static readonly RADIO_TECHNOLOGY_GSM = 1; + static readonly RADIO_TECHNOLOGY_1XRTT = 2; + static readonly RADIO_TECHNOLOGY_WCDMA = 3; + static readonly RADIO_TECHNOLOGY_HSPA = 4; + static readonly RADIO_TECHNOLOGY_HSPAP = 5; + static readonly RADIO_TECHNOLOGY_TD_SCDMA = 6; + static readonly RADIO_TECHNOLOGY_EVDO = 7; + static readonly RADIO_TECHNOLOGY_EHRPD = 8; + static readonly RADIO_TECHNOLOGY_LTE = 9; + static readonly RADIO_TECHNOLOGY_LTE_CA = 10; + static readonly RADIO_TECHNOLOGY_IWLAN = 11; + static readonly RADIO_TECHNOLOGY_NR = 12; - static NETWORK_TYPE_UNKNOWN = 0; - static NETWORK_TYPE_GSM = 1; - static NETWORK_TYPE_CDMA = 2; - static NETWORK_TYPE_W_CDMA = 3; - static NETWORK_TYPE_TDS_CDMA = 4; - static NETWORK_TYPE_LTE = 5; - static NETWORK_TYPE_NR = 6; + static readonly REG_STATE_NO_SERVICE = 0; + static readonly REG_STATE_IN_SERVICE = 1; + static readonly REG_STATE_EMERGENCY_CALL_ONLY = 2; + static readonly REG_STATE_POWER_OFF = 3; - static CELLULAR_SIGNAL_NO = 0; - static CELLULAR_SIGNAL_MIN = 1; - static CELLULAR_SIGNAL_LOW = 2; - static CELLULAR_SIGNAL_HALF = 3; - static CELLULAR_SIGNAL_HIGH = 4; - static CELLULAR_SIGNAL_FULL = 5; - static CELLULAR_NO_SIM_CARD = -1; + static readonly CELLULAR_SIGNAL_NO = 0; + static readonly CELLULAR_SIGNAL_MIN = 1; + static readonly CELLULAR_SIGNAL_LOW = 2; + static readonly CELLULAR_SIGNAL_HALF = 3; + static readonly CELLULAR_SIGNAL_HIGH = 4; + static readonly CELLULAR_SIGNAL_FULL = 5; + static readonly CELLULAR_NO_SIM_CARD = -1; - static NET_NULL = 'NULL'; + static readonly NET_NULL = 'NULL'; + + // Events for Subscribing to Notifications + static readonly COMMON_EVENT_SPN_INFO_CHANGED = "usual.event.SPN_INFO_CHANGED"; } diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 248a0156..21ae7ac3 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -26,9 +26,9 @@ const TAG = 'SignalComponent-SignalIcon' @Component export default struct SignalIcon { - @StorageLink('cellularLevel') cellularLevel: number = Constants.CELLULAR_NO_SIM_CARD - @StorageLink('cellularType') cellularType: number = Constants.NETWORK_TYPE_UNKNOWN - @StorageLink('networkState') networkState: string = Constants.NET_NULL + @StorageLink('cellularLevel_screenLock') cellularLevel: number = Constants.CELLULAR_NO_SIM_CARD + @StorageLink('cellularType_screenLock') cellularType: number = Constants.RADIO_TECHNOLOGY_UNKNOWN + @StorageLink('networkState_screenLock') networkState: string = Constants.NET_NULL @StorageLink('signalObserved') signalObserved: boolean = false private mGroupId: string = '' @State mStatusBarGroupComponentData: StatusBarGroupComponentData = new StatusBarGroupComponentData() @@ -64,7 +64,7 @@ export default struct SignalIcon { Stack({ alignContent: Alignment.TopStart }) { Text(this.updateCellularType(this.cellularType)) - .fontSize(this.cellularType == Constants.NETWORK_TYPE_UNKNOWN ? this.style.statusBarSignalUnknownFontSize : this.style.statusBarSignalTypeFontSize) + .fontSize(this.cellularType == Constants.RADIO_TECHNOLOGY_UNKNOWN ? this.style.statusBarSignalUnknownFontSize : this.style.statusBarSignalTypeFontSize) .fontColor(this.mStatusBarGroupComponentData.contentColor) .width(this.style.netSignalTextMaxWidth) .fontWeight(FontWeight.Bold) @@ -81,7 +81,8 @@ export default struct SignalIcon { } .height('100%') } - /* + + /** * Get the string of cellular type * * @param {number} type - number of cellular type @@ -91,29 +92,37 @@ export default struct SignalIcon { Log.showInfo(TAG, `updateCellularType, signalType: ${signalType}`); let typeString; switch (signalType) { - case Constants.NETWORK_TYPE_UNKNOWN: + case Constants.RADIO_TECHNOLOGY_UNKNOWN: typeString = $r('app.string.signal_null'); break; - case Constants.NETWORK_TYPE_GSM: - case Constants.NETWORK_TYPE_CDMA: + case Constants.RADIO_TECHNOLOGY_GSM: + case Constants.RADIO_TECHNOLOGY_1XRTT: typeString = $r('app.string.2G'); break; - case Constants.NETWORK_TYPE_W_CDMA: - case Constants.NETWORK_TYPE_TDS_CDMA: + case Constants.RADIO_TECHNOLOGY_WCDMA: + case Constants.RADIO_TECHNOLOGY_HSPA: + case Constants.RADIO_TECHNOLOGY_HSPAP: + case Constants.RADIO_TECHNOLOGY_TD_SCDMA: + case Constants.RADIO_TECHNOLOGY_EVDO: + case Constants.RADIO_TECHNOLOGY_EHRPD: typeString = $r('app.string.3G'); break; - case Constants.NETWORK_TYPE_LTE: + case Constants.RADIO_TECHNOLOGY_LTE: + case Constants.RADIO_TECHNOLOGY_LTE_CA: + case Constants.RADIO_TECHNOLOGY_IWLAN: typeString = $r('app.string.4G'); break; - case Constants.NETWORK_TYPE_NR: - default: + case Constants.RADIO_TECHNOLOGY_NR: typeString = $r('app.string.5G'); break; + default: + typeString = $r('app.string.signal_null'); + break; } return typeString; } - /* + /** * Get the cellular signal image * * @param {number} level - signal level from signalModel diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ts b/features/signalcomponent/src/main/ets/default/signalModel.ts index b7440ced..1e16a3bb 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ts +++ b/features/signalcomponent/src/main/ets/default/signalModel.ts @@ -13,39 +13,66 @@ * limitations under the License. */ +import commonEvent from "@ohos.commonEvent"; import Radio from '@ohos.telephony.radio'; -import Sim from '@ohos.telephony.sim' +import Sim from '@ohos.telephony.sim'; import Observer from '@ohos.telephony.observer'; import Log from "../../../../../../common/src/main/ets/default/Log"; -import CheckEmpty from '../../../../../../common/src/main/ets/default/CheckEmptyUtils'; -import Constants from './common/constants' +import Constants from './common/constants'; const TAG = 'SignalStatus-SignalModel'; -const EMPTY_LEVEL = 0; -let mSignalCallback; -let signalValue = { - cellularLevel: '', - cellularType: '', - networkState: '' -}; -let isInitObserver = false +let isInitObserver = false; +let commonEventData = null; var mLevelLink; var mTypeLink; var mStateLink; export class SignalModel { + constructor() { + mLevelLink = AppStorage.SetAndLink("cellularLevel_screenLock", Constants.CELLULAR_NO_SIM_CARD); + mTypeLink = AppStorage.SetAndLink("cellularType_screenLock", Constants.RADIO_TECHNOLOGY_UNKNOWN); + mStateLink = AppStorage.SetAndLink("networkState_screenLock", Constants.NET_NULL); + this.addSubscriberListener(); + } + initSignalModel() { - Log.showDebug(TAG, 'initSignalModel'); - mLevelLink = AppStorage.SetAndLink("cellularLevel", Constants.CELLULAR_NO_SIM_CARD); - mTypeLink = AppStorage.SetAndLink("cellularType", Constants.NETWORK_TYPE_UNKNOWN); - mStateLink = AppStorage.SetAndLink("networkState", Constants.NET_NULL); + Log.showInfo(TAG, 'initSignalModel'); this.checkCellularStatus(); } + /** + * add mms app subscriber + */ + async addSubscriberListener() { + let events = [Constants.COMMON_EVENT_SPN_INFO_CHANGED]; + let commonEventSubscribeInfo = { + events: events + }; + commonEvent.createSubscriber(commonEventSubscribeInfo, this.createSubscriberCallBack.bind(this)); + } + + createSubscriberCallBack(err, data) { + commonEventData = data; + commonEvent.subscribe(commonEventData, this.subscriberCallBack.bind(this)); + } + + subscriberCallBack(err, data) { + Log.showInfo(TAG, `subscriberCallBack, err: ${JSON.stringify(err.message)}, event: ${data.event}`); + if (data.event === Constants.COMMON_EVENT_SPN_INFO_CHANGED) { + Log.showInfo(TAG, `receive stateLink: ${data?.parameters?.CUR_PLMN}`); + if (data?.parameters?.CUR_PLMN) { + mStateLink.set(data.parameters.CUR_PLMN); + } else { + Log.showError(TAG, `get stateLink failed.`); + mStateLink.set(Constants.NET_NULL); + } + } + } + uninitSignalModel() { - Log.showDebug(TAG, 'uninitSignalModel'); + Log.showInfo(TAG, 'uninitSignalModel'); this.unInitObserver(); } @@ -53,65 +80,42 @@ export class SignalModel { * Check the connection type and signal level of cellular network */ checkCellularStatus() { - let cellularStatus; let slotId = 0; - Log.showInfo(TAG, 'enter checkCellularStatus'); - Sim.hasSimCard(slotId, (err, value) => { if (value === true) { - //The interface of getting the cellular signal status is unavailable temporarily - Radio.getSignalInformation(slotId, (err, value) => { - if (err) { - // Failed to call the interface,error is not null - Log.showError(TAG, `failed to getSimState because ${err.message}`); - // When failed to call the interface, set the result as no signal + Radio.getNetworkState((err, value) => { + if (err || !value) { + Log.showError(TAG, `failed to getnetworkState because ${err.message}`); + mTypeLink.set(Constants.RADIO_TECHNOLOGY_UNKNOWN); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); - mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); } else { - // Call interface succeed,error is null - // Since the value might be empty, set it as no signal by hand - if (!value || !value.length) { - Log.showError(TAG, 'value from api is empty, set 0'); + Log.showInfo(TAG, `success to getnetworkState: ${JSON.stringify(value)}`); + // If there is no service, no signal is displayed. + if (value.regState != Constants.REG_STATE_IN_SERVICE) { + mTypeLink.set(Constants.RADIO_TECHNOLOGY_UNKNOWN); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); - mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); } else { - Log.showInfo(TAG, 'get signal level by value.'); - mLevelLink.set(value[0].signalLevel); - mTypeLink.set(value[0].signalType); + mTypeLink.set(value.cfgTech); + Radio.getSignalInformation(slotId, (err, value) => { + if (err || !value || !value.length) { + Log.showError(TAG, `failed to getSimState because ${err.message}`); + mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); + } else { + Log.showInfo(TAG, `success to getSignalInfo: ${JSON.stringify(value)}`); + mLevelLink.set(value[0].signalLevel); + } + }); } } - - //The interface of getting the cellular signal status is unavailable temporarily - Radio.getNetworkState((err, value) => { - if (err) { - // Failed to call the interface,error is not null - Log.showError(TAG, `failed to getnetworkState because ${err.message}`); - // When failed to call the interface, set the result as no signal - mStateLink.set(Constants.NET_NULL); - } else { - // Call interface succeed,error is null - Log.showDebug(TAG, `success to getnetworkState: ${JSON.stringify(value)}`); - // Since the value might be empty, set it as no signal by hand - if (!value) { - Log.showError(TAG, 'value from api is empty, set 0'); - mStateLink.set(Constants.NET_NULL); - } else { - mStateLink.set(value.longOperatorName); - } - } - }); }); - if (!isInitObserver) { - this.initObserver(); - } } else { Log.showError(TAG, `hasSimCard failed to hasSimCard because`); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); - mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); + mTypeLink.set(Constants.RADIO_TECHNOLOGY_UNKNOWN); mStateLink.set(Constants.NET_NULL); - if (!isInitObserver) { - this.initObserver(); - } + } + if (!isInitObserver) { + this.initObserver(); } }); } @@ -120,18 +124,18 @@ export class SignalModel { * init the observer of the cellular and signal */ initObserver() { - Log.showDebug(TAG, 'initObserver'); + Log.showInfo(TAG, 'initObserver'); isInitObserver = true; Observer.on('signalInfoChange', (signalInfoChange) => { - Log.showInfo(TAG, 'signalInfoChange'); + Log.showInfo(TAG, `signalInfoChange ${JSON.stringify(signalInfoChange)}`); this.checkCellularStatus(); }); Observer.on('networkStateChange', (networkState) => { - Log.showInfo(TAG, 'networkStateChange'); + Log.showInfo(TAG, `networkStateChange ${JSON.stringify(networkState)}`); this.checkCellularStatus(); }); Observer.on('simStateChange', (simStateInfo) => { - Log.showInfo(TAG, 'simStateChange'); + Log.showInfo(TAG, `simStateChange ${JSON.stringify(simStateInfo)}`); this.checkCellularStatus(); }); } @@ -140,7 +144,7 @@ export class SignalModel { * Uninit the observer of the cellular and signal */ unInitObserver() { - Log.showDebug(TAG, 'unInitObserver'); + Log.showInfo(TAG, 'unInitObserver'); Observer.off('signalInfoChange'); Observer.off('networkStateChange'); Observer.off('simStateChange'); -- Gitee From 57b9e39171bb51521de2f3c971356820ece00fc3 Mon Sep 17 00:00:00 2001 From: lizhi Date: Tue, 20 Sep 2022 17:27:14 +0800 Subject: [PATCH 275/373] [screenlock]modify screenLock Model and service Signed-off-by: lizhi --- .../ets/com/ohos/model/screenLockModel.ts | 43 +++-------- .../ets/com/ohos/model/screenLockService.ts | 75 +++++++++++-------- 2 files changed, 54 insertions(+), 64 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index e3d0a4c8..6028054b 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -25,37 +25,16 @@ const TAG = 'ScreenLock-ScreenLockModel'; export default class ScreenLockModel { @SysFaultLogger({FAULT_ID: FaultID.SCREEN_LOCK_MANAGER, MSG: "call func on failed"}) - eventListener(typeName: string, callback: Callback) { - Log.showDebug(TAG, `eventListener:typeName ${typeName}`); - switch (typeName) { - case "endScreenOn": - case "unlockScreen": - ScreenLockMar.on(typeName, () => { - Log.showInfo(TAG, `eventListener:callback`); - callback(); - }) - break; - case "beginSleep": - ScreenLockMar.on(typeName, (userId: number) => { - Log.showInfo(TAG, `eventListener:callback userId:${userId}`); - callback(); - }) - break; - case "systemReady": - ScreenLockMar.on(typeName, (err, data) => { - Log.showInfo(TAG, `eventListener:callback err: ${JSON.stringify(err)}, - data:${JSON.stringify(data)}`); - callback(); - }) - break; - case "lockScreen": - ScreenLockMar.on(typeName, () => { - Log.showInfo(TAG, `eventListener:callback`); - callback(); - }) - break; - default: - Log.showError(TAG, `eventListener:typeName ${typeName}`) + eventListener(callback: Callback) { + let isSuccess = ScreenLockMar.onSystemEvent((err, event)=>{ + Log.showInfo(TAG, `eventListener:callback:${event.eventType}`) + callback(event.eventType); + if (err) { + Log.showError(TAG, `on callback error -> ${JSON.stringify(err)}`); + } + }); + if (!isSuccess) { + callback('serviceRestart'); } } @@ -73,6 +52,7 @@ export default class ScreenLockModel { } showScreenLockWindow(callback: Callback) { + Log.showInfo(TAG, `isWallpaperShow is true: ${AppStorage.Get('isWallpaperShow')}`); AppStorage.SetOrCreate('isWallpaperShow', true); windowManager.find(Constants.WIN_NAME).then((win) => { win.show().then(() => { @@ -83,6 +63,7 @@ export default class ScreenLockModel { } hiddenScreenLockWindow(callback: Callback) { + Log.showInfo(TAG, `window hide`); Trace.end(Trace.CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT); windowManager.find(Constants.WIN_NAME).then((win) => { Trace.start(Trace.CORE_METHOD_HIDE_PSD_PAGE); diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 8993e65c..40d6d181 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -47,6 +47,8 @@ const EVENT_CHANGE_USER: string = 'changeUser' const EVENT_SCREENLOCK_ENABLE: string = 'screenlockEnabled' const EVENT_SYSTEM_READY: string = 'systemReady' +const SERVICE_RESTART: string = 'serviceRestart' + const LOCK_SCREEN_RESULT: string = 'lockScreenResult' const UNLOCK_SCREEN_RESULT: string = 'unlockScreenResult' const SCREENLOCK_DRAW_DONE: string = 'screenDrawDone' @@ -104,27 +106,46 @@ export class ScreenLockService { monitorEvents() { Log.showDebug(TAG, 'registered events start'); - - // System ready on device boot - this.screenLockModel.eventListener(EVENT_SYSTEM_READY, () => { - Log.showInfo(TAG, `EVENT_SYSTEM_READY event`); - this.lockScreen(); - }) - - //Bright screen - this.screenLockModel.eventListener(EVENT_END_SCREEN_ON, () => { - Log.showInfo(TAG, `EVENT_END_SCREEN_ON event`); - this.authUserByFace() - AppStorage.SetOrCreate('deviceStatus', EVENT_END_SCREEN_ON); - }) - - //The device is going to sleep - this.screenLockModel.eventListener(EVENT_BEGIN_SLEEP, () => { - Trace.start(Trace.CORE_METHOD_SLEEP_TO_LOCK_SCREEN); - Log.showInfo(TAG, `EVENT_BEGIN_SLEEP event`); - this.lockScreen(); - this.accountModel.updateAllUsers() - AppStorage.SetOrCreate('deviceStatus', EVENT_BEGIN_SLEEP); + this.screenLockModel.eventListener((typeName: String) => { + switch (typeName) { + // System ready on device boot + case EVENT_SYSTEM_READY: + Log.showInfo(TAG, `EVENT_SYSTEM_READY event`); + this.lockScreen(); + break; + //Bright screen + case EVENT_END_SCREEN_ON: + Log.showInfo(TAG, `EVENT_END_SCREEN_ON event`); + this.authUserByFace() + AppStorage.SetOrCreate('deviceStatus', EVENT_END_SCREEN_ON); + break; + //The device is going to sleep + case EVENT_BEGIN_SLEEP: + Trace.start(Trace.CORE_METHOD_SLEEP_TO_LOCK_SCREEN); + Log.showInfo(TAG, `EVENT_BEGIN_SLEEP event`); + this.lockScreen(); + this.accountModel.updateAllUsers() + AppStorage.SetOrCreate('deviceStatus', EVENT_BEGIN_SLEEP); + break; + //unlock request was received + case EVENT_UNLOCK_SCREEN: + Log.showInfo(TAG, `EVENT_UNLOCK_SCREEN event`); + this.unlockScreen(); + break; + //lock request was received + case EVENT_LOCK_SCREEN: + Log.showInfo(TAG, `EVENT_UNLOCK_SCREEN event`); + this.unlockScreen(); + break; + case SERVICE_RESTART: + setTimeout(() => { + this.monitorEvents(); + this.lockScreen(); + }, 2000); + break; + default: + Log.showError(TAG, `eventListener:typeName ${typeName}`) + } }) this.accountModel.eventListener(ACTIVATING_TYPE, ACTIVATING_EVENT, () => { @@ -146,18 +167,6 @@ export class ScreenLockService { this.accountModel.updateAllUsers(); }) - //unlock request was received - this.screenLockModel.eventListener(EVENT_UNLOCK_SCREEN, () => { - Log.showInfo(TAG, `EVENT_UNLOCK_SCREEN event`); - this.unlockScreen(); - }); - - //lock request was received - this.screenLockModel.eventListener(EVENT_LOCK_SCREEN, () => { - Log.showInfo(TAG, `EVENT_LOCK_SCREEN event`); - this.lockScreen(); - }); - Log.showDebug(TAG, 'registered events end'); } -- Gitee From 4e2a662672b2723483ee36c183f5f56cfb8707d5 Mon Sep 17 00:00:00 2001 From: lizhi Date: Sun, 25 Sep 2022 10:30:37 +0800 Subject: [PATCH 276/373] =?UTF-8?q?[systemui]=E4=BC=98=E5=8C=96=E5=B8=83?= =?UTF-8?q?=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../main/ets/template/SimpleToggleBase.ets | 5 +- .../src/main/ets/template/iconComponent.ets | 42 ++-- .../src/main/ets/template/iconTitleBase.ets | 73 +++--- .../ets/default/pages/brightnessComponent.ets | 76 +++--- .../com/ohos/pages/ControlCenterComponent.ets | 68 +++--- .../pages/SimpleToggleLayoutEditComponent.ets | 217 +++++++---------- .../ohos/pages/SimpleToggleLayoutEditGrid.ets | 1 - .../src/main/ets/com/ohos/pages/UpTitle.ets | 112 ++++----- .../ohos/view/component/appLstComponent.ets | 76 +++--- .../com/ohos/view/component/itemComponent.ets | 45 ++-- .../noticeItem/model/NotificationManager.ts | 1 + .../com/ohos/pages/VolumePanelComponent.ets | 106 ++++----- .../ets/pages/notificationManagenment.ets | 221 +++++++++--------- .../controlpanel/src/main/ets/pages/index.ets | 23 +- 14 files changed, 456 insertions(+), 610 deletions(-) diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/template/SimpleToggleBase.ets index fb34efea..f69c9dd5 100644 --- a/common/src/main/ets/template/SimpleToggleBase.ets +++ b/common/src/main/ets/template/SimpleToggleBase.ets @@ -79,9 +79,6 @@ export default struct SimpleToggleBase { .onClick(this.onIconItemClick.bind(this)) if (!this.mDragMode) { - Column() - .width('100%') - .height(this.style.componentGap) Stack() { Flex() .backgroundColor(this.mTextIsHover ? this.style.hoverColor : this.style.transparentColor) @@ -99,7 +96,7 @@ export default struct SimpleToggleBase { .onHover((isHover) => { this.mTextIsHover = isHover; }) - } + }.margin({top: this.style.componentGap}) } } .width('100%') diff --git a/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/template/iconComponent.ets index d586ca28..691c10f9 100644 --- a/common/src/main/ets/template/iconComponent.ets +++ b/common/src/main/ets/template/iconComponent.ets @@ -38,28 +38,26 @@ export default struct iconComponent { } build() { - Column() { - Stack() { - Flex() - .backgroundColor(this.changeSwitch ? this.style.iconOnBG : this.style.iconOffBG) - .clip(new Circle({ width: this.style.circleWidth, height: this.style.circleHeight })) - .width(this.style.circleWidth) - .height(this.style.circleHeight) - Flex() - .backgroundColor(this.mIconIsHover ? this.style.hoverColor : this.style.transparentColor) - .clip(new Circle({ width: this.style.circleWidth, height: this.style.circleHeight })) - .width(this.style.circleWidth) - .height(this.style.circleHeight) - Image(this.changeSwitch == false ? (this.useIconStr ? this.iconOffStr : this.iconOff) : (this.useIconStr ? this.iconOnStr : this.iconOn)) - .size({ width: this.style.iconWidth, height: this.style.iconHeight }) - .objectFit(ImageFit.Contain) - .fillColor(this.changeSwitch ? this.style.iconOnColor : this.style.iconOffColor) - .onHover((isHover) => { - this.mIconIsHover = isHover; - }) - } - .width(this.style.circleWidth) - .height(this.style.circleHeight) + Stack() { + Flex() + .backgroundColor(this.changeSwitch ? this.style.iconOnBG : this.style.iconOffBG) + .clip(new Circle({ width: this.style.circleWidth, height: this.style.circleHeight })) + .width(this.style.circleWidth) + .height(this.style.circleHeight) + Flex() + .backgroundColor(this.mIconIsHover ? this.style.hoverColor : this.style.transparentColor) + .clip(new Circle({ width: this.style.circleWidth, height: this.style.circleHeight })) + .width(this.style.circleWidth) + .height(this.style.circleHeight) + Image(this.changeSwitch == false ? (this.useIconStr ? this.iconOffStr : this.iconOff) : (this.useIconStr ? this.iconOnStr : this.iconOn)) + .size({ width: this.style.iconWidth, height: this.style.iconHeight }) + .objectFit(ImageFit.Contain) + .fillColor(this.changeSwitch ? this.style.iconOnColor : this.style.iconOffColor) + .onHover((isHover) => { + this.mIconIsHover = isHover; + }) } + .width(this.style.circleWidth) + .height(this.style.circleHeight) } } diff --git a/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/template/iconTitleBase.ets index 69a3cb7f..0b6bb9c0 100644 --- a/common/src/main/ets/template/iconTitleBase.ets +++ b/common/src/main/ets/template/iconTitleBase.ets @@ -45,54 +45,43 @@ export default struct iconBaseComponent { build() { Row() { - Column().width(this.style.marginLeft).height('100%').layoutWeight(0) Row() { - Row() { - iconComponent({ - useIconStr: this.useIconStr, - iconOff: this.iconOff, - iconOn: this.iconOn, - iconOffStr: this.iconOffStr, - iconOnStr: this.iconOnStr, - changeSwitch: $changeSwitch, - }) - } - .onClick(() => { - Log.showDebug(TAG, `start clickEvent ${this.changeSwitch}`); - if (this.mClickEvent) { - this.mClickEvent() - } - Log.showDebug(TAG, `end clickEvent ${this.changeSwitch}`); + iconComponent({ + useIconStr: this.useIconStr, + iconOff: this.iconOff, + iconOn: this.iconOn, + iconOffStr: this.iconOffStr, + iconOnStr: this.iconOnStr, + changeSwitch: $changeSwitch, }) } .height('100%') - .layoutWeight(0) - - Column().width(this.style.componentGap).height('100%').layoutWeight(0) - Row() { - Row() { - Column().width(this.style.textMargin).height('100%').layoutWeight(0) - Text(this.useTitleStr ? this.mTitleStr : this.mTitle) - .fontSize(this.style.titleSize) - .fontColor(this.style.titleColor) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .maxLines(2) - .layoutWeight(1) - .onHover((isHover) => { - this.mTextIsHover = isHover; - }) - Column().width(this.style.textMargin).height('100%').layoutWeight(0) + .margin({left: this.style.marginLeft, right: this.style.componentGap}) + .onClick(() => { + Log.showDebug(TAG, `start clickEvent ${this.changeSwitch}`); + if (this.mClickEvent) { + this.mClickEvent() } - .width('100%') - .height(this.style.textHoverHeight) - .width(this.style.textHoverWidth) - .backgroundColor(this.mTextIsHover ? this.style.hoverColor : this.style.transparentColor) - .borderRadius(this.style.textHoverRadius) - .clip(true) - }.height('100%') - .layoutWeight(1) + Log.showDebug(TAG, `end clickEvent ${this.changeSwitch}`); + }) - Column().width(this.style.marginRight).height('100%').layoutWeight(0) + Row() { + Text(this.useTitleStr ? this.mTitleStr : this.mTitle) + .fontSize(this.style.titleSize) + .fontColor(this.style.titleColor) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .maxLines(2) + .margin({left: this.style.textMargin, right: this.style.textMargin}) + .onHover((isHover) => { + this.mTextIsHover = isHover; + }) + } + .width(this.style.textHoverWidth) + .height(this.style.textHoverHeight) + .margin({right: this.style.marginRight}) + .backgroundColor(this.mTextIsHover ? this.style.hoverColor : this.style.transparentColor) + .borderRadius(this.style.textHoverRadius) + .clip(true) } .borderRadius(this.style.borderRadius) .clip(true) diff --git a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets index be8062e5..5bd9f1ff 100644 --- a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets +++ b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets @@ -48,53 +48,43 @@ export default struct MyBrightness { build() { Row() { - Column().width(this.style.marginLeft).height('100%').layoutWeight(0) - Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { - Image($r('app.media.ic_brightness_reduce')) - .size({ width: this.style.brightnessReduceWidth, - height: this.style.brightnessReduceHeight }) - .fillColor(this.style.brightnessIconColor) - } - .width(this.style.brightnessPlusWidth) - .height('100%') - .layoutWeight(0) + Image($r('app.media.ic_brightness_reduce')) + .width(this.style.brightnessPlusWidth) + .height('100%') + .margin({left: this.style.marginLeft, right: this.style.componentGap}) + .size({ width: this.style.brightnessReduceWidth, + height: this.style.brightnessReduceHeight }) + .fillColor(this.style.brightnessIconColor) + .layoutWeight(0) - Column().width(this.style.componentGap).height('100%').layoutWeight(0) - Row() { - Slider({ - value: this.brightnessValue, - min: this.brightnessItem.min, - max: this.brightnessItem.max, - step: 1, - style: SliderStyle.InSet + Slider({ + value: this.brightnessValue, + min: this.brightnessItem.min, + max: this.brightnessItem.max, + step: 1, + style: SliderStyle.InSet + }) + .width('100%') + .height('100%') + .layoutWeight(1) + .trackThickness(this.style.sliderHeight) + .blockColor(this.style.sliderBlockColor) + .trackColor(this.style.sliderTrackColor) + .selectedColor(this.style.sliderSelectedColor) + .onChange((value: number, mode: SliderChangeMode) => { + this.brightnessItem.value = value; + this.setBrightness(this.brightnessItem, mode); }) - .width('100%') - .trackThickness(this.style.sliderHeight) - .blockColor(this.style.sliderBlockColor) - .trackColor(this.style.sliderTrackColor) - .selectedColor(this.style.sliderSelectedColor) - .onChange((value: number, mode: SliderChangeMode) => { - this.brightnessItem.value = value; - this.setBrightness(this.brightnessItem, mode); - }) - } - .height('100%') - .layoutWeight(1) - Column().width(this.style.componentGap).height('100%').layoutWeight(0) - - Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { - Image($r('app.media.ic_brightness_plus')) - .size({ width: this.style.brightnessPlusWidth, - height: this.style.brightnessPlusHeight }) - .fillColor(this.style.brightnessIconColor) - } - .width(this.style.brightnessPlusWidth) - .height('100%') - .layoutWeight(0) - - Column().width(this.style.marginRight).height('100%').layoutWeight(0) + Image($r('app.media.ic_brightness_plus')) + .width(this.style.brightnessPlusWidth) + .height('100%') + .margin({left: this.style.componentGap, right: this.style.marginRight}) + .size({ width: this.style.brightnessPlusWidth, + height: this.style.brightnessPlusHeight }) + .fillColor(this.style.brightnessIconColor) + .layoutWeight(0) }.width('100%') .height(this.style.brightnessHeight) } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index c73e6430..4f1a3be1 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -98,7 +98,6 @@ export default struct ControlCenterComponent { Column() { if (!this.mIsEditSimpleToggleLayout) { Column() { - Column().width('100%').height(this.style.marginTop) Column() { UpTitle({ touchMoveCallback: (data) => { @@ -111,36 +110,29 @@ export default struct ControlCenterComponent { } .width('100%') .height(this.style.upTitleHeight) - - Column().width('100%').height(this.style.titleMarginBottom) + .margin({top: this.style.marginTop, bottom: this.style.titleMarginBottom}) Row() { - Column().width(this.style.marginLeft).height(1).layoutWeight(0) - Column() { ControlCenterComplexToggleLayout() - Column().width('100%').height(this.style.toggleAreaGap) Column() { - Column().width('100%').height(this.style.simpleToggleLayoutMarginTop) ControlCenterSimpleToggleLayout({ mColumnCount: this.mSimpleToggleColumnCount }) Column().width('100%').height(this.style.simpleToggleLayoutMarginBottom) - MyBrightness() - - Column().width('100%').height(this.style.brightnessMarginBottom) } .width('100%') + .margin({top: this.style.toggleAreaGap}) + .padding({top: this.style.simpleToggleLayoutMarginTop, bottom: this.style.brightnessMarginBottom}) .borderRadius(this.style.componentBorderRadius) .clip(true) .backgroundColor(this.style.componentBackgroundColor) } - .layoutWeight(1) - - Column().width(this.style.marginRight).height(1).layoutWeight(0) - }.width('100%') + .margin({left: this.style.marginLeft, right: this.style.marginRight}) + } + .width('100%') } .width('100%') .transition({ type: TransitionType.Insert, opacity: 0, translate: { x: (-this.mWidthPx * 0.8) + 'px' } }) @@ -187,13 +179,12 @@ struct ControlCenterComplexToggleLayout { Grid() { ForEach(this.mComplexToggleLayout, (componentName) => { GridItem() { - Column() { - ComplexToggleLoadComponent({ - keyId: componentName - }) - }.width('100%') - .height('100%') + ComplexToggleLoadComponent({ + keyId: componentName + }) } + .width('100%') + .height('100%') }, (componentName) => componentName) } .width('100%') @@ -239,30 +230,23 @@ struct ControlCenterSimpleToggleLayout { } build() { - Row() { - Column().width(this.style.marginLeft).height(1).layoutWeight(0) - Grid() { - ForEach(this.mSimpleToggleLayout, (componentName) => { - GridItem() { - Column() { - SimpleToggleLoadComponent({ - keyId: componentName - }) - }.width('100%') - .height('100%') - } - }, (componentName) => componentName) - } - .layoutWeight(1) - .height(this.calcGridHeight(Math.ceil(this.mSimpleToggleLayout.length / this.mColumnCount), this.style.rowHeight, this.style.rowGap)) - .columnsTemplate(this.generateColumnsTemplate(this.mColumnCount)) - .rowsTemplate(this.generateRowsTemplate(Math.ceil(this.mSimpleToggleLayout.length / this.mColumnCount))) - .rowsGap(this.style.rowGap + 'px') - .columnsGap(this.style.columnGap) - - Column().width(this.style.marginRight).height(1).layoutWeight(0) + Grid() { + ForEach(this.mSimpleToggleLayout, (componentName) => { + GridItem() { + SimpleToggleLoadComponent({ + keyId: componentName + }) + }.width('100%') + .height('100%') + }, (componentName) => componentName) } .width('100%') + .height(this.calcGridHeight(Math.ceil(this.mSimpleToggleLayout.length / this.mColumnCount), this.style.rowHeight, this.style.rowGap)) + .margin({left: this.style.marginLeft, right: this.style.marginRight}) + .columnsTemplate(this.generateColumnsTemplate(this.mColumnCount)) + .rowsTemplate(this.generateRowsTemplate(Math.ceil(this.mSimpleToggleLayout.length / this.mColumnCount))) + .rowsGap(this.style.rowGap + 'px') + .columnsGap(this.style.columnGap) } calcGridHeight(rowCount, rowHeight, rowGap) { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets index 1f65cdd2..0468528e 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets @@ -89,10 +89,6 @@ export default struct SimpleToggleLayoutEditComponent { build() { Column() { - Column() - .width('100%') - .height(this.style.marginTop) - if (!this.titleDisplayInside) { Column() { SimpleToggleLayoutEditUpTitle({ @@ -101,144 +97,98 @@ export default struct SimpleToggleLayoutEditComponent { } .width('100%') .height(this.style.titleHeight) - - Column() - .width('100%') - .height(this.style.titleMarginBottom) + .margin({bottom: this.style.titleMarginBottom}) } - Row() { - Column().width(this.style.marginLeft).height(1).layoutWeight(0) - Column() { - if (this.titleDisplayInside) { - Column() { - SimpleToggleLayoutEditUpTitle({ - simpleToggleLayoutEditEndCallback: () => this.onSimpleToggleLayoutEditEnd() - }) - } - .width('100%') - .height(this.style.titleHeight) - } + Column() { + if (this.titleDisplayInside) { Column() { - Column() - .width('100%') - .height(this.style.upGridMarginTop) - - Row() { - Column().width(this.style.gridMarginLeft).height(1).layoutWeight(0) - Column() { - SimpleToggleLayoutEditGrid({ - mToggles: $mNewDisplayingToggles, - mMaxCount: this.mDisplayingTogglesMaxCount, - mMinCount: this.mDisplayingTogglesMinCount, - mColumnCount: this.mColumnCount, - mGlobalDragToggleName: this.mCurrentDragToggleName, - gridTag: 'displaying', - onItemDragStart: (toggleName) => this.onDisplayingGridItemDragStart(toggleName), - onItemDrop: (status) => this.onDisplayingGridItemDrop(status) - }) - }.layoutWeight(1) - - Column().width(this.style.gridMarginRight).height(1).layoutWeight(0) - }.width('100%') - - Column() - .width('100%') - .height(this.style.upGridMarginBottom) + SimpleToggleLayoutEditUpTitle({ + simpleToggleLayoutEditEndCallback: () => this.onSimpleToggleLayoutEditEnd() + }) } .width('100%') + .height(this.style.titleHeight) + } + Column() { + SimpleToggleLayoutEditGrid({ + mToggles: $mNewDisplayingToggles, + mMaxCount: this.mDisplayingTogglesMaxCount, + mMinCount: this.mDisplayingTogglesMinCount, + mColumnCount: this.mColumnCount, + mGlobalDragToggleName: this.mCurrentDragToggleName, + gridTag: 'displaying', + onItemDragStart: (toggleName) => this.onDisplayingGridItemDragStart(toggleName), + onItemDrop: (status) => this.onDisplayingGridItemDrop(status) + }) + } + .margin({top: this.style.upGridMarginTop, bottom: this.style.upGridMarginBottom, left: this.style.gridMarginLeft, right: this.style.gridMarginRight}) + Column() { Column() { - Column() - .width('100%') - .height(this.style.msgMarginTop) - SimpleToggleLayoutEditOptMsg({ mOptMsg: $mOptMsg }) - Column() - .width('100%') - .height(this.style.msgMarginBottom) - - Row() { - Column().width(this.style.gridMarginLeft).height(1).layoutWeight(0) - Column() { - SimpleToggleLayoutEditGrid({ - mToggles: $mNewHidingToggles, - mMaxCount: this.mHidingTogglesMaxCount, - mMinCount: this.mHidingTogglesMinCount, - mColumnCount: this.mColumnCount, - mGlobalDragToggleName: this.mCurrentDragToggleName, - gridTag: 'hiding', - onItemDragStart: (toggleName) => this.onHidingGridItemDragStart(toggleName), - onItemDrop: (status) => this.onHidingGridItemDrop(status) - }) - }.layoutWeight(1) - - Column().width(this.style.gridMarginRight).height(1).layoutWeight(0) - }.width('100%') - - Column() - .width('100%') - .height(this.style.btnMarginTop) - - Row() { - Column().width(this.style.editBtnMarginLeft).height(1).layoutWeight(0) - Grid() { - GridItem() { - Button({ type: ButtonType.Capsule, stateEffect: true }) { - Text($r("app.string.control_center_simple_toggle_layout_edit_reset")) - .fontColor(this.style.editBtnFontColor) - .fontSize(this.style.editBtnFontSize) - .fontWeight(FontWeight.Medium) - } - .backgroundColor(this.style.editBtnBgColor) - .width('100%') - .height('100%') - .onClick(this.onResetBtnClick.bind(this)) - } - - GridItem() { - Button({ type: ButtonType.Capsule, stateEffect: true }) { - Text($r("app.string.control_center_simple_toggle_layout_edit_finish")) - .fontColor(this.style.editBtnFontColor) - .fontSize(this.style.editBtnFontSize) - .fontWeight(FontWeight.Medium) - } - .backgroundColor(this.style.editBtnBgColor) - .width('100%') - .height('100%') - .onClick(this.onFinishBtnClick.bind(this)) - } - } - .layoutWeight(1) - .height(this.style.editBtnHeight) - .columnsTemplate('1fr 1fr') - .rowsTemplate('1fr') - .columnsGap(this.style.editBtnSpace) + }.margin({top: this.style.msgMarginTop}) - Column().width(this.style.editBtnMarginRight).height(1).layoutWeight(0) + Column() { + SimpleToggleLayoutEditGrid({ + mToggles: $mNewHidingToggles, + mMaxCount: this.mHidingTogglesMaxCount, + mMinCount: this.mHidingTogglesMinCount, + mColumnCount: this.mColumnCount, + mGlobalDragToggleName: this.mCurrentDragToggleName, + gridTag: 'hiding', + onItemDragStart: (toggleName) => this.onHidingGridItemDragStart(toggleName), + onItemDrop: (status) => this.onHidingGridItemDrop(status) + }) + }.margin({top: this.style.msgMarginBottom, bottom: this.style.btnMarginTop, left: this.style.gridMarginLeft, right: this.style.gridMarginRight}) + + Grid() { + GridItem() { + Button({ type: ButtonType.Capsule, stateEffect: true }) { + Text($r("app.string.control_center_simple_toggle_layout_edit_reset")) + .fontColor(this.style.editBtnFontColor) + .fontSize(this.style.editBtnFontSize) + .fontWeight(FontWeight.Medium) + } + .backgroundColor(this.style.editBtnBgColor) + .width('100%') + .height('100%') + .onClick(this.onResetBtnClick.bind(this)) } - .width('100%') - Column() + GridItem() { + Button({ type: ButtonType.Capsule, stateEffect: true }) { + Text($r("app.string.control_center_simple_toggle_layout_edit_finish")) + .fontColor(this.style.editBtnFontColor) + .fontSize(this.style.editBtnFontSize) + .fontWeight(FontWeight.Medium) + } + .backgroundColor(this.style.editBtnBgColor) .width('100%') - .height(this.style.btnMarginBottom) + .height('100%') + .onClick(this.onFinishBtnClick.bind(this)) + } } - .width('100%') - .backgroundColor(this.style.downAreaBgColor) - + .height(this.style.editBtnHeight) + .margin({bottom: this.style.btnMarginBottom, left: this.style.editBtnMarginLeft, right: this.style.editBtnMarginRight}) + .columnsTemplate('1fr 1fr') + .rowsTemplate('1fr') + .columnsGap(this.style.editBtnSpace) } - .layoutWeight(1) - .borderRadius(this.style.borderRadius) - .backgroundColor(this.style.upAreaBgColor) - .clip(true) + .width('100%') + .backgroundColor(this.style.downAreaBgColor) - Column().width(this.style.marginRight).height(1).layoutWeight(0) - }.width('100%') + } + .margin({left: this.style.marginLeft, right: this.style.marginRight}) + .borderRadius(this.style.borderRadius) + .backgroundColor(this.style.upAreaBgColor) + .clip(true) } .width('100%') + .margin({top: this.style.marginTop}) .onTouch(this.onComponentTouch.bind(this)) } @@ -378,18 +328,13 @@ struct SimpleToggleLayoutEditUpTitle { build() { Row() { - Row() - .width(this.style.marginLeft) - .height('100%') Image($r('app.media.ic_public_back')) + .margin({left: this.style.marginLeft, right: this.style.editTitleSpace}) .objectFit(ImageFit.Contain) .size({ width: this.style.imageWidth, height: this.style.imageHeight }) .fillColor(this.style.fontColor) .onClick(this.backClick.bind(this)) - Row() - .width(this.style.editTitleSpace) - .height('100%') Text($r('app.string.control_center_simple_toggle_layout_edit')) .fontColor(this.style.fontColor) .fontSize(this.style.titleFontSize) @@ -418,17 +363,13 @@ struct SimpleToggleLayoutEditOptMsg { } build() { - Row() { - Column().width(this.style.marginLeftRight).height(1).layoutWeight(0) - Column() { - Text(this.mOptMsg) - .fontSize(this.style.fontSize) - .fontColor(this.style.fontColor) - }.layoutWeight(1) - - Column().width(this.style.marginLeftRight).height(1).layoutWeight(0) + Column() { + Text(this.mOptMsg) + .fontSize(this.style.fontSize) + .fontColor(this.style.fontColor) } - .width('100%') .height(this.style.height) + .margin({left: this.style.marginLeftRight, right: this.style.marginLeftRight}) + .justifyContent(FlexAlign.Center) } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets index ee0cf5a0..e7596cb8 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets @@ -55,7 +55,6 @@ export default struct SimpleToggleLayoutEditGrid { } build() { - Grid() { ForEach(this.mToggles, (componentName: string) => { GridItem() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets index 688d4db7..ae809c6b 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets @@ -42,74 +42,64 @@ export default struct UpTitle { } build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.End, justifyContent: FlexAlign.SpaceBetween }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - Row() - .width(this.style.marginLeft) - .height('100%') - Text($r('app.string.control_center')) - .fontColor(this.style.fontColor) - .fontSize(this.style.fontSize) - .fontWeight(FontWeight.Medium) - } - .height('100%') + Row() { + Text($r('app.string.control_center')) + .height('100%') + .margin({left: this.style.marginLeft}) + .fontColor(this.style.fontColor) + .fontSize(this.style.fontSize) + .fontWeight(FontWeight.Medium) - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - Stack() { - Flex() - .backgroundColor(this.mSettingIsHover ? this.style.imageHoverColor : this.style.imageTransparentColor) - .clip(new Rect({ - width: this.style.imageHoverWidth, - height: this.style.imageHoverHeight - }).radius(this.style.imageHoverRadius)) - .width(this.style.imageHoverWidth) - .height(this.style.imageHoverHeight) - Image($r('app.media.ic_public_settings')) - .objectFit(ImageFit.Contain) - .size({ width: this.style.imageWidth, - height: this.style.imageHeight }) - .fillColor(this.style.titleImageColor) - .onClick(this.settingClick.bind(this)) - .onHover((isHover) => { - this.mSettingIsHover = isHover; - }) - } - .width(this.style.imageHoverWidth) - .height(this.style.imageHoverHeight) + Blank().height('100%') - Row() - .width(this.style.upTitleSpace) - .height('100%') - Stack() { - Flex() - .backgroundColor(this.mEditIsHover ? this.style.imageHoverColor : this.style.imageTransparentColor) - .clip(new Rect({ - width: this.style.imageHoverWidth, - height: this.style.imageHoverHeight - }).radius(this.style.imageHoverRadius)) - .width(this.style.imageHoverWidth) - .height(this.style.imageHoverHeight) - Image($r('app.media.ic_public_edit')) - .objectFit(ImageFit.Contain) - .size({ width: this.style.imageWidth, - height: this.style.imageHeight }) - .fillColor(this.style.titleImageColor) - .onClick(this.editClick.bind(this)) - .onHover((isHover) => { - this.mEditIsHover = isHover; - }) - } - .width(this.style.imageHoverWidth) - .height(this.style.imageHoverHeight) + Stack() { + Flex() + .backgroundColor(this.mSettingIsHover ? this.style.imageHoverColor : this.style.imageTransparentColor) + .clip(new Rect({ + width: this.style.imageHoverWidth, + height: this.style.imageHoverHeight + }).radius(this.style.imageHoverRadius)) + .width(this.style.imageHoverWidth) + .height(this.style.imageHoverHeight) + Image($r('app.media.ic_public_settings')) + .objectFit(ImageFit.Contain) + .size({ width: this.style.imageWidth, + height: this.style.imageHeight }) + .fillColor(this.style.titleImageColor) + .onClick(this.settingClick.bind(this)) + .onHover((isHover) => { + this.mSettingIsHover = isHover; + }) + } + .width(this.style.imageHoverWidth) + .height(this.style.imageHoverHeight) - Row() - .width(this.style.marginRight) - .height('100%') + Stack() { + Flex() + .backgroundColor(this.mEditIsHover ? this.style.imageHoverColor : this.style.imageTransparentColor) + .clip(new Rect({ + width: this.style.imageHoverWidth, + height: this.style.imageHoverHeight + }).radius(this.style.imageHoverRadius)) + .width(this.style.imageHoverWidth) + .height(this.style.imageHoverHeight) + Image($r('app.media.ic_public_edit')) + .objectFit(ImageFit.Contain) + .size({ width: this.style.imageWidth, + height: this.style.imageHeight }) + .fillColor(this.style.titleImageColor) + .onClick(this.editClick.bind(this)) + .onHover((isHover) => { + this.mEditIsHover = isHover; + }) } - .height('100%') + .width(this.style.imageHoverWidth) + .height(this.style.imageHoverHeight) + .margin({left: this.style.upTitleSpace, right: this.style.marginRight}) } .width('100%') .height('100%') + .alignItems(VerticalAlign.Center) .onTouch(this.touchEvent.bind(this)) } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets index 708aad89..6f80cf27 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets @@ -42,49 +42,45 @@ export default struct AppLstComponent { } build() { - Column() { - List() { - ForEach(this.appList, (item) => { - ListItem() { - AppItemComponent({ - appIcon: item.appIcon, - appTitle: item.appTitle, - appSummary: item.appSummary, - appValue: item.appValue, - appArrow: item.appArrow, - appArrowStyle: '', - appUri: item.appUri, - appBundleName: item.appBundleName, - appUid: item.appUid, - appSwitch: 0 - }) - } - .onClick(() => { - Log.showInfo(TAG, `onClick`); - Router.push({ uri: item.appUri, params: item }); + List() { + ForEach(this.appList, (item) => { + ListItem() { + AppItemComponent({ + appIcon: item.appIcon, + appTitle: item.appTitle, + appSummary: item.appSummary, + appValue: item.appValue, + appArrow: item.appArrow, + appArrowStyle: '', + appUri: item.appUri, + appBundleName: item.appBundleName, + appUid: item.appUid, + appSwitch: 0 }) - .height($r('app.float.appitem_item_height')) - }); - } - .divider({ - strokeWidth: 1, - color: $r('app.color.divider_color'), - startMargin: $r('app.float.divider_margin_l_info') - }) - .width(ConfigData.WH_100_100) - .align(Alignment.Top) - .visibility(Visibility.Visible) - .zIndex(0) - .border({ width: $r('app.float.border_width'), color: Color.White, - radius: $r('app.float.border_radius') }) - .backgroundColor(Color.White) - .padding({ - left: $r('app.float.itemComp_padding_l'), - right: $r('app.float.itemComp_padding_r') - }) + } + .onClick(() => { + Log.showInfo(TAG, `onClick`); + Router.push({ uri: item.appUri, params: item }); + }) + .height($r('app.float.appitem_item_height')) + }); } - .align(Alignment.Center) + .divider({ + strokeWidth: 1, + color: $r('app.color.divider_color'), + startMargin: $r('app.float.divider_margin_l_info') + }) .width(ConfigData.WH_100_100) + .align(Alignment.Top) + .visibility(Visibility.Visible) .flexShrink(1) + .zIndex(0) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + .padding({ + left: $r('app.float.itemComp_padding_l'), + right: $r('app.float.itemComp_padding_r') + }) } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets index 48ddac44..86d6e8b2 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets @@ -21,32 +21,31 @@ export default struct ItemComponent { @Link arrow: string | PixelMap | Resource; build() { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Row() { - Text(this.title) - .fontSize($r('sys.float.ohos_id_text_size_body1')) - .fontColor($r('app.color.itemComp_title_color')) - .width(ConfigData.WH_45_100) - .textAlign(TextAlign.Start) - .fontWeight(FontWeight.Medium) - Blank() - Text(this.value) - .fontSize($r('app.float.itemComp_value_font')) - .fontColor($r('app.color.itemComp_font_color')) - Image(this.arrow) - .width($r('app.float.itemComp_image_width')) - .height($r('app.float.itemComp_image_height')) - .align(Alignment.End) - .margin({left:$r('app.float.itemComp_image_margin_left')}) - } - .width(ConfigData.WH_100_100) - .alignItems(VerticalAlign.Center) - .padding({ left: $r('sys.float.ohos_id_default_padding_start'),right: $r('sys.float.ohos_id_default_padding_end')}) + Row() { + Text(this.title) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('app.color.itemComp_title_color')) + .width(ConfigData.WH_45_100) + .textAlign(TextAlign.Start) + .fontWeight(FontWeight.Medium) + Blank() + Text(this.value) + .fontSize($r('app.float.itemComp_value_font')) + .fontColor($r('app.color.itemComp_font_color')) + Image(this.arrow) + .width($r('app.float.itemComp_image_width')) + .height($r('app.float.itemComp_image_height')) + .align(Alignment.End) + .margin({left:$r('app.float.itemComp_image_margin_left')}) } .width(ConfigData.WH_100_100) .height($r('app.float.itemComp_height')) - .border({ width: $r('app.float.border_width'), color: Color.White, - radius: $r('app.float.border_radius') }) + .alignItems(VerticalAlign.Center) + .padding({ + left: $r('sys.float.ohos_id_default_padding_start'), + right: $r('sys.float.ohos_id_default_padding_end') + }) + .border({ width: $r('app.float.border_width'), color: Color.White, radius: $r('app.float.border_radius') }) .backgroundColor(Color.White) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index b6c3afc7..3759d1f3 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets index 80dacda8..31e6e650 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets @@ -41,81 +41,55 @@ export default struct VolumePanelComponent { build() { Column() { - Column().width('100%').height(this.style.volumePanelSliderMarginTop) - Column() { - Slider({ - value: this.VolumePanelVolumeValue, - min: this.VolumePanelMinVolume, - max: this.VolumePanelMaxVolume, - step: 1, - style: SliderStyle.OutSet, - direction: Axis.Vertical, - reverse: true - }) - .trackThickness(this.style.volumePanSliderWidth) - .blockColor(this.style.volumePanelSliderBlockColor) - .trackColor($r('sys.color.ohos_id_color_component_normal')) - .selectedColor(this.style.volumeSelectedColor) - .onChange(this.onVolumeChange.bind(this)) - } - .flexGrow(1) - .flexShrink(1) + Slider({ + value: this.VolumePanelVolumeValue, + min: this.VolumePanelMinVolume, + max: this.VolumePanelMaxVolume, + step: 1, + style: SliderStyle.OutSet, + direction: Axis.Vertical, + reverse: true + }) + .margin({top: this.style.volumePanelSliderMarginTop, bottom: this.style.volumePanelSliderMarginBottom}) + .trackThickness(this.style.volumePanSliderWidth) + .blockColor(this.style.volumePanelSliderBlockColor) + .trackColor($r('sys.color.ohos_id_color_component_normal')) + .selectedColor(this.style.volumeSelectedColor) + .onChange(this.onVolumeChange.bind(this)) + .flexGrow(1) + .flexShrink(1) - Column() - .width('100%') - .height(this.style.volumePanelSliderMarginBottom) - Column() { - Button({ type: ButtonType.Normal, stateEffect: true }) { - Column() { - Image(this.getVolumeIcon(this.VolumePanelIsMute, this.VolumePanelVolumeValue, this.VolumePanelMaxVolume, this.VolumePanelMinVolume)) - .width(this.style.volumePanelMutBtnIconSize) - .height(this.style.volumePanelMutBtnIconSize) - .fillColor($r('sys.color.ohos_id_color_activated')) - Column() - .width('100%') - .height(this.style.volumePanelMutBtnIconMarginBottom) - } - } - .width('100%') - .height('100%') - .backgroundColor(this.style.volumeButtonBackgroundColor) - .onClick(this.onMuteBtnClick.bind(this)) + Button({ type: ButtonType.Normal, stateEffect: true }) { + Image(this.getVolumeIcon(this.VolumePanelIsMute, this.VolumePanelVolumeValue, this.VolumePanelMaxVolume, this.VolumePanelMinVolume)) + .width(this.style.volumePanelMutBtnIconSize) + .height(this.style.volumePanelMutBtnIconSize) + .margin({bottom: this.style.volumePanelMutBtnIconMarginBottom}) + .fillColor($r('sys.color.ohos_id_color_activated')) } .width('100%') .height(this.style.volumePanelMuteBtnHeight) + .backgroundColor(this.style.volumeButtonBackgroundColor) + .onClick(this.onMuteBtnClick.bind(this)) - Column() { - Divider() - .vertical(false) - .strokeWidth(this.style.volumePanelDividerHeight) - .color($r('sys.color.ohos_id_color_fourth')) - .lineCap(LineCapStyle.Square) - } - .width(this.style.volumeDividerWidth) - .height(this.style.volumePanelDividerHeight) + Divider() + .width(this.style.volumeDividerWidth) + .height(this.style.volumePanelDividerHeight) + .vertical(false) + .strokeWidth(this.style.volumePanelDividerHeight) + .color($r('sys.color.ohos_id_color_fourth')) + .lineCap(LineCapStyle.Square) - Column() { - Button({ type: ButtonType.Circle, stateEffect: true }) { - Column() { - Column() - .width('100%') - .height(this.style.volumePanelMutBtnIconMarginBottom) - Image($r('app.media.ic_public_settings')) - .width(this.style.volumePanelSettingIconSize) - .height(this.style.volumePanelSettingIconSize) - .fillColor(this.style.volumePanelSettingColor) - Column() - .width('100%') - .height(this.style.volumePanelMutBtnIconMarginBottom) - } - } - .width('100%') - .height('100%') - .backgroundColor(this.style.volumeButtonBackgroundColor) - .onClick(this.onSettingsBtnClick.bind(this)) + Button({ type: ButtonType.Circle, stateEffect: true }) { + Image($r('app.media.ic_public_settings')) + .width(this.style.volumePanelSettingIconSize) + .height(this.style.volumePanelSettingIconSize) + .margin({top: this.style.volumePanelMutBtnIconMarginBottom, bottom: this.style.volumePanelMutBtnIconMarginBottom}) + .fillColor(this.style.volumePanelSettingColor) } .width('100%') .height(this.style.volumePanelSettingButtonSize) + .backgroundColor(this.style.volumeButtonBackgroundColor) + .onClick(this.onSettingsBtnClick.bind(this)) } .width('100%') .height('100%') diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index e46d75af..ed361eec 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -40,149 +40,140 @@ export default struct notificationManagenment { @State allowDistributDescribe: Resource = $r('app.string.allowDistributDescribe') build() { - Column() { - GridContainer({ + GridContainer({ columns: 12, sizeType: SizeType.Auto, gutter: vp2px(1) === 2 ? '12vp' : '0vp', margin: vp2px(1) === 2 ? '24vp' : '0vp' }) { - Row() { + Row() { + Column() { + HeadComponent({ headName: $headName, isActive: true }) Column() { - HeadComponent({ headName: $headName, isActive: true }) - Column() { - Row() { - Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { - Row() { - Column() { - Text($r('app.string.noDisturb')) - .fontSize($r('sys.float.ohos_id_text_size_body1')) - .fontColor($r('app.color.itemComp_title_color')) - .textAlign(TextAlign.Start) - .fontWeight(FontWeight.Bold) - .height($r('app.float.itemComp_height')) - .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) - } - .alignItems(HorizontalAlign.Start) - } - .flexShrink(1) - .align(Alignment.Start) - .alignItems(VerticalAlign.Center) - - Row() { - if (this.mViewModel.isEffective) { - Text($r('app.string.noDisturb_opened')) - .fontSize($r('sys.float.ohos_id_text_size_body1')) - .fontColor($r('app.color.itemComp_title_color')) - .align(Alignment.End) - .margin({ right: $r("app.float.noDisturb_text_margin_right") }) - .fontWeight(FontWeight.Medium) - } else { - Text($r('app.string.noDisturb_closed')) - .fontSize($r('sys.float.ohos_id_text_size_body1')) - .fontColor($r('app.color.itemComp_title_color')) - .align(Alignment.End) - .margin({ right: $r("app.float.noDisturb_text_margin_right") }) - .fontWeight(FontWeight.Medium) - } - Image($r('app.media.ic_settings_arrow')) + Row() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Column() { + Text($r('app.string.noDisturb')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('app.color.itemComp_title_color')) + .textAlign(TextAlign.Start) + .fontWeight(FontWeight.Bold) + .height($r('app.float.itemComp_height')) + .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) + } + .flexShrink(1) + .align(Alignment.Start) + .alignItems(HorizontalAlign.Start) + + Row() { + if (this.mViewModel.isEffective) { + Text($r('app.string.noDisturb_opened')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('app.color.itemComp_title_color')) + .align(Alignment.End) + .margin({ right: $r("app.float.noDisturb_text_margin_right") }) + .fontWeight(FontWeight.Medium) + } else { + Text($r('app.string.noDisturb_closed')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('app.color.itemComp_title_color')) .align(Alignment.End) - .width($r('app.float.itemComp_image_width')) - .height($r('app.float.itemComp_image_height')) + .margin({ right: $r("app.float.noDisturb_text_margin_right") }) + .fontWeight(FontWeight.Medium) } - .padding({ right: $r('sys.float.ohos_id_default_padding_end') }) - .flexShrink(0) - .align(Alignment.End) - .alignItems(VerticalAlign.Center) + Image($r('app.media.ic_settings_arrow')) + .align(Alignment.End) + .width($r('app.float.itemComp_image_width')) + .height($r('app.float.itemComp_image_height')) } - .width(ConfigData.WH_100_100) - .height($r('app.float.itemComp_height')) - .border({ width: $r('app.float.border_width'), color: Color.White, - radius: $r('app.float.border_radius') }) - .backgroundColor(Color.White) + .padding({ right: $r('sys.float.ohos_id_default_padding_end') }) + .flexShrink(0) + .align(Alignment.End) + .alignItems(VerticalAlign.Center) } - .height($r('app.float.itemComp_height')) - .margin({ top: $r('app.float.noDisturb_margin_lf') }) - .align(Alignment.Start) - .onClick(() => { - Log.showDebug(TAG, `NoDisturbComponent on click`) - Router.push({ uri: 'pages/noDisturbPre' }); - }) .width(ConfigData.WH_100_100) - .flexShrink(0) + .height($r('app.float.itemComp_height')) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + } + .height($r('app.float.itemComp_height')) + .margin({ top: $r('app.float.noDisturb_margin_lf') }) + .align(Alignment.Start) + .onClick(() => { + Log.showDebug(TAG, `NoDisturbComponent on click`) + Router.push({ uri: 'pages/noDisturbPre' }); + }) + .width(ConfigData.WH_100_100) + .flexShrink(0) - Column() { - Divider().color($r('app.color.divider_color')).strokeWidth(1) - } + Divider() + .color($r('app.color.divider_color')) + .strokeWidth(1) .padding({ left: $r('sys.float.ohos_id_default_padding_start'), right: $r('sys.float.ohos_id_default_padding_end') }) - Row() { - Row() { - SwitchComponent({ - title: $allowDistribut, - describe: this.allowDistributDescribe, - initializationAction: () => this.switchComponentInit(), - settingAction: (params) => this.switchComponentSet(params) - }) - } - }.margin({ bottom: $r('app.float.noDisturb_margin_lf') }) - } - .backgroundColor(Color.White) - .border({ width: $r('app.float.border_width'), color: Color.White, - radius: $r('app.float.border_radius') }) - .margin({ top: $r('app.float.page_notice_title_margin_t') }); - - Row() { - Text($r('app.string.notificationManagement')) - .fontColor($r('sys.color.ohos_id_color_text_secondary')) - .fontSize($r('sys.float.ohos_id_text_size_body2')) - .fontWeight(FontWeight.Medium) - .fontFamily('HarmonyHeiTi-Medium') - .margin({ top: $r('app.float.page_phrases_padding_t') }) - }.align(Alignment.Start) - .width(ConfigData.WH_100_100) - .height($r('app.float.page_phrases_height')) - .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) - Row() { - ItemComponent({ title: $title, value: '', arrow: $arrow }) - }.onClick(() => { - Log.showDebug(TAG, `BatchManagement on click`) - Router.push({ uri: 'pages/batchSetEnable' }); - }).width(ConfigData.WH_100_100) - .flexShrink(0) - - Column() { - AppLstComponent() - }.width(ConfigData.WH_100_100) - .layoutWeight(1) - .margin({ top: $r('app.float.applist_margin_t') }); - + SwitchComponent({ + title: $allowDistribut, + describe: this.allowDistributDescribe, + initializationAction: () => this.switchComponentInit(), + settingAction: (params) => this.switchComponentSet(params) + }) + }.margin({ bottom: $r('app.float.noDisturb_margin_lf') }) } + .backgroundColor(Color.White) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .margin({ top: $r('app.float.page_notice_title_margin_t') }); + + Row() { + Text($r('app.string.notificationManagement')) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .fontWeight(FontWeight.Medium) + .fontFamily('HarmonyHeiTi-Medium') + .margin({ top: $r('app.float.page_phrases_padding_t') }) + }.align(Alignment.Start) .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100) - .padding({ - left: $r('sys.float.ohos_id_default_padding_start'), - right: $r('sys.float.ohos_id_default_padding_end') - }) - .useSizeType({ - xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, - md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } - }); + .height($r('app.float.page_phrases_height')) + .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) + + Row() { + ItemComponent({ title: $title, value: '', arrow: $arrow }) + }.onClick(() => { + Log.showDebug(TAG, `BatchManagement on click`) + Router.push({ uri: 'pages/batchSetEnable' }); + }).width(ConfigData.WH_100_100) + .flexShrink(0) + + Column() { + AppLstComponent() + }.width(ConfigData.WH_100_100) + .layoutWeight(1) + .margin({ top: $r('app.float.applist_margin_t') }); } .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100); + .height(ConfigData.WH_100_100) + .padding({ + left: $r('sys.float.ohos_id_default_padding_start'), + right: $r('sys.float.ohos_id_default_padding_end') + }) + .useSizeType({ + xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, + md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } + }); + } .width(ConfigData.WH_100_100) .height(ConfigData.WH_100_100); } - .backgroundColor($r("sys.color.ohos_id_color_sub_background")) .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100); + .height(ConfigData.WH_100_100) + .backgroundColor($r("sys.color.ohos_id_color_sub_background")) } aboutToAppear(): void{ diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index 22d18015..aba3393f 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -87,25 +87,22 @@ struct Index { .width('100%') .height('100%') .objectFit(ImageFit.Fill) - Column() { - Scroll(new Scroller()) { - Column() { - ControlCenterComponent({ - modeChangeCallback: (isEdit) => this.onModeChange(isEdit) - }) - } - .width('100%') - .onAreaChange((e, e2) => { - Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + Scroll(new Scroller()) { + Column() { + ControlCenterComponent({ + modeChangeCallback: (isEdit) => this.onModeChange(isEdit) }) } - .scrollBarColor(Color.Gray) - .scrollBarWidth(10) .width('100%') + .onAreaChange((e, e2) => { + Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + }) } - .backgroundColor($r('app.color.default_background')) + .scrollBarColor(Color.Gray) + .scrollBarWidth(10) .width('100%') .height('100%') + .backgroundColor($r('app.color.default_background')) } .scale({ x: this.mWidthSize, -- Gitee From 73e1a6055c00526f724bb45ad71745c6f964fac8 Mon Sep 17 00:00:00 2001 From: lizhi Date: Sun, 25 Sep 2022 15:36:28 +0800 Subject: [PATCH 277/373] =?UTF-8?q?[systemui]=E5=88=A0=E9=99=A4=E6=95=8F?= =?UTF-8?q?=E6=84=9F=E4=BF=A1=E6=81=AF=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- common/src/main/ets/default/SwitchUserManager.ts | 2 +- common/src/main/ets/default/SysFaultLogger.ts | 4 ++-- .../main/ets/default/abilitymanager/featureAbilityManager.ts | 2 +- .../src/main/ets/plugindatasource/PluginDataSourceAdapter.ts | 2 +- .../main/ets/com/ohos/noticeItem/model/NotificationService.ts | 4 ++-- .../src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts | 2 +- .../com/ohos/noticeItem/viewmodel/NotificationViewModel.ts | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/common/src/main/ets/default/SwitchUserManager.ts b/common/src/main/ets/default/SwitchUserManager.ts index 32970e87..a6697064 100644 --- a/common/src/main/ets/default/SwitchUserManager.ts +++ b/common/src/main/ets/default/SwitchUserManager.ts @@ -98,7 +98,7 @@ export default class SwitchUserManager { AccountManager.getAccountManager() .queryOsAccountById(accountId) .then((accountInfo) => { - Log.showInfo(TAG, `userChange, accountInfo: ${JSON.stringify(accountInfo)}`); + Log.showInfo(TAG, `userChange, localId: ${accountInfo?.localId}`); this.mUserInfo = parseAccountInfo(accountInfo); this.notifyUserChange(); }) diff --git a/common/src/main/ets/default/SysFaultLogger.ts b/common/src/main/ets/default/SysFaultLogger.ts index 0e8a191e..85dd4d15 100644 --- a/common/src/main/ets/default/SysFaultLogger.ts +++ b/common/src/main/ets/default/SysFaultLogger.ts @@ -33,9 +33,9 @@ export function writeFaultLog(logParam: object) { eventType: hiSysEvent.EventType.FAULT, params: logParam } - Log.showInfo(TAG, "fault log params is : " + JSON.stringify(sysEventInfo)) + Log.showDebug(TAG, "fault log params is : " + JSON.stringify(sysEventInfo)) hiSysEvent.write(sysEventInfo, (err, val) => { - Log.showInfo(TAG, "fault log params is : " + JSON.stringify(sysEventInfo)) + Log.showDebug(TAG, "fault log params is : " + JSON.stringify(sysEventInfo)) Log.showInfo(TAG, `write fault log result: ${val}`) }) } diff --git a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts index d78ef390..a568427f 100644 --- a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts @@ -32,7 +32,7 @@ export default class FeatureAbilityManager { getAbilityWant(listener) { FeatureAbility.getWant((err, data) => { - Log.showInfo(TAG, `getAbilityWant callBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + Log.showInfo(TAG, `getAbilityWant callBack err: ${JSON.stringify(err)}`); if (err.code !== 0) { Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); return; diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts index d8e08cde..6fbb650d 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts @@ -98,7 +98,7 @@ export default class PluginDataSourceAdapter { }); break; default: - Log.showError(TAG, `name: ${this.mName}, unknown type: ${JSON.stringify(msg)}`); + Log.showError(TAG, `name: ${this.mName}, unknown type: ${data.action}`); } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index ccce9dac..2c27c7bd 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -68,7 +68,7 @@ export class NotificationService { loadAllNotifications(): void { NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { - Log.showInfo(TAG, `getAllActiveNotifications error:${err}}, requestsArr: ${JSON.stringify(requestsArr)}`); + Log.showDebug(TAG, `getAllActiveNotifications error:${err}}, requestsArr: ${JSON.stringify(requestsArr)}`); if (Array.isArray(requestsArr)) { for (let i = 0, len = requestsArr.length; i < len; i++) { this.handleNotificationAdd(requestsArr[i]); @@ -124,7 +124,7 @@ export class NotificationService { subscribeNotification(subscriber): void { let callback = (err, data) => { - Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)}`); }; NotificationManager.subscribeNotification(TAG, subscriber, callback); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index ed05ceea..37de305f 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -166,7 +166,7 @@ export default class ParseDataUtil { Log.showInfo(TAG, 'no match content type'); break; } - Log.showInfo(TAG, `notificationType = ${notificationType}, content = ${JSON.stringify(content)}`); + Log.showInfo(TAG, `notificationType = ${notificationType}`); return content; } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts index e3795749..4ced3463 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts @@ -68,7 +68,7 @@ export class NotificationViewModel { } userChange(userInfo): void { - Log.showInfo(TAG, `UserChange, userInfo: ${JSON.stringify(userInfo)}`); + Log.showInfo(TAG, `UserChange, userId: ${userInfo.userId}`); this.unregisterCallback(); this.mNotificationList.length = 0; this.initFlowControlInfos(); -- Gitee From b76e2a0cda1c1d58b3d337d40d1c6e55022b14e7 Mon Sep 17 00:00:00 2001 From: gaochao Date: Mon, 26 Sep 2022 15:04:26 +0800 Subject: [PATCH 278/373] =?UTF-8?q?[systemui]=E9=80=82=E9=85=8D=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=9D=83=E9=99=90=E8=AE=BF=E9=97=AE=E6=96=B0=E8=A7=84?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: gaochao --- .../default/abilitymanager/abilityManager.ts | 18 ++++++++++++++++++ entry/pc/src/main/module.json5 | 6 ++++++ entry/phone/src/main/module.json5 | 6 ++++++ .../ohos/navigationservice/KeyCodeEvent.ts | 2 +- .../ets/com/ohos/viewmodel/VolumePanelVM.ts | 2 +- signature/systemui.p7b | Bin 3924 -> 3742 bytes 6 files changed, 32 insertions(+), 2 deletions(-) diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/common/src/main/ets/default/abilitymanager/abilityManager.ts index e905d30b..fa37cb66 100644 --- a/common/src/main/ets/default/abilitymanager/abilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/abilityManager.ts @@ -100,4 +100,22 @@ export default class AbilityManager { } }); } + + static startServiceExtensionAbility(context: ServiceExtensionContext, want: Want, callback?: (error?: BusinessError) => void): void { + Log.showDebug(TAG, `startServiceExtensionAbility, want: ${JSON.stringify(want)}`); + if (context == null) { + context = AbilityManager.getContext(); + } + context.startServiceExtensionAbility(want).then(() => { + Log.showInfo(TAG, 'startServiceExtensionAbility, then'); + if (callback) { + callback(); + } + }).catch((error: BusinessError) => { + Log.showError(TAG, `startServiceExtensionAbility, error: ${JSON.stringify(error)}`); + if (callback) { + callback(error); + } + }); + } } diff --git a/entry/pc/src/main/module.json5 b/entry/pc/src/main/module.json5 index 8ed9ca82..0b678fa4 100644 --- a/entry/pc/src/main/module.json5 +++ b/entry/pc/src/main/module.json5 @@ -72,6 +72,12 @@ { "name": "ohos.permission.DISTRIBUTED_DATASYNC", "reason": "$string:distributed_data_sync_reason" + }, + { + "name": "ohos.permission.START_INVISIBLE_ABILITY" + }, + { + "name": "ohos.permission.START_ABILITIES_FROM_BACKGROUND" } ] } diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index c7f7a9f2..39b2d25d 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -72,6 +72,12 @@ { "name": "ohos.permission.DISTRIBUTED_DATASYNC", "reason": "$string:distributed_data_sync_reason" + }, + { + "name": "ohos.permission.START_INVISIBLE_ABILITY" + }, + { + "name": "ohos.permission.START_ABILITIES_FROM_BACKGROUND" } ] } diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts index ccd9c40d..3bd534f9 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts @@ -91,7 +91,7 @@ export class KeyCodeEvent { } private sendHomeKeyEvent() { - AbilityManager.startAbility(AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR), { + AbilityManager.startServiceExtensionAbility(AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR), { bundleName: Constants.LAUNCHER_BUNDLE_NAME, abilityName: Constants.LAUNCHER_ABILITY_NAME }); diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts index aa650992..17dfe7b8 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts @@ -114,7 +114,7 @@ export class VolumePanelVM { updateVolumeInfo(volumeInfo: VolumeInfo): void { Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} , mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType}`); - if (!volumeInfo.updateUi) { + if (!volumeInfo.updateUi && this.mIsMute.get() == volumeInfo.isMute) { return; } let volumeType = volumeInfo.volumeType; diff --git a/signature/systemui.p7b b/signature/systemui.p7b index 740ed7ac25ee542d79ba440e63bd76a4e854db79..4a9257baa3e90aeee81dfffa7391a12e2f747c5a 100644 GIT binary patch delta 730 zcmca2H%~Uxpowo58>d#AN85K^Ms}tJO?=%zp>`%lMnhf$ZZ^(@HV?*BW)>z!gC;g> zghIvzO>87#~N@b}<#hLkex_ODYsY+H#hI$5i21+_`;pF@jps=CN#99dnrTpUf z%)FA+^rFNPpcbI2($dTnC98>B)$5hY5_2+BGD|9ztg4mr@=J7+Qq%H_Kw3>LO)Shz zjZ7_cz~YH%C8uJxnjuKgs#Idifdo z#d^h+#U-h^rI|n-i3K@8Qy>EINr}ao$zZ_(-L%xil2VYPm4G_pp$ZZU3Y36uOia!x z2Dv3MCnvu=HANS~k5&R34s=>>W-%xnCvRmHoP3(qdNMbg=44AY&3YYl6?(xTjzJ;u zo_=AT!JbY&uJMjeo<5!-kxH>ZTM!0;Eh|a|`YkiL1ZW?MOf*O>(85wsP%0HXU+^%(Bd!)b!NJFWLAf|726#EW`eljmOcTiP09AI1I84k|*E*|IP*vA7$!GAS~Ayxz5GtwZ~V16CSRb%#%;2>m+no;_L4FLi&PU--e> q6-)~8%V&hn@5)^*8Qkr8aeAO&M9p6brRA?z-&^*S{T1II^DqF(bNbEz delta 900 zcmbOydqu9^pou?#jZ>@5qwPB{BRkWACVoetkS!A7TYn%M4E^KvNwfl^s&QE_H|o^D=ZZmN=%f|8-0fu4bq4w`IoehNs|5GI~z zR#2dul383*l$lgo0@7bnSpe3bUmTyASCX1uln4@r8&q1FnF2Im;!O2=n9+$jnJJki zl|WIbTfpwg%P-MQN=?fz0^4V5X<}h!YGi5wwHU4>F|8!E2;?F&3riDoW1tF%v9&N4 z!rW7onv<*6yUP^oB; zt(=p&SQS|zENxb6C@YOs6Uypm)kN}2ESfFA5XsFf2Bi{oyNXglDImE7XdSAeXmm4x z`b)tPrc{uf2~HtJd5JmTFadkHV6r}&IHSU3H#S8kUarmQY+u<}oeY{7?ItJkuC2E) zG&3+XH8nAcGSG*oWlk1DB^HJBnfgz5Z7nHHlA0WS&vsud7;uM@T7%jVlSU0V}azMgb42% qPoR>=o>e8gds9xGyE@Z$ySY%g`hjctNf~o^1-Mn0t-9mU{22h4Q~DYJ -- Gitee From 7d4e77f5a6f770bb806d8aa43d7b53ca49d08807 Mon Sep 17 00:00:00 2001 From: lizhi Date: Tue, 27 Sep 2022 20:35:56 +0800 Subject: [PATCH 279/373] =?UTF-8?q?[systemui]=E6=B7=BB=E5=8A=A0=E5=B9=BF?= =?UTF-8?q?=E6=92=AD=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- common/src/main/ets/template/SimpleToggleBase.ets | 2 +- entry/pc/src/main/module.json5 | 3 +++ entry/phone/src/main/module.json5 | 3 +++ .../src/main/ets/default/model/CapsuleModel.ts | 3 ++- .../src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets | 2 +- .../ets/com/ohos/noticeItem/view/item/iconListComponent.ets | 4 ++-- .../ets/com/ohos/noticeItem/view/item/notificationItem.ets | 2 +- 7 files changed, 13 insertions(+), 6 deletions(-) diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/template/SimpleToggleBase.ets index f69c9dd5..1d9cb900 100644 --- a/common/src/main/ets/template/SimpleToggleBase.ets +++ b/common/src/main/ets/template/SimpleToggleBase.ets @@ -25,7 +25,7 @@ export default struct SimpleToggleBase { @State mIconStr: string = '' private mUseIconStr: boolean = false private mAutoIconColor: boolean = false - @Prop mChangeSwitch: boolean + private mChangeSwitch: boolean @Link mLabel: string | Resource @State mLabelStr: string = '' private mUseLabelStr: boolean = false diff --git a/entry/pc/src/main/module.json5 b/entry/pc/src/main/module.json5 index 0b678fa4..dba1a241 100644 --- a/entry/pc/src/main/module.json5 +++ b/entry/pc/src/main/module.json5 @@ -78,6 +78,9 @@ }, { "name": "ohos.permission.START_ABILITIES_FROM_BACKGROUND" + }, + { + "name": "ohos.permission.GET_TELEPHONY_STATE" } ] } diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index 39b2d25d..cd0ec776 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -78,6 +78,9 @@ }, { "name": "ohos.permission.START_ABILITIES_FROM_BACKGROUND" + }, + { + "name": "ohos.permission.GET_TELEPHONY_STATE" } ] } diff --git a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts index 1b34b042..c7bfb79e 100644 --- a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts +++ b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts @@ -19,7 +19,8 @@ import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'CapsuleModel'; let commonEventSubscribeInfo = { - events: ['CAPSULE_EVENT_CALL_UI'] + events: ['CAPSULE_EVENT_CALL_UI'], + publisherPermission: "ohos.permission.GET_TELEPHONY_STATE" }; let commonEventSubscriber = null; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 0e2b21a2..c71141cc 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -130,7 +130,7 @@ export default struct GroupItem { } @Builder BottomLeftComponent() { - BottomLeftItem({itemData: this.groupData[0], height: 92}); + BottomLeftItem({itemData: this.groupData[0], bottomLeftItemHeight: 92}); } build() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets index 5994a0ac..d47c093f 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -117,7 +117,7 @@ export default struct IconListComponent { @Component export struct BottomLeftItem { private itemData: any = {}; - private height: number = 92; + private bottomLeftItemHeight: number = 92; private settingDialogController: CustomDialogController = new CustomDialogController({ builder: SettingDialog({ @@ -156,7 +156,7 @@ export struct BottomLeftItem { .width(Layout.BUTTON_SIZE) .height(Layout.BUTTON_SIZE) } - .height(this.height) + .height(this.bottomLeftItemHeight) .justifyContent(FlexAlign.SpaceEvenly) .alignItems(VerticalAlign.Center) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 6cc022e3..71884f65 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -58,7 +58,7 @@ export default struct NotificationItem { } @Builder BottomLeftComponent() { - BottomLeftItem({itemData: this.itemData, height: 92}); + BottomLeftItem({itemData: this.itemData, bottomLeftItemHeight: 92}); } build() { -- Gitee From f52658d236f020ad9a913a99d093817c8611ff1f Mon Sep 17 00:00:00 2001 From: lizhi Date: Thu, 29 Sep 2022 21:09:19 +0800 Subject: [PATCH 280/373] =?UTF-8?q?[screenlock]=E8=A7=A3=E5=86=B3jscrash?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AD=BE=E5=90=8D=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../src/main/ets/default/pages/signalIcon.ets | 4 ---- .../src/main/ets/default/signalModel.ts | 12 ++---------- signature/systemui.p7b | Bin 3922 -> 3742 bytes 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 21ae7ac3..d5dae586 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -89,7 +89,6 @@ export default struct SignalIcon { * @return {string} typeString type of cellular type */ private updateCellularType(signalType): string { - Log.showInfo(TAG, `updateCellularType, signalType: ${signalType}`); let typeString; switch (signalType) { case Constants.RADIO_TECHNOLOGY_UNKNOWN: @@ -129,7 +128,6 @@ export default struct SignalIcon { * @return {string} cellularImage image of cellular signal */ private updateCellularImage(level) { - Log.showInfo(TAG, `updateCellularImage, level: ${level}`); let cellularImage; switch (level) { case Constants.CELLULAR_SIGNAL_NO: @@ -155,7 +153,6 @@ export default struct SignalIcon { cellularImage = $r('app.media.ic_statusbar_signal_no'); break; } - Log.showInfo(TAG, 'systemui updateCellularImage = ' + cellularImage); return cellularImage; } @@ -166,7 +163,6 @@ export default struct SignalIcon { * @return {string} vendor's name or signal state */ private updateNetworkState(netWorkState) { - Log.showInfo(TAG, `updateNetworkState, netWorkState: ${netWorkState}`); let networkStateName; if (netWorkState == Constants.NET_NULL) { networkStateName = $r('app.string.net_null'); diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ts b/features/signalcomponent/src/main/ets/default/signalModel.ts index 1e16a3bb..188cd779 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ts +++ b/features/signalcomponent/src/main/ets/default/signalModel.ts @@ -59,10 +59,9 @@ export class SignalModel { } subscriberCallBack(err, data) { - Log.showInfo(TAG, `subscriberCallBack, err: ${JSON.stringify(err.message)}, event: ${data.event}`); if (data.event === Constants.COMMON_EVENT_SPN_INFO_CHANGED) { - Log.showInfo(TAG, `receive stateLink: ${data?.parameters?.CUR_PLMN}`); if (data?.parameters?.CUR_PLMN) { + Log.showInfo(TAG, `receive stateLink: ${data.parameters.CUR_PLMN}`); mStateLink.set(data.parameters.CUR_PLMN); } else { Log.showError(TAG, `get stateLink failed.`); @@ -85,11 +84,9 @@ export class SignalModel { if (value === true) { Radio.getNetworkState((err, value) => { if (err || !value) { - Log.showError(TAG, `failed to getnetworkState because ${err.message}`); mTypeLink.set(Constants.RADIO_TECHNOLOGY_UNKNOWN); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); } else { - Log.showInfo(TAG, `success to getnetworkState: ${JSON.stringify(value)}`); // If there is no service, no signal is displayed. if (value.regState != Constants.REG_STATE_IN_SERVICE) { mTypeLink.set(Constants.RADIO_TECHNOLOGY_UNKNOWN); @@ -98,10 +95,8 @@ export class SignalModel { mTypeLink.set(value.cfgTech); Radio.getSignalInformation(slotId, (err, value) => { if (err || !value || !value.length) { - Log.showError(TAG, `failed to getSimState because ${err.message}`); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); } else { - Log.showInfo(TAG, `success to getSignalInfo: ${JSON.stringify(value)}`); mLevelLink.set(value[0].signalLevel); } }); @@ -109,7 +104,7 @@ export class SignalModel { } }); } else { - Log.showError(TAG, `hasSimCard failed to hasSimCard because`); + Log.showWarn(TAG, `hasSimCard failed to hasSimCard because`); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); mTypeLink.set(Constants.RADIO_TECHNOLOGY_UNKNOWN); mStateLink.set(Constants.NET_NULL); @@ -127,15 +122,12 @@ export class SignalModel { Log.showInfo(TAG, 'initObserver'); isInitObserver = true; Observer.on('signalInfoChange', (signalInfoChange) => { - Log.showInfo(TAG, `signalInfoChange ${JSON.stringify(signalInfoChange)}`); this.checkCellularStatus(); }); Observer.on('networkStateChange', (networkState) => { - Log.showInfo(TAG, `networkStateChange ${JSON.stringify(networkState)}`); this.checkCellularStatus(); }); Observer.on('simStateChange', (simStateInfo) => { - Log.showInfo(TAG, `simStateChange ${JSON.stringify(simStateInfo)}`); this.checkCellularStatus(); }); } diff --git a/signature/systemui.p7b b/signature/systemui.p7b index 0d2f710536bab1ba6f0518deecc0b18073a25382..4a9257baa3e90aeee81dfffa7391a12e2f747c5a 100644 GIT binary patch delta 705 zcmca4H%~Uxpowo58>d#AN85K^Ms}tJO?=%zp>`%lMnhf$ZZ^(@HV?*BW)>z!gC;g> zghIvzO>87#~N@b}<#hLkex_ODYsY+H#hI$5i21+_`;pF@jps=CN#99dnrTpUf z%)FA+^rFNPpcbI2($dTnC98>B)$5hY5_2+BGD|9ztg4mr@=J7+Qq%H_Kw3>LO)Shz zjZ7_cz~YH%C8uJxnjuKgs#Idifdo z#d^h+#U-h^rI|n-i3K@8Qy>EINr}ao$zZ_(-L%xil2VYPm4G_pp$ZZU3Y36uOia!x z2Dv3MCnvu=HANS~k5&R34s=>>W-%xnCvRmHoP3(qdNMbg=44AY&3YYl6?(xTjzJ;u zo_=AT!JbY&uJMjeo<5!-kxH>ZTM!0;Eh|a|`YkiL1ZW?MOf*O>(85wsP%0HXU+^%(Bd!)b!NJFWC$>OS3O$ueUTZHn1=ZC`mYZcb3Z+*_&it6fQyX-n8wc8vM@8TxEr`KDKdP#-nD71 zL;HsVRvJ=uhfk&m{W|cTJz35#b$_2<_`%y1ObYSKXN1o0%3UoP-0gXBdZ1uL&0h(n R<*!%YTlSRw72hB8FaU|t^e+Ga delta 883 zcmbOydr7X|po!m)jZ>@5qwPB{BRkWACVqRMkTnw{qam*WHydX{n+IbmGYb==K@;11 zghIvzO>7TXn%M4C^KvNwfl^s&QE_H|o^D=ZZmN=%f|8-0fu4bq4w`IoehNs|5GI~z zR#2dul383*l$lgo0@7bnSpe3bUmTyASCX1uln4@r8&q1FnF2Im;!O2=n9+$jnJJki zl|WIbTfpwg%P-MQN=?fz0^4V5X<}h!YGi5wwHU4>F|8!E2;?F&3riDoW1tF%v9&N4 z!rW7onv<*6yUP^oB; zt(=p&SQS|zENxb6C@YOs6Uypm)kN}2ESfFA5XsFf2Bi{oyNXglDImE7XdSAeXmm4x z`b)tPrc{uf2~HtJd5JmTFadkHV6r}&1rsmV=5)5@?DZCgrUvE)28M=F2Kw-{%gJJ> z#G=r;F7&|FGZlxoJ+7TMxohW->Yvx6V?EhBW*6D+mR0RoW5C760n8QWY+0C@SlkU< znG_kmX6@RRuU{^?;M>uYe!p5`_X??nb^e%Z`?>^DqDRdTa*(Kv4V4 -- Gitee From 456b296b002127c64e325ec94126262413a34b83 Mon Sep 17 00:00:00 2001 From: lizhi Date: Thu, 29 Sep 2022 21:09:35 +0800 Subject: [PATCH 281/373] =?UTF-8?q?[systemui]=E8=A7=A3=E5=86=B3jscrash?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../src/main/ets/default/pages/signalIcon.ets | 4 ---- .../src/main/ets/default/signalModel.ts | 12 ++---------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 3d7e61a4..a59d2a37 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -89,7 +89,6 @@ export default struct SignalIcon { * @return {string} typeString type of cellular type */ private updateCellularType(signalType): string { - Log.showInfo(TAG, `updateCellularType, signalType: ${signalType}`); let typeString; switch (signalType) { case Constants.RADIO_TECHNOLOGY_UNKNOWN: @@ -129,7 +128,6 @@ export default struct SignalIcon { * @return {string} cellularImage image of cellular signal */ private updateCellularImage(level) { - Log.showInfo(TAG, `updateCellularImage, level: ${level}`); let cellularImage; switch (level) { case Constants.CELLULAR_SIGNAL_NO: @@ -155,7 +153,6 @@ export default struct SignalIcon { cellularImage = $r('app.media.ic_statusbar_signal_no'); break; } - Log.showInfo(TAG, 'updateCellularImage = ' + cellularImage); return cellularImage; } @@ -166,7 +163,6 @@ export default struct SignalIcon { * @return {string} vendor's name or signal state */ private updateNetworkState(netWorkState) { - Log.showInfo(TAG, `updateNetworkState, netWorkState: ${netWorkState}`); let networkStateName; if (netWorkState == Constants.NET_NULL) { networkStateName = $r('app.string.net_null'); diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ts b/features/signalcomponent/src/main/ets/default/signalModel.ts index 2b5fb422..8df6240f 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ts +++ b/features/signalcomponent/src/main/ets/default/signalModel.ts @@ -59,10 +59,9 @@ export class SignalModel { } subscriberCallBack(err, data) { - Log.showInfo(TAG, `subscriberCallBack, err: ${JSON.stringify(err.message)}, event: ${data.event}`); if (data.event === Constants.COMMON_EVENT_SPN_INFO_CHANGED) { - Log.showInfo(TAG, `receive stateLink: ${data?.parameters?.CUR_PLMN}`); if (data?.parameters?.CUR_PLMN) { + Log.showInfo(TAG, `receive stateLink: ${data.parameters.CUR_PLMN}`); mStateLink.set(data.parameters.CUR_PLMN); } else { Log.showError(TAG, `get stateLink failed.`); @@ -85,11 +84,9 @@ export class SignalModel { if (value === true) { Radio.getNetworkState((err, value) => { if (err || !value) { - Log.showError(TAG, `failed to getnetworkState because ${err.message}`); mTypeLink.set(Constants.RADIO_TECHNOLOGY_UNKNOWN); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); } else { - Log.showInfo(TAG, `success to getnetworkState: ${JSON.stringify(value)}`); // If there is no service, no signal is displayed. if (value.regState != Constants.REG_STATE_IN_SERVICE) { mTypeLink.set(Constants.RADIO_TECHNOLOGY_UNKNOWN); @@ -98,10 +95,8 @@ export class SignalModel { mTypeLink.set(value.cfgTech); Radio.getSignalInformation(slotId, (err, value) => { if (err || !value || !value.length) { - Log.showError(TAG, `failed to getSimState because ${err.message}`); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); } else { - Log.showInfo(TAG, `success to getSignalInfo: ${JSON.stringify(value)}`); mLevelLink.set(value[0].signalLevel); } }); @@ -109,7 +104,7 @@ export class SignalModel { } }); } else { - Log.showError(TAG, `hasSimCard failed to hasSimCard because`); + Log.showWarn(TAG, `hasSimCard failed to hasSimCard because`); mLevelLink.set(Constants.CELLULAR_NO_SIM_CARD); mTypeLink.set(Constants.RADIO_TECHNOLOGY_UNKNOWN); mStateLink.set(Constants.NET_NULL); @@ -127,15 +122,12 @@ export class SignalModel { Log.showInfo(TAG, 'initObserver'); isInitObserver = true; Observer.on('signalInfoChange', (signalInfoChange) => { - Log.showInfo(TAG, `signalInfoChange ${JSON.stringify(signalInfoChange)}`); this.checkCellularStatus(); }); Observer.on('networkStateChange', (networkState) => { - Log.showInfo(TAG, `networkStateChange ${JSON.stringify(networkState)}`); this.checkCellularStatus(); }); Observer.on('simStateChange', (simStateInfo) => { - Log.showInfo(TAG, `simStateChange ${JSON.stringify(simStateInfo)}`); this.checkCellularStatus(); }); } -- Gitee From a89e6c040000666b41e4b2b8b84098ffef9b410e Mon Sep 17 00:00:00 2001 From: SEASON_SYSU Date: Mon, 17 Oct 2022 15:10:15 +0800 Subject: [PATCH 282/373] fixed 3d8833a from https://gitee.com/season-sysu/applications_systemui/pulls/247 update code by zhangshuai in 2022.10.17 Signed-off-by: SEASON_SYSU --- common/src/main/ets/default/WindowManager.ts | 20 +++++- .../ServiceExtAbility/ServiceExtAbility.ts | 42 +++++++++++- .../src/main/ets/pages/SplitBarIndex.ets | 68 +++++++++++++++++++ .../resources/base/profile/main_pages.json | 3 +- 4 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 product/default/navigationBar/src/main/ets/pages/SplitBarIndex.ets diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index bff2449b..1d5b7526 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -34,13 +34,16 @@ export enum WindowType { NOTIFICATION_PANEL = 'SystemUi_NotificationPanel', CONTROL_PANEL = 'SystemUi_ControlPanel', VOLUME_PANEL = 'SystemUi_VolumePanel', - BANNER_NOTICE = 'SystemUi_BannerNotice' + BANNER_NOTICE = 'SystemUi_BannerNotice', + SPLIT_BAR = 'SystemUi_SplitBar' } export const WINDOW_SHOW_HIDE_EVENT = 'WindowShowHideEvent'; export const WINDOW_RESIZE_EVENT = 'WindowResizeEvent'; +export const WINDOW_Destroy = 'WindowDestroy'; + const TAG = "WindowManager"; const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: Window.WindowType } = { @@ -51,6 +54,7 @@ const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: Window.WindowType } = { SystemUi_ControlPanel: Window.WindowType.TYPE_VOLUME_OVERLAY, SystemUi_VolumePanel: Window.WindowType.TYPE_VOLUME_OVERLAY, SystemUi_BannerNotice: Window.WindowType.TYPE_VOLUME_OVERLAY, + SystemUi_SplitBar: 2101, }; const DEFAULT_WINDOW_INFO: WindowInfo = { @@ -121,6 +125,20 @@ class WindowManager { Log.showInfo(TAG, `hide window[${name}] success.`); } + async destroyWindow(name: WindowType): Promise { + let window = await Window.find(name); + await window.destroy() + this.mWindowInfos.delete(name) + EventManager.publish(( + obtainLocalEvent(WINDOW_Destroy, { + windowName: name, + isDestroy: true + } + + ) + )) + } + getWindowInfo(name: WindowType): WindowInfo | undefined { return this.mWindowInfos.get(name); } diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index fa7b6b2f..cca87ef8 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -20,8 +20,15 @@ import WindowManager, { WindowType } from '../../../../../../../common/src/main/ import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import NavBarConfiguration from '../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration'; import { Want } from 'ability/want'; +import CommonEvent from '@ohos.commonEvent'; const TAG = 'NavigationBar_ServiceExtAbility'; +let commonEventSubscribeInfo = {events:["common.event.SPLIT_SCREEN"]}; +const SplitBarMode = 'SplitBarComponentMode' +const SplitScreenEventData ={ + Show:'common.event.SPLIT_SCREEN.data.show.divider', + Destory:'common.event.SPLIT_SCREEN.data.destroy.divider' +} class ServiceExtAbility extends ServiceExtension { private direction :number; @@ -29,7 +36,6 @@ class ServiceExtAbility extends ServiceExtension { async onCreate(want: Want): Promise { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, this.context); - display.on("change", (id) => { Log.showInfo(TAG, "display change, data: " + JSON.stringify(id)) display.getAllDisplay().then((arrayDisplay) => { @@ -40,8 +46,12 @@ class ServiceExtAbility extends ServiceExtension { let nowDirection = -1; if (display.width > display.height) { nowDirection = 1; + let spilitBarDirection =AppStorage.SetAndLink(SplitBarMode, true) + spilitBarDirection.set(true) } else { nowDirection = 2; + let spilitBarDirection =AppStorage.SetAndLink(SplitBarMode, false) + spilitBarDirection.set(false) } if (nowDirection != this.direction) { this.createNewWindow(false); @@ -51,8 +61,6 @@ class ServiceExtAbility extends ServiceExtension { }) }) this.createNewWindow(true); - - } async createNewWindow (isNewWindow : boolean) { @@ -80,6 +88,34 @@ class ServiceExtAbility extends ServiceExtension { } else { WindowManager.resetSizeWindow(WindowType.NAVIGATION_BAR, navigationBarRect); } + CommonEvent.createSubscriber(commonEventSubscribeInfo).then((subscriber) => { + CommonEvent.subscribe(subscriber, (err,data)=>{ + let eventData = data.parameters.windowMode.toString() + if(eventData == SplitScreenEventData.Show){ + Log.showInfo(TAG,`eventData is ${eventData}`) + let splitBarRect = { + left: configInfo.realWidth/2 - 80, + top: configInfo.yCoordinate, + width: 16, + height: configInfo.maxHeight, + }; + WindowManager.createWindow(this.context, WindowType.SPLIT_BAR, splitBarRect, 'pages/SplitBarIndex').then(async () => + WindowManager.showWindow(WindowType.SPLIT_BAR) + ).then(() => { + subscriber.finishCommonEvent(); + }).catch((err) => { + }); + }else if( eventData == SplitScreenEventData.Destory){ + Log.showInfo(TAG,`eventData is ${eventData}`) + WindowManager.destroyWindow(WindowType.SPLIT_BAR).then(() => { + subscriber.finishCommonEvent(); + }).catch((err) => { + }); + }else{ + Log.showInfo(TAG,`eventData is ${eventData}`) + } + }) + }) } onDestroy(): void { diff --git a/product/default/navigationBar/src/main/ets/pages/SplitBarIndex.ets b/product/default/navigationBar/src/main/ets/pages/SplitBarIndex.ets new file mode 100644 index 00000000..cb81a3b8 --- /dev/null +++ b/product/default/navigationBar/src/main/ets/pages/SplitBarIndex.ets @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../common/src/main/ets/default/Log' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' + +const TAG = 'Navigation-SplitBar' + +@Entry +@Component +struct Index { + @State mHorizontalScreen: boolean = true; + @StorageLink('SplitBarComponentMode') @Watch('OnSplitBarUpdate') SplitBarComponentMode :boolean = true + + onBackPress(): boolean { + return true; + } + + OnSplitBarUpdate(){ + Log.showDebug(TAG,`updata--${this.SplitBarComponentMode}`) + this.mHorizontalScreen = this.SplitBarComponentMode + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear, start`); + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); + if (configInfo.maxWidth > configInfo.maxHeight) { + this.mHorizontalScreen = true; + } else { + this.mHorizontalScreen= false; + } + Log.showDebug(TAG, `aboutToAppear, end`); + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`); + } + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Button({ type: ButtonType.Capsule, stateEffect: true }) { + } + .backgroundColor(Color.White) + .width(this.mHorizontalScreen ? 7 : 80) + .height(this.mHorizontalScreen? 80 : 7) + .onTouch(this.touchEvent.bind(this)) + } + .width('100%') + .height('100%') + .backgroundColor(Color.Black) + } + + touchEvent(event: TouchEvent) { + Log.showDebug(TAG, 'touchEvent' + event.touches) + } +} \ No newline at end of file diff --git a/product/default/navigationBar/src/main/resources/base/profile/main_pages.json b/product/default/navigationBar/src/main/resources/base/profile/main_pages.json index feec276e..59129d3e 100644 --- a/product/default/navigationBar/src/main/resources/base/profile/main_pages.json +++ b/product/default/navigationBar/src/main/resources/base/profile/main_pages.json @@ -1,5 +1,6 @@ { "src": [ - "pages/index" + "pages/index", + "pages/SplitBarIndex" ] } -- Gitee From 4197b982e7527f0728ae3d6c7a8b767595632047 Mon Sep 17 00:00:00 2001 From: abc123 Date: Tue, 18 Oct 2022 17:08:25 +0800 Subject: [PATCH 283/373] =?UTF-8?q?=E7=AB=96=E5=B1=8F=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: abc123 --- .../src/main/ets/com/ohos/common/constants.ts | 1 + .../main/ets/com/ohos/model/accountsModel.ts | 4 +- .../ets/com/ohos/view/component/accounts.ets | 3 +- .../ets/com/ohos/view/component/customPSD.ets | 7 ++- .../com/ohos/view/component/digitalPSD.ets | 3 +- .../ets/com/ohos/view/component/mixedPSD.ets | 60 +++++++++++-------- .../main/resources/base/element/float.json | 14 ++++- .../main/resources/phone/element/float.json | 12 ++++ .../ServiceExtAbility/ServiceExtAbility.ts | 33 +++++++++- product/pc/src/main/ets/common/constants.ts | 1 + .../pc/src/main/ets/pages/customPassword.ets | 3 +- .../pc/src/main/ets/pages/digitalPassword.ets | 3 +- .../pc/src/main/ets/pages/slidescreenlock.ets | 3 +- .../main/resources/base/element/float.json | 4 ++ 14 files changed, 116 insertions(+), 35 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/common/constants.ts b/features/screenlock/src/main/ets/com/ohos/common/constants.ts index 50a95148..c15026f6 100644 --- a/features/screenlock/src/main/ets/com/ohos/common/constants.ts +++ b/features/screenlock/src/main/ets/com/ohos/common/constants.ts @@ -137,6 +137,7 @@ export default class Constants { static PASSWORD_TEXT_HEIGHT =40 static PASSWORD_TEXT_BORDER =20 static ACCOUNT_SPACE = 24 + static ACCOUNT_SPACE_PORTRAIT = 40 } export class StatusBarGroupComponentData { diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index 1353cda3..e1bc2178 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -99,7 +99,9 @@ export default class AccountsModel { Log.showInfo(TAG, `eventListener:typeName ${typeName}`); osAccount.getAccountManager().on(typeName, name, (userId: number) => { Log.showInfo(TAG, `on ${typeName} callback userId = ${userId}`) - this.mCurrentUserId = userId + if (typeName == "activate"){ + this.mCurrentUserId = userId + } callback() }) } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets index 5c53ab13..04591699 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets @@ -26,6 +26,7 @@ const TAG = 'ScreenLock-Accounts' export default struct Accounts { @State accountList: UserData[] = []; private mViewModel: ViewModel = new ViewModel(); + @StorageLink('screenlockdirection') screenlockdirection: number = 1 unSubscriber?: unsubscribe; aboutToAppear() { @@ -44,7 +45,7 @@ export default struct Accounts { build() { Row() { if (this.accountList.length > 1) { - List({ space: Constants.ACCOUNT_SPACE }) { + List({ space: this.screenlockdirection == 1 ? Constants.ACCOUNT_SPACE : Constants.ACCOUNT_SPACE_PORTRAIT }) { ForEach(this.accountList, (item: any) => { ListItem() { UserItem({ userItem: item, viewModel: this.mViewModel }) diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index 8ebfb7ae..8ac06a4e 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -25,6 +25,7 @@ const TAG = 'ScreenLock-CustomPSD' export default struct CustomPSD { @State mViewModel: ViewModel = new ViewModel() @StorageLink('passwordArr') passwordArr: any[] = this.mViewModel.passwordArr + @StorageLink('screenlockdirection') screenlockdirection: number = 1 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) @@ -79,14 +80,14 @@ export default struct CustomPSD { .listDirection(Axis.Horizontal) .height($r("app.float.custompsd_digitalpsd_ic_diameter")) } - .width($r('app.float.custompsd_input_width')) + .width(this.screenlockdirection == 1 ? $r('app.float.custompsd_input_width'):$r('app.float.custompsd_input_width_portrait')) .height($r('app.float.custompsd_input_height')) Button($r('app.string.done'), { type: ButtonType.Capsule, stateEffect: true }) - .width($r('app.float.custompsd_input_width')) + .width(this.screenlockdirection == 1 ? $r('app.float.custompsd_input_width'):$r('app.float.custompsd_input_width_portrait')) .height($r("app.float.custompsd_button_height")) .enabled(this.passwordArr.length >= 1) .opacity(deviceInfo.deviceType === 'tablet' ? 1 : (this.passwordArr.length >= 1 ? 1 : 0.4)) @@ -110,7 +111,7 @@ export default struct CustomPSD { } .width(Constants.FULL_CONTAINER_WIDTH) .height($r('app.float.custompsd_key_area_height')) - .margin({ bottom: $r('app.float.custompsd_key_area_margin_bottom') }) + .margin({ bottom: this.screenlockdirection == 1 ? $r('app.float.custompsd_key_area_margin_bottom') : $r('app.float.custompsd_key_area_margin_bottom_portrait')}) } .width(Constants.FULL_CONTAINER_WIDTH) } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets index dfa3f8df..32497878 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -24,6 +24,7 @@ const TAG = 'ScreenLock-DigitalPSD' export default struct DigitalPSD { @State mViewModel: ViewModel = new ViewModel() @StorageLink('passwdMaskArr') passwdMaskArr: any[] = this.mViewModel.passwdMaskArr + @StorageLink('screenlockdirection') screenlockdirection: number = 1 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) @@ -87,7 +88,7 @@ export default struct DigitalPSD { } .width(Constants.FULL_CONTAINER_WIDTH) .height($r('app.float.digitalpsd_key_area_height')) - .margin({ bottom: $r('app.float.digitalpsd_key_area_margin_bottom') }) + .margin({ bottom: this.screenlockdirection == 1 ? $r('app.float.digitalpsd_key_area_margin_bottom') : $r('app.float.digitalpsd_key_area_margin_bottom_portrait') }) .flexShrink(0) } .width(Constants.FULL_CONTAINER_WIDTH) diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets index c1767fe5..883f18ba 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets @@ -122,7 +122,7 @@ export default struct MixedPSD { .fontSize($r('app.float.mixedpsd_prompt_text_fontsize')) .width($r('app.float.mixedpsd_input_width')) .height($r('app.float.mixedpsd_input_height')) - .backgroundColor(Color.White) + .backgroundColor(Color.Gray) .enterKeyType(EnterKeyType.Done) .border({ width: 2, color: Color.Gray, radius: 15 }) .enabled(!this.mViewModel.inhibitInput) @@ -132,30 +132,42 @@ export default struct MixedPSD { Log.showInfo(TAG, `onSubmit callback prompt:${this.mViewModel.prompt} inhibitInput:${this.mViewModel.inhibitInput}`) }) }) - .margin({ bottom: $r('app.float.mixedpsd_input_margin_bottom') }) - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { - Text($r('app.string.emergency_call')) - .fontSize($r('app.float.mixedpsd_prompt_fontsize')) - .fontWeight(FontWeight.Bold) - .fontColor(Color.White) - .textAlign(TextAlign.Center) - .textOverflow({ overflow: TextOverflow.None }) - .onClick(this.mViewModel.onCallPhone.bind(this.mViewModel)); - Text($r('app.string.done')) - .fontSize($r('app.float.mixedpsd_prompt_fontsize')) - .fontWeight(FontWeight.Bold) - .fontColor(Color.White) - .textAlign(TextAlign.Center) - .textOverflow({ overflow: TextOverflow.None }) - .onClick(() => { - Log.showInfo(TAG, `onClick`) - this.mViewModel.onAuthPassword(() => { - Log.showInfo(TAG, `onClick callback prompt:${this.mViewModel.prompt} inhibitInput:${this.mViewModel.inhibitInput}`) - }); - }) - } - .width(Constants.HALF_CONTAINER_WIDTH) + Button('确认', { + type: ButtonType.Capsule, + stateEffect: true + }) + .width($r('app.float.mixedpsd_input_width')) + .height($r('app.float.mixedpsd_input_height')) + .onClick(() => { + Log.showInfo(TAG, `onClick`) + this.mViewModel.onAuthPassword(() => { + Log.showInfo(TAG, `onClick callback prompt:${this.mViewModel.prompt} inhibitInput:${this.mViewModel.inhibitInput}`) + }); + }) + .margin({ top: $r('sys.float.ohos_id_elements_margin_vertical_l'),bottom: $r('app.float.mixedpsd_input_margin_bottom')}) + + Text($r('app.string.emergency_call')) + .fontSize($r('app.float.mixedpsd_prompt_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .onClick(this.mViewModel.onCallPhone.bind(this.mViewModel)); + + /* Text($r('app.string.done')) + .fontSize($r('app.float.mixedpsd_prompt_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .onClick(() => { + Log.showInfo(TAG, `onClick`) + this.mViewModel.onAuthPassword(() => { + Log.showInfo(TAG, `onClick callback prompt:${this.mViewModel.prompt} inhibitInput:${this.mViewModel.inhibitInput}`) + }); + })*/ + } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) diff --git a/features/screenlock/src/main/resources/base/element/float.json b/features/screenlock/src/main/resources/base/element/float.json index e80e75b1..d4a68f77 100644 --- a/features/screenlock/src/main/resources/base/element/float.json +++ b/features/screenlock/src/main/resources/base/element/float.json @@ -108,6 +108,10 @@ "name": "digitalpsd_key_area_margin_bottom", "value": "64" }, + { + "name": "digitalpsd_key_area_margin_bottom_portrait", + "value": "128" + }, { "name": "mixedpsd_prompt_fontsize", "value": "32" @@ -146,7 +150,7 @@ }, { "name": "mixedpsd_input_margin_bottom", - "value": "128" + "value": "64" }, { "name": "custompsd_prompt_fontsize", @@ -168,6 +172,10 @@ "name": "custompsd_input_width", "value": "600" }, + { + "name": "custompsd_input_width_portrait", + "value": "700" + }, { "name": "custompsd_input_height", "value": "72" @@ -196,6 +204,10 @@ "name": "custompsd_key_area_margin_bottom", "value": "64" }, + { + "name": "custompsd_key_area_margin_bottom_portrait", + "value": "128" + }, { "name": "custompsd_text_opacity", "value": "1" diff --git a/features/screenlock/src/main/resources/phone/element/float.json b/features/screenlock/src/main/resources/phone/element/float.json index a60070ad..e2d226e1 100644 --- a/features/screenlock/src/main/resources/phone/element/float.json +++ b/features/screenlock/src/main/resources/phone/element/float.json @@ -108,6 +108,10 @@ "name": "digitalpsd_key_area_margin_bottom", "value": "52vp" }, + { + "name": "digitalpsd_key_area_margin_bottom_portrait", + "value": "52vp" + }, { "name": "mixedpsd_prompt_fontsize", "value": "16fp" @@ -168,6 +172,10 @@ "name": "custompsd_input_width", "value": "288vp" }, + { + "name": "custompsd_input_width_portrait", + "value": "288vp" + }, { "name": "custompsd_input_height", "value": "36vp" @@ -196,6 +204,10 @@ "name": "custompsd_key_area_margin_bottom", "value": "52vp" }, + { + "name": "custompsd_key_area_margin_bottom_portrait", + "value": "52vp" + }, { "name": "custompsd_text_opacity", "value": "0.2" diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index a1bf0ecd..324c873c 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -25,13 +25,41 @@ import sTimeManager from '../../../../../../common/src/main/ets/default/TimeMana const TAG = "ScreenLock-ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { + private direction :number; + onCreate(want) { Log.showInfo(TAG, 'onCreate, want:' + want.abilityName); AbilityManager.setContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK, this.context) sTimeManager.init(this.context) + + display.on("change", (id) => { + Log.showInfo(TAG, "screenlock display change, data: " + JSON.stringify(id)) + display.getAllDisplay().then(async (arrayDisplay) => { + Log.showInfo(TAG, "getAllDisplay : " + JSON.stringify(arrayDisplay)) + for (let display of arrayDisplay) { + Log.showInfo(TAG, "getAllDisplay start : " + JSON.stringify(display)); + if (id == display.id) { + if (display.width > display.height) { + this.direction = 1; + } else { + this.direction = 2; + } + Log.showInfo(TAG, "direction change : " + this.direction) + AppStorage.SetOrCreate('screenlockdirection', this.direction) + this.resetWindow(display.width,display.height) + } + } + }) + }) this.statusBarWindow() this.createWindow(Constants.WIN_NAME) } + private async resetWindow(width: number,height:number) { + Log.showInfo(TAG, "resetWindow width: " + width +",height:"+height) + let window = await windowManager.find(Constants.WIN_NAME); + Log.showInfo(TAG, "screenlock window : " + JSON.stringify(window)); + await window.resetSize(width,height) + } private createWindow(name: string) { Log.showDebug(TAG, `createWindow name:${name}`) @@ -63,6 +91,7 @@ class ServiceExtAbility extends ServiceExtension { width: '100%', height: (44 * dis.width) / 1280, } + this.direction =1 } else { // Phone verticalScreen Mode rect = { left: 0, @@ -70,7 +99,9 @@ class ServiceExtAbility extends ServiceExtension { width: '100%', height: (44 * dis.width) / 800 } - } + this.direction =2 + }; + AppStorage.SetOrCreate('screenlockdirection', this.direction); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "rect", rect); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "dis", { width: dis.width, diff --git a/product/pc/src/main/ets/common/constants.ts b/product/pc/src/main/ets/common/constants.ts index d215d71a..d69d4358 100644 --- a/product/pc/src/main/ets/common/constants.ts +++ b/product/pc/src/main/ets/common/constants.ts @@ -27,6 +27,7 @@ export default class Constants { static NOTIFICATION_LIST_AREA_WIDTH = '834' static NOTIFICATION_AREA_HEIGHT = '40%' static PASSWORD_AREA_WIDTH = '33.33%' + static PASSWORD_AREA_WIDTH_PORTRAIT = '50%' static NOTIFICATION_LIST_AREA_HEIGHT = '300' static STATUS_ABOUT_TO_APPEAR = 1 diff --git a/product/pc/src/main/ets/pages/customPassword.ets b/product/pc/src/main/ets/pages/customPassword.ets index 088e7ac6..ca5c7bcb 100644 --- a/product/pc/src/main/ets/pages/customPassword.ets +++ b/product/pc/src/main/ets/pages/customPassword.ets @@ -28,6 +28,7 @@ const TAG = 'ScreenLock-CustomPassword' @Component export default struct CustomPassword { @State mHeightPx: number = 44 + @StorageLink('screenlockdirection') screenlockdirection: number = 1 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) @@ -61,7 +62,7 @@ export default struct CustomPassword { Column() { CustomPSD() } - .width(Constants.PASSWORD_AREA_WIDTH) + .width(this.screenlockdirection == 1 ? Constants.PASSWORD_AREA_WIDTH : Constants.PASSWORD_AREA_WIDTH_PORTRAIT) } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) diff --git a/product/pc/src/main/ets/pages/digitalPassword.ets b/product/pc/src/main/ets/pages/digitalPassword.ets index 3ea7f5c7..00eba12a 100644 --- a/product/pc/src/main/ets/pages/digitalPassword.ets +++ b/product/pc/src/main/ets/pages/digitalPassword.ets @@ -28,6 +28,7 @@ const TAG = 'ScreenLock-DigitalPassword' @Component export default struct DigitalPassword { @State mHeightPx: number = 44 + @StorageLink('screenlockdirection') screenlockdirection: number = 1 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) @@ -60,7 +61,7 @@ export default struct DigitalPassword { Column() { DigitalPSD() } - .width(Constants.PASSWORD_AREA_WIDTH) + .width(this.screenlockdirection == 1 ? Constants.PASSWORD_AREA_WIDTH : Constants.PASSWORD_AREA_WIDTH_PORTRAIT) } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) diff --git a/product/pc/src/main/ets/pages/slidescreenlock.ets b/product/pc/src/main/ets/pages/slidescreenlock.ets index f3f442e5..76016cd4 100644 --- a/product/pc/src/main/ets/pages/slidescreenlock.ets +++ b/product/pc/src/main/ets/pages/slidescreenlock.ets @@ -34,6 +34,7 @@ export default struct SlideScreenlock { @Prop @Watch("onStatusChange") pageStatus: number @StorageLink('deviceStatus') @Watch('onDeviceStatusChange') deviceStatus: string = "" @StorageLink('isWallpaperShow') isWallpaperShow: boolean = true + @StorageLink('screenlockdirection') screenlockdirection: number = 1 private mHeightPx : number = 44 aboutToAppear() { @@ -94,7 +95,7 @@ export default struct SlideScreenlock { Accounts() } .width(Constants.NOTIFICATION_AREA_WIDTH) - .height($r('app.float.shortcut_area_height')) + .height(this.screenlockdirection == 1 ? $r('app.float.shortcut_area_height'):$r('app.float.shortcut_area_height_portrait')) } .margin({ top: $r('app.float.shortcut_area_margin_top') }) diff --git a/product/pc/src/main/resources/base/element/float.json b/product/pc/src/main/resources/base/element/float.json index eb358eb5..8324d095 100644 --- a/product/pc/src/main/resources/base/element/float.json +++ b/product/pc/src/main/resources/base/element/float.json @@ -24,6 +24,10 @@ "name": "shortcut_area_height", "value": "120" }, + { + "name": "shortcut_area_height_portrait", + "value": "146" + }, { "name": "notificationList_margin_top", "value": "32" -- Gitee From dc967456db13b8ab1084f285d927db063d7d783c Mon Sep 17 00:00:00 2001 From: abc123 Date: Wed, 19 Oct 2022 20:23:38 +0800 Subject: [PATCH 284/373] crash Signed-off-by: abc123 --- .../screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts index 23911607..30da945e 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -53,7 +53,6 @@ export default class DigitalPSDViewModel extends BaseViewModel { Trace.start(Trace.CORE_METHOD_UNLOCK_SCREEN); Trace.start(Trace.CORE_METHOD_CALL_ACCOUNT_SYSTEM); service.authUser(AuthSubType.PIN_SIX, this.password, (result, extraInfo) => { - this.clearPassword() if (result == 0) { //unlock the screen service.unlocking(); @@ -62,6 +61,7 @@ export default class DigitalPSDViewModel extends BaseViewModel { super.changePrompt(extraInfo.remainTimes, extraInfo.freezingTime, callback) } }) + this.clearPassword() } } else if (keyValue == Constants.DEL_PWD) { this.passwdMaskArr[this.password.length-1] = $r('app.media.ic_hollow_dot'); -- Gitee From 3c53a35461af149cad7bf2cea628cae7ba76fea8 Mon Sep 17 00:00:00 2001 From: SEASON_SYSU Date: Tue, 25 Oct 2022 00:01:26 +0800 Subject: [PATCH 285/373] AR000HK93K 2022.10.25 Signed-off-by: SEASON_SYSU --- .../ets/com/ohos/model/AutoRotateService.ts | 46 +++++-------------- .../ohos/pages/SimpleToggleLoadComponent.ets | 7 +++ product/pc/controlpanel/package-lock.json | 3 ++ product/pc/controlpanel/package.json | 3 +- .../ets/pages/common/ControlCenterConfig.ts | 4 +- product/phone/dropdownpanel/package-lock.json | 3 ++ product/phone/dropdownpanel/package.json | 1 + .../ets/pages/common/ControlCenterConfig.ts | 4 +- 8 files changed, 32 insertions(+), 39 deletions(-) diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts index ea91b67c..37db8d8e 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -49,10 +49,7 @@ export class AutoRotateService { async asyncStartService(): Promise { Log.showInfo(TAG, 'asyncStartService'); - this.getOrientation().then(() => { - }).catch((err) => { - }); - screen.on('change', this.onOrientationChange.bind(this)); + this.updateAutoRotateSwitchStatus(); } stopService(): void { @@ -73,40 +70,21 @@ export class AutoRotateService { }); } - onOrientationChange(value: number): void{ - Log.showDebug(TAG, `onOrientationChange, value: ${value}`); - this.getOrientation().then(() => { - }).catch((err) => { + updateAutoRotateSwitchStatus() { + screen.isScreenRotationLocked().then((isLocked) => { + this.mListener?.updateAutoRotateSwitchStatus(!isLocked); + Log.showDebug(TAG, `getScreenLockStatus, isLocked: ${JSON.stringify(isLocked)}`); }); } - async getOrientation(): Promise { - Log.showDebug(TAG, 'getOrientation'); - let mScreen = await this.getScreen(); - this.updateAutoRotateSwitchStatus(mScreen.orientation); - } - async changeSwitch(status: boolean): Promise { - Log.showDebug(TAG, `changeSwitch, status: ${status}`); - let newOrientation = status ? 5 : 0; - let mScreen = await this.getScreen(); - let ret = await mScreen.setOrientation(newOrientation); - Log.showDebug(TAG, `changeSwitch, ret: ${ret}`); - } - - updateAutoRotateSwitchStatus(orientation: number): void{ - Log.showInfo(TAG, `updateAutoRotateSwitchStatus, orientation: ${orientation}`); - if (orientation == 0) { - this.mListener?.updateAutoRotateSwitchStatus(false); - } else if (orientation == 5) { - this.mListener?.updateAutoRotateSwitchStatus(true); - } - } - - async getScreen(): Promise { - Log.showDebug(TAG, 'getScreen'); - let screens = await screen.getAllScreen(); - return screens[0]; + screen.setScreenRotationLocked(!status).then((err, data) => { + if (err.code) { + Log.showDebug(TAG, `changeSwitch, error: ${JSON.stringify(err)}`); + } + this.updateAutoRotateSwitchStatus(); + Log.showDebug(TAG, `changeSwitch success, isAutoRotate: ${JSON.stringify(status)}`); + }); } } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets index 4f0f8335..27c60ea3 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets @@ -18,6 +18,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; import LocationComponent from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent'; import RingModeComponent from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent'; +import AutoRotateComponent from '../../../../../../../autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent'; import NFCComponent from '../../../../../../../nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent'; import SimpleToggleComponent from './SimpleToggleComponent'; @@ -51,6 +52,12 @@ export default struct SimpleToggleLoadComponent { mEditMode: this.mEditMode, mDragMode: this.mDragMode, }) + } else if (this.keyId == FASlotName.AUTO_ROTATE) { + AutoRotateComponent({ + keyId: this.keyId, + mEditMode: this.mEditMode, + mDragMode: this.mDragMode, + }) } else if (this.keyId == FASlotName.NFC) { if (isNfcAvailable()) { NFCComponent({ diff --git a/product/pc/controlpanel/package-lock.json b/product/pc/controlpanel/package-lock.json index 2b28127b..f6328c7c 100644 --- a/product/pc/controlpanel/package-lock.json +++ b/product/pc/controlpanel/package-lock.json @@ -4,6 +4,9 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@ohos/autorotatecomponent": { + "version": "file:../../../features/autorotatecomponent" + }, "@ohos/controlcentercomponent": { "version": "file:../../../features/controlcentercomponent" } diff --git a/product/pc/controlpanel/package.json b/product/pc/controlpanel/package.json index 1c6379c7..9c017ca0 100644 --- a/product/pc/controlpanel/package.json +++ b/product/pc/controlpanel/package.json @@ -8,6 +8,7 @@ }, "version": "1.0.0", "dependencies": { - "@ohos/controlcentercomponent": "file:../../../features/controlcentercomponent" + "@ohos/controlcentercomponent": "file:../../../features/controlcentercomponent", + "@ohos/autorotatecomponent": "file:../../../features/autorotatecomponent" } } diff --git a/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts index 4caa99df..9889b634 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts @@ -18,10 +18,10 @@ import { ControlCenterConfig const controlCenterConfig: ControlCenterConfig = { ComplexToggleLayout: [FASlotName.WIFI, FASlotName.BLUETOOTH], - DefaultSimpleToggleLayout: ['screenshot', FASlotName.RING_MODE, FASlotName.LOCATION], + DefaultSimpleToggleLayout: ['screenshot', FASlotName.RING_MODE, FASlotName.LOCATION, FASlotName.AUTO_ROTATE], LocalToggles: { ComplexToggles: [FASlotName.AIR_PLANE, FASlotName.BLUETOOTH, FASlotName.WIFI], - SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE], + SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE, FASlotName.AUTO_ROTATE], }, MetaToggles: [ { diff --git a/product/phone/dropdownpanel/package-lock.json b/product/phone/dropdownpanel/package-lock.json index c8408215..f472344d 100644 --- a/product/phone/dropdownpanel/package-lock.json +++ b/product/phone/dropdownpanel/package-lock.json @@ -4,6 +4,9 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@ohos/autorotatecomponent": { + "version": "file:../../../features/autorotatecomponent" + }, "@ohos/batterycomponent": { "version": "file:../../../features/batterycomponent" }, diff --git a/product/phone/dropdownpanel/package.json b/product/phone/dropdownpanel/package.json index 3f7165d1..5b43dca7 100644 --- a/product/phone/dropdownpanel/package.json +++ b/product/phone/dropdownpanel/package.json @@ -14,6 +14,7 @@ "@ohos/signalcomponent": "file:../../../features/signalcomponent", "@ohos/clockcomponent": "file:../../../features/clockcomponent", "@ohos/locationcomponent": "file:../../../features/locationcomponent", + "@ohos/autorotatecomponent": "file:../../../features/autorotatecomponent", "@ohos/batterycomponent": "file:../../../features/batterycomponent", "@ohos/controlcentercomponent": "file:../../../features/controlcentercomponent", "@ohos/ringmodecomponent": "file:../../../features/ringmodecomponent", diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts index 2acd106d..1174c626 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts @@ -18,10 +18,10 @@ import { ControlCenterConfig const controlCenterConfig: ControlCenterConfig = { ComplexToggleLayout: [FASlotName.WIFI, FASlotName.BLUETOOTH], - DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION, 'demosystemuicplmeta', FASlotName.NFC], + DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION, 'demosystemuicplmeta', FASlotName.NFC, FASlotName.AUTO_ROTATE], LocalToggles: { ComplexToggles: [FASlotName.AIR_PLANE, FASlotName.BLUETOOTH, FASlotName.WIFI], - SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE, FASlotName.NFC], + SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE, FASlotName.NFC, FASlotName.AUTO_ROTATE], }, MetaToggles: [ { -- Gitee From 5912b554abcaaee36eed27dfd55e595d04105d22 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Tue, 25 Oct 2022 16:02:36 +0800 Subject: [PATCH 286/373] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=97=8B=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../src/main/ets/ServiceExtAbility/ServiceExtAbility.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 324c873c..d10d51a6 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -23,10 +23,12 @@ import AbilityManager from '../../../../../../common/src/main/ets/default/abilit import sTimeManager from '../../../../../../common/src/main/ets/default/TimeManager' const TAG = "ScreenLock-ServiceExtAbility" +const AUTO_ROTATION_RETRICTED: number = 8 class ServiceExtAbility extends ServiceExtension { private direction :number; + onCreate(want) { Log.showInfo(TAG, 'onCreate, want:' + want.abilityName); AbilityManager.setContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK, this.context) @@ -65,6 +67,12 @@ class ServiceExtAbility extends ServiceExtension { Log.showDebug(TAG, `createWindow name:${name}`) windowManager.create(this.context, name, 2110).then((win) => { Log.showInfo(TAG, "before begin " + name + " window show!") + win.setPreferredOrientation(AUTO_ROTATION_RETRICTED, (err) => { + if (err.code) { + Log.showError(TAG, "failed to set window Orientation: " + JSON.stringify(err)); + } + Log.showInfo(TAG, "succeed to set window Orientation"); + }) win.loadContent("pages/index").then(() => { win.show().then(() => { Log.showInfo(TAG, "window show in then!"); -- Gitee From f4bc9572ffe72bab8153694551e6cd0222fb7d81 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Tue, 25 Oct 2022 20:45:40 +0800 Subject: [PATCH 287/373] =?UTF-8?q?AR000HK93K=202022.10.25=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=A8=AA=E7=AB=96=E5=B1=8F=E6=97=8B=E8=BD=AC=E5=BC=80?= =?UTF-8?q?=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../src/main/ets/com/ohos/model/AutoRotateService.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts index 37db8d8e..3bfe1762 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -79,12 +79,14 @@ export class AutoRotateService { async changeSwitch(status: boolean): Promise { screen.setScreenRotationLocked(!status).then((err, data) => { + this.updateAutoRotateSwitchStatus(); if (err.code) { Log.showDebug(TAG, `changeSwitch, error: ${JSON.stringify(err)}`); + } else { + Log.showDebug(TAG, `changeSwitch success, isAutoRotate: ${JSON.stringify(status)}`); } - this.updateAutoRotateSwitchStatus(); - Log.showDebug(TAG, `changeSwitch success, isAutoRotate: ${JSON.stringify(status)}`); }); + this.updateAutoRotateSwitchStatus(); } } -- Gitee From dc28755665c776e8413b404f090d171e19b88cf9 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Tue, 1 Nov 2022 16:25:54 +0800 Subject: [PATCH 288/373] revise the initialised value for want Signed-off-by: tangzhigang1 --- .../src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts index 4f2eb2c6..dac86d97 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -20,7 +20,7 @@ import WantAgent from '@ohos.wantAgent'; const TAG = 'CommonUtil'; const DEFAULT_INFO = { code: 0, - want: '', + want: {}, permission: '', extraInfo: {} }; -- Gitee From a642e2a713ce005671ef69e8a15d35372955c1b9 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Tue, 1 Nov 2022 17:43:37 +0800 Subject: [PATCH 289/373] =?UTF-8?q?=E9=80=82=E9=85=8Dsettingsdata=E5=8E=BB?= =?UTF-8?q?=E5=B8=B8=E9=A9=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- common/src/main/ets/default/Constants.ts | 16 +++++++- common/src/main/ets/default/SettingsUtil.ts | 16 +++----- common/src/main/ets/default/TimeManager.ts | 21 ++++------ .../src/main/ets/default/brightnessManager.ts | 39 +++++++++++------- .../ets/default/pages/brightnessComponent.ets | 3 -- .../com/ohos/model/ControlCenterService.ts | 3 +- .../ets/viewmodel/NavigationBarViewModel.ts | 40 +++++++++---------- .../ets/pages/common/ControlCenterConfig.ts | 2 +- .../src/main/ets/pages/index.ets | 19 +++++---- 9 files changed, 86 insertions(+), 73 deletions(-) diff --git a/common/src/main/ets/default/Constants.ts b/common/src/main/ets/default/Constants.ts index 148d9949..5fe30ef0 100644 --- a/common/src/main/ets/default/Constants.ts +++ b/common/src/main/ets/default/Constants.ts @@ -15,6 +15,8 @@ */ import Window from '@ohos.window'; import parameter from '@ohos.systemparameter'; +import parameter from '@ohos.systemparameter'; +import settings from '@ohos.settings'; export interface Rect { left: number; @@ -37,7 +39,19 @@ export function getWindowName(windowType): WindowType { } export default class Constants { - static readonly URI_VAR = 'dataability:///com.ohos.settingsdata.DataAbility'; + static readonly URI_VAR: string = 'datashare:///com.ohos.settingsdatas.DataAbility'; + static readonly KEY_BRIGHTNESS_STATUS = settings.display.SCREEN_BRIGHTNESS_STATUS; + static readonly KEY_TIME_FORMAT = settings.date.TIME_FORMAT; + static readonly KEY_NAVIGATIONBAR_STATUS = settings.display.NAVIGATIONBAR_STATUS; + + /** + * 获取拼接后的uri,适配settingsdata去常驻 + * + * @param key settings key + */ + static getUriSync(key: string): string { + return "datashare:///com.ohos.settingsdatas/entry/settingsdata/SETTINGSDATA?Proxy=true&key=" + key; + } } export enum FASlotName { diff --git a/common/src/main/ets/default/SettingsUtil.ts b/common/src/main/ets/default/SettingsUtil.ts index f189e1a6..fc573837 100644 --- a/common/src/main/ets/default/SettingsUtil.ts +++ b/common/src/main/ets/default/SettingsUtil.ts @@ -15,33 +15,27 @@ */ import settings from '@ohos.settings'; -import { DataAbilityHelper } from 'ability/dataAbilityHelper'; -import featureAbility from '@ohos.ability.featureAbility'; import Log from './Log'; import Constants from './Constants'; import createOrGet from './SingleInstanceHelper'; +import Context from 'application/ServiceExtensionContext'; import AbilityManager from './abilitymanager/abilityManager'; const TAG = 'SettingsUtil'; export class SettingsUtil { - helper: DataAbilityHelper; + context: Context; constructor() { Log.showDebug(TAG, 'constructor'); - try { - let contextName = AbilityManager.getContextName(AbilityManager.ABILITY_NAME_CONTROL_PANEL); - this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(contextName), Constants.URI_VAR); - } catch (e) { - Log.showError(TAG, `constructor, acquire helper error: ${JSON.stringify(e)}`); - } + this.context = AbilityManager.getContext(AbilityManager.ABILITY_NAME_CONTROL_PANEL); } getValue(name: string, defValue?: string): string { Log.showDebug(TAG, `getValue, name: ${name} defValue: ${defValue}`); let value: string = null; try { - value = settings.getValueSync(this.helper, name, defValue ? defValue : ''); + value = settings.getValueSync(this.context, name, defValue ? defValue : ''); } catch (e) { Log.showError(TAG, `getValue e: ${JSON.stringify(e)}`); } @@ -53,7 +47,7 @@ export class SettingsUtil { Log.showDebug(TAG, `setValue, name: ${name} value: ${value}`); let result = false; try { - result = settings.setValueSync(this.helper, name, value); + result = settings.setValueSync(this.context, name, value); } catch (e) { Log.showError(TAG, `setValue e: ${JSON.stringify(e)}`); } diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts index c9cf24a4..5bca02db 100644 --- a/common/src/main/ets/default/TimeManager.ts +++ b/common/src/main/ets/default/TimeManager.ts @@ -16,12 +16,12 @@ import settings from "@ohos.settings"; import commonEvent from "@ohos.commonEvent"; -import featureAbility from "@ohos.ability.featureAbility"; -import { DataAbilityHelper } from "ability/dataAbilityHelper"; +import dataShare from '@ohos.data.dataShare'; import Log from "./Log"; import EventManager from "./event/EventManager"; import createOrGet from "./SingleInstanceHelper"; import { obtainLocalEvent } from "./event/EventUtil"; +import Constants from "./Constants"; import { CommonEventManager, getCommonEventManager, POLICY } from "./commonEvent/CommonEventManager"; export const TIME_CHANGE_EVENT = "Time_Change_Event"; @@ -32,7 +32,6 @@ export type TimeEventArgs = { }; const TAG = "TimeManager"; -const URI_VAR = "dataability:///com.ohos.settingsdata.DataAbility"; const TIME_FORMAT_KEY = settings.date.TIME_FORMAT; const TIME_SUBSCRIBE_INFO = { events: [ @@ -52,7 +51,7 @@ export function concatTime(h: number, m: number) { class TimeManager { private mUse24hFormat: boolean = false; - private mSettingsHelper?: DataAbilityHelper; + private mSettingsHelper?: dataShare.DataShareHelper; private mManager?: CommonEventManager; public init(context: any) { @@ -70,34 +69,30 @@ class TimeManager { public release() { this.mManager?.release(); this.mManager = undefined; - this.mSettingsHelper?.off("dataChange", settings.getUriSync(TIME_FORMAT_KEY)); + this.mSettingsHelper?.off("dataChange", Constants.getUriSync(Constants.KEY_TIME_FORMAT)); } public formatTime(date: Date) { return concatTime(date.getHours() % (this.mUse24hFormat ? 24 : 12), date.getMinutes()); } - private initTimeFormat(context: any) { + private async initTimeFormat(context: any): Promise { Log.showDebug(TAG, "initTimeFormat"); - this.mSettingsHelper = featureAbility.acquireDataAbilityHelper(context, URI_VAR); + this.mSettingsHelper = await dataShare.createDataShareHelper(context, Constants.URI_VAR); const handleTimeFormatChange = () => { if (!this.mSettingsHelper) { Log.showError(TAG, `Can't get dataAbility helper.`); return; } - let timeString = settings.getValueSync(this.mSettingsHelper, TIME_FORMAT_KEY, "24"); + let timeString = settings.getValueSync(context, TIME_FORMAT_KEY, "24"); Log.showDebug(TAG, `timeFormat change: ${timeString}`); this.mUse24hFormat = timeString == "24"; this.notifyTimeChange(); }; try { - this.mSettingsHelper.on("dataChange", settings.getUriSync(TIME_FORMAT_KEY), (err) => { - if (err.code !== 0) { - Log.showError(TAG, `failed to getAbilityWant, code: ${err.code}.`); - return; - } + this.mSettingsHelper?.on("dataChange", Constants.getUriSync(Constants.KEY_TIME_FORMAT), () => { handleTimeFormatChange(); }); } catch (e) { diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index 4aafb1e8..481550fc 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -19,45 +19,53 @@ import AbilityManager from '../../../../../../common/src/main/ets/default/abilit import commonEvent from '@ohos.commonEvent'; import settings from '@ohos.settings'; import systemParameter from '@ohos.systemparameter' -import featureAbility from '@ohos.ability.featureAbility'; +import dataShare from '@ohos.data.dataShare'; import Brightness from '@ohos.brightness'; -import CommonConstants from "../../../../../../common/src/main/ets/default/Constants"; +import Context from 'application/ServiceExtensionContext'; +import Constants from "../../../../../../common/src/main/ets/default/Constants"; +import createOrGet from '../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -const SYSTEMUI_BRIGHTNESS = settings.display.SCREEN_BRIGHTNESS_STATUS;; const TAG = 'Control-brightnessManager'; var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 100); export class brightnessManager { - helper: any; + helper: dataShare.DataShareHelper; uri: string; + context: Context; SLIDER_CHANG_MODE_MOVING = 1; - init(): void{ + constructor() { + this.uri = Constants.getUriSync(Constants.KEY_BRIGHTNESS_STATUS); + Log.showInfo(TAG, 'settings geturi of brightness is ' + Constants.URI_VAR); + this.context = AbilityManager.getContext(AbilityManager.getContextName(AbilityManager.ABILITY_NAME_CONTROL_PANEL)); + this.init(); + } + + async init(): Promise { Log.showInfo(TAG, 'init'); - this.uri = settings.getUriSync(SYSTEMUI_BRIGHTNESS); - Log.showInfo(TAG, 'settings geturi of brightness is ' + this.uri); - let contextName = AbilityManager.getContextName(AbilityManager.ABILITY_NAME_CONTROL_PANEL); - this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(contextName), CommonConstants.URI_VAR); + this.helper = await dataShare.createDataShareHelper(this.context, this.uri); + Log.showInfo(TAG, `init helper ${this.helper}`); + this.registerBrightness(); this.getValue(); } registerBrightness() { - this.helper.on("dataChange", this.uri, (err) => { - let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, JSON.stringify(this.getDefault())); + this.helper.on("dataChange", this.uri, () => { + let data = settings.getValueSync(this.context, Constants.KEY_BRIGHTNESS_STATUS, JSON.stringify(this.getDefault())); Log.showInfo(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); }) } unRegisterBrightness() { - this.helper.off("dataChange", this.uri, (err) => { + this.helper?.off("dataChange", this.uri, (err) => { Log.showInfo(TAG, `unregister brightness helper`); }) } getValue() { Log.showInfo(TAG, 'getValue'); - let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, JSON.stringify(this.getDefault())); + let data = settings.getValueSync(this.context, Constants.KEY_BRIGHTNESS_STATUS, JSON.stringify(this.getDefault())); Log.showInfo(TAG, `settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); } @@ -66,6 +74,8 @@ export class brightnessManager { let value = parseInt(callback.value); Log.showInfo(TAG, `setValue ${value}`); mBrightnessValue.set(value); + Log.showInfo(TAG, `setValue ${this.context}`); + settings.setValueSync(this.context, Constants.KEY_BRIGHTNESS_STATUS, JSON.stringify(value)); Brightness.setValue(callback.value); } @@ -82,7 +92,6 @@ export class brightnessManager { } } - -let mBrightnessManager = new brightnessManager(); +let mBrightnessManager = createOrGet(brightnessManager, TAG); export default mBrightnessManager as brightnessManager; \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets index 5bd9f1ff..22962d64 100644 --- a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets +++ b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets @@ -32,13 +32,10 @@ export default struct MyBrightness { aboutToAppear() { Log.showDebug(TAG, `Brightness aboutToAppear ${JSON.stringify(this.brightnessItem)}`); - mBrightnessManager.init(); - mBrightnessManager.registerBrightness(); } aboutToDisappear() { Log.showDebug(TAG, 'aboutToDisappear'); - mBrightnessManager.unRegisterBrightness(); } setBrightness(value, sliderChangeMode: number) { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index db502da9..40cac715 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -85,8 +85,7 @@ export class ControlCenterService { SwitchUserManager.getInstance().registerListener(this); CONTROLCENTER_SOURCE_CONFIG.filterDatas = config.MetaToggles; - let contextName = AbilityManager.getContextName(AbilityManager.ABILITY_NAME_CONTROL_PANEL); - this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(contextName), this, moduleName); + this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(AbilityManager.ABILITY_NAME_CONTROL_PANEL), this, moduleName); this.mAdapter.setWant(globalThis[Constants.PLUGIN_COMPONENT_OWNER_WANT_KEY]); this.mAdapter.initDataSource(CONTROLCENTER_SOURCE_CONFIG); } diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index 79962bf0..6c09f485 100644 --- a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -20,12 +20,11 @@ import getSingleInstance from '../../../../../../../common/src/main/ets/default/ import TintStateManager, { TintState, TintStateListener } from '../../../../../../../common/src/main/ets/default/TintStateManager'; import { NavigationBarComponentData, NAVIGATIONBAR_HIDE_EVENT } from '../common/constants'; -import featureAbility from '@ohos.ability.featureAbility'; -import { DataAbilityHelper } from 'ability/dataAbilityHelper'; +import dataShare from '@ohos.data.dataShare'; import settings from '@ohos.settings'; import commonEvent from '@ohos.commonEvent'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import CommonConstants from '../../../../../../../common/src/main/ets/default/Constants'; +import Constants from '../../../../../../../common/src/main/ets/default/Constants'; const TAG = 'NavigationBarViewModel'; @@ -36,7 +35,7 @@ const NAVIGATION_BAR_COMPONENT_DATA_KEY = 'AppStorage_NavigationBarComponentData export default class NavigationBarViewModel { private readonly settingDataKey = 'settings.display.navigationbar_status'; private readonly urivar: string; - private readonly helper: DataAbilityHelper; + private readonly helper: dataShare.DataShareHelper; private readonly navigationBarStatusDefaultValue = '1'; private isDisplay = true; mNavigationBarComponentData: NavigationBarComponentData = { @@ -52,16 +51,20 @@ export default class NavigationBarViewModel { Log.showInfo(TAG, 'constructor'); this.mNavigationBarComponentData = AppStorage.SetAndLink(NAVIGATION_BAR_COMPONENT_DATA_KEY, this.mNavigationBarComponentData).get() - this.urivar = settings.getUriSync(this.settingDataKey); + this.urivar = Constants.getUriSync(Constants.KEY_NAVIGATIONBAR_STATUS); if (AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR) == null) { Log.showError(TAG, 'AbilityManager.getContext() is null'); } else { Log.showInfo(TAG, 'context: ' + AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR)); } - this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR), CommonConstants.URI_VAR); + this.initHelper(); this.initNavigationBarStatus(); } + private async initHelper(): Promise { + this.helper = await dataShare.createDataShareHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR), Constants.URI_VAR); + } + install(): void { Log.showDebug(TAG, `install, useCount: ${this.mUseCount}`); if (!this.mUseCount) { @@ -116,18 +119,20 @@ export default class NavigationBarViewModel { } private setValue(value: string): void { - settings.setValueSync(this.helper, this.settingDataKey, value); + let context = AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR); + settings.setValueSync(context, this.settingDataKey, value); } private getValue(defaultValue?: string): string { + let context = AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR); return settings.getValueSync( - this.helper, this.settingDataKey, defaultValue ? defaultValue : this.navigationBarStatusDefaultValue + context, this.settingDataKey, defaultValue ? defaultValue : this.navigationBarStatusDefaultValue ); } - private registerListenForDataChanges(callback: (data) => void): void { - this.helper.on('dataChange', this.urivar, (data) => { - callback(data); + private registerListenForDataChanges(callback: () => void): void { + this.helper.on('dataChange', this.urivar, () => { + callback(); }); } @@ -149,15 +154,10 @@ export default class NavigationBarViewModel { * Get NavigationBar status data. * @return */ - dataChangesCallback(data): void { - if (data.code !== 0) { - Log.showError(TAG, `dataChangesCallback failed, because ${data.message}`); - return; - } else { - let getRetValue = this.getValue(); - Log.showInfo(TAG, `dataChangesCallback initValue ${getRetValue}`); - this.windowSwitches(getRetValue); - } + dataChangesCallback(): void { + let getRetValue = this.getValue(); + Log.showInfo(TAG, `dataChangesCallback initValue ${getRetValue}`); + this.windowSwitches(getRetValue); } private windowSwitches(navigationBarStatusValue: string): void { diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts index 1174c626..35129327 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts @@ -18,7 +18,7 @@ import { ControlCenterConfig const controlCenterConfig: ControlCenterConfig = { ComplexToggleLayout: [FASlotName.WIFI, FASlotName.BLUETOOTH], - DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION, 'demosystemuicplmeta', FASlotName.NFC, FASlotName.AUTO_ROTATE], + DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION, 'demosystemuicplmeta', FASlotName.NFC], LocalToggles: { ComplexToggles: [FASlotName.AIR_PLANE, FASlotName.BLUETOOTH, FASlotName.WIFI], SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE, FASlotName.NFC, FASlotName.AUTO_ROTATE], diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index 2b4bfba2..82a5764c 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -39,9 +39,9 @@ import NavigationEvent from './common/navigationEvent' import Notification from './notification' import ControlCenterComponent from './control' import StyleManager from './common/StyleManager' -import featureAbility from '@ohos.ability.featureAbility'; +import dataShare from '@ohos.data.dataShare'; import settings from '@ohos.settings'; -import CommonConstants from "../../../../../../../common/src/main/ets/default/Constants"; +import Constants from "../../../../../../../common/src/main/ets/default/Constants"; const TAG = 'DropdownPanel-Index' @@ -74,7 +74,7 @@ struct Index { mClearCallbacks: unsubscribe[]; settingDataKey = 'settings.display.navigationbar_status'; urivar: string = null; - helper: any = null; + helper: dataShare.DataShareHelper = null; mNavigationBarStatusDefaultValue: string = '1'; navigationBarWidth: number = 0; mNeedUpdate: boolean = false; @@ -99,11 +99,11 @@ struct Index { let dropdownRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect'); let navigationBarRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); - this.urivar = settings.getUriSync(this.settingDataKey); - this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL), CommonConstants.URI_VAR); + this.urivar = Constants.getUriSync(Constants.KEY_NAVIGATIONBAR_STATUS); + this.initHelper(); this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); Log.showDebug(TAG, `getValueSync componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`); - this.helper.on("dataChange", this.urivar, (data) => { + this.helper?.on("dataChange", this.urivar, (data) => { if (data.code !== 0) { Log.showError(TAG, `dataChangesCallback failed, because ${data.message}`); return; @@ -141,6 +141,10 @@ struct Index { Log.showDebug(TAG, `aboutToAppear, end`); } + private async initHelper(): Promise { + this.helper = await dataShare.createDataShareHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL), Constants.URI_VAR); + } + onPageShow() { Log.showInfo(TAG, `onPageShow, start`) if (!this.showComponentName) { @@ -163,7 +167,8 @@ struct Index { resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect) { Log.showDebug(TAG, `resizeDropdownPanelAndNavigationBar, dropdownRect: ${JSON.stringify(dropdownRect)} navigationBarRect: ${JSON.stringify(navigationBarRect)}`) - this.mNavigationBarStatusDefaultValue = settings.getValueSync(this.helper, this.settingDataKey, '1'); + let context = AbilityManager.getContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL); + this.mNavigationBarStatusDefaultValue = settings.getValueSync(context, this.settingDataKey, '1'); this.componentOptAreaHeightPX = this.mNavigationBarStatusDefaultValue == '1' ? dropdownRect.height - navigationBarRect.realHeight : dropdownRect.height; this.navigationBarWidth = this.mNavigationBarStatusDefaultValue == '1' ? navigationBarRect.height : 0; WindowManager.resetSizeWindow(WindowType.NAVIGATION_BAR, { ...navigationBarRect, height: this.navigationBarWidth }) -- Gitee From 334066abea7da219da0620f5a32a1d522e914854 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Tue, 1 Nov 2022 21:44:01 +0800 Subject: [PATCH 290/373] =?UTF-8?q?=E9=80=82=E9=85=8DSettings=E5=8E=BB?= =?UTF-8?q?=E5=B8=B8=E9=A9=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- common/src/main/ets/default/Constants.ts | 4 ++-- .../src/main/ets/default/brightnessManager.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/common/src/main/ets/default/Constants.ts b/common/src/main/ets/default/Constants.ts index 5fe30ef0..49b7c5e7 100644 --- a/common/src/main/ets/default/Constants.ts +++ b/common/src/main/ets/default/Constants.ts @@ -39,7 +39,7 @@ export function getWindowName(windowType): WindowType { } export default class Constants { - static readonly URI_VAR: string = 'datashare:///com.ohos.settingsdatas.DataAbility'; + static readonly URI_VAR: string = 'datashare:///com.ohos.settingsdata.DataAbility'; static readonly KEY_BRIGHTNESS_STATUS = settings.display.SCREEN_BRIGHTNESS_STATUS; static readonly KEY_TIME_FORMAT = settings.date.TIME_FORMAT; static readonly KEY_NAVIGATIONBAR_STATUS = settings.display.NAVIGATIONBAR_STATUS; @@ -50,7 +50,7 @@ export default class Constants { * @param key settings key */ static getUriSync(key: string): string { - return "datashare:///com.ohos.settingsdatas/entry/settingsdata/SETTINGSDATA?Proxy=true&key=" + key; + return "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true&key=" + key; } } diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index 481550fc..333833eb 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -75,7 +75,6 @@ export class brightnessManager { Log.showInfo(TAG, `setValue ${value}`); mBrightnessValue.set(value); Log.showInfo(TAG, `setValue ${this.context}`); - settings.setValueSync(this.context, Constants.KEY_BRIGHTNESS_STATUS, JSON.stringify(value)); Brightness.setValue(callback.value); } -- Gitee From cb1e9362137343755f615046b1b9059a62be83b5 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Wed, 2 Nov 2022 15:17:39 +0800 Subject: [PATCH 291/373] =?UTF-8?q?=E9=80=82=E9=85=8DSettingsData=E5=8E=BB?= =?UTF-8?q?=E5=B8=B8=E9=A9=BB=5F=E5=AF=BC=E8=88=AA=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- common/src/main/ets/default/Constants.ts | 2 +- .../ets/viewmodel/NavigationBarViewModel.ts | 18 ++++++++--------- .../src/main/ets/pages/index.ets | 20 ++++++++----------- 3 files changed, 17 insertions(+), 23 deletions(-) diff --git a/common/src/main/ets/default/Constants.ts b/common/src/main/ets/default/Constants.ts index 49b7c5e7..f2326102 100644 --- a/common/src/main/ets/default/Constants.ts +++ b/common/src/main/ets/default/Constants.ts @@ -42,7 +42,7 @@ export default class Constants { static readonly URI_VAR: string = 'datashare:///com.ohos.settingsdata.DataAbility'; static readonly KEY_BRIGHTNESS_STATUS = settings.display.SCREEN_BRIGHTNESS_STATUS; static readonly KEY_TIME_FORMAT = settings.date.TIME_FORMAT; - static readonly KEY_NAVIGATIONBAR_STATUS = settings.display.NAVIGATIONBAR_STATUS; + static readonly KEY_NAVIGATIONBAR_STATUS = 'settings.display.navigationbar_status'; /** * 获取拼接后的uri,适配settingsdata去常驻 diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index 6c09f485..6a63f88e 100644 --- a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -51,18 +51,23 @@ export default class NavigationBarViewModel { Log.showInfo(TAG, 'constructor'); this.mNavigationBarComponentData = AppStorage.SetAndLink(NAVIGATION_BAR_COMPONENT_DATA_KEY, this.mNavigationBarComponentData).get() - this.urivar = Constants.getUriSync(Constants.KEY_NAVIGATIONBAR_STATUS); if (AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR) == null) { Log.showError(TAG, 'AbilityManager.getContext() is null'); } else { Log.showInfo(TAG, 'context: ' + AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR)); } - this.initHelper(); this.initNavigationBarStatus(); + this.initHelper(this.dataChangesCallback.bind(this)); } - private async initHelper(): Promise { + private async initHelper(callback: () => void): Promise { + this.urivar = Constants.getUriSync(Constants.KEY_NAVIGATIONBAR_STATUS); this.helper = await dataShare.createDataShareHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR), Constants.URI_VAR); + Log.showInfo(TAG, 'initHelper, helper: ' + this.helper + ', uri: ' + this.urivar); + this.helper.on('dataChange', this.urivar, () => { + Log.showInfo(TAG, 'onDataChange.'); + callback(); + }); } install(): void { @@ -130,12 +135,6 @@ export default class NavigationBarViewModel { ); } - private registerListenForDataChanges(callback: () => void): void { - this.helper.on('dataChange', this.urivar, () => { - callback(); - }); - } - /** * Initialize the NavigationBar status. */ @@ -144,7 +143,6 @@ export default class NavigationBarViewModel { let initValue = this.getValue(); Log.showInfo(TAG, `initNavigationBarStatus initValue ${initValue}`); this.windowSwitches(initValue); - this.registerListenForDataChanges(this.dataChangesCallback.bind(this)); } catch (e) { Log.showError(TAG, `initNavigationBarStatus error: ${e.toString()}`); } diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index 82a5764c..1fd141e0 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -99,19 +99,9 @@ struct Index { let dropdownRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect'); let navigationBarRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); - this.urivar = Constants.getUriSync(Constants.KEY_NAVIGATIONBAR_STATUS); - this.initHelper(); + this.initHelper(dropdownRect, navigationBarRect); this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); Log.showDebug(TAG, `getValueSync componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`); - this.helper?.on("dataChange", this.urivar, (data) => { - if (data.code !== 0) { - Log.showError(TAG, `dataChangesCallback failed, because ${data.message}`); - return; - } else { - this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); - Log.showInfo(TAG, `NavigationBar status change, componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`); - } - }); this.componentOptAreaTranslateY = (-this.componentOptAreaHeightPX * 0.1) + 'px'; @@ -141,8 +131,14 @@ struct Index { Log.showDebug(TAG, `aboutToAppear, end`); } - private async initHelper(): Promise { + private async initHelper(dropdownRect, navigationBarRect): Promise { this.helper = await dataShare.createDataShareHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL), Constants.URI_VAR); + this.urivar = Constants.getUriSync(Constants.KEY_NAVIGATIONBAR_STATUS); + Log.showDebug(TAG, `initHelper ${this.helper}, uri: ${JSON.stringify(this.urivar)}`); + this.helper?.on("dataChange", this.urivar, () => { + this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); + Log.showInfo(TAG, `NavigationBar status change, componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`); + }); } onPageShow() { -- Gitee From af0145e4a844427b8c9f9d90b5f8b781ec4242b0 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Thu, 3 Nov 2022 16:24:44 +0800 Subject: [PATCH 292/373] update code to be compatible with sdk3.2.7.5 Signed-off-by: tangzhigang1 --- build-profile.json5 | 76 +++++++++++++++++++ common/package.json | 20 ++--- .../main/ets/template/SimpleToggleBase.ets | 4 +- .../src/main/ets/template/iconTitleBase.ets | 2 +- entry/pc/package.json | 18 ++--- entry/phone/package.json | 18 ++--- features/airplanecomponent/hvigorfile.js | 2 +- features/airplanecomponent/package-lock.json | 5 ++ features/airplanecomponent/package.json | 22 +++--- .../airplanecomponent/src/main/module.json5 | 2 +- features/autorotatecomponent/hvigorfile.js | 2 +- .../autorotatecomponent/package-lock.json | 5 ++ features/autorotatecomponent/package.json | 22 +++--- .../autorotatecomponent/src/main/module.json5 | 2 +- features/batterycomponent/hvigorfile.js | 2 +- features/batterycomponent/package-lock.json | 5 ++ features/batterycomponent/package.json | 22 +++--- .../src/main/ets/default/batteryModel.ts | 2 +- .../batterycomponent/src/main/module.json5 | 2 +- features/bluetoothcomponent/hvigorfile.js | 2 +- features/bluetoothcomponent/package-lock.json | 5 ++ features/bluetoothcomponent/package.json | 22 +++--- .../bluetoothcomponent/src/main/module.json5 | 2 +- features/brightnesscomponent/hvigorfile.js | 2 +- .../brightnesscomponent/package-lock.json | 5 ++ features/brightnesscomponent/package.json | 22 +++--- .../brightnesscomponent/src/main/module.json5 | 2 +- features/capsulecomponent/hvigorfile.js | 2 +- features/capsulecomponent/package.json | 21 ++--- .../capsulecomponent/src/main/module.json5 | 2 +- features/clockcomponent/hvigorfile.js | 2 +- features/clockcomponent/package-lock.json | 5 ++ features/clockcomponent/package.json | 22 +++--- features/clockcomponent/src/main/module.json5 | 2 +- features/controlcentercomponent/hvigorfile.js | 2 +- .../controlcentercomponent/package-lock.json | 5 ++ features/controlcentercomponent/package.json | 22 +++--- .../src/main/module.json5 | 2 +- .../main/resources/base/element/color.json | 4 +- features/locationcomponent/hvigorfile.js | 2 +- features/locationcomponent/package-lock.json | 5 ++ features/locationcomponent/package.json | 22 +++--- .../locationcomponent/src/main/module.json5 | 2 +- features/managementcomponent/hvigorfile.js | 2 +- .../managementcomponent/package-lock.json | 5 ++ features/managementcomponent/package.json | 22 +++--- .../com/ohos/view/component/headComponent.ets | 2 +- .../com/ohos/view/component/itemComponent.ets | 4 +- .../ohos/view/component/switchComponent.ets | 4 +- .../managementcomponent/src/main/module.json5 | 2 +- .../main/resources/base/element/color.json | 2 +- .../main/resources/base/element/float.json | 4 +- .../main/resources/phone/element/color.json | 2 +- features/navigationservice/hvigorfile.js | 2 +- features/navigationservice/package-lock.json | 5 ++ features/navigationservice/package.json | 22 +++--- .../navigationservice/src/main/module.json5 | 2 +- features/nfccomponent/hvigorfile.js | 2 +- features/nfccomponent/package-lock.json | 5 ++ features/nfccomponent/package.json | 22 +++--- features/nfccomponent/src/main/module.json5 | 2 +- features/noticeitem/hvigorfile.js | 2 +- features/noticeitem/package-lock.json | 5 ++ features/noticeitem/package.json | 22 +++--- features/noticeitem/src/main/module.json5 | 2 +- .../main/resources/base/element/color.json | 2 +- features/ringmodecomponent/hvigorfile.js | 2 +- features/ringmodecomponent/package-lock.json | 5 ++ features/ringmodecomponent/package.json | 22 +++--- .../ringmodecomponent/src/main/module.json5 | 2 +- features/signalcomponent/hvigorfile.js | 2 +- features/signalcomponent/package-lock.json | 5 ++ features/signalcomponent/package.json | 22 +++--- .../signalcomponent/src/main/module.json5 | 2 +- features/statusbarcomponent/package.json | 20 ++--- .../statusbarcomponent/src/main/module.json5 | 2 +- features/volumecomponent/hvigorfile.js | 2 +- features/volumecomponent/package-lock.json | 5 ++ features/volumecomponent/package.json | 22 +++--- .../volumecomponent/src/main/module.json5 | 2 +- features/volumepanelcomponent/hvigorfile.js | 2 +- .../volumepanelcomponent/package-lock.json | 5 ++ features/volumepanelcomponent/package.json | 22 +++--- .../src/main/module.json5 | 2 +- features/wificomponent/hvigorfile.js | 2 +- features/wificomponent/package-lock.json | 5 ++ features/wificomponent/package.json | 22 +++--- features/wificomponent/src/main/module.json5 | 2 +- package.json | 24 +++--- product/default/navigationBar/package.json | 20 ++--- .../notificationmanagement/package-lock.json | 18 ++--- .../notificationmanagement/package.json | 20 ++--- .../src/main/ets/pages/noDisturb.ets | 2 +- .../ets/pages/notificationManagenment.ets | 4 +- product/default/volumepanel/package.json | 20 ++--- product/pc/controlpanel/package.json | 22 +++--- product/pc/notificationpanel/package.json | 20 ++--- product/pc/statusbar/package.json | 36 ++++----- .../main/resources/base/element/color.json | 2 +- product/phone/dropdownpanel/package.json | 40 +++++----- product/phone/statusbar/package.json | 20 ++--- .../main/resources/base/element/color.json | 2 +- 102 files changed, 575 insertions(+), 413 deletions(-) create mode 100644 features/airplanecomponent/package-lock.json create mode 100644 features/autorotatecomponent/package-lock.json create mode 100644 features/batterycomponent/package-lock.json create mode 100644 features/bluetoothcomponent/package-lock.json create mode 100644 features/brightnesscomponent/package-lock.json create mode 100644 features/clockcomponent/package-lock.json create mode 100644 features/controlcentercomponent/package-lock.json create mode 100644 features/locationcomponent/package-lock.json create mode 100644 features/managementcomponent/package-lock.json create mode 100644 features/navigationservice/package-lock.json create mode 100644 features/nfccomponent/package-lock.json create mode 100644 features/noticeitem/package-lock.json create mode 100644 features/ringmodecomponent/package-lock.json create mode 100644 features/signalcomponent/package-lock.json create mode 100644 features/volumecomponent/package-lock.json create mode 100644 features/volumepanelcomponent/package-lock.json create mode 100644 features/wificomponent/package-lock.json diff --git a/build-profile.json5 b/build-profile.json5 index c64def10..a3c3448c 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -108,6 +108,82 @@ "name": "default" }, ], + }, + { + "name": "airplanecomponent", + "srcPath": "./features/airplanecomponent", + }, + { + "name": "autorotatecomponent", + "srcPath": "./features/autorotatecomponent", + }, + { + "name": "batterycomponent", + "srcPath": "./features/batterycomponent", + }, + { + "name": "bluetoothcomponent", + "srcPath": "./features/bluetoothcomponent", + }, + { + "name": "brightnesscomponent", + "srcPath": "./features/brightnesscomponent", + }, + { + "name": "capsulecomponent", + "srcPath": "./features/capsulecomponent", + }, + { + "name": "clockcomponent", + "srcPath": "./features/clockcomponent", + }, + { + "name": "controlcentercomponent", + "srcPath": "./features/controlcentercomponent", + }, + { + "name": "locationcomponent", + "srcPath": "./features/locationcomponent", + }, + { + "name": "managementcomponent", + "srcPath": "./features/managementcomponent", + }, + { + "name": "navigationservice", + "srcPath": "./features/navigationservice", + }, + { + "name": "nfccomponent", + "srcPath": "./features/nfccomponent", + }, + { + "name": "noticeitem", + "srcPath": "./features/noticeitem", + }, + { + "name": "ringmodecomponent", + "srcPath": "./features/ringmodecomponent", + }, + { + "name": "signalcomponent", + "srcPath": "./features/signalcomponent", + }, + { + "name": "statusbarcomponent", + "srcPath": "./features/statusbarcomponent", + }, + { + "name": "volumecomponent", + "srcPath": "./features/volumecomponent", + }, + { + "name": "volumepanelcomponent", + "srcPath": "./features/volumepanelcomponent", + }, + { + "name": "wificomponent", + "srcPath": "./features/wificomponent", } ], } \ No newline at end of file diff --git a/common/package.json b/common/package.json index f3b1c5bb..192d0ac7 100644 --- a/common/package.json +++ b/common/package.json @@ -1,12 +1,12 @@ { - "devDependencies": {}, - "name": "@ohos/common", - "description": "a npm package which contains common function", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"@ohos/common", + "description":"a npm package which contains common function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": {} -} + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/template/SimpleToggleBase.ets index 1d9cb900..0eae8218 100644 --- a/common/src/main/ets/template/SimpleToggleBase.ets +++ b/common/src/main/ets/template/SimpleToggleBase.ets @@ -21,12 +21,12 @@ const TAG = 'SimpleToggleBase' @Component export default struct SimpleToggleBase { private mToggleId: string - @Link mIcon: string | Resource + @Link mIcon: Resource @State mIconStr: string = '' private mUseIconStr: boolean = false private mAutoIconColor: boolean = false private mChangeSwitch: boolean - @Link mLabel: string | Resource + @Link mLabel: Resource @State mLabelStr: string = '' private mUseLabelStr: boolean = false private mIconOnBG: string | Resource diff --git a/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/template/iconTitleBase.ets index 0b6bb9c0..15e753e4 100644 --- a/common/src/main/ets/template/iconTitleBase.ets +++ b/common/src/main/ets/template/iconTitleBase.ets @@ -25,7 +25,7 @@ export default struct iconBaseComponent { private iconOff: any @State iconOffStr: string = "" @State iconOnStr: string = "" - @Link mTitle: string | Resource + @Link mTitle: Resource @State mTitleStr: string = "" private useIconStr = false private useTitleStr = false diff --git a/entry/pc/package.json b/entry/pc/package.json index 2e85ea87..3fe25bc6 100644 --- a/entry/pc/package.json +++ b/entry/pc/package.json @@ -1,11 +1,11 @@ { - "devDependencies": {}, - "name": "pc_entry", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"pc_entry", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": {} -} + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/entry/phone/package.json b/entry/phone/package.json index 78a1daf6..fd61aecd 100644 --- a/entry/phone/package.json +++ b/entry/phone/package.json @@ -1,11 +1,11 @@ { - "devDependencies": {}, - "name": "phone_entry", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"phone_entry", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": {} -} + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/airplanecomponent/hvigorfile.js b/features/airplanecomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/airplanecomponent/hvigorfile.js +++ b/features/airplanecomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/airplanecomponent/package-lock.json b/features/airplanecomponent/package-lock.json new file mode 100644 index 00000000..e65fc76c --- /dev/null +++ b/features/airplanecomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/airplanecomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/airplanecomponent/package.json b/features/airplanecomponent/package.json index 0ce4d803..eae474c6 100644 --- a/features/airplanecomponent/package.json +++ b/features/airplanecomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/airplanecomponent", - "version": "1.0.0", - "description": "a npm package which contains airplanecomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/airplanecomponent", + "description":"a npm package which contains airplanecomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/airplanecomponent/src/main/module.json5 b/features/airplanecomponent/src/main/module.json5 index d7ca6ae7..0ca3debb 100644 --- a/features/airplanecomponent/src/main/module.json5 +++ b/features/airplanecomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "airplanecomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/autorotatecomponent/hvigorfile.js b/features/autorotatecomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/autorotatecomponent/hvigorfile.js +++ b/features/autorotatecomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/autorotatecomponent/package-lock.json b/features/autorotatecomponent/package-lock.json new file mode 100644 index 00000000..b3bfa542 --- /dev/null +++ b/features/autorotatecomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/autorotatecomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/autorotatecomponent/package.json b/features/autorotatecomponent/package.json index a07ffbbf..1c5591a1 100644 --- a/features/autorotatecomponent/package.json +++ b/features/autorotatecomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/autorotatecomponent", - "version": "1.0.0", - "description": "a npm package which contains autorotatecomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/autorotatecomponent", + "description":"a npm package which contains autorotatecomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/autorotatecomponent/src/main/module.json5 b/features/autorotatecomponent/src/main/module.json5 index 3d0b7e44..d26dc9d1 100644 --- a/features/autorotatecomponent/src/main/module.json5 +++ b/features/autorotatecomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "autorotatecomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/batterycomponent/hvigorfile.js b/features/batterycomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/batterycomponent/hvigorfile.js +++ b/features/batterycomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/batterycomponent/package-lock.json b/features/batterycomponent/package-lock.json new file mode 100644 index 00000000..ab0b8890 --- /dev/null +++ b/features/batterycomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/batterycomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/batterycomponent/package.json b/features/batterycomponent/package.json index 54a2fc7e..7fe3b0f5 100644 --- a/features/batterycomponent/package.json +++ b/features/batterycomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/batterycomponent", - "version": "1.0.0", - "description": "a npm package which contains batterycomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/batterycomponent", + "description":"a npm package which contains batterycomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts index 7f0feda7..122c48c3 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import BatteryInfo from "@ohos.batteryinfo"; +import BatteryInfo from "@ohos.batteryInfo"; import commonEvent from "@ohos.commonEvent"; import createOrGet from "../../../../../../common/src/main/ets/default/SingleInstanceHelper"; import Constants from "./common/constants"; diff --git a/features/batterycomponent/src/main/module.json5 b/features/batterycomponent/src/main/module.json5 index 1d81e25f..7fbde462 100644 --- a/features/batterycomponent/src/main/module.json5 +++ b/features/batterycomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "batterycomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/bluetoothcomponent/hvigorfile.js b/features/bluetoothcomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/bluetoothcomponent/hvigorfile.js +++ b/features/bluetoothcomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/bluetoothcomponent/package-lock.json b/features/bluetoothcomponent/package-lock.json new file mode 100644 index 00000000..c0a652b6 --- /dev/null +++ b/features/bluetoothcomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/bluetoothcomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/bluetoothcomponent/package.json b/features/bluetoothcomponent/package.json index c2c214c5..3184af28 100644 --- a/features/bluetoothcomponent/package.json +++ b/features/bluetoothcomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/bluetoothcomponent", - "version": "1.0.0", - "description": "a npm package which contains bluetoothcomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/bluetoothcomponent", + "description":"a npm package which contains bluetoothcomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/module.json5 b/features/bluetoothcomponent/src/main/module.json5 index 5cecb826..37eecfde 100644 --- a/features/bluetoothcomponent/src/main/module.json5 +++ b/features/bluetoothcomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "bluetoothcomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/brightnesscomponent/hvigorfile.js b/features/brightnesscomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/brightnesscomponent/hvigorfile.js +++ b/features/brightnesscomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/brightnesscomponent/package-lock.json b/features/brightnesscomponent/package-lock.json new file mode 100644 index 00000000..446f9b99 --- /dev/null +++ b/features/brightnesscomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/brightnesscomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/brightnesscomponent/package.json b/features/brightnesscomponent/package.json index 4f9c194f..dfaa14c2 100644 --- a/features/brightnesscomponent/package.json +++ b/features/brightnesscomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/brightnesscomponent", - "version": "1.0.0", - "description": "a npm package which contains brightnesscomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/brightnesscomponent", + "description":"a npm package which contains brightnesscomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/module.json5 b/features/brightnesscomponent/src/main/module.json5 index c7e90d2e..1b095311 100644 --- a/features/brightnesscomponent/src/main/module.json5 +++ b/features/brightnesscomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "brightnesscomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/capsulecomponent/hvigorfile.js b/features/capsulecomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/capsulecomponent/hvigorfile.js +++ b/features/capsulecomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/capsulecomponent/package.json b/features/capsulecomponent/package.json index 62de3ded..cc6ba34d 100644 --- a/features/capsulecomponent/package.json +++ b/features/capsulecomponent/package.json @@ -1,11 +1,12 @@ { - "name": "@ohos/capsulecomponent", - "version": "1.0.0", - "description": "a npm package which contains capsulecomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": {} -} + "devDependencies":{}, + "name":"@ohos/capsulecomponent", + "description":"a npm package which contains capsulecomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/capsulecomponent/src/main/module.json5 b/features/capsulecomponent/src/main/module.json5 index 75b96b78..79d2a5d1 100644 --- a/features/capsulecomponent/src/main/module.json5 +++ b/features/capsulecomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "capsulecomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/clockcomponent/hvigorfile.js b/features/clockcomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/clockcomponent/hvigorfile.js +++ b/features/clockcomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/clockcomponent/package-lock.json b/features/clockcomponent/package-lock.json new file mode 100644 index 00000000..f5ba2591 --- /dev/null +++ b/features/clockcomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/clockcomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/clockcomponent/package.json b/features/clockcomponent/package.json index 674b7695..0d8a52cd 100644 --- a/features/clockcomponent/package.json +++ b/features/clockcomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/clockcomponent", - "version": "1.0.0", - "description": "a npm package which contains clockcomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/clockcomponent", + "description":"a npm package which contains clockcomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/clockcomponent/src/main/module.json5 b/features/clockcomponent/src/main/module.json5 index 84d3096b..8934224a 100644 --- a/features/clockcomponent/src/main/module.json5 +++ b/features/clockcomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "clockcomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/controlcentercomponent/hvigorfile.js b/features/controlcentercomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/controlcentercomponent/hvigorfile.js +++ b/features/controlcentercomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/controlcentercomponent/package-lock.json b/features/controlcentercomponent/package-lock.json new file mode 100644 index 00000000..f4aaeced --- /dev/null +++ b/features/controlcentercomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/controlcentercomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/controlcentercomponent/package.json b/features/controlcentercomponent/package.json index 3c632d7b..079721df 100644 --- a/features/controlcentercomponent/package.json +++ b/features/controlcentercomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/controlcentercomponent", - "version": "1.0.0", - "description": "a npm package which contains controlcentercomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/controlcentercomponent", + "description":"a npm package which contains controlcentercomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/module.json5 b/features/controlcentercomponent/src/main/module.json5 index 667d7369..d7ae17b5 100644 --- a/features/controlcentercomponent/src/main/module.json5 +++ b/features/controlcentercomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "controlcentercomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/controlcentercomponent/src/main/resources/base/element/color.json b/features/controlcentercomponent/src/main/resources/base/element/color.json index 3aca4f9d..73d8d174 100644 --- a/features/controlcentercomponent/src/main/resources/base/element/color.json +++ b/features/controlcentercomponent/src/main/resources/base/element/color.json @@ -10,11 +10,11 @@ }, { "name": "control_center_title_icon_hover_color", - "value": "rgba(0, 0, 0, 0.05)" + "value": "#000000" }, { "name": "control_center_title_icon_transparent_color", - "value": "rgba(255, 255, 255, 0)" + "value": "#ffffff" }, { "name": "control_center_component_background", diff --git a/features/locationcomponent/hvigorfile.js b/features/locationcomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/locationcomponent/hvigorfile.js +++ b/features/locationcomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/locationcomponent/package-lock.json b/features/locationcomponent/package-lock.json new file mode 100644 index 00000000..05f97a5e --- /dev/null +++ b/features/locationcomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/locationcomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/locationcomponent/package.json b/features/locationcomponent/package.json index 9e322712..6064dd63 100644 --- a/features/locationcomponent/package.json +++ b/features/locationcomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/locationcomponent", - "version": "1.0.0", - "description": "a npm package which contains locationcomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/locationcomponent", + "description":"a npm package which contains locationcomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/locationcomponent/src/main/module.json5 b/features/locationcomponent/src/main/module.json5 index a0c8129e..3e7ec5d8 100644 --- a/features/locationcomponent/src/main/module.json5 +++ b/features/locationcomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "locationcomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/managementcomponent/hvigorfile.js b/features/managementcomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/managementcomponent/hvigorfile.js +++ b/features/managementcomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/managementcomponent/package-lock.json b/features/managementcomponent/package-lock.json new file mode 100644 index 00000000..db12b1c5 --- /dev/null +++ b/features/managementcomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/managementcomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/managementcomponent/package.json b/features/managementcomponent/package.json index 84fd61df..20b537d8 100644 --- a/features/managementcomponent/package.json +++ b/features/managementcomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/managementcomponent", - "version": "1.0.0", - "description": "a npm package which contains managementcomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/managementcomponent", + "description":"a npm package which contains managementcomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets index a55ccac7..8dd234a8 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets @@ -20,7 +20,7 @@ export default struct HeadComponent { private isActive: boolean= true; private icBackIsVisibility: boolean= true; - @Link headName: string | Resource; + @Link headName: Resource; @State isTouch: boolean= false; build() { diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets index 86d6e8b2..ecc693e0 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets @@ -16,9 +16,9 @@ import ConfigData from '../../common/constants'; @Component export default struct ItemComponent { - @Link title: string | Resource; + @Link title: Resource; @Prop value: string - @Link arrow: string | PixelMap | Resource; + @Link arrow: Resource; build() { Row() { diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index 574a9c9a..fd75380c 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -19,8 +19,8 @@ const TAG = 'ManagementComponent-SwitchComponent'; @Component export default struct SwitchComponent { - @Link title: string | Resource; - @State describe: string | Resource = ''; + @Link title: Resource; + @Link describe: Resource; private initializationAction: (params?) => Promise private settingAction: (params?) => void private register?: (listener) => void diff --git a/features/managementcomponent/src/main/module.json5 b/features/managementcomponent/src/main/module.json5 index cc94d2fc..04b86eca 100644 --- a/features/managementcomponent/src/main/module.json5 +++ b/features/managementcomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "managementcomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/managementcomponent/src/main/resources/base/element/color.json b/features/managementcomponent/src/main/resources/base/element/color.json index 448951fc..083715c2 100644 --- a/features/managementcomponent/src/main/resources/base/element/color.json +++ b/features/managementcomponent/src/main/resources/base/element/color.json @@ -2,7 +2,7 @@ "color": [ { "name": "background_color", - "value": "#0xDCDCDC" + "value": "#DCDCDC" }, { "name": "background_transparent", diff --git a/features/managementcomponent/src/main/resources/base/element/float.json b/features/managementcomponent/src/main/resources/base/element/float.json index 234a2f75..e10ef789 100644 --- a/features/managementcomponent/src/main/resources/base/element/float.json +++ b/features/managementcomponent/src/main/resources/base/element/float.json @@ -2,11 +2,11 @@ "float": [ { "name": "page_margin_l", - "value": "12pv" + "value": "12vp" }, { "name": "page_margin_r", - "value": "12pv" + "value": "12vp" }, { "name": "page_margin_t", diff --git a/features/managementcomponent/src/main/resources/phone/element/color.json b/features/managementcomponent/src/main/resources/phone/element/color.json index bf9ed9c0..61b30c49 100644 --- a/features/managementcomponent/src/main/resources/phone/element/color.json +++ b/features/managementcomponent/src/main/resources/phone/element/color.json @@ -2,7 +2,7 @@ "color": [ { "name": "background_color", - "value": "#0xDCDCDC" + "value": "#DCDCDC" }, { "name": "background_transparent", diff --git a/features/navigationservice/hvigorfile.js b/features/navigationservice/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/navigationservice/hvigorfile.js +++ b/features/navigationservice/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/navigationservice/package-lock.json b/features/navigationservice/package-lock.json new file mode 100644 index 00000000..2d7173f8 --- /dev/null +++ b/features/navigationservice/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/navigationservice", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/navigationservice/package.json b/features/navigationservice/package.json index bbc4bf10..28f839c2 100644 --- a/features/navigationservice/package.json +++ b/features/navigationservice/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/navigationservice", - "version": "1.0.0", - "description": "a npm package which contains navigationservice function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/navigationservice", + "description":"a npm package which contains navigationservice function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/navigationservice/src/main/module.json5 b/features/navigationservice/src/main/module.json5 index 9d98a2cb..c92526b3 100644 --- a/features/navigationservice/src/main/module.json5 +++ b/features/navigationservice/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "navigationservice", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/nfccomponent/hvigorfile.js b/features/nfccomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/nfccomponent/hvigorfile.js +++ b/features/nfccomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/nfccomponent/package-lock.json b/features/nfccomponent/package-lock.json new file mode 100644 index 00000000..3918f540 --- /dev/null +++ b/features/nfccomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/nfccomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/nfccomponent/package.json b/features/nfccomponent/package.json index 134ac526..275792f4 100644 --- a/features/nfccomponent/package.json +++ b/features/nfccomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/nfccomponent", - "version": "1.0.0", - "description": "a npm package which contains nfccomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/nfccomponent", + "description":"a npm package which contains nfccomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/nfccomponent/src/main/module.json5 b/features/nfccomponent/src/main/module.json5 index 86635985..77122252 100644 --- a/features/nfccomponent/src/main/module.json5 +++ b/features/nfccomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "nfccomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/noticeitem/hvigorfile.js b/features/noticeitem/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/noticeitem/hvigorfile.js +++ b/features/noticeitem/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/noticeitem/package-lock.json b/features/noticeitem/package-lock.json new file mode 100644 index 00000000..331b59a0 --- /dev/null +++ b/features/noticeitem/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/noticeitem", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/noticeitem/package.json b/features/noticeitem/package.json index 6085f2e3..5bbbd9d6 100644 --- a/features/noticeitem/package.json +++ b/features/noticeitem/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/noticeitem", - "version": "1.0.0", - "description": "a npm package which contains noticeitem function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/noticeitem", + "description":"a npm package which contains noticeitem function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/noticeitem/src/main/module.json5 b/features/noticeitem/src/main/module.json5 index 30c58a0a..617fc78a 100644 --- a/features/noticeitem/src/main/module.json5 +++ b/features/noticeitem/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "noticeitem", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/noticeitem/src/main/resources/base/element/color.json b/features/noticeitem/src/main/resources/base/element/color.json index 974d5c02..c599a2a7 100644 --- a/features/noticeitem/src/main/resources/base/element/color.json +++ b/features/noticeitem/src/main/resources/base/element/color.json @@ -50,7 +50,7 @@ }, { "name": "device_divider_color", - "value": "transparent" + "value": "#00000000" }, { "name": "button_text_color", diff --git a/features/ringmodecomponent/hvigorfile.js b/features/ringmodecomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/ringmodecomponent/hvigorfile.js +++ b/features/ringmodecomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/ringmodecomponent/package-lock.json b/features/ringmodecomponent/package-lock.json new file mode 100644 index 00000000..14ffdd1b --- /dev/null +++ b/features/ringmodecomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/ringmodecomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/ringmodecomponent/package.json b/features/ringmodecomponent/package.json index 6a97454d..8f36550b 100644 --- a/features/ringmodecomponent/package.json +++ b/features/ringmodecomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/ringmodecomponent", - "version": "1.0.0", - "description": "a npm package which contains ringmodecomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/ringmodecomponent", + "description":"a npm package which contains ringmodecomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/module.json5 b/features/ringmodecomponent/src/main/module.json5 index 2baab273..c0e41425 100644 --- a/features/ringmodecomponent/src/main/module.json5 +++ b/features/ringmodecomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "ringmodecomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/signalcomponent/hvigorfile.js b/features/signalcomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/signalcomponent/hvigorfile.js +++ b/features/signalcomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/signalcomponent/package-lock.json b/features/signalcomponent/package-lock.json new file mode 100644 index 00000000..8782c092 --- /dev/null +++ b/features/signalcomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/signalcomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/signalcomponent/package.json b/features/signalcomponent/package.json index 7fd4b627..cbd8a2c0 100644 --- a/features/signalcomponent/package.json +++ b/features/signalcomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/signalcomponent", - "version": "1.0.0", - "description": "a npm package which contains signalcomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/signalcomponent", + "description":"a npm package which contains signalcomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/module.json5 b/features/signalcomponent/src/main/module.json5 index f9183fb0..69ec485d 100644 --- a/features/signalcomponent/src/main/module.json5 +++ b/features/signalcomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "signalcomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/statusbarcomponent/package.json b/features/statusbarcomponent/package.json index abb68bd9..1c80ebed 100644 --- a/features/statusbarcomponent/package.json +++ b/features/statusbarcomponent/package.json @@ -1,12 +1,12 @@ { - "devDependencies": {}, - "name": "@ohos/statusbarcomponent", - "description": "a npm package which contains statusbarcomponent function", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"@ohos/statusbarcomponent", + "description":"a npm package which contains statusbarcomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": {} -} + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/module.json5 b/features/statusbarcomponent/src/main/module.json5 index ee1ae93a..0c863a63 100644 --- a/features/statusbarcomponent/src/main/module.json5 +++ b/features/statusbarcomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "statusbarcomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/volumecomponent/hvigorfile.js b/features/volumecomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/volumecomponent/hvigorfile.js +++ b/features/volumecomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/volumecomponent/package-lock.json b/features/volumecomponent/package-lock.json new file mode 100644 index 00000000..b3cbf4cf --- /dev/null +++ b/features/volumecomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/volumecomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/volumecomponent/package.json b/features/volumecomponent/package.json index a1e652ce..3c196c95 100644 --- a/features/volumecomponent/package.json +++ b/features/volumecomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/volumecomponent", - "version": "1.0.0", - "description": "a npm package which contains volumecomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/volumecomponent", + "description":"a npm package which contains volumecomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/volumecomponent/src/main/module.json5 b/features/volumecomponent/src/main/module.json5 index 21b406db..1be2e850 100644 --- a/features/volumecomponent/src/main/module.json5 +++ b/features/volumecomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "volumecomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/volumepanelcomponent/hvigorfile.js b/features/volumepanelcomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/volumepanelcomponent/hvigorfile.js +++ b/features/volumepanelcomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/volumepanelcomponent/package-lock.json b/features/volumepanelcomponent/package-lock.json new file mode 100644 index 00000000..2993cde1 --- /dev/null +++ b/features/volumepanelcomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/volumepanelcomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/volumepanelcomponent/package.json b/features/volumepanelcomponent/package.json index 81b0d14e..987b9cca 100644 --- a/features/volumepanelcomponent/package.json +++ b/features/volumepanelcomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/volumepanelcomponent", - "version": "1.0.0", - "description": "a npm package which contains volumepanelcomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/volumepanelcomponent", + "description":"a npm package which contains volumepanelcomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/module.json5 b/features/volumepanelcomponent/src/main/module.json5 index 5b7f8d9f..ca1771ee 100644 --- a/features/volumepanelcomponent/src/main/module.json5 +++ b/features/volumepanelcomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "volumepanelcomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/features/wificomponent/hvigorfile.js b/features/wificomponent/hvigorfile.js index fdb4fcea..922125d1 100644 --- a/features/wificomponent/hvigorfile.js +++ b/features/wificomponent/hvigorfile.js @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/features/wificomponent/package-lock.json b/features/wificomponent/package-lock.json new file mode 100644 index 00000000..a2feca7a --- /dev/null +++ b/features/wificomponent/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "@ohos/wificomponent", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/features/wificomponent/package.json b/features/wificomponent/package.json index 0e529447..aa2486fb 100644 --- a/features/wificomponent/package.json +++ b/features/wificomponent/package.json @@ -1,12 +1,12 @@ { - "name": "@ohos/wificomponent", - "version": "1.0.0", - "description": "a npm package which contains wificomponent function", - "ohos": { - "org": "huawei", - "buildTool": "hvigor", - "directoryLevel": "module" - }, - "dependencies": { - } -} + "devDependencies":{}, + "name":"@ohos/wificomponent", + "description":"a npm package which contains wificomponent function", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "version":"1.0.0", + "dependencies":{} +} \ No newline at end of file diff --git a/features/wificomponent/src/main/module.json5 b/features/wificomponent/src/main/module.json5 index 896f0c68..d89dee7a 100644 --- a/features/wificomponent/src/main/module.json5 +++ b/features/wificomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "wificomponent", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/package.json b/package.json index 6342de62..627c2a94 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,15 @@ { - "devDependencies": {}, - "name": "systemui", - "ohos": { - "org": "huawei", - "directoryLevel": "project", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"systemui", + "ohos":{ + "org":"huawei", + "directoryLevel":"project", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": { - "@ohos/hvigor-ohos-plugin": "1.1.3", - "@ohos/hvigor": "1.1.3", - "@ohos/hypium": "1.0.0" + "version":"1.0.0", + "dependencies":{ + "@ohos/hypium":"1.0.0", + "@ohos/hvigor-ohos-plugin":"1.1.3", + "@ohos/hvigor":"1.1.3" } -} +} \ No newline at end of file diff --git a/product/default/navigationBar/package.json b/product/default/navigationBar/package.json index a810f144..91e0a37c 100644 --- a/product/default/navigationBar/package.json +++ b/product/default/navigationBar/package.json @@ -1,13 +1,13 @@ { - "devDependencies": {}, - "name": "default_navigationBar", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"default_navigationBar", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": { - "@ohos/navigationservice": "file:../../../features/navigationservice" + "version":"1.0.0", + "dependencies":{ + "@ohos/navigationservice":"file:../../../features/navigationservice" } -} +} \ No newline at end of file diff --git a/product/default/notificationmanagement/package-lock.json b/product/default/notificationmanagement/package-lock.json index 8f0bdacc..9e6d7290 100644 --- a/product/default/notificationmanagement/package-lock.json +++ b/product/default/notificationmanagement/package-lock.json @@ -1,11 +1,11 @@ { - "name": "default_notificationmanagement", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@ohos/managementcomponent": { - "version": "file:../../../features/managementcomponent" - } - } + "name": "default_notificationmanagement", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/managementcomponent": { + "version": "file:../../../features/managementcomponent" + } + } } diff --git a/product/default/notificationmanagement/package.json b/product/default/notificationmanagement/package.json index 00fbfd94..4b1eae69 100644 --- a/product/default/notificationmanagement/package.json +++ b/product/default/notificationmanagement/package.json @@ -1,13 +1,13 @@ { - "devDependencies": {}, - "name": "default_notificationmanagement", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"default_notificationmanagement", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": { - "@ohos/managementcomponent": "file:../../../features/managementcomponent" + "version":"1.0.0", + "dependencies":{ + "@ohos/managementcomponent":"file:../../../features/managementcomponent" } -} +} \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index 8476f965..fe9ed791 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -37,7 +37,7 @@ export default struct NoDisturb { @State endDateTitle:Resource = $r('app.string.endDate'); @State startTitle:Resource = $r('app.string.startTime'); @State endTitle:Resource = $r('app.string.endTime'); - @State arrow: string | PixelMap | Resource = $r('app.media.ic_settings_arrow'); + @State arrow: Resource = $r('app.media.ic_settings_arrow'); @State mRefreshCnt: number = 0; mPrevData: string = ''; diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index ed361eec..60c1dba3 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -35,7 +35,7 @@ export default struct notificationManagenment { @State mViewModel: ViewModel = new ViewModel(); @State headName: Resource = $r('app.string.notification') @State title: Resource = $r('app.string.batch_Management') - @State arrow: string | PixelMap | Resource= $r('app.media.ic_settings_arrow') + @State arrow: Resource= $r('app.media.ic_settings_arrow') @State allowDistribut: Resource = $r('app.string.allowDistribut') @State allowDistributDescribe: Resource = $r('app.string.allowDistributDescribe') @@ -118,7 +118,7 @@ export default struct notificationManagenment { Row() { SwitchComponent({ title: $allowDistribut, - describe: this.allowDistributDescribe, + describe: $allowDistributDescribe, initializationAction: () => this.switchComponentInit(), settingAction: (params) => this.switchComponentSet(params) }) diff --git a/product/default/volumepanel/package.json b/product/default/volumepanel/package.json index 823aba76..8f9107e3 100644 --- a/product/default/volumepanel/package.json +++ b/product/default/volumepanel/package.json @@ -1,13 +1,13 @@ { - "devDependencies": {}, - "name": "default_volumepanel", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"default_volumepanel", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": { - "@ohos/volumepanelcomponent": "file:../../../features/volumepanelcomponent" + "version":"1.0.0", + "dependencies":{ + "@ohos/volumepanelcomponent":"file:../../../features/volumepanelcomponent" } -} +} \ No newline at end of file diff --git a/product/pc/controlpanel/package.json b/product/pc/controlpanel/package.json index 9c017ca0..10b7ed6b 100644 --- a/product/pc/controlpanel/package.json +++ b/product/pc/controlpanel/package.json @@ -1,14 +1,14 @@ { - "devDependencies": {}, - "name": "pc_controlpanel", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"pc_controlpanel", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": { - "@ohos/controlcentercomponent": "file:../../../features/controlcentercomponent", - "@ohos/autorotatecomponent": "file:../../../features/autorotatecomponent" + "version":"1.0.0", + "dependencies":{ + "@ohos/controlcentercomponent":"file:../../../features/controlcentercomponent", + "@ohos/autorotatecomponent":"file:../../../features/autorotatecomponent" } -} +} \ No newline at end of file diff --git a/product/pc/notificationpanel/package.json b/product/pc/notificationpanel/package.json index e8701387..5e5ae957 100644 --- a/product/pc/notificationpanel/package.json +++ b/product/pc/notificationpanel/package.json @@ -1,13 +1,13 @@ { - "devDependencies": {}, - "name": "pc_notificationpanel", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"pc_notificationpanel", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": { - "@ohos/noticeitem": "file:../../../features/noticeitem" + "version":"1.0.0", + "dependencies":{ + "@ohos/noticeitem":"file:../../../features/noticeitem" } -} +} \ No newline at end of file diff --git a/product/pc/statusbar/package.json b/product/pc/statusbar/package.json index 3c1d464d..a7a80d7a 100644 --- a/product/pc/statusbar/package.json +++ b/product/pc/statusbar/package.json @@ -1,21 +1,21 @@ { - "devDependencies": {}, - "name": "pc_statusbar", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"pc_statusbar", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": { - "@ohos/statusbarcomponent": "file:../../../features/statusbarcomponent", - "@ohos/wificomponent": "file:../../../features/wificomponent", - "@ohos/bluetoothcomponent": "file:../../../features/bluetoothcomponent", - "@ohos/signalcomponent": "file:../../../features/signalcomponent", - "@ohos/clockcomponent": "file:../../../features/clockcomponent", - "@ohos/locationcomponent": "file:../../../features/locationcomponent", - "@ohos/batterycomponent": "file:../../../features/batterycomponent", - "@ohos/ringmodecomponent": "file:../../../features/ringmodecomponent", - "@ohos/capsulecomponent": "file:../../../features/capsulecomponent" + "version":"1.0.0", + "dependencies":{ + "@ohos/statusbarcomponent":"file:../../../features/statusbarcomponent", + "@ohos/wificomponent":"file:../../../features/wificomponent", + "@ohos/bluetoothcomponent":"file:../../../features/bluetoothcomponent", + "@ohos/signalcomponent":"file:../../../features/signalcomponent", + "@ohos/clockcomponent":"file:../../../features/clockcomponent", + "@ohos/locationcomponent":"file:../../../features/locationcomponent", + "@ohos/batterycomponent":"file:../../../features/batterycomponent", + "@ohos/ringmodecomponent":"file:../../../features/ringmodecomponent", + "@ohos/capsulecomponent":"file:../../../features/capsulecomponent" } -} +} \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/element/color.json b/product/pc/statusbar/src/main/resources/base/element/color.json index 3889b9ce..f407741b 100644 --- a/product/pc/statusbar/src/main/resources/base/element/color.json +++ b/product/pc/statusbar/src/main/resources/base/element/color.json @@ -30,7 +30,7 @@ }, { "name": "background_color", - "value": "#0xDCDCDC" + "value": "#DCDCDC" }, { "name": "control_center_complex_toggle_ring_mode_on_bg_color", diff --git a/product/phone/dropdownpanel/package.json b/product/phone/dropdownpanel/package.json index 5b43dca7..57fb14b7 100644 --- a/product/phone/dropdownpanel/package.json +++ b/product/phone/dropdownpanel/package.json @@ -1,23 +1,23 @@ { - "devDependencies": {}, - "name": "phone_dropdownpanel", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"phone_dropdownpanel", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": { - "@ohos/statusbarcomponent": "file:../../../features/statusbarcomponent", - "@ohos/wificomponent": "file:../../../features/wificomponent", - "@ohos/bluetoothcomponent": "file:../../../features/bluetoothcomponent", - "@ohos/signalcomponent": "file:../../../features/signalcomponent", - "@ohos/clockcomponent": "file:../../../features/clockcomponent", - "@ohos/locationcomponent": "file:../../../features/locationcomponent", - "@ohos/autorotatecomponent": "file:../../../features/autorotatecomponent", - "@ohos/batterycomponent": "file:../../../features/batterycomponent", - "@ohos/controlcentercomponent": "file:../../../features/controlcentercomponent", - "@ohos/ringmodecomponent": "file:../../../features/ringmodecomponent", - "@ohos/noticeitem": "file:../../../features/noticeitem" + "version":"1.0.0", + "dependencies":{ + "@ohos/statusbarcomponent":"file:../../../features/statusbarcomponent", + "@ohos/wificomponent":"file:../../../features/wificomponent", + "@ohos/bluetoothcomponent":"file:../../../features/bluetoothcomponent", + "@ohos/signalcomponent":"file:../../../features/signalcomponent", + "@ohos/clockcomponent":"file:../../../features/clockcomponent", + "@ohos/locationcomponent":"file:../../../features/locationcomponent", + "@ohos/batterycomponent":"file:../../../features/batterycomponent", + "@ohos/controlcentercomponent":"file:../../../features/controlcentercomponent", + "@ohos/ringmodecomponent":"file:../../../features/ringmodecomponent", + "@ohos/autorotatecomponent":"file:../../../features/autorotatecomponent", + "@ohos/noticeitem":"file:../../../features/noticeitem" } -} +} \ No newline at end of file diff --git a/product/phone/statusbar/package.json b/product/phone/statusbar/package.json index 6200748b..73717185 100644 --- a/product/phone/statusbar/package.json +++ b/product/phone/statusbar/package.json @@ -1,13 +1,13 @@ { - "devDependencies": {}, - "name": "phone_statusbar", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" + "devDependencies":{}, + "name":"phone_statusbar", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" }, - "version": "1.0.0", - "dependencies": { - "@ohos/statusbarcomponent": "file:../../../features/statusbarcomponent" + "version":"1.0.0", + "dependencies":{ + "@ohos/statusbarcomponent":"file:../../../features/statusbarcomponent" } -} +} \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/element/color.json b/product/phone/statusbar/src/main/resources/base/element/color.json index 3889b9ce..f407741b 100644 --- a/product/phone/statusbar/src/main/resources/base/element/color.json +++ b/product/phone/statusbar/src/main/resources/base/element/color.json @@ -30,7 +30,7 @@ }, { "name": "background_color", - "value": "#0xDCDCDC" + "value": "#DCDCDC" }, { "name": "control_center_complex_toggle_ring_mode_on_bg_color", -- Gitee From e96d5da5d0c5e5f27b2915af2e8a8cc6627f9922 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Fri, 4 Nov 2022 16:34:58 +0800 Subject: [PATCH 293/373] =?UTF-8?q?=E9=80=82=E9=85=8DsettingsData=E5=8E=BB?= =?UTF-8?q?=E5=B8=B8=E9=A9=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- common/src/main/ets/default/TimeManager.ts | 3 ++- .../src/main/ets/default/brightnessManager.ts | 1 + .../src/main/ets/viewmodel/NavigationBarViewModel.ts | 2 +- product/phone/dropdownpanel/src/main/ets/pages/index.ets | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts index 5bca02db..6a5c81ca 100644 --- a/common/src/main/ets/default/TimeManager.ts +++ b/common/src/main/ets/default/TimeManager.ts @@ -78,7 +78,8 @@ class TimeManager { private async initTimeFormat(context: any): Promise { Log.showDebug(TAG, "initTimeFormat"); - this.mSettingsHelper = await dataShare.createDataShareHelper(context, Constants.URI_VAR); + settings.getValueSync(context, TIME_FORMAT_KEY, "24"); + this.mSettingsHelper = await dataShare.createDataShareHelper(context, Constants.getUriSync(Constants.KEY_TIME_FORMAT)); const handleTimeFormatChange = () => { if (!this.mSettingsHelper) { diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index 333833eb..7b348ec9 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -74,6 +74,7 @@ export class brightnessManager { let value = parseInt(callback.value); Log.showInfo(TAG, `setValue ${value}`); mBrightnessValue.set(value); + settings.setValueSync(this.context, Constants.KEY_BRIGHTNESS_STATUS, JSON.stringify(value)); Log.showInfo(TAG, `setValue ${this.context}`); Brightness.setValue(callback.value); } diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index 6a63f88e..b7ae6b05 100644 --- a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -62,7 +62,7 @@ export default class NavigationBarViewModel { private async initHelper(callback: () => void): Promise { this.urivar = Constants.getUriSync(Constants.KEY_NAVIGATIONBAR_STATUS); - this.helper = await dataShare.createDataShareHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR), Constants.URI_VAR); + this.helper = await dataShare.createDataShareHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR), this.urivar); Log.showInfo(TAG, 'initHelper, helper: ' + this.helper + ', uri: ' + this.urivar); this.helper.on('dataChange', this.urivar, () => { Log.showInfo(TAG, 'onDataChange.'); diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index 1fd141e0..12ed7a99 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -132,8 +132,8 @@ struct Index { } private async initHelper(dropdownRect, navigationBarRect): Promise { - this.helper = await dataShare.createDataShareHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL), Constants.URI_VAR); this.urivar = Constants.getUriSync(Constants.KEY_NAVIGATIONBAR_STATUS); + this.helper = await dataShare.createDataShareHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL), this.urivar); Log.showDebug(TAG, `initHelper ${this.helper}, uri: ${JSON.stringify(this.urivar)}`); this.helper?.on("dataChange", this.urivar, () => { this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); -- Gitee From 865c758c1e03d15a253659067701e9cc8b4ec130 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Fri, 4 Nov 2022 18:07:31 +0800 Subject: [PATCH 294/373] to solve DTS2022110207574 Signed-off-by: tangzhigang1 --- .../ServiceExtAbility/ServiceExtAbility.ts | 62 ++++++++++--------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index cca87ef8..34eec4de 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -32,7 +32,7 @@ const SplitScreenEventData ={ class ServiceExtAbility extends ServiceExtension { private direction :number; - + private subConfigInfo: any; async onCreate(want: Want): Promise { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, this.context); @@ -60,12 +60,44 @@ class ServiceExtAbility extends ServiceExtension { } }) }) + + CommonEvent.createSubscriber(commonEventSubscribeInfo).then((subscriber) => { + CommonEvent.subscribe(subscriber, (err,data)=>{ + let eventData = data.parameters.windowMode.toString() + if(eventData == SplitScreenEventData.Show){ + Log.showInfo(TAG,`eventData is ${eventData}`) + let splitBarRect = { + left: this.subConfigInfo.realWidth/2 - 80, + top: this.subConfigInfo.yCoordinate, + width: 16, + height: this.subConfigInfo.maxHeight, + }; + WindowManager.createWindow(this.context, WindowType.SPLIT_BAR, splitBarRect, 'pages/SplitBarIndex').then(async () => + WindowManager.showWindow(WindowType.SPLIT_BAR) + ).then(() => { + subscriber.finishCommonEvent(); + }).catch((err) => { + }); + }else if( eventData == SplitScreenEventData.Destory){ + Log.showInfo(TAG,`eventData is ${eventData}`) + WindowManager.destroyWindow(WindowType.SPLIT_BAR).then(() => { + subscriber.finishCommonEvent(); + }).catch((err) => { + }); + }else{ + subscriber.finishCommonEvent(); + Log.showInfo(TAG,`eventData is ${eventData}`) + } + }) + }) + this.createNewWindow(true); } async createNewWindow (isNewWindow : boolean) { let defaultConfigInfo = await NavBarConfiguration.getConfiguration(); let configInfo = NavBarConfiguration.setCustomConfiguration(defaultConfigInfo); + this.subConfigInfo = configInfo; this.direction = configInfo.direction; AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config', configInfo); Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); @@ -88,34 +120,6 @@ class ServiceExtAbility extends ServiceExtension { } else { WindowManager.resetSizeWindow(WindowType.NAVIGATION_BAR, navigationBarRect); } - CommonEvent.createSubscriber(commonEventSubscribeInfo).then((subscriber) => { - CommonEvent.subscribe(subscriber, (err,data)=>{ - let eventData = data.parameters.windowMode.toString() - if(eventData == SplitScreenEventData.Show){ - Log.showInfo(TAG,`eventData is ${eventData}`) - let splitBarRect = { - left: configInfo.realWidth/2 - 80, - top: configInfo.yCoordinate, - width: 16, - height: configInfo.maxHeight, - }; - WindowManager.createWindow(this.context, WindowType.SPLIT_BAR, splitBarRect, 'pages/SplitBarIndex').then(async () => - WindowManager.showWindow(WindowType.SPLIT_BAR) - ).then(() => { - subscriber.finishCommonEvent(); - }).catch((err) => { - }); - }else if( eventData == SplitScreenEventData.Destory){ - Log.showInfo(TAG,`eventData is ${eventData}`) - WindowManager.destroyWindow(WindowType.SPLIT_BAR).then(() => { - subscriber.finishCommonEvent(); - }).catch((err) => { - }); - }else{ - Log.showInfo(TAG,`eventData is ${eventData}`) - } - }) - }) } onDestroy(): void { -- Gitee From 5d9126dc908db03bd38bb4e6f776ad06a2eb7524 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Mon, 7 Nov 2022 17:56:59 +0800 Subject: [PATCH 295/373] =?UTF-8?q?=E5=8D=87=E7=BA=A7SDK=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- common/src/main/ets/default/Constants.ts | 4 +++ common/src/main/ets/default/TimeManager.ts | 31 ++++++++++--------- .../main/resources/base/element/string.json | 8 ----- .../main/resources/en_US/element/string.json | 4 --- .../main/resources/zh_CN/element/string.json | 4 --- .../main/resources/base/element/string.json | 4 --- .../main/resources/en_US/element/string.json | 4 --- .../main/resources/zh_CN/element/string.json | 4 --- .../main/resources/base/element/string.json | 4 --- .../main/resources/en_US/element/string.json | 4 --- .../main/resources/zh_CN/element/string.json | 4 --- .../com/ohos/noticeItem/common/constants.ts | 1 + .../ohos/noticeItem/model/ParseDataUtil.ts | 9 +++--- .../ohos/noticeItem/viewmodel/ViewModel.ts | 7 +++-- .../main/resources/phone/element/color.json | 2 +- .../ets/com/ohos/model/screenLockService.ts | 9 ++++-- .../com/ohos/view/component/batterySoc.ets | 2 +- .../ets/com/ohos/vm/customPSDViewModel.ts | 1 + .../ets/com/ohos/vm/digitalPSDViewModel.ts | 1 + .../main/resources/base/element/color.json | 4 --- .../main/resources/base/element/float.json | 4 --- .../main/resources/base/element/string.json | 12 ------- .../main/resources/en_US/element/string.json | 12 ------- .../main/resources/phone/element/float.json | 4 --- .../main/resources/zh_CN/element/string.json | 12 ------- .../main/resources/base/element/color.json | 2 +- .../main/resources/base/element/string.json | 4 --- .../main/resources/zh_CN/element/string.json | 4 --- .../main/resources/base/element/string.json | 2 +- .../main/resources/base/element/color.json | 2 +- .../main/resources/base/element/string.json | 4 --- .../main/resources/en_US/element/string.json | 4 --- .../main/resources/zh_CN/element/string.json | 4 --- .../main/resources/base/element/color.json | 2 +- .../main/resources/base/element/string.json | 4 --- .../main/resources/en_US/element/string.json | 4 --- .../main/resources/zh_CN/element/string.json | 4 --- 37 files changed, 46 insertions(+), 149 deletions(-) diff --git a/common/src/main/ets/default/Constants.ts b/common/src/main/ets/default/Constants.ts index 01314333..f70dab68 100644 --- a/common/src/main/ets/default/Constants.ts +++ b/common/src/main/ets/default/Constants.ts @@ -29,4 +29,8 @@ export type WindowType = 'status' | 'navigation'; export default class Constants { static URI_VAR: string = 'dataability:///com.ohos.settingsdata.DataAbility'; + + static getUriSync(key: string): string { + return "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true&key=" + key; + } } \ No newline at end of file diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts index 182e6b9f..b890c954 100644 --- a/common/src/main/ets/default/TimeManager.ts +++ b/common/src/main/ets/default/TimeManager.ts @@ -16,11 +16,13 @@ import settings from "@ohos.settings"; import commonEvent from "@ohos.commonEvent"; +import dataShare from '@ohos.data.dataShare'; import featureAbility from "@ohos.ability.featureAbility"; import { DataAbilityHelper } from "ability/dataAbilityHelper"; import Log from "./Log"; import EventManager from "./event/EventManager"; import createOrGet from "./SingleInstanceHelper"; +import Constants from "./Constants"; import { obtainLocalEvent } from "./event/EventUtil"; import { CommonEventManager, getCommonEventManager, POLICY } from "./commonEvent/CommonEventManager"; @@ -32,7 +34,7 @@ export type TimeEventArgs = { }; const TAG = "TimeManagerSc"; -const URI_VAR = "dataability:///com.ohos.settingsdata.DataAbility"; +//const URI_VAR = "dataability:///com.ohos.settingsdata.DataAbility"; const TIME_FORMAT_KEY = settings.date.TIME_FORMAT; const TIME_SUBSCRIBE_INFO = { events: [ @@ -58,7 +60,7 @@ class TimeManager { public init(context: any) { this.mManager = getCommonEventManager( TAG, - TIME_SUBSCRIBE_INFO, + TIME_SUBSCRIBE_INFO, () => this.notifyTimeChange(), (isSubscribe) => isSubscribe && this.notifyTimeChange() ); @@ -70,38 +72,37 @@ class TimeManager { public release() { this.mManager?.release(); this.mManager = undefined; - this.mSettingsHelper?.off("dataChange", settings.getUriSync(TIME_FORMAT_KEY)); + this.mSettingsHelper?.off("dataChange", Constants.getUriSync(TIME_FORMAT_KEY)); } public formatTime(date: Date) { return concatTime(date.getHours() % (this.mUse24hFormat ? 24 : 12), date.getMinutes()); } - private initTimeFormat(context: any) { + private async initTimeFormat(context: any) { Log.showDebug(TAG, "initTimeFormat"); - this.mSettingsHelper = featureAbility.acquireDataAbilityHelper(context, URI_VAR); - + //this.mSettingsHelper = featureAbility.acquireDataAbilityHelper(context, URI_VAR); + this.mSettingsHelper = await dataShare.createDataShareHelper(context, Constants.getUriSync(TIME_FORMAT_KEY)); + //Log.showDebug(TAG, "url:"+Constants.getUriSync(TIME_FORMAT_KEY)); + //Log.showDebug(TAG, "mSettingsHelper:"+JSON.stringify(this.mSettingsHelper)); try { - this.mSettingsHelper.on("dataChange", settings.getUriSync(TIME_FORMAT_KEY), (err) => { - if (err.code !== 0) { - Log.showError(TAG, `failed to getAbilityWant, code: ${err.code}.`); - return; - } - this.handleTimeFormatChange(); + this.mSettingsHelper.on("dataChange", Constants.getUriSync(TIME_FORMAT_KEY), () => { + Log.showDebug(TAG, "mSettingsHelper on"); + this.handleTimeFormatChange(context); }); - this.handleTimeFormatChange(); + this.handleTimeFormatChange(context); } catch (e) { Log.showError(TAG, `Can't listen timeformate change.`); } } - private handleTimeFormatChange() { + private handleTimeFormatChange(context: any) { Log.showDebug(TAG, "handleTimeFormatChange") if (!this.mSettingsHelper) { Log.showError(TAG, `Can't get dataAbility helper.`); return; } - let timeString = settings.getValueSync(this.mSettingsHelper, TIME_FORMAT_KEY, "24"); + let timeString = settings.getValueSync(context, TIME_FORMAT_KEY, "24"); Log.showDebug(TAG, `timeFormat change: ${timeString}`); this.mUse24hFormat = timeString == "24"; this.notifyTimeChange(); diff --git a/common/src/main/resources/base/element/string.json b/common/src/main/resources/base/element/string.json index 89e9e043..5b6f96ed 100644 --- a/common/src/main/resources/base/element/string.json +++ b/common/src/main/resources/base/element/string.json @@ -1,13 +1,5 @@ { "string": [ - { - "name": "app_name", - "value": "ScreenLock" - }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, { "name": "monday", "value": "星期一" diff --git a/common/src/main/resources/en_US/element/string.json b/common/src/main/resources/en_US/element/string.json index 3a0f3b99..fd39e096 100644 --- a/common/src/main/resources/en_US/element/string.json +++ b/common/src/main/resources/en_US/element/string.json @@ -4,10 +4,6 @@ "name": "app_name", "value": "ScreenLock" }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, { "name": "monday", "value": "Monday" diff --git a/common/src/main/resources/zh_CN/element/string.json b/common/src/main/resources/zh_CN/element/string.json index 89e9e043..92e33923 100644 --- a/common/src/main/resources/zh_CN/element/string.json +++ b/common/src/main/resources/zh_CN/element/string.json @@ -4,10 +4,6 @@ "name": "app_name", "value": "ScreenLock" }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, { "name": "monday", "value": "星期一" diff --git a/features/batterycomponent/src/main/resources/base/element/string.json b/features/batterycomponent/src/main/resources/base/element/string.json index af63c7dc..dfba3e9e 100644 --- a/features/batterycomponent/src/main/resources/base/element/string.json +++ b/features/batterycomponent/src/main/resources/base/element/string.json @@ -3,10 +3,6 @@ { "name": "batterycomponent_MainAbility", "value": "batterycomponent_MainAbility" - }, - { - "name": "mainability_description", - "value": "ETS_Empty Feature Ability" } ] } \ No newline at end of file diff --git a/features/batterycomponent/src/main/resources/en_US/element/string.json b/features/batterycomponent/src/main/resources/en_US/element/string.json index af63c7dc..dfba3e9e 100644 --- a/features/batterycomponent/src/main/resources/en_US/element/string.json +++ b/features/batterycomponent/src/main/resources/en_US/element/string.json @@ -3,10 +3,6 @@ { "name": "batterycomponent_MainAbility", "value": "batterycomponent_MainAbility" - }, - { - "name": "mainability_description", - "value": "ETS_Empty Feature Ability" } ] } \ No newline at end of file diff --git a/features/batterycomponent/src/main/resources/zh_CN/element/string.json b/features/batterycomponent/src/main/resources/zh_CN/element/string.json index af63c7dc..dfba3e9e 100644 --- a/features/batterycomponent/src/main/resources/zh_CN/element/string.json +++ b/features/batterycomponent/src/main/resources/zh_CN/element/string.json @@ -3,10 +3,6 @@ { "name": "batterycomponent_MainAbility", "value": "batterycomponent_MainAbility" - }, - { - "name": "mainability_description", - "value": "ETS_Empty Feature Ability" } ] } \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/base/element/string.json b/features/clockcomponent/src/main/resources/base/element/string.json index 2c0dec28..dc6230c8 100644 --- a/features/clockcomponent/src/main/resources/base/element/string.json +++ b/features/clockcomponent/src/main/resources/base/element/string.json @@ -3,10 +3,6 @@ { "name": "clockcomponent_MainAbility", "value": "clockcomponent_MainAbility" - }, - { - "name": "mainability_description", - "value": "ETS_Empty Feature Ability" } ] } \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/en_US/element/string.json b/features/clockcomponent/src/main/resources/en_US/element/string.json index 2c0dec28..dc6230c8 100644 --- a/features/clockcomponent/src/main/resources/en_US/element/string.json +++ b/features/clockcomponent/src/main/resources/en_US/element/string.json @@ -3,10 +3,6 @@ { "name": "clockcomponent_MainAbility", "value": "clockcomponent_MainAbility" - }, - { - "name": "mainability_description", - "value": "ETS_Empty Feature Ability" } ] } \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/zh_CN/element/string.json b/features/clockcomponent/src/main/resources/zh_CN/element/string.json index 2c0dec28..dc6230c8 100644 --- a/features/clockcomponent/src/main/resources/zh_CN/element/string.json +++ b/features/clockcomponent/src/main/resources/zh_CN/element/string.json @@ -3,10 +3,6 @@ { "name": "clockcomponent_MainAbility", "value": "clockcomponent_MainAbility" - }, - { - "name": "mainability_description", - "value": "ETS_Empty Feature Ability" } ] } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts index 85aa6415..fde0c197 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts @@ -118,6 +118,7 @@ export interface NotificationItemData { distributedOption?: any; deviceId?: string; groupName?: string; + tapDismissed?: boolean; } export interface NotificationServiceListener { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index 0e474325..6ed502b2 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -52,7 +52,7 @@ export default class ParseDataUtil { return Promise.reject('consumeCallback request is empty'); } Log.showDebug(TAG, `parse data start, want = ${JSON.stringify(request.wantAgent)}`+ - `actionButtons = ${JSON.stringify(request.actionButtons)}`); + `actionButtons = ${JSON.stringify(request.actionButtons)}`); let userId = await getUserId(request.creatorUid); let appMessage = await ParseDataUtil.getAppData(request.creatorBundleName, userId); let notificationItem: NotificationItemData = { @@ -80,7 +80,8 @@ export default class ParseDataUtil { isRemoveAllowed: request.isRemoveAllowed, distributedOption: request.distributedOption, deviceId: request.deviceId, - groupName: request.groupName??request.hashcode + groupName: request.groupName??request.hashcode, + tapDismissed: request.tapDismissed }; notificationItem = { ...notificationItem, ...ParseDataUtil.getContentByType(request?.content?.contentType, request) @@ -106,8 +107,8 @@ export default class ParseDataUtil { let context = AbilityManager.getContext()??AbilityManager.getContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK); let item = await BundleManager.getResourceManager(TAG, context, bundleName); let appMessage = { - appName: parseInt(labelId) > 0 ? await item.getString(parseInt(labelId)) : '', - icon: parseInt(iconId) > 0 ? await item.getMediaBase64(parseInt(iconId)) : null + appName: parseInt(labelId) > 0 ? await item.getString(parseInt(labelId)) : '', + icon: parseInt(iconId) > 0 ? await item.getMediaBase64(parseInt(iconId)) : null }; if (appMessage.icon != null && appMessage.appName) { appDataMap.set(bundleName, appMessage); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index 8186ff68..81e280e7 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -255,10 +255,13 @@ export class ViewModel { } clickItem(itemData, want?: any) { - Log.showDebug(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}, tapDismissed: ${itemData.tapDismissed}`); + // Log.showDebug(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}`); NotificationWindowManager.hideNotificationWindow(); CommonUtil.startWant((want) ? want : itemData.want); - this.removeNotificationItem(itemData, true, true); + if (itemData.tapDismissed) { + this.removeNotificationItem(itemData, true, true); + } } clickReply(inputKey, content, want) { diff --git a/features/noticeitem/src/main/resources/phone/element/color.json b/features/noticeitem/src/main/resources/phone/element/color.json index 2954abd8..fc36b19f 100644 --- a/features/noticeitem/src/main/resources/phone/element/color.json +++ b/features/noticeitem/src/main/resources/phone/element/color.json @@ -58,7 +58,7 @@ }, { "name": "device_divider_color", - "value": "transparent" + "value": "#00000000" } ] } \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 40d6d181..38c530f0 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -257,8 +257,12 @@ export class ScreenLockService { Log.showInfo(TAG, `unlock the screen`); this.unlocking(); } else { - Log.showInfo(TAG, `unlockScreen Router.push`); - Router.push({ uri: mRouterPath }); + let slidestatus = AppStorage.Get('slidestatus') + if(!slidestatus){ + AppStorage.SetOrCreate('slidestatus', true); + Log.showInfo(TAG, `unlockScreen Router.push`); + Router.push({ uri: mRouterPath }); + } } }) }) @@ -269,6 +273,7 @@ export class ScreenLockService { //set the lockStatus to 'Unlock' AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Unlock); this.currentLockStatus = ScreenLockStatus.Unlock; + AppStorage.SetOrCreate('slidestatus', false); //unlock the screen this.screenLockModel.hiddenScreenLockWindow(() => { Log.showInfo(TAG, `hiddenScreenLockWindow finish`); diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets index 6bfaec81..d2c4e7d3 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets @@ -22,7 +22,7 @@ const TAG = 'ScreenLock-BatterySoc' export default struct BatterySoc { @StorageLink('batterySoc') @Watch('onBatterySocChanged') batterySoc: number = 100 @StorageLink('batteryCharging') @Watch('onBatterySocChanged') batteryCharging: boolean = false - @State batterySocText: string | Resource = '' + @State batterySocText: any = '' aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts index 74de8828..86d3cd63 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts @@ -52,6 +52,7 @@ export default class CustomPSDViewModel extends BaseViewModel { } this.updateStorage(callback); } else if (keyValue == Constants.GO_BACK) { + AppStorage.SetOrCreate('slidestatus', false); service.goBack(); } else if (keyValue == Constants.CALL_PHONE) { } diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts index 30da945e..6c3d683b 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -72,6 +72,7 @@ export default class DigitalPSDViewModel extends BaseViewModel { } this.updateStorage(callback); } else if (keyValue == Constants.GO_BACK) { + AppStorage.SetOrCreate('slidestatus', false); service.goBack(); } else if (keyValue == Constants.CALL_PHONE) { } diff --git a/features/screenlock/src/main/resources/base/element/color.json b/features/screenlock/src/main/resources/base/element/color.json index 46bfaf8a..3e3e8baa 100644 --- a/features/screenlock/src/main/resources/base/element/color.json +++ b/features/screenlock/src/main/resources/base/element/color.json @@ -4,10 +4,6 @@ "name": "lock_prompt_color", "value": "#ffffff" }, - { - "name": "nonotification_text_color", - "value": "#ffffff" - }, { "name": "circle_background", "value": "#ffffff" diff --git a/features/screenlock/src/main/resources/base/element/float.json b/features/screenlock/src/main/resources/base/element/float.json index d4a68f77..db2757d3 100644 --- a/features/screenlock/src/main/resources/base/element/float.json +++ b/features/screenlock/src/main/resources/base/element/float.json @@ -28,10 +28,6 @@ "name": "lock_Text_top_margin", "value": "0" }, - { - "name": "deleteall_image_opacity", - "value": "0.9" - }, { "name": "batterysoc_fontsize", "value": "36" diff --git a/features/screenlock/src/main/resources/base/element/string.json b/features/screenlock/src/main/resources/base/element/string.json index d572e124..0e5737f1 100644 --- a/features/screenlock/src/main/resources/base/element/string.json +++ b/features/screenlock/src/main/resources/base/element/string.json @@ -16,18 +16,6 @@ "name": "face_not_recognized", "value": "未识别成功, 双击重试" }, - { - "name": "yyyy_mm_dd", - "value": "%d/%d/%d" - }, - { - "name": "mm_dd", - "value": "%d/%d" - }, - { - "name": "nonotification_text", - "value": "无通知" - }, { "name": "input", "value": "输入密码" diff --git a/features/screenlock/src/main/resources/en_US/element/string.json b/features/screenlock/src/main/resources/en_US/element/string.json index 3ff6cf72..c96703ad 100644 --- a/features/screenlock/src/main/resources/en_US/element/string.json +++ b/features/screenlock/src/main/resources/en_US/element/string.json @@ -16,18 +16,6 @@ "name": "face_not_recognized", "value": "Face not recognized. Touch twice to try again" }, - { - "name": "yyyy_mm_dd", - "value": "%d/%d/%d" - }, - { - "name": "mm_dd", - "value": "%d/%d" - }, - { - "name": "nonotification_text", - "value": "No Notification" - }, { "name": "input", "value": "Input password" diff --git a/features/screenlock/src/main/resources/phone/element/float.json b/features/screenlock/src/main/resources/phone/element/float.json index e2d226e1..c59ae13d 100644 --- a/features/screenlock/src/main/resources/phone/element/float.json +++ b/features/screenlock/src/main/resources/phone/element/float.json @@ -28,10 +28,6 @@ "name": "lock_Text_top_margin", "value": "58vp" }, - { - "name": "deleteall_image_opacity", - "value": "0.9" - }, { "name": "batterysoc_fontsize", "value": "36" diff --git a/features/screenlock/src/main/resources/zh_CN/element/string.json b/features/screenlock/src/main/resources/zh_CN/element/string.json index 112db8ad..0e5737f1 100644 --- a/features/screenlock/src/main/resources/zh_CN/element/string.json +++ b/features/screenlock/src/main/resources/zh_CN/element/string.json @@ -16,18 +16,6 @@ "name": "face_not_recognized", "value": "未识别成功, 双击重试" }, - { - "name": "yyyy_mm_dd", - "value": "%d年%d月%d日" - }, - { - "name": "mm_dd", - "value": "%d月%d日" - }, - { - "name": "nonotification_text", - "value": "无通知" - }, { "name": "input", "value": "输入密码" diff --git a/features/shortcutcomponent/src/main/resources/base/element/color.json b/features/shortcutcomponent/src/main/resources/base/element/color.json index afad5971..c623d296 100644 --- a/features/shortcutcomponent/src/main/resources/base/element/color.json +++ b/features/shortcutcomponent/src/main/resources/base/element/color.json @@ -2,7 +2,7 @@ "color": [ { "name": "shortcut_icon_color", - "value": "rgba(255, 255, 255, 0.5)" + "value": "#03FFFFFF" }, { "name": "shortcut_text_color", diff --git a/features/signalcomponent/src/main/resources/base/element/string.json b/features/signalcomponent/src/main/resources/base/element/string.json index 8d37879d..3cae7145 100644 --- a/features/signalcomponent/src/main/resources/base/element/string.json +++ b/features/signalcomponent/src/main/resources/base/element/string.json @@ -4,10 +4,6 @@ "name": "signalcomponent", "value": "signalcomponent" }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, { "name": "china_mobile", "value": "中国移动" diff --git a/features/signalcomponent/src/main/resources/zh_CN/element/string.json b/features/signalcomponent/src/main/resources/zh_CN/element/string.json index a6d2990b..a6b0304c 100644 --- a/features/signalcomponent/src/main/resources/zh_CN/element/string.json +++ b/features/signalcomponent/src/main/resources/zh_CN/element/string.json @@ -4,10 +4,6 @@ "name": "signalcomponent", "value": "signalcomponent" }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, { "name": "china_mobile", "value": "中国移动" diff --git a/features/wificomponent/src/main/resources/base/element/string.json b/features/wificomponent/src/main/resources/base/element/string.json index 1e76de0c..ffbf12de 100644 --- a/features/wificomponent/src/main/resources/base/element/string.json +++ b/features/wificomponent/src/main/resources/base/element/string.json @@ -1,7 +1,7 @@ { "string": [ { - "name": "page_show", + "name": "page_show_wifi", "value": "page from npm package" } ] diff --git a/product/pc/src/main/resources/base/element/color.json b/product/pc/src/main/resources/base/element/color.json index 3e4d76d0..b1a9a9db 100644 --- a/product/pc/src/main/resources/base/element/color.json +++ b/product/pc/src/main/resources/base/element/color.json @@ -110,7 +110,7 @@ }, { "name": "shortcut_icon_color", - "value": "rgba(255, 255, 255, 0.5)" + "value": "#03FFFFFF" }, { "name": "shortcut_text_color", diff --git a/product/pc/src/main/resources/base/element/string.json b/product/pc/src/main/resources/base/element/string.json index e939d42c..dd6b5460 100644 --- a/product/pc/src/main/resources/base/element/string.json +++ b/product/pc/src/main/resources/base/element/string.json @@ -176,10 +176,6 @@ "name": "signalcomponent", "value": "signalcomponent" }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, { "name": "china_mobile", "value": "中国移动" diff --git a/product/pc/src/main/resources/en_US/element/string.json b/product/pc/src/main/resources/en_US/element/string.json index baf627c4..03c200d0 100644 --- a/product/pc/src/main/resources/en_US/element/string.json +++ b/product/pc/src/main/resources/en_US/element/string.json @@ -4,10 +4,6 @@ "name": "app_name", "value": "ScreenLock" }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, { "name": "description_mainability", "value": "JS_Phone_Empty Feature Ability" diff --git a/product/pc/src/main/resources/zh_CN/element/string.json b/product/pc/src/main/resources/zh_CN/element/string.json index baf627c4..03c200d0 100644 --- a/product/pc/src/main/resources/zh_CN/element/string.json +++ b/product/pc/src/main/resources/zh_CN/element/string.json @@ -4,10 +4,6 @@ "name": "app_name", "value": "ScreenLock" }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, { "name": "description_mainability", "value": "JS_Phone_Empty Feature Ability" diff --git a/product/phone/src/main/resources/base/element/color.json b/product/phone/src/main/resources/base/element/color.json index 3e4d76d0..b1a9a9db 100644 --- a/product/phone/src/main/resources/base/element/color.json +++ b/product/phone/src/main/resources/base/element/color.json @@ -110,7 +110,7 @@ }, { "name": "shortcut_icon_color", - "value": "rgba(255, 255, 255, 0.5)" + "value": "#03FFFFFF" }, { "name": "shortcut_text_color", diff --git a/product/phone/src/main/resources/base/element/string.json b/product/phone/src/main/resources/base/element/string.json index 4fd36b80..93513a9c 100644 --- a/product/phone/src/main/resources/base/element/string.json +++ b/product/phone/src/main/resources/base/element/string.json @@ -176,10 +176,6 @@ "name": "signalcomponent", "value": "signalcomponent" }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, { "name": "china_mobile", "value": "中国移动" diff --git a/product/phone/src/main/resources/en_US/element/string.json b/product/phone/src/main/resources/en_US/element/string.json index 7ffa73eb..105ce5b4 100644 --- a/product/phone/src/main/resources/en_US/element/string.json +++ b/product/phone/src/main/resources/en_US/element/string.json @@ -4,10 +4,6 @@ "name": "app_name", "value": "ScreenLock" }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, { "name": "description_mainability", "value": "JS_Phone_Empty Feature Ability" diff --git a/product/phone/src/main/resources/zh_CN/element/string.json b/product/phone/src/main/resources/zh_CN/element/string.json index ba1906b7..389f11be 100644 --- a/product/phone/src/main/resources/zh_CN/element/string.json +++ b/product/phone/src/main/resources/zh_CN/element/string.json @@ -4,10 +4,6 @@ "name": "app_name", "value": "ScreenLock" }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, { "name": "description_mainability", "value": "JS_Phone_Empty Feature Ability" -- Gitee From a5ee4a8d05b8e21dcc19f1af73b973d5a3f4f1fa Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Mon, 14 Nov 2022 10:58:10 +0800 Subject: [PATCH 296/373] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BB=8E=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E4=B8=AD=E5=BF=83=E6=89=93=E5=BC=80=E8=93=9D=E7=89=99?= =?UTF-8?q?=E7=BB=84=E7=BD=91=E5=A4=B1=E8=B4=A5=20+=20=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83=E8=BF=9B=E5=85=A5=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=EF=BC=8C=E7=95=8C=E9=9D=A2=E5=B7=A6=E4=BE=A7=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=99=BD=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../ets/com/ohos/model/BluetoothService.ts | 4 +- .../ohos/view/component/switchComponent.ets | 2 +- .../ohos/noticeItem/model/ParseDataUtil.ts | 3 +- .../src/main/ets/default/pages/signalIcon.ets | 2 +- .../ets/com/ohos/model/StatusBarService.ts | 2 +- .../main/ets/default/pages/wifiComponent.ets | 2 +- .../src/main/ets/default/pages/wifiIcon.ets | 2 +- .../src/main/ets/pages/threeLayout.ets | 2 +- .../src/main/ets/pages/batchSetEnable.ets | 92 +++---- .../src/main/ets/pages/noDisturb.ets | 240 +++++++++--------- .../src/main/ets/pages/noDisturbPre.ets | 6 +- .../ets/pages/notificationManagenment.ets | 232 ++++++++--------- .../src/main/ets/pages/setEnable.ets | 10 +- .../src/main/ets/pages/slotSetting.ets | 8 +- .../src/main/ets/vm/noDisturbViewModel.ts | 8 +- .../vm/notificationManagenmentViewModel.ts | 6 +- .../volumepanel/src/main/ets/pages/index.ets | 2 +- .../src/main/ets/pages/common/StyleManager.ts | 12 +- .../controlpanel/src/main/ets/pages/index.ets | 2 +- .../src/main/ets/pages/bannerNotification.ets | 12 +- .../src/main/ets/pages/notification.ets | 8 +- .../main/ets/pages/common/StatusbarConfig.ts | 2 +- .../src/main/ets/pages/common/StyleManager.ts | 22 +- .../src/main/ets/pages/bannerNotification.ets | 12 +- .../src/main/ets/pages/common/StyleManager.ts | 10 +- .../src/main/ets/pages/notification.ets | 24 +- .../ets/workers/PluginDataSourceWorker.js | 4 +- .../main/ets/pages/common/StatusbarConfig.ts | 2 +- .../src/main/ets/pages/common/StyleManager.ts | 2 +- 29 files changed, 370 insertions(+), 365 deletions(-) diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts index f48f9a71..a54c0610 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -49,9 +49,11 @@ export class BluetoothService { if (this.mIsBluetoothOpen != isOpen) { Log.showInfo(TAG, `state change: ${isOpen}`); this.mIsBluetoothOpen = isOpen; - bluetooth.setBluetoothScanMode(bluetooth.ScanMode.SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, 0); this.mListener?.updateState(this.mIsBluetoothOpen); } + if(state == bluetooth.BluetoothState.STATE_ON) { + bluetooth.setBluetoothScanMode(bluetooth.ScanMode.SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, 0); + } }); Log.showInfo(TAG, `startService, mIsBluetoothOpen: ${this.mIsBluetoothOpen}`); } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index fd75380c..9564aded 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -20,7 +20,7 @@ const TAG = 'ManagementComponent-SwitchComponent'; @Component export default struct SwitchComponent { @Link title: Resource; - @Link describe: Resource; + describe: Resource; private initializationAction: (params?) => Promise private settingAction: (params?) => void private register?: (listener) => void diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index 37de305f..fabc550d 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -23,6 +23,7 @@ import DistributionManager from './NotificationDistributionManager'; import NotificationManager from './NotificationManager'; import Constants, {NotificationItemData} from '../common/constants'; import {NotificationConfig} from './NotificationConfig'; +import TimeManager from '../../../../../../../../../common/src/main/ets/default/TimeManager' const TAG = 'Notification_ParseDataUtil'; let mDate = new Date(); @@ -63,7 +64,7 @@ export default class ParseDataUtil { hashcode: request.hashCode, contentType: `${request?.content?.contentType}`, timestamp: request.deliveryTime, - time: ParseDataUtil.getStandardTime(request.deliveryTime), + time: TimeManager.formatTime(new Date(request.deliveryTime)), appName: appMessage.appName, want: request.wantAgent, bundleName: request.creatorBundleName, diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index a59d2a37..fd06cd2f 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -14,7 +14,7 @@ */ import Constants from '../common/constants'; -import mSignalModel from '../SignalModel'; +import mSignalModel from '../signalModel'; import Log from '../../../../../../../common/src/main/ets/default/Log' import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager' import StyleConfigurationCommon, { CommonStyle diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts index 41c404bf..b7f7659a 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -22,7 +22,7 @@ import { ItemComponentData, PluginComponentData, FilterData import PluginDataSourceAdapter from '../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import Constants, { StatusBarData, StatusBarComponentData, LayoutGroup, StatusBarConfig } from '../common/Constants'; -import { parseEventString } from '../../../../../../../../common/src/main/ets/default/Event/EventUtil'; +import { parseEventString } from '../../../../../../../../common/src/main/ets/default/event/EventUtil'; export interface StatusBarListener { setStatusBarLayout(layout: string[][]): void; diff --git a/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets b/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets index 19b63d73..74052e3f 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import mWifiManger from '../WifiModel' +import mWifiManger from '../wifiModel' import Log from '../../../../../../../common/src/main/ets/default/Log' import EventManager from "../../../../../../../common/src/main/ets/default/event/EventManager" import {obtainStartAbility} from "../../../../../../../common/src/main/ets/default/event/EventUtil" diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index d69e79e7..d8cd535d 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -14,7 +14,7 @@ */ import Constants from '../common/constants' -import mWifiModel from '../WifiModel' +import mWifiModel from '../wifiModel' import Log from '../../../../../../../common/src/main/ets/default/Log' import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager' import StyleConfigurationCommon, { CommonStyle diff --git a/product/default/navigationBar/src/main/ets/pages/threeLayout.ets b/product/default/navigationBar/src/main/ets/pages/threeLayout.ets index 22f8543b..45359fd0 100644 --- a/product/default/navigationBar/src/main/ets/pages/threeLayout.ets +++ b/product/default/navigationBar/src/main/ets/pages/threeLayout.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import keyButton from './keybutton'; +import keyButton from './keyButton'; import Constants from '../common/constants' import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NavigationBar-ThreeLayout'; diff --git a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets index 4feae616..76227adb 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets @@ -15,8 +15,8 @@ //import Window from '@ohos.window'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; -import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appitemcomponent'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; import ConfigData from '../common/constants'; import Router from '@system.router' import ViewModel from '../vm/notificationManagenmentViewModel' @@ -33,54 +33,54 @@ export default struct BatchSetEnable { build() { Column() { GridContainer({columns:12, sizeType: SizeType.Auto, gutter: vp2px(1) === 2 ? '12vp' : '0vp', margin: vp2px(1) === 2 ? '12vp' : '0vp'}) { - Row() { - Column() { - HeadComponent({ headName: $headName, isActive: true }); - List() { - ForEach(this.appList, (item) => { - ListItem() { - AppItemComponent({ - appIcon: item.appIcon, - appTitle: item.appTitle, - appSummary: item.appSummary, - appValue: item.appValue, - appArrow: item.appArrow, - appArrowStyle: '', - appUri: '', - appBundleName:item.appBundleName, - appUid:item.appUid, - appSwitch:1 - }); - } - .height($r('app.float.appitem_item_height')); - }); + Row() { + Column() { + HeadComponent({ headName: $headName, isActive: true }); + List() { + ForEach(this.appList, (item) => { + ListItem() { + AppItemComponent({ + appIcon: item.appIcon, + appTitle: item.appTitle, + appSummary: item.appSummary, + appValue: item.appValue, + appArrow: item.appArrow, + appArrowStyle: '', + appUri: '', + appBundleName:item.appBundleName, + appUid:item.appUid, + appSwitch:1 + }); + } + .height($r('app.float.appitem_item_height')); + }); + } + .divider({ + strokeWidth: 1, + color: $r('app.color.divider_color'), + startMargin: $r('app.float.divider_margin_l_info'), + endMargin: $r('app.float.divider_margin_r') + }) + .width(ConfigData.WH_100_100) + .layoutWeight(1) + .padding({ left: $r('app.float.itemComp_padding_l'), right: $r('app.float.itemComp_padding_r') }) + .align(Alignment.Top) + .backgroundColor(Color.White) + .visibility(Visibility.Visible) + .zIndex(0) + .border({ width: $r('app.float.border_width'), color:Color.White, + radius:$r('app.float.border_radius') }) + .margin({ top: $r('app.float.itemComp_margin_b') }); } - .divider({ - strokeWidth: 1, - color: $r('app.color.divider_color'), - startMargin: $r('app.float.divider_margin_l_info'), - endMargin: $r('app.float.divider_margin_r') - }) + .padding({ left: $r('sys.float.ohos_id_default_padding_start'), right: $r('sys.float.ohos_id_default_padding_start') }) .width(ConfigData.WH_100_100) - .layoutWeight(1) - .padding({ left: $r('app.float.itemComp_padding_l'), right: $r('app.float.itemComp_padding_r') }) - .align(Alignment.Top) - .backgroundColor(Color.White) - .visibility(Visibility.Visible) - .zIndex(0) - .border({ width: $r('app.float.border_width'), color:Color.White, - radius:$r('app.float.border_radius') }) - .margin({ top: $r('app.float.itemComp_margin_b') }); + .flexShrink(1) + .useSizeType({ + xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, + md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } + }); } - .padding({ left: $r('sys.float.ohos_id_default_padding_start'), right: $r('sys.float.ohos_id_default_padding_start') }) .width(ConfigData.WH_100_100) - .flexShrink(1) - .useSizeType({ - xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, - md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } - }); - } - .width(ConfigData.WH_100_100) } } .backgroundColor($r("sys.color.ohos_id_color_sub_background")) diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index fe9ed791..dfa42721 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -14,14 +14,14 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; import ConfigData from '../common/constants'; import deviceInfo from '@ohos.deviceInfo'; -import { concatTime } from '../../../../../../../common/src/main/ets/default/timemanager'; -import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemcomponent'; +import { concatTime } from '../../../../../../../common/src/main/ets/default/TimeManager'; +import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; import {DoNotDisturbType} from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; -import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/nodisturbingmodel'; -import ViewModel from '../vm/nodisturbviewmodel'; +import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel'; +import ViewModel from '../vm/noDisturbViewModel'; const deviceTypeInfo = deviceInfo.deviceType; const TAG = 'NotificationManagement-NoDisturb'; @@ -105,132 +105,132 @@ export default struct NoDisturb { build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { Column() { - GridContainer({columns:12, sizeType: SizeType.Auto, gutter: vp2px(1) === 2 ? '12vp' : '0vp', margin: vp2px(1) === 2 ? '12vp' : '0vp'}) { - Row() { - Column() { - HeadComponent({ headName: $headName, isActive: true }) - if (this.mRefreshCnt > 0) { - Row() { - ItemComponent({ - title: $repeatTitle, - value: this.mViewModel.repeatName, - arrow: $arrow - }) - }.onClick(() => { - this.repeatDialogController.open() - }).margin({ bottom: $r('app.float.itemComp_margin_b') }) + GridContainer({columns:12, sizeType: SizeType.Auto, gutter: vp2px(1) === 2 ? '12vp' : '0vp', margin: vp2px(1) === 2 ? '12vp' : '0vp'}) { + Row() { + Column() { + HeadComponent({ headName: $headName, isActive: true }) + if (this.mRefreshCnt > 0) { + Row() { + ItemComponent({ + title: $repeatTitle, + value: this.mViewModel.repeatName, + arrow: $arrow + }) + }.onClick(() => { + this.repeatDialogController.open() + }).margin({ bottom: $r('app.float.itemComp_margin_b') }) - if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { - List() { - ListItem() { - Row() { - ItemComponent({ - title: $startDateTitle, - value: this.mViewModel.startDateClue, - arrow: $arrow - }) - }.onClick(() => { - this.startDateDialogController.open() - }) - } - ListItem() { - Row() { - ItemComponent({ - title: $startTitle, - value: this.mViewModel.startTimeClue, - arrow: $arrow - }) - }.onClick(() => { - this.startTimeDialogController.open() + if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + List() { + ListItem() { + Row() { + ItemComponent({ + title: $startDateTitle, + value: this.mViewModel.startDateClue, + arrow: $arrow }) - } - }.divider({ - strokeWidth: 1, - color: $r('app.color.divider_color'), - startMargin: $r('app.float.divider_margin_l'), - endMargin: $r('app.float.divider_margin_r') - }).width(ConfigData.WH_100_100) - .visibility(Visibility.Visible) - .zIndex(0) - .border({ width: $r('app.float.border_width'), color: Color.White, - radius: $r('app.float.border_radius') }) - .backgroundColor(Color.White) - .margin({ bottom: $r('app.float.itemComp_margin_b')}) - .flexShrink(1) - List() { - ListItem() { - Row() { - ItemComponent({ - title: $endDateTitle, - value: this.mViewModel.endDateClue, - arrow: $arrow - }) - }.onClick(() => { - this.endDateDialogController.open() + }.onClick(() => { + this.startDateDialogController.open() + }) + } + ListItem() { + Row() { + ItemComponent({ + title: $startTitle, + value: this.mViewModel.startTimeClue, + arrow: $arrow }) - } - ListItem() { - Row() { - ItemComponent({ - title: $endTitle, - value: this.mViewModel.endTimeClue, - arrow: $arrow - }) - }.onClick(() => { - this.endTimeDialogController.open() + }.onClick(() => { + this.startTimeDialogController.open() + }) + } + }.divider({ + strokeWidth: 1, + color: $r('app.color.divider_color'), + startMargin: $r('app.float.divider_margin_l'), + endMargin: $r('app.float.divider_margin_r') + }).width(ConfigData.WH_100_100) + .visibility(Visibility.Visible) + .zIndex(0) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + .margin({ bottom: $r('app.float.itemComp_margin_b')}) + .flexShrink(1) + List() { + ListItem() { + Row() { + ItemComponent({ + title: $endDateTitle, + value: this.mViewModel.endDateClue, + arrow: $arrow }) - } - }.divider({ - strokeWidth: 1, - color: $r('app.color.divider_color'), - startMargin: $r('app.float.divider_margin_l'), - endMargin: $r('app.float.divider_margin_r') - }).width(ConfigData.WH_100_100) - .visibility(Visibility.Visible) - .zIndex(0) - .border({ width: $r('app.float.border_width'), color: Color.White, - radius: $r('app.float.border_radius') }) - .backgroundColor(Color.White) - .margin({ bottom: $r('app.float.itemComp_margin_b')}) - .flexShrink(1) - } else { - Row() { - ItemComponent({ - title: $startTitle, - value: this.mViewModel.startTimeClue, - arrow: $arrow + }.onClick(() => { + this.endDateDialogController.open() }) - }.onClick(() => { - this.mPrevData = this.mViewModel.startTime - this.startTimeDialogController.open() - }).margin({ bottom: $r('app.float.itemComp_margin_b')}) - Row() { - ItemComponent({ - title: $endTitle, - value: this.mViewModel.endTimeClue, - arrow: $arrow + } + ListItem() { + Row() { + ItemComponent({ + title: $endTitle, + value: this.mViewModel.endTimeClue, + arrow: $arrow + }) + }.onClick(() => { + this.endTimeDialogController.open() }) - }.onClick(() => { - this.mPrevData = this.mViewModel.endTime - this.endTimeDialogController.open() - }).margin({ bottom: $r('app.float.itemComp_margin_b')}) - } + } + }.divider({ + strokeWidth: 1, + color: $r('app.color.divider_color'), + startMargin: $r('app.float.divider_margin_l'), + endMargin: $r('app.float.divider_margin_r') + }).width(ConfigData.WH_100_100) + .visibility(Visibility.Visible) + .zIndex(0) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + .margin({ bottom: $r('app.float.itemComp_margin_b')}) + .flexShrink(1) + } else { + Row() { + ItemComponent({ + title: $startTitle, + value: this.mViewModel.startTimeClue, + arrow: $arrow + }) + }.onClick(() => { + this.mPrevData = this.mViewModel.startTime + this.startTimeDialogController.open() + }).margin({ bottom: $r('app.float.itemComp_margin_b')}) + Row() { + ItemComponent({ + title: $endTitle, + value: this.mViewModel.endTimeClue, + arrow: $arrow + }) + }.onClick(() => { + this.mPrevData = this.mViewModel.endTime + this.endTimeDialogController.open() + }).margin({ bottom: $r('app.float.itemComp_margin_b')}) } } - .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100) - .padding({ - left: $r('sys.float.ohos_id_default_padding_start'), - right: $r('sys.float.ohos_id_default_padding_end') - }) - .useSizeType({ - xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, - md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } - }) } .width(ConfigData.WH_100_100) .height(ConfigData.WH_100_100) - } + .padding({ + left: $r('sys.float.ohos_id_default_padding_start'), + right: $r('sys.float.ohos_id_default_padding_end') + }) + .useSizeType({ + xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, + md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } + }) + } + .width(ConfigData.WH_100_100) + .height(ConfigData.WH_100_100) + } } .backgroundColor($r("sys.color.ohos_id_color_sub_background")) .width(ConfigData.WH_100_100) diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets index f0566865..644e3750 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets @@ -16,9 +16,9 @@ //import Window from '@ohos.window'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; -import NoDisturbComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/nodisturbcomponent'; -import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemcomponent'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import NoDisturbComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent'; +import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; import ConfigData from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; import Router from '@system.router'; diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index 60c1dba3..f0b090c0 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -16,15 +16,15 @@ //import Window from '@ohos.window'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; -import NoDisturbComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/nodisturbcomponent'; -import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemcomponent'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import NoDisturbComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent'; +import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; import ConfigData from '../common/constants'; -import AppLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/applstcomponent'; +import AppLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent'; import Router from '@system.router'; -import ViewModel from '../vm/notificationmanagenmentviewmodel' -import Notification from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationlistener'; -import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchcomponent'; +import ViewModel from '../vm/notificationManagenmentViewmodel' +import Notification from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; +import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; const TAG = 'NotificationManagement-Main'; @@ -40,140 +40,142 @@ export default struct notificationManagenment { @State allowDistributDescribe: Resource = $r('app.string.allowDistributDescribe') build() { - GridContainer({ + Column() { + GridContainer({ columns: 12, sizeType: SizeType.Auto, gutter: vp2px(1) === 2 ? '12vp' : '0vp', margin: vp2px(1) === 2 ? '24vp' : '0vp' }) { - Row() { - Column() { - HeadComponent({ headName: $headName, isActive: true }) + Row() { Column() { - Row() { - Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { - Column() { - Text($r('app.string.noDisturb')) - .fontSize($r('sys.float.ohos_id_text_size_body1')) - .fontColor($r('app.color.itemComp_title_color')) - .textAlign(TextAlign.Start) - .fontWeight(FontWeight.Bold) - .height($r('app.float.itemComp_height')) - .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) - } - .flexShrink(1) - .align(Alignment.Start) - .alignItems(HorizontalAlign.Start) - - Row() { - if (this.mViewModel.isEffective) { - Text($r('app.string.noDisturb_opened')) - .fontSize($r('sys.float.ohos_id_text_size_body1')) - .fontColor($r('app.color.itemComp_title_color')) - .align(Alignment.End) - .margin({ right: $r("app.float.noDisturb_text_margin_right") }) - .fontWeight(FontWeight.Medium) - } else { - Text($r('app.string.noDisturb_closed')) + HeadComponent({ headName: $headName, isActive: true }) + Column() { + Row() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Column() { + Text($r('app.string.noDisturb')) .fontSize($r('sys.float.ohos_id_text_size_body1')) .fontColor($r('app.color.itemComp_title_color')) + .textAlign(TextAlign.Start) + .fontWeight(FontWeight.Bold) + .height($r('app.float.itemComp_height')) + .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) + } + .flexShrink(1) + .align(Alignment.Start) + .alignItems(HorizontalAlign.Start) + + Row() { + if (this.mViewModel.isEffective) { + Text($r('app.string.noDisturb_opened')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('app.color.itemComp_title_color')) + .align(Alignment.End) + .margin({ right: $r("app.float.noDisturb_text_margin_right") }) + .fontWeight(FontWeight.Medium) + } else { + Text($r('app.string.noDisturb_closed')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('app.color.itemComp_title_color')) + .align(Alignment.End) + .margin({ right: $r("app.float.noDisturb_text_margin_right") }) + .fontWeight(FontWeight.Medium) + } + Image($r('app.media.ic_settings_arrow')) .align(Alignment.End) - .margin({ right: $r("app.float.noDisturb_text_margin_right") }) - .fontWeight(FontWeight.Medium) + .width($r('app.float.itemComp_image_width')) + .height($r('app.float.itemComp_image_height')) } - Image($r('app.media.ic_settings_arrow')) - .align(Alignment.End) - .width($r('app.float.itemComp_image_width')) - .height($r('app.float.itemComp_image_height')) + .padding({ right: $r('sys.float.ohos_id_default_padding_end') }) + .flexShrink(0) + .align(Alignment.End) + .alignItems(VerticalAlign.Center) } - .padding({ right: $r('sys.float.ohos_id_default_padding_end') }) - .flexShrink(0) - .align(Alignment.End) - .alignItems(VerticalAlign.Center) + .width(ConfigData.WH_100_100) + .height($r('app.float.itemComp_height')) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) } - .width(ConfigData.WH_100_100) .height($r('app.float.itemComp_height')) - .border({ width: $r('app.float.border_width'), color: Color.White, - radius: $r('app.float.border_radius') }) - .backgroundColor(Color.White) + .margin({ top: $r('app.float.noDisturb_margin_lf') }) + .align(Alignment.Start) + .onClick(() => { + Log.showDebug(TAG, `NoDisturbComponent on click`) + Router.push({ uri: 'pages/noDisturbPre' }); + }) + .width(ConfigData.WH_100_100) + .flexShrink(0) + + Divider() + .color($r('app.color.divider_color')) + .strokeWidth(1) + .padding({ + left: $r('sys.float.ohos_id_default_padding_start'), + right: $r('sys.float.ohos_id_default_padding_end') + }) + + Row() { + SwitchComponent({ + title: $allowDistribut, + describe: this.allowDistributDescribe, + initializationAction: () => this.switchComponentInit(), + settingAction: (params) => this.switchComponentSet(params) + }) + }.margin({ bottom: $r('app.float.noDisturb_margin_lf') }) } - .height($r('app.float.itemComp_height')) - .margin({ top: $r('app.float.noDisturb_margin_lf') }) - .align(Alignment.Start) - .onClick(() => { - Log.showDebug(TAG, `NoDisturbComponent on click`) - Router.push({ uri: 'pages/noDisturbPre' }); - }) + .backgroundColor(Color.White) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .margin({ top: $r('app.float.page_notice_title_margin_t') }); + + Row() { + Text($r('app.string.notificationManagement')) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .fontWeight(FontWeight.Medium) + .fontFamily('HarmonyHeiTi-Medium') + .margin({ top: $r('app.float.page_phrases_padding_t') }) + }.align(Alignment.Start) .width(ConfigData.WH_100_100) + .height($r('app.float.page_phrases_height')) + .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) + + Row() { + ItemComponent({ title: $title, value: '', arrow: $arrow }) + }.onClick(() => { + Log.showDebug(TAG, `BatchManagement on click`) + Router.push({ uri: 'pages/batchSetEnable' }); + }).width(ConfigData.WH_100_100) .flexShrink(0) - Divider() - .color($r('app.color.divider_color')) - .strokeWidth(1) - .padding({ - left: $r('sys.float.ohos_id_default_padding_start'), - right: $r('sys.float.ohos_id_default_padding_end') - }) + Column() { + AppLstComponent() + }.width(ConfigData.WH_100_100) + .layoutWeight(1) + .margin({ top: $r('app.float.applist_margin_t') }); - Row() { - SwitchComponent({ - title: $allowDistribut, - describe: $allowDistributDescribe, - initializationAction: () => this.switchComponentInit(), - settingAction: (params) => this.switchComponentSet(params) - }) - }.margin({ bottom: $r('app.float.noDisturb_margin_lf') }) } - .backgroundColor(Color.White) - .border({ width: $r('app.float.border_width'), color: Color.White, - radius: $r('app.float.border_radius') }) - .margin({ top: $r('app.float.page_notice_title_margin_t') }); - - Row() { - Text($r('app.string.notificationManagement')) - .fontColor($r('sys.color.ohos_id_color_text_secondary')) - .fontSize($r('sys.float.ohos_id_text_size_body2')) - .fontWeight(FontWeight.Medium) - .fontFamily('HarmonyHeiTi-Medium') - .margin({ top: $r('app.float.page_phrases_padding_t') }) - }.align(Alignment.Start) .width(ConfigData.WH_100_100) - .height($r('app.float.page_phrases_height')) - .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) - - Row() { - ItemComponent({ title: $title, value: '', arrow: $arrow }) - }.onClick(() => { - Log.showDebug(TAG, `BatchManagement on click`) - Router.push({ uri: 'pages/batchSetEnable' }); - }).width(ConfigData.WH_100_100) - .flexShrink(0) - - Column() { - AppLstComponent() - }.width(ConfigData.WH_100_100) - .layoutWeight(1) - .margin({ top: $r('app.float.applist_margin_t') }); + .height(ConfigData.WH_100_100) + .padding({ + left: $r('sys.float.ohos_id_default_padding_start'), + right: $r('sys.float.ohos_id_default_padding_end') + }) + .useSizeType({ + xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, + md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } + }); } .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100) - .padding({ - left: $r('sys.float.ohos_id_default_padding_start'), - right: $r('sys.float.ohos_id_default_padding_end') - }) - .useSizeType({ - xs: { span: 12, offset: 0 }, sm: { span: 12, offset: 0 }, - md: { span: 12, offset: 0 }, lg: { span: 8, offset: 2 } - }); - + .height(ConfigData.WH_100_100); } .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100); + .height(ConfigData.WH_100_100) + .backgroundColor($r("sys.color.ohos_id_color_sub_background")) } - .width(ConfigData.WH_100_100) - .height(ConfigData.WH_100_100) - .backgroundColor($r("sys.color.ohos_id_color_sub_background")) } aboutToAppear(): void{ diff --git a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets index ffea2d96..3b1ede91 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets @@ -15,13 +15,13 @@ //import Window from '@ohos.window'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; -import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appitemcomponent'; -import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchcomponent'; -import SlotLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/slotlstcomponent'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; +import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; +import SlotLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent'; import ConfigData from '../common/constants'; import Router from '@system.router' -import notificationListener from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationlistener'; +import notificationListener from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; import Notification from '@ohos.notification'; const TAG = 'NotificationManagement-SetEnable'; diff --git a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets index 9548e10d..7716af27 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets @@ -14,13 +14,13 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; -import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appitemcomponent'; -import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchcomponent'; +import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; +import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; import ConfigData from '../common/constants'; import NotificationConfigData from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; import Router from '@system.router'; -import NotificationListener from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationlistener'; +import NotificationListener from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; import notification from '@ohos.notification'; const TAG = 'NotificationManagement-SlotSetting'; diff --git a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts index 2c3dff8d..b20d7c03 100644 --- a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts @@ -15,8 +15,8 @@ import ConfigData from '../common/constants'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/nodisturbingmodel'; -import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/nodisturbcomponentviewmodel'; +import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel'; +import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel'; import FeaturesConfigData, {DoNotDisturbType} from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; const TAG = 'NotificationManagement-NoDisturbViewModel'; @@ -49,8 +49,8 @@ export default class NoDisturbViewModel extends NoDisturbComponentViewModel { setClues(): void { Log.showDebug(TAG, 'setClues'); if (this.repeatMode == DoNotDisturbType.TYPE_DAILY || - this.repeatMode == DoNotDisturbType.TYPE_ONCE || - this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + this.repeatMode == DoNotDisturbType.TYPE_ONCE || + this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { this.isEffective = true; } else { this.isEffective = false; diff --git a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts index 41887368..b683bd9f 100644 --- a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts @@ -14,10 +14,10 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; -import BundleResourceModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/bundleresourcemodel'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import BundleResourceModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel'; import display from '@ohos.display'; -import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/nodisturbcomponentviewmodel'; +import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel'; import Router from '@system.router'; const TAG = 'NotificationManagement-NotificationManagenmentViewModel'; diff --git a/product/default/volumepanel/src/main/ets/pages/index.ets b/product/default/volumepanel/src/main/ets/pages/index.ets index 12976941..f2e68ac6 100644 --- a/product/default/volumepanel/src/main/ets/pages/index.ets +++ b/product/default/volumepanel/src/main/ets/pages/index.ets @@ -17,7 +17,7 @@ import CommonStyleManager from '../../../../../../../common/src/main/ets/default import VolumePanelComponent from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StyleManager from '../common/StyleManager' -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager' const TAG = 'VolumePanel-Index' diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts index 8674a216..0f4d754d 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts @@ -13,12 +13,12 @@ * limitations under the License. */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; -import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/styleconfiguration'; -import ControlCenterStyleConfiguration from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/styleconfiguration'; -import BrightnessStyleConfiguration from '../../../../../../../../features/brightnesscomponent/src/main/ets/default/common/styleconfiguration'; -import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/styleconfiguration'; -import IndexStyleConfiguration from './styleconfiguration'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/StyleConfiguration'; +import ControlCenterStyleConfiguration from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration'; +import BrightnessStyleConfiguration from '../../../../../../../../features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration'; +import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration'; +import IndexStyleConfiguration from './StyleConfiguration'; const TAG = 'ControlPanel-StyleManager'; diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index aba3393f..8ce3b307 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -15,7 +15,7 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager' import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/AbilityManager' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StyleConfiguration, { IndexStyle } from './common/StyleConfiguration' import StyleManager from './common/StyleManager' import ControlCenterComponent from './control' diff --git a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets index 624ef0c8..b273d147 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets @@ -14,12 +14,12 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager'; -import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager"; -import BannerNotification from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/item/bannernotificationitem'; -import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/NotificationViewModel'; -import NotificationConstants, { ScreenLockStatus } from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/common/constants'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; +import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager"; +import BannerNotification from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem'; +import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel'; +import NotificationConstants, { ScreenLockStatus } from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants'; const TAG = 'NotificationPanel-BannerNotification'; const TRANSLATE_SIZE = '382vp'; diff --git a/product/pc/notificationpanel/src/main/ets/pages/notification.ets b/product/pc/notificationpanel/src/main/ets/pages/notification.ets index 6d2f62d2..d8a1fb9f 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/notification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/notification.ets @@ -15,10 +15,10 @@ import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import Log from '../../../../../../../common/src/main/ets/default/Log' -import EventManager from "../../../../../../../common/src/main/ets/default/event/eventmanager" -import {obtainStartAbility} from "../../../../../../../common/src/main/ets/default/event/eventutil" -import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/notificationlistcomponent' -import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/NotificationViewModel' +import EventManager from "../../../../../../../common/src/main/ets/default/event/EventManager" +import {obtainStartAbility} from "../../../../../../../common/src/main/ets/default/event/EventUtil" +import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent' +import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel' const TAG = 'NotificationPanel-notification' const NO_NOTIFICATION_TOP_MARGIN = 40; diff --git a/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts b/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts index 2baf10c4..cea41f24 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { FASlotName } from '../../../../../../../../common/src/main/ets/default/constants'; +import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; import { StatusBarConfig } from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts index 7dcb0537..f5d6392d 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -13,17 +13,17 @@ * limitations under the License. */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; -import CommonStyleConfiguration from '../../../../../../../../common/src/main/ets/default/styleconfiguration'; -import StatusBarStyleConfiguration from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/styleconfiguration'; -import BatteryStyleConfiguration from '../../../../../../../../features/batterycomponent/src/main/ets/default/common/styleconfiguration'; -import ClockStyleConfiguration from '../../../../../../../../features/clockcomponent/src/main/ets/default/common/styleconfiguration'; -import WifiStyleConfiguration from '../../../../../../../../features/wificomponent/src/main/ets/default/common/styleconfiguration'; -import BluetoothStyleConfiguration from '../../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/common/styleconfiguration'; -import SignalStyleConfiguration from '../../../../../../../../features/signalcomponent/src/main/ets/default/common/styleconfiguration'; -import CapsuleStyleConfiguration from '../../../../../../../../features/capsulecomponent/src/main/ets/default/common/styleconfiguration'; -import LocationStyleConfiguration from '../../../../../../../../features/locationcomponent/src/main/ets/com/ohos/common/styleconfiguration'; -import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/styleconfiguration'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import CommonStyleConfiguration from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import StatusBarStyleConfiguration from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration'; +import BatteryStyleConfiguration from '../../../../../../../../features/batterycomponent/src/main/ets/default/common/StyleConfiguration'; +import ClockStyleConfiguration from '../../../../../../../../features/clockcomponent/src/main/ets/default/common/StyleConfiguration'; +import WifiStyleConfiguration from '../../../../../../../../features/wificomponent/src/main/ets/default/common/StyleConfiguration'; +import BluetoothStyleConfiguration from '../../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration'; +import SignalStyleConfiguration from '../../../../../../../../features/signalcomponent/src/main/ets/default/common/StyleConfiguration'; +import CapsuleStyleConfiguration from '../../../../../../../../features/capsulecomponent/src/main/ets/default/common/StyleConfiguration'; +import LocationStyleConfiguration from '../../../../../../../../features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration'; +import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration'; const TAG = './styleconfigurationer'; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets index 475d8257..7db30670 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets @@ -14,12 +14,12 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager'; -import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager"; -import BannerNotification from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/item/bannernotificationitem'; -import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/NotificationViewModel'; -import NotificationConstants, { ScreenLockStatus } from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/common/constants'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; +import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager"; +import BannerNotification from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem'; +import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel'; +import NotificationConstants, { ScreenLockStatus } from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants'; const TAG = 'DropdownPanel-BannerNotification'; const TRANSLATE_SIZE = '382vp'; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts index 50fb8052..4cb60bd1 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts @@ -13,11 +13,11 @@ * limitations under the License. */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; -import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/styleconfiguration'; -import ControlCenterStyleConfiguration from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/styleconfiguration'; -import BrightnessStyleConfiguration from '../../../../../../../../features/brightnesscomponent/src/main/ets/default/common/styleconfiguration'; -import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/styleconfiguration'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/StyleConfiguration'; +import ControlCenterStyleConfiguration from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration'; +import BrightnessStyleConfiguration from '../../../../../../../../features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration'; +import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration'; const TAG = 'DropdownPanel-StyleManager'; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index febb0489..0501dc91 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -16,22 +16,22 @@ import {isNfcAvailable} from '../../../../../../../common/src/main/ets/default/Constants'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/eventmanager"; -import { obtainStartAbility } from "../../../../../../../common/src/main/ets/default/event/eventutil"; +import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/EventManager"; +import { obtainStartAbility } from "../../../../../../../common/src/main/ets/default/event/EventUtil"; import Constants from './common/constants'; -import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryicon'; -import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockicon'; -import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiicon'; -import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/statusbariconitembluetoothcomponent'; -import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalicon'; -import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/statusbariconitemlocationcomponent'; -import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/statusbariconitemringmodecomponent'; +import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon'; +import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon'; +import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon'; +import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent'; +import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon'; +import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent'; +import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent'; import NfcIcon from '../../../../../../../features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent'; -import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/notificationlistcomponent'; -import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/NotificationViewModel'; +import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent'; +import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel'; import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil'; import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT -} from '../../../../../../../common/src/main/ets/default/timemanager'; +} from '../../../../../../../common/src/main/ets/default/TimeManager'; import deviceInfo from '@ohos.deviceInfo'; const TAG = 'DropdownPanel-notification'; diff --git a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js index 9cb540a3..c44b85c0 100644 --- a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -15,8 +15,8 @@ import worker from '@ohos.worker'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; -import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; +import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager'; +import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; diff --git a/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts b/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts index 8c025785..0c163355 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { FASlotName } from '../../../../../../../../common/src/main/ets/default/constants'; +import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; import { StatusBarConfig } from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; diff --git a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts index abb1ebf5..f201dcb0 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; const TAG = 'StatusBar-StyleManager'; -- Gitee From 7fa13101e735644071b085b19bc2244cb038c79a Mon Sep 17 00:00:00 2001 From: huangshan Date: Tue, 22 Nov 2022 17:45:56 +0800 Subject: [PATCH 297/373] fix path case mistakes Signed-off-by: huangshan Change-Id: I7e4cbf1ccb1e8329c38a01cf410f0a5d08f20667 --- .../src/main/ets/pages/notificationManagenment.ets | 2 +- .../src/main/ets/workers/PluginDataSourceWorker.js | 6 +++--- .../src/main/ets/workers/PluginDataSourceWorker.js | 6 +++--- .../src/main/ets/workers/PluginDataSourceWorker.js | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index f0b090c0..1353f9f2 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -22,7 +22,7 @@ import ItemComponent from '../../../../../../../features/managementcomponent/src import ConfigData from '../common/constants'; import AppLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent'; import Router from '@system.router'; -import ViewModel from '../vm/notificationManagenmentViewmodel' +import ViewModel from '../vm/notificationManagenmentViewModel' import Notification from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index e5046dd9..977a2100 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -15,8 +15,8 @@ import worker from '@ohos.worker'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; -import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; +import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager'; +import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; import {writeFaultLog, FaultID} from '../../../../../../../common/src/main/ets/default/SysFaultLogger'; const parentPort = worker.parentPort; @@ -96,4 +96,4 @@ parentPort.onerror = function (data) { ); writeFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API: "systemui", FAULT_ID: FaultID.WORKER_ERROR , MSG: "Abnormal occurrence"}); -}; \ No newline at end of file +}; diff --git a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 9cb540a3..2f7076ea 100644 --- a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -15,8 +15,8 @@ import worker from '@ohos.worker'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; -import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; +import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager'; +import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; @@ -94,4 +94,4 @@ parentPort.onerror = function (data) { TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); -}; \ No newline at end of file +}; diff --git a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 9cb540a3..2f7076ea 100644 --- a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -15,8 +15,8 @@ import worker from '@ohos.worker'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; -import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; +import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager'; +import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; @@ -94,4 +94,4 @@ parentPort.onerror = function (data) { TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); -}; \ No newline at end of file +}; -- Gitee From 3e8fb4dea24805f7c40c95630e23f7b3694a54f5 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Tue, 29 Nov 2022 11:06:49 +0800 Subject: [PATCH 298/373] =?UTF-8?q?ArkUI=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../PluginDataSourceManager.ts | 2 +- .../common/BundleParseUtil.ts | 4 ++-- .../main/ets/template/SimpleToggleBase.ets | 2 +- ...lCenterSimpleToggleAutoRotateComponent.ets | 4 +++- .../ohos/pages/ComplexToggleLoadComponent.ets | 2 +- .../com/ohos/pages/ControlCenterComponent.ets | 2 +- .../com/ohos/pages/SimpleToggleComponent.ets | 2 +- .../pages/SimpleToggleLayoutEditComponent.ets | 5 +++-- .../ohos/pages/SimpleToggleLayoutEditGrid.ets | 3 ++- .../ets/com/ohos/model/LocationService.ts | 2 +- ...rolCenterSimpleToggleLocationComponent.ets | 2 +- .../ohos/view/component/appItemComponent.ets | 20 +++++++++---------- .../com/ohos/view/component/itemComponent.ets | 2 +- .../ControlCenterSimpleToggleNFComponent.ets | 2 +- .../ohos/noticeItem/view/item/SwipeLayout.ets | 11 ++++++---- .../ohos/noticeItem/view/item/titleItem.ets | 5 ++--- .../main/resources/base/element/float.json | 4 ++-- ...rolCenterSimpleToggleRingModeComponent.ets | 2 +- .../ets/com/ohos/pages/IconItemComponent.ets | 2 +- .../ets/com/ohos/pages/StatusBarComponent.ets | 11 ++++++++-- .../ets/com/ohos/viewmodel/StatusBarVM.ts | 18 ++++++++++++++--- .../src/main/ets/pages/keyButton.ets | 2 +- .../src/main/ets/pages/notification.ets | 1 + 23 files changed, 68 insertions(+), 42 deletions(-) diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts index be49c587..d5ad0674 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts @@ -26,7 +26,7 @@ import { registerBundleListener, } from './common/BundleParseUtil'; import { AbilityInfo } from 'bundle/abilityInfo'; -import { ExtensionAbilityInfo } from 'bundle/extensionAbilityInfo'; +import { ExtensionAbilityInfo } from 'bundleManager/extensionAbilityInfo'; export type PluginListener = { onItemAdd: (itemData: ItemComponentData) => void; diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts index 7697cc06..b20e0921 100644 --- a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts +++ b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts @@ -16,9 +16,9 @@ import bundleManager from '@ohos.bundle'; import commonEvent from '@ohos.commonEvent'; import { AbilityInfo } from 'bundle/abilityInfo'; -import { ExtensionAbilityInfo } from 'bundle/extensionAbilityInfo'; +import { ExtensionAbilityInfo } from 'bundleManager/extensionAbilityInfo'; import { CustomizeData } from 'bundle/customizeData'; -import { Metadata } from 'bundle/metadata'; +import { Metadata } from 'bundleManager/metadata'; import Log from '../../default/Log'; import switchUserManager from '../../default/SwitchUserManager'; diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/template/SimpleToggleBase.ets index 0eae8218..e1ff9c22 100644 --- a/common/src/main/ets/template/SimpleToggleBase.ets +++ b/common/src/main/ets/template/SimpleToggleBase.ets @@ -25,7 +25,7 @@ export default struct SimpleToggleBase { @State mIconStr: string = '' private mUseIconStr: boolean = false private mAutoIconColor: boolean = false - private mChangeSwitch: boolean + @Link mChangeSwitch: boolean @Link mLabel: Resource @State mLabelStr: string = '' private mUseLabelStr: boolean = false diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets b/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets index 5db31470..0011be5a 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets +++ b/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets @@ -27,6 +27,7 @@ export default struct ControlCenterSimpleToggleAutoRotateComponent { private mDragMode: boolean = false; @State mIcon: Resource = $r("app.media.ic_controlcenter_auto_rotate_off"); @State mLabel: Resource = $r("app.string.control_center_complex_toggle_auto_rotate_title"); + @State mAutoRotateSwitch : boolean = false @State @Watch('onAutoRotateDataChange') mAutoRotateData: AutoRotateData = ViewModel.getAutoRotateData(); aboutToAppear() { @@ -41,13 +42,14 @@ export default struct ControlCenterSimpleToggleAutoRotateComponent { onAutoRotateDataChange(propName: string): void { Log.showDebug(TAG, `onAutoRotateDataChange, propName: ${propName}`); this.mIcon = this.mAutoRotateData.switchStatus ? $r("app.media.ic_controlcenter_auto_rotate_on") : $r("app.media.ic_controlcenter_auto_rotate_off"); + this.mAutoRotateSwitch = this.mAutoRotateData.switchStatus } build() { SimpleToggleBase({ mToggleId: this.keyId, mIcon: $mIcon, - mChangeSwitch: this.mAutoRotateData.switchStatus, + mChangeSwitch:$mAutoRotateSwitch, mLabel: $mLabel, mEditMode: this.mEditMode, mDragMode: this.mDragMode, diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets index ad84be00..cbfd3445 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets @@ -24,7 +24,7 @@ const TAG = 'ComplexToggleLoadComponent'; @Component export default struct ComplexToggleLoadComponent { - @Prop keyId: string; + @State keyId: string = ''; aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index 4f1a3be1..5d81c0b1 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -130,7 +130,7 @@ export default struct ControlCenterComponent { .clip(true) .backgroundColor(this.style.componentBackgroundColor) } - .margin({left: this.style.marginLeft, right: this.style.marginRight}) + .padding({left: this.style.marginLeft, right: this.style.marginRight}) } .width('100%') } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index ccb1f3d3..bf931a3a 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -54,7 +54,7 @@ export default struct SimpleToggleComponent { mIcon: $mDefaultIcon, mIconStr: this.mItemData.get().iconUrl, mUseIconStr: true, - mChangeSwitch: this.mDefaultChangeSwitch, + mChangeSwitch: $mDefaultChangeSwitch, mLabel: $mDefaultLabel, mLabelStr: this.mItemData.get().label, mUseLabelStr: true, diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets index 0468528e..9aaea1b7 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets @@ -172,7 +172,8 @@ export default struct SimpleToggleLayoutEditComponent { } } .height(this.style.editBtnHeight) - .margin({bottom: this.style.btnMarginBottom, left: this.style.editBtnMarginLeft, right: this.style.editBtnMarginRight}) + .margin({bottom: this.style.btnMarginBottom}) + .padding({left: this.style.editBtnMarginLeft, right: this.style.editBtnMarginRight}) .columnsTemplate('1fr 1fr') .rowsTemplate('1fr') .columnsGap(this.style.editBtnSpace) @@ -309,7 +310,7 @@ export default struct SimpleToggleLayoutEditComponent { onComponentTouch(event: TouchEvent) { Log.showDebug(TAG, `onComponentTouch`); - event.stopPropagation(); + // event.stopPropagation(); TODO } } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets index e7596cb8..7b309e1f 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets @@ -64,7 +64,7 @@ export default struct SimpleToggleLayoutEditGrid { mEditMode: true }) }.width('100%') - .height('100%') + .height(80) } }, (componentName: string) => componentName) if (this.mToggles.length == 0) { @@ -72,6 +72,7 @@ export default struct SimpleToggleLayoutEditGrid { } } } + .constraintSize({ minHeight: 80 }) .width('100%') .columnsTemplate(this.calcColumnsTemplate(this.mColumnCount)) .editMode(true) diff --git a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts index ea8479ad..973fd866 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import geolocation from '@ohos.geolocation'; +import geolocation from '@ohos.geoLocationManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets index 42cd97af..aca83c1b 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets @@ -44,7 +44,7 @@ export default struct ControlCenterSimpleToggleLocationComponent { SimpleToggleBase({ mToggleId: this.keyId, mIcon: $mIcon, - mChangeSwitch: this.LocationStatus, + mChangeSwitch: $LocationStatus, mLabel: $mLabel, mEditMode: this.mEditMode, mDragMode: this.mDragMode, diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets index f95b8da5..14d47b2b 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets @@ -22,16 +22,16 @@ const TAG = 'ManagementComponent-AppItemComponent'; @Component export default struct AppItemComponent { @State canNotice: boolean= false; - @Prop appIcon: string; - @Prop appTitle: string; - @Prop appSummary: string; - @Prop appValue: string; - @Prop appArrow: string; - @Prop appArrowStyle: string; - @Prop appUri: string; - @Prop appSwitch: number; - @Prop appBundleName: string; - @Prop appUid: number; + @State appIcon: string =''; + @State appTitle: string =''; + @State appSummary: string =''; + @State appValue: string =''; + @State appArrow: string =''; + @State appArrowStyle: string =''; + @State appUri: string =''; + @State appSwitch: number = 0; + @State appBundleName: string =''; + @State appUid: number = 0; build() { Flex({ justifyContent: FlexAlign.SpaceBetween }) { diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets index ecc693e0..ba84a243 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets @@ -17,7 +17,7 @@ import ConfigData from '../../common/constants'; @Component export default struct ItemComponent { @Link title: Resource; - @Prop value: string + @State value: string = ''; @Link arrow: Resource; build() { diff --git a/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets b/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets index 9b9a5741..e7102646 100644 --- a/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets +++ b/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets @@ -54,7 +54,7 @@ export default struct ControlCenterSimpleToggleNFComponent { SimpleToggleBase({ mToggleId: this.keyId, mIcon: $mIcon, - mChangeSwitch: this.mDefaultChangeSwitch, + mChangeSwitch: $mDefaultChangeSwitch, mLabel: $mLabel, mEditMode: this.mEditMode, mDragMode: this.mDragMode, diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets index d1214480..4dd764f3 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets @@ -209,10 +209,13 @@ export default struct SwipeLayout { return; } if(this.angelCalFlag == false){ - this.responseSwipeEvent = (Math.abs(touchEvent.touches[0].screenX - this.startX) > Math.abs(touchEvent.touches[0].screenY - this.startY)); - this.angelCalFlag = true; - - FocusCallBack.setCallback(this.swipeLayoutId, this.loseFocusCallback.bind(this)); + var hasChange = Math.abs(touchEvent.touches[0].screenX - this.startX) > 1e-3 || + Math.abs(touchEvent.touches[0].screenY - this.startY) > 1e-3 + if (hasChange) { + this.responseSwipeEvent = (Math.abs(touchEvent.touches[0].screenX - this.startX) > Math.abs(touchEvent.touches[0].screenY - this.startY)); + this.angelCalFlag = true; + FocusCallBack.setCallback(this.swipeLayoutId, this.loseFocusCallback.bind(this)); + } } if(this.responseSwipeEvent == false) { return; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets index c5104d82..5b038619 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets @@ -16,14 +16,13 @@ import Constants, { NotificationLayout as Layout } from '../../common/constants'; import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; - const TAG = 'NoticeItem-TitleItem'; @Component export default struct TitleItem { private notificationSmallIcon: PixelMap - @Prop notificationName: string - @Prop notificationTime: string + @State notificationName: string = '' + @State notificationTime: string = '' @Link isExpand: boolean @Prop needExpand: boolean @State rowSpace: any = $r('app.float.titleitem_row_space') diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index ce356e3f..b84e1f24 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -150,11 +150,11 @@ }, { "name": "confirm_title_fontsize", - "value": "40" + "value": "40px" }, { "name": "confirm_cont_fontsize", - "value": "32" + "value": "32px" }, { "name": "confirm_divider_height", diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets index 7027c74e..82e40f6a 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets @@ -62,7 +62,7 @@ export default struct ControlCenterSimpleToggleRingModeComponent { SimpleToggleBase({ mToggleId: this.keyId, mIcon: $mIcon, - mChangeSwitch: this.mDefaultChangeSwitch, + mChangeSwitch: $mDefaultChangeSwitch, mLabel: $mLabel, mIconOnBG: this.style.onBgColor, mEditMode: this.mEditMode, diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index 56d761e9..1cc894c2 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -133,7 +133,7 @@ export default struct IconItemComponent { onIconItemTouch(event: TouchEvent) { Log.showInfo(TAG, `onIconItemTouch, event: ${JSON.stringify(event)}`); if (this.mItemData.get()?.actionData?.clickAction || this.mItemData.get()?.actionData?.longClickAction) { - event.stopPropagation() + // event.stopPropagation() } } } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index e0daa045..cd626cf1 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -23,6 +23,7 @@ import StyleConfigurationCommon, { CommonStyle import StyleConfiguration, { StatusBarNotificationIconStyle, VerticalStatusBarItemLoadComponentStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/StatusBarVM' +import { StringArray } from '../viewmodel/StatusBarVM' import IconItemComponent from './IconItemComponent' import BatteryIcon from '../../../../../../../batterycomponent/src/main/ets/default/pages/batteryIcon' import ClockIcon from '../../../../../../../clockcomponent/src/main/ets/default/pages/clockIcon' @@ -45,7 +46,7 @@ const TAG_StatusBarBackground = 'StatusBarBackground' @Component export default struct StatusBarComponent { private mStatusBarComponentConfig: StatusBarConfig - @StorageLink('StatusBarLayout') mStatusBarLayout: any = [[], [], []] + @StorageLink('StatusBarLayout') mStatusBarLayout: StringArray[] = [new StringArray(), new StringArray(), new StringArray()] @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() private moduleName: string = '' @@ -53,6 +54,7 @@ export default struct StatusBarComponent { AppStorage.SetOrCreate('size', $r("app.float.status_bar_margin_left_right")); Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`); this.initViewModel(this.moduleName); + Log.showInfo(TAG, `aboutToAppear Start, mStatusBarLayout: ${JSON.stringify(this.mStatusBarLayout)}`); } aboutToDisappear() { @@ -163,11 +165,15 @@ struct StatusBarBackground { @Component struct StatusBarGroup { - @State mComponents: string[] = [] + @State mComponents: StringArray = new StringArray() private mLayoutWeight: number = 1 private mAlignItems: any = HorizontalAlign.Center; @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() + mComponentsChange() { + Log.showInfo(TAG_StatusBarGroup, `CCCC mComponentsChange, mComponents: ${JSON.stringify(this.mComponents)}`); + } + aboutToAppear() { Log.showInfo(TAG_StatusBarGroup, `aboutToAppear, mLayoutWeight: ${this.mLayoutWeight} mAlignItems: ${this.mAlignItems} `); } @@ -282,6 +288,7 @@ struct StatusBarItemLoadComponent { } }.height('100%') .onAreaChange((e: Area, e2: Area) => { + Log.showInfo(TAG_StatusBarItemLoadComponent, `onAreaChange, componentName: ${this.mComponentName}}, new area: ${JSON.stringify(e2)} `) ViewModel.updateComponentArea(this.mComponentName, e2) }) } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index 526bbd22..abdde848 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -35,9 +35,13 @@ export const STATUS_BAR_EMPTY_WIDTH_KEY = 'StatusBarEmptyWidth'; const TAG = 'StatusBarVM'; +// @ts-ignore +@Observed +export class StringArray extends Array {} + export class StatusBarVM { mIsStart = false; - mStatusBarLayout: string[][] = [[], [], []]; + mStatusBarLayout: StringArray[] = [new StringArray(), new StringArray(), new StringArray()]; mStatusBarEmptyWidth; mUseCount = 0; mStatusBarEnable = true; @@ -58,6 +62,8 @@ export class StatusBarVM { this.mStatusBarLayout = AppStorage.SetAndLink(STATUS_BAR_LAYOUT_KEY, this.mStatusBarLayout).get(); this.mStatusBarEmptyWidth = AppStorage.SetAndLink(STATUS_BAR_EMPTY_WIDTH_KEY, 0); + Log.showInfo(TAG, 'constructor mStatusBarLayout: ' + JSON.stringify(this.mStatusBarLayout)); + let defaultBackgroundDatas: StatusBarBackgroundData[] = []; defaultBackgroundDatas.push(new StatusBarBackgroundData()); defaultBackgroundDatas.push(new StatusBarBackgroundData()); @@ -99,13 +105,19 @@ export class StatusBarVM { StatusBarService.startService(config, moduleName); } - setStatusBarLayout(layout: string[][]): void{ + setStatusBarLayout(layout: string[][]): void { Log.showInfo(TAG, `setStatusBarLayout, layout: ${JSON.stringify(layout)}`); for (let i = 0;i < layout.length; i++) { if (JSON.stringify(layout[i]) != JSON.stringify(this.mStatusBarLayout[i])) { - this.mStatusBarLayout[i] = layout[i]; + for (let j = 0; j < layout[i].length; j++) { + if (this.mStatusBarLayout[i].indexOf(layout[i][j]) < 0) { + this.mStatusBarLayout[i].push(layout[i][j]) + Log.showInfo(TAG, `setStatusBarLayout, addItem: ${layout[i][j]}`); + } + } } } + Log.showInfo(TAG, `setStatusBarLayout, mStatusBarLayout: ${JSON.stringify(this.mStatusBarLayout)}`); } setStatusBarEmptyWidth(width: number): void{ diff --git a/product/default/navigationBar/src/main/ets/pages/keyButton.ets b/product/default/navigationBar/src/main/ets/pages/keyButton.ets index e8b9fa8f..7a1523dd 100644 --- a/product/default/navigationBar/src/main/ets/pages/keyButton.ets +++ b/product/default/navigationBar/src/main/ets/pages/keyButton.ets @@ -25,7 +25,7 @@ const TAG = 'NavigationBar-KeyButton'; @Component export default struct keyButton { private uri: any; - @Prop keyCode: number; + @State keyCode: number = 0; @Link currentTouchItem: number; @State backGroundColor: any = $r('app.color.button_default_background'); @StorageLink("showNavHorizontal") showNavHorizontal: boolean = AppStorage.SetAndLink("showNavHorizontal", true).get(); diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 0501dc91..b317ed51 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -243,6 +243,7 @@ struct CenterTitle { .fontWeight(FontWeight.Medium) .margin({ left: TIME_TEXT_MARGIN, bottom: TIME_BOTTOM_OFFSET }) .flexGrow(1) + .align(Alignment.Center) Image($r("app.media.ic_public_settings")) .objectFit(ImageFit.Contain) .width($r("app.float.notification_title_setting_icon_width")) -- Gitee From 5bbac486372285eba04e9040dd3924e893dc9ea5 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Tue, 29 Nov 2022 16:26:35 +0800 Subject: [PATCH 299/373] =?UTF-8?q?=E7=A8=B3=E5=AE=9A=E6=80=A7=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../main/ets/com/ohos/model/screenLockService.ts | 4 ++-- product/pc/src/main/ets/common/StyleManager.ts | 10 +++++++--- product/pc/src/main/ets/pages/customPassword.ets | 10 +++++++--- product/pc/src/main/ets/pages/digitalPassword.ets | 10 +++++++--- product/pc/src/main/ets/pages/index.ets | 14 +++++++------- product/pc/src/main/ets/pages/mixedPassword.ets | 10 +++++++--- .../pc/src/main/ets/vm/slideScreenLockViewModel.ts | 1 + .../src/main/ets/vm/slideScreenLockViewModel.ts | 1 + 8 files changed, 39 insertions(+), 21 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 38c530f0..4419a33e 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -134,8 +134,8 @@ export class ScreenLockService { break; //lock request was received case EVENT_LOCK_SCREEN: - Log.showInfo(TAG, `EVENT_UNLOCK_SCREEN event`); - this.unlockScreen(); + Log.showInfo(TAG, `EVENT_LOCK_SCREEN event`); + this.lockScreen(); break; case SERVICE_RESTART: setTimeout(() => { diff --git a/product/pc/src/main/ets/common/StyleManager.ts b/product/pc/src/main/ets/common/StyleManager.ts index 0d46d6d2..6f3052d7 100644 --- a/product/pc/src/main/ets/common/StyleManager.ts +++ b/product/pc/src/main/ets/common/StyleManager.ts @@ -30,9 +30,13 @@ export default class StyleManager { static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; static setStyle() { - let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'dis'); - Log.showInfo(TAG, `setStyle, configMaxWidth${JSON.stringify(dis.width)}`) - StyleManager.maxWidth = dis.width; + try { + let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'dis'); + Log.showInfo(TAG, `setStyle, configMaxWidth${JSON.stringify(dis.width)}`) + StyleManager.maxWidth = dis.width; + } catch (error) { + Log.showDebug(TAG, `set status error:` + JSON.stringify(error)); + } // Common { diff --git a/product/pc/src/main/ets/pages/customPassword.ets b/product/pc/src/main/ets/pages/customPassword.ets index ca5c7bcb..db82a36d 100644 --- a/product/pc/src/main/ets/pages/customPassword.ets +++ b/product/pc/src/main/ets/pages/customPassword.ets @@ -33,9 +33,13 @@ export default struct CustomPassword { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) CommonStyleManager.setAbilityPageName(TAG) - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') - this.mHeightPx = configInfo.height - StyleManager.setStyle() + try { + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + this.mHeightPx = configInfo.height + StyleManager.setStyle() + } catch (error) { + Log.showDebug(TAG, `set status error:` + JSON.stringify(error)); + } } aboutToDisappear() { diff --git a/product/pc/src/main/ets/pages/digitalPassword.ets b/product/pc/src/main/ets/pages/digitalPassword.ets index 00eba12a..51d076fa 100644 --- a/product/pc/src/main/ets/pages/digitalPassword.ets +++ b/product/pc/src/main/ets/pages/digitalPassword.ets @@ -33,9 +33,13 @@ export default struct DigitalPassword { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) CommonStyleManager.setAbilityPageName(TAG) - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') - Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) - StyleManager.setStyle() + try { + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + StyleManager.setStyle() + } catch (error) { + Log.showDebug(TAG, `set status error:` + JSON.stringify(error)); + } } aboutToDisappear() { diff --git a/product/pc/src/main/ets/pages/index.ets b/product/pc/src/main/ets/pages/index.ets index 2fc77059..4a0e9a5c 100644 --- a/product/pc/src/main/ets/pages/index.ets +++ b/product/pc/src/main/ets/pages/index.ets @@ -39,15 +39,15 @@ struct Index { Log.showInfo(TAG, `aboutToAppear`) try { setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + this.mHeightPx = configInfo.height + StyleManager.setStyle() + this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR } catch (error) { - Log.showDebug(TAG, `setAppBgColor error:` + JSON.stringify(error)); + Log.showDebug(TAG, `set status error:` + JSON.stringify(error)); } - CommonStyleManager.setAbilityPageName(TAG) - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') - Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) - this.mHeightPx = configInfo.height - StyleManager.setStyle() - this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR this.mViewModel.ViewModelInit() } diff --git a/product/pc/src/main/ets/pages/mixedPassword.ets b/product/pc/src/main/ets/pages/mixedPassword.ets index bfa4a923..58c1c5e0 100644 --- a/product/pc/src/main/ets/pages/mixedPassword.ets +++ b/product/pc/src/main/ets/pages/mixedPassword.ets @@ -32,9 +32,13 @@ export default struct MixedPassword { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) CommonStyleManager.setAbilityPageName(TAG) - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') - Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) - StyleManager.setStyle() + try { + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') + Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + StyleManager.setStyle() + } catch (error) { + Log.showDebug(TAG, `set status error:` + JSON.stringify(error)); + } } aboutToDisappear() { diff --git a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts index 20c05ef8..3b1fb2c2 100644 --- a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts @@ -89,5 +89,6 @@ export default class SlideScreenLockViewModel { this.elementAlpha = 1 this.elementScale = 1 this.backgroundScale = 1.1 + AppStorage.SetOrCreate('slidestatus', false); } } \ No newline at end of file diff --git a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts index 139da31f..dde0e2dc 100644 --- a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts @@ -87,5 +87,6 @@ export default class SlideScreenLockViewModel { this.elementAlpha = 1 this.elementScale = 1 this.backgroundScale = 1.1 + AppStorage.SetOrCreate('slidestatus', false); } } \ No newline at end of file -- Gitee From ce6d0ab7bf9f76e75bc95208202868a8b903491a Mon Sep 17 00:00:00 2001 From: SEASON_SYSU Date: Tue, 29 Nov 2022 10:35:13 +0000 Subject: [PATCH 300/373] update features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts. Signed-off-by: SEASON_SYSU --- .../src/main/ets/com/ohos/model/LocationService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts index 973fd866..ea8479ad 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import geolocation from '@ohos.geoLocationManager'; +import geolocation from '@ohos.geolocation'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -- Gitee From 2b79079deb50aa0872c1665808934f24b6361c8e Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Fri, 2 Dec 2022 11:50:42 +0800 Subject: [PATCH 301/373] =?UTF-8?q?1.=E5=8F=96=E6=B6=88=E9=93=83=E5=A3=B0?= =?UTF-8?q?=E5=BC=80=E5=85=B3=E7=9A=84=E9=9C=87=E5=8A=A8=E9=80=89=E9=A1=B9?= =?UTF-8?q?=202.=E7=BB=9F=E4=B8=80=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E4=B8=BB=E7=95=8C=E9=9D=A2=E5=92=8C=E7=BC=96=E8=BE=91=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E9=AB=98=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets | 4 +--- .../src/main/ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets index 82e40f6a..1fee9823 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets @@ -76,10 +76,8 @@ export default struct ControlCenterSimpleToggleRingModeComponent { Log.showInfo(TAG, `mClickEvent`); if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_SILENT) { ViewModel.setRingerMode(AudioRingMode.RINGER_MODE_NORMAL) - } else if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_VIBRATE) { - ViewModel.setRingerMode(AudioRingMode.RINGER_MODE_SILENT) } else if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_NORMAL) { - ViewModel.setRingerMode(AudioRingMode.RINGER_MODE_VIBRATE) + ViewModel.setRingerMode(AudioRingMode.RINGER_MODE_SILENT) } } diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index ad2eb451..6945a2c4 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -35,7 +35,7 @@ class ServiceExtAbility extends ServiceExtension { left: (872 * dis.width) / 1280, top: (44 * dis.width) / 1280, width: (402 * dis.width) / 1280, - height: (310 * dis.width) / 1280, + height: (346 * dis.width) / 1280, }; AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'rect', rect); -- Gitee From db16851833d2ebd822dfa3cf50334d0a2ca3700c Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Fri, 2 Dec 2022 16:05:15 +0800 Subject: [PATCH 302/373] arkui Signed-off-by: tangzhigang1 --- common/src/main/module.json5 | 6 + entry/src/main/module.json5 | 6 + .../src/main/ets/default/pages/batteryPic.ets | 2 +- .../src/main/ets/default/pages/batterySoc.ets | 2 +- .../batterycomponent/src/main/module.json5 | 6 + features/clockcomponent/src/main/module.json5 | 6 + features/datetimecomponent/package.json | 2 +- .../ets/com/ohos/view/component/dateTime.ets | 2 +- .../datetimecomponent/src/main/module.json5 | 6 + .../main/resources/base/element/float.json | 12 +- .../main/resources/phone/element/float.json | 2 +- .../ohos/noticeItem/view/item/groupItem.ets | 3 +- .../ohos/noticeItem/view/item/titleItem.ets | 4 +- features/noticeitem/src/main/module.json5 | 6 + .../main/resources/base/element/float.json | 94 ++-- .../main/resources/phone/element/float.json | 66 +-- .../src/main/ets/com/ohos/common/constants.ts | 8 +- .../main/ets/com/ohos/model/accountsModel.ts | 65 ++- features/screenlock/src/main/module.json5 | 6 + .../main/resources/base/element/float.json | 96 ++-- .../main/resources/phone/element/float.json | 28 +- .../main/ets/com/ohos/vm/shortcutViewModel.ts | 2 +- .../shortcutcomponent/src/main/module.json5 | 6 + .../main/resources/base/element/float.json | 2 +- .../signalcomponent/src/main/module.json5 | 6 + .../wallpapercomponent/src/main/module.json5 | 6 + features/wificomponent/src/main/module.json5 | 6 + product/pc/src/main/module.json5 | 6 + .../main/resources/base/element/float.json | 506 +---------------- product/phone/src/main/module.json5 | 6 + .../main/resources/base/element/float.json | 513 +----------------- 31 files changed, 293 insertions(+), 1194 deletions(-) diff --git a/common/src/main/module.json5 b/common/src/main/module.json5 index 56a91a87..36beeaf4 100644 --- a/common/src/main/module.json5 +++ b/common/src/main/module.json5 @@ -6,6 +6,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "uiSyntax": "ets" } } diff --git a/entry/src/main/module.json5 b/entry/src/main/module.json5 index d85dc66e..1821c59b 100644 --- a/entry/src/main/module.json5 +++ b/entry/src/main/module.json5 @@ -9,6 +9,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "deliveryWithInstall": true, "installationFree": false, "pages": "$profile:main_pages", diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets index bbfba299..16e5d5e6 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -24,7 +24,7 @@ export default struct BatteryPic { @StorageLink('batterySoc') batterySoc: number = 100 @StorageLink('batteryCharging') batteryCharging : boolean = false - @Prop mContentColor: string + @State mContentColor: string = "#FFFFFFFF" @State style: any = StyleConfiguration.getBatteryPicStyle() aboutToAppear(){ diff --git a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets index 31e9d466..9bcfec23 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -21,7 +21,7 @@ const TAG = 'BatteryComponent-batterySoc' @Component export default struct BatterySoc { @StorageLink('batterySoc') batterySoc: number = 100 - @Prop mContentColor: string + @State mContentColor: string = "#FFFFFFFF" @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { diff --git a/features/batterycomponent/src/main/module.json5 b/features/batterycomponent/src/main/module.json5 index f121300c..18e9b5aa 100644 --- a/features/batterycomponent/src/main/module.json5 +++ b/features/batterycomponent/src/main/module.json5 @@ -6,6 +6,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "uiSyntax": "ets" } } diff --git a/features/clockcomponent/src/main/module.json5 b/features/clockcomponent/src/main/module.json5 index c13e0859..192f6a44 100644 --- a/features/clockcomponent/src/main/module.json5 +++ b/features/clockcomponent/src/main/module.json5 @@ -6,6 +6,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "uiSyntax": "ets" } } diff --git a/features/datetimecomponent/package.json b/features/datetimecomponent/package.json index 7dce3cbb..6b3a089b 100644 --- a/features/datetimecomponent/package.json +++ b/features/datetimecomponent/package.json @@ -11,4 +11,4 @@ "repository": {}, "version": "1.0.0", "dependencies": {} -} +} \ No newline at end of file diff --git a/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets b/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets index 921afd95..f97b6977 100644 --- a/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets +++ b/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets @@ -28,7 +28,7 @@ const TAG = 'ScreenLock-DateTime'; @Component export default struct DateTime { @State mViewModel: ViewModel = new ViewModel() - @Prop isShowDate: boolean + @State isShowDate: boolean = true @State isPhone: boolean = false @State currentLanguage: string = DEFAULTLANG diff --git a/features/datetimecomponent/src/main/module.json5 b/features/datetimecomponent/src/main/module.json5 index 7685a924..29a1e8d4 100644 --- a/features/datetimecomponent/src/main/module.json5 +++ b/features/datetimecomponent/src/main/module.json5 @@ -6,6 +6,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "uiSyntax": "ets" } } diff --git a/features/datetimecomponent/src/main/resources/base/element/float.json b/features/datetimecomponent/src/main/resources/base/element/float.json index 5a9bb745..9a6219d8 100644 --- a/features/datetimecomponent/src/main/resources/base/element/float.json +++ b/features/datetimecomponent/src/main/resources/base/element/float.json @@ -2,27 +2,27 @@ "float": [ { "name": "time_fontsize", - "value": "148" + "value": "148px" }, { "name": "time_fontWeight", - "value": "400" + "value": "400px" }, { "name": "time_top_margin", - "value": "10" + "value": "10px" }, { "name": "time_bottom_margin", - "value": "10" + "value": "10px" }, { "name": "date_fontsize", - "value": "36" + "value": "36px" }, { "name": "date_week_area_height", - "value": "48" + "value": "48px" }, { "name": "date_lunar_calendar_height", diff --git a/features/datetimecomponent/src/main/resources/phone/element/float.json b/features/datetimecomponent/src/main/resources/phone/element/float.json index f40d0b48..dbf9bf5d 100644 --- a/features/datetimecomponent/src/main/resources/phone/element/float.json +++ b/features/datetimecomponent/src/main/resources/phone/element/float.json @@ -6,7 +6,7 @@ }, { "name": "time_fontWeight", - "value": "300" + "value": "300px" }, { "name": "time_top_margin", diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index d4b3e4f9..12ee8e47 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -31,6 +31,7 @@ export default struct GroupItem { private mScroller: Scroller = new Scroller(); @State mIconAlpha: number = 0; @State @Watch('scrollEdge') mEdgeEnd: boolean = false; + @State needExpand: boolean = true; aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) @@ -55,7 +56,7 @@ export default struct GroupItem { notificationName: this.groupData[0].appName, notificationTime: this.groupData[0].time, isExpand: $toExpand, - needExpand: true, + needExpand: this.needExpand, distributedDeviceName: this.distributedDeviceName, clickTitleAction: () => null }) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets index 5d894315..2c3fe030 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets @@ -22,8 +22,8 @@ const TAG = 'NoticeItem-TitleItem'; @Component export default struct TitleItem { private notificationSmallIcon: PixelMap - @Prop notificationName: string - @Prop notificationTime: string + private notificationName: string + private notificationTime: string @Link isExpand: boolean @Prop needExpand: boolean @State rowSpace: any = $r('app.float.titleitem_row_space') diff --git a/features/noticeitem/src/main/module.json5 b/features/noticeitem/src/main/module.json5 index 277a74a7..e25bcfcd 100644 --- a/features/noticeitem/src/main/module.json5 +++ b/features/noticeitem/src/main/module.json5 @@ -6,6 +6,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "uiSyntax": "ets" } } diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index 85d6e872..5f986b52 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -6,95 +6,95 @@ }, { "name": "notification_title_fontsize", - "value": "20" + "value": "20px" }, { "name": "notification_expanded_text_maxheight", - "value": "295" + "value": "295px" }, { "name": "notification_content_fontsize", - "value": "20" + "value": "20px" }, { "name": "notification_content_lineheight", - "value": "20" + "value": "20px" }, { "name": "notification_content_maxlines", - "value": "1" + "value": "1px" }, { "name": "content_margin_top", - "value": "10" + "value": "10px" }, { "name": "body_margin_top", - "value": "10" + "value": "10px" }, { "name": "item_opicaty", - "value": "0.9" + "value": "0.9px" }, { "name": "item_borderradius", - "value": "20" + "value": "20px" }, { "name": "item_margintop", - "value": "10" + "value": "10px" }, { "name": "item_marginleft", - "value": "10" + "value": "10px" }, { "name": "item_marginright", - "value": "10" + "value": "10px" }, { "name": "item_paddingleft", - "value": "20" + "value": "20px" }, { "name": "item_paddingright", - "value": "20" + "value": "20px" }, { "name": "item_paddingbottom", - "value": "20" + "value": "20px" }, { "name": "item_setting_image_width", - "value": "30" + "value": "30px" }, { "name": "item_setting_image_height", - "value": "30" + "value": "30px" }, { "name": "item_delete_image_width", - "value": "30" + "value": "30px" }, { "name": "item_delete_image_height", - "value": "30" + "value": "30px" }, { "name": "titleitem_row_space", - "value": "10" + "value": "10px" }, { "name": "titleitem_height", - "value": "50" + "value": "50px" }, { "name": "title_image_width", - "value": "30" + "value": "30px" }, { "name": "title_image_height", - "value": "30" + "value": "30px" }, { "name": "title_image_left_margin", @@ -118,31 +118,31 @@ }, { "name": "title_name_fontsize", - "value": "20" + "value": "20px" }, { "name": "title_time_fontsize", - "value": "20" + "value": "20px" }, { "name": "displayicon_width", - "value": "20" + "value": "20px" }, { "name": "displayicon_height", - "value": "20" + "value": "20px" }, { "name": "deleteall_image_opacity", - "value": "0.9" + "value": "0.9px" }, { "name": "setting_title_fontsize", - "value": "40" + "value": "40px" }, { "name": "setting_cont_fontsize", - "value": "32" + "value": "32px" }, { "name": "setting_cont_height", @@ -154,11 +154,11 @@ }, { "name": "setting_border_width", - "value": "1" + "value": "1px" }, { "name": "setting_border_radius", - "value": "80" + "value": "80px" }, { "name": "notification_border_radius", @@ -166,19 +166,19 @@ }, { "name": "action_button_height", - "value": "48" + "value": "48px" }, { "name": "action_button_padding", - "value": "12" + "value": "12px" }, { "name": "picture_default_height", - "value": "300" + "value": "300px" }, { "name": "confirm_title_fontsize", - "value": "40" + "value": "40px" }, { "name": "confirm_title_width", @@ -186,15 +186,15 @@ }, { "name": "confirm_cont_fontsize", - "value": "32" + "value": "32px" }, { "name": "confirm_divider_height", - "value": "44" + "value": "44px" }, { "name": "confirm_button_height", - "value": "60" + "value": "60px" }, { "name": "confirm_button_margin_t", @@ -202,15 +202,15 @@ }, { "name": "confirm_button_width", - "value": "140" + "value": "140px" }, { "name": "icon_item_fontsize", - "value": "18" + "value": "18px" }, { "name": "setting_dialog_dy", - "value": "200" + "value": "200px" }, { "name": "setting_dialog_width", @@ -222,7 +222,7 @@ }, { "name": "confirm_dialog_dy", - "value": "250" + "value": "250px" }, { "name": "close_notification_margin_top", @@ -238,19 +238,19 @@ }, { "name": "device_divider_margin_l", - "value": "70" + "value": "70px" }, { "name": "device_divider_margin_r", - "value": "30" + "value": "30px" }, { "name": "device_border_width", - "value": "1" + "value": "1px" }, { "name": "device_border_radius", - "value": "30" + "value": "30px" }, { "name": "device_image_radius", diff --git a/features/noticeitem/src/main/resources/phone/element/float.json b/features/noticeitem/src/main/resources/phone/element/float.json index f984f39a..7f4cfeaf 100644 --- a/features/noticeitem/src/main/resources/phone/element/float.json +++ b/features/noticeitem/src/main/resources/phone/element/float.json @@ -6,11 +6,11 @@ }, { "name": "notification_title_fontsize", - "value": "20" + "value": "20px" }, { "name": "notification_expanded_text_maxheight", - "value": "295" + "value": "295px" }, { "name": "notification_content_fontsize", @@ -18,75 +18,75 @@ }, { "name": "notification_content_lineheight", - "value": "20" + "value": "20px" }, { "name": "notification_content_maxlines", - "value": "1" + "value": "1px" }, { "name": "content_margin_top", - "value": "10" + "value": "10px" }, { "name": "body_margin_top", - "value": "10" + "value": "10px" }, { "name": "item_opicaty", - "value": "0.9" + "value": "0.9px" }, { "name": "item_borderradius", - "value": "20" + "value": "20px" }, { "name": "item_margintop", - "value": "10" + "value": "10px" }, { "name": "item_marginleft", - "value": "10" + "value": "10px" }, { "name": "item_marginright", - "value": "10" + "value": "10px" }, { "name": "item_paddingleft", - "value": "20" + "value": "20px" }, { "name": "item_paddingright", - "value": "20" + "value": "20px" }, { "name": "item_paddingbottom", - "value": "20" + "value": "20px" }, { "name": "item_setting_image_width", - "value": "30" + "value": "30px" }, { "name": "item_setting_image_height", - "value": "30" + "value": "30px" }, { "name": "item_delete_image_width", - "value": "30" + "value": "30px" }, { "name": "item_delete_image_height", - "value": "30" + "value": "30px" }, { "name": "titleitem_row_space", - "value": "10" + "value": "10px" }, { "name": "titleitem_height", - "value": "50" + "value": "50px" }, { "name": "title_image_width", @@ -126,15 +126,15 @@ }, { "name": "displayicon_width", - "value": "20" + "value": "20px" }, { "name": "displayicon_height", - "value": "20" + "value": "20px" }, { "name": "deleteall_image_opacity", - "value": "0.9" + "value": "0.9px" }, { "name": "setting_title_fontsize", @@ -154,11 +154,11 @@ }, { "name": "setting_border_width", - "value": "1" + "value": "1px" }, { "name": "setting_border_radius", - "value": "80" + "value": "80px" }, { "name": "notification_border_radius", @@ -166,15 +166,15 @@ }, { "name": "action_button_height", - "value": "48" + "value": "48px" }, { "name": "action_button_padding", - "value": "12" + "value": "12px" }, { "name": "picture_default_height", - "value": "300" + "value": "300px" }, { "name": "confirm_title_fontsize", @@ -194,7 +194,7 @@ }, { "name": "confirm_button_height", - "value": "60" + "value": "60px" }, { "name": "confirm_button_margin_t", @@ -238,19 +238,19 @@ }, { "name": "device_divider_margin_l", - "value": "70" + "value": "70px" }, { "name": "device_divider_margin_r", - "value": "30" + "value": "30px" }, { "name": "device_border_width", - "value": "1" + "value": "1px" }, { "name": "device_border_radius", - "value": "30" + "value": "30px" }, { "name": "device_image_radius", diff --git a/features/screenlock/src/main/ets/com/ohos/common/constants.ts b/features/screenlock/src/main/ets/com/ohos/common/constants.ts index c15026f6..f665dcff 100644 --- a/features/screenlock/src/main/ets/com/ohos/common/constants.ts +++ b/features/screenlock/src/main/ets/com/ohos/common/constants.ts @@ -133,11 +133,11 @@ export default class Constants { }]; //max password length static PASSWORD_MAX_LEN = 32 - static PASSWORD_TEXT_WIDTH =290 - static PASSWORD_TEXT_HEIGHT =40 + static PASSWORD_TEXT_WIDTH ='290px' + static PASSWORD_TEXT_HEIGHT ='40px' static PASSWORD_TEXT_BORDER =20 - static ACCOUNT_SPACE = 24 - static ACCOUNT_SPACE_PORTRAIT = 40 + static ACCOUNT_SPACE = '24px' + static ACCOUNT_SPACE_PORTRAIT = '40px' } export class StatusBarGroupComponentData { diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index e1bc2178..1927666d 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -196,17 +196,22 @@ export default class AccountsModel { authUser(challenge, authType: AuthType, authLevel: number, callback) { Log.showDebug(TAG, `authUser param: userId ${this.mCurrentUserId} challenge ${challenge}`); Trace.end(Trace.CORE_METHOD_CALL_ACCOUNT_SYSTEM); - this.userAuthManager.authUser(this.mCurrentUserId, challenge, authType, authLevel, { - onResult: (result, extraInfo) => { - Log.showInfo(TAG, `authUser UserAuthManager.authUser onResult`); - Trace.start(Trace.CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT); - callback(result, extraInfo); - }, - onAcquireInfo: (moduleId, acquire, extraInfo) => { - Log.showInfo(TAG, `authUser UserAuthManager.authUser onAcquireInfo`); + let challengeArray = new Uint8Array(challenge); + try { + this.userAuthManager.authUser(this.mCurrentUserId, challengeArray, authType, authLevel, { + onResult: (result, extraInfo) => { + Log.showInfo(TAG, `authUser UserAuthManager.authUser onResult`); + Trace.start(Trace.CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT); + callback(result, extraInfo); + }, + onAcquireInfo: (moduleId, acquire, extraInfo) => { + Log.showInfo(TAG, `authUser UserAuthManager.authUser onAcquireInfo`); + } } + ) + } catch(error) { + console.error(`authUser failed, code is ${error.code}, message is ${error.message}`); } - ) } getAuthProperty(authType, callback) { @@ -216,10 +221,14 @@ export default class AccountsModel { 'authType': authType, 'keys': keyArray } - this.userAuthManager.getProperty(request).then((properties) => { - Log.showInfo(TAG, `getAuthProperty properties ${JSON.stringify(properties)}`); - callback(properties) - }) + try { + this.userAuthManager.getProperty(request).then((properties) => { + Log.showInfo(TAG, `getAuthProperty properties ${JSON.stringify(properties)}`); + callback(properties) + }) + } catch (error) { + console.error(`getProperty failed, code is ${error.code}, message is ${error.message}`); + }; } registerPWDInputer(password: string): Promise { @@ -234,22 +243,32 @@ export default class AccountsModel { private registerInputer(password: string): boolean { Log.showDebug(TAG, `registerInputer`); - let result = this.pinAuthManager.registerInputer({ - onGetData: (passType, inputData) => { - Log.showDebug(TAG, `registerInputer onSetData passType:${passType}`); - let textEncoder = new util.TextEncoder(); - let uint8PW = textEncoder.encode(password); - Log.showDebug(TAG, `registerInputer onSetData call`); - inputData.onSetData(passType, uint8PW); - } - }) + let result = null + try { + result = this.pinAuthManager.registerInputer({ + onGetData: (passType, inputData) => { + Log.showDebug(TAG, `registerInputer onSetData passType:${passType}`); + let textEncoder = new util.TextEncoder(); + let uint8PW = textEncoder.encode(password); + Log.showDebug(TAG, `registerInputer onSetData call`); + inputData.onSetData(passType, uint8PW); + } + }) + } catch(error) { + console.error(`registerInputer failed, code is ${e.code}, message is ${e.message}`); + } + Log.showInfo(TAG, `registerInputer result:${result}`); return result; } unregisterInputer() { Log.showDebug(TAG, `unregisterInputer`); - this.pinAuthManager.unregisterInputer(); + try { + this.pinAuthManager.unregisterInputer(); + } catch { + LogUtil.debug(`${this.TAG}unregisterInputer failed`); + } } modelFinish() { diff --git a/features/screenlock/src/main/module.json5 b/features/screenlock/src/main/module.json5 index ae2b1d70..fea4cbc3 100644 --- a/features/screenlock/src/main/module.json5 +++ b/features/screenlock/src/main/module.json5 @@ -6,6 +6,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "uiSyntax": "ets" } } diff --git a/features/screenlock/src/main/resources/base/element/float.json b/features/screenlock/src/main/resources/base/element/float.json index db2757d3..aaab9765 100644 --- a/features/screenlock/src/main/resources/base/element/float.json +++ b/features/screenlock/src/main/resources/base/element/float.json @@ -2,19 +2,19 @@ "float": [ { "name": "lockicon_width", - "value": "40" + "value": "40px" }, { "name": "lockicon_height", - "value": "45" + "value": "45px" }, { "name": "lockicon_top_margin", - "value": "10" + "value": "10px" }, { "name": "lockicon_bottom_margin", - "value": "10" + "value": "10px" }, { "name": "lockicon_right_margin", @@ -22,7 +22,7 @@ }, { "name": "lock_prompt_fontsize", - "value": "32" + "value": "32px" }, { "name": "lock_Text_top_margin", @@ -30,47 +30,47 @@ }, { "name": "batterysoc_fontsize", - "value": "36" + "value": "36px" }, { "name": "accounts_component_height", - "value": "120" + "value": "120px" }, { "name": "accounts_ic_width", - "value": "72" + "value": "72px" }, { "name": "accounts_ic_height", - "value": "72" + "value": "72px" }, { "name": "accounts_name_fontsize", - "value": "24" + "value": "24px" }, { "name": "accounts_block", - "value": "8" + "value": "8px" }, { "name": "digitalpsd_prompt_fontsize", - "value": "32" + "value": "32px" }, { "name": "digitalpsd_prompt_margin_bottom", - "value": "48" + "value": "48px" }, { "name": "digitalpsd_prompt_width", - "value": "800" + "value": "800px" }, { "name": "digitalpsd_prompt_height", - "value": "72" + "value": "72px" }, { "name": "digitalpsd_passwdmask_width", - "value": "400" + "value": "400px" }, { "name": "digitalpsd_passwdmask_height", @@ -78,47 +78,47 @@ }, { "name": "digitalpsd_passwdmask_margin_bottom", - "value": "128" + "value": "128px" }, { "name": "digitalpsd_input_area_height", - "value": "200" + "value": "200px" }, { "name": "digitalpsd_row1_fontsize", - "value": "48" + "value": "48px" }, { "name": "digitalpsd_row2_fontsize", - "value": "24" + "value": "24px" }, { "name": "digitalpsd_row_height", - "value": "200" + "value": "200px" }, { "name": "digitalpsd_key_area_height", - "value": "800" + "value": "800px" }, { "name": "digitalpsd_key_area_margin_bottom", - "value": "64" + "value": "64px" }, { "name": "digitalpsd_key_area_margin_bottom_portrait", - "value": "128" + "value": "128px" }, { "name": "mixedpsd_prompt_fontsize", - "value": "32" + "value": "32px" }, { "name": "mixedpsd_prompt_text_fontsize", - "value": "32" + "value": "32px" }, { "name": "mixedpsd_prompt_margin_bottom", - "value": "48" + "value": "48px" }, { "name": "mixedpsd_prompt_margin_top", @@ -126,87 +126,87 @@ }, { "name": "mixedpsd_prompt_width", - "value": "800" + "value": "800px" }, { "name": "mixedpsd_prompt_height", - "value": "72" + "value": "72px" }, { "name": "mixedpsd_input_maxlen", - "value": "30" + "value": "30px" }, { "name": "mixedpsd_input_width", - "value": "600" + "value": "600px" }, { "name": "mixedpsd_input_height", - "value": "72" + "value": "72px" }, { "name": "mixedpsd_input_margin_bottom", - "value": "64" + "value": "64px" }, { "name": "custompsd_prompt_fontsize", - "value": "32" + "value": "32px" }, { "name": "custompsd_prompt_margin_bottom", - "value": "48" + "value": "48px" }, { "name": "custompsd_prompt_width", - "value": "800" + "value": "800px" }, { "name": "custompsd_prompt_height", - "value": "72" + "value": "72px" }, { "name": "custompsd_input_width", - "value": "600" + "value": "600px" }, { "name": "custompsd_input_width_portrait", - "value": "700" + "value": "700px" }, { "name": "custompsd_input_height", - "value": "72" + "value": "72px" }, { "name": "custompsd_input_radius", - "value": "36" + "value": "36px" }, { "name": "custompsd_input_margin_bottom", - "value": "90" + "value": "90px" }, { "name": "custompsd_passwdmask_margin_bottom", - "value": "128" + "value": "128px" }, { "name": "custompsd_input_area_height", - "value": "400" + "value": "400px" }, { "name": "custompsd_key_area_height", - "value": "800" + "value": "800px" }, { "name": "custompsd_key_area_margin_bottom", - "value": "64" + "value": "64px" }, { "name": "custompsd_key_area_margin_bottom_portrait", - "value": "128" + "value": "128px" }, { "name": "custompsd_text_opacity", - "value": "1" + "value": "1px" }, { "name": "custompsd_digitalpsd_ic_diameter", diff --git a/features/screenlock/src/main/resources/phone/element/float.json b/features/screenlock/src/main/resources/phone/element/float.json index c59ae13d..df2590b1 100644 --- a/features/screenlock/src/main/resources/phone/element/float.json +++ b/features/screenlock/src/main/resources/phone/element/float.json @@ -30,27 +30,27 @@ }, { "name": "batterysoc_fontsize", - "value": "36" + "value": "36px" }, { "name": "accounts_component_height", - "value": "120" + "value": "120px" }, { "name": "accounts_ic_width", - "value": "72" + "value": "72px" }, { "name": "accounts_ic_height", - "value": "72" + "value": "72px" }, { "name": "accounts_name_fontsize", - "value": "24" + "value": "24px" }, { "name": "accounts_block", - "value": "8" + "value": "8px" }, { "name": "digitalpsd_prompt_fontsize", @@ -62,7 +62,7 @@ }, { "name": "digitalpsd_prompt_width", - "value": "800" + "value": "800px" }, { "name": "digitalpsd_prompt_height", @@ -98,7 +98,7 @@ }, { "name": "digitalpsd_key_area_height", - "value": "800" + "value": "800px" }, { "name": "digitalpsd_key_area_margin_bottom", @@ -126,15 +126,15 @@ }, { "name": "mixedpsd_prompt_width", - "value": "800" + "value": "800px" }, { "name": "mixedpsd_prompt_height", - "value": "72" + "value": "72px" }, { "name": "mixedpsd_input_maxlen", - "value": "30" + "value": "30px" }, { "name": "mixedpsd_input_width", @@ -158,7 +158,7 @@ }, { "name": "custompsd_prompt_width", - "value": "800" + "value": "800px" }, { "name": "custompsd_prompt_height", @@ -182,7 +182,7 @@ }, { "name": "custompsd_input_margin_bottom", - "value": "90" + "value": "90px" }, { "name": "custompsd_passwdmask_margin_bottom", @@ -194,7 +194,7 @@ }, { "name": "custompsd_key_area_height", - "value": "800" + "value": "800px" }, { "name": "custompsd_key_area_margin_bottom", diff --git a/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts b/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts index a9415392..cc897a59 100644 --- a/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts +++ b/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts @@ -24,7 +24,7 @@ export default class ShortcutViewModel { Log.showInfo(TAG, `onShortcutClick ${shortcutType}`) switch (shortcutType) { case Constants.CLICK_TYPE_SHUTDOWN: - power.shutdownDevice("shutdown_device") + power.shutdown("shutdown_device") break; case Constants.CLICK_TYPE_REBOOT: power.rebootDevice("reboot_device") diff --git a/features/shortcutcomponent/src/main/module.json5 b/features/shortcutcomponent/src/main/module.json5 index 71394d9b..cad052b8 100644 --- a/features/shortcutcomponent/src/main/module.json5 +++ b/features/shortcutcomponent/src/main/module.json5 @@ -6,6 +6,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "uiSyntax": "ets" } } diff --git a/features/shortcutcomponent/src/main/resources/base/element/float.json b/features/shortcutcomponent/src/main/resources/base/element/float.json index ca1adcf6..419d1d76 100644 --- a/features/shortcutcomponent/src/main/resources/base/element/float.json +++ b/features/shortcutcomponent/src/main/resources/base/element/float.json @@ -2,7 +2,7 @@ "float": [ { "name": "shortcut_block", - "value": "8" + "value": "8px" } ] } \ No newline at end of file diff --git a/features/signalcomponent/src/main/module.json5 b/features/signalcomponent/src/main/module.json5 index dc9c80c3..7600fe24 100644 --- a/features/signalcomponent/src/main/module.json5 +++ b/features/signalcomponent/src/main/module.json5 @@ -6,6 +6,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "uiSyntax": "ets" } } diff --git a/features/wallpapercomponent/src/main/module.json5 b/features/wallpapercomponent/src/main/module.json5 index 68fa33fa..e4cdb66f 100644 --- a/features/wallpapercomponent/src/main/module.json5 +++ b/features/wallpapercomponent/src/main/module.json5 @@ -6,6 +6,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "uiSyntax": "ets" } } diff --git a/features/wificomponent/src/main/module.json5 b/features/wificomponent/src/main/module.json5 index 5bad4d22..364b737a 100644 --- a/features/wificomponent/src/main/module.json5 +++ b/features/wificomponent/src/main/module.json5 @@ -6,6 +6,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "uiSyntax": "ets" } } diff --git a/product/pc/src/main/module.json5 b/product/pc/src/main/module.json5 index 53b47492..1e1c4394 100644 --- a/product/pc/src/main/module.json5 +++ b/product/pc/src/main/module.json5 @@ -8,6 +8,12 @@ "deviceTypes": [ "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "deliveryWithInstall": true, "installationFree": false, "pages": "$profile:main_pages", diff --git a/product/pc/src/main/resources/base/element/float.json b/product/pc/src/main/resources/base/element/float.json index 8324d095..8c52eba5 100644 --- a/product/pc/src/main/resources/base/element/float.json +++ b/product/pc/src/main/resources/base/element/float.json @@ -2,35 +2,35 @@ "float": [ { "name": "lockicon_area_height", - "value": "44" + "value": "44px" }, { "name": "datetime_area_height", - "value": "240" + "value": "240px" }, { "name": "datetime_margin_top", - "value": "66" + "value": "66px" }, { "name": "batterysoc_area_height", - "value": "48" + "value": "48px" }, { "name": "shortcut_area_margin_top", - "value": "24" + "value": "24px" }, { "name": "shortcut_area_height", - "value": "120" + "value": "120px" }, { "name": "shortcut_area_height_portrait", - "value": "146" + "value": "146px" }, { "name": "notificationList_margin_top", - "value": "32" + "value": "32px" }, { "name": "title_font_height", @@ -42,7 +42,7 @@ }, { "name": "setting_cont_fontsize", - "value": "32" + "value": "32px" }, { "name": "close_notification_margin_top", @@ -175,494 +175,6 @@ { "name": "status_bar_clock_margin", "value": "0" - }, - { - "name": "status_bar_clock_width", - "value": "60vp" - }, - { - "name": "time_fontsize", - "value": "148" - }, - { - "name": "time_fontWeight", - "value": "400" - }, - { - "name": "time_top_margin", - "value": "10" - }, - { - "name": "time_bottom_margin", - "value": "10" - }, - { - "name": "date_fontsize", - "value": "36" - }, - { - "name": "date_week_area_height", - "value": "48" - }, - { - "name": "date_lunar_calendar_height", - "value": "0" - }, - { - "name": "date_lunar_calendar_fontSize", - "value": "14fp" - }, - { - "name": "date_lunar_calendar_top_margin", - "value": "6vp" - }, - { - "name": "notificationList_width", - "value": "834vp" - }, - { - "name": "notification_title_fontsize", - "value": "20" - }, - { - "name": "notification_expanded_text_maxheight", - "value": "295" - }, - { - "name": "notification_content_fontsize", - "value": "20" - }, - { - "name": "notification_content_lineheight", - "value": "20" - }, - { - "name": "notification_content_maxlines", - "value": "1" - }, - { - "name": "content_margin_top", - "value": "10" - }, - { - "name": "body_margin_top", - "value": "10" - }, - { - "name": "item_opicaty", - "value": "0.9" - }, - { - "name": "item_borderradius", - "value": "20" - }, - { - "name": "item_margintop", - "value": "10" - }, - { - "name": "item_marginleft", - "value": "10" - }, - { - "name": "item_marginright", - "value": "10" - }, - { - "name": "item_paddingleft", - "value": "20" - }, - { - "name": "item_paddingright", - "value": "20" - }, - { - "name": "item_paddingbottom", - "value": "20" - }, - { - "name": "item_setting_image_width", - "value": "30" - }, - { - "name": "item_setting_image_height", - "value": "30" - }, - { - "name": "item_delete_image_width", - "value": "30" - }, - { - "name": "item_delete_image_height", - "value": "30" - }, - { - "name": "titleitem_row_space", - "value": "10" - }, - { - "name": "titleitem_height", - "value": "50" - }, - { - "name": "title_image_width", - "value": "30" - }, - { - "name": "title_image_height", - "value": "30" - }, - { - "name": "title_image_left_margin", - "value": "0" - }, - { - "name": "title_image_right_margin", - "value": "0" - }, - { - "name": "message_font_margin_t", - "value": "14vp" - }, - { - "name": "title_name_fontsize", - "value": "20" - }, - { - "name": "title_time_fontsize", - "value": "20" - }, - { - "name": "displayicon_width", - "value": "20" - }, - { - "name": "displayicon_height", - "value": "20" - }, - { - "name": "deleteall_image_opacity", - "value": "0.9" - }, - { - "name": "setting_title_fontsize", - "value": "40" - }, - { - "name": "setting_cont_height", - "value": "40vp" - }, - { - "name": "setting_cont_width", - "value": "300vp" - }, - { - "name": "setting_border_width", - "value": "1" - }, - { - "name": "setting_border_radius", - "value": "80" - }, - { - "name": "notification_border_radius", - "value": "24vp" - }, - { - "name": "action_button_height", - "value": "48" - }, - { - "name": "action_button_padding", - "value": "12" - }, - { - "name": "picture_default_height", - "value": "300" - }, - { - "name": "confirm_title_fontsize", - "value": "40" - }, - { - "name": "confirm_title_width", - "value": "330vp" - }, - { - "name": "confirm_cont_fontsize", - "value": "32" - }, - { - "name": "confirm_divider_height", - "value": "44" - }, - { - "name": "confirm_button_height", - "value": "60" - }, - { - "name": "confirm_button_margin_t", - "value": "23vp" - }, - { - "name": "confirm_button_width", - "value": "140" - }, - { - "name": "icon_item_fontsize", - "value": "18" - }, - { - "name": "setting_dialog_dy", - "value": "200" - }, - { - "name": "setting_dialog_width", - "value": "330vp" - }, - { - "name": "setting_dialog_Width", - "value": "362vp" - }, - { - "name": "confirm_dialog_dy", - "value": "250" - }, - { - "name": "device_divider_margin_l", - "value": "70" - }, - { - "name": "device_divider_margin_r", - "value": "30" - }, - { - "name": "device_border_width", - "value": "1" - }, - { - "name": "device_border_radius", - "value": "30" - }, - { - "name": "device_image_radius", - "value": "0" - }, - { - "name": "lockicon_width", - "value": "40" - }, - { - "name": "lockicon_height", - "value": "45" - }, - { - "name": "lockicon_top_margin", - "value": "10" - }, - { - "name": "lockicon_bottom_margin", - "value": "10" - }, - { - "name": "lockicon_right_margin", - "value": "0" - }, - { - "name": "lock_prompt_fontsize", - "value": "32" - }, - { - "name": "lock_Text_top_margin", - "value": "0" - }, - { - "name": "batterysoc_fontsize", - "value": "36" - }, - { - "name": "accounts_component_height", - "value": "120" - }, - { - "name": "accounts_ic_width", - "value": "72" - }, - { - "name": "accounts_ic_height", - "value": "72" - }, - { - "name": "accounts_name_fontsize", - "value": "24" - }, - { - "name": "accounts_block", - "value": "8" - }, - { - "name": "digitalpsd_prompt_fontsize", - "value": "32" - }, - { - "name": "digitalpsd_prompt_margin_bottom", - "value": "48" - }, - { - "name": "digitalpsd_prompt_width", - "value": "800" - }, - { - "name": "digitalpsd_prompt_height", - "value": "72" - }, - { - "name": "digitalpsd_passwdmask_width", - "value": "400" - }, - { - "name": "digitalpsd_passwdmask_height", - "value": "24vp" - }, - { - "name": "digitalpsd_passwdmask_margin_bottom", - "value": "128" - }, - { - "name": "digitalpsd_input_area_height", - "value": "200" - }, - { - "name": "digitalpsd_row1_fontsize", - "value": "48" - }, - { - "name": "digitalpsd_row2_fontsize", - "value": "24" - }, - { - "name": "digitalpsd_row_height", - "value": "200" - }, - { - "name": "digitalpsd_key_area_height", - "value": "800" - }, - { - "name": "digitalpsd_key_area_margin_bottom", - "value": "64" - }, - { - "name": "mixedpsd_prompt_fontsize", - "value": "32" - }, - { - "name": "mixedpsd_prompt_text_fontsize", - "value": "32" - }, - { - "name": "mixedpsd_prompt_margin_bottom", - "value": "48" - }, - { - "name": "mixedpsd_prompt_margin_top", - "value": "0" - }, - { - "name": "mixedpsd_prompt_width", - "value": "800" - }, - { - "name": "mixedpsd_prompt_height", - "value": "72" - }, - { - "name": "mixedpsd_input_maxlen", - "value": "30" - }, - { - "name": "mixedpsd_input_width", - "value": "600" - }, - { - "name": "mixedpsd_input_height", - "value": "72" - }, - { - "name": "mixedpsd_input_margin_bottom", - "value": "128" - }, - { - "name": "custompsd_prompt_fontsize", - "value": "32" - }, - { - "name": "custompsd_prompt_margin_bottom", - "value": "48" - }, - { - "name": "custompsd_prompt_width", - "value": "800" - }, - { - "name": "custompsd_prompt_height", - "value": "72" - }, - { - "name": "custompsd_input_width", - "value": "600" - }, - { - "name": "custompsd_input_height", - "value": "72" - }, - { - "name": "custompsd_input_radius", - "value": "36" - }, - { - "name": "custompsd_input_margin_bottom", - "value": "90" - }, - { - "name": "custompsd_passwdmask_margin_bottom", - "value": "128" - }, - { - "name": "custompsd_input_area_height", - "value": "400" - }, - { - "name": "custompsd_key_area_height", - "value": "800" - }, - { - "name": "custompsd_key_area_margin_bottom", - "value": "64" - }, - { - "name": "custompsd_text_opacity", - "value": "1" - }, - { - "name": "custompsd_digitalpsd_ic_diameter", - "value": "12vp" - }, - { - "name": "custompsd_button_height", - "value": "36vp" - }, - { - "name": "numkeyBoard_text_opacity", - "value": "1" - }, - { - "name": "numkeyBoard_rowsGap", - "value": "0" - }, - { - "name": "shortcut_block", - "value": "8" } ] diff --git a/product/phone/src/main/module.json5 b/product/phone/src/main/module.json5 index 6a888901..4db82eb8 100644 --- a/product/phone/src/main/module.json5 +++ b/product/phone/src/main/module.json5 @@ -8,6 +8,12 @@ "deviceTypes": [ "default" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "deliveryWithInstall": true, "installationFree": false, "pages": "$profile:main_pages", diff --git a/product/phone/src/main/resources/base/element/float.json b/product/phone/src/main/resources/base/element/float.json index 4d95bfc2..2d8171a8 100644 --- a/product/phone/src/main/resources/base/element/float.json +++ b/product/phone/src/main/resources/base/element/float.json @@ -135,518 +135,7 @@ { "name": "accounts_area_height", "value": "80vp" - }, - { - "name": "status_bar_clock_width", - "value": "2vp" - }, - { - "name": "time_fontsize", - "value": "72fp" - }, - { - "name": "time_fontWeight", - "value": "300" - }, - { - "name": "time_top_margin", - "value": "11vp" - }, - { - "name": "time_bottom_margin", - "value": "3vp" - }, - { - "name": "date_fontsize", - "value": "18fp" - }, - { - "name": "date_week_area_height", - "value": "24vp" - }, - { - "name": "date_lunar_calendar_height", - "value": "19vp" - }, - { - "name": "date_lunar_calendar_fontSize", - "value": "14fp" - }, - { - "name": "date_lunar_calendar_top_margin", - "value": "6vp" - }, - { - "name": "notificationList_width", - "value": "336vp" - }, - { - "name": "notification_title_fontsize", - "value": "20" - }, - { - "name": "notification_expanded_text_maxheight", - "value": "295" - }, - { - "name": "notification_content_fontsize", - "value": "20" - }, - { - "name": "notification_content_lineheight", - "value": "20" - }, - { - "name": "notification_content_maxlines", - "value": "1" - }, - { - "name": "content_margin_top", - "value": "10" - }, - { - "name": "body_margin_top", - "value": "10" - }, - { - "name": "item_opicaty", - "value": "0.9" - }, - { - "name": "item_borderradius", - "value": "20" - }, - { - "name": "item_margintop", - "value": "10" - }, - { - "name": "item_marginleft", - "value": "10" - }, - { - "name": "item_marginright", - "value": "10" - }, - { - "name": "item_paddingleft", - "value": "20" - }, - { - "name": "item_paddingright", - "value": "20" - }, - { - "name": "item_paddingbottom", - "value": "20" - }, - { - "name": "item_setting_image_width", - "value": "30" - }, - { - "name": "item_setting_image_height", - "value": "30" - }, - { - "name": "item_delete_image_width", - "value": "30" - }, - { - "name": "item_delete_image_height", - "value": "30" - }, - { - "name": "titleitem_row_space", - "value": "10" - }, - { - "name": "titleitem_height", - "value": "50" - }, - { - "name": "title_image_width", - "value": "24vp" - }, - { - "name": "title_image_height", - "value": "24vp" - }, - { - "name": "title_image_left_margin", - "value": "24vp" - }, - { - "name": "title_image_right_margin", - "value": "8vp" - }, - { - "name": "title_font_height", - "value": "28vp" - }, - { - "name": "title_font_margin_t", - "value": "13vp" - }, - { - "name": "message_font_margin_t", - "value": "23vp" - }, - { - "name": "title_name_fontsize", - "value": "20" - }, - { - "name": "title_time_fontsize", - "value": "20" - }, - { - "name": "displayicon_width", - "value": "20" - }, - { - "name": "displayicon_height", - "value": "20" - }, - { - "name": "deleteall_image_opacity", - "value": "0.9" - }, - { - "name": "setting_title_fontsize", - "value": "20fp" - }, - { - "name": "setting_cont_fontsize", - "value": "16fp" - }, - { - "name": "setting_cont_height", - "value": "40vp" - }, - { - "name": "setting_cont_width", - "value": "288vp" - }, - { - "name": "setting_border_width", - "value": "1" - }, - { - "name": "setting_border_radius", - "value": "80" - }, - { - "name": "notification_border_radius", - "value": "24vp" - }, - { - "name": "action_button_height", - "value": "48" - }, - { - "name": "action_button_padding", - "value": "12" - }, - { - "name": "picture_default_height", - "value": "300" - }, - { - "name": "confirm_title_fontsize", - "value": "20fp" - }, - { - "name": "confirm_title_width", - "value": "288vp" - }, - { - "name": "confirm_cont_fontsize", - "value": "16fp" - }, - { - "name": "confirm_divider_height", - "value": "24vp" - }, - { - "name": "confirm_button_height", - "value": "60" - }, - { - "name": "confirm_button_margin_t", - "value": "23vp" - }, - { - "name": "confirm_button_width", - "value": "128fp" - }, - { - "name": "icon_item_fontsize", - "value": "18" - }, - { - "name": "setting_dialog_dy", - "value": "288vp" - }, - { - "name": "setting_dialog_width", - "value": "304vp" - }, - { - "name": "setting_dialog_Width", - "value": "336vp" - }, - { - "name": "confirm_dialog_dy", - "value": "310vp" - }, - { - "name": "close_notification_margin_top", - "value": "17vp" - }, - { - "name": "notification_appname_margin_top", - "value": "11vp" - }, - { - "name": "notification_cancle_margin_top", - "value": "9vp" - }, - { - "name": "device_divider_margin_l", - "value": "70" - }, - { - "name": "device_divider_margin_r", - "value": "30" - }, - { - "name": "device_border_width", - "value": "1" - }, - { - "name": "device_border_radius", - "value": "30" - }, - { - "name": "device_image_radius", - "value": "12vp" - }, - { - "name": "lockicon_width", - "value": "16vp" - }, - { - "name": "lockicon_height", - "value": "16vp" - }, - { - "name": "lockicon_top_margin", - "value": "60vp" - }, - { - "name": "lockicon_bottom_margin", - "value": "10" - }, - { - "name": "lockicon_right_margin", - "value": "4vp" - }, - { - "name": "lock_prompt_fontsize", - "value": "14vp" - }, - { - "name": "lock_Text_top_margin", - "value": "58vp" - }, - { - "name": "batterysoc_fontsize", - "value": "36" - }, - { - "name": "accounts_component_height", - "value": "120" - }, - { - "name": "accounts_ic_width", - "value": "72" - }, - { - "name": "accounts_ic_height", - "value": "72" - }, - { - "name": "accounts_name_fontsize", - "value": "24" - }, - { - "name": "accounts_block", - "value": "8" - }, - { - "name": "digitalpsd_prompt_fontsize", - "value": "16vp" - }, - { - "name": "digitalpsd_prompt_margin_bottom", - "value": "24vp" - }, - { - "name": "digitalpsd_prompt_width", - "value": "800" - }, - { - "name": "digitalpsd_prompt_height", - "value": "22vp" - }, - { - "name": "digitalpsd_passwdmask_width", - "value": "192vp" - }, - { - "name": "digitalpsd_passwdmask_height", - "value": "12vp" - }, - { - "name": "digitalpsd_passwdmask_margin_bottom", - "value": "151vp" - }, - { - "name": "digitalpsd_input_area_height", - "value": "60vp" - }, - { - "name": "digitalpsd_row1_fontsize", - "value": "28vp" - }, - { - "name": "digitalpsd_row2_fontsize", - "value": "12vp" - }, - { - "name": "digitalpsd_row_height", - "value": "54vp" - }, - { - "name": "digitalpsd_key_area_height", - "value": "800" - }, - { - "name": "digitalpsd_key_area_margin_bottom", - "value": "52vp" - }, - { - "name": "mixedpsd_prompt_fontsize", - "value": "16fp" - }, - { - "name": "mixedpsd_prompt_margin_top", - "value": "239vp" - }, - { - "name": "mixedpsd_prompt_text_fontsize", - "value": "20fp" - }, - { - "name": "mixedpsd_prompt_margin_bottom", - "value": "24vp" - }, - { - "name": "mixedpsd_prompt_width", - "value": "800" - }, - { - "name": "mixedpsd_prompt_height", - "value": "72" - }, - { - "name": "mixedpsd_input_maxlen", - "value": "30" - }, - { - "name": "mixedpsd_input_width", - "value": "288vp" - }, - { - "name": "mixedpsd_input_height", - "value": "36vp" - }, - { - "name": "mixedpsd_input_margin_bottom", - "value": "16vp" - }, - { - "name": "custompsd_prompt_fontsize", - "value": "16vp" - }, - { - "name": "custompsd_prompt_margin_bottom", - "value": "24vp" - }, - { - "name": "custompsd_prompt_width", - "value": "800" - }, - { - "name": "custompsd_prompt_height", - "value": "22vp" - }, - { - "name": "custompsd_input_width", - "value": "288vp" - }, - { - "name": "custompsd_input_height", - "value": "36vp" - }, - { - "name": "custompsd_input_radius", - "value": "18vp" - }, - { - "name": "custompsd_input_margin_bottom", - "value": "90" - }, - { - "name": "custompsd_passwdmask_margin_bottom", - "value": "71vp" - }, - { - "name": "custompsd_input_area_height", - "value": "138vp" - }, - { - "name": "custompsd_key_area_height", - "value": "800" - }, - { - "name": "custompsd_key_area_margin_bottom", - "value": "52vp" - }, - { - "name": "custompsd_text_opacity", - "value": "0.2" - }, - { - "name": "custompsd_digitalpsd_ic_diameter", - "value": "9vp" - }, - { - "name": "custompsd_button_height", - "value": "40vp" - }, - { - "name": "numkeyBoard_text_opacity", - "value": "0.6" - }, - { - "name": "numkeyBoard_rowsGap", - "value": "22vp" - }, - { - "name": "shortcut_block", - "value": "8" + } ] } \ No newline at end of file -- Gitee From f1f8eb07a41b94b425a1bc9b1ff82d2d960f9c52 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Fri, 2 Dec 2022 16:40:12 +0800 Subject: [PATCH 303/373] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E4=B8=BB=E7=95=8C=E9=9D=A2=E5=92=8C=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E7=95=8C=E9=9D=A2=E9=AB=98=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../src/main/ets/com/ohos/pages/ControlCenterComponent.ets | 1 + .../src/main/ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../pc/controlpanel/src/main/ets/pages/common/StyleManager.ts | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index 5d81c0b1..07afda7b 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -154,6 +154,7 @@ export default struct ControlCenterComponent { .transition({ type: TransitionType.Delete, opacity: 0 }) } } + .height('100%') .width('100%') .onAreaChange((e, e2) => { Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 6945a2c4..918257a4 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -35,7 +35,7 @@ class ServiceExtAbility extends ServiceExtension { left: (872 * dis.width) / 1280, top: (44 * dis.width) / 1280, width: (402 * dis.width) / 1280, - height: (346 * dis.width) / 1280, + height: (345 * dis.width) / 1280, }; AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'rect', rect); diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts index 0f4d754d..08c383d1 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts @@ -75,7 +75,7 @@ export default class StyleManager { style.marginLeft = StyleManager.calcScaleSizePx(20); style.marginRight = StyleManager.calcScaleSizePx(20); style.marginTop = StyleManager.calcScaleSizePx(0); - style.upTitleHeight = StyleManager.calcScaleSizePx(56); + style.upTitleHeight = StyleManager.calcScaleSizePx(80); style.titleMarginBottom = StyleManager.calcScaleSizePx(0); style.toggleAreaGap = StyleManager.calcScaleSizePx(12); style.simpleToggleLayoutMarginTop = StyleManager.calcScaleSizePx(23); -- Gitee From 2408ed18f9313786d691bf44dd5f2229ea549a8f Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Fri, 2 Dec 2022 15:51:32 +0800 Subject: [PATCH 304/373] =?UTF-8?q?ArkUI=E9=80=82=E9=85=8D=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E8=87=B3=E6=9C=80=E6=96=B0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../com/ohos/pages/ControlCenterComponent.ets | 2 +- .../ets/com/ohos/model/LocationService.ts | 18 +- .../com/ohos/model/notificationListener.ts | 262 +++++++++--------- .../view/component/noDisturbComponent.ets | 2 +- .../ohos/view/component/switchComponent.ets | 3 +- .../main/resources/base/element/float.json | 6 +- .../ets/com/ohos/pages/StatusBarComponent.ets | 25 +- .../ets/com/ohos/viewmodel/StatusBarVM.ts | 9 +- .../navigationBar/src/main/module.json5 | 6 + .../src/main/module.json5 | 6 + .../ServiceExtAbility/ServiceExtAbility.ts | 33 ++- .../default/volumepanel/src/main/module.json5 | 6 + .../controlpanel/src/main/ets/pages/index.ets | 15 +- product/pc/controlpanel/src/main/module.json5 | 6 + .../src/main/ets/pages/index.ets | 11 +- .../notificationpanel/src/main/module.json5 | 6 + product/pc/statusbar/src/main/module.json5 | 6 + 17 files changed, 240 insertions(+), 182 deletions(-) diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index 5d81c0b1..795f3c5f 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -110,7 +110,7 @@ export default struct ControlCenterComponent { } .width('100%') .height(this.style.upTitleHeight) - .margin({top: this.style.marginTop, bottom: this.style.titleMarginBottom}) + .margin({top:5}) Row() { Column() { diff --git a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts index ea8479ad..56bd9b5e 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import geolocation from '@ohos.geolocation'; +import geolocation from '@ohos.geoLocationManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; @@ -34,7 +34,7 @@ export class LocationService { Log.showInfo(TAG, 'startService'); this.mIsStart = true; this.getServiceState(); - geolocation.on('locationServiceState', (state: boolean) => { + geolocation.on('locationEnabledChange', (state: boolean) => { Log.showInfo(TAG, `startService locationChange, state: ${JSON.stringify(state)}`); this.getServiceState(); }); @@ -46,7 +46,7 @@ export class LocationService { }; Log.showInfo(TAG, 'stopService'); this.mIsStart = false; - geolocation.off('locationServiceState', (state: boolean) => { + geolocation.off('locationEnabledChange', (state: boolean) => { Log.showInfo(TAG, `stopService locationChange, state: ${JSON.stringify(state)}`) }); } @@ -58,12 +58,9 @@ export class LocationService { getServiceState(): void { Log.showDebug(TAG, 'getServiceState'); - geolocation.isLocationEnabled().then((data) => { - Log.showInfo(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`); - this.mListener?.updateServiceState(data); - }).then(() => { - }).catch((err) => { - }); + let data = geolocation.isLocationEnabled() + Log.showInfo(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`); + this.mListener?.updateServiceState(data); } enableLocation(): void { @@ -78,9 +75,6 @@ export class LocationService { disableLocation(): void { Log.showInfo(TAG, 'disableLocation'); geolocation.disableLocation() - .then((res) => Log.showInfo(TAG, `disableLocation, result: ${JSON.stringify(res)}`)).then(() => { - }).catch((err) => { - }); } } diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts index 07cba800..312cfefb 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts @@ -14,148 +14,148 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import Notification from '@ohos.notification'; -import {EnabledNotificationCallbackData} from 'notification/notificationSubscriber'; -import { NotificationSlot } from 'notification/notificationSlot'; +import NotificationManager from '@ohos.notificationManager'; +import NotificationSubscribe from '@ohos.notificationSubscribe'; const TAG = 'NotificationManagenment-NotificationListener'; interface EnableListener { - bundle: string; - onEnableChanged: {(value: boolean): void}; + bundle: string; + onEnableChanged: { (value: boolean): void }; } export interface BundleOption { - bundle: string; - uid?: number; + bundle: string; + uid?: number; } export class NotificationListener { - private readonly listeners = new Set(); - - subscribeEnableChanged(): void { - Log.showInfo(TAG, 'subscribeEnableChanged'); - Notification.subscribe({ - onEnabledNotificationChanged: this.handleEnabledNotificationChanged.bind(this) - }, () => { - Log.showInfo(TAG, 'subscribeEnableChanged finished'); - }); - } - - unsubscribeEnableChanged(): void { - Log.showInfo(TAG, 'unsubscribeEnableChanged'); - this.unRegisterAll(); - Notification.unsubscribe({ - onEnabledNotificationChanged: this.handleEnabledNotificationChanged.bind(this) - }, () => { - Log.showInfo(TAG, 'unsubscribeEnableChanged finished'); - }); - } - - handleEnabledNotificationChanged(data: EnabledNotificationCallbackData): void { - Log.showDebug(TAG, `handleEnabledNotificationChanged data:${JSON.stringify(data)} `); - this.listeners.forEach((listener) => { - if (listener.bundle == data.bundle) { - listener.onEnableChanged(data.enable); - } else { - Log.showError(TAG, `handleEnabledNotificationChanged error`); - } - }); - } - - register(listener: EnableListener): void { - this.listeners.add(listener); - Log.showInfo(TAG, 'register finished'); - } - - unRegister(listener: EnableListener): void { - this.listeners.delete(listener); - Log.showInfo(TAG, 'unRegister finished'); - } - - unRegisterAll(): void { - this.listeners.clear(); - Log.showInfo(TAG, 'unRegisterAll finished'); - } - - async isNotificationEnabled(bundleOption: BundleOption, callback?: (data) => void): Promise { - Log.showDebug(TAG, `isNotificationEnabled bundleOption:${JSON.stringify(bundleOption)} `); - return new Promise((resolve, reject) => { - Notification.isNotificationEnabled(bundleOption, (err, data) => { - Log.showInfo(TAG, `isNotificationEnabled callback data:${JSON.stringify(data)} err:${JSON.stringify(err)}`); - if (!!data) { - if (callback) { - callback(data); - } - resolve(data); - } else { - reject(err); - } - }); - }); - } - - enableNotification(bundleOption: BundleOption, data: boolean): void { - Log.showDebug(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); - let enableValue: boolean = data ? true : false; - Notification.enableNotification(bundleOption, enableValue, (err, result) => { - Log.showInfo(TAG, `enableNotification err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); - }); - } - - async isNotificationSlotEnabled(bundleOption: BundleOption, slotType: Notification.SlotType, callback?: (data) => void): Promise { - Log.showDebug(TAG, `isNotificationSlotEnabled bundleOption:${JSON.stringify(bundleOption)} `); - return new Promise((resolve, reject) => { - Notification.isNotificationSlotEnabled(bundleOption, slotType, (err, data) => { - Log.showInfo(TAG, `isNotificationSlotEnabled callback data:${JSON.stringify(data)} err:${JSON.stringify(err)}`); - if (!!data) { - if (callback) { - callback(data); - } - resolve(data); - } else { - reject(err); - } - }); - }); - } - - enableNotificationSlot(bundleOption: BundleOption, slotType: Notification.SlotType, data: boolean): void { - Log.showDebug(TAG, `enableNotificationSlot bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); - let enableValue: boolean = data ? true : false; - Notification.enableNotificationSlot(bundleOption, slotType, enableValue, (err, result) => { - Log.showInfo(TAG, `enableNotificationSlot err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); - }); - } - - notificationSlotSet(bundleOption: BundleOption, data: NotificationSlot): void { - Log.showDebug(TAG, `notificationSlotSet bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); - Notification.setSlotByBundle(bundleOption, data, (err, result) => { - Log.showInfo(TAG, `notificationSlotSet err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); - }); - } - - async isDistributedEnabled(): Promise { - Log.showInfo(TAG, 'isDistributedEnabled'); - return new Promise((resolve, reject) => { - Notification.isDistributedEnabled().then((data) => { - Log.showInfo(TAG, `isDistributedEnabled data:${data?'true':'false'}`); - resolve(data); - }).catch((err) => { - Log.showError(TAG, `isDistributedEnabled err:${JSON.stringify(err)}`); - reject(err); - }); - }); - } - - enableDistributed(data: boolean): void { - Log.showDebug(TAG, `enableDistributed data:${JSON.stringify(data)}`); - let enableValue: boolean = data ? true : false; - Notification.enableDistributed(enableValue, (err, result) => { - Log.showInfo(TAG, `enableDistributed err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); - }); - } + private readonly listeners = new Set(); + + subscribeEnableChanged(): void { + Log.showInfo(TAG, 'subscribeEnableChanged'); + NotificationSubscribe.subscribe({ + onEnabledNotificationChanged: this.handleEnabledNotificationChanged.bind(this) + }, () => { + Log.showInfo(TAG, 'subscribeEnableChanged finished'); + }); + } + + unsubscribeEnableChanged(): void { + Log.showInfo(TAG, 'unsubscribeEnableChanged'); + this.unRegisterAll(); + NotificationSubscribe.unsubscribe({ + onEnabledNotificationChanged: this.handleEnabledNotificationChanged.bind(this) + }, () => { + Log.showInfo(TAG, 'unsubscribeEnableChanged finished'); + }); + } + + handleEnabledNotificationChanged(data: NotificationSubscribe.EnabledNotificationCallbackData): void { + Log.showDebug(TAG, `handleEnabledNotificationChanged data:${JSON.stringify(data)} `); + this.listeners.forEach((listener) => { + if (listener.bundle == data.bundle) { + listener.onEnableChanged(data.enable); + } else { + Log.showError(TAG, `handleEnabledNotificationChanged error`); + } + }); + } + + register(listener: EnableListener): void { + this.listeners.add(listener); + Log.showInfo(TAG, 'register finished'); + } + + unRegister(listener: EnableListener): void { + this.listeners.delete(listener); + Log.showInfo(TAG, 'unRegister finished'); + } + + unRegisterAll(): void { + this.listeners.clear(); + Log.showInfo(TAG, 'unRegisterAll finished'); + } + + async isNotificationEnabled(bundleOption: BundleOption, callback?: (data) => void): Promise { + Log.showDebug(TAG, `isNotificationEnabled bundleOption:${JSON.stringify(bundleOption)} `); + return new Promise((resolve, reject) => { + NotificationManager.isNotificationEnabled(bundleOption, (err, data) => { + Log.showInfo(TAG, `isNotificationEnabled callback data:${JSON.stringify(data)} err:${JSON.stringify(err)}`); + if (!!data) { + if (callback) { + callback(data); + } + resolve(data); + } else { + reject(err); + } + }); + }); + } + + enableNotification(bundleOption: BundleOption, data: boolean): void { + Log.showDebug(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); + let enableValue: boolean = data ? true : false; + NotificationManager.setNotificationEnable(bundleOption, enableValue, (err, result) => { + Log.showInfo(TAG, `enableNotification err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); + }); + } + + async isNotificationSlotEnabled(bundleOption: BundleOption, slotType: Notification.SlotType, callback?: (data) => void): Promise { + Log.showDebug(TAG, `isNotificationSlotEnabled bundleOption:${JSON.stringify(bundleOption)} `); + return new Promise((resolve, reject) => { + NotificationManager.isNotificationSlotEnabled(bundleOption, slotType, (err, data) => { + Log.showInfo(TAG, `isNotificationSlotEnabled callback data:${JSON.stringify(data)} err:${JSON.stringify(err)}`); + if (!!data) { + if (callback) { + callback(data); + } + resolve(data); + } else { + reject(err); + } + }); + }); + } + + enableNotificationSlot(bundleOption: BundleOption, slotType: Notification.SlotType, data: boolean): void { + Log.showDebug(TAG, `enableNotificationSlot bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); + let enableValue: boolean = data ? true : false; + NotificationManager.setNotificationEnableSlot(bundleOption, slotType, enableValue, (err, result) => { + Log.showInfo(TAG, `enableNotificationSlot err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); + }); + } + + notificationSlotSet(bundleOption: BundleOption, data: NotificationManager.NotificationSlot): void { + Log.showDebug(TAG, `notificationSlotSet bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); + NotificationManager.setSlotByBundle(bundleOption, data, (err, result) => { + Log.showInfo(TAG, `notificationSlotSet err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); + }); + } + + async isDistributedEnabled(): Promise { + Log.showInfo(TAG, 'isDistributedEnabled'); + return new Promise((resolve, reject) => { + NotificationManager.isDistributedEnabled().then((data) => { + Log.showInfo(TAG, `isDistributedEnabled data:${data ? 'true' : 'false'}`); + resolve(data); + }).catch((err) => { + Log.showError(TAG, `isDistributedEnabled err:${JSON.stringify(err)}`); + reject(err); + }); + }); + } + + enableDistributed(data: boolean): void { + Log.showDebug(TAG, `enableDistributed data:${JSON.stringify(data)}`); + let enableValue: boolean = data ? true : false; + NotificationManager.setDistributedEnable(enableValue, (err, result) => { + Log.showInfo(TAG, `enableDistributed err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); + }); + } } let notificationListener = new NotificationListener(); -export default notificationListener ; \ No newline at end of file +export default notificationListener; \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets index d83628e5..992315d1 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets @@ -126,7 +126,7 @@ export default struct NoDisturbComponent { } this.mPrevGetCnt++; } - this.mViewModel.isEffective = !this.mViewModel.isEffective; + this.mViewModel.isEffective = data; this.mViewModel.repeatMode = this.mViewModel.isEffective ? this.mPrevReapMode : DoNotDisturbType.TYPE_NONE; if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_NONE) { this.mViewModel.refreshDate.bind(this.mViewModel)(this.mViewModel.repeatMode, diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index 9564aded..def21a77 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -24,7 +24,7 @@ export default struct SwitchComponent { private initializationAction: (params?) => Promise private settingAction: (params?) => void private register?: (listener) => void - @State initState: boolean= false + @State initState: boolean = false build() { Flex({ justifyContent: FlexAlign.SpaceBetween }) { @@ -62,6 +62,7 @@ export default struct SwitchComponent { this.settingAction(data); }) } + .height($r('app.float.switchComp_height')) .alignItems(VerticalAlign.Center) .align(Alignment.End) .padding({ right: $r('app.float.switchComp_padding_r') }) diff --git a/features/managementcomponent/src/main/resources/base/element/float.json b/features/managementcomponent/src/main/resources/base/element/float.json index e10ef789..fbd8a9cb 100644 --- a/features/managementcomponent/src/main/resources/base/element/float.json +++ b/features/managementcomponent/src/main/resources/base/element/float.json @@ -162,15 +162,15 @@ }, { "name": "toggle_comp_width", - "value": "54vp" + "value": "40vp" }, { "name": "toggle_comp_height", - "value": "36vp" + "value": "22vp" }, { "name": "toggle_check_width", - "value": "24vp" + "value": "20vp" }, { "name": "divider_stroke_width", diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index cd626cf1..c8cf854c 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -46,7 +46,6 @@ const TAG_StatusBarBackground = 'StatusBarBackground' @Component export default struct StatusBarComponent { private mStatusBarComponentConfig: StatusBarConfig - @StorageLink('StatusBarLayout') mStatusBarLayout: StringArray[] = [new StringArray(), new StringArray(), new StringArray()] @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() private moduleName: string = '' @@ -54,7 +53,6 @@ export default struct StatusBarComponent { AppStorage.SetOrCreate('size', $r("app.float.status_bar_margin_left_right")); Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`); this.initViewModel(this.moduleName); - Log.showInfo(TAG, `aboutToAppear Start, mStatusBarLayout: ${JSON.stringify(this.mStatusBarLayout)}`); } aboutToDisappear() { @@ -72,17 +70,17 @@ export default struct StatusBarComponent { if (this.mStatusBarData.showHorizontal) { Row() { StatusBarGroup({ - mComponents: this.mStatusBarLayout[0], + index: 0, mLayoutWeight: 1, mAlignItems: HorizontalAlign.Start }) StatusBarGroup({ - mComponents: this.mStatusBarLayout[1], + index: 1, mLayoutWeight: 0, mAlignItems: HorizontalAlign.Center }) StatusBarGroup({ - mComponents: this.mStatusBarLayout[2], + index: 2, mLayoutWeight: 1, mAlignItems: HorizontalAlign.End }) @@ -93,17 +91,17 @@ export default struct StatusBarComponent { } else { Column() { StatusBarGroup({ - mComponents: this.mStatusBarLayout[0], + index: 0, mLayoutWeight: 1, mAlignItems: VerticalAlign.Center }) StatusBarGroup({ - mComponents: this.mStatusBarLayout[1], + index: 1, mLayoutWeight: 0, mAlignItems: VerticalAlign.Center }) StatusBarGroup({ - mComponents: this.mStatusBarLayout[2], + index: 2, mLayoutWeight: 1, mAlignItems: VerticalAlign.Center }) @@ -165,15 +163,12 @@ struct StatusBarBackground { @Component struct StatusBarGroup { - @State mComponents: StringArray = new StringArray() + @StorageLink('StatusBarLayout') mStatusBarLayout: string[][] = [[], [], []] private mLayoutWeight: number = 1 private mAlignItems: any = HorizontalAlign.Center; + private index: number = -1; @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() - mComponentsChange() { - Log.showInfo(TAG_StatusBarGroup, `CCCC mComponentsChange, mComponents: ${JSON.stringify(this.mComponents)}`); - } - aboutToAppear() { Log.showInfo(TAG_StatusBarGroup, `aboutToAppear, mLayoutWeight: ${this.mLayoutWeight} mAlignItems: ${this.mAlignItems} `); } @@ -186,7 +181,7 @@ struct StatusBarGroup { if (this.mStatusBarData.showHorizontal) { Column() { Row() { - ForEach(this.mComponents, (componentName: string) => { + ForEach(this.mStatusBarLayout[this.index], (componentName: string) => { StatusBarItemLoadComponent({ mComponentName: componentName }) @@ -199,7 +194,7 @@ struct StatusBarGroup { } else { Row() { Column() { - ForEach(this.mComponents, (componentName: string) => { + ForEach(this.mStatusBarLayout[this.index], (componentName: string) => { VerticalStatusBarItemLoadComponent({ mComponentName: componentName }) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index abdde848..b5f52787 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -41,7 +41,7 @@ export class StringArray extends Array {} export class StatusBarVM { mIsStart = false; - mStatusBarLayout: StringArray[] = [new StringArray(), new StringArray(), new StringArray()]; + mStatusBarLayout: string[][] = [[], [], []]; mStatusBarEmptyWidth; mUseCount = 0; mStatusBarEnable = true; @@ -109,12 +109,7 @@ export class StatusBarVM { Log.showInfo(TAG, `setStatusBarLayout, layout: ${JSON.stringify(layout)}`); for (let i = 0;i < layout.length; i++) { if (JSON.stringify(layout[i]) != JSON.stringify(this.mStatusBarLayout[i])) { - for (let j = 0; j < layout[i].length; j++) { - if (this.mStatusBarLayout[i].indexOf(layout[i][j]) < 0) { - this.mStatusBarLayout[i].push(layout[i][j]) - Log.showInfo(TAG, `setStatusBarLayout, addItem: ${layout[i][j]}`); - } - } + this.mStatusBarLayout[i] = layout[i]; } } Log.showInfo(TAG, `setStatusBarLayout, mStatusBarLayout: ${JSON.stringify(this.mStatusBarLayout)}`); diff --git a/product/default/navigationBar/src/main/module.json5 b/product/default/navigationBar/src/main/module.json5 index eb49e1ec..81d7a68b 100644 --- a/product/default/navigationBar/src/main/module.json5 +++ b/product/default/navigationBar/src/main/module.json5 @@ -9,6 +9,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "deliveryWithInstall": true, "installationFree": false, "uiSyntax": "ets", diff --git a/product/default/notificationmanagement/src/main/module.json5 b/product/default/notificationmanagement/src/main/module.json5 index 15a4fcb7..27fe683a 100644 --- a/product/default/notificationmanagement/src/main/module.json5 +++ b/product/default/notificationmanagement/src/main/module.json5 @@ -9,6 +9,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "deliveryWithInstall": true, "installationFree": false, "uiSyntax": "ets", diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 4c58eadc..3ed6b4bf 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -22,6 +22,8 @@ import AbilityManager from '../../../../../../../common/src/main/ets/default/abi import VolumeWindowController from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController'; const TAG = 'VolumePanel_ServiceExtAbility'; +const realWidth = 48; +const realHeight = 284; class ServiceExtAbility extends ServiceExtension { onCreate(want: Want): void { @@ -39,15 +41,36 @@ class ServiceExtAbility extends ServiceExtension { width: dis.width, height: dis.height, }); - WindowManager.createWindow(this.context, WindowType.VOLUME_PANEL, volumeRect, 'pages/index') - .then((win) => { - Log.showInfo(TAG, 'onCreate, createWindow callback'); - VolumeWindowController.getInstance().setWindowHandle(win); - }) + WindowManager.createWindow(this.context, WindowType.VOLUME_PANEL, volumeRect, 'pages/index').then((win) => { + Log.showInfo(TAG, 'onCreate, createWindow callback'); + VolumeWindowController.getInstance().setWindowHandle(win); + }) .catch((err) => Log.showError(TAG, `Can't create window, err:${JSON.stringify(err)}`)); }).then(() => { }).catch((err) => { }); + + display.on("change", (id) => { + let volumeRect + Log.showInfo(TAG, "display change, data: " + JSON.stringify(id)) + display.getDefaultDisplay().then((configInfo) => { + volumeRect = { + left: configInfo.width - vp2px(16) - vp2px(realWidth), + top: (configInfo.height - vp2px(realHeight) ) / 2, + width: vp2px(realWidth) , + height: vp2px(realHeight) + }; + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'rect', volumeRect); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis', { + width: configInfo.width, + height: configInfo.height, + }); + }).then(() => { + WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); + }).catch((err) => { + }); + }) + } onDestroy(): void { diff --git a/product/default/volumepanel/src/main/module.json5 b/product/default/volumepanel/src/main/module.json5 index e7375c1c..6afff359 100644 --- a/product/default/volumepanel/src/main/module.json5 +++ b/product/default/volumepanel/src/main/module.json5 @@ -9,6 +9,12 @@ "default", "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "deliveryWithInstall": true, "installationFree": false, "uiSyntax": "ets", diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index 8ce3b307..d10bf40c 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -71,7 +71,11 @@ struct Index { } onPageShow() { - this.showAnimation(); + Log.showInfo(TAG, `onPageShow`) + } + + onPageHide() { + Log.showInfo(TAG, `onPageHide`) } aboutToDisappear() { @@ -125,7 +129,7 @@ struct Index { initWindowPolicy() { Log.showDebug(TAG, `init controlcenter panel window Policy`); this.mClearCallbacks.push( - EventManager.subscribe(SHOW_EVENT, () => WindowManager.showWindow(WindowType.CONTROL_PANEL)), + EventManager.subscribe(SHOW_EVENT, () => this.showWindow()), EventManager.subscribe(HIDE_EVENT, () => this.hideWindow()), EventManager.subscribe(START_ABILITY_EVENT, () => this.hideWindow()), EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => { @@ -136,7 +140,7 @@ struct Index { }), EventManager.subscribe('ControlWindowResizeEvent',async (args) => { let { windowName, rect } = args; - let dis = await display.getDefaultDisplay(); + let dis = await display.getDefaultDisplaySync(); Log.showInfo(TAG, `ControlWindowResizeEvent: ${windowName}, isShow: ${rect}`); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'rect', rect); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'dis', { @@ -210,6 +214,11 @@ struct Index { this.hideAnimation(); } + showWindow() { + WindowManager.showWindow(WindowType.CONTROL_PANEL) + this.showAnimation(); + } + onModeChange(isEdit) { Log.showDebug(TAG, `onModeChange, isEdit: ${isEdit}`) let initRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'rect') diff --git a/product/pc/controlpanel/src/main/module.json5 b/product/pc/controlpanel/src/main/module.json5 index 17c442a0..317c2960 100644 --- a/product/pc/controlpanel/src/main/module.json5 +++ b/product/pc/controlpanel/src/main/module.json5 @@ -8,6 +8,12 @@ "deviceTypes": [ "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "deliveryWithInstall": true, "installationFree": false, "uiSyntax": "ets", diff --git a/product/pc/notificationpanel/src/main/ets/pages/index.ets b/product/pc/notificationpanel/src/main/ets/pages/index.ets index 4de47d30..cfd9129e 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/index.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/index.ets @@ -50,7 +50,6 @@ struct Index { onPageShow() { Log.showInfo(TAG, `onPageShow`) - this.showAnimation(); } onPageHide() { @@ -98,7 +97,7 @@ struct Index { initWindowPolicy() { Log.showDebug(TAG, `init notification panel window Policy`); this.mClearCallbacks.push( - EventManager.subscribe(SHOW_EVENT, () => WindowManager.showWindow(WindowType.NOTIFICATION_PANEL)), + EventManager.subscribe(SHOW_EVENT, () => this.showWindow()), EventManager.subscribe(HIDE_EVENT, () => this.hideWindow()), EventManager.subscribe(START_ABILITY_EVENT, () => this.hideWindow()), EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => { @@ -109,7 +108,7 @@ struct Index { }), EventManager.subscribe('NotificationWindowResizeEvent',async (args) => { let { windowName, rect } = args; - let dis = await display.getDefaultDisplay(); + let dis = await display.getDefaultDisplaySync(); Log.showInfo(TAG, `NotificationWindowResizeEvent: ${windowName}, isShow: ${rect}`); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'rect', rect); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'dis', { @@ -183,4 +182,10 @@ struct Index { Log.showInfo(TAG, `do hide window.`); this.hideAnimation(); } + + showWindow() { + Log.showInfo(TAG, `do show window.`); + WindowManager.showWindow(WindowType.NOTIFICATION_PANEL) + this.showAnimation() + } } diff --git a/product/pc/notificationpanel/src/main/module.json5 b/product/pc/notificationpanel/src/main/module.json5 index 0dfd18fd..59e2addb 100644 --- a/product/pc/notificationpanel/src/main/module.json5 +++ b/product/pc/notificationpanel/src/main/module.json5 @@ -8,6 +8,12 @@ "deviceTypes": [ "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "deliveryWithInstall": true, "installationFree": false, "uiSyntax": "ets", diff --git a/product/pc/statusbar/src/main/module.json5 b/product/pc/statusbar/src/main/module.json5 index 9d39c446..b753e17e 100644 --- a/product/pc/statusbar/src/main/module.json5 +++ b/product/pc/statusbar/src/main/module.json5 @@ -8,6 +8,12 @@ "deviceTypes": [ "tablet" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "deliveryWithInstall": true, "installationFree": false, "uiSyntax": "ets", -- Gitee From b774b50eb6f2697e1bfe5c1f6fa7666b493b0848 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Thu, 8 Dec 2022 20:07:16 +0800 Subject: [PATCH 305/373] =?UTF-8?q?=E8=A7=A3=E5=86=B3=EF=BC=9A=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E7=AE=A1=E7=90=86=E7=9A=84=E5=9B=BE=E6=A0=87=E8=B6=85?= =?UTF-8?q?=E5=87=BA=E8=BE=B9=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../src/main/ets/com/ohos/view/component/appLstComponent.ets | 1 + 1 file changed, 1 insertion(+) diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets index 6f80cf27..a97985ef 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets @@ -78,6 +78,7 @@ export default struct AppLstComponent { .border({ width: $r('app.float.border_width'), color: Color.White, radius: $r('app.float.border_radius') }) .backgroundColor(Color.White) + .clip(true) .padding({ left: $r('app.float.itemComp_padding_l'), right: $r('app.float.itemComp_padding_r') -- Gitee From f913bef2e8cddda4cb58a1cb0317010cd38f4b07 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Wed, 28 Dec 2022 10:36:03 +0800 Subject: [PATCH 306/373] =?UTF-8?q?=E5=88=87=E6=8D=A2=E9=97=AA=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../ets/com/ohos/noticeItem/common/CommonUtil.ts | 2 +- .../com/ohos/noticeItem/view/item/groupItem.ets | 2 +- .../ohos/noticeItem/view/item/notificationItem.ets | 2 +- .../main/ets/com/ohos/view/component/wallpaper.ets | 14 +++++++++----- product/pc/src/main/ets/pages/slidescreenlock.ets | 4 +--- .../phone/src/main/ets/pages/slidescreenlock.ets | 6 ++---- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts index f572af90..be6255bd 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -19,7 +19,7 @@ import WantAgent from '@ohos.wantAgent'; const TAG = 'CommonUtil'; const DEFAULT_INFO = { code: 0, - want: '', + want: {}, permission: '', extraInfo: {} }; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 12ee8e47..964c336b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -81,7 +81,7 @@ export default struct GroupItem { .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) .clip(true) .scrollable(ScrollDirection.Horizontal) - .scrollBar(BarState.On) + .scrollBar(BarState.Off) .onScroll(() => { let accuracy = 0.1 let newOpacity = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize() diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index bd61783f..e6680e0c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -45,7 +45,7 @@ export default struct NotificationItem { } } .scrollable(ScrollDirection.Horizontal) - .scrollBar(BarState.On) + .scrollBar(BarState.Off) .onScroll(() => { let accuracy = 0.1 let newOpacity = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize() diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets b/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets index 9d52c981..36cb18b5 100644 --- a/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets +++ b/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets @@ -16,12 +16,14 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import ViewModel from '../../vm/wallpaperViewModel' import Constants from '../../common/constants' +import Trace from '../../../../../../../../../common/src/main/ets/default/Trace' const TAG = 'ScreenLock-Wallpaper' @Component export default struct Wallpaper { @State mViewModel: ViewModel = new ViewModel() + @StorageLink('isWallpaperShow') isWallpaperShow: boolean = true aboutToAppear() { Log.showInfo(TAG, "aboutToAppear") @@ -34,10 +36,12 @@ export default struct Wallpaper { } build() { - Image(this.mViewModel.getWallpaperData()) - .width(Constants.FULL_CONTAINER_WIDTH) - .height(Constants.FULL_CONTAINER_HEIGHT) - .objectFit(ImageFit.Cover) - .hoverEffect(HoverEffect.None) + if (this.isWallpaperShow === true) { + Image(this.mViewModel.getWallpaperData()) + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + .objectFit(ImageFit.Cover) + .hoverEffect(HoverEffect.None) + } } } \ No newline at end of file diff --git a/product/pc/src/main/ets/pages/slidescreenlock.ets b/product/pc/src/main/ets/pages/slidescreenlock.ets index 76016cd4..dacad493 100644 --- a/product/pc/src/main/ets/pages/slidescreenlock.ets +++ b/product/pc/src/main/ets/pages/slidescreenlock.ets @@ -57,9 +57,7 @@ export default struct SlideScreenlock { build() { Stack({ alignContent: Alignment.Bottom }) { Column() { - if (this.isWallpaperShow === true) { - Wallpaper() - } + Wallpaper() } .backgroundColor($r('app.color.screenlock_backgroundcolor')) .width(Constants.FULL_CONTAINER_WIDTH) diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets index ea71598f..86375f12 100644 --- a/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -54,9 +54,7 @@ export default struct SlideScreenlock { build() { Stack({ alignContent: Alignment.Bottom }) { Column() { - if (this.isWallpaperShow === true) { - Wallpaper() - } + Wallpaper() } .backgroundColor($r('app.color.screenlock_backgroundcolor')) .width(Constants.FULL_CONTAINER_WIDTH) @@ -81,7 +79,7 @@ export default struct SlideScreenlock { .onAreaChange((e, e2) => { Log.showDebug(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); }) - } + } Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { Column() { -- Gitee From a688019eb87459b6243bb51b7578c248c06a7fee Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Fri, 6 Jan 2023 18:09:37 +0800 Subject: [PATCH 307/373] =?UTF-8?q?=E8=93=9D=E5=8C=BA=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../src/main/ets/default/TintStateManager.ts | 4 +- entry/pc/src/main/module.json5 | 6 +++ entry/phone/src/main/module.json5 | 6 +++ .../com/ohos/pages/SimpleToggleComponent.ets | 49 ++++++++++--------- .../pages/SimpleToggleLayoutEditComponent.ets | 2 +- .../com/ohos/view/component/itemComponent.ets | 2 +- .../ohos/vm/noDisturbComponentViewModel.ts | 2 +- .../ets/com/ohos/model/RingModeService.ts | 4 +- .../ets/com/ohos/pages/IconItemComponent.ets | 2 +- .../ets/viewmodel/NavigationBarViewModel.ts | 18 ++++--- .../src/main/ets/pages/noDisturb.ets | 40 ++++++++------- .../ets/pages/notificationManagenment.ets | 3 +- .../src/main/ets/vm/noDisturbViewModel.ts | 1 + .../ServiceExtAbility/ServiceExtAbility.ts | 1 + .../controlpanel/src/main/ets/pages/index.ets | 2 +- .../src/main/ets/pages/index.ets | 2 +- 16 files changed, 83 insertions(+), 61 deletions(-) diff --git a/common/src/main/ets/default/TintStateManager.ts b/common/src/main/ets/default/TintStateManager.ts index fe462018..a71655b3 100644 --- a/common/src/main/ets/default/TintStateManager.ts +++ b/common/src/main/ets/default/TintStateManager.ts @@ -69,13 +69,13 @@ export default class TintStateManager { Log.showDebug(TAG, `unregistser ${windowType}, res: ${res}`); } - async onSystemBarTintChange(data): Promise { + onSystemBarTintChange(data): Promise { Log.showDebug(TAG, `onSystemBarTintChange, data: ${JSON.stringify(data)}`); if (!Array.isArray(data.regionTint)) { Log.showDebug(TAG, 'regionTint is not array.'); return; } - let dis = await display.getDefaultDisplay(); + let dis = display.getDefaultDisplaySync(); if (dis.id != data.displayId) { Log.showDebug(TAG, `Needn't change, displayId: ${data.displayId}`); return; diff --git a/entry/pc/src/main/module.json5 b/entry/pc/src/main/module.json5 index dba1a241..94a5243e 100644 --- a/entry/pc/src/main/module.json5 +++ b/entry/pc/src/main/module.json5 @@ -12,6 +12,12 @@ "installationFree": false, "uiSyntax": "ets", "pages": "$profile:main_pages", + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "extensionAbilities": [ { "visible": true, diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index cd0ec776..5aa8dde8 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -12,6 +12,12 @@ "installationFree": false, "uiSyntax": "ets", "pages": "$profile:main_pages", + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "extensionAbilities": [ { "visible": true, diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index bf931a3a..d28177d5 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -48,31 +48,32 @@ export default struct SimpleToggleComponent { build() { Column() { - if (this.mItemData.get().pluginType == PluginType.META) { - SimpleToggleBase({ - mToggleId: this.keyId, - mIcon: $mDefaultIcon, - mIconStr: this.mItemData.get().iconUrl, - mUseIconStr: true, - mChangeSwitch: $mDefaultChangeSwitch, - mLabel: $mDefaultLabel, - mLabelStr: this.mItemData.get().label, - mUseLabelStr: true, - mEditMode: this.mEditMode, - mDragMode: this.mDragMode, - mClickEvent: () => this.onIconItemClick(), - mLongClickEvent: () => this.onIconItemLongPressGesture() - }) - } else if (this.mItemData.get().pluginType == PluginType.DATA_ABILITY) { - // TODO: - } else if (this.mItemData.get().pluginType == PluginType.PLUGIN_COMPONENT) { - PluginIconItemComponent({ - keyId: this.keyId, - mEditMode: this.mEditMode, - mDragMode: this.mDragMode - }) + if (this.keyId != ""){ + if (this.mItemData.get().pluginType == PluginType.META) { + SimpleToggleBase({ + mToggleId: this.keyId, + mIcon: $mDefaultIcon, + mIconStr: this.mItemData.get().iconUrl, + mUseIconStr: true, + mChangeSwitch: $mDefaultChangeSwitch, + mLabel: $mDefaultLabel, + mLabelStr: this.mItemData.get().label, + mUseLabelStr: true, + mEditMode: this.mEditMode, + mDragMode: this.mDragMode, + mClickEvent: () => this.onIconItemClick(), + mLongClickEvent: () => this.onIconItemLongPressGesture() + }) + } else if (this.mItemData.get().pluginType == PluginType.DATA_ABILITY) { + // TODO: + } else if (this.mItemData.get().pluginType == PluginType.PLUGIN_COMPONENT) { + PluginIconItemComponent({ + keyId: this.keyId, + mEditMode: this.mEditMode, + mDragMode: this.mDragMode + }) + } } - } .width('100%') .height('100%') diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets index 9aaea1b7..ed251f09 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets @@ -310,7 +310,7 @@ export default struct SimpleToggleLayoutEditComponent { onComponentTouch(event: TouchEvent) { Log.showDebug(TAG, `onComponentTouch`); - // event.stopPropagation(); TODO + event.stopPropagation(); } } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets index ba84a243..185e8e24 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets @@ -17,7 +17,7 @@ import ConfigData from '../../common/constants'; @Component export default struct ItemComponent { @Link title: Resource; - @State value: string = ''; + @Link value: ResourceStr; @Link arrow: Resource; build() { diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts index 089c1419..0709dd5c 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts @@ -27,7 +27,7 @@ export default class NoDisturbComponentViewModel { startTime = ''; endTime = ''; repeatMode = 0; - repeatName: any = ''; + repeatName: Resource | string = ''; prompt = ''; isEffective = true; nextDayLabel = ''; diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts index 3f1242d0..b77c86ae 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts @@ -31,14 +31,14 @@ export class RingModeService { mListeners = new Set(); mAudioManager: any; - startService(): void { + async startService(): Promise { if (this.mIsStart) { return; } Log.showInfo(TAG, 'startService'); this.mIsStart = true; - this.mAudioManager = getAudioManager(); + this.mAudioManager = await getAudioManager().getVolumeManager().getVolumeGroupManager(audio.DEFAULT_VOLUME_GROUP_ID); this.getRingerMode(); diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index 1cc894c2..56d761e9 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -133,7 +133,7 @@ export default struct IconItemComponent { onIconItemTouch(event: TouchEvent) { Log.showInfo(TAG, `onIconItemTouch, event: ${JSON.stringify(event)}`); if (this.mItemData.get()?.actionData?.clickAction || this.mItemData.get()?.actionData?.longClickAction) { - // event.stopPropagation() + event.stopPropagation() } } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index b7ae6b05..c9b6ce0f 100644 --- a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -160,17 +160,19 @@ export default class NavigationBarViewModel { private windowSwitches(navigationBarStatusValue: string): void { this.isDisplay = navigationBarStatusValue == '1' ? true : false; - if (!this.isDisplay) { + if (!this.isDisplay || !this.mNavigationBarComponentData.isEnable) { //For gesture navigation scenarios //Systemui hides the navigation bar,and then notifies the launcher that it can start moving down the dock bar. WindowManager.hideWindow(WindowType.NAVIGATION_BAR).then(() => { - commonEvent.publish(NAVIGATIONBAR_HIDE_EVENT, (err) => { - if (err.code) { - Log.showError(TAG, `${NAVIGATIONBAR_HIDE_EVENT} PublishCallBack err: ${JSON.stringify(err)}`); - } else { - Log.showInfo(TAG, `${NAVIGATIONBAR_HIDE_EVENT} Publish sucess`); - } - }) + if(!this.isDisplay){ + commonEvent.publish(NAVIGATIONBAR_HIDE_EVENT, (err) => { + if (err.code) { + Log.showError(TAG, `${NAVIGATIONBAR_HIDE_EVENT} PublishCallBack err: ${JSON.stringify(err)}`); + } else { + Log.showInfo(TAG, `${NAVIGATIONBAR_HIDE_EVENT} Publish sucess`); + } + }) + } }).catch((err) => { Log.showError(TAG, `${NAVIGATIONBAR_HIDE_EVENT} Publish catch err: ${JSON.stringify(err)}`); }); diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index dfa42721..7025f50e 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -30,7 +30,7 @@ const GROUP_REPEAT_MODE = 'repeatMode'; @Entry @Component export default struct NoDisturb { - @State mViewModel: ViewModel = new ViewModel(); + @State@Watch("onChange") mViewModel: ViewModel = new ViewModel(); @State headName:Resource = $r('app.string.noDisturb'); @State repeatTitle:Resource = $r('app.string.repeat'); @State startDateTitle:Resource = $r('app.string.startDate'); @@ -38,9 +38,22 @@ export default struct NoDisturb { @State startTitle:Resource = $r('app.string.startTime'); @State endTitle:Resource = $r('app.string.endTime'); @State arrow: Resource = $r('app.media.ic_settings_arrow'); - @State mRefreshCnt: number = 0; + @State repeatName : ResourceStr = this.mViewModel.repeatName + @State startDateClue : string = this.mViewModel.startDateClue + @State startTimeClue : string = this.mViewModel.startTimeClue + @State endDateClue : string = this.mViewModel.endDateClue + @State endTimeClue : string = this.mViewModel.endTimeClue mPrevData: string = ''; + onChange() { + this.repeatName = this.mViewModel.repeatName + this.startDateClue = this.mViewModel.startDateClue + this.startTimeClue = this.mViewModel.startTimeClue + this.endDateClue = this.mViewModel.endDateClue + this.endTimeClue = this.mViewModel.endTimeClue + Log.showInfo(TAG, `mViewModel onChange repeatName: ${this.mViewModel.repeatName} startDateClue: ${this.mViewModel.startDateClue} + endDateClue: ${this.mViewModel.endDateClue} endTimeClue: ${this.mViewModel.endTimeClue}`) + } startDateDialogController: CustomDialogController = new CustomDialogController({ builder: DateDialog({ action:(data)=> this.setStartDate(data), @@ -109,11 +122,10 @@ export default struct NoDisturb { Row() { Column() { HeadComponent({ headName: $headName, isActive: true }) - if (this.mRefreshCnt > 0) { Row() { ItemComponent({ title: $repeatTitle, - value: this.mViewModel.repeatName, + value: $repeatName, arrow: $arrow }) }.onClick(() => { @@ -126,7 +138,7 @@ export default struct NoDisturb { Row() { ItemComponent({ title: $startDateTitle, - value: this.mViewModel.startDateClue, + value: $startDateClue, arrow: $arrow }) }.onClick(() => { @@ -137,7 +149,7 @@ export default struct NoDisturb { Row() { ItemComponent({ title: $startTitle, - value: this.mViewModel.startTimeClue, + value: $startTimeClue, arrow: $arrow }) }.onClick(() => { @@ -162,7 +174,7 @@ export default struct NoDisturb { Row() { ItemComponent({ title: $endDateTitle, - value: this.mViewModel.endDateClue, + value: $endDateClue, arrow: $arrow }) }.onClick(() => { @@ -173,7 +185,7 @@ export default struct NoDisturb { Row() { ItemComponent({ title: $endTitle, - value: this.mViewModel.endTimeClue, + value: $endTimeClue, arrow: $arrow }) }.onClick(() => { @@ -197,7 +209,7 @@ export default struct NoDisturb { Row() { ItemComponent({ title: $startTitle, - value: this.mViewModel.startTimeClue, + value: $startTimeClue, arrow: $arrow }) }.onClick(() => { @@ -207,7 +219,7 @@ export default struct NoDisturb { Row() { ItemComponent({ title: $endTitle, - value: this.mViewModel.endTimeClue, + value: $endTimeClue, arrow: $arrow }) }.onClick(() => { @@ -215,7 +227,6 @@ export default struct NoDisturb { this.endTimeDialogController.open() }).margin({ bottom: $r('app.float.itemComp_margin_b')}) } - } } .width(ConfigData.WH_100_100) .height(ConfigData.WH_100_100) @@ -241,12 +252,10 @@ export default struct NoDisturb { setRepeatMode(data: number) { this.mViewModel.onRepeatModeAccect(data); - this.mRefreshCnt++; } setStartDate(data: string) { let dataSource = this.mViewModel.setDateIntoDateTime(this.mViewModel.defaultStartTime, data); this.mViewModel.onStartTimeAccept(dataSource); - this.mRefreshCnt++; } setStartTime(data: string) { let dataSource = data; @@ -256,12 +265,10 @@ export default struct NoDisturb { dataSource = this.mPrevData; } this.mViewModel.onStartTimeAccept(dataSource); - this.mRefreshCnt++; } setEndDate(data: string) { let dataSource = this.mViewModel.setDateIntoDateTime(this.mViewModel.defaultEndTime, data); this.mViewModel.onEndTimeAccept(dataSource); - this.mRefreshCnt++; } setEndTime(data: string) { let dataSource = data; @@ -271,15 +278,12 @@ export default struct NoDisturb { dataSource = this.mPrevData; } this.mViewModel.onEndTimeAccept(dataSource); - this.mRefreshCnt++; } aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.viewModelInit() - this.mRefreshCnt++; - } onBackPress() { diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index 1353f9f2..bd1cac65 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -36,6 +36,7 @@ export default struct notificationManagenment { @State headName: Resource = $r('app.string.notification') @State title: Resource = $r('app.string.batch_Management') @State arrow: Resource= $r('app.media.ic_settings_arrow') + @State itemStr: string = '' @State allowDistribut: Resource = $r('app.string.allowDistribut') @State allowDistributDescribe: Resource = $r('app.string.allowDistributDescribe') @@ -143,7 +144,7 @@ export default struct notificationManagenment { .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) Row() { - ItemComponent({ title: $title, value: '', arrow: $arrow }) + ItemComponent({ title: $title, value: $itemStr, arrow: $arrow }) }.onClick(() => { Log.showDebug(TAG, `BatchManagement on click`) Router.push({ uri: 'pages/batchSetEnable' }); diff --git a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts index b20d7c03..21a2e1a8 100644 --- a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts @@ -22,6 +22,7 @@ import FeaturesConfigData, {DoNotDisturbType} from '../../../../../../../feature const TAG = 'NotificationManagement-NoDisturbViewModel'; const CONST_DAY_LENGTH = 24*3600*1000; +@Observed export default class NoDisturbViewModel extends NoDisturbComponentViewModel { startDateClue = ''; diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 3ed6b4bf..74446999 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -66,6 +66,7 @@ class ServiceExtAbility extends ServiceExtension { height: configInfo.height, }); }).then(() => { + Log.showInfo(TAG, `Spike ==> ${JSON.stringify(volumeRect)}`); WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); }).catch((err) => { }); diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index d10bf40c..e76fea85 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -158,7 +158,7 @@ struct Index { if (windowInfo) { windowInfo.visibility ? this.hideWindow() - : WindowManager.showWindow(WindowType.CONTROL_PANEL); + : this.showWindow(); } }) ); diff --git a/product/pc/notificationpanel/src/main/ets/pages/index.ets b/product/pc/notificationpanel/src/main/ets/pages/index.ets index cfd9129e..4cf8c2c2 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/index.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/index.ets @@ -126,7 +126,7 @@ struct Index { if (windowInfo) { windowInfo.visibility ? this.hideWindow() - : WindowManager.showWindow(WindowType.NOTIFICATION_PANEL); + : this.showWindow(); } }) ); -- Gitee From 8598093c85b8e99ce6de7e56aaf58e19601b9782 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Fri, 6 Jan 2023 18:09:37 +0800 Subject: [PATCH 308/373] =?UTF-8?q?=E8=93=9D=E5=8C=BA=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../src/main/ets/default/TintStateManager.ts | 4 +- entry/pc/src/main/module.json5 | 6 +++ entry/phone/src/main/module.json5 | 6 +++ .../com/ohos/pages/SimpleToggleComponent.ets | 49 ++++++++++--------- .../pages/SimpleToggleLayoutEditComponent.ets | 2 +- .../com/ohos/view/component/itemComponent.ets | 2 +- .../ohos/vm/noDisturbComponentViewModel.ts | 2 +- .../ets/com/ohos/model/RingModeService.ts | 4 +- .../ets/com/ohos/pages/IconItemComponent.ets | 2 +- .../ets/viewmodel/NavigationBarViewModel.ts | 18 ++++--- .../src/main/ets/pages/noDisturb.ets | 40 ++++++++------- .../ets/pages/notificationManagenment.ets | 3 +- .../src/main/ets/vm/noDisturbViewModel.ts | 1 + .../ServiceExtAbility/ServiceExtAbility.ts | 1 + .../controlpanel/src/main/ets/pages/index.ets | 2 +- .../src/main/ets/pages/index.ets | 2 +- .../phone/dropdownpanel/src/main/module.json5 | 6 +++ product/phone/statusbar/src/main/module.json5 | 6 +++ 18 files changed, 95 insertions(+), 61 deletions(-) diff --git a/common/src/main/ets/default/TintStateManager.ts b/common/src/main/ets/default/TintStateManager.ts index fe462018..a71655b3 100644 --- a/common/src/main/ets/default/TintStateManager.ts +++ b/common/src/main/ets/default/TintStateManager.ts @@ -69,13 +69,13 @@ export default class TintStateManager { Log.showDebug(TAG, `unregistser ${windowType}, res: ${res}`); } - async onSystemBarTintChange(data): Promise { + onSystemBarTintChange(data): Promise { Log.showDebug(TAG, `onSystemBarTintChange, data: ${JSON.stringify(data)}`); if (!Array.isArray(data.regionTint)) { Log.showDebug(TAG, 'regionTint is not array.'); return; } - let dis = await display.getDefaultDisplay(); + let dis = display.getDefaultDisplaySync(); if (dis.id != data.displayId) { Log.showDebug(TAG, `Needn't change, displayId: ${data.displayId}`); return; diff --git a/entry/pc/src/main/module.json5 b/entry/pc/src/main/module.json5 index dba1a241..94a5243e 100644 --- a/entry/pc/src/main/module.json5 +++ b/entry/pc/src/main/module.json5 @@ -12,6 +12,12 @@ "installationFree": false, "uiSyntax": "ets", "pages": "$profile:main_pages", + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "extensionAbilities": [ { "visible": true, diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index cd0ec776..5aa8dde8 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -12,6 +12,12 @@ "installationFree": false, "uiSyntax": "ets", "pages": "$profile:main_pages", + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "extensionAbilities": [ { "visible": true, diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index bf931a3a..d28177d5 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -48,31 +48,32 @@ export default struct SimpleToggleComponent { build() { Column() { - if (this.mItemData.get().pluginType == PluginType.META) { - SimpleToggleBase({ - mToggleId: this.keyId, - mIcon: $mDefaultIcon, - mIconStr: this.mItemData.get().iconUrl, - mUseIconStr: true, - mChangeSwitch: $mDefaultChangeSwitch, - mLabel: $mDefaultLabel, - mLabelStr: this.mItemData.get().label, - mUseLabelStr: true, - mEditMode: this.mEditMode, - mDragMode: this.mDragMode, - mClickEvent: () => this.onIconItemClick(), - mLongClickEvent: () => this.onIconItemLongPressGesture() - }) - } else if (this.mItemData.get().pluginType == PluginType.DATA_ABILITY) { - // TODO: - } else if (this.mItemData.get().pluginType == PluginType.PLUGIN_COMPONENT) { - PluginIconItemComponent({ - keyId: this.keyId, - mEditMode: this.mEditMode, - mDragMode: this.mDragMode - }) + if (this.keyId != ""){ + if (this.mItemData.get().pluginType == PluginType.META) { + SimpleToggleBase({ + mToggleId: this.keyId, + mIcon: $mDefaultIcon, + mIconStr: this.mItemData.get().iconUrl, + mUseIconStr: true, + mChangeSwitch: $mDefaultChangeSwitch, + mLabel: $mDefaultLabel, + mLabelStr: this.mItemData.get().label, + mUseLabelStr: true, + mEditMode: this.mEditMode, + mDragMode: this.mDragMode, + mClickEvent: () => this.onIconItemClick(), + mLongClickEvent: () => this.onIconItemLongPressGesture() + }) + } else if (this.mItemData.get().pluginType == PluginType.DATA_ABILITY) { + // TODO: + } else if (this.mItemData.get().pluginType == PluginType.PLUGIN_COMPONENT) { + PluginIconItemComponent({ + keyId: this.keyId, + mEditMode: this.mEditMode, + mDragMode: this.mDragMode + }) + } } - } .width('100%') .height('100%') diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets index 9aaea1b7..ed251f09 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets @@ -310,7 +310,7 @@ export default struct SimpleToggleLayoutEditComponent { onComponentTouch(event: TouchEvent) { Log.showDebug(TAG, `onComponentTouch`); - // event.stopPropagation(); TODO + event.stopPropagation(); } } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets index ba84a243..185e8e24 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets @@ -17,7 +17,7 @@ import ConfigData from '../../common/constants'; @Component export default struct ItemComponent { @Link title: Resource; - @State value: string = ''; + @Link value: ResourceStr; @Link arrow: Resource; build() { diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts index 089c1419..0709dd5c 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts @@ -27,7 +27,7 @@ export default class NoDisturbComponentViewModel { startTime = ''; endTime = ''; repeatMode = 0; - repeatName: any = ''; + repeatName: Resource | string = ''; prompt = ''; isEffective = true; nextDayLabel = ''; diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts index 3f1242d0..b77c86ae 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts @@ -31,14 +31,14 @@ export class RingModeService { mListeners = new Set(); mAudioManager: any; - startService(): void { + async startService(): Promise { if (this.mIsStart) { return; } Log.showInfo(TAG, 'startService'); this.mIsStart = true; - this.mAudioManager = getAudioManager(); + this.mAudioManager = await getAudioManager().getVolumeManager().getVolumeGroupManager(audio.DEFAULT_VOLUME_GROUP_ID); this.getRingerMode(); diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index 1cc894c2..56d761e9 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -133,7 +133,7 @@ export default struct IconItemComponent { onIconItemTouch(event: TouchEvent) { Log.showInfo(TAG, `onIconItemTouch, event: ${JSON.stringify(event)}`); if (this.mItemData.get()?.actionData?.clickAction || this.mItemData.get()?.actionData?.longClickAction) { - // event.stopPropagation() + event.stopPropagation() } } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index b7ae6b05..c9b6ce0f 100644 --- a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -160,17 +160,19 @@ export default class NavigationBarViewModel { private windowSwitches(navigationBarStatusValue: string): void { this.isDisplay = navigationBarStatusValue == '1' ? true : false; - if (!this.isDisplay) { + if (!this.isDisplay || !this.mNavigationBarComponentData.isEnable) { //For gesture navigation scenarios //Systemui hides the navigation bar,and then notifies the launcher that it can start moving down the dock bar. WindowManager.hideWindow(WindowType.NAVIGATION_BAR).then(() => { - commonEvent.publish(NAVIGATIONBAR_HIDE_EVENT, (err) => { - if (err.code) { - Log.showError(TAG, `${NAVIGATIONBAR_HIDE_EVENT} PublishCallBack err: ${JSON.stringify(err)}`); - } else { - Log.showInfo(TAG, `${NAVIGATIONBAR_HIDE_EVENT} Publish sucess`); - } - }) + if(!this.isDisplay){ + commonEvent.publish(NAVIGATIONBAR_HIDE_EVENT, (err) => { + if (err.code) { + Log.showError(TAG, `${NAVIGATIONBAR_HIDE_EVENT} PublishCallBack err: ${JSON.stringify(err)}`); + } else { + Log.showInfo(TAG, `${NAVIGATIONBAR_HIDE_EVENT} Publish sucess`); + } + }) + } }).catch((err) => { Log.showError(TAG, `${NAVIGATIONBAR_HIDE_EVENT} Publish catch err: ${JSON.stringify(err)}`); }); diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index dfa42721..7025f50e 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -30,7 +30,7 @@ const GROUP_REPEAT_MODE = 'repeatMode'; @Entry @Component export default struct NoDisturb { - @State mViewModel: ViewModel = new ViewModel(); + @State@Watch("onChange") mViewModel: ViewModel = new ViewModel(); @State headName:Resource = $r('app.string.noDisturb'); @State repeatTitle:Resource = $r('app.string.repeat'); @State startDateTitle:Resource = $r('app.string.startDate'); @@ -38,9 +38,22 @@ export default struct NoDisturb { @State startTitle:Resource = $r('app.string.startTime'); @State endTitle:Resource = $r('app.string.endTime'); @State arrow: Resource = $r('app.media.ic_settings_arrow'); - @State mRefreshCnt: number = 0; + @State repeatName : ResourceStr = this.mViewModel.repeatName + @State startDateClue : string = this.mViewModel.startDateClue + @State startTimeClue : string = this.mViewModel.startTimeClue + @State endDateClue : string = this.mViewModel.endDateClue + @State endTimeClue : string = this.mViewModel.endTimeClue mPrevData: string = ''; + onChange() { + this.repeatName = this.mViewModel.repeatName + this.startDateClue = this.mViewModel.startDateClue + this.startTimeClue = this.mViewModel.startTimeClue + this.endDateClue = this.mViewModel.endDateClue + this.endTimeClue = this.mViewModel.endTimeClue + Log.showInfo(TAG, `mViewModel onChange repeatName: ${this.mViewModel.repeatName} startDateClue: ${this.mViewModel.startDateClue} + endDateClue: ${this.mViewModel.endDateClue} endTimeClue: ${this.mViewModel.endTimeClue}`) + } startDateDialogController: CustomDialogController = new CustomDialogController({ builder: DateDialog({ action:(data)=> this.setStartDate(data), @@ -109,11 +122,10 @@ export default struct NoDisturb { Row() { Column() { HeadComponent({ headName: $headName, isActive: true }) - if (this.mRefreshCnt > 0) { Row() { ItemComponent({ title: $repeatTitle, - value: this.mViewModel.repeatName, + value: $repeatName, arrow: $arrow }) }.onClick(() => { @@ -126,7 +138,7 @@ export default struct NoDisturb { Row() { ItemComponent({ title: $startDateTitle, - value: this.mViewModel.startDateClue, + value: $startDateClue, arrow: $arrow }) }.onClick(() => { @@ -137,7 +149,7 @@ export default struct NoDisturb { Row() { ItemComponent({ title: $startTitle, - value: this.mViewModel.startTimeClue, + value: $startTimeClue, arrow: $arrow }) }.onClick(() => { @@ -162,7 +174,7 @@ export default struct NoDisturb { Row() { ItemComponent({ title: $endDateTitle, - value: this.mViewModel.endDateClue, + value: $endDateClue, arrow: $arrow }) }.onClick(() => { @@ -173,7 +185,7 @@ export default struct NoDisturb { Row() { ItemComponent({ title: $endTitle, - value: this.mViewModel.endTimeClue, + value: $endTimeClue, arrow: $arrow }) }.onClick(() => { @@ -197,7 +209,7 @@ export default struct NoDisturb { Row() { ItemComponent({ title: $startTitle, - value: this.mViewModel.startTimeClue, + value: $startTimeClue, arrow: $arrow }) }.onClick(() => { @@ -207,7 +219,7 @@ export default struct NoDisturb { Row() { ItemComponent({ title: $endTitle, - value: this.mViewModel.endTimeClue, + value: $endTimeClue, arrow: $arrow }) }.onClick(() => { @@ -215,7 +227,6 @@ export default struct NoDisturb { this.endTimeDialogController.open() }).margin({ bottom: $r('app.float.itemComp_margin_b')}) } - } } .width(ConfigData.WH_100_100) .height(ConfigData.WH_100_100) @@ -241,12 +252,10 @@ export default struct NoDisturb { setRepeatMode(data: number) { this.mViewModel.onRepeatModeAccect(data); - this.mRefreshCnt++; } setStartDate(data: string) { let dataSource = this.mViewModel.setDateIntoDateTime(this.mViewModel.defaultStartTime, data); this.mViewModel.onStartTimeAccept(dataSource); - this.mRefreshCnt++; } setStartTime(data: string) { let dataSource = data; @@ -256,12 +265,10 @@ export default struct NoDisturb { dataSource = this.mPrevData; } this.mViewModel.onStartTimeAccept(dataSource); - this.mRefreshCnt++; } setEndDate(data: string) { let dataSource = this.mViewModel.setDateIntoDateTime(this.mViewModel.defaultEndTime, data); this.mViewModel.onEndTimeAccept(dataSource); - this.mRefreshCnt++; } setEndTime(data: string) { let dataSource = data; @@ -271,15 +278,12 @@ export default struct NoDisturb { dataSource = this.mPrevData; } this.mViewModel.onEndTimeAccept(dataSource); - this.mRefreshCnt++; } aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.viewModelInit() - this.mRefreshCnt++; - } onBackPress() { diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index 1353f9f2..bd1cac65 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -36,6 +36,7 @@ export default struct notificationManagenment { @State headName: Resource = $r('app.string.notification') @State title: Resource = $r('app.string.batch_Management') @State arrow: Resource= $r('app.media.ic_settings_arrow') + @State itemStr: string = '' @State allowDistribut: Resource = $r('app.string.allowDistribut') @State allowDistributDescribe: Resource = $r('app.string.allowDistributDescribe') @@ -143,7 +144,7 @@ export default struct notificationManagenment { .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) Row() { - ItemComponent({ title: $title, value: '', arrow: $arrow }) + ItemComponent({ title: $title, value: $itemStr, arrow: $arrow }) }.onClick(() => { Log.showDebug(TAG, `BatchManagement on click`) Router.push({ uri: 'pages/batchSetEnable' }); diff --git a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts index b20d7c03..21a2e1a8 100644 --- a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts @@ -22,6 +22,7 @@ import FeaturesConfigData, {DoNotDisturbType} from '../../../../../../../feature const TAG = 'NotificationManagement-NoDisturbViewModel'; const CONST_DAY_LENGTH = 24*3600*1000; +@Observed export default class NoDisturbViewModel extends NoDisturbComponentViewModel { startDateClue = ''; diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 3ed6b4bf..74446999 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -66,6 +66,7 @@ class ServiceExtAbility extends ServiceExtension { height: configInfo.height, }); }).then(() => { + Log.showInfo(TAG, `Spike ==> ${JSON.stringify(volumeRect)}`); WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); }).catch((err) => { }); diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index d10bf40c..e76fea85 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -158,7 +158,7 @@ struct Index { if (windowInfo) { windowInfo.visibility ? this.hideWindow() - : WindowManager.showWindow(WindowType.CONTROL_PANEL); + : this.showWindow(); } }) ); diff --git a/product/pc/notificationpanel/src/main/ets/pages/index.ets b/product/pc/notificationpanel/src/main/ets/pages/index.ets index cfd9129e..4cf8c2c2 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/index.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/index.ets @@ -126,7 +126,7 @@ struct Index { if (windowInfo) { windowInfo.visibility ? this.hideWindow() - : WindowManager.showWindow(WindowType.NOTIFICATION_PANEL); + : this.showWindow(); } }) ); diff --git a/product/phone/dropdownpanel/src/main/module.json5 b/product/phone/dropdownpanel/src/main/module.json5 index 32b2ca1b..f3ad86fe 100644 --- a/product/phone/dropdownpanel/src/main/module.json5 +++ b/product/phone/dropdownpanel/src/main/module.json5 @@ -8,6 +8,12 @@ "deviceTypes": [ "default" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "deliveryWithInstall": true, "installationFree": false, "uiSyntax": "ets", diff --git a/product/phone/statusbar/src/main/module.json5 b/product/phone/statusbar/src/main/module.json5 index adbb2868..2dd7de3f 100644 --- a/product/phone/statusbar/src/main/module.json5 +++ b/product/phone/statusbar/src/main/module.json5 @@ -8,6 +8,12 @@ "deviceTypes": [ "default" ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + } + ], "deliveryWithInstall": true, "installationFree": false, "uiSyntax": "ets", -- Gitee From 45cc3c0175a7d108ad526f9a7e2e53d41e9aa6b7 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Wed, 18 Jan 2023 11:39:05 +0800 Subject: [PATCH 309/373] =?UTF-8?q?=E8=93=9D=E5=8C=BA=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../default/abilitymanager/bundleManager.ts | 6 +++--- .../plugindatasource/common/BundleParseUtil.ts | 18 +++++++++--------- .../StatusBarIconItemLocationComponent.ets | 2 +- .../com/ohos/noticeItem/model/ParseDataUtil.ts | 3 ++- .../ets/pages/common/ControlCenterConfig.ts | 2 +- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ts b/common/src/main/ets/default/abilitymanager/bundleManager.ts index f62b829f..92f100f4 100644 --- a/common/src/main/ets/default/abilitymanager/bundleManager.ts +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import BundleMgr from "@ohos.bundle"; +import BundleMgr from "@ohos.bundle.bundleManager"; import Log from "../Log"; import SwitchUserManager from "../SwitchUserManager"; import AbilityManager from "./abilityManager"; @@ -64,11 +64,11 @@ export default class BundleManager { } static async getBundleInfo(tag: string, bundleName: string, getInfo?: any, requestId?: number) { - getInfo = getInfo ?? BundleMgr.BundleFlag.GET_BUNDLE_DEFAULT; + getInfo = getInfo ?? BundleMgr.BundleFlag.GET_BUNDLE_INFO_DEFAULT; let userInfo = { userId: requestId ?? (await SwitchUserManager.getInstance().getCurrentUserInfo()).userId, }; Log.showDebug(TAG, `getBundleInfo from: ${tag}, userId: ${userInfo.userId}`); - return await BundleMgr.getBundleInfo(bundleName, getInfo, userInfo); + return await BundleMgr.getBundleInfo(bundleName, getInfo, userInfo.userId); } } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts index b20e0921..e7447ff3 100644 --- a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts +++ b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import bundleManager from '@ohos.bundle'; +import bundleManager from '@ohos.bundle.bundleManager'; import commonEvent from '@ohos.commonEvent'; -import { AbilityInfo } from 'bundle/abilityInfo'; +import { AbilityInfo } from 'bundleManager/abilityInfo'; import { ExtensionAbilityInfo } from 'bundleManager/extensionAbilityInfo'; import { CustomizeData } from 'bundle/customizeData'; import { Metadata } from 'bundleManager/metadata'; @@ -42,7 +42,7 @@ export enum BundleEventType { const TAG = 'SourceLoader-BundleParseUtil'; const DEFAULT_BUNDLE_FLAG = - bundleManager.BundleFlag.GET_ABILITY_INFO_WITH_METADATA | bundleManager.BundleFlag.GET_ABILITY_INFO_WITH_PERMISSION; + bundleManager.AbilityFlag.GET_ABILITY_INFO_WITH_METADATA | bundleManager.AbilityFlag.GET_ABILITY_INFO_WITH_PERMISSION; const BUNDLE_SUBSCRIBE_INFO = { events: [ @@ -65,7 +65,7 @@ async function queryAbilityWithBundleName(action: string, userId: number, bundle Log.showInfo(TAG, `queryAbilityWithBundleName, action: ${action} bundleName: ${bundleName}`); let abilitys: AbilityInfo[] = []; try { - abilitys = await bundleManager.queryAbilityByWant( + abilitys = await bundleManager.queryAbilityInfo( { action: action, bundleName: bundleName, @@ -78,7 +78,7 @@ async function queryAbilityWithBundleName(action: string, userId: number, bundle } let extensionAbilitys: ExtensionAbilityInfo[] = []; try { - extensionAbilitys = await bundleManager.queryExtensionAbilityInfos( + extensionAbilitys = await bundleManager.queryExtensionAbilityInfo( { action: action, bundleName: bundleName, @@ -88,7 +88,7 @@ async function queryAbilityWithBundleName(action: string, userId: number, bundle userId ); } catch (error) { - Log.showError(TAG, `queryAbilityWithBundleName, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); + Log.showError(TAG, `queryAbilityWithBundleName, queryExtensionAbilityInfo error: ${JSON.stringify(error)}`); } Log.showDebug(TAG, 'queryAbilityWithBundleName, end'); let rets = [...abilitys, ...extensionAbilitys]; @@ -100,17 +100,17 @@ async function queryAbilityWithoutBundleName(action: string, userId: number): Pr Log.showInfo(TAG, `queryAbilityWithoutBundleName, action: ${action}`); let abilitys: AbilityInfo[] = []; try { - abilitys = await bundleManager.queryAbilityByWant({ action: action }, DEFAULT_BUNDLE_FLAG, userId); + abilitys = await bundleManager.queryAbilityInfo({ action: action }, DEFAULT_BUNDLE_FLAG, userId); } catch (error) { Log.showError(TAG, `queryAbilityWithoutBundleName, queryAbilityByWant error: ${JSON.stringify(error)}`); } let extensionAbilitys: ExtensionAbilityInfo[] = []; try { - extensionAbilitys = await bundleManager.queryExtensionAbilityInfos({ + extensionAbilitys = await bundleManager.queryExtensionAbilityInfo({ action: action }, bundleManager.ExtensionAbilityType.UNSPECIFIED, DEFAULT_BUNDLE_FLAG, userId); } catch (error) { - Log.showError(TAG, `queryAbilityWithoutBundleName, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); + Log.showError(TAG, `queryAbilityWithoutBundleName, queryExtensionAbilityInfo error: ${JSON.stringify(error)}`); } Log.showDebug(TAG, 'queryAbilityWithoutBundleName, end'); let rets = [...abilitys, ...extensionAbilitys]; diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets index 8639b3ed..63f02c78 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets @@ -25,7 +25,7 @@ const TAG = 'location-StatusBarIconItemLocationComponent'; @Component export default struct StatusBarIconItemLocationComponent { - @StorageLink('LocationServiceUseStatus') LocationServiceUseStatus: boolean = false; + @StorageLink('LocationVM_LocationData') LocationServiceUseStatus: boolean = false; @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); @State style: StartsBarLocationComponentStyle = StyleConfiguration.getStartsBarLocationComponentStyle(); @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle(); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index fabc550d..d1a74f50 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -15,6 +15,7 @@ */ import Notification from '@ohos.notification'; +import BundleMgr from "@ohos.bundle.bundleManager"; import AccountManager from '@ohos.account.osAccount'; import Log from '../../../../../../../../../common/src/main/ets/default/Log'; import BundleManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager'; @@ -103,7 +104,7 @@ export default class ParseDataUtil { Log.showInfo(TAG, 'getAppData success.'); return appDataMap.get(bundleName); } - let data = await BundleManager.getBundleInfo(TAG, bundleName, 0, userId); + let data = await BundleManager.getBundleInfo(TAG, bundleName, BundleMgr.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION, userId); let labelResource = data?.appInfo?.labelResource; let iconResource = data?.appInfo?.iconResource; let appMessage = { diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts index 35129327..1174c626 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts @@ -18,7 +18,7 @@ import { ControlCenterConfig const controlCenterConfig: ControlCenterConfig = { ComplexToggleLayout: [FASlotName.WIFI, FASlotName.BLUETOOTH], - DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION, 'demosystemuicplmeta', FASlotName.NFC], + DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION, 'demosystemuicplmeta', FASlotName.NFC, FASlotName.AUTO_ROTATE], LocalToggles: { ComplexToggles: [FASlotName.AIR_PLANE, FASlotName.BLUETOOTH, FASlotName.WIFI], SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE, FASlotName.NFC, FASlotName.AUTO_ROTATE], -- Gitee From 27c6e456e8774f5ef08dcd53b841c1cc74a10741 Mon Sep 17 00:00:00 2001 From: qimeng Date: Sat, 28 Jan 2023 16:00:18 +0800 Subject: [PATCH 310/373] =?UTF-8?q?=E5=8F=96=E6=B6=88=E9=94=81=E5=B1=8F?= =?UTF-8?q?=E8=A7=A3=E9=94=81=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: qimeng --- .../screenlock/src/main/ets/com/ohos/model/screenLockService.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 4419a33e..17a3f272 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -189,7 +189,6 @@ export class ScreenLockService { Log.showInfo(TAG, `had locked, no need to publish lock_screen`); } else { this.notifyLockScreenResult(LockResult.Success) - this.publishByUser("common.event.LOCK_SCREEN", this.accountModel.getCurrentUserId()); this.currentLockStatus = ScreenLockStatus.Locking; } }); @@ -279,7 +278,6 @@ export class ScreenLockService { Log.showInfo(TAG, `hiddenScreenLockWindow finish`); //notify the base service that the unlock is completed this.notifyUnlockScreenResult(UnlockResult.Success); - this.publishByUser("common.event.UNLOCK_SCREEN", this.accountModel.getCurrentUserId()); }); } -- Gitee From 949e9c9dd535d6249cc7a49ec4fcb05560ca374f Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Sat, 28 Jan 2023 17:52:23 +0800 Subject: [PATCH 311/373] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=88=AA=E5=B1=8F?= =?UTF-8?q?=E5=BC=80=E5=85=B3=E4=B8=8D=E8=B7=9F=E9=9A=8F=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- common/src/main/ets/template/SimpleToggleBase.ets | 2 +- .../main/ets/com/ohos/pages/SimpleToggleComponent.ets | 10 +++++++++- .../src/main/resources/base/element/string.json | 4 ++++ .../src/main/resources/en_US/element/string.json | 4 ++++ .../src/main/resources/zh_CN/element/string.json | 4 ++++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/template/SimpleToggleBase.ets index e1ff9c22..404383b8 100644 --- a/common/src/main/ets/template/SimpleToggleBase.ets +++ b/common/src/main/ets/template/SimpleToggleBase.ets @@ -27,7 +27,7 @@ export default struct SimpleToggleBase { private mAutoIconColor: boolean = false @Link mChangeSwitch: boolean @Link mLabel: Resource - @State mLabelStr: string = '' + private mLabelStr: string | Resource private mUseLabelStr: boolean = false private mIconOnBG: string | Resource private mEditMode: boolean = false diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index d28177d5..8b38ad9f 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -46,6 +46,14 @@ export default struct SimpleToggleComponent { Log.showDebug(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${this.mItemData.get().iconUrl}`); } + getLabel() { + switch (this.keyId) { + case 'screenshot': + return $r('app.string.control_center_simple_toggle_screenshot_mode_title') + } + return this.mItemData.get().label; + } + build() { Column() { if (this.keyId != ""){ @@ -57,7 +65,7 @@ export default struct SimpleToggleComponent { mUseIconStr: true, mChangeSwitch: $mDefaultChangeSwitch, mLabel: $mDefaultLabel, - mLabelStr: this.mItemData.get().label, + mLabelStr: this.getLabel(), mUseLabelStr: true, mEditMode: this.mEditMode, mDragMode: this.mDragMode, diff --git a/features/controlcentercomponent/src/main/resources/base/element/string.json b/features/controlcentercomponent/src/main/resources/base/element/string.json index 52c0d9f8..e910ecee 100644 --- a/features/controlcentercomponent/src/main/resources/base/element/string.json +++ b/features/controlcentercomponent/src/main/resources/base/element/string.json @@ -55,6 +55,10 @@ { "name": "control_center_simple_toggle_layout_edit_back_confirm_secondary", "value": "保存" + }, + { + "name": "control_center_simple_toggle_screenshot_mode_title", + "value": "截屏" } ] } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/en_US/element/string.json b/features/controlcentercomponent/src/main/resources/en_US/element/string.json index e0f69aa1..404048cb 100644 --- a/features/controlcentercomponent/src/main/resources/en_US/element/string.json +++ b/features/controlcentercomponent/src/main/resources/en_US/element/string.json @@ -55,6 +55,10 @@ { "name": "control_center_simple_toggle_layout_edit_back_confirm_secondary", "value": "SAVE" + }, + { + "name": "control_center_simple_toggle_screenshot_mode_title", + "value": "Screenshot" } ] } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json b/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json index 52c0d9f8..e910ecee 100644 --- a/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json +++ b/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json @@ -55,6 +55,10 @@ { "name": "control_center_simple_toggle_layout_edit_back_confirm_secondary", "value": "保存" + }, + { + "name": "control_center_simple_toggle_screenshot_mode_title", + "value": "截屏" } ] } \ No newline at end of file -- Gitee From 30cb2cdc3630b689f2c953d5f6611be7d8abf62b Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Mon, 30 Jan 2023 11:10:15 +0800 Subject: [PATCH 312/373] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=AE=E5=BA=A6?= =?UTF-8?q?=E8=B0=83=E8=8A=82=E9=97=AA=E7=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../src/main/ets/default/brightnessManager.ts | 13 +++++++------ .../main/ets/default/pages/brightnessComponent.ets | 8 +------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index 7b348ec9..555fcebe 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -33,6 +33,7 @@ export class brightnessManager { uri: string; context: Context; SLIDER_CHANG_MODE_MOVING = 1; + private sliderChangeMode: number; constructor() { this.uri = Constants.getUriSync(Constants.KEY_BRIGHTNESS_STATUS); @@ -51,6 +52,9 @@ export class brightnessManager { registerBrightness() { this.helper.on("dataChange", this.uri, () => { + if (this.sliderChangeMode == 1) { + return; + } let data = settings.getValueSync(this.context, Constants.KEY_BRIGHTNESS_STATUS, JSON.stringify(this.getDefault())); Log.showInfo(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); @@ -70,13 +74,10 @@ export class brightnessManager { mBrightnessValue.set(parseInt(data)); } - setValue(callback, sliderChangeMode:number) { - let value = parseInt(callback.value); + setValue(value: number, sliderChangeMode: number) { + this.sliderChangeMode = sliderChangeMode; Log.showInfo(TAG, `setValue ${value}`); - mBrightnessValue.set(value); - settings.setValueSync(this.context, Constants.KEY_BRIGHTNESS_STATUS, JSON.stringify(value)); - Log.showInfo(TAG, `setValue ${this.context}`); - Brightness.setValue(callback.value); + Brightness.setValue(value); } getMin(){ diff --git a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets index 22962d64..2725365a 100644 --- a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets +++ b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets @@ -38,11 +38,6 @@ export default struct MyBrightness { Log.showDebug(TAG, 'aboutToDisappear'); } - setBrightness(value, sliderChangeMode: number) { - Log.showInfo(TAG, `setBrightness = ${value}`); - mBrightnessManager.setValue(value, sliderChangeMode); - } - build() { Row() { Image($r('app.media.ic_brightness_reduce')) @@ -70,8 +65,7 @@ export default struct MyBrightness { .trackColor(this.style.sliderTrackColor) .selectedColor(this.style.sliderSelectedColor) .onChange((value: number, mode: SliderChangeMode) => { - this.brightnessItem.value = value; - this.setBrightness(this.brightnessItem, mode); + mBrightnessManager.setValue(value, mode); }) Image($r('app.media.ic_brightness_plus')) -- Gitee From b95fa821459bf7655a1987372575baf65c8fef29 Mon Sep 17 00:00:00 2001 From: fangzheng24 Date: Tue, 31 Jan 2023 11:25:34 +0800 Subject: [PATCH 313/373] =?UTF-8?q?fixed=2056f6531=20from=20https://gitee.?= =?UTF-8?q?com/fangzheng24/applications=5Fscreenlock/pulls/85=20=E9=80=82?= =?UTF-8?q?=E9=85=8D=E6=9C=80=E6=96=B0sdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: fangzheng24 --- entry/src/main/ets/Application/AbilityStage.ts | 2 +- entry/src/main/ets/MainAbility/MainAbility.ts | 2 +- product/pc/src/main/ets/Application/AbilityStage.ts | 2 +- product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- product/phone/src/main/ets/Application/AbilityStage.ts | 2 +- .../phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/entry/src/main/ets/Application/AbilityStage.ts b/entry/src/main/ets/Application/AbilityStage.ts index 577fcde6..78dd5641 100644 --- a/entry/src/main/ets/Application/AbilityStage.ts +++ b/entry/src/main/ets/Application/AbilityStage.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage"; +import AbilityStage from "@ohos.app.ability.AbilityStage"; import Log from '../../../../../common/src/main/ets/default/Log'; const TAG = "Entry_AbilityStage"; diff --git a/entry/src/main/ets/MainAbility/MainAbility.ts b/entry/src/main/ets/MainAbility/MainAbility.ts index 0478f1c8..087cfb48 100644 --- a/entry/src/main/ets/MainAbility/MainAbility.ts +++ b/entry/src/main/ets/MainAbility/MainAbility.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Ability from '@ohos.application.Ability' +import Ability from '@ohos.app.ability.UIAbility' import Log from '../../../../../common/src/main/ets/default/Log'; const TAG = "Entry_MainAbility"; diff --git a/product/pc/src/main/ets/Application/AbilityStage.ts b/product/pc/src/main/ets/Application/AbilityStage.ts index 7df13e65..a68556fb 100644 --- a/product/pc/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/src/main/ets/Application/AbilityStage.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" +import AbilityStage from "@ohos.app.ability.AbilityStage" import Log from '../../../../../../common/src/main/ets/default/Log' const TAG = "ScreenLock-MainAbilityStage" diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index d10d51a6..34e846b6 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility' +import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility' import windowManager from '@ohos.window' import WindowManagers, { WindowType } from "../../../../../../common/src/main/ets/default/WindowManager"; import display from '@ohos.display' diff --git a/product/phone/src/main/ets/Application/AbilityStage.ts b/product/phone/src/main/ets/Application/AbilityStage.ts index ef2476ea..86385225 100644 --- a/product/phone/src/main/ets/Application/AbilityStage.ts +++ b/product/phone/src/main/ets/Application/AbilityStage.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" +import AbilityStage from "@ohos.app.ability.AbilityStage" export default class MyAbilityStage extends AbilityStage { onCreate() { diff --git a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 5bec2b27..62b71eb1 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility' +import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility' import windowManager from '@ohos.window' import display from '@ohos.display' import Log from '../../../../../../common/src/main/ets/default/Log' -- Gitee From a7b28cb6f770a532e10dfd79b1e1da6abd224a1a Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Tue, 31 Jan 2023 17:17:16 +0800 Subject: [PATCH 314/373] =?UTF-8?q?=E9=80=82=E9=85=8D3.2.10.6,=20master?= =?UTF-8?q?=E5=90=88=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tangzhigang1 --- .../ets/default/abilitymanager/abilityManager.ts | 16 ++++++++-------- .../pc/src/main/ets/Application/AbilityStage.ts | 2 +- .../ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../com/ohos/view/component/itemComponent.ets | 2 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../src/main/ets/MainAbility/MainAbility.ts | 4 ++-- .../src/main/ets/pages/noDisturb.ets | 2 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- 23 files changed, 31 insertions(+), 31 deletions(-) diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/common/src/main/ets/default/abilitymanager/abilityManager.ts index fa37cb66..c42956b4 100644 --- a/common/src/main/ets/default/abilitymanager/abilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/abilityManager.ts @@ -1,3 +1,4 @@ + /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,8 +15,7 @@ */ import { BusinessError } from 'basic'; -import AbilityContext from 'application/AbilityContext'; -import ServiceExtensionContext from 'application/ServiceExtensionContext'; +import common from '@ohos.app.ability.common' import Want from '@ohos.application.Want'; import Log from '../Log'; @@ -34,12 +34,12 @@ export default class AbilityManager { static readonly ABILITY_NAME_APP_LIST = 'SystemUi_AppList'; static readonly ABILITY_NAME_OWNER_WANT = 'Owner_Want'; - static setContext(abilityName: string, context: ServiceExtensionContext): void { + static setContext(abilityName: string, context): void { Log.showDebug(TAG, `setContext, abilityName: ${abilityName}`); globalThis[abilityName + '_Context'] = context; } - static getContext(abilityName?: string): ServiceExtensionContext { + static getContext(abilityName?: string) { Log.showDebug(TAG, `getContext, abilityName: ${abilityName}`); if (!abilityName) { abilityName = AbilityManager.ABILITY_NAME_ENTRY; @@ -47,12 +47,12 @@ export default class AbilityManager { return globalThis[abilityName + '_Context']; } - static setAbilityContext(abilityName: string, context: AbilityContext): void { + static setAbilityContext(abilityName: string, context: common.UIAbilityContext): void { Log.showDebug(TAG, `setContext, abilityName: ${abilityName}`); globalThis[abilityName + '_Context'] = context; } - static getAbilityContext(abilityName?: string): AbilityContext { + static getAbilityContext(abilityName?: string): common.UIAbilityContext { Log.showDebug(TAG, `getContext, abilityName: ${abilityName}`); if (!abilityName) { abilityName = AbilityManager.ABILITY_NAME_ENTRY; @@ -83,7 +83,7 @@ export default class AbilityManager { return globalThis[abilityName + '_ContextName']; } - static startAbility(context: ServiceExtensionContext, want: Want, callback?: (error?: BusinessError) => void): void { + static startAbility(context: any, want: Want, callback?: (error?: BusinessError) => void): void { Log.showDebug(TAG, `startAbility, want: ${JSON.stringify(want)}`); if (context == null) { context = AbilityManager.getContext(); @@ -101,7 +101,7 @@ export default class AbilityManager { }); } - static startServiceExtensionAbility(context: ServiceExtensionContext, want: Want, callback?: (error?: BusinessError) => void): void { + static startServiceExtensionAbility(context: any, want: Want, callback?: (error?: BusinessError) => void): void { Log.showDebug(TAG, `startServiceExtensionAbility, want: ${JSON.stringify(want)}`); if (context == null) { context = AbilityManager.getContext(); diff --git a/entry/pc/src/main/ets/Application/AbilityStage.ts b/entry/pc/src/main/ets/Application/AbilityStage.ts index 5c2c0ae7..ac81d135 100644 --- a/entry/pc/src/main/ets/Application/AbilityStage.ts +++ b/entry/pc/src/main/ets/Application/AbilityStage.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from '@ohos.application.AbilityStage'; +import AbilityStage from '@ohos.app.ability.AbilityStage'; import Log from '../../../../../../common/src/main/ets/default/Log'; const TAG = 'SystemUI_AbilityStage'; diff --git a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 60980ca1..d378ff91 100644 --- a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; import Want from '@ohos.application.Want'; import Log from '../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; diff --git a/entry/phone/src/main/ets/Application/AbilityStage.ts b/entry/phone/src/main/ets/Application/AbilityStage.ts index 5c2c0ae7..ac81d135 100644 --- a/entry/phone/src/main/ets/Application/AbilityStage.ts +++ b/entry/phone/src/main/ets/Application/AbilityStage.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from '@ohos.application.AbilityStage'; +import AbilityStage from '@ohos.app.ability.AbilityStage'; import Log from '../../../../../../common/src/main/ets/default/Log'; const TAG = 'SystemUI_AbilityStage'; diff --git a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 60980ca1..d378ff91 100644 --- a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; import Want from '@ohos.application.Want'; import Log from '../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets index 185e8e24..708d27c2 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets @@ -17,7 +17,7 @@ import ConfigData from '../../common/constants'; @Component export default struct ItemComponent { @Link title: Resource; - @Link value: ResourceStr; + @Link value: any; @Link arrow: Resource; build() { diff --git a/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts b/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts index 6171bf49..cd9dccab 100644 --- a/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts +++ b/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from '@ohos.application.AbilityStage'; +import AbilityStage from '@ohos.app.ability.AbilityStage'; import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NavigationBar_AbilityStage'; diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 34eec4de..97384350 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -14,7 +14,7 @@ */ import display from '@ohos.display'; -import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; diff --git a/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts b/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts index 21b09845..fe4c10f7 100644 --- a/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts +++ b/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from '@ohos.application.AbilityStage'; +import AbilityStage from '@ohos.app.ability.AbilityStage'; import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NotificationManagement_AbilityStage'; diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts index a8412aa6..c2e708db 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts @@ -12,9 +12,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Ability from '@ohos.application.Ability'; +import Ability from '@ohos.app.ability.UIAbility' import Want from '@ohos.application.Want'; -import AbilityConstant from "@ohos.application.AbilityConstant"; +import AbilityConstant from "@ohos.app.ability.AbilityConstant"; import Log from '../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import display from '@ohos.display'; diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index 7025f50e..cb2e6db0 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -38,7 +38,7 @@ export default struct NoDisturb { @State startTitle:Resource = $r('app.string.startTime'); @State endTitle:Resource = $r('app.string.endTime'); @State arrow: Resource = $r('app.media.ic_settings_arrow'); - @State repeatName : ResourceStr = this.mViewModel.repeatName + @State repeatName : any = this.mViewModel.repeatName @State startDateClue : string = this.mViewModel.startDateClue @State startTimeClue : string = this.mViewModel.startTimeClue @State endDateClue : string = this.mViewModel.endDateClue diff --git a/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts b/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts index 82e9de89..b9d3a117 100644 --- a/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts +++ b/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from '@ohos.application.AbilityStage'; +import AbilityStage from '@ohos.app.ability.AbilityStage'; import Log from '../../../../../../../common/src/main/ets/default/Log'; //import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' //import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 74446999..bf53a336 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; import Want from '@ohos.application.Want'; import display from '@ohos.display'; import Log from '../../../../../../../common/src/main/ets/default/Log'; diff --git a/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts b/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts index c1896825..fac1e5c9 100644 --- a/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from '@ohos.application.AbilityStage'; +import AbilityStage from '@ohos.app.ability.AbilityStage'; import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'ControlPanel_AbilityStage'; diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 918257a4..b6262497 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; import display from '@ohos.display'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; diff --git a/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts b/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts index 85c3869b..2495ec64 100644 --- a/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from '@ohos.application.AbilityStage'; +import AbilityStage from '@ohos.app.ability.AbilityStage'; import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NotificationPanel_AbilityStage'; diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 7695abba..21e38a29 100644 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; import Want from '@ohos.application.Want'; import display from '@ohos.display'; import Log from '../../../../../../../common/src/main/ets/default/Log'; diff --git a/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts b/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts index ff108a0c..2cb8af62 100644 --- a/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from '@ohos.application.AbilityStage'; +import AbilityStage from '@ohos.app.ability.AbilityStage'; import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'StatusBar_AbilityStage'; diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 96ec00f9..279044f4 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; diff --git a/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts b/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts index 8820fd7f..f373142a 100644 --- a/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts +++ b/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from '@ohos.application.AbilityStage'; +import AbilityStage from '@ohos.app.ability.AbilityStage'; import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'DropdownPanel_AbilityStage'; diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 2af27391..62022902 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; import display from '@ohos.display'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; diff --git a/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts b/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts index ff108a0c..2cb8af62 100644 --- a/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts +++ b/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from '@ohos.application.AbilityStage'; +import AbilityStage from '@ohos.app.ability.AbilityStage'; import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'StatusBar_AbilityStage'; diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 7f6a7fcb..72b743e7 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -14,7 +14,7 @@ */ import display from '@ohos.display'; -import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -- Gitee From b15dcee6338f6ec5b51a4452a76ecaa0289f1996 Mon Sep 17 00:00:00 2001 From: fangzheng24 Date: Thu, 2 Feb 2023 11:02:31 +0800 Subject: [PATCH 315/373] =?UTF-8?q?=E9=80=82=E9=85=8Dapi10=E7=9A=84sdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: fangzheng24 --- build-profile.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-profile.json5 b/build-profile.json5 index 24aee105..9dbcb739 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -1,6 +1,6 @@ { "app": { - "compileSdkVersion": 9, + "compileSdkVersion": 10, "compatibleSdkVersion": 9, "products": [ { -- Gitee From 7dfa1997b8e3c23e9b92f091aa69f3871f1d264d Mon Sep 17 00:00:00 2001 From: SEASON_SYSU Date: Thu, 2 Feb 2023 03:22:13 +0000 Subject: [PATCH 316/373] update build-profile.json5. Signed-off-by: SEASON_SYSU --- build-profile.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-profile.json5 b/build-profile.json5 index a3c3448c..59cf40a5 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -1,6 +1,6 @@ { "app": { - "compileSdkVersion": 9, + "compileSdkVersion": 10, "compatibleSdkVersion": 9, "products": [ { -- Gitee From 09c2b59046888eb5beaddfc586bbef2e310725f7 Mon Sep 17 00:00:00 2001 From: wangtiantian Date: Mon, 6 Feb 2023 10:15:49 +0800 Subject: [PATCH 317/373] IssueNo:#I6BI6V Description:rename bms struct Sig:SIG_ApplicaitonFramework Feature or Bugfix:Bugfix Binary Source:No Signed-off-by: wangtiantian --- .../main/ets/plugindatasource/PluginDataSourceManager.ts | 2 +- .../src/main/ets/plugindatasource/common/BundleParseUtil.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts index d5ad0674..46761181 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts @@ -26,7 +26,7 @@ import { registerBundleListener, } from './common/BundleParseUtil'; import { AbilityInfo } from 'bundle/abilityInfo'; -import { ExtensionAbilityInfo } from 'bundleManager/extensionAbilityInfo'; +import { ExtensionAbilityInfo } from 'bundleManager/ExtensionAbilityInfo'; export type PluginListener = { onItemAdd: (itemData: ItemComponentData) => void; diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts index e7447ff3..fe9d7c02 100644 --- a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts +++ b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts @@ -15,10 +15,10 @@ import bundleManager from '@ohos.bundle.bundleManager'; import commonEvent from '@ohos.commonEvent'; -import { AbilityInfo } from 'bundleManager/abilityInfo'; -import { ExtensionAbilityInfo } from 'bundleManager/extensionAbilityInfo'; +import { AbilityInfo } from 'bundleManager/AbilityInfo'; +import { ExtensionAbilityInfo } from 'bundleManager/ExtensionAbilityInfo'; import { CustomizeData } from 'bundle/customizeData'; -import { Metadata } from 'bundleManager/metadata'; +import { Metadata } from 'bundleManager/Metadata'; import Log from '../../default/Log'; import switchUserManager from '../../default/SwitchUserManager'; -- Gitee From b853323e97f3a801eebbe8d16ff12a1e34820434 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Mon, 6 Feb 2023 11:24:23 +0800 Subject: [PATCH 318/373] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E6=96=87=E5=AD=97=E9=87=8D=E5=8F=A0=EF=BC=8C?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=90=88=E5=85=A5master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SEASON_SYSU --- .../ets/com/ohos/model/ControlCenterService.ts | 2 +- .../com/ohos/pages/SimpleToggleLayoutEditGrid.ets | 14 ++++++++++++-- .../main/ets/pages/common/ControlCenterConfig.ts | 5 +++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index 40cac715..912fe76f 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -119,7 +119,7 @@ export class ControlCenterService { Log.showDebug(TAG, `parseConfig, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); this.calcComplexToggleLayout(); config.LocalToggles.SimpleToggles.forEach((name: string) => { - this.mAllSimpleToggles.push(name); + typeof name === 'string' && this.mAllSimpleToggles.push(name); }); Log.showDebug(TAG, `parseConfig, allSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); this.calcSimpleToggleLayout(); diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets index 7b309e1f..87c6883b 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets @@ -64,7 +64,7 @@ export default struct SimpleToggleLayoutEditGrid { mEditMode: true }) }.width('100%') - .height(80) + .height(108) } }, (componentName: string) => componentName) if (this.mToggles.length == 0) { @@ -72,7 +72,7 @@ export default struct SimpleToggleLayoutEditGrid { } } } - .constraintSize({ minHeight: 80 }) + .height(this.calcGridHeight(Math.ceil(this.mToggles.length / this.mColumnCount), this.style.rowHeight, this.style.rowGap)) .width('100%') .columnsTemplate(this.calcColumnsTemplate(this.mColumnCount)) .editMode(true) @@ -93,6 +93,16 @@ export default struct SimpleToggleLayoutEditGrid { .onItemDrop(this.onGridItemDrop.bind(this)) } + calcGridHeight(rowCount, rowHeight, rowGap) { + Log.showDebug(this.logTag, `calcGridHeight, rowCount: ${rowCount} rowHeight: ${rowHeight} rowGap: ${rowGap}`); + let height = rowCount * rowHeight + (rowCount - 1) * rowGap; + if (height <= 0) { + height = 108; + } + Log.showDebug(this.logTag, `calcGridHeight, height: ${height}`); + return height + 'px'; + } + calcColumnsTemplate(columnCount: number): string{ Log.showDebug(this.logTag, `calcColumnsTemplate, columnCount: ${columnCount}`); let columnsTemplate = '1fr'; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts index 1174c626..5164b7e9 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts @@ -15,13 +15,14 @@ import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; import { ControlCenterConfig } from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/Constants'; +import {isNfcAvailable} from '../../../../../../../../common/src/main/ets/default/Constants'; const controlCenterConfig: ControlCenterConfig = { ComplexToggleLayout: [FASlotName.WIFI, FASlotName.BLUETOOTH], - DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION, 'demosystemuicplmeta', FASlotName.NFC, FASlotName.AUTO_ROTATE], + DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION, 'demosystemuicplmeta', isNfcAvailable()&&FASlotName.NFC, FASlotName.AUTO_ROTATE], LocalToggles: { ComplexToggles: [FASlotName.AIR_PLANE, FASlotName.BLUETOOTH, FASlotName.WIFI], - SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE, FASlotName.NFC, FASlotName.AUTO_ROTATE], + SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE, isNfcAvailable()&&FASlotName.NFC, FASlotName.AUTO_ROTATE], }, MetaToggles: [ { -- Gitee From 7fbc8dc1d24f4316ac9ee55a062c8e8b25e5dcb6 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Fri, 10 Feb 2023 11:43:32 +0800 Subject: [PATCH 319/373] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=8C=89=E9=92=AE=E5=8F=B3=E7=A7=BB+?= =?UTF-8?q?=E5=85=8D=E6=89=93=E6=89=B0=E5=88=87=E6=8D=A2=E5=A4=9A=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=A4=B1=E8=B4=A5=EF=BC=8C=E4=BB=A3=E7=A0=81=E5=90=88?= =?UTF-8?q?=E5=85=A5master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SEASON_SYSU --- .../ohos/view/component/switchComponent.ets | 3 +- .../src/main/ets/pages/noDisturb.ets | 234 ++++++++++-------- 2 files changed, 137 insertions(+), 100 deletions(-) diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index def21a77..0a8b4288 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -42,7 +42,7 @@ export default struct SwitchComponent { .visibility((this.describe ? true : false) ? Visibility.Visible : Visibility.None) }.alignItems(HorizontalAlign.Start) } - .flexShrink(0) + .flexShrink(1) .height($r('app.float.switchComp_height')) .alignItems(VerticalAlign.Center) .align(Alignment.Start) @@ -62,6 +62,7 @@ export default struct SwitchComponent { this.settingAction(data); }) } + .flexShrink(0) .height($r('app.float.switchComp_height')) .alignItems(VerticalAlign.Center) .align(Alignment.End) diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index cb2e6db0..ca1b5ca8 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -122,111 +122,111 @@ export default struct NoDisturb { Row() { Column() { HeadComponent({ headName: $headName, isActive: true }) - Row() { - ItemComponent({ - title: $repeatTitle, - value: $repeatName, - arrow: $arrow - }) - }.onClick(() => { - this.repeatDialogController.open() - }).margin({ bottom: $r('app.float.itemComp_margin_b') }) + Row() { + ItemComponent({ + title: $repeatTitle, + value: $repeatName, + arrow: $arrow + }) + }.onClick(() => { + this.repeatDialogController.open() + }).margin({ bottom: $r('app.float.itemComp_margin_b') }) - if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { - List() { - ListItem() { - Row() { - ItemComponent({ - title: $startDateTitle, - value: $startDateClue, - arrow: $arrow - }) - }.onClick(() => { - this.startDateDialogController.open() - }) - } - ListItem() { - Row() { - ItemComponent({ - title: $startTitle, - value: $startTimeClue, - arrow: $arrow - }) - }.onClick(() => { - this.startTimeDialogController.open() + if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { + List() { + ListItem() { + Row() { + ItemComponent({ + title: $startDateTitle, + value: $startDateClue, + arrow: $arrow }) - } - }.divider({ - strokeWidth: 1, - color: $r('app.color.divider_color'), - startMargin: $r('app.float.divider_margin_l'), - endMargin: $r('app.float.divider_margin_r') - }).width(ConfigData.WH_100_100) - .visibility(Visibility.Visible) - .zIndex(0) - .border({ width: $r('app.float.border_width'), color: Color.White, - radius: $r('app.float.border_radius') }) - .backgroundColor(Color.White) - .margin({ bottom: $r('app.float.itemComp_margin_b')}) - .flexShrink(1) - List() { - ListItem() { - Row() { - ItemComponent({ - title: $endDateTitle, - value: $endDateClue, - arrow: $arrow - }) - }.onClick(() => { - this.endDateDialogController.open() + }.onClick(() => { + this.startDateDialogController.open() + }) + } + ListItem() { + Row() { + ItemComponent({ + title: $startTitle, + value: $startTimeClue, + arrow: $arrow }) - } - ListItem() { - Row() { - ItemComponent({ - title: $endTitle, - value: $endTimeClue, - arrow: $arrow - }) - }.onClick(() => { - this.endTimeDialogController.open() + }.onClick(() => { + this.startTimeDialogController.open() + }) + } + }.divider({ + strokeWidth: 1, + color: $r('app.color.divider_color'), + startMargin: $r('app.float.divider_margin_l'), + endMargin: $r('app.float.divider_margin_r') + }).width(ConfigData.WH_100_100) + .visibility(Visibility.Visible) + .zIndex(0) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + .margin({ bottom: $r('app.float.itemComp_margin_b')}) + .flexShrink(1) + List() { + ListItem() { + Row() { + ItemComponent({ + title: $endDateTitle, + value: $endDateClue, + arrow: $arrow }) - } - }.divider({ - strokeWidth: 1, - color: $r('app.color.divider_color'), - startMargin: $r('app.float.divider_margin_l'), - endMargin: $r('app.float.divider_margin_r') - }).width(ConfigData.WH_100_100) - .visibility(Visibility.Visible) - .zIndex(0) - .border({ width: $r('app.float.border_width'), color: Color.White, - radius: $r('app.float.border_radius') }) - .backgroundColor(Color.White) - .margin({ bottom: $r('app.float.itemComp_margin_b')}) - .flexShrink(1) - } else { - Row() { - ItemComponent({ - title: $startTitle, - value: $startTimeClue, - arrow: $arrow + }.onClick(() => { + this.endDateDialogController.open() }) - }.onClick(() => { - this.mPrevData = this.mViewModel.startTime - this.startTimeDialogController.open() - }).margin({ bottom: $r('app.float.itemComp_margin_b')}) - Row() { - ItemComponent({ - title: $endTitle, - value: $endTimeClue, - arrow: $arrow + } + ListItem() { + Row() { + ItemComponent({ + title: $endTitle, + value: $endTimeClue, + arrow: $arrow + }) + }.onClick(() => { + this.endTimeDialogController.open() }) - }.onClick(() => { - this.mPrevData = this.mViewModel.endTime - this.endTimeDialogController.open() - }).margin({ bottom: $r('app.float.itemComp_margin_b')}) - } + } + }.divider({ + strokeWidth: 1, + color: $r('app.color.divider_color'), + startMargin: $r('app.float.divider_margin_l'), + endMargin: $r('app.float.divider_margin_r') + }).width(ConfigData.WH_100_100) + .visibility(Visibility.Visible) + .zIndex(0) + .border({ width: $r('app.float.border_width'), color: Color.White, + radius: $r('app.float.border_radius') }) + .backgroundColor(Color.White) + .margin({ bottom: $r('app.float.itemComp_margin_b')}) + .flexShrink(1) + } else { + Row() { + ItemComponent({ + title: $startTitle, + value: $startTimeClue, + arrow: $arrow + }) + }.onClick(() => { + this.mPrevData = this.mViewModel.startTime + this.startTimeDialogController.open() + }).margin({ bottom: $r('app.float.itemComp_margin_b')}) + Row() { + ItemComponent({ + title: $endTitle, + value: $endTimeClue, + arrow: $arrow + }) + }.onClick(() => { + this.mPrevData = this.mViewModel.endTime + this.endTimeDialogController.open() + }).margin({ bottom: $r('app.float.itemComp_margin_b')}) + } } .width(ConfigData.WH_100_100) .height(ConfigData.WH_100_100) @@ -479,6 +479,15 @@ struct RepeatModeDialog { .touchable(false) .width($r('app.float.toggle_check_width')) .height($r('app.float.toggle_check_width')) + .onChange((select: boolean) => { + if(select){ + if (this.prevModeSetCnt == 0) { + this.itSelectedBefore = this.selectMode; + } + this.prevModeSetCnt++ + this.selectMode = DoNotDisturbType.TYPE_NONE; + } + }) } .height($r("app.float.appitem_icon_height")) .onClick(() => { @@ -499,6 +508,15 @@ struct RepeatModeDialog { .touchable(false) .width($r('app.float.toggle_check_width')) .height($r('app.float.toggle_check_width')) + .onChange((select: boolean) => { + if(select){ + if (this.prevModeSetCnt == 0) { + this.itSelectedBefore = this.selectMode; + } + this.prevModeSetCnt++ + this.selectMode = DoNotDisturbType.TYPE_ONCE; + } + }) } .height($r("app.float.appitem_icon_height")) .onClick(() => { @@ -519,6 +537,15 @@ struct RepeatModeDialog { .touchable(false) .width($r('app.float.toggle_check_width')) .height($r('app.float.toggle_check_width')) + .onChange((select: boolean) => { + if(select){ + if (this.prevModeSetCnt == 0) { + this.itSelectedBefore = this.selectMode; + } + this.prevModeSetCnt++ + this.selectMode = DoNotDisturbType.TYPE_DAILY; + } + }) } .height($r("app.float.appitem_icon_height")) .onClick(() => { @@ -539,6 +566,15 @@ struct RepeatModeDialog { .touchable(false) .width($r('app.float.toggle_check_width')) .height($r('app.float.toggle_check_width')) + .onChange((select: boolean) => { + if(select){ + if (this.prevModeSetCnt == 0) { + this.itSelectedBefore = this.selectMode; + } + this.prevModeSetCnt++ + this.selectMode = DoNotDisturbType.TYPE_CLEARLY; + } + }) } .height($r("app.float.appitem_icon_height")) .onClick(() => { -- Gitee From 7d657f54d40dfaf6bd2976e4b75b037b1921b51c Mon Sep 17 00:00:00 2001 From: SEASON_SYSU Date: Fri, 10 Feb 2023 03:46:49 +0000 Subject: [PATCH 320/373] update build-profile.json5. Signed-off-by: SEASON_SYSU --- build-profile.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-profile.json5 b/build-profile.json5 index 59cf40a5..a3c3448c 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -1,6 +1,6 @@ { "app": { - "compileSdkVersion": 10, + "compileSdkVersion": 9, "compatibleSdkVersion": 9, "products": [ { -- Gitee From 0ba5d8c37b631dba57bd205da9fe9c054b7f1b8b Mon Sep 17 00:00:00 2001 From: SEASON_SYSU Date: Fri, 10 Feb 2023 03:47:11 +0000 Subject: [PATCH 321/373] update build-profile.json5. Signed-off-by: SEASON_SYSU --- build-profile.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-profile.json5 b/build-profile.json5 index a3c3448c..59cf40a5 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -1,6 +1,6 @@ { "app": { - "compileSdkVersion": 9, + "compileSdkVersion": 10, "compatibleSdkVersion": 9, "products": [ { -- Gitee From 4bfaf0ffd97545ed214a3c8b2bea4f392d7d2e3a Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Thu, 16 Feb 2023 17:45:50 +0800 Subject: [PATCH 322/373] =?UTF-8?q?=E9=9A=90=E7=A7=81=E4=BF=9D=E6=8A=A4?= =?UTF-8?q?=E5=B0=8F=E5=9C=86=E7=82=B9=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SEASON_SYSU --- common/src/main/ets/default/WindowManager.ts | 16 ++- entry/pc/src/main/module.json5 | 3 + entry/phone/src/main/module.json5 | 3 + .../ServiceExtAbility/ServiceExtAbility.ts | 27 ++++ .../src/main/ets/common/IndicatorConfig.ts | 56 ++++++++ .../ets/pages/PrivacyIndicatorComponent.ets | 50 +++++++ .../src/main/ets/viewmodel/ViewModel.ts | 126 ++++++++++++++++++ .../main/resources/base/element/color.json | 16 +++ .../main/resources/base/element/string.json | 4 + .../resources/base/profile/main_pages.json | 3 +- .../main/resources/en_US/element/string.json | 4 + .../main/resources/zh_CN/element/string.json | 4 + .../ServiceExtAbility/ServiceExtAbility.ts | 1 - 13 files changed, 310 insertions(+), 3 deletions(-) create mode 100644 product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts create mode 100644 product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets create mode 100644 product/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index 1d5b7526..78d52445 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -35,7 +35,8 @@ export enum WindowType { CONTROL_PANEL = 'SystemUi_ControlPanel', VOLUME_PANEL = 'SystemUi_VolumePanel', BANNER_NOTICE = 'SystemUi_BannerNotice', - SPLIT_BAR = 'SystemUi_SplitBar' + SPLIT_BAR = 'SystemUi_SplitBar', + PRIVACY_INDICATOR = 'SystemUi_PrivacyIndicator' } export const WINDOW_SHOW_HIDE_EVENT = 'WindowShowHideEvent'; @@ -55,6 +56,7 @@ const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: Window.WindowType } = { SystemUi_VolumePanel: Window.WindowType.TYPE_VOLUME_OVERLAY, SystemUi_BannerNotice: Window.WindowType.TYPE_VOLUME_OVERLAY, SystemUi_SplitBar: 2101, + SystemUi_PrivacyIndicator: Window.WindowType.TYPE_VOLUME_OVERLAY }; const DEFAULT_WINDOW_INFO: WindowInfo = { @@ -142,6 +144,18 @@ class WindowManager { getWindowInfo(name: WindowType): WindowInfo | undefined { return this.mWindowInfos.get(name); } + + async setWindowBgColor(name: WindowType, bgColor: string): void { + let window = await Window.find(name) + window.setWindowBackgroundColor(bgColor); + + } + + async setWindowTouchable(windowName: string, touchable: boolean): void { + let window = await Window.find(name) + window.setWindowTouchable(touchable); + } + } let sWindowManager = createOrGet(WindowManager, TAG); diff --git a/entry/pc/src/main/module.json5 b/entry/pc/src/main/module.json5 index 94a5243e..c156fce5 100644 --- a/entry/pc/src/main/module.json5 +++ b/entry/pc/src/main/module.json5 @@ -87,6 +87,9 @@ }, { "name": "ohos.permission.GET_TELEPHONY_STATE" + }, + { + "name": "ohos.permission.PERMISSION_USED_STATS" } ] } diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index 5aa8dde8..992a5ead 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -87,6 +87,9 @@ }, { "name": "ohos.permission.GET_TELEPHONY_STATE" + }, + { + "name": "ohos.permission.PERMISSION_USED_STATS" } ] } diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 97384350..22a99240 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -120,6 +120,33 @@ class ServiceExtAbility extends ServiceExtension { } else { WindowManager.resetSizeWindow(WindowType.NAVIGATION_BAR, navigationBarRect); } + this.createPrivacyIndicatorWindow(isNewWindow,configInfo) + } + + createPrivacyIndicatorWindow(isNewWindow : boolean, config : any){ + let PrivacyIndicatorRect = { + left: 0, + top: 0, + width: config.realWidth, + height: 32 + }; + // 创建状态栏窗口 + if (isNewWindow){ + WindowManager.createWindow(this.context, WindowType.PRIVACY_INDICATOR, PrivacyIndicatorRect, "pages/PrivacyIndicatorComponent").then(() => { + Log.showInfo(TAG, "addPrivacyIndicator window has created"); + WindowManager.showWindow(WindowType.PRIVACY_INDICATOR).then(() => { + WindowManager.setWindowBgColor(WindowType.PRIVACY_INDICATOR, "#00000000") + WindowManager.setWindowTouchable(WindowType.PRIVACY_INDICATOR, false) + }) + // 窗口透明 + }) + .catch((e) => { + Log.showError(TAG, `addPrivacyIndicator create window error.`); + }); + }else { + WindowManager.resetSizeWindow(WindowType.PRIVACY_INDICATOR, PrivacyIndicatorRect) + } + } onDestroy(): void { diff --git a/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts b/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts new file mode 100644 index 00000000..580757f1 --- /dev/null +++ b/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts @@ -0,0 +1,56 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + */ + +export default class IndicatorStyle { + /** + * 圆点尺寸 + */ + static readonly indicatorSize = '5.5vp'; + + /** + * 圆点圆角半径 + */ + static readonly indicatorBorderRadius = '11px'; + + /** + * 圆点距离顶部尺寸 + */ + static readonly indicatorTopMargin = '10px'; + + /** + * 圆点距离右侧尺寸 + */ + static readonly indicatorRightMargin = '150px'; +} + +/** + * 颜色类型 + */ +export class IndicatorType { + /** + * 默认不显示 + */ + static readonly TYPE_NONE = 0; + + /** + * 相机:橙色 + * 浅色:#ED6F21 + * 深色:#DB6B42 + */ + static readonly TYPE_ORANGE = 1; + + /** + * 麦克风:绿色 + * 浅色:#64BB5C + * 深色:#5BA854 + */ + static readonly TYPE_GREEN = 2; + + /** + * 位置:蓝色 + * 浅色:#0A59F7 + * 深色:#317AF7 + */ + static readonly TYPE_BLUE = 3; +} diff --git a/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets b/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets new file mode 100644 index 00000000..fc5de798 --- /dev/null +++ b/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + */ + +import { ViewModel } from '../viewmodel/ViewModel'; +import IndicatorStyle, { IndicatorType } from '../common/IndicatorConfig'; + +@Entry +@Component +export default struct PrivacyIndicatorComponent { + private mViewModel: ViewModel; + @State mBackgroundColor: Resource = $r("app.color.transparent"); + + aboutToAppear(): void { + this.mViewModel = new ViewModel(); + this.mViewModel.setCallback((type) => { + if (type == IndicatorType.TYPE_ORANGE) { + this.mBackgroundColor = $r("app.color.indicator_color_orange"); + } else if (type == IndicatorType.TYPE_GREEN) { + this.mBackgroundColor = $r("app.color.indicator_color_green"); + } else if (type == IndicatorType.TYPE_BLUE) { + this.mBackgroundColor = $r("app.color.indicator_color_blue"); + } else { + // 不显示 + this.mBackgroundColor = $r("app.color.transparent"); + } + }); + this.mViewModel.registerPrivacyStateListener(); + } + + aboutToDisappear(): void { + if (this.mViewModel != null) { + this.mViewModel.unregisterPrivacyStateListener(); + } + } + + build() { + Row() { + Text() + .width(IndicatorStyle.indicatorSize) + .height(IndicatorStyle.indicatorSize) + .borderRadius(IndicatorStyle.indicatorBorderRadius) + .backgroundColor(this.mBackgroundColor) + .margin({ top: IndicatorStyle.indicatorTopMargin, right: IndicatorStyle.indicatorRightMargin }); + } + .width('100%') + .justifyContent(FlexAlign.End) + .alignItems(VerticalAlign.Top) + } +} \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts new file mode 100644 index 00000000..25dcb679 --- /dev/null +++ b/product/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts @@ -0,0 +1,126 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + */ + +import privacyManager from '@ohos.privacyManager'; +import { Permissions } from 'permissions'; +import { IndicatorType } from '../common/IndicatorConfig'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; + +const TAG = "PrivacyIndicatorViewModel"; + +/** + * 表示未使用权限。 + */ +const PERMISSION_INACTIVE = 0; + +/** + * 相机权限 + */ +const PERMISSION_CAMERA = 'ohos.permission.CAMERA'; + +/** + * 定位权限 + */ +const PERMISSION_LOCATION = 'ohos.permission.LOCATION'; +const PERMISSION_APPROXIMATELY_LOCATION = 'ohos.permission.APPROXIMATELY_LOCATION'; +const PERMISSION_LOCATION_IN_BACKGROUND = 'ohos.permission.LOCATION_IN_BACKGROUND'; + +/** + * 麦克风权限 + */ +const PERMISSION_MICROPHONE = 'ohos.permission.MICROPHONE'; + +export class ViewModel { + private permissionNameList: Permissions[] = [PERMISSION_CAMERA, PERMISSION_MICROPHONE, + PERMISSION_LOCATION, PERMISSION_APPROXIMATELY_LOCATION, PERMISSION_LOCATION_IN_BACKGROUND]; + private mIndicatorStatusMap: Map; + private mLocationStatusMap: Map; + private mCallback: (type: number) => {}; + + constructor() { + this.mIndicatorStatusMap = new Map(); + this.mIndicatorStatusMap.set(IndicatorType.TYPE_ORANGE, false); + this.mIndicatorStatusMap.set(IndicatorType.TYPE_GREEN, false); + this.mIndicatorStatusMap.set(IndicatorType.TYPE_BLUE, false); + this.mLocationStatusMap = new Map(); + this.mLocationStatusMap.set(PERMISSION_LOCATION, false); + this.mLocationStatusMap.set(PERMISSION_APPROXIMATELY_LOCATION, false); + this.mLocationStatusMap.set(PERMISSION_LOCATION_IN_BACKGROUND, false); + } + + setCallback(callback) { + this.mCallback = callback; + } + + registerPrivacyStateListener(): void { + try { + privacyManager.on('activeStateChange', this.permissionNameList, (data) => { + Log.showInfo(TAG, "permission state changed."); + if (data == null) { + Log.showWarn(TAG, "response is invalid."); + return; + } + const isShow = data.activeStatus != PERMISSION_INACTIVE; + switch (data.permissionName) { + case PERMISSION_CAMERA: + this.refreshIndicatorStatus(IndicatorType.TYPE_ORANGE, isShow); + break; + case PERMISSION_MICROPHONE: + this.refreshIndicatorStatus(IndicatorType.TYPE_GREEN, isShow); + break; + case PERMISSION_LOCATION: + case PERMISSION_LOCATION_IN_BACKGROUND: + case PERMISSION_APPROXIMATELY_LOCATION: + this.mLocationStatusMap.set(data.permissionName, isShow); + this.refreshIndicatorStatus(IndicatorType.TYPE_BLUE, this.getLocationStatus()); + break; + default: + Log.showDebug(TAG, "no privacy type matched."); + break; + } + }); + } catch (err) { + Log.showError(TAG, `registerPrivacyStateListener error => ${JSON.stringify(err)}`); + } + } + + unregisterPrivacyStateListener(): void { + try { + privacyManager.off('activeStateChange', this.permissionNameList); + } catch (err) { + Log.showError(TAG, "unregisterPrivacyStateListener error."); + } + } + + /** + * 优先级:橙色相机>绿色麦克风>蓝色定位 + */ + private refreshIndicatorStatus(type: number, isShow: boolean): void { + Log.showInfo(TAG, `indicator ${type} isShow: ${isShow}`); + this.mIndicatorStatusMap.set(type, isShow); + let resultType = IndicatorType.TYPE_NONE; + if (this.mIndicatorStatusMap.get(IndicatorType.TYPE_ORANGE)) { + resultType = IndicatorType.TYPE_ORANGE; + } else if (this.mIndicatorStatusMap.get(IndicatorType.TYPE_GREEN)) { + resultType = IndicatorType.TYPE_GREEN; + } else if (this.mIndicatorStatusMap.get(IndicatorType.TYPE_BLUE)) { + resultType = IndicatorType.TYPE_BLUE; + } else { + Log.showDebug(TAG, "refresh no type matched."); + } + if (this.mCallback) { + this.mCallback(resultType); + } + } + + /** + * 定位权限 + * LOCATION_IN_BACKGROUND权限在后台时为true,前台时为false + */ + private getLocationStatus(): boolean { + return this.mLocationStatusMap.get(PERMISSION_LOCATION) || + this.mLocationStatusMap.get(PERMISSION_APPROXIMATELY_LOCATION) || + this.mLocationStatusMap.get(PERMISSION_LOCATION_IN_BACKGROUND); + } +} \ No newline at end of file diff --git a/product/default/navigationBar/src/main/resources/base/element/color.json b/product/default/navigationBar/src/main/resources/base/element/color.json index 26637d9f..bdca0046 100644 --- a/product/default/navigationBar/src/main/resources/base/element/color.json +++ b/product/default/navigationBar/src/main/resources/base/element/color.json @@ -7,6 +7,22 @@ { "name": "button_click_background", "value": "#DCDCDC" + }, + { + "name": "transparent", + "value": "#00000000" + }, + { + "name": "indicator_color_orange", + "value": "#ED6F21" + }, + { + "name": "indicator_color_green", + "value": "#64BB5C" + }, + { + "name": "indicator_color_blue", + "value": "#0A59F7" } ] } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/resources/base/element/string.json b/product/default/navigationBar/src/main/resources/base/element/string.json index ee6513e8..f0c3fc3c 100644 --- a/product/default/navigationBar/src/main/resources/base/element/string.json +++ b/product/default/navigationBar/src/main/resources/base/element/string.json @@ -39,6 +39,10 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "module_desc", + "value": "privacy indicator" } ] } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/resources/base/profile/main_pages.json b/product/default/navigationBar/src/main/resources/base/profile/main_pages.json index 59129d3e..03892be8 100644 --- a/product/default/navigationBar/src/main/resources/base/profile/main_pages.json +++ b/product/default/navigationBar/src/main/resources/base/profile/main_pages.json @@ -1,6 +1,7 @@ { "src": [ "pages/index", - "pages/SplitBarIndex" + "pages/SplitBarIndex", + "pages/PrivacyIndicatorComponent" ] } diff --git a/product/default/navigationBar/src/main/resources/en_US/element/string.json b/product/default/navigationBar/src/main/resources/en_US/element/string.json index ee6513e8..f0c3fc3c 100644 --- a/product/default/navigationBar/src/main/resources/en_US/element/string.json +++ b/product/default/navigationBar/src/main/resources/en_US/element/string.json @@ -39,6 +39,10 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "module_desc", + "value": "privacy indicator" } ] } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/resources/zh_CN/element/string.json b/product/default/navigationBar/src/main/resources/zh_CN/element/string.json index ee6513e8..f0c3fc3c 100644 --- a/product/default/navigationBar/src/main/resources/zh_CN/element/string.json +++ b/product/default/navigationBar/src/main/resources/zh_CN/element/string.json @@ -39,6 +39,10 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "module_desc", + "value": "privacy indicator" } ] } \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index bf53a336..8601f6c7 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -66,7 +66,6 @@ class ServiceExtAbility extends ServiceExtension { height: configInfo.height, }); }).then(() => { - Log.showInfo(TAG, `Spike ==> ${JSON.stringify(volumeRect)}`); WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); }).catch((err) => { }); -- Gitee From 815f005c630c8f445f5560f6f1f3a282d878721d Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Thu, 16 Feb 2023 17:45:50 +0800 Subject: [PATCH 323/373] =?UTF-8?q?=E9=9A=90=E7=A7=81=E4=BF=9D=E6=8A=A4?= =?UTF-8?q?=E5=B0=8F=E5=9C=86=E7=82=B9=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SEASON_SYSU --- common/src/main/ets/default/WindowManager.ts | 16 ++- entry/pc/src/main/module.json5 | 3 + entry/phone/src/main/module.json5 | 3 + .../ServiceExtAbility/ServiceExtAbility.ts | 27 ++++ .../src/main/ets/common/IndicatorConfig.ts | 56 ++++++++ .../ets/pages/PrivacyIndicatorComponent.ets | 50 +++++++ .../src/main/ets/viewmodel/ViewModel.ts | 126 ++++++++++++++++++ .../main/resources/base/element/color.json | 16 +++ .../main/resources/base/element/string.json | 4 + .../resources/base/profile/main_pages.json | 3 +- .../main/resources/en_US/element/string.json | 4 + .../main/resources/zh_CN/element/string.json | 4 + .../ServiceExtAbility/ServiceExtAbility.ts | 1 - 13 files changed, 310 insertions(+), 3 deletions(-) create mode 100644 product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts create mode 100644 product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets create mode 100644 product/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index 1d5b7526..78d52445 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -35,7 +35,8 @@ export enum WindowType { CONTROL_PANEL = 'SystemUi_ControlPanel', VOLUME_PANEL = 'SystemUi_VolumePanel', BANNER_NOTICE = 'SystemUi_BannerNotice', - SPLIT_BAR = 'SystemUi_SplitBar' + SPLIT_BAR = 'SystemUi_SplitBar', + PRIVACY_INDICATOR = 'SystemUi_PrivacyIndicator' } export const WINDOW_SHOW_HIDE_EVENT = 'WindowShowHideEvent'; @@ -55,6 +56,7 @@ const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: Window.WindowType } = { SystemUi_VolumePanel: Window.WindowType.TYPE_VOLUME_OVERLAY, SystemUi_BannerNotice: Window.WindowType.TYPE_VOLUME_OVERLAY, SystemUi_SplitBar: 2101, + SystemUi_PrivacyIndicator: Window.WindowType.TYPE_VOLUME_OVERLAY }; const DEFAULT_WINDOW_INFO: WindowInfo = { @@ -142,6 +144,18 @@ class WindowManager { getWindowInfo(name: WindowType): WindowInfo | undefined { return this.mWindowInfos.get(name); } + + async setWindowBgColor(name: WindowType, bgColor: string): void { + let window = await Window.find(name) + window.setWindowBackgroundColor(bgColor); + + } + + async setWindowTouchable(windowName: string, touchable: boolean): void { + let window = await Window.find(name) + window.setWindowTouchable(touchable); + } + } let sWindowManager = createOrGet(WindowManager, TAG); diff --git a/entry/pc/src/main/module.json5 b/entry/pc/src/main/module.json5 index 94a5243e..c156fce5 100644 --- a/entry/pc/src/main/module.json5 +++ b/entry/pc/src/main/module.json5 @@ -87,6 +87,9 @@ }, { "name": "ohos.permission.GET_TELEPHONY_STATE" + }, + { + "name": "ohos.permission.PERMISSION_USED_STATS" } ] } diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index 5aa8dde8..992a5ead 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -87,6 +87,9 @@ }, { "name": "ohos.permission.GET_TELEPHONY_STATE" + }, + { + "name": "ohos.permission.PERMISSION_USED_STATS" } ] } diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 97384350..22a99240 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -120,6 +120,33 @@ class ServiceExtAbility extends ServiceExtension { } else { WindowManager.resetSizeWindow(WindowType.NAVIGATION_BAR, navigationBarRect); } + this.createPrivacyIndicatorWindow(isNewWindow,configInfo) + } + + createPrivacyIndicatorWindow(isNewWindow : boolean, config : any){ + let PrivacyIndicatorRect = { + left: 0, + top: 0, + width: config.realWidth, + height: 32 + }; + // 创建状态栏窗口 + if (isNewWindow){ + WindowManager.createWindow(this.context, WindowType.PRIVACY_INDICATOR, PrivacyIndicatorRect, "pages/PrivacyIndicatorComponent").then(() => { + Log.showInfo(TAG, "addPrivacyIndicator window has created"); + WindowManager.showWindow(WindowType.PRIVACY_INDICATOR).then(() => { + WindowManager.setWindowBgColor(WindowType.PRIVACY_INDICATOR, "#00000000") + WindowManager.setWindowTouchable(WindowType.PRIVACY_INDICATOR, false) + }) + // 窗口透明 + }) + .catch((e) => { + Log.showError(TAG, `addPrivacyIndicator create window error.`); + }); + }else { + WindowManager.resetSizeWindow(WindowType.PRIVACY_INDICATOR, PrivacyIndicatorRect) + } + } onDestroy(): void { diff --git a/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts b/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts new file mode 100644 index 00000000..580757f1 --- /dev/null +++ b/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts @@ -0,0 +1,56 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + */ + +export default class IndicatorStyle { + /** + * 圆点尺寸 + */ + static readonly indicatorSize = '5.5vp'; + + /** + * 圆点圆角半径 + */ + static readonly indicatorBorderRadius = '11px'; + + /** + * 圆点距离顶部尺寸 + */ + static readonly indicatorTopMargin = '10px'; + + /** + * 圆点距离右侧尺寸 + */ + static readonly indicatorRightMargin = '150px'; +} + +/** + * 颜色类型 + */ +export class IndicatorType { + /** + * 默认不显示 + */ + static readonly TYPE_NONE = 0; + + /** + * 相机:橙色 + * 浅色:#ED6F21 + * 深色:#DB6B42 + */ + static readonly TYPE_ORANGE = 1; + + /** + * 麦克风:绿色 + * 浅色:#64BB5C + * 深色:#5BA854 + */ + static readonly TYPE_GREEN = 2; + + /** + * 位置:蓝色 + * 浅色:#0A59F7 + * 深色:#317AF7 + */ + static readonly TYPE_BLUE = 3; +} diff --git a/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets b/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets new file mode 100644 index 00000000..fc5de798 --- /dev/null +++ b/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + */ + +import { ViewModel } from '../viewmodel/ViewModel'; +import IndicatorStyle, { IndicatorType } from '../common/IndicatorConfig'; + +@Entry +@Component +export default struct PrivacyIndicatorComponent { + private mViewModel: ViewModel; + @State mBackgroundColor: Resource = $r("app.color.transparent"); + + aboutToAppear(): void { + this.mViewModel = new ViewModel(); + this.mViewModel.setCallback((type) => { + if (type == IndicatorType.TYPE_ORANGE) { + this.mBackgroundColor = $r("app.color.indicator_color_orange"); + } else if (type == IndicatorType.TYPE_GREEN) { + this.mBackgroundColor = $r("app.color.indicator_color_green"); + } else if (type == IndicatorType.TYPE_BLUE) { + this.mBackgroundColor = $r("app.color.indicator_color_blue"); + } else { + // 不显示 + this.mBackgroundColor = $r("app.color.transparent"); + } + }); + this.mViewModel.registerPrivacyStateListener(); + } + + aboutToDisappear(): void { + if (this.mViewModel != null) { + this.mViewModel.unregisterPrivacyStateListener(); + } + } + + build() { + Row() { + Text() + .width(IndicatorStyle.indicatorSize) + .height(IndicatorStyle.indicatorSize) + .borderRadius(IndicatorStyle.indicatorBorderRadius) + .backgroundColor(this.mBackgroundColor) + .margin({ top: IndicatorStyle.indicatorTopMargin, right: IndicatorStyle.indicatorRightMargin }); + } + .width('100%') + .justifyContent(FlexAlign.End) + .alignItems(VerticalAlign.Top) + } +} \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts new file mode 100644 index 00000000..25dcb679 --- /dev/null +++ b/product/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts @@ -0,0 +1,126 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + */ + +import privacyManager from '@ohos.privacyManager'; +import { Permissions } from 'permissions'; +import { IndicatorType } from '../common/IndicatorConfig'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; + +const TAG = "PrivacyIndicatorViewModel"; + +/** + * 表示未使用权限。 + */ +const PERMISSION_INACTIVE = 0; + +/** + * 相机权限 + */ +const PERMISSION_CAMERA = 'ohos.permission.CAMERA'; + +/** + * 定位权限 + */ +const PERMISSION_LOCATION = 'ohos.permission.LOCATION'; +const PERMISSION_APPROXIMATELY_LOCATION = 'ohos.permission.APPROXIMATELY_LOCATION'; +const PERMISSION_LOCATION_IN_BACKGROUND = 'ohos.permission.LOCATION_IN_BACKGROUND'; + +/** + * 麦克风权限 + */ +const PERMISSION_MICROPHONE = 'ohos.permission.MICROPHONE'; + +export class ViewModel { + private permissionNameList: Permissions[] = [PERMISSION_CAMERA, PERMISSION_MICROPHONE, + PERMISSION_LOCATION, PERMISSION_APPROXIMATELY_LOCATION, PERMISSION_LOCATION_IN_BACKGROUND]; + private mIndicatorStatusMap: Map; + private mLocationStatusMap: Map; + private mCallback: (type: number) => {}; + + constructor() { + this.mIndicatorStatusMap = new Map(); + this.mIndicatorStatusMap.set(IndicatorType.TYPE_ORANGE, false); + this.mIndicatorStatusMap.set(IndicatorType.TYPE_GREEN, false); + this.mIndicatorStatusMap.set(IndicatorType.TYPE_BLUE, false); + this.mLocationStatusMap = new Map(); + this.mLocationStatusMap.set(PERMISSION_LOCATION, false); + this.mLocationStatusMap.set(PERMISSION_APPROXIMATELY_LOCATION, false); + this.mLocationStatusMap.set(PERMISSION_LOCATION_IN_BACKGROUND, false); + } + + setCallback(callback) { + this.mCallback = callback; + } + + registerPrivacyStateListener(): void { + try { + privacyManager.on('activeStateChange', this.permissionNameList, (data) => { + Log.showInfo(TAG, "permission state changed."); + if (data == null) { + Log.showWarn(TAG, "response is invalid."); + return; + } + const isShow = data.activeStatus != PERMISSION_INACTIVE; + switch (data.permissionName) { + case PERMISSION_CAMERA: + this.refreshIndicatorStatus(IndicatorType.TYPE_ORANGE, isShow); + break; + case PERMISSION_MICROPHONE: + this.refreshIndicatorStatus(IndicatorType.TYPE_GREEN, isShow); + break; + case PERMISSION_LOCATION: + case PERMISSION_LOCATION_IN_BACKGROUND: + case PERMISSION_APPROXIMATELY_LOCATION: + this.mLocationStatusMap.set(data.permissionName, isShow); + this.refreshIndicatorStatus(IndicatorType.TYPE_BLUE, this.getLocationStatus()); + break; + default: + Log.showDebug(TAG, "no privacy type matched."); + break; + } + }); + } catch (err) { + Log.showError(TAG, `registerPrivacyStateListener error => ${JSON.stringify(err)}`); + } + } + + unregisterPrivacyStateListener(): void { + try { + privacyManager.off('activeStateChange', this.permissionNameList); + } catch (err) { + Log.showError(TAG, "unregisterPrivacyStateListener error."); + } + } + + /** + * 优先级:橙色相机>绿色麦克风>蓝色定位 + */ + private refreshIndicatorStatus(type: number, isShow: boolean): void { + Log.showInfo(TAG, `indicator ${type} isShow: ${isShow}`); + this.mIndicatorStatusMap.set(type, isShow); + let resultType = IndicatorType.TYPE_NONE; + if (this.mIndicatorStatusMap.get(IndicatorType.TYPE_ORANGE)) { + resultType = IndicatorType.TYPE_ORANGE; + } else if (this.mIndicatorStatusMap.get(IndicatorType.TYPE_GREEN)) { + resultType = IndicatorType.TYPE_GREEN; + } else if (this.mIndicatorStatusMap.get(IndicatorType.TYPE_BLUE)) { + resultType = IndicatorType.TYPE_BLUE; + } else { + Log.showDebug(TAG, "refresh no type matched."); + } + if (this.mCallback) { + this.mCallback(resultType); + } + } + + /** + * 定位权限 + * LOCATION_IN_BACKGROUND权限在后台时为true,前台时为false + */ + private getLocationStatus(): boolean { + return this.mLocationStatusMap.get(PERMISSION_LOCATION) || + this.mLocationStatusMap.get(PERMISSION_APPROXIMATELY_LOCATION) || + this.mLocationStatusMap.get(PERMISSION_LOCATION_IN_BACKGROUND); + } +} \ No newline at end of file diff --git a/product/default/navigationBar/src/main/resources/base/element/color.json b/product/default/navigationBar/src/main/resources/base/element/color.json index 26637d9f..bdca0046 100644 --- a/product/default/navigationBar/src/main/resources/base/element/color.json +++ b/product/default/navigationBar/src/main/resources/base/element/color.json @@ -7,6 +7,22 @@ { "name": "button_click_background", "value": "#DCDCDC" + }, + { + "name": "transparent", + "value": "#00000000" + }, + { + "name": "indicator_color_orange", + "value": "#ED6F21" + }, + { + "name": "indicator_color_green", + "value": "#64BB5C" + }, + { + "name": "indicator_color_blue", + "value": "#0A59F7" } ] } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/resources/base/element/string.json b/product/default/navigationBar/src/main/resources/base/element/string.json index ee6513e8..f0c3fc3c 100644 --- a/product/default/navigationBar/src/main/resources/base/element/string.json +++ b/product/default/navigationBar/src/main/resources/base/element/string.json @@ -39,6 +39,10 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "module_desc", + "value": "privacy indicator" } ] } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/resources/base/profile/main_pages.json b/product/default/navigationBar/src/main/resources/base/profile/main_pages.json index 59129d3e..03892be8 100644 --- a/product/default/navigationBar/src/main/resources/base/profile/main_pages.json +++ b/product/default/navigationBar/src/main/resources/base/profile/main_pages.json @@ -1,6 +1,7 @@ { "src": [ "pages/index", - "pages/SplitBarIndex" + "pages/SplitBarIndex", + "pages/PrivacyIndicatorComponent" ] } diff --git a/product/default/navigationBar/src/main/resources/en_US/element/string.json b/product/default/navigationBar/src/main/resources/en_US/element/string.json index ee6513e8..f0c3fc3c 100644 --- a/product/default/navigationBar/src/main/resources/en_US/element/string.json +++ b/product/default/navigationBar/src/main/resources/en_US/element/string.json @@ -39,6 +39,10 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "module_desc", + "value": "privacy indicator" } ] } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/resources/zh_CN/element/string.json b/product/default/navigationBar/src/main/resources/zh_CN/element/string.json index ee6513e8..f0c3fc3c 100644 --- a/product/default/navigationBar/src/main/resources/zh_CN/element/string.json +++ b/product/default/navigationBar/src/main/resources/zh_CN/element/string.json @@ -39,6 +39,10 @@ { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "module_desc", + "value": "privacy indicator" } ] } \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index bf53a336..8601f6c7 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -66,7 +66,6 @@ class ServiceExtAbility extends ServiceExtension { height: configInfo.height, }); }).then(() => { - Log.showInfo(TAG, `Spike ==> ${JSON.stringify(volumeRect)}`); WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); }).catch((err) => { }); -- Gitee From 95a6fb117dc2ff02914abcf07c68cc7bdaa01a4d Mon Sep 17 00:00:00 2001 From: fangzheng24 Date: Mon, 20 Feb 2023 17:07:59 +0800 Subject: [PATCH 324/373] =?UTF-8?q?=E9=80=82=E9=85=8D=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E5=AD=90=E7=B3=BB=E7=BB=9F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: fangzheng24 --- .../src/main/ets/com/ohos/model/accountsModel.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index 1927666d..caaec5fb 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -176,10 +176,10 @@ export default class AccountsModel { private sortAccount(info1, info2): number { if (info1.isActived || info2.isActived) { return info1.isActived ? -1 : 1; - } else if (info1.type.ADMIN == TYPE_ADMIN || info2.type.ADMIN == TYPE_ADMIN) { - return info1.type.ADMIN == TYPE_ADMIN ? -1 : 1; - } else if (info1.type.GUEST == TYPE_GUEST || info2.type.GUEST == TYPE_GUEST) { - return info1.type.GUEST == TYPE_GUEST ? 1 : -1; + } else if (info1.type.ADMIN == osAccount.OsAccoutType.ADMIN || info2.type.ADMIN == osAccount.OsAccoutType.ADMIN) { + return info1.type.ADMIN == osAccount.OsAccoutType.ADMIN ? -1 : 1; + } else if (info1.type.GUEST == osAccount.OsAccoutType.GUEST || info2.type.GUEST == osAccount.OsAccoutType.GUEST) { + return info1.type.GUEST == osAccount.OsAccoutType.GUEST ? 1 : -1; } else { return info2.localId - info1.localId; } -- Gitee From e4ffb9606044bbb0fce6fa54645fc553dd509d4d Mon Sep 17 00:00:00 2001 From: fangzheng24 Date: Tue, 21 Feb 2023 11:32:52 +0800 Subject: [PATCH 325/373] =?UTF-8?q?=E9=80=82=E9=85=8D=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E5=AD=90=E7=B3=BB=E7=BB=9F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: fangzheng24 --- .../src/main/ets/com/ohos/model/accountsModel.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index caaec5fb..a6bb3e7f 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -176,10 +176,10 @@ export default class AccountsModel { private sortAccount(info1, info2): number { if (info1.isActived || info2.isActived) { return info1.isActived ? -1 : 1; - } else if (info1.type.ADMIN == osAccount.OsAccoutType.ADMIN || info2.type.ADMIN == osAccount.OsAccoutType.ADMIN) { - return info1.type.ADMIN == osAccount.OsAccoutType.ADMIN ? -1 : 1; - } else if (info1.type.GUEST == osAccount.OsAccoutType.GUEST || info2.type.GUEST == osAccount.OsAccoutType.GUEST) { - return info1.type.GUEST == osAccount.OsAccoutType.GUEST ? 1 : -1; + } else if (info1.type == osAccount.OsAccoutType.ADMIN || info2.type == osAccount.OsAccoutType.ADMIN) { + return info1.type == osAccount.OsAccoutType.ADMIN ? -1 : 1; + } else if (info1.type == osAccount.OsAccoutType.GUEST || info2.type == osAccount.OsAccoutType.GUEST) { + return info1.type == osAccount.OsAccoutType.GUEST ? 1 : -1; } else { return info2.localId - info1.localId; } -- Gitee From 35e63d5d7e466d6d3b6a315402ba584ca5464660 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Tue, 21 Feb 2023 17:35:48 +0800 Subject: [PATCH 326/373] =?UTF-8?q?=E9=9A=90=E7=A7=81=E4=BF=9D=E6=8A=A4?= =?UTF-8?q?=E5=B0=8F=E5=9C=86=E7=82=B9=E9=9C=80=E6=B1=82=EF=BC=8C=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=A0=8F=E5=81=B6=E7=8E=B0=E6=8B=89=E4=B8=8D=E4=B8=8B?= =?UTF-8?q?=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SEASON_SYSU --- common/src/main/ets/default/WindowManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index 78d52445..e6229608 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -152,7 +152,7 @@ class WindowManager { } async setWindowTouchable(windowName: string, touchable: boolean): void { - let window = await Window.find(name) + let window = await Window.find(windowName) window.setWindowTouchable(touchable); } -- Gitee From d4706bf41159a47266d4ddeec5f45409aab39f0e Mon Sep 17 00:00:00 2001 From: liuchao92 Date: Wed, 22 Feb 2023 10:34:48 +0800 Subject: [PATCH 327/373] add window scene Signed-off-by: liuchao92 --- common/index.ets | 9 +- .../animation/HWTransitionEffect.ets | 61 +++++++ .../scene/session/HWRootSceneSession.ets | 51 ++++++ .../WindowScene/scene/session/HWSceneInfo.ts | 31 ++++ .../scene/session/HWSceneSession.ets | 56 +++++++ .../scene/session/HWSceneSessionManager.ets | 79 +++++++++ .../screen/session/HWScreenSession.ets | 106 +++++++++++++ .../screen/session/HWScreenSessionManager.ets | 125 +++++++++++++++ .../src/main/ets/MainAbility/MainAbility.ts | 39 ++--- .../src/main/ets/WindowScene/HWScene.ets | 32 ++++ .../src/main/ets/WindowScene/HWScenePanel.ets | 34 ++++ .../src/main/ets/WindowScene/HWScreen.ets | 53 +++++++ .../phone/src/main/ets/pages/EntryView.ets | 150 ++---------------- 13 files changed, 672 insertions(+), 154 deletions(-) create mode 100644 common/src/main/ets/WindowScene/animation/HWTransitionEffect.ets create mode 100644 common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets create mode 100644 common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts create mode 100644 common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets create mode 100644 common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets create mode 100644 common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets create mode 100644 common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets create mode 100644 product/phone/src/main/ets/WindowScene/HWScene.ets create mode 100644 product/phone/src/main/ets/WindowScene/HWScenePanel.ets create mode 100644 product/phone/src/main/ets/WindowScene/HWScreen.ets diff --git a/common/index.ets b/common/index.ets index b87558f5..023f99d0 100644 --- a/common/index.ets +++ b/common/index.ets @@ -84,4 +84,11 @@ export { SettingItemsConfig } from './src/main/ets/default/configs/SettingItems export { SettingItemsManager } from './src/main/ets/default/settings/SettingItemsManager' export { SettingItemOptionsChecker } from './src/main/ets/default/settings/SettingItemOptionsChecker' export { DragArea } from './src/main/ets/default/interface/DragArea' -export { DragItemPosition } from './src/main/ets/default/interface/DragItemPosition' \ No newline at end of file +export { DragItemPosition } from './src/main/ets/default/interface/DragItemPosition' + +// HyperWindow +export { HWRootSceneSession } from './src/main/ets/WindowScene/scene/session/HWRootSceneSession' +export { HWSceneSession } from './src/main/ets/WindowScene/scene/session/HWSceneSession' +export { HWSceneSessionManager } from './src/main/ets/WindowScene/scene/session/HWSceneSessionManager' +export { HWScreenSession } from './src/main/ets/WindowScene/screen/session/HWScreenSession' +export { HWScreenSessionManager } from './src/main/ets/WindowScene/screen/session/HWScreenSessionManager' \ No newline at end of file diff --git a/common/src/main/ets/WindowScene/animation/HWTransitionEffect.ets b/common/src/main/ets/WindowScene/animation/HWTransitionEffect.ets new file mode 100644 index 00000000..bfaeda2d --- /dev/null +++ b/common/src/main/ets/WindowScene/animation/HWTransitionEffect.ets @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export class SharedTransitionParam { + readonly namespace: string = 'WindowScene'; + // effect: SharedEffect + // anchor + // isSource:bool +} + +// TODO Transition configuration +export class HWTransitionEffect { + static DEFAULT: HWTransitionEffect; + + static APPEAR_FROM_ITEM: HWTransitionEffect; + static APPEAR_FROM_ITEM_PC: HWTransitionEffect; + static APPEAR_FROM_NONE: HWTransitionEffect; + static APPEAR_FROM_SCENE: HWTransitionEffect; + + static DISAPPEAR_FROM_SCENE: HWTransitionEffect; + static DISAPPEAR_TO_HOME: HWTransitionEffect; + static DISAPPEAR_TO_HOME_PC: HWTransitionEffect; + + constructor() {} + + /* + * Transition effect while view appearing or disappearing + */ + // transitionEffect: TransitionEffect; + + /* + * Shared transition effect while view appearing or disappearing + */ + // sharedTransitionParam: SharedTransitionParam + + /* + * Animation param + */ + animationParam: AnimateParam +} + +HWTransitionEffect.DEFAULT = new HWTransitionEffect(); +HWTransitionEffect.APPEAR_FROM_ITEM = new HWTransitionEffect(); +HWTransitionEffect.APPEAR_FROM_NONE = new HWTransitionEffect(); +HWTransitionEffect.APPEAR_FROM_SCENE = new HWTransitionEffect(); +HWTransitionEffect.APPEAR_FROM_ITEM_PC = new HWTransitionEffect(); +HWTransitionEffect.DISAPPEAR_FROM_SCENE = new HWTransitionEffect(); +HWTransitionEffect.DISAPPEAR_TO_HOME = new HWTransitionEffect(); +HWTransitionEffect.DISAPPEAR_TO_HOME_PC = new HWTransitionEffect(); diff --git a/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets b/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets new file mode 100644 index 00000000..9a78a53e --- /dev/null +++ b/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2023 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 sceneSessionManager from '@ohos.sceneSessionManager'; + +import { HWSceneInfo } from './HWSceneInfo'; +import { HWSceneSessionManager } from './HWSceneSessionManager'; +import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager'; +import { HWTransitionEffect } from '../../animation/HWTransitionEffect'; +import ServiceExtensionContext from 'application/ServiceExtensionContext'; + +export class HWRootSceneSession { + readonly session: sceneSessionManager.RootSceneSession; + + constructor() { + this.session = sceneSessionManager.getRootSceneSession(); + // this.session.on('pendingSceneSessionActivation', (info) => { + // this.onPendingSceneSessionActivation(info); + // }) + } + + public loadContent(path: string, context: ServiceExtensionContext): void { + this.session.loadContent(path, context); + } + + private onPendingSceneSessionActivation(sceneInfo: sceneSessionManager.SceneInfo): void { + let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession(); + let hwSceneInfo: HWSceneInfo = { + bundleName: sceneInfo.bundleName, + abilityName: sceneInfo.abilityName, + screenId: mainScreenSession.session.screenId + } + + let sceneSession = HWSceneSessionManager.getInstance().requestSceneSession(hwSceneInfo); + mainScreenSession.addSceneSession(sceneSession); + HWSceneSessionManager.getInstance().requestSceneSessionActivation(sceneSession); + sceneSession.setTransitionEffect(HWTransitionEffect.APPEAR_FROM_NONE); + } +} diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts b/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts new file mode 100644 index 00000000..f5dc0b69 --- /dev/null +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2023 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 interface HWSceneInfo { + /** + * Bundle name. + */ + bundleName : string; + + /** + * Ability name. + */ + abilityName: string; + + /** + * Identifier which screen the scene is displayed. + */ + screenId: number; +} \ No newline at end of file diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets new file mode 100644 index 00000000..67b2bcb1 --- /dev/null +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2023 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 sceneSessionManager from '@ohos.sceneSessionManager'; +import { HWSceneInfo } from './HWSceneInfo'; +import { HWSceneSessionManager } from './HWSceneSessionManager'; +import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager'; +import { HWTransitionEffect } from '../../animation/HWTransitionEffect'; + +@Observed +export class HWSceneSession { + readonly sceneInfo: HWSceneInfo; + readonly session: sceneSessionManager.SceneSession; + transitionEffect: HWTransitionEffect = HWTransitionEffect.DEFAULT + + constructor(session: sceneSessionManager.SceneSession, sceneInfo: HWSceneInfo) { + this.sceneInfo = sceneInfo; + this.session = session; + this.session.on('pendingSceneSessionActivation', (info) => { + this.onPendingSceneSessionActivation(info); + }); + } + + private onPendingSceneSessionActivation(sceneInfo: sceneSessionManager.SceneInfo) { + let screenSession = HWScreenSessionManager.getInstance().getScreenSession(this.sceneInfo.screenId); + let hwSceneInfo: HWSceneInfo = { + bundleName: sceneInfo.bundleName, + abilityName: sceneInfo.abilityName, + screenId: screenSession.session.screenId + } + + let sceneSession = HWSceneSessionManager.getInstance().requestSceneSession(hwSceneInfo); + screenSession.addSceneSession(sceneSession); + screenSession.removeSceneSession(this); + HWSceneSessionManager.getInstance().requestSceneSessionActivation(sceneSession); + + sceneSession.setTransitionEffect(HWTransitionEffect.APPEAR_FROM_SCENE); + this.setTransitionEffect(HWTransitionEffect.DISAPPEAR_FROM_SCENE); + } + + public setTransitionEffect(effect: HWTransitionEffect): void { + this.transitionEffect = effect; + } +} diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets new file mode 100644 index 00000000..72129725 --- /dev/null +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2023 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 sceneSessionManager from '@ohos.sceneSessionManager'; + +import { HWRootSceneSession } from './HWRootSceneSession' +import { HWSceneInfo } from './HWSceneInfo'; +import { HWSceneSession } from './HWSceneSession'; +import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager'; +import ServiceExtensionContext from 'application/ServiceExtensionContext'; + +import { Log } from '../../../default/utils/Log'; + +const TAG = 'HWSceneSessionManager'; + +export class HWSceneSessionManager { + private rootSceneSession: HWRootSceneSession; + + private constructor() { + this.rootSceneSession = new HWRootSceneSession(); + } + + static getInstance(): HWSceneSessionManager { + if (!globalThis.HWSceneSessionManagerInstance) { + globalThis.HWSceneSessionManagerInstance = new HWSceneSessionManager(); + } + + return globalThis.HWSceneSessionManagerInstance; + } + + public getRootSceneSession(): HWRootSceneSession { + return this.rootSceneSession; + } + + public loadContent(path: string, context: ServiceExtensionContext): void { + this.rootSceneSession.loadContent(path, context); + } + + public requestSceneSession(sceneInfo: HWSceneInfo, forceNew: boolean = false): HWSceneSession { + let screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneInfo.screenId); + if (screenSession == undefined) { + Log.showError(TAG, 'Undefined screen!'); + return undefined; + } + + let hwSceneSession = screenSession.getSceneSession(sceneInfo); + if (hwSceneSession == undefined || forceNew) { + let sceneSession = sceneSessionManager.requestSceneSession( + { bundleName: sceneInfo.bundleName, abilityName: sceneInfo.abilityName }); + hwSceneSession = new HWSceneSession(sceneSession, sceneInfo); + } + + return hwSceneSession; + } + + public async requestSceneSessionActivation(sceneSession: HWSceneSession): Promise { + sceneSessionManager.requestSceneSessionActivation(sceneSession.session); + } + + public async requestSceneSessionBackground(sceneSession: HWSceneSession): Promise { + sceneSessionManager.requestSceneSessionBackground(sceneSession.session); + } + + public async requestSceneSessionDestruction(sceneSession: HWSceneSession): Promise { + sceneSessionManager.requestSceneSessionDestruction(sceneSession.session) + } +} diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets new file mode 100644 index 00000000..ed813f36 --- /dev/null +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2023 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 screenSessionManager from '@ohos.screenSessionManager' +import { HWSceneSession } from '../../scene/session/HWSceneSession' +import { Log } from '../../../default/utils/Log' +import { HWSceneInfo } from '../../scene/session/HWSceneInfo' + +const TAG = 'HWScreenSession'; + +@Observed +export class HWScreenSession { + public readonly session: screenSessionManager.ScreenSession + public bounds: screenSessionManager.RRect + public rotation: number + public hwSceneSessionList: HWSceneSession[] = [] + + constructor(session: screenSessionManager.ScreenSession) { + this.session = session; + this.session.on('connect', (screenProperty: screenSessionManager.ScreenProperty) => { + this.onScreenConnect(screenProperty); + }); + this.session.on('disconnect', () => { + this.onScreenDisconnect(); + }); + this.session.on('propertyChange', (screenProperty: screenSessionManager.ScreenProperty) => { + this.onScreenPropertyChange(screenProperty); + }); + + this.rotation = 0 + this.bounds = { left:0, top:0, width:0, height:0, radius:0 } + } + + private updateProperty(screenProperty: screenSessionManager.ScreenProperty) { + this.bounds = screenProperty.bounds; + this.rotation = screenProperty.rotation; + Log.showInfo(TAG, `updateProperty bounds [${this.bounds.left}, ${this.bounds.top}, ${this.bounds.width}, ${this.bounds.height}]`); + } + + private onScreenConnect(screenProperty: screenSessionManager.ScreenProperty): void { + Log.showInfo(TAG, 'On screen connect.'); + this.updateProperty(screenProperty); + } + + private onScreenDisconnect(): void { + Log.showInfo(TAG, 'On screen disconnect.'); + } + + private onScreenPropertyChange(screenProperty: screenSessionManager.ScreenProperty): void { + Log.showInfo(TAG, 'On screen property change.'); + this.updateProperty(screenProperty); + } + + private findSceneSession(persistentId: number): number { + const sceneSessionIndex = this.hwSceneSessionList.findIndex(item => { + item.session.persistentId === persistentId; + }); + + return sceneSessionIndex; + } + + public addSceneSession(sceneSession: HWSceneSession): void { + const sceneSessionIndex = this.findSceneSession(sceneSession.session.persistentId); + if (sceneSessionIndex != -1) { + Log.showInfo(TAG, 'Repeat to add scene session.'); + return; + } + + this.hwSceneSessionList.push(sceneSession); + } + + public removeSceneSession(sceneSession: HWSceneSession): void { + const sceneSessionIndex = this.findSceneSession(sceneSession.session.persistentId); + if (sceneSessionIndex == -1) { + Log.showError(TAG, 'Can not find the scene session.'); + return; + } + + this.hwSceneSessionList.splice(sceneSessionIndex, 1); + } + + public getSceneSession(sceneInfo: HWSceneInfo): HWSceneSession { + const sceneSessionIndex = this.hwSceneSessionList.findIndex(item => { + item.sceneInfo.abilityName === sceneInfo.abilityName && + item.sceneInfo.bundleName === sceneInfo.bundleName; + }) + + if (sceneSessionIndex != -1) { + return this.hwSceneSessionList[sceneSessionIndex]; + } else { + return undefined; + } + } +} diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets new file mode 100644 index 00000000..99920492 --- /dev/null +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2023 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 screenSessionManager from '@ohos.screenSessionManager'; + +import { HWScreenSession } from './HWScreenSession'; +import { Log } from '../../../default/utils/Log'; + +const TAG = 'HWScreenSessionManager'; + +export class HWScreenSessionManager { +// @StorageLink('screenSessionList') screenSessionList: HWScreenSession[] = []; + + private constructor() {} + + static getInstance(): HWScreenSessionManager { + if (!globalThis.HWScreenSessionManagerInstance) { + globalThis.HWScreenSessionManagerInstance = new HWScreenSessionManager(); + } + + return globalThis.HWScreenSessionManagerInstance; + } + + public init(): void { + this.registerScreenConnectionListener(); + } + + private registerScreenConnectionListener(): void { + screenSessionManager.on('screenConnectChange', (callbackInfo) => { + this.onScreenConnectChange(callbackInfo.screenSession, callbackInfo.screenConnectChangeType); + }); + } + + private onScreenConnectChange(session: screenSessionManager.ScreenSession, + changeType: screenSessionManager.ScreenConnectChangeType) { + if (changeType == 0) { + this.onScreenConnect(session); + } + + if (changeType == 1) { + this.onScreenDisconnect(session); + } + } + + private onScreenConnect(session: screenSessionManager.ScreenSession): void { + Log.showInfo(TAG, 'On screen connect.'); + let screenSession: HWScreenSession = new HWScreenSession(session); + this.addScreenSession(screenSession); + } + + private onScreenDisconnect(session: screenSessionManager.ScreenSession): void { + Log.showInfo(TAG, 'On screen disconnect.'); + this.removeScreenSession(session.screenId); + } + + private addScreenSession(screenSession: HWScreenSession) { + const screenSessionIndex = this.findScreenSession(screenSession.session.screenId); + if (screenSessionIndex != -1) { + return; + } + + let screenSessionList: HWScreenSession[] = []; + if (AppStorage.Has('screenSessionList') == false) { + AppStorage.SetOrCreate('screenSessionList', screenSessionList); + } else { + screenSessionList = AppStorage.Get('screenSessionList'); + } + screenSessionList.push(screenSession); + AppStorage.Set('screenSessionList', screenSessionList); + } + + private removeScreenSession(screenId: number) { + const screenSessionIndex = this.findScreenSession(screenId); + if (screenSessionIndex == -1) { + return; + } + + let screenSessionList = AppStorage.Get('screenSessionList'); + screenSessionList.splice(screenSessionIndex, 1); + AppStorage.Set('screenSessionList', screenSessionList); + } + + private findScreenSession(screenId: number): number { + if (AppStorage.Has('screenSessionList') == false) { + return -1; + } + let screenSessionList = AppStorage.Get('screenSessionList'); + const screenSessionIndex = screenSessionList.findIndex(item => { + item.session.screenId === screenId; + }); + + return screenSessionIndex; + } + + public getScreenSession(screenId: number): HWScreenSession { + const screenSessionIndex = this.findScreenSession(screenId); + if (screenSessionIndex == -1) { + return undefined; + } + + let screenSessionList = AppStorage.Get('screenSessionList'); + return screenSessionList[screenSessionIndex]; + } + + public getMainScreenSession(): HWScreenSession { + let screenSessionList = AppStorage.Get('screenSessionList'); + if (screenSessionList.length > 0) { + return screenSessionList[0]; + } + + return undefined; + } +} diff --git a/product/phone/src/main/ets/MainAbility/MainAbility.ts b/product/phone/src/main/ets/MainAbility/MainAbility.ts index 9eb373de..0f1e4686 100644 --- a/product/phone/src/main/ets/MainAbility/MainAbility.ts +++ b/product/phone/src/main/ets/MainAbility/MainAbility.ts @@ -20,6 +20,7 @@ import { Log } from '@ohos/common'; import { windowManager } from '@ohos/common'; import { RdbStoreManager } from '@ohos/common'; import { FormConstants } from '@ohos/common'; +import { HWSceneSessionManager } from '@ohos/common'; import { GestureNavigationManager } from '@ohos/gesturenavigation'; import StyleConstants from '../common/constants/StyleConstants'; import { navigationBarCommonEventManager } from '@ohos/common'; @@ -49,26 +50,28 @@ export default class MainAbility extends ServiceExtension { await dbStore.initRdbConfig(); await dbStore.createTable(); - windowManager.registerWindowEvent(); - navigationBarCommonEventManager.registerNavigationBarEvent(); +// windowManager.registerWindowEvent(); +// navigationBarCommonEventManager.registerNavigationBarEvent(); +// +// // create Launcher entry view +// windowManager.createWindow(globalThis.desktopContext, windowManager.DESKTOP_WINDOW_NAME, +// windowManager.DESKTOP_RANK, 'pages/' + windowManager.DESKTOP_WINDOW_NAME, true); +// +// // load recent +// windowManager.createRecentWindow(); - // create Launcher entry view - windowManager.createWindow(globalThis.desktopContext, windowManager.DESKTOP_WINDOW_NAME, - windowManager.DESKTOP_RANK, 'pages/' + windowManager.DESKTOP_WINDOW_NAME, true); - - // load recent - windowManager.createRecentWindow(); + HWSceneSessionManager.getInstance().loadContent('pages/EntryView', this.context); } private initGlobalConst(): void { // init create window global function globalThis.createWindowWithName = ((windowName: string, windowRank: number): void => { Log.showInfo(TAG, `createWindowWithName begin windowName: ${windowName}`); - if (windowName === windowManager.RECENT_WINDOW_NAME) { - windowManager.createRecentWindow(); - } else { - windowManager.createWindowIfAbsent(globalThis.desktopContext, windowName, windowRank, 'pages/' + windowName); - } +// if (windowName === windowManager.RECENT_WINDOW_NAME) { +// windowManager.createRecentWindow(); +// } else { +// windowManager.createWindowIfAbsent(globalThis.desktopContext, windowName, windowRank, 'pages/' + windowName); +// } }); } @@ -81,10 +84,10 @@ export default class MainAbility extends ServiceExtension { } onDestroy(): void { - windowManager.unregisterWindowEvent(); + //windowManager.unregisterWindowEvent(); navigationBarCommonEventManager.unregisterNavigationBarEvent(); - windowManager.destroyWindow(windowManager.DESKTOP_WINDOW_NAME); - windowManager.destroyRecentWindow(); + //windowManager.destroyWindow(windowManager.DESKTOP_WINDOW_NAME); + //windowManager.destroyRecentWindow(); Log.showInfo(TAG, 'onDestroy success'); } @@ -95,9 +98,9 @@ export default class MainAbility extends ServiceExtension { PageDesktopViewModel.getInstance().publishCardToDesktop(want.parameters); } if (startId !== 1) { - windowManager.minimizeAllApps(); + //windowManager.minimizeAllApps(); } - windowManager.hideWindow(windowManager.RECENT_WINDOW_NAME); + //windowManager.hideWindow(windowManager.RECENT_WINDOW_NAME); this.closeFolder(); } diff --git a/product/phone/src/main/ets/WindowScene/HWScene.ets b/product/phone/src/main/ets/WindowScene/HWScene.ets new file mode 100644 index 00000000..0a78c70c --- /dev/null +++ b/product/phone/src/main/ets/WindowScene/HWScene.ets @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2023 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 { HWSceneSession } from '@ohos/common'; + +@Component +export struct HWScene { + @ObjectLink sceneSession: HWSceneSession + + build() { + Stack() { + // Status bar + + HostWindowScene(this.sceneSession) + + // Gesture navigation bar + } + } +} + diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets new file mode 100644 index 00000000..b4bff17c --- /dev/null +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2023 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 curves from '@ohos.curves'; + +import { HWSceneSession } from '@ohos/common'; +import { HWScene } from './HWScene'; + +@Component +export struct HWScenePanel { + @Link sceneSessionList: HWSceneSession[] + + build() { + Stack() { + ForEach(this.sceneSessionList, (item: HWSceneSession) => { + HWScene({sceneSession: item}) + .transition({ scale: {x: 0.5, y: 0.5}, opacity: 1 }) + .animation({ curve: curves.springMotion() }) + }) + } + } +} diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets new file mode 100644 index 00000000..96a7170b --- /dev/null +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2023 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 curves from '@ohos.curves'; + +import { HWScenePanel } from './HWScenePanel' +import { HWScreenSession } from '@ohos/common' +import { PageDesktopLayout } from '@ohos/pagedesktop'; +import { SmartDock } from '@ohos/smartdock'; + +// TODO for temp test +import StyleConstants from '../common/constants/StyleConstants'; + +@Component +export struct HWScreen { + @ObjectLink screenSession: HWScreenSession + + build() { + Screen(this.screenSession.session) { + // Wallpaper + Image(StyleConstants.DEFAULT_BACKGROUND_IMAGE) + .objectFit(ImageFit.Cover) + +// // Launcher +// PageDesktopLayout() +// +// // Smart dock +// SmartDock() +// +// // Scene +// HWScenePanel({sceneSessionList: $screenSession.hwSceneSessionList}) + + // Systemui + + } + .position({x: this.screenSession.bounds.left, y: this.screenSession.bounds.top}) + .width(this.screenSession.bounds.width) + .height(this.screenSession.bounds.height) + .animation({curve: curves.springMotion()}) + } +} diff --git a/product/phone/src/main/ets/pages/EntryView.ets b/product/phone/src/main/ets/pages/EntryView.ets index 9e809420..73a030ce 100644 --- a/product/phone/src/main/ets/pages/EntryView.ets +++ b/product/phone/src/main/ets/pages/EntryView.ets @@ -1,5 +1,5 @@ -/** - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. +/* + * Copyright (c) 2023 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 @@ -13,147 +13,27 @@ * limitations under the License. */ -import { Log } from '@ohos/common'; -import { CommonConstants } from '@ohos/common'; -import { EventConstants } from '@ohos/common'; -import { windowManager } from '@ohos/common'; -import { localEventManager } from '@ohos/common'; -import { SettingsModel } from '@ohos/common'; -import { LayoutViewModel } from '@ohos/common'; -import { SmartDock } from '@ohos/smartdock'; -import { PageDesktopLayout } from '@ohos/pagedesktop'; -import { FolderOpenComponent } from '@ohos/bigfolder'; -import { BigFolderConstants } from '@ohos/bigfolder'; -import PhoneStage from '../common/PhoneStage'; -import StyleConstants from '../common/constants/StyleConstants'; - -const TAG = "EntryView"; +import { HWRootSceneSession } from '@ohos/common' +import { HWScreenSession } from '@ohos/common' +import { HWSceneSessionManager } from '@ohos/common' +import { HWScreenSessionManager } from '@ohos/common' +import { HWScreen } from '../WindowScene/HWScreen' @Entry @Component struct EntryView { - @StorageLink('screenWidth') screenWidth: number = 0; - @StorageLink('screenHeight') @Watch('updateScreenInfo') screenHeight: number = 0; - @StorageLink('deviceType') deviceType: string = CommonConstants.DEFAULT_DEVICE_TYPE; - @State workSpaceWidth: number = 0; - @State workSpaceHeight: number = 0; - @State dockHeight: number = 0; - private mStage: PhoneStage = new PhoneStage(); - private mLayoutViewModel: LayoutViewModel; - private navigationBarStatus: string | undefined; - - onPageShow(): void { - Log.showInfo(TAG, 'onPageShow'); - } - - onPageHide(): void { - Log.showInfo(TAG, 'onPageHide'); - } - - aboutToAppear(): void { - Log.showInfo(TAG, 'aboutToAppear'); - this.mStage.onCreate(); - - // init layout config - this.mLayoutViewModel = LayoutViewModel.getInstance(); - this.getWindowSize(); - this.updateScreenSize(); - - this.registerPageDesktopNavigatorStatusChangeEvent(this.mLocalEventListener); - this.navigationBarStatus = SettingsModel.getInstance().getValue(); - } - - registerPageDesktopNavigatorStatusChangeEvent(listener): void { - localEventManager.registerEventListener(listener, [EventConstants.EVENT_NAVIGATOR_BAR_STATUS_CHANGE]); - } - - private readonly mLocalEventListener = { - onReceiveEvent: (event, params) => { - Log.showDebug(TAG, `receive event: ${event}, params: ${params}`); - if (event === EventConstants.EVENT_NAVIGATOR_BAR_STATUS_CHANGE) { - this.navigationBarStatus = params; - this.updateScreenInfo(); - } - } - }; + @StorageLink('screenSessionList') screenSessionList: HWScreenSession[] = [] + private rootSceneSession: HWRootSceneSession = HWSceneSessionManager.getInstance().getRootSceneSession(); - aboutToDisappear(): void { - this.mStage.onDestroy(); - Log.showInfo(TAG, 'aboutToDisappear'); - } - - onBackPress(): boolean { - Log.showInfo(TAG, 'onBackPress'); - ContextMenu.close(); - AppStorage.SetOrCreate('dialogControllerStatus', !AppStorage.Get('dialogControllerStatus')); - AppStorage.SetOrCreate('overlayMode', CommonConstants.OVERLAY_TYPE_HIDE); - AppStorage.SetOrCreate('openFolderStatus', BigFolderConstants.OPEN_FOLDER_STATUS_CLOSE); - return true; - } - - private updateScreenInfo(): void { - Log.showDebug(TAG, 'updateScreenInfo'); - if (this.screenWidth != 0 && this.screenHeight != 0) { - this.mLayoutViewModel.initScreen(this.navigationBarStatus); - globalThis.SmartDockStyleConfig.initConfig(); - globalThis.PhonePageDesktopGridStyleConfig.initConfig(); - globalThis.BigFolderStyleConfigInstance.initConfig(); - globalThis.FormStyleConfigInstance.initConfig(); - this.updateScreenSize(); - } - } - - private async getWindowSize(): Promise { - try { - this.screenWidth = await windowManager.getWindowWidth(); - this.screenHeight = await windowManager.getWindowHeight(); - AppStorage.SetOrCreate('screenWidth', this.screenWidth); - AppStorage.SetOrCreate('screenHeight', this.screenHeight); - } catch (error) { - Log.showError(TAG, `getWindowWidth or getWindowHeight error: ${error}`); - } - } - - private updateScreenSize(): void { - this.workSpaceWidth = this.screenWidth; - this.workSpaceHeight = this.mLayoutViewModel.getWorkSpaceHeight(); - this.dockHeight = this.mLayoutViewModel.getDockHeight(); - AppStorage.SetOrCreate('workSpaceWidth', this.workSpaceWidth); - AppStorage.SetOrCreate('workSpaceHeight', this.workSpaceHeight); - AppStorage.SetOrCreate('dockHeight', this.dockHeight); - Log.showDebug(TAG, `updateScreenSize product: ${this.deviceType}, screenWidth: ${this.screenWidth}, screenHeight: ${this.screenHeight}, - workSpaceWidth: ${this.workSpaceWidth}, workSpaceHeight: ${this.workSpaceHeight}, dockHeight: ${this.dockHeight}`); + aboutToAppear() { + HWScreenSessionManager.getInstance().init(); } build() { - Stack() { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - Column() { - PageDesktopLayout(); - } - .height(this.workSpaceHeight) - .onAreaChange((oldValue: Area, newValue: Area): void => { - Log.showDebug(TAG, `onAreaChange navigationBarStatus: ${this.navigationBarStatus}`); - if (JSON.stringify(oldValue) == JSON.stringify(newValue)) return; - if (this.navigationBarStatus == "1") { - setTimeout(() => { - SettingsModel.getInstance().setValue(this.navigationBarStatus); - }, 50) - } - }) - - Column() { - SmartDock(); - } - .height(this.dockHeight) - } - - FolderOpenComponent(); + RootScene(this.rootSceneSession.session) { + ForEach(this.screenSessionList, (item) => { + HWScreen({screenSession: item}) + }) } - .backgroundImage(StyleConstants.DEFAULT_BACKGROUND_IMAGE) - .backgroundImageSize(ImageSize.Cover) - .backgroundImagePosition(Alignment.Center) - .width('100%') - .height('100%') } } -- Gitee From 07b81e31e64271edba973567a20347d1032971b6 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Thu, 23 Feb 2023 17:06:15 +0800 Subject: [PATCH 328/373] =?UTF-8?q?=E5=85=8D=E6=89=93=E6=89=B0back?= =?UTF-8?q?=E5=9B=9E=E6=98=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SEASON_SYSU --- common/src/main/ets/default/WindowManager.ts | 4 ++-- .../main/ets/com/ohos/view/component/noDisturbComponent.ets | 4 ++-- .../navigationBar/src/main/ets/common/IndicatorConfig.ts | 6 +++--- .../src/main/ets/pages/PrivacyIndicatorComponent.ets | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index e6229608..0dfc71fb 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -146,8 +146,8 @@ class WindowManager { } async setWindowBgColor(name: WindowType, bgColor: string): void { - let window = await Window.find(name) - window.setWindowBackgroundColor(bgColor); + let window = await Window.find(name) + window.setWindowBackgroundColor(bgColor); } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets index 992315d1..279dc1d0 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets @@ -21,7 +21,7 @@ const TAG = 'ManagementComponent-NoDisturbComponent'; @Component export default struct NoDisturbComponent { @State mViewModel: ViewModel = new ViewModel() - @State @Watch('onRefresh') refreshRequest: number= 0 + @Prop @Watch('onRefresh') refreshRequest: number mPrevReapMode: number = 0; mPrevStartTime: Date= new Date() mPrevEndTime: Date= new Date() @@ -36,7 +36,7 @@ export default struct NoDisturbComponent { this.mRefreshCnt++; } - onRefresh(propName: string): void { + onRefresh(): void { Log.showInfo(TAG, `onRefresh`); this.mViewModel.viewModelInit(); this.mPrevGetCnt = 0; diff --git a/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts b/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts index 580757f1..aaa4c738 100644 --- a/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts +++ b/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts @@ -11,17 +11,17 @@ export default class IndicatorStyle { /** * 圆点圆角半径 */ - static readonly indicatorBorderRadius = '11px'; + static readonly indicatorBorderRadius = '3vp'; /** * 圆点距离顶部尺寸 */ - static readonly indicatorTopMargin = '10px'; + static readonly indicatorTopMargin = '3.5vp'; /** * 圆点距离右侧尺寸 */ - static readonly indicatorRightMargin = '150px'; + static readonly indicatorRightMargin = '37.5vp'; } /** diff --git a/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets b/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets index c16d71e4..12be103a 100644 --- a/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets +++ b/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets @@ -26,11 +26,11 @@ export default struct PrivacyIndicatorComponent { this.mViewModel = new ViewModel(); this.mViewModel.setCallback((type) => { if (type == IndicatorType.TYPE_ORANGE) { - this.mBackgroundColor = $r("app.color.indicator_color_orange"); + this.mBackgroundColor = $r("sys.color.ohos_id_color_alert"); } else if (type == IndicatorType.TYPE_GREEN) { - this.mBackgroundColor = $r("app.color.indicator_color_green"); + this.mBackgroundColor = $r("sys.color.ohos_id_color_connected"); } else if (type == IndicatorType.TYPE_BLUE) { - this.mBackgroundColor = $r("app.color.indicator_color_blue"); + this.mBackgroundColor = $r("sys.color.ohos_id_color_activated"); } else { // 不显示 this.mBackgroundColor = $r("app.color.transparent"); -- Gitee From 6f3b482cd85dde68ffd198e7ac8203da9768934e Mon Sep 17 00:00:00 2001 From: liuchao92 Date: Sat, 25 Feb 2023 11:20:54 +0800 Subject: [PATCH 329/373] add transition effect Signed-off-by: liuchao92 --- .../animation/HWTransitionEffect.ets | 34 ++--- .../scene/session/HWRootSceneSession.ets | 42 +++--- .../WindowScene/scene/session/HWSceneInfo.ts | 9 +- .../scene/session/HWSceneSession.ets | 50 ++++--- .../scene/session/HWSceneSessionManager.ets | 79 +++++++---- .../screen/session/HWScreenSession.ets | 81 +++++++----- .../screen/session/HWScreenSessionManager.ets | 124 ++++++++++-------- .../src/main/ets/MainAbility/MainAbility.ts | 4 +- .../src/main/ets/WindowScene/HWScreen.ets | 6 +- .../phone/src/main/ets/pages/EntryView.ets | 7 +- 10 files changed, 261 insertions(+), 175 deletions(-) diff --git a/common/src/main/ets/WindowScene/animation/HWTransitionEffect.ets b/common/src/main/ets/WindowScene/animation/HWTransitionEffect.ets index bfaeda2d..a369f67a 100644 --- a/common/src/main/ets/WindowScene/animation/HWTransitionEffect.ets +++ b/common/src/main/ets/WindowScene/animation/HWTransitionEffect.ets @@ -14,7 +14,7 @@ */ export class SharedTransitionParam { - readonly namespace: string = 'WindowScene'; + readonly namespace: string = 'WindowScene' // effect: SharedEffect // anchor // isSource:bool @@ -22,16 +22,16 @@ export class SharedTransitionParam { // TODO Transition configuration export class HWTransitionEffect { - static DEFAULT: HWTransitionEffect; + static DEFAULT: HWTransitionEffect - static APPEAR_FROM_ITEM: HWTransitionEffect; - static APPEAR_FROM_ITEM_PC: HWTransitionEffect; - static APPEAR_FROM_NONE: HWTransitionEffect; - static APPEAR_FROM_SCENE: HWTransitionEffect; + static APPEAR_FROM_ITEM: HWTransitionEffect + static APPEAR_FROM_ITEM_PC: HWTransitionEffect + static APPEAR_FROM_NONE: HWTransitionEffect + static APPEAR_FROM_SCENE: HWTransitionEffect - static DISAPPEAR_FROM_SCENE: HWTransitionEffect; - static DISAPPEAR_TO_HOME: HWTransitionEffect; - static DISAPPEAR_TO_HOME_PC: HWTransitionEffect; + static DISAPPEAR_FROM_SCENE: HWTransitionEffect + static DISAPPEAR_TO_HOME: HWTransitionEffect + static DISAPPEAR_TO_HOME_PC: HWTransitionEffect constructor() {} @@ -51,11 +51,11 @@ export class HWTransitionEffect { animationParam: AnimateParam } -HWTransitionEffect.DEFAULT = new HWTransitionEffect(); -HWTransitionEffect.APPEAR_FROM_ITEM = new HWTransitionEffect(); -HWTransitionEffect.APPEAR_FROM_NONE = new HWTransitionEffect(); -HWTransitionEffect.APPEAR_FROM_SCENE = new HWTransitionEffect(); -HWTransitionEffect.APPEAR_FROM_ITEM_PC = new HWTransitionEffect(); -HWTransitionEffect.DISAPPEAR_FROM_SCENE = new HWTransitionEffect(); -HWTransitionEffect.DISAPPEAR_TO_HOME = new HWTransitionEffect(); -HWTransitionEffect.DISAPPEAR_TO_HOME_PC = new HWTransitionEffect(); +HWTransitionEffect.DEFAULT = new HWTransitionEffect() +HWTransitionEffect.APPEAR_FROM_ITEM = new HWTransitionEffect() +HWTransitionEffect.APPEAR_FROM_NONE = new HWTransitionEffect() +HWTransitionEffect.APPEAR_FROM_SCENE = new HWTransitionEffect() +HWTransitionEffect.APPEAR_FROM_ITEM_PC = new HWTransitionEffect() +HWTransitionEffect.DISAPPEAR_FROM_SCENE = new HWTransitionEffect() +HWTransitionEffect.DISAPPEAR_TO_HOME = new HWTransitionEffect() +HWTransitionEffect.DISAPPEAR_TO_HOME_PC = new HWTransitionEffect() diff --git a/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets b/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets index 9a78a53e..fe0ff507 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets +++ b/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets @@ -13,39 +13,47 @@ * limitations under the License. */ -import sceneSessionManager from '@ohos.sceneSessionManager'; +import sceneSessionManager from '@ohos.sceneSessionManager' -import { HWSceneInfo } from './HWSceneInfo'; -import { HWSceneSessionManager } from './HWSceneSessionManager'; -import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager'; -import { HWTransitionEffect } from '../../animation/HWTransitionEffect'; -import ServiceExtensionContext from 'application/ServiceExtensionContext'; +import { HWSceneInfo } from './HWSceneInfo' +import { HWSceneSessionManager } from './HWSceneSessionManager' +import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager' +import { HWTransitionEffect } from '../../animation/HWTransitionEffect' +import ServiceExtensionContext from 'application/ServiceExtensionContext' +/** + * Scene session of the root scene. + */ export class HWRootSceneSession { - readonly session: sceneSessionManager.RootSceneSession; + readonly session: sceneSessionManager.RootSceneSession constructor() { - this.session = sceneSessionManager.getRootSceneSession(); - // this.session.on('pendingSceneSessionActivation', (info) => { - // this.onPendingSceneSessionActivation(info); - // }) + this.session = sceneSessionManager.getRootSceneSession() + this.session.on('pendingSceneSessionActivation', (info) => { + this.onPendingSceneSessionActivation(info) + }) } + /** + * Load the ui content of the root scene. + * @param path Path of the page which the root scene will be loaded + * @param context Context of the service extension + */ public loadContent(path: string, context: ServiceExtensionContext): void { - this.session.loadContent(path, context); + this.session.loadContent(path, context) } private onPendingSceneSessionActivation(sceneInfo: sceneSessionManager.SceneInfo): void { - let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession(); + let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession() let hwSceneInfo: HWSceneInfo = { bundleName: sceneInfo.bundleName, abilityName: sceneInfo.abilityName, screenId: mainScreenSession.session.screenId } - let sceneSession = HWSceneSessionManager.getInstance().requestSceneSession(hwSceneInfo); - mainScreenSession.addSceneSession(sceneSession); - HWSceneSessionManager.getInstance().requestSceneSessionActivation(sceneSession); - sceneSession.setTransitionEffect(HWTransitionEffect.APPEAR_FROM_NONE); + let sceneSession = HWSceneSessionManager.getInstance().requestSceneSession(hwSceneInfo) + mainScreenSession.addSceneSession(sceneSession) + HWSceneSessionManager.getInstance().requestSceneSessionActivation(sceneSession) + sceneSession.setTransitionEffect(HWTransitionEffect.APPEAR_FROM_NONE) } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts b/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts index f5dc0b69..6cfedc7c 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts @@ -13,19 +13,22 @@ * limitations under the License. */ +/** + * Information of a scene. + */ export interface HWSceneInfo { /** * Bundle name. */ - bundleName : string; + bundleName : string /** * Ability name. */ - abilityName: string; + abilityName: string /** * Identifier which screen the scene is displayed. */ - screenId: number; + screenId: number } \ No newline at end of file diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets index 67b2bcb1..cb06dfc9 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets @@ -13,44 +13,56 @@ * limitations under the License. */ -import sceneSessionManager from '@ohos.sceneSessionManager'; -import { HWSceneInfo } from './HWSceneInfo'; -import { HWSceneSessionManager } from './HWSceneSessionManager'; -import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager'; -import { HWTransitionEffect } from '../../animation/HWTransitionEffect'; +import sceneSessionManager from '@ohos.sceneSessionManager' +import { HWSceneInfo } from './HWSceneInfo' +import { HWSceneSessionManager } from './HWSceneSessionManager' +import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager' +import { HWTransitionEffect } from '../../animation/HWTransitionEffect' +/** + * Session of a scene. + */ @Observed export class HWSceneSession { - readonly sceneInfo: HWSceneInfo; - readonly session: sceneSessionManager.SceneSession; + readonly sceneInfo: HWSceneInfo + readonly session: sceneSessionManager.SceneSession transitionEffect: HWTransitionEffect = HWTransitionEffect.DEFAULT + /** + * Constructor. + * @param session Session of the scene + * @param sceneInfo Information of the scene + */ constructor(session: sceneSessionManager.SceneSession, sceneInfo: HWSceneInfo) { - this.sceneInfo = sceneInfo; - this.session = session; + this.sceneInfo = sceneInfo + this.session = session this.session.on('pendingSceneSessionActivation', (info) => { - this.onPendingSceneSessionActivation(info); - }); + this.onPendingSceneSessionActivation(info) + }) } private onPendingSceneSessionActivation(sceneInfo: sceneSessionManager.SceneInfo) { - let screenSession = HWScreenSessionManager.getInstance().getScreenSession(this.sceneInfo.screenId); + let screenSession = HWScreenSessionManager.getInstance().getScreenSession(this.sceneInfo.screenId) let hwSceneInfo: HWSceneInfo = { bundleName: sceneInfo.bundleName, abilityName: sceneInfo.abilityName, screenId: screenSession.session.screenId } - let sceneSession = HWSceneSessionManager.getInstance().requestSceneSession(hwSceneInfo); - screenSession.addSceneSession(sceneSession); - screenSession.removeSceneSession(this); - HWSceneSessionManager.getInstance().requestSceneSessionActivation(sceneSession); + let sceneSession = HWSceneSessionManager.getInstance().requestSceneSession(hwSceneInfo) + screenSession.addSceneSession(sceneSession) + screenSession.removeSceneSession(this) + HWSceneSessionManager.getInstance().requestSceneSessionActivation(sceneSession) - sceneSession.setTransitionEffect(HWTransitionEffect.APPEAR_FROM_SCENE); - this.setTransitionEffect(HWTransitionEffect.DISAPPEAR_FROM_SCENE); + sceneSession.setTransitionEffect(HWTransitionEffect.APPEAR_FROM_SCENE) + this.setTransitionEffect(HWTransitionEffect.DISAPPEAR_FROM_SCENE) } + /** + * Set the transition effect. + * @param effect Effect of the transition + */ public setTransitionEffect(effect: HWTransitionEffect): void { - this.transitionEffect = effect; + this.transitionEffect = effect } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets index 72129725..f927c506 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets @@ -13,66 +13,97 @@ * limitations under the License. */ -import sceneSessionManager from '@ohos.sceneSessionManager'; - +import sceneSessionManager from '@ohos.sceneSessionManager' +import ServiceExtensionContext from 'application/ServiceExtensionContext' import { HWRootSceneSession } from './HWRootSceneSession' -import { HWSceneInfo } from './HWSceneInfo'; -import { HWSceneSession } from './HWSceneSession'; -import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager'; -import ServiceExtensionContext from 'application/ServiceExtensionContext'; - -import { Log } from '../../../default/utils/Log'; +import { HWSceneInfo } from './HWSceneInfo' +import { HWSceneSession } from './HWSceneSession' +import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager' +import { Log } from '../../../default/utils/Log' -const TAG = 'HWSceneSessionManager'; +const TAG = 'HWSceneSessionManager' +/** + * Scene session manager + */ export class HWSceneSessionManager { - private rootSceneSession: HWRootSceneSession; + private rootSceneSession: HWRootSceneSession private constructor() { - this.rootSceneSession = new HWRootSceneSession(); + this.rootSceneSession = new HWRootSceneSession() } + /** + * Get the singleton of the scene session manasession_stage.cppger. + */ static getInstance(): HWSceneSessionManager { if (!globalThis.HWSceneSessionManagerInstance) { - globalThis.HWSceneSessionManagerInstance = new HWSceneSessionManager(); + globalThis.HWSceneSessionManagerInstance = new HWSceneSessionManager() } - return globalThis.HWSceneSessionManagerInstance; + return globalThis.HWSceneSessionManagerInstance } + /** + * Get the session of the root scene. + * @return Session of the root scene + */ public getRootSceneSession(): HWRootSceneSession { - return this.rootSceneSession; + return this.rootSceneSession } + /** + * Load the ui content of the root scene. + * @param path Path of the page which the root scene will be loaded + * @param context Context of the service extension + */ public loadContent(path: string, context: ServiceExtensionContext): void { - this.rootSceneSession.loadContent(path, context); + this.rootSceneSession.loadContent(path, context) } + /** + * Request a scene session. + * @param sceneInfo Information of the scene + * @param forceNew True return a new session otherwise return the exist session + * @return Session of the scene + */ public requestSceneSession(sceneInfo: HWSceneInfo, forceNew: boolean = false): HWSceneSession { - let screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneInfo.screenId); + let screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneInfo.screenId) if (screenSession == undefined) { - Log.showError(TAG, 'Undefined screen!'); - return undefined; + Log.showError(TAG, 'Undefined screen!') + return undefined } - let hwSceneSession = screenSession.getSceneSession(sceneInfo); + let hwSceneSession = screenSession.getSceneSession(sceneInfo) if (hwSceneSession == undefined || forceNew) { let sceneSession = sceneSessionManager.requestSceneSession( - { bundleName: sceneInfo.bundleName, abilityName: sceneInfo.abilityName }); - hwSceneSession = new HWSceneSession(sceneSession, sceneInfo); + { bundleName: sceneInfo.bundleName, abilityName: sceneInfo.abilityName }) + hwSceneSession = new HWSceneSession(sceneSession, sceneInfo) } - return hwSceneSession; + return hwSceneSession } + /** + * Request the scene session activation. + * @param sceneSession The session of the scene which to be activated + */ public async requestSceneSessionActivation(sceneSession: HWSceneSession): Promise { - sceneSessionManager.requestSceneSessionActivation(sceneSession.session); + sceneSessionManager.requestSceneSessionActivation(sceneSession.session) } + /** + * Request the scene session background. + * @param sceneSession The session of the scene which to be background + */ public async requestSceneSessionBackground(sceneSession: HWSceneSession): Promise { - sceneSessionManager.requestSceneSessionBackground(sceneSession.session); + sceneSessionManager.requestSceneSessionBackground(sceneSession.session) } + /** + * Request the scene session destruction. + * @param sceneSession The session of the scene which to be destroyed + */ public async requestSceneSessionDestruction(sceneSession: HWSceneSession): Promise { sceneSessionManager.requestSceneSessionDestruction(sceneSession.session) } diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets index ed813f36..76eb096e 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets @@ -18,8 +18,11 @@ import { HWSceneSession } from '../../scene/session/HWSceneSession' import { Log } from '../../../default/utils/Log' import { HWSceneInfo } from '../../scene/session/HWSceneInfo' -const TAG = 'HWScreenSession'; +const TAG = 'HWScreenSession' +/** + * Session of a screen. + */ @Observed export class HWScreenSession { public readonly session: screenSessionManager.ScreenSession @@ -27,80 +30,98 @@ export class HWScreenSession { public rotation: number public hwSceneSessionList: HWSceneSession[] = [] + /** + * Constructor. + * @param session Session of the screen + */ constructor(session: screenSessionManager.ScreenSession) { - this.session = session; + this.session = session this.session.on('connect', (screenProperty: screenSessionManager.ScreenProperty) => { - this.onScreenConnect(screenProperty); - }); + this.onScreenConnect(screenProperty) + }) this.session.on('disconnect', () => { - this.onScreenDisconnect(); - }); + this.onScreenDisconnect() + }) this.session.on('propertyChange', (screenProperty: screenSessionManager.ScreenProperty) => { - this.onScreenPropertyChange(screenProperty); - }); + this.onScreenPropertyChange(screenProperty) + }) this.rotation = 0 this.bounds = { left:0, top:0, width:0, height:0, radius:0 } } private updateProperty(screenProperty: screenSessionManager.ScreenProperty) { - this.bounds = screenProperty.bounds; - this.rotation = screenProperty.rotation; - Log.showInfo(TAG, `updateProperty bounds [${this.bounds.left}, ${this.bounds.top}, ${this.bounds.width}, ${this.bounds.height}]`); + this.bounds = screenProperty.bounds + this.rotation = screenProperty.rotation + Log.showInfo(TAG, `Update screen bounds[${this.bounds.left}, ${this.bounds.top}, + ${this.bounds.width}, ${this.bounds.height}]`) } private onScreenConnect(screenProperty: screenSessionManager.ScreenProperty): void { - Log.showInfo(TAG, 'On screen connect.'); - this.updateProperty(screenProperty); + Log.showInfo(TAG, 'On screen connection.') + this.updateProperty(screenProperty) } private onScreenDisconnect(): void { - Log.showInfo(TAG, 'On screen disconnect.'); + Log.showInfo(TAG, 'On screen disconnection.') } private onScreenPropertyChange(screenProperty: screenSessionManager.ScreenProperty): void { - Log.showInfo(TAG, 'On screen property change.'); - this.updateProperty(screenProperty); + Log.showInfo(TAG, 'On screen property change.') + this.updateProperty(screenProperty) } private findSceneSession(persistentId: number): number { const sceneSessionIndex = this.hwSceneSessionList.findIndex(item => { - item.session.persistentId === persistentId; - }); + item.session.persistentId === persistentId + }) - return sceneSessionIndex; + return sceneSessionIndex } + /** + * Add the scene session to this screen. + * @param sceneSession The session of the scene which will be added to the screen + */ public addSceneSession(sceneSession: HWSceneSession): void { - const sceneSessionIndex = this.findSceneSession(sceneSession.session.persistentId); + const sceneSessionIndex = this.findSceneSession(sceneSession.session.persistentId) if (sceneSessionIndex != -1) { - Log.showInfo(TAG, 'Repeat to add scene session.'); - return; + Log.showInfo(TAG, 'Repeat to add scene session.') + return } - this.hwSceneSessionList.push(sceneSession); + this.hwSceneSessionList.push(sceneSession) } + /** + * Remove the scene session from this screen. + * @param sceneSession The session of the scene which will be removed from the screen + */ public removeSceneSession(sceneSession: HWSceneSession): void { - const sceneSessionIndex = this.findSceneSession(sceneSession.session.persistentId); + const sceneSessionIndex = this.findSceneSession(sceneSession.session.persistentId) if (sceneSessionIndex == -1) { - Log.showError(TAG, 'Can not find the scene session.'); - return; + Log.showError(TAG, 'Can not find the scene session.') + return } - this.hwSceneSessionList.splice(sceneSessionIndex, 1); + this.hwSceneSessionList.splice(sceneSessionIndex, 1) } + /** + * Get the scene session by the scene information. + * @param sceneInfo The information of the scene + * @return Session of the scene + */ public getSceneSession(sceneInfo: HWSceneInfo): HWSceneSession { const sceneSessionIndex = this.hwSceneSessionList.findIndex(item => { item.sceneInfo.abilityName === sceneInfo.abilityName && - item.sceneInfo.bundleName === sceneInfo.bundleName; + item.sceneInfo.bundleName === sceneInfo.bundleName }) if (sceneSessionIndex != -1) { - return this.hwSceneSessionList[sceneSessionIndex]; + return this.hwSceneSessionList[sceneSessionIndex] } else { - return undefined; + return undefined } } } diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets index 99920492..561f368d 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets @@ -13,113 +13,129 @@ * limitations under the License. */ -import screenSessionManager from '@ohos.screenSessionManager'; +import screenSessionManager from '@ohos.screenSessionManager' +import { HWScreenSession } from './HWScreenSession' +import { Log } from '../../../default/utils/Log' -import { HWScreenSession } from './HWScreenSession'; -import { Log } from '../../../default/utils/Log'; - -const TAG = 'HWScreenSessionManager'; +const TAG = 'HWScreenSessionManager' +/** + * Screen session manager. + */ export class HWScreenSessionManager { -// @StorageLink('screenSessionList') screenSessionList: HWScreenSession[] = []; - private constructor() {} + /** + * Get the singleton of the screen session manager. + */ static getInstance(): HWScreenSessionManager { if (!globalThis.HWScreenSessionManagerInstance) { - globalThis.HWScreenSessionManagerInstance = new HWScreenSessionManager(); + globalThis.HWScreenSessionManagerInstance = new HWScreenSessionManager() } - return globalThis.HWScreenSessionManagerInstance; + return globalThis.HWScreenSessionManagerInstance } + /** + * Init the screen session manager. + */ public init(): void { - this.registerScreenConnectionListener(); + this.registerScreenConnectionListener() } private registerScreenConnectionListener(): void { screenSessionManager.on('screenConnectChange', (callbackInfo) => { - this.onScreenConnectChange(callbackInfo.screenSession, callbackInfo.screenConnectChangeType); - }); + this.onScreenConnectChange(callbackInfo.screenSession, callbackInfo.screenConnectChangeType) + }) } private onScreenConnectChange(session: screenSessionManager.ScreenSession, changeType: screenSessionManager.ScreenConnectChangeType) { if (changeType == 0) { - this.onScreenConnect(session); + this.onScreenConnect(session) } if (changeType == 1) { - this.onScreenDisconnect(session); + this.onScreenDisconnect(session) } } private onScreenConnect(session: screenSessionManager.ScreenSession): void { - Log.showInfo(TAG, 'On screen connect.'); - let screenSession: HWScreenSession = new HWScreenSession(session); - this.addScreenSession(screenSession); + Log.showInfo(TAG, 'On screen connect.') + let screenSession: HWScreenSession = new HWScreenSession(session) + this.addScreenSession(screenSession) } private onScreenDisconnect(session: screenSessionManager.ScreenSession): void { - Log.showInfo(TAG, 'On screen disconnect.'); - this.removeScreenSession(session.screenId); + Log.showInfo(TAG, 'On screen disconnect.') + this.removeScreenSession(session.screenId) } - private addScreenSession(screenSession: HWScreenSession) { - const screenSessionIndex = this.findScreenSession(screenSession.session.screenId); - if (screenSessionIndex != -1) { - return; - } - - let screenSessionList: HWScreenSession[] = []; + private getScreenSessionList(): HWScreenSession[] { if (AppStorage.Has('screenSessionList') == false) { - AppStorage.SetOrCreate('screenSessionList', screenSessionList); - } else { - screenSessionList = AppStorage.Get('screenSessionList'); + AppStorage.SetOrCreate('screenSessionList', []) } - screenSessionList.push(screenSession); - AppStorage.Set('screenSessionList', screenSessionList); + + return AppStorage.Get('screenSessionList') } - private removeScreenSession(screenId: number) { - const screenSessionIndex = this.findScreenSession(screenId); - if (screenSessionIndex == -1) { - return; + private setScreenSessionList(screenSessionList: HWScreenSession[]): void { + AppStorage.Set('screenSessionList', screenSessionList) + } + + private addScreenSession(screenSession: HWScreenSession) { + let screenSessionList = this.getScreenSessionList() + const screenSessionIndex = screenSessionList.findIndex(item => { + item.session.screenId === screenSession.session.screenId + }) + if (screenSessionIndex != -1) { + return } - let screenSessionList = AppStorage.Get('screenSessionList'); - screenSessionList.splice(screenSessionIndex, 1); - AppStorage.Set('screenSessionList', screenSessionList); + screenSessionList.push(screenSession) + this.setScreenSessionList(screenSessionList) } - private findScreenSession(screenId: number): number { - if (AppStorage.Has('screenSessionList') == false) { - return -1; - } - let screenSessionList = AppStorage.Get('screenSessionList'); + private removeScreenSession(screenId: number) { + let screenSessionList = this.getScreenSessionList() const screenSessionIndex = screenSessionList.findIndex(item => { - item.session.screenId === screenId; - }); + item.session.screenId === screenId + }) + if (screenSessionIndex == -1) { + return + } - return screenSessionIndex; + screenSessionList.splice(screenSessionIndex, 1) + this.setScreenSessionList(screenSessionList) } + /** + * Get the screen session by screen id. + * @param screenId Id of the screen + * @return Session of the screen + */ public getScreenSession(screenId: number): HWScreenSession { - const screenSessionIndex = this.findScreenSession(screenId); - if (screenSessionIndex == -1) { - return undefined; + let screenSessionList = this.getScreenSessionList() + const screenSessionIndex = screenSessionList.findIndex(item => { + item.session.screenId === screenId + }) + if (screenSessionIndex != -1) { + return undefined } - let screenSessionList = AppStorage.Get('screenSessionList'); - return screenSessionList[screenSessionIndex]; + return screenSessionList[screenSessionIndex] } + /** + * Get the root screen session. + * @return Session of the main screen + */ public getMainScreenSession(): HWScreenSession { - let screenSessionList = AppStorage.Get('screenSessionList'); + let screenSessionList = this.getScreenSessionList() if (screenSessionList.length > 0) { - return screenSessionList[0]; + return screenSessionList[0] } - return undefined; + return undefined } } diff --git a/product/phone/src/main/ets/MainAbility/MainAbility.ts b/product/phone/src/main/ets/MainAbility/MainAbility.ts index 0f1e4686..2ad71822 100644 --- a/product/phone/src/main/ets/MainAbility/MainAbility.ts +++ b/product/phone/src/main/ets/MainAbility/MainAbility.ts @@ -20,7 +20,8 @@ import { Log } from '@ohos/common'; import { windowManager } from '@ohos/common'; import { RdbStoreManager } from '@ohos/common'; import { FormConstants } from '@ohos/common'; -import { HWSceneSessionManager } from '@ohos/common'; +import { HWSceneSessionManager } from '@ohos/common' +import { HWScreenSessionManager } from '@ohos/common' import { GestureNavigationManager } from '@ohos/gesturenavigation'; import StyleConstants from '../common/constants/StyleConstants'; import { navigationBarCommonEventManager } from '@ohos/common'; @@ -60,6 +61,7 @@ export default class MainAbility extends ServiceExtension { // // load recent // windowManager.createRecentWindow(); + HWScreenSessionManager.getInstance().init(); HWSceneSessionManager.getInstance().loadContent('pages/EntryView', this.context); } diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index 96a7170b..37bbfa7b 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -20,8 +20,7 @@ import { HWScreenSession } from '@ohos/common' import { PageDesktopLayout } from '@ohos/pagedesktop'; import { SmartDock } from '@ohos/smartdock'; -// TODO for temp test -import StyleConstants from '../common/constants/StyleConstants'; +import StyleConstants from '../common/constants/StyleConstants' @Component export struct HWScreen { @@ -29,11 +28,10 @@ export struct HWScreen { build() { Screen(this.screenSession.session) { - // Wallpaper Image(StyleConstants.DEFAULT_BACKGROUND_IMAGE) .objectFit(ImageFit.Cover) -// // Launcher + // Launcher // PageDesktopLayout() // // // Smart dock diff --git a/product/phone/src/main/ets/pages/EntryView.ets b/product/phone/src/main/ets/pages/EntryView.ets index 73a030ce..30209a7d 100644 --- a/product/phone/src/main/ets/pages/EntryView.ets +++ b/product/phone/src/main/ets/pages/EntryView.ets @@ -14,10 +14,9 @@ */ import { HWRootSceneSession } from '@ohos/common' -import { HWScreenSession } from '@ohos/common' import { HWSceneSessionManager } from '@ohos/common' -import { HWScreenSessionManager } from '@ohos/common' import { HWScreen } from '../WindowScene/HWScreen' +import { HWScreenSession } from '@ohos/common' @Entry @Component @@ -25,10 +24,6 @@ struct EntryView { @StorageLink('screenSessionList') screenSessionList: HWScreenSession[] = [] private rootSceneSession: HWRootSceneSession = HWSceneSessionManager.getInstance().getRootSceneSession(); - aboutToAppear() { - HWScreenSessionManager.getInstance().init(); - } - build() { RootScene(this.rootSceneSession.session) { ForEach(this.screenSessionList, (item) => { -- Gitee From bb746e97fc9478247dcde59a0ddde0ef9d60ed20 Mon Sep 17 00:00:00 2001 From: liuchao92 Date: Sat, 25 Feb 2023 19:06:11 +0800 Subject: [PATCH 330/373] add scene Signed-off-by: liuchao92 --- .../scene/session/HWSceneSessionManager.ets | 2 +- .../screen/session/HWScreenSessionManager.ets | 11 +++++++---- .../phone/src/main/ets/WindowScene/HWScenePanel.ets | 2 +- product/phone/src/main/ets/pages/EntryView.ets | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets index f927c506..317751e0 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets @@ -34,7 +34,7 @@ export class HWSceneSessionManager { } /** - * Get the singleton of the scene session manasession_stage.cppger. + * Get the singleton of the scene session manager. */ static getInstance(): HWSceneSessionManager { if (!globalThis.HWSceneSessionManagerInstance) { diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets index 561f368d..5b931462 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets @@ -44,24 +44,27 @@ export class HWScreenSessionManager { } private registerScreenConnectionListener(): void { - screenSessionManager.on('screenConnectChange', (callbackInfo) => { - this.onScreenConnectChange(callbackInfo.screenSession, callbackInfo.screenConnectChangeType) + screenSessionManager.on('screenConnectChange', ({ screenSession, screenConnectChangeType }) => { + this.onScreenConnectChange(screenSession, screenConnectChangeType) }) } private onScreenConnectChange(session: screenSessionManager.ScreenSession, changeType: screenSessionManager.ScreenConnectChangeType) { - if (changeType == 0) { + Log.showInfo(TAG, 'On screen connect change, type:' + changeType + ' ' + session.screenId) + if (changeType === screenSessionManager.ScreenConnectChangeType.CONNECT) { this.onScreenConnect(session) } - if (changeType == 1) { + if (changeType === screenSessionManager.ScreenConnectChangeType.DISCONNECT) { this.onScreenDisconnect(session) } } private onScreenConnect(session: screenSessionManager.ScreenSession): void { Log.showInfo(TAG, 'On screen connect.') + + let screenSession: HWScreenSession = new HWScreenSession(session) this.addScreenSession(screenSession) } diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index b4bff17c..a5d08c95 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -28,7 +28,7 @@ export struct HWScenePanel { HWScene({sceneSession: item}) .transition({ scale: {x: 0.5, y: 0.5}, opacity: 1 }) .animation({ curve: curves.springMotion() }) - }) + }, (item: HWSceneSession) => item.session.persistentId.toString()) } } } diff --git a/product/phone/src/main/ets/pages/EntryView.ets b/product/phone/src/main/ets/pages/EntryView.ets index 30209a7d..06123e2c 100644 --- a/product/phone/src/main/ets/pages/EntryView.ets +++ b/product/phone/src/main/ets/pages/EntryView.ets @@ -28,7 +28,7 @@ struct EntryView { RootScene(this.rootSceneSession.session) { ForEach(this.screenSessionList, (item) => { HWScreen({screenSession: item}) - }) + }, (item: HWScreenSession) => item.session.screenId.toString()) } } } -- Gitee From 80e1349fd820c96b650b59c69427468b37956a24 Mon Sep 17 00:00:00 2001 From: liuchao92 Date: Mon, 27 Feb 2023 17:29:12 +0800 Subject: [PATCH 331/373] add desktop Signed-off-by: liuchao92 --- .../scene/session/HWRootSceneSession.ets | 4 + .../scene/session/HWSceneSessionManager.ets | 6 +- .../screen/session/HWScreenSession.ets | 2 +- .../screen/session/HWScreenSessionManager.ets | 4 +- .../main/ets/default/model/SettingsModel.ts | 5 +- .../src/main/ets/MainAbility/MainAbility.ts | 2 +- .../src/main/ets/WindowScene/HWDesktop.ets | 146 ++++++++++++++++++ .../src/main/ets/WindowScene/HWScenePanel.ets | 5 +- .../src/main/ets/WindowScene/HWScreen.ets | 21 +-- .../phone/src/main/ets/pages/EntryView.ets | 2 +- 10 files changed, 173 insertions(+), 24 deletions(-) create mode 100644 product/phone/src/main/ets/WindowScene/HWDesktop.ets diff --git a/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets b/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets index fe0ff507..b7a25ad4 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets +++ b/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets @@ -45,6 +45,10 @@ export class HWRootSceneSession { private onPendingSceneSessionActivation(sceneInfo: sceneSessionManager.SceneInfo): void { let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession() + if (mainScreenSession == null) { + return; + } + let hwSceneInfo: HWSceneInfo = { bundleName: sceneInfo.bundleName, abilityName: sceneInfo.abilityName, diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets index 317751e0..f56fff41 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets @@ -69,13 +69,13 @@ export class HWSceneSessionManager { */ public requestSceneSession(sceneInfo: HWSceneInfo, forceNew: boolean = false): HWSceneSession { let screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneInfo.screenId) - if (screenSession == undefined) { + if (screenSession == null) { Log.showError(TAG, 'Undefined screen!') - return undefined + return null } let hwSceneSession = screenSession.getSceneSession(sceneInfo) - if (hwSceneSession == undefined || forceNew) { + if (hwSceneSession == null || forceNew) { let sceneSession = sceneSessionManager.requestSceneSession( { bundleName: sceneInfo.bundleName, abilityName: sceneInfo.abilityName }) hwSceneSession = new HWSceneSession(sceneSession, sceneInfo) diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets index 76eb096e..217df201 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets @@ -121,7 +121,7 @@ export class HWScreenSession { if (sceneSessionIndex != -1) { return this.hwSceneSessionList[sceneSessionIndex] } else { - return undefined + return null } } } diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets index 5b931462..be93c6e9 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets @@ -123,7 +123,7 @@ export class HWScreenSessionManager { item.session.screenId === screenId }) if (screenSessionIndex != -1) { - return undefined + return null } return screenSessionList[screenSessionIndex] @@ -139,6 +139,6 @@ export class HWScreenSessionManager { return screenSessionList[0] } - return undefined + return null } } diff --git a/common/src/main/ets/default/model/SettingsModel.ts b/common/src/main/ets/default/model/SettingsModel.ts index 2dfaed40..eb4f1acb 100644 --- a/common/src/main/ets/default/model/SettingsModel.ts +++ b/common/src/main/ets/default/model/SettingsModel.ts @@ -47,7 +47,10 @@ export class SettingsModel { private constructor() { this.mPageDesktopModeConfig = layoutConfigManager.getModeConfig(PageDesktopModeConfig.DESKTOP_MODE_CONFIG); - const deviceType = this.mPageDesktopModeConfig.getDeviceType(); + let deviceType = CommonConstants.DEFAULT_DEVICE_TYPE; + if (this.mPageDesktopModeConfig != null) { + deviceType = this.mPageDesktopModeConfig.getDeviceType(); + } if (deviceType == CommonConstants.DEFAULT_DEVICE_TYPE) { this.mGridLayoutTable = GridLayoutConfigs.GridLayoutTable; } else if (deviceType == CommonConstants.PAD_DEVICE_TYPE) { diff --git a/product/phone/src/main/ets/MainAbility/MainAbility.ts b/product/phone/src/main/ets/MainAbility/MainAbility.ts index 2ad71822..e93d3140 100644 --- a/product/phone/src/main/ets/MainAbility/MainAbility.ts +++ b/product/phone/src/main/ets/MainAbility/MainAbility.ts @@ -44,7 +44,7 @@ export default class MainAbility extends ServiceExtension { this.initGlobalConst(); // init Gesture navigation - this.startGestureNavigation(); + // this.startGestureNavigation(); // init rdb let dbStore = RdbStoreManager.getInstance(); diff --git a/product/phone/src/main/ets/WindowScene/HWDesktop.ets b/product/phone/src/main/ets/WindowScene/HWDesktop.ets new file mode 100644 index 00000000..898f256a --- /dev/null +++ b/product/phone/src/main/ets/WindowScene/HWDesktop.ets @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2023 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 { Log } from '@ohos/common'; +import { CommonConstants } from '@ohos/common'; +import { EventConstants } from '@ohos/common'; +import { localEventManager } from '@ohos/common'; +import { SettingsModel } from '@ohos/common'; +import { LayoutViewModel } from '@ohos/common'; +import { SmartDock } from '@ohos/smartdock'; +import { PageDesktopLayout } from '@ohos/pagedesktop'; +import { FolderOpenComponent } from '@ohos/bigfolder'; +import { BigFolderConstants } from '@ohos/bigfolder'; +import PhoneStage from '../common/PhoneStage'; + +const TAG = "HWDesktop"; + +@Component +export struct HWDesktop { + @StorageLink('screenWidth') screenWidth: number = 0; + @StorageLink('screenHeight') @Watch('updateScreenInfo') screenHeight: number = 0; + @StorageLink('deviceType') deviceType: string = CommonConstants.DEFAULT_DEVICE_TYPE; + @State workSpaceWidth: number = 0; + @State workSpaceHeight: number = 0; + @State dockHeight: number = 0; + private mStage: PhoneStage = new PhoneStage(); + private mLayoutViewModel: LayoutViewModel; + private navigationBarStatus: string | undefined; + + aboutToAppear(): void { + Log.showInfo(TAG, 'aboutToAppear'); + this.mStage.onCreate(); + + // init layout config + this.mLayoutViewModel = LayoutViewModel.getInstance(); + this.getWindowSize(); + this.updateScreenSize(); + + this.registerPageDesktopNavigatorStatusChangeEvent(this.mLocalEventListener); + this.navigationBarStatus = SettingsModel.getInstance().getValue(); + } + + registerPageDesktopNavigatorStatusChangeEvent(listener): void { + localEventManager.registerEventListener(listener, [EventConstants.EVENT_NAVIGATOR_BAR_STATUS_CHANGE]); + } + + private readonly mLocalEventListener = { + onReceiveEvent: (event, params) => { + Log.showDebug(TAG, `receive event: ${event}, params: ${params}`); + if (event === EventConstants.EVENT_NAVIGATOR_BAR_STATUS_CHANGE) { + this.navigationBarStatus = params; + this.updateScreenInfo(); + } + } + }; + + aboutToDisappear(): void { + this.mStage.onDestroy(); + Log.showInfo(TAG, 'aboutToDisappear'); + } + + onBackPress(): boolean { + Log.showInfo(TAG, 'onBackPress'); + ContextMenu.close(); + AppStorage.SetOrCreate('dialogControllerStatus', !AppStorage.Get('dialogControllerStatus')); + AppStorage.SetOrCreate('overlayMode', CommonConstants.OVERLAY_TYPE_HIDE); + AppStorage.SetOrCreate('openFolderStatus', BigFolderConstants.OPEN_FOLDER_STATUS_CLOSE); + return true; + } + + private updateScreenInfo(): void { + Log.showDebug(TAG, 'updateScreenInfo'); + if (this.screenWidth != 0 && this.screenHeight != 0) { + this.mLayoutViewModel.initScreen(this.navigationBarStatus); + globalThis.SmartDockStyleConfig.initConfig(); + globalThis.PhonePageDesktopGridStyleConfig.initConfig(); + globalThis.BigFolderStyleConfigInstance.initConfig(); + globalThis.FormStyleConfigInstance.initConfig(); + this.updateScreenSize(); + } + } + + private async getWindowSize(): Promise { + try { + // TODO Get from screen + this.screenWidth = 720; + this.screenHeight = 1280; + AppStorage.SetOrCreate('screenWidth', this.screenWidth); + AppStorage.SetOrCreate('screenHeight', this.screenHeight); + } catch (error) { + Log.showError(TAG, `getWindowWidth or getWindowHeight error: ${error}`); + } + } + + private updateScreenSize(): void { + this.workSpaceWidth = this.screenWidth; + this.workSpaceHeight = this.mLayoutViewModel.getWorkSpaceHeight(); + this.dockHeight = this.mLayoutViewModel.getDockHeight(); + AppStorage.SetOrCreate('workSpaceWidth', this.workSpaceWidth); + AppStorage.SetOrCreate('workSpaceHeight', this.workSpaceHeight); + AppStorage.SetOrCreate('dockHeight', this.dockHeight); + Log.showDebug(TAG, `updateScreenSize product: ${this.deviceType}, screenWidth: ${this.screenWidth}, screenHeight: ${this.screenHeight}, + workSpaceWidth: ${this.workSpaceWidth}, workSpaceHeight: ${this.workSpaceHeight}, dockHeight: ${this.dockHeight}`); + } + + build() { + Stack() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Column() { + PageDesktopLayout(); + } + .height(this.workSpaceHeight) + .onAreaChange((oldValue: Area, newValue: Area): void => { + Log.showDebug(TAG, `onAreaChange navigationBarStatus: ${this.navigationBarStatus}`); + if (JSON.stringify(oldValue) == JSON.stringify(newValue)) return; + if (this.navigationBarStatus == "1") { + setTimeout(() => { + SettingsModel.getInstance().setValue(this.navigationBarStatus); + }, 50) + } + }) + + Column() { + SmartDock(); + } + .height(this.dockHeight) + } + + FolderOpenComponent(); + } + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index a5d08c95..a19a5d16 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -16,15 +16,16 @@ import curves from '@ohos.curves'; import { HWSceneSession } from '@ohos/common'; +import { HWScreenSession } from '@ohos/common' import { HWScene } from './HWScene'; @Component export struct HWScenePanel { - @Link sceneSessionList: HWSceneSession[] + @Link screenSession: HWScreenSession build() { Stack() { - ForEach(this.sceneSessionList, (item: HWSceneSession) => { + ForEach(this.screenSession.hwSceneSessionList, (item: HWSceneSession) => { HWScene({sceneSession: item}) .transition({ scale: {x: 0.5, y: 0.5}, opacity: 1 }) .animation({ curve: curves.springMotion() }) diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index 37bbfa7b..d00953b1 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -13,12 +13,10 @@ * limitations under the License. */ -import curves from '@ohos.curves'; - +import curves from '@ohos.curves' import { HWScenePanel } from './HWScenePanel' import { HWScreenSession } from '@ohos/common' -import { PageDesktopLayout } from '@ohos/pagedesktop'; -import { SmartDock } from '@ohos/smartdock'; +import { HWDesktop } from './HWDesktop' import StyleConstants from '../common/constants/StyleConstants' @@ -28,20 +26,17 @@ export struct HWScreen { build() { Screen(this.screenSession.session) { + // Wallpaper Image(StyleConstants.DEFAULT_BACKGROUND_IMAGE) .objectFit(ImageFit.Cover) - // Launcher -// PageDesktopLayout() -// -// // Smart dock -// SmartDock() -// -// // Scene -// HWScenePanel({sceneSessionList: $screenSession.hwSceneSessionList}) + // Desktop + HWDesktop() - // Systemui + // Scene + HWScenePanel({screenSession: $screenSession}) + // Systemui } .position({x: this.screenSession.bounds.left, y: this.screenSession.bounds.top}) .width(this.screenSession.bounds.width) diff --git a/product/phone/src/main/ets/pages/EntryView.ets b/product/phone/src/main/ets/pages/EntryView.ets index 06123e2c..25909b7f 100644 --- a/product/phone/src/main/ets/pages/EntryView.ets +++ b/product/phone/src/main/ets/pages/EntryView.ets @@ -22,7 +22,7 @@ import { HWScreenSession } from '@ohos/common' @Component struct EntryView { @StorageLink('screenSessionList') screenSessionList: HWScreenSession[] = [] - private rootSceneSession: HWRootSceneSession = HWSceneSessionManager.getInstance().getRootSceneSession(); + private rootSceneSession: HWRootSceneSession = HWSceneSessionManager.getInstance().getRootSceneSession() build() { RootScene(this.rootSceneSession.session) { -- Gitee From 5fe4f262ac82cdbcea1ccc1288ca94d47fa49423 Mon Sep 17 00:00:00 2001 From: liuchao92 Date: Mon, 27 Feb 2023 20:59:41 +0800 Subject: [PATCH 332/373] add wallpaper Signed-off-by: liuchao92 --- .../ets/default/layout/PageDesktopLayout.ets | 5 ++-- .../src/main/ets/WindowScene/HWDesktop.ets | 4 +-- .../src/main/ets/WindowScene/HWScreen.ets | 7 +++--- .../src/main/ets/WindowScene/HWWallpaper.ets | 25 +++++++++++++++++++ 4 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 product/phone/src/main/ets/WindowScene/HWWallpaper.ets diff --git a/feature/pagedesktop/src/main/ets/default/layout/PageDesktopLayout.ets b/feature/pagedesktop/src/main/ets/default/layout/PageDesktopLayout.ets index b10794bb..63a211fa 100644 --- a/feature/pagedesktop/src/main/ets/default/layout/PageDesktopLayout.ets +++ b/feature/pagedesktop/src/main/ets/default/layout/PageDesktopLayout.ets @@ -63,6 +63,7 @@ export struct PageDesktopLayout { this.mPageDesktopDragHandler = PageDesktopDragHandler.getInstance(); mPageDesktopViewModel = PageDesktopViewModel.getInstance(); this.gridConfig = mPageDesktopViewModel.getGridConfig().layout; + Log.showDebug(TAG, `xxxxxxxxxxxxx`+ this.gridConfig); this.updateStyle(); if (this.deviceType != CommonConstants.PAD_DEVICE_TYPE) { mPageDesktopViewModel.registerAppListChangeCallback(); @@ -106,8 +107,8 @@ export struct PageDesktopLayout { mPageDesktopViewModel: mPageDesktopViewModel, dialogController: this.deviceType == CommonConstants.PAD_DEVICE_TYPE ? null : this.dialogController }) - .width(StyleConstants.PERCENTAGE_100) - .height(StyleConstants.PERCENTAGE_100) + .width(StyleConstants.PERCENTAGE_100) + .height(StyleConstants.PERCENTAGE_100) } } diff --git a/product/phone/src/main/ets/WindowScene/HWDesktop.ets b/product/phone/src/main/ets/WindowScene/HWDesktop.ets index 898f256a..64158167 100644 --- a/product/phone/src/main/ets/WindowScene/HWDesktop.ets +++ b/product/phone/src/main/ets/WindowScene/HWDesktop.ets @@ -37,7 +37,7 @@ export struct HWDesktop { @State dockHeight: number = 0; private mStage: PhoneStage = new PhoneStage(); private mLayoutViewModel: LayoutViewModel; - private navigationBarStatus: string | undefined; + private navigationBarStatus: string | undefined = '0'; aboutToAppear(): void { Log.showInfo(TAG, 'aboutToAppear'); @@ -49,7 +49,7 @@ export struct HWDesktop { this.updateScreenSize(); this.registerPageDesktopNavigatorStatusChangeEvent(this.mLocalEventListener); - this.navigationBarStatus = SettingsModel.getInstance().getValue(); + // this.navigationBarStatus = SettingsModel.getInstance().getValue(); } registerPageDesktopNavigatorStatusChangeEvent(listener): void { diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index d00953b1..4b34984b 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -17,8 +17,8 @@ import curves from '@ohos.curves' import { HWScenePanel } from './HWScenePanel' import { HWScreenSession } from '@ohos/common' import { HWDesktop } from './HWDesktop' +import { HWWallpaper } from './HWWallpaper' -import StyleConstants from '../common/constants/StyleConstants' @Component export struct HWScreen { @@ -27,14 +27,13 @@ export struct HWScreen { build() { Screen(this.screenSession.session) { // Wallpaper - Image(StyleConstants.DEFAULT_BACKGROUND_IMAGE) - .objectFit(ImageFit.Cover) + HWWallpaper() // Desktop HWDesktop() // Scene - HWScenePanel({screenSession: $screenSession}) + // HWScenePanel({screenSession: $screenSession}) // Systemui } diff --git a/product/phone/src/main/ets/WindowScene/HWWallpaper.ets b/product/phone/src/main/ets/WindowScene/HWWallpaper.ets new file mode 100644 index 00000000..e9834423 --- /dev/null +++ b/product/phone/src/main/ets/WindowScene/HWWallpaper.ets @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023 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 StyleConstants from '../common/constants/StyleConstants' + +@Component +export struct HWWallpaper { + + build() { + Image(StyleConstants.DEFAULT_BACKGROUND_IMAGE) + .objectFit(ImageFit.Cover) + } +} \ No newline at end of file -- Gitee From 5d23e8d4426efd5e95be64cd30867519b218a9d8 Mon Sep 17 00:00:00 2001 From: liuchao92 Date: Wed, 1 Mar 2023 22:57:12 +0800 Subject: [PATCH 333/373] add app start Signed-off-by: liuchao92 --- .../screen/session/HWScreenSession.ets | 6 +++-- .../screen/session/HWScreenSessionManager.ets | 13 +++++++--- .../default/manager/LauncherAbilityManager.ts | 26 ++++++++++++++----- .../default/common/components/GridSwiper.ets | 6 ++--- .../default/common/components/SwiperPage.ets | 2 +- .../ets/default/layout/PageDesktopLayout.ets | 5 ++-- .../src/main/ets/WindowScene/HWScene.ets | 3 +-- .../src/main/ets/WindowScene/HWScenePanel.ets | 15 ++++++++--- .../src/main/ets/WindowScene/HWScreen.ets | 3 +-- 9 files changed, 52 insertions(+), 27 deletions(-) diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets index 217df201..f2144690 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets @@ -73,7 +73,7 @@ export class HWScreenSession { private findSceneSession(persistentId: number): number { const sceneSessionIndex = this.hwSceneSessionList.findIndex(item => { - item.session.persistentId === persistentId + return item.session.persistentId === persistentId }) return sceneSessionIndex @@ -84,6 +84,7 @@ export class HWScreenSession { * @param sceneSession The session of the scene which will be added to the screen */ public addSceneSession(sceneSession: HWSceneSession): void { + Log.showInfo(TAG, 'Add scene session, id:' + sceneSession.session.persistentId) const sceneSessionIndex = this.findSceneSession(sceneSession.session.persistentId) if (sceneSessionIndex != -1) { Log.showInfo(TAG, 'Repeat to add scene session.') @@ -98,6 +99,7 @@ export class HWScreenSession { * @param sceneSession The session of the scene which will be removed from the screen */ public removeSceneSession(sceneSession: HWSceneSession): void { + Log.showInfo(TAG, 'Remove scene session, id:' + sceneSession.session.persistentId) const sceneSessionIndex = this.findSceneSession(sceneSession.session.persistentId) if (sceneSessionIndex == -1) { Log.showError(TAG, 'Can not find the scene session.') @@ -114,7 +116,7 @@ export class HWScreenSession { */ public getSceneSession(sceneInfo: HWSceneInfo): HWSceneSession { const sceneSessionIndex = this.hwSceneSessionList.findIndex(item => { - item.sceneInfo.abilityName === sceneInfo.abilityName && + return item.sceneInfo.abilityName === sceneInfo.abilityName && item.sceneInfo.bundleName === sceneInfo.bundleName }) diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets index be93c6e9..7deaa99a 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets @@ -23,6 +23,8 @@ const TAG = 'HWScreenSessionManager' * Screen session manager. */ export class HWScreenSessionManager { + // private screenSessionList: SubscribedAbstractProperty = AppStorage.SetAndLink('screenSessionList', []) + private constructor() {} /** @@ -89,9 +91,10 @@ export class HWScreenSessionManager { private addScreenSession(screenSession: HWScreenSession) { let screenSessionList = this.getScreenSessionList() const screenSessionIndex = screenSessionList.findIndex(item => { - item.session.screenId === screenSession.session.screenId + return item.session.screenId === screenSession.session.screenId }) if (screenSessionIndex != -1) { + Log.showError(TAG, 'Failed to add screen session, screen id:' + screenSession.session.screenId) return } @@ -102,9 +105,10 @@ export class HWScreenSessionManager { private removeScreenSession(screenId: number) { let screenSessionList = this.getScreenSessionList() const screenSessionIndex = screenSessionList.findIndex(item => { - item.session.screenId === screenId + return item.session.screenId === screenId }) if (screenSessionIndex == -1) { + Log.showError(TAG, 'Failed to remove screen session, screen id:' + screenId) return } @@ -120,9 +124,10 @@ export class HWScreenSessionManager { public getScreenSession(screenId: number): HWScreenSession { let screenSessionList = this.getScreenSessionList() const screenSessionIndex = screenSessionList.findIndex(item => { - item.session.screenId === screenId + return item.session.screenId === screenId }) - if (screenSessionIndex != -1) { + if (screenSessionIndex == -1) { + Log.showError(TAG, 'Failed to get screen session, screen id:' + screenId) return null } diff --git a/common/src/main/ets/default/manager/LauncherAbilityManager.ts b/common/src/main/ets/default/manager/LauncherAbilityManager.ts index 3cb2df37..49976256 100644 --- a/common/src/main/ets/default/manager/LauncherAbilityManager.ts +++ b/common/src/main/ets/default/manager/LauncherAbilityManager.ts @@ -26,6 +26,8 @@ import { CommonConstants } from '../constants/CommonConstants'; import { ResourceManager } from './ResourceManager'; import { EventConstants } from '../constants/EventConstants'; import { BadgeManager } from '../manager/BadgeManager'; +import { HWSceneSessionManager } from '@ohos/common' +import { HWScreenSessionManager } from '@ohos/common' const TAG = 'LauncherAbilityManager'; @@ -266,15 +268,25 @@ class LauncherAbilityManager { */ startLauncherAbility(paramAbilityName: string, paramBundleName: string, paramModuleName: string) { Log.showDebug(TAG, `startApplication abilityName: ${paramAbilityName}, bundleName: ${paramBundleName}, moduleName ${paramModuleName}`); - globalThis.desktopContext.startAbility({ +// globalThis.desktopContext.startAbility({ +// bundleName: paramBundleName, +// abilityName: paramAbilityName, +// moduleName: paramModuleName +// }).then(() => { +// Log.showDebug(TAG, 'startApplication promise success'); +// }, (err) => { +// Log.showError(TAG, `startApplication promise error: ${JSON.stringify(err)}`); +// }); + + let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession(); + let sceneInfo = { bundleName: paramBundleName, abilityName: paramAbilityName, - moduleName: paramModuleName - }).then(() => { - Log.showDebug(TAG, 'startApplication promise success'); - }, (err) => { - Log.showError(TAG, `startApplication promise error: ${JSON.stringify(err)}`); - }); + screenId: mainScreenSession.session.screenId, + } + let sceneSession = HWSceneSessionManager.getInstance().requestSceneSession(sceneInfo) + mainScreenSession.addSceneSession(sceneSession) + HWSceneSessionManager.getInstance().requestSceneSessionActivation(sceneSession) const sysEventInfo = { domain: 'LAUNCHER_APP', diff --git a/feature/pagedesktop/src/main/ets/default/common/components/GridSwiper.ets b/feature/pagedesktop/src/main/ets/default/common/components/GridSwiper.ets index 32ef25d8..f18238eb 100644 --- a/feature/pagedesktop/src/main/ets/default/common/components/GridSwiper.ets +++ b/feature/pagedesktop/src/main/ets/default/common/components/GridSwiper.ets @@ -22,7 +22,7 @@ const TAG = "GridSwiper"; export default struct GridSwiper { @StorageLink('NavigationBarStatusValue') navigationBarStatusValue: boolean = false; @StorageLink('isDesktopLoadFinished') desktopLoadFinished: boolean = false; - @Prop gridConfig: string; + @State gridConfig: string = '5X4'; @StorageLink('pageIndex') pageIndex: number = 0; private mPageDesktopViewModel; @StorageLink('appListInfo') appListInfo: { @@ -88,7 +88,7 @@ export default struct GridSwiper { Column() { SwiperPage({ mAppListInfo: item, - gridConfig: this.gridConfig, + // gridConfig: this.gridConfig, mPageDesktopViewModel: this.mPageDesktopViewModel }) } @@ -102,7 +102,7 @@ export default struct GridSwiper { } else { SwiperPage({ mAppListInfo: item, - gridConfig: this.gridConfig, + // gridConfig: this.gridConfig, mPageDesktopViewModel: this.mPageDesktopViewModel }) .bindContextMenu(this.MenuBuilder, ResponseType.LongPress) diff --git a/feature/pagedesktop/src/main/ets/default/common/components/SwiperPage.ets b/feature/pagedesktop/src/main/ets/default/common/components/SwiperPage.ets index e346b4e6..332cb14a 100644 --- a/feature/pagedesktop/src/main/ets/default/common/components/SwiperPage.ets +++ b/feature/pagedesktop/src/main/ets/default/common/components/SwiperPage.ets @@ -31,7 +31,7 @@ export default struct SwiperPage { @StorageLink('workSpaceWidth') @Watch('updateDeskTopScreen') workSpaceWidth: number = 0; @State ColumnsTemplate: string = ''; @State RowsTemplate: string = '' - @Prop @Watch('changeColumnAndRow') gridConfig: string; + @State @Watch('changeColumnAndRow') gridConfig: string = '5X4'; @State mMargin: number = 0; @State mColumnsGap: number = 0; @State mRowsGap: number = 0; diff --git a/feature/pagedesktop/src/main/ets/default/layout/PageDesktopLayout.ets b/feature/pagedesktop/src/main/ets/default/layout/PageDesktopLayout.ets index 63a211fa..7ad24c31 100644 --- a/feature/pagedesktop/src/main/ets/default/layout/PageDesktopLayout.ets +++ b/feature/pagedesktop/src/main/ets/default/layout/PageDesktopLayout.ets @@ -33,7 +33,7 @@ export struct PageDesktopLayout { @StorageLink('workSpaceHeight') @Watch('updateDeskTopParams') workSpaceHeight: number = 0; @State @Watch('updateDeskTopParams') mMargin: number = 0; @State mTop: number = 0; - @State @Watch('changeGridConfig') gridConfig: string = ''; + @State @Watch('changeGridConfig') gridConfig: string = '5X4'; @StorageLink('menuId') menuId: number = 0; private mPageDesktopDragHandler: PageDesktopDragHandler = null; private isPad: boolean = false; @@ -63,7 +63,6 @@ export struct PageDesktopLayout { this.mPageDesktopDragHandler = PageDesktopDragHandler.getInstance(); mPageDesktopViewModel = PageDesktopViewModel.getInstance(); this.gridConfig = mPageDesktopViewModel.getGridConfig().layout; - Log.showDebug(TAG, `xxxxxxxxxxxxx`+ this.gridConfig); this.updateStyle(); if (this.deviceType != CommonConstants.PAD_DEVICE_TYPE) { mPageDesktopViewModel.registerAppListChangeCallback(); @@ -103,7 +102,7 @@ export struct PageDesktopLayout { build() { GridSwiper({ - gridConfig: this.gridConfig, + // gridConfig: this.gridConfig, mPageDesktopViewModel: mPageDesktopViewModel, dialogController: this.deviceType == CommonConstants.PAD_DEVICE_TYPE ? null : this.dialogController }) diff --git a/product/phone/src/main/ets/WindowScene/HWScene.ets b/product/phone/src/main/ets/WindowScene/HWScene.ets index 0a78c70c..0b6d6b5a 100644 --- a/product/phone/src/main/ets/WindowScene/HWScene.ets +++ b/product/phone/src/main/ets/WindowScene/HWScene.ets @@ -21,9 +21,8 @@ export struct HWScene { build() { Stack() { - // Status bar - HostWindowScene(this.sceneSession) + // Status bar // Gesture navigation bar } diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index a19a5d16..b018485d 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -13,18 +13,27 @@ * limitations under the License. */ -import curves from '@ohos.curves'; +import curves from '@ohos.curves' -import { HWSceneSession } from '@ohos/common'; +import { HWSceneSession } from '@ohos/common' import { HWScreenSession } from '@ohos/common' -import { HWScene } from './HWScene'; +import { HWScene } from './HWScene' +import { Log } from '@ohos/common' + +const TAG = 'HWScenePanel' @Component export struct HWScenePanel { @Link screenSession: HWScreenSession + buildLog() { + Log.showInfo(TAG, 'scene session list length:' + this.screenSession.hwSceneSessionList.length) + return true + } + build() { Stack() { + if (this.buildLog()){} ForEach(this.screenSession.hwSceneSessionList, (item: HWSceneSession) => { HWScene({sceneSession: item}) .transition({ scale: {x: 0.5, y: 0.5}, opacity: 1 }) diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index 4b34984b..2e368d3e 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -19,7 +19,6 @@ import { HWScreenSession } from '@ohos/common' import { HWDesktop } from './HWDesktop' import { HWWallpaper } from './HWWallpaper' - @Component export struct HWScreen { @ObjectLink screenSession: HWScreenSession @@ -33,7 +32,7 @@ export struct HWScreen { HWDesktop() // Scene - // HWScenePanel({screenSession: $screenSession}) + HWScenePanel({screenSession: $screenSession}) // Systemui } -- Gitee From 6e73811bce0a7a8f8b14811edccb282b2d7236b5 Mon Sep 17 00:00:00 2001 From: liuchao92 Date: Tue, 7 Mar 2023 17:11:19 +0800 Subject: [PATCH 334/373] add screen session list Signed-off-by: liuchao92 --- .../screen/session/HWScreenSessionManager.ets | 42 ++++++------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets index 7deaa99a..e0be604c 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets @@ -23,9 +23,11 @@ const TAG = 'HWScreenSessionManager' * Screen session manager. */ export class HWScreenSessionManager { - // private screenSessionList: SubscribedAbstractProperty = AppStorage.SetAndLink('screenSessionList', []) + private screenSessionList: HWScreenSession[] = [] - private constructor() {} + private constructor() { + this.screenSessionList = AppStorage.SetAndLink('screenSessionList', this.screenSessionList).get() + } /** * Get the singleton of the screen session manager. @@ -65,8 +67,6 @@ export class HWScreenSessionManager { private onScreenConnect(session: screenSessionManager.ScreenSession): void { Log.showInfo(TAG, 'On screen connect.') - - let screenSession: HWScreenSession = new HWScreenSession(session) this.addScreenSession(screenSession) } @@ -76,21 +76,8 @@ export class HWScreenSessionManager { this.removeScreenSession(session.screenId) } - private getScreenSessionList(): HWScreenSession[] { - if (AppStorage.Has('screenSessionList') == false) { - AppStorage.SetOrCreate('screenSessionList', []) - } - - return AppStorage.Get('screenSessionList') - } - - private setScreenSessionList(screenSessionList: HWScreenSession[]): void { - AppStorage.Set('screenSessionList', screenSessionList) - } - private addScreenSession(screenSession: HWScreenSession) { - let screenSessionList = this.getScreenSessionList() - const screenSessionIndex = screenSessionList.findIndex(item => { + const screenSessionIndex = this.screenSessionList.findIndex(item => { return item.session.screenId === screenSession.session.screenId }) if (screenSessionIndex != -1) { @@ -98,13 +85,11 @@ export class HWScreenSessionManager { return } - screenSessionList.push(screenSession) - this.setScreenSessionList(screenSessionList) + this.screenSessionList.push(screenSession) } private removeScreenSession(screenId: number) { - let screenSessionList = this.getScreenSessionList() - const screenSessionIndex = screenSessionList.findIndex(item => { + const screenSessionIndex = this.screenSessionList.findIndex(item => { return item.session.screenId === screenId }) if (screenSessionIndex == -1) { @@ -112,8 +97,7 @@ export class HWScreenSessionManager { return } - screenSessionList.splice(screenSessionIndex, 1) - this.setScreenSessionList(screenSessionList) + this.screenSessionList.splice(screenSessionIndex, 1) } /** @@ -122,8 +106,7 @@ export class HWScreenSessionManager { * @return Session of the screen */ public getScreenSession(screenId: number): HWScreenSession { - let screenSessionList = this.getScreenSessionList() - const screenSessionIndex = screenSessionList.findIndex(item => { + const screenSessionIndex = this.screenSessionList.findIndex(item => { return item.session.screenId === screenId }) if (screenSessionIndex == -1) { @@ -131,7 +114,7 @@ export class HWScreenSessionManager { return null } - return screenSessionList[screenSessionIndex] + return this.screenSessionList[screenSessionIndex] } /** @@ -139,9 +122,8 @@ export class HWScreenSessionManager { * @return Session of the main screen */ public getMainScreenSession(): HWScreenSession { - let screenSessionList = this.getScreenSessionList() - if (screenSessionList.length > 0) { - return screenSessionList[0] + if (this.screenSessionList.length > 0) { + return this.screenSessionList[0] } return null -- Gitee From 43ac7f4b53ea002331948ff9a435ed1328ee0c5d Mon Sep 17 00:00:00 2001 From: liuchao92 Date: Wed, 8 Mar 2023 22:41:14 +0800 Subject: [PATCH 335/373] fix bug Signed-off-by: liuchao92 --- common/index.ets | 2 +- .../screen/session/HWScreenSession.ets | 24 +++++++++++++------ .../default/manager/LauncherAbilityManager.ts | 2 +- .../src/main/ets/WindowScene/HWDesktop.ets | 4 ++-- .../src/main/ets/WindowScene/HWScene.ets | 24 +++++++++++++++---- .../src/main/ets/WindowScene/HWScenePanel.ets | 12 ++++++---- .../src/main/ets/WindowScene/HWScreen.ets | 2 +- 7 files changed, 49 insertions(+), 21 deletions(-) diff --git a/common/index.ets b/common/index.ets index 023f99d0..2434b263 100644 --- a/common/index.ets +++ b/common/index.ets @@ -90,5 +90,5 @@ export { DragItemPosition } from './src/main/ets/default/interface/DragItemPosi export { HWRootSceneSession } from './src/main/ets/WindowScene/scene/session/HWRootSceneSession' export { HWSceneSession } from './src/main/ets/WindowScene/scene/session/HWSceneSession' export { HWSceneSessionManager } from './src/main/ets/WindowScene/scene/session/HWSceneSessionManager' -export { HWScreenSession } from './src/main/ets/WindowScene/screen/session/HWScreenSession' +export { HWScreenSession, SceneSessionArray } from './src/main/ets/WindowScene/screen/session/HWScreenSession' export { HWScreenSessionManager } from './src/main/ets/WindowScene/screen/session/HWScreenSessionManager' \ No newline at end of file diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets index f2144690..813adfe7 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets @@ -20,6 +20,10 @@ import { HWSceneInfo } from '../../scene/session/HWSceneInfo' const TAG = 'HWScreenSession' +@Observed +export class SceneSessionArray extends Array { +} + /** * Session of a screen. */ @@ -28,7 +32,7 @@ export class HWScreenSession { public readonly session: screenSessionManager.ScreenSession public bounds: screenSessionManager.RRect public rotation: number - public hwSceneSessionList: HWSceneSession[] = [] + public sceneSessionList: SceneSessionArray = new SceneSessionArray() /** * Constructor. @@ -51,7 +55,13 @@ export class HWScreenSession { } private updateProperty(screenProperty: screenSessionManager.ScreenProperty) { - this.bounds = screenProperty.bounds + this.bounds = { + left: px2vp(screenProperty.bounds.left), + top: px2vp(screenProperty.bounds.top), + width: px2vp(screenProperty.bounds.width), + height: px2vp(screenProperty.bounds.height), + radius: screenProperty.bounds.radius + } this.rotation = screenProperty.rotation Log.showInfo(TAG, `Update screen bounds[${this.bounds.left}, ${this.bounds.top}, ${this.bounds.width}, ${this.bounds.height}]`) @@ -72,7 +82,7 @@ export class HWScreenSession { } private findSceneSession(persistentId: number): number { - const sceneSessionIndex = this.hwSceneSessionList.findIndex(item => { + const sceneSessionIndex = this.sceneSessionList.findIndex(item => { return item.session.persistentId === persistentId }) @@ -91,7 +101,7 @@ export class HWScreenSession { return } - this.hwSceneSessionList.push(sceneSession) + this.sceneSessionList.push(sceneSession) } /** @@ -106,7 +116,7 @@ export class HWScreenSession { return } - this.hwSceneSessionList.splice(sceneSessionIndex, 1) + this.sceneSessionList.splice(sceneSessionIndex, 1) } /** @@ -115,13 +125,13 @@ export class HWScreenSession { * @return Session of the scene */ public getSceneSession(sceneInfo: HWSceneInfo): HWSceneSession { - const sceneSessionIndex = this.hwSceneSessionList.findIndex(item => { + const sceneSessionIndex = this.sceneSessionList.findIndex(item => { return item.sceneInfo.abilityName === sceneInfo.abilityName && item.sceneInfo.bundleName === sceneInfo.bundleName }) if (sceneSessionIndex != -1) { - return this.hwSceneSessionList[sceneSessionIndex] + return this.sceneSessionList[sceneSessionIndex] } else { return null } diff --git a/common/src/main/ets/default/manager/LauncherAbilityManager.ts b/common/src/main/ets/default/manager/LauncherAbilityManager.ts index 49976256..60b11c35 100644 --- a/common/src/main/ets/default/manager/LauncherAbilityManager.ts +++ b/common/src/main/ets/default/manager/LauncherAbilityManager.ts @@ -278,7 +278,7 @@ class LauncherAbilityManager { // Log.showError(TAG, `startApplication promise error: ${JSON.stringify(err)}`); // }); - let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession(); + let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession() let sceneInfo = { bundleName: paramBundleName, abilityName: paramAbilityName, diff --git a/product/phone/src/main/ets/WindowScene/HWDesktop.ets b/product/phone/src/main/ets/WindowScene/HWDesktop.ets index 64158167..102ccdf0 100644 --- a/product/phone/src/main/ets/WindowScene/HWDesktop.ets +++ b/product/phone/src/main/ets/WindowScene/HWDesktop.ets @@ -95,8 +95,8 @@ export struct HWDesktop { private async getWindowSize(): Promise { try { // TODO Get from screen - this.screenWidth = 720; - this.screenHeight = 1280; + this.screenWidth = px2vp(720); + this.screenHeight = px2vp(1280); AppStorage.SetOrCreate('screenWidth', this.screenWidth); AppStorage.SetOrCreate('screenHeight', this.screenHeight); } catch (error) { diff --git a/product/phone/src/main/ets/WindowScene/HWScene.ets b/product/phone/src/main/ets/WindowScene/HWScene.ets index 0b6d6b5a..6ca148bc 100644 --- a/product/phone/src/main/ets/WindowScene/HWScene.ets +++ b/product/phone/src/main/ets/WindowScene/HWScene.ets @@ -13,19 +13,35 @@ * limitations under the License. */ -import { HWSceneSession } from '@ohos/common'; +import { HWSceneSession } from '@ohos/common' +import { StyleConstants } from '@ohos/common' +import { HWSceneSessionManager } from '@ohos/common' +import { HWScreenSessionManager } from '@ohos/common' @Component export struct HWScene { @ObjectLink sceneSession: HWSceneSession build() { - Stack() { - HostWindowScene(this.sceneSession) + Stack({alignContent: Alignment.TopStart}) { + HostWindowScene(this.sceneSession.session) + .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) + .hitTestBehavior(HitTestMode.Block) + // Status bar // Gesture navigation bar + Button() + .backgroundColor(Color.Red) + .position({x: '30%', y: '98%'}) + .width('40%') + .height('2%') + .onClick(() => { + let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession() + mainScreenSession.removeSceneSession(this.sceneSession) + HWSceneSessionManager.getInstance().requestSceneSessionBackground(this.sceneSession) + }) } + .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) } } - diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index b018485d..0c9b0f7d 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -15,30 +15,32 @@ import curves from '@ohos.curves' -import { HWSceneSession } from '@ohos/common' -import { HWScreenSession } from '@ohos/common' +import { HWSceneSession, SceneSessionArray } from '@ohos/common' import { HWScene } from './HWScene' import { Log } from '@ohos/common' +import { StyleConstants } from '@ohos/common' const TAG = 'HWScenePanel' @Component export struct HWScenePanel { - @Link screenSession: HWScreenSession + @ObjectLink sceneSessionList: SceneSessionArray buildLog() { - Log.showInfo(TAG, 'scene session list length:' + this.screenSession.hwSceneSessionList.length) + Log.showInfo(TAG, 'scene session list length:' + this.sceneSessionList.length) return true } build() { Stack() { if (this.buildLog()){} - ForEach(this.screenSession.hwSceneSessionList, (item: HWSceneSession) => { + ForEach(this.sceneSessionList, (item: HWSceneSession) => { HWScene({sceneSession: item}) .transition({ scale: {x: 0.5, y: 0.5}, opacity: 1 }) .animation({ curve: curves.springMotion() }) }, (item: HWSceneSession) => item.session.persistentId.toString()) } + .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) + .hitTestBehavior(HitTestMode.Transparent) } } diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index 2e368d3e..9eafbd4e 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -32,7 +32,7 @@ export struct HWScreen { HWDesktop() // Scene - HWScenePanel({screenSession: $screenSession}) + HWScenePanel({sceneSessionList: this.screenSession.sceneSessionList}) // Systemui } -- Gitee From 013925d291c9063b06ab19c4bec05f22798364c9 Mon Sep 17 00:00:00 2001 From: liuchao92 Date: Thu, 9 Mar 2023 18:00:46 +0800 Subject: [PATCH 336/373] x Signed-off-by: liuchao92 --- .../scene/session/HWSceneSession.ets | 4 +++ .../src/main/ets/WindowScene/HWScene.ets | 30 +++++++++++++++++-- .../src/main/ets/WindowScene/HWScenePanel.ets | 7 +---- .../src/main/ets/WindowScene/HWScreen.ets | 1 - 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets index cb06dfc9..8f605234 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets @@ -27,6 +27,10 @@ export class HWSceneSession { readonly sceneInfo: HWSceneInfo readonly session: sceneSessionManager.SceneSession transitionEffect: HWTransitionEffect = HWTransitionEffect.DEFAULT + translateX: number = 0 + translateY: number = 0 + scaleX: number = 1 + scaleY: number = 1 /** * Constructor. diff --git a/product/phone/src/main/ets/WindowScene/HWScene.ets b/product/phone/src/main/ets/WindowScene/HWScene.ets index 6ca148bc..0416c230 100644 --- a/product/phone/src/main/ets/WindowScene/HWScene.ets +++ b/product/phone/src/main/ets/WindowScene/HWScene.ets @@ -13,10 +13,15 @@ * limitations under the License. */ +import curves from '@ohos.curves' + import { HWSceneSession } from '@ohos/common' -import { StyleConstants } from '@ohos/common' import { HWSceneSessionManager } from '@ohos/common' import { HWScreenSessionManager } from '@ohos/common' +import { StyleConstants } from '@ohos/common' +import { Log } from '@ohos/common' + +const TAG = 'HWScene' @Component export struct HWScene { @@ -26,16 +31,33 @@ export struct HWScene { Stack({alignContent: Alignment.TopStart}) { HostWindowScene(this.sceneSession.session) .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) - .hitTestBehavior(HitTestMode.Block) // Status bar // Gesture navigation bar Button() .backgroundColor(Color.Red) - .position({x: '30%', y: '98%'}) + .position({x: '30%', y: '97%'}) .width('40%') .height('2%') +// .gesture(PanGesture() +// .onActionStart((event: GestureEvent) => { +// +// }) +// .onActionUpdate((event: GestureEvent) => { +// Log.showInfo(TAG,'onActionUpdate:' + event.offsetY) +// if (event.offsetY < 0) { +// this.sceneSession.translateY = event.offsetY +// } else { +// this.sceneSession.translateY = 0 +// } +// }) +// .onActionCancel(() => { +// +// }) +// .onActionEnd((event: GestureEvent) => { +// +// })) .onClick(() => { let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession() mainScreenSession.removeSceneSession(this.sceneSession) @@ -43,5 +65,7 @@ export struct HWScene { }) } .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) + .translate({x: this.sceneSession.translateX, y: this.sceneSession.translateY}) + .scale({x: this.sceneSession.scaleX, y: this.sceneSession.scaleY}) } } diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index 0c9b0f7d..46065c02 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -13,8 +13,6 @@ * limitations under the License. */ -import curves from '@ohos.curves' - import { HWSceneSession, SceneSessionArray } from '@ohos/common' import { HWScene } from './HWScene' import { Log } from '@ohos/common' @@ -32,12 +30,9 @@ export struct HWScenePanel { } build() { - Stack() { - if (this.buildLog()){} + Scroll() { ForEach(this.sceneSessionList, (item: HWSceneSession) => { HWScene({sceneSession: item}) - .transition({ scale: {x: 0.5, y: 0.5}, opacity: 1 }) - .animation({ curve: curves.springMotion() }) }, (item: HWSceneSession) => item.session.persistentId.toString()) } .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index 9eafbd4e..ff412256 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -39,6 +39,5 @@ export struct HWScreen { .position({x: this.screenSession.bounds.left, y: this.screenSession.bounds.top}) .width(this.screenSession.bounds.width) .height(this.screenSession.bounds.height) - .animation({curve: curves.springMotion()}) } } -- Gitee From daef5224676679ddf881543ad18c7057175704ea Mon Sep 17 00:00:00 2001 From: liuchao92 Date: Thu, 9 Mar 2023 21:40:25 +0800 Subject: [PATCH 337/373] add geture navigation Signed-off-by: liuchao92 --- .../src/main/ets/WindowScene/HWScene.ets | 68 +++++++++++-------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/product/phone/src/main/ets/WindowScene/HWScene.ets b/product/phone/src/main/ets/WindowScene/HWScene.ets index 0416c230..f9288b62 100644 --- a/product/phone/src/main/ets/WindowScene/HWScene.ets +++ b/product/phone/src/main/ets/WindowScene/HWScene.ets @@ -35,37 +35,51 @@ export struct HWScene { // Status bar // Gesture navigation bar - Button() - .backgroundColor(Color.Red) - .position({x: '30%', y: '97%'}) - .width('40%') - .height('2%') -// .gesture(PanGesture() -// .onActionStart((event: GestureEvent) => { -// -// }) -// .onActionUpdate((event: GestureEvent) => { -// Log.showInfo(TAG,'onActionUpdate:' + event.offsetY) -// if (event.offsetY < 0) { -// this.sceneSession.translateY = event.offsetY -// } else { -// this.sceneSession.translateY = 0 -// } -// }) -// .onActionCancel(() => { -// -// }) -// .onActionEnd((event: GestureEvent) => { -// -// })) - .onClick(() => { - let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession() - mainScreenSession.removeSceneSession(this.sceneSession) - HWSceneSessionManager.getInstance().requestSceneSessionBackground(this.sceneSession) + Stack({alignContent: Alignment.Center}) { + Button() + .backgroundColor(Color.Black) + .width('40%') + .height('50%') + } + .position({y: '98%'}) + .width('100%') + .height('2%') + .gesture(PanGesture() + .onActionStart((event: GestureEvent) => { + + }) + .onActionUpdate((event: GestureEvent) => { + Log.showInfo(TAG,'onActionUpdate:' + event.offsetY) + // TODO temp test + this.sceneSession.translateX = event.offsetX + if (event.offsetY < 0) { + this.sceneSession.translateY = event.offsetY + this.sceneSession.scaleX = 1 + event.offsetY / 1280 + this.sceneSession.scaleY = 1 + event.offsetY / 1280 + } else { + this.sceneSession.translateY = 0 + this.sceneSession.scaleX = 1 + this.sceneSession.scaleY = 1 + } + }) + .onActionCancel(() => { }) + .onActionEnd((event: GestureEvent) => { + if (event.offsetY < -200) { + let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession() + mainScreenSession.removeSceneSession(this.sceneSession) + HWSceneSessionManager.getInstance().requestSceneSessionBackground(this.sceneSession) + } else { + this.sceneSession.translateX = 0 + this.sceneSession.translateY = 0 + this.sceneSession.scaleX = 1 + this.sceneSession.scaleY = 1 + } + })) } .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) .translate({x: this.sceneSession.translateX, y: this.sceneSession.translateY}) .scale({x: this.sceneSession.scaleX, y: this.sceneSession.scaleY}) + .animation({curve: curves.responsiveSpringMotion()}) } } -- Gitee From b39346d962179dd47ae71b3c9a3e53c422644500 Mon Sep 17 00:00:00 2001 From: liuchao92 Date: Fri, 10 Mar 2023 15:34:17 +0800 Subject: [PATCH 338/373] add gesture navigation Signed-off-by: liuchao92 --- common/index.ets | 3 +- .../scene/session/HWRootSceneSession.ets | 17 +--- .../WindowScene/scene/session/HWSceneInfo.ts | 25 ++++- .../scene/session/HWSceneSession.ets | 29 ++---- .../scene/session/HWSceneSessionManager.ets | 96 +++++++++++++++---- .../default/manager/LauncherAbilityManager.ts | 13 +-- .../src/main/ets/WindowScene/HWScene.ets | 10 +- .../src/main/ets/WindowScene/HWScenePanel.ets | 14 ++- 8 files changed, 124 insertions(+), 83 deletions(-) diff --git a/common/index.ets b/common/index.ets index 2434b263..e612adde 100644 --- a/common/index.ets +++ b/common/index.ets @@ -86,8 +86,9 @@ export { SettingItemOptionsChecker } from './src/main/ets/default/settings/Sett export { DragArea } from './src/main/ets/default/interface/DragArea' export { DragItemPosition } from './src/main/ets/default/interface/DragItemPosition' -// HyperWindow +// Window scene export { HWRootSceneSession } from './src/main/ets/WindowScene/scene/session/HWRootSceneSession' +export { HWSceneInfo } from './src/main/ets/WindowScene/scene/session/HWSceneInfo' export { HWSceneSession } from './src/main/ets/WindowScene/scene/session/HWSceneSession' export { HWSceneSessionManager } from './src/main/ets/WindowScene/scene/session/HWSceneSessionManager' export { HWScreenSession, SceneSessionArray } from './src/main/ets/WindowScene/screen/session/HWScreenSession' diff --git a/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets b/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets index b7a25ad4..8cb92aeb 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets +++ b/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets @@ -44,20 +44,7 @@ export class HWRootSceneSession { } private onPendingSceneSessionActivation(sceneInfo: sceneSessionManager.SceneInfo): void { - let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession() - if (mainScreenSession == null) { - return; - } - - let hwSceneInfo: HWSceneInfo = { - bundleName: sceneInfo.bundleName, - abilityName: sceneInfo.abilityName, - screenId: mainScreenSession.session.screenId - } - - let sceneSession = HWSceneSessionManager.getInstance().requestSceneSession(hwSceneInfo) - mainScreenSession.addSceneSession(sceneSession) - HWSceneSessionManager.getInstance().requestSceneSessionActivation(sceneSession) - sceneSession.setTransitionEffect(HWTransitionEffect.APPEAR_FROM_NONE) + let hwSceneInfo = new HWSceneInfo(sceneInfo.bundleName, sceneInfo.abilityName); + HWSceneSessionManager.getInstance().startScene(hwSceneInfo) } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts b/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts index 6cfedc7c..42a74e14 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts @@ -13,10 +13,12 @@ * limitations under the License. */ +import { HWTransitionEffect } from '../../animation/HWTransitionEffect' + /** * Information of a scene. */ -export interface HWSceneInfo { +export class HWSceneInfo { /** * Bundle name. */ @@ -28,7 +30,22 @@ export interface HWSceneInfo { abilityName: string /** - * Identifier which screen the scene is displayed. + * Identifier which screen the scene is displayed. default is main screen + */ + screenId: number = -1 + + /** + * True start a new scene otherwise priority to start the exist scene. */ - screenId: number -} \ No newline at end of file + isNewInstance: boolean = false + + /** + * Transition effect when scene appearing or disappearing. + */ + transitionEffect: HWTransitionEffect = HWTransitionEffect.DEFAULT + + constructor(bundleName: string, abilityName: string) { + this.bundleName = bundleName + this.abilityName = abilityName + } +} diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets index 8f605234..c46309fa 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets @@ -26,7 +26,7 @@ import { HWTransitionEffect } from '../../animation/HWTransitionEffect' export class HWSceneSession { readonly sceneInfo: HWSceneInfo readonly session: sceneSessionManager.SceneSession - transitionEffect: HWTransitionEffect = HWTransitionEffect.DEFAULT + isActive: boolean = true translateX: number = 0 translateY: number = 0 scaleX: number = 1 @@ -46,27 +46,12 @@ export class HWSceneSession { } private onPendingSceneSessionActivation(sceneInfo: sceneSessionManager.SceneInfo) { - let screenSession = HWScreenSessionManager.getInstance().getScreenSession(this.sceneInfo.screenId) - let hwSceneInfo: HWSceneInfo = { - bundleName: sceneInfo.bundleName, - abilityName: sceneInfo.abilityName, - screenId: screenSession.session.screenId - } + let toSceneInfo = new HWSceneInfo(sceneInfo.bundleName, sceneInfo.abilityName); + toSceneInfo.screenId = this.sceneInfo.screenId + toSceneInfo.transitionEffect = HWTransitionEffect.APPEAR_FROM_SCENE + this.sceneInfo.transitionEffect = HWTransitionEffect.DISAPPEAR_FROM_SCENE - let sceneSession = HWSceneSessionManager.getInstance().requestSceneSession(hwSceneInfo) - screenSession.addSceneSession(sceneSession) - screenSession.removeSceneSession(this) - HWSceneSessionManager.getInstance().requestSceneSessionActivation(sceneSession) - - sceneSession.setTransitionEffect(HWTransitionEffect.APPEAR_FROM_SCENE) - this.setTransitionEffect(HWTransitionEffect.DISAPPEAR_FROM_SCENE) - } - - /** - * Set the transition effect. - * @param effect Effect of the transition - */ - public setTransitionEffect(effect: HWTransitionEffect): void { - this.transitionEffect = effect + HWSceneSessionManager.getInstance().startScene(toSceneInfo) + HWSceneSessionManager.getInstance().requestSceneBackground(this) } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets index f56fff41..0cd3c3d6 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets @@ -18,6 +18,7 @@ import ServiceExtensionContext from 'application/ServiceExtensionContext' import { HWRootSceneSession } from './HWRootSceneSession' import { HWSceneInfo } from './HWSceneInfo' import { HWSceneSession } from './HWSceneSession' +import { HWScreenSession } from '../../screen/session/HWScreenSession' import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager' import { Log } from '../../../default/utils/Log' @@ -44,6 +45,34 @@ export class HWSceneSessionManager { return globalThis.HWSceneSessionManagerInstance } + private requestSceneSession(sceneInfo: HWSceneInfo, screenSession: HWScreenSession): HWSceneSession { + if (screenSession == null) { + Log.showError(TAG, 'Undefined screen!') + return null + } + + let hwSceneSession = screenSession.getSceneSession(sceneInfo) + if (hwSceneSession == null || sceneInfo.isNewInstance) { + let sceneSession = sceneSessionManager.requestSceneSession( + { bundleName: sceneInfo.bundleName, abilityName: sceneInfo.abilityName }) + hwSceneSession = new HWSceneSession(sceneSession, sceneInfo) + } + + return hwSceneSession + } + + private async requestSceneSessionActivation(sceneSession: HWSceneSession): Promise { + sceneSessionManager.requestSceneSessionActivation(sceneSession.session) + } + + private async requestSceneSessionBackground(sceneSession: HWSceneSession): Promise { + sceneSessionManager.requestSceneSessionBackground(sceneSession.session) + } + + private async requestSceneSessionDestruction(sceneSession: HWSceneSession): Promise { + sceneSessionManager.requestSceneSessionDestruction(sceneSession.session) + } + /** * Get the session of the root scene. * @return Session of the root scene @@ -62,49 +91,74 @@ export class HWSceneSessionManager { } /** - * Request a scene session. - * @param sceneInfo Information of the scene - * @param forceNew True return a new session otherwise return the exist session - * @return Session of the scene + * Start a scene. + * @param sceneInfo The info of the scene which to be activated */ - public requestSceneSession(sceneInfo: HWSceneInfo, forceNew: boolean = false): HWSceneSession { - let screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneInfo.screenId) - if (screenSession == null) { - Log.showError(TAG, 'Undefined screen!') - return null + public startScene(sceneInfo: HWSceneInfo) { + Log.showInfo(TAG, 'start scene:' + 'bundle:' + sceneInfo.bundleName + ' ability:' + sceneInfo.abilityName + ' screenId:' + + sceneInfo.screenId + ' isNewInstance:' + sceneInfo.isNewInstance) + let screenSession: HWScreenSession = null + if (sceneInfo.screenId === -1) { + screenSession = HWScreenSessionManager.getInstance().getMainScreenSession() + sceneInfo.screenId = screenSession.session.screenId + } else { + screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneInfo.screenId) } - let hwSceneSession = screenSession.getSceneSession(sceneInfo) - if (hwSceneSession == null || forceNew) { - let sceneSession = sceneSessionManager.requestSceneSession( - { bundleName: sceneInfo.bundleName, abilityName: sceneInfo.abilityName }) - hwSceneSession = new HWSceneSession(sceneSession, sceneInfo) + if (screenSession == null) { + Log.showError(TAG, 'Failed to get screen session!') + return } - return hwSceneSession + let sceneSession = this.requestSceneSession(sceneInfo, screenSession) + screenSession.addSceneSession(sceneSession) + this.requestSceneSessionActivation(sceneSession) } /** * Request the scene session activation. * @param sceneSession The session of the scene which to be activated */ - public async requestSceneSessionActivation(sceneSession: HWSceneSession): Promise { - sceneSessionManager.requestSceneSessionActivation(sceneSession.session) + public requestSceneActivation(sceneSession: HWSceneSession) { + if (sceneSession.isActive) { + Log.showError(TAG, 'The scene is already active.') + return + } + + sceneSession.isActive = true + this.requestSceneSessionActivation(sceneSession) } /** * Request the scene session background. * @param sceneSession The session of the scene which to be background */ - public async requestSceneSessionBackground(sceneSession: HWSceneSession): Promise { - sceneSessionManager.requestSceneSessionBackground(sceneSession.session) + public requestSceneBackground(sceneSession: HWSceneSession) { + if (!sceneSession.isActive) { + Log.showError(TAG, 'The scene is already background.') + return + } + + // TODO temp test + let screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneSession.sceneInfo.screenId) + if (screenSession != null) { + screenSession.removeSceneSession(sceneSession) + } + + sceneSession.isActive = false + this.requestSceneSessionBackground(sceneSession) } /** * Request the scene session destruction. * @param sceneSession The session of the scene which to be destroyed */ - public async requestSceneSessionDestruction(sceneSession: HWSceneSession): Promise { - sceneSessionManager.requestSceneSessionDestruction(sceneSession.session) + public requestSceneDestruction(sceneSession: HWSceneSession) { + let screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneSession.sceneInfo.screenId) + if (screenSession != null) { + screenSession.removeSceneSession(sceneSession) + } + + this.requestSceneSessionDestruction(sceneSession) } } diff --git a/common/src/main/ets/default/manager/LauncherAbilityManager.ts b/common/src/main/ets/default/manager/LauncherAbilityManager.ts index 60b11c35..86b14320 100644 --- a/common/src/main/ets/default/manager/LauncherAbilityManager.ts +++ b/common/src/main/ets/default/manager/LauncherAbilityManager.ts @@ -27,7 +27,7 @@ import { ResourceManager } from './ResourceManager'; import { EventConstants } from '../constants/EventConstants'; import { BadgeManager } from '../manager/BadgeManager'; import { HWSceneSessionManager } from '@ohos/common' -import { HWScreenSessionManager } from '@ohos/common' +import { HWSceneInfo } from '@ohos/common' const TAG = 'LauncherAbilityManager'; @@ -278,15 +278,8 @@ class LauncherAbilityManager { // Log.showError(TAG, `startApplication promise error: ${JSON.stringify(err)}`); // }); - let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession() - let sceneInfo = { - bundleName: paramBundleName, - abilityName: paramAbilityName, - screenId: mainScreenSession.session.screenId, - } - let sceneSession = HWSceneSessionManager.getInstance().requestSceneSession(sceneInfo) - mainScreenSession.addSceneSession(sceneSession) - HWSceneSessionManager.getInstance().requestSceneSessionActivation(sceneSession) + let sceneInfo = new HWSceneInfo(paramBundleName, paramAbilityName) + HWSceneSessionManager.getInstance().startScene(sceneInfo) const sysEventInfo = { domain: 'LAUNCHER_APP', diff --git a/product/phone/src/main/ets/WindowScene/HWScene.ets b/product/phone/src/main/ets/WindowScene/HWScene.ets index f9288b62..fd5a7225 100644 --- a/product/phone/src/main/ets/WindowScene/HWScene.ets +++ b/product/phone/src/main/ets/WindowScene/HWScene.ets @@ -39,11 +39,11 @@ export struct HWScene { Button() .backgroundColor(Color.Black) .width('40%') - .height('50%') + .height('25%') } - .position({y: '98%'}) + .position({y: '96%'}) .width('100%') - .height('2%') + .height('4%') .gesture(PanGesture() .onActionStart((event: GestureEvent) => { @@ -66,9 +66,7 @@ export struct HWScene { }) .onActionEnd((event: GestureEvent) => { if (event.offsetY < -200) { - let mainScreenSession = HWScreenSessionManager.getInstance().getMainScreenSession() - mainScreenSession.removeSceneSession(this.sceneSession) - HWSceneSessionManager.getInstance().requestSceneSessionBackground(this.sceneSession) + HWSceneSessionManager.getInstance().requestSceneBackground(this.sceneSession) } else { this.sceneSession.translateX = 0 this.sceneSession.translateY = 0 diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index 46065c02..ece36cf6 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -30,10 +30,16 @@ export struct HWScenePanel { } build() { - Scroll() { - ForEach(this.sceneSessionList, (item: HWSceneSession) => { - HWScene({sceneSession: item}) - }, (item: HWSceneSession) => item.session.persistentId.toString()) + Stack({alignContent: Alignment.TopStart}) { + // Full screen scene, using scroll to manager multitask scene. + Scroll() { + ForEach(this.sceneSessionList, (item: HWSceneSession) => { + HWScene({sceneSession: item}) + }, (item: HWSceneSession) => item.session.persistentId.toString()) + } + .scrollable(ScrollDirection.Horizontal) + + // Freedom scene } .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) .hitTestBehavior(HitTestMode.Transparent) -- Gitee From e7399e8bdfe4ab1a694fa9c5b9832534acaa8178 Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Fri, 17 Mar 2023 11:44:16 +0800 Subject: [PATCH 339/373] =?UTF-8?q?=E8=93=9D=E5=8C=BA=E4=BB=A3=E7=A0=81war?= =?UTF-8?q?ning=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SEASON_SYSU --- .../ets/plugindatasource/common/Constants.ts | 171 ++++++++++++++++++ .../src/main/ets/template/iconComponent.ets | 4 +- .../ets/default/pages/airplaneComponent.ets | 2 +- .../ets/default/pages/brightnessComponent.ets | 8 +- .../com/ohos/pages/ComplexToggleComponent.ets | 21 ++- .../com/ohos/pages/SimpleToggleComponent.ets | 36 ++-- .../com/ohos/view/component/itemComponent.ets | 2 +- .../ohos/vm/noDisturbComponentViewModel.ts | 6 +- .../noticeItem/view/item/actionComponent.ets | 7 +- .../view/item/bannerNotificationItem.ets | 3 +- .../ohos/noticeItem/view/item/titleItem.ets | 2 +- .../src/main/ets/com/ohos/common/Constants.ts | 12 ++ .../ets/com/ohos/pages/IconItemComponent.ets | 40 ++-- .../com/ohos/pages/MetaIconItemComponent.ets | 29 +-- .../src/main/ets/pages/index.ets | 2 +- .../src/main/ets/pages/keyButton.ets | 2 +- .../src/main/ets/pages/noDisturb.ets | 2 +- .../src/main/ets/pages/bannerNotification.ets | 3 +- .../ServiceExtAbility/ServiceExtAbility.ts | 6 +- .../src/main/ets/pages/bannerNotification.ets | 3 +- .../main/ets/pages/common/navigationEvent.ts | 7 +- .../src/main/ets/pages/index.ets | 14 +- .../statusbar/src/main/ets/pages/index.ets | 2 - 23 files changed, 302 insertions(+), 82 deletions(-) diff --git a/common/src/main/ets/plugindatasource/common/Constants.ts b/common/src/main/ets/plugindatasource/common/Constants.ts index fe393767..14cca6b8 100644 --- a/common/src/main/ets/plugindatasource/common/Constants.ts +++ b/common/src/main/ets/plugindatasource/common/Constants.ts @@ -85,4 +85,175 @@ export class ActionData { export class PluginComponentData { template; data; +} + +export class itemData { + id:string; + pluginType:number; + bundleName:string; + moduleName:string; + abilityName:string; + abilityLabelId:number; + abilityIconId:number; + label:string; + iconUrl: string; + actionData?; + relationWindowId? + canSelect? + isShowLabel? + isShowIcon? +} + +export class notificationData { + id: string; + hashcode: string; + userId: number; + uid: number; + contentType: string; + timestamp: number; + time: string; + appName: string; + want: any; + actionButtons: any[]; + bundleName: string; + smallIcon?: PixelMap; + largeIcon?: PixelMap; + picture?: PixelMap; + title?: string; + text?: string; + additionalText?: string; + briefText?: string; + expandedTitle?: string; + longText?: string; + lines?: any[]; + longTitle?: string; + slotLevel?: any; + source?: number; + versionName?: string; + sound?: string; + vibrationValues?: Array; + notificationFlags?: any; + ruleData?; + template?: any; + isOngoing?: boolean; + isUnremovable?: boolean; + isRemoveAllowed?: boolean; + distributedOption?: any; + deviceId?: string; + groupName?: string; + tapDismissed?: boolean; +} + +export class itemData { + id:string; + pluginType:number; + bundleName:string; + moduleName:string; + abilityName:string; + abilityLabelId:number; + abilityIconId:number; + label:string; + iconUrl: string; + actionData?; + relationWindowId? + canSelect? + isShowLabel? + isShowIcon? +} + +export class notificationData { + id: string; + hashcode: string; + userId: number; + uid: number; + contentType: string; + timestamp: number; + time: string; + appName: string; + want: any; + actionButtons: any[]; + bundleName: string; + smallIcon?: PixelMap; + largeIcon?: PixelMap; + picture?: PixelMap; + title?: string; + text?: string; + additionalText?: string; + briefText?: string; + expandedTitle?: string; + longText?: string; + lines?: any[]; + longTitle?: string; + slotLevel?: any; + source?: number; + versionName?: string; + sound?: string; + vibrationValues?: Array; + notificationFlags?: any; + ruleData?; + template?: any; + isOngoing?: boolean; + isUnremovable?: boolean; + isRemoveAllowed?: boolean; + distributedOption?: any; + deviceId?: string; + groupName?: string; + tapDismissed?: boolean; +} + +export class itemData { + id:string; + pluginType:number; + bundleName:string; + moduleName:string; + abilityName:string; + abilityLabelId:number; + abilityIconId:number; + label:string; + iconUrl: string; + actionData?; + relationWindowId? + canSelect? + isShowLabel? + isShowIcon? +} + +export class notificationData { + id: string; + hashcode: string; + userId: number; + uid: number; + contentType: string; + timestamp: number; + time: string; + appName: string; + want: any; + actionButtons: any[]; + bundleName: string; + smallIcon?: PixelMap; + largeIcon?: PixelMap; + picture?: PixelMap; + title?: string; + text?: string; + additionalText?: string; + briefText?: string; + expandedTitle?: string; + longText?: string; + lines?: any[]; + longTitle?: string; + slotLevel?: any; + source?: number; + versionName?: string; + sound?: string; + vibrationValues?: Array; + notificationFlags?: any; + ruleData?; + template?: any; + isOngoing?: boolean; + isUnremovable?: boolean; + isRemoveAllowed?: boolean; + distributedOption?: any; + deviceId?: string; + groupName?: string; + tapDismissed?: boolean; } \ No newline at end of file diff --git a/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/template/iconComponent.ets index 691c10f9..8ba45045 100644 --- a/common/src/main/ets/template/iconComponent.ets +++ b/common/src/main/ets/template/iconComponent.ets @@ -20,8 +20,8 @@ const TAG = 'iconComponent' @Component export default struct iconComponent { - @State iconOff: any = "" - @State iconOn: any = "" + @State iconOff: string = "" + @State iconOn: string = "" @Prop iconOffStr: string @Prop iconOnStr: string private useIconStr = false diff --git a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets index c03e5820..898ac2e0 100644 --- a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets +++ b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets @@ -27,7 +27,7 @@ struct airplaneComponent { $r('app.media.airplane_d'), $r('app.media.airplane'), ]; - @State flyModelTitle: any = $r("app.string.airplane_mode"); + @State flyModelTitle: Resource = $r("app.string.airplane_mode"); @StorageLink('flyModelStatus') flyModelStatus: boolean = false; private mWifiOriginalStatus: boolean = false; diff --git a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets index 2725365a..9034fc01 100644 --- a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets +++ b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets @@ -20,11 +20,17 @@ import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'Control-brightnessComponent'; +class brightnessItemData { + min:number; + max:number; + value:number +} + @Component export default struct MyBrightness { @StorageLink('BrightnessValue') brightnessValue: number = 0; @State style: BrightnessComponentStyle = StyleConfiguration.getBrightnessComponentStyle(); - @State brightnessItem: any = { + @State brightnessItem: brightnessItemData = { min: mBrightnessManager.getMin(), max: mBrightnessManager.getMax(), value: mBrightnessManager.getDefault() diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets index 7502a170..99b54169 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets @@ -16,13 +16,14 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager'; import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase'; +import { itemData } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" const TAG = 'ComplexToggleComponent'; @Component export default struct ComplexToggleComponent { @Prop keyId: string; - @State mItemData: any = {}; + @State mItemData: itemData = new itemData(); @State mStatus: boolean = false; @State mDefaultTitle: string = ''; @@ -37,8 +38,8 @@ export default struct ComplexToggleComponent { linkItemData() { Log.showDebug(TAG, `linkItemData, keyId: ${this.keyId}`); - this.mItemData = AppStorage.Link('ControlCenter_' + this.keyId); - Log.showDebug(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${this.mItemData.get().iconUrl}`); + this.mItemData = AppStorage.Link('ControlCenter_' + this.keyId).get(); + Log.showDebug(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.label} ${this.mItemData.iconUrl}`); } build() { @@ -46,12 +47,12 @@ export default struct ComplexToggleComponent { iconTitleBase({ useTitleStr: true, mTitle: $mDefaultTitle, - mTitleStr: this.mItemData.get() + mTitleStr: this.mItemData .label, useIconStr: true, - iconOffStr: this.mItemData.get() + iconOffStr: this.mItemData .iconUrl, - iconOnStr: this.mItemData.get() + iconOnStr: this.mItemData .iconUrl, changeSwitch: $mStatus, mClickEvent: () => this.onIconItemClick(), @@ -63,15 +64,15 @@ export default struct ComplexToggleComponent { onIconItemClick() { Log.showDebug(TAG, `onIconItemClick`); - if (this.mItemData.get()?.actionData?.clickAction) { - EventManager.publish(this.mItemData.get().actionData.clickAction); + if (this.mItemData?.actionData?.clickAction) { + EventManager.publish(this.mItemData.actionData.clickAction); } } onIconItemLongPressGesture() { Log.showDebug(TAG, `onIconItemLongPressGesture`); - if (this.mItemData.get()?.actionData?.longClickAction) { - EventManager.publish(this.mItemData.get().actionData.longClickAction); + if (this.mItemData?.actionData?.longClickAction) { + EventManager.publish(this.mItemData.actionData.longClickAction); } } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index 8b38ad9f..14272002 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -17,14 +17,14 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager'; import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase'; import PluginIconItemComponent from './PluginIconItemComponent'; -import {PluginType} from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" +import {PluginType,itemData} from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" const TAG = 'SimpleToggleComponent'; @Component export default struct SimpleToggleComponent { private keyId: string; - @State mItemData: any = {}; + @State mItemData: itemData = new itemData(); private mEditMode: boolean = false; private mDragMode: boolean = false; @State mDefaultIcon: Resource = $r("app.media.icon"); @@ -42,8 +42,16 @@ export default struct SimpleToggleComponent { linkItemData() { Log.showDebug(TAG, `linkItemData, keyId: ${this.keyId}`); - this.mItemData = AppStorage.Link('ControlCenter_' + this.keyId); - Log.showDebug(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${this.mItemData.get().iconUrl}`); + this.mItemData = AppStorage.Link('ControlCenter_' + this.keyId).get(); + Log.showDebug(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.label} ${this.mItemData.iconUrl}`); + } + + getLabel() { + switch (this.keyId) { + case 'screenshot': + return $r('app.string.control_center_simple_toggle_screenshot_mode_title') + } + return this.mItemData.label; } getLabel() { @@ -57,11 +65,11 @@ export default struct SimpleToggleComponent { build() { Column() { if (this.keyId != ""){ - if (this.mItemData.get().pluginType == PluginType.META) { + if (this.mItemData.pluginType == PluginType.META) { SimpleToggleBase({ mToggleId: this.keyId, mIcon: $mDefaultIcon, - mIconStr: this.mItemData.get().iconUrl, + mIconStr: this.mItemData.iconUrl, mUseIconStr: true, mChangeSwitch: $mDefaultChangeSwitch, mLabel: $mDefaultLabel, @@ -72,9 +80,9 @@ export default struct SimpleToggleComponent { mClickEvent: () => this.onIconItemClick(), mLongClickEvent: () => this.onIconItemLongPressGesture() }) - } else if (this.mItemData.get().pluginType == PluginType.DATA_ABILITY) { + } else if (this.mItemData.pluginType == PluginType.DATA_ABILITY) { // TODO: - } else if (this.mItemData.get().pluginType == PluginType.PLUGIN_COMPONENT) { + } else if (this.mItemData.pluginType == PluginType.PLUGIN_COMPONENT) { PluginIconItemComponent({ keyId: this.keyId, mEditMode: this.mEditMode, @@ -89,19 +97,19 @@ export default struct SimpleToggleComponent { onIconItemClick() { Log.showDebug(TAG, `onIconItemClick`); - if (this.mItemData.get()?.actionData?.clickAction) { - if (this.mItemData.get().pluginType == PluginType.META) { - EventManager.publish(this.mItemData.get().actionData.clickAction, this.mItemData.get().pluginType); + if (this.mItemData?.actionData?.clickAction) { + if (this.mItemData.pluginType == PluginType.META) { + EventManager.publish(this.mItemData.actionData.clickAction, this.mItemData.pluginType); } else { - EventManager.publish(this.mItemData.get().actionData.clickAction); + EventManager.publish(this.mItemData.actionData.clickAction); } }; } onIconItemLongPressGesture() { Log.showDebug(TAG, `onIconItemLongPressGesture`); - if (this.mItemData.get()?.actionData?.longClickAction) { - EventManager.publish(this.mItemData.get().actionData.longClickAction); + if (this.mItemData?.actionData?.longClickAction) { + EventManager.publish(this.mItemData.actionData.longClickAction); }; } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets index 708d27c2..ab574670 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets @@ -17,7 +17,7 @@ import ConfigData from '../../common/constants'; @Component export default struct ItemComponent { @Link title: Resource; - @Link value: any; + @Link value: string; @Link arrow: Resource; build() { diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts index 0709dd5c..1f5cebc8 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts @@ -27,7 +27,7 @@ export default class NoDisturbComponentViewModel { startTime = ''; endTime = ''; repeatMode = 0; - repeatName: Resource | string = ''; + repeatName: Resource; prompt = ''; isEffective = true; nextDayLabel = ''; @@ -110,8 +110,8 @@ export default class NoDisturbComponentViewModel { } } - refreshRepeatName(inputRepeatMode: number): string | Resource { - let result: string | Resource = ''; + refreshRepeatName(inputRepeatMode: number): Resource { + let result: Resource ; if (inputRepeatMode == DoNotDisturbType.TYPE_ONCE) { result = $r('app.string.noDisturb_once'); } else if (inputRepeatMode == DoNotDisturbType.TYPE_DAILY) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets index 92767954..7f52ad21 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets @@ -20,11 +20,16 @@ import Constants, {InputActionButtonData, NotificationLayout as Layout} from '.. const TAG = 'NoticeItem-ActionComponent'; +class actionInputData { + inputKey?; + wantAgent? +} + @Component export default struct ActionComponent { @State showInputText: boolean = false; @State placeholder: string = ''; - @State inputData: any = undefined; + @State inputData: actionInputData = undefined; @State inputActionData: InputActionButtonData = new InputActionButtonData(); private itemData: any = undefined; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index 516d37e4..fe42be88 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -16,6 +16,7 @@ import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import WindowManager, { WindowType } from '../../../../../../../../../../common/src/main/ets/default/WindowManager'; +import {notificationData} from '../../../../../../../../../../common/src/main/ets/plugindatasource/common/Constants' import Constants, {NotificationLayout as Layout} from '../../common/constants'; import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import CustomItem from './customItem'; @@ -34,7 +35,7 @@ const INTERVAL = 5 * 1000; @Component export default struct BannerNotificationItem { - @State want : any = {}; + @State want : notificationData = new notificationData(); @Link distributedDeviceName: string; @Link mBannerNoticeCnt: number; @Link mLastActionTime: number; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets index 5b038619..880dd188 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets @@ -25,7 +25,7 @@ export default struct TitleItem { @State notificationTime: string = '' @Link isExpand: boolean @Prop needExpand: boolean - @State rowSpace: any = $r('app.float.titleitem_row_space') + @State rowSpace: Resource = $r('app.float.titleitem_row_space') @Prop distributedDeviceName: string private isSubItem: boolean= false; private clickTitleAction: () => void diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts index f968e8ec..aca8cf0a 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -84,4 +84,16 @@ export interface StatusBarConfig { notification: DropdownRange; control: DropdownRange } +} + +export class defaultIconItemStatus { + selected: false +} + +export class defaultIconItemStatus { + selected: false +} + +export class defaultIconItemStatus { + selected: false } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index 56d761e9..69ea8ad8 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -17,7 +17,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log' import EventManager, { unsubscribe } from '../../../../../../../../common/src/main/ets/default/event/EventManager' import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils' import { WINDOW_SHOW_HIDE_EVENT } from '../../../../../../../../common/src/main/ets/default/WindowManager' -import { PluginType } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" +import { PluginType,itemData } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" import ViewModel from '../viewmodel/StatusBarVM' import StyleConfigurationCommon, { CommonStyle } from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' @@ -27,11 +27,15 @@ import PluginIconItemComponent from './PluginIconItemComponent' const TAG = 'IconItemComponent' +class itemStatusData{ + selected: boolean +} + @Component export default struct IconItemComponent { private keyId: string - @State mItemData: any = {} - @State mItemStatus: any = { + @State mItemData: itemData = new itemData() + @State mItemStatus: itemStatusData = { selected: false } mClearCallback: unsubscribe | undefined @@ -42,7 +46,7 @@ export default struct IconItemComponent { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId} `); this.linkItemData() - if (this.mItemData.get()?.relationWindowId) { + if (this.mItemData?.relationWindowId) { this.mClearCallback = EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => this.onWindowChange(args)) } } @@ -54,9 +58,9 @@ export default struct IconItemComponent { } linkItemData() { - this.mItemData = AppStorage.Link('StatusBar_' + this.keyId) - Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ - this.mItemData.get() + this.mItemData = AppStorage.Link('StatusBar_' + this.keyId).get() + Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.label} ${ + this.mItemData .iconUrl}`) this.mItemStatus = AppStorage.SetAndLink('StatusBar_Status_' + this.keyId, { selected: false }).get() } @@ -67,13 +71,13 @@ export default struct IconItemComponent { Row().width(this.style.marginLeft).height('100%') } Row() { - if (this.mItemData.get().pluginType == PluginType.META) { + if (this.mItemData.pluginType == PluginType.META) { MetaIconItemComponent({ keyId: this.keyId }) - } else if (this.mItemData.get().pluginType == PluginType.DATA_ABILITY) { + } else if (this.mItemData.pluginType == PluginType.DATA_ABILITY) { // TODO: - } else if (this.mItemData.get().pluginType == PluginType.PLUGIN_COMPONENT) { + } else if (this.mItemData.pluginType == PluginType.PLUGIN_COMPONENT) { PluginIconItemComponent({ keyId: this.keyId }) @@ -96,7 +100,7 @@ export default struct IconItemComponent { } onWindowChange(args) { - if (this.mItemData.get().canSelect && args?.windowName == this.mItemData.get().relationWindowId) { + if (this.mItemData.canSelect && args?.windowName == this.mItemData.relationWindowId) { this.mItemStatus.selected = args?.isShow } } @@ -112,27 +116,27 @@ export default struct IconItemComponent { execClickAction() { Log.showInfo(TAG, `execClickAction`); - if (this.mItemData.get()?.actionData?.clickAction) { - EventManager.publish(this.mItemData.get().actionData.clickAction) + if (this.mItemData?.actionData?.clickAction) { + EventManager.publish(this.mItemData.actionData.clickAction) } } execSelectedClickAction() { - Log.showInfo(TAG, `execSelectedClickAction ${this.mItemData.get()?.actionData?.selectedClickAction}`); - if (this.mItemData.get()?.actionData?.selectedClickAction) { - EventManager.publish(this.mItemData.get().actionData.selectedClickAction) + Log.showInfo(TAG, `execSelectedClickAction ${this.mItemData?.actionData?.selectedClickAction}`); + if (this.mItemData?.actionData?.selectedClickAction) { + EventManager.publish(this.mItemData.actionData.selectedClickAction) } } onIconItemLongPressGesture(event: GestureEvent) { Log.showInfo(TAG, `onIconItemLongPressGesture, event: ${JSON.stringify(event)}`); - let longClickEvent = this.mItemData.get().actionData.longClickAction; + let longClickEvent = this.mItemData.actionData.longClickAction; longClickEvent && EventManager.publish(longClickEvent); } onIconItemTouch(event: TouchEvent) { Log.showInfo(TAG, `onIconItemTouch, event: ${JSON.stringify(event)}`); - if (this.mItemData.get()?.actionData?.clickAction || this.mItemData.get()?.actionData?.longClickAction) { + if (this.mItemData?.actionData?.clickAction || this.mItemData?.actionData?.longClickAction) { event.stopPropagation() } } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets index 5c72d350..71aebb8e 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets @@ -20,13 +20,14 @@ import ViewModel from '../viewmodel/StatusBarVM' import StyleConfigurationCommon, { CommonStyle } from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' import StyleConfiguration, { IconItemComponentStyle } from '../common/StyleConfiguration' +import { itemData } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" const TAG = 'MetaIconItemComponent' @Component export default struct MetaIconItemComponent { private keyId: string - @State mItemData: any = {} + @State mItemData: itemData = new itemData() @State mTintContentInfo: TintContentInfo = new TintContentInfo() @State style: IconItemComponentStyle = StyleConfiguration.getIconItemComponentStyle() @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle() @@ -42,41 +43,41 @@ export default struct MetaIconItemComponent { } linkItemData() { - this.mItemData = AppStorage.Link('StatusBar_' + this.keyId); - Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ - this.mItemData.get() + this.mItemData = AppStorage.Link('StatusBar_' + this.keyId).get(); + Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.label} ${ + this.mItemData .iconUrl}`) } build() { Row() { - if ((this.mItemData.get().isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.get().label)) - || (this.mItemData.get().isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.get().iconUrl))) { + if ((this.mItemData.isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.label)) + || (this.mItemData.isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.iconUrl))) { Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } - if (this.mItemData.get().isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.get().label)) { - Text(this.mItemData.get() + if (this.mItemData.isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.label)) { + Text(this.mItemData .label) .fontColor(this.mTintContentInfo.contentColor) .fontSize(this.styleCommon.statusBarFontSize) .textAlign(TextAlign.End) } - if (this.mItemData.get().isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.get().label)) { - if (this.mItemData.get().isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.get().iconUrl)) { + if (this.mItemData.isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.label)) { + if (this.mItemData.isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.iconUrl)) { Row() { }.height(1).width(this.style.componentSpace) } } - if (this.mItemData.get().isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.get().iconUrl)) { - Image(this.mItemData.get() + if (this.mItemData.isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.iconUrl)) { + Image(this.mItemData .iconUrl) .width(this.style.iconWidth) .height(this.style.iconHeight) .fillColor(this.mTintContentInfo.contentColor) .objectFit(ImageFit.Contain) } - if ((this.mItemData.get().isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.get().label)) - || (this.mItemData.get().isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.get().iconUrl))) { + if ((this.mItemData.isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.label)) + || (this.mItemData.isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.iconUrl))) { Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } }.height('100%') diff --git a/product/default/navigationBar/src/main/ets/pages/index.ets b/product/default/navigationBar/src/main/ets/pages/index.ets index c77199c3..8f643c81 100644 --- a/product/default/navigationBar/src/main/ets/pages/index.ets +++ b/product/default/navigationBar/src/main/ets/pages/index.ets @@ -28,7 +28,7 @@ let mConfigManager = configManager @Entry @Component struct Index { - @StorageLink('navigationLayoutConfig') mConfig: any = {} + @StorageLink('navigationLayoutConfig') mConfig: object = {} @StorageLink('minNavHeight') minNavHeight: number = 32 @StorageLink("showNavHorizontal") showNavHorizontal: boolean = true @State mNavigationBarComponentData: NavigationBarComponentData = new NavigationBarComponentData() diff --git a/product/default/navigationBar/src/main/ets/pages/keyButton.ets b/product/default/navigationBar/src/main/ets/pages/keyButton.ets index 7a1523dd..339faec7 100644 --- a/product/default/navigationBar/src/main/ets/pages/keyButton.ets +++ b/product/default/navigationBar/src/main/ets/pages/keyButton.ets @@ -27,7 +27,7 @@ export default struct keyButton { private uri: any; @State keyCode: number = 0; @Link currentTouchItem: number; - @State backGroundColor: any = $r('app.color.button_default_background'); + @State backGroundColor: Resource = $r('app.color.button_default_background'); @StorageLink("showNavHorizontal") showNavHorizontal: boolean = AppStorage.SetAndLink("showNavHorizontal", true).get(); @State mNavigationBarComponentData: NavigationBarComponentData = NavigationBarViewModel.getInstance() .getNavigationBarComponentData() diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index ca1b5ca8..5f7f03c3 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -38,7 +38,7 @@ export default struct NoDisturb { @State startTitle:Resource = $r('app.string.startTime'); @State endTitle:Resource = $r('app.string.endTime'); @State arrow: Resource = $r('app.media.ic_settings_arrow'); - @State repeatName : any = this.mViewModel.repeatName + @State repeatName : Resource = this.mViewModel.repeatName @State startDateClue : string = this.mViewModel.startDateClue @State startTimeClue : string = this.mViewModel.startTimeClue @State endDateClue : string = this.mViewModel.endDateClue diff --git a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets index b273d147..9de880d2 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets @@ -14,6 +14,7 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log'; +import {notificationData} from '../../../../../../../common/src/main/ets/plugindatasource/common/Constants' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager"; @@ -56,7 +57,7 @@ struct Index { @State mLastActionTime: number = 0; @State needExpand: boolean = true @State isExpand: boolean = false; - @State pageData: any = {}; + @State pageData: notificationData = new notificationData(); @State mOpacity: number = 0.0; @State mWidthSize: number = 0.8; @State mTranslate: string = TRANSLATE_SIZE; diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 62022902..4d86ce41 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -42,9 +42,9 @@ class ServiceExtAbility extends ServiceExtension { height: dis.height, }; AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect', rect); - WindowManager.createWindow(this.context, WindowType.DROPDOWN_PANEL, rect, 'pages/index').then(() => - Log.showInfo(TAG, 'onCreate, createWindow callback') - ).then(() => { + WindowManager.createWindow(this.context, WindowType.DROPDOWN_PANEL, rect, 'pages/index').then( (win) => { + win.setLayoutFullScreen(true); + Log.showInfo(TAG, 'onCreate, createWindow callback'); }).catch((err) => { }); diff --git a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets index 7db30670..96668ece 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets @@ -14,6 +14,7 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log'; +import {notificationData} from '../../../../../../../common/src/main/ets/plugindatasource/common/Constants' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager"; @@ -56,7 +57,7 @@ struct Index { @State mLastActionTime: number = 0; @State needExpand: boolean = true @State isExpand: boolean = false; - @State pageData: any = {}; + @State pageData: notificationData = new notificationData(); @State mOpacity: number = 0.0; @State mWidthSize: number = 0.8; @State mTranslate: string = TRANSLATE_SIZE; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts index 6b8dadb5..fc205730 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts @@ -44,7 +44,12 @@ export class navigationEvent { commonEvent.subscribe(data, (err, data) => { Log.showInfo(TAG, `subscribe err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); if (err.code == 0) { - const processingData = JSON.parse(data.data); + let processingData;; + try{ + processingData = JSON.parse(data.data) + }catch(e){ + Log.showError(TAG, 'date.data is err'); + } if (processingData) { Log.showInfo(TAG, `subscribe processingData: ${JSON.stringify(processingData)} `); this.mCallback.onStateChange(processingData); diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index 2f55ffb0..76693ebb 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -64,6 +64,12 @@ const HIDE_ANIM_CONFIG = { playMode: PlayMode.Normal, } +class insertTemplate{ + type: TransitionType; + opacity: number; + scale: Object +} + @Entry @Component struct Index { @@ -79,10 +85,10 @@ struct Index { navigationBarWidth: number = 0; mNeedUpdate: boolean = false; mWidthPx: number = 0; - @State mNotificationInsert: any = {}; - @State mNotificationDelete: any = {}; - @State mControlCenterInsert: any = {}; - @State mControlCenterDelete: any = {}; + @State mNotificationInsert: insertTemplate = new insertTemplate(); + @State mNotificationDelete: insertTemplate = new insertTemplate(); + @State mControlCenterInsert: insertTemplate = new insertTemplate(); + @State mControlCenterDelete: insertTemplate = new insertTemplate(); @State componentOptAreaTranslateY: string = '0px'; @State backgroundOpacity: number = 0; diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index fae2994d..3f157a76 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -167,10 +167,8 @@ struct Index { Log.showDebug(TAG, `onWindowShowHideEvent, args: ${JSON.stringify(args)}`) if (args.windowName == WindowType.DROPDOWN_PANEL) { if (args.isShow) { - WindowManager.hideWindow(WindowType.STATUS_BAR) } else { StatusBarVM.setUseInWindowName(WindowType.STATUS_BAR) - WindowManager.showWindow(WindowType.STATUS_BAR) } } } -- Gitee From d5765dd9203615e1824cf008cfd38301546ae5a8 Mon Sep 17 00:00:00 2001 From: SEASON_SYSU Date: Fri, 17 Mar 2023 07:24:22 +0000 Subject: [PATCH 340/373] update common/src/main/ets/plugindatasource/common/Constants.ts. Signed-off-by: SEASON_SYSU --- .../ets/plugindatasource/common/Constants.ts | 114 ------------------ 1 file changed, 114 deletions(-) diff --git a/common/src/main/ets/plugindatasource/common/Constants.ts b/common/src/main/ets/plugindatasource/common/Constants.ts index 14cca6b8..2db0f695 100644 --- a/common/src/main/ets/plugindatasource/common/Constants.ts +++ b/common/src/main/ets/plugindatasource/common/Constants.ts @@ -143,117 +143,3 @@ export class notificationData { groupName?: string; tapDismissed?: boolean; } - -export class itemData { - id:string; - pluginType:number; - bundleName:string; - moduleName:string; - abilityName:string; - abilityLabelId:number; - abilityIconId:number; - label:string; - iconUrl: string; - actionData?; - relationWindowId? - canSelect? - isShowLabel? - isShowIcon? -} - -export class notificationData { - id: string; - hashcode: string; - userId: number; - uid: number; - contentType: string; - timestamp: number; - time: string; - appName: string; - want: any; - actionButtons: any[]; - bundleName: string; - smallIcon?: PixelMap; - largeIcon?: PixelMap; - picture?: PixelMap; - title?: string; - text?: string; - additionalText?: string; - briefText?: string; - expandedTitle?: string; - longText?: string; - lines?: any[]; - longTitle?: string; - slotLevel?: any; - source?: number; - versionName?: string; - sound?: string; - vibrationValues?: Array; - notificationFlags?: any; - ruleData?; - template?: any; - isOngoing?: boolean; - isUnremovable?: boolean; - isRemoveAllowed?: boolean; - distributedOption?: any; - deviceId?: string; - groupName?: string; - tapDismissed?: boolean; -} - -export class itemData { - id:string; - pluginType:number; - bundleName:string; - moduleName:string; - abilityName:string; - abilityLabelId:number; - abilityIconId:number; - label:string; - iconUrl: string; - actionData?; - relationWindowId? - canSelect? - isShowLabel? - isShowIcon? -} - -export class notificationData { - id: string; - hashcode: string; - userId: number; - uid: number; - contentType: string; - timestamp: number; - time: string; - appName: string; - want: any; - actionButtons: any[]; - bundleName: string; - smallIcon?: PixelMap; - largeIcon?: PixelMap; - picture?: PixelMap; - title?: string; - text?: string; - additionalText?: string; - briefText?: string; - expandedTitle?: string; - longText?: string; - lines?: any[]; - longTitle?: string; - slotLevel?: any; - source?: number; - versionName?: string; - sound?: string; - vibrationValues?: Array; - notificationFlags?: any; - ruleData?; - template?: any; - isOngoing?: boolean; - isUnremovable?: boolean; - isRemoveAllowed?: boolean; - distributedOption?: any; - deviceId?: string; - groupName?: string; - tapDismissed?: boolean; -} \ No newline at end of file -- Gitee From 1fac807d959470f2781417875afe3f4db985a5cc Mon Sep 17 00:00:00 2001 From: SEASON_SYSU Date: Fri, 17 Mar 2023 09:19:39 +0000 Subject: [PATCH 341/373] update features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets. Signed-off-by: SEASON_SYSU --- .../src/main/ets/com/ohos/pages/SimpleToggleComponent.ets | 8 -------- 1 file changed, 8 deletions(-) diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index 14272002..9b0a099f 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -54,14 +54,6 @@ export default struct SimpleToggleComponent { return this.mItemData.label; } - getLabel() { - switch (this.keyId) { - case 'screenshot': - return $r('app.string.control_center_simple_toggle_screenshot_mode_title') - } - return this.mItemData.get().label; - } - build() { Column() { if (this.keyId != ""){ -- Gitee From 615643b90ff4c072067b7ec32d29c3e8c6e5ef29 Mon Sep 17 00:00:00 2001 From: SEASON_SYSU Date: Fri, 17 Mar 2023 10:14:15 +0000 Subject: [PATCH 342/373] update features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts. Signed-off-by: SEASON_SYSU --- .../src/main/ets/com/ohos/common/Constants.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts index aca8cf0a..4e9b4833 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -86,14 +86,6 @@ export interface StatusBarConfig { } } -export class defaultIconItemStatus { - selected: false -} - -export class defaultIconItemStatus { - selected: false -} - export class defaultIconItemStatus { selected: false } \ No newline at end of file -- Gitee From 697e761774d0a539a32c14be42e07664cbbdb4dd Mon Sep 17 00:00:00 2001 From: tangzhigang1 Date: Wed, 22 Mar 2023 11:29:54 +0800 Subject: [PATCH 343/373] =?UTF-8?q?fixed=204969b97=20from=20https://gitee.?= =?UTF-8?q?com/season-sysu/applications=5Fsystemui/pulls/319=20=E8=93=9D?= =?UTF-8?q?=E5=8C=BA=E4=BB=A3=E7=A0=81warning=E6=95=B4=E6=94=B9,=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=90=88=E5=85=A53.2release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SEASON_SYSU --- .../src/main/ets/com/ohos/pages/StatusBarComponent.ets | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index c8cf854c..8a5ec0e3 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -241,7 +241,6 @@ struct VerticalStatusBarItemLoadComponent { @Component struct StatusBarItemLoadComponent { private mComponentName: string - @StorageLink('size') size: any='' aboutToAppear() { Log.showInfo(TAG_StatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName} `) } @@ -291,7 +290,7 @@ struct StatusBarItemLoadComponent { @Component struct StatusBarEmptyIcon { - @StorageLink('StatusBarEmptyWidth') mStatusBarEmptyWidth: any = 0 + @StorageLink('StatusBarEmptyWidth') mStatusBarEmptyWidth: number = 0 @State mTintContentInfo: TintContentInfo = ViewModel.getEmptyTintContentInfo() aboutToAppear() { @@ -309,7 +308,7 @@ struct StatusBarEmptyIcon { @Component struct StatusBarNotificationIcon { - @StorageLink('notificationList') notificationList: any = [] + @StorageLink('notificationList') notificationList: Array = [] @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 @State mTintContentInfo: TintContentInfo = ViewModel.getNotificationTintContentInfo() @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle() -- Gitee From 3818bb6676567cd43c72eb62f4d1e664e814a140 Mon Sep 17 00:00:00 2001 From: chenlang <18577333310@163.com> Date: Thu, 23 Mar 2023 15:36:32 +0800 Subject: [PATCH 344/373] =?UTF-8?q?fixed=201b4555e=20from=20https://gitee.?= =?UTF-8?q?com/fangzheng24/applications=5Fscreenlock/pulls/92=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=94=81=E5=B1=8F=E7=82=B9=E5=87=BB=E5=B0=8F=E7=9C=BC?= =?UTF-8?q?=E7=9D=9B=E5=AF=86=E7=A0=81=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=85=A8?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenlang <18577333310@163.com> --- .../view/item/bannerNotificationItem.ets | 1 - .../main/ets/com/ohos/model/accountsModel.ts | 8 ++++---- .../main/resources/phone/element/float.json | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 8 ++++++++ product/pc/src/main/ets/pages/index.ets | 1 - product/pc/src/main/module.json5 | 3 +++ product/phone/src/main/ets/pages/index.ets | 1 - signature/systemui.p7b | Bin 3742 -> 3779 bytes 8 files changed, 16 insertions(+), 8 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index 274238c0..d9f6c867 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -57,7 +57,6 @@ export default struct BannerNotificationItem { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) - setAppBgColor('#00000000') this.mCloseEnableFlg = false; this.mDefaultBannerRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect'); setTimeout(() => { diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index a6bb3e7f..1927666d 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -176,10 +176,10 @@ export default class AccountsModel { private sortAccount(info1, info2): number { if (info1.isActived || info2.isActived) { return info1.isActived ? -1 : 1; - } else if (info1.type == osAccount.OsAccoutType.ADMIN || info2.type == osAccount.OsAccoutType.ADMIN) { - return info1.type == osAccount.OsAccoutType.ADMIN ? -1 : 1; - } else if (info1.type == osAccount.OsAccoutType.GUEST || info2.type == osAccount.OsAccoutType.GUEST) { - return info1.type == osAccount.OsAccoutType.GUEST ? 1 : -1; + } else if (info1.type.ADMIN == TYPE_ADMIN || info2.type.ADMIN == TYPE_ADMIN) { + return info1.type.ADMIN == TYPE_ADMIN ? -1 : 1; + } else if (info1.type.GUEST == TYPE_GUEST || info2.type.GUEST == TYPE_GUEST) { + return info1.type.GUEST == TYPE_GUEST ? 1 : -1; } else { return info2.localId - info1.localId; } diff --git a/features/screenlock/src/main/resources/phone/element/float.json b/features/screenlock/src/main/resources/phone/element/float.json index df2590b1..c50dbbaa 100644 --- a/features/screenlock/src/main/resources/phone/element/float.json +++ b/features/screenlock/src/main/resources/phone/element/float.json @@ -118,7 +118,7 @@ }, { "name": "mixedpsd_prompt_text_fontsize", - "value": "20fp" + "value": "12fp" }, { "name": "mixedpsd_prompt_margin_bottom", diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 34e846b6..ce4446fb 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -21,6 +21,7 @@ import Log from '../../../../../../common/src/main/ets/default/Log' import Constants from '../../../../../../features/screenlock/src/main/ets/com/ohos/common/constants' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import sTimeManager from '../../../../../../common/src/main/ets/default/TimeManager' +import inputMethod from '@ohos.inputMethod' const TAG = "ScreenLock-ServiceExtAbility" const AUTO_ROTATION_RETRICTED: number = 8 @@ -49,6 +50,13 @@ class ServiceExtAbility extends ServiceExtension { Log.showInfo(TAG, "direction change : " + this.direction) AppStorage.SetOrCreate('screenlockdirection', this.direction) this.resetWindow(display.width,display.height) + let inputMethodController = inputMethod.getController(); + Log.showInfo(TAG, "inputMethodController: "+inputMethodController) + inputMethodController.hideSoftKeyboard().then(() => { + Log.showInfo(TAG, "Succeeded in hiding softKeyboard") + }).catch((err) => { + Log.showError(TAG, "failed to hideSoftKeyboard: " + JSON.stringify(err)); + }); } } }) diff --git a/product/pc/src/main/ets/pages/index.ets b/product/pc/src/main/ets/pages/index.ets index 4a0e9a5c..58ced0e1 100644 --- a/product/pc/src/main/ets/pages/index.ets +++ b/product/pc/src/main/ets/pages/index.ets @@ -38,7 +38,6 @@ struct Index { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) try { - setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) diff --git a/product/pc/src/main/module.json5 b/product/pc/src/main/module.json5 index 1e1c4394..0a86da89 100644 --- a/product/pc/src/main/module.json5 +++ b/product/pc/src/main/module.json5 @@ -75,6 +75,9 @@ }, { "name": "ohos.permission.REBOOT" + }, + { + "name": "ohos.permission.CONNECT_IME_ABILITY" } ], "extensionAbilities": [ diff --git a/product/phone/src/main/ets/pages/index.ets b/product/phone/src/main/ets/pages/index.ets index e2bdb990..9c17ef5b 100644 --- a/product/phone/src/main/ets/pages/index.ets +++ b/product/phone/src/main/ets/pages/index.ets @@ -40,7 +40,6 @@ struct Index { this.mViewModel.ViewModelInit() this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR try { - setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) diff --git a/signature/systemui.p7b b/signature/systemui.p7b index 4a9257baa3e90aeee81dfffa7391a12e2f747c5a..624ea055cb5572cf3345386760554aa172817189 100644 GIT binary patch delta 327 zcmbOydsw#Kpowok8>d#AN85K^Ms}tJO?(@GLTi{984Y<2xY;-p+B_IjnOT?^4Vu^z z5egX>G_eJ-G_m>Eh(&;GFL7wT95075}; A9RL6T delta 310 zcmX>sJ5RRWpowo58>d#AN85K^Ms}tJO?=%zp>`%lMnhf$ZZ^(@HV?*BW)>z!gC;g> zghIvzO>87#~N@b}<#hLkex_ODYsY+H#hI$5i21+_`;pF@jps=BiQer`YZc1ix zNl|7}X$eR}No7Im#`^zPJO^micYYnmuk|)=5+D|^qn_6#VU}s$j54WC^#ZZYwVUz7N_3v}pPe*6h&S`TI%E?=j@?Nz5>%+y|Pmd}-&y_RaV&edM z?3^tNGZTxufh&_D!^i7go7OtCe>h;JAys$yWQx$Q1Mk_B<@{3j_xXh%yj{Vh5Wjpz k==`qS)sn&8o)?9u2S(KVl~7v#diA|!PuXAb{V@*%0FoAJ3;+NC -- Gitee From 3d5fec234151baec9ee9e0839eb98837fd3cdff4 Mon Sep 17 00:00:00 2001 From: chenlang <18577333310@163.com> Date: Fri, 24 Mar 2023 09:49:37 +0800 Subject: [PATCH 345/373] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=87=8D=E5=90=AF?= =?UTF-8?q?=E5=A3=81=E7=BA=B8=E6=B6=88=E5=A4=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenlang <18577333310@163.com> --- .../src/main/ets/com/ohos/vm/wallpaperViewModel.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts index ee410b20..3d2608e6 100644 --- a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts +++ b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts @@ -41,6 +41,7 @@ export default class WallpaperViewModel { WallpaperMar.getPixelMap(WallpaperMar.WallpaperType.WALLPAPER_LOCKSCREEN, (error, data) => { if (error != undefined && error != null) { Log.showError(TAG, 'getScreenLockWallpaper error:' + JSON.stringify(error)); + this.getScreenLockWallpaper() } else { Log.showDebug(TAG, 'getScreenLockWallpaper data:' + JSON.stringify(data)); this.wallpaperData = data -- Gitee From d138cd3fff36cf9c0fefdb47b8068b4280673d79 Mon Sep 17 00:00:00 2001 From: chyyy0213 Date: Thu, 23 Mar 2023 21:50:00 +0800 Subject: [PATCH 346/373] add sceneContainerSession Signed-off-by: chyyy0213 --- common/index.ets | 6 +- .../scene/session/HWDividerParam.ets | 54 ++++++++++++ .../scene/session/HWSceneContainerSession.ets | 80 ++++++++++++++++++ .../screen/session/HWScreenSession.ets | 58 ++++++++----- .../ets/default/constants/StyleConstants.ts | 2 + .../src/main/ets/WindowScene/HWDivider.ets | 65 +++++++++++++++ .../main/ets/WindowScene/HWGestureNavBar.ets | 80 ++++++++++++++++++ .../src/main/ets/WindowScene/HWScene.ets | 67 ++++----------- .../main/ets/WindowScene/HWSceneContainer.ets | 83 +++++++++++++++++++ .../src/main/ets/WindowScene/HWScenePanel.ets | 15 ++-- .../src/main/ets/WindowScene/HWScreen.ets | 2 +- 11 files changed, 431 insertions(+), 81 deletions(-) create mode 100644 common/src/main/ets/WindowScene/scene/session/HWDividerParam.ets create mode 100644 common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ets create mode 100644 product/phone/src/main/ets/WindowScene/HWDivider.ets create mode 100644 product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets create mode 100644 product/phone/src/main/ets/WindowScene/HWSceneContainer.ets diff --git a/common/index.ets b/common/index.ets index e612adde..5a2aec1e 100644 --- a/common/index.ets +++ b/common/index.ets @@ -89,7 +89,9 @@ export { DragItemPosition } from './src/main/ets/default/interface/DragItemPosi // Window scene export { HWRootSceneSession } from './src/main/ets/WindowScene/scene/session/HWRootSceneSession' export { HWSceneInfo } from './src/main/ets/WindowScene/scene/session/HWSceneInfo' +export { HWDividerParam } from './src/main/ets/WindowScene/scene/session/HWDividerParam' export { HWSceneSession } from './src/main/ets/WindowScene/scene/session/HWSceneSession' export { HWSceneSessionManager } from './src/main/ets/WindowScene/scene/session/HWSceneSessionManager' -export { HWScreenSession, SceneSessionArray } from './src/main/ets/WindowScene/screen/session/HWScreenSession' -export { HWScreenSessionManager } from './src/main/ets/WindowScene/screen/session/HWScreenSessionManager' \ No newline at end of file +export { HWScreenSession, SceneContainerSessionArray } from './src/main/ets/WindowScene/screen/session/HWScreenSession' +export { HWScreenSessionManager } from './src/main/ets/WindowScene/screen/session/HWScreenSessionManager' +export { HWSceneContainerSession } from './src/main/ets/WindowScene/scene/session/HWSceneContainerSession' \ No newline at end of file diff --git a/common/src/main/ets/WindowScene/scene/session/HWDividerParam.ets b/common/src/main/ets/WindowScene/scene/session/HWDividerParam.ets new file mode 100644 index 00000000..da3e0cfc --- /dev/null +++ b/common/src/main/ets/WindowScene/scene/session/HWDividerParam.ets @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2023 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. + */ +/** + * param of HWDivider + */ +@Observed +export class HWDividerParam { + /** + * translateX of Divider + */ + translateX: number = 0 + + /** + * translateY of Divider + */ + translateY: number = 0 + + /** + * scaleX of Divider + */ + scaleX: number = 1 + + /** + * scaleY of Divider + */ + scaleY: number = 1 + + /** + * scaleY of primary HWScene + */ + primaryScaleY : number = 1 + + /** + * Height of primary HWScene + */ + primaryH : string = '100%' + + /** + * blurRadius of primary/secondary HWScene when drag divider + */ + blurRadius : number = 0 +} diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ets new file mode 100644 index 00000000..0ef9637a --- /dev/null +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ets @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2023 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 screenSessionManager from '@ohos.screenSessionManager' +import { HWSceneSession } from './HWSceneSession' +import { HWSceneInfo } from '../../scene/session/HWSceneInfo' +import { Log } from '../../../default/utils/Log' + +const TAG = 'HWSceneContainerSession' +/** + * Session of a scene. + */ +@Observed +export class HWSceneContainerSession { + public primarySession: HWSceneSession + public secondarySession: HWSceneSession + public bounds: screenSessionManager.RRect + isSplit: boolean = false + isActive: boolean = true + translateX: number = 0 + translateY: number = 0 + scaleX: number = 1 + scaleY: number = 1 + + /** + * Constructor. + */ + constructor(primarySession: HWSceneSession, screenBounds : screenSessionManager.RRect) { + Log.showInfo(TAG, 'new primary scene session, id:' + primarySession.session.persistentId) + this.primarySession = primarySession + this.bounds = screenBounds + this.secondarySession = null + } + + public findSceneSession(persistentId: number): boolean { + if (this.primarySession) { + if (this.primarySession.session.persistentId === persistentId) { + return true + } + } + if (this.isSplit && this.secondarySession) { + if (this.primarySession.session.persistentId === persistentId) { + return true + } + } + return false + } + + public getSceneSession(sceneInfo: HWSceneInfo) : HWSceneSession { + if (this.primarySession) { + if (this.primarySession.sceneInfo.abilityName === sceneInfo.abilityName && + this.primarySession.sceneInfo.bundleName === sceneInfo.bundleName) { + return this.primarySession + } + } + if (this.isSplit && this.secondarySession) { + if (this.secondarySession.sceneInfo.abilityName === sceneInfo.abilityName && + this.secondarySession.sceneInfo.bundleName === sceneInfo.bundleName) { + return this.secondarySession + } + } + return null + } + + public addSecondarySession() { + + } +} diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets index 813adfe7..19077b16 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets @@ -15,6 +15,7 @@ import screenSessionManager from '@ohos.screenSessionManager' import { HWSceneSession } from '../../scene/session/HWSceneSession' +import { HWSceneContainerSession } from '../../scene/session/HWSceneContainerSession' import { Log } from '../../../default/utils/Log' import { HWSceneInfo } from '../../scene/session/HWSceneInfo' @@ -24,6 +25,9 @@ const TAG = 'HWScreenSession' export class SceneSessionArray extends Array { } +@Observed +export class SceneContainerSessionArray extends Array { +} /** * Session of a screen. */ @@ -32,7 +36,7 @@ export class HWScreenSession { public readonly session: screenSessionManager.ScreenSession public bounds: screenSessionManager.RRect public rotation: number - public sceneSessionList: SceneSessionArray = new SceneSessionArray() + public sceneContainerSessionList: SceneContainerSessionArray = new SceneContainerSessionArray() /** * Constructor. @@ -81,12 +85,11 @@ export class HWScreenSession { this.updateProperty(screenProperty) } - private findSceneSession(persistentId: number): number { - const sceneSessionIndex = this.sceneSessionList.findIndex(item => { - return item.session.persistentId === persistentId + private findSceneContainerSession(persistentId: number): number { + const sceneContainerSessionIndex = this.sceneContainerSessionList.findIndex(item => { + return item.findSceneSession(persistentId) }) - - return sceneSessionIndex + return sceneContainerSessionIndex } /** @@ -95,13 +98,22 @@ export class HWScreenSession { */ public addSceneSession(sceneSession: HWSceneSession): void { Log.showInfo(TAG, 'Add scene session, id:' + sceneSession.session.persistentId) - const sceneSessionIndex = this.findSceneSession(sceneSession.session.persistentId) - if (sceneSessionIndex != -1) { + const sceneContainerSessionIndex = this.findSceneContainerSession(sceneSession.session.persistentId) + if (sceneContainerSessionIndex != -1) { + const sceneContainerSession = this.sceneContainerSessionList[sceneContainerSessionIndex] + if (sceneContainerSession.primarySession && sceneContainerSession.primarySession.session.persistentId === sceneSession.session.persistentId) { + sceneContainerSession.primarySession.isActive = true + } else if (sceneContainerSession.secondarySession && sceneContainerSession.secondarySession.session.persistentId === sceneSession.session.persistentId) { + sceneContainerSession.secondarySession.isActive = true + } + sceneContainerSession.isActive = true Log.showInfo(TAG, 'Repeat to add scene session.') return } - this.sceneSessionList.push(sceneSession) + // TODO: is splitScreen + this.sceneContainerSessionList.push(new HWSceneContainerSession(sceneSession, this.bounds)) + Log.showInfo(TAG, 'after addSceneSession sceneContainerList Length: ' + this.sceneContainerSessionList.length) } /** @@ -110,13 +122,25 @@ export class HWScreenSession { */ public removeSceneSession(sceneSession: HWSceneSession): void { Log.showInfo(TAG, 'Remove scene session, id:' + sceneSession.session.persistentId) - const sceneSessionIndex = this.findSceneSession(sceneSession.session.persistentId) + const sceneSessionIndex = this.findSceneContainerSession(sceneSession.session.persistentId) if (sceneSessionIndex == -1) { Log.showError(TAG, 'Can not find the scene session.') return } - this.sceneSessionList.splice(sceneSessionIndex, 1) + const sceneContainerSession = this.sceneContainerSessionList[sceneSessionIndex] + if (sceneContainerSession.primarySession && sceneContainerSession.primarySession.session.persistentId === sceneSession.session.persistentId) { + sceneContainerSession.primarySession.isActive = false + sceneContainerSession.primarySession = null + } else if (sceneContainerSession.secondarySession && sceneContainerSession.secondarySession.session.persistentId === sceneSession.session.persistentId) { + sceneContainerSession.secondarySession.isActive = false + sceneContainerSession.secondarySession = null + } + if (!sceneContainerSession.primarySession && !sceneContainerSession.secondarySession) { + sceneContainerSession.isActive = false + this.sceneContainerSessionList.splice(sceneSessionIndex, 1) + } + Log.showInfo(TAG, 'after removeSceneSession sceneContainerList Length: ' + this.sceneContainerSessionList.length) } /** @@ -125,15 +149,9 @@ export class HWScreenSession { * @return Session of the scene */ public getSceneSession(sceneInfo: HWSceneInfo): HWSceneSession { - const sceneSessionIndex = this.sceneSessionList.findIndex(item => { - return item.sceneInfo.abilityName === sceneInfo.abilityName && - item.sceneInfo.bundleName === sceneInfo.bundleName - }) - - if (sceneSessionIndex != -1) { - return this.sceneSessionList[sceneSessionIndex] - } else { - return null + for(var i: number = 0; i < this.sceneContainerSessionList.length; i++) { + return this.sceneContainerSessionList[i].getSceneSession(sceneInfo); } + return null } } diff --git a/common/src/main/ets/default/constants/StyleConstants.ts b/common/src/main/ets/default/constants/StyleConstants.ts index f162e79e..ca7f1a9d 100644 --- a/common/src/main/ets/default/constants/StyleConstants.ts +++ b/common/src/main/ets/default/constants/StyleConstants.ts @@ -67,6 +67,8 @@ export class StyleConstants { static readonly PERCENTAGE_75 = '75%'; static readonly PERCENTAGE_70 = '70%'; static readonly PERCENTAGE_15 = '15%'; + static readonly PERCENTAGE_48 = '48%'; + static readonly PERCENTAGE_DIVIDER_HEIGHT = '4%'; static readonly DEFAULT_APP_IMAGE = '/common/pics/img_app_default.png'; static readonly DEFAULT_DELETE_IMAGE = '/common/pics/ic_public_delete.svg'; static readonly DEFAULT_BACKGROUND_IMAGE_RECENT = '/common/pics/ic_wallpaper_recent.jpg'; diff --git a/product/phone/src/main/ets/WindowScene/HWDivider.ets b/product/phone/src/main/ets/WindowScene/HWDivider.ets new file mode 100644 index 00000000..7d5d829c --- /dev/null +++ b/product/phone/src/main/ets/WindowScene/HWDivider.ets @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2023 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 { HWDividerParam,StyleConstants } from '@ohos/common' +import { Log } from '@ohos/common' +import screenSessionManager from '@ohos.screenSessionManager' + +const TAG = 'HWDivider' + +@Component +export struct HWDivider { + @Link dividerParam : HWDividerParam + screenBounds : screenSessionManager.RRect + buildLog() { + Log.showInfo(TAG, "primaryH: " + parseFloat(this.dividerParam.primaryH) + " scaleY: " + this.dividerParam.primaryScaleY) + return true + } + build() { + // Divider + Stack({alignContent: Alignment.Center}) { + Button() + .backgroundColor(Color.Gray) + .width('35%') + .height('70%') + .gesture(PanGesture({distance: 1}) + .onActionStart((event: GestureEvent) => { + this.dividerParam.blurRadius = 50 + if (this.buildLog()) {} + }) + .onActionUpdate((event: GestureEvent) => { + if (this.buildLog()) {} + this.dividerParam.translateX = event.offsetX + this.dividerParam.translateY = event.offsetY + let beginH = this.screenBounds.height * parseFloat(this.dividerParam.primaryH) * 0.01 + this.dividerParam.primaryScaleY = (beginH + event.offsetY) / beginH + }) + .onActionCancel(() => { + }) + .onActionEnd((event: GestureEvent) => { + this.dividerParam.translateX = 0 + this.dividerParam.translateY = 0 + this.dividerParam.primaryScaleY = 1 + let beginH = this.screenBounds.height * parseFloat(this.dividerParam.primaryH) * 0.01 + this.dividerParam.primaryH = ((beginH + event.offsetY) / this.screenBounds.height) * 100 + '%' + this.dividerParam.blurRadius = 0 + })) + } + .translate({y: this.dividerParam.translateY}) + .width('100%') + .height(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT) + .backgroundColor(Color.Black) + } +} diff --git a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets new file mode 100644 index 00000000..d80315de --- /dev/null +++ b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2023 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 { HWSceneContainerSession, HWSceneSessionManager, HWDividerParam } from '@ohos/common' +import { Log } from '@ohos/common' +import { StyleConstants } from '@ohos/common' + +const TAG = 'HWGestureNavBar' + +@Component +export struct HWGestureNavBar { + @ObjectLink sceneContainerSession: HWSceneContainerSession + @Link dividerParam : HWDividerParam + + build() { + // Gesture navigation bar + Stack({alignContent: Alignment.Center}) { + Button() + .backgroundColor(Color.Black) + .width('35%') + .height('25%') + } + .position({y: '96%'}) + .width('100%') + .height('4%') + .gesture(PanGesture() + .onActionStart((event: GestureEvent) => { + + }) + .onActionUpdate((event: GestureEvent) => { + Log.showInfo(TAG,'onActionUpdate:' + event.offsetY) + // TODO temp test + this.sceneContainerSession.translateX = event.offsetX + if (event.offsetY < 0) { + this.sceneContainerSession.translateY = event.offsetY + this.sceneContainerSession.scaleX = 1 + event.offsetY / 1280 + this.sceneContainerSession.scaleY = 1 + event.offsetY / 1280 + } else { + this.sceneContainerSession.translateY = 0 + this.sceneContainerSession.scaleX = 1 + this.sceneContainerSession.scaleY = 1 + } + }) + .onActionCancel(() => { + }) + .onActionEnd((event: GestureEvent) => { + if ((event.offsetY < -200) && (event.offsetY > -400)) { + this.sceneContainerSession.isSplit = true + this.sceneContainerSession.translateX = 0 + this.sceneContainerSession.translateY = 0 + this.sceneContainerSession.scaleX = 1 + this.sceneContainerSession.scaleY = 1 + this.dividerParam.primaryH = ((100 - parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)) / 2) + '%' + } else if (event.offsetY < -400) { + this.sceneContainerSession.isActive = false + HWSceneSessionManager.getInstance().requestSceneBackground(this.sceneContainerSession.primarySession) + if (this.sceneContainerSession.secondarySession) { + HWSceneSessionManager.getInstance().requestSceneBackground(this.sceneContainerSession.secondarySession) + } + } else { + this.sceneContainerSession.translateX = 0 + this.sceneContainerSession.translateY = 0 + this.sceneContainerSession.scaleX = 1 + this.sceneContainerSession.scaleY = 1 + } + })) + } +} diff --git a/product/phone/src/main/ets/WindowScene/HWScene.ets b/product/phone/src/main/ets/WindowScene/HWScene.ets index fd5a7225..be162edc 100644 --- a/product/phone/src/main/ets/WindowScene/HWScene.ets +++ b/product/phone/src/main/ets/WindowScene/HWScene.ets @@ -13,11 +13,7 @@ * limitations under the License. */ -import curves from '@ohos.curves' - import { HWSceneSession } from '@ohos/common' -import { HWSceneSessionManager } from '@ohos/common' -import { HWScreenSessionManager } from '@ohos/common' import { StyleConstants } from '@ohos/common' import { Log } from '@ohos/common' @@ -27,57 +23,24 @@ const TAG = 'HWScene' export struct HWScene { @ObjectLink sceneSession: HWSceneSession - build() { - Stack({alignContent: Alignment.TopStart}) { - HostWindowScene(this.sceneSession.session) - .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) + buildLog(sceneSession:HWSceneSession) { + if (sceneSession) { + Log.showInfo(TAG, 'HWSceneSession begin name: ' + sceneSession.sceneInfo.bundleName + 'id:' + sceneSession.session.persistentId) + } else { + Log.showError(TAG, 'HWSceneSession is null') + } + return true + } - // Status bar - // Gesture navigation bar - Stack({alignContent: Alignment.Center}) { - Button() - .backgroundColor(Color.Black) - .width('40%') - .height('25%') + build() { + Stack({alignContent: Alignment.TopStart}) { + if (this.buildLog(this.sceneSession)) {} + if (!!this.sceneSession) { + HostWindowScene(this.sceneSession.session) + .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) } - .position({y: '96%'}) - .width('100%') - .height('4%') - .gesture(PanGesture() - .onActionStart((event: GestureEvent) => { - - }) - .onActionUpdate((event: GestureEvent) => { - Log.showInfo(TAG,'onActionUpdate:' + event.offsetY) - // TODO temp test - this.sceneSession.translateX = event.offsetX - if (event.offsetY < 0) { - this.sceneSession.translateY = event.offsetY - this.sceneSession.scaleX = 1 + event.offsetY / 1280 - this.sceneSession.scaleY = 1 + event.offsetY / 1280 - } else { - this.sceneSession.translateY = 0 - this.sceneSession.scaleX = 1 - this.sceneSession.scaleY = 1 - } - }) - .onActionCancel(() => { - }) - .onActionEnd((event: GestureEvent) => { - if (event.offsetY < -200) { - HWSceneSessionManager.getInstance().requestSceneBackground(this.sceneSession) - } else { - this.sceneSession.translateX = 0 - this.sceneSession.translateY = 0 - this.sceneSession.scaleX = 1 - this.sceneSession.scaleY = 1 - } - })) + // Status bar } - .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) - .translate({x: this.sceneSession.translateX, y: this.sceneSession.translateY}) - .scale({x: this.sceneSession.scaleX, y: this.sceneSession.scaleY}) - .animation({curve: curves.responsiveSpringMotion()}) } } diff --git a/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets b/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets new file mode 100644 index 00000000..4107cec7 --- /dev/null +++ b/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2023 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 curves from '@ohos.curves' +import { HWSceneContainerSession, HWDividerParam } from '@ohos/common' +import { HWScene } from './HWScene' +import { HWGestureNavBar } from './HWGestureNavBar' +import { HWDivider } from './HWDivider' +import { Log } from '@ohos/common' +import { StyleConstants } from '@ohos/common' + +import { HWSceneSession } from '@ohos/common' +const TAG = 'HWSceneContainer' + +@Component +export struct HWSceneContainer { + @ObjectLink sceneContainerSession: HWSceneContainerSession + @State dividerParam : HWDividerParam = new HWDividerParam() + buildLog(sceneSession : HWSceneSession) { + if (sceneSession && sceneSession.sceneInfo) { + Log.showInfo(TAG, 'scene container session begin name: ' + sceneSession.sceneInfo.bundleName) + Log.showInfo(TAG,'id:' + sceneSession.session.persistentId) + Log.showInfo(TAG,'HWSceneContainer translateY:' + this.sceneContainerSession.translateY) + + } else { + if (!sceneSession) { + Log.showError(TAG, 'sceneSession is null: ' + typeof(sceneSession)) + } + Log.showError(TAG, 'this.sceneContainerSession.primarySession: ' + JSON.stringify(this.sceneContainerSession.primarySession)) + } + Log.showInfo(TAG,'HWDivider : ' + this.dividerParam.translateY) + return true + } + + getSecondaryPos(): string { + let str = (parseFloat(this.dividerParam.primaryH)+parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)).toString(); + str += "%"; + return str; + } + + secondaryLog() { + Log.showError(TAG, 'secondary session posY: ' + this.getSecondaryPos()) + return true + } + build() { + Column() { + if ((!!this.sceneContainerSession.primarySession) && this.sceneContainerSession.primarySession.isActive) { + HWScene({sceneSession : this.sceneContainerSession.primarySession}) + .width('100%') + .height(this.dividerParam.primaryH) + .scale({y:this.dividerParam.primaryScaleY, centerY: 0}) + .blur(this.dividerParam.blurRadius) + } + + // divider + if (this.sceneContainerSession.isSplit) { + HWDivider({dividerParam : $dividerParam, screenBounds : this.sceneContainerSession.bounds}) + if ((!!this.sceneContainerSession.secondarySession) && this.sceneContainerSession.secondarySession.isActive && this.secondaryLog()) { + HWScene({ sceneSession: this.sceneContainerSession.secondarySession }) + .position({y: this.getSecondaryPos()}) + } + } + HWGestureNavBar({ sceneContainerSession: this.sceneContainerSession, dividerParam: $dividerParam }) + // Freedom scene + } + .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) + .translate({x: this.sceneContainerSession.translateX, y: this.sceneContainerSession.translateY}) + .scale({x: this.sceneContainerSession.scaleX, y: this.sceneContainerSession.scaleY}) + .animation({curve: curves.responsiveSpringMotion()}) + } +} diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index ece36cf6..ff07213b 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -13,7 +13,8 @@ * limitations under the License. */ -import { HWSceneSession, SceneSessionArray } from '@ohos/common' +import { HWSceneSession, SceneContainerSessionArray, HWSceneContainerSession } from '@ohos/common' +import { HWSceneContainer } from './HWSceneContainer' import { HWScene } from './HWScene' import { Log } from '@ohos/common' import { StyleConstants } from '@ohos/common' @@ -22,10 +23,10 @@ const TAG = 'HWScenePanel' @Component export struct HWScenePanel { - @ObjectLink sceneSessionList: SceneSessionArray + @ObjectLink sceneContainerSessionList: SceneContainerSessionArray buildLog() { - Log.showInfo(TAG, 'scene session list length:' + this.sceneSessionList.length) + Log.showInfo(TAG, 'HWScenePanel scene session list length:' + this.sceneContainerSessionList.length) return true } @@ -33,9 +34,11 @@ export struct HWScenePanel { Stack({alignContent: Alignment.TopStart}) { // Full screen scene, using scroll to manager multitask scene. Scroll() { - ForEach(this.sceneSessionList, (item: HWSceneSession) => { - HWScene({sceneSession: item}) - }, (item: HWSceneSession) => item.session.persistentId.toString()) + ForEach(this.sceneContainerSessionList, (item: HWSceneContainerSession) => { + if (this.buildLog() && !!item && item.isActive) { + HWSceneContainer({sceneContainerSession: item}) + } + }, (item: HWSceneContainerSession) => item.primarySession.session.persistentId.toString()) } .scrollable(ScrollDirection.Horizontal) diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index ff412256..3fa7d3ee 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -32,7 +32,7 @@ export struct HWScreen { HWDesktop() // Scene - HWScenePanel({sceneSessionList: this.screenSession.sceneSessionList}) + HWScenePanel({sceneContainerSessionList: this.screenSession.sceneContainerSessionList}) // Systemui } -- Gitee From e3f3aec672cf558faa3c049b454a38e0fe1c3eb9 Mon Sep 17 00:00:00 2001 From: sunhy Date: Fri, 24 Mar 2023 15:05:51 +0800 Subject: [PATCH 347/373] =?UTF-8?q?=E5=90=88=E5=85=A5systemui=E5=8E=9F?= =?UTF-8?q?=E5=A7=8B=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes => systemui4merge/.gitattributes | 0 .gitignore => systemui4merge/.gitignore | 0 {AppScope => systemui4merge/AppScope}/app.json5 | 0 .../AppScope}/resources/base/element/string.json | 0 .../AppScope}/resources/base/media/app_icon.png | Bin LICENSE => systemui4merge/LICENSE | 0 OAT.xml => systemui4merge/OAT.xml | 0 README.md => systemui4merge/README.md | 0 README_zh.md => systemui4merge/README_zh.md | 0 .../build-profile.json5 | 0 .../common}/build-profile.json5 | 0 {common => systemui4merge/common}/hvigorfile.js | 0 {common => systemui4merge/common}/package-lock.json | 0 {common => systemui4merge/common}/package.json | 0 .../common}/src/main/ets/default/CheckEmptyUtils.ts | 0 .../src/main/ets/default/CommonStyleManager.ts | 0 .../common}/src/main/ets/default/Constants.ts | 0 .../common}/src/main/ets/default/Decorators.ts | 0 .../common}/src/main/ets/default/InitSystemUi.ts | 0 .../common}/src/main/ets/default/Log.ts | 0 .../src/main/ets/default/MultimodalInputManager.ts | 0 .../common}/src/main/ets/default/ReadConfigUtil.ts | 0 .../common}/src/main/ets/default/ResourceUtil.ts | 0 .../src/main/ets/default/ScreenLockManager.ts | 0 .../common}/src/main/ets/default/SettingsUtil.ts | 0 .../src/main/ets/default/SingleInstanceHelper.ts | 0 .../src/main/ets/default/StyleConfiguration.ts | 0 .../src/main/ets/default/SwitchUserManager.ts | 0 .../common}/src/main/ets/default/SysFaultLogger.ts | 0 .../common}/src/main/ets/default/TimeManager.ts | 0 .../src/main/ets/default/TintStateManager.ts | 0 .../common}/src/main/ets/default/Trace.ts | 0 .../common}/src/main/ets/default/WindowManager.ts | 0 .../ets/default/abilitymanager/abilityManager.ts | 0 .../ets/default/abilitymanager/bundleManager.ts | 0 .../default/abilitymanager/featureAbilityManager.ts | 0 .../default/abilitymanager/notificationManager.ts | 0 .../ets/default/commonEvent/CommonEventManager.ts | 0 .../common}/src/main/ets/default/event/EventBus.ts | 0 .../src/main/ets/default/event/EventManager.ts | 0 .../common}/src/main/ets/default/event/EventUtil.ts | 0 .../default/heightcofigUtils/HeightConfigUtils.ts | 0 .../ets/plugindatasource/PluginDataSourceAdapter.ts | 0 .../ets/plugindatasource/PluginDataSourceManager.ts | 0 .../ets/plugindatasource/common/BundleParseUtil.ts | 0 .../main/ets/plugindatasource/common/Constants.ts | 0 .../common/PluginComponentManagerUtil.ts | 0 .../sourceloader/DataAbilitySourceLoader.ts | 0 .../sourceloader/MetaSourceLoader.ts | 0 .../sourceloader/PluginSourceLoader.ts | 0 .../sourceloader/PluginSourceLoaderPatch.ts | 0 .../plugindatasource/sourceloader/SourceLoader.ts | 0 .../sourceloader/SourceLoaderFactory.ts | 0 .../src/main/ets/template/SimpleToggleBase.ets | 0 .../main/ets/template/common/StyleConfiguration.ts | 0 .../common}/src/main/ets/template/iconComponent.ets | 0 .../common}/src/main/ets/template/iconTitleBase.ets | 0 .../common}/src/main/module.json5 | 0 .../src/main/resources/base/element/string.json | 0 {doc => systemui4merge/doc}/Instructions.md | 0 .../entry}/pc/build-profile.json5 | 0 {entry => systemui4merge/entry}/pc/hvigorfile.js | 0 .../entry}/pc/package-lock.json | 0 {entry => systemui4merge/entry}/pc/package.json | 0 .../pc/src/main/ets/Application/AbilityStage.ts | 0 .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 0 .../entry}/pc/src/main/ets/pages/index.ets | 0 .../entry}/pc/src/main/module.json5 | 0 .../pc/src/main/resources/base/element/string.json | 0 .../pc/src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/profile/main_pages.json | 0 .../entry}/phone/build-profile.json5 | 0 {entry => systemui4merge/entry}/phone/hvigorfile.js | 0 .../entry}/phone/package-lock.json | 0 {entry => systemui4merge/entry}/phone/package.json | 0 .../phone/src/main/ets/Application/AbilityStage.ts | 0 .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 0 .../entry}/phone/src/main/ets/pages/index.ets | 0 .../entry}/phone/src/main/module.json5 | 0 .../src/main/resources/base/element/string.json | 0 .../phone/src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/profile/main_pages.json | 0 .../features}/airplanecomponent/build-profile.json5 | 0 .../features}/airplanecomponent/hvigorfile.js | 0 .../features}/airplanecomponent/package-lock.json | 0 .../features}/airplanecomponent/package.json | 0 .../main/ets/default/pages/airplaneComponent.ets | 0 .../airplanecomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/airplane.svg | 0 .../src/main/resources/base/media/airplane_d.svg | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../autorotatecomponent/build-profile.json5 | 0 .../features}/autorotatecomponent/hvigorfile.js | 0 .../features}/autorotatecomponent/package-lock.json | 0 .../features}/autorotatecomponent/package.json | 0 .../src/main/ets/com/ohos/common/Constants.ts | 0 .../main/ets/com/ohos/model/AutoRotateService.ts | 0 ...ControlCenterSimpleToggleAutoRotateComponent.ets | 0 .../src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts | 0 .../autorotatecomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/string.json | 0 .../base/media/ic_controlcenter_auto_rotate_off.svg | 0 .../base/media/ic_controlcenter_auto_rotate_on.svg | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../features}/batterycomponent/build-profile.json5 | 0 .../features}/batterycomponent/hvigorfile.js | 0 .../features}/batterycomponent/package-lock.json | 0 .../features}/batterycomponent/package.json | 0 .../src/main/ets/default/batteryModel.ts | 0 .../main/ets/default/common/StyleConfiguration.ts | 0 .../src/main/ets/default/common/constants.ts | 0 .../src/main/ets/default/pages/batteryIcon.ets | 0 .../src/main/ets/default/pages/batteryPic.ets | 0 .../src/main/ets/default/pages/batterySoc.ets | 0 .../src/main/ets/default/viewmodel/BatteryVM.ts | 0 .../batterycomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/phone/element/float.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../bluetoothcomponent/build-profile.json5 | 0 .../features}/bluetoothcomponent/hvigorfile.js | 0 .../features}/bluetoothcomponent/package-lock.json | 0 .../features}/bluetoothcomponent/package.json | 0 .../src/main/ets/com/ohos/common/Constants.ts | 0 .../main/ets/com/ohos/common/StyleConfiguration.ts | 0 .../src/main/ets/com/ohos/model/BluetoothService.ts | 0 ...ControlCenterComplexToggleBluetoothComponent.ets | 0 .../pages/StatusBarIconItemBluetoothComponent.ets | 0 .../src/main/ets/com/ohos/viewmodel/BluetoothVM.ts | 0 .../bluetoothcomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../resources/base/media/ic_controlcenter_bt.svg | 0 .../resources/base/media/ic_controlcenter_bt_d.svg | 0 .../src/main/resources/base/media/ic_status_bt.svg | 0 .../resources/base/media/ic_status_bt_close.svg | 0 .../base/media/ic_status_bt_connecting.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/phone/element/float.json | 0 .../src/main/resources/phone/media/ic_status_bt.svg | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../brightnesscomponent/build-profile.json5 | 0 .../features}/brightnesscomponent/hvigorfile.js | 0 .../features}/brightnesscomponent/package-lock.json | 0 .../features}/brightnesscomponent/package.json | 0 .../src/main/ets/default/brightnessManager.ts | 0 .../main/ets/default/common/StyleConfiguration.ts | 0 .../main/ets/default/pages/brightnessComponent.ets | 0 .../brightnesscomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../resources/base/media/ic_brightness_plus.svg | 0 .../resources/base/media/ic_brightness_reduce.svg | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../features}/capsulecomponent/build-profile.json5 | 0 .../features}/capsulecomponent/hvigorfile.js | 0 .../features}/capsulecomponent/package-lock.json | 0 .../features}/capsulecomponent/package.json | 0 .../main/ets/default/common/StyleConfiguration.ts | 0 .../src/main/ets/default/common/constants.ts | 0 .../src/main/ets/default/model/CapsuleModel.ts | 0 .../src/main/ets/default/pages/CapsuleIcon.ets | 0 .../main/ets/default/viewmodel/CapsuleViewModel.ts | 0 .../capsulecomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../resources/base/media/ic_statusbar_phone.svg | 0 .../src/main/resources/en_US/element/string.json | 0 .../resources/phone/media/ic_statusbar_phone.svg | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../features}/clockcomponent/build-profile.json5 | 0 .../features}/clockcomponent/hvigorfile.js | 0 .../features}/clockcomponent/package-lock.json | 0 .../features}/clockcomponent/package.json | 0 .../main/ets/default/common/StyleConfiguration.ts | 0 .../src/main/ets/default/pages/clockIcon.ets | 0 .../src/main/ets/default/viewmodel/ClockVM.ts | 0 .../features}/clockcomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/phone/element/float.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../controlcentercomponent/build-profile.json5 | 0 .../features}/controlcentercomponent/hvigorfile.js | 0 .../controlcentercomponent/package-lock.json | 0 .../features}/controlcentercomponent/package.json | 0 .../src/main/ets/com/ohos/common/Constants.ts | 0 .../main/ets/com/ohos/common/StyleConfiguration.ts | 0 .../main/ets/com/ohos/model/ControlCenterService.ts | 0 .../ets/com/ohos/pages/ComplexToggleComponent.ets | 0 .../com/ohos/pages/ComplexToggleLoadComponent.ets | 0 .../ets/com/ohos/pages/ControlCenterComponent.ets | 0 .../ets/com/ohos/pages/PluginIconItemComponent.ets | 0 .../ets/com/ohos/pages/SimpleToggleComponent.ets | 0 .../ohos/pages/SimpleToggleLayoutEditComponent.ets | 0 .../pages/SimpleToggleLayoutEditDialogComponent.ets | 0 .../com/ohos/pages/SimpleToggleLayoutEditGrid.ets | 0 .../com/ohos/pages/SimpleToggleLoadComponent.ets | 0 .../src/main/ets/com/ohos/pages/UpTitle.ets | 0 .../main/ets/com/ohos/viewmodel/ControlCenterVM.ts | 0 .../controlcentercomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../main/resources/base/media/ic_public_back.svg | 0 .../main/resources/base/media/ic_public_edit.svg | 0 .../resources/base/media/ic_public_settings.svg | 0 .../src/main/resources/base/media/ic_settings.png | Bin .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../features}/locationcomponent/build-profile.json5 | 0 .../features}/locationcomponent/hvigorfile.js | 0 .../features}/locationcomponent/package-lock.json | 0 .../features}/locationcomponent/package.json | 0 .../src/main/ets/com/ohos/common/Constants.ts | 0 .../main/ets/com/ohos/common/StyleConfiguration.ts | 0 .../src/main/ets/com/ohos/model/LocationService.ts | 0 .../ControlCenterSimpleToggleLocationComponent.ets | 0 .../pages/StatusBarIconItemLocationComponent.ets | 0 .../src/main/ets/com/ohos/viewmodel/LocationVM.ts | 0 .../locationcomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../resources/base/media/ic_controlcenter_gps.svg | 0 .../main/resources/base/media/ic_statusbar_gps.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/phone/element/float.json | 0 .../main/resources/phone/media/ic_statusbar_gps.svg | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../managementcomponent/build-profile.json5 | 0 .../features}/managementcomponent/hvigorfile.js | 0 .../features}/managementcomponent/package-lock.json | 0 .../features}/managementcomponent/package.json | 0 .../src/main/ets/com/ohos/common/constants.ts | 0 .../main/ets/com/ohos/model/bundleResourceModel.ts | 0 .../main/ets/com/ohos/model/noDisturbingModel.ts | 0 .../main/ets/com/ohos/model/notificationListener.ts | 0 .../com/ohos/view/component/appItemComponent.ets | 0 .../ets/com/ohos/view/component/appLstComponent.ets | 0 .../ets/com/ohos/view/component/headComponent.ets | 0 .../ets/com/ohos/view/component/itemComponent.ets | 0 .../com/ohos/view/component/noDisturbComponent.ets | 0 .../com/ohos/view/component/slotItemComponent.ets | 0 .../com/ohos/view/component/slotLstComponent.ets | 0 .../ets/com/ohos/view/component/switchComponent.ets | 0 .../ets/com/ohos/vm/appLstComponentViewModel.ts | 0 .../ets/com/ohos/vm/noDisturbComponentViewModel.ts | 0 .../managementcomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/ic_back.svg | 0 .../main/resources/base/media/ic_settings_arrow.svg | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/phone/element/color.json | 0 .../src/main/resources/phone/element/float.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../features}/navigationservice/build-profile.json5 | 0 .../features}/navigationservice/hvigorfile.js | 0 .../features}/navigationservice/package-lock.json | 0 .../features}/navigationservice/package.json | 0 .../ets/com/ohos/navigationservice/ConfigManager.ts | 0 .../ets/com/ohos/navigationservice/KeyCodeEvent.ts | 0 .../navigationservice/common/NavBarConfiguration.ts | 0 .../com/ohos/navigationservice/common/constants.ts | 0 .../navigationservice/src/main/module.json5 | 0 .../src/main/resources/base/element/string.json | 0 .../features}/nfccomponent/build-profile.json5 | 0 .../features}/nfccomponent/hvigorfile.js | 0 .../features}/nfccomponent/package-lock.json | 0 .../features}/nfccomponent/package.json | 0 .../main/ets/com/ohos/common/StyleConfiguration.ts | 0 .../src/main/ets/com/ohos/model/NFCModeService.ts | 0 .../pages/ControlCenterSimpleToggleNFComponent.ets | 0 .../com/ohos/pages/StatusBarIconItemNFComponent.ets | 0 .../src/main/ets/com/ohos/viewmodel/NFCModeVM.ts | 0 .../features}/nfccomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../resources/base/media/ic_notification_nfc.svg | 0 .../base/media/ic_notification_nfc_filled.svg | 0 .../main/resources/base/media/ic_statusbar_nfc.svg | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/phone/element/float.json | 0 .../resources/phone/media/ic_notification_nfc.svg | 0 .../phone/media/ic_notification_nfc_filled.svg | 0 .../main/resources/phone/media/ic_statusbar_nfc.svg | 0 .../phone/media/ic_statusbar_ring_off_filled.svg | 0 .../phone/media/ic_statusbar_vibration_on.svg | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../features}/noticeitem/build-profile.json5 | 0 .../features}/noticeitem/hvigorfile.js | 0 .../features}/noticeitem/package-lock.json | 0 .../features}/noticeitem/package.json | 0 .../ets/com/ohos/noticeItem/common/CommonUtil.ts | 0 .../com/ohos/noticeItem/common/ScrollbarManager.ts | 0 .../ets/com/ohos/noticeItem/common/constants.ts | 0 .../com/ohos/noticeItem/model/ExpandInfoManager.ts | 0 .../com/ohos/noticeItem/model/NotificationConfig.ts | 0 .../model/NotificationDistributionManager.ts | 0 .../ohos/noticeItem/model/NotificationManager.ts | 0 .../ohos/noticeItem/model/NotificationService.ts | 0 .../noticeItem/model/NotificationWindowManager.ts | 0 .../ets/com/ohos/noticeItem/model/ParseDataUtil.ts | 0 .../com/ohos/noticeItem/model/SwipeLayoutUtils.ts | 0 .../ohos/noticeItem/model/rule/RuleController.ts | 0 .../noticeItem/view/NotificationListComponent.ets | 0 .../com/ohos/noticeItem/view/item/SwipeLayout.ets | 0 .../ohos/noticeItem/view/item/actionComponent.ets | 0 .../noticeItem/view/item/bannerNotificationItem.ets | 0 .../ets/com/ohos/noticeItem/view/item/basicItem.ets | 0 .../com/ohos/noticeItem/view/item/confirmDialog.ets | 0 .../com/ohos/noticeItem/view/item/customItem.ets | 0 .../com/ohos/noticeItem/view/item/devicesDialog.ets | 0 .../com/ohos/noticeItem/view/item/generalItem.ets | 0 .../ets/com/ohos/noticeItem/view/item/groupItem.ets | 0 .../ohos/noticeItem/view/item/iconListComponent.ets | 0 .../ets/com/ohos/noticeItem/view/item/longItem.ets | 0 .../ets/com/ohos/noticeItem/view/item/multiItem.ets | 0 .../ohos/noticeItem/view/item/notificationItem.ets | 0 .../com/ohos/noticeItem/view/item/pictureItem.ets | 0 .../com/ohos/noticeItem/view/item/settingDialog.ets | 0 .../ets/com/ohos/noticeItem/view/item/titleItem.ets | 0 .../noticeItem/viewmodel/NotificationViewModel.ts | 0 .../features}/noticeitem/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/ic_close.svg | 0 .../resources/base/media/ic_notification_down.png | Bin .../resources/base/media/ic_notification_up.png | Bin .../base/media/ic_public_delete_body_filled.svg | 0 .../base/media/ic_public_delete_filled.svg | 0 .../base/media/ic_public_delete_lids_filled.svg | 0 .../base/media/ic_public_settings_filled.svg | 0 .../src/main/resources/base/media/send.svg | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/phone/element/color.json | 0 .../src/main/resources/phone/element/float.json | 0 .../main/resources/rawfile/notificationConfig.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../features}/ringmodecomponent/build-profile.json5 | 0 .../features}/ringmodecomponent/hvigorfile.js | 0 .../features}/ringmodecomponent/package-lock.json | 0 .../features}/ringmodecomponent/package.json | 0 .../src/main/ets/com/ohos/common/Constants.ts | 0 .../main/ets/com/ohos/common/StyleConfiguration.ts | 0 .../src/main/ets/com/ohos/model/RingModeService.ts | 0 .../ControlCenterSimpleToggleRingModeComponent.ets | 0 .../pages/StatusBarIconItemRingModeComponent.ets | 0 .../src/main/ets/com/ohos/viewmodel/RingModeVM.ts | 0 .../ringmodecomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../base/media/ic_controlcenter_ring_off_filled.svg | 0 .../base/media/ic_controlcenter_ring_on_filled.svg | 0 .../media/ic_controlcenter_vibration_filled.svg | 0 .../base/media/ic_statusbar_ring_off_filled.svg | 0 .../base/media/ic_statusbar_vibration_on.svg | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/phone/element/float.json | 0 .../phone/media/ic_statusbar_ring_off_filled.svg | 0 .../phone/media/ic_statusbar_vibration_on.svg | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../features}/signalcomponent/build-profile.json5 | 0 .../features}/signalcomponent/hvigorfile.js | 0 .../features}/signalcomponent/package-lock.json | 0 .../features}/signalcomponent/package.json | 0 .../main/ets/default/common/StyleConfiguration.ts | 0 .../src/main/ets/default/common/constants.ts | 0 .../src/main/ets/default/pages/signalIcon.ets | 0 .../src/main/ets/default/signalModel.ts | 0 .../src/main/ets/default/viewmodel/SignalVM.ts | 0 .../features}/signalcomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../resources/base/media/ic_statusbar_signal_1.svg | 0 .../resources/base/media/ic_statusbar_signal_2.svg | 0 .../resources/base/media/ic_statusbar_signal_3.svg | 0 .../resources/base/media/ic_statusbar_signal_4.svg | 0 .../base/media/ic_statusbar_signal_full.svg | 0 .../resources/base/media/ic_statusbar_signal_no.svg | 0 .../base/media/ic_statusbar_signal_roaming.png | Bin .../base/media/ic_statusbar_signal_wait.png | Bin .../base/media/ic_statusbar_wifi_connect.png | Bin .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/phone/element/float.json | 0 .../resources/phone/media/ic_statusbar_signal_1.svg | 0 .../resources/phone/media/ic_statusbar_signal_2.svg | 0 .../resources/phone/media/ic_statusbar_signal_3.svg | 0 .../resources/phone/media/ic_statusbar_signal_4.svg | 0 .../phone/media/ic_statusbar_signal_full.svg | 0 .../phone/media/ic_statusbar_signal_no.svg | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../statusbarcomponent/build-profile.json5 | 0 .../features}/statusbarcomponent/hvigorfile.js | 0 .../features}/statusbarcomponent/package-lock.json | 0 .../features}/statusbarcomponent/package.json | 0 .../src/main/ets/com/ohos/common/Constants.ts | 0 .../ets/com/ohos/common/StatusBarConfiguration.ts | 0 .../main/ets/com/ohos/common/StyleConfiguration.ts | 0 .../src/main/ets/com/ohos/model/StatusBarService.ts | 0 .../main/ets/com/ohos/pages/IconItemComponent.ets | 0 .../ets/com/ohos/pages/MetaIconItemComponent.ets | 0 .../ets/com/ohos/pages/PluginIconItemComponent.ets | 0 .../main/ets/com/ohos/pages/StatusBarComponent.ets | 0 .../src/main/ets/com/ohos/viewmodel/StatusBarVM.ts | 0 .../statusbarcomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../main/resources/base/media/ic_statusbar_nfc.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/phone/element/float.json | 0 .../features}/volumecomponent/build-profile.json5 | 0 .../features}/volumecomponent/hvigorfile.js | 0 .../features}/volumecomponent/package-lock.json | 0 .../features}/volumecomponent/package.json | 0 .../src/main/ets/default/VolumeModel.ts | 0 .../src/main/ets/default/pages/volumeComponent.ets | 0 .../features}/volumecomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../volumepanelcomponent/build-profile.json5 | 0 .../features}/volumepanelcomponent/hvigorfile.js | 0 .../volumepanelcomponent/package-lock.json | 0 .../features}/volumepanelcomponent/package.json | 0 .../src/main/ets/com/ohos/common/Constants.ts | 0 .../main/ets/com/ohos/common/StyleConfiguration.ts | 0 .../ets/com/ohos/common/VolumeWindowController.ts | 0 .../main/ets/com/ohos/model/VolumePanelService.ts | 0 .../ets/com/ohos/pages/VolumePanelComponent.ets | 0 .../main/ets/com/ohos/viewmodel/VolumePanelVM.ts | 0 .../volumepanelcomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../main/resources/base/media/ic_public_mute.svg | 0 .../resources/base/media/ic_public_settings.svg | 0 .../resources/base/media/ic_public_sound_01.svg | 0 .../resources/base/media/ic_public_sound_02.svg | 0 .../resources/base/media/ic_public_sound_03.svg | 0 .../resources/base/media/ic_public_sound_04.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/phone/element/color.json | 0 .../src/main/resources/phone/element/float.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../features}/wificomponent/build-profile.json5 | 0 .../features}/wificomponent/hvigorfile.js | 0 .../features}/wificomponent/package-lock.json | 0 .../features}/wificomponent/package.json | 0 .../main/ets/default/common/StyleConfiguration.ts | 0 .../src/main/ets/default/common/constants.ts | 0 .../src/main/ets/default/pages/wifiComponent.ets | 0 .../src/main/ets/default/pages/wifiIcon.ets | 0 .../src/main/ets/default/viewmodel/WifiVM.ts | 0 .../wificomponent/src/main/ets/default/wifiModel.ts | 0 .../features}/wificomponent/src/main/module.json5 | 0 .../src/main/resources/base/element/float.json | 0 .../resources/base/media/ic_statusbar_wifi_1.svg | 0 .../resources/base/media/ic_statusbar_wifi_2.svg | 0 .../resources/base/media/ic_statusbar_wifi_3.svg | 0 .../resources/base/media/ic_statusbar_wifi_full.svg | 0 .../resources/base/media/ic_statusbar_wifi_no.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/media/wifi.svg | 0 .../src/main/resources/base/media/wifi_d.svg | 0 .../src/main/resources/phone/element/float.json | 0 .../resources/phone/media/ic_statusbar_wifi_1.svg | 0 .../resources/phone/media/ic_statusbar_wifi_2.svg | 0 .../resources/phone/media/ic_statusbar_wifi_3.svg | 0 .../phone/media/ic_statusbar_wifi_full.svg | 0 .../resources/phone/media/ic_statusbar_wifi_no.svg | 0 {figures => systemui4merge/figures}/TS_01.png | Bin {figures => systemui4merge/figures}/TS_02.png | Bin {figures => systemui4merge/figures}/cmd1.png | Bin {figures => systemui4merge/figures}/cmd2.png | Bin {figures => systemui4merge/figures}/cmd3.png | Bin .../figures}/commit_source_clone_page.png | Bin .../figures}/commit_source_fork_button.png | Bin .../figures}/commit_source_fork_confirm.png | Bin .../figures}/commit_source_forked_repo.jpg | Bin .../figures}/commit_source_new_pr_done copy.png | Bin .../figures}/commit_source_new_pr_done.png | Bin .../commit_source_new_pull_request copy.png | Bin .../figures}/commit_source_new_pull_request.png | Bin .../commit_source_new_pull_request_confirm copy.png | Bin .../commit_source_new_pull_request_confirm.png | Bin .../figures}/downLoadSDK_01.png | Bin {figures => systemui4merge/figures}/downLoad_01.png | Bin {figures => systemui4merge/figures}/downLoad_02.png | Bin {figures => systemui4merge/figures}/downLoad_03.png | Bin {figures => systemui4merge/figures}/downLoad_04.png | Bin {figures => systemui4merge/figures}/downLoad_05.png | Bin {figures => systemui4merge/figures}/downLoad_06.png | Bin .../figures}/ds_build_haps.png | Bin .../figures}/ds_hilog_window.png | Bin .../figures}/ds_ohosbuild_output_dir_debug.png | Bin .../figures}/ds_ohosbuild_output_dir_release.png | Bin .../figures}/ds_ohosbuild_variants.png | Bin .../figures}/ds_ohosbuild_variants_debug.png | Bin .../figures}/ds_ohosbuild_variants_release.png | Bin .../figures}/en-us_image_0000001103686480.png | Bin {figures => systemui4merge/figures}/gitee_01.png | Bin {figures => systemui4merge/figures}/hap_repo.png | Bin .../figures}/importProject.png | Bin .../figures}/screenshot-20210521-105407.png | Bin .../figures}/screenshot-20210521-110433.png | Bin .../figures}/screenshot-20210521-111223.png | Bin {figures => systemui4merge/figures}/signature_1.png | Bin {figures => systemui4merge/figures}/signature_2.png | Bin {figures => systemui4merge/figures}/signature_3.png | Bin .../figures}/zh-cn_image_0000001103686480.png | Bin .../gradle.properties | 0 gradlew => systemui4merge/gradlew | 0 gradlew.bat => systemui4merge/gradlew.bat | 0 hvigorfile.js => systemui4merge/hvigorfile.js | 0 {infra => systemui4merge/infra}/config_exts.gradle | 0 .../package-lock.json | 0 package.json => systemui4merge/package.json | 0 .../default/navigationBar/build-profile.json5 | 0 .../product}/default/navigationBar/hvigorfile.js | 0 .../default/navigationBar/package-lock.json | 0 .../product}/default/navigationBar/package.json | 0 .../src/main/ets/Application/AbilityStage.ts | 0 .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 0 .../src/main/ets/common/IndicatorConfig.ts | 0 .../src/main/ets/common/StyleConfiguration.ts | 0 .../src/main/ets/common/StyleManager.ts | 0 .../navigationBar/src/main/ets/common/constants.ts | 0 .../src/main/ets/common/utils/configReader.ts | 0 .../navigationBar/src/main/ets/i18n/en-US.json | 0 .../navigationBar/src/main/ets/i18n/zh-CN.json | 0 .../main/ets/pages/PrivacyIndicatorComponent.ets | 0 .../src/main/ets/pages/SplitBarIndex.ets | 0 .../navigationBar/src/main/ets/pages/index.ets | 0 .../navigationBar/src/main/ets/pages/keyButton.ets | 0 .../navigationBar/src/main/ets/pages/oneLayout.ets | 0 .../src/main/ets/pages/threeLayout.ets | 0 .../main/ets/viewmodel/NavigationBarViewModel.ts | 0 .../src/main/ets/viewmodel/ViewModel.ts | 0 .../default/navigationBar/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../main/resources/base/media/ic_systemui_back.svg | 0 .../main/resources/base/media/ic_systemui_home.svg | 0 .../resources/base/media/ic_systemui_recent.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/profile/main_pages.json | 0 .../src/main/resources/en_US/element/string.json | 0 .../rawfile/navigationBarLayoutConfig.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../notificationmanagement/build-profile.json5 | 0 .../default/notificationmanagement/hvigorfile.js | 0 .../notificationmanagement/package-lock.json | 0 .../default/notificationmanagement/package.json | 0 .../src/main/ets/Application/AbilityStage.ts | 0 .../src/main/ets/MainAbility/MainAbility.ts | 0 .../src/main/ets/common/constants.ts | 0 .../src/main/ets/pages/batchSetEnable.ets | 0 .../src/main/ets/pages/noDisturb.ets | 0 .../src/main/ets/pages/noDisturbPre.ets | 0 .../src/main/ets/pages/notificationManagenment.ets | 0 .../src/main/ets/pages/setEnable.ets | 0 .../src/main/ets/pages/slotSetting.ets | 0 .../src/main/ets/vm/noDisturbViewModel.ts | 0 .../main/ets/vm/notificationManagenmentViewModel.ts | 0 .../notificationmanagement/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/ic_back.svg | 0 .../main/resources/base/media/ic_settings_arrow.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../main/resources/base/media/startWindowIcon.png | Bin .../src/main/resources/base/profile/main_pages.json | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../default/volumepanel/build-profile.json5 | 0 .../product}/default/volumepanel/hvigorfile.js | 0 .../product}/default/volumepanel/package-lock.json | 0 .../product}/default/volumepanel/package.json | 0 .../src/main/ets/Application/AbilityStage.ts | 0 .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 0 .../src/main/ets/common/StyleConfiguration.ts | 0 .../volumepanel/src/main/ets/common/StyleManager.ts | 0 .../volumepanel/src/main/ets/common/constants.ts | 0 .../volumepanel/src/main/ets/pages/index.ets | 0 .../default/volumepanel/src/main/module.json5 | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/profile/main_pages.json | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../product}/pc/controlpanel/build-profile.json5 | 0 .../product}/pc/controlpanel/hvigorfile.js | 0 .../product}/pc/controlpanel/package-lock.json | 0 .../product}/pc/controlpanel/package.json | 0 .../src/main/ets/Application/AbilityStage.ts | 0 .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 0 .../main/ets/pages/common/ControlCenterConfig.ts | 0 .../src/main/ets/pages/common/StyleConfiguration.ts | 0 .../src/main/ets/pages/common/StyleManager.ts | 0 .../src/main/ets/pages/common/constants.ts | 0 .../pc/controlpanel/src/main/ets/pages/control.ets | 0 .../pc/controlpanel/src/main/ets/pages/index.ets | 0 .../src/main/ets/workers/PluginDataSourceWorker.js | 0 .../product}/pc/controlpanel/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/airplane.svg | 0 .../src/main/resources/base/media/airplane_d.svg | 0 .../resources/base/media/ic_brightness_plus.svg | 0 .../resources/base/media/ic_brightness_reduce.svg | 0 .../resources/base/media/ic_controlcenter_bt.svg | 0 .../resources/base/media/ic_controlcenter_bt_d.svg | 0 .../resources/base/media/ic_controlcenter_gps.svg | 0 .../resources/base/media/ic_controlcenter_oh.png | Bin .../base/media/ic_controlcenter_ring_off_filled.svg | 0 .../base/media/ic_controlcenter_ring_on_filled.svg | 0 .../media/ic_controlcenter_vibration_filled.svg | 0 .../resources/base/media/ic_notification_nfc.svg | 0 .../base/media/ic_notification_nfc_filled.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/media/wifi.svg | 0 .../src/main/resources/base/media/wifi_d.svg | 0 .../main/resources/base/profile/form_config.json | 0 .../src/main/resources/base/profile/main_pages.json | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../pc/notificationpanel/build-profile.json5 | 0 .../product}/pc/notificationpanel/hvigorfile.js | 0 .../product}/pc/notificationpanel/package-lock.json | 0 .../product}/pc/notificationpanel/package.json | 0 .../src/main/ets/Application/AbilityStage.ts | 0 .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 0 .../src/main/ets/pages/bannerNotification.ets | 0 .../src/main/ets/pages/common/StyleConfiguration.ts | 0 .../src/main/ets/pages/common/StyleManager.ts | 0 .../src/main/ets/pages/common/constants.ts | 0 .../notificationpanel/src/main/ets/pages/index.ets | 0 .../src/main/ets/pages/notification.ets | 0 .../pc/notificationpanel/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/delete_all.png | Bin .../main/resources/base/media/ic_message_filled.png | Bin .../main/resources/base/media/ic_public_delete.svg | 0 .../resources/base/media/ic_public_settings.svg | 0 .../src/main/resources/base/media/ic_settings.png | Bin .../src/main/resources/base/media/icon.png | Bin .../main/resources/base/profile/form_config.json | 0 .../src/main/resources/base/profile/main_pages.json | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../product}/pc/statusbar/build-profile.json5 | 0 .../product}/pc/statusbar/hvigorfile.js | 0 .../product}/pc/statusbar/package-lock.json | 0 .../product}/pc/statusbar/package.json | 0 .../src/main/ets/Application/AbilityStage.ts | 0 .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 0 .../src/main/ets/pages/common/StatusbarConfig.ts | 0 .../src/main/ets/pages/common/StyleConfiguration.ts | 0 .../src/main/ets/pages/common/StyleManager.ts | 0 .../src/main/ets/pages/common/constants.ts | 0 .../pc/statusbar/src/main/ets/pages/index.ets | 0 .../src/main/ets/workers/PluginDataSourceWorker.js | 0 .../product}/pc/statusbar/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/ic_status_bt.svg | 0 .../main/resources/base/media/ic_statusbar_gps.svg | 0 .../main/resources/base/media/ic_statusbar_nfc.svg | 0 .../resources/base/media/ic_statusbar_phone.svg | 0 .../base/media/ic_statusbar_ring_off_filled.svg | 0 .../resources/base/media/ic_statusbar_signal_1.svg | 0 .../resources/base/media/ic_statusbar_signal_2.svg | 0 .../resources/base/media/ic_statusbar_signal_3.svg | 0 .../resources/base/media/ic_statusbar_signal_4.svg | 0 .../base/media/ic_statusbar_signal_full.svg | 0 .../resources/base/media/ic_statusbar_signal_no.svg | 0 .../base/media/ic_statusbar_signal_roaming.png | Bin .../base/media/ic_statusbar_signal_wait.png | Bin .../base/media/ic_statusbar_vibration_on.svg | 0 .../resources/base/media/ic_statusbar_wifi_1.svg | 0 .../resources/base/media/ic_statusbar_wifi_2.svg | 0 .../resources/base/media/ic_statusbar_wifi_3.svg | 0 .../base/media/ic_statusbar_wifi_connect.png | Bin .../resources/base/media/ic_statusbar_wifi_full.svg | 0 .../resources/base/media/ic_statusbar_wifi_no.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/profile/main_pages.json | 0 .../src/main/resources/en_US/element/string.json | 0 .../resources/pointingdevice/element/float.json | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../product}/phone/dropdownpanel/.gitignore | 0 .../phone/dropdownpanel/build-profile.json5 | 0 .../product}/phone/dropdownpanel/hvigorfile.js | 0 .../product}/phone/dropdownpanel/package-lock.json | 0 .../product}/phone/dropdownpanel/package.json | 0 .../src/main/ets/Application/AbilityStage.ts | 0 .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 0 .../src/main/ets/pages/bannerNotification.ets | 0 .../main/ets/pages/common/ControlCenterConfig.ts | 0 .../src/main/ets/pages/common/StyleConfiguration.ts | 0 .../src/main/ets/pages/common/StyleManager.ts | 0 .../src/main/ets/pages/common/constants.ts | 0 .../src/main/ets/pages/common/navigationEvent.ts | 0 .../dropdownpanel/src/main/ets/pages/control.ets | 0 .../dropdownpanel/src/main/ets/pages/index.ets | 0 .../src/main/ets/pages/notification.ets | 0 .../src/main/ets/workers/PluginDataSourceWorker.js | 0 .../phone/dropdownpanel/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/airplane.svg | 0 .../src/main/resources/base/media/airplane_d.svg | 0 .../src/main/resources/base/media/delete_all.png | Bin .../resources/base/media/ic_brightness_plus.svg | 0 .../resources/base/media/ic_brightness_reduce.svg | 0 .../resources/base/media/ic_controlcenter_bt.svg | 0 .../resources/base/media/ic_controlcenter_bt_d.svg | 0 .../resources/base/media/ic_controlcenter_gps.svg | 0 .../base/media/ic_controlcenter_ring_off_filled.svg | 0 .../base/media/ic_controlcenter_ring_on_filled.svg | 0 .../media/ic_controlcenter_vibration_filled.svg | 0 .../resources/base/media/ic_notification_nfc.svg | 0 .../base/media/ic_notification_nfc_filled.svg | 0 .../main/resources/base/media/ic_public_delete.svg | 0 .../base/media/ic_public_delete_filled.svg | 0 .../resources/base/media/ic_public_settings.svg | 0 .../src/main/resources/base/media/ic_settings.png | Bin .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/media/wifi.svg | 0 .../src/main/resources/base/media/wifi_d.svg | 0 .../src/main/resources/base/profile/main_pages.json | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/phone/element/float.json | 0 .../resources/phone/media/dropdownpanel_bgc.png | Bin .../src/main/resources/zh_CN/element/string.json | 0 .../product}/phone/statusbar/.gitignore | 0 .../product}/phone/statusbar/build-profile.json5 | 0 .../product}/phone/statusbar/hvigorfile.js | 0 .../product}/phone/statusbar/package-lock.json | 0 .../product}/phone/statusbar/package.json | 0 .../src/main/ets/Application/AbilityStage.ts | 0 .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 0 .../src/main/ets/pages/common/StatusbarConfig.ts | 0 .../src/main/ets/pages/common/StyleConfiguration.ts | 0 .../src/main/ets/pages/common/StyleManager.ts | 0 .../src/main/ets/pages/common/constants.ts | 0 .../phone/statusbar/src/main/ets/pages/index.ets | 0 .../src/main/ets/workers/PluginDataSourceWorker.js | 0 .../product}/phone/statusbar/src/main/module.json5 | 0 .../src/main/resources/base/element/color.json | 0 .../src/main/resources/base/element/float.json | 0 .../src/main/resources/base/element/string.json | 0 .../src/main/resources/base/media/ic_status_bt.svg | 0 .../main/resources/base/media/ic_statusbar_gps.svg | 0 .../main/resources/base/media/ic_statusbar_nfc.svg | 0 .../resources/base/media/ic_statusbar_phone.svg | 0 .../base/media/ic_statusbar_ring_off_filled.svg | 0 .../resources/base/media/ic_statusbar_signal_1.svg | 0 .../resources/base/media/ic_statusbar_signal_2.svg | 0 .../resources/base/media/ic_statusbar_signal_3.svg | 0 .../resources/base/media/ic_statusbar_signal_4.svg | 0 .../base/media/ic_statusbar_signal_full.svg | 0 .../resources/base/media/ic_statusbar_signal_no.svg | 0 .../base/media/ic_statusbar_signal_roaming.png | Bin .../base/media/ic_statusbar_signal_wait.png | Bin .../base/media/ic_statusbar_vibration_on.svg | 0 .../resources/base/media/ic_statusbar_wifi_1.svg | 0 .../resources/base/media/ic_statusbar_wifi_2.svg | 0 .../resources/base/media/ic_statusbar_wifi_3.svg | 0 .../base/media/ic_statusbar_wifi_connect.png | Bin .../resources/base/media/ic_statusbar_wifi_full.svg | 0 .../resources/base/media/ic_statusbar_wifi_no.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/profile/main_pages.json | 0 .../src/main/resources/en_US/element/string.json | 0 .../src/main/resources/phone/media/ic_status_bt.svg | 0 .../main/resources/phone/media/ic_statusbar_gps.svg | 0 .../main/resources/phone/media/ic_statusbar_nfc.svg | 0 .../resources/phone/media/ic_statusbar_phone.svg | 0 .../phone/media/ic_statusbar_ring_off_filled.svg | 0 .../resources/phone/media/ic_statusbar_signal_1.svg | 0 .../resources/phone/media/ic_statusbar_signal_2.svg | 0 .../resources/phone/media/ic_statusbar_signal_3.svg | 0 .../resources/phone/media/ic_statusbar_signal_4.svg | 0 .../phone/media/ic_statusbar_signal_full.svg | 0 .../phone/media/ic_statusbar_signal_no.svg | 0 .../phone/media/ic_statusbar_vibration_on.svg | 0 .../resources/phone/media/ic_statusbar_wifi_1.svg | 0 .../resources/phone/media/ic_statusbar_wifi_2.svg | 0 .../resources/phone/media/ic_statusbar_wifi_3.svg | 0 .../phone/media/ic_statusbar_wifi_full.svg | 0 .../resources/phone/media/ic_statusbar_wifi_no.svg | 0 .../src/main/resources/zh_CN/element/string.json | 0 .../signature}/systemui.p7b | Bin 825 files changed, 0 insertions(+), 0 deletions(-) rename .gitattributes => systemui4merge/.gitattributes (100%) rename .gitignore => systemui4merge/.gitignore (100%) rename {AppScope => systemui4merge/AppScope}/app.json5 (100%) rename {AppScope => systemui4merge/AppScope}/resources/base/element/string.json (100%) rename {AppScope => systemui4merge/AppScope}/resources/base/media/app_icon.png (100%) rename LICENSE => systemui4merge/LICENSE (100%) mode change 100755 => 100644 rename OAT.xml => systemui4merge/OAT.xml (100%) rename README.md => systemui4merge/README.md (100%) mode change 100755 => 100644 rename README_zh.md => systemui4merge/README_zh.md (100%) mode change 100755 => 100644 rename build-profile.json5 => systemui4merge/build-profile.json5 (100%) rename {common => systemui4merge/common}/build-profile.json5 (100%) rename {common => systemui4merge/common}/hvigorfile.js (100%) rename {common => systemui4merge/common}/package-lock.json (100%) rename {common => systemui4merge/common}/package.json (100%) rename {common => systemui4merge/common}/src/main/ets/default/CheckEmptyUtils.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/CommonStyleManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/Constants.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/Decorators.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/InitSystemUi.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/Log.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/MultimodalInputManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/ReadConfigUtil.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/ResourceUtil.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/ScreenLockManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/SettingsUtil.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/SingleInstanceHelper.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/StyleConfiguration.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/SwitchUserManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/SysFaultLogger.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/TimeManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/TintStateManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/Trace.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/WindowManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/abilitymanager/abilityManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/abilitymanager/bundleManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/abilitymanager/featureAbilityManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/abilitymanager/notificationManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/commonEvent/CommonEventManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/event/EventBus.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/event/EventManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/event/EventUtil.ts (100%) rename {common => systemui4merge/common}/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts (100%) rename {common => systemui4merge/common}/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts (100%) rename {common => systemui4merge/common}/src/main/ets/plugindatasource/PluginDataSourceManager.ts (100%) rename {common => systemui4merge/common}/src/main/ets/plugindatasource/common/BundleParseUtil.ts (100%) rename {common => systemui4merge/common}/src/main/ets/plugindatasource/common/Constants.ts (100%) rename {common => systemui4merge/common}/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts (100%) rename {common => systemui4merge/common}/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts (100%) rename {common => systemui4merge/common}/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts (100%) rename {common => systemui4merge/common}/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts (100%) rename {common => systemui4merge/common}/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts (100%) rename {common => systemui4merge/common}/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts (100%) rename {common => systemui4merge/common}/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts (100%) rename {common => systemui4merge/common}/src/main/ets/template/SimpleToggleBase.ets (100%) rename {common => systemui4merge/common}/src/main/ets/template/common/StyleConfiguration.ts (100%) rename {common => systemui4merge/common}/src/main/ets/template/iconComponent.ets (100%) rename {common => systemui4merge/common}/src/main/ets/template/iconTitleBase.ets (100%) rename {common => systemui4merge/common}/src/main/module.json5 (100%) rename {common => systemui4merge/common}/src/main/resources/base/element/string.json (100%) rename {doc => systemui4merge/doc}/Instructions.md (100%) rename {entry => systemui4merge/entry}/pc/build-profile.json5 (100%) rename {entry => systemui4merge/entry}/pc/hvigorfile.js (100%) rename {entry => systemui4merge/entry}/pc/package-lock.json (100%) rename {entry => systemui4merge/entry}/pc/package.json (100%) rename {entry => systemui4merge/entry}/pc/src/main/ets/Application/AbilityStage.ts (100%) rename {entry => systemui4merge/entry}/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts (100%) rename {entry => systemui4merge/entry}/pc/src/main/ets/pages/index.ets (100%) rename {entry => systemui4merge/entry}/pc/src/main/module.json5 (100%) rename {entry => systemui4merge/entry}/pc/src/main/resources/base/element/string.json (100%) rename {entry => systemui4merge/entry}/pc/src/main/resources/base/media/icon.png (100%) rename {entry => systemui4merge/entry}/pc/src/main/resources/base/profile/main_pages.json (100%) rename {entry => systemui4merge/entry}/phone/build-profile.json5 (100%) rename {entry => systemui4merge/entry}/phone/hvigorfile.js (100%) rename {entry => systemui4merge/entry}/phone/package-lock.json (100%) rename {entry => systemui4merge/entry}/phone/package.json (100%) rename {entry => systemui4merge/entry}/phone/src/main/ets/Application/AbilityStage.ts (100%) rename {entry => systemui4merge/entry}/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts (100%) rename {entry => systemui4merge/entry}/phone/src/main/ets/pages/index.ets (100%) rename {entry => systemui4merge/entry}/phone/src/main/module.json5 (100%) rename {entry => systemui4merge/entry}/phone/src/main/resources/base/element/string.json (100%) rename {entry => systemui4merge/entry}/phone/src/main/resources/base/media/icon.png (100%) rename {entry => systemui4merge/entry}/phone/src/main/resources/base/profile/main_pages.json (100%) rename {features => systemui4merge/features}/airplanecomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/airplanecomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/airplanecomponent/package-lock.json (100%) rename {features => systemui4merge/features}/airplanecomponent/package.json (100%) rename {features => systemui4merge/features}/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets (100%) rename {features => systemui4merge/features}/airplanecomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/airplanecomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/airplanecomponent/src/main/resources/base/media/airplane.svg (100%) rename {features => systemui4merge/features}/airplanecomponent/src/main/resources/base/media/airplane_d.svg (100%) rename {features => systemui4merge/features}/airplanecomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/airplanecomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/autorotatecomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/autorotatecomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/autorotatecomponent/package-lock.json (100%) rename {features => systemui4merge/features}/autorotatecomponent/package.json (100%) rename {features => systemui4merge/features}/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts (100%) rename {features => systemui4merge/features}/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts (100%) rename {features => systemui4merge/features}/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets (100%) rename {features => systemui4merge/features}/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts (100%) rename {features => systemui4merge/features}/autorotatecomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/autorotatecomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg (100%) rename {features => systemui4merge/features}/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg (100%) rename {features => systemui4merge/features}/autorotatecomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/autorotatecomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/batterycomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/batterycomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/batterycomponent/package-lock.json (100%) rename {features => systemui4merge/features}/batterycomponent/package.json (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/ets/default/batteryModel.ts (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/ets/default/common/constants.ts (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/ets/default/pages/batteryIcon.ets (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/ets/default/pages/batteryPic.ets (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/ets/default/pages/batterySoc.ets (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/resources/base/media/icon.png (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/resources/phone/element/float.json (100%) rename {features => systemui4merge/features}/batterycomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/bluetoothcomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/bluetoothcomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/bluetoothcomponent/package-lock.json (100%) rename {features => systemui4merge/features}/bluetoothcomponent/package.json (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/resources/base/media/icon.png (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/resources/phone/element/float.json (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg (100%) rename {features => systemui4merge/features}/bluetoothcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/brightnesscomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/brightnesscomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/brightnesscomponent/package-lock.json (100%) rename {features => systemui4merge/features}/brightnesscomponent/package.json (100%) rename {features => systemui4merge/features}/brightnesscomponent/src/main/ets/default/brightnessManager.ts (100%) rename {features => systemui4merge/features}/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets (100%) rename {features => systemui4merge/features}/brightnesscomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/brightnesscomponent/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/brightnesscomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/brightnesscomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg (100%) rename {features => systemui4merge/features}/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg (100%) rename {features => systemui4merge/features}/brightnesscomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/brightnesscomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/capsulecomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/capsulecomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/capsulecomponent/package-lock.json (100%) rename {features => systemui4merge/features}/capsulecomponent/package.json (100%) rename {features => systemui4merge/features}/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/capsulecomponent/src/main/ets/default/common/constants.ts (100%) rename {features => systemui4merge/features}/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts (100%) rename {features => systemui4merge/features}/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets (100%) rename {features => systemui4merge/features}/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts (100%) rename {features => systemui4merge/features}/capsulecomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/capsulecomponent/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/capsulecomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg (100%) rename {features => systemui4merge/features}/capsulecomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg (100%) rename {features => systemui4merge/features}/capsulecomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/clockcomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/clockcomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/clockcomponent/package-lock.json (100%) rename {features => systemui4merge/features}/clockcomponent/package.json (100%) rename {features => systemui4merge/features}/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/clockcomponent/src/main/ets/default/pages/clockIcon.ets (100%) rename {features => systemui4merge/features}/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts (100%) rename {features => systemui4merge/features}/clockcomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/clockcomponent/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/clockcomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/clockcomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/clockcomponent/src/main/resources/base/media/icon.png (100%) rename {features => systemui4merge/features}/clockcomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/clockcomponent/src/main/resources/phone/element/float.json (100%) rename {features => systemui4merge/features}/clockcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/controlcentercomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/controlcentercomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/controlcentercomponent/package-lock.json (100%) rename {features => systemui4merge/features}/controlcentercomponent/package.json (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/resources/base/media/ic_settings.png (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/resources/base/media/icon.png (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/controlcentercomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/locationcomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/locationcomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/locationcomponent/package-lock.json (100%) rename {features => systemui4merge/features}/locationcomponent/package.json (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/ets/com/ohos/common/Constants.ts (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/resources/base/media/icon.png (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/resources/phone/element/float.json (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg (100%) rename {features => systemui4merge/features}/locationcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/managementcomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/managementcomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/managementcomponent/package-lock.json (100%) rename {features => systemui4merge/features}/managementcomponent/package.json (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/common/constants.ts (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/resources/base/media/ic_back.svg (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/resources/phone/element/color.json (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/resources/phone/element/float.json (100%) rename {features => systemui4merge/features}/managementcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/navigationservice/build-profile.json5 (100%) rename {features => systemui4merge/features}/navigationservice/hvigorfile.js (100%) rename {features => systemui4merge/features}/navigationservice/package-lock.json (100%) rename {features => systemui4merge/features}/navigationservice/package.json (100%) rename {features => systemui4merge/features}/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ts (100%) rename {features => systemui4merge/features}/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts (100%) rename {features => systemui4merge/features}/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts (100%) rename {features => systemui4merge/features}/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts (100%) rename {features => systemui4merge/features}/navigationservice/src/main/module.json5 (100%) rename {features => systemui4merge/features}/navigationservice/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/nfccomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/nfccomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/nfccomponent/package-lock.json (100%) rename {features => systemui4merge/features}/nfccomponent/package.json (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/phone/element/float.json (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg (100%) rename {features => systemui4merge/features}/nfccomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/noticeitem/build-profile.json5 (100%) rename {features => systemui4merge/features}/noticeitem/hvigorfile.js (100%) rename {features => systemui4merge/features}/noticeitem/package-lock.json (100%) rename {features => systemui4merge/features}/noticeitem/package.json (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets (100%) rename {features => systemui4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts (100%) rename {features => systemui4merge/features}/noticeitem/src/main/module.json5 (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/base/media/ic_close.svg (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/base/media/ic_notification_down.png (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/base/media/ic_notification_up.png (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/base/media/send.svg (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/phone/element/color.json (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/phone/element/float.json (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/rawfile/notificationConfig.json (100%) rename {features => systemui4merge/features}/noticeitem/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/ringmodecomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/ringmodecomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/ringmodecomponent/package-lock.json (100%) rename {features => systemui4merge/features}/ringmodecomponent/package.json (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/phone/element/float.json (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg (100%) rename {features => systemui4merge/features}/ringmodecomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/signalcomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/signalcomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/signalcomponent/package-lock.json (100%) rename {features => systemui4merge/features}/signalcomponent/package.json (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/ets/default/common/constants.ts (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/ets/default/pages/signalIcon.ets (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/ets/default/signalModel.ts (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/base/media/icon.png (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/phone/element/float.json (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg (100%) rename {features => systemui4merge/features}/signalcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/statusbarcomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/statusbarcomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/statusbarcomponent/package-lock.json (100%) rename {features => systemui4merge/features}/statusbarcomponent/package.json (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/resources/base/media/icon.png (100%) rename {features => systemui4merge/features}/statusbarcomponent/src/main/resources/phone/element/float.json (100%) rename {features => systemui4merge/features}/volumecomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/volumecomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/volumecomponent/package-lock.json (100%) rename {features => systemui4merge/features}/volumecomponent/package.json (100%) rename {features => systemui4merge/features}/volumecomponent/src/main/ets/default/VolumeModel.ts (100%) rename {features => systemui4merge/features}/volumecomponent/src/main/ets/default/pages/volumeComponent.ets (100%) rename {features => systemui4merge/features}/volumecomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/volumecomponent/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/volumecomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/volumecomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/volumecomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/volumecomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/volumepanelcomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/volumepanelcomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/volumepanelcomponent/package-lock.json (100%) rename {features => systemui4merge/features}/volumepanelcomponent/package.json (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/base/element/color.json (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/base/element/string.json (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/base/media/icon.png (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/en_US/element/string.json (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/phone/element/color.json (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/phone/element/float.json (100%) rename {features => systemui4merge/features}/volumepanelcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => systemui4merge/features}/wificomponent/build-profile.json5 (100%) rename {features => systemui4merge/features}/wificomponent/hvigorfile.js (100%) rename {features => systemui4merge/features}/wificomponent/package-lock.json (100%) rename {features => systemui4merge/features}/wificomponent/package.json (100%) rename {features => systemui4merge/features}/wificomponent/src/main/ets/default/common/StyleConfiguration.ts (100%) rename {features => systemui4merge/features}/wificomponent/src/main/ets/default/common/constants.ts (100%) rename {features => systemui4merge/features}/wificomponent/src/main/ets/default/pages/wifiComponent.ets (100%) rename {features => systemui4merge/features}/wificomponent/src/main/ets/default/pages/wifiIcon.ets (100%) rename {features => systemui4merge/features}/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts (100%) rename {features => systemui4merge/features}/wificomponent/src/main/ets/default/wifiModel.ts (100%) rename {features => systemui4merge/features}/wificomponent/src/main/module.json5 (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/base/element/float.json (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/base/media/icon.png (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/base/media/wifi.svg (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/base/media/wifi_d.svg (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/phone/element/float.json (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg (100%) rename {features => systemui4merge/features}/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg (100%) rename {figures => systemui4merge/figures}/TS_01.png (100%) rename {figures => systemui4merge/figures}/TS_02.png (100%) rename {figures => systemui4merge/figures}/cmd1.png (100%) rename {figures => systemui4merge/figures}/cmd2.png (100%) rename {figures => systemui4merge/figures}/cmd3.png (100%) rename {figures => systemui4merge/figures}/commit_source_clone_page.png (100%) rename {figures => systemui4merge/figures}/commit_source_fork_button.png (100%) rename {figures => systemui4merge/figures}/commit_source_fork_confirm.png (100%) rename {figures => systemui4merge/figures}/commit_source_forked_repo.jpg (100%) rename {figures => systemui4merge/figures}/commit_source_new_pr_done copy.png (100%) rename {figures => systemui4merge/figures}/commit_source_new_pr_done.png (100%) rename {figures => systemui4merge/figures}/commit_source_new_pull_request copy.png (100%) rename {figures => systemui4merge/figures}/commit_source_new_pull_request.png (100%) rename {figures => systemui4merge/figures}/commit_source_new_pull_request_confirm copy.png (100%) rename {figures => systemui4merge/figures}/commit_source_new_pull_request_confirm.png (100%) rename {figures => systemui4merge/figures}/downLoadSDK_01.png (100%) rename {figures => systemui4merge/figures}/downLoad_01.png (100%) rename {figures => systemui4merge/figures}/downLoad_02.png (100%) rename {figures => systemui4merge/figures}/downLoad_03.png (100%) rename {figures => systemui4merge/figures}/downLoad_04.png (100%) rename {figures => systemui4merge/figures}/downLoad_05.png (100%) rename {figures => systemui4merge/figures}/downLoad_06.png (100%) rename {figures => systemui4merge/figures}/ds_build_haps.png (100%) rename {figures => systemui4merge/figures}/ds_hilog_window.png (100%) rename {figures => systemui4merge/figures}/ds_ohosbuild_output_dir_debug.png (100%) rename {figures => systemui4merge/figures}/ds_ohosbuild_output_dir_release.png (100%) rename {figures => systemui4merge/figures}/ds_ohosbuild_variants.png (100%) rename {figures => systemui4merge/figures}/ds_ohosbuild_variants_debug.png (100%) rename {figures => systemui4merge/figures}/ds_ohosbuild_variants_release.png (100%) rename {figures => systemui4merge/figures}/en-us_image_0000001103686480.png (100%) mode change 100755 => 100644 rename {figures => systemui4merge/figures}/gitee_01.png (100%) rename {figures => systemui4merge/figures}/hap_repo.png (100%) rename {figures => systemui4merge/figures}/importProject.png (100%) rename {figures => systemui4merge/figures}/screenshot-20210521-105407.png (100%) rename {figures => systemui4merge/figures}/screenshot-20210521-110433.png (100%) rename {figures => systemui4merge/figures}/screenshot-20210521-111223.png (100%) rename {figures => systemui4merge/figures}/signature_1.png (100%) rename {figures => systemui4merge/figures}/signature_2.png (100%) rename {figures => systemui4merge/figures}/signature_3.png (100%) rename {figures => systemui4merge/figures}/zh-cn_image_0000001103686480.png (100%) mode change 100755 => 100644 rename gradle.properties => systemui4merge/gradle.properties (100%) mode change 100755 => 100644 rename gradlew => systemui4merge/gradlew (100%) mode change 100755 => 100644 rename gradlew.bat => systemui4merge/gradlew.bat (100%) mode change 100755 => 100644 rename hvigorfile.js => systemui4merge/hvigorfile.js (100%) rename {infra => systemui4merge/infra}/config_exts.gradle (100%) rename package-lock.json => systemui4merge/package-lock.json (100%) rename package.json => systemui4merge/package.json (100%) rename {product => systemui4merge/product}/default/navigationBar/build-profile.json5 (100%) rename {product => systemui4merge/product}/default/navigationBar/hvigorfile.js (100%) rename {product => systemui4merge/product}/default/navigationBar/package-lock.json (100%) rename {product => systemui4merge/product}/default/navigationBar/package.json (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/Application/AbilityStage.ts (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/common/IndicatorConfig.ts (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/common/StyleConfiguration.ts (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/common/StyleManager.ts (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/common/constants.ts (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/common/utils/configReader.ts (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/i18n/en-US.json (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/i18n/zh-CN.json (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/pages/SplitBarIndex.ets (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/pages/index.ets (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/pages/keyButton.ets (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/pages/oneLayout.ets (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/pages/threeLayout.ets (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/module.json5 (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/resources/base/element/color.json (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/resources/base/element/float.json (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/resources/base/element/string.json (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/resources/base/media/ic_systemui_back.svg (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/resources/base/media/ic_systemui_home.svg (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/resources/base/media/ic_systemui_recent.svg (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/resources/base/media/icon.png (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/resources/base/profile/main_pages.json (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/resources/en_US/element/string.json (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/resources/rawfile/navigationBarLayoutConfig.json (100%) rename {product => systemui4merge/product}/default/navigationBar/src/main/resources/zh_CN/element/string.json (100%) rename {product => systemui4merge/product}/default/notificationmanagement/build-profile.json5 (100%) rename {product => systemui4merge/product}/default/notificationmanagement/hvigorfile.js (100%) rename {product => systemui4merge/product}/default/notificationmanagement/package-lock.json (100%) rename {product => systemui4merge/product}/default/notificationmanagement/package.json (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/ets/common/constants.ts (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/ets/pages/noDisturb.ets (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/ets/pages/setEnable.ets (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/ets/pages/slotSetting.ets (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/module.json5 (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/resources/base/element/color.json (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/resources/base/element/string.json (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/resources/base/media/ic_back.svg (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/resources/base/media/icon.png (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/resources/base/media/startWindowIcon.png (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/resources/base/profile/main_pages.json (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/resources/en_US/element/string.json (100%) rename {product => systemui4merge/product}/default/notificationmanagement/src/main/resources/zh_CN/element/string.json (100%) rename {product => systemui4merge/product}/default/volumepanel/build-profile.json5 (100%) rename {product => systemui4merge/product}/default/volumepanel/hvigorfile.js (100%) rename {product => systemui4merge/product}/default/volumepanel/package-lock.json (100%) rename {product => systemui4merge/product}/default/volumepanel/package.json (100%) rename {product => systemui4merge/product}/default/volumepanel/src/main/ets/Application/AbilityStage.ts (100%) rename {product => systemui4merge/product}/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts (100%) rename {product => systemui4merge/product}/default/volumepanel/src/main/ets/common/StyleConfiguration.ts (100%) rename {product => systemui4merge/product}/default/volumepanel/src/main/ets/common/StyleManager.ts (100%) rename {product => systemui4merge/product}/default/volumepanel/src/main/ets/common/constants.ts (100%) rename {product => systemui4merge/product}/default/volumepanel/src/main/ets/pages/index.ets (100%) rename {product => systemui4merge/product}/default/volumepanel/src/main/module.json5 (100%) rename {product => systemui4merge/product}/default/volumepanel/src/main/resources/base/element/string.json (100%) rename {product => systemui4merge/product}/default/volumepanel/src/main/resources/base/media/icon.png (100%) rename {product => systemui4merge/product}/default/volumepanel/src/main/resources/base/profile/main_pages.json (100%) rename {product => systemui4merge/product}/default/volumepanel/src/main/resources/en_US/element/string.json (100%) rename {product => systemui4merge/product}/default/volumepanel/src/main/resources/zh_CN/element/string.json (100%) rename {product => systemui4merge/product}/pc/controlpanel/build-profile.json5 (100%) rename {product => systemui4merge/product}/pc/controlpanel/hvigorfile.js (100%) rename {product => systemui4merge/product}/pc/controlpanel/package-lock.json (100%) rename {product => systemui4merge/product}/pc/controlpanel/package.json (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/ets/Application/AbilityStage.ts (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/ets/pages/common/constants.ts (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/ets/pages/control.ets (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/ets/pages/index.ets (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/module.json5 (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/element/color.json (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/element/float.json (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/element/string.json (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/airplane.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/airplane_d.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/ic_brightness_plus.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/ic_brightness_reduce.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_gps.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_oh.png (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/icon.png (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/wifi.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/media/wifi_d.svg (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/profile/form_config.json (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/base/profile/main_pages.json (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/en_US/element/string.json (100%) rename {product => systemui4merge/product}/pc/controlpanel/src/main/resources/zh_CN/element/string.json (100%) rename {product => systemui4merge/product}/pc/notificationpanel/build-profile.json5 (100%) rename {product => systemui4merge/product}/pc/notificationpanel/hvigorfile.js (100%) rename {product => systemui4merge/product}/pc/notificationpanel/package-lock.json (100%) rename {product => systemui4merge/product}/pc/notificationpanel/package.json (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/ets/pages/common/constants.ts (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/ets/pages/index.ets (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/ets/pages/notification.ets (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/module.json5 (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/base/element/color.json (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/base/element/float.json (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/base/element/string.json (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/base/media/delete_all.png (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/base/media/ic_message_filled.png (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/base/media/ic_public_delete.svg (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/base/media/ic_public_settings.svg (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/base/media/ic_settings.png (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/base/media/icon.png (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/base/profile/form_config.json (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/base/profile/main_pages.json (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/en_US/element/string.json (100%) rename {product => systemui4merge/product}/pc/notificationpanel/src/main/resources/zh_CN/element/string.json (100%) rename {product => systemui4merge/product}/pc/statusbar/build-profile.json5 (100%) rename {product => systemui4merge/product}/pc/statusbar/hvigorfile.js (100%) rename {product => systemui4merge/product}/pc/statusbar/package-lock.json (100%) rename {product => systemui4merge/product}/pc/statusbar/package.json (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/ets/Application/AbilityStage.ts (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/ets/pages/common/StyleManager.ts (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/ets/pages/common/constants.ts (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/ets/pages/index.ets (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/module.json5 (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/element/color.json (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/element/float.json (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/element/string.json (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_status_bt.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/media/icon.png (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/base/profile/main_pages.json (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/en_US/element/string.json (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/pointingdevice/element/float.json (100%) rename {product => systemui4merge/product}/pc/statusbar/src/main/resources/zh_CN/element/string.json (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/.gitignore (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/build-profile.json5 (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/hvigorfile.js (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/package-lock.json (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/package.json (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/ets/pages/common/constants.ts (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/ets/pages/control.ets (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/ets/pages/index.ets (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/ets/pages/notification.ets (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/module.json5 (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/element/color.json (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/element/float.json (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/element/string.json (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/airplane.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/delete_all.png (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/icon.png (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/wifi.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/en_US/element/string.json (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/phone/element/float.json (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png (100%) rename {product => systemui4merge/product}/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json (100%) rename {product => systemui4merge/product}/phone/statusbar/.gitignore (100%) rename {product => systemui4merge/product}/phone/statusbar/build-profile.json5 (100%) rename {product => systemui4merge/product}/phone/statusbar/hvigorfile.js (100%) rename {product => systemui4merge/product}/phone/statusbar/package-lock.json (100%) rename {product => systemui4merge/product}/phone/statusbar/package.json (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/ets/Application/AbilityStage.ts (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/ets/pages/common/StyleManager.ts (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/ets/pages/common/constants.ts (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/ets/pages/index.ets (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/module.json5 (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/element/color.json (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/element/float.json (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/element/string.json (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/media/icon.png (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/base/profile/main_pages.json (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/en_US/element/string.json (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg (100%) rename {product => systemui4merge/product}/phone/statusbar/src/main/resources/zh_CN/element/string.json (100%) rename {signature => systemui4merge/signature}/systemui.p7b (100%) diff --git a/.gitattributes b/systemui4merge/.gitattributes similarity index 100% rename from .gitattributes rename to systemui4merge/.gitattributes diff --git a/.gitignore b/systemui4merge/.gitignore similarity index 100% rename from .gitignore rename to systemui4merge/.gitignore diff --git a/AppScope/app.json5 b/systemui4merge/AppScope/app.json5 similarity index 100% rename from AppScope/app.json5 rename to systemui4merge/AppScope/app.json5 diff --git a/AppScope/resources/base/element/string.json b/systemui4merge/AppScope/resources/base/element/string.json similarity index 100% rename from AppScope/resources/base/element/string.json rename to systemui4merge/AppScope/resources/base/element/string.json diff --git a/AppScope/resources/base/media/app_icon.png b/systemui4merge/AppScope/resources/base/media/app_icon.png similarity index 100% rename from AppScope/resources/base/media/app_icon.png rename to systemui4merge/AppScope/resources/base/media/app_icon.png diff --git a/LICENSE b/systemui4merge/LICENSE old mode 100755 new mode 100644 similarity index 100% rename from LICENSE rename to systemui4merge/LICENSE diff --git a/OAT.xml b/systemui4merge/OAT.xml similarity index 100% rename from OAT.xml rename to systemui4merge/OAT.xml diff --git a/README.md b/systemui4merge/README.md old mode 100755 new mode 100644 similarity index 100% rename from README.md rename to systemui4merge/README.md diff --git a/README_zh.md b/systemui4merge/README_zh.md old mode 100755 new mode 100644 similarity index 100% rename from README_zh.md rename to systemui4merge/README_zh.md diff --git a/build-profile.json5 b/systemui4merge/build-profile.json5 similarity index 100% rename from build-profile.json5 rename to systemui4merge/build-profile.json5 diff --git a/common/build-profile.json5 b/systemui4merge/common/build-profile.json5 similarity index 100% rename from common/build-profile.json5 rename to systemui4merge/common/build-profile.json5 diff --git a/common/hvigorfile.js b/systemui4merge/common/hvigorfile.js similarity index 100% rename from common/hvigorfile.js rename to systemui4merge/common/hvigorfile.js diff --git a/common/package-lock.json b/systemui4merge/common/package-lock.json similarity index 100% rename from common/package-lock.json rename to systemui4merge/common/package-lock.json diff --git a/common/package.json b/systemui4merge/common/package.json similarity index 100% rename from common/package.json rename to systemui4merge/common/package.json diff --git a/common/src/main/ets/default/CheckEmptyUtils.ts b/systemui4merge/common/src/main/ets/default/CheckEmptyUtils.ts similarity index 100% rename from common/src/main/ets/default/CheckEmptyUtils.ts rename to systemui4merge/common/src/main/ets/default/CheckEmptyUtils.ts diff --git a/common/src/main/ets/default/CommonStyleManager.ts b/systemui4merge/common/src/main/ets/default/CommonStyleManager.ts similarity index 100% rename from common/src/main/ets/default/CommonStyleManager.ts rename to systemui4merge/common/src/main/ets/default/CommonStyleManager.ts diff --git a/common/src/main/ets/default/Constants.ts b/systemui4merge/common/src/main/ets/default/Constants.ts similarity index 100% rename from common/src/main/ets/default/Constants.ts rename to systemui4merge/common/src/main/ets/default/Constants.ts diff --git a/common/src/main/ets/default/Decorators.ts b/systemui4merge/common/src/main/ets/default/Decorators.ts similarity index 100% rename from common/src/main/ets/default/Decorators.ts rename to systemui4merge/common/src/main/ets/default/Decorators.ts diff --git a/common/src/main/ets/default/InitSystemUi.ts b/systemui4merge/common/src/main/ets/default/InitSystemUi.ts similarity index 100% rename from common/src/main/ets/default/InitSystemUi.ts rename to systemui4merge/common/src/main/ets/default/InitSystemUi.ts diff --git a/common/src/main/ets/default/Log.ts b/systemui4merge/common/src/main/ets/default/Log.ts similarity index 100% rename from common/src/main/ets/default/Log.ts rename to systemui4merge/common/src/main/ets/default/Log.ts diff --git a/common/src/main/ets/default/MultimodalInputManager.ts b/systemui4merge/common/src/main/ets/default/MultimodalInputManager.ts similarity index 100% rename from common/src/main/ets/default/MultimodalInputManager.ts rename to systemui4merge/common/src/main/ets/default/MultimodalInputManager.ts diff --git a/common/src/main/ets/default/ReadConfigUtil.ts b/systemui4merge/common/src/main/ets/default/ReadConfigUtil.ts similarity index 100% rename from common/src/main/ets/default/ReadConfigUtil.ts rename to systemui4merge/common/src/main/ets/default/ReadConfigUtil.ts diff --git a/common/src/main/ets/default/ResourceUtil.ts b/systemui4merge/common/src/main/ets/default/ResourceUtil.ts similarity index 100% rename from common/src/main/ets/default/ResourceUtil.ts rename to systemui4merge/common/src/main/ets/default/ResourceUtil.ts diff --git a/common/src/main/ets/default/ScreenLockManager.ts b/systemui4merge/common/src/main/ets/default/ScreenLockManager.ts similarity index 100% rename from common/src/main/ets/default/ScreenLockManager.ts rename to systemui4merge/common/src/main/ets/default/ScreenLockManager.ts diff --git a/common/src/main/ets/default/SettingsUtil.ts b/systemui4merge/common/src/main/ets/default/SettingsUtil.ts similarity index 100% rename from common/src/main/ets/default/SettingsUtil.ts rename to systemui4merge/common/src/main/ets/default/SettingsUtil.ts diff --git a/common/src/main/ets/default/SingleInstanceHelper.ts b/systemui4merge/common/src/main/ets/default/SingleInstanceHelper.ts similarity index 100% rename from common/src/main/ets/default/SingleInstanceHelper.ts rename to systemui4merge/common/src/main/ets/default/SingleInstanceHelper.ts diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/systemui4merge/common/src/main/ets/default/StyleConfiguration.ts similarity index 100% rename from common/src/main/ets/default/StyleConfiguration.ts rename to systemui4merge/common/src/main/ets/default/StyleConfiguration.ts diff --git a/common/src/main/ets/default/SwitchUserManager.ts b/systemui4merge/common/src/main/ets/default/SwitchUserManager.ts similarity index 100% rename from common/src/main/ets/default/SwitchUserManager.ts rename to systemui4merge/common/src/main/ets/default/SwitchUserManager.ts diff --git a/common/src/main/ets/default/SysFaultLogger.ts b/systemui4merge/common/src/main/ets/default/SysFaultLogger.ts similarity index 100% rename from common/src/main/ets/default/SysFaultLogger.ts rename to systemui4merge/common/src/main/ets/default/SysFaultLogger.ts diff --git a/common/src/main/ets/default/TimeManager.ts b/systemui4merge/common/src/main/ets/default/TimeManager.ts similarity index 100% rename from common/src/main/ets/default/TimeManager.ts rename to systemui4merge/common/src/main/ets/default/TimeManager.ts diff --git a/common/src/main/ets/default/TintStateManager.ts b/systemui4merge/common/src/main/ets/default/TintStateManager.ts similarity index 100% rename from common/src/main/ets/default/TintStateManager.ts rename to systemui4merge/common/src/main/ets/default/TintStateManager.ts diff --git a/common/src/main/ets/default/Trace.ts b/systemui4merge/common/src/main/ets/default/Trace.ts similarity index 100% rename from common/src/main/ets/default/Trace.ts rename to systemui4merge/common/src/main/ets/default/Trace.ts diff --git a/common/src/main/ets/default/WindowManager.ts b/systemui4merge/common/src/main/ets/default/WindowManager.ts similarity index 100% rename from common/src/main/ets/default/WindowManager.ts rename to systemui4merge/common/src/main/ets/default/WindowManager.ts diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/systemui4merge/common/src/main/ets/default/abilitymanager/abilityManager.ts similarity index 100% rename from common/src/main/ets/default/abilitymanager/abilityManager.ts rename to systemui4merge/common/src/main/ets/default/abilitymanager/abilityManager.ts diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ts b/systemui4merge/common/src/main/ets/default/abilitymanager/bundleManager.ts similarity index 100% rename from common/src/main/ets/default/abilitymanager/bundleManager.ts rename to systemui4merge/common/src/main/ets/default/abilitymanager/bundleManager.ts diff --git a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts b/systemui4merge/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts similarity index 100% rename from common/src/main/ets/default/abilitymanager/featureAbilityManager.ts rename to systemui4merge/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts diff --git a/common/src/main/ets/default/abilitymanager/notificationManager.ts b/systemui4merge/common/src/main/ets/default/abilitymanager/notificationManager.ts similarity index 100% rename from common/src/main/ets/default/abilitymanager/notificationManager.ts rename to systemui4merge/common/src/main/ets/default/abilitymanager/notificationManager.ts diff --git a/common/src/main/ets/default/commonEvent/CommonEventManager.ts b/systemui4merge/common/src/main/ets/default/commonEvent/CommonEventManager.ts similarity index 100% rename from common/src/main/ets/default/commonEvent/CommonEventManager.ts rename to systemui4merge/common/src/main/ets/default/commonEvent/CommonEventManager.ts diff --git a/common/src/main/ets/default/event/EventBus.ts b/systemui4merge/common/src/main/ets/default/event/EventBus.ts similarity index 100% rename from common/src/main/ets/default/event/EventBus.ts rename to systemui4merge/common/src/main/ets/default/event/EventBus.ts diff --git a/common/src/main/ets/default/event/EventManager.ts b/systemui4merge/common/src/main/ets/default/event/EventManager.ts similarity index 100% rename from common/src/main/ets/default/event/EventManager.ts rename to systemui4merge/common/src/main/ets/default/event/EventManager.ts diff --git a/common/src/main/ets/default/event/EventUtil.ts b/systemui4merge/common/src/main/ets/default/event/EventUtil.ts similarity index 100% rename from common/src/main/ets/default/event/EventUtil.ts rename to systemui4merge/common/src/main/ets/default/event/EventUtil.ts diff --git a/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts b/systemui4merge/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts similarity index 100% rename from common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts rename to systemui4merge/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/systemui4merge/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts similarity index 100% rename from common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts rename to systemui4merge/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts b/systemui4merge/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts similarity index 100% rename from common/src/main/ets/plugindatasource/PluginDataSourceManager.ts rename to systemui4merge/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/systemui4merge/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts similarity index 100% rename from common/src/main/ets/plugindatasource/common/BundleParseUtil.ts rename to systemui4merge/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts diff --git a/common/src/main/ets/plugindatasource/common/Constants.ts b/systemui4merge/common/src/main/ets/plugindatasource/common/Constants.ts similarity index 100% rename from common/src/main/ets/plugindatasource/common/Constants.ts rename to systemui4merge/common/src/main/ets/plugindatasource/common/Constants.ts diff --git a/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts b/systemui4merge/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts similarity index 100% rename from common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts rename to systemui4merge/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts diff --git a/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts b/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts similarity index 100% rename from common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts rename to systemui4merge/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts diff --git a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts b/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts similarity index 100% rename from common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts rename to systemui4merge/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts diff --git a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts b/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts similarity index 100% rename from common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts rename to systemui4merge/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts diff --git a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts b/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts similarity index 100% rename from common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts rename to systemui4merge/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts b/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts similarity index 100% rename from common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts rename to systemui4merge/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts b/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts similarity index 100% rename from common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts rename to systemui4merge/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/systemui4merge/common/src/main/ets/template/SimpleToggleBase.ets similarity index 100% rename from common/src/main/ets/template/SimpleToggleBase.ets rename to systemui4merge/common/src/main/ets/template/SimpleToggleBase.ets diff --git a/common/src/main/ets/template/common/StyleConfiguration.ts b/systemui4merge/common/src/main/ets/template/common/StyleConfiguration.ts similarity index 100% rename from common/src/main/ets/template/common/StyleConfiguration.ts rename to systemui4merge/common/src/main/ets/template/common/StyleConfiguration.ts diff --git a/common/src/main/ets/template/iconComponent.ets b/systemui4merge/common/src/main/ets/template/iconComponent.ets similarity index 100% rename from common/src/main/ets/template/iconComponent.ets rename to systemui4merge/common/src/main/ets/template/iconComponent.ets diff --git a/common/src/main/ets/template/iconTitleBase.ets b/systemui4merge/common/src/main/ets/template/iconTitleBase.ets similarity index 100% rename from common/src/main/ets/template/iconTitleBase.ets rename to systemui4merge/common/src/main/ets/template/iconTitleBase.ets diff --git a/common/src/main/module.json5 b/systemui4merge/common/src/main/module.json5 similarity index 100% rename from common/src/main/module.json5 rename to systemui4merge/common/src/main/module.json5 diff --git a/common/src/main/resources/base/element/string.json b/systemui4merge/common/src/main/resources/base/element/string.json similarity index 100% rename from common/src/main/resources/base/element/string.json rename to systemui4merge/common/src/main/resources/base/element/string.json diff --git a/doc/Instructions.md b/systemui4merge/doc/Instructions.md similarity index 100% rename from doc/Instructions.md rename to systemui4merge/doc/Instructions.md diff --git a/entry/pc/build-profile.json5 b/systemui4merge/entry/pc/build-profile.json5 similarity index 100% rename from entry/pc/build-profile.json5 rename to systemui4merge/entry/pc/build-profile.json5 diff --git a/entry/pc/hvigorfile.js b/systemui4merge/entry/pc/hvigorfile.js similarity index 100% rename from entry/pc/hvigorfile.js rename to systemui4merge/entry/pc/hvigorfile.js diff --git a/entry/pc/package-lock.json b/systemui4merge/entry/pc/package-lock.json similarity index 100% rename from entry/pc/package-lock.json rename to systemui4merge/entry/pc/package-lock.json diff --git a/entry/pc/package.json b/systemui4merge/entry/pc/package.json similarity index 100% rename from entry/pc/package.json rename to systemui4merge/entry/pc/package.json diff --git a/entry/pc/src/main/ets/Application/AbilityStage.ts b/systemui4merge/entry/pc/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from entry/pc/src/main/ets/Application/AbilityStage.ts rename to systemui4merge/entry/pc/src/main/ets/Application/AbilityStage.ts diff --git a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/systemui4merge/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts similarity index 100% rename from entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename to systemui4merge/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts diff --git a/entry/pc/src/main/ets/pages/index.ets b/systemui4merge/entry/pc/src/main/ets/pages/index.ets similarity index 100% rename from entry/pc/src/main/ets/pages/index.ets rename to systemui4merge/entry/pc/src/main/ets/pages/index.ets diff --git a/entry/pc/src/main/module.json5 b/systemui4merge/entry/pc/src/main/module.json5 similarity index 100% rename from entry/pc/src/main/module.json5 rename to systemui4merge/entry/pc/src/main/module.json5 diff --git a/entry/pc/src/main/resources/base/element/string.json b/systemui4merge/entry/pc/src/main/resources/base/element/string.json similarity index 100% rename from entry/pc/src/main/resources/base/element/string.json rename to systemui4merge/entry/pc/src/main/resources/base/element/string.json diff --git a/entry/pc/src/main/resources/base/media/icon.png b/systemui4merge/entry/pc/src/main/resources/base/media/icon.png similarity index 100% rename from entry/pc/src/main/resources/base/media/icon.png rename to systemui4merge/entry/pc/src/main/resources/base/media/icon.png diff --git a/entry/pc/src/main/resources/base/profile/main_pages.json b/systemui4merge/entry/pc/src/main/resources/base/profile/main_pages.json similarity index 100% rename from entry/pc/src/main/resources/base/profile/main_pages.json rename to systemui4merge/entry/pc/src/main/resources/base/profile/main_pages.json diff --git a/entry/phone/build-profile.json5 b/systemui4merge/entry/phone/build-profile.json5 similarity index 100% rename from entry/phone/build-profile.json5 rename to systemui4merge/entry/phone/build-profile.json5 diff --git a/entry/phone/hvigorfile.js b/systemui4merge/entry/phone/hvigorfile.js similarity index 100% rename from entry/phone/hvigorfile.js rename to systemui4merge/entry/phone/hvigorfile.js diff --git a/entry/phone/package-lock.json b/systemui4merge/entry/phone/package-lock.json similarity index 100% rename from entry/phone/package-lock.json rename to systemui4merge/entry/phone/package-lock.json diff --git a/entry/phone/package.json b/systemui4merge/entry/phone/package.json similarity index 100% rename from entry/phone/package.json rename to systemui4merge/entry/phone/package.json diff --git a/entry/phone/src/main/ets/Application/AbilityStage.ts b/systemui4merge/entry/phone/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from entry/phone/src/main/ets/Application/AbilityStage.ts rename to systemui4merge/entry/phone/src/main/ets/Application/AbilityStage.ts diff --git a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/systemui4merge/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts similarity index 100% rename from entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename to systemui4merge/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts diff --git a/entry/phone/src/main/ets/pages/index.ets b/systemui4merge/entry/phone/src/main/ets/pages/index.ets similarity index 100% rename from entry/phone/src/main/ets/pages/index.ets rename to systemui4merge/entry/phone/src/main/ets/pages/index.ets diff --git a/entry/phone/src/main/module.json5 b/systemui4merge/entry/phone/src/main/module.json5 similarity index 100% rename from entry/phone/src/main/module.json5 rename to systemui4merge/entry/phone/src/main/module.json5 diff --git a/entry/phone/src/main/resources/base/element/string.json b/systemui4merge/entry/phone/src/main/resources/base/element/string.json similarity index 100% rename from entry/phone/src/main/resources/base/element/string.json rename to systemui4merge/entry/phone/src/main/resources/base/element/string.json diff --git a/entry/phone/src/main/resources/base/media/icon.png b/systemui4merge/entry/phone/src/main/resources/base/media/icon.png similarity index 100% rename from entry/phone/src/main/resources/base/media/icon.png rename to systemui4merge/entry/phone/src/main/resources/base/media/icon.png diff --git a/entry/phone/src/main/resources/base/profile/main_pages.json b/systemui4merge/entry/phone/src/main/resources/base/profile/main_pages.json similarity index 100% rename from entry/phone/src/main/resources/base/profile/main_pages.json rename to systemui4merge/entry/phone/src/main/resources/base/profile/main_pages.json diff --git a/features/airplanecomponent/build-profile.json5 b/systemui4merge/features/airplanecomponent/build-profile.json5 similarity index 100% rename from features/airplanecomponent/build-profile.json5 rename to systemui4merge/features/airplanecomponent/build-profile.json5 diff --git a/features/airplanecomponent/hvigorfile.js b/systemui4merge/features/airplanecomponent/hvigorfile.js similarity index 100% rename from features/airplanecomponent/hvigorfile.js rename to systemui4merge/features/airplanecomponent/hvigorfile.js diff --git a/features/airplanecomponent/package-lock.json b/systemui4merge/features/airplanecomponent/package-lock.json similarity index 100% rename from features/airplanecomponent/package-lock.json rename to systemui4merge/features/airplanecomponent/package-lock.json diff --git a/features/airplanecomponent/package.json b/systemui4merge/features/airplanecomponent/package.json similarity index 100% rename from features/airplanecomponent/package.json rename to systemui4merge/features/airplanecomponent/package.json diff --git a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets b/systemui4merge/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets similarity index 100% rename from features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets rename to systemui4merge/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets diff --git a/features/airplanecomponent/src/main/module.json5 b/systemui4merge/features/airplanecomponent/src/main/module.json5 similarity index 100% rename from features/airplanecomponent/src/main/module.json5 rename to systemui4merge/features/airplanecomponent/src/main/module.json5 diff --git a/features/airplanecomponent/src/main/resources/base/element/string.json b/systemui4merge/features/airplanecomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/airplanecomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/airplanecomponent/src/main/resources/base/element/string.json diff --git a/features/airplanecomponent/src/main/resources/base/media/airplane.svg b/systemui4merge/features/airplanecomponent/src/main/resources/base/media/airplane.svg similarity index 100% rename from features/airplanecomponent/src/main/resources/base/media/airplane.svg rename to systemui4merge/features/airplanecomponent/src/main/resources/base/media/airplane.svg diff --git a/features/airplanecomponent/src/main/resources/base/media/airplane_d.svg b/systemui4merge/features/airplanecomponent/src/main/resources/base/media/airplane_d.svg similarity index 100% rename from features/airplanecomponent/src/main/resources/base/media/airplane_d.svg rename to systemui4merge/features/airplanecomponent/src/main/resources/base/media/airplane_d.svg diff --git a/features/airplanecomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/airplanecomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/airplanecomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/airplanecomponent/src/main/resources/en_US/element/string.json diff --git a/features/airplanecomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/airplanecomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/airplanecomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/airplanecomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/autorotatecomponent/build-profile.json5 b/systemui4merge/features/autorotatecomponent/build-profile.json5 similarity index 100% rename from features/autorotatecomponent/build-profile.json5 rename to systemui4merge/features/autorotatecomponent/build-profile.json5 diff --git a/features/autorotatecomponent/hvigorfile.js b/systemui4merge/features/autorotatecomponent/hvigorfile.js similarity index 100% rename from features/autorotatecomponent/hvigorfile.js rename to systemui4merge/features/autorotatecomponent/hvigorfile.js diff --git a/features/autorotatecomponent/package-lock.json b/systemui4merge/features/autorotatecomponent/package-lock.json similarity index 100% rename from features/autorotatecomponent/package-lock.json rename to systemui4merge/features/autorotatecomponent/package-lock.json diff --git a/features/autorotatecomponent/package.json b/systemui4merge/features/autorotatecomponent/package.json similarity index 100% rename from features/autorotatecomponent/package.json rename to systemui4merge/features/autorotatecomponent/package.json diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts b/systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts rename to systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts similarity index 100% rename from features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts rename to systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets b/systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets similarity index 100% rename from features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets rename to systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts b/systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts similarity index 100% rename from features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts rename to systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts diff --git a/features/autorotatecomponent/src/main/module.json5 b/systemui4merge/features/autorotatecomponent/src/main/module.json5 similarity index 100% rename from features/autorotatecomponent/src/main/module.json5 rename to systemui4merge/features/autorotatecomponent/src/main/module.json5 diff --git a/features/autorotatecomponent/src/main/resources/base/element/string.json b/systemui4merge/features/autorotatecomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/autorotatecomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/autorotatecomponent/src/main/resources/base/element/string.json diff --git a/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg b/systemui4merge/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg similarity index 100% rename from features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg rename to systemui4merge/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg diff --git a/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg b/systemui4merge/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg similarity index 100% rename from features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg rename to systemui4merge/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg diff --git a/features/autorotatecomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/autorotatecomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/autorotatecomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/autorotatecomponent/src/main/resources/en_US/element/string.json diff --git a/features/autorotatecomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/autorotatecomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/autorotatecomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/autorotatecomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/batterycomponent/build-profile.json5 b/systemui4merge/features/batterycomponent/build-profile.json5 similarity index 100% rename from features/batterycomponent/build-profile.json5 rename to systemui4merge/features/batterycomponent/build-profile.json5 diff --git a/features/batterycomponent/hvigorfile.js b/systemui4merge/features/batterycomponent/hvigorfile.js similarity index 100% rename from features/batterycomponent/hvigorfile.js rename to systemui4merge/features/batterycomponent/hvigorfile.js diff --git a/features/batterycomponent/package-lock.json b/systemui4merge/features/batterycomponent/package-lock.json similarity index 100% rename from features/batterycomponent/package-lock.json rename to systemui4merge/features/batterycomponent/package-lock.json diff --git a/features/batterycomponent/package.json b/systemui4merge/features/batterycomponent/package.json similarity index 100% rename from features/batterycomponent/package.json rename to systemui4merge/features/batterycomponent/package.json diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/systemui4merge/features/batterycomponent/src/main/ets/default/batteryModel.ts similarity index 100% rename from features/batterycomponent/src/main/ets/default/batteryModel.ts rename to systemui4merge/features/batterycomponent/src/main/ets/default/batteryModel.ts diff --git a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts b/systemui4merge/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 100% rename from features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts rename to systemui4merge/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts diff --git a/features/batterycomponent/src/main/ets/default/common/constants.ts b/systemui4merge/features/batterycomponent/src/main/ets/default/common/constants.ts similarity index 100% rename from features/batterycomponent/src/main/ets/default/common/constants.ts rename to systemui4merge/features/batterycomponent/src/main/ets/default/common/constants.ts diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/systemui4merge/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets similarity index 100% rename from features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets rename to systemui4merge/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/systemui4merge/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets similarity index 100% rename from features/batterycomponent/src/main/ets/default/pages/batteryPic.ets rename to systemui4merge/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets diff --git a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/systemui4merge/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets similarity index 100% rename from features/batterycomponent/src/main/ets/default/pages/batterySoc.ets rename to systemui4merge/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets diff --git a/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts b/systemui4merge/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts similarity index 100% rename from features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts rename to systemui4merge/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts diff --git a/features/batterycomponent/src/main/module.json5 b/systemui4merge/features/batterycomponent/src/main/module.json5 similarity index 100% rename from features/batterycomponent/src/main/module.json5 rename to systemui4merge/features/batterycomponent/src/main/module.json5 diff --git a/features/batterycomponent/src/main/resources/base/element/color.json b/systemui4merge/features/batterycomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/batterycomponent/src/main/resources/base/element/color.json rename to systemui4merge/features/batterycomponent/src/main/resources/base/element/color.json diff --git a/features/batterycomponent/src/main/resources/base/element/float.json b/systemui4merge/features/batterycomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/batterycomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/batterycomponent/src/main/resources/base/element/float.json diff --git a/features/batterycomponent/src/main/resources/base/element/string.json b/systemui4merge/features/batterycomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/batterycomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/batterycomponent/src/main/resources/base/element/string.json diff --git a/features/batterycomponent/src/main/resources/base/media/icon.png b/systemui4merge/features/batterycomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/batterycomponent/src/main/resources/base/media/icon.png rename to systemui4merge/features/batterycomponent/src/main/resources/base/media/icon.png diff --git a/features/batterycomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/batterycomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/batterycomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/batterycomponent/src/main/resources/en_US/element/string.json diff --git a/features/batterycomponent/src/main/resources/phone/element/float.json b/systemui4merge/features/batterycomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/batterycomponent/src/main/resources/phone/element/float.json rename to systemui4merge/features/batterycomponent/src/main/resources/phone/element/float.json diff --git a/features/batterycomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/batterycomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/batterycomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/batterycomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/bluetoothcomponent/build-profile.json5 b/systemui4merge/features/bluetoothcomponent/build-profile.json5 similarity index 100% rename from features/bluetoothcomponent/build-profile.json5 rename to systemui4merge/features/bluetoothcomponent/build-profile.json5 diff --git a/features/bluetoothcomponent/hvigorfile.js b/systemui4merge/features/bluetoothcomponent/hvigorfile.js similarity index 100% rename from features/bluetoothcomponent/hvigorfile.js rename to systemui4merge/features/bluetoothcomponent/hvigorfile.js diff --git a/features/bluetoothcomponent/package-lock.json b/systemui4merge/features/bluetoothcomponent/package-lock.json similarity index 100% rename from features/bluetoothcomponent/package-lock.json rename to systemui4merge/features/bluetoothcomponent/package-lock.json diff --git a/features/bluetoothcomponent/package.json b/systemui4merge/features/bluetoothcomponent/package.json similarity index 100% rename from features/bluetoothcomponent/package.json rename to systemui4merge/features/bluetoothcomponent/package.json diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts b/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts rename to systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 100% rename from features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts similarity index 100% rename from features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts rename to systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets b/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets similarity index 100% rename from features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets rename to systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets b/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets similarity index 100% rename from features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets rename to systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts b/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts similarity index 100% rename from features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts rename to systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts diff --git a/features/bluetoothcomponent/src/main/module.json5 b/systemui4merge/features/bluetoothcomponent/src/main/module.json5 similarity index 100% rename from features/bluetoothcomponent/src/main/module.json5 rename to systemui4merge/features/bluetoothcomponent/src/main/module.json5 diff --git a/features/bluetoothcomponent/src/main/resources/base/element/float.json b/systemui4merge/features/bluetoothcomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/bluetoothcomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/bluetoothcomponent/src/main/resources/base/element/float.json diff --git a/features/bluetoothcomponent/src/main/resources/base/element/string.json b/systemui4merge/features/bluetoothcomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/bluetoothcomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/bluetoothcomponent/src/main/resources/base/element/string.json diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg b/systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg similarity index 100% rename from features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg rename to systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg b/systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg similarity index 100% rename from features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg rename to systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg b/systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg similarity index 100% rename from features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg rename to systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg b/systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg similarity index 100% rename from features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg rename to systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg diff --git a/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg b/systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg similarity index 100% rename from features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg rename to systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg diff --git a/features/bluetoothcomponent/src/main/resources/base/media/icon.png b/systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/bluetoothcomponent/src/main/resources/base/media/icon.png rename to systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/icon.png diff --git a/features/bluetoothcomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/bluetoothcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/bluetoothcomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/bluetoothcomponent/src/main/resources/en_US/element/string.json diff --git a/features/bluetoothcomponent/src/main/resources/phone/element/float.json b/systemui4merge/features/bluetoothcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/bluetoothcomponent/src/main/resources/phone/element/float.json rename to systemui4merge/features/bluetoothcomponent/src/main/resources/phone/element/float.json diff --git a/features/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg b/systemui4merge/features/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg similarity index 100% rename from features/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg rename to systemui4merge/features/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg diff --git a/features/bluetoothcomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/bluetoothcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/bluetoothcomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/bluetoothcomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/brightnesscomponent/build-profile.json5 b/systemui4merge/features/brightnesscomponent/build-profile.json5 similarity index 100% rename from features/brightnesscomponent/build-profile.json5 rename to systemui4merge/features/brightnesscomponent/build-profile.json5 diff --git a/features/brightnesscomponent/hvigorfile.js b/systemui4merge/features/brightnesscomponent/hvigorfile.js similarity index 100% rename from features/brightnesscomponent/hvigorfile.js rename to systemui4merge/features/brightnesscomponent/hvigorfile.js diff --git a/features/brightnesscomponent/package-lock.json b/systemui4merge/features/brightnesscomponent/package-lock.json similarity index 100% rename from features/brightnesscomponent/package-lock.json rename to systemui4merge/features/brightnesscomponent/package-lock.json diff --git a/features/brightnesscomponent/package.json b/systemui4merge/features/brightnesscomponent/package.json similarity index 100% rename from features/brightnesscomponent/package.json rename to systemui4merge/features/brightnesscomponent/package.json diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/systemui4merge/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts similarity index 100% rename from features/brightnesscomponent/src/main/ets/default/brightnessManager.ts rename to systemui4merge/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts diff --git a/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts b/systemui4merge/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 100% rename from features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts rename to systemui4merge/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts diff --git a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets b/systemui4merge/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets similarity index 100% rename from features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets rename to systemui4merge/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets diff --git a/features/brightnesscomponent/src/main/module.json5 b/systemui4merge/features/brightnesscomponent/src/main/module.json5 similarity index 100% rename from features/brightnesscomponent/src/main/module.json5 rename to systemui4merge/features/brightnesscomponent/src/main/module.json5 diff --git a/features/brightnesscomponent/src/main/resources/base/element/color.json b/systemui4merge/features/brightnesscomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/brightnesscomponent/src/main/resources/base/element/color.json rename to systemui4merge/features/brightnesscomponent/src/main/resources/base/element/color.json diff --git a/features/brightnesscomponent/src/main/resources/base/element/float.json b/systemui4merge/features/brightnesscomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/brightnesscomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/brightnesscomponent/src/main/resources/base/element/float.json diff --git a/features/brightnesscomponent/src/main/resources/base/element/string.json b/systemui4merge/features/brightnesscomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/brightnesscomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/brightnesscomponent/src/main/resources/base/element/string.json diff --git a/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg b/systemui4merge/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg similarity index 100% rename from features/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg rename to systemui4merge/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg diff --git a/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg b/systemui4merge/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg similarity index 100% rename from features/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg rename to systemui4merge/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg diff --git a/features/brightnesscomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/brightnesscomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/brightnesscomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/brightnesscomponent/src/main/resources/en_US/element/string.json diff --git a/features/brightnesscomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/brightnesscomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/brightnesscomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/brightnesscomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/capsulecomponent/build-profile.json5 b/systemui4merge/features/capsulecomponent/build-profile.json5 similarity index 100% rename from features/capsulecomponent/build-profile.json5 rename to systemui4merge/features/capsulecomponent/build-profile.json5 diff --git a/features/capsulecomponent/hvigorfile.js b/systemui4merge/features/capsulecomponent/hvigorfile.js similarity index 100% rename from features/capsulecomponent/hvigorfile.js rename to systemui4merge/features/capsulecomponent/hvigorfile.js diff --git a/features/capsulecomponent/package-lock.json b/systemui4merge/features/capsulecomponent/package-lock.json similarity index 100% rename from features/capsulecomponent/package-lock.json rename to systemui4merge/features/capsulecomponent/package-lock.json diff --git a/features/capsulecomponent/package.json b/systemui4merge/features/capsulecomponent/package.json similarity index 100% rename from features/capsulecomponent/package.json rename to systemui4merge/features/capsulecomponent/package.json diff --git a/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts b/systemui4merge/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 100% rename from features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts rename to systemui4merge/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts diff --git a/features/capsulecomponent/src/main/ets/default/common/constants.ts b/systemui4merge/features/capsulecomponent/src/main/ets/default/common/constants.ts similarity index 100% rename from features/capsulecomponent/src/main/ets/default/common/constants.ts rename to systemui4merge/features/capsulecomponent/src/main/ets/default/common/constants.ts diff --git a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts b/systemui4merge/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts similarity index 100% rename from features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts rename to systemui4merge/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/systemui4merge/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets similarity index 100% rename from features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets rename to systemui4merge/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/systemui4merge/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts similarity index 100% rename from features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts rename to systemui4merge/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts diff --git a/features/capsulecomponent/src/main/module.json5 b/systemui4merge/features/capsulecomponent/src/main/module.json5 similarity index 100% rename from features/capsulecomponent/src/main/module.json5 rename to systemui4merge/features/capsulecomponent/src/main/module.json5 diff --git a/features/capsulecomponent/src/main/resources/base/element/color.json b/systemui4merge/features/capsulecomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/capsulecomponent/src/main/resources/base/element/color.json rename to systemui4merge/features/capsulecomponent/src/main/resources/base/element/color.json diff --git a/features/capsulecomponent/src/main/resources/base/element/float.json b/systemui4merge/features/capsulecomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/capsulecomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/capsulecomponent/src/main/resources/base/element/float.json diff --git a/features/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg b/systemui4merge/features/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg similarity index 100% rename from features/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg rename to systemui4merge/features/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg diff --git a/features/capsulecomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/capsulecomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/capsulecomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/capsulecomponent/src/main/resources/en_US/element/string.json diff --git a/features/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg b/systemui4merge/features/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg similarity index 100% rename from features/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg rename to systemui4merge/features/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg diff --git a/features/capsulecomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/capsulecomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/capsulecomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/capsulecomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/clockcomponent/build-profile.json5 b/systemui4merge/features/clockcomponent/build-profile.json5 similarity index 100% rename from features/clockcomponent/build-profile.json5 rename to systemui4merge/features/clockcomponent/build-profile.json5 diff --git a/features/clockcomponent/hvigorfile.js b/systemui4merge/features/clockcomponent/hvigorfile.js similarity index 100% rename from features/clockcomponent/hvigorfile.js rename to systemui4merge/features/clockcomponent/hvigorfile.js diff --git a/features/clockcomponent/package-lock.json b/systemui4merge/features/clockcomponent/package-lock.json similarity index 100% rename from features/clockcomponent/package-lock.json rename to systemui4merge/features/clockcomponent/package-lock.json diff --git a/features/clockcomponent/package.json b/systemui4merge/features/clockcomponent/package.json similarity index 100% rename from features/clockcomponent/package.json rename to systemui4merge/features/clockcomponent/package.json diff --git a/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts b/systemui4merge/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 100% rename from features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts rename to systemui4merge/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/systemui4merge/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets similarity index 100% rename from features/clockcomponent/src/main/ets/default/pages/clockIcon.ets rename to systemui4merge/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets diff --git a/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts b/systemui4merge/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts similarity index 100% rename from features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts rename to systemui4merge/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts diff --git a/features/clockcomponent/src/main/module.json5 b/systemui4merge/features/clockcomponent/src/main/module.json5 similarity index 100% rename from features/clockcomponent/src/main/module.json5 rename to systemui4merge/features/clockcomponent/src/main/module.json5 diff --git a/features/clockcomponent/src/main/resources/base/element/color.json b/systemui4merge/features/clockcomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/clockcomponent/src/main/resources/base/element/color.json rename to systemui4merge/features/clockcomponent/src/main/resources/base/element/color.json diff --git a/features/clockcomponent/src/main/resources/base/element/float.json b/systemui4merge/features/clockcomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/clockcomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/clockcomponent/src/main/resources/base/element/float.json diff --git a/features/clockcomponent/src/main/resources/base/element/string.json b/systemui4merge/features/clockcomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/clockcomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/clockcomponent/src/main/resources/base/element/string.json diff --git a/features/clockcomponent/src/main/resources/base/media/icon.png b/systemui4merge/features/clockcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/clockcomponent/src/main/resources/base/media/icon.png rename to systemui4merge/features/clockcomponent/src/main/resources/base/media/icon.png diff --git a/features/clockcomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/clockcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/clockcomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/clockcomponent/src/main/resources/en_US/element/string.json diff --git a/features/clockcomponent/src/main/resources/phone/element/float.json b/systemui4merge/features/clockcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/clockcomponent/src/main/resources/phone/element/float.json rename to systemui4merge/features/clockcomponent/src/main/resources/phone/element/float.json diff --git a/features/clockcomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/clockcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/clockcomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/clockcomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/controlcentercomponent/build-profile.json5 b/systemui4merge/features/controlcentercomponent/build-profile.json5 similarity index 100% rename from features/controlcentercomponent/build-profile.json5 rename to systemui4merge/features/controlcentercomponent/build-profile.json5 diff --git a/features/controlcentercomponent/hvigorfile.js b/systemui4merge/features/controlcentercomponent/hvigorfile.js similarity index 100% rename from features/controlcentercomponent/hvigorfile.js rename to systemui4merge/features/controlcentercomponent/hvigorfile.js diff --git a/features/controlcentercomponent/package-lock.json b/systemui4merge/features/controlcentercomponent/package-lock.json similarity index 100% rename from features/controlcentercomponent/package-lock.json rename to systemui4merge/features/controlcentercomponent/package-lock.json diff --git a/features/controlcentercomponent/package.json b/systemui4merge/features/controlcentercomponent/package.json similarity index 100% rename from features/controlcentercomponent/package.json rename to systemui4merge/features/controlcentercomponent/package.json diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts similarity index 100% rename from features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts rename to systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts diff --git a/features/controlcentercomponent/src/main/module.json5 b/systemui4merge/features/controlcentercomponent/src/main/module.json5 similarity index 100% rename from features/controlcentercomponent/src/main/module.json5 rename to systemui4merge/features/controlcentercomponent/src/main/module.json5 diff --git a/features/controlcentercomponent/src/main/resources/base/element/color.json b/systemui4merge/features/controlcentercomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/controlcentercomponent/src/main/resources/base/element/color.json rename to systemui4merge/features/controlcentercomponent/src/main/resources/base/element/color.json diff --git a/features/controlcentercomponent/src/main/resources/base/element/float.json b/systemui4merge/features/controlcentercomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/controlcentercomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/controlcentercomponent/src/main/resources/base/element/float.json diff --git a/features/controlcentercomponent/src/main/resources/base/element/string.json b/systemui4merge/features/controlcentercomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/controlcentercomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/controlcentercomponent/src/main/resources/base/element/string.json diff --git a/features/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg b/systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg similarity index 100% rename from features/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg rename to systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg diff --git a/features/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg b/systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg similarity index 100% rename from features/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg rename to systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg diff --git a/features/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg b/systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg similarity index 100% rename from features/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg rename to systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg diff --git a/features/controlcentercomponent/src/main/resources/base/media/ic_settings.png b/systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_settings.png similarity index 100% rename from features/controlcentercomponent/src/main/resources/base/media/ic_settings.png rename to systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_settings.png diff --git a/features/controlcentercomponent/src/main/resources/base/media/icon.png b/systemui4merge/features/controlcentercomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/controlcentercomponent/src/main/resources/base/media/icon.png rename to systemui4merge/features/controlcentercomponent/src/main/resources/base/media/icon.png diff --git a/features/controlcentercomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/controlcentercomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/controlcentercomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/controlcentercomponent/src/main/resources/en_US/element/string.json diff --git a/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/controlcentercomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/locationcomponent/build-profile.json5 b/systemui4merge/features/locationcomponent/build-profile.json5 similarity index 100% rename from features/locationcomponent/build-profile.json5 rename to systemui4merge/features/locationcomponent/build-profile.json5 diff --git a/features/locationcomponent/hvigorfile.js b/systemui4merge/features/locationcomponent/hvigorfile.js similarity index 100% rename from features/locationcomponent/hvigorfile.js rename to systemui4merge/features/locationcomponent/hvigorfile.js diff --git a/features/locationcomponent/package-lock.json b/systemui4merge/features/locationcomponent/package-lock.json similarity index 100% rename from features/locationcomponent/package-lock.json rename to systemui4merge/features/locationcomponent/package-lock.json diff --git a/features/locationcomponent/package.json b/systemui4merge/features/locationcomponent/package.json similarity index 100% rename from features/locationcomponent/package.json rename to systemui4merge/features/locationcomponent/package.json diff --git a/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts b/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts rename to systemui4merge/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 100% rename from features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to systemui4merge/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts diff --git a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts b/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts similarity index 100% rename from features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts rename to systemui4merge/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets b/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets similarity index 100% rename from features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets rename to systemui4merge/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets b/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets similarity index 100% rename from features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets rename to systemui4merge/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets diff --git a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts b/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts similarity index 100% rename from features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts rename to systemui4merge/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts diff --git a/features/locationcomponent/src/main/module.json5 b/systemui4merge/features/locationcomponent/src/main/module.json5 similarity index 100% rename from features/locationcomponent/src/main/module.json5 rename to systemui4merge/features/locationcomponent/src/main/module.json5 diff --git a/features/locationcomponent/src/main/resources/base/element/float.json b/systemui4merge/features/locationcomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/locationcomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/locationcomponent/src/main/resources/base/element/float.json diff --git a/features/locationcomponent/src/main/resources/base/element/string.json b/systemui4merge/features/locationcomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/locationcomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/locationcomponent/src/main/resources/base/element/string.json diff --git a/features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg b/systemui4merge/features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg similarity index 100% rename from features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg rename to systemui4merge/features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg diff --git a/features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg b/systemui4merge/features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg similarity index 100% rename from features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg rename to systemui4merge/features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg diff --git a/features/locationcomponent/src/main/resources/base/media/icon.png b/systemui4merge/features/locationcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/locationcomponent/src/main/resources/base/media/icon.png rename to systemui4merge/features/locationcomponent/src/main/resources/base/media/icon.png diff --git a/features/locationcomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/locationcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/locationcomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/locationcomponent/src/main/resources/en_US/element/string.json diff --git a/features/locationcomponent/src/main/resources/phone/element/float.json b/systemui4merge/features/locationcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/locationcomponent/src/main/resources/phone/element/float.json rename to systemui4merge/features/locationcomponent/src/main/resources/phone/element/float.json diff --git a/features/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg b/systemui4merge/features/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg similarity index 100% rename from features/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg rename to systemui4merge/features/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg diff --git a/features/locationcomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/locationcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/locationcomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/locationcomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/managementcomponent/build-profile.json5 b/systemui4merge/features/managementcomponent/build-profile.json5 similarity index 100% rename from features/managementcomponent/build-profile.json5 rename to systemui4merge/features/managementcomponent/build-profile.json5 diff --git a/features/managementcomponent/hvigorfile.js b/systemui4merge/features/managementcomponent/hvigorfile.js similarity index 100% rename from features/managementcomponent/hvigorfile.js rename to systemui4merge/features/managementcomponent/hvigorfile.js diff --git a/features/managementcomponent/package-lock.json b/systemui4merge/features/managementcomponent/package-lock.json similarity index 100% rename from features/managementcomponent/package-lock.json rename to systemui4merge/features/managementcomponent/package-lock.json diff --git a/features/managementcomponent/package.json b/systemui4merge/features/managementcomponent/package.json similarity index 100% rename from features/managementcomponent/package.json rename to systemui4merge/features/managementcomponent/package.json diff --git a/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/common/constants.ts rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts b/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts similarity index 100% rename from features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts rename to systemui4merge/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts diff --git a/features/managementcomponent/src/main/module.json5 b/systemui4merge/features/managementcomponent/src/main/module.json5 similarity index 100% rename from features/managementcomponent/src/main/module.json5 rename to systemui4merge/features/managementcomponent/src/main/module.json5 diff --git a/features/managementcomponent/src/main/resources/base/element/color.json b/systemui4merge/features/managementcomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/managementcomponent/src/main/resources/base/element/color.json rename to systemui4merge/features/managementcomponent/src/main/resources/base/element/color.json diff --git a/features/managementcomponent/src/main/resources/base/element/float.json b/systemui4merge/features/managementcomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/managementcomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/managementcomponent/src/main/resources/base/element/float.json diff --git a/features/managementcomponent/src/main/resources/base/element/string.json b/systemui4merge/features/managementcomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/managementcomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/managementcomponent/src/main/resources/base/element/string.json diff --git a/features/managementcomponent/src/main/resources/base/media/ic_back.svg b/systemui4merge/features/managementcomponent/src/main/resources/base/media/ic_back.svg similarity index 100% rename from features/managementcomponent/src/main/resources/base/media/ic_back.svg rename to systemui4merge/features/managementcomponent/src/main/resources/base/media/ic_back.svg diff --git a/features/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg b/systemui4merge/features/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg similarity index 100% rename from features/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg rename to systemui4merge/features/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg diff --git a/features/managementcomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/managementcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/managementcomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/managementcomponent/src/main/resources/en_US/element/string.json diff --git a/features/managementcomponent/src/main/resources/phone/element/color.json b/systemui4merge/features/managementcomponent/src/main/resources/phone/element/color.json similarity index 100% rename from features/managementcomponent/src/main/resources/phone/element/color.json rename to systemui4merge/features/managementcomponent/src/main/resources/phone/element/color.json diff --git a/features/managementcomponent/src/main/resources/phone/element/float.json b/systemui4merge/features/managementcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/managementcomponent/src/main/resources/phone/element/float.json rename to systemui4merge/features/managementcomponent/src/main/resources/phone/element/float.json diff --git a/features/managementcomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/managementcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/managementcomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/managementcomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/navigationservice/build-profile.json5 b/systemui4merge/features/navigationservice/build-profile.json5 similarity index 100% rename from features/navigationservice/build-profile.json5 rename to systemui4merge/features/navigationservice/build-profile.json5 diff --git a/features/navigationservice/hvigorfile.js b/systemui4merge/features/navigationservice/hvigorfile.js similarity index 100% rename from features/navigationservice/hvigorfile.js rename to systemui4merge/features/navigationservice/hvigorfile.js diff --git a/features/navigationservice/package-lock.json b/systemui4merge/features/navigationservice/package-lock.json similarity index 100% rename from features/navigationservice/package-lock.json rename to systemui4merge/features/navigationservice/package-lock.json diff --git a/features/navigationservice/package.json b/systemui4merge/features/navigationservice/package.json similarity index 100% rename from features/navigationservice/package.json rename to systemui4merge/features/navigationservice/package.json diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ts b/systemui4merge/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ts similarity index 100% rename from features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ts rename to systemui4merge/features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager.ts diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts b/systemui4merge/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts similarity index 100% rename from features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts rename to systemui4merge/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts b/systemui4merge/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts similarity index 100% rename from features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts rename to systemui4merge/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts b/systemui4merge/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts similarity index 100% rename from features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts rename to systemui4merge/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/constants.ts diff --git a/features/navigationservice/src/main/module.json5 b/systemui4merge/features/navigationservice/src/main/module.json5 similarity index 100% rename from features/navigationservice/src/main/module.json5 rename to systemui4merge/features/navigationservice/src/main/module.json5 diff --git a/features/navigationservice/src/main/resources/base/element/string.json b/systemui4merge/features/navigationservice/src/main/resources/base/element/string.json similarity index 100% rename from features/navigationservice/src/main/resources/base/element/string.json rename to systemui4merge/features/navigationservice/src/main/resources/base/element/string.json diff --git a/features/nfccomponent/build-profile.json5 b/systemui4merge/features/nfccomponent/build-profile.json5 similarity index 100% rename from features/nfccomponent/build-profile.json5 rename to systemui4merge/features/nfccomponent/build-profile.json5 diff --git a/features/nfccomponent/hvigorfile.js b/systemui4merge/features/nfccomponent/hvigorfile.js similarity index 100% rename from features/nfccomponent/hvigorfile.js rename to systemui4merge/features/nfccomponent/hvigorfile.js diff --git a/features/nfccomponent/package-lock.json b/systemui4merge/features/nfccomponent/package-lock.json similarity index 100% rename from features/nfccomponent/package-lock.json rename to systemui4merge/features/nfccomponent/package-lock.json diff --git a/features/nfccomponent/package.json b/systemui4merge/features/nfccomponent/package.json similarity index 100% rename from features/nfccomponent/package.json rename to systemui4merge/features/nfccomponent/package.json diff --git a/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 100% rename from features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to systemui4merge/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts diff --git a/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts b/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts similarity index 100% rename from features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts rename to systemui4merge/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts diff --git a/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets b/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets similarity index 100% rename from features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets rename to systemui4merge/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets diff --git a/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets b/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets similarity index 100% rename from features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets rename to systemui4merge/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets diff --git a/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts b/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts similarity index 100% rename from features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts rename to systemui4merge/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts diff --git a/features/nfccomponent/src/main/module.json5 b/systemui4merge/features/nfccomponent/src/main/module.json5 similarity index 100% rename from features/nfccomponent/src/main/module.json5 rename to systemui4merge/features/nfccomponent/src/main/module.json5 diff --git a/features/nfccomponent/src/main/resources/base/element/color.json b/systemui4merge/features/nfccomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/nfccomponent/src/main/resources/base/element/color.json rename to systemui4merge/features/nfccomponent/src/main/resources/base/element/color.json diff --git a/features/nfccomponent/src/main/resources/base/element/float.json b/systemui4merge/features/nfccomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/nfccomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/nfccomponent/src/main/resources/base/element/float.json diff --git a/features/nfccomponent/src/main/resources/base/element/string.json b/systemui4merge/features/nfccomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/nfccomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/nfccomponent/src/main/resources/base/element/string.json diff --git a/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg b/systemui4merge/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg similarity index 100% rename from features/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg rename to systemui4merge/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg diff --git a/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg b/systemui4merge/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg similarity index 100% rename from features/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg rename to systemui4merge/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg diff --git a/features/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg b/systemui4merge/features/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg similarity index 100% rename from features/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg rename to systemui4merge/features/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg diff --git a/features/nfccomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/nfccomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/nfccomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/nfccomponent/src/main/resources/en_US/element/string.json diff --git a/features/nfccomponent/src/main/resources/phone/element/float.json b/systemui4merge/features/nfccomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/nfccomponent/src/main/resources/phone/element/float.json rename to systemui4merge/features/nfccomponent/src/main/resources/phone/element/float.json diff --git a/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg b/systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg similarity index 100% rename from features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg rename to systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg diff --git a/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg b/systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg similarity index 100% rename from features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg rename to systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg diff --git a/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg b/systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg similarity index 100% rename from features/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg rename to systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg diff --git a/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg b/systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from features/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg rename to systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg diff --git a/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg b/systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg similarity index 100% rename from features/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg rename to systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg diff --git a/features/nfccomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/nfccomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/nfccomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/nfccomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/noticeitem/build-profile.json5 b/systemui4merge/features/noticeitem/build-profile.json5 similarity index 100% rename from features/noticeitem/build-profile.json5 rename to systemui4merge/features/noticeitem/build-profile.json5 diff --git a/features/noticeitem/hvigorfile.js b/systemui4merge/features/noticeitem/hvigorfile.js similarity index 100% rename from features/noticeitem/hvigorfile.js rename to systemui4merge/features/noticeitem/hvigorfile.js diff --git a/features/noticeitem/package-lock.json b/systemui4merge/features/noticeitem/package-lock.json similarity index 100% rename from features/noticeitem/package-lock.json rename to systemui4merge/features/noticeitem/package-lock.json diff --git a/features/noticeitem/package.json b/systemui4merge/features/noticeitem/package.json similarity index 100% rename from features/noticeitem/package.json rename to systemui4merge/features/noticeitem/package.json diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts b/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts rename to systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts diff --git a/features/noticeitem/src/main/module.json5 b/systemui4merge/features/noticeitem/src/main/module.json5 similarity index 100% rename from features/noticeitem/src/main/module.json5 rename to systemui4merge/features/noticeitem/src/main/module.json5 diff --git a/features/noticeitem/src/main/resources/base/element/color.json b/systemui4merge/features/noticeitem/src/main/resources/base/element/color.json similarity index 100% rename from features/noticeitem/src/main/resources/base/element/color.json rename to systemui4merge/features/noticeitem/src/main/resources/base/element/color.json diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/systemui4merge/features/noticeitem/src/main/resources/base/element/float.json similarity index 100% rename from features/noticeitem/src/main/resources/base/element/float.json rename to systemui4merge/features/noticeitem/src/main/resources/base/element/float.json diff --git a/features/noticeitem/src/main/resources/base/element/string.json b/systemui4merge/features/noticeitem/src/main/resources/base/element/string.json similarity index 100% rename from features/noticeitem/src/main/resources/base/element/string.json rename to systemui4merge/features/noticeitem/src/main/resources/base/element/string.json diff --git a/features/noticeitem/src/main/resources/base/media/ic_close.svg b/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_close.svg similarity index 100% rename from features/noticeitem/src/main/resources/base/media/ic_close.svg rename to systemui4merge/features/noticeitem/src/main/resources/base/media/ic_close.svg diff --git a/features/noticeitem/src/main/resources/base/media/ic_notification_down.png b/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_notification_down.png similarity index 100% rename from features/noticeitem/src/main/resources/base/media/ic_notification_down.png rename to systemui4merge/features/noticeitem/src/main/resources/base/media/ic_notification_down.png diff --git a/features/noticeitem/src/main/resources/base/media/ic_notification_up.png b/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_notification_up.png similarity index 100% rename from features/noticeitem/src/main/resources/base/media/ic_notification_up.png rename to systemui4merge/features/noticeitem/src/main/resources/base/media/ic_notification_up.png diff --git a/features/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg b/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg similarity index 100% rename from features/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg rename to systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg diff --git a/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg b/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg similarity index 100% rename from features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg rename to systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg diff --git a/features/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg b/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg similarity index 100% rename from features/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg rename to systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg diff --git a/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg b/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg similarity index 100% rename from features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg rename to systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg diff --git a/features/noticeitem/src/main/resources/base/media/send.svg b/systemui4merge/features/noticeitem/src/main/resources/base/media/send.svg similarity index 100% rename from features/noticeitem/src/main/resources/base/media/send.svg rename to systemui4merge/features/noticeitem/src/main/resources/base/media/send.svg diff --git a/features/noticeitem/src/main/resources/en_US/element/string.json b/systemui4merge/features/noticeitem/src/main/resources/en_US/element/string.json similarity index 100% rename from features/noticeitem/src/main/resources/en_US/element/string.json rename to systemui4merge/features/noticeitem/src/main/resources/en_US/element/string.json diff --git a/features/noticeitem/src/main/resources/phone/element/color.json b/systemui4merge/features/noticeitem/src/main/resources/phone/element/color.json similarity index 100% rename from features/noticeitem/src/main/resources/phone/element/color.json rename to systemui4merge/features/noticeitem/src/main/resources/phone/element/color.json diff --git a/features/noticeitem/src/main/resources/phone/element/float.json b/systemui4merge/features/noticeitem/src/main/resources/phone/element/float.json similarity index 100% rename from features/noticeitem/src/main/resources/phone/element/float.json rename to systemui4merge/features/noticeitem/src/main/resources/phone/element/float.json diff --git a/features/noticeitem/src/main/resources/rawfile/notificationConfig.json b/systemui4merge/features/noticeitem/src/main/resources/rawfile/notificationConfig.json similarity index 100% rename from features/noticeitem/src/main/resources/rawfile/notificationConfig.json rename to systemui4merge/features/noticeitem/src/main/resources/rawfile/notificationConfig.json diff --git a/features/noticeitem/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/noticeitem/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/noticeitem/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/noticeitem/src/main/resources/zh_CN/element/string.json diff --git a/features/ringmodecomponent/build-profile.json5 b/systemui4merge/features/ringmodecomponent/build-profile.json5 similarity index 100% rename from features/ringmodecomponent/build-profile.json5 rename to systemui4merge/features/ringmodecomponent/build-profile.json5 diff --git a/features/ringmodecomponent/hvigorfile.js b/systemui4merge/features/ringmodecomponent/hvigorfile.js similarity index 100% rename from features/ringmodecomponent/hvigorfile.js rename to systemui4merge/features/ringmodecomponent/hvigorfile.js diff --git a/features/ringmodecomponent/package-lock.json b/systemui4merge/features/ringmodecomponent/package-lock.json similarity index 100% rename from features/ringmodecomponent/package-lock.json rename to systemui4merge/features/ringmodecomponent/package-lock.json diff --git a/features/ringmodecomponent/package.json b/systemui4merge/features/ringmodecomponent/package.json similarity index 100% rename from features/ringmodecomponent/package.json rename to systemui4merge/features/ringmodecomponent/package.json diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts b/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts rename to systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 100% rename from features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts b/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts similarity index 100% rename from features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts rename to systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets b/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets similarity index 100% rename from features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets rename to systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets b/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets similarity index 100% rename from features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets rename to systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts b/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts similarity index 100% rename from features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts rename to systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts diff --git a/features/ringmodecomponent/src/main/module.json5 b/systemui4merge/features/ringmodecomponent/src/main/module.json5 similarity index 100% rename from features/ringmodecomponent/src/main/module.json5 rename to systemui4merge/features/ringmodecomponent/src/main/module.json5 diff --git a/features/ringmodecomponent/src/main/resources/base/element/color.json b/systemui4merge/features/ringmodecomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/ringmodecomponent/src/main/resources/base/element/color.json rename to systemui4merge/features/ringmodecomponent/src/main/resources/base/element/color.json diff --git a/features/ringmodecomponent/src/main/resources/base/element/float.json b/systemui4merge/features/ringmodecomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/ringmodecomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/ringmodecomponent/src/main/resources/base/element/float.json diff --git a/features/ringmodecomponent/src/main/resources/base/element/string.json b/systemui4merge/features/ringmodecomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/ringmodecomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/ringmodecomponent/src/main/resources/base/element/string.json diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg b/systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg similarity index 100% rename from features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg rename to systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg b/systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg similarity index 100% rename from features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg rename to systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg b/systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg similarity index 100% rename from features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg rename to systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg b/systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg rename to systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg diff --git a/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg b/systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg similarity index 100% rename from features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg rename to systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg diff --git a/features/ringmodecomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/ringmodecomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/ringmodecomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/ringmodecomponent/src/main/resources/en_US/element/string.json diff --git a/features/ringmodecomponent/src/main/resources/phone/element/float.json b/systemui4merge/features/ringmodecomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/ringmodecomponent/src/main/resources/phone/element/float.json rename to systemui4merge/features/ringmodecomponent/src/main/resources/phone/element/float.json diff --git a/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg b/systemui4merge/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg rename to systemui4merge/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg diff --git a/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg b/systemui4merge/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg similarity index 100% rename from features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg rename to systemui4merge/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg diff --git a/features/ringmodecomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/ringmodecomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/ringmodecomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/ringmodecomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/signalcomponent/build-profile.json5 b/systemui4merge/features/signalcomponent/build-profile.json5 similarity index 100% rename from features/signalcomponent/build-profile.json5 rename to systemui4merge/features/signalcomponent/build-profile.json5 diff --git a/features/signalcomponent/hvigorfile.js b/systemui4merge/features/signalcomponent/hvigorfile.js similarity index 100% rename from features/signalcomponent/hvigorfile.js rename to systemui4merge/features/signalcomponent/hvigorfile.js diff --git a/features/signalcomponent/package-lock.json b/systemui4merge/features/signalcomponent/package-lock.json similarity index 100% rename from features/signalcomponent/package-lock.json rename to systemui4merge/features/signalcomponent/package-lock.json diff --git a/features/signalcomponent/package.json b/systemui4merge/features/signalcomponent/package.json similarity index 100% rename from features/signalcomponent/package.json rename to systemui4merge/features/signalcomponent/package.json diff --git a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts b/systemui4merge/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 100% rename from features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts rename to systemui4merge/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ts b/systemui4merge/features/signalcomponent/src/main/ets/default/common/constants.ts similarity index 100% rename from features/signalcomponent/src/main/ets/default/common/constants.ts rename to systemui4merge/features/signalcomponent/src/main/ets/default/common/constants.ts diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/systemui4merge/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets similarity index 100% rename from features/signalcomponent/src/main/ets/default/pages/signalIcon.ets rename to systemui4merge/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ts b/systemui4merge/features/signalcomponent/src/main/ets/default/signalModel.ts similarity index 100% rename from features/signalcomponent/src/main/ets/default/signalModel.ts rename to systemui4merge/features/signalcomponent/src/main/ets/default/signalModel.ts diff --git a/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts b/systemui4merge/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts similarity index 100% rename from features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts rename to systemui4merge/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts diff --git a/features/signalcomponent/src/main/module.json5 b/systemui4merge/features/signalcomponent/src/main/module.json5 similarity index 100% rename from features/signalcomponent/src/main/module.json5 rename to systemui4merge/features/signalcomponent/src/main/module.json5 diff --git a/features/signalcomponent/src/main/resources/base/element/color.json b/systemui4merge/features/signalcomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/signalcomponent/src/main/resources/base/element/color.json rename to systemui4merge/features/signalcomponent/src/main/resources/base/element/color.json diff --git a/features/signalcomponent/src/main/resources/base/element/float.json b/systemui4merge/features/signalcomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/signalcomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/signalcomponent/src/main/resources/base/element/float.json diff --git a/features/signalcomponent/src/main/resources/base/element/string.json b/systemui4merge/features/signalcomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/signalcomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/signalcomponent/src/main/resources/base/element/string.json diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg b/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg rename to systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg b/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg rename to systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg b/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg rename to systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg b/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg rename to systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg b/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg rename to systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg b/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg rename to systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png rename to systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png b/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png rename to systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png rename to systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png diff --git a/features/signalcomponent/src/main/resources/base/media/icon.png b/systemui4merge/features/signalcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/icon.png rename to systemui4merge/features/signalcomponent/src/main/resources/base/media/icon.png diff --git a/features/signalcomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/signalcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/signalcomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/signalcomponent/src/main/resources/en_US/element/string.json diff --git a/features/signalcomponent/src/main/resources/phone/element/float.json b/systemui4merge/features/signalcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/signalcomponent/src/main/resources/phone/element/float.json rename to systemui4merge/features/signalcomponent/src/main/resources/phone/element/float.json diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg b/systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg rename to systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg b/systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg rename to systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg b/systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg rename to systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg b/systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg rename to systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg b/systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg rename to systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg b/systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg rename to systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg diff --git a/features/signalcomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/signalcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/signalcomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/signalcomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/statusbarcomponent/build-profile.json5 b/systemui4merge/features/statusbarcomponent/build-profile.json5 similarity index 100% rename from features/statusbarcomponent/build-profile.json5 rename to systemui4merge/features/statusbarcomponent/build-profile.json5 diff --git a/features/statusbarcomponent/hvigorfile.js b/systemui4merge/features/statusbarcomponent/hvigorfile.js similarity index 100% rename from features/statusbarcomponent/hvigorfile.js rename to systemui4merge/features/statusbarcomponent/hvigorfile.js diff --git a/features/statusbarcomponent/package-lock.json b/systemui4merge/features/statusbarcomponent/package-lock.json similarity index 100% rename from features/statusbarcomponent/package-lock.json rename to systemui4merge/features/statusbarcomponent/package-lock.json diff --git a/features/statusbarcomponent/package.json b/systemui4merge/features/statusbarcomponent/package.json similarity index 100% rename from features/statusbarcomponent/package.json rename to systemui4merge/features/statusbarcomponent/package.json diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts b/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts rename to systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts similarity index 100% rename from features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts rename to systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 100% rename from features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts similarity index 100% rename from features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts rename to systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets similarity index 100% rename from features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets rename to systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets b/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets similarity index 100% rename from features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets rename to systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets similarity index 100% rename from features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets rename to systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets similarity index 100% rename from features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets rename to systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts similarity index 100% rename from features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts rename to systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts diff --git a/features/statusbarcomponent/src/main/module.json5 b/systemui4merge/features/statusbarcomponent/src/main/module.json5 similarity index 100% rename from features/statusbarcomponent/src/main/module.json5 rename to systemui4merge/features/statusbarcomponent/src/main/module.json5 diff --git a/features/statusbarcomponent/src/main/resources/base/element/color.json b/systemui4merge/features/statusbarcomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/statusbarcomponent/src/main/resources/base/element/color.json rename to systemui4merge/features/statusbarcomponent/src/main/resources/base/element/color.json diff --git a/features/statusbarcomponent/src/main/resources/base/element/float.json b/systemui4merge/features/statusbarcomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/statusbarcomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/statusbarcomponent/src/main/resources/base/element/float.json diff --git a/features/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg b/systemui4merge/features/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg similarity index 100% rename from features/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg rename to systemui4merge/features/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg diff --git a/features/statusbarcomponent/src/main/resources/base/media/icon.png b/systemui4merge/features/statusbarcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/statusbarcomponent/src/main/resources/base/media/icon.png rename to systemui4merge/features/statusbarcomponent/src/main/resources/base/media/icon.png diff --git a/features/statusbarcomponent/src/main/resources/phone/element/float.json b/systemui4merge/features/statusbarcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/statusbarcomponent/src/main/resources/phone/element/float.json rename to systemui4merge/features/statusbarcomponent/src/main/resources/phone/element/float.json diff --git a/features/volumecomponent/build-profile.json5 b/systemui4merge/features/volumecomponent/build-profile.json5 similarity index 100% rename from features/volumecomponent/build-profile.json5 rename to systemui4merge/features/volumecomponent/build-profile.json5 diff --git a/features/volumecomponent/hvigorfile.js b/systemui4merge/features/volumecomponent/hvigorfile.js similarity index 100% rename from features/volumecomponent/hvigorfile.js rename to systemui4merge/features/volumecomponent/hvigorfile.js diff --git a/features/volumecomponent/package-lock.json b/systemui4merge/features/volumecomponent/package-lock.json similarity index 100% rename from features/volumecomponent/package-lock.json rename to systemui4merge/features/volumecomponent/package-lock.json diff --git a/features/volumecomponent/package.json b/systemui4merge/features/volumecomponent/package.json similarity index 100% rename from features/volumecomponent/package.json rename to systemui4merge/features/volumecomponent/package.json diff --git a/features/volumecomponent/src/main/ets/default/VolumeModel.ts b/systemui4merge/features/volumecomponent/src/main/ets/default/VolumeModel.ts similarity index 100% rename from features/volumecomponent/src/main/ets/default/VolumeModel.ts rename to systemui4merge/features/volumecomponent/src/main/ets/default/VolumeModel.ts diff --git a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets b/systemui4merge/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets similarity index 100% rename from features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets rename to systemui4merge/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets diff --git a/features/volumecomponent/src/main/module.json5 b/systemui4merge/features/volumecomponent/src/main/module.json5 similarity index 100% rename from features/volumecomponent/src/main/module.json5 rename to systemui4merge/features/volumecomponent/src/main/module.json5 diff --git a/features/volumecomponent/src/main/resources/base/element/color.json b/systemui4merge/features/volumecomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/volumecomponent/src/main/resources/base/element/color.json rename to systemui4merge/features/volumecomponent/src/main/resources/base/element/color.json diff --git a/features/volumecomponent/src/main/resources/base/element/float.json b/systemui4merge/features/volumecomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/volumecomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/volumecomponent/src/main/resources/base/element/float.json diff --git a/features/volumecomponent/src/main/resources/base/element/string.json b/systemui4merge/features/volumecomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/volumecomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/volumecomponent/src/main/resources/base/element/string.json diff --git a/features/volumecomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/volumecomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/volumecomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/volumecomponent/src/main/resources/en_US/element/string.json diff --git a/features/volumecomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/volumecomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/volumecomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/volumecomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/volumepanelcomponent/build-profile.json5 b/systemui4merge/features/volumepanelcomponent/build-profile.json5 similarity index 100% rename from features/volumepanelcomponent/build-profile.json5 rename to systemui4merge/features/volumepanelcomponent/build-profile.json5 diff --git a/features/volumepanelcomponent/hvigorfile.js b/systemui4merge/features/volumepanelcomponent/hvigorfile.js similarity index 100% rename from features/volumepanelcomponent/hvigorfile.js rename to systemui4merge/features/volumepanelcomponent/hvigorfile.js diff --git a/features/volumepanelcomponent/package-lock.json b/systemui4merge/features/volumepanelcomponent/package-lock.json similarity index 100% rename from features/volumepanelcomponent/package-lock.json rename to systemui4merge/features/volumepanelcomponent/package-lock.json diff --git a/features/volumepanelcomponent/package.json b/systemui4merge/features/volumepanelcomponent/package.json similarity index 100% rename from features/volumepanelcomponent/package.json rename to systemui4merge/features/volumepanelcomponent/package.json diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts b/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts rename to systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 100% rename from features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts b/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts similarity index 100% rename from features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts rename to systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts b/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts similarity index 100% rename from features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts rename to systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets similarity index 100% rename from features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets rename to systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts similarity index 100% rename from features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts rename to systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts diff --git a/features/volumepanelcomponent/src/main/module.json5 b/systemui4merge/features/volumepanelcomponent/src/main/module.json5 similarity index 100% rename from features/volumepanelcomponent/src/main/module.json5 rename to systemui4merge/features/volumepanelcomponent/src/main/module.json5 diff --git a/features/volumepanelcomponent/src/main/resources/base/element/color.json b/systemui4merge/features/volumepanelcomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/volumepanelcomponent/src/main/resources/base/element/color.json rename to systemui4merge/features/volumepanelcomponent/src/main/resources/base/element/color.json diff --git a/features/volumepanelcomponent/src/main/resources/base/element/float.json b/systemui4merge/features/volumepanelcomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/volumepanelcomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/volumepanelcomponent/src/main/resources/base/element/float.json diff --git a/features/volumepanelcomponent/src/main/resources/base/element/string.json b/systemui4merge/features/volumepanelcomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/volumepanelcomponent/src/main/resources/base/element/string.json rename to systemui4merge/features/volumepanelcomponent/src/main/resources/base/element/string.json diff --git a/features/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg b/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg similarity index 100% rename from features/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg rename to systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg diff --git a/features/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg b/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg similarity index 100% rename from features/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg rename to systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg diff --git a/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg b/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg similarity index 100% rename from features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg rename to systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg diff --git a/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg b/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg similarity index 100% rename from features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg rename to systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg diff --git a/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg b/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg similarity index 100% rename from features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg rename to systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg diff --git a/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg b/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg similarity index 100% rename from features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg rename to systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg diff --git a/features/volumepanelcomponent/src/main/resources/base/media/icon.png b/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/volumepanelcomponent/src/main/resources/base/media/icon.png rename to systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/icon.png diff --git a/features/volumepanelcomponent/src/main/resources/en_US/element/string.json b/systemui4merge/features/volumepanelcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/volumepanelcomponent/src/main/resources/en_US/element/string.json rename to systemui4merge/features/volumepanelcomponent/src/main/resources/en_US/element/string.json diff --git a/features/volumepanelcomponent/src/main/resources/phone/element/color.json b/systemui4merge/features/volumepanelcomponent/src/main/resources/phone/element/color.json similarity index 100% rename from features/volumepanelcomponent/src/main/resources/phone/element/color.json rename to systemui4merge/features/volumepanelcomponent/src/main/resources/phone/element/color.json diff --git a/features/volumepanelcomponent/src/main/resources/phone/element/float.json b/systemui4merge/features/volumepanelcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/volumepanelcomponent/src/main/resources/phone/element/float.json rename to systemui4merge/features/volumepanelcomponent/src/main/resources/phone/element/float.json diff --git a/features/volumepanelcomponent/src/main/resources/zh_CN/element/string.json b/systemui4merge/features/volumepanelcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/volumepanelcomponent/src/main/resources/zh_CN/element/string.json rename to systemui4merge/features/volumepanelcomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/wificomponent/build-profile.json5 b/systemui4merge/features/wificomponent/build-profile.json5 similarity index 100% rename from features/wificomponent/build-profile.json5 rename to systemui4merge/features/wificomponent/build-profile.json5 diff --git a/features/wificomponent/hvigorfile.js b/systemui4merge/features/wificomponent/hvigorfile.js similarity index 100% rename from features/wificomponent/hvigorfile.js rename to systemui4merge/features/wificomponent/hvigorfile.js diff --git a/features/wificomponent/package-lock.json b/systemui4merge/features/wificomponent/package-lock.json similarity index 100% rename from features/wificomponent/package-lock.json rename to systemui4merge/features/wificomponent/package-lock.json diff --git a/features/wificomponent/package.json b/systemui4merge/features/wificomponent/package.json similarity index 100% rename from features/wificomponent/package.json rename to systemui4merge/features/wificomponent/package.json diff --git a/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts b/systemui4merge/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 100% rename from features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts rename to systemui4merge/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts diff --git a/features/wificomponent/src/main/ets/default/common/constants.ts b/systemui4merge/features/wificomponent/src/main/ets/default/common/constants.ts similarity index 100% rename from features/wificomponent/src/main/ets/default/common/constants.ts rename to systemui4merge/features/wificomponent/src/main/ets/default/common/constants.ts diff --git a/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets b/systemui4merge/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets similarity index 100% rename from features/wificomponent/src/main/ets/default/pages/wifiComponent.ets rename to systemui4merge/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/systemui4merge/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets similarity index 100% rename from features/wificomponent/src/main/ets/default/pages/wifiIcon.ets rename to systemui4merge/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets diff --git a/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts b/systemui4merge/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts similarity index 100% rename from features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts rename to systemui4merge/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ts b/systemui4merge/features/wificomponent/src/main/ets/default/wifiModel.ts similarity index 100% rename from features/wificomponent/src/main/ets/default/wifiModel.ts rename to systemui4merge/features/wificomponent/src/main/ets/default/wifiModel.ts diff --git a/features/wificomponent/src/main/module.json5 b/systemui4merge/features/wificomponent/src/main/module.json5 similarity index 100% rename from features/wificomponent/src/main/module.json5 rename to systemui4merge/features/wificomponent/src/main/module.json5 diff --git a/features/wificomponent/src/main/resources/base/element/float.json b/systemui4merge/features/wificomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/wificomponent/src/main/resources/base/element/float.json rename to systemui4merge/features/wificomponent/src/main/resources/base/element/float.json diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg similarity index 100% rename from features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg rename to systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg similarity index 100% rename from features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg rename to systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg similarity index 100% rename from features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg rename to systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg similarity index 100% rename from features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg rename to systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg similarity index 100% rename from features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg rename to systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg diff --git a/features/wificomponent/src/main/resources/base/media/icon.png b/systemui4merge/features/wificomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/wificomponent/src/main/resources/base/media/icon.png rename to systemui4merge/features/wificomponent/src/main/resources/base/media/icon.png diff --git a/features/wificomponent/src/main/resources/base/media/wifi.svg b/systemui4merge/features/wificomponent/src/main/resources/base/media/wifi.svg similarity index 100% rename from features/wificomponent/src/main/resources/base/media/wifi.svg rename to systemui4merge/features/wificomponent/src/main/resources/base/media/wifi.svg diff --git a/features/wificomponent/src/main/resources/base/media/wifi_d.svg b/systemui4merge/features/wificomponent/src/main/resources/base/media/wifi_d.svg similarity index 100% rename from features/wificomponent/src/main/resources/base/media/wifi_d.svg rename to systemui4merge/features/wificomponent/src/main/resources/base/media/wifi_d.svg diff --git a/features/wificomponent/src/main/resources/phone/element/float.json b/systemui4merge/features/wificomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/wificomponent/src/main/resources/phone/element/float.json rename to systemui4merge/features/wificomponent/src/main/resources/phone/element/float.json diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg b/systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg similarity index 100% rename from features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg rename to systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg b/systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg similarity index 100% rename from features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg rename to systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg b/systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg similarity index 100% rename from features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg rename to systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg b/systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg similarity index 100% rename from features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg rename to systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg b/systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg similarity index 100% rename from features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg rename to systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg diff --git a/figures/TS_01.png b/systemui4merge/figures/TS_01.png similarity index 100% rename from figures/TS_01.png rename to systemui4merge/figures/TS_01.png diff --git a/figures/TS_02.png b/systemui4merge/figures/TS_02.png similarity index 100% rename from figures/TS_02.png rename to systemui4merge/figures/TS_02.png diff --git a/figures/cmd1.png b/systemui4merge/figures/cmd1.png similarity index 100% rename from figures/cmd1.png rename to systemui4merge/figures/cmd1.png diff --git a/figures/cmd2.png b/systemui4merge/figures/cmd2.png similarity index 100% rename from figures/cmd2.png rename to systemui4merge/figures/cmd2.png diff --git a/figures/cmd3.png b/systemui4merge/figures/cmd3.png similarity index 100% rename from figures/cmd3.png rename to systemui4merge/figures/cmd3.png diff --git a/figures/commit_source_clone_page.png b/systemui4merge/figures/commit_source_clone_page.png similarity index 100% rename from figures/commit_source_clone_page.png rename to systemui4merge/figures/commit_source_clone_page.png diff --git a/figures/commit_source_fork_button.png b/systemui4merge/figures/commit_source_fork_button.png similarity index 100% rename from figures/commit_source_fork_button.png rename to systemui4merge/figures/commit_source_fork_button.png diff --git a/figures/commit_source_fork_confirm.png b/systemui4merge/figures/commit_source_fork_confirm.png similarity index 100% rename from figures/commit_source_fork_confirm.png rename to systemui4merge/figures/commit_source_fork_confirm.png diff --git a/figures/commit_source_forked_repo.jpg b/systemui4merge/figures/commit_source_forked_repo.jpg similarity index 100% rename from figures/commit_source_forked_repo.jpg rename to systemui4merge/figures/commit_source_forked_repo.jpg diff --git a/figures/commit_source_new_pr_done copy.png b/systemui4merge/figures/commit_source_new_pr_done copy.png similarity index 100% rename from figures/commit_source_new_pr_done copy.png rename to systemui4merge/figures/commit_source_new_pr_done copy.png diff --git a/figures/commit_source_new_pr_done.png b/systemui4merge/figures/commit_source_new_pr_done.png similarity index 100% rename from figures/commit_source_new_pr_done.png rename to systemui4merge/figures/commit_source_new_pr_done.png diff --git a/figures/commit_source_new_pull_request copy.png b/systemui4merge/figures/commit_source_new_pull_request copy.png similarity index 100% rename from figures/commit_source_new_pull_request copy.png rename to systemui4merge/figures/commit_source_new_pull_request copy.png diff --git a/figures/commit_source_new_pull_request.png b/systemui4merge/figures/commit_source_new_pull_request.png similarity index 100% rename from figures/commit_source_new_pull_request.png rename to systemui4merge/figures/commit_source_new_pull_request.png diff --git a/figures/commit_source_new_pull_request_confirm copy.png b/systemui4merge/figures/commit_source_new_pull_request_confirm copy.png similarity index 100% rename from figures/commit_source_new_pull_request_confirm copy.png rename to systemui4merge/figures/commit_source_new_pull_request_confirm copy.png diff --git a/figures/commit_source_new_pull_request_confirm.png b/systemui4merge/figures/commit_source_new_pull_request_confirm.png similarity index 100% rename from figures/commit_source_new_pull_request_confirm.png rename to systemui4merge/figures/commit_source_new_pull_request_confirm.png diff --git a/figures/downLoadSDK_01.png b/systemui4merge/figures/downLoadSDK_01.png similarity index 100% rename from figures/downLoadSDK_01.png rename to systemui4merge/figures/downLoadSDK_01.png diff --git a/figures/downLoad_01.png b/systemui4merge/figures/downLoad_01.png similarity index 100% rename from figures/downLoad_01.png rename to systemui4merge/figures/downLoad_01.png diff --git a/figures/downLoad_02.png b/systemui4merge/figures/downLoad_02.png similarity index 100% rename from figures/downLoad_02.png rename to systemui4merge/figures/downLoad_02.png diff --git a/figures/downLoad_03.png b/systemui4merge/figures/downLoad_03.png similarity index 100% rename from figures/downLoad_03.png rename to systemui4merge/figures/downLoad_03.png diff --git a/figures/downLoad_04.png b/systemui4merge/figures/downLoad_04.png similarity index 100% rename from figures/downLoad_04.png rename to systemui4merge/figures/downLoad_04.png diff --git a/figures/downLoad_05.png b/systemui4merge/figures/downLoad_05.png similarity index 100% rename from figures/downLoad_05.png rename to systemui4merge/figures/downLoad_05.png diff --git a/figures/downLoad_06.png b/systemui4merge/figures/downLoad_06.png similarity index 100% rename from figures/downLoad_06.png rename to systemui4merge/figures/downLoad_06.png diff --git a/figures/ds_build_haps.png b/systemui4merge/figures/ds_build_haps.png similarity index 100% rename from figures/ds_build_haps.png rename to systemui4merge/figures/ds_build_haps.png diff --git a/figures/ds_hilog_window.png b/systemui4merge/figures/ds_hilog_window.png similarity index 100% rename from figures/ds_hilog_window.png rename to systemui4merge/figures/ds_hilog_window.png diff --git a/figures/ds_ohosbuild_output_dir_debug.png b/systemui4merge/figures/ds_ohosbuild_output_dir_debug.png similarity index 100% rename from figures/ds_ohosbuild_output_dir_debug.png rename to systemui4merge/figures/ds_ohosbuild_output_dir_debug.png diff --git a/figures/ds_ohosbuild_output_dir_release.png b/systemui4merge/figures/ds_ohosbuild_output_dir_release.png similarity index 100% rename from figures/ds_ohosbuild_output_dir_release.png rename to systemui4merge/figures/ds_ohosbuild_output_dir_release.png diff --git a/figures/ds_ohosbuild_variants.png b/systemui4merge/figures/ds_ohosbuild_variants.png similarity index 100% rename from figures/ds_ohosbuild_variants.png rename to systemui4merge/figures/ds_ohosbuild_variants.png diff --git a/figures/ds_ohosbuild_variants_debug.png b/systemui4merge/figures/ds_ohosbuild_variants_debug.png similarity index 100% rename from figures/ds_ohosbuild_variants_debug.png rename to systemui4merge/figures/ds_ohosbuild_variants_debug.png diff --git a/figures/ds_ohosbuild_variants_release.png b/systemui4merge/figures/ds_ohosbuild_variants_release.png similarity index 100% rename from figures/ds_ohosbuild_variants_release.png rename to systemui4merge/figures/ds_ohosbuild_variants_release.png diff --git a/figures/en-us_image_0000001103686480.png b/systemui4merge/figures/en-us_image_0000001103686480.png old mode 100755 new mode 100644 similarity index 100% rename from figures/en-us_image_0000001103686480.png rename to systemui4merge/figures/en-us_image_0000001103686480.png diff --git a/figures/gitee_01.png b/systemui4merge/figures/gitee_01.png similarity index 100% rename from figures/gitee_01.png rename to systemui4merge/figures/gitee_01.png diff --git a/figures/hap_repo.png b/systemui4merge/figures/hap_repo.png similarity index 100% rename from figures/hap_repo.png rename to systemui4merge/figures/hap_repo.png diff --git a/figures/importProject.png b/systemui4merge/figures/importProject.png similarity index 100% rename from figures/importProject.png rename to systemui4merge/figures/importProject.png diff --git a/figures/screenshot-20210521-105407.png b/systemui4merge/figures/screenshot-20210521-105407.png similarity index 100% rename from figures/screenshot-20210521-105407.png rename to systemui4merge/figures/screenshot-20210521-105407.png diff --git a/figures/screenshot-20210521-110433.png b/systemui4merge/figures/screenshot-20210521-110433.png similarity index 100% rename from figures/screenshot-20210521-110433.png rename to systemui4merge/figures/screenshot-20210521-110433.png diff --git a/figures/screenshot-20210521-111223.png b/systemui4merge/figures/screenshot-20210521-111223.png similarity index 100% rename from figures/screenshot-20210521-111223.png rename to systemui4merge/figures/screenshot-20210521-111223.png diff --git a/figures/signature_1.png b/systemui4merge/figures/signature_1.png similarity index 100% rename from figures/signature_1.png rename to systemui4merge/figures/signature_1.png diff --git a/figures/signature_2.png b/systemui4merge/figures/signature_2.png similarity index 100% rename from figures/signature_2.png rename to systemui4merge/figures/signature_2.png diff --git a/figures/signature_3.png b/systemui4merge/figures/signature_3.png similarity index 100% rename from figures/signature_3.png rename to systemui4merge/figures/signature_3.png diff --git a/figures/zh-cn_image_0000001103686480.png b/systemui4merge/figures/zh-cn_image_0000001103686480.png old mode 100755 new mode 100644 similarity index 100% rename from figures/zh-cn_image_0000001103686480.png rename to systemui4merge/figures/zh-cn_image_0000001103686480.png diff --git a/gradle.properties b/systemui4merge/gradle.properties old mode 100755 new mode 100644 similarity index 100% rename from gradle.properties rename to systemui4merge/gradle.properties diff --git a/gradlew b/systemui4merge/gradlew old mode 100755 new mode 100644 similarity index 100% rename from gradlew rename to systemui4merge/gradlew diff --git a/gradlew.bat b/systemui4merge/gradlew.bat old mode 100755 new mode 100644 similarity index 100% rename from gradlew.bat rename to systemui4merge/gradlew.bat diff --git a/hvigorfile.js b/systemui4merge/hvigorfile.js similarity index 100% rename from hvigorfile.js rename to systemui4merge/hvigorfile.js diff --git a/infra/config_exts.gradle b/systemui4merge/infra/config_exts.gradle similarity index 100% rename from infra/config_exts.gradle rename to systemui4merge/infra/config_exts.gradle diff --git a/package-lock.json b/systemui4merge/package-lock.json similarity index 100% rename from package-lock.json rename to systemui4merge/package-lock.json diff --git a/package.json b/systemui4merge/package.json similarity index 100% rename from package.json rename to systemui4merge/package.json diff --git a/product/default/navigationBar/build-profile.json5 b/systemui4merge/product/default/navigationBar/build-profile.json5 similarity index 100% rename from product/default/navigationBar/build-profile.json5 rename to systemui4merge/product/default/navigationBar/build-profile.json5 diff --git a/product/default/navigationBar/hvigorfile.js b/systemui4merge/product/default/navigationBar/hvigorfile.js similarity index 100% rename from product/default/navigationBar/hvigorfile.js rename to systemui4merge/product/default/navigationBar/hvigorfile.js diff --git a/product/default/navigationBar/package-lock.json b/systemui4merge/product/default/navigationBar/package-lock.json similarity index 100% rename from product/default/navigationBar/package-lock.json rename to systemui4merge/product/default/navigationBar/package-lock.json diff --git a/product/default/navigationBar/package.json b/systemui4merge/product/default/navigationBar/package.json similarity index 100% rename from product/default/navigationBar/package.json rename to systemui4merge/product/default/navigationBar/package.json diff --git a/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts b/systemui4merge/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from product/default/navigationBar/src/main/ets/Application/AbilityStage.ts rename to systemui4merge/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/systemui4merge/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts similarity index 100% rename from product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename to systemui4merge/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts diff --git a/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts b/systemui4merge/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts similarity index 100% rename from product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts rename to systemui4merge/product/default/navigationBar/src/main/ets/common/IndicatorConfig.ts diff --git a/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts b/systemui4merge/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts similarity index 100% rename from product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts rename to systemui4merge/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts diff --git a/product/default/navigationBar/src/main/ets/common/StyleManager.ts b/systemui4merge/product/default/navigationBar/src/main/ets/common/StyleManager.ts similarity index 100% rename from product/default/navigationBar/src/main/ets/common/StyleManager.ts rename to systemui4merge/product/default/navigationBar/src/main/ets/common/StyleManager.ts diff --git a/product/default/navigationBar/src/main/ets/common/constants.ts b/systemui4merge/product/default/navigationBar/src/main/ets/common/constants.ts similarity index 100% rename from product/default/navigationBar/src/main/ets/common/constants.ts rename to systemui4merge/product/default/navigationBar/src/main/ets/common/constants.ts diff --git a/product/default/navigationBar/src/main/ets/common/utils/configReader.ts b/systemui4merge/product/default/navigationBar/src/main/ets/common/utils/configReader.ts similarity index 100% rename from product/default/navigationBar/src/main/ets/common/utils/configReader.ts rename to systemui4merge/product/default/navigationBar/src/main/ets/common/utils/configReader.ts diff --git a/product/default/navigationBar/src/main/ets/i18n/en-US.json b/systemui4merge/product/default/navigationBar/src/main/ets/i18n/en-US.json similarity index 100% rename from product/default/navigationBar/src/main/ets/i18n/en-US.json rename to systemui4merge/product/default/navigationBar/src/main/ets/i18n/en-US.json diff --git a/product/default/navigationBar/src/main/ets/i18n/zh-CN.json b/systemui4merge/product/default/navigationBar/src/main/ets/i18n/zh-CN.json similarity index 100% rename from product/default/navigationBar/src/main/ets/i18n/zh-CN.json rename to systemui4merge/product/default/navigationBar/src/main/ets/i18n/zh-CN.json diff --git a/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets b/systemui4merge/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets similarity index 100% rename from product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets rename to systemui4merge/product/default/navigationBar/src/main/ets/pages/PrivacyIndicatorComponent.ets diff --git a/product/default/navigationBar/src/main/ets/pages/SplitBarIndex.ets b/systemui4merge/product/default/navigationBar/src/main/ets/pages/SplitBarIndex.ets similarity index 100% rename from product/default/navigationBar/src/main/ets/pages/SplitBarIndex.ets rename to systemui4merge/product/default/navigationBar/src/main/ets/pages/SplitBarIndex.ets diff --git a/product/default/navigationBar/src/main/ets/pages/index.ets b/systemui4merge/product/default/navigationBar/src/main/ets/pages/index.ets similarity index 100% rename from product/default/navigationBar/src/main/ets/pages/index.ets rename to systemui4merge/product/default/navigationBar/src/main/ets/pages/index.ets diff --git a/product/default/navigationBar/src/main/ets/pages/keyButton.ets b/systemui4merge/product/default/navigationBar/src/main/ets/pages/keyButton.ets similarity index 100% rename from product/default/navigationBar/src/main/ets/pages/keyButton.ets rename to systemui4merge/product/default/navigationBar/src/main/ets/pages/keyButton.ets diff --git a/product/default/navigationBar/src/main/ets/pages/oneLayout.ets b/systemui4merge/product/default/navigationBar/src/main/ets/pages/oneLayout.ets similarity index 100% rename from product/default/navigationBar/src/main/ets/pages/oneLayout.ets rename to systemui4merge/product/default/navigationBar/src/main/ets/pages/oneLayout.ets diff --git a/product/default/navigationBar/src/main/ets/pages/threeLayout.ets b/systemui4merge/product/default/navigationBar/src/main/ets/pages/threeLayout.ets similarity index 100% rename from product/default/navigationBar/src/main/ets/pages/threeLayout.ets rename to systemui4merge/product/default/navigationBar/src/main/ets/pages/threeLayout.ets diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/systemui4merge/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts similarity index 100% rename from product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts rename to systemui4merge/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts diff --git a/product/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts b/systemui4merge/product/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts similarity index 100% rename from product/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts rename to systemui4merge/product/default/navigationBar/src/main/ets/viewmodel/ViewModel.ts diff --git a/product/default/navigationBar/src/main/module.json5 b/systemui4merge/product/default/navigationBar/src/main/module.json5 similarity index 100% rename from product/default/navigationBar/src/main/module.json5 rename to systemui4merge/product/default/navigationBar/src/main/module.json5 diff --git a/product/default/navigationBar/src/main/resources/base/element/color.json b/systemui4merge/product/default/navigationBar/src/main/resources/base/element/color.json similarity index 100% rename from product/default/navigationBar/src/main/resources/base/element/color.json rename to systemui4merge/product/default/navigationBar/src/main/resources/base/element/color.json diff --git a/product/default/navigationBar/src/main/resources/base/element/float.json b/systemui4merge/product/default/navigationBar/src/main/resources/base/element/float.json similarity index 100% rename from product/default/navigationBar/src/main/resources/base/element/float.json rename to systemui4merge/product/default/navigationBar/src/main/resources/base/element/float.json diff --git a/product/default/navigationBar/src/main/resources/base/element/string.json b/systemui4merge/product/default/navigationBar/src/main/resources/base/element/string.json similarity index 100% rename from product/default/navigationBar/src/main/resources/base/element/string.json rename to systemui4merge/product/default/navigationBar/src/main/resources/base/element/string.json diff --git a/product/default/navigationBar/src/main/resources/base/media/ic_systemui_back.svg b/systemui4merge/product/default/navigationBar/src/main/resources/base/media/ic_systemui_back.svg similarity index 100% rename from product/default/navigationBar/src/main/resources/base/media/ic_systemui_back.svg rename to systemui4merge/product/default/navigationBar/src/main/resources/base/media/ic_systemui_back.svg diff --git a/product/default/navigationBar/src/main/resources/base/media/ic_systemui_home.svg b/systemui4merge/product/default/navigationBar/src/main/resources/base/media/ic_systemui_home.svg similarity index 100% rename from product/default/navigationBar/src/main/resources/base/media/ic_systemui_home.svg rename to systemui4merge/product/default/navigationBar/src/main/resources/base/media/ic_systemui_home.svg diff --git a/product/default/navigationBar/src/main/resources/base/media/ic_systemui_recent.svg b/systemui4merge/product/default/navigationBar/src/main/resources/base/media/ic_systemui_recent.svg similarity index 100% rename from product/default/navigationBar/src/main/resources/base/media/ic_systemui_recent.svg rename to systemui4merge/product/default/navigationBar/src/main/resources/base/media/ic_systemui_recent.svg diff --git a/product/default/navigationBar/src/main/resources/base/media/icon.png b/systemui4merge/product/default/navigationBar/src/main/resources/base/media/icon.png similarity index 100% rename from product/default/navigationBar/src/main/resources/base/media/icon.png rename to systemui4merge/product/default/navigationBar/src/main/resources/base/media/icon.png diff --git a/product/default/navigationBar/src/main/resources/base/profile/main_pages.json b/systemui4merge/product/default/navigationBar/src/main/resources/base/profile/main_pages.json similarity index 100% rename from product/default/navigationBar/src/main/resources/base/profile/main_pages.json rename to systemui4merge/product/default/navigationBar/src/main/resources/base/profile/main_pages.json diff --git a/product/default/navigationBar/src/main/resources/en_US/element/string.json b/systemui4merge/product/default/navigationBar/src/main/resources/en_US/element/string.json similarity index 100% rename from product/default/navigationBar/src/main/resources/en_US/element/string.json rename to systemui4merge/product/default/navigationBar/src/main/resources/en_US/element/string.json diff --git a/product/default/navigationBar/src/main/resources/rawfile/navigationBarLayoutConfig.json b/systemui4merge/product/default/navigationBar/src/main/resources/rawfile/navigationBarLayoutConfig.json similarity index 100% rename from product/default/navigationBar/src/main/resources/rawfile/navigationBarLayoutConfig.json rename to systemui4merge/product/default/navigationBar/src/main/resources/rawfile/navigationBarLayoutConfig.json diff --git a/product/default/navigationBar/src/main/resources/zh_CN/element/string.json b/systemui4merge/product/default/navigationBar/src/main/resources/zh_CN/element/string.json similarity index 100% rename from product/default/navigationBar/src/main/resources/zh_CN/element/string.json rename to systemui4merge/product/default/navigationBar/src/main/resources/zh_CN/element/string.json diff --git a/product/default/notificationmanagement/build-profile.json5 b/systemui4merge/product/default/notificationmanagement/build-profile.json5 similarity index 100% rename from product/default/notificationmanagement/build-profile.json5 rename to systemui4merge/product/default/notificationmanagement/build-profile.json5 diff --git a/product/default/notificationmanagement/hvigorfile.js b/systemui4merge/product/default/notificationmanagement/hvigorfile.js similarity index 100% rename from product/default/notificationmanagement/hvigorfile.js rename to systemui4merge/product/default/notificationmanagement/hvigorfile.js diff --git a/product/default/notificationmanagement/package-lock.json b/systemui4merge/product/default/notificationmanagement/package-lock.json similarity index 100% rename from product/default/notificationmanagement/package-lock.json rename to systemui4merge/product/default/notificationmanagement/package-lock.json diff --git a/product/default/notificationmanagement/package.json b/systemui4merge/product/default/notificationmanagement/package.json similarity index 100% rename from product/default/notificationmanagement/package.json rename to systemui4merge/product/default/notificationmanagement/package.json diff --git a/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts b/systemui4merge/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts rename to systemui4merge/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts b/systemui4merge/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts similarity index 100% rename from product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts rename to systemui4merge/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts diff --git a/product/default/notificationmanagement/src/main/ets/common/constants.ts b/systemui4merge/product/default/notificationmanagement/src/main/ets/common/constants.ts similarity index 100% rename from product/default/notificationmanagement/src/main/ets/common/constants.ts rename to systemui4merge/product/default/notificationmanagement/src/main/ets/common/constants.ts diff --git a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets b/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets similarity index 100% rename from product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets rename to systemui4merge/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets similarity index 100% rename from product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets rename to systemui4merge/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets b/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets similarity index 100% rename from product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets rename to systemui4merge/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets similarity index 100% rename from product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets rename to systemui4merge/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets diff --git a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets b/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets similarity index 100% rename from product/default/notificationmanagement/src/main/ets/pages/setEnable.ets rename to systemui4merge/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets diff --git a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets b/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets similarity index 100% rename from product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets rename to systemui4merge/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets diff --git a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts b/systemui4merge/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts similarity index 100% rename from product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts rename to systemui4merge/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts diff --git a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts b/systemui4merge/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts similarity index 100% rename from product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts rename to systemui4merge/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts diff --git a/product/default/notificationmanagement/src/main/module.json5 b/systemui4merge/product/default/notificationmanagement/src/main/module.json5 similarity index 100% rename from product/default/notificationmanagement/src/main/module.json5 rename to systemui4merge/product/default/notificationmanagement/src/main/module.json5 diff --git a/product/default/notificationmanagement/src/main/resources/base/element/color.json b/systemui4merge/product/default/notificationmanagement/src/main/resources/base/element/color.json similarity index 100% rename from product/default/notificationmanagement/src/main/resources/base/element/color.json rename to systemui4merge/product/default/notificationmanagement/src/main/resources/base/element/color.json diff --git a/product/default/notificationmanagement/src/main/resources/base/element/string.json b/systemui4merge/product/default/notificationmanagement/src/main/resources/base/element/string.json similarity index 100% rename from product/default/notificationmanagement/src/main/resources/base/element/string.json rename to systemui4merge/product/default/notificationmanagement/src/main/resources/base/element/string.json diff --git a/product/default/notificationmanagement/src/main/resources/base/media/ic_back.svg b/systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/ic_back.svg similarity index 100% rename from product/default/notificationmanagement/src/main/resources/base/media/ic_back.svg rename to systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/ic_back.svg diff --git a/product/default/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg b/systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg similarity index 100% rename from product/default/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg rename to systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg diff --git a/product/default/notificationmanagement/src/main/resources/base/media/icon.png b/systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/icon.png similarity index 100% rename from product/default/notificationmanagement/src/main/resources/base/media/icon.png rename to systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/icon.png diff --git a/product/default/notificationmanagement/src/main/resources/base/media/startWindowIcon.png b/systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/startWindowIcon.png similarity index 100% rename from product/default/notificationmanagement/src/main/resources/base/media/startWindowIcon.png rename to systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/startWindowIcon.png diff --git a/product/default/notificationmanagement/src/main/resources/base/profile/main_pages.json b/systemui4merge/product/default/notificationmanagement/src/main/resources/base/profile/main_pages.json similarity index 100% rename from product/default/notificationmanagement/src/main/resources/base/profile/main_pages.json rename to systemui4merge/product/default/notificationmanagement/src/main/resources/base/profile/main_pages.json diff --git a/product/default/notificationmanagement/src/main/resources/en_US/element/string.json b/systemui4merge/product/default/notificationmanagement/src/main/resources/en_US/element/string.json similarity index 100% rename from product/default/notificationmanagement/src/main/resources/en_US/element/string.json rename to systemui4merge/product/default/notificationmanagement/src/main/resources/en_US/element/string.json diff --git a/product/default/notificationmanagement/src/main/resources/zh_CN/element/string.json b/systemui4merge/product/default/notificationmanagement/src/main/resources/zh_CN/element/string.json similarity index 100% rename from product/default/notificationmanagement/src/main/resources/zh_CN/element/string.json rename to systemui4merge/product/default/notificationmanagement/src/main/resources/zh_CN/element/string.json diff --git a/product/default/volumepanel/build-profile.json5 b/systemui4merge/product/default/volumepanel/build-profile.json5 similarity index 100% rename from product/default/volumepanel/build-profile.json5 rename to systemui4merge/product/default/volumepanel/build-profile.json5 diff --git a/product/default/volumepanel/hvigorfile.js b/systemui4merge/product/default/volumepanel/hvigorfile.js similarity index 100% rename from product/default/volumepanel/hvigorfile.js rename to systemui4merge/product/default/volumepanel/hvigorfile.js diff --git a/product/default/volumepanel/package-lock.json b/systemui4merge/product/default/volumepanel/package-lock.json similarity index 100% rename from product/default/volumepanel/package-lock.json rename to systemui4merge/product/default/volumepanel/package-lock.json diff --git a/product/default/volumepanel/package.json b/systemui4merge/product/default/volumepanel/package.json similarity index 100% rename from product/default/volumepanel/package.json rename to systemui4merge/product/default/volumepanel/package.json diff --git a/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts b/systemui4merge/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from product/default/volumepanel/src/main/ets/Application/AbilityStage.ts rename to systemui4merge/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/systemui4merge/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts similarity index 100% rename from product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename to systemui4merge/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts diff --git a/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts b/systemui4merge/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts similarity index 100% rename from product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts rename to systemui4merge/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts diff --git a/product/default/volumepanel/src/main/ets/common/StyleManager.ts b/systemui4merge/product/default/volumepanel/src/main/ets/common/StyleManager.ts similarity index 100% rename from product/default/volumepanel/src/main/ets/common/StyleManager.ts rename to systemui4merge/product/default/volumepanel/src/main/ets/common/StyleManager.ts diff --git a/product/default/volumepanel/src/main/ets/common/constants.ts b/systemui4merge/product/default/volumepanel/src/main/ets/common/constants.ts similarity index 100% rename from product/default/volumepanel/src/main/ets/common/constants.ts rename to systemui4merge/product/default/volumepanel/src/main/ets/common/constants.ts diff --git a/product/default/volumepanel/src/main/ets/pages/index.ets b/systemui4merge/product/default/volumepanel/src/main/ets/pages/index.ets similarity index 100% rename from product/default/volumepanel/src/main/ets/pages/index.ets rename to systemui4merge/product/default/volumepanel/src/main/ets/pages/index.ets diff --git a/product/default/volumepanel/src/main/module.json5 b/systemui4merge/product/default/volumepanel/src/main/module.json5 similarity index 100% rename from product/default/volumepanel/src/main/module.json5 rename to systemui4merge/product/default/volumepanel/src/main/module.json5 diff --git a/product/default/volumepanel/src/main/resources/base/element/string.json b/systemui4merge/product/default/volumepanel/src/main/resources/base/element/string.json similarity index 100% rename from product/default/volumepanel/src/main/resources/base/element/string.json rename to systemui4merge/product/default/volumepanel/src/main/resources/base/element/string.json diff --git a/product/default/volumepanel/src/main/resources/base/media/icon.png b/systemui4merge/product/default/volumepanel/src/main/resources/base/media/icon.png similarity index 100% rename from product/default/volumepanel/src/main/resources/base/media/icon.png rename to systemui4merge/product/default/volumepanel/src/main/resources/base/media/icon.png diff --git a/product/default/volumepanel/src/main/resources/base/profile/main_pages.json b/systemui4merge/product/default/volumepanel/src/main/resources/base/profile/main_pages.json similarity index 100% rename from product/default/volumepanel/src/main/resources/base/profile/main_pages.json rename to systemui4merge/product/default/volumepanel/src/main/resources/base/profile/main_pages.json diff --git a/product/default/volumepanel/src/main/resources/en_US/element/string.json b/systemui4merge/product/default/volumepanel/src/main/resources/en_US/element/string.json similarity index 100% rename from product/default/volumepanel/src/main/resources/en_US/element/string.json rename to systemui4merge/product/default/volumepanel/src/main/resources/en_US/element/string.json diff --git a/product/default/volumepanel/src/main/resources/zh_CN/element/string.json b/systemui4merge/product/default/volumepanel/src/main/resources/zh_CN/element/string.json similarity index 100% rename from product/default/volumepanel/src/main/resources/zh_CN/element/string.json rename to systemui4merge/product/default/volumepanel/src/main/resources/zh_CN/element/string.json diff --git a/product/pc/controlpanel/build-profile.json5 b/systemui4merge/product/pc/controlpanel/build-profile.json5 similarity index 100% rename from product/pc/controlpanel/build-profile.json5 rename to systemui4merge/product/pc/controlpanel/build-profile.json5 diff --git a/product/pc/controlpanel/hvigorfile.js b/systemui4merge/product/pc/controlpanel/hvigorfile.js similarity index 100% rename from product/pc/controlpanel/hvigorfile.js rename to systemui4merge/product/pc/controlpanel/hvigorfile.js diff --git a/product/pc/controlpanel/package-lock.json b/systemui4merge/product/pc/controlpanel/package-lock.json similarity index 100% rename from product/pc/controlpanel/package-lock.json rename to systemui4merge/product/pc/controlpanel/package-lock.json diff --git a/product/pc/controlpanel/package.json b/systemui4merge/product/pc/controlpanel/package.json similarity index 100% rename from product/pc/controlpanel/package.json rename to systemui4merge/product/pc/controlpanel/package.json diff --git a/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts b/systemui4merge/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts rename to systemui4merge/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/systemui4merge/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts similarity index 100% rename from product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename to systemui4merge/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts diff --git a/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/systemui4merge/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts similarity index 100% rename from product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts rename to systemui4merge/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts b/systemui4merge/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts similarity index 100% rename from product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts rename to systemui4merge/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts b/systemui4merge/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts similarity index 100% rename from product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts rename to systemui4merge/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts diff --git a/product/pc/controlpanel/src/main/ets/pages/common/constants.ts b/systemui4merge/product/pc/controlpanel/src/main/ets/pages/common/constants.ts similarity index 100% rename from product/pc/controlpanel/src/main/ets/pages/common/constants.ts rename to systemui4merge/product/pc/controlpanel/src/main/ets/pages/common/constants.ts diff --git a/product/pc/controlpanel/src/main/ets/pages/control.ets b/systemui4merge/product/pc/controlpanel/src/main/ets/pages/control.ets similarity index 100% rename from product/pc/controlpanel/src/main/ets/pages/control.ets rename to systemui4merge/product/pc/controlpanel/src/main/ets/pages/control.ets diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/systemui4merge/product/pc/controlpanel/src/main/ets/pages/index.ets similarity index 100% rename from product/pc/controlpanel/src/main/ets/pages/index.ets rename to systemui4merge/product/pc/controlpanel/src/main/ets/pages/index.ets diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/systemui4merge/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js similarity index 100% rename from product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js rename to systemui4merge/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js diff --git a/product/pc/controlpanel/src/main/module.json5 b/systemui4merge/product/pc/controlpanel/src/main/module.json5 similarity index 100% rename from product/pc/controlpanel/src/main/module.json5 rename to systemui4merge/product/pc/controlpanel/src/main/module.json5 diff --git a/product/pc/controlpanel/src/main/resources/base/element/color.json b/systemui4merge/product/pc/controlpanel/src/main/resources/base/element/color.json similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/element/color.json rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/element/color.json diff --git a/product/pc/controlpanel/src/main/resources/base/element/float.json b/systemui4merge/product/pc/controlpanel/src/main/resources/base/element/float.json similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/element/float.json rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/element/float.json diff --git a/product/pc/controlpanel/src/main/resources/base/element/string.json b/systemui4merge/product/pc/controlpanel/src/main/resources/base/element/string.json similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/element/string.json rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/element/string.json diff --git a/product/pc/controlpanel/src/main/resources/base/media/airplane.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/airplane.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/airplane.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/airplane.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/airplane_d.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/airplane_d.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/airplane_d.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/airplane_d.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_brightness_plus.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_brightness_plus.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/ic_brightness_plus.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_brightness_plus.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_brightness_reduce.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_brightness_reduce.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/ic_brightness_reduce.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_brightness_reduce.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_gps.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_gps.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_gps.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_gps.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_oh.png b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_oh.png similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_oh.png rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_oh.png diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/icon.png b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/icon.png similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/icon.png rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/icon.png diff --git a/product/pc/controlpanel/src/main/resources/base/media/wifi.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/wifi.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/wifi.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/wifi.svg diff --git a/product/pc/controlpanel/src/main/resources/base/media/wifi_d.svg b/systemui4merge/product/pc/controlpanel/src/main/resources/base/media/wifi_d.svg similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/media/wifi_d.svg rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/media/wifi_d.svg diff --git a/product/pc/controlpanel/src/main/resources/base/profile/form_config.json b/systemui4merge/product/pc/controlpanel/src/main/resources/base/profile/form_config.json similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/profile/form_config.json rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/profile/form_config.json diff --git a/product/pc/controlpanel/src/main/resources/base/profile/main_pages.json b/systemui4merge/product/pc/controlpanel/src/main/resources/base/profile/main_pages.json similarity index 100% rename from product/pc/controlpanel/src/main/resources/base/profile/main_pages.json rename to systemui4merge/product/pc/controlpanel/src/main/resources/base/profile/main_pages.json diff --git a/product/pc/controlpanel/src/main/resources/en_US/element/string.json b/systemui4merge/product/pc/controlpanel/src/main/resources/en_US/element/string.json similarity index 100% rename from product/pc/controlpanel/src/main/resources/en_US/element/string.json rename to systemui4merge/product/pc/controlpanel/src/main/resources/en_US/element/string.json diff --git a/product/pc/controlpanel/src/main/resources/zh_CN/element/string.json b/systemui4merge/product/pc/controlpanel/src/main/resources/zh_CN/element/string.json similarity index 100% rename from product/pc/controlpanel/src/main/resources/zh_CN/element/string.json rename to systemui4merge/product/pc/controlpanel/src/main/resources/zh_CN/element/string.json diff --git a/product/pc/notificationpanel/build-profile.json5 b/systemui4merge/product/pc/notificationpanel/build-profile.json5 similarity index 100% rename from product/pc/notificationpanel/build-profile.json5 rename to systemui4merge/product/pc/notificationpanel/build-profile.json5 diff --git a/product/pc/notificationpanel/hvigorfile.js b/systemui4merge/product/pc/notificationpanel/hvigorfile.js similarity index 100% rename from product/pc/notificationpanel/hvigorfile.js rename to systemui4merge/product/pc/notificationpanel/hvigorfile.js diff --git a/product/pc/notificationpanel/package-lock.json b/systemui4merge/product/pc/notificationpanel/package-lock.json similarity index 100% rename from product/pc/notificationpanel/package-lock.json rename to systemui4merge/product/pc/notificationpanel/package-lock.json diff --git a/product/pc/notificationpanel/package.json b/systemui4merge/product/pc/notificationpanel/package.json similarity index 100% rename from product/pc/notificationpanel/package.json rename to systemui4merge/product/pc/notificationpanel/package.json diff --git a/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts b/systemui4merge/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts rename to systemui4merge/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/systemui4merge/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts similarity index 100% rename from product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename to systemui4merge/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts diff --git a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets b/systemui4merge/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets similarity index 100% rename from product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets rename to systemui4merge/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts b/systemui4merge/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts similarity index 100% rename from product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts rename to systemui4merge/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts b/systemui4merge/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts similarity index 100% rename from product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts rename to systemui4merge/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/constants.ts b/systemui4merge/product/pc/notificationpanel/src/main/ets/pages/common/constants.ts similarity index 100% rename from product/pc/notificationpanel/src/main/ets/pages/common/constants.ts rename to systemui4merge/product/pc/notificationpanel/src/main/ets/pages/common/constants.ts diff --git a/product/pc/notificationpanel/src/main/ets/pages/index.ets b/systemui4merge/product/pc/notificationpanel/src/main/ets/pages/index.ets similarity index 100% rename from product/pc/notificationpanel/src/main/ets/pages/index.ets rename to systemui4merge/product/pc/notificationpanel/src/main/ets/pages/index.ets diff --git a/product/pc/notificationpanel/src/main/ets/pages/notification.ets b/systemui4merge/product/pc/notificationpanel/src/main/ets/pages/notification.ets similarity index 100% rename from product/pc/notificationpanel/src/main/ets/pages/notification.ets rename to systemui4merge/product/pc/notificationpanel/src/main/ets/pages/notification.ets diff --git a/product/pc/notificationpanel/src/main/module.json5 b/systemui4merge/product/pc/notificationpanel/src/main/module.json5 similarity index 100% rename from product/pc/notificationpanel/src/main/module.json5 rename to systemui4merge/product/pc/notificationpanel/src/main/module.json5 diff --git a/product/pc/notificationpanel/src/main/resources/base/element/color.json b/systemui4merge/product/pc/notificationpanel/src/main/resources/base/element/color.json similarity index 100% rename from product/pc/notificationpanel/src/main/resources/base/element/color.json rename to systemui4merge/product/pc/notificationpanel/src/main/resources/base/element/color.json diff --git a/product/pc/notificationpanel/src/main/resources/base/element/float.json b/systemui4merge/product/pc/notificationpanel/src/main/resources/base/element/float.json similarity index 100% rename from product/pc/notificationpanel/src/main/resources/base/element/float.json rename to systemui4merge/product/pc/notificationpanel/src/main/resources/base/element/float.json diff --git a/product/pc/notificationpanel/src/main/resources/base/element/string.json b/systemui4merge/product/pc/notificationpanel/src/main/resources/base/element/string.json similarity index 100% rename from product/pc/notificationpanel/src/main/resources/base/element/string.json rename to systemui4merge/product/pc/notificationpanel/src/main/resources/base/element/string.json diff --git a/product/pc/notificationpanel/src/main/resources/base/media/delete_all.png b/systemui4merge/product/pc/notificationpanel/src/main/resources/base/media/delete_all.png similarity index 100% rename from product/pc/notificationpanel/src/main/resources/base/media/delete_all.png rename to systemui4merge/product/pc/notificationpanel/src/main/resources/base/media/delete_all.png diff --git a/product/pc/notificationpanel/src/main/resources/base/media/ic_message_filled.png b/systemui4merge/product/pc/notificationpanel/src/main/resources/base/media/ic_message_filled.png similarity index 100% rename from product/pc/notificationpanel/src/main/resources/base/media/ic_message_filled.png rename to systemui4merge/product/pc/notificationpanel/src/main/resources/base/media/ic_message_filled.png diff --git a/product/pc/notificationpanel/src/main/resources/base/media/ic_public_delete.svg b/systemui4merge/product/pc/notificationpanel/src/main/resources/base/media/ic_public_delete.svg similarity index 100% rename from product/pc/notificationpanel/src/main/resources/base/media/ic_public_delete.svg rename to systemui4merge/product/pc/notificationpanel/src/main/resources/base/media/ic_public_delete.svg diff --git a/product/pc/notificationpanel/src/main/resources/base/media/ic_public_settings.svg b/systemui4merge/product/pc/notificationpanel/src/main/resources/base/media/ic_public_settings.svg similarity index 100% rename from product/pc/notificationpanel/src/main/resources/base/media/ic_public_settings.svg rename to systemui4merge/product/pc/notificationpanel/src/main/resources/base/media/ic_public_settings.svg diff --git a/product/pc/notificationpanel/src/main/resources/base/media/ic_settings.png b/systemui4merge/product/pc/notificationpanel/src/main/resources/base/media/ic_settings.png similarity index 100% rename from product/pc/notificationpanel/src/main/resources/base/media/ic_settings.png rename to systemui4merge/product/pc/notificationpanel/src/main/resources/base/media/ic_settings.png diff --git a/product/pc/notificationpanel/src/main/resources/base/media/icon.png b/systemui4merge/product/pc/notificationpanel/src/main/resources/base/media/icon.png similarity index 100% rename from product/pc/notificationpanel/src/main/resources/base/media/icon.png rename to systemui4merge/product/pc/notificationpanel/src/main/resources/base/media/icon.png diff --git a/product/pc/notificationpanel/src/main/resources/base/profile/form_config.json b/systemui4merge/product/pc/notificationpanel/src/main/resources/base/profile/form_config.json similarity index 100% rename from product/pc/notificationpanel/src/main/resources/base/profile/form_config.json rename to systemui4merge/product/pc/notificationpanel/src/main/resources/base/profile/form_config.json diff --git a/product/pc/notificationpanel/src/main/resources/base/profile/main_pages.json b/systemui4merge/product/pc/notificationpanel/src/main/resources/base/profile/main_pages.json similarity index 100% rename from product/pc/notificationpanel/src/main/resources/base/profile/main_pages.json rename to systemui4merge/product/pc/notificationpanel/src/main/resources/base/profile/main_pages.json diff --git a/product/pc/notificationpanel/src/main/resources/en_US/element/string.json b/systemui4merge/product/pc/notificationpanel/src/main/resources/en_US/element/string.json similarity index 100% rename from product/pc/notificationpanel/src/main/resources/en_US/element/string.json rename to systemui4merge/product/pc/notificationpanel/src/main/resources/en_US/element/string.json diff --git a/product/pc/notificationpanel/src/main/resources/zh_CN/element/string.json b/systemui4merge/product/pc/notificationpanel/src/main/resources/zh_CN/element/string.json similarity index 100% rename from product/pc/notificationpanel/src/main/resources/zh_CN/element/string.json rename to systemui4merge/product/pc/notificationpanel/src/main/resources/zh_CN/element/string.json diff --git a/product/pc/statusbar/build-profile.json5 b/systemui4merge/product/pc/statusbar/build-profile.json5 similarity index 100% rename from product/pc/statusbar/build-profile.json5 rename to systemui4merge/product/pc/statusbar/build-profile.json5 diff --git a/product/pc/statusbar/hvigorfile.js b/systemui4merge/product/pc/statusbar/hvigorfile.js similarity index 100% rename from product/pc/statusbar/hvigorfile.js rename to systemui4merge/product/pc/statusbar/hvigorfile.js diff --git a/product/pc/statusbar/package-lock.json b/systemui4merge/product/pc/statusbar/package-lock.json similarity index 100% rename from product/pc/statusbar/package-lock.json rename to systemui4merge/product/pc/statusbar/package-lock.json diff --git a/product/pc/statusbar/package.json b/systemui4merge/product/pc/statusbar/package.json similarity index 100% rename from product/pc/statusbar/package.json rename to systemui4merge/product/pc/statusbar/package.json diff --git a/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts b/systemui4merge/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from product/pc/statusbar/src/main/ets/Application/AbilityStage.ts rename to systemui4merge/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/systemui4merge/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts similarity index 100% rename from product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename to systemui4merge/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts diff --git a/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts b/systemui4merge/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts similarity index 100% rename from product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts rename to systemui4merge/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/systemui4merge/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts similarity index 100% rename from product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts rename to systemui4merge/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts b/systemui4merge/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts similarity index 100% rename from product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts rename to systemui4merge/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts diff --git a/product/pc/statusbar/src/main/ets/pages/common/constants.ts b/systemui4merge/product/pc/statusbar/src/main/ets/pages/common/constants.ts similarity index 100% rename from product/pc/statusbar/src/main/ets/pages/common/constants.ts rename to systemui4merge/product/pc/statusbar/src/main/ets/pages/common/constants.ts diff --git a/product/pc/statusbar/src/main/ets/pages/index.ets b/systemui4merge/product/pc/statusbar/src/main/ets/pages/index.ets similarity index 100% rename from product/pc/statusbar/src/main/ets/pages/index.ets rename to systemui4merge/product/pc/statusbar/src/main/ets/pages/index.ets diff --git a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/systemui4merge/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js similarity index 100% rename from product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js rename to systemui4merge/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js diff --git a/product/pc/statusbar/src/main/module.json5 b/systemui4merge/product/pc/statusbar/src/main/module.json5 similarity index 100% rename from product/pc/statusbar/src/main/module.json5 rename to systemui4merge/product/pc/statusbar/src/main/module.json5 diff --git a/product/pc/statusbar/src/main/resources/base/element/color.json b/systemui4merge/product/pc/statusbar/src/main/resources/base/element/color.json similarity index 100% rename from product/pc/statusbar/src/main/resources/base/element/color.json rename to systemui4merge/product/pc/statusbar/src/main/resources/base/element/color.json diff --git a/product/pc/statusbar/src/main/resources/base/element/float.json b/systemui4merge/product/pc/statusbar/src/main/resources/base/element/float.json similarity index 100% rename from product/pc/statusbar/src/main/resources/base/element/float.json rename to systemui4merge/product/pc/statusbar/src/main/resources/base/element/float.json diff --git a/product/pc/statusbar/src/main/resources/base/element/string.json b/systemui4merge/product/pc/statusbar/src/main/resources/base/element/string.json similarity index 100% rename from product/pc/statusbar/src/main/resources/base/element/string.json rename to systemui4merge/product/pc/statusbar/src/main/resources/base/element/string.json diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_status_bt.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_status_bt.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_status_bt.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_status_bt.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg diff --git a/product/pc/statusbar/src/main/resources/base/media/icon.png b/systemui4merge/product/pc/statusbar/src/main/resources/base/media/icon.png similarity index 100% rename from product/pc/statusbar/src/main/resources/base/media/icon.png rename to systemui4merge/product/pc/statusbar/src/main/resources/base/media/icon.png diff --git a/product/pc/statusbar/src/main/resources/base/profile/main_pages.json b/systemui4merge/product/pc/statusbar/src/main/resources/base/profile/main_pages.json similarity index 100% rename from product/pc/statusbar/src/main/resources/base/profile/main_pages.json rename to systemui4merge/product/pc/statusbar/src/main/resources/base/profile/main_pages.json diff --git a/product/pc/statusbar/src/main/resources/en_US/element/string.json b/systemui4merge/product/pc/statusbar/src/main/resources/en_US/element/string.json similarity index 100% rename from product/pc/statusbar/src/main/resources/en_US/element/string.json rename to systemui4merge/product/pc/statusbar/src/main/resources/en_US/element/string.json diff --git a/product/pc/statusbar/src/main/resources/pointingdevice/element/float.json b/systemui4merge/product/pc/statusbar/src/main/resources/pointingdevice/element/float.json similarity index 100% rename from product/pc/statusbar/src/main/resources/pointingdevice/element/float.json rename to systemui4merge/product/pc/statusbar/src/main/resources/pointingdevice/element/float.json diff --git a/product/pc/statusbar/src/main/resources/zh_CN/element/string.json b/systemui4merge/product/pc/statusbar/src/main/resources/zh_CN/element/string.json similarity index 100% rename from product/pc/statusbar/src/main/resources/zh_CN/element/string.json rename to systemui4merge/product/pc/statusbar/src/main/resources/zh_CN/element/string.json diff --git a/product/phone/dropdownpanel/.gitignore b/systemui4merge/product/phone/dropdownpanel/.gitignore similarity index 100% rename from product/phone/dropdownpanel/.gitignore rename to systemui4merge/product/phone/dropdownpanel/.gitignore diff --git a/product/phone/dropdownpanel/build-profile.json5 b/systemui4merge/product/phone/dropdownpanel/build-profile.json5 similarity index 100% rename from product/phone/dropdownpanel/build-profile.json5 rename to systemui4merge/product/phone/dropdownpanel/build-profile.json5 diff --git a/product/phone/dropdownpanel/hvigorfile.js b/systemui4merge/product/phone/dropdownpanel/hvigorfile.js similarity index 100% rename from product/phone/dropdownpanel/hvigorfile.js rename to systemui4merge/product/phone/dropdownpanel/hvigorfile.js diff --git a/product/phone/dropdownpanel/package-lock.json b/systemui4merge/product/phone/dropdownpanel/package-lock.json similarity index 100% rename from product/phone/dropdownpanel/package-lock.json rename to systemui4merge/product/phone/dropdownpanel/package-lock.json diff --git a/product/phone/dropdownpanel/package.json b/systemui4merge/product/phone/dropdownpanel/package.json similarity index 100% rename from product/phone/dropdownpanel/package.json rename to systemui4merge/product/phone/dropdownpanel/package.json diff --git a/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts b/systemui4merge/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts rename to systemui4merge/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/systemui4merge/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename to systemui4merge/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts diff --git a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets rename to systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts rename to systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts b/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts rename to systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts b/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts rename to systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts b/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts rename to systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts b/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts rename to systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts diff --git a/product/phone/dropdownpanel/src/main/ets/pages/control.ets b/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/control.ets similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/pages/control.ets rename to systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/control.ets diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/index.ets similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/pages/index.ets rename to systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/index.ets diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/notification.ets similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/pages/notification.ets rename to systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/notification.ets diff --git a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js b/systemui4merge/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js similarity index 100% rename from product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js rename to systemui4merge/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js diff --git a/product/phone/dropdownpanel/src/main/module.json5 b/systemui4merge/product/phone/dropdownpanel/src/main/module.json5 similarity index 100% rename from product/phone/dropdownpanel/src/main/module.json5 rename to systemui4merge/product/phone/dropdownpanel/src/main/module.json5 diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/color.json b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/color.json similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/element/color.json rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/color.json diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/float.json b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/float.json similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/element/float.json rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/float.json diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/string.json b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/string.json similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/element/string.json rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/string.json diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/airplane.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/airplane.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/airplane.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/airplane.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/delete_all.png b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/delete_all.png similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/delete_all.png rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/delete_all.png diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/icon.png b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/icon.png similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/icon.png rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/icon.png diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/wifi.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/wifi.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/wifi.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/wifi.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg diff --git a/product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json b/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json diff --git a/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json b/systemui4merge/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/en_US/element/string.json rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json diff --git a/product/phone/dropdownpanel/src/main/resources/phone/element/float.json b/systemui4merge/product/phone/dropdownpanel/src/main/resources/phone/element/float.json similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/phone/element/float.json rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/phone/element/float.json diff --git a/product/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png b/systemui4merge/product/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png diff --git a/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json b/systemui4merge/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json similarity index 100% rename from product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json rename to systemui4merge/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json diff --git a/product/phone/statusbar/.gitignore b/systemui4merge/product/phone/statusbar/.gitignore similarity index 100% rename from product/phone/statusbar/.gitignore rename to systemui4merge/product/phone/statusbar/.gitignore diff --git a/product/phone/statusbar/build-profile.json5 b/systemui4merge/product/phone/statusbar/build-profile.json5 similarity index 100% rename from product/phone/statusbar/build-profile.json5 rename to systemui4merge/product/phone/statusbar/build-profile.json5 diff --git a/product/phone/statusbar/hvigorfile.js b/systemui4merge/product/phone/statusbar/hvigorfile.js similarity index 100% rename from product/phone/statusbar/hvigorfile.js rename to systemui4merge/product/phone/statusbar/hvigorfile.js diff --git a/product/phone/statusbar/package-lock.json b/systemui4merge/product/phone/statusbar/package-lock.json similarity index 100% rename from product/phone/statusbar/package-lock.json rename to systemui4merge/product/phone/statusbar/package-lock.json diff --git a/product/phone/statusbar/package.json b/systemui4merge/product/phone/statusbar/package.json similarity index 100% rename from product/phone/statusbar/package.json rename to systemui4merge/product/phone/statusbar/package.json diff --git a/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts b/systemui4merge/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from product/phone/statusbar/src/main/ets/Application/AbilityStage.ts rename to systemui4merge/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/systemui4merge/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts similarity index 100% rename from product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename to systemui4merge/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts diff --git a/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts b/systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts similarity index 100% rename from product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts rename to systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts diff --git a/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts similarity index 100% rename from product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts rename to systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts diff --git a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts b/systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts similarity index 100% rename from product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts rename to systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts diff --git a/product/phone/statusbar/src/main/ets/pages/common/constants.ts b/systemui4merge/product/phone/statusbar/src/main/ets/pages/common/constants.ts similarity index 100% rename from product/phone/statusbar/src/main/ets/pages/common/constants.ts rename to systemui4merge/product/phone/statusbar/src/main/ets/pages/common/constants.ts diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/systemui4merge/product/phone/statusbar/src/main/ets/pages/index.ets similarity index 100% rename from product/phone/statusbar/src/main/ets/pages/index.ets rename to systemui4merge/product/phone/statusbar/src/main/ets/pages/index.ets diff --git a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/systemui4merge/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js similarity index 100% rename from product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js rename to systemui4merge/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js diff --git a/product/phone/statusbar/src/main/module.json5 b/systemui4merge/product/phone/statusbar/src/main/module.json5 similarity index 100% rename from product/phone/statusbar/src/main/module.json5 rename to systemui4merge/product/phone/statusbar/src/main/module.json5 diff --git a/product/phone/statusbar/src/main/resources/base/element/color.json b/systemui4merge/product/phone/statusbar/src/main/resources/base/element/color.json similarity index 100% rename from product/phone/statusbar/src/main/resources/base/element/color.json rename to systemui4merge/product/phone/statusbar/src/main/resources/base/element/color.json diff --git a/product/phone/statusbar/src/main/resources/base/element/float.json b/systemui4merge/product/phone/statusbar/src/main/resources/base/element/float.json similarity index 100% rename from product/phone/statusbar/src/main/resources/base/element/float.json rename to systemui4merge/product/phone/statusbar/src/main/resources/base/element/float.json diff --git a/product/phone/statusbar/src/main/resources/base/element/string.json b/systemui4merge/product/phone/statusbar/src/main/resources/base/element/string.json similarity index 100% rename from product/phone/statusbar/src/main/resources/base/element/string.json rename to systemui4merge/product/phone/statusbar/src/main/resources/base/element/string.json diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg diff --git a/product/phone/statusbar/src/main/resources/base/media/icon.png b/systemui4merge/product/phone/statusbar/src/main/resources/base/media/icon.png similarity index 100% rename from product/phone/statusbar/src/main/resources/base/media/icon.png rename to systemui4merge/product/phone/statusbar/src/main/resources/base/media/icon.png diff --git a/product/phone/statusbar/src/main/resources/base/profile/main_pages.json b/systemui4merge/product/phone/statusbar/src/main/resources/base/profile/main_pages.json similarity index 100% rename from product/phone/statusbar/src/main/resources/base/profile/main_pages.json rename to systemui4merge/product/phone/statusbar/src/main/resources/base/profile/main_pages.json diff --git a/product/phone/statusbar/src/main/resources/en_US/element/string.json b/systemui4merge/product/phone/statusbar/src/main/resources/en_US/element/string.json similarity index 100% rename from product/phone/statusbar/src/main/resources/en_US/element/string.json rename to systemui4merge/product/phone/statusbar/src/main/resources/en_US/element/string.json diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg b/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg similarity index 100% rename from product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg rename to systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg diff --git a/product/phone/statusbar/src/main/resources/zh_CN/element/string.json b/systemui4merge/product/phone/statusbar/src/main/resources/zh_CN/element/string.json similarity index 100% rename from product/phone/statusbar/src/main/resources/zh_CN/element/string.json rename to systemui4merge/product/phone/statusbar/src/main/resources/zh_CN/element/string.json diff --git a/signature/systemui.p7b b/systemui4merge/signature/systemui.p7b similarity index 100% rename from signature/systemui.p7b rename to systemui4merge/signature/systemui.p7b -- Gitee From ebfa8098f91b157aebd9ce6ecc7f71115b918fd5 Mon Sep 17 00:00:00 2001 From: sunhaiyang Date: Fri, 24 Mar 2023 16:50:16 +0800 Subject: [PATCH 348/373] =?UTF-8?q?=E5=90=88=E4=B8=80=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0systemui=E7=8A=B6=E6=80=81=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-profile.json5 | 132 ++++++++++++++++++ .../src/main/ets/default/CheckEmptyUtils.ts | 0 .../main/ets/default/CommonStyleManager.ts | 3 +- .../src/main/ets/default/Constants.ts | 0 .../src/main/ets/default/Decorators.ts | 2 +- .../src/main/ets/default/InitSystemUi.ts | 2 +- .../ets/default/MultimodalInputManager.ts | 2 +- .../src/main/ets/default/ReadConfigUtil.ts | 2 +- .../src/main/ets/default/ResourceUtil.ts | 0 .../src/main/ets/default/ScreenLockManager.ts | 2 +- .../src/main/ets/default/SettingsUtil.ts | 2 +- .../main/ets/default/SingleInstanceHelper.ts | 2 +- .../main/ets/default/StyleConfiguration.ts | 0 .../src/main/ets/default/SwitchUserManager.ts | 2 +- .../src/main/ets/default/SysFaultLogger.ts | 2 +- .../src/main/ets/default/TimeManager.ts | 2 +- .../src/main/ets/default/TintStateManager.ts | 6 +- .../src/main/ets/default/Trace.ts | 2 +- .../src/main/ets/default/WindowManager.ts | 2 +- .../default/abilitymanager/abilityManager.ts | 2 +- .../default/abilitymanager/bundleManager.ts | 2 +- .../abilitymanager/featureAbilityManager.ts | 2 +- .../abilitymanager/notificationManager.ts | 2 +- .../default/commonEvent/CommonEventManager.ts | 2 +- .../src/main/ets/default/event/EventBus.ts | 2 +- .../main/ets/default/event/EventManager.ts | 2 +- .../src/main/ets/default/event/EventUtil.ts | 2 +- .../heightcofigUtils/HeightConfigUtils.ts | 2 +- .../PluginDataSourceAdapter.ts | 5 +- .../PluginDataSourceManager.ts | 2 +- .../common/BundleParseUtil.ts | 2 +- .../ets/plugindatasource/common/Constants.ts | 0 .../common/PluginComponentManagerUtil.ts | 2 +- .../sourceloader/DataAbilitySourceLoader.ts | 2 +- .../sourceloader/MetaSourceLoader.ts | 2 +- .../sourceloader/PluginSourceLoader.ts | 2 +- .../sourceloader/PluginSourceLoaderPatch.ts | 2 +- .../sourceloader/SourceLoader.ts | 2 +- .../sourceloader/SourceLoaderFactory.ts | 2 +- .../main/ets/template/SimpleToggleBase.ets | 0 .../ets/template/common/StyleConfiguration.ts | 0 .../src/main/ets/template/iconComponent.ets | 0 .../src/main/ets/template/iconTitleBase.ets | 0 .../batterycomponent/build-profile.json5 | 0 .../systemui/batterycomponent/hvigorfile.ts | 0 .../batterycomponent}/package-lock.json | 6 +- .../systemui/batterycomponent/package.json | 15 ++ .../src/main/ets/default/batteryModel.ts | 7 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../src/main/ets/default/common/constants.ts | 0 .../main/ets/default/pages/batteryIcon.ets | 4 +- .../src/main/ets/default/pages/batteryPic.ets | 4 +- .../src/main/ets/default/pages/batterySoc.ets | 6 +- .../main/ets/default/viewmodel/BatteryVM.ts | 8 +- .../batterycomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../bluetoothcomponent/build-profile.json5 | 0 .../systemui/bluetoothcomponent/hvigorfile.ts | 0 .../bluetoothcomponent/package-lock.json | 8 +- .../systemui/bluetoothcomponent/package.json | 15 ++ .../src/main/ets/com/ohos/common/Constants.ts | 0 .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../ets/com/ohos/model/BluetoothService.ts | 4 +- ...lCenterComplexToggleBluetoothComponent.ets | 8 +- .../StatusBarIconItemBluetoothComponent.ets | 6 +- .../ets/com/ohos/viewmodel/BluetoothVM.ts | 8 +- .../bluetoothcomponent/src/main/module.json5 | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../base/media/ic_controlcenter_bt.svg | 0 .../base/media/ic_controlcenter_bt_d.svg | 0 .../resources/base/media/ic_status_bt.svg | 0 .../base/media/ic_status_bt_close.svg | 0 .../base/media/ic_status_bt_connecting.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../resources/phone/media/ic_status_bt.svg | 0 .../main/resources/zh_CN/element/string.json | 0 .../capsulecomponent/build-profile.json5 | 0 .../systemui/capsulecomponent/hvigorfile.ts | 0 .../capsulecomponent/package-lock.json | 8 +- .../systemui/capsulecomponent/package.json | 15 ++ .../ets/default/common/StyleConfiguration.ts | 2 +- .../src/main/ets/default/common/constants.ts | 0 .../main/ets/default/model/CapsuleModel.ts | 2 +- .../main/ets/default/pages/CapsuleIcon.ets | 4 +- .../ets/default/viewmodel/CapsuleViewModel.ts | 8 +- .../capsulecomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../base/media/ic_statusbar_phone.svg | 0 .../main/resources/en_US/element/string.json | 0 .../phone/media/ic_statusbar_phone.svg | 0 .../main/resources/zh_CN/element/string.json | 0 .../clockcomponent/build-profile.json5 | 0 .../systemui/clockcomponent/hvigorfile.ts | 0 .../clockcomponent/package-lock.json | 8 +- feature/systemui/clockcomponent/package.json | 15 ++ .../ets/default/common/StyleConfiguration.ts | 2 +- .../src/main/ets/default/pages/clockIcon.ets | 10 +- .../src/main/ets/default/viewmodel/ClockVM.ts | 8 +- .../clockcomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../locationcomponent/build-profile.json5 | 0 .../systemui/locationcomponent/hvigorfile.ts | 0 .../locationcomponent/package-lock.json | 8 +- .../systemui/locationcomponent/package.json | 15 ++ .../src/main/ets/com/ohos/common/Constants.ts | 0 .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../ets/com/ohos/model/LocationService.ts | 4 +- ...rolCenterSimpleToggleLocationComponent.ets | 8 +- .../StatusBarIconItemLocationComponent.ets | 6 +- .../main/ets/com/ohos/viewmodel/LocationVM.ts | 10 +- .../locationcomponent/src/main/module.json5 | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../base/media/ic_controlcenter_gps.svg | 0 .../resources/base/media/ic_statusbar_gps.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../phone/media/ic_statusbar_gps.svg | 0 .../main/resources/zh_CN/element/string.json | 0 .../nfccomponent/build-profile.json5 | 0 .../systemui/nfccomponent/hvigorfile.ts | 0 .../systemui/nfccomponent/package-lock.json | 11 ++ feature/systemui/nfccomponent/package.json | 15 ++ .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../main/ets/com/ohos/model/NFCModeService.ts | 4 +- .../ControlCenterSimpleToggleNFComponent.ets | 6 +- .../pages/StatusBarIconItemNFComponent.ets | 6 +- .../main/ets/com/ohos/viewmodel/NFCModeVM.ts | 8 +- .../nfccomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../base/media/ic_notification_nfc.svg | 0 .../base/media/ic_notification_nfc_filled.svg | 0 .../resources/base/media/ic_statusbar_nfc.svg | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../phone/media/ic_notification_nfc.svg | 0 .../media/ic_notification_nfc_filled.svg | 0 .../phone/media/ic_statusbar_nfc.svg | 0 .../media/ic_statusbar_ring_off_filled.svg | 0 .../phone/media/ic_statusbar_vibration_on.svg | 0 .../main/resources/zh_CN/element/string.json | 0 .../systemui}/phone/statusbar/.gitignore | 0 .../phone/statusbar}/build-profile.json5 | 0 .../systemui/phone/statusbar/hvigorfile.ts | 0 .../phone/statusbar/package-lock.json | 130 +++++++++++++++++ feature/systemui/phone/statusbar/package.json | 15 ++ .../src/main/ets/pages/StatusBar.ets | 118 ++++++++++++---- .../main/ets/pages/common/StatusbarConfig.ts | 4 +- .../ets/pages/common/StyleConfiguration.ts | 2 +- .../src/main/ets/pages/common/StyleManager.ts | 4 +- .../src/main/ets/pages/common/constants.ts | 0 .../ets/workers/PluginDataSourceWorker.js | 6 +- .../phone/statusbar/src/main/module.json5 | 10 ++ .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../resources/base/media/ic_status_bt.svg | 0 .../resources/base/media/ic_statusbar_gps.svg | 0 .../resources/base/media/ic_statusbar_nfc.svg | 0 .../base/media/ic_statusbar_phone.svg | 0 .../media/ic_statusbar_ring_off_filled.svg | 0 .../base/media/ic_statusbar_signal_1.svg | 0 .../base/media/ic_statusbar_signal_2.svg | 0 .../base/media/ic_statusbar_signal_3.svg | 0 .../base/media/ic_statusbar_signal_4.svg | 0 .../base/media/ic_statusbar_signal_full.svg | 0 .../base/media/ic_statusbar_signal_no.svg | 0 .../media/ic_statusbar_signal_roaming.png | Bin .../base/media/ic_statusbar_signal_wait.png | Bin .../base/media/ic_statusbar_vibration_on.svg | 0 .../base/media/ic_statusbar_wifi_1.svg | 0 .../base/media/ic_statusbar_wifi_2.svg | 0 .../base/media/ic_statusbar_wifi_3.svg | 0 .../base/media/ic_statusbar_wifi_connect.png | Bin .../base/media/ic_statusbar_wifi_full.svg | 0 .../base/media/ic_statusbar_wifi_no.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../resources/base/profile/main_pages.json | 0 .../main/resources/en_US/element/string.json | 0 .../resources/phone/media/ic_status_bt.svg | 0 .../phone/media/ic_statusbar_gps.svg | 0 .../phone}/media/ic_statusbar_nfc.svg | 0 .../phone/media/ic_statusbar_phone.svg | 0 .../media/ic_statusbar_ring_off_filled.svg | 0 .../phone/media/ic_statusbar_signal_1.svg | 0 .../phone/media/ic_statusbar_signal_2.svg | 0 .../phone/media/ic_statusbar_signal_3.svg | 0 .../phone/media/ic_statusbar_signal_4.svg | 0 .../phone/media/ic_statusbar_signal_full.svg | 0 .../phone/media/ic_statusbar_signal_no.svg | 0 .../phone/media/ic_statusbar_vibration_on.svg | 0 .../phone/media/ic_statusbar_wifi_1.svg | 0 .../phone/media/ic_statusbar_wifi_2.svg | 0 .../phone/media/ic_statusbar_wifi_3.svg | 0 .../phone/media/ic_statusbar_wifi_full.svg | 0 .../phone/media/ic_statusbar_wifi_no.svg | 0 .../main/resources/zh_CN/element/string.json | 0 .../ringmodecomponent}/build-profile.json5 | 0 .../systemui/ringmodecomponent/hvigorfile.ts | 0 .../ringmodecomponent/package-lock.json | 8 +- .../systemui/ringmodecomponent/package.json | 15 ++ .../src/main/ets/com/ohos/common/Constants.ts | 0 .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../ets/com/ohos/model/RingModeService.ts | 6 +- ...rolCenterSimpleToggleRingModeComponent.ets | 8 +- .../StatusBarIconItemRingModeComponent.ets | 6 +- .../main/ets/com/ohos/viewmodel/RingModeVM.ts | 8 +- .../ringmodecomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../ic_controlcenter_ring_off_filled.svg | 0 .../media/ic_controlcenter_ring_on_filled.svg | 0 .../ic_controlcenter_vibration_filled.svg | 0 .../media/ic_statusbar_ring_off_filled.svg | 0 .../base/media/ic_statusbar_vibration_on.svg | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../media/ic_statusbar_ring_off_filled.svg | 0 .../phone/media/ic_statusbar_vibration_on.svg | 0 .../main/resources/zh_CN/element/string.json | 0 .../signalcomponent}/build-profile.json5 | 0 .../systemui/signalcomponent/hvigorfile.ts | 0 .../signalcomponent/package-lock.json | 8 +- feature/systemui/signalcomponent/package.json | 15 ++ .../ets/default/common/StyleConfiguration.ts | 2 +- .../src/main/ets/default/common/constants.ts | 0 .../src/main/ets/default/pages/signalIcon.ets | 6 +- .../src/main/ets/default/signalModel.ts | 2 +- .../main/ets/default/viewmodel/SignalVM.ts | 8 +- .../signalcomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../base/media/ic_statusbar_signal_1.svg | 0 .../base/media/ic_statusbar_signal_2.svg | 0 .../base/media/ic_statusbar_signal_3.svg | 0 .../base/media/ic_statusbar_signal_4.svg | 0 .../base/media/ic_statusbar_signal_full.svg | 0 .../base/media/ic_statusbar_signal_no.svg | 0 .../media/ic_statusbar_signal_roaming.png | Bin .../base/media/ic_statusbar_signal_wait.png | Bin .../base/media/ic_statusbar_wifi_connect.png | Bin .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../phone/media/ic_statusbar_signal_1.svg | 0 .../phone/media/ic_statusbar_signal_2.svg | 0 .../phone/media/ic_statusbar_signal_3.svg | 0 .../phone/media/ic_statusbar_signal_4.svg | 0 .../phone/media/ic_statusbar_signal_full.svg | 0 .../phone/media/ic_statusbar_signal_no.svg | 0 .../main/resources/zh_CN/element/string.json | 0 .../statusbarcomponent}/build-profile.json5 | 0 .../systemui/statusbarcomponent/hvigorfile.ts | 0 .../statusbarcomponent/package-lock.json | 110 +++++++++++++++ .../systemui/statusbarcomponent/package.json | 25 ++++ .../src/main/ets/com/ohos/common/Constants.ts | 4 +- .../com/ohos/common/StatusBarConfiguration.ts | 27 ++-- .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../ets/com/ohos/model/StatusBarService.ts | 16 +-- .../ets/com/ohos/pages/IconItemComponent.ets | 12 +- .../com/ohos/pages/MetaIconItemComponent.ets | 10 +- .../ohos/pages/PluginIconItemComponent.ets | 8 +- .../ets/com/ohos/pages/StatusBarComponent.ets | 28 ++-- .../ets/com/ohos/viewmodel/StatusBarVM.ts | 31 ++-- .../statusbarcomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../base}/media/ic_statusbar_nfc.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../main/resources/phone/element/float.json | 0 .../wificomponent}/build-profile.json5 | 0 .../systemui/wificomponent/hvigorfile.ts | 2 +- .../systemui}/wificomponent/package-lock.json | 8 +- feature/systemui/wificomponent/package.json | 15 ++ .../ets/default/common/StyleConfiguration.ts | 2 +- .../src/main/ets/default/common/constants.ts | 0 .../main/ets/default/pages/wifiComponent.ets | 8 +- .../src/main/ets/default/pages/wifiIcon.ets | 6 +- .../src/main/ets/default/viewmodel/WifiVM.ts | 8 +- .../src/main/ets/default/wifiModel.ts | 2 +- .../wificomponent/src/main/module.json5 | 0 .../main/resources/base/element/float.json | 0 .../base/media/ic_statusbar_wifi_1.svg | 0 .../base/media/ic_statusbar_wifi_2.svg | 0 .../base/media/ic_statusbar_wifi_3.svg | 0 .../base/media/ic_statusbar_wifi_full.svg | 0 .../base/media/ic_statusbar_wifi_no.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/media/wifi.svg | 0 .../src/main/resources/base/media/wifi_d.svg | 0 .../main/resources/phone/element/float.json | 0 .../phone/media/ic_statusbar_wifi_1.svg | 0 .../phone/media/ic_statusbar_wifi_2.svg | 0 .../phone/media/ic_statusbar_wifi_3.svg | 0 .../phone/media/ic_statusbar_wifi_full.svg | 0 .../phone/media/ic_statusbar_wifi_no.svg | 0 product/phone/package-lock.json | 131 +++++++++++++++++ product/phone/package.json | 37 ++--- .../src/main/ets/MainAbility/MainAbility.ts | 4 + .../src/main/ets/WindowScene/HWScreen.ets | 2 + .../src/main/ets/WindowScene/HWSystemUi.ets | 51 +++++++ product/phone/src/main/module.json5 | 45 ++++++ signature/launcher.p7b | Bin 4074 -> 4435 bytes .../common/src/main/ets/default/Log.ts | 121 ---------------- .../batterycomponent/package-lock.json | 5 - .../features/batterycomponent/package.json | 12 -- .../features/bluetoothcomponent/package.json | 12 -- .../features/capsulecomponent/package.json | 12 -- .../features/clockcomponent/package.json | 12 -- .../features/locationcomponent/package.json | 12 -- .../features/nfccomponent/package-lock.json | 5 - .../features/nfccomponent/package.json | 12 -- .../features/ringmodecomponent/package.json | 12 -- .../features/signalcomponent/package.json | 12 -- .../statusbarcomponent/package-lock.json | 5 - .../features/statusbarcomponent/package.json | 12 -- .../features/wificomponent/package.json | 12 -- .../product/phone/statusbar/package.json | 13 -- .../src/main/ets/Application/AbilityStage.ts | 24 ---- .../ServiceExtAbility/ServiceExtAbility.ts | 115 --------------- .../phone/statusbar/src/main/module.json5 | 33 ----- 342 files changed, 1189 insertions(+), 725 deletions(-) rename {systemui4merge/common => common}/src/main/ets/default/CheckEmptyUtils.ts (100%) rename {systemui4merge/common => common}/src/main/ets/default/CommonStyleManager.ts (97%) rename {systemui4merge/common => common}/src/main/ets/default/Constants.ts (100%) rename {systemui4merge/common => common}/src/main/ets/default/Decorators.ts (97%) rename {systemui4merge/common => common}/src/main/ets/default/InitSystemUi.ts (96%) rename {systemui4merge/common => common}/src/main/ets/default/MultimodalInputManager.ts (98%) rename {systemui4merge/common => common}/src/main/ets/default/ReadConfigUtil.ts (97%) rename {systemui4merge/common => common}/src/main/ets/default/ResourceUtil.ts (100%) rename {systemui4merge/common => common}/src/main/ets/default/ScreenLockManager.ts (98%) rename {systemui4merge/common => common}/src/main/ets/default/SettingsUtil.ts (98%) rename {systemui4merge/common => common}/src/main/ets/default/SingleInstanceHelper.ts (97%) rename {systemui4merge/common => common}/src/main/ets/default/StyleConfiguration.ts (100%) rename {systemui4merge/common => common}/src/main/ets/default/SwitchUserManager.ts (99%) rename {systemui4merge/common => common}/src/main/ets/default/SysFaultLogger.ts (98%) rename {systemui4merge/common => common}/src/main/ets/default/TimeManager.ts (99%) rename {systemui4merge/common => common}/src/main/ets/default/TintStateManager.ts (95%) rename {systemui4merge/common => common}/src/main/ets/default/Trace.ts (98%) rename {systemui4merge/common => common}/src/main/ets/default/WindowManager.ts (99%) rename {systemui4merge/common => common}/src/main/ets/default/abilitymanager/abilityManager.ts (99%) rename {systemui4merge/common => common}/src/main/ets/default/abilitymanager/bundleManager.ts (98%) rename {systemui4merge/common => common}/src/main/ets/default/abilitymanager/featureAbilityManager.ts (98%) rename {systemui4merge/common => common}/src/main/ets/default/abilitymanager/notificationManager.ts (98%) rename {systemui4merge/common => common}/src/main/ets/default/commonEvent/CommonEventManager.ts (98%) rename {systemui4merge/common => common}/src/main/ets/default/event/EventBus.ts (98%) rename {systemui4merge/common => common}/src/main/ets/default/event/EventManager.ts (99%) rename {systemui4merge/common => common}/src/main/ets/default/event/EventUtil.ts (98%) rename {systemui4merge/common => common}/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts (96%) rename {systemui4merge/common => common}/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts (97%) rename {systemui4merge/common => common}/src/main/ets/plugindatasource/PluginDataSourceManager.ts (99%) rename {systemui4merge/common => common}/src/main/ets/plugindatasource/common/BundleParseUtil.ts (99%) rename {systemui4merge/common => common}/src/main/ets/plugindatasource/common/Constants.ts (100%) rename {systemui4merge/common => common}/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts (98%) rename {systemui4merge/common => common}/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts (96%) rename {systemui4merge/common => common}/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts (98%) rename {systemui4merge/common => common}/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts (98%) rename {systemui4merge/common => common}/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts (98%) rename {systemui4merge/common => common}/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts (97%) rename {systemui4merge/common => common}/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts (97%) rename {systemui4merge/common => common}/src/main/ets/template/SimpleToggleBase.ets (100%) rename {systemui4merge/common => common}/src/main/ets/template/common/StyleConfiguration.ts (100%) rename {systemui4merge/common => common}/src/main/ets/template/iconComponent.ets (100%) rename {systemui4merge/common => common}/src/main/ets/template/iconTitleBase.ets (100%) rename {systemui4merge/features => feature/systemui}/batterycomponent/build-profile.json5 (100%) rename systemui4merge/features/batterycomponent/hvigorfile.js => feature/systemui/batterycomponent/hvigorfile.ts (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/batterycomponent}/package-lock.json (44%) create mode 100644 feature/systemui/batterycomponent/package.json rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/ets/default/batteryModel.ts (90%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts (95%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/ets/default/common/constants.ts (100%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/ets/default/pages/batteryIcon.ets (92%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/ets/default/pages/batteryPic.ets (94%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/ets/default/pages/batterySoc.ets (83%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts (75%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/resources/base/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/batterycomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/build-profile.json5 (100%) rename systemui4merge/features/bluetoothcomponent/hvigorfile.js => feature/systemui/bluetoothcomponent/hvigorfile.ts (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/package-lock.json (32%) create mode 100644 feature/systemui/bluetoothcomponent/package.json rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (91%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts (94%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets (84%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets (88%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts (84%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg (100%) rename {systemui4merge/features => feature/systemui}/bluetoothcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/build-profile.json5 (100%) rename systemui4merge/features/capsulecomponent/hvigorfile.js => feature/systemui/capsulecomponent/hvigorfile.ts (100%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/package-lock.json (31%) create mode 100644 feature/systemui/capsulecomponent/package.json rename {systemui4merge/features => feature/systemui}/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts (93%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/src/main/ets/default/common/constants.ts (100%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts (96%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets (96%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts (92%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/src/main/resources/base/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg (100%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg (100%) rename {systemui4merge/features => feature/systemui}/capsulecomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/clockcomponent/build-profile.json5 (100%) rename systemui4merge/features/clockcomponent/hvigorfile.js => feature/systemui/clockcomponent/hvigorfile.ts (100%) rename {systemui4merge/features => feature/systemui}/clockcomponent/package-lock.json (30%) create mode 100644 feature/systemui/clockcomponent/package.json rename {systemui4merge/features => feature/systemui}/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts (90%) rename {systemui4merge/features => feature/systemui}/clockcomponent/src/main/ets/default/pages/clockIcon.ets (83%) rename {systemui4merge/features => feature/systemui}/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts (75%) rename {systemui4merge/features => feature/systemui}/clockcomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/clockcomponent/src/main/resources/base/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/clockcomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/clockcomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/clockcomponent/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/features => feature/systemui}/clockcomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/clockcomponent/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/clockcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/locationcomponent/build-profile.json5 (100%) rename systemui4merge/features/locationcomponent/hvigorfile.js => feature/systemui/locationcomponent/hvigorfile.ts (100%) rename {systemui4merge/features => feature/systemui}/locationcomponent/package-lock.json (31%) create mode 100644 feature/systemui/locationcomponent/package.json rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/ets/com/ohos/common/Constants.ts (100%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (91%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts (93%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets (84%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets (88%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts (81%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg (100%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg (100%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg (100%) rename {systemui4merge/features => feature/systemui}/locationcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/build-profile.json5 (100%) rename systemui4merge/features/nfccomponent/hvigorfile.js => feature/systemui/nfccomponent/hvigorfile.ts (100%) create mode 100644 feature/systemui/nfccomponent/package-lock.json create mode 100644 feature/systemui/nfccomponent/package.json rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (93%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts (94%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets (87%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets (89%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts (86%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/base/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg (100%) rename {systemui4merge/features => feature/systemui}/nfccomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/.gitignore (100%) rename {systemui4merge/features/ringmodecomponent => feature/systemui/phone/statusbar}/build-profile.json5 (100%) rename systemui4merge/features/ringmodecomponent/hvigorfile.js => feature/systemui/phone/statusbar/hvigorfile.ts (100%) create mode 100644 feature/systemui/phone/statusbar/package-lock.json create mode 100644 feature/systemui/phone/statusbar/package.json rename systemui4merge/product/phone/statusbar/src/main/ets/pages/index.ets => feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets (58%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts (91%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts (89%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/ets/pages/common/StyleManager.ts (88%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/ets/pages/common/constants.ts (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js (90%) create mode 100644 feature/systemui/phone/statusbar/src/main/module.json5 rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/resources/base/element/color.json (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/resources/base/element/float.json (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/resources/base/element/string.json (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg (100%) rename {systemui4merge/features/statusbarcomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_nfc.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg (100%) rename {systemui4merge/features/ringmodecomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_signal_1.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_signal_2.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_signal_3.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_signal_4.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_signal_full.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_signal_no.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_signal_roaming.png (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_signal_wait.png (100%) rename {systemui4merge/features/ringmodecomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_vibration_on.svg (100%) rename {systemui4merge/features/wificomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_wifi_1.svg (100%) rename {systemui4merge/features/wificomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_wifi_2.svg (100%) rename {systemui4merge/features/wificomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_wifi_3.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_wifi_connect.png (100%) rename {systemui4merge/features/wificomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_wifi_full.svg (100%) rename {systemui4merge/features/wificomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/ic_statusbar_wifi_no.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/resources/base/profile/main_pages.json (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg (100%) rename {systemui4merge/product/phone/statusbar/src/main/resources/base => feature/systemui/phone/statusbar/src/main/resources/phone}/media/ic_statusbar_nfc.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg (100%) rename {systemui4merge/features/ringmodecomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_signal_1.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_signal_2.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_signal_3.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_signal_4.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_signal_full.svg (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_signal_no.svg (100%) rename {systemui4merge/features/ringmodecomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_vibration_on.svg (100%) rename {systemui4merge/features/wificomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_wifi_1.svg (100%) rename {systemui4merge/features/wificomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_wifi_2.svg (100%) rename {systemui4merge/features/wificomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_wifi_3.svg (100%) rename {systemui4merge/features/wificomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_wifi_full.svg (100%) rename {systemui4merge/features/wificomponent => feature/systemui/phone/statusbar}/src/main/resources/phone/media/ic_statusbar_wifi_no.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/statusbar/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/features/signalcomponent => feature/systemui/ringmodecomponent}/build-profile.json5 (100%) rename systemui4merge/features/signalcomponent/hvigorfile.js => feature/systemui/ringmodecomponent/hvigorfile.ts (100%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/package-lock.json (31%) create mode 100644 feature/systemui/ringmodecomponent/package.json rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts (100%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (93%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts (90%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets (90%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets (90%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts (85%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/resources/base/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg (100%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg (100%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/ringmodecomponent}/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/ringmodecomponent}/src/main/resources/base/media/ic_statusbar_vibration_on.svg (100%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/ringmodecomponent}/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/ringmodecomponent}/src/main/resources/phone/media/ic_statusbar_vibration_on.svg (100%) rename {systemui4merge/features => feature/systemui}/ringmodecomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/features/statusbarcomponent => feature/systemui/signalcomponent}/build-profile.json5 (100%) rename systemui4merge/features/statusbarcomponent/hvigorfile.js => feature/systemui/signalcomponent/hvigorfile.ts (100%) rename {systemui4merge/features => feature/systemui}/signalcomponent/package-lock.json (30%) create mode 100644 feature/systemui/signalcomponent/package.json rename {systemui4merge/features => feature/systemui}/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts (93%) rename {systemui4merge/features => feature/systemui}/signalcomponent/src/main/ets/default/common/constants.ts (100%) rename {systemui4merge/features => feature/systemui}/signalcomponent/src/main/ets/default/pages/signalIcon.ets (96%) rename {systemui4merge/features => feature/systemui}/signalcomponent/src/main/ets/default/signalModel.ts (98%) rename {systemui4merge/features => feature/systemui}/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts (75%) rename {systemui4merge/features => feature/systemui}/signalcomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/signalcomponent/src/main/resources/base/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/signalcomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/signalcomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/base/media/ic_statusbar_signal_1.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/base/media/ic_statusbar_signal_2.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/base/media/ic_statusbar_signal_3.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/base/media/ic_statusbar_signal_4.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/base/media/ic_statusbar_signal_full.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/base/media/ic_statusbar_signal_no.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/base/media/ic_statusbar_signal_roaming.png (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/base/media/ic_statusbar_signal_wait.png (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/base/media/ic_statusbar_wifi_connect.png (100%) rename {systemui4merge/features/statusbarcomponent => feature/systemui/signalcomponent}/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/features => feature/systemui}/signalcomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/signalcomponent/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/phone/media/ic_statusbar_signal_1.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/phone/media/ic_statusbar_signal_2.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/phone/media/ic_statusbar_signal_3.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/phone/media/ic_statusbar_signal_4.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/phone/media/ic_statusbar_signal_full.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/signalcomponent}/src/main/resources/phone/media/ic_statusbar_signal_no.svg (100%) rename {systemui4merge/features => feature/systemui}/signalcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/features/wificomponent => feature/systemui/statusbarcomponent}/build-profile.json5 (100%) rename systemui4merge/features/wificomponent/hvigorfile.js => feature/systemui/statusbarcomponent/hvigorfile.ts (100%) create mode 100644 feature/systemui/statusbarcomponent/package-lock.json create mode 100644 feature/systemui/statusbarcomponent/package.json rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts (92%) rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts (83%) rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (96%) rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts (94%) rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets (88%) rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets (87%) rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets (90%) rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets (88%) rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts (92%) rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/resources/base/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/product/phone/statusbar/src/main/resources/phone => feature/systemui/statusbarcomponent/src/main/resources/base}/media/ic_statusbar_nfc.svg (100%) rename {systemui4merge/features/wificomponent => feature/systemui/statusbarcomponent}/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/features => feature/systemui}/statusbarcomponent/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/wificomponent}/build-profile.json5 (100%) rename systemui4merge/product/phone/statusbar/hvigorfile.js => feature/systemui/wificomponent/hvigorfile.ts (92%) rename {systemui4merge/features => feature/systemui}/wificomponent/package-lock.json (30%) create mode 100644 feature/systemui/wificomponent/package.json rename {systemui4merge/features => feature/systemui}/wificomponent/src/main/ets/default/common/StyleConfiguration.ts (91%) rename {systemui4merge/features => feature/systemui}/wificomponent/src/main/ets/default/common/constants.ts (100%) rename {systemui4merge/features => feature/systemui}/wificomponent/src/main/ets/default/pages/wifiComponent.ets (86%) rename {systemui4merge/features => feature/systemui}/wificomponent/src/main/ets/default/pages/wifiIcon.ets (92%) rename {systemui4merge/features => feature/systemui}/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts (75%) rename {systemui4merge/features => feature/systemui}/wificomponent/src/main/ets/default/wifiModel.ts (98%) rename {systemui4merge/features => feature/systemui}/wificomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/wificomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/wificomponent}/src/main/resources/base/media/ic_statusbar_wifi_1.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/wificomponent}/src/main/resources/base/media/ic_statusbar_wifi_2.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/wificomponent}/src/main/resources/base/media/ic_statusbar_wifi_3.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/wificomponent}/src/main/resources/base/media/ic_statusbar_wifi_full.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/wificomponent}/src/main/resources/base/media/ic_statusbar_wifi_no.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/wificomponent}/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/features => feature/systemui}/wificomponent/src/main/resources/base/media/wifi.svg (100%) rename {systemui4merge/features => feature/systemui}/wificomponent/src/main/resources/base/media/wifi_d.svg (100%) rename {systemui4merge/features => feature/systemui}/wificomponent/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/wificomponent}/src/main/resources/phone/media/ic_statusbar_wifi_1.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/wificomponent}/src/main/resources/phone/media/ic_statusbar_wifi_2.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/wificomponent}/src/main/resources/phone/media/ic_statusbar_wifi_3.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/wificomponent}/src/main/resources/phone/media/ic_statusbar_wifi_full.svg (100%) rename {systemui4merge/product/phone/statusbar => feature/systemui/wificomponent}/src/main/resources/phone/media/ic_statusbar_wifi_no.svg (100%) create mode 100644 product/phone/src/main/ets/WindowScene/HWSystemUi.ets delete mode 100644 systemui4merge/common/src/main/ets/default/Log.ts delete mode 100644 systemui4merge/features/batterycomponent/package-lock.json delete mode 100644 systemui4merge/features/batterycomponent/package.json delete mode 100644 systemui4merge/features/bluetoothcomponent/package.json delete mode 100644 systemui4merge/features/capsulecomponent/package.json delete mode 100644 systemui4merge/features/clockcomponent/package.json delete mode 100644 systemui4merge/features/locationcomponent/package.json delete mode 100644 systemui4merge/features/nfccomponent/package-lock.json delete mode 100644 systemui4merge/features/nfccomponent/package.json delete mode 100644 systemui4merge/features/ringmodecomponent/package.json delete mode 100644 systemui4merge/features/signalcomponent/package.json delete mode 100644 systemui4merge/features/statusbarcomponent/package-lock.json delete mode 100644 systemui4merge/features/statusbarcomponent/package.json delete mode 100644 systemui4merge/features/wificomponent/package.json delete mode 100644 systemui4merge/product/phone/statusbar/package.json delete mode 100644 systemui4merge/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts delete mode 100644 systemui4merge/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts delete mode 100644 systemui4merge/product/phone/statusbar/src/main/module.json5 diff --git a/build-profile.json5 b/build-profile.json5 index 20afc4f7..bd487b54 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -152,6 +152,138 @@ ], }, ], + }, + { + "name": "statusbarcomponent", + "srcPath": "./feature/systemui/statusbarcomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "batterycomponent", + "srcPath": "./feature/systemui/batterycomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "clockcomponent", + "srcPath": "./feature/systemui/clockcomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "bluetoothcomponent", + "srcPath": "./feature/systemui/bluetoothcomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "capsulecomponent", + "srcPath": "./feature/systemui/capsulecomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "signalcomponent", + "srcPath": "./feature/systemui/signalcomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "wificomponent", + "srcPath": "./feature/systemui/wificomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "locationcomponent", + "srcPath": "./feature/systemui/locationcomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "nfccomponent", + "srcPath": "./feature/systemui/nfccomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "ringmodecomponent", + "srcPath": "./feature/systemui/ringmodecomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "phone_statusbar", + "srcPath": "./feature/systemui/phone/statusbar", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] } ], } \ No newline at end of file diff --git a/systemui4merge/common/src/main/ets/default/CheckEmptyUtils.ts b/common/src/main/ets/default/CheckEmptyUtils.ts similarity index 100% rename from systemui4merge/common/src/main/ets/default/CheckEmptyUtils.ts rename to common/src/main/ets/default/CheckEmptyUtils.ts diff --git a/systemui4merge/common/src/main/ets/default/CommonStyleManager.ts b/common/src/main/ets/default/CommonStyleManager.ts similarity index 97% rename from systemui4merge/common/src/main/ets/default/CommonStyleManager.ts rename to common/src/main/ets/default/CommonStyleManager.ts index 1f9fa1ff..715a9894 100644 --- a/systemui4merge/common/src/main/ets/default/CommonStyleManager.ts +++ b/common/src/main/ets/default/CommonStyleManager.ts @@ -12,8 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from "./Log"; - +import { Log } from './utils/Log'; const TAG = "Common-StyleManager"; export class CommonStyleManager { diff --git a/systemui4merge/common/src/main/ets/default/Constants.ts b/common/src/main/ets/default/Constants.ts similarity index 100% rename from systemui4merge/common/src/main/ets/default/Constants.ts rename to common/src/main/ets/default/Constants.ts diff --git a/systemui4merge/common/src/main/ets/default/Decorators.ts b/common/src/main/ets/default/Decorators.ts similarity index 97% rename from systemui4merge/common/src/main/ets/default/Decorators.ts rename to common/src/main/ets/default/Decorators.ts index 66b5ffee..26661eef 100644 --- a/systemui4merge/common/src/main/ets/default/Decorators.ts +++ b/common/src/main/ets/default/Decorators.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from './Log'; +import { Log } from './utils/Log'; const TAG = 'Decorators'; diff --git a/systemui4merge/common/src/main/ets/default/InitSystemUi.ts b/common/src/main/ets/default/InitSystemUi.ts similarity index 96% rename from systemui4merge/common/src/main/ets/default/InitSystemUi.ts rename to common/src/main/ets/default/InitSystemUi.ts index 10b9cfa7..fedc3735 100644 --- a/systemui4merge/common/src/main/ets/default/InitSystemUi.ts +++ b/common/src/main/ets/default/InitSystemUi.ts @@ -14,7 +14,7 @@ */ import EventManager from './event/EventManager'; -import Log from './Log'; +import { Log } from './utils/Log'; import ScreenLockManager from './ScreenLockManager'; import ServiceExtensionContext from 'application/ServiceExtensionContext'; import TimeManager from './TimeManager'; diff --git a/systemui4merge/common/src/main/ets/default/MultimodalInputManager.ts b/common/src/main/ets/default/MultimodalInputManager.ts similarity index 98% rename from systemui4merge/common/src/main/ets/default/MultimodalInputManager.ts rename to common/src/main/ets/default/MultimodalInputManager.ts index 11a4b049..6c2494a5 100644 --- a/systemui4merge/common/src/main/ets/default/MultimodalInputManager.ts +++ b/common/src/main/ets/default/MultimodalInputManager.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import inputConsumer from "@ohos.multimodalInput.inputConsumer"; -import Log from "./Log"; +import { Log } from './utils/Log'; import createOrGet from "./SingleInstanceHelper"; export type MultiCallback = (keyOptions: inputConsumer.KeyOptions) => void; diff --git a/systemui4merge/common/src/main/ets/default/ReadConfigUtil.ts b/common/src/main/ets/default/ReadConfigUtil.ts similarity index 97% rename from systemui4merge/common/src/main/ets/default/ReadConfigUtil.ts rename to common/src/main/ets/default/ReadConfigUtil.ts index 25c4b87e..217dcf1e 100644 --- a/systemui4merge/common/src/main/ets/default/ReadConfigUtil.ts +++ b/common/src/main/ets/default/ReadConfigUtil.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from './Log'; +import { Log } from './utils/Log'; import FileIo from '@ohos.fileio'; const DFAULT_SIZE = 4096; diff --git a/systemui4merge/common/src/main/ets/default/ResourceUtil.ts b/common/src/main/ets/default/ResourceUtil.ts similarity index 100% rename from systemui4merge/common/src/main/ets/default/ResourceUtil.ts rename to common/src/main/ets/default/ResourceUtil.ts diff --git a/systemui4merge/common/src/main/ets/default/ScreenLockManager.ts b/common/src/main/ets/default/ScreenLockManager.ts similarity index 98% rename from systemui4merge/common/src/main/ets/default/ScreenLockManager.ts rename to common/src/main/ets/default/ScreenLockManager.ts index beb3115c..6ba2ac5f 100644 --- a/systemui4merge/common/src/main/ets/default/ScreenLockManager.ts +++ b/common/src/main/ets/default/ScreenLockManager.ts @@ -17,7 +17,7 @@ import commonEvent from '@ohos.commonEvent'; import { CommonEventSubscriber } from 'commonEvent/commonEventSubscriber'; import createOrGet from './SingleInstanceHelper'; import EventManager from './event/EventManager'; -import Log from './Log'; +import { Log } from './utils/Log'; import { obtainLocalEvent } from './event/EventUtil'; import { debounce } from './Decorators'; diff --git a/systemui4merge/common/src/main/ets/default/SettingsUtil.ts b/common/src/main/ets/default/SettingsUtil.ts similarity index 98% rename from systemui4merge/common/src/main/ets/default/SettingsUtil.ts rename to common/src/main/ets/default/SettingsUtil.ts index fc573837..897b06cc 100644 --- a/systemui4merge/common/src/main/ets/default/SettingsUtil.ts +++ b/common/src/main/ets/default/SettingsUtil.ts @@ -15,7 +15,7 @@ */ import settings from '@ohos.settings'; -import Log from './Log'; +import { Log } from './utils/Log'; import Constants from './Constants'; import createOrGet from './SingleInstanceHelper'; import Context from 'application/ServiceExtensionContext'; diff --git a/systemui4merge/common/src/main/ets/default/SingleInstanceHelper.ts b/common/src/main/ets/default/SingleInstanceHelper.ts similarity index 97% rename from systemui4merge/common/src/main/ets/default/SingleInstanceHelper.ts rename to common/src/main/ets/default/SingleInstanceHelper.ts index b7cda798..c9178421 100644 --- a/systemui4merge/common/src/main/ets/default/SingleInstanceHelper.ts +++ b/common/src/main/ets/default/SingleInstanceHelper.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from './Log'; +import { Log } from './utils/Log'; import audio from '@ohos.multimedia.audio'; const TAG = 'SingleInstanceHelper'; diff --git a/systemui4merge/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts similarity index 100% rename from systemui4merge/common/src/main/ets/default/StyleConfiguration.ts rename to common/src/main/ets/default/StyleConfiguration.ts diff --git a/systemui4merge/common/src/main/ets/default/SwitchUserManager.ts b/common/src/main/ets/default/SwitchUserManager.ts similarity index 99% rename from systemui4merge/common/src/main/ets/default/SwitchUserManager.ts rename to common/src/main/ets/default/SwitchUserManager.ts index a6697064..e86862e3 100644 --- a/systemui4merge/common/src/main/ets/default/SwitchUserManager.ts +++ b/common/src/main/ets/default/SwitchUserManager.ts @@ -14,7 +14,7 @@ */ import AccountManager from "@ohos.account.osAccount"; -import Log from "./Log"; +import { Log } from './utils/Log'; import getSingleInstance from "./SingleInstanceHelper"; const TAG = "SwitchUserManager"; diff --git a/systemui4merge/common/src/main/ets/default/SysFaultLogger.ts b/common/src/main/ets/default/SysFaultLogger.ts similarity index 98% rename from systemui4merge/common/src/main/ets/default/SysFaultLogger.ts rename to common/src/main/ets/default/SysFaultLogger.ts index 85dd4d15..e96010d7 100644 --- a/systemui4merge/common/src/main/ets/default/SysFaultLogger.ts +++ b/common/src/main/ets/default/SysFaultLogger.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import Log from "./Log"; +import { Log } from './utils/Log'; import hiSysEvent from '@ohos.hiSysEvent' const TAG = 'SystemFaultLogger'; diff --git a/systemui4merge/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts similarity index 99% rename from systemui4merge/common/src/main/ets/default/TimeManager.ts rename to common/src/main/ets/default/TimeManager.ts index 6a5c81ca..78b77c0f 100644 --- a/systemui4merge/common/src/main/ets/default/TimeManager.ts +++ b/common/src/main/ets/default/TimeManager.ts @@ -17,7 +17,7 @@ import settings from "@ohos.settings"; import commonEvent from "@ohos.commonEvent"; import dataShare from '@ohos.data.dataShare'; -import Log from "./Log"; +import { Log } from './utils/Log'; import EventManager from "./event/EventManager"; import createOrGet from "./SingleInstanceHelper"; import { obtainLocalEvent } from "./event/EventUtil"; diff --git a/systemui4merge/common/src/main/ets/default/TintStateManager.ts b/common/src/main/ets/default/TintStateManager.ts similarity index 95% rename from systemui4merge/common/src/main/ets/default/TintStateManager.ts rename to common/src/main/ets/default/TintStateManager.ts index a71655b3..c5e9babc 100644 --- a/systemui4merge/common/src/main/ets/default/TintStateManager.ts +++ b/common/src/main/ets/default/TintStateManager.ts @@ -13,9 +13,10 @@ * limitations under the License. */ +// TODO Window import Window from '@ohos.window'; import display from '@ohos.display'; -import Log from './Log'; +import { Log } from './utils/Log'; import { WindowType, Rect, getWindowName } from './Constants'; import getSingleInstance from './SingleInstanceHelper'; @@ -54,7 +55,8 @@ export default class TintStateManager { constructor() { Log.showDebug(TAG, `init TintStateManager. ${LISTENER_SYSTEM_BAR_TINT_CHANGE}`); - Window.on(LISTENER_SYSTEM_BAR_TINT_CHANGE, this.onSystemBarTintChange.bind(this)); + // TODO +// Window.on(LISTENER_SYSTEM_BAR_TINT_CHANGE, this.onSystemBarTintChange.bind(this)); } registerListener(windowType: WindowType, listener: TintStateListener): void { diff --git a/systemui4merge/common/src/main/ets/default/Trace.ts b/common/src/main/ets/default/Trace.ts similarity index 98% rename from systemui4merge/common/src/main/ets/default/Trace.ts rename to common/src/main/ets/default/Trace.ts index c62d797f..838cb2a0 100644 --- a/systemui4merge/common/src/main/ets/default/Trace.ts +++ b/common/src/main/ets/default/Trace.ts @@ -14,7 +14,7 @@ */ import byTrace from '@ohos.bytrace'; -import Log from './Log'; +import { Log } from './utils/Log'; /** * Add method trace. Modify RECORD_TRACE before using. diff --git a/systemui4merge/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts similarity index 99% rename from systemui4merge/common/src/main/ets/default/WindowManager.ts rename to common/src/main/ets/default/WindowManager.ts index 0dfc71fb..b57689fd 100644 --- a/systemui4merge/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -16,7 +16,7 @@ import Window from '@ohos.window'; import ServiceExtensionContext from 'application/ServiceExtensionContext'; -import Log from './Log'; +import { Log } from './utils/Log'; import EventManager from './event/EventManager'; import { obtainLocalEvent } from './event/EventUtil'; import { Rect } from './Constants'; diff --git a/systemui4merge/common/src/main/ets/default/abilitymanager/abilityManager.ts b/common/src/main/ets/default/abilitymanager/abilityManager.ts similarity index 99% rename from systemui4merge/common/src/main/ets/default/abilitymanager/abilityManager.ts rename to common/src/main/ets/default/abilitymanager/abilityManager.ts index c42956b4..78ee0fc8 100644 --- a/systemui4merge/common/src/main/ets/default/abilitymanager/abilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/abilityManager.ts @@ -17,7 +17,7 @@ import { BusinessError } from 'basic'; import common from '@ohos.app.ability.common' import Want from '@ohos.application.Want'; -import Log from '../Log'; +import { Log } from '../utils/Log'; const TAG = 'AbilityManager'; diff --git a/systemui4merge/common/src/main/ets/default/abilitymanager/bundleManager.ts b/common/src/main/ets/default/abilitymanager/bundleManager.ts similarity index 98% rename from systemui4merge/common/src/main/ets/default/abilitymanager/bundleManager.ts rename to common/src/main/ets/default/abilitymanager/bundleManager.ts index 92f100f4..199107ed 100644 --- a/systemui4merge/common/src/main/ets/default/abilitymanager/bundleManager.ts +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ts @@ -14,7 +14,7 @@ */ import BundleMgr from "@ohos.bundle.bundleManager"; -import Log from "../Log"; +import { Log } from '../utils/Log'; import SwitchUserManager from "../SwitchUserManager"; import AbilityManager from "./abilityManager"; diff --git a/systemui4merge/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts similarity index 98% rename from systemui4merge/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts rename to common/src/main/ets/default/abilitymanager/featureAbilityManager.ts index a568427f..8fb5a88e 100644 --- a/systemui4merge/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts @@ -14,7 +14,7 @@ */ import FeatureAbility from '@ohos.ability.featureAbility'; -import Log from '../Log'; +import { Log } from '../utils/Log'; const TAG = 'FeatureAbilityManager'; diff --git a/systemui4merge/common/src/main/ets/default/abilitymanager/notificationManager.ts b/common/src/main/ets/default/abilitymanager/notificationManager.ts similarity index 98% rename from systemui4merge/common/src/main/ets/default/abilitymanager/notificationManager.ts rename to common/src/main/ets/default/abilitymanager/notificationManager.ts index a07f8ca7..8b769034 100644 --- a/systemui4merge/common/src/main/ets/default/abilitymanager/notificationManager.ts +++ b/common/src/main/ets/default/abilitymanager/notificationManager.ts @@ -17,7 +17,7 @@ import Notification from '@ohos.notification'; import { AsyncCallback } from 'basic'; import { NotificationSubscriber } from 'notification/notificationSubscriber'; import { NotificationRequest } from 'notification/notificationRequest'; -import Log from '../Log'; +import { Log } from '../utils/Log'; const TAG = 'NotificationManager'; diff --git a/systemui4merge/common/src/main/ets/default/commonEvent/CommonEventManager.ts b/common/src/main/ets/default/commonEvent/CommonEventManager.ts similarity index 98% rename from systemui4merge/common/src/main/ets/default/commonEvent/CommonEventManager.ts rename to common/src/main/ets/default/commonEvent/CommonEventManager.ts index 841a570f..90cb1fb8 100644 --- a/systemui4merge/common/src/main/ets/default/commonEvent/CommonEventManager.ts +++ b/common/src/main/ets/default/commonEvent/CommonEventManager.ts @@ -16,7 +16,7 @@ import commonEvent from "@ohos.commonEvent"; import { CommonEventData } from "commonEvent/commonEventData"; import EventManager from "../event/EventManager"; -import Log from "../Log"; +import { Log } from '../utils/Log'; import { SCREEN_CHANGE_EVENT } from "../ScreenLockManager"; export type CommonEventManager = { diff --git a/systemui4merge/common/src/main/ets/default/event/EventBus.ts b/common/src/main/ets/default/event/EventBus.ts similarity index 98% rename from systemui4merge/common/src/main/ets/default/event/EventBus.ts rename to common/src/main/ets/default/event/EventBus.ts index 9195cc25..586fcb86 100644 --- a/systemui4merge/common/src/main/ets/default/event/EventBus.ts +++ b/common/src/main/ets/default/event/EventBus.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from "../Log"; +import { Log } from '../utils/Log'; export type Callback = (args: any) => void; const TAG = "EventBus"; diff --git a/systemui4merge/common/src/main/ets/default/event/EventManager.ts b/common/src/main/ets/default/event/EventManager.ts similarity index 99% rename from systemui4merge/common/src/main/ets/default/event/EventManager.ts rename to common/src/main/ets/default/event/EventManager.ts index 0d5357a2..90331b0d 100644 --- a/systemui4merge/common/src/main/ets/default/event/EventManager.ts +++ b/common/src/main/ets/default/event/EventManager.ts @@ -14,7 +14,7 @@ */ import ServiceExtensionContext from "application/ServiceExtensionContext"; -import Log from "../Log"; +import { Log } from '../utils/Log'; import createOrGet from "../SingleInstanceHelper"; import { EventParser, START_ABILITY_EVENT, Event, LocalEvent } from "./EventUtil"; import { Callback, createEventBus, EventBus } from "./EventBus"; diff --git a/systemui4merge/common/src/main/ets/default/event/EventUtil.ts b/common/src/main/ets/default/event/EventUtil.ts similarity index 98% rename from systemui4merge/common/src/main/ets/default/event/EventUtil.ts rename to common/src/main/ets/default/event/EventUtil.ts index 33ba707e..8e64cd48 100644 --- a/systemui4merge/common/src/main/ets/default/event/EventUtil.ts +++ b/common/src/main/ets/default/event/EventUtil.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from "../Log"; +import { Log } from '../utils/Log'; export type EventTarget = "local" | "remote" | "ability" | "commonEvent"; export type Event = { diff --git a/systemui4merge/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts b/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts similarity index 96% rename from systemui4merge/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts rename to common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts index 28bbbbe7..a1df1a7b 100644 --- a/systemui4merge/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts +++ b/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../Log'; +import { Log } from '../utils/Log'; const STATUS_BAR_MIN_HEIGHT = 24 const STATUS_BAR_COEFFICIENT = 1.0 diff --git a/systemui4merge/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts similarity index 97% rename from systemui4merge/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts rename to common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts index 6fbb650d..b5c0d945 100644 --- a/systemui4merge/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts @@ -14,7 +14,7 @@ */ import worker from '@ohos.worker'; -import Log from '../default/Log'; +import { Log } from '../default/utils/Log'; import BundleManager from '../default/abilitymanager/bundleManager'; import { Want } from 'ability/want'; import Constants, { ItemComponentData, obtainMsg, RootConfigInfo } from './common/Constants'; @@ -45,7 +45,8 @@ export default class PluginDataSourceAdapter { this.mListener = listener; this.mModuleName = moduleName; const WORKER_JS_URL = this.mModuleName + '/ets/workers/PluginDataSourceWorker.js'; - this.mWorker = new worker.Worker(WORKER_JS_URL, { + Log.showInfo(TAG, `WORKER_JS_URL: ${WORKER_JS_URL}`) + this.mWorker = new worker.ThreadWorker(WORKER_JS_URL, { type: 'classic', name: this.mName, }); diff --git a/systemui4merge/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts similarity index 99% rename from systemui4merge/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts rename to common/src/main/ets/plugindatasource/PluginDataSourceManager.ts index 46761181..357308be 100644 --- a/systemui4merge/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../default/Log'; +import { Log } from '../default/utils/Log'; import SourceLoaderFactory from './sourceloader/SourceLoaderFactory'; import SourceLoader from './sourceloader/SourceLoader'; import PluginSourceLoader from './sourceloader/PluginSourceLoader'; diff --git a/systemui4merge/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts similarity index 99% rename from systemui4merge/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts rename to common/src/main/ets/plugindatasource/common/BundleParseUtil.ts index fe9d7c02..0432fd5e 100644 --- a/systemui4merge/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts +++ b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts @@ -19,7 +19,7 @@ import { AbilityInfo } from 'bundleManager/AbilityInfo'; import { ExtensionAbilityInfo } from 'bundleManager/ExtensionAbilityInfo'; import { CustomizeData } from 'bundle/customizeData'; import { Metadata } from 'bundleManager/Metadata'; -import Log from '../../default/Log'; +import { Log } from '../../default/utils/Log'; import switchUserManager from '../../default/SwitchUserManager'; export type AbilityInfoWithId = (AbilityInfo | ExtensionAbilityInfo) & { itemId: string }; diff --git a/systemui4merge/common/src/main/ets/plugindatasource/common/Constants.ts b/common/src/main/ets/plugindatasource/common/Constants.ts similarity index 100% rename from systemui4merge/common/src/main/ets/plugindatasource/common/Constants.ts rename to common/src/main/ets/plugindatasource/common/Constants.ts diff --git a/systemui4merge/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts b/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts similarity index 98% rename from systemui4merge/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts rename to common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts index d265c25a..4ae6cd62 100644 --- a/systemui4merge/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts +++ b/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts @@ -17,7 +17,7 @@ import pluginComponentManager from '@ohos.pluginComponent'; import { Want } from 'ability/want'; import { ItemComponentData } from './Constants'; -import Log from '../../default/Log'; +import { Log } from '../../default/utils/Log'; const TAG = 'PluginComponentManagerUtil'; diff --git a/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts similarity index 96% rename from systemui4merge/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts rename to common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts index 09c82640..78e5565e 100644 --- a/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../default/Log'; +import { Log } from '../../default/utils/Log'; import { AbilityInfoWithId } from '../common/BundleParseUtil'; import { LoaderConfigInfo } from '../common/Constants'; import SourceLoader from './SourceLoader'; diff --git a/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts similarity index 98% rename from systemui4merge/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts rename to common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts index a95d7541..cbdfce0d 100644 --- a/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../default/Log'; +import { Log } from '../../default/utils/Log'; import SourceLoader from './SourceLoader'; import Constants, { PluginType, ItemComponentData, LoaderConfigInfo } from '../common/Constants'; import { AbilityInfoWithId, filterAbilityInfo, PluginData } from '../common/BundleParseUtil'; diff --git a/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts similarity index 98% rename from systemui4merge/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts rename to common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts index 1aaf92dc..ad2caafa 100644 --- a/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../default/Log'; +import { Log } from '../../default/utils/Log'; import SourceLoader from './SourceLoader'; import Constants, { PluginType, ItemComponentData, LoaderConfigInfo, PluginComponentData } from '../common/Constants'; import { AbilityInfoWithId, filterAbilityInfo, PluginData } from '../common/BundleParseUtil'; diff --git a/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts similarity index 98% rename from systemui4merge/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts rename to common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts index 94a51910..d8c1844c 100644 --- a/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts @@ -14,7 +14,7 @@ */ import { Want } from 'ability/want'; -import Log from '../../default/Log'; +import { Log } from '../../default/utils/Log'; import { ItemComponentData } from '../common/Constants'; import { ListenerHandle, registerPushListener, requestFunction, PluginComponentInfo } from '../common/PluginComponentManagerUtil'; diff --git a/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts similarity index 97% rename from systemui4merge/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts rename to common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts index 4e9ba347..151f3c50 100644 --- a/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../default/Log'; +import { Log } from '../../default/utils/Log'; import { ItemComponentData, LoaderConfigInfo } from '../common/Constants'; import { AbilityInfoWithId } from '../common/BundleParseUtil'; diff --git a/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts b/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts similarity index 97% rename from systemui4merge/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts rename to common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts index 8ff5b9d6..dfa5f6c4 100644 --- a/systemui4merge/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../default/Log'; +import { Log } from '../../default/utils/Log'; import SourceLoader, { LoaderChannel } from './SourceLoader'; import DataAbilitySourceLoader from './DataAbilitySourceLoader'; import MetaSourceLoader from './MetaSourceLoader'; diff --git a/systemui4merge/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/template/SimpleToggleBase.ets similarity index 100% rename from systemui4merge/common/src/main/ets/template/SimpleToggleBase.ets rename to common/src/main/ets/template/SimpleToggleBase.ets diff --git a/systemui4merge/common/src/main/ets/template/common/StyleConfiguration.ts b/common/src/main/ets/template/common/StyleConfiguration.ts similarity index 100% rename from systemui4merge/common/src/main/ets/template/common/StyleConfiguration.ts rename to common/src/main/ets/template/common/StyleConfiguration.ts diff --git a/systemui4merge/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/template/iconComponent.ets similarity index 100% rename from systemui4merge/common/src/main/ets/template/iconComponent.ets rename to common/src/main/ets/template/iconComponent.ets diff --git a/systemui4merge/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/template/iconTitleBase.ets similarity index 100% rename from systemui4merge/common/src/main/ets/template/iconTitleBase.ets rename to common/src/main/ets/template/iconTitleBase.ets diff --git a/systemui4merge/features/batterycomponent/build-profile.json5 b/feature/systemui/batterycomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/batterycomponent/build-profile.json5 rename to feature/systemui/batterycomponent/build-profile.json5 diff --git a/systemui4merge/features/batterycomponent/hvigorfile.js b/feature/systemui/batterycomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/batterycomponent/hvigorfile.js rename to feature/systemui/batterycomponent/hvigorfile.ts diff --git a/systemui4merge/product/phone/statusbar/package-lock.json b/feature/systemui/batterycomponent/package-lock.json similarity index 44% rename from systemui4merge/product/phone/statusbar/package-lock.json rename to feature/systemui/batterycomponent/package-lock.json index 9e7e3ba3..b72b0c2c 100644 --- a/systemui4merge/product/phone/statusbar/package-lock.json +++ b/feature/systemui/batterycomponent/package-lock.json @@ -1,11 +1,11 @@ { - "name": "phone_statusbar", + "name": "@ohos/batterycomponent", "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { - "@ohos/statusbarcomponent": { - "version": "file:../../../features/statusbarcomponent" + "@ohos/common": { + "version": "file:../../../common" } } } diff --git a/feature/systemui/batterycomponent/package.json b/feature/systemui/batterycomponent/package.json new file mode 100644 index 00000000..27dd10a3 --- /dev/null +++ b/feature/systemui/batterycomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/batterycomponent", + "description": "a npm package which contains batterycomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/batterycomponent/src/main/ets/default/batteryModel.ts b/feature/systemui/batterycomponent/src/main/ets/default/batteryModel.ts similarity index 90% rename from systemui4merge/features/batterycomponent/src/main/ets/default/batteryModel.ts rename to feature/systemui/batterycomponent/src/main/ets/default/batteryModel.ts index 122c48c3..f4f1ac28 100644 --- a/systemui4merge/features/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/feature/systemui/batterycomponent/src/main/ets/default/batteryModel.ts @@ -15,11 +15,10 @@ import BatteryInfo from "@ohos.batteryInfo"; import commonEvent from "@ohos.commonEvent"; -import createOrGet from "../../../../../../common/src/main/ets/default/SingleInstanceHelper"; +import createOrGet from "@ohos/common/src/main/ets/default/SingleInstanceHelper"; import Constants from "./common/constants"; -import Log from "../../../../../../common/src/main/ets/default/Log"; -import {CommonEventData} from "commonEvent/commonEventData"; -import {CommonEventManager, getCommonEventManager, POLICY} from "../../../../../../common/src/main/ets/default/commonEvent/CommonEventManager"; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import {CommonEventManager, getCommonEventManager, POLICY} from "@ohos/common/src/main/ets/default/commonEvent/CommonEventManager"; const TAG = "BatteryComponent-batteryModel"; const DEFAULT_PROGRESS = 100; diff --git a/systemui4merge/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts b/feature/systemui/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 95% rename from systemui4merge/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts rename to feature/systemui/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts index 55b35248..14bf63e5 100644 --- a/systemui4merge/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/feature/systemui/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; const TAG = 'battery-StyleConfiguration'; diff --git a/systemui4merge/features/batterycomponent/src/main/ets/default/common/constants.ts b/feature/systemui/batterycomponent/src/main/ets/default/common/constants.ts similarity index 100% rename from systemui4merge/features/batterycomponent/src/main/ets/default/common/constants.ts rename to feature/systemui/batterycomponent/src/main/ets/default/common/constants.ts diff --git a/systemui4merge/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/feature/systemui/batterycomponent/src/main/ets/default/pages/batteryIcon.ets similarity index 92% rename from systemui4merge/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets rename to feature/systemui/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index 865b256b..2343e9c5 100644 --- a/systemui4merge/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/feature/systemui/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -17,9 +17,9 @@ import mBatteryModel from '../batteryModel'; import BatteryPic from './batteryPic'; import BatterySoc from './batterySoc'; import Constants from '../common/constants'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/StyleConfiguration' import StyleConfiguration, { BatteryComponentStyle } from '../common/StyleConfiguration' const TAG = 'BatteryComponent-batteryIcon'; diff --git a/systemui4merge/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/feature/systemui/batterycomponent/src/main/ets/default/pages/batteryPic.ets similarity index 94% rename from systemui4merge/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets rename to feature/systemui/batterycomponent/src/main/ets/default/pages/batteryPic.ets index 5f78a3ca..008fcaf9 100644 --- a/systemui4merge/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/feature/systemui/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -14,8 +14,8 @@ */ import Constants from '../common/constants' -import Log from '../../../../../../../common/src/main/ets/default/Log' -import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' import StyleConfiguration, { BatteryPicStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/BatteryVM' diff --git a/systemui4merge/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/feature/systemui/batterycomponent/src/main/ets/default/pages/batterySoc.ets similarity index 83% rename from systemui4merge/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets rename to feature/systemui/batterycomponent/src/main/ets/default/pages/batterySoc.ets index 1d085a99..25d781db 100644 --- a/systemui4merge/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets +++ b/feature/systemui/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../common/src/main/ets/default/StyleConfiguration'; -import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager'; +} from '@ohos/common/src/main/ets/default/StyleConfiguration'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager'; import ViewModel from '../viewmodel/BatteryVM'; const TAG = 'BatteryComponent-batterySoc'; diff --git a/systemui4merge/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts b/feature/systemui/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts similarity index 75% rename from systemui4merge/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts rename to feature/systemui/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts index 9e84a660..4dd4790a 100644 --- a/systemui4merge/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts +++ b/feature/systemui/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import { FASlotName } from '../../../../../../../common/src/main/ets/default/Constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '../../../../../../../common/src/main/ets/default/TintStateManager'; -import createOrGet from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/TintStateManager'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'BatteryVM'; diff --git a/systemui4merge/features/batterycomponent/src/main/module.json5 b/feature/systemui/batterycomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/batterycomponent/src/main/module.json5 rename to feature/systemui/batterycomponent/src/main/module.json5 diff --git a/systemui4merge/features/batterycomponent/src/main/resources/base/element/color.json b/feature/systemui/batterycomponent/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/features/batterycomponent/src/main/resources/base/element/color.json rename to feature/systemui/batterycomponent/src/main/resources/base/element/color.json diff --git a/systemui4merge/features/batterycomponent/src/main/resources/base/element/float.json b/feature/systemui/batterycomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/batterycomponent/src/main/resources/base/element/float.json rename to feature/systemui/batterycomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/batterycomponent/src/main/resources/base/element/string.json b/feature/systemui/batterycomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/batterycomponent/src/main/resources/base/element/string.json rename to feature/systemui/batterycomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/batterycomponent/src/main/resources/base/media/icon.png b/feature/systemui/batterycomponent/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/features/batterycomponent/src/main/resources/base/media/icon.png rename to feature/systemui/batterycomponent/src/main/resources/base/media/icon.png diff --git a/systemui4merge/features/batterycomponent/src/main/resources/en_US/element/string.json b/feature/systemui/batterycomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/batterycomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/batterycomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/batterycomponent/src/main/resources/phone/element/float.json b/feature/systemui/batterycomponent/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/features/batterycomponent/src/main/resources/phone/element/float.json rename to feature/systemui/batterycomponent/src/main/resources/phone/element/float.json diff --git a/systemui4merge/features/batterycomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/batterycomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/batterycomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/batterycomponent/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/features/bluetoothcomponent/build-profile.json5 b/feature/systemui/bluetoothcomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/bluetoothcomponent/build-profile.json5 rename to feature/systemui/bluetoothcomponent/build-profile.json5 diff --git a/systemui4merge/features/bluetoothcomponent/hvigorfile.js b/feature/systemui/bluetoothcomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/bluetoothcomponent/hvigorfile.js rename to feature/systemui/bluetoothcomponent/hvigorfile.ts diff --git a/systemui4merge/features/bluetoothcomponent/package-lock.json b/feature/systemui/bluetoothcomponent/package-lock.json similarity index 32% rename from systemui4merge/features/bluetoothcomponent/package-lock.json rename to feature/systemui/bluetoothcomponent/package-lock.json index c0a652b6..18173185 100644 --- a/systemui4merge/features/bluetoothcomponent/package-lock.json +++ b/feature/systemui/bluetoothcomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/bluetoothcomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/feature/systemui/bluetoothcomponent/package.json b/feature/systemui/bluetoothcomponent/package.json new file mode 100644 index 00000000..302e614b --- /dev/null +++ b/feature/systemui/bluetoothcomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/bluetoothcomponent", + "description": "a npm package which contains bluetoothcomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts rename to feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 91% rename from systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index c39f8d70..4c3f812b 100644 --- a/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; const TAG = 'bluetooth-StyleConfiguration'; diff --git a/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts similarity index 94% rename from systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts rename to feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts index a54c0610..cc67123b 100644 --- a/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts +++ b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -14,8 +14,8 @@ */ import bluetooth from '@ohos.bluetooth'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'BluetoothModel'; diff --git a/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets similarity index 84% rename from systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets rename to feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets index 151efd1a..4b2dfa54 100644 --- a/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets +++ b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager"; -import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import EventManager from "@ohos/common/src/main/ets/default/event/EventManager"; +import {obtainStartAbility} from "@ohos/common/src/main/ets/default/event/EventUtil"; import ViewModel from '../viewmodel/BluetoothVM'; -import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase'; +import iconTitleBase from '@ohos/common/src/main/ets/template/iconTitleBase'; const TAG = 'bluetooth-ControlCenterComplexToggleBluetoothComponent'; diff --git a/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets similarity index 88% rename from systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets rename to feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets index 7f79c984..ede830b4 100644 --- a/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets +++ b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager'; import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; +} from '@ohos/common/src/main/ets/default/StyleConfiguration'; import StyleConfiguration, { StatusBarBluetoothComponentStyle } from '../common/StyleConfiguration'; import Constants from '../common/Constants'; import ViewModel from '../viewmodel/BluetoothVM'; diff --git a/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts similarity index 84% rename from systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts rename to feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts index 964d1195..5f3573dc 100644 --- a/systemui4merge/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts +++ b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/TintStateManager'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; import BluetoothService from '../model/BluetoothService'; export const BLUETOOTH_OPEN_STATUS_KEY = 'BluetoothOpenStatus'; diff --git a/systemui4merge/features/bluetoothcomponent/src/main/module.json5 b/feature/systemui/bluetoothcomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/module.json5 rename to feature/systemui/bluetoothcomponent/src/main/module.json5 diff --git a/systemui4merge/features/bluetoothcomponent/src/main/resources/base/element/float.json b/feature/systemui/bluetoothcomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/resources/base/element/float.json rename to feature/systemui/bluetoothcomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/bluetoothcomponent/src/main/resources/base/element/string.json b/feature/systemui/bluetoothcomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/resources/base/element/string.json rename to feature/systemui/bluetoothcomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg b/feature/systemui/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg rename to feature/systemui/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt.svg diff --git a/systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg b/feature/systemui/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg rename to feature/systemui/bluetoothcomponent/src/main/resources/base/media/ic_controlcenter_bt_d.svg diff --git a/systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg b/feature/systemui/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg rename to feature/systemui/bluetoothcomponent/src/main/resources/base/media/ic_status_bt.svg diff --git a/systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg b/feature/systemui/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg rename to feature/systemui/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_close.svg diff --git a/systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg b/feature/systemui/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg rename to feature/systemui/bluetoothcomponent/src/main/resources/base/media/ic_status_bt_connecting.svg diff --git a/systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/icon.png b/feature/systemui/bluetoothcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/resources/base/media/icon.png rename to feature/systemui/bluetoothcomponent/src/main/resources/base/media/icon.png diff --git a/systemui4merge/features/bluetoothcomponent/src/main/resources/en_US/element/string.json b/feature/systemui/bluetoothcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/bluetoothcomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/bluetoothcomponent/src/main/resources/phone/element/float.json b/feature/systemui/bluetoothcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/resources/phone/element/float.json rename to feature/systemui/bluetoothcomponent/src/main/resources/phone/element/float.json diff --git a/systemui4merge/features/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg b/feature/systemui/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg rename to feature/systemui/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg diff --git a/systemui4merge/features/bluetoothcomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/bluetoothcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/bluetoothcomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/bluetoothcomponent/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/features/capsulecomponent/build-profile.json5 b/feature/systemui/capsulecomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/capsulecomponent/build-profile.json5 rename to feature/systemui/capsulecomponent/build-profile.json5 diff --git a/systemui4merge/features/capsulecomponent/hvigorfile.js b/feature/systemui/capsulecomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/capsulecomponent/hvigorfile.js rename to feature/systemui/capsulecomponent/hvigorfile.ts diff --git a/systemui4merge/features/capsulecomponent/package-lock.json b/feature/systemui/capsulecomponent/package-lock.json similarity index 31% rename from systemui4merge/features/capsulecomponent/package-lock.json rename to feature/systemui/capsulecomponent/package-lock.json index f7288eca..df1becc2 100644 --- a/systemui4merge/features/capsulecomponent/package-lock.json +++ b/feature/systemui/capsulecomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/capsulecomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/feature/systemui/capsulecomponent/package.json b/feature/systemui/capsulecomponent/package.json new file mode 100644 index 00000000..7d7640ab --- /dev/null +++ b/feature/systemui/capsulecomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/capsulecomponent", + "description": "a npm package which contains capsulecomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts b/feature/systemui/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 93% rename from systemui4merge/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts rename to feature/systemui/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts index aea2967d..aa9203c0 100644 --- a/systemui4merge/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/feature/systemui/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; import Constants from './constants'; const TAG = 'capsule-StyleConfiguration'; diff --git a/systemui4merge/features/capsulecomponent/src/main/ets/default/common/constants.ts b/feature/systemui/capsulecomponent/src/main/ets/default/common/constants.ts similarity index 100% rename from systemui4merge/features/capsulecomponent/src/main/ets/default/common/constants.ts rename to feature/systemui/capsulecomponent/src/main/ets/default/common/constants.ts diff --git a/systemui4merge/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts b/feature/systemui/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts similarity index 96% rename from systemui4merge/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts rename to feature/systemui/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts index c7bfb79e..44273a6f 100644 --- a/systemui4merge/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts +++ b/feature/systemui/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts @@ -14,7 +14,7 @@ */ import commonEvent from '@ohos.commonEvent'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'CapsuleModel'; diff --git a/systemui4merge/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/feature/systemui/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets similarity index 96% rename from systemui4merge/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets rename to feature/systemui/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index 14f39569..290e251b 100644 --- a/systemui4merge/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/feature/systemui/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -15,9 +15,9 @@ import Constants from '../common/constants' import CapsuleViewModel, { VIEW_MODEL_ID, CallState } from '../viewmodel/CapsuleViewModel' -import Log from '../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/StyleConfiguration' import StyleConfiguration, { CapsuleComponentStyle } from '../common/StyleConfiguration' const TAG = "CapsuleIcon"; diff --git a/systemui4merge/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/feature/systemui/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts similarity index 92% rename from systemui4merge/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts rename to feature/systemui/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts index 76165646..e51cc662 100644 --- a/systemui4merge/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts +++ b/feature/systemui/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts @@ -14,10 +14,10 @@ */ import CapsuleModel from '../model/CapsuleModel'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil'; -import Trace from '../../../../../../../common/src/main/ets/default/Trace' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import ResourceUtil from '@ohos/common/src/main/ets/default/ResourceUtil'; +import Trace from '@ohos/common/src/main/ets/default/Trace' let sCapsuleViewModel; diff --git a/systemui4merge/features/capsulecomponent/src/main/module.json5 b/feature/systemui/capsulecomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/capsulecomponent/src/main/module.json5 rename to feature/systemui/capsulecomponent/src/main/module.json5 diff --git a/systemui4merge/features/capsulecomponent/src/main/resources/base/element/color.json b/feature/systemui/capsulecomponent/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/features/capsulecomponent/src/main/resources/base/element/color.json rename to feature/systemui/capsulecomponent/src/main/resources/base/element/color.json diff --git a/systemui4merge/features/capsulecomponent/src/main/resources/base/element/float.json b/feature/systemui/capsulecomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/capsulecomponent/src/main/resources/base/element/float.json rename to feature/systemui/capsulecomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg b/feature/systemui/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg similarity index 100% rename from systemui4merge/features/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg rename to feature/systemui/capsulecomponent/src/main/resources/base/media/ic_statusbar_phone.svg diff --git a/systemui4merge/features/capsulecomponent/src/main/resources/en_US/element/string.json b/feature/systemui/capsulecomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/capsulecomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/capsulecomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg b/feature/systemui/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg similarity index 100% rename from systemui4merge/features/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg rename to feature/systemui/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg diff --git a/systemui4merge/features/capsulecomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/capsulecomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/capsulecomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/capsulecomponent/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/features/clockcomponent/build-profile.json5 b/feature/systemui/clockcomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/clockcomponent/build-profile.json5 rename to feature/systemui/clockcomponent/build-profile.json5 diff --git a/systemui4merge/features/clockcomponent/hvigorfile.js b/feature/systemui/clockcomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/clockcomponent/hvigorfile.js rename to feature/systemui/clockcomponent/hvigorfile.ts diff --git a/systemui4merge/features/clockcomponent/package-lock.json b/feature/systemui/clockcomponent/package-lock.json similarity index 30% rename from systemui4merge/features/clockcomponent/package-lock.json rename to feature/systemui/clockcomponent/package-lock.json index f5ba2591..605bacbd 100644 --- a/systemui4merge/features/clockcomponent/package-lock.json +++ b/feature/systemui/clockcomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/clockcomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/feature/systemui/clockcomponent/package.json b/feature/systemui/clockcomponent/package.json new file mode 100644 index 00000000..e86c5377 --- /dev/null +++ b/feature/systemui/clockcomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/clockcomponent", + "description": "a npm package which contains clockcomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts b/feature/systemui/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 90% rename from systemui4merge/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts rename to feature/systemui/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts index 1c654568..70622f89 100644 --- a/systemui4merge/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/feature/systemui/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; const TAG = 'clock-StyleConfiguration'; diff --git a/systemui4merge/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/feature/systemui/clockcomponent/src/main/ets/default/pages/clockIcon.ets similarity index 83% rename from systemui4merge/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets rename to feature/systemui/clockcomponent/src/main/ets/default/pages/clockIcon.ets index 6762c12c..92a77353 100644 --- a/systemui4merge/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/feature/systemui/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -13,17 +13,17 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' import StyleConfiguration, { ClockComponentStyle } from '../common/StyleConfiguration' import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/StyleConfiguration' import ViewModel from '../viewmodel/ClockVM' import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT, -} from '../../../../../../../common/src/main/ets/default/TimeManager' -import EventManager, { unsubscribe } from '../../../../../../../common/src/main/ets/default/event/EventManager' +} from '@ohos/common/src/main/ets/default/TimeManager' +import EventManager, { unsubscribe } from '@ohos/common/src/main/ets/default/event/EventManager' const TAG = 'ClockComponent-clockIcon'; diff --git a/systemui4merge/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts b/feature/systemui/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts similarity index 75% rename from systemui4merge/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts rename to feature/systemui/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts index a6842fe1..ace0b88d 100644 --- a/systemui4merge/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts +++ b/feature/systemui/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import { FASlotName } from '../../../../../../../common/src/main/ets/default/Constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '../../../../../../../common/src/main/ets/default/TintStateManager'; -import createOrGet from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/TintStateManager'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'ClockVM'; diff --git a/systemui4merge/features/clockcomponent/src/main/module.json5 b/feature/systemui/clockcomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/clockcomponent/src/main/module.json5 rename to feature/systemui/clockcomponent/src/main/module.json5 diff --git a/systemui4merge/features/clockcomponent/src/main/resources/base/element/color.json b/feature/systemui/clockcomponent/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/features/clockcomponent/src/main/resources/base/element/color.json rename to feature/systemui/clockcomponent/src/main/resources/base/element/color.json diff --git a/systemui4merge/features/clockcomponent/src/main/resources/base/element/float.json b/feature/systemui/clockcomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/clockcomponent/src/main/resources/base/element/float.json rename to feature/systemui/clockcomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/clockcomponent/src/main/resources/base/element/string.json b/feature/systemui/clockcomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/clockcomponent/src/main/resources/base/element/string.json rename to feature/systemui/clockcomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/clockcomponent/src/main/resources/base/media/icon.png b/feature/systemui/clockcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/features/clockcomponent/src/main/resources/base/media/icon.png rename to feature/systemui/clockcomponent/src/main/resources/base/media/icon.png diff --git a/systemui4merge/features/clockcomponent/src/main/resources/en_US/element/string.json b/feature/systemui/clockcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/clockcomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/clockcomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/clockcomponent/src/main/resources/phone/element/float.json b/feature/systemui/clockcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/features/clockcomponent/src/main/resources/phone/element/float.json rename to feature/systemui/clockcomponent/src/main/resources/phone/element/float.json diff --git a/systemui4merge/features/clockcomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/clockcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/clockcomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/clockcomponent/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/features/locationcomponent/build-profile.json5 b/feature/systemui/locationcomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/locationcomponent/build-profile.json5 rename to feature/systemui/locationcomponent/build-profile.json5 diff --git a/systemui4merge/features/locationcomponent/hvigorfile.js b/feature/systemui/locationcomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/locationcomponent/hvigorfile.js rename to feature/systemui/locationcomponent/hvigorfile.ts diff --git a/systemui4merge/features/locationcomponent/package-lock.json b/feature/systemui/locationcomponent/package-lock.json similarity index 31% rename from systemui4merge/features/locationcomponent/package-lock.json rename to feature/systemui/locationcomponent/package-lock.json index 05f97a5e..3f8f9a2a 100644 --- a/systemui4merge/features/locationcomponent/package-lock.json +++ b/feature/systemui/locationcomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/locationcomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/feature/systemui/locationcomponent/package.json b/feature/systemui/locationcomponent/package.json new file mode 100644 index 00000000..9f81ccb2 --- /dev/null +++ b/feature/systemui/locationcomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/locationcomponent", + "description": "a npm package which contains locationcomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts b/feature/systemui/locationcomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from systemui4merge/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts rename to feature/systemui/locationcomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 91% rename from systemui4merge/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to feature/systemui/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index ebcc056b..a4db19b0 100644 --- a/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; const TAG = 'location-StyleConfiguration'; diff --git a/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts b/feature/systemui/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts similarity index 93% rename from systemui4merge/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts rename to feature/systemui/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts index 56bd9b5e..0fb84afd 100644 --- a/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts +++ b/feature/systemui/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts @@ -14,8 +14,8 @@ */ import geolocation from '@ohos.geoLocationManager'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'LocationModel'; diff --git a/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets b/feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets similarity index 84% rename from systemui4merge/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets rename to feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets index aca83c1b..e108346f 100644 --- a/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets +++ b/feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets @@ -13,12 +13,12 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager"; -import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import EventManager from "@ohos/common/src/main/ets/default/event/EventManager"; +import {obtainStartAbility} from "@ohos/common/src/main/ets/default/event/EventUtil"; import {LocationData} from '../common/Constants'; import ViewModel from '../viewmodel/LocationVM'; -import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase'; +import SimpleToggleBase from '@ohos/common/src/main/ets/template/SimpleToggleBase'; const TAG = 'location-ControlCenterSimpleToggleLocationComponent'; diff --git a/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets b/feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets similarity index 88% rename from systemui4merge/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets rename to feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets index 63f02c78..e643975f 100644 --- a/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets +++ b/feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager'; import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; +} from '@ohos/common/src/main/ets/default/StyleConfiguration'; import StyleConfiguration, { StartsBarLocationComponentStyle } from '../common/StyleConfiguration'; import Constants from '../common/Constants'; import ViewModel from '../viewmodel/LocationVM'; diff --git a/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts b/feature/systemui/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts similarity index 81% rename from systemui4merge/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts rename to feature/systemui/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts index 2e769480..727021c3 100644 --- a/systemui4merge/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts +++ b/feature/systemui/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts @@ -13,12 +13,12 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import SwitchUserManager from '../../../../../../../../common/src/main/ets/default/SwitchUserManager'; -import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import SwitchUserManager from '@ohos/common/src/main/ets/default/SwitchUserManager'; +import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/TintStateManager'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; import { LocationData } from '../common/Constants'; import LocationService from '../model/LocationService'; diff --git a/systemui4merge/features/locationcomponent/src/main/module.json5 b/feature/systemui/locationcomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/locationcomponent/src/main/module.json5 rename to feature/systemui/locationcomponent/src/main/module.json5 diff --git a/systemui4merge/features/locationcomponent/src/main/resources/base/element/float.json b/feature/systemui/locationcomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/locationcomponent/src/main/resources/base/element/float.json rename to feature/systemui/locationcomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/locationcomponent/src/main/resources/base/element/string.json b/feature/systemui/locationcomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/locationcomponent/src/main/resources/base/element/string.json rename to feature/systemui/locationcomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg b/feature/systemui/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg similarity index 100% rename from systemui4merge/features/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg rename to feature/systemui/locationcomponent/src/main/resources/base/media/ic_controlcenter_gps.svg diff --git a/systemui4merge/features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg b/feature/systemui/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg similarity index 100% rename from systemui4merge/features/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg rename to feature/systemui/locationcomponent/src/main/resources/base/media/ic_statusbar_gps.svg diff --git a/systemui4merge/features/locationcomponent/src/main/resources/base/media/icon.png b/feature/systemui/locationcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/features/locationcomponent/src/main/resources/base/media/icon.png rename to feature/systemui/locationcomponent/src/main/resources/base/media/icon.png diff --git a/systemui4merge/features/locationcomponent/src/main/resources/en_US/element/string.json b/feature/systemui/locationcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/locationcomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/locationcomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/locationcomponent/src/main/resources/phone/element/float.json b/feature/systemui/locationcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/features/locationcomponent/src/main/resources/phone/element/float.json rename to feature/systemui/locationcomponent/src/main/resources/phone/element/float.json diff --git a/systemui4merge/features/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg b/feature/systemui/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg similarity index 100% rename from systemui4merge/features/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg rename to feature/systemui/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg diff --git a/systemui4merge/features/locationcomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/locationcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/locationcomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/locationcomponent/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/features/nfccomponent/build-profile.json5 b/feature/systemui/nfccomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/nfccomponent/build-profile.json5 rename to feature/systemui/nfccomponent/build-profile.json5 diff --git a/systemui4merge/features/nfccomponent/hvigorfile.js b/feature/systemui/nfccomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/nfccomponent/hvigorfile.js rename to feature/systemui/nfccomponent/hvigorfile.ts diff --git a/feature/systemui/nfccomponent/package-lock.json b/feature/systemui/nfccomponent/package-lock.json new file mode 100644 index 00000000..fb4750c8 --- /dev/null +++ b/feature/systemui/nfccomponent/package-lock.json @@ -0,0 +1,11 @@ +{ + "name": "@ohos/nfccomponent", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } +} diff --git a/feature/systemui/nfccomponent/package.json b/feature/systemui/nfccomponent/package.json new file mode 100644 index 00000000..a69a641f --- /dev/null +++ b/feature/systemui/nfccomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/nfccomponent", + "description": "a npm package which contains nfccomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 93% rename from systemui4merge/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to feature/systemui/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index e6cb7526..56837f3b 100644 --- a/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; const TAG = 'capsule-StyleConfiguration'; diff --git a/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts b/feature/systemui/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts similarity index 94% rename from systemui4merge/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts rename to feature/systemui/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts index 1cfbbbcb..5f64a6e2 100644 --- a/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts +++ b/feature/systemui/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts @@ -15,8 +15,8 @@ import NfcController from '@ohos.nfc.controller'; import { BusinessError } from 'basic'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'NFCModel'; diff --git a/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets b/feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets similarity index 87% rename from systemui4merge/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets rename to feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets index e7102646..43b109b2 100644 --- a/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets +++ b/feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets @@ -13,12 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager"; -import { obtainStartAbility } from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import NfcController from '@ohos.nfc.controller'; import ViewModel from '../viewmodel/NFCModeVM'; -import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase'; +import SimpleToggleBase from '@ohos/common/src/main/ets/template/SimpleToggleBase'; const TAG = 'nfcmode-ControlCenterSimpleToggleNFComponent'; diff --git a/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets b/feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets similarity index 89% rename from systemui4merge/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets rename to feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets index dcceb94b..817c80a5 100644 --- a/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets +++ b/feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager'; import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; +} from '@ohos/common/src/main/ets/default/StyleConfiguration'; import StyleConfiguration, { StatusRingModeComponentStyle } from '../common/StyleConfiguration'; import NfcController from '@ohos.nfc.controller'; import ViewModel from '../viewmodel/NFCModeVM'; diff --git a/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts b/feature/systemui/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts similarity index 86% rename from systemui4merge/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts rename to feature/systemui/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts index b44d2acc..08fa46b9 100644 --- a/systemui4merge/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts +++ b/feature/systemui/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts @@ -14,11 +14,11 @@ */ import parameter from '@ohos.systemparameter' -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/TintStateManager'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; import NFCModeService from '../model/NFCModeService'; import NfcController from '@ohos.nfc.controller'; diff --git a/systemui4merge/features/nfccomponent/src/main/module.json5 b/feature/systemui/nfccomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/module.json5 rename to feature/systemui/nfccomponent/src/main/module.json5 diff --git a/systemui4merge/features/nfccomponent/src/main/resources/base/element/color.json b/feature/systemui/nfccomponent/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/base/element/color.json rename to feature/systemui/nfccomponent/src/main/resources/base/element/color.json diff --git a/systemui4merge/features/nfccomponent/src/main/resources/base/element/float.json b/feature/systemui/nfccomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/base/element/float.json rename to feature/systemui/nfccomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/nfccomponent/src/main/resources/base/element/string.json b/feature/systemui/nfccomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/base/element/string.json rename to feature/systemui/nfccomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg b/feature/systemui/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg rename to feature/systemui/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg diff --git a/systemui4merge/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg b/feature/systemui/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg rename to feature/systemui/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg diff --git a/systemui4merge/features/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg b/feature/systemui/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg rename to feature/systemui/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg diff --git a/systemui4merge/features/nfccomponent/src/main/resources/en_US/element/string.json b/feature/systemui/nfccomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/nfccomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/nfccomponent/src/main/resources/phone/element/float.json b/feature/systemui/nfccomponent/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/phone/element/float.json rename to feature/systemui/nfccomponent/src/main/resources/phone/element/float.json diff --git a/systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg b/feature/systemui/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg rename to feature/systemui/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg diff --git a/systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg b/feature/systemui/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg rename to feature/systemui/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg diff --git a/systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg b/feature/systemui/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg rename to feature/systemui/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg diff --git a/systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg b/feature/systemui/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg rename to feature/systemui/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg diff --git a/systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg b/feature/systemui/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg rename to feature/systemui/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg diff --git a/systemui4merge/features/nfccomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/nfccomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/nfccomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/nfccomponent/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/product/phone/statusbar/.gitignore b/feature/systemui/phone/statusbar/.gitignore similarity index 100% rename from systemui4merge/product/phone/statusbar/.gitignore rename to feature/systemui/phone/statusbar/.gitignore diff --git a/systemui4merge/features/ringmodecomponent/build-profile.json5 b/feature/systemui/phone/statusbar/build-profile.json5 similarity index 100% rename from systemui4merge/features/ringmodecomponent/build-profile.json5 rename to feature/systemui/phone/statusbar/build-profile.json5 diff --git a/systemui4merge/features/ringmodecomponent/hvigorfile.js b/feature/systemui/phone/statusbar/hvigorfile.ts similarity index 100% rename from systemui4merge/features/ringmodecomponent/hvigorfile.js rename to feature/systemui/phone/statusbar/hvigorfile.ts diff --git a/feature/systemui/phone/statusbar/package-lock.json b/feature/systemui/phone/statusbar/package-lock.json new file mode 100644 index 00000000..3f27340d --- /dev/null +++ b/feature/systemui/phone/statusbar/package-lock.json @@ -0,0 +1,130 @@ +{ + "name": "@ohos/phone_statusbar", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + }, + "@ohos/statusbarcomponent": { + "version": "file:../../statusbarcomponent", + "requires": { + "@ohos/batterycomponent": "file:../../batterycomponent", + "@ohos/bluetoothcomponent": "file:../../bluetoothcomponent", + "@ohos/capsulecomponent": "file:../../capsulecomponent", + "@ohos/clockcomponent": "file:../../clockcomponent", + "@ohos/common": "file:../../../../common", + "@ohos/locationcomponent": "file:../../locationcomponent", + "@ohos/nfccomponent": "file:../../nfccomponent", + "@ohos/ringmodecomponent": "file:../../ringmodecomponent", + "@ohos/signalcomponent": "file:../../signalcomponent", + "@ohos/wificomponent": "file:../../wificomponent" + }, + "dependencies": { + "@ohos/batterycomponent": { + "version": "file:../../batterycomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/bluetoothcomponent": { + "version": "file:../../bluetoothcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/capsulecomponent": { + "version": "file:../../capsulecomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/clockcomponent": { + "version": "file:../../clockcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/common": { + "version": "file:../../../../common" + }, + "@ohos/locationcomponent": { + "version": "file:../../locationcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/nfccomponent": { + "version": "file:../../nfccomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/ringmodecomponent": { + "version": "file:../../ringmodecomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/signalcomponent": { + "version": "file:../../signalcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/wificomponent": { + "version": "file:../../wificomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + } + } + } + } +} diff --git a/feature/systemui/phone/statusbar/package.json b/feature/systemui/phone/statusbar/package.json new file mode 100644 index 00000000..263647f7 --- /dev/null +++ b/feature/systemui/phone/statusbar/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/phone_statusbar", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "type": "module", + "dependencies": { + "@ohos/statusbarcomponent": "../../statusbarcomponent", + "@ohos/common": "../../../../common" + } +} diff --git a/systemui4merge/product/phone/statusbar/src/main/ets/pages/index.ets b/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets similarity index 58% rename from systemui4merge/product/phone/statusbar/src/main/ets/pages/index.ets rename to feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets index 3f157a76..1d2c3c8f 100644 --- a/systemui4merge/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Copyright (c) 2023 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 @@ -13,30 +13,38 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import Trace from '../../../../../../../common/src/main/ets/default/Trace' -import WindowManager, {WindowType, WINDOW_SHOW_HIDE_EVENT -} from '../../../../../../../common/src/main/ets/default/WindowManager' -import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager" -import {obtainLocalEvent} from "../../../../../../../common/src/main/ets/default/event/EventUtil" -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager' -import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' -import StatusBarComponent from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' -import StatusBarVM from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' -import {StatusBarData} from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import StatusBarConfiguration from '@ohos/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; + +import EventManager, {unsubscribe} from "@ohos/common/src/main/ets/default/event/EventManager" +import {obtainLocalEvent} from "@ohos/common/src/main/ets/default/event/EventUtil" +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager' +import HeightConfigUtils from '@ohos/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' +import StatusBarComponent from '@ohos/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' +import StatusBarVM from '@ohos/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' +import {StatusBarData} from '@ohos/statusbarcomponent/src/main/ets/com/ohos/common/Constants' import Constants from './common/constants' import StyleManager from './common/StyleManager' import StatusbarConfig from './common/StatusbarConfig' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' +import screenSessionManager from '@ohos.screenSessionManager' +import deviceInfo from '@ohos.deviceInfo'; +import Trace from '@ohos/common/src/main/ets/default/Trace' +import WindowManager, {WindowType, WINDOW_SHOW_HIDE_EVENT +} from '@ohos/common/src/main/ets/default/WindowManager' -const TAG = 'StatusBar-Index' +const TAG = "StatusBar"; const SLIDING_STATUS_BAR_DISTANCE = 18 let mHeightConfigUtils; -@Entry +const context = getContext(this) as Context +const deviceTypeInfo = deviceInfo.deviceType; + @Component -struct Index { +export struct StatusBar { + bounds: screenSessionManager.RRect + private screenDirection :number; startX: number = 0 startY: number = 0 @State moveX: number = 0 @@ -45,15 +53,27 @@ struct Index { @StorageLink('StatusMinH') StatusMinH: number = 24 @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 mClearCallback: unsubscribe | undefined + mHasInit: boolean = false + mStatusBarRect = { + left: 0, + top: 0, + width: 0, + height: 0 + }; onBackPress(): boolean { return true; } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, start`); + Log.showInfo(TAG, `aboutToAppear, start, ${this.bounds.width}, ${this.bounds.height}`); + this.updateData(); - this.updateStatusBarData(); + Log.showInfo(TAG, `aboutToAppear, end`); + } + + async updateData() { + await this.updateStatusBarData(); setAppBgColor('#00000000'); CommonStyleManager.setAbilityPageName(TAG); @@ -95,15 +115,22 @@ struct Index { .onTouch(this.touchEvent.bind(this)) } .width('100%') - .height('100%') + .height(this.mStatusBarRect.height) .constraintSize({ minHeight: this.StatusMinH }) + .position({x:this.mStatusBarRect.left, y:this.mStatusBarRect.top}) .onAreaChange((e, e2) => { Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); - this.updateStatusBarData(); + this.updateStatusBarData(); }) } - updateStatusBarData() { + async updateStatusBarData() { + if (!this.mHasInit) { + Log.showInfo(TAG, "updateStatusBarData init") + AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, context); + await this.initConfiguration(); + this.mHasInit = true; + } let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); let statusBarData: StatusBarData = new StatusBarData(); statusBarData.displayWidth = configInfo.maxWidth; @@ -165,11 +192,52 @@ struct Index { onWindowShowHideEvent(args) { Log.showDebug(TAG, `onWindowShowHideEvent, args: ${JSON.stringify(args)}`) - if (args.windowName == WindowType.DROPDOWN_PANEL) { - if (args.isShow) { +// if (args.windowName == WindowType.DROPDOWN_PANEL) { +// if (args.isShow) { +// } else { +// StatusBarVM.setUseInWindowName(WindowType.STATUS_BAR) +// } +// } + } + + async initConfiguration() { + let configInfo = await StatusBarConfiguration.getConfiguration(this.bounds); + this.screenDirection = configInfo.direction; + let screenFactor; + if (deviceTypeInfo === 'phone') { + screenFactor = this.screenDirection === 1 ? 1188 : 540; + } else { + screenFactor = this.screenDirection === 1 ? 640 : 360; + } + if (configInfo.showHorizontal) { + if (configInfo.realHeight == 0) { + Log.showInfo(TAG, `hide statusbar`); + } else { + configInfo.realHeight = (configInfo.realHeight * configInfo.maxWidth) / screenFactor; + } + configInfo.minHeight = configInfo.realHeight; + if (configInfo.yCoordinate > 0) { + configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; + } + } else { + if (configInfo.realWidth == 0) { + Log.showInfo(TAG, `hide statusbar`); } else { - StatusBarVM.setUseInWindowName(WindowType.STATUS_BAR) + configInfo.realWidth = (configInfo.realWidth * configInfo.maxWidth) / screenFactor; + } + configInfo.minHeight = configInfo.realWidth; + if (configInfo.xCoordinate > 0) { + configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth; } } + + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo); + Log.showInfo(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); + + this.mStatusBarRect.left = configInfo.xCoordinate; + this.mStatusBarRect.top = configInfo.yCoordinate; + this.mStatusBarRect.width = configInfo.realWidth; + this.mStatusBarRect.height = configInfo.realHeight; + Log.showInfo(TAG, `createNewWindow, mStatusBarRect: ${JSON.stringify(this.mStatusBarRect)}`); } -} +} \ No newline at end of file diff --git a/systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts b/feature/systemui/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts similarity index 91% rename from systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts rename to feature/systemui/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts index 0c163355..523dcb71 100644 --- a/systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts +++ b/feature/systemui/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts @@ -12,9 +12,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; +import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; import { StatusBarConfig -} from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; +} from '@ohos/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; const statusbarConfig: StatusBarConfig = { LayoutGroups: [ diff --git a/systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts similarity index 89% rename from systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts rename to feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts index 5979e09d..ec014638 100644 --- a/systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts +++ b/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; const TAG = 'StatusBar-StyleConfiguration'; diff --git a/systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts b/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleManager.ts similarity index 88% rename from systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts rename to feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleManager.ts index f201dcb0..f8aa3b39 100644 --- a/systemui4merge/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -12,8 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; const TAG = 'StatusBar-StyleManager'; diff --git a/systemui4merge/product/phone/statusbar/src/main/ets/pages/common/constants.ts b/feature/systemui/phone/statusbar/src/main/ets/pages/common/constants.ts similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/ets/pages/common/constants.ts rename to feature/systemui/phone/statusbar/src/main/ets/pages/common/constants.ts diff --git a/systemui4merge/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/feature/systemui/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js similarity index 90% rename from systemui4merge/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js rename to feature/systemui/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 2f7076ea..be1c95fd 100644 --- a/systemui4merge/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/feature/systemui/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -14,9 +14,9 @@ */ import worker from '@ohos.worker'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager'; -import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import PluginDataSourceManager from '@ohos/common/src/main/ets/plugindatasource/PluginDataSourceManager'; +import Constants, { obtainMsg } from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; diff --git a/feature/systemui/phone/statusbar/src/main/module.json5 b/feature/systemui/phone/statusbar/src/main/module.json5 new file mode 100644 index 00000000..53f35bd3 --- /dev/null +++ b/feature/systemui/phone/statusbar/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "phone_statusbar", + "type": "har", + "deviceTypes": [ + "default" + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/element/color.json b/feature/systemui/phone/statusbar/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/element/color.json rename to feature/systemui/phone/statusbar/src/main/resources/base/element/color.json diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/element/float.json b/feature/systemui/phone/statusbar/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/element/float.json rename to feature/systemui/phone/statusbar/src/main/resources/base/element/float.json diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/element/string.json b/feature/systemui/phone/statusbar/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/element/string.json rename to feature/systemui/phone/statusbar/src/main/resources/base/element/string.json diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg diff --git a/systemui4merge/features/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg similarity index 100% rename from systemui4merge/features/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg diff --git a/systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg diff --git a/systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg diff --git a/systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png diff --git a/systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg diff --git a/systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg rename to feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/media/icon.png b/feature/systemui/phone/statusbar/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/media/icon.png rename to feature/systemui/phone/statusbar/src/main/resources/base/media/icon.png diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/profile/main_pages.json b/feature/systemui/phone/statusbar/src/main/resources/base/profile/main_pages.json similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/profile/main_pages.json rename to feature/systemui/phone/statusbar/src/main/resources/base/profile/main_pages.json diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/en_US/element/string.json b/feature/systemui/phone/statusbar/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/en_US/element/string.json rename to feature/systemui/phone/statusbar/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg diff --git a/systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg diff --git a/systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg diff --git a/systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg diff --git a/systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg diff --git a/systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg b/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg rename to feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/zh_CN/element/string.json b/feature/systemui/phone/statusbar/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/zh_CN/element/string.json rename to feature/systemui/phone/statusbar/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/features/signalcomponent/build-profile.json5 b/feature/systemui/ringmodecomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/signalcomponent/build-profile.json5 rename to feature/systemui/ringmodecomponent/build-profile.json5 diff --git a/systemui4merge/features/signalcomponent/hvigorfile.js b/feature/systemui/ringmodecomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/signalcomponent/hvigorfile.js rename to feature/systemui/ringmodecomponent/hvigorfile.ts diff --git a/systemui4merge/features/ringmodecomponent/package-lock.json b/feature/systemui/ringmodecomponent/package-lock.json similarity index 31% rename from systemui4merge/features/ringmodecomponent/package-lock.json rename to feature/systemui/ringmodecomponent/package-lock.json index 14ffdd1b..9f8a341a 100644 --- a/systemui4merge/features/ringmodecomponent/package-lock.json +++ b/feature/systemui/ringmodecomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/ringmodecomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/feature/systemui/ringmodecomponent/package.json b/feature/systemui/ringmodecomponent/package.json new file mode 100644 index 00000000..d6ef56de --- /dev/null +++ b/feature/systemui/ringmodecomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/ringmodecomponent", + "description": "a npm package which contains ringmodecomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts rename to feature/systemui/ringmodecomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 93% rename from systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to feature/systemui/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index e6cb7526..56837f3b 100644 --- a/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; const TAG = 'capsule-StyleConfiguration'; diff --git a/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts similarity index 90% rename from systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts rename to feature/systemui/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts index b77c86ae..afc24e0c 100644 --- a/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts +++ b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts @@ -15,9 +15,9 @@ import audio from '@ohos.multimedia.audio'; import { BusinessError } from 'basic'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import { getAudioManager } from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import { getAudioManager } from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; import { AudioRingMode } from '../common/Constants'; const TAG = 'RingModeModel'; diff --git a/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets similarity index 90% rename from systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets rename to feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets index 1fee9823..95c7d073 100644 --- a/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets +++ b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets @@ -13,12 +13,12 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager" -import { obtainStartAbility } from "../../../../../../../../common/src/main/ets/default/event/EventUtil" +import { Log } from '@ohos/common/src/main/ets/default/utils/Log' +import EventManager from "@ohos/common/src/main/ets/default/event/EventManager" +import { obtainStartAbility } from "@ohos/common/src/main/ets/default/event/EventUtil" import { AudioRingMode } from '../common/Constants' import ViewModel from '../viewmodel/RingModeVM' -import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase' +import SimpleToggleBase from '@ohos/common/src/main/ets/template/SimpleToggleBase' import StyleConfiguration, { ControlCenterRingModeComponentStyle } from '../common/StyleConfiguration' const TAG = 'ringmode-ControlCenterSimpleToggleRingModeComponent' diff --git a/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets similarity index 90% rename from systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets rename to feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets index 31a37f86..3b18da86 100644 --- a/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets +++ b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log' +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/StyleConfiguration' import StyleConfiguration, { StatusRingModeComponentStyle } from '../common/StyleConfiguration' import Constants, { AudioRingMode } from '../common/Constants' import ViewModel from '../viewmodel/RingModeVM' diff --git a/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts similarity index 85% rename from systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts rename to feature/systemui/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts index 3195c09d..c4c46f6a 100644 --- a/systemui4merge/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts +++ b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/TintStateManager'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; import { AudioRingMode } from '../common/Constants'; import RingModeService from '../model/RingModeService'; diff --git a/systemui4merge/features/ringmodecomponent/src/main/module.json5 b/feature/systemui/ringmodecomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/module.json5 rename to feature/systemui/ringmodecomponent/src/main/module.json5 diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/base/element/color.json b/feature/systemui/ringmodecomponent/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/base/element/color.json rename to feature/systemui/ringmodecomponent/src/main/resources/base/element/color.json diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/base/element/float.json b/feature/systemui/ringmodecomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/base/element/float.json rename to feature/systemui/ringmodecomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/base/element/string.json b/feature/systemui/ringmodecomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/base/element/string.json rename to feature/systemui/ringmodecomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg b/feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg rename to feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg b/feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg rename to feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg b/feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg rename to feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg b/feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg rename to feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg b/feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_vibration_on.svg rename to feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/en_US/element/string.json b/feature/systemui/ringmodecomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/ringmodecomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/phone/element/float.json b/feature/systemui/ringmodecomponent/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/phone/element/float.json rename to feature/systemui/ringmodecomponent/src/main/resources/phone/element/float.json diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg b/feature/systemui/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg rename to feature/systemui/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg b/feature/systemui/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg rename to feature/systemui/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg diff --git a/systemui4merge/features/ringmodecomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/ringmodecomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/ringmodecomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/ringmodecomponent/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/features/statusbarcomponent/build-profile.json5 b/feature/systemui/signalcomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/statusbarcomponent/build-profile.json5 rename to feature/systemui/signalcomponent/build-profile.json5 diff --git a/systemui4merge/features/statusbarcomponent/hvigorfile.js b/feature/systemui/signalcomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/statusbarcomponent/hvigorfile.js rename to feature/systemui/signalcomponent/hvigorfile.ts diff --git a/systemui4merge/features/signalcomponent/package-lock.json b/feature/systemui/signalcomponent/package-lock.json similarity index 30% rename from systemui4merge/features/signalcomponent/package-lock.json rename to feature/systemui/signalcomponent/package-lock.json index 8782c092..5b8db4fc 100644 --- a/systemui4merge/features/signalcomponent/package-lock.json +++ b/feature/systemui/signalcomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/signalcomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/feature/systemui/signalcomponent/package.json b/feature/systemui/signalcomponent/package.json new file mode 100644 index 00000000..3f9913c0 --- /dev/null +++ b/feature/systemui/signalcomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/signalcomponent", + "description": "a npm package which contains signalcomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts b/feature/systemui/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 93% rename from systemui4merge/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts rename to feature/systemui/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts index 2c9b91ae..5c7da693 100644 --- a/systemui4merge/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/feature/systemui/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; const TAG = 'signal-StyleConfiguration'; diff --git a/systemui4merge/features/signalcomponent/src/main/ets/default/common/constants.ts b/feature/systemui/signalcomponent/src/main/ets/default/common/constants.ts similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/ets/default/common/constants.ts rename to feature/systemui/signalcomponent/src/main/ets/default/common/constants.ts diff --git a/systemui4merge/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/feature/systemui/signalcomponent/src/main/ets/default/pages/signalIcon.ets similarity index 96% rename from systemui4merge/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets rename to feature/systemui/signalcomponent/src/main/ets/default/pages/signalIcon.ets index fd06cd2f..c122aad4 100644 --- a/systemui4merge/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/feature/systemui/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -15,10 +15,10 @@ import Constants from '../common/constants'; import mSignalModel from '../signalModel'; -import Log from '../../../../../../../common/src/main/ets/default/Log' -import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/StyleConfiguration' import StyleConfiguration, { SignalComponentStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/SignalVM' diff --git a/systemui4merge/features/signalcomponent/src/main/ets/default/signalModel.ts b/feature/systemui/signalcomponent/src/main/ets/default/signalModel.ts similarity index 98% rename from systemui4merge/features/signalcomponent/src/main/ets/default/signalModel.ts rename to feature/systemui/signalcomponent/src/main/ets/default/signalModel.ts index 8df6240f..d8a3f748 100644 --- a/systemui4merge/features/signalcomponent/src/main/ets/default/signalModel.ts +++ b/feature/systemui/signalcomponent/src/main/ets/default/signalModel.ts @@ -17,7 +17,7 @@ import commonEvent from "@ohos.commonEvent"; import Radio from '@ohos.telephony.radio'; import Sim from '@ohos.telephony.sim'; import Observer from '@ohos.telephony.observer'; -import Log from "../../../../../../common/src/main/ets/default/Log"; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants from './common/constants'; const TAG = 'SignalStatus-SignalModel'; diff --git a/systemui4merge/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts b/feature/systemui/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts similarity index 75% rename from systemui4merge/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts rename to feature/systemui/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts index a56ca9da..3b735469 100644 --- a/systemui4merge/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts +++ b/feature/systemui/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import { FASlotName } from '../../../../../../../common/src/main/ets/default/Constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '../../../../../../../common/src/main/ets/default/TintStateManager'; -import createOrGet from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/TintStateManager'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'SignalVM'; diff --git a/systemui4merge/features/signalcomponent/src/main/module.json5 b/feature/systemui/signalcomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/module.json5 rename to feature/systemui/signalcomponent/src/main/module.json5 diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/element/color.json b/feature/systemui/signalcomponent/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/element/color.json rename to feature/systemui/signalcomponent/src/main/resources/base/element/color.json diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/element/float.json b/feature/systemui/signalcomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/element/float.json rename to feature/systemui/signalcomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/signalcomponent/src/main/resources/base/element/string.json b/feature/systemui/signalcomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/base/element/string.json rename to feature/systemui/signalcomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg b/feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_1.svg rename to feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg b/feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_2.svg rename to feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg b/feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_3.svg rename to feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg b/feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_4.svg rename to feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg b/feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_full.svg rename to feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg b/feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_no.svg rename to feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_roaming.png rename to feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png b/feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_signal_wait.png rename to feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_connect.png rename to feature/systemui/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png diff --git a/systemui4merge/features/statusbarcomponent/src/main/resources/base/media/icon.png b/feature/systemui/signalcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/features/statusbarcomponent/src/main/resources/base/media/icon.png rename to feature/systemui/signalcomponent/src/main/resources/base/media/icon.png diff --git a/systemui4merge/features/signalcomponent/src/main/resources/en_US/element/string.json b/feature/systemui/signalcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/signalcomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/signalcomponent/src/main/resources/phone/element/float.json b/feature/systemui/signalcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/phone/element/float.json rename to feature/systemui/signalcomponent/src/main/resources/phone/element/float.json diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg b/feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg rename to feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg b/feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg rename to feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg b/feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg rename to feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg b/feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg rename to feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg b/feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg rename to feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg b/feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg rename to feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg diff --git a/systemui4merge/features/signalcomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/signalcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/signalcomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/signalcomponent/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/features/wificomponent/build-profile.json5 b/feature/systemui/statusbarcomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/wificomponent/build-profile.json5 rename to feature/systemui/statusbarcomponent/build-profile.json5 diff --git a/systemui4merge/features/wificomponent/hvigorfile.js b/feature/systemui/statusbarcomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/wificomponent/hvigorfile.js rename to feature/systemui/statusbarcomponent/hvigorfile.ts diff --git a/feature/systemui/statusbarcomponent/package-lock.json b/feature/systemui/statusbarcomponent/package-lock.json new file mode 100644 index 00000000..a86c84db --- /dev/null +++ b/feature/systemui/statusbarcomponent/package-lock.json @@ -0,0 +1,110 @@ +{ + "name": "@ohos/statusbarcomponent", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/batterycomponent": { + "version": "file:../batterycomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/bluetoothcomponent": { + "version": "file:../bluetoothcomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/capsulecomponent": { + "version": "file:../capsulecomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/clockcomponent": { + "version": "file:../clockcomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/common": { + "version": "file:../../../common" + }, + "@ohos/locationcomponent": { + "version": "file:../locationcomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/nfccomponent": { + "version": "file:../nfccomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/ringmodecomponent": { + "version": "file:../ringmodecomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/signalcomponent": { + "version": "file:../signalcomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/wificomponent": { + "version": "file:../wificomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + } + } +} diff --git a/feature/systemui/statusbarcomponent/package.json b/feature/systemui/statusbarcomponent/package.json new file mode 100644 index 00000000..ca7d8a91 --- /dev/null +++ b/feature/systemui/statusbarcomponent/package.json @@ -0,0 +1,25 @@ +{ + "devDependencies": {}, + "name": "@ohos/statusbarcomponent", + "description": "a npm package which contains statusbarcomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "main": "index.ets", + "type": "module", + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common", + "@ohos/batterycomponent": "../batterycomponent", + "@ohos/clockcomponent": "../clockcomponent", + "@ohos/bluetoothcomponent": "../bluetoothcomponent", + "@ohos/capsulecomponent": "../capsulecomponent", + "@ohos/signalcomponent": "../signalcomponent", + "@ohos/wificomponent": "../wificomponent", + "@ohos/locationcomponent": "../locationcomponent", + "@ohos/nfccomponent": "../nfccomponent", + "@ohos/ringmodecomponent": "../ringmodecomponent" + } +} diff --git a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 92% rename from systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts rename to feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts index 4e9b4833..2bfa34be 100644 --- a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import { Event } from '../../../../../../../../common/src/main/ets/default/event/EventUtil'; +import { Event } from '@ohos/common/src/main/ets/default/event/EventUtil'; import { ItemComponentData, ActionData, FilterData -} from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; +} from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; export default class Constants { static readonly EMPTY_AREA_POSITION_LEFT = 'left'; diff --git a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts similarity index 83% rename from systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts rename to feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index f10b993d..00312cf1 100644 --- a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -13,11 +13,12 @@ * limitations under the License. */ -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import display from '@ohos.display' -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil' -import CommonStyleConfiguration from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import ResourceUtil from '@ohos/common/src/main/ets/default/ResourceUtil' +import CommonStyleConfiguration from '@ohos/common/src/main/ets/default/StyleConfiguration' +import screenSessionManager from '@ohos.screenSessionManager' const TAG = 'StatusBarConfiguration'; @@ -45,20 +46,12 @@ enum Position { * Get window size. */ class StatusBarConfiguration { - async initStatusBarConfiguration() { + initStatusBarConfiguration(bounds : screenSessionManager.RRect) { Log.showInfo(TAG, 'initWindowManager'); minHeight = 0; - await display.getDefaultDisplay() - .then(dis => { - Log.showInfo(TAG, `initWindowManager dis ${JSON.stringify(dis)}`); - maxWidth = dis.width; - maxHeight = dis.height; - Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); - }) - .catch((err) => { - Log.showError(TAG, `getDefaultDisplay err:${JSON.stringify(err)}`); - }); + maxWidth = bounds.width; + maxHeight = bounds.height; } async getDirectionAndPosition() { @@ -95,8 +88,8 @@ class StatusBarConfiguration { /** * Get status bar configuration */ - public async getConfiguration() { - await this.initStatusBarConfiguration(); + public async getConfiguration(bounds : screenSessionManager.RRect) { + this.initStatusBarConfiguration(bounds); await this.getDirectionAndPosition(); let showHorizontal = false; let ableToMaximize = false; diff --git a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 96% rename from systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 8f810e85..c6c44747 100644 --- a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; import Constants from './Constants'; const TAG = 'statusBar-StyleConfiguration'; diff --git a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts similarity index 94% rename from systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts rename to feature/systemui/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts index b7f7659a..f479b338 100644 --- a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -13,16 +13,16 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import SwitchUserManager, { UserInfo } from '../../../../../../../../common/src/main/ets/default/SwitchUserManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import SwitchUserManager, { UserInfo } from '@ohos/common/src/main/ets/default/SwitchUserManager'; import { ItemComponentData, PluginComponentData, FilterData -} from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; -import PluginDataSourceAdapter from '../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +} from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; +import PluginDataSourceAdapter from '@ohos/common/src/main/ets/plugindatasource/PluginDataSourceAdapter'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import Constants, { StatusBarData, StatusBarComponentData, LayoutGroup, StatusBarConfig } from '../common/Constants'; -import { parseEventString } from '../../../../../../../../common/src/main/ets/default/event/EventUtil'; +import { parseEventString } from '@ohos/common/src/main/ets/default/event/EventUtil'; export interface StatusBarListener { setStatusBarLayout(layout: string[][]): void; diff --git a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets similarity index 88% rename from systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets rename to feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index 69ea8ad8..1b8361aa 100644 --- a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -13,14 +13,14 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import EventManager, { unsubscribe } from '../../../../../../../../common/src/main/ets/default/event/EventManager' -import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils' -import { WINDOW_SHOW_HIDE_EVENT } from '../../../../../../../../common/src/main/ets/default/WindowManager' -import { PluginType,itemData } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import EventManager, { unsubscribe } from '@ohos/common/src/main/ets/default/event/EventManager' +import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils' +import { WINDOW_SHOW_HIDE_EVENT } from '@ohos/common/src/main/ets/default/WindowManager' +import { PluginType,itemData } from "@ohos/common/src/main/ets/plugindatasource/common/Constants" import ViewModel from '../viewmodel/StatusBarVM' import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/StyleConfiguration' import StyleConfiguration, { IconItemComponentStyle } from '../common/StyleConfiguration' import MetaIconItemComponent from './MetaIconItemComponent' import PluginIconItemComponent from './PluginIconItemComponent' diff --git a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets similarity index 87% rename from systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets rename to feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets index 71aebb8e..41159396 100644 --- a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets @@ -13,14 +13,14 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager' -import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' +import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils' import ViewModel from '../viewmodel/StatusBarVM' import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/StyleConfiguration' import StyleConfiguration, { IconItemComponentStyle } from '../common/StyleConfiguration' -import { itemData } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" +import { itemData } from "@ohos/common/src/main/ets/plugindatasource/common/Constants" const TAG = 'MetaIconItemComponent' diff --git a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets similarity index 90% rename from systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets rename to feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets index b0abe998..eb8b0d06 100644 --- a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager' -import { PluginComponentData } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' +import { PluginComponentData } from "@ohos/common/src/main/ets/plugindatasource/common/Constants" import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/StyleConfiguration' import StyleConfiguration, { PluginIconItemComponentStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/StatusBarVM' diff --git a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets similarity index 88% rename from systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets rename to feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index 8a5ec0e3..759f3b7d 100644 --- a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -13,27 +13,27 @@ * limitations under the License. */ -import {isNfcAvailable} from '../../../../../../../../common/src/main/ets/default/Constants'; -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import {isNfcAvailable} from '@ohos/common/src/main/ets/default/Constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import { StatusBarData, StatusBarBackgroundData, StatusBarConfig } from '../common/Constants' -import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants' -import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager' +import { FASlotName } from '@ohos/common/src/main/ets/default/Constants' +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/StyleConfiguration' import StyleConfiguration, { StatusBarNotificationIconStyle, VerticalStatusBarItemLoadComponentStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/StatusBarVM' import { StringArray } from '../viewmodel/StatusBarVM' import IconItemComponent from './IconItemComponent' -import BatteryIcon from '../../../../../../../batterycomponent/src/main/ets/default/pages/batteryIcon' -import ClockIcon from '../../../../../../../clockcomponent/src/main/ets/default/pages/clockIcon' -import WifiIcon from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiIcon' -import BluetoothIcon from '../../../../../../../bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent' -import SignalIcon from '../../../../../../../signalcomponent/src/main/ets/default/pages/signalIcon' -import CapsuleIcon from '../../../../../../../capsulecomponent/src/main/ets/default/pages/CapsuleIcon' -import LocationIcon from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' -import RingModeIcon from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' -import NfcIcon from '../../../../../../../nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent' +import BatteryIcon from '@ohos/batterycomponent/src/main/ets/default/pages/batteryIcon' +import ClockIcon from '@ohos/clockcomponent/src/main/ets/default/pages/clockIcon' +import WifiIcon from '@ohos/wificomponent/src/main/ets/default/pages/wifiIcon' +import BluetoothIcon from '@ohos/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent' +import SignalIcon from '@ohos/signalcomponent/src/main/ets/default/pages/signalIcon' +import CapsuleIcon from '@ohos/capsulecomponent/src/main/ets/default/pages/CapsuleIcon' +import LocationIcon from '@ohos/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' +import RingModeIcon from '@ohos/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' +import NfcIcon from '@ohos/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent' const TAG = 'StatusBarComponent' const TAG_StatusBarGroup = 'StatusBarGroup' diff --git a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts similarity index 92% rename from systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts rename to feature/systemui/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index b5f52787..7cb76353 100644 --- a/systemui4merge/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -13,18 +13,18 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager'; -import { obtainLocalEvent } from '../../../../../../../../common/src/main/ets/default/event/EventUtil'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import WindowManager, { WindowType } from '../../../../../../../../common/src/main/ets/default/WindowManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import EventManager from '@ohos/common/src/main/ets/default/event/EventManager'; +import { obtainLocalEvent } from '@ohos/common/src/main/ets/default/event/EventUtil'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import WindowManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowManager'; import TintStateManager, { TintState, TintContentInfo, getOrCreateTintContentInfo -} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; -import { FASlotName, Rect } from '../../../../../../../../common/src/main/ets/default/Constants'; +} from '@ohos/common/src/main/ets/default/TintStateManager'; +import { FASlotName, Rect } from '@ohos/common/src/main/ets/default/Constants'; import { PluginType, PluginComponentData -} from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; -import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; +} from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; +import StyleConfigurationCommon from '@ohos/common/src/main/ets/default/StyleConfiguration'; import { StatusBarData, StatusBarBackgroundData, StatusBarComponentGroupContentData, StatusBarComponentData, StatusBarConfig } from '../common/Constants'; import StatusBarService from '../model/StatusBarService'; @@ -195,11 +195,12 @@ export class StatusBarVM { return; } this.mStatusBarEnable = isEnable; - this.mStatusBarEnable ? WindowManager.showWindow(WindowType.STATUS_BAR).then(() => { - }).catch((err) => { - }) : WindowManager.hideWindow(WindowType.STATUS_BAR).then(() => { - }).catch((err) => { - }); + // TODO +// this.mStatusBarEnable ? WindowManager.showWindow(WindowType.STATUS_BAR).then(() => { +// }).catch((err) => { +// }) : WindowManager.hideWindow(WindowType.STATUS_BAR).then(() => { +// }).catch((err) => { +// }); } changeBackground(tintState: TintState): void{ diff --git a/systemui4merge/features/statusbarcomponent/src/main/module.json5 b/feature/systemui/statusbarcomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/statusbarcomponent/src/main/module.json5 rename to feature/systemui/statusbarcomponent/src/main/module.json5 diff --git a/systemui4merge/features/statusbarcomponent/src/main/resources/base/element/color.json b/feature/systemui/statusbarcomponent/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/features/statusbarcomponent/src/main/resources/base/element/color.json rename to feature/systemui/statusbarcomponent/src/main/resources/base/element/color.json diff --git a/systemui4merge/features/statusbarcomponent/src/main/resources/base/element/float.json b/feature/systemui/statusbarcomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/statusbarcomponent/src/main/resources/base/element/float.json rename to feature/systemui/statusbarcomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg b/feature/systemui/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg rename to feature/systemui/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg diff --git a/systemui4merge/features/wificomponent/src/main/resources/base/media/icon.png b/feature/systemui/statusbarcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/base/media/icon.png rename to feature/systemui/statusbarcomponent/src/main/resources/base/media/icon.png diff --git a/systemui4merge/features/statusbarcomponent/src/main/resources/phone/element/float.json b/feature/systemui/statusbarcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/features/statusbarcomponent/src/main/resources/phone/element/float.json rename to feature/systemui/statusbarcomponent/src/main/resources/phone/element/float.json diff --git a/systemui4merge/product/phone/statusbar/build-profile.json5 b/feature/systemui/wificomponent/build-profile.json5 similarity index 100% rename from systemui4merge/product/phone/statusbar/build-profile.json5 rename to feature/systemui/wificomponent/build-profile.json5 diff --git a/systemui4merge/product/phone/statusbar/hvigorfile.js b/feature/systemui/wificomponent/hvigorfile.ts similarity index 92% rename from systemui4merge/product/phone/statusbar/hvigorfile.js rename to feature/systemui/wificomponent/hvigorfile.ts index fdb4fcea..922125d1 100644 --- a/systemui4merge/product/phone/statusbar/hvigorfile.js +++ b/feature/systemui/wificomponent/hvigorfile.ts @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/systemui4merge/features/wificomponent/package-lock.json b/feature/systemui/wificomponent/package-lock.json similarity index 30% rename from systemui4merge/features/wificomponent/package-lock.json rename to feature/systemui/wificomponent/package-lock.json index a2feca7a..ae730ff3 100644 --- a/systemui4merge/features/wificomponent/package-lock.json +++ b/feature/systemui/wificomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/wificomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/feature/systemui/wificomponent/package.json b/feature/systemui/wificomponent/package.json new file mode 100644 index 00000000..b15ce0b0 --- /dev/null +++ b/feature/systemui/wificomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/wificomponent", + "description": "a npm package which contains wificomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts b/feature/systemui/wificomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 91% rename from systemui4merge/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts rename to feature/systemui/wificomponent/src/main/ets/default/common/StyleConfiguration.ts index 0fc05e7b..55440d15 100644 --- a/systemui4merge/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/feature/systemui/wificomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; const TAG = 'wifi-StyleConfiguration'; diff --git a/systemui4merge/features/wificomponent/src/main/ets/default/common/constants.ts b/feature/systemui/wificomponent/src/main/ets/default/common/constants.ts similarity index 100% rename from systemui4merge/features/wificomponent/src/main/ets/default/common/constants.ts rename to feature/systemui/wificomponent/src/main/ets/default/common/constants.ts diff --git a/systemui4merge/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets b/feature/systemui/wificomponent/src/main/ets/default/pages/wifiComponent.ets similarity index 86% rename from systemui4merge/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets rename to feature/systemui/wificomponent/src/main/ets/default/pages/wifiComponent.ets index 74052e3f..7bb0d04f 100644 --- a/systemui4merge/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets +++ b/feature/systemui/wificomponent/src/main/ets/default/pages/wifiComponent.ets @@ -14,10 +14,10 @@ */ import mWifiManger from '../wifiModel' -import Log from '../../../../../../../common/src/main/ets/default/Log' -import EventManager from "../../../../../../../common/src/main/ets/default/event/EventManager" -import {obtainStartAbility} from "../../../../../../../common/src/main/ets/default/event/EventUtil" -import iconTitleBase from '../../../../../../../common/src/main/ets/template/iconTitleBase' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import EventManager from "@ohos/common/src/main/ets/default/event/EventManager" +import {obtainStartAbility} from "@ohos/common/src/main/ets/default/event/EventUtil" +import iconTitleBase from '@ohos/common/src/main/ets/template/iconTitleBase' import Constants from '../common/constants' const TAG = 'Control-wifiComponent' diff --git a/systemui4merge/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/feature/systemui/wificomponent/src/main/ets/default/pages/wifiIcon.ets similarity index 92% rename from systemui4merge/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets rename to feature/systemui/wificomponent/src/main/ets/default/pages/wifiIcon.ets index d8cd535d..1a65054f 100644 --- a/systemui4merge/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/feature/systemui/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -15,10 +15,10 @@ import Constants from '../common/constants' import mWifiModel from '../wifiModel' -import Log from '../../../../../../../common/src/main/ets/default/Log' -import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' import StyleConfigurationCommon, { CommonStyle -} from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/StyleConfiguration' import StyleConfiguration, { StartsBarWifiComponentStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/WifiVM' diff --git a/systemui4merge/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts b/feature/systemui/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts similarity index 75% rename from systemui4merge/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts rename to feature/systemui/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts index afd4c372..8947787a 100644 --- a/systemui4merge/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts +++ b/feature/systemui/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import { FASlotName } from '../../../../../../../common/src/main/ets/default/Constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '../../../../../../../common/src/main/ets/default/TintStateManager'; -import createOrGet from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/TintStateManager'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'WifiVM'; diff --git a/systemui4merge/features/wificomponent/src/main/ets/default/wifiModel.ts b/feature/systemui/wificomponent/src/main/ets/default/wifiModel.ts similarity index 98% rename from systemui4merge/features/wificomponent/src/main/ets/default/wifiModel.ts rename to feature/systemui/wificomponent/src/main/ets/default/wifiModel.ts index 310fd6e9..b73af6b0 100644 --- a/systemui4merge/features/wificomponent/src/main/ets/default/wifiModel.ts +++ b/feature/systemui/wificomponent/src/main/ets/default/wifiModel.ts @@ -15,7 +15,7 @@ import wifi from '@ohos.wifi'; import Constants, { WifiState, WifiConnectionState } from './common/constants'; -import Log from '../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'WifiComponent-WifiModel'; diff --git a/systemui4merge/features/wificomponent/src/main/module.json5 b/feature/systemui/wificomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/wificomponent/src/main/module.json5 rename to feature/systemui/wificomponent/src/main/module.json5 diff --git a/systemui4merge/features/wificomponent/src/main/resources/base/element/float.json b/feature/systemui/wificomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/base/element/float.json rename to feature/systemui/wificomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/feature/systemui/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_1.svg rename to feature/systemui/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/feature/systemui/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_2.svg rename to feature/systemui/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/feature/systemui/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_3.svg rename to feature/systemui/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/feature/systemui/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_full.svg rename to feature/systemui/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/feature/systemui/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_wifi_no.svg rename to feature/systemui/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/base/media/icon.png b/feature/systemui/wificomponent/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/base/media/icon.png rename to feature/systemui/wificomponent/src/main/resources/base/media/icon.png diff --git a/systemui4merge/features/wificomponent/src/main/resources/base/media/wifi.svg b/feature/systemui/wificomponent/src/main/resources/base/media/wifi.svg similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/base/media/wifi.svg rename to feature/systemui/wificomponent/src/main/resources/base/media/wifi.svg diff --git a/systemui4merge/features/wificomponent/src/main/resources/base/media/wifi_d.svg b/feature/systemui/wificomponent/src/main/resources/base/media/wifi_d.svg similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/base/media/wifi_d.svg rename to feature/systemui/wificomponent/src/main/resources/base/media/wifi_d.svg diff --git a/systemui4merge/features/wificomponent/src/main/resources/phone/element/float.json b/feature/systemui/wificomponent/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/features/wificomponent/src/main/resources/phone/element/float.json rename to feature/systemui/wificomponent/src/main/resources/phone/element/float.json diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg b/feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg rename to feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg b/feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg rename to feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg b/feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg rename to feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg b/feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg rename to feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg diff --git a/systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg b/feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg similarity index 100% rename from systemui4merge/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg rename to feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg diff --git a/product/phone/package-lock.json b/product/phone/package-lock.json index 48b59df6..a06f4619 100644 --- a/product/phone/package-lock.json +++ b/product/phone/package-lock.json @@ -86,6 +86,137 @@ } } }, + "@ohos/phone_statusbar": { + "version": "file:../../feature/systemui/phone/statusbar", + "requires": { + "@ohos/common": "file:../../common", + "@ohos/statusbarcomponent": "file:../../feature/systemui/statusbarcomponent" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + }, + "@ohos/statusbarcomponent": { + "version": "file:../../feature/systemui/statusbarcomponent", + "requires": { + "@ohos/batterycomponent": "file:../../feature/systemui/batterycomponent", + "@ohos/bluetoothcomponent": "file:../../feature/systemui/bluetoothcomponent", + "@ohos/capsulecomponent": "file:../../feature/systemui/capsulecomponent", + "@ohos/clockcomponent": "file:../../feature/systemui/clockcomponent", + "@ohos/common": "file:../../common", + "@ohos/locationcomponent": "file:../../feature/systemui/locationcomponent", + "@ohos/nfccomponent": "file:../../feature/systemui/nfccomponent", + "@ohos/ringmodecomponent": "file:../../feature/systemui/ringmodecomponent", + "@ohos/signalcomponent": "file:../../feature/systemui/signalcomponent", + "@ohos/wificomponent": "file:../../feature/systemui/wificomponent" + }, + "dependencies": { + "@ohos/batterycomponent": { + "version": "file:../../feature/systemui/batterycomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/bluetoothcomponent": { + "version": "file:../../feature/systemui/bluetoothcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/capsulecomponent": { + "version": "file:../../feature/systemui/capsulecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/clockcomponent": { + "version": "file:../../feature/systemui/clockcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/common": { + "version": "file:../../common" + }, + "@ohos/locationcomponent": { + "version": "file:../../feature/systemui/locationcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/nfccomponent": { + "version": "file:../../feature/systemui/nfccomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/ringmodecomponent": { + "version": "file:../../feature/systemui/ringmodecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/signalcomponent": { + "version": "file:../../feature/systemui/signalcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/wificomponent": { + "version": "file:../../feature/systemui/wificomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + } + } + } + } + }, "@ohos/recents": { "version": "file:../../feature/recents", "requires": { diff --git a/product/phone/package.json b/product/phone/package.json index 452ce4e0..b83ca4ab 100644 --- a/product/phone/package.json +++ b/product/phone/package.json @@ -1,20 +1,21 @@ { - "devDependencies": {}, - "name": "launcher", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" - }, - "version": "1.0.0", - "dependencies": { - "@ohos/pagedesktop": "../../feature/pagedesktop", - "@ohos/recents": "../../feature/recents", - "@ohos/bigfolder": "../../feature/bigfolder", - "@ohos/smartdock": "../../feature/smartdock", - "@ohos/form": "../../feature/form", - "@ohos/gesturenavigation": "../../feature/gesturenavigation", - "@ohos/common": "../../common", - "@ohos/numbadge": "../../feature/numbadge" - } + "devDependencies": {}, + "name": "launcher", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/pagedesktop": "../../feature/pagedesktop", + "@ohos/recents": "../../feature/recents", + "@ohos/bigfolder": "../../feature/bigfolder", + "@ohos/smartdock": "../../feature/smartdock", + "@ohos/form": "../../feature/form", + "@ohos/gesturenavigation": "../../feature/gesturenavigation", + "@ohos/common": "../../common", + "@ohos/numbadge": "../../feature/numbadge", + "@ohos/phone_statusbar": "../../feature/systemui/phone/statusbar" + } } diff --git a/product/phone/src/main/ets/MainAbility/MainAbility.ts b/product/phone/src/main/ets/MainAbility/MainAbility.ts index e93d3140..922d5cb4 100644 --- a/product/phone/src/main/ets/MainAbility/MainAbility.ts +++ b/product/phone/src/main/ets/MainAbility/MainAbility.ts @@ -26,6 +26,8 @@ import { GestureNavigationManager } from '@ohos/gesturenavigation'; import StyleConstants from '../common/constants/StyleConstants'; import { navigationBarCommonEventManager } from '@ohos/common'; import PageDesktopViewModel from '../../../../../../feature/pagedesktop/src/main/ets/default/viewmodel/PageDesktopViewModel'; +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import initSystemUi from '../../../../../../common/src/main/ets/default/InitSystemUi'; const TAG = 'LauncherMainAbility'; @@ -34,6 +36,8 @@ export default class MainAbility extends ServiceExtension { Log.showInfo(TAG,'onCreate start'); this.context.area = 0; this.initLauncher(); + initSystemUi(this.context); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context); } async initLauncher(): Promise { diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index 3fa7d3ee..08a8f98b 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -18,6 +18,7 @@ import { HWScenePanel } from './HWScenePanel' import { HWScreenSession } from '@ohos/common' import { HWDesktop } from './HWDesktop' import { HWWallpaper } from './HWWallpaper' +import { HWSystemUi } from './HWSystemUi' @Component export struct HWScreen { @@ -35,6 +36,7 @@ export struct HWScreen { HWScenePanel({sceneContainerSessionList: this.screenSession.sceneContainerSessionList}) // Systemui + HWSystemUi({bounds : this.screenSession.bounds}) } .position({x: this.screenSession.bounds.left, y: this.screenSession.bounds.top}) .width(this.screenSession.bounds.width) diff --git a/product/phone/src/main/ets/WindowScene/HWSystemUi.ets b/product/phone/src/main/ets/WindowScene/HWSystemUi.ets new file mode 100644 index 00000000..a5344438 --- /dev/null +++ b/product/phone/src/main/ets/WindowScene/HWSystemUi.ets @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2023 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 { Log } from '@ohos/common'; +import screenSessionManager from '@ohos.screenSessionManager'; +import { StatusBar } from '@ohos/phone_statusbar/src/main/ets/pages/StatusBar' + +const TAG = "HWSystemUi"; + +@Component +export struct HWSystemUi { + bounds: screenSessionManager.RRect + + onBackPress(): boolean { + return true; + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear, ${this.bounds.width}, ${this.bounds.height}`); + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`); + } + + build() { + Stack() { + // status bar + StatusBar({bounds : this.bounds}) + + // dropdown panel + + // volume + } + .hitTestBehavior(HitTestMode.Transparent) + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/product/phone/src/main/module.json5 b/product/phone/src/main/module.json5 index 98939875..892a5093 100644 --- a/product/phone/src/main/module.json5 +++ b/product/phone/src/main/module.json5 @@ -71,6 +71,51 @@ }, { "name": "ohos.permission.START_ABILITIES_FROM_BACKGROUND" + }, + { + "name": "ohos.permission.MANAGE_LOCAL_ACCOUNTS" + }, + { + "name": "ohos.permission.INTERACT_ACROSS_LOCAL_ACCOUNTS_EXTENSION" + }, + { + "name": "ohos.permission.GET_WIFI_INFO" + }, + { + "name": "ohos.permission.SET_WIFI_INFO" + }, + { + "name": "ohos.permission.MANAGE_WIFI_CONNECTION" + }, + { + "name": "ohos.permission.GET_NETWORK_INFO" + }, + { + "name": "ohos.permission.USE_BLUETOOTH" + }, + { + "name": "ohos.permission.DISCOVER_BLUETOOTH" + }, + { + "name": "ohos.permission.MANAGE_BLUETOOTH" + }, + { + "name": "ohos.permission.CAPTURE_SCREEN" + }, + { + "name": "ohos.permission.ACCESS_NOTIFICATION_POLICY" + }, + { + "name": "ohos.permission.MODIFY_AUDIO_SETTINGS" + }, + { + "name": "ohos.permission.START_INVISIBLE_ABILITY" + }, + { + "name": "ohos.permission.GET_TELEPHONY_STATE" + }, + { + "name": "ohos.permission.PERMISSION_USED_STATS" } ] } diff --git a/signature/launcher.p7b b/signature/launcher.p7b index 6959e7ca0d67d4e4aa375b32b3f3a19af1070788..a43130791551aaea7c210d9fe6e6dff803bcc680 100644 GIT binary patch delta 1226 zcmaJ>U1%It7-cq-*-d}6DT=`#8m>sB?rvr`NxKPEJDI)7Ufj$LJ9oRrAme2B#*Uqx z8D?gqq1MF}@=ypE=S>i63%(djF-Spu@~saoEqze13JD0Jp!gtt68vVZsXtraX3jn5 zeCK}myZ6UKH<2ZG2B|b~c&)T{d%uuOoa+o82k2Nr5OVwFz0$x-YbAmAi3vgOq<+0i z6wY;0J7OpG-D$MK{lIdajAJ%AnnL-koRv{}7p}Vvfb;2%Gebkj4GhZ(`OCf;f&^Ht zmeoL08=sD}(TZtX4J%wlQ>T&RhM6V4?D`J0;U^y3Q(a8&(kd(FekV zTbG5|zV=_*JNv1-&8&OU4YIb`a_T3cbQ+nS4KBfI5b~z6WCm8f3woJlZicNmGy;Wj zhhTahf{bR}4&p4PZM(1XM&{4|MbtHiXiY1K`xyPwKNyM9NHi*;s45+bUXvb=-j@zX zSEW2)L(wD21426fYL}_1lnq5yX;ou7MEI9gmS_xD6qNy|LUrBvr@+9^Gpy-^YCWX0 zm>D%PLkyzL&>rhLX8Zn5=mzQvRH|uMW%st#FssqZbN6zt>e!erS23fMm3mYz5?!Sy zaOJqqLb+|Hk4^nCajl1++&8zc)mon1w&^F!#&E(OP{mNudm<#-cs@7;MNU!kCcMf=GxO@UqYOb zi;3aF6Yu7}LbdU&%r|pm{p-hn=ued&*!gMim+z1-&Wqxn#PBog`R%uqXV>|u3s=6a Z9ZU?K-PgDI;l+&u`WqL{zBzik^#?D+n5zH) delta 986 zcmZ9LOH30%7{}St*A^N`BnD!PWlbbOwoFTlt%(m*upE%cg@KV>}m2n{@?FE-_9oY_1Fx^ z)qQrdt@&8~rMFaa;9ak4k^F$PuJZ4Ah{@|8knDd(E9=UnP7ug6C} zZW1XfCK4~f4B}4vxPTw{0oQgQn<9dl4V2=rQmy6DBCN)~iW_n0CXKN%ycUxd1p8l$k3jAc0}i*zifW>pPk5=p4y)W701 zFY{>xHQl-Zjw&RIwKT&WFxf<5GgvhjsQz!pm~%G)Uwov}Ku4#?tG#+Q!P!eQGH ztVp#w>yar%x!Cfmr~%ztCMS<$>+ew{C|ZKnb;t^y#3C9+d8=$daBV(g-|e$`J%BZV7XN=UNnIMP;0f>a7 z;lOp!UVb60J;2$0D}VL~Sid{}>P6_4Z{R`I18>avO diff --git a/systemui4merge/common/src/main/ets/default/Log.ts b/systemui4merge/common/src/main/ets/default/Log.ts deleted file mode 100644 index 1d0f16c9..00000000 --- a/systemui4merge/common/src/main/ets/default/Log.ts +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2021-2022 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'; - -const DOMAIN: number = 0x001A; -const TAG = "SystemUI_Default"; -const SYMBOL = " --> "; -const FILTER_KEYS = [ - new RegExp('hide', "gi") -] - -export function filterKey(target: any, propKey: string, descriptor: PropertyDescriptor) { - const original = descriptor.value; - descriptor.value = function (...args: string[]) { - let filterResult = args.map((str) => { - let tempStr = str - FILTER_KEYS.forEach((filterKey) => tempStr = tempStr.replace(filterKey, "**")) - return tempStr - }); - const result = original.call(this, ...filterResult); - return result; - }; -} - -/** - * Basic log class - */ -export default class Log { - /** - * Outputs debug-level logs. - * - * @param tag Identifies the log tag. - * @param format Indicates the log format string. - * @param args Indicates the log parameters. - * @since 7 - */ - static showDebug(tag: string, format: string, ...args: any[]) { - if (Log.isLoggable(HiLog.LogLevel.DEBUG)) { - HiLog.debug(DOMAIN, TAG, tag + SYMBOL + format, args); - } - } - - /** - * Outputs info-level logs. - * - * @param tag Identifies the log tag. - * @param format Indicates the log format string. - * @param args Indicates the log parameters. - * @since 7 - */ - static showInfo(tag: string, format: string, ...args: any[]) { - if (Log.isLoggable(HiLog.LogLevel.INFO)) { - HiLog.info(DOMAIN, TAG, tag + SYMBOL + format, args); - } - } - - /** - * Outputs warning-level logs. - * - * @param tag Identifies the log tag. - * @param format Indicates the log format string. - * @param args Indicates the log parameters. - * @since 7 - */ - static showWarn(tag: string, format: string, ...args: any[]) { - if (Log.isLoggable(HiLog.LogLevel.WARN)) { - HiLog.warn(DOMAIN, TAG, tag + SYMBOL + format, args); - } - } - - /** - * Outputs error-level logs. - * - * @param tag Identifies the log tag. - * @param format Indicates the log format string. - * @param args Indicates the log parameters. - * @since 7 - */ - static showError(tag: string, format: string, ...args: any[]) { - if (Log.isLoggable(HiLog.LogLevel.ERROR)) { - HiLog.error(DOMAIN, TAG, tag + SYMBOL + format, args); - } - } - - /** - * Outputs fatal-level logs. - * - * @param tag Identifies the log tag. - * @param format Indicates the log format string. - * @param args Indicates the log parameters. - * @since 7 - */ - static showFatal(tag: string, format: string, ...args: any[]) { - if (Log.isLoggable(HiLog.LogLevel.FATAL)) { - HiLog.fatal(DOMAIN, TAG, tag + SYMBOL + format, args); - } - } - - /** - * Checks whether logs of the specified tag, and level can be printed. - * - * @param tag Identifies the log tag. - * @param level log level - * @since 7 - */ - private static isLoggable(level: HiLog.LogLevel): boolean { - return HiLog.isLoggable(DOMAIN, TAG, level); - } -} diff --git a/systemui4merge/features/batterycomponent/package-lock.json b/systemui4merge/features/batterycomponent/package-lock.json deleted file mode 100644 index ab0b8890..00000000 --- a/systemui4merge/features/batterycomponent/package-lock.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "@ohos/batterycomponent", - "version": "1.0.0", - "lockfileVersion": 1 -} diff --git a/systemui4merge/features/batterycomponent/package.json b/systemui4merge/features/batterycomponent/package.json deleted file mode 100644 index 7fe3b0f5..00000000 --- a/systemui4merge/features/batterycomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/batterycomponent", - "description":"a npm package which contains batterycomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/bluetoothcomponent/package.json b/systemui4merge/features/bluetoothcomponent/package.json deleted file mode 100644 index 3184af28..00000000 --- a/systemui4merge/features/bluetoothcomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/bluetoothcomponent", - "description":"a npm package which contains bluetoothcomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/capsulecomponent/package.json b/systemui4merge/features/capsulecomponent/package.json deleted file mode 100644 index cc6ba34d..00000000 --- a/systemui4merge/features/capsulecomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/capsulecomponent", - "description":"a npm package which contains capsulecomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/clockcomponent/package.json b/systemui4merge/features/clockcomponent/package.json deleted file mode 100644 index 0d8a52cd..00000000 --- a/systemui4merge/features/clockcomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/clockcomponent", - "description":"a npm package which contains clockcomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/locationcomponent/package.json b/systemui4merge/features/locationcomponent/package.json deleted file mode 100644 index 6064dd63..00000000 --- a/systemui4merge/features/locationcomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/locationcomponent", - "description":"a npm package which contains locationcomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/nfccomponent/package-lock.json b/systemui4merge/features/nfccomponent/package-lock.json deleted file mode 100644 index 3918f540..00000000 --- a/systemui4merge/features/nfccomponent/package-lock.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "@ohos/nfccomponent", - "version": "1.0.0", - "lockfileVersion": 1 -} diff --git a/systemui4merge/features/nfccomponent/package.json b/systemui4merge/features/nfccomponent/package.json deleted file mode 100644 index 275792f4..00000000 --- a/systemui4merge/features/nfccomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/nfccomponent", - "description":"a npm package which contains nfccomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/ringmodecomponent/package.json b/systemui4merge/features/ringmodecomponent/package.json deleted file mode 100644 index 8f36550b..00000000 --- a/systemui4merge/features/ringmodecomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/ringmodecomponent", - "description":"a npm package which contains ringmodecomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/signalcomponent/package.json b/systemui4merge/features/signalcomponent/package.json deleted file mode 100644 index cbd8a2c0..00000000 --- a/systemui4merge/features/signalcomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/signalcomponent", - "description":"a npm package which contains signalcomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/statusbarcomponent/package-lock.json b/systemui4merge/features/statusbarcomponent/package-lock.json deleted file mode 100644 index 74264d3f..00000000 --- a/systemui4merge/features/statusbarcomponent/package-lock.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "@ohos/statusbarcomponent", - "version": "1.0.0", - "lockfileVersion": 1 -} diff --git a/systemui4merge/features/statusbarcomponent/package.json b/systemui4merge/features/statusbarcomponent/package.json deleted file mode 100644 index 1c80ebed..00000000 --- a/systemui4merge/features/statusbarcomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/statusbarcomponent", - "description":"a npm package which contains statusbarcomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/wificomponent/package.json b/systemui4merge/features/wificomponent/package.json deleted file mode 100644 index aa2486fb..00000000 --- a/systemui4merge/features/wificomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/wificomponent", - "description":"a npm package which contains wificomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/product/phone/statusbar/package.json b/systemui4merge/product/phone/statusbar/package.json deleted file mode 100644 index 73717185..00000000 --- a/systemui4merge/product/phone/statusbar/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "devDependencies":{}, - "name":"phone_statusbar", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{ - "@ohos/statusbarcomponent":"file:../../../features/statusbarcomponent" - } -} \ No newline at end of file diff --git a/systemui4merge/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts b/systemui4merge/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts deleted file mode 100644 index 2cb8af62..00000000 --- a/systemui4merge/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import AbilityStage from '@ohos.app.ability.AbilityStage'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; - -const TAG = 'StatusBar_AbilityStage'; - -export default class MainAbilityStage extends AbilityStage { - onCreate(): void { - Log.showInfo(TAG, 'onCreate'); - } -} \ No newline at end of file diff --git a/systemui4merge/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/systemui4merge/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts deleted file mode 100644 index 72b743e7..00000000 --- a/systemui4merge/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 display from '@ohos.display'; -import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import StatusBarConfiguration from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; -import StatusBarConstants from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; -import { Want } from 'ability/want'; -import deviceInfo from '@ohos.deviceInfo'; - -const TAG = 'StatusBar_ServiceExtAbility'; -const deviceTypeInfo = deviceInfo.deviceType; - -class ServiceExtAbility extends ServiceExtension { - private direction :number; - - async onCreate(want: Want): Promise { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context); - globalThis[StatusBarConstants.PLUGIN_COMPONENT_OWNER_WANT_KEY] = want; - display.on("change", (id) => { - Log.showInfo(TAG, "display change, data: " + JSON.stringify(id)) - display.getAllDisplay().then((arrayDisplay) => { - Log.showInfo(TAG, "getAllDisplay : " + JSON.stringify(arrayDisplay)) - for (let display of arrayDisplay) { - Log.showInfo(TAG, "getAllDisplay start : " + JSON.stringify(arrayDisplay)); - if (id == display.id) { - let nowDirection = -1; - if (display.width > display.height) { - nowDirection = 1; - } else { - nowDirection = 2; - } - if (nowDirection != this.direction) { - this.createNewWindow(false); - } - } - } - }) - }) - this.createNewWindow(true); - } - - async createNewWindow (isNewWindow : boolean) { - let configInfo = await StatusBarConfiguration.getConfiguration(); - this.direction = configInfo.direction; - let screenFactor; - if (deviceTypeInfo === 'phone') { - screenFactor = this.direction === 1 ? 1188 : 540; - } else { - screenFactor = this.direction === 1 ? 640 : 360; - } - if (configInfo.showHorizontal) { - if (configInfo.realHeight == 0) { - Log.showInfo(TAG, `hide statusbar`); - } else { - configInfo.realHeight = (configInfo.realHeight * configInfo.maxWidth) / screenFactor; - } - configInfo.minHeight = configInfo.realHeight; - if (configInfo.yCoordinate > 0) { - configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; - } - } else { - if (configInfo.realWidth == 0) { - Log.showInfo(TAG, `hide statusbar`); - } else { - configInfo.realWidth = (configInfo.realWidth * configInfo.maxWidth) / screenFactor; - } - configInfo.minHeight = configInfo.realWidth; - if (configInfo.xCoordinate > 0) { - configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth; - } - } - - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo); - Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); - - let statusBarRect = { - left: configInfo.xCoordinate, - top: configInfo.yCoordinate, - width: configInfo.realWidth, - height: configInfo.realHeight - }; - if (isNewWindow) { - WindowManager.createWindow(this.context, WindowType.STATUS_BAR, statusBarRect, 'pages/index').then(async () => - WindowManager.showWindow(WindowType.STATUS_BAR) - ).then(() => { - }).catch((err) => { - }); - } else { - WindowManager.resetSizeWindow(WindowType.STATUS_BAR, statusBarRect); - } - } - - onDestroy(): void { - Log.showInfo(TAG, 'onDestroy'); - } -} - -export default ServiceExtAbility; \ No newline at end of file diff --git a/systemui4merge/product/phone/statusbar/src/main/module.json5 b/systemui4merge/product/phone/statusbar/src/main/module.json5 deleted file mode 100644 index 2dd7de3f..00000000 --- a/systemui4merge/product/phone/statusbar/src/main/module.json5 +++ /dev/null @@ -1,33 +0,0 @@ -{ - "module": { - "name": "phone_statusbar", - "type": "feature", - "srcEntrance": "./ets/Application/AbilityStage.ts", - "description": "$string:mainability_description", - "mainElement": "com.ohos.systemui.statusbar.ServiceExtAbility", - "deviceTypes": [ - "default" - ], - "metadata": [ - { - "name": "ArkTSPartialUpdate", - "value": "true" - } - ], - "deliveryWithInstall": true, - "installationFree": false, - "uiSyntax": "ets", - "pages": "$profile:main_pages", - "extensionAbilities": [ - { - "visible": true, - "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", - "name": "com.ohos.systemui.statusbar.ServiceExtAbility", - "icon": "$media:icon", - "description": "$string:mainability_description", - "label": "$string:app_name", - "type": "service" - } - ] - } -} \ No newline at end of file -- Gitee From 2f58c3c73acd2d5c768920f94ae37d3fba4adbe1 Mon Sep 17 00:00:00 2001 From: chyyy0213 Date: Sat, 25 Mar 2023 18:00:17 +0800 Subject: [PATCH 349/373] add secondary session and modify background Signed-off-by: chyyy0213 --- .../{HWDividerParam.ets => HWDividerParam.ts} | 21 +++++++ ...SceneSession.ets => HWRootSceneSession.ts} | 0 ...Session.ets => HWSceneContainerSession.ts} | 13 +++-- .../{HWSceneSession.ets => HWSceneSession.ts} | 0 ...onManager.ets => HWSceneSessionManager.ts} | 0 ...HWScreenSession.ets => HWScreenSession.ts} | 58 ++++++++++++++++--- ...nManager.ets => HWScreenSessionManager.ts} | 0 .../src/main/ets/WindowScene/HWDivider.ets | 37 +++++++++--- .../main/ets/WindowScene/HWGestureNavBar.ets | 2 + .../src/main/ets/WindowScene/HWScene.ets | 2 +- .../main/ets/WindowScene/HWSceneContainer.ets | 54 ++++++++++------- .../src/main/ets/WindowScene/HWScenePanel.ets | 6 +- 12 files changed, 149 insertions(+), 44 deletions(-) rename common/src/main/ets/WindowScene/scene/session/{HWDividerParam.ets => HWDividerParam.ts} (74%) rename common/src/main/ets/WindowScene/scene/session/{HWRootSceneSession.ets => HWRootSceneSession.ts} (100%) rename common/src/main/ets/WindowScene/scene/session/{HWSceneContainerSession.ets => HWSceneContainerSession.ts} (89%) rename common/src/main/ets/WindowScene/scene/session/{HWSceneSession.ets => HWSceneSession.ts} (100%) rename common/src/main/ets/WindowScene/scene/session/{HWSceneSessionManager.ets => HWSceneSessionManager.ts} (100%) rename common/src/main/ets/WindowScene/screen/session/{HWScreenSession.ets => HWScreenSession.ts} (70%) rename common/src/main/ets/WindowScene/screen/session/{HWScreenSessionManager.ets => HWScreenSessionManager.ts} (100%) diff --git a/common/src/main/ets/WindowScene/scene/session/HWDividerParam.ets b/common/src/main/ets/WindowScene/scene/session/HWDividerParam.ts similarity index 74% rename from common/src/main/ets/WindowScene/scene/session/HWDividerParam.ets rename to common/src/main/ets/WindowScene/scene/session/HWDividerParam.ts index da3e0cfc..44694fb1 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWDividerParam.ets +++ b/common/src/main/ets/WindowScene/scene/session/HWDividerParam.ts @@ -42,13 +42,34 @@ export class HWDividerParam { */ primaryScaleY : number = 1 + /** + * scaleY of secondary HWScene + */ + secondaryScaleY : number = 1 + /** * Height of primary HWScene */ primaryH : string = '100%' + /** + * translateY of secondary HWScene + */ + secTransY: number = 0 /** * blurRadius of primary/secondary HWScene when drag divider */ blurRadius : number = 0 + + public init() { + this.translateX = 0 + this.translateY = 0 + this.scaleX = 1 + this.scaleY = 1 + this.primaryScaleY = 1 + this.secondaryScaleY = 1 + this.primaryH = '100%' + this.secTransY = 0 + this.blurRadius = 0 + } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets b/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ts similarity index 100% rename from common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ets rename to common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ts diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts similarity index 89% rename from common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ets rename to common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts index 0ef9637a..49632729 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ets +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts @@ -33,14 +33,15 @@ export class HWSceneContainerSession { translateY: number = 0 scaleX: number = 1 scaleY: number = 1 - + containerId : number = 0 /** * Constructor. */ - constructor(primarySession: HWSceneSession, screenBounds : screenSessionManager.RRect) { + constructor(primarySession: HWSceneSession, screenBounds : screenSessionManager.RRect, containerId : number) { Log.showInfo(TAG, 'new primary scene session, id:' + primarySession.session.persistentId) this.primarySession = primarySession this.bounds = screenBounds + this.containerId = containerId this.secondarySession = null } @@ -74,7 +75,11 @@ export class HWSceneContainerSession { return null } - public addSecondarySession() { - + public addSession(sceneSession: HWSceneSession) { + if (!this.primarySession) { + this.primarySession = sceneSession + return + } + this.secondarySession = sceneSession } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ts similarity index 100% rename from common/src/main/ets/WindowScene/scene/session/HWSceneSession.ets rename to common/src/main/ets/WindowScene/scene/session/HWSceneSession.ts diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts similarity index 100% rename from common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ets rename to common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts similarity index 70% rename from common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets rename to common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts index 19077b16..4bfe5549 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ets +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts @@ -37,7 +37,7 @@ export class HWScreenSession { public bounds: screenSessionManager.RRect public rotation: number public sceneContainerSessionList: SceneContainerSessionArray = new SceneContainerSessionArray() - + containerId : number = 0 /** * Constructor. * @param session Session of the screen @@ -92,6 +92,18 @@ export class HWScreenSession { return sceneContainerSessionIndex } + private updateListWhenRemove(sceneSession: HWSceneSession,) { + this.containerId = this.containerId + 1 + let newContainerSession = new HWSceneContainerSession(sceneSession, this.bounds, this.containerId) + newContainerSession.isActive = false + let currIdx = this.sceneContainerSessionList.findIndex((containerSession) => { return containerSession.isActive == true}) + if (currIdx < 0) { + this.sceneContainerSessionList.push(newContainerSession) + } else { + this.sceneContainerSessionList.splice(currIdx, 0, newContainerSession) + } + } + /** * Add the scene session to this screen. * @param sceneSession The session of the scene which will be added to the screen @@ -107,13 +119,26 @@ export class HWScreenSession { sceneContainerSession.secondarySession.isActive = true } sceneContainerSession.isActive = true - Log.showInfo(TAG, 'Repeat to add scene session.') + // adjust to top + this.sceneContainerSessionList.splice(sceneContainerSessionIndex, 1); + this.sceneContainerSessionList.push(sceneContainerSession); + Log.showInfo(TAG, 'Repeat to add scene session. And ContainerId: ' + this.containerId) return } // TODO: is splitScreen - this.sceneContainerSessionList.push(new HWSceneContainerSession(sceneSession, this.bounds)) - Log.showInfo(TAG, 'after addSceneSession sceneContainerList Length: ' + this.sceneContainerSessionList.length) + let listLen = this.sceneContainerSessionList.length + if (listLen >= 1) { + const sceneContainerSession = this.sceneContainerSessionList[listLen - 1] + if (!!sceneContainerSession && sceneContainerSession.isSplit) { + sceneContainerSession.addSession(sceneSession) + Log.showInfo(TAG, 'after add Split Session: ' + this.sceneContainerSessionList.length) + return + } + } + this.containerId = this.containerId + 1 + this.sceneContainerSessionList.push(new HWSceneContainerSession(sceneSession, this.bounds, this.containerId)) + Log.showInfo(TAG, 'after addSceneSession sceneContainerList Length: ' + this.sceneContainerSessionList.length + 'containerId: ' + this.containerId) } /** @@ -131,15 +156,32 @@ export class HWScreenSession { const sceneContainerSession = this.sceneContainerSessionList[sceneSessionIndex] if (sceneContainerSession.primarySession && sceneContainerSession.primarySession.session.persistentId === sceneSession.session.persistentId) { sceneContainerSession.primarySession.isActive = false - sceneContainerSession.primarySession = null +// sceneContainerSession.primarySession = null } else if (sceneContainerSession.secondarySession && sceneContainerSession.secondarySession.session.persistentId === sceneSession.session.persistentId) { sceneContainerSession.secondarySession.isActive = false - sceneContainerSession.secondarySession = null +// sceneContainerSession.secondarySession = null } - if (!sceneContainerSession.primarySession && !sceneContainerSession.secondarySession) { - sceneContainerSession.isActive = false + +// if (sceneContainerSession.primarySession) { +// if (!sceneContainerSession.primarySession.isActive) { +// if (!sceneContainerSession.secondarySession) { +// this.sceneContainerSessionList.splice(sceneSessionIndex, 1) +// } else { +// +// } +// } +// } +// if ((sceneContainerSession.primarySession && !sceneContainerSession.primarySession.isActive) || +// (sceneContainerSession.secondarySession && !sceneContainerSession.secondarySession.isActive)) { +// sceneContainerSession.isActive = false +// +// } + if ((!sceneContainerSession.primarySession && !sceneContainerSession.secondarySession) || + (sceneContainerSession.primarySession && !sceneContainerSession.primarySession.isActive && !sceneContainerSession.secondarySession) || + (sceneContainerSession.primarySession && !sceneContainerSession.primarySession.isActive && sceneContainerSession.secondarySession && !sceneContainerSession.secondarySession.isActive)) { this.sceneContainerSessionList.splice(sceneSessionIndex, 1) } + this.updateListWhenRemove(sceneSession) Log.showInfo(TAG, 'after removeSceneSession sceneContainerList Length: ' + this.sceneContainerSessionList.length) } diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ts similarity index 100% rename from common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ets rename to common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ts diff --git a/product/phone/src/main/ets/WindowScene/HWDivider.ets b/product/phone/src/main/ets/WindowScene/HWDivider.ets index 7d5d829c..767c3ebf 100644 --- a/product/phone/src/main/ets/WindowScene/HWDivider.ets +++ b/product/phone/src/main/ets/WindowScene/HWDivider.ets @@ -23,10 +23,28 @@ const TAG = 'HWDivider' export struct HWDivider { @Link dividerParam : HWDividerParam screenBounds : screenSessionManager.RRect - buildLog() { - Log.showInfo(TAG, "primaryH: " + parseFloat(this.dividerParam.primaryH) + " scaleY: " + this.dividerParam.primaryScaleY) + buildLog1() { + Log.showInfo(TAG, "Action Update "+ " priScaleY: " + this.dividerParam.primaryScaleY + " secScaleY: " + this.dividerParam.secondaryScaleY) + Log.showInfo(TAG, "event.offsetY: " + this.dividerParam.translateY) return true } + + buildLog2() { + Log.showInfo(TAG, "Action end primaryH: " + parseFloat(this.dividerParam.primaryH) + " secondaryH: " + parseFloat(this.getSecondaryH())) + return true + } + + buildLog3() { + Log.showInfo(TAG, "Action begin primaryH: " + parseFloat(this.dividerParam.primaryH) + " secondaryH: " + parseFloat(this.getSecondaryH())) + return true + } + + getSecondaryH(): string { + let str = (100 - parseFloat(this.dividerParam.primaryH) - parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)).toString(); + str += "%"; + return str; + } + build() { // Divider Stack({alignContent: Alignment.Center}) { @@ -37,23 +55,26 @@ export struct HWDivider { .gesture(PanGesture({distance: 1}) .onActionStart((event: GestureEvent) => { this.dividerParam.blurRadius = 50 - if (this.buildLog()) {} }) .onActionUpdate((event: GestureEvent) => { - if (this.buildLog()) {} this.dividerParam.translateX = event.offsetX this.dividerParam.translateY = event.offsetY - let beginH = this.screenBounds.height * parseFloat(this.dividerParam.primaryH) * 0.01 - this.dividerParam.primaryScaleY = (beginH + event.offsetY) / beginH + let beginPrimaryH = this.screenBounds.height * parseFloat(this.dividerParam.primaryH) * 0.01 + this.dividerParam.primaryScaleY = (beginPrimaryH + event.offsetY) / beginPrimaryH + let beginSecH = this.screenBounds.height * parseFloat(this.getSecondaryH()) * 0.01 + this.dividerParam.secondaryScaleY = (beginSecH - event.offsetY) / beginSecH + this.dividerParam.secTransY = event.offsetY }) .onActionCancel(() => { }) .onActionEnd((event: GestureEvent) => { this.dividerParam.translateX = 0 this.dividerParam.translateY = 0 + this.dividerParam.secTransY = 0 this.dividerParam.primaryScaleY = 1 - let beginH = this.screenBounds.height * parseFloat(this.dividerParam.primaryH) * 0.01 - this.dividerParam.primaryH = ((beginH + event.offsetY) / this.screenBounds.height) * 100 + '%' + this.dividerParam.secondaryScaleY = 1 + let beginPrimaryH = this.screenBounds.height * parseFloat(this.dividerParam.primaryH) * 0.01 + this.dividerParam.primaryH = ((beginPrimaryH + event.offsetY) / this.screenBounds.height) * 100 + '%' this.dividerParam.blurRadius = 0 })) } diff --git a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets index d80315de..13c3a39e 100644 --- a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets +++ b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets @@ -65,6 +65,8 @@ export struct HWGestureNavBar { this.dividerParam.primaryH = ((100 - parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)) / 2) + '%' } else if (event.offsetY < -400) { this.sceneContainerSession.isActive = false + this.sceneContainerSession.isSplit = false + this.dividerParam.init() HWSceneSessionManager.getInstance().requestSceneBackground(this.sceneContainerSession.primarySession) if (this.sceneContainerSession.secondarySession) { HWSceneSessionManager.getInstance().requestSceneBackground(this.sceneContainerSession.secondarySession) diff --git a/product/phone/src/main/ets/WindowScene/HWScene.ets b/product/phone/src/main/ets/WindowScene/HWScene.ets index be162edc..14620c3b 100644 --- a/product/phone/src/main/ets/WindowScene/HWScene.ets +++ b/product/phone/src/main/ets/WindowScene/HWScene.ets @@ -36,7 +36,7 @@ export struct HWScene { build() { Stack({alignContent: Alignment.TopStart}) { if (this.buildLog(this.sceneSession)) {} - if (!!this.sceneSession) { + if (this.sceneSession) { HostWindowScene(this.sceneSession.session) .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) } diff --git a/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets b/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets index 4107cec7..b19c5662 100644 --- a/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets +++ b/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets @@ -44,36 +44,50 @@ export struct HWSceneContainer { return true } - getSecondaryPos(): string { - let str = (parseFloat(this.dividerParam.primaryH)+parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)).toString(); + secondaryLog() { + Log.showError(TAG, 'secondary session posY: ' + this.dividerParam.secondaryScaleY) + return true + } + + getSecondaryCenterY() { + let centerY = this.sceneContainerSession.bounds.height * (parseFloat(this.dividerParam.primaryH) + parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)) * 0.01 + return centerY; + } + + getSecondaryH(): string { + let str = (100 - parseFloat(this.dividerParam.primaryH) - parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)).toString(); str += "%"; return str; } - secondaryLog() { - Log.showError(TAG, 'secondary session posY: ' + this.getSecondaryPos()) - return true - } build() { - Column() { - if ((!!this.sceneContainerSession.primarySession) && this.sceneContainerSession.primarySession.isActive) { - HWScene({sceneSession : this.sceneContainerSession.primarySession}) - .width('100%') - .height(this.dividerParam.primaryH) - .scale({y:this.dividerParam.primaryScaleY, centerY: 0}) - .blur(this.dividerParam.blurRadius) - } + Stack({alignContent: Alignment.TopStart}) { + Column() { + if (this.buildLog(this.sceneContainerSession.primarySession)) {} + if (this.sceneContainerSession.primarySession.isActive) { + HWScene({sceneSession : this.sceneContainerSession.primarySession}) + .width('100%') + .height(this.dividerParam.primaryH) + .scale({y:this.dividerParam.primaryScaleY, centerY: 0}) + .blur(this.dividerParam.blurRadius) + } - // divider - if (this.sceneContainerSession.isSplit) { - HWDivider({dividerParam : $dividerParam, screenBounds : this.sceneContainerSession.bounds}) - if ((!!this.sceneContainerSession.secondarySession) && this.sceneContainerSession.secondarySession.isActive && this.secondaryLog()) { + // divider + if (this.sceneContainerSession.isSplit) { + HWDivider({dividerParam : $dividerParam, screenBounds : this.sceneContainerSession.bounds}) + } + // When primary Exit + if ((!!this.sceneContainerSession.secondarySession) && this.sceneContainerSession.secondarySession.isActive) { HWScene({ sceneSession: this.sceneContainerSession.secondarySession }) - .position({y: this.getSecondaryPos()}) + .scale({y:this.dividerParam.secondaryScaleY, centerY : 0}) + .blur(this.dividerParam.blurRadius) + .translate({y:this.dividerParam.secTransY}) + .flexShrink(1) } + // Freedom scene } + .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) HWGestureNavBar({ sceneContainerSession: this.sceneContainerSession, dividerParam: $dividerParam }) - // Freedom scene } .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) .translate({x: this.sceneContainerSession.translateX, y: this.sceneContainerSession.translateY}) diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index ff07213b..2b27dfe9 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -25,8 +25,8 @@ const TAG = 'HWScenePanel' export struct HWScenePanel { @ObjectLink sceneContainerSessionList: SceneContainerSessionArray - buildLog() { - Log.showInfo(TAG, 'HWScenePanel scene session list length:' + this.sceneContainerSessionList.length) + buildLog(isActive:boolean) { + Log.showInfo(TAG, 'HWScenePanel scene session list length:' + this.sceneContainerSessionList.length + 'isActive:' +isActive) return true } @@ -35,7 +35,7 @@ export struct HWScenePanel { // Full screen scene, using scroll to manager multitask scene. Scroll() { ForEach(this.sceneContainerSessionList, (item: HWSceneContainerSession) => { - if (this.buildLog() && !!item && item.isActive) { + if (this.buildLog(item.isActive) && !!item && item.isActive) { HWSceneContainer({sceneContainerSession: item}) } }, (item: HWSceneContainerSession) => item.primarySession.session.persistentId.toString()) -- Gitee From f88aaa535650751db7d6b8390f9112b4e1509dac Mon Sep 17 00:00:00 2001 From: sunhaiyang Date: Mon, 27 Mar 2023 18:01:49 +0800 Subject: [PATCH 350/373] =?UTF-8?q?=E5=90=88=E4=B8=80=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=8A=B6=E6=80=81=E6=A0=8F=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E5=92=8C=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E7=8A=B6=E6=80=81=E6=A0=8F=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E3=80=81=E6=8E=A7=E5=88=B6=E4=B8=AD=E5=BF=83=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E3=80=81=E4=BF=AE=E6=94=B9Worker=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .hvigor/outputs/logs/details/details.json | 14 +- build-profile.json5 | 72 ++++ .../PluginDataSourceAdapter.ts | 2 +- .../main/ets/template/SimpleToggleBase.ets | 2 +- .../src/main/ets/template/iconComponent.ets | 2 +- .../src/main/ets/template/iconTitleBase.ets | 2 +- .../airplanecomponent/build-profile.json5 | 0 .../systemui/airplanecomponent/hvigorfile.ts | 0 .../airplanecomponent/package-lock.json | 8 +- .../systemui/airplanecomponent/package.json | 15 + .../ets/default/pages/airplaneComponent.ets | 4 +- .../airplanecomponent/src/main/module.json5 | 0 .../main/resources/base/element/string.json | 0 .../main/resources/base/media/airplane.svg | 0 .../main/resources/base/media/airplane_d.svg | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../autorotatecomponent/build-profile.json5 | 0 .../autorotatecomponent/hvigorfile.ts | 0 .../autorotatecomponent/package-lock.json | 8 +- .../systemui/autorotatecomponent/package.json | 15 + .../src/main/ets/com/ohos/common/Constants.ts | 0 .../ets/com/ohos/model/AutoRotateService.ts | 4 +- ...lCenterSimpleToggleAutoRotateComponent.ets | 4 +- .../ets/com/ohos/viewmodel/AutoRotateVM.ts | 4 +- .../autorotatecomponent/src/main/module.json5 | 0 .../main/resources/base/element/string.json | 0 .../ic_controlcenter_auto_rotate_off.svg | 0 .../media/ic_controlcenter_auto_rotate_on.svg | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../brightnesscomponent/build-profile.json5 | 0 .../brightnesscomponent/hvigorfile.ts | 0 .../brightnesscomponent/package-lock.json | 8 +- .../systemui/brightnesscomponent/package.json | 15 + .../src/main/ets/default/brightnessManager.ts | 8 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../ets/default/pages/brightnessComponent.ets | 2 +- .../brightnesscomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../base/media/ic_brightness_plus.svg | 0 .../base/media/ic_brightness_reduce.svg | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../build-profile.json5 | 0 .../controlcentercomponent/hvigorfile.ts | 0 .../controlcentercomponent/package-lock.json | 99 +++++ .../controlcentercomponent/package.json | 23 ++ .../src/main/ets/com/ohos/common/Constants.ts | 2 +- .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../com/ohos/model/ControlCenterService.ts | 16 +- .../com/ohos/pages/ComplexToggleComponent.ets | 8 +- .../ohos/pages/ComplexToggleLoadComponent.ets | 10 +- .../com/ohos/pages/ControlCenterComponent.ets | 4 +- .../ohos/pages/PluginIconItemComponent.ets | 8 +- .../com/ohos/pages/SimpleToggleComponent.ets | 8 +- .../pages/SimpleToggleLayoutEditComponent.ets | 2 +- .../SimpleToggleLayoutEditDialogComponent.ets | 2 +- .../ohos/pages/SimpleToggleLayoutEditGrid.ets | 2 +- .../ohos/pages/SimpleToggleLoadComponent.ets | 14 +- .../src/main/ets/com/ohos/pages/UpTitle.ets | 6 +- .../ets/com/ohos/viewmodel/ControlCenterVM.ts | 6 +- .../src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../resources/base/media/ic_public_back.svg | 0 .../resources/base/media/ic_public_edit.svg | 0 .../base/media/ic_public_settings.svg | 0 .../main/resources/base/media/ic_settings.png | Bin .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../systemui}/noticeitem/build-profile.json5 | 0 .../systemui/noticeitem/hvigorfile.ts | 0 feature/systemui/noticeitem/package-lock.json | 11 + feature/systemui/noticeitem/package.json | 15 + .../com/ohos/noticeItem/common/CommonUtil.ts | 4 +- .../noticeItem/common/ScrollbarManager.ts | 2 +- .../com/ohos/noticeItem/common/constants.ts | 0 .../noticeItem/model/ExpandInfoManager.ts | 0 .../noticeItem/model/NotificationConfig.ts | 4 +- .../model/NotificationDistributionManager.ts | 2 +- .../noticeItem/model/NotificationManager.ts | 2 +- .../noticeItem/model/NotificationService.ts | 8 +- .../model/NotificationWindowManager.ts | 6 +- .../ohos/noticeItem/model/ParseDataUtil.ts | 8 +- .../ohos/noticeItem/model/SwipeLayoutUtils.ts | 0 .../noticeItem/model/rule/RuleController.ts | 4 +- .../view/NotificationListComponent.ets | 2 +- .../ohos/noticeItem/view/item/SwipeLayout.ets | 2 +- .../noticeItem/view/item/actionComponent.ets | 4 +- .../view/item/bannerNotificationItem.ets | 8 +- .../ohos/noticeItem/view/item/basicItem.ets | 0 .../noticeItem/view/item/confirmDialog.ets | 2 +- .../ohos/noticeItem/view/item/customItem.ets | 2 +- .../noticeItem/view/item/devicesDialog.ets | 2 +- .../ohos/noticeItem/view/item/generalItem.ets | 4 +- .../ohos/noticeItem/view/item/groupItem.ets | 2 +- .../view/item/iconListComponent.ets | 2 +- .../ohos/noticeItem/view/item/longItem.ets | 0 .../ohos/noticeItem/view/item/multiItem.ets | 0 .../noticeItem/view/item/notificationItem.ets | 2 +- .../ohos/noticeItem/view/item/pictureItem.ets | 2 +- .../noticeItem/view/item/settingDialog.ets | 8 +- .../ohos/noticeItem/view/item/titleItem.ets | 4 +- .../viewmodel/NotificationViewModel.ts | 14 +- .../noticeitem/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../main/resources/base/media/ic_close.svg | 0 .../base/media/ic_notification_down.png | Bin .../base/media/ic_notification_up.png | Bin .../media/ic_public_delete_body_filled.svg | 0 .../base/media/ic_public_delete_filled.svg | 0 .../media/ic_public_delete_lids_filled.svg | 0 .../base/media/ic_public_settings_filled.svg | 0 .../src/main/resources/base/media/send.svg | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/color.json | 0 .../main/resources/phone/element/float.json | 0 .../resources/rawfile/notificationConfig.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../systemui}/phone/dropdownpanel/.gitignore | 0 .../phone/dropdownpanel/build-profile.json5 | 0 .../phone/dropdownpanel/hvigorfile.ts | 2 +- .../phone/dropdownpanel/package-lock.json | 369 ++++++++++++++++++ .../systemui/phone/dropdownpanel/package.json | 28 ++ .../src/main/ets/pages/DropdownPanel.ets | 67 ++-- .../src/main/ets/pages/SCBDropdownPanel.ets | 87 +++++ .../src/main/ets/pages/bannerNotification.ets | 19 +- .../ets/pages/common/ControlCenterConfig.ts | 6 +- .../ets/pages/common/StyleConfiguration.ts | 2 +- .../src/main/ets/pages/common/StyleManager.ts | 12 +- .../src/main/ets/pages/common/constants.ts | 0 .../main/ets/pages/common/navigationEvent.ts | 2 +- .../src/main/ets/pages/control.ets | 27 +- .../src/main/ets/pages/notification.ets | 35 +- .../phone/dropdownpanel/src/main/module.json5 | 10 + .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base}/element/string.json | 8 - .../main/resources/base/media/airplane.svg | 0 .../main/resources/base/media/airplane_d.svg | 0 .../main/resources/base/media/delete_all.png | Bin .../base/media/ic_brightness_plus.svg | 0 .../base/media/ic_brightness_reduce.svg | 0 .../base/media/ic_controlcenter_bt.svg | 0 .../base/media/ic_controlcenter_bt_d.svg | 0 .../base/media/ic_controlcenter_gps.svg | 0 .../ic_controlcenter_ring_off_filled.svg | 0 .../media/ic_controlcenter_ring_on_filled.svg | 0 .../ic_controlcenter_vibration_filled.svg | 0 .../base/media/ic_notification_nfc.svg | 0 .../base/media/ic_notification_nfc_filled.svg | 0 .../resources/base/media/ic_public_delete.svg | 0 .../base/media/ic_public_delete_filled.svg | 0 .../base/media/ic_public_settings.svg | 0 .../main/resources/base/media/ic_settings.png | Bin .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/media/wifi.svg | 0 .../src/main/resources/base/media/wifi_d.svg | 0 .../resources/base/profile/main_pages.json | 0 .../main/resources/en_US/element/string.json | 8 - .../main/resources/phone/element/float.json | 0 .../phone/media/dropdownpanel_bgc.png | Bin .../main/resources/zh_CN}/element/string.json | 8 - .../src/main/ets/pages/SCBStatusBar.ets | 109 ++++++ .../src/main/ets/pages/StatusBar.ets | 82 +--- .../main/resources/base/element/string.json | 4 - .../main/resources/en_US/element/string.json | 4 - .../main/resources/zh_CN/element/string.json | 4 - .../com/ohos/common/StatusBarConfiguration.ts | 4 +- product/phone/package-lock.json | 353 ++++++++++++++++- product/phone/package.json | 3 +- .../src/main/ets/WindowScene/HWSystemUi.ets | 14 +- .../ets/workers/PluginDataSourceWorker.js | 0 .../features/airplanecomponent/package.json | 12 - .../features/autorotatecomponent/package.json | 12 - .../features/brightnesscomponent/package.json | 12 - .../controlcentercomponent/package-lock.json | 5 - .../controlcentercomponent/package.json | 12 - .../features/noticeitem/package-lock.json | 5 - .../features/noticeitem/package.json | 12 - .../phone/dropdownpanel/package-lock.json | 41 -- .../product/phone/dropdownpanel/package.json | 23 -- .../src/main/ets/Application/AbilityStage.ts | 24 -- .../ServiceExtAbility/ServiceExtAbility.ts | 73 ---- .../ets/workers/PluginDataSourceWorker.js | 97 ----- .../phone/dropdownpanel/src/main/module.json5 | 33 -- 193 files changed, 1465 insertions(+), 692 deletions(-) rename {systemui4merge/features => feature/systemui}/airplanecomponent/build-profile.json5 (100%) rename systemui4merge/features/airplanecomponent/hvigorfile.js => feature/systemui/airplanecomponent/hvigorfile.ts (100%) rename {systemui4merge/features => feature/systemui}/airplanecomponent/package-lock.json (31%) create mode 100644 feature/systemui/airplanecomponent/package.json rename {systemui4merge/features => feature/systemui}/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets (94%) rename {systemui4merge/features => feature/systemui}/airplanecomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/airplanecomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/airplanecomponent/src/main/resources/base/media/airplane.svg (100%) rename {systemui4merge/features => feature/systemui}/airplanecomponent/src/main/resources/base/media/airplane_d.svg (100%) rename {systemui4merge/features => feature/systemui}/airplanecomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/airplanecomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/autorotatecomponent/build-profile.json5 (100%) rename systemui4merge/features/autorotatecomponent/hvigorfile.js => feature/systemui/autorotatecomponent/hvigorfile.ts (100%) rename {systemui4merge/features => feature/systemui}/autorotatecomponent/package-lock.json (32%) create mode 100644 feature/systemui/autorotatecomponent/package.json rename {systemui4merge/features => feature/systemui}/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts (100%) rename {systemui4merge/features => feature/systemui}/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts (93%) rename {systemui4merge/features => feature/systemui}/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets (92%) rename {systemui4merge/features => feature/systemui}/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts (90%) rename {systemui4merge/features => feature/systemui}/autorotatecomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/autorotatecomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg (100%) rename {systemui4merge/features => feature/systemui}/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg (100%) rename {systemui4merge/features => feature/systemui}/autorotatecomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/autorotatecomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/brightnesscomponent/build-profile.json5 (100%) rename systemui4merge/features/brightnesscomponent/hvigorfile.js => feature/systemui/brightnesscomponent/hvigorfile.ts (100%) rename {systemui4merge/features => feature/systemui}/brightnesscomponent/package-lock.json (32%) create mode 100644 feature/systemui/brightnesscomponent/package.json rename {systemui4merge/features => feature/systemui}/brightnesscomponent/src/main/ets/default/brightnessManager.ts (90%) rename {systemui4merge/features => feature/systemui}/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts (94%) rename {systemui4merge/features => feature/systemui}/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets (97%) rename {systemui4merge/features => feature/systemui}/brightnesscomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/brightnesscomponent/src/main/resources/base/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/brightnesscomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/brightnesscomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg (100%) rename {systemui4merge/features => feature/systemui}/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg (100%) rename {systemui4merge/features => feature/systemui}/brightnesscomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/brightnesscomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/build-profile.json5 (100%) rename systemui4merge/features/controlcentercomponent/hvigorfile.js => feature/systemui/controlcentercomponent/hvigorfile.ts (100%) create mode 100644 feature/systemui/controlcentercomponent/package-lock.json create mode 100644 feature/systemui/controlcentercomponent/package.json rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts (95%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (98%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts (92%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets (85%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets (72%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets (98%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets (83%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets (89%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets (99%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets (98%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets (99%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets (72%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets (94%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts (95%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/resources/base/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg (100%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg (100%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg (100%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/resources/base/media/ic_settings.png (100%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/controlcentercomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/build-profile.json5 (100%) rename systemui4merge/features/noticeitem/hvigorfile.js => feature/systemui/noticeitem/hvigorfile.ts (100%) create mode 100644 feature/systemui/noticeitem/package-lock.json create mode 100644 feature/systemui/noticeitem/package.json rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts (89%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts (95%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts (90%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts (97%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts (98%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts (93%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts (78%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts (94%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts (96%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets (96%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets (99%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets (95%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets (95%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets (97%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets (96%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets (97%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets (95%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets (99%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets (98%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets (98%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets (94%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets (92%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets (94%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts (95%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/base/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/base/media/ic_close.svg (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/base/media/ic_notification_down.png (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/base/media/ic_notification_up.png (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/base/media/send.svg (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/phone/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/rawfile/notificationConfig.json (100%) rename {systemui4merge/features => feature/systemui}/noticeitem/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/.gitignore (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/build-profile.json5 (100%) rename systemui4merge/product/phone/dropdownpanel/hvigorfile.js => feature/systemui/phone/dropdownpanel/hvigorfile.ts (92%) create mode 100644 feature/systemui/phone/dropdownpanel/package-lock.json create mode 100644 feature/systemui/phone/dropdownpanel/package.json rename systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/index.ets => feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets (76%) create mode 100644 feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets (86%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts (83%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts (96%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts (94%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/ets/pages/common/constants.ts (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts (96%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/ets/pages/control.ets (79%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/ets/pages/notification.ets (84%) create mode 100644 feature/systemui/phone/dropdownpanel/src/main/module.json5 rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/element/color.json (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/element/float.json (100%) rename {systemui4merge/product/phone/dropdownpanel/src/main/resources/zh_CN => feature/systemui/phone/dropdownpanel/src/main/resources/base}/element/string.json (93%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/airplane.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/delete_all.png (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/wifi.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/en_US/element/string.json (93%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/product => feature/systemui}/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png (100%) rename {systemui4merge/product/phone/dropdownpanel/src/main/resources/base => feature/systemui/phone/dropdownpanel/src/main/resources/zh_CN}/element/string.json (93%) create mode 100644 feature/systemui/phone/statusbar/src/main/ets/pages/SCBStatusBar.ets rename {feature/systemui/phone/statusbar => product/phone}/src/main/ets/workers/PluginDataSourceWorker.js (100%) delete mode 100644 systemui4merge/features/airplanecomponent/package.json delete mode 100644 systemui4merge/features/autorotatecomponent/package.json delete mode 100644 systemui4merge/features/brightnesscomponent/package.json delete mode 100644 systemui4merge/features/controlcentercomponent/package-lock.json delete mode 100644 systemui4merge/features/controlcentercomponent/package.json delete mode 100644 systemui4merge/features/noticeitem/package-lock.json delete mode 100644 systemui4merge/features/noticeitem/package.json delete mode 100644 systemui4merge/product/phone/dropdownpanel/package-lock.json delete mode 100644 systemui4merge/product/phone/dropdownpanel/package.json delete mode 100644 systemui4merge/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts delete mode 100644 systemui4merge/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts delete mode 100644 systemui4merge/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js delete mode 100644 systemui4merge/product/phone/dropdownpanel/src/main/module.json5 diff --git a/.hvigor/outputs/logs/details/details.json b/.hvigor/outputs/logs/details/details.json index 3dab2462..8c71d4bb 100644 --- a/.hvigor/outputs/logs/details/details.json +++ b/.hvigor/outputs/logs/details/details.json @@ -1,8 +1,14 @@ { - "totalTime": 900319200, - "moduleNum": 0, - "taskTime": {}, + "totalTime": 61746781900, + "moduleNum": 29, + "taskTime": { + "compileArkTS": 55407804100, + "compileJS": 7681900, + "compileResource": 255778900, + "packageHap": 542101300, + "signHap": 6399675100 + }, "isIncremental": true, - "hasIncremental": false, + "hasIncremental": true, "isParallel": true } \ No newline at end of file diff --git a/build-profile.json5 b/build-profile.json5 index bd487b54..95ee66a1 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -273,6 +273,66 @@ } ] }, + { + "name": "airplanecomponent", + "srcPath": "./feature/systemui/airplanecomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "autorotatecomponent", + "srcPath": "./feature/systemui/autorotatecomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "brightnesscomponent", + "srcPath": "./feature/systemui/brightnesscomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "controlcentercomponent", + "srcPath": "./feature/systemui/controlcentercomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "noticeitem", + "srcPath": "./feature/systemui/noticeitem", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, { "name": "phone_statusbar", "srcPath": "./feature/systemui/phone/statusbar", @@ -284,6 +344,18 @@ ] } ] + }, + { + "name": "phone_dropdownpanel", + "srcPath": "./feature/systemui/phone/dropdownpanel", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] } ], } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts index b5c0d945..ba27aea9 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts @@ -46,7 +46,7 @@ export default class PluginDataSourceAdapter { this.mModuleName = moduleName; const WORKER_JS_URL = this.mModuleName + '/ets/workers/PluginDataSourceWorker.js'; Log.showInfo(TAG, `WORKER_JS_URL: ${WORKER_JS_URL}`) - this.mWorker = new worker.ThreadWorker(WORKER_JS_URL, { + this.mWorker = new worker.Worker(WORKER_JS_URL, { type: 'classic', name: this.mName, }); diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/template/SimpleToggleBase.ets index 404383b8..91604136 100644 --- a/common/src/main/ets/template/SimpleToggleBase.ets +++ b/common/src/main/ets/template/SimpleToggleBase.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../default/Log' +import { Log } from '../default/utils/Log' import StyleConfiguration, { SimpleToggleBaseStyle } from './common/StyleConfiguration' const TAG = 'SimpleToggleBase' diff --git a/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/template/iconComponent.ets index 8ba45045..1b7c8723 100644 --- a/common/src/main/ets/template/iconComponent.ets +++ b/common/src/main/ets/template/iconComponent.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../default/Log'; +import { Log } from '../default/utils/Log' import StyleConfiguration, { IconComponentStyle } from './common/StyleConfiguration' const TAG = 'iconComponent' diff --git a/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/template/iconTitleBase.ets index 15e753e4..95fb448e 100644 --- a/common/src/main/ets/template/iconTitleBase.ets +++ b/common/src/main/ets/template/iconTitleBase.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../default/Log'; +import { Log } from '../default/utils/Log' import StyleConfiguration, { IconTitleBaseStyle } from './common/StyleConfiguration' import iconComponent from './iconComponent' diff --git a/systemui4merge/features/airplanecomponent/build-profile.json5 b/feature/systemui/airplanecomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/airplanecomponent/build-profile.json5 rename to feature/systemui/airplanecomponent/build-profile.json5 diff --git a/systemui4merge/features/airplanecomponent/hvigorfile.js b/feature/systemui/airplanecomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/airplanecomponent/hvigorfile.js rename to feature/systemui/airplanecomponent/hvigorfile.ts diff --git a/systemui4merge/features/airplanecomponent/package-lock.json b/feature/systemui/airplanecomponent/package-lock.json similarity index 31% rename from systemui4merge/features/airplanecomponent/package-lock.json rename to feature/systemui/airplanecomponent/package-lock.json index e65fc76c..4f301f97 100644 --- a/systemui4merge/features/airplanecomponent/package-lock.json +++ b/feature/systemui/airplanecomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/airplanecomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/feature/systemui/airplanecomponent/package.json b/feature/systemui/airplanecomponent/package.json new file mode 100644 index 00000000..a978b38c --- /dev/null +++ b/feature/systemui/airplanecomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/airplanecomponent", + "description": "a npm package which contains airplanecomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets b/feature/systemui/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets similarity index 94% rename from systemui4merge/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets rename to feature/systemui/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets index 898ac2e0..c6047d5b 100644 --- a/systemui4merge/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets +++ b/feature/systemui/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets @@ -14,8 +14,8 @@ */ import wifi from '@ohos.wifi'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import iconTitleBase from '../../../../../../../common/src/main/ets/template/iconTitleBase'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import iconTitleBase from '@ohos/common/src/main/ets/template/iconTitleBase'; const TAG = 'Control-airPlaneComponent'; diff --git a/systemui4merge/features/airplanecomponent/src/main/module.json5 b/feature/systemui/airplanecomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/airplanecomponent/src/main/module.json5 rename to feature/systemui/airplanecomponent/src/main/module.json5 diff --git a/systemui4merge/features/airplanecomponent/src/main/resources/base/element/string.json b/feature/systemui/airplanecomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/airplanecomponent/src/main/resources/base/element/string.json rename to feature/systemui/airplanecomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/airplanecomponent/src/main/resources/base/media/airplane.svg b/feature/systemui/airplanecomponent/src/main/resources/base/media/airplane.svg similarity index 100% rename from systemui4merge/features/airplanecomponent/src/main/resources/base/media/airplane.svg rename to feature/systemui/airplanecomponent/src/main/resources/base/media/airplane.svg diff --git a/systemui4merge/features/airplanecomponent/src/main/resources/base/media/airplane_d.svg b/feature/systemui/airplanecomponent/src/main/resources/base/media/airplane_d.svg similarity index 100% rename from systemui4merge/features/airplanecomponent/src/main/resources/base/media/airplane_d.svg rename to feature/systemui/airplanecomponent/src/main/resources/base/media/airplane_d.svg diff --git a/systemui4merge/features/airplanecomponent/src/main/resources/en_US/element/string.json b/feature/systemui/airplanecomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/airplanecomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/airplanecomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/airplanecomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/airplanecomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/airplanecomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/airplanecomponent/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/features/autorotatecomponent/build-profile.json5 b/feature/systemui/autorotatecomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/autorotatecomponent/build-profile.json5 rename to feature/systemui/autorotatecomponent/build-profile.json5 diff --git a/systemui4merge/features/autorotatecomponent/hvigorfile.js b/feature/systemui/autorotatecomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/autorotatecomponent/hvigorfile.js rename to feature/systemui/autorotatecomponent/hvigorfile.ts diff --git a/systemui4merge/features/autorotatecomponent/package-lock.json b/feature/systemui/autorotatecomponent/package-lock.json similarity index 32% rename from systemui4merge/features/autorotatecomponent/package-lock.json rename to feature/systemui/autorotatecomponent/package-lock.json index b3bfa542..84191092 100644 --- a/systemui4merge/features/autorotatecomponent/package-lock.json +++ b/feature/systemui/autorotatecomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/autorotatecomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/feature/systemui/autorotatecomponent/package.json b/feature/systemui/autorotatecomponent/package.json new file mode 100644 index 00000000..edb72e75 --- /dev/null +++ b/feature/systemui/autorotatecomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/autorotatecomponent", + "description": "a npm package which contains autorotatecomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "type": "module", + "dependencies": { + "@ohos/common": "../../../common" + } +} diff --git a/systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts rename to feature/systemui/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts similarity index 93% rename from systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts rename to feature/systemui/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts index 3bfe1762..7931a8d5 100644 --- a/systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts +++ b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -15,8 +15,8 @@ */ import screen from '@ohos.screen'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'AutoRotateModel'; diff --git a/systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets similarity index 92% rename from systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets rename to feature/systemui/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets index 0011be5a..18851040 100644 --- a/systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets +++ b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import {AutoRotateData} from '../common/Constants'; import ViewModel from '../viewmodel/AutoRotateVM'; -import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase'; +import SimpleToggleBase from '@ohos/common/src/main/ets/template/SimpleToggleBase'; const TAG = 'autorotate-ControlCenterSimpleToggleAutoRotateComponent'; diff --git a/systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts similarity index 90% rename from systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts rename to feature/systemui/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts index 7b11781c..096733b1 100644 --- a/systemui4merge/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts +++ b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; import AutoRotateService from '../model/AutoRotateService'; import { AutoRotateData } from '../common/Constants'; diff --git a/systemui4merge/features/autorotatecomponent/src/main/module.json5 b/feature/systemui/autorotatecomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/autorotatecomponent/src/main/module.json5 rename to feature/systemui/autorotatecomponent/src/main/module.json5 diff --git a/systemui4merge/features/autorotatecomponent/src/main/resources/base/element/string.json b/feature/systemui/autorotatecomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/autorotatecomponent/src/main/resources/base/element/string.json rename to feature/systemui/autorotatecomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg b/feature/systemui/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg similarity index 100% rename from systemui4merge/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg rename to feature/systemui/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_off.svg diff --git a/systemui4merge/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg b/feature/systemui/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg similarity index 100% rename from systemui4merge/features/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg rename to feature/systemui/autorotatecomponent/src/main/resources/base/media/ic_controlcenter_auto_rotate_on.svg diff --git a/systemui4merge/features/autorotatecomponent/src/main/resources/en_US/element/string.json b/feature/systemui/autorotatecomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/autorotatecomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/autorotatecomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/autorotatecomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/autorotatecomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/autorotatecomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/autorotatecomponent/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/features/brightnesscomponent/build-profile.json5 b/feature/systemui/brightnesscomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/brightnesscomponent/build-profile.json5 rename to feature/systemui/brightnesscomponent/build-profile.json5 diff --git a/systemui4merge/features/brightnesscomponent/hvigorfile.js b/feature/systemui/brightnesscomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/brightnesscomponent/hvigorfile.js rename to feature/systemui/brightnesscomponent/hvigorfile.ts diff --git a/systemui4merge/features/brightnesscomponent/package-lock.json b/feature/systemui/brightnesscomponent/package-lock.json similarity index 32% rename from systemui4merge/features/brightnesscomponent/package-lock.json rename to feature/systemui/brightnesscomponent/package-lock.json index 446f9b99..28e788e9 100644 --- a/systemui4merge/features/brightnesscomponent/package-lock.json +++ b/feature/systemui/brightnesscomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/brightnesscomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/feature/systemui/brightnesscomponent/package.json b/feature/systemui/brightnesscomponent/package.json new file mode 100644 index 00000000..e183da37 --- /dev/null +++ b/feature/systemui/brightnesscomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/brightnesscomponent", + "description": "a npm package which contains brightnesscomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/feature/systemui/brightnesscomponent/src/main/ets/default/brightnessManager.ts similarity index 90% rename from systemui4merge/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts rename to feature/systemui/brightnesscomponent/src/main/ets/default/brightnessManager.ts index 555fcebe..6c2b9131 100644 --- a/systemui4merge/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/feature/systemui/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import Log from '../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import commonEvent from '@ohos.commonEvent'; import settings from '@ohos.settings'; import systemParameter from '@ohos.systemparameter' import dataShare from '@ohos.data.dataShare'; import Brightness from '@ohos.brightness'; import Context from 'application/ServiceExtensionContext'; -import Constants from "../../../../../../common/src/main/ets/default/Constants"; -import createOrGet from '../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import Constants from "@ohos/common/src/main/ets/default/Constants"; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'Control-brightnessManager'; var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 100); diff --git a/systemui4merge/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts b/feature/systemui/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 94% rename from systemui4merge/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts rename to feature/systemui/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts index dc39941e..722f222a 100644 --- a/systemui4merge/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/feature/systemui/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; const TAG = 'brightness-StyleConfiguration'; diff --git a/systemui4merge/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets b/feature/systemui/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets similarity index 97% rename from systemui4merge/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets rename to feature/systemui/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets index 9034fc01..446cc804 100644 --- a/systemui4merge/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets +++ b/feature/systemui/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets @@ -16,7 +16,7 @@ import brightness from '@ohos.brightness'; import mBrightnessManager from '../brightnessManager'; import StyleConfiguration, { BrightnessComponentStyle } from '../common/StyleConfiguration'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'Control-brightnessComponent'; diff --git a/systemui4merge/features/brightnesscomponent/src/main/module.json5 b/feature/systemui/brightnesscomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/brightnesscomponent/src/main/module.json5 rename to feature/systemui/brightnesscomponent/src/main/module.json5 diff --git a/systemui4merge/features/brightnesscomponent/src/main/resources/base/element/color.json b/feature/systemui/brightnesscomponent/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/features/brightnesscomponent/src/main/resources/base/element/color.json rename to feature/systemui/brightnesscomponent/src/main/resources/base/element/color.json diff --git a/systemui4merge/features/brightnesscomponent/src/main/resources/base/element/float.json b/feature/systemui/brightnesscomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/brightnesscomponent/src/main/resources/base/element/float.json rename to feature/systemui/brightnesscomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/brightnesscomponent/src/main/resources/base/element/string.json b/feature/systemui/brightnesscomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/brightnesscomponent/src/main/resources/base/element/string.json rename to feature/systemui/brightnesscomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg b/feature/systemui/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg similarity index 100% rename from systemui4merge/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg rename to feature/systemui/brightnesscomponent/src/main/resources/base/media/ic_brightness_plus.svg diff --git a/systemui4merge/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg b/feature/systemui/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg similarity index 100% rename from systemui4merge/features/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg rename to feature/systemui/brightnesscomponent/src/main/resources/base/media/ic_brightness_reduce.svg diff --git a/systemui4merge/features/brightnesscomponent/src/main/resources/en_US/element/string.json b/feature/systemui/brightnesscomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/brightnesscomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/brightnesscomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/brightnesscomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/brightnesscomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/brightnesscomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/brightnesscomponent/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/features/controlcentercomponent/build-profile.json5 b/feature/systemui/controlcentercomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/controlcentercomponent/build-profile.json5 rename to feature/systemui/controlcentercomponent/build-profile.json5 diff --git a/systemui4merge/features/controlcentercomponent/hvigorfile.js b/feature/systemui/controlcentercomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/controlcentercomponent/hvigorfile.js rename to feature/systemui/controlcentercomponent/hvigorfile.ts diff --git a/feature/systemui/controlcentercomponent/package-lock.json b/feature/systemui/controlcentercomponent/package-lock.json new file mode 100644 index 00000000..cd58ecd5 --- /dev/null +++ b/feature/systemui/controlcentercomponent/package-lock.json @@ -0,0 +1,99 @@ +{ + "name": "@ohos/controlcentercomponent", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/airplanecomponent": { + "version": "file:../airplanecomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/autorotatecomponent": { + "version": "file:../autorotatecomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/bluetoothcomponent": { + "version": "file:../bluetoothcomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/brightnesscomponent": { + "version": "file:../brightnesscomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/common": { + "version": "file:../../../common" + }, + "@ohos/locationcomponent": { + "version": "file:../locationcomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/nfccomponent": { + "version": "file:../nfccomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/ringmodecomponent": { + "version": "file:../ringmodecomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/wificomponent": { + "version": "file:../wificomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + } + } +} diff --git a/feature/systemui/controlcentercomponent/package.json b/feature/systemui/controlcentercomponent/package.json new file mode 100644 index 00000000..0c398b21 --- /dev/null +++ b/feature/systemui/controlcentercomponent/package.json @@ -0,0 +1,23 @@ +{ + "devDependencies": {}, + "name": "@ohos/controlcentercomponent", + "description": "a npm package which contains controlcentercomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "type": "module", + "dependencies": { + "@ohos/common": "../../../common", + "@ohos/autorotatecomponent": "../autorotatecomponent", + "@ohos/airplanecomponent": "../airplanecomponent", + "@ohos/brightnesscomponent": "../brightnesscomponent", + "@ohos/wificomponent": "../wificomponent", + "@ohos/bluetoothcomponent": "../bluetoothcomponent", + "@ohos/locationcomponent": "../locationcomponent", + "@ohos/nfccomponent": "../nfccomponent", + "@ohos/ringmodecomponent": "../ringmodecomponent" + } +} diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 95% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts index 2f4732d7..4962c051 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts @@ -14,7 +14,7 @@ */ import { ItemComponentData, FilterData -} from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; +} from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; export default class Constants { static readonly TOUCHTYPE_DOWN = 0; diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 98% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index abc6f7f6..ee02a5a6 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; import Constants from './Constants'; const TAG = 'ControlCenter-StyleConfiguration'; diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts similarity index 92% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index 912fe76f..50d21b13 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -13,15 +13,15 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import SwitchUserManager, { UserInfo } from '../../../../../../../../common/src/main/ets/default/SwitchUserManager'; -import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; -import SettingsUtil from '../../../../../../../../common/src/main/ets/default/SettingsUtil'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import PluginDataSourceAdapter from '../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import SwitchUserManager, { UserInfo } from '@ohos/common/src/main/ets/default/SwitchUserManager'; +import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; +import SettingsUtil from '@ohos/common/src/main/ets/default/SettingsUtil'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import PluginDataSourceAdapter from '@ohos/common/src/main/ets/plugindatasource/PluginDataSourceAdapter'; import { ItemComponentData, FilterData -} from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; +} from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; import Constants, { ControlComponentData, ControlCenterConfig } from '../common/Constants'; export interface ControlCenterListener { diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets similarity index 85% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets index 99b54169..ef623235 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager'; -import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase'; -import { itemData } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import EventManager from '@ohos/common/src/main/ets/default/event/EventManager'; +import iconTitleBase from '@ohos/common/src/main/ets/template/iconTitleBase'; +import { itemData } from "@ohos/common/src/main/ets/plugindatasource/common/Constants" const TAG = 'ComplexToggleComponent'; diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets similarity index 72% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets index cbfd3445..b8ce520b 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; -import AirPlaneComponent from "../../../../../../../airplanecomponent/src/main/ets/default/pages/airplaneComponent"; -import WifiComponent from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiComponent'; -import BluetoothComponent from '../../../../../../../bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import {FASlotName} from '@ohos/common/src/main/ets/default/Constants'; +import AirPlaneComponent from "@ohos/airplanecomponent/src/main/ets/default/pages/airplaneComponent"; +import WifiComponent from '@ohos/wificomponent/src/main/ets/default/pages/wifiComponent'; +import BluetoothComponent from '@ohos/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent'; import ComplexToggleComponent from './ComplexToggleComponent'; const TAG = 'ComplexToggleLoadComponent'; diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets similarity index 98% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index 1c004d2c..06b8d53a 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -14,8 +14,8 @@ */ import UpTitle from './UpTitle'; -import MyBrightness from '../../../../../../../brightnesscomponent/src/main/ets/default/pages/brightnessComponent'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import MyBrightness from '@ohos/brightnesscomponent/src/main/ets/default/pages/brightnessComponent'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants, { ControlCenterConfig } from '../common/Constants'; import StyleConfiguration, { ControlCenterComponentStyle, ControlCenterComplexToggleLayoutStyle, ControlCenterSimpleToggleLayoutStyle } from '../common/StyleConfiguration'; diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets similarity index 83% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets index f4f8f544..5a62645f 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager'; -import { PluginComponentData } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager'; +import { PluginComponentData } from "@ohos/common/src/main/ets/plugindatasource/common/Constants"; import ViewModel from '../viewmodel/ControlCenterVM'; -import StyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/StyleConfiguration'; +import StyleConfiguration from '@ohos/common/src/main/ets/template/common/StyleConfiguration'; const TAG = 'PluginIconItemComponent'; diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets similarity index 89% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index 9b0a099f..880fe1e3 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager'; -import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import EventManager from '@ohos/common/src/main/ets/default/event/EventManager'; +import SimpleToggleBase from '@ohos/common/src/main/ets/template/SimpleToggleBase'; import PluginIconItemComponent from './PluginIconItemComponent'; -import {PluginType,itemData} from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" +import {PluginType,itemData} from "@ohos/common/src/main/ets/plugindatasource/common/Constants" const TAG = 'SimpleToggleComponent'; diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets similarity index 99% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets index ed251f09..b0694ef3 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants from '../common/Constants'; import StyleConfiguration, { SimpleToggleLayoutEditComponentStyle, SimpleToggleLayoutEditUpTitleStyle, SimpleToggleLayoutEditOptMsgStyle } from '../common/StyleConfiguration'; diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets similarity index 98% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets index b005bdeb..167645b5 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import StyleConfiguration, { ControlEditDialogStyle } from '../common/StyleConfiguration'; const TAG = 'Control-SimpleToggleLayoutEditDialogComponent'; diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets similarity index 99% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets index 87c6883b..d1d643ef 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import SimpleToggleLoadComponent from './SimpleToggleLoadComponent'; import StyleConfiguration, { SimpleToggleLayoutEditGridStyle } from '../common/StyleConfiguration'; diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets similarity index 72% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets index 27c60ea3..4bf687c7 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets @@ -13,13 +13,13 @@ * limitations under the License. */ -import {isNfcAvailable} from '../../../../../../../../common/src/main/ets/default/Constants'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; -import LocationComponent from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent'; -import RingModeComponent from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent'; -import AutoRotateComponent from '../../../../../../../autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent'; -import NFCComponent from '../../../../../../../nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent'; +import {isNfcAvailable} from '@ohos/common/src/main/ets/default/Constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import {FASlotName} from '@ohos/common/src/main/ets/default/Constants'; +import LocationComponent from '@ohos/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent'; +import RingModeComponent from '@ohos/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent'; +import AutoRotateComponent from '@ohos/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent'; +import NFCComponent from '@ohos/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent'; import SimpleToggleComponent from './SimpleToggleComponent'; const TAG = 'SimpleToggleLoadComponent'; diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets similarity index 94% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets index ae809c6b..064f6c15 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets @@ -13,9 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager"; -import { obtainStartAbility } from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import EventManager from "@ohos/common/src/main/ets/default/event/EventManager"; +import { obtainStartAbility } from "@ohos/common/src/main/ets/default/event/EventUtil"; import Constants from '../common/Constants'; import StyleConfiguration, { ControlCenterUpTitleStyle } from '../common/StyleConfiguration'; diff --git a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts similarity index 95% rename from systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts rename to feature/systemui/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts index f7b81776..7c0d546d 100644 --- a/systemui4merge/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts @@ -13,12 +13,12 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; import { ControlComponentData, ControlCenterConfig } from '../common/Constants'; import ControlCenterService from '../model/ControlCenterService'; import { PluginType, PluginComponentData -} from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; +} from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; export const CONTROL_CENTER_COMPLEX_TOGGLE_LAYOUT_KEY = 'ControlCenterComplexToggleLayout'; diff --git a/systemui4merge/features/controlcentercomponent/src/main/module.json5 b/feature/systemui/controlcentercomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/controlcentercomponent/src/main/module.json5 rename to feature/systemui/controlcentercomponent/src/main/module.json5 diff --git a/systemui4merge/features/controlcentercomponent/src/main/resources/base/element/color.json b/feature/systemui/controlcentercomponent/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/features/controlcentercomponent/src/main/resources/base/element/color.json rename to feature/systemui/controlcentercomponent/src/main/resources/base/element/color.json diff --git a/systemui4merge/features/controlcentercomponent/src/main/resources/base/element/float.json b/feature/systemui/controlcentercomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/controlcentercomponent/src/main/resources/base/element/float.json rename to feature/systemui/controlcentercomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/controlcentercomponent/src/main/resources/base/element/string.json b/feature/systemui/controlcentercomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/controlcentercomponent/src/main/resources/base/element/string.json rename to feature/systemui/controlcentercomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg b/feature/systemui/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg similarity index 100% rename from systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg rename to feature/systemui/controlcentercomponent/src/main/resources/base/media/ic_public_back.svg diff --git a/systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg b/feature/systemui/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg similarity index 100% rename from systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg rename to feature/systemui/controlcentercomponent/src/main/resources/base/media/ic_public_edit.svg diff --git a/systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg b/feature/systemui/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg similarity index 100% rename from systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg rename to feature/systemui/controlcentercomponent/src/main/resources/base/media/ic_public_settings.svg diff --git a/systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_settings.png b/feature/systemui/controlcentercomponent/src/main/resources/base/media/ic_settings.png similarity index 100% rename from systemui4merge/features/controlcentercomponent/src/main/resources/base/media/ic_settings.png rename to feature/systemui/controlcentercomponent/src/main/resources/base/media/ic_settings.png diff --git a/systemui4merge/features/controlcentercomponent/src/main/resources/base/media/icon.png b/feature/systemui/controlcentercomponent/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/features/controlcentercomponent/src/main/resources/base/media/icon.png rename to feature/systemui/controlcentercomponent/src/main/resources/base/media/icon.png diff --git a/systemui4merge/features/controlcentercomponent/src/main/resources/en_US/element/string.json b/feature/systemui/controlcentercomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/controlcentercomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/controlcentercomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/controlcentercomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/controlcentercomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/controlcentercomponent/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/features/noticeitem/build-profile.json5 b/feature/systemui/noticeitem/build-profile.json5 similarity index 100% rename from systemui4merge/features/noticeitem/build-profile.json5 rename to feature/systemui/noticeitem/build-profile.json5 diff --git a/systemui4merge/features/noticeitem/hvigorfile.js b/feature/systemui/noticeitem/hvigorfile.ts similarity index 100% rename from systemui4merge/features/noticeitem/hvigorfile.js rename to feature/systemui/noticeitem/hvigorfile.ts diff --git a/feature/systemui/noticeitem/package-lock.json b/feature/systemui/noticeitem/package-lock.json new file mode 100644 index 00000000..672f0335 --- /dev/null +++ b/feature/systemui/noticeitem/package-lock.json @@ -0,0 +1,11 @@ +{ + "name": "@ohos/noticeitem", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } +} diff --git a/feature/systemui/noticeitem/package.json b/feature/systemui/noticeitem/package.json new file mode 100644 index 00000000..3224fba5 --- /dev/null +++ b/feature/systemui/noticeitem/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/noticeitem", + "description": "a npm package which contains noticeitem function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "type": "module", + "dependencies": { + "@ohos/common": "../../../common" + } +} diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts similarity index 89% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts index dac86d97..ae38bd2f 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -import Trace from '../../../../../../../../../common/src/main/ets/default/Trace' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import Trace from '@ohos/common/src/main/ets/default/Trace' import WantAgent from '@ohos.wantAgent'; const TAG = 'CommonUtil'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts similarity index 95% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts index bc4b9e4c..ec801595 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'ScrollbarManager'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts similarity index 100% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts similarity index 100% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts similarity index 90% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts index 0f231691..ce205c0d 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import ReadConfigUtil from '../../../../../../../../../common/src/main/ets/default/ReadConfigUtil'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import ReadConfigUtil from '@ohos/common/src/main/ets/default/ReadConfigUtil'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'NotificationConfig'; /** diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts similarity index 97% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts index d17a06f7..a77d1040 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import DeviceManager from '@ohos.distributedHardware.deviceManager'; import DeviceInfo from '@ohos.deviceInfo'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts similarity index 98% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index 3759d1f3..da031332 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -18,7 +18,7 @@ import Notification from '@ohos.notification'; import PluginComponentManager from '@ohos.pluginComponent'; import Systemparameter from '@ohos.systemparameter'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import {AsyncCallback} from 'basic'; const TAG = 'NotificationManager'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts similarity index 93% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index 2c27c7bd..247a56a7 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -13,15 +13,15 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import NotificationManager from './NotificationManager'; import ParseDataUtil from './ParseDataUtil'; import RuleController from './rule/RuleController'; import CommonUtil from '../common/CommonUtil'; -import createOrGet from '../../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; import DistributionManager from './NotificationDistributionManager'; -import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import {writeFaultLog, FaultID} from '../../../../../../../../../common/src/main/ets/default/SysFaultLogger'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import {writeFaultLog, FaultID} from '@ohos/common/src/main/ets/default/SysFaultLogger'; const TAG = 'NotificationService'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts similarity index 78% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts index 4436b023..2a83543d 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -import EventManager from '../../../../../../../../../common/src/main/ets/default/event/EventManager'; -import {obtainLocalEvent} from '../../../../../../../../../common/src/main/ets/default/event/EventUtil'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import EventManager from '@ohos/common/src/main/ets/default/event/EventManager'; +import {obtainLocalEvent} from '@ohos/common/src/main/ets/default/event/EventUtil'; const TAG = 'NotificationWindowManager'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts similarity index 94% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index d1a74f50..a9c48ef9 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -17,14 +17,14 @@ import Notification from '@ohos.notification'; import BundleMgr from "@ohos.bundle.bundleManager"; import AccountManager from '@ohos.account.osAccount'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -import BundleManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager'; -import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import BundleManager from '@ohos/common/src/main/ets/default/abilitymanager/bundleManager'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import DistributionManager from './NotificationDistributionManager'; import NotificationManager from './NotificationManager'; import Constants, {NotificationItemData} from '../common/constants'; import {NotificationConfig} from './NotificationConfig'; -import TimeManager from '../../../../../../../../../common/src/main/ets/default/TimeManager' +import TimeManager from '@ohos/common/src/main/ets/default/TimeManager' const TAG = 'Notification_ParseDataUtil'; let mDate = new Date(); diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts similarity index 100% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts similarity index 96% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts index 23213d07..761f4a3c 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts @@ -14,9 +14,9 @@ */ import {NotificationItemData} from '../../common/constants'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Notification from '@ohos.notification'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; import Bundle from '@ohos.bundle'; const TAG = 'NotificationRuleController'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets similarity index 96% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index 95053d46..11a379b3 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants, {NotificationLayout as Layout} from '../common/constants'; import NotificationItem from './item/notificationItem'; import GroupNotificationItem from './item/groupItem'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets similarity index 99% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets index 4dd764f3..8ea71119 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants, {NotificationLayout as Layout} from '../../common/constants'; import FocusCallBack from '../../model/SwipeLayoutUtils'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets similarity index 95% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets index 7f52ad21..38ea970a 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets @@ -13,8 +13,8 @@ * limitations under the License. */ -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import Constants, {InputActionButtonData, NotificationLayout as Layout} from '../../common/constants'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets similarity index 95% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index fe42be88..0f0c4bfa 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import WindowManager, { WindowType } from '../../../../../../../../../../common/src/main/ets/default/WindowManager'; -import {notificationData} from '../../../../../../../../../../common/src/main/ets/plugindatasource/common/Constants' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import WindowManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowManager'; +import {notificationData} from '@ohos/common/src/main/ets/plugindatasource/common/Constants' import Constants, {NotificationLayout as Layout} from '../../common/constants'; import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import CustomItem from './customItem'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets similarity index 100% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets similarity index 97% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets index e68de8df..25e24361 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -14,7 +14,7 @@ */ import Constants from '../../common/constants'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import deviceInfo from '@ohos.deviceInfo'; const deviceTypeInfo = deviceInfo.deviceType; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets similarity index 96% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets index 67ba3174..1ab6fb88 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -14,7 +14,7 @@ */ -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import NotificationManager from '../../model/NotificationManager'; import {NotificationLayout as Layout} from '../../common/constants'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets similarity index 97% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets index d66b2c4d..ed5ac8bd 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets @@ -14,7 +14,7 @@ */ import Constants from '../../common/constants'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import DistributionManager from '../../model/NotificationDistributionManager'; const TAG = 'NoticeItem-DevicesDialog'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets similarity index 95% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index e3954cf9..311d8d67 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -19,8 +19,8 @@ import longItem from './longItem'; import multiItem from './multiItem'; import pictureItem from './pictureItem'; import titleItem from './titleItem'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import ActionComponent from './actionComponent'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets similarity index 99% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index c71141cc..3a240999 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants, { NotificationLayout as Layout } from '../../common/constants'; import NotificationItem from './notificationItem' import NotificationViewModel from '../../viewmodel/NotificationViewModel'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets similarity index 98% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets index d47c093f..4fb6c0cb 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -14,7 +14,7 @@ */ import Constants, { NotificationLayout as Layout } from '../../common/constants'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import SettingDialog from './settingDialog'; import ConfirmDialog from './confirmDialog' import NotificationViewModel from '../../viewmodel/NotificationViewModel'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets similarity index 100% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets similarity index 100% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets similarity index 98% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 71884f65..5052f107 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -16,7 +16,7 @@ import Constants, {NotificationLayout as Layout} from '../../common/constants'; import GeneralItem from './generalItem'; import CustomItem from './customItem'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import DevicesDialog from './devicesDialog'; import WantAgent from '@ohos.wantAgent'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets similarity index 94% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets index 68737b81..8d15e1e6 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets @@ -14,7 +14,7 @@ */ import Constants, {NotificationItemData, NotificationLayout as Layout} from '../../common/constants'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; @Component export default struct PictureItem { diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets similarity index 92% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets index 4a38a934..e61c70c6 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -14,10 +14,10 @@ */ import Constants, { NotificationItemData } from '../../common/constants'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; -import EventManager from "../../../../../../../../../../common/src/main/ets/default/event/EventManager" -import { obtainStartAbility } from "../../../../../../../../../../common/src/main/ets/default/event/EventUtil" +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; +import EventManager from "@ohos/common/src/main/ets/default/event/EventManager" +import { obtainStartAbility } from "@ohos/common/src/main/ets/default/event/EventUtil" import Notification from '@ohos.notification'; import deviceInfo from '@ohos.deviceInfo'; diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets similarity index 94% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets index 880dd188..0e4dcb8c 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets @@ -14,8 +14,8 @@ */ import Constants, { NotificationLayout as Layout } from '../../common/constants'; -import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; -import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; const TAG = 'NoticeItem-TitleItem'; @Component diff --git a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts similarity index 95% rename from systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts rename to feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts index 4ced3463..159ad01d 100644 --- a/systemui4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -import SwitchUserManager from '../../../../../../../../../common/src/main/ets/default/SwitchUserManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import SwitchUserManager from '@ohos/common/src/main/ets/default/SwitchUserManager'; import media from '@ohos.multimedia.media'; import vibrator from '@ohos.vibrator'; import wantAgent from '@ohos.wantAgent'; @@ -22,11 +22,11 @@ import Notification from '@ohos.notification'; import NotificationService from '../model/NotificationService'; import NotificationWindowManager from '../model/NotificationWindowManager'; import NotificationConfig from '../model/NotificationConfig'; -import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; -import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import EventManager from '../../../../../../../../../common/src/main/ets/default/event/EventManager'; -import {obtainLocalEvent} from '../../../../../../../../../common/src/main/ets/default/event/EventUtil'; -import Trace from '../../../../../../../../../common/src/main/ets/default/Trace' +import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import EventManager from '@ohos/common/src/main/ets/default/event/EventManager'; +import {obtainLocalEvent} from '@ohos/common/src/main/ets/default/event/EventUtil'; +import Trace from '@ohos/common/src/main/ets/default/Trace' import CommonUtil from '../common/CommonUtil'; import Constants,{NotificationItemData} from '../common/constants'; diff --git a/systemui4merge/features/noticeitem/src/main/module.json5 b/feature/systemui/noticeitem/src/main/module.json5 similarity index 100% rename from systemui4merge/features/noticeitem/src/main/module.json5 rename to feature/systemui/noticeitem/src/main/module.json5 diff --git a/systemui4merge/features/noticeitem/src/main/resources/base/element/color.json b/feature/systemui/noticeitem/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/base/element/color.json rename to feature/systemui/noticeitem/src/main/resources/base/element/color.json diff --git a/systemui4merge/features/noticeitem/src/main/resources/base/element/float.json b/feature/systemui/noticeitem/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/base/element/float.json rename to feature/systemui/noticeitem/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/noticeitem/src/main/resources/base/element/string.json b/feature/systemui/noticeitem/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/base/element/string.json rename to feature/systemui/noticeitem/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_close.svg b/feature/systemui/noticeitem/src/main/resources/base/media/ic_close.svg similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/base/media/ic_close.svg rename to feature/systemui/noticeitem/src/main/resources/base/media/ic_close.svg diff --git a/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_notification_down.png b/feature/systemui/noticeitem/src/main/resources/base/media/ic_notification_down.png similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/base/media/ic_notification_down.png rename to feature/systemui/noticeitem/src/main/resources/base/media/ic_notification_down.png diff --git a/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_notification_up.png b/feature/systemui/noticeitem/src/main/resources/base/media/ic_notification_up.png similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/base/media/ic_notification_up.png rename to feature/systemui/noticeitem/src/main/resources/base/media/ic_notification_up.png diff --git a/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg b/feature/systemui/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg rename to feature/systemui/noticeitem/src/main/resources/base/media/ic_public_delete_body_filled.svg diff --git a/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg b/feature/systemui/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg rename to feature/systemui/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg diff --git a/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg b/feature/systemui/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg rename to feature/systemui/noticeitem/src/main/resources/base/media/ic_public_delete_lids_filled.svg diff --git a/systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg b/feature/systemui/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg rename to feature/systemui/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg diff --git a/systemui4merge/features/noticeitem/src/main/resources/base/media/send.svg b/feature/systemui/noticeitem/src/main/resources/base/media/send.svg similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/base/media/send.svg rename to feature/systemui/noticeitem/src/main/resources/base/media/send.svg diff --git a/systemui4merge/features/noticeitem/src/main/resources/en_US/element/string.json b/feature/systemui/noticeitem/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/en_US/element/string.json rename to feature/systemui/noticeitem/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/noticeitem/src/main/resources/phone/element/color.json b/feature/systemui/noticeitem/src/main/resources/phone/element/color.json similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/phone/element/color.json rename to feature/systemui/noticeitem/src/main/resources/phone/element/color.json diff --git a/systemui4merge/features/noticeitem/src/main/resources/phone/element/float.json b/feature/systemui/noticeitem/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/phone/element/float.json rename to feature/systemui/noticeitem/src/main/resources/phone/element/float.json diff --git a/systemui4merge/features/noticeitem/src/main/resources/rawfile/notificationConfig.json b/feature/systemui/noticeitem/src/main/resources/rawfile/notificationConfig.json similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/rawfile/notificationConfig.json rename to feature/systemui/noticeitem/src/main/resources/rawfile/notificationConfig.json diff --git a/systemui4merge/features/noticeitem/src/main/resources/zh_CN/element/string.json b/feature/systemui/noticeitem/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/noticeitem/src/main/resources/zh_CN/element/string.json rename to feature/systemui/noticeitem/src/main/resources/zh_CN/element/string.json diff --git a/systemui4merge/product/phone/dropdownpanel/.gitignore b/feature/systemui/phone/dropdownpanel/.gitignore similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/.gitignore rename to feature/systemui/phone/dropdownpanel/.gitignore diff --git a/systemui4merge/product/phone/dropdownpanel/build-profile.json5 b/feature/systemui/phone/dropdownpanel/build-profile.json5 similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/build-profile.json5 rename to feature/systemui/phone/dropdownpanel/build-profile.json5 diff --git a/systemui4merge/product/phone/dropdownpanel/hvigorfile.js b/feature/systemui/phone/dropdownpanel/hvigorfile.ts similarity index 92% rename from systemui4merge/product/phone/dropdownpanel/hvigorfile.js rename to feature/systemui/phone/dropdownpanel/hvigorfile.ts index fdb4fcea..922125d1 100644 --- a/systemui4merge/product/phone/dropdownpanel/hvigorfile.js +++ b/feature/systemui/phone/dropdownpanel/hvigorfile.ts @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/feature/systemui/phone/dropdownpanel/package-lock.json b/feature/systemui/phone/dropdownpanel/package-lock.json new file mode 100644 index 00000000..fc7a5fc2 --- /dev/null +++ b/feature/systemui/phone/dropdownpanel/package-lock.json @@ -0,0 +1,369 @@ +{ + "name": "@ohos/phone_dropdownpanel", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/airplanecomponent": { + "version": "file:../../airplanecomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/autorotatecomponent": { + "version": "file:../../autorotatecomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/batterycomponent": { + "version": "file:../../batterycomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/bluetoothcomponent": { + "version": "file:../../bluetoothcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/brightnesscomponent": { + "version": "file:../../brightnesscomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/clockcomponent": { + "version": "file:../../clockcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/common": { + "version": "file:../../../../common" + }, + "@ohos/controlcentercomponent": { + "version": "file:../../controlcentercomponent", + "requires": { + "@ohos/airplanecomponent": "file:../../airplanecomponent", + "@ohos/autorotatecomponent": "file:../../autorotatecomponent", + "@ohos/bluetoothcomponent": "file:../../bluetoothcomponent", + "@ohos/brightnesscomponent": "file:../../brightnesscomponent", + "@ohos/common": "file:../../../../common", + "@ohos/locationcomponent": "file:../../locationcomponent", + "@ohos/nfccomponent": "file:../../nfccomponent", + "@ohos/ringmodecomponent": "file:../../ringmodecomponent", + "@ohos/wificomponent": "file:../../wificomponent" + }, + "dependencies": { + "@ohos/airplanecomponent": { + "version": "file:../../airplanecomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/autorotatecomponent": { + "version": "file:../../autorotatecomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/bluetoothcomponent": { + "version": "file:../../bluetoothcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/brightnesscomponent": { + "version": "file:../../brightnesscomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/common": { + "version": "file:../../../../common" + }, + "@ohos/locationcomponent": { + "version": "file:../../locationcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/nfccomponent": { + "version": "file:../../nfccomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/ringmodecomponent": { + "version": "file:../../ringmodecomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/wificomponent": { + "version": "file:../../wificomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + } + } + }, + "@ohos/locationcomponent": { + "version": "file:../../locationcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/nfccomponent": { + "version": "file:../../nfccomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/noticeitem": { + "version": "file:../../noticeitem", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/ringmodecomponent": { + "version": "file:../../ringmodecomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/signalcomponent": { + "version": "file:../../signalcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/statusbarcomponent": { + "version": "file:../../statusbarcomponent", + "requires": { + "@ohos/batterycomponent": "file:../../batterycomponent", + "@ohos/bluetoothcomponent": "file:../../bluetoothcomponent", + "@ohos/capsulecomponent": "file:../../capsulecomponent", + "@ohos/clockcomponent": "file:../../clockcomponent", + "@ohos/common": "file:../../../../common", + "@ohos/locationcomponent": "file:../../locationcomponent", + "@ohos/nfccomponent": "file:../../nfccomponent", + "@ohos/ringmodecomponent": "file:../../ringmodecomponent", + "@ohos/signalcomponent": "file:../../signalcomponent", + "@ohos/wificomponent": "file:../../wificomponent" + }, + "dependencies": { + "@ohos/batterycomponent": { + "version": "file:../../batterycomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/bluetoothcomponent": { + "version": "file:../../bluetoothcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/capsulecomponent": { + "version": "file:../../capsulecomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/clockcomponent": { + "version": "file:../../clockcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/common": { + "version": "file:../../../../common" + }, + "@ohos/locationcomponent": { + "version": "file:../../locationcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/nfccomponent": { + "version": "file:../../nfccomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/ringmodecomponent": { + "version": "file:../../ringmodecomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/signalcomponent": { + "version": "file:../../signalcomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + }, + "@ohos/wificomponent": { + "version": "file:../../wificomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + } + } + }, + "@ohos/wificomponent": { + "version": "file:../../wificomponent", + "requires": { + "@ohos/common": "file:../../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../../common" + } + } + } + } +} diff --git a/feature/systemui/phone/dropdownpanel/package.json b/feature/systemui/phone/dropdownpanel/package.json new file mode 100644 index 00000000..6534c5b9 --- /dev/null +++ b/feature/systemui/phone/dropdownpanel/package.json @@ -0,0 +1,28 @@ +{ + "devDependencies": {}, + "name": "@ohos/phone_dropdownpanel", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "type": "module", + "dependencies": { + "@ohos/statusbarcomponent": "file:../../statusbarcomponent", + "@ohos/wificomponent": "file:../../wificomponent", + "@ohos/bluetoothcomponent": "file:../../bluetoothcomponent", + "@ohos/signalcomponent": "file:../../signalcomponent", + "@ohos/clockcomponent": "file:../../clockcomponent", + "@ohos/locationcomponent": "file:../../locationcomponent", + "@ohos/batterycomponent": "file:../../batterycomponent", + "@ohos/controlcentercomponent": "file:../../controlcentercomponent", + "@ohos/ringmodecomponent": "file:../../ringmodecomponent", + "@ohos/autorotatecomponent": "file:../../autorotatecomponent", + "@ohos/airplanecomponent": "file:../../airplanecomponent", + "@ohos/brightnesscomponent": "file:../../brightnesscomponent", + "@ohos/nfccomponent": "../../nfccomponent", + "@ohos/noticeitem": "file:../../noticeitem", + "@ohos/common": "../../../../common" + } +} diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets similarity index 76% rename from systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/index.ets rename to feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets index 76693ebb..d111a07e 100644 --- a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets @@ -14,36 +14,25 @@ * limitations under the License. */ -import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon' -import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon' -import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon' -import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent' -import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon' -import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' -import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' - -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import image from "@ohos.multimedia.image" -import Log from '../../../../../../../common/src/main/ets/default/Log' -import Trace from '../../../../../../../common/src/main/ets/default/Trace' +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import Trace from '@ohos/common/src/main/ets/default/Trace' import WindowManager, { WindowType, WINDOW_SHOW_HIDE_EVENT -} from '../../../../../../../common/src/main/ets/default/WindowManager' -import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/EventManager" -import { START_ABILITY_EVENT } from "../../../../../../../common/src/main/ets/default/event/EventUtil" -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager' -import MultimodalInputManager from '../../../../../../../common/src/main/ets/default/MultimodalInputManager' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' -import StatusBarVM from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' +} from '@ohos/common/src/main/ets/default/WindowManager' +import EventManager, { unsubscribe } from "@ohos/common/src/main/ets/default/event/EventManager" +import { START_ABILITY_EVENT } from "@ohos/common/src/main/ets/default/event/EventUtil" +import MultimodalInputManager from '@ohos/common/src/main/ets/default/MultimodalInputManager' +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' +import HeightConfigUtils from '@ohos/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' +import StatusBarVM from '@ohos/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' import NavigationEvent from './common/navigationEvent' import Notification from './notification' import ControlCenterComponent from './control' import StyleManager from './common/StyleManager' import dataShare from '@ohos.data.dataShare'; -import settings from '@ohos.settings'; -import Constants from "../../../../../../../common/src/main/ets/default/Constants"; +import Constants from "@ohos/common/src/main/ets/default/Constants"; -const TAG = 'DropdownPanel-Index' +const TAG = 'DropdownPanel' let mHeightConfigUtils @@ -70,9 +59,8 @@ class insertTemplate{ scale: Object } -@Entry @Component -struct Index { +export struct DropdownPanel { @State showComponentName: string = undefined; @State componentOptAreaHeightPX: number = 0; @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0; @@ -91,6 +79,7 @@ struct Index { @State mControlCenterDelete: insertTemplate = new insertTemplate(); @State componentOptAreaTranslateY: string = '0px'; @State backgroundOpacity: number = 0; + private moduleName: string = '' onBackPress(): boolean { return true @@ -100,13 +89,14 @@ struct Index { Log.showInfo(TAG, `aboutToAppear, start`); setAppBgColor('#00000000'); - CommonStyleManager.setAbilityPageName(TAG); StyleManager.setStyle(); + // TODO 导航栏 let dropdownRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect'); - let navigationBarRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); - this.initHelper(dropdownRect, navigationBarRect); - this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); + this.componentOptAreaHeightPX = dropdownRect.height; +// let navigationBarRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); +// this.initHelper(dropdownRect, navigationBarRect); +// this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); Log.showDebug(TAG, `getValueSync componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`); this.componentOptAreaTranslateY = (-this.componentOptAreaHeightPX * 0.1) + 'px'; @@ -167,12 +157,12 @@ struct Index { resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect) { Log.showDebug(TAG, `resizeDropdownPanelAndNavigationBar, dropdownRect: ${JSON.stringify(dropdownRect)} navigationBarRect: ${JSON.stringify(navigationBarRect)}`) - let context = AbilityManager.getContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL); - this.mNavigationBarStatusDefaultValue = settings.getValueSync(context, this.settingDataKey, '1'); - this.componentOptAreaHeightPX = this.mNavigationBarStatusDefaultValue == '1' ? dropdownRect.height - navigationBarRect.realHeight : dropdownRect.height; - this.navigationBarWidth = this.mNavigationBarStatusDefaultValue == '1' ? navigationBarRect.height : 0; - WindowManager.resetSizeWindow(WindowType.NAVIGATION_BAR, { ...navigationBarRect, height: this.navigationBarWidth }) - WindowManager.resetSizeWindow(WindowType.DROPDOWN_PANEL, { ...dropdownRect, height: this.componentOptAreaHeightPX }) +// let context = AbilityManager.getContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL); +// this.mNavigationBarStatusDefaultValue = settings.getValueSync(context, this.settingDataKey, '1'); +// this.componentOptAreaHeightPX = this.mNavigationBarStatusDefaultValue == '1' ? dropdownRect.height - navigationBarRect.realHeight : dropdownRect.height; +// this.navigationBarWidth = this.mNavigationBarStatusDefaultValue == '1' ? navigationBarRect.height : 0; +// WindowManager.resetSizeWindow(WindowType.NAVIGATION_BAR, { ...navigationBarRect, height: this.navigationBarWidth }) +// WindowManager.resetSizeWindow(WindowType.DROPDOWN_PANEL, { ...dropdownRect, height: this.componentOptAreaHeightPX }) } onNotificationShowOrHide(data) { @@ -257,7 +247,7 @@ struct Index { Trace.end(Trace.CORE_METHOD_START_TOUCHEVENT) Log.showDebug(TAG, `showSelf, showComponentName: ${showComponentName}`) this.showComponentName = showComponentName - WindowManager.showWindow(WindowType.DROPDOWN_PANEL) +// WindowManager.showWindow(WindowType.DROPDOWN_PANEL) this.componentOptAreaTranslateY = '0px' this.backgroundOpacity = 1 Trace.start(Trace.CORE_METHOD_START_DROPDOWNPANEL) @@ -268,7 +258,7 @@ struct Index { this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { Log.showInfo(TAG, `hideSelf, hide anim finish.`); this.showComponentName = undefined - WindowManager.hideWindow(WindowType.DROPDOWN_PANEL) +// WindowManager.hideWindow(WindowType.DROPDOWN_PANEL) } }, () => { this.componentOptAreaTranslateY = (-this.componentOptAreaHeightPX * 0.1) + 'px' this.backgroundOpacity = 0 @@ -301,7 +291,8 @@ struct Index { } else if (this.showComponentName == 'ControlCenter') { Column() { ControlCenterComponent({ - touchMoveCallback: (data) => this.onTouchMove(data) + touchMoveCallback: (data) => this.onTouchMove(data), + moduleName: this.moduleName }) } .width('100%') diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets new file mode 100644 index 00000000..718ea3d4 --- /dev/null +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets @@ -0,0 +1,87 @@ +//@ts-nocheck +/* + * Copyright (c) 2021-2022 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 AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import { DropdownPanel } from './DropdownPanel'; +import { BannerNotificationPanel } from './bannerNotification'; +import screenSessionManager from '@ohos.screenSessionManager'; + +const TAG = 'SCBDropdownPanel' + +@Component +export struct SCBDropdownPanel { + public bounds: screenSessionManager.RRect; + public moduleName: string = '' + @State showComponentName: string = undefined; + @State mBannerRect: Area = { + left: 0, + top: 0, + width: 0, + height: 0 + }; + + onBackPress(): boolean { + return true + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear, start`); + this.init(); + Log.showDebug(TAG, `aboutToAppear, end`); + } + + private init() { + AbilityManager.setContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, getContext(this)); + + let rect = { + left: 0, + top: 0, + width: vp2px(this.bounds.width), + height: vp2px(this.bounds.height), + }; + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect', rect); + + let bannerRect = { + left: 0, + top: vp2px(this.bounds.height) / 5, + width: vp2px(this.bounds.width), + height: vp2px(this.bounds.height) / 20 + }; + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); + this.mBannerRect = bannerRect; + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + build() { + Stack({ alignContent: Alignment.Top }) { + // dropdown panel + DropdownPanel({bounds : this.bounds, moduleName: this.moduleName}) + .hitTestBehavior(HitTestMode.Transparent) + + // BannerNotification + BannerNotificationPanel({bounds : this.bounds}) + .hitTestBehavior(HitTestMode.Transparent) + .width(this.mBannerRect.width + 'px') + .height(this.mBannerRect.height + 'px') + .position({x: this.mBannerRect.left + 'px', y: this.mBannerRect.top + 'px'}) + } + } +} diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets similarity index 86% rename from systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets rename to feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets index 96668ece..670d782b 100644 --- a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets @@ -13,14 +13,14 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import {notificationData} from '../../../../../../../common/src/main/ets/plugindatasource/common/Constants' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; -import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager"; -import BannerNotification from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem'; -import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel'; -import NotificationConstants, { ScreenLockStatus } from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import {notificationData} from '@ohos/common/src/main/ets/plugindatasource/common/Constants' +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import WindowManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowManager'; +import EventManager, {unsubscribe} from "@ohos/common/src/main/ets/default/event/EventManager"; +import BannerNotification from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem'; +import NotificationViewModel from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel'; +import NotificationConstants, { ScreenLockStatus } from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants'; const TAG = 'DropdownPanel-BannerNotification'; const TRANSLATE_SIZE = '382vp'; @@ -49,9 +49,8 @@ const OPACITY_HIDE_ANIM_CONFIG = { playMode: PlayMode.Normal, } -@Entry @Component -struct Index { +export struct BannerNotificationPanel { @State distributedDeviceName: string = ''; @State mBannerNoticeCnt: number = 0; @State mLastActionTime: number = 0; diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts similarity index 83% rename from systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts rename to feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts index 5164b7e9..f5163282 100644 --- a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts @@ -12,10 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; +import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; import { ControlCenterConfig -} from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/Constants'; -import {isNfcAvailable} from '../../../../../../../../common/src/main/ets/default/Constants'; +} from '@ohos/controlcentercomponent/src/main/ets/com/ohos/common/Constants'; +import {isNfcAvailable} from '@ohos/common/src/main/ets/default/Constants'; const controlCenterConfig: ControlCenterConfig = { ComplexToggleLayout: [FASlotName.WIFI, FASlotName.BLUETOOTH], diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts similarity index 96% rename from systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts rename to feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts index 3565c647..5295f337 100644 --- a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; import Constants from './constants'; import deviceInfo from '@ohos.deviceInfo'; diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts similarity index 94% rename from systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts rename to feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts index 4cb60bd1..c2d96cc3 100644 --- a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts @@ -12,12 +12,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/StyleConfiguration'; -import ControlCenterStyleConfiguration from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration'; -import BrightnessStyleConfiguration from '../../../../../../../../features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration'; -import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import CommonTemplateStyleConfiguration from '@ohos/common/src/main/ets/template/common/StyleConfiguration'; +import ControlCenterStyleConfiguration from '@ohos/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration'; +import BrightnessStyleConfiguration from '@ohos/brightnesscomponent/src/main/ets/default/common/StyleConfiguration'; +import RingModeStyleConfiguration from '@ohos/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration'; const TAG = 'DropdownPanel-StyleManager'; diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/constants.ts similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts rename to feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/constants.ts diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts similarity index 96% rename from systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts rename to feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts index fc205730..0bec80cc 100644 --- a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts @@ -14,7 +14,7 @@ */ import commonEvent from '@ohos.commonEvent'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'navigationEvent'; diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/control.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/control.ets similarity index 79% rename from systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/control.ets rename to feature/systemui/phone/dropdownpanel/src/main/ets/pages/control.ets index cf997991..4a88944f 100644 --- a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/control.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/control.ets @@ -13,18 +13,18 @@ * limitations under the License. */ -import {isNfcAvailable} from '../../../../../../../common/src/main/ets/default/Constants'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import ControlCenterComponent from '../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent' -import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon' -import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon' -import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon' -import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent' -import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon' -import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' -import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' -import NfcIcon from '../../../../../../../features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent' -import Log from '../../../../../../../common/src/main/ets/default/Log' +import {isNfcAvailable} from '@ohos/common/src/main/ets/default/Constants'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import ControlCenterComponent from '@ohos/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent' +import BatteryIcon from '@ohos/batterycomponent/src/main/ets/default/pages/batteryIcon' +import ClockIcon from '@ohos/clockcomponent/src/main/ets/default/pages/clockIcon' +import WifiIcon from '@ohos/wificomponent/src/main/ets/default/pages/wifiIcon' +import BluetoothIcon from '@ohos/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent' +import SignalIcon from '@ohos/signalcomponent/src/main/ets/default/pages/signalIcon' +import LocationIcon from '@ohos/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' +import RingModeIcon from '@ohos/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' +import NfcIcon from '@ohos/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants from './common/constants' import StyleConfiguration, { ControlStyle } from './common/StyleConfiguration' import ControlCenterConfig from './common/ControlCenterConfig'; @@ -39,6 +39,7 @@ export default struct Control { @State moveX: number = 0 @State moveY: number = 0 @State style: ControlStyle = StyleConfiguration.getControlStyle() + private moduleName: string = '' aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) @@ -69,7 +70,7 @@ export default struct Control { ControlCenterComponent({ touchMoveCallback: (data) => this.controlCenterTouchMoveCallback(data), mControlCenterComponentConfig: ControlCenterConfig, - moduleName: 'phone_dropdownpanel', + moduleName: this.moduleName, }) } .width('100%') diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets similarity index 84% rename from systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/notification.ets rename to feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets index b317ed51..c4ec132b 100644 --- a/systemui4merge/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -13,25 +13,25 @@ * limitations under the License. */ -import {isNfcAvailable} from '../../../../../../../common/src/main/ets/default/Constants'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/EventManager"; -import { obtainStartAbility } from "../../../../../../../common/src/main/ets/default/event/EventUtil"; +import {isNfcAvailable} from '@ohos/common/src/main/ets/default/Constants'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import EventManager, { unsubscribe } from "@ohos/common/src/main/ets/default/event/EventManager"; +import { obtainStartAbility } from "@ohos/common/src/main/ets/default/event/EventUtil"; import Constants from './common/constants'; -import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon'; -import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon'; -import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon'; -import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent'; -import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon'; -import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent'; -import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent'; -import NfcIcon from '../../../../../../../features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent'; -import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent'; -import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel'; -import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil'; +import BatteryIcon from '@ohos/batterycomponent/src/main/ets/default/pages/batteryIcon'; +import ClockIcon from '@ohos/clockcomponent/src/main/ets/default/pages/clockIcon'; +import WifiIcon from '@ohos/wificomponent/src/main/ets/default/pages/wifiIcon'; +import BluetoothIcon from '@ohos/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent'; +import SignalIcon from '@ohos/signalcomponent/src/main/ets/default/pages/signalIcon'; +import LocationIcon from '@ohos/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent'; +import RingModeIcon from '@ohos/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent'; +import NfcIcon from '@ohos/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent'; +import NotificationListComponent from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent'; +import NotificationViewModel from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel'; +import ResourceUtil from '@ohos/common/src/main/ets/default/ResourceUtil'; import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT -} from '../../../../../../../common/src/main/ets/default/TimeManager'; +} from '@ohos/common/src/main/ets/default/TimeManager'; import deviceInfo from '@ohos.deviceInfo'; const TAG = 'DropdownPanel-notification'; @@ -268,6 +268,7 @@ struct CenterTitle { settingClick() { Log.showDebug(TAG, ` settingClick `) + // TODO 修改为合一服务的Ability EventManager.publish(obtainStartAbility('com.ohos.systemui', 'com.ohos.systemui.notificationmanagement.MainAbility')) } diff --git a/feature/systemui/phone/dropdownpanel/src/main/module.json5 b/feature/systemui/phone/dropdownpanel/src/main/module.json5 new file mode 100644 index 00000000..cae87755 --- /dev/null +++ b/feature/systemui/phone/dropdownpanel/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "phone_dropdownpanel", + "type": "har", + "deviceTypes": [ + "default" + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/color.json b/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/color.json rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/element/color.json diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/float.json b/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/float.json rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/element/float.json diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json b/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/string.json similarity index 93% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/element/string.json index 17e54cbe..7f420f4a 100644 --- a/systemui4merge/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json +++ b/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/string.json @@ -1,9 +1,5 @@ { "string": [ - { - "name": "app_name", - "value": "SystemUI" - }, { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" @@ -96,10 +92,6 @@ "name": "nav_bar_position_portrait", "value": "4" }, - { - "name": "status_bar_size_portrait", - "value": "48" - }, { "name": "nav_bar_size_portrait", "value": "36" diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/airplane.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/airplane.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/airplane.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/airplane.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/delete_all.png b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/delete_all.png similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/delete_all.png rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/delete_all.png diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/icon.png b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/icon.png rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/icon.png diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/wifi.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/wifi.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/wifi.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/wifi.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg b/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/media/wifi_d.svg diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json b/feature/systemui/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json rename to feature/systemui/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json b/feature/systemui/phone/dropdownpanel/src/main/resources/en_US/element/string.json similarity index 93% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json rename to feature/systemui/phone/dropdownpanel/src/main/resources/en_US/element/string.json index 1e720c97..aaf028b4 100644 --- a/systemui4merge/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json +++ b/feature/systemui/phone/dropdownpanel/src/main/resources/en_US/element/string.json @@ -1,9 +1,5 @@ { "string": [ - { - "name": "app_name", - "value": "SystemUI" - }, { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" @@ -96,10 +92,6 @@ "name": "nav_bar_position_portrait", "value": "4" }, - { - "name": "status_bar_size_portrait", - "value": "48" - }, { "name": "nav_bar_size_portrait", "value": "36" diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/phone/element/float.json b/feature/systemui/phone/dropdownpanel/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/phone/element/float.json rename to feature/systemui/phone/dropdownpanel/src/main/resources/phone/element/float.json diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png b/feature/systemui/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png similarity index 100% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png rename to feature/systemui/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/string.json b/feature/systemui/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json similarity index 93% rename from systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/string.json rename to feature/systemui/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json index 17e54cbe..7f420f4a 100644 --- a/systemui4merge/product/phone/dropdownpanel/src/main/resources/base/element/string.json +++ b/feature/systemui/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json @@ -1,9 +1,5 @@ { "string": [ - { - "name": "app_name", - "value": "SystemUI" - }, { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" @@ -96,10 +92,6 @@ "name": "nav_bar_position_portrait", "value": "4" }, - { - "name": "status_bar_size_portrait", - "value": "48" - }, { "name": "nav_bar_size_portrait", "value": "36" diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/SCBStatusBar.ets b/feature/systemui/phone/statusbar/src/main/ets/pages/SCBStatusBar.ets new file mode 100644 index 00000000..1ffa688e --- /dev/null +++ b/feature/systemui/phone/statusbar/src/main/ets/pages/SCBStatusBar.ets @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2023 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 { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { Rect as Area } from '@ohos/common/src/main/ets/default/Constants' +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBarConfiguration from '@ohos/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; +import screenSessionManager from '@ohos.screenSessionManager' +import deviceInfo from '@ohos.deviceInfo'; +import { StatusBar } from './StatusBar' + +const TAG = "SCBStatusBar"; + +const context = getContext(this) as Context +const deviceTypeInfo = deviceInfo.deviceType; + +@Component +export struct SCBStatusBar { + public bounds: screenSessionManager.RRect + public moduleName: string = '' + private screenDirection :number; + @State mStatusBarRect: Area = { + left: 0, + top: 0, + width: 0, + height: 0 + } + @State mHasInit: boolean = false + + onBackPress(): boolean { + return true; + } + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear, start, ${this.bounds.width}, ${this.bounds.height}`); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, context); + this.initConfiguration(); + Log.showInfo(TAG, `aboutToAppear, end`); + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`); + } + + build() { + if (this.mHasInit) { + StatusBar({moduleName: this.moduleName}) + .width('100%') + .height(this.mStatusBarRect.height + 'px') + .position({x:this.mStatusBarRect.left, y:this.mStatusBarRect.top}) + } + } + + async initConfiguration() { + let configInfo = await StatusBarConfiguration.getConfiguration(this.bounds); + this.screenDirection = configInfo.direction; + let screenFactor; + if (deviceTypeInfo === 'phone') { + screenFactor = this.screenDirection === 1 ? 1188 : 540; + } else { + screenFactor = this.screenDirection === 1 ? 640 : 360; + } + if (configInfo.showHorizontal) { + if (configInfo.realHeight == 0) { + Log.showInfo(TAG, `hide statusbar`); + } else { + configInfo.realHeight = (configInfo.realHeight * configInfo.maxWidth) / screenFactor; + } + configInfo.minHeight = configInfo.realHeight; + if (configInfo.yCoordinate > 0) { + configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; + } + } else { + if (configInfo.realWidth == 0) { + Log.showInfo(TAG, `hide statusbar`); + } else { + configInfo.realWidth = (configInfo.realWidth * configInfo.maxWidth) / screenFactor; + } + configInfo.minHeight = configInfo.realWidth; + if (configInfo.xCoordinate > 0) { + configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth; + } + } + + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo); + Log.showInfo(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); + + let statusBarRect = { + left: configInfo.xCoordinate, + top: configInfo.yCoordinate, + width: configInfo.realWidth, + height: configInfo.realHeight + }; + this.mStatusBarRect = statusBarRect; + this.mHasInit = true; + } +} \ No newline at end of file diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets b/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets index 1d2c3c8f..132526e5 100644 --- a/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets +++ b/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets @@ -14,11 +14,9 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import StatusBarConfiguration from '@ohos/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; import EventManager, {unsubscribe} from "@ohos/common/src/main/ets/default/event/EventManager" import {obtainLocalEvent} from "@ohos/common/src/main/ets/default/event/EventUtil" -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager' import HeightConfigUtils from '@ohos/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' import StatusBarComponent from '@ohos/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' import StatusBarVM from '@ohos/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' @@ -27,8 +25,6 @@ import Constants from './common/constants' import StyleManager from './common/StyleManager' import StatusbarConfig from './common/StatusbarConfig' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' -import screenSessionManager from '@ohos.screenSessionManager' -import deviceInfo from '@ohos.deviceInfo'; import Trace from '@ohos/common/src/main/ets/default/Trace' import WindowManager, {WindowType, WINDOW_SHOW_HIDE_EVENT } from '@ohos/common/src/main/ets/default/WindowManager' @@ -38,13 +34,9 @@ const SLIDING_STATUS_BAR_DISTANCE = 18 let mHeightConfigUtils; -const context = getContext(this) as Context -const deviceTypeInfo = deviceInfo.deviceType; - @Component export struct StatusBar { - bounds: screenSessionManager.RRect - private screenDirection :number; + public moduleName: string = '' startX: number = 0 startY: number = 0 @State moveX: number = 0 @@ -53,30 +45,16 @@ export struct StatusBar { @StorageLink('StatusMinH') StatusMinH: number = 24 @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 mClearCallback: unsubscribe | undefined - mHasInit: boolean = false - mStatusBarRect = { - left: 0, - top: 0, - width: 0, - height: 0 - }; onBackPress(): boolean { return true; } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, start, ${this.bounds.width}, ${this.bounds.height}`); - this.updateData(); - - Log.showInfo(TAG, `aboutToAppear, end`); - } - - async updateData() { - await this.updateStatusBarData(); + Log.showInfo(TAG, `aboutToAppear, start`); + this.updateStatusBarData(); setAppBgColor('#00000000'); - CommonStyleManager.setAbilityPageName(TAG); StyleManager.setStyle(); this.mClearCallback = EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => this.onWindowShowHideEvent(args)); @@ -107,7 +85,7 @@ export struct StatusBar { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { StatusBarComponent({ mStatusBarComponentConfig: StatusbarConfig, - moduleName: 'phone_statusbar' + moduleName: this.moduleName }) } .width('100%') @@ -115,22 +93,15 @@ export struct StatusBar { .onTouch(this.touchEvent.bind(this)) } .width('100%') - .height(this.mStatusBarRect.height) + .height('100%') .constraintSize({ minHeight: this.StatusMinH }) - .position({x:this.mStatusBarRect.left, y:this.mStatusBarRect.top}) .onAreaChange((e, e2) => { Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); this.updateStatusBarData(); }) } - async updateStatusBarData() { - if (!this.mHasInit) { - Log.showInfo(TAG, "updateStatusBarData init") - AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, context); - await this.initConfiguration(); - this.mHasInit = true; - } + updateStatusBarData() { let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); let statusBarData: StatusBarData = new StatusBarData(); statusBarData.displayWidth = configInfo.maxWidth; @@ -199,45 +170,4 @@ export struct StatusBar { // } // } } - - async initConfiguration() { - let configInfo = await StatusBarConfiguration.getConfiguration(this.bounds); - this.screenDirection = configInfo.direction; - let screenFactor; - if (deviceTypeInfo === 'phone') { - screenFactor = this.screenDirection === 1 ? 1188 : 540; - } else { - screenFactor = this.screenDirection === 1 ? 640 : 360; - } - if (configInfo.showHorizontal) { - if (configInfo.realHeight == 0) { - Log.showInfo(TAG, `hide statusbar`); - } else { - configInfo.realHeight = (configInfo.realHeight * configInfo.maxWidth) / screenFactor; - } - configInfo.minHeight = configInfo.realHeight; - if (configInfo.yCoordinate > 0) { - configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; - } - } else { - if (configInfo.realWidth == 0) { - Log.showInfo(TAG, `hide statusbar`); - } else { - configInfo.realWidth = (configInfo.realWidth * configInfo.maxWidth) / screenFactor; - } - configInfo.minHeight = configInfo.realWidth; - if (configInfo.xCoordinate > 0) { - configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth; - } - } - - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo); - Log.showInfo(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); - - this.mStatusBarRect.left = configInfo.xCoordinate; - this.mStatusBarRect.top = configInfo.yCoordinate; - this.mStatusBarRect.width = configInfo.realWidth; - this.mStatusBarRect.height = configInfo.realHeight; - Log.showInfo(TAG, `createNewWindow, mStatusBarRect: ${JSON.stringify(this.mStatusBarRect)}`); - } } \ No newline at end of file diff --git a/feature/systemui/phone/statusbar/src/main/resources/base/element/string.json b/feature/systemui/phone/statusbar/src/main/resources/base/element/string.json index c7195795..4d06d0d7 100644 --- a/feature/systemui/phone/statusbar/src/main/resources/base/element/string.json +++ b/feature/systemui/phone/statusbar/src/main/resources/base/element/string.json @@ -24,10 +24,6 @@ "name": "status_bar_position_portrait", "value": "2" }, - { - "name": "app_name", - "value": "SystemUI" - }, { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" diff --git a/feature/systemui/phone/statusbar/src/main/resources/en_US/element/string.json b/feature/systemui/phone/statusbar/src/main/resources/en_US/element/string.json index 99a6772d..7da82deb 100644 --- a/feature/systemui/phone/statusbar/src/main/resources/en_US/element/string.json +++ b/feature/systemui/phone/statusbar/src/main/resources/en_US/element/string.json @@ -8,10 +8,6 @@ "name": "status_bar_position_portrait", "value": "2" }, - { - "name": "app_name", - "value": "SystemUI" - }, { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" diff --git a/feature/systemui/phone/statusbar/src/main/resources/zh_CN/element/string.json b/feature/systemui/phone/statusbar/src/main/resources/zh_CN/element/string.json index 44632af9..8edb6a13 100644 --- a/feature/systemui/phone/statusbar/src/main/resources/zh_CN/element/string.json +++ b/feature/systemui/phone/statusbar/src/main/resources/zh_CN/element/string.json @@ -8,10 +8,6 @@ "name": "status_bar_position_portrait", "value": "2" }, - { - "name": "app_name", - "value": "SystemUI" - }, { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index 00312cf1..9bb79edd 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -50,8 +50,8 @@ class StatusBarConfiguration { Log.showInfo(TAG, 'initWindowManager'); minHeight = 0; - maxWidth = bounds.width; - maxHeight = bounds.height; + maxWidth = vp2px(bounds.width); + maxHeight = vp2px(bounds.height); } async getDirectionAndPosition() { diff --git a/product/phone/package-lock.json b/product/phone/package-lock.json index a06f4619..c0cf25d9 100644 --- a/product/phone/package-lock.json +++ b/product/phone/package-lock.json @@ -86,16 +86,257 @@ } } }, - "@ohos/phone_statusbar": { - "version": "file:../../feature/systemui/phone/statusbar", + "@ohos/phone_dropdownpanel": { + "version": "file:../../feature/systemui/phone/dropdownpanel", "requires": { + "@ohos/airplanecomponent": "file:../../feature/systemui/airplanecomponent", + "@ohos/autorotatecomponent": "file:../../feature/systemui/autorotatecomponent", + "@ohos/batterycomponent": "file:../../feature/systemui/batterycomponent", + "@ohos/bluetoothcomponent": "file:../../feature/systemui/bluetoothcomponent", + "@ohos/brightnesscomponent": "file:../../feature/systemui/brightnesscomponent", + "@ohos/clockcomponent": "file:../../feature/systemui/clockcomponent", "@ohos/common": "file:../../common", - "@ohos/statusbarcomponent": "file:../../feature/systemui/statusbarcomponent" + "@ohos/controlcentercomponent": "file:../../feature/systemui/controlcentercomponent", + "@ohos/locationcomponent": "file:../../feature/systemui/locationcomponent", + "@ohos/nfccomponent": "file:../../feature/systemui/nfccomponent", + "@ohos/noticeitem": "file:../../feature/systemui/noticeitem", + "@ohos/ringmodecomponent": "file:../../feature/systemui/ringmodecomponent", + "@ohos/signalcomponent": "file:../../feature/systemui/signalcomponent", + "@ohos/statusbarcomponent": "file:../../feature/systemui/statusbarcomponent", + "@ohos/wificomponent": "file:../../feature/systemui/wificomponent" }, "dependencies": { + "@ohos/airplanecomponent": { + "version": "file:../../feature/systemui/airplanecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/autorotatecomponent": { + "version": "file:../../feature/systemui/autorotatecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/batterycomponent": { + "version": "file:../../feature/systemui/batterycomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/bluetoothcomponent": { + "version": "file:../../feature/systemui/bluetoothcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/brightnesscomponent": { + "version": "file:../../feature/systemui/brightnesscomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/clockcomponent": { + "version": "file:../../feature/systemui/clockcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, "@ohos/common": { "version": "file:../../common" }, + "@ohos/controlcentercomponent": { + "version": "file:../../feature/systemui/controlcentercomponent", + "requires": { + "@ohos/airplanecomponent": "file:../../feature/systemui/airplanecomponent", + "@ohos/autorotatecomponent": "file:../../feature/systemui/autorotatecomponent", + "@ohos/bluetoothcomponent": "file:../../feature/systemui/bluetoothcomponent", + "@ohos/brightnesscomponent": "file:../../feature/systemui/brightnesscomponent", + "@ohos/common": "file:../../common", + "@ohos/locationcomponent": "file:../../feature/systemui/locationcomponent", + "@ohos/nfccomponent": "file:../../feature/systemui/nfccomponent", + "@ohos/ringmodecomponent": "file:../../feature/systemui/ringmodecomponent", + "@ohos/wificomponent": "file:../../feature/systemui/wificomponent" + }, + "dependencies": { + "@ohos/airplanecomponent": { + "version": "file:../../feature/systemui/airplanecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/autorotatecomponent": { + "version": "file:../../feature/systemui/autorotatecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/bluetoothcomponent": { + "version": "file:../../feature/systemui/bluetoothcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/brightnesscomponent": { + "version": "file:../../feature/systemui/brightnesscomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/common": { + "version": "file:../../common" + }, + "@ohos/locationcomponent": { + "version": "file:../../feature/systemui/locationcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/nfccomponent": { + "version": "file:../../feature/systemui/nfccomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/ringmodecomponent": { + "version": "file:../../feature/systemui/ringmodecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/wificomponent": { + "version": "file:../../feature/systemui/wificomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + } + } + }, + "@ohos/locationcomponent": { + "version": "file:../../feature/systemui/locationcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/nfccomponent": { + "version": "file:../../feature/systemui/nfccomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/noticeitem": { + "version": "file:../../feature/systemui/noticeitem", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/ringmodecomponent": { + "version": "file:../../feature/systemui/ringmodecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/signalcomponent": { + "version": "file:../../feature/systemui/signalcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, "@ohos/statusbarcomponent": { "version": "file:../../feature/systemui/statusbarcomponent", "requires": { @@ -214,6 +455,112 @@ } } } + }, + "@ohos/wificomponent": { + "version": "file:../../feature/systemui/wificomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + } + } + }, + "@ohos/phone_statusbar": { + "version": "file:../../feature/systemui/phone/statusbar", + "requires": { + "@ohos/common": "file:../../common", + "@ohos/statusbarcomponent": "file:../../feature/systemui/statusbarcomponent" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + }, + "@ohos/statusbarcomponent": { + "version": "file:../../feature/systemui/statusbarcomponent", + "requires": { + "@ohos/batterycomponent": "file:../../feature/systemui/batterycomponent", + "@ohos/bluetoothcomponent": "file:../../feature/systemui/bluetoothcomponent", + "@ohos/capsulecomponent": "file:../../feature/systemui/capsulecomponent", + "@ohos/clockcomponent": "file:../../feature/systemui/clockcomponent", + "@ohos/common": "file:../../common", + "@ohos/locationcomponent": "file:../../feature/systemui/locationcomponent", + "@ohos/nfccomponent": "file:../../feature/systemui/nfccomponent", + "@ohos/ringmodecomponent": "file:../../feature/systemui/ringmodecomponent", + "@ohos/signalcomponent": "file:../../feature/systemui/signalcomponent", + "@ohos/wificomponent": "file:../../feature/systemui/wificomponent" + }, + "dependencies": { + "@ohos/batterycomponent": { + "version": "file:../../feature/systemui/batterycomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": {} + }, + "@ohos/bluetoothcomponent": { + "version": "file:../../feature/systemui/bluetoothcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": {} + }, + "@ohos/capsulecomponent": { + "version": "file:../../feature/systemui/capsulecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": {} + }, + "@ohos/clockcomponent": { + "version": "file:../../feature/systemui/clockcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": {} + }, + "@ohos/common": { + "version": "file:../../common" + }, + "@ohos/locationcomponent": { + "version": "file:../../feature/systemui/locationcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": {} + }, + "@ohos/nfccomponent": { + "version": "file:../../feature/systemui/nfccomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": {} + }, + "@ohos/ringmodecomponent": { + "version": "file:../../feature/systemui/ringmodecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": {} + }, + "@ohos/signalcomponent": { + "version": "file:../../feature/systemui/signalcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": {} + }, + "@ohos/wificomponent": { + "version": "file:../../feature/systemui/wificomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": {} + } + } } } }, diff --git a/product/phone/package.json b/product/phone/package.json index b83ca4ab..a8647ce4 100644 --- a/product/phone/package.json +++ b/product/phone/package.json @@ -16,6 +16,7 @@ "@ohos/gesturenavigation": "../../feature/gesturenavigation", "@ohos/common": "../../common", "@ohos/numbadge": "../../feature/numbadge", - "@ohos/phone_statusbar": "../../feature/systemui/phone/statusbar" + "@ohos/phone_statusbar": "../../feature/systemui/phone/statusbar", + "@ohos/phone_dropdownpanel": "../../feature/systemui/phone/dropdownpanel" } } diff --git a/product/phone/src/main/ets/WindowScene/HWSystemUi.ets b/product/phone/src/main/ets/WindowScene/HWSystemUi.ets index a5344438..dc75c7c6 100644 --- a/product/phone/src/main/ets/WindowScene/HWSystemUi.ets +++ b/product/phone/src/main/ets/WindowScene/HWSystemUi.ets @@ -1,3 +1,4 @@ +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; /* * Copyright (c) 2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,14 +15,17 @@ */ import { Log } from '@ohos/common'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager' import screenSessionManager from '@ohos.screenSessionManager'; -import { StatusBar } from '@ohos/phone_statusbar/src/main/ets/pages/StatusBar' +import { SCBStatusBar } from '@ohos/phone_statusbar/src/main/ets/pages/SCBStatusBar'; +import { SCBDropdownPanel } from '@ohos/phone_dropdownpanel/src/main/ets/pages/SCBDropdownPanel'; const TAG = "HWSystemUi"; +const MODULE_NAME = "phone-launcher"; @Component export struct HWSystemUi { - bounds: screenSessionManager.RRect + public bounds: screenSessionManager.RRect onBackPress(): boolean { return true; @@ -29,6 +33,8 @@ export struct HWSystemUi { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, ${this.bounds.width}, ${this.bounds.height}`); + // 原来在StatusBar/DropdownPanel等处setAbilityPageName会相互覆盖,导致Style不对 + CommonStyleManager.setAbilityPageName(TAG) } aboutToDisappear() { @@ -38,9 +44,11 @@ export struct HWSystemUi { build() { Stack() { // status bar - StatusBar({bounds : this.bounds}) + SCBStatusBar({bounds : this.bounds, moduleName: MODULE_NAME}) // dropdown panel + SCBDropdownPanel({bounds : this.bounds, moduleName: MODULE_NAME}) + .hitTestBehavior(HitTestMode.Transparent) // volume } diff --git a/feature/systemui/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/src/main/ets/workers/PluginDataSourceWorker.js similarity index 100% rename from feature/systemui/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js rename to product/phone/src/main/ets/workers/PluginDataSourceWorker.js diff --git a/systemui4merge/features/airplanecomponent/package.json b/systemui4merge/features/airplanecomponent/package.json deleted file mode 100644 index eae474c6..00000000 --- a/systemui4merge/features/airplanecomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/airplanecomponent", - "description":"a npm package which contains airplanecomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/autorotatecomponent/package.json b/systemui4merge/features/autorotatecomponent/package.json deleted file mode 100644 index 1c5591a1..00000000 --- a/systemui4merge/features/autorotatecomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/autorotatecomponent", - "description":"a npm package which contains autorotatecomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/brightnesscomponent/package.json b/systemui4merge/features/brightnesscomponent/package.json deleted file mode 100644 index dfaa14c2..00000000 --- a/systemui4merge/features/brightnesscomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/brightnesscomponent", - "description":"a npm package which contains brightnesscomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/controlcentercomponent/package-lock.json b/systemui4merge/features/controlcentercomponent/package-lock.json deleted file mode 100644 index f4aaeced..00000000 --- a/systemui4merge/features/controlcentercomponent/package-lock.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "@ohos/controlcentercomponent", - "version": "1.0.0", - "lockfileVersion": 1 -} diff --git a/systemui4merge/features/controlcentercomponent/package.json b/systemui4merge/features/controlcentercomponent/package.json deleted file mode 100644 index 079721df..00000000 --- a/systemui4merge/features/controlcentercomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/controlcentercomponent", - "description":"a npm package which contains controlcentercomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/features/noticeitem/package-lock.json b/systemui4merge/features/noticeitem/package-lock.json deleted file mode 100644 index 331b59a0..00000000 --- a/systemui4merge/features/noticeitem/package-lock.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "@ohos/noticeitem", - "version": "1.0.0", - "lockfileVersion": 1 -} diff --git a/systemui4merge/features/noticeitem/package.json b/systemui4merge/features/noticeitem/package.json deleted file mode 100644 index 5bbbd9d6..00000000 --- a/systemui4merge/features/noticeitem/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/noticeitem", - "description":"a npm package which contains noticeitem function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/product/phone/dropdownpanel/package-lock.json b/systemui4merge/product/phone/dropdownpanel/package-lock.json deleted file mode 100644 index f472344d..00000000 --- a/systemui4merge/product/phone/dropdownpanel/package-lock.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "phone_dropdownpanel", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@ohos/autorotatecomponent": { - "version": "file:../../../features/autorotatecomponent" - }, - "@ohos/batterycomponent": { - "version": "file:../../../features/batterycomponent" - }, - "@ohos/bluetoothcomponent": { - "version": "file:../../../features/bluetoothcomponent" - }, - "@ohos/clockcomponent": { - "version": "file:../../../features/clockcomponent" - }, - "@ohos/controlcentercomponent": { - "version": "file:../../../features/controlcentercomponent" - }, - "@ohos/locationcomponent": { - "version": "file:../../../features/locationcomponent" - }, - "@ohos/noticeitem": { - "version": "file:../../../features/noticeitem" - }, - "@ohos/ringmodecomponent": { - "version": "file:../../../features/ringmodecomponent" - }, - "@ohos/signalcomponent": { - "version": "file:../../../features/signalcomponent" - }, - "@ohos/statusbarcomponent": { - "version": "file:../../../features/statusbarcomponent" - }, - "@ohos/wificomponent": { - "version": "file:../../../features/wificomponent" - } - } -} diff --git a/systemui4merge/product/phone/dropdownpanel/package.json b/systemui4merge/product/phone/dropdownpanel/package.json deleted file mode 100644 index 57fb14b7..00000000 --- a/systemui4merge/product/phone/dropdownpanel/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "devDependencies":{}, - "name":"phone_dropdownpanel", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{ - "@ohos/statusbarcomponent":"file:../../../features/statusbarcomponent", - "@ohos/wificomponent":"file:../../../features/wificomponent", - "@ohos/bluetoothcomponent":"file:../../../features/bluetoothcomponent", - "@ohos/signalcomponent":"file:../../../features/signalcomponent", - "@ohos/clockcomponent":"file:../../../features/clockcomponent", - "@ohos/locationcomponent":"file:../../../features/locationcomponent", - "@ohos/batterycomponent":"file:../../../features/batterycomponent", - "@ohos/controlcentercomponent":"file:../../../features/controlcentercomponent", - "@ohos/ringmodecomponent":"file:../../../features/ringmodecomponent", - "@ohos/autorotatecomponent":"file:../../../features/autorotatecomponent", - "@ohos/noticeitem":"file:../../../features/noticeitem" - } -} \ No newline at end of file diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts b/systemui4merge/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts deleted file mode 100644 index f373142a..00000000 --- a/systemui4merge/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import AbilityStage from '@ohos.app.ability.AbilityStage'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; - -const TAG = 'DropdownPanel_AbilityStage'; - -export default class MainAbilityStage extends AbilityStage { - onCreate(): void { - Log.showInfo(TAG, 'onCreate'); - } -} \ No newline at end of file diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/systemui4merge/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts deleted file mode 100644 index 4d86ce41..00000000 --- a/systemui4merge/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; -import display from '@ohos.display'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import NavBarConfiguration from '../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration'; -import { Want } from 'ability/want'; - - -const TAG = 'DropdownPanel_ServiceExtAbility'; - -class ServiceExtAbility extends ServiceExtension { - async onCreate(want: Want): Promise { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, this.context); - let defaultConfigInfo = await NavBarConfiguration.getConfiguration(); - let configInfo = NavBarConfiguration.setCustomConfiguration(defaultConfigInfo); - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config', configInfo); - Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); - globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT] = want; - - display.getDefaultDisplay().then((dis) => { - let rect = { - left: 0, - top: 0, - width: dis.width, - height: dis.height, - }; - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect', rect); - WindowManager.createWindow(this.context, WindowType.DROPDOWN_PANEL, rect, 'pages/index').then( (win) => { - win.setLayoutFullScreen(true); - Log.showInfo(TAG, 'onCreate, createWindow callback'); - }).catch((err) => { - }); - - let bannerRect = { - left: 0, - top: dis.height / 5, - width: dis.width, - height: dis.height / 20 - }; - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); - WindowManager.createWindow(this.context, WindowType.BANNER_NOTICE, bannerRect, 'pages/bannerNotification') - .then((win) => { - Log.showInfo(TAG, 'onCreate, createWindow callback'); - }) - .catch((err) => Log.showError(TAG, `Can't create window, err:${JSON.stringify(err)}`)); - }).then(() => { - }).catch((err) => { - }); - } - - onDestroy(): void { - Log.showInfo(TAG, 'onDestroy'); - } -} - -export default ServiceExtAbility; diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js b/systemui4merge/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js deleted file mode 100644 index c44b85c0..00000000 --- a/systemui4merge/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 worker from '@ohos.worker'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceManager'; -import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; - -const parentPort = worker.parentPort; -const TAG = `${parentPort.name} Worker`; -Log.showInfo(TAG, 'Start.'); - -var sManager; - -parentPort.onmessage = (msg) => { - Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); - let data = msg.data; - switch (data.action) { - case Constants.INIT_CONFIG: - initConfig(data.data); - break; - case Constants.CLEAR_ALL: - clearAll(); - break; - case Constants.LOAD_DATA: - loadData(data.data); - break; - case Constants.UPDATE_PLUGIN_COMPONENT_DATA: - updatePluginComponentData(data.data); - break; - default: - Log.showError(TAG, 'onMessage, unknown action type.'); - } -}; - -function initConfig(config) { - Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); - sManager = new PluginDataSourceManager({ - onItemAdd: (itemData) => { - Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); - itemData.label && (itemData.label = encodeURIComponent(itemData.label)); - parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); - }, - onItemRemove: (itemData) => { - Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); - parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); - }, - onLoadPluginComponentData: (itemData) => { - Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); - parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); - }, - }); - sManager.initDataSource(config); - parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); -} - -function clearAll() { - Log.showDebug(TAG, 'clearAll '); - sManager?.clearAll(); -} - -function loadData(userId) { - Log.showDebug(TAG, 'loadData '); - sManager?.loadData(userId); -} - -function updatePluginComponentData(pluginComponentData) { - Log.showDebug(TAG, 'updatePluginComponentData '); - sManager?.updatePluginComponentData(pluginComponentData); -} - -parentPort.onclose = function () { - Log.showDebug(TAG, 'onclose'); -}; - -parentPort.onmessageerror = function () { - Log.showError(TAG, 'onmessageerror'); -}; - -parentPort.onerror = function (data) { - Log.showError( - TAG, - `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` - ); -}; \ No newline at end of file diff --git a/systemui4merge/product/phone/dropdownpanel/src/main/module.json5 b/systemui4merge/product/phone/dropdownpanel/src/main/module.json5 deleted file mode 100644 index f3ad86fe..00000000 --- a/systemui4merge/product/phone/dropdownpanel/src/main/module.json5 +++ /dev/null @@ -1,33 +0,0 @@ -{ - "module": { - "name": "phone_dropdownpanel", - "type": "feature", - "srcEntrance": "./ets/Application/AbilityStage.ts", - "description": "$string:mainability_description", - "mainElement": "com.ohos.systemui.dropdownpanel.ServiceExtAbility", - "deviceTypes": [ - "default" - ], - "metadata": [ - { - "name": "ArkTSPartialUpdate", - "value": "true" - } - ], - "deliveryWithInstall": true, - "installationFree": false, - "uiSyntax": "ets", - "pages": "$profile:main_pages", - "extensionAbilities": [ - { - "visible": true, - "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", - "name": "com.ohos.systemui.dropdownpanel.ServiceExtAbility", - "icon": "$media:icon", - "description": "$string:mainability_description", - "label": "$string:app_name", - "type": "service" - } - ] - } -} \ No newline at end of file -- Gitee From 3a4fb00b71c7c13d2e543d6fc4b4648f878031b4 Mon Sep 17 00:00:00 2001 From: sunhaiyang Date: Wed, 29 Mar 2023 16:31:17 +0800 Subject: [PATCH 351/373] =?UTF-8?q?=E5=90=88=E4=B8=80=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=9F=B3=E9=87=8F=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-profile.json5 | 24 ++++++ .../systemui/volumepanel}/build-profile.json5 | 0 .../systemui/volumepanel/hvigorfile.ts | 0 .../systemui/volumepanel/package-lock.json | 22 +++++ feature/systemui/volumepanel/package.json | 15 ++++ .../src/main/ets/common/StyleConfiguration.ts | 2 +- .../src/main/ets/common/StyleManager.ts | 6 +- .../src/main/ets/common/constants.ts | 0 .../src/main/ets/pages/SCBVolumePanel.ets | 66 +++++++++++--- .../volumepanel/src/main/module.json5 | 10 +++ .../main/resources/base}/element/string.json | 4 - .../src/main/resources/base/media/icon.png | Bin .../resources/base/profile/main_pages.json | 0 .../main/resources/en_US}/element/string.json | 4 - .../main/resources/zh_CN}/element/string.json | 4 - .../volumepanelcomponent}/build-profile.json5 | 0 .../volumepanelcomponent/hvigorfile.ts | 2 +- .../volumepanelcomponent}/package-lock.json | 6 +- .../volumepanelcomponent/package.json | 15 ++++ .../src/main/ets/com/ohos/common/Constants.ts | 0 .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../com/ohos/common/VolumeWindowController.ts | 6 +- .../ets/com/ohos/model/VolumePanelService.ts | 4 +- .../com/ohos/pages/VolumePanelComponent.ets | 4 +- .../ets/com/ohos/viewmodel/VolumePanelVM.ts | 2 +- .../src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../resources/base/media/ic_public_mute.svg | 0 .../base/media/ic_public_settings.svg | 0 .../base/media/ic_public_sound_01.svg | 0 .../base/media/ic_public_sound_02.svg | 0 .../base/media/ic_public_sound_03.svg | 0 .../base/media/ic_public_sound_04.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/color.json | 0 .../main/resources/phone/element/float.json | 0 .../main/resources/zh_CN/element/string.json | 0 product/phone/package-lock.json | 23 +++++ product/phone/package.json | 3 +- .../src/main/ets/WindowScene/HWSystemUi.ets | 2 + .../volumepanelcomponent/package-lock.json | 5 -- .../volumepanelcomponent/package.json | 12 --- .../product/default/volumepanel/package.json | 13 --- .../src/main/ets/Application/AbilityStage.ts | 26 ------ .../ServiceExtAbility/ServiceExtAbility.ts | 81 ------------------ .../default/volumepanel/src/main/module.json5 | 34 -------- 49 files changed, 182 insertions(+), 215 deletions(-) rename {systemui4merge/features/volumepanelcomponent => feature/systemui/volumepanel}/build-profile.json5 (100%) rename systemui4merge/features/volumepanelcomponent/hvigorfile.js => feature/systemui/volumepanel/hvigorfile.ts (100%) create mode 100644 feature/systemui/volumepanel/package-lock.json create mode 100644 feature/systemui/volumepanel/package.json rename {systemui4merge/product/default => feature/systemui}/volumepanel/src/main/ets/common/StyleConfiguration.ts (89%) rename {systemui4merge/product/default => feature/systemui}/volumepanel/src/main/ets/common/StyleManager.ts (89%) rename {systemui4merge/product/default => feature/systemui}/volumepanel/src/main/ets/common/constants.ts (100%) rename systemui4merge/product/default/volumepanel/src/main/ets/pages/index.ets => feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets (52%) create mode 100644 feature/systemui/volumepanel/src/main/module.json5 rename {systemui4merge/product/default/volumepanel/src/main/resources/zh_CN => feature/systemui/volumepanel/src/main/resources/base}/element/string.json (64%) rename {systemui4merge/features/volumepanelcomponent => feature/systemui/volumepanel}/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/product/default => feature/systemui}/volumepanel/src/main/resources/base/profile/main_pages.json (100%) rename {systemui4merge/product/default/volumepanel/src/main/resources/base => feature/systemui/volumepanel/src/main/resources/en_US}/element/string.json (64%) rename {systemui4merge/product/default/volumepanel/src/main/resources/en_US => feature/systemui/volumepanel/src/main/resources/zh_CN}/element/string.json (64%) rename {systemui4merge/product/default/volumepanel => feature/systemui/volumepanelcomponent}/build-profile.json5 (100%) rename systemui4merge/product/default/volumepanel/hvigorfile.js => feature/systemui/volumepanelcomponent/hvigorfile.ts (92%) rename {systemui4merge/product/default/volumepanel => feature/systemui/volumepanelcomponent}/package-lock.json (43%) create mode 100644 feature/systemui/volumepanelcomponent/package.json rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts (96%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts (91%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts (98%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets (96%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts (99%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/base/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg (100%) rename {systemui4merge/product/default/volumepanel => feature/systemui/volumepanelcomponent}/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/phone/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/volumepanelcomponent/src/main/resources/zh_CN/element/string.json (100%) delete mode 100644 systemui4merge/features/volumepanelcomponent/package-lock.json delete mode 100644 systemui4merge/features/volumepanelcomponent/package.json delete mode 100644 systemui4merge/product/default/volumepanel/package.json delete mode 100644 systemui4merge/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts delete mode 100644 systemui4merge/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts delete mode 100644 systemui4merge/product/default/volumepanel/src/main/module.json5 diff --git a/build-profile.json5 b/build-profile.json5 index 95ee66a1..86924085 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -333,6 +333,30 @@ } ] }, + { + "name": "volumepanelcomponent", + "srcPath": "./feature/systemui/volumepanelcomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "default_volumepanel", + "srcPath": "./feature/systemui/volumepanel", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, { "name": "phone_statusbar", "srcPath": "./feature/systemui/phone/statusbar", diff --git a/systemui4merge/features/volumepanelcomponent/build-profile.json5 b/feature/systemui/volumepanel/build-profile.json5 similarity index 100% rename from systemui4merge/features/volumepanelcomponent/build-profile.json5 rename to feature/systemui/volumepanel/build-profile.json5 diff --git a/systemui4merge/features/volumepanelcomponent/hvigorfile.js b/feature/systemui/volumepanel/hvigorfile.ts similarity index 100% rename from systemui4merge/features/volumepanelcomponent/hvigorfile.js rename to feature/systemui/volumepanel/hvigorfile.ts diff --git a/feature/systemui/volumepanel/package-lock.json b/feature/systemui/volumepanel/package-lock.json new file mode 100644 index 00000000..aae159f9 --- /dev/null +++ b/feature/systemui/volumepanel/package-lock.json @@ -0,0 +1,22 @@ +{ + "name": "@ohos/default_volumepanel", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + }, + "@ohos/volumepanelcomponent": { + "version": "file:../volumepanelcomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + } + } +} diff --git a/feature/systemui/volumepanel/package.json b/feature/systemui/volumepanel/package.json new file mode 100644 index 00000000..f6358f70 --- /dev/null +++ b/feature/systemui/volumepanel/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/default_volumepanel", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common", + "@ohos/volumepanelcomponent": "../volumepanelcomponent" + }, + "type": "module" +} diff --git a/systemui4merge/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts b/feature/systemui/volumepanel/src/main/ets/common/StyleConfiguration.ts similarity index 89% rename from systemui4merge/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts rename to feature/systemui/volumepanel/src/main/ets/common/StyleConfiguration.ts index 11a4668f..66c3c1a6 100644 --- a/systemui4merge/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts +++ b/feature/systemui/volumepanel/src/main/ets/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; const TAG = 'VolumePanel-StyleConfiguration'; diff --git a/systemui4merge/product/default/volumepanel/src/main/ets/common/StyleManager.ts b/feature/systemui/volumepanel/src/main/ets/common/StyleManager.ts similarity index 89% rename from systemui4merge/product/default/volumepanel/src/main/ets/common/StyleManager.ts rename to feature/systemui/volumepanel/src/main/ets/common/StyleManager.ts index c1b9f8f3..42aca5a8 100644 --- a/systemui4merge/product/default/volumepanel/src/main/ets/common/StyleManager.ts +++ b/feature/systemui/volumepanel/src/main/ets/common/StyleManager.ts @@ -12,9 +12,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import StyleConfiguration from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import StyleConfiguration from '@ohos/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration'; const TAG = 'VolumePanel-StyleManager'; diff --git a/systemui4merge/product/default/volumepanel/src/main/ets/common/constants.ts b/feature/systemui/volumepanel/src/main/ets/common/constants.ts similarity index 100% rename from systemui4merge/product/default/volumepanel/src/main/ets/common/constants.ts rename to feature/systemui/volumepanel/src/main/ets/common/constants.ts diff --git a/systemui4merge/product/default/volumepanel/src/main/ets/pages/index.ets b/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets similarity index 52% rename from systemui4merge/product/default/volumepanel/src/main/ets/pages/index.ets rename to feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets index f2e68ac6..6e50c3a1 100644 --- a/systemui4merge/product/default/volumepanel/src/main/ets/pages/index.ets +++ b/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets @@ -12,20 +12,47 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager' -import VolumePanelComponent from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import VolumePanelComponent from '@ohos/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent' +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' import StyleManager from '../common/StyleManager' -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager' +import screenSessionManager from '@ohos.screenSessionManager' +import VolumeWindowController from '@ohos/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController' +import { Rect as Area } from '@ohos/common/src/main/ets/default/Constants' -const TAG = 'VolumePanel-Index' +const TAG = 'SCBVolumePanel' + +// show和hide函数用于VolumeWindowController控制音量条显隐 +class ShowControl { + mIsShown: boolean = false; + + async show() { + Log.showInfo(TAG, "show"); + this.mIsShown = true; + return; + } + + async hide() { + Log.showInfo(TAG, "hide"); + this.mIsShown = false; + return; + } +} -@Entry @Component -struct Index { +export struct SCBVolumePanel { + public bounds: screenSessionManager.RRect + @State mVolumeRect: Area = { + left: 0, + top: 0, + width: 0, + height: 0 + } + @State mShowControl: ShowControl = new ShowControl(); + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`); + this.init(); let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis'); let volumeRect; if (configInfo.width > configInfo.height) { // Pad、PC Mode @@ -48,25 +75,36 @@ struct Index { }; } AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'rect', volumeRect); - WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); + this.mVolumeRect = volumeRect; setAppBgColor('#00000000'); - CommonStyleManager.setAbilityPageName(TAG) Log.showDebug(TAG, `configInfo Start, configInfo ${JSON.stringify(configInfo)}`); if (configInfo.width > configInfo.height) { // Pad、PC Mode StyleManager.setStyle(); } } + init() { + AbilityManager.setContext(AbilityManager.ABILITY_NAME_VOLUME_PANEL, getContext(this)); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis', { + width: vp2px(this.bounds.width), + height: vp2px(this.bounds.height), + }); + VolumeWindowController.getInstance().setWindowHandle(this.mShowControl); + } + aboutToDisappear() { Log.showInfo(TAG, `aboutToDisAppear`) } build() { - Column() { - VolumePanelComponent() + if (this.mShowControl.mIsShown) { + Column() { + VolumePanelComponent() + } + .width(this.mVolumeRect.width + 'px') + .height(this.mVolumeRect.height + 'px') + .position({x:this.mVolumeRect.left + 'px', y:this.mVolumeRect.top + 'px'}) } - .width('100%') - .height('100%') } } diff --git a/feature/systemui/volumepanel/src/main/module.json5 b/feature/systemui/volumepanel/src/main/module.json5 new file mode 100644 index 00000000..ddab02f1 --- /dev/null +++ b/feature/systemui/volumepanel/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "default_volumepanel", + "type": "har", + "deviceTypes": [ + "default" + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/systemui4merge/product/default/volumepanel/src/main/resources/zh_CN/element/string.json b/feature/systemui/volumepanel/src/main/resources/base/element/string.json similarity index 64% rename from systemui4merge/product/default/volumepanel/src/main/resources/zh_CN/element/string.json rename to feature/systemui/volumepanel/src/main/resources/base/element/string.json index 4b8592f0..0344f6a1 100644 --- a/systemui4merge/product/default/volumepanel/src/main/resources/zh_CN/element/string.json +++ b/feature/systemui/volumepanel/src/main/resources/base/element/string.json @@ -1,9 +1,5 @@ { "string": [ - { - "name": "app_name", - "value": "VolumePanel" - }, { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/icon.png b/feature/systemui/volumepanel/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/icon.png rename to feature/systemui/volumepanel/src/main/resources/base/media/icon.png diff --git a/systemui4merge/product/default/volumepanel/src/main/resources/base/profile/main_pages.json b/feature/systemui/volumepanel/src/main/resources/base/profile/main_pages.json similarity index 100% rename from systemui4merge/product/default/volumepanel/src/main/resources/base/profile/main_pages.json rename to feature/systemui/volumepanel/src/main/resources/base/profile/main_pages.json diff --git a/systemui4merge/product/default/volumepanel/src/main/resources/base/element/string.json b/feature/systemui/volumepanel/src/main/resources/en_US/element/string.json similarity index 64% rename from systemui4merge/product/default/volumepanel/src/main/resources/base/element/string.json rename to feature/systemui/volumepanel/src/main/resources/en_US/element/string.json index 4b8592f0..0344f6a1 100644 --- a/systemui4merge/product/default/volumepanel/src/main/resources/base/element/string.json +++ b/feature/systemui/volumepanel/src/main/resources/en_US/element/string.json @@ -1,9 +1,5 @@ { "string": [ - { - "name": "app_name", - "value": "VolumePanel" - }, { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" diff --git a/systemui4merge/product/default/volumepanel/src/main/resources/en_US/element/string.json b/feature/systemui/volumepanel/src/main/resources/zh_CN/element/string.json similarity index 64% rename from systemui4merge/product/default/volumepanel/src/main/resources/en_US/element/string.json rename to feature/systemui/volumepanel/src/main/resources/zh_CN/element/string.json index 4b8592f0..0344f6a1 100644 --- a/systemui4merge/product/default/volumepanel/src/main/resources/en_US/element/string.json +++ b/feature/systemui/volumepanel/src/main/resources/zh_CN/element/string.json @@ -1,9 +1,5 @@ { "string": [ - { - "name": "app_name", - "value": "VolumePanel" - }, { "name": "mainability_description", "value": "JS_Phone_Empty Feature Ability" diff --git a/systemui4merge/product/default/volumepanel/build-profile.json5 b/feature/systemui/volumepanelcomponent/build-profile.json5 similarity index 100% rename from systemui4merge/product/default/volumepanel/build-profile.json5 rename to feature/systemui/volumepanelcomponent/build-profile.json5 diff --git a/systemui4merge/product/default/volumepanel/hvigorfile.js b/feature/systemui/volumepanelcomponent/hvigorfile.ts similarity index 92% rename from systemui4merge/product/default/volumepanel/hvigorfile.js rename to feature/systemui/volumepanelcomponent/hvigorfile.ts index fdb4fcea..922125d1 100644 --- a/systemui4merge/product/default/volumepanel/hvigorfile.js +++ b/feature/systemui/volumepanelcomponent/hvigorfile.ts @@ -14,4 +14,4 @@ */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks diff --git a/systemui4merge/product/default/volumepanel/package-lock.json b/feature/systemui/volumepanelcomponent/package-lock.json similarity index 43% rename from systemui4merge/product/default/volumepanel/package-lock.json rename to feature/systemui/volumepanelcomponent/package-lock.json index dff3e4e8..b4c85744 100644 --- a/systemui4merge/product/default/volumepanel/package-lock.json +++ b/feature/systemui/volumepanelcomponent/package-lock.json @@ -1,11 +1,11 @@ { - "name": "default_volumepanel", + "name": "@ohos/volumepanelcomponent", "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { - "@ohos/volumepanelcomponent": { - "version": "file:../../../features/volumepanelcomponent" + "@ohos/common": { + "version": "file:../../../common" } } } diff --git a/feature/systemui/volumepanelcomponent/package.json b/feature/systemui/volumepanelcomponent/package.json new file mode 100644 index 00000000..54d37b46 --- /dev/null +++ b/feature/systemui/volumepanelcomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/volumepanelcomponent", + "description": "a npm package which contains volumepanelcomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts rename to feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts diff --git a/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts similarity index 96% rename from systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts rename to feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 50915677..9692fdc1 100644 --- a/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; import Constants from './Constants'; const TAG = 'volumepanel-StyleConfiguration'; diff --git a/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts similarity index 91% rename from systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts rename to feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts index ba285cb4..671d47cc 100644 --- a/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts +++ b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import getSingleInstance from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import Trace from '../../../../../../../../common/src/main/ets/default/Trace' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import getSingleInstance from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import Trace from '@ohos/common/src/main/ets/default/Trace' import VolumePanelService from '../model/VolumePanelService'; import { VolumeInfo } from '../common/Constants'; diff --git a/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts similarity index 98% rename from systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts rename to feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts index 5e7abb9a..fc326ea3 100644 --- a/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts +++ b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts @@ -15,9 +15,9 @@ import audio from '@ohos.multimedia.audio'; import { BusinessError } from 'basic'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import getSingleInstance, { getAudioManager -} from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; import { AudioVolumeType, VolumeInfo } from '../common/Constants'; const TAG = 'VolumePanelModel'; diff --git a/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets similarity index 96% rename from systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets rename to feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets index 31e6e650..4beda420 100644 --- a/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets +++ b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets @@ -13,8 +13,8 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' import StyleConfiguration, { VolumePanelComponentStyle } from '../common/StyleConfiguration' import Constants from '../common/Constants' import ViewModel from '../viewmodel/VolumePanelVM' diff --git a/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts similarity index 99% rename from systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts rename to feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts index 17dfe7b8..1c086052 100644 --- a/systemui4merge/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts +++ b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants from '../common/Constants'; import { AudioVolumeType, VolumeInfo } from '../common/Constants'; import VolumePanelService from '../model/VolumePanelService'; diff --git a/systemui4merge/features/volumepanelcomponent/src/main/module.json5 b/feature/systemui/volumepanelcomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/module.json5 rename to feature/systemui/volumepanelcomponent/src/main/module.json5 diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/base/element/color.json b/feature/systemui/volumepanelcomponent/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/base/element/color.json rename to feature/systemui/volumepanelcomponent/src/main/resources/base/element/color.json diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/base/element/float.json b/feature/systemui/volumepanelcomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/base/element/float.json rename to feature/systemui/volumepanelcomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/base/element/string.json b/feature/systemui/volumepanelcomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/base/element/string.json rename to feature/systemui/volumepanelcomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg b/feature/systemui/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg rename to feature/systemui/volumepanelcomponent/src/main/resources/base/media/ic_public_mute.svg diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg b/feature/systemui/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg rename to feature/systemui/volumepanelcomponent/src/main/resources/base/media/ic_public_settings.svg diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg b/feature/systemui/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg rename to feature/systemui/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_01.svg diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg b/feature/systemui/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg rename to feature/systemui/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_02.svg diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg b/feature/systemui/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg rename to feature/systemui/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_03.svg diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg b/feature/systemui/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg rename to feature/systemui/volumepanelcomponent/src/main/resources/base/media/ic_public_sound_04.svg diff --git a/systemui4merge/product/default/volumepanel/src/main/resources/base/media/icon.png b/feature/systemui/volumepanelcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/product/default/volumepanel/src/main/resources/base/media/icon.png rename to feature/systemui/volumepanelcomponent/src/main/resources/base/media/icon.png diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/en_US/element/string.json b/feature/systemui/volumepanelcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/volumepanelcomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/phone/element/color.json b/feature/systemui/volumepanelcomponent/src/main/resources/phone/element/color.json similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/phone/element/color.json rename to feature/systemui/volumepanelcomponent/src/main/resources/phone/element/color.json diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/phone/element/float.json b/feature/systemui/volumepanelcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/phone/element/float.json rename to feature/systemui/volumepanelcomponent/src/main/resources/phone/element/float.json diff --git a/systemui4merge/features/volumepanelcomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/volumepanelcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/volumepanelcomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/volumepanelcomponent/src/main/resources/zh_CN/element/string.json diff --git a/product/phone/package-lock.json b/product/phone/package-lock.json index c0cf25d9..1a024f1b 100644 --- a/product/phone/package-lock.json +++ b/product/phone/package-lock.json @@ -18,6 +18,29 @@ "@ohos/common": { "version": "file:../../common" }, + "@ohos/default_volumepanel": { + "version": "file:../../feature/systemui/volumepanel", + "requires": { + "@ohos/common": "file:../../common", + "@ohos/volumepanelcomponent": "file:../../feature/systemui/volumepanelcomponent" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + }, + "@ohos/volumepanelcomponent": { + "version": "file:../../feature/systemui/volumepanelcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + } + } + }, "@ohos/form": { "version": "file:../../feature/form", "requires": { diff --git a/product/phone/package.json b/product/phone/package.json index a8647ce4..c24cded7 100644 --- a/product/phone/package.json +++ b/product/phone/package.json @@ -17,6 +17,7 @@ "@ohos/common": "../../common", "@ohos/numbadge": "../../feature/numbadge", "@ohos/phone_statusbar": "../../feature/systemui/phone/statusbar", - "@ohos/phone_dropdownpanel": "../../feature/systemui/phone/dropdownpanel" + "@ohos/phone_dropdownpanel": "../../feature/systemui/phone/dropdownpanel", + "@ohos/default_volumepanel": "../../feature/systemui/volumepanel" } } diff --git a/product/phone/src/main/ets/WindowScene/HWSystemUi.ets b/product/phone/src/main/ets/WindowScene/HWSystemUi.ets index dc75c7c6..2644e95b 100644 --- a/product/phone/src/main/ets/WindowScene/HWSystemUi.ets +++ b/product/phone/src/main/ets/WindowScene/HWSystemUi.ets @@ -19,6 +19,7 @@ import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleMan import screenSessionManager from '@ohos.screenSessionManager'; import { SCBStatusBar } from '@ohos/phone_statusbar/src/main/ets/pages/SCBStatusBar'; import { SCBDropdownPanel } from '@ohos/phone_dropdownpanel/src/main/ets/pages/SCBDropdownPanel'; +import { SCBVolumePanel } from '@ohos/default_volumepanel/src/main/ets/pages/SCBVolumePanel'; const TAG = "HWSystemUi"; const MODULE_NAME = "phone-launcher"; @@ -51,6 +52,7 @@ export struct HWSystemUi { .hitTestBehavior(HitTestMode.Transparent) // volume + SCBVolumePanel({bounds : this.bounds}) } .hitTestBehavior(HitTestMode.Transparent) .width('100%') diff --git a/systemui4merge/features/volumepanelcomponent/package-lock.json b/systemui4merge/features/volumepanelcomponent/package-lock.json deleted file mode 100644 index 2993cde1..00000000 --- a/systemui4merge/features/volumepanelcomponent/package-lock.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "@ohos/volumepanelcomponent", - "version": "1.0.0", - "lockfileVersion": 1 -} diff --git a/systemui4merge/features/volumepanelcomponent/package.json b/systemui4merge/features/volumepanelcomponent/package.json deleted file mode 100644 index 987b9cca..00000000 --- a/systemui4merge/features/volumepanelcomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/volumepanelcomponent", - "description":"a npm package which contains volumepanelcomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/product/default/volumepanel/package.json b/systemui4merge/product/default/volumepanel/package.json deleted file mode 100644 index 8f9107e3..00000000 --- a/systemui4merge/product/default/volumepanel/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "devDependencies":{}, - "name":"default_volumepanel", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{ - "@ohos/volumepanelcomponent":"file:../../../features/volumepanelcomponent" - } -} \ No newline at end of file diff --git a/systemui4merge/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts b/systemui4merge/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts deleted file mode 100644 index b9d3a117..00000000 --- a/systemui4merge/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import AbilityStage from '@ohos.app.ability.AbilityStage'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -//import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' -//import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' - -const TAG = 'volume_AbilityStage'; - -export default class MainAbilityStage extends AbilityStage { - async onCreate(): Promise { - Log.showInfo(TAG, 'onCreate'); - } -} \ No newline at end of file diff --git a/systemui4merge/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/systemui4merge/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts deleted file mode 100644 index 8601f6c7..00000000 --- a/systemui4merge/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; -import Want from '@ohos.application.Want'; -import display from '@ohos.display'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import VolumeWindowController from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController'; - -const TAG = 'VolumePanel_ServiceExtAbility'; -const realWidth = 48; -const realHeight = 284; - -class ServiceExtAbility extends ServiceExtension { - onCreate(want: Want): void { - Log.showInfo(TAG, `onCreate, want:${want.abilityName}`); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_VOLUME_PANEL, this.context); - display.getDefaultDisplay().then((dis) => { - let volumeRect = { - left: 0, - top: 0, - width: dis.width, - height: dis.height, - }; - - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis', { - width: dis.width, - height: dis.height, - }); - WindowManager.createWindow(this.context, WindowType.VOLUME_PANEL, volumeRect, 'pages/index').then((win) => { - Log.showInfo(TAG, 'onCreate, createWindow callback'); - VolumeWindowController.getInstance().setWindowHandle(win); - }) - .catch((err) => Log.showError(TAG, `Can't create window, err:${JSON.stringify(err)}`)); - }).then(() => { - }).catch((err) => { - }); - - display.on("change", (id) => { - let volumeRect - Log.showInfo(TAG, "display change, data: " + JSON.stringify(id)) - display.getDefaultDisplay().then((configInfo) => { - volumeRect = { - left: configInfo.width - vp2px(16) - vp2px(realWidth), - top: (configInfo.height - vp2px(realHeight) ) / 2, - width: vp2px(realWidth) , - height: vp2px(realHeight) - }; - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'rect', volumeRect); - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis', { - width: configInfo.width, - height: configInfo.height, - }); - }).then(() => { - WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); - }).catch((err) => { - }); - }) - - } - - onDestroy(): void { - Log.showInfo(TAG, 'onDestroy'); - } -} - -export default ServiceExtAbility; diff --git a/systemui4merge/product/default/volumepanel/src/main/module.json5 b/systemui4merge/product/default/volumepanel/src/main/module.json5 deleted file mode 100644 index 6afff359..00000000 --- a/systemui4merge/product/default/volumepanel/src/main/module.json5 +++ /dev/null @@ -1,34 +0,0 @@ -{ - "module": { - "name": "default_volumepanel", - "type": "feature", - "srcEntrance": "./ets/Application/AbilityStage.ts", - "description": "$string:mainability_description", - "mainElement": "com.ohos.systemui.volumepanel.ServiceExtAbility", - "deviceTypes": [ - "default", - "tablet" - ], - "metadata": [ - { - "name": "ArkTSPartialUpdate", - "value": "true" - } - ], - "deliveryWithInstall": true, - "installationFree": false, - "uiSyntax": "ets", - "pages": "$profile:main_pages", - "extensionAbilities": [ - { - "visible": true, - "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", - "name": "com.ohos.systemui.volumepanel.ServiceExtAbility", - "icon": "$media:icon", - "description": "$string:mainability_description", - "label": "$string:app_name", - "type": "service" - } - ] - } -} \ No newline at end of file -- Gitee From 24bfb120a5eb4dd377623262a57405c5df97a55a Mon Sep 17 00:00:00 2001 From: chenlang <18577333310@163.com> Date: Wed, 29 Mar 2023 17:27:58 +0800 Subject: [PATCH 352/373] =?UTF-8?q?=E4=BF=AE=E6=94=B9p7b=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenlang <18577333310@163.com> --- .../ets/com/ohos/model/screenLockModel.ts | 16 +++++++++------- product/pc/src/main/module.json5 | 3 +++ product/phone/src/main/module.json5 | 6 ++++++ signature/systemui.p7b | Bin 3779 -> 3823 bytes 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index 6028054b..40a50964 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -26,13 +26,15 @@ const TAG = 'ScreenLock-ScreenLockModel'; export default class ScreenLockModel { @SysFaultLogger({FAULT_ID: FaultID.SCREEN_LOCK_MANAGER, MSG: "call func on failed"}) eventListener(callback: Callback) { - let isSuccess = ScreenLockMar.onSystemEvent((err, event)=>{ - Log.showInfo(TAG, `eventListener:callback:${event.eventType}`) - callback(event.eventType); - if (err) { - Log.showError(TAG, `on callback error -> ${JSON.stringify(err)}`); - } - }); + let isSuccess = null + try { + isSuccess = ScreenLockMar.onSystemEvent((event)=>{ + Log.showInfo(TAG, `eventListener:callback:${event.eventType}`) + callback(event.eventType); + }); + } catch (err: any) { + Log.showError(TAG, `on callback error -> ${JSON.stringify(err)}`); + } if (!isSuccess) { callback('serviceRestart'); } diff --git a/product/pc/src/main/module.json5 b/product/pc/src/main/module.json5 index 0a86da89..d4da2eaa 100644 --- a/product/pc/src/main/module.json5 +++ b/product/pc/src/main/module.json5 @@ -78,6 +78,9 @@ }, { "name": "ohos.permission.CONNECT_IME_ABILITY" + }, + { + "name": "ohos.permission.ACCESS_SCREEN_LOCK_INNER" } ], "extensionAbilities": [ diff --git a/product/phone/src/main/module.json5 b/product/phone/src/main/module.json5 index 4db82eb8..4e5b6b2e 100644 --- a/product/phone/src/main/module.json5 +++ b/product/phone/src/main/module.json5 @@ -72,6 +72,12 @@ }, { "name": "ohos.permission.SET_WALLPAPER" + }, + { + "name": "ohos.permission.CONNECT_IME_ABILITY" + }, + { + "name": "ohos.permission.ACCESS_SCREEN_LOCK_INNER" } ], "extensionAbilities": [ diff --git a/signature/systemui.p7b b/signature/systemui.p7b index 624ea055cb5572cf3345386760554aa172817189..01a07ce9bd3f01e8d0496b6c81104255fabedf60 100644 GIT binary patch delta 274 zcmX>s`(D<;po#A_8>d#AN85K^Ms}tJO?-ENLN}Ng84Y<2xY;-p+B_IjnOT?^4Vu_` z5DFO=G_lpPG_h4~bU48}`4Ov-grl>wYjALUuyc^Bt6#j2zq5C|r=Oo|&}MeFYIYt+ zgC<5>prHoY2Fa7_IqfH(ij!PXZ??+ssl-ej~BGVZ8wt8wb$Q=WJP+nONKnT$vQC8{Tf@w3}+X$n!Ge zlN_hdw^w{EO|Z;o&2jy6YPN9kX(mO6o_JN6Go8in($1c~YI`X_aAW=16{k~Kznxjq LEGGMZ@s-&Cnyg`a delta 242 zcmaDadsx=Npowok8>d#AN85K^Ms}tJO?(@GLTi{984Y<2xY;-p+B_IjnOT?^4Vu^z z5egX>G_eJ-G_m<@bU4Af*_f@0oeO9bqYY4>LH6Vi+^Lgg_?+tv4J{0e4Gm1qq73xm zdO2APl~@$k{eS+cx>vxzvz;ehd$Yb|?BlEV8HHahPFnZYd`o4om;o0X2hdgLY+0C@ zSlkR;m=t(CmS=WPFjy Date: Thu, 30 Mar 2023 17:48:09 +0800 Subject: [PATCH 353/373] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-profile.json5 | 24 +++++++++++++++ .../default/abilitymanager/abilityManager.ts | 29 +++++++++++------- .../default/abilitymanager/bundleManager.ts | 8 ++++- .../main/ets/default/event/EventManager.ts | 27 ++++++++-------- .../default/manager/LauncherAbilityManager.ts | 4 +-- .../managementcomponent/build-profile.json5 | 0 .../managementcomponent/hvigorfile.ts | 0 .../managementcomponent/package-lock.json | 8 ++++- .../systemui/managementcomponent/package.json | 15 +++++++++ .../src/main/ets/com/ohos/common/constants.ts | 0 .../ets/com/ohos/model/bundleResourceModel.ts | 8 ++--- .../ets/com/ohos/model/noDisturbingModel.ts | 4 +-- .../com/ohos/model/notificationListener.ts | 2 +- .../ohos/view/component/appItemComponent.ets | 2 +- .../ohos/view/component/appLstComponent.ets | 2 +- .../com/ohos/view/component/headComponent.ets | 0 .../com/ohos/view/component/itemComponent.ets | 0 .../view/component/noDisturbComponent.ets | 2 +- .../ohos/view/component/slotItemComponent.ets | 2 +- .../ohos/view/component/slotLstComponent.ets | 2 +- .../ohos/view/component/switchComponent.ets | 2 +- .../com/ohos/vm/appLstComponentViewModel.ts | 2 +- .../ohos/vm/noDisturbComponentViewModel.ts | 6 ++-- .../managementcomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../src/main/resources/base/media/ic_back.svg | 0 .../base/media/ic_settings_arrow.svg | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/color.json | 0 .../main/resources/phone/element/float.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../model/NotificationDistributionManager.ts | 2 +- .../noticeItem/view/item/settingDialog.ets | 2 +- .../build-profile.json5 | 3 +- .../notificationmanagement/hvigorfile.js | 0 .../notificationmanagement/package-lock.json | 13 +++++++- .../notificationmanagement/package.json | 14 +++++++++ .../src/main/ets/Application/AbilityStage.ts | 2 +- .../src/main/ets/MainAbility/MainAbility.ts | 4 +-- .../src/main/ets/common/constants.ts | 0 .../src/main/ets/pages/batchSetEnable.ets | 6 ++-- .../src/main/ets/pages/noDisturb.ets | 12 ++++---- .../src/main/ets/pages/noDisturbPre.ets | 10 +++--- .../ets/pages/notificationManagenment.ets | 14 ++++----- .../src/main/ets/pages/setEnable.ets | 12 ++++---- .../src/main/ets/pages/slotSetting.ets | 12 ++++---- .../src/main/ets/vm/noDisturbViewModel.ts | 8 ++--- .../vm/notificationManagenmentViewModel.ts | 8 ++--- .../src/main/module.json5 | 4 +-- .../main/resources/base/element/color.json | 0 .../main/resources/base/element/string.json | 0 .../src/main/resources/base/media/ic_back.svg | 0 .../base/media/ic_settings_arrow.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../resources/base/media/startWindowIcon.png | Bin .../resources/base/profile/main_pages.json | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../src/main/ets/pages/notification.ets | 2 +- .../features/managementcomponent/package.json | 12 -------- .../notificationmanagement/package.json | 13 -------- 63 files changed, 182 insertions(+), 120 deletions(-) rename {systemui4merge/features => feature/systemui}/managementcomponent/build-profile.json5 (100%) rename systemui4merge/features/managementcomponent/hvigorfile.js => feature/systemui/managementcomponent/hvigorfile.ts (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/package-lock.json (32%) create mode 100644 feature/systemui/managementcomponent/package.json rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/common/constants.ts (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts (92%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts (94%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts (98%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets (99%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets (97%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets (98%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets (97%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets (97%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets (97%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts (93%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts (96%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/module.json5 (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/resources/base/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/resources/base/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/resources/base/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/resources/base/media/ic_back.svg (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/resources/phone/element/color.json (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/resources/phone/element/float.json (100%) rename {systemui4merge/features => feature/systemui}/managementcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/build-profile.json5 (59%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/hvigorfile.js (100%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/package-lock.json (38%) create mode 100644 feature/systemui/notificationmanagement/package.json rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/ets/Application/AbilityStage.ts (92%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts (90%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/ets/common/constants.ts (100%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/ets/pages/batchSetEnable.ets (91%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/ets/pages/noDisturb.ets (97%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/ets/pages/noDisturbPre.ets (85%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/ets/pages/notificationManagenment.ets (90%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/ets/pages/setEnable.ets (87%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/ets/pages/slotSetting.ets (92%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts (90%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts (83%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/module.json5 (85%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/resources/base/element/color.json (100%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/resources/base/element/string.json (100%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/resources/base/media/ic_back.svg (100%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg (100%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/resources/base/media/icon.png (100%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/resources/base/media/startWindowIcon.png (100%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/resources/base/profile/main_pages.json (100%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/resources/en_US/element/string.json (100%) rename {systemui4merge/product/default => feature/systemui}/notificationmanagement/src/main/resources/zh_CN/element/string.json (100%) delete mode 100644 systemui4merge/features/managementcomponent/package.json delete mode 100644 systemui4merge/product/default/notificationmanagement/package.json diff --git a/build-profile.json5 b/build-profile.json5 index 86924085..4b226b96 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -345,6 +345,30 @@ } ] }, + { + "name": "managementcomponent", + "srcPath": "./feature/systemui/managementcomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "default_notificationmanagement", + "srcPath": "./feature/systemui/notificationmanagement", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, { "name": "default_volumepanel", "srcPath": "./feature/systemui/volumepanel", diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/common/src/main/ets/default/abilitymanager/abilityManager.ts index 78ee0fc8..14c5229e 100644 --- a/common/src/main/ets/default/abilitymanager/abilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/abilityManager.ts @@ -18,6 +18,7 @@ import { BusinessError } from 'basic'; import common from '@ohos.app.ability.common' import Want from '@ohos.application.Want'; import { Log } from '../utils/Log'; +import { launcherAbilityManager } from '../manager/LauncherAbilityManager' const TAG = 'AbilityManager'; @@ -88,17 +89,23 @@ export default class AbilityManager { if (context == null) { context = AbilityManager.getContext(); } - context.startAbility(want).then(() => { - Log.showInfo(TAG, 'startAbility, then'); - if (callback) { - callback(); - } - }).catch((error: BusinessError) => { - Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); - if (callback) { - callback(error); - } - }); + // TODO startAbility参数 + launcherAbilityManager.startLauncherAbility(want.abilityName, want.bundleName, null); + Log.showInfo(TAG, 'startLauncherAbility'); + if (callback) { + callback(); + } +// context.startAbility(want).then(() => { +// Log.showInfo(TAG, 'startAbility, then'); +// if (callback) { +// callback(); +// } +// }).catch((error: BusinessError) => { +// Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); +// if (callback) { +// callback(error); +// } +// }); } static startServiceExtensionAbility(context: any, want: Want, callback?: (error?: BusinessError) => void): void { diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ts b/common/src/main/ets/default/abilitymanager/bundleManager.ts index 199107ed..91191c5c 100644 --- a/common/src/main/ets/default/abilitymanager/bundleManager.ts +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ts @@ -41,8 +41,11 @@ export default class BundleManager { Log.showDebug(TAG, `getString, resource: ${JSON.stringify(resource)}`); if(callback){ BundleManager.getResourceManager().getString(resource).then((value) => { - Log.showDebug(TAG, `getString, callback excute`); + Log.showDebug(TAG, `getString, callback excute, ${value}`); callback(value) ; + }).catch((err) => { + Log.showError(TAG, `getString catch error: ${JSON.stringify(err)}`); + callback(undefined); }) return; } else { @@ -56,6 +59,9 @@ export default class BundleManager { BundleManager.getResourceManager().getMediaBase64(resource).then((value) => { Log.showDebug(TAG, `getMediaBase64, callback excute`); callback(value) ; + }).catch((err) => { + Log.showError(TAG, `getMediaBase64 catch error: ${JSON.stringify(err)}`); + callback(undefined); }) return; } else { diff --git a/common/src/main/ets/default/event/EventManager.ts b/common/src/main/ets/default/event/EventManager.ts index 90331b0d..aff83de3 100644 --- a/common/src/main/ets/default/event/EventManager.ts +++ b/common/src/main/ets/default/event/EventManager.ts @@ -21,6 +21,7 @@ import { Callback, createEventBus, EventBus } from "./EventBus"; import { BusinessError } from 'basic'; import {PluginType} from "../../plugindatasource/common/Constants"; import {writeFaultLog, FaultID} from '../SysFaultLogger'; +import { launcherAbilityManager } from '../manager/LauncherAbilityManager'; export type unsubscribe = () => void; export type Events = string | string[]; @@ -73,18 +74,20 @@ class EventManager { Log.showDebug(TAG, `start Ability: ${data.abilityName}`); if (data.bundleName && data.abilityName && this.mContext) { this.mEventBus.emit(START_ABILITY_EVENT, { abilityName: data.abilityName }); - this.mContext.startAbility({ - bundleName: data.bundleName, - abilityName: data.abilityName, - parameters: data.args??undefined - }).then(() => { - Log.showInfo(TAG, 'startAbility, then'); - }).catch((error: BusinessError) => { - Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); - if (pluginType == PluginType.META) { - writeFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API:data.bundleName, FAULT_ID: FaultID.META_DIAGRAM_JUMP, MSG: "jump ability failure"}) - } - }); + // TODO startAbility需要带参数parameters: data.args??undefined + launcherAbilityManager.startLauncherAbility(data.abilityName, data.bundleName, null); +// this.mContext.startAbility({ +// bundleName: data.bundleName, +// abilityName: data.abilityName, +// parameters: data.args??undefined +// }).then(() => { +// Log.showInfo(TAG, 'startAbility, then'); +// }).catch((error: BusinessError) => { +// Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); +// if (pluginType == PluginType.META) { +// writeFaultLog({CORE_SYSTEM: "com.ohos.systemui", TARGET_API:data.bundleName, FAULT_ID: FaultID.META_DIAGRAM_JUMP, MSG: "jump ability failure"}) +// } +// }); return true; } return false; diff --git a/common/src/main/ets/default/manager/LauncherAbilityManager.ts b/common/src/main/ets/default/manager/LauncherAbilityManager.ts index 86b14320..d08d998f 100644 --- a/common/src/main/ets/default/manager/LauncherAbilityManager.ts +++ b/common/src/main/ets/default/manager/LauncherAbilityManager.ts @@ -26,8 +26,8 @@ import { CommonConstants } from '../constants/CommonConstants'; import { ResourceManager } from './ResourceManager'; import { EventConstants } from '../constants/EventConstants'; import { BadgeManager } from '../manager/BadgeManager'; -import { HWSceneSessionManager } from '@ohos/common' -import { HWSceneInfo } from '@ohos/common' +import { HWSceneSessionManager } from '../../WindowScene/scene/session/HWSceneSessionManager' +import { HWSceneInfo } from '../../WindowScene/scene/session/HWSceneInfo' const TAG = 'LauncherAbilityManager'; diff --git a/systemui4merge/features/managementcomponent/build-profile.json5 b/feature/systemui/managementcomponent/build-profile.json5 similarity index 100% rename from systemui4merge/features/managementcomponent/build-profile.json5 rename to feature/systemui/managementcomponent/build-profile.json5 diff --git a/systemui4merge/features/managementcomponent/hvigorfile.js b/feature/systemui/managementcomponent/hvigorfile.ts similarity index 100% rename from systemui4merge/features/managementcomponent/hvigorfile.js rename to feature/systemui/managementcomponent/hvigorfile.ts diff --git a/systemui4merge/features/managementcomponent/package-lock.json b/feature/systemui/managementcomponent/package-lock.json similarity index 32% rename from systemui4merge/features/managementcomponent/package-lock.json rename to feature/systemui/managementcomponent/package-lock.json index db12b1c5..a2832636 100644 --- a/systemui4merge/features/managementcomponent/package-lock.json +++ b/feature/systemui/managementcomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/managementcomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/feature/systemui/managementcomponent/package.json b/feature/systemui/managementcomponent/package.json new file mode 100644 index 00000000..eb6685f0 --- /dev/null +++ b/feature/systemui/managementcomponent/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": {}, + "name": "@ohos/managementcomponent", + "description": "a npm package which contains managementcomponent function", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common" + }, + "type": "module" +} diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts b/feature/systemui/managementcomponent/src/main/ets/com/ohos/common/constants.ts similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/common/constants.ts diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts similarity index 92% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index 408528fc..ad73f89e 100644 --- a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import BundleManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import BundleManager from '@ohos/common/src/main/ets/default/abilitymanager/bundleManager'; import Bundle from '@ohos.bundle'; import { BundleInfo } from 'bundle/bundleInfo'; import ResMgr from '@ohos.resourceManager'; import {BusinessError} from 'basic'; -import SwitchUserManager from '../../../../../../../../common/src/main/ets/default/SwitchUserManager'; +import SwitchUserManager from '@ohos/common/src/main/ets/default/SwitchUserManager'; const INDEX = 0; const IS_INCLUDE_ABILITY_INFO = 0; diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts b/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts similarity index 94% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts index 2cb61f97..94db1b5f 100644 --- a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts @@ -12,10 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Notification from '@ohos.notification'; import {DoNotDisturbType} from '../common/constants'; -import TimeManager from '../../../../../../../../common/src/main/ets/default/TimeManager'; +import TimeManager from '@ohos/common/src/main/ets/default/TimeManager'; const TAG = 'NotificationManagenment-NoDisturbingModel'; const MK_DATE_SPLIT = '-'; diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts b/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts similarity index 98% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts index 312cfefb..614ea963 100644 --- a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Notification from '@ohos.notification'; import NotificationManager from '@ohos.notificationManager'; import NotificationSubscribe from '@ohos.notificationSubscribe'; diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets similarity index 99% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets index 14d47b2b..a78be4ab 100644 --- a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets @@ -13,7 +13,7 @@ * limitations under the License. */ import ConfigData from '../../common/constants'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import NotificationListener from '../../model/notificationListener'; import Router from '@system.router' diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets similarity index 97% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets index a97985ef..3a146370 100644 --- a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets @@ -15,7 +15,7 @@ import ConfigData from '../../common/constants'; import AppItemComponent from './appItemComponent'; import Router from '@system.router'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import ViewModel from '../../vm/appLstComponentViewModel' const TAG = 'ManagementComponent-AppLstComponent'; diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets similarity index 98% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets index 279dc1d0..ca321a68 100644 --- a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import ConfigData, { DoNotDisturbType } from '../../common/constants'; import ViewModel from '../../vm/noDisturbComponentViewModel' diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets similarity index 97% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets index a3769da2..5cf4eff5 100644 --- a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets @@ -13,7 +13,7 @@ * limitations under the License. */ import ConfigData from '../../common/constants'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'NotificationManagement-SlotItemComponent'; diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets similarity index 97% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets index f5633512..13221d4c 100644 --- a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets @@ -13,7 +13,7 @@ * limitations under the License. */ import ConfigData from '../../common/constants'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import SlotItemComponent from './slotItemComponent'; import Notification from '@ohos.notification'; import Router from '@system.router' diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets similarity index 97% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index 0a8b4288..fb1791be 100644 --- a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -13,7 +13,7 @@ * limitations under the License. */ import ConfigData from '../../common/constants'; -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'ManagementComponent-SwitchComponent'; diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts b/feature/systemui/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts similarity index 93% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts index ce5fdb05..56861a08 100644 --- a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import BundleResourceModel from '../model/bundleResourceModel'; diff --git a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts b/feature/systemui/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts similarity index 96% rename from systemui4merge/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts rename to feature/systemui/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts index 1f5cebc8..6f769dbf 100644 --- a/systemui4merge/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import ResourceUtil from '@ohos/common/src/main/ets/default/ResourceUtil'; import NoDisturbingModel from '../model/noDisturbingModel'; import ConfigData, {DoNotDisturbType} from '../common/constants'; diff --git a/systemui4merge/features/managementcomponent/src/main/module.json5 b/feature/systemui/managementcomponent/src/main/module.json5 similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/module.json5 rename to feature/systemui/managementcomponent/src/main/module.json5 diff --git a/systemui4merge/features/managementcomponent/src/main/resources/base/element/color.json b/feature/systemui/managementcomponent/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/resources/base/element/color.json rename to feature/systemui/managementcomponent/src/main/resources/base/element/color.json diff --git a/systemui4merge/features/managementcomponent/src/main/resources/base/element/float.json b/feature/systemui/managementcomponent/src/main/resources/base/element/float.json similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/resources/base/element/float.json rename to feature/systemui/managementcomponent/src/main/resources/base/element/float.json diff --git a/systemui4merge/features/managementcomponent/src/main/resources/base/element/string.json b/feature/systemui/managementcomponent/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/resources/base/element/string.json rename to feature/systemui/managementcomponent/src/main/resources/base/element/string.json diff --git a/systemui4merge/features/managementcomponent/src/main/resources/base/media/ic_back.svg b/feature/systemui/managementcomponent/src/main/resources/base/media/ic_back.svg similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/resources/base/media/ic_back.svg rename to feature/systemui/managementcomponent/src/main/resources/base/media/ic_back.svg diff --git a/systemui4merge/features/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg b/feature/systemui/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg rename to feature/systemui/managementcomponent/src/main/resources/base/media/ic_settings_arrow.svg diff --git a/systemui4merge/features/managementcomponent/src/main/resources/en_US/element/string.json b/feature/systemui/managementcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/managementcomponent/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/features/managementcomponent/src/main/resources/phone/element/color.json b/feature/systemui/managementcomponent/src/main/resources/phone/element/color.json similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/resources/phone/element/color.json rename to feature/systemui/managementcomponent/src/main/resources/phone/element/color.json diff --git a/systemui4merge/features/managementcomponent/src/main/resources/phone/element/float.json b/feature/systemui/managementcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/resources/phone/element/float.json rename to feature/systemui/managementcomponent/src/main/resources/phone/element/float.json diff --git a/systemui4merge/features/managementcomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/managementcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/features/managementcomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/managementcomponent/src/main/resources/zh_CN/element/string.json diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts index a77d1040..beac9b13 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts @@ -41,7 +41,7 @@ export default class NotificationDistributionManager { initDeviceManager(): void { Log.showInfo(TAG, 'initDeviceManager'); - DeviceManager.createDeviceManager('com.ohos.systemui', (err, data) => { + DeviceManager.createDeviceManager('com.ohos.launcher', (err, data) => { Log.showInfo(TAG, `initDeviceManager createDeviceManager err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); if (data) { this.deviceManager = data; diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets index e61c70c6..0a8fcf1c 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -125,7 +125,7 @@ export default struct SettingDialog { openAbility() { Log.showInfo(TAG, ` openAbility:showNotificationManagement`); - EventManager.publish(obtainStartAbility('com.ohos.systemui', 'com.ohos.systemui.notificationmanagement.MainAbility', + EventManager.publish(obtainStartAbility('com.ohos.launcher', 'com.ohos.sceneboard.notificationmanagement.MainAbility', { 'migrateUri': 'pages/setEnable', 'migrateBundle': this.itemData.bundleName })) this.closeAbility() } diff --git a/systemui4merge/product/default/notificationmanagement/build-profile.json5 b/feature/systemui/notificationmanagement/build-profile.json5 similarity index 59% rename from systemui4merge/product/default/notificationmanagement/build-profile.json5 rename to feature/systemui/notificationmanagement/build-profile.json5 index 55d2b110..5f5cd5aa 100644 --- a/systemui4merge/product/default/notificationmanagement/build-profile.json5 +++ b/feature/systemui/notificationmanagement/build-profile.json5 @@ -4,5 +4,6 @@ { "name": "default", } - ] + ], + "entryModules": ["pad-launcher","phone-launcher"] } \ No newline at end of file diff --git a/systemui4merge/product/default/notificationmanagement/hvigorfile.js b/feature/systemui/notificationmanagement/hvigorfile.js similarity index 100% rename from systemui4merge/product/default/notificationmanagement/hvigorfile.js rename to feature/systemui/notificationmanagement/hvigorfile.js diff --git a/systemui4merge/product/default/notificationmanagement/package-lock.json b/feature/systemui/notificationmanagement/package-lock.json similarity index 38% rename from systemui4merge/product/default/notificationmanagement/package-lock.json rename to feature/systemui/notificationmanagement/package-lock.json index 9e6d7290..d81e8b60 100644 --- a/systemui4merge/product/default/notificationmanagement/package-lock.json +++ b/feature/systemui/notificationmanagement/package-lock.json @@ -4,8 +4,19 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + }, "@ohos/managementcomponent": { - "version": "file:../../../features/managementcomponent" + "version": "file:../managementcomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } } } diff --git a/feature/systemui/notificationmanagement/package.json b/feature/systemui/notificationmanagement/package.json new file mode 100644 index 00000000..b77f2ee4 --- /dev/null +++ b/feature/systemui/notificationmanagement/package.json @@ -0,0 +1,14 @@ +{ + "devDependencies": {}, + "name": "default_notificationmanagement", + "ohos": { + "org": "huawei", + "directoryLevel": "module", + "buildTool": "hvigor" + }, + "version": "1.0.0", + "dependencies": { + "@ohos/common": "../../../common", + "@ohos/managementcomponent": "../managementcomponent" + } +} diff --git a/systemui4merge/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts b/feature/systemui/notificationmanagement/src/main/ets/Application/AbilityStage.ts similarity index 92% rename from systemui4merge/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts rename to feature/systemui/notificationmanagement/src/main/ets/Application/AbilityStage.ts index fe4c10f7..a75c5bb8 100644 --- a/systemui4merge/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts +++ b/feature/systemui/notificationmanagement/src/main/ets/Application/AbilityStage.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import AbilityStage from '@ohos.app.ability.AbilityStage'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'NotificationManagement_AbilityStage'; export default class MainAbilityStage extends AbilityStage { diff --git a/systemui4merge/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts b/feature/systemui/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts similarity index 90% rename from systemui4merge/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts rename to feature/systemui/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts index c2e708db..910a7f87 100644 --- a/systemui4merge/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts +++ b/feature/systemui/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts @@ -15,8 +15,8 @@ import Ability from '@ohos.app.ability.UIAbility' import Want from '@ohos.application.Want'; import AbilityConstant from "@ohos.app.ability.AbilityConstant"; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import display from '@ohos.display'; const TAG = 'NotificationManagement-MainAbility'; diff --git a/systemui4merge/product/default/notificationmanagement/src/main/ets/common/constants.ts b/feature/systemui/notificationmanagement/src/main/ets/common/constants.ts similarity index 100% rename from systemui4merge/product/default/notificationmanagement/src/main/ets/common/constants.ts rename to feature/systemui/notificationmanagement/src/main/ets/common/constants.ts diff --git a/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets b/feature/systemui/notificationmanagement/src/main/ets/pages/batchSetEnable.ets similarity index 91% rename from systemui4merge/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets rename to feature/systemui/notificationmanagement/src/main/ets/pages/batchSetEnable.ets index 76227adb..65ce3225 100644 --- a/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets +++ b/feature/systemui/notificationmanagement/src/main/ets/pages/batchSetEnable.ets @@ -14,9 +14,9 @@ */ //import Window from '@ohos.window'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; -import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import HeadComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import AppItemComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; import ConfigData from '../common/constants'; import Router from '@system.router' import ViewModel from '../vm/notificationManagenmentViewModel' diff --git a/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/feature/systemui/notificationmanagement/src/main/ets/pages/noDisturb.ets similarity index 97% rename from systemui4merge/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets rename to feature/systemui/notificationmanagement/src/main/ets/pages/noDisturb.ets index 5f7f03c3..fafe4925 100644 --- a/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/feature/systemui/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -13,14 +13,14 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import HeadComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; import ConfigData from '../common/constants'; import deviceInfo from '@ohos.deviceInfo'; -import { concatTime } from '../../../../../../../common/src/main/ets/default/TimeManager'; -import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; -import {DoNotDisturbType} from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; -import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel'; +import { concatTime } from '@ohos/common/src/main/ets/default/TimeManager'; +import ItemComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; +import {DoNotDisturbType} from '@ohos/managementcomponent/src/main/ets/com/ohos/common/constants'; +import NoDisturbingModel from '@ohos/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel'; import ViewModel from '../vm/noDisturbViewModel'; const deviceTypeInfo = deviceInfo.deviceType; diff --git a/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets b/feature/systemui/notificationmanagement/src/main/ets/pages/noDisturbPre.ets similarity index 85% rename from systemui4merge/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets rename to feature/systemui/notificationmanagement/src/main/ets/pages/noDisturbPre.ets index 644e3750..2a8e7f54 100644 --- a/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets +++ b/feature/systemui/notificationmanagement/src/main/ets/pages/noDisturbPre.ets @@ -15,11 +15,11 @@ //import Window from '@ohos.window'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; -import NoDisturbComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent'; -import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; -import ConfigData from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import HeadComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import NoDisturbComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent'; +import ItemComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; +import ConfigData from '@ohos/managementcomponent/src/main/ets/com/ohos/common/constants'; import Router from '@system.router'; const TAG = 'NotificationManagement-NoDisturbPre'; diff --git a/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/feature/systemui/notificationmanagement/src/main/ets/pages/notificationManagenment.ets similarity index 90% rename from systemui4merge/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets rename to feature/systemui/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index bd1cac65..2c12c06d 100644 --- a/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/feature/systemui/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -15,16 +15,16 @@ //import Window from '@ohos.window'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; -import NoDisturbComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent'; -import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import HeadComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import NoDisturbComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent'; +import ItemComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; import ConfigData from '../common/constants'; -import AppLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent'; +import AppLstComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent'; import Router from '@system.router'; import ViewModel from '../vm/notificationManagenmentViewModel' -import Notification from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; -import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; +import Notification from '@ohos/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; +import SwitchComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; const TAG = 'NotificationManagement-Main'; diff --git a/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets b/feature/systemui/notificationmanagement/src/main/ets/pages/setEnable.ets similarity index 87% rename from systemui4merge/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets rename to feature/systemui/notificationmanagement/src/main/ets/pages/setEnable.ets index 3b1ede91..4b238562 100644 --- a/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets +++ b/feature/systemui/notificationmanagement/src/main/ets/pages/setEnable.ets @@ -14,14 +14,14 @@ */ //import Window from '@ohos.window'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; -import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; -import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; -import SlotLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import HeadComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import AppItemComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; +import SwitchComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; +import SlotLstComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent'; import ConfigData from '../common/constants'; import Router from '@system.router' -import notificationListener from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; +import notificationListener from '@ohos/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; import Notification from '@ohos.notification'; const TAG = 'NotificationManagement-SetEnable'; diff --git a/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets b/feature/systemui/notificationmanagement/src/main/ets/pages/slotSetting.ets similarity index 92% rename from systemui4merge/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets rename to feature/systemui/notificationmanagement/src/main/ets/pages/slotSetting.ets index 7716af27..8b0e2e9d 100644 --- a/systemui4merge/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets +++ b/feature/systemui/notificationmanagement/src/main/ets/pages/slotSetting.ets @@ -13,14 +13,14 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; -import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; -import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import HeadComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; +import AppItemComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent'; +import SwitchComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent'; import ConfigData from '../common/constants'; -import NotificationConfigData from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; +import NotificationConfigData from '@ohos/managementcomponent/src/main/ets/com/ohos/common/constants'; import Router from '@system.router'; -import NotificationListener from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; +import NotificationListener from '@ohos/managementcomponent/src/main/ets/com/ohos/model/notificationListener'; import notification from '@ohos.notification'; const TAG = 'NotificationManagement-SlotSetting'; diff --git a/systemui4merge/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts b/feature/systemui/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts similarity index 90% rename from systemui4merge/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts rename to feature/systemui/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts index 21a2e1a8..cff9cbdd 100644 --- a/systemui4merge/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts +++ b/feature/systemui/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts @@ -14,10 +14,10 @@ */ import ConfigData from '../common/constants'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel'; -import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel'; -import FeaturesConfigData, {DoNotDisturbType} from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import NoDisturbingModel from '@ohos/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel'; +import NoDisturbComponentViewModel from '@ohos/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel'; +import FeaturesConfigData, {DoNotDisturbType} from '@ohos/managementcomponent/src/main/ets/com/ohos/common/constants'; const TAG = 'NotificationManagement-NoDisturbViewModel'; const CONST_DAY_LENGTH = 24*3600*1000; diff --git a/systemui4merge/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts b/feature/systemui/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts similarity index 83% rename from systemui4merge/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts rename to feature/systemui/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts index b683bd9f..ee1b2a48 100644 --- a/systemui4merge/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts +++ b/feature/systemui/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import BundleResourceModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import BundleResourceModel from '@ohos/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel'; import display from '@ohos.display'; -import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel'; +import NoDisturbComponentViewModel from '@ohos/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel'; import Router from '@system.router'; const TAG = 'NotificationManagement-NotificationManagenmentViewModel'; diff --git a/systemui4merge/product/default/notificationmanagement/src/main/module.json5 b/feature/systemui/notificationmanagement/src/main/module.json5 similarity index 85% rename from systemui4merge/product/default/notificationmanagement/src/main/module.json5 rename to feature/systemui/notificationmanagement/src/main/module.json5 index 27fe683a..c0b47843 100644 --- a/systemui4merge/product/default/notificationmanagement/src/main/module.json5 +++ b/feature/systemui/notificationmanagement/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "feature", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", - "mainElement": "com.ohos.systemui.notificationmanagement.MainAbility", + "mainElement": "com.ohos.sceneboard.notificationmanagement.MainAbility", "deviceTypes": [ "default", "tablet" @@ -23,7 +23,7 @@ { "visible": true, "srcEntrance": "./ets/MainAbility/MainAbility.ts", - "name": "com.ohos.systemui.notificationmanagement.MainAbility", + "name": "com.ohos.sceneboard.notificationmanagement.MainAbility", "icon": "$media:icon", "description": "$string:mainability_description", "label": "$string:app_name", diff --git a/systemui4merge/product/default/notificationmanagement/src/main/resources/base/element/color.json b/feature/systemui/notificationmanagement/src/main/resources/base/element/color.json similarity index 100% rename from systemui4merge/product/default/notificationmanagement/src/main/resources/base/element/color.json rename to feature/systemui/notificationmanagement/src/main/resources/base/element/color.json diff --git a/systemui4merge/product/default/notificationmanagement/src/main/resources/base/element/string.json b/feature/systemui/notificationmanagement/src/main/resources/base/element/string.json similarity index 100% rename from systemui4merge/product/default/notificationmanagement/src/main/resources/base/element/string.json rename to feature/systemui/notificationmanagement/src/main/resources/base/element/string.json diff --git a/systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/ic_back.svg b/feature/systemui/notificationmanagement/src/main/resources/base/media/ic_back.svg similarity index 100% rename from systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/ic_back.svg rename to feature/systemui/notificationmanagement/src/main/resources/base/media/ic_back.svg diff --git a/systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg b/feature/systemui/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg similarity index 100% rename from systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg rename to feature/systemui/notificationmanagement/src/main/resources/base/media/ic_settings_arrow.svg diff --git a/systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/icon.png b/feature/systemui/notificationmanagement/src/main/resources/base/media/icon.png similarity index 100% rename from systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/icon.png rename to feature/systemui/notificationmanagement/src/main/resources/base/media/icon.png diff --git a/systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/startWindowIcon.png b/feature/systemui/notificationmanagement/src/main/resources/base/media/startWindowIcon.png similarity index 100% rename from systemui4merge/product/default/notificationmanagement/src/main/resources/base/media/startWindowIcon.png rename to feature/systemui/notificationmanagement/src/main/resources/base/media/startWindowIcon.png diff --git a/systemui4merge/product/default/notificationmanagement/src/main/resources/base/profile/main_pages.json b/feature/systemui/notificationmanagement/src/main/resources/base/profile/main_pages.json similarity index 100% rename from systemui4merge/product/default/notificationmanagement/src/main/resources/base/profile/main_pages.json rename to feature/systemui/notificationmanagement/src/main/resources/base/profile/main_pages.json diff --git a/systemui4merge/product/default/notificationmanagement/src/main/resources/en_US/element/string.json b/feature/systemui/notificationmanagement/src/main/resources/en_US/element/string.json similarity index 100% rename from systemui4merge/product/default/notificationmanagement/src/main/resources/en_US/element/string.json rename to feature/systemui/notificationmanagement/src/main/resources/en_US/element/string.json diff --git a/systemui4merge/product/default/notificationmanagement/src/main/resources/zh_CN/element/string.json b/feature/systemui/notificationmanagement/src/main/resources/zh_CN/element/string.json similarity index 100% rename from systemui4merge/product/default/notificationmanagement/src/main/resources/zh_CN/element/string.json rename to feature/systemui/notificationmanagement/src/main/resources/zh_CN/element/string.json diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets index c4ec132b..ebe8de04 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -269,7 +269,7 @@ struct CenterTitle { settingClick() { Log.showDebug(TAG, ` settingClick `) // TODO 修改为合一服务的Ability - EventManager.publish(obtainStartAbility('com.ohos.systemui', 'com.ohos.systemui.notificationmanagement.MainAbility')) + EventManager.publish(obtainStartAbility('com.ohos.launcher', 'com.ohos.sceneboard.notificationmanagement.MainAbility')) } touchEvent(event: TouchEvent) { diff --git a/systemui4merge/features/managementcomponent/package.json b/systemui4merge/features/managementcomponent/package.json deleted file mode 100644 index 20b537d8..00000000 --- a/systemui4merge/features/managementcomponent/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies":{}, - "name":"@ohos/managementcomponent", - "description":"a npm package which contains managementcomponent function", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{} -} \ No newline at end of file diff --git a/systemui4merge/product/default/notificationmanagement/package.json b/systemui4merge/product/default/notificationmanagement/package.json deleted file mode 100644 index 4b1eae69..00000000 --- a/systemui4merge/product/default/notificationmanagement/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "devDependencies":{}, - "name":"default_notificationmanagement", - "ohos":{ - "org":"huawei", - "directoryLevel":"module", - "buildTool":"hvigor" - }, - "version":"1.0.0", - "dependencies":{ - "@ohos/managementcomponent":"file:../../../features/managementcomponent" - } -} \ No newline at end of file -- Gitee From ae89d2635f31c7c032f8dc912f7402270e68f97f Mon Sep 17 00:00:00 2001 From: chyyy0213 Date: Fri, 31 Mar 2023 18:57:23 +0800 Subject: [PATCH 354/373] bugfix for background lifecycle Signed-off-by: chyyy0213 --- .../scene/session/HWSceneContainerSession.ts | 6 +- .../scene/session/HWSceneSessionManager.ts | 1 + .../screen/session/HWScreenSession.ts | 66 ++++++++++--------- .../main/ets/WindowScene/HWGestureNavBar.ets | 17 +++-- .../src/main/ets/WindowScene/HWScene.ets | 11 ++-- .../main/ets/WindowScene/HWSceneContainer.ets | 24 ++----- .../src/main/ets/WindowScene/HWScenePanel.ets | 9 +-- 7 files changed, 65 insertions(+), 69 deletions(-) diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts b/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts index 49632729..cf2c4680 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts @@ -47,12 +47,12 @@ export class HWSceneContainerSession { public findSceneSession(persistentId: number): boolean { if (this.primarySession) { - if (this.primarySession.session.persistentId === persistentId) { + if (this.primarySession?.session.persistentId === persistentId) { return true } } - if (this.isSplit && this.secondarySession) { - if (this.primarySession.session.persistentId === persistentId) { + if (this.secondarySession) { + if (this.secondarySession?.session.persistentId === persistentId) { return true } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts index 0cd3c3d6..b5a652a0 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts @@ -53,6 +53,7 @@ export class HWSceneSessionManager { let hwSceneSession = screenSession.getSceneSession(sceneInfo) if (hwSceneSession == null || sceneInfo.isNewInstance) { + Log.showInfo(TAG, 'Cannot find session, to requestNew Session!') let sceneSession = sceneSessionManager.requestSceneSession( { bundleName: sceneInfo.bundleName, abilityName: sceneInfo.abilityName }) hwSceneSession = new HWSceneSession(sceneSession, sceneInfo) diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts index 4bfe5549..37a4b83d 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts @@ -92,18 +92,34 @@ export class HWScreenSession { return sceneContainerSessionIndex } - private updateListWhenRemove(sceneSession: HWSceneSession,) { + private updateListWhenRemove(sceneSession: HWSceneSession) { this.containerId = this.containerId + 1 let newContainerSession = new HWSceneContainerSession(sceneSession, this.bounds, this.containerId) newContainerSession.isActive = false let currIdx = this.sceneContainerSessionList.findIndex((containerSession) => { return containerSession.isActive == true}) if (currIdx < 0) { this.sceneContainerSessionList.push(newContainerSession) + Log.showInfo(TAG, 'after push list length: ' + this.sceneContainerSessionList.length + 'containerId: ' + newContainerSession.containerId) } else { this.sceneContainerSessionList.splice(currIdx, 0, newContainerSession) + Log.showInfo(TAG, 'after insert list length: ' + this.sceneContainerSessionList.length + 'containerId: ' + newContainerSession.containerId) } } + private addToSplitContainer(sceneSession: HWSceneSession) : boolean { + // TODO: add split from session + let listLen = this.sceneContainerSessionList.length + if (listLen >= 1) { + const sceneContainerSession = this.sceneContainerSessionList[listLen - 1] + if (!!sceneContainerSession && sceneContainerSession.isSplit) { + sceneContainerSession.addSession(sceneSession) + Log.showInfo(TAG, 'after add Split Session: ' + this.sceneContainerSessionList.length + 'And ContainerId: ' + sceneContainerSession.containerId) + return true + } + } + return false + } + /** * Add the scene session to this screen. * @param sceneSession The session of the scene which will be added to the screen @@ -112,7 +128,9 @@ export class HWScreenSession { Log.showInfo(TAG, 'Add scene session, id:' + sceneSession.session.persistentId) const sceneContainerSessionIndex = this.findSceneContainerSession(sceneSession.session.persistentId) if (sceneContainerSessionIndex != -1) { + Log.showInfo(TAG, 'find ContainerSessionIndex: ' + sceneContainerSessionIndex) const sceneContainerSession = this.sceneContainerSessionList[sceneContainerSessionIndex] + Log.showInfo(TAG, 'sceneContainerSession ContainerId: ' + sceneContainerSession.containerId) if (sceneContainerSession.primarySession && sceneContainerSession.primarySession.session.persistentId === sceneSession.session.persistentId) { sceneContainerSession.primarySession.isActive = true } else if (sceneContainerSession.secondarySession && sceneContainerSession.secondarySession.session.persistentId === sceneSession.session.persistentId) { @@ -120,21 +138,19 @@ export class HWScreenSession { } sceneContainerSession.isActive = true // adjust to top + Log.showInfo(TAG, 'Repeat to add scene session. isActive: ' + sceneSession.isActive) this.sceneContainerSessionList.splice(sceneContainerSessionIndex, 1); + if (this.addToSplitContainer(sceneSession)) { + return + } this.sceneContainerSessionList.push(sceneContainerSession); - Log.showInfo(TAG, 'Repeat to add scene session. And ContainerId: ' + this.containerId) + Log.showInfo(TAG, 'Repeat to add scene session. And ContainerId: ' + sceneContainerSession.containerId) return } // TODO: is splitScreen - let listLen = this.sceneContainerSessionList.length - if (listLen >= 1) { - const sceneContainerSession = this.sceneContainerSessionList[listLen - 1] - if (!!sceneContainerSession && sceneContainerSession.isSplit) { - sceneContainerSession.addSession(sceneSession) - Log.showInfo(TAG, 'after add Split Session: ' + this.sceneContainerSessionList.length) - return - } + if (this.addToSplitContainer(sceneSession)) { + return } this.containerId = this.containerId + 1 this.sceneContainerSessionList.push(new HWSceneContainerSession(sceneSession, this.bounds, this.containerId)) @@ -156,30 +172,17 @@ export class HWScreenSession { const sceneContainerSession = this.sceneContainerSessionList[sceneSessionIndex] if (sceneContainerSession.primarySession && sceneContainerSession.primarySession.session.persistentId === sceneSession.session.persistentId) { sceneContainerSession.primarySession.isActive = false -// sceneContainerSession.primarySession = null + sceneContainerSession.primarySession = null + Log.showInfo(TAG, 'exit primary session and containerId: ' + sceneContainerSession.containerId) } else if (sceneContainerSession.secondarySession && sceneContainerSession.secondarySession.session.persistentId === sceneSession.session.persistentId) { sceneContainerSession.secondarySession.isActive = false -// sceneContainerSession.secondarySession = null + sceneContainerSession.secondarySession = null + Log.showInfo(TAG, 'exit secondary session and containerId: ' + sceneContainerSession.containerId) } -// if (sceneContainerSession.primarySession) { -// if (!sceneContainerSession.primarySession.isActive) { -// if (!sceneContainerSession.secondarySession) { -// this.sceneContainerSessionList.splice(sceneSessionIndex, 1) -// } else { -// -// } -// } -// } -// if ((sceneContainerSession.primarySession && !sceneContainerSession.primarySession.isActive) || -// (sceneContainerSession.secondarySession && !sceneContainerSession.secondarySession.isActive)) { -// sceneContainerSession.isActive = false -// -// } - if ((!sceneContainerSession.primarySession && !sceneContainerSession.secondarySession) || - (sceneContainerSession.primarySession && !sceneContainerSession.primarySession.isActive && !sceneContainerSession.secondarySession) || - (sceneContainerSession.primarySession && !sceneContainerSession.primarySession.isActive && sceneContainerSession.secondarySession && !sceneContainerSession.secondarySession.isActive)) { + if (!sceneContainerSession.primarySession && !sceneContainerSession.secondarySession) { this.sceneContainerSessionList.splice(sceneSessionIndex, 1) + Log.showInfo(TAG, 'remove scene ContainerSession length: ' + this.sceneContainerSessionList.length) } this.updateListWhenRemove(sceneSession) Log.showInfo(TAG, 'after removeSceneSession sceneContainerList Length: ' + this.sceneContainerSessionList.length) @@ -192,7 +195,10 @@ export class HWScreenSession { */ public getSceneSession(sceneInfo: HWSceneInfo): HWSceneSession { for(var i: number = 0; i < this.sceneContainerSessionList.length; i++) { - return this.sceneContainerSessionList[i].getSceneSession(sceneInfo); + let sceneSession = this.sceneContainerSessionList[i].getSceneSession(sceneInfo); + if (sceneSession) { + return sceneSession + } } return null } diff --git a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets index 13c3a39e..cf1a8858 100644 --- a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets +++ b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets @@ -24,6 +24,13 @@ export struct HWGestureNavBar { @ObjectLink sceneContainerSession: HWSceneContainerSession @Link dividerParam : HWDividerParam + resetContainer() { + this.sceneContainerSession.translateX = 0 + this.sceneContainerSession.translateY = 0 + this.sceneContainerSession.scaleX = 1 + this.sceneContainerSession.scaleY = 1 + } + build() { // Gesture navigation bar Stack({alignContent: Alignment.Center}) { @@ -58,10 +65,6 @@ export struct HWGestureNavBar { .onActionEnd((event: GestureEvent) => { if ((event.offsetY < -200) && (event.offsetY > -400)) { this.sceneContainerSession.isSplit = true - this.sceneContainerSession.translateX = 0 - this.sceneContainerSession.translateY = 0 - this.sceneContainerSession.scaleX = 1 - this.sceneContainerSession.scaleY = 1 this.dividerParam.primaryH = ((100 - parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)) / 2) + '%' } else if (event.offsetY < -400) { this.sceneContainerSession.isActive = false @@ -71,12 +74,8 @@ export struct HWGestureNavBar { if (this.sceneContainerSession.secondarySession) { HWSceneSessionManager.getInstance().requestSceneBackground(this.sceneContainerSession.secondarySession) } - } else { - this.sceneContainerSession.translateX = 0 - this.sceneContainerSession.translateY = 0 - this.sceneContainerSession.scaleX = 1 - this.sceneContainerSession.scaleY = 1 } + this.resetContainer() })) } } diff --git a/product/phone/src/main/ets/WindowScene/HWScene.ets b/product/phone/src/main/ets/WindowScene/HWScene.ets index 14620c3b..bca8232b 100644 --- a/product/phone/src/main/ets/WindowScene/HWScene.ets +++ b/product/phone/src/main/ets/WindowScene/HWScene.ets @@ -25,9 +25,9 @@ export struct HWScene { buildLog(sceneSession:HWSceneSession) { if (sceneSession) { - Log.showInfo(TAG, 'HWSceneSession begin name: ' + sceneSession.sceneInfo.bundleName + 'id:' + sceneSession.session.persistentId) + Log.showInfo(TAG, 'HWScene build begin name: ' + sceneSession.sceneInfo.bundleName + 'id:' + sceneSession.session.persistentId) } else { - Log.showError(TAG, 'HWSceneSession is null') + Log.showError(TAG, 'HWScene build begin is null') } return true } @@ -36,10 +36,9 @@ export struct HWScene { build() { Stack({alignContent: Alignment.TopStart}) { if (this.buildLog(this.sceneSession)) {} - if (this.sceneSession) { - HostWindowScene(this.sceneSession.session) - .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) - } + + HostWindowScene(this.sceneSession?.session) + .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) // Status bar } } diff --git a/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets b/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets index b19c5662..c5423250 100644 --- a/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets +++ b/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets @@ -28,24 +28,14 @@ const TAG = 'HWSceneContainer' export struct HWSceneContainer { @ObjectLink sceneContainerSession: HWSceneContainerSession @State dividerParam : HWDividerParam = new HWDividerParam() - buildLog(sceneSession : HWSceneSession) { - if (sceneSession && sceneSession.sceneInfo) { - Log.showInfo(TAG, 'scene container session begin name: ' + sceneSession.sceneInfo.bundleName) - Log.showInfo(TAG,'id:' + sceneSession.session.persistentId) - Log.showInfo(TAG,'HWSceneContainer translateY:' + this.sceneContainerSession.translateY) - - } else { - if (!sceneSession) { - Log.showError(TAG, 'sceneSession is null: ' + typeof(sceneSession)) - } - Log.showError(TAG, 'this.sceneContainerSession.primarySession: ' + JSON.stringify(this.sceneContainerSession.primarySession)) - } - Log.showInfo(TAG,'HWDivider : ' + this.dividerParam.translateY) + buildLog() { + Log.showInfo(TAG, 'scene container session build begin ' + ' isActive: ' + this.sceneContainerSession.isActive + ' containerId: ' + this.sceneContainerSession.containerId) +// Log.showInfo(TAG,'primarySession : ' + JSON.stringify(this.sceneContainerSession.primarySession) + 'secondarySession:' + JSON.stringify(this.sceneContainerSession.secondarySession)) return true } secondaryLog() { - Log.showError(TAG, 'secondary session posY: ' + this.dividerParam.secondaryScaleY) + Log.showError(TAG, 'secondary session build begin: ') return true } @@ -63,8 +53,8 @@ export struct HWSceneContainer { build() { Stack({alignContent: Alignment.TopStart}) { Column() { - if (this.buildLog(this.sceneContainerSession.primarySession)) {} - if (this.sceneContainerSession.primarySession.isActive) { + if (this.buildLog()) {} + if (this.sceneContainerSession.primarySession && this.sceneContainerSession.primarySession.isActive) { HWScene({sceneSession : this.sceneContainerSession.primarySession}) .width('100%') .height(this.dividerParam.primaryH) @@ -77,7 +67,7 @@ export struct HWSceneContainer { HWDivider({dividerParam : $dividerParam, screenBounds : this.sceneContainerSession.bounds}) } // When primary Exit - if ((!!this.sceneContainerSession.secondarySession) && this.sceneContainerSession.secondarySession.isActive) { + if (this.sceneContainerSession.secondarySession && this.sceneContainerSession.secondarySession.isActive && this.secondaryLog() ) { HWScene({ sceneSession: this.sceneContainerSession.secondarySession }) .scale({y:this.dividerParam.secondaryScaleY, centerY : 0}) .blur(this.dividerParam.blurRadius) diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index 2b27dfe9..77495750 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -25,8 +25,9 @@ const TAG = 'HWScenePanel' export struct HWScenePanel { @ObjectLink sceneContainerSessionList: SceneContainerSessionArray - buildLog(isActive:boolean) { - Log.showInfo(TAG, 'HWScenePanel scene session list length:' + this.sceneContainerSessionList.length + 'isActive:' +isActive) + buildLog(containerSession:HWSceneContainerSession) { + Log.showInfo(TAG, 'HWScenePanel build begin scene session list length: ' + this.sceneContainerSessionList.length + ' isActive: ' +containerSession.isActive + + ' containerId: ' + containerSession.containerId) return true } @@ -35,10 +36,10 @@ export struct HWScenePanel { // Full screen scene, using scroll to manager multitask scene. Scroll() { ForEach(this.sceneContainerSessionList, (item: HWSceneContainerSession) => { - if (this.buildLog(item.isActive) && !!item && item.isActive) { + if (this.buildLog(item) && !!item && item.isActive) { HWSceneContainer({sceneContainerSession: item}) } - }, (item: HWSceneContainerSession) => item.primarySession.session.persistentId.toString()) + }, (item: HWSceneContainerSession) => item.containerId.toString()) } .scrollable(ScrollDirection.Horizontal) -- Gitee From 1a39f82367b84e066ea337e1b7cc322591b5d9db Mon Sep 17 00:00:00 2001 From: qpzeng Date: Mon, 3 Apr 2023 14:51:32 +0800 Subject: [PATCH 355/373] add recent view Signed-off-by: qpzeng --- common/index.ets | 1 + ...sitionEffect.ets => HWTransitionEffect.ts} | 0 .../scene/session/HWRecentViewParam.ts | 74 +++++ .../scene/session/HWSceneContainerSession.ts | 114 +++++--- .../scene/session/HWSceneSession.ts | 4 +- .../scene/session/HWSceneSessionManager.ts | 263 ++++++++++-------- .../screen/session/HWScreenSession.ts | 221 ++++++++------- .../ets/default/constants/StyleConstants.ts | 3 +- .../src/main/ets/WindowScene/HWDivider.ets | 21 +- .../main/ets/WindowScene/HWGestureNavBar.ets | 123 ++++---- .../src/main/ets/WindowScene/HWScene.ets | 23 +- .../main/ets/WindowScene/HWSceneContainer.ets | 113 +++++--- .../src/main/ets/WindowScene/HWScenePanel.ets | 95 +++++-- .../src/main/ets/WindowScene/HWScreen.ets | 10 +- 14 files changed, 650 insertions(+), 415 deletions(-) rename common/src/main/ets/WindowScene/animation/{HWTransitionEffect.ets => HWTransitionEffect.ts} (100%) create mode 100644 common/src/main/ets/WindowScene/scene/session/HWRecentViewParam.ts diff --git a/common/index.ets b/common/index.ets index 5a2aec1e..c871e7be 100644 --- a/common/index.ets +++ b/common/index.ets @@ -90,6 +90,7 @@ export { DragItemPosition } from './src/main/ets/default/interface/DragItemPosi export { HWRootSceneSession } from './src/main/ets/WindowScene/scene/session/HWRootSceneSession' export { HWSceneInfo } from './src/main/ets/WindowScene/scene/session/HWSceneInfo' export { HWDividerParam } from './src/main/ets/WindowScene/scene/session/HWDividerParam' +export { HWRecentViewParam } from './src/main/ets/WindowScene/scene/session/HWRecentViewParam' export { HWSceneSession } from './src/main/ets/WindowScene/scene/session/HWSceneSession' export { HWSceneSessionManager } from './src/main/ets/WindowScene/scene/session/HWSceneSessionManager' export { HWScreenSession, SceneContainerSessionArray } from './src/main/ets/WindowScene/screen/session/HWScreenSession' diff --git a/common/src/main/ets/WindowScene/animation/HWTransitionEffect.ets b/common/src/main/ets/WindowScene/animation/HWTransitionEffect.ts similarity index 100% rename from common/src/main/ets/WindowScene/animation/HWTransitionEffect.ets rename to common/src/main/ets/WindowScene/animation/HWTransitionEffect.ts diff --git a/common/src/main/ets/WindowScene/scene/session/HWRecentViewParam.ts b/common/src/main/ets/WindowScene/scene/session/HWRecentViewParam.ts new file mode 100644 index 00000000..fb86955e --- /dev/null +++ b/common/src/main/ets/WindowScene/scene/session/HWRecentViewParam.ts @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2023 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. + */ + +/** + * param of RecentView + */ +@Observed +export class HWRecentViewParam { + /** + * translateX of RecentView + */ + translateX: number = 0; + + /** + * translateY of RecentView + */ + translateY: number = 0; + + /** + * scaleX of RecentView + */ + scaleX: number = 1; + + /** + * scaleY of RecentView + */ + scaleY: number = 1; + + /** + * centerX of RecentView + */ + centerX: number | string = '50%'; + + /** + * centerY of RecentView + */ + centerY: number | string = '50%'; + + /** + * offsetX of RecentView + */ + offsetX: number = 0; + + /** + * offsetY of RecentView + */ + offsetY: number = 0; + + /** + * init properties of RecentView + */ + public init() { + this.translateX = 0; + this.translateY = 0; + this.scaleX = 1; + this.scaleY = 1; + this.centerX = '50%'; + this.centerY = '50%'; + this.offsetX = 0; + this.offsetY = 0; + } +} diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts b/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts index cf2c4680..f3254147 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts @@ -15,71 +15,95 @@ import screenSessionManager from '@ohos.screenSessionManager' import { HWSceneSession } from './HWSceneSession' -import { HWSceneInfo } from '../../scene/session/HWSceneInfo' +import { HWDividerParam } from './HWDividerParam' import { Log } from '../../../default/utils/Log' const TAG = 'HWSceneContainerSession' + /** * Session of a scene. */ @Observed export class HWSceneContainerSession { - public primarySession: HWSceneSession - public secondarySession: HWSceneSession - public bounds: screenSessionManager.RRect - isSplit: boolean = false - isActive: boolean = true - translateX: number = 0 - translateY: number = 0 - scaleX: number = 1 - scaleY: number = 1 - containerId : number = 0 + readonly containerId: number; + primarySession: HWSceneSession = null; + secondarySession: HWSceneSession = null; + screenBounds: screenSessionManager.RRect; + dividerParam: HWDividerParam = new HWDividerParam(); + isSplit: boolean = false; + isActive: boolean = false; + translateX: number = 0; + translateY: number = 0; + scaleX: number = 1; + scaleY: number = 1; + centerX: number | string = '50%'; + centerY: number | string = '50%'; + + private static gContainerId: number = 0; + /** * Constructor. */ - constructor(primarySession: HWSceneSession, screenBounds : screenSessionManager.RRect, containerId : number) { - Log.showInfo(TAG, 'new primary scene session, id:' + primarySession.session.persistentId) - this.primarySession = primarySession - this.bounds = screenBounds - this.containerId = containerId - this.secondarySession = null + constructor(primarySession: HWSceneSession, screenBounds: screenSessionManager.RRect) { + this.containerId = ++HWSceneContainerSession.gContainerId; + this.primarySession = primarySession; + this.secondarySession = null; + this.screenBounds = screenBounds; } - public findSceneSession(persistentId: number): boolean { - if (this.primarySession) { - if (this.primarySession?.session.persistentId === persistentId) { - return true - } + /** + * Add scene session to this container. + * @param sceneSession The scene session to add. + */ + public addSceneSession(sceneSession: HWSceneSession) { + if (sceneSession === null) { + Log.showError(TAG, 'Add scene session failed as scene session is null!'); + return; + } + if (this.primarySession !== null && this.secondarySession !== null) { + Log.showError(TAG, 'Add scene session failed!'); + return; } - if (this.secondarySession) { - if (this.secondarySession?.session.persistentId === persistentId) { - return true - } + if (this.primarySession === sceneSession || this.secondarySession === sceneSession) { + Log.showError(TAG, 'Add scene session failed as scene session is already existed!'); + return; } - return false + if (this.primarySession === null) { + this.primarySession = sceneSession; + return; + } + this.secondarySession = sceneSession; } - public getSceneSession(sceneInfo: HWSceneInfo) : HWSceneSession { - if (this.primarySession) { - if (this.primarySession.sceneInfo.abilityName === sceneInfo.abilityName && - this.primarySession.sceneInfo.bundleName === sceneInfo.bundleName) { - return this.primarySession - } + /** + * Remove scene session from this container. + * @param sceneSession The scene session to remove. + */ + public removeSceneSession(sceneSession: HWSceneSession) { + if (sceneSession === null) { + Log.showError(TAG, 'Remove scene session failed as scene session is null!'); + return; } - if (this.isSplit && this.secondarySession) { - if (this.secondarySession.sceneInfo.abilityName === sceneInfo.abilityName && - this.secondarySession.sceneInfo.bundleName === sceneInfo.bundleName) { - return this.secondarySession - } + if (this.primarySession === null || this.secondarySession === null) { + Log.showError(TAG, 'Remove scene session failed!'); + return; + } + if (this.primarySession === sceneSession) { + this.primarySession = this.secondarySession; + this.secondarySession = null; + } else if (this.secondarySession === sceneSession) { + this.secondarySession = null; + } else { + Log.showWarn(TAG, 'Remove scene session failed as the scene session is not in this container!'); } - return null } - public addSession(sceneSession: HWSceneSession) { - if (!this.primarySession) { - this.primarySession = sceneSession - return - } - this.secondarySession = sceneSession + public init() { + this.translateX = 0; + this.translateY = 0; + this.scaleX = 1; + this.scaleY = 1; + this.centerX = '50%'; + this.centerY = '50%'; } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ts b/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ts index c46309fa..d1c20d82 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ts +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ts @@ -26,7 +26,7 @@ import { HWTransitionEffect } from '../../animation/HWTransitionEffect' export class HWSceneSession { readonly sceneInfo: HWSceneInfo readonly session: sceneSessionManager.SceneSession - isActive: boolean = true + isActive: boolean = false translateX: number = 0 translateY: number = 0 scaleX: number = 1 @@ -52,6 +52,6 @@ export class HWSceneSession { this.sceneInfo.transitionEffect = HWTransitionEffect.DISAPPEAR_FROM_SCENE HWSceneSessionManager.getInstance().startScene(toSceneInfo) - HWSceneSessionManager.getInstance().requestSceneBackground(this) +// HWSceneSessionManager.getInstance().requestSceneBackground(this) } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts index b5a652a0..83eb4e93 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts @@ -18,148 +18,185 @@ import ServiceExtensionContext from 'application/ServiceExtensionContext' import { HWRootSceneSession } from './HWRootSceneSession' import { HWSceneInfo } from './HWSceneInfo' import { HWSceneSession } from './HWSceneSession' +import { HWSceneContainerSession } from './HWSceneContainerSession' import { HWScreenSession } from '../../screen/session/HWScreenSession' import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager' import { Log } from '../../../default/utils/Log' -const TAG = 'HWSceneSessionManager' +const TAG = 'HWSceneSessionManager'; /** * Scene session manager */ export class HWSceneSessionManager { - private rootSceneSession: HWRootSceneSession - - private constructor() { - this.rootSceneSession = new HWRootSceneSession() + private rootSceneSession: HWRootSceneSession; + + private constructor() { + this.rootSceneSession = new HWRootSceneSession(); + } + + /** + * Get the singleton of the scene session manager. + */ + static getInstance(): HWSceneSessionManager { + if (!globalThis.HWSceneSessionManagerInstance) { + globalThis.HWSceneSessionManagerInstance = new HWSceneSessionManager(); } - /** - * Get the singleton of the scene session manager. - */ - static getInstance(): HWSceneSessionManager { - if (!globalThis.HWSceneSessionManagerInstance) { - globalThis.HWSceneSessionManagerInstance = new HWSceneSessionManager() - } - - return globalThis.HWSceneSessionManagerInstance + return globalThis.HWSceneSessionManagerInstance; + } + + private async requestSceneSessionActivation(sceneSession: HWSceneSession): Promise { + sceneSessionManager.requestSceneSessionActivation(sceneSession.session); + } + + private async requestSceneSessionBackground(sceneSession: HWSceneSession): Promise { + sceneSessionManager.requestSceneSessionBackground(sceneSession.session); + } + + private async requestSceneSessionDestruction(sceneSession: HWSceneSession): Promise { + sceneSessionManager.requestSceneSessionDestruction(sceneSession.session); + } + + /** + * Get the session of the root scene. + * @return Session of the root scene + */ + public getRootSceneSession(): HWRootSceneSession { + return this.rootSceneSession; + } + + /** + * Load the ui content of the root scene. + * @param path Path of the page which the root scene will be loaded + * @param context Context of the service extension + */ + public loadContent(path: string, context: ServiceExtensionContext): void { + this.rootSceneSession.loadContent(path, context); + } + + /** + * Start a scene. + * @param sceneInfo The info of the scene which to be activated + */ + public startScene(sceneInfo: HWSceneInfo) { + Log.showInfo(TAG, 'start scene:' + ' bundle:' + sceneInfo.bundleName + ' ability:' + sceneInfo.abilityName + + ' screenId:' + sceneInfo.screenId + ' isNewInstance:' + sceneInfo.isNewInstance); + let screenSession: HWScreenSession = null; + if (sceneInfo.screenId === -1) { + screenSession = HWScreenSessionManager.getInstance().getMainScreenSession(); + sceneInfo.screenId = screenSession.session.screenId; + } else { + screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneInfo.screenId); } - private requestSceneSession(sceneInfo: HWSceneInfo, screenSession: HWScreenSession): HWSceneSession { - if (screenSession == null) { - Log.showError(TAG, 'Undefined screen!') - return null - } - - let hwSceneSession = screenSession.getSceneSession(sceneInfo) - if (hwSceneSession == null || sceneInfo.isNewInstance) { - Log.showInfo(TAG, 'Cannot find session, to requestNew Session!') - let sceneSession = sceneSessionManager.requestSceneSession( - { bundleName: sceneInfo.bundleName, abilityName: sceneInfo.abilityName }) - hwSceneSession = new HWSceneSession(sceneSession, sceneInfo) - } - - return hwSceneSession + if (screenSession == null) { + Log.showError(TAG, 'Failed to get screen session!'); + return; } - private async requestSceneSessionActivation(sceneSession: HWSceneSession): Promise { - sceneSessionManager.requestSceneSessionActivation(sceneSession.session) + let sceneSession = this.requestSceneSession(sceneInfo, screenSession); + if (sceneSession == null) { + Log.showError(TAG, 'Failed to request scene session!'); + return; } - private async requestSceneSessionBackground(sceneSession: HWSceneSession): Promise { - sceneSessionManager.requestSceneSessionBackground(sceneSession.session) + if (AppStorage.Get('desktopState') === 'Home') { + let sceneContainerSession = screenSession.getSceneContainerSession(sceneSession); + if (sceneContainerSession === null) { + sceneContainerSession = new HWSceneContainerSession(sceneSession, screenSession.bounds); + screenSession.addSceneContainerSession(sceneContainerSession); + } + this.requestSceneContainerActivation(sceneContainerSession); + screenSession.enterAppView(sceneContainerSession); + } else if (AppStorage.Get('desktopState') === 'Split') { + let sceneContainerSession = screenSession.getSceneContainerSession(sceneSession); + if (sceneContainerSession !== null) { + screenSession.removeSceneContainerSession(sceneContainerSession); + } + let activeSceneContainerSession = screenSession.getActiveSceneContainerSession(); + activeSceneContainerSession.addSceneSession(sceneSession); + this.requestSceneSessionActivation(sceneSession); + screenSession.enterAppView(activeSceneContainerSession); } + } - private async requestSceneSessionDestruction(sceneSession: HWSceneSession): Promise { - sceneSessionManager.requestSceneSessionDestruction(sceneSession.session) + private requestSceneSession(sceneInfo: HWSceneInfo, screenSession: HWScreenSession): HWSceneSession { + if (screenSession == null) { + Log.showError(TAG, 'The screen session is null!'); + return null; } - /** - * Get the session of the root scene. - * @return Session of the root scene - */ - public getRootSceneSession(): HWRootSceneSession { - return this.rootSceneSession + let hwSceneSession = screenSession.getSceneSession(sceneInfo); + if (hwSceneSession == null || sceneInfo.isNewInstance) { + let sceneSession = sceneSessionManager.requestSceneSession({ + bundleName: sceneInfo.bundleName, + abilityName: sceneInfo.abilityName + }); + hwSceneSession = new HWSceneSession(sceneSession, sceneInfo); } - /** - * Load the ui content of the root scene. - * @param path Path of the page which the root scene will be loaded - * @param context Context of the service extension - */ - public loadContent(path: string, context: ServiceExtensionContext): void { - this.rootSceneSession.loadContent(path, context) + return hwSceneSession; + } + + /** + * Request the scene container session activation. + * @param sceneContainerSession The session of the scene container which to be activated. + */ + public requestSceneContainerActivation(sceneContainerSession: HWSceneContainerSession) { + if (sceneContainerSession === null) { + Log.showError(TAG, 'The scene container session is null!'); + return; } - - /** - * Start a scene. - * @param sceneInfo The info of the scene which to be activated - */ - public startScene(sceneInfo: HWSceneInfo) { - Log.showInfo(TAG, 'start scene:' + 'bundle:' + sceneInfo.bundleName + ' ability:' + sceneInfo.abilityName + ' screenId:' + - sceneInfo.screenId + ' isNewInstance:' + sceneInfo.isNewInstance) - let screenSession: HWScreenSession = null - if (sceneInfo.screenId === -1) { - screenSession = HWScreenSessionManager.getInstance().getMainScreenSession() - sceneInfo.screenId = screenSession.session.screenId - } else { - screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneInfo.screenId) - } - - if (screenSession == null) { - Log.showError(TAG, 'Failed to get screen session!') - return - } - - let sceneSession = this.requestSceneSession(sceneInfo, screenSession) - screenSession.addSceneSession(sceneSession) - this.requestSceneSessionActivation(sceneSession) + if (sceneContainerSession.isActive) { + Log.showError(TAG, 'The scene is already active.'); + return; } - /** - * Request the scene session activation. - * @param sceneSession The session of the scene which to be activated - */ - public requestSceneActivation(sceneSession: HWSceneSession) { - if (sceneSession.isActive) { - Log.showError(TAG, 'The scene is already active.') - return - } - - sceneSession.isActive = true - this.requestSceneSessionActivation(sceneSession) + Log.showInfo(TAG, 'Request scene container session activation, id: ' + sceneContainerSession.containerId); + sceneContainerSession.isActive = true; + this.requestSceneSessionActivation(sceneContainerSession.primarySession); + if (sceneContainerSession.isSplit) { + this.requestSceneSessionActivation(sceneContainerSession.secondarySession); + } + } + + /** + * Request the scene container session background. + * @param sceneContainerSession The session of the scene container which to be background. + */ + public requestSceneContainerBackground(sceneContainerSession: HWSceneContainerSession) { + if (sceneContainerSession === null) { + Log.showError(TAG, 'The scene container session is null!'); + return; + } + if (!sceneContainerSession.isActive) { + Log.showError(TAG, 'The scene is already background.'); + return; } - /** - * Request the scene session background. - * @param sceneSession The session of the scene which to be background - */ - public requestSceneBackground(sceneSession: HWSceneSession) { - if (!sceneSession.isActive) { - Log.showError(TAG, 'The scene is already background.') - return - } - - // TODO temp test - let screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneSession.sceneInfo.screenId) - if (screenSession != null) { - screenSession.removeSceneSession(sceneSession) - } - - sceneSession.isActive = false - this.requestSceneSessionBackground(sceneSession) + Log.showInfo(TAG, 'Request scene container session background, id: ' + sceneContainerSession.containerId); + sceneContainerSession.isActive = false; + this.requestSceneSessionBackground(sceneContainerSession.primarySession); + if (sceneContainerSession.isSplit) { + this.requestSceneSessionBackground(sceneContainerSession.secondarySession); + } + } + + /** + * Request the scene container session destruction. + * @param sceneContainerSession The session of the scene container which to be destroyed. + */ + public requestSceneContainerDestruction(sceneContainerSession: HWSceneContainerSession) { + if (sceneContainerSession === null) { + Log.showError(TAG, 'The scene container session is null!'); + return; } - /** - * Request the scene session destruction. - * @param sceneSession The session of the scene which to be destroyed - */ - public requestSceneDestruction(sceneSession: HWSceneSession) { - let screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneSession.sceneInfo.screenId) - if (screenSession != null) { - screenSession.removeSceneSession(sceneSession) - } - - this.requestSceneSessionDestruction(sceneSession) + Log.showInfo(TAG, 'Request scene container session destruction, id: ' + sceneContainerSession.containerId); + this.requestSceneSessionDestruction(sceneContainerSession.primarySession); + if (sceneContainerSession.isSplit) { + this.requestSceneSessionDestruction(sceneContainerSession.secondarySession); } + } } diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts index 37a4b83d..874f686d 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts @@ -16,28 +16,33 @@ import screenSessionManager from '@ohos.screenSessionManager' import { HWSceneSession } from '../../scene/session/HWSceneSession' import { HWSceneContainerSession } from '../../scene/session/HWSceneContainerSession' +import { HWRecentViewParam } from '../../scene/session/HWRecentViewParam'; import { Log } from '../../../default/utils/Log' import { HWSceneInfo } from '../../scene/session/HWSceneInfo' const TAG = 'HWScreenSession' -@Observed -export class SceneSessionArray extends Array { -} - @Observed export class SceneContainerSessionArray extends Array { } + /** * Session of a screen. */ @Observed export class HWScreenSession { - public readonly session: screenSessionManager.ScreenSession - public bounds: screenSessionManager.RRect - public rotation: number - public sceneContainerSessionList: SceneContainerSessionArray = new SceneContainerSessionArray() - containerId : number = 0 + public readonly session: screenSessionManager.ScreenSession; + public bounds: screenSessionManager.RRect = { + left: 0, + top: 0, + width: 0, + height: 0, + radius: 0 + }; + public rotation: number = 0; + public sceneContainerSessionList: SceneContainerSessionArray = new SceneContainerSessionArray(); + public recentViewParam: HWRecentViewParam = new HWRecentViewParam(); + /** * Constructor. * @param session Session of the screen @@ -53,9 +58,6 @@ export class HWScreenSession { this.session.on('propertyChange', (screenProperty: screenSessionManager.ScreenProperty) => { this.onScreenPropertyChange(screenProperty) }) - - this.rotation = 0 - this.bounds = { left:0, top:0, width:0, height:0, radius:0 } } private updateProperty(screenProperty: screenSessionManager.ScreenProperty) { @@ -85,121 +87,124 @@ export class HWScreenSession { this.updateProperty(screenProperty) } - private findSceneContainerSession(persistentId: number): number { - const sceneContainerSessionIndex = this.sceneContainerSessionList.findIndex(item => { - return item.findSceneSession(persistentId) - }) - return sceneContainerSessionIndex - } - - private updateListWhenRemove(sceneSession: HWSceneSession) { - this.containerId = this.containerId + 1 - let newContainerSession = new HWSceneContainerSession(sceneSession, this.bounds, this.containerId) - newContainerSession.isActive = false - let currIdx = this.sceneContainerSessionList.findIndex((containerSession) => { return containerSession.isActive == true}) - if (currIdx < 0) { - this.sceneContainerSessionList.push(newContainerSession) - Log.showInfo(TAG, 'after push list length: ' + this.sceneContainerSessionList.length + 'containerId: ' + newContainerSession.containerId) - } else { - this.sceneContainerSessionList.splice(currIdx, 0, newContainerSession) - Log.showInfo(TAG, 'after insert list length: ' + this.sceneContainerSessionList.length + 'containerId: ' + newContainerSession.containerId) + /** + * Add the scene container session to this screen. + * @param sceneContainerSession The scene container session which will be added to this screen. + */ + public addSceneContainerSession(sceneContainerSession: HWSceneContainerSession): void { + const index = this.sceneContainerSessionList.findIndex(item => { + return item.containerId === sceneContainerSession.containerId; + }); + if (index == -1) { + Log.showInfo(TAG, 'Add scene container session, id: ' + sceneContainerSession.containerId); + this.sceneContainerSessionList.push(sceneContainerSession); } } - private addToSplitContainer(sceneSession: HWSceneSession) : boolean { - // TODO: add split from session - let listLen = this.sceneContainerSessionList.length - if (listLen >= 1) { - const sceneContainerSession = this.sceneContainerSessionList[listLen - 1] - if (!!sceneContainerSession && sceneContainerSession.isSplit) { - sceneContainerSession.addSession(sceneSession) - Log.showInfo(TAG, 'after add Split Session: ' + this.sceneContainerSessionList.length + 'And ContainerId: ' + sceneContainerSession.containerId) - return true - } + /** + * Remove the scene container session from this screen. + * @param sceneContainerSession The scene container session which will be removed from this screen. + */ + public removeSceneContainerSession(sceneContainerSession: HWSceneContainerSession): void { + const index = this.sceneContainerSessionList.findIndex((item) => { + return item.containerId === sceneContainerSession.containerId; + }); + if (index != -1) { + Log.showInfo(TAG, 'Remove scene container session, id: ' + sceneContainerSession.containerId); + this.sceneContainerSessionList.splice(index, 1); } - return false } /** - * Add the scene session to this screen. - * @param sceneSession The session of the scene which will be added to the screen + * Get the scene session by the scene information. + * @param sceneInfo The information of the scene + * @return Session of the scene */ - public addSceneSession(sceneSession: HWSceneSession): void { - Log.showInfo(TAG, 'Add scene session, id:' + sceneSession.session.persistentId) - const sceneContainerSessionIndex = this.findSceneContainerSession(sceneSession.session.persistentId) - if (sceneContainerSessionIndex != -1) { - Log.showInfo(TAG, 'find ContainerSessionIndex: ' + sceneContainerSessionIndex) - const sceneContainerSession = this.sceneContainerSessionList[sceneContainerSessionIndex] - Log.showInfo(TAG, 'sceneContainerSession ContainerId: ' + sceneContainerSession.containerId) - if (sceneContainerSession.primarySession && sceneContainerSession.primarySession.session.persistentId === sceneSession.session.persistentId) { - sceneContainerSession.primarySession.isActive = true - } else if (sceneContainerSession.secondarySession && sceneContainerSession.secondarySession.session.persistentId === sceneSession.session.persistentId) { - sceneContainerSession.secondarySession.isActive = true + public getSceneSession(sceneInfo: HWSceneInfo): HWSceneSession { + for (let i = 0; i < this.sceneContainerSessionList.length; ++i) { + let primarySession = this.sceneContainerSessionList[i].primarySession; + let secondarySession = this.sceneContainerSessionList[i].secondarySession; + if (primarySession && + primarySession.sceneInfo.bundleName == sceneInfo.bundleName && + primarySession.sceneInfo.abilityName == sceneInfo.abilityName) { + return primarySession; } - sceneContainerSession.isActive = true - // adjust to top - Log.showInfo(TAG, 'Repeat to add scene session. isActive: ' + sceneSession.isActive) - this.sceneContainerSessionList.splice(sceneContainerSessionIndex, 1); - if (this.addToSplitContainer(sceneSession)) { - return + if (secondarySession && + secondarySession.sceneInfo.bundleName == sceneInfo.bundleName && + secondarySession.sceneInfo.abilityName == sceneInfo.abilityName) { + return secondarySession; } - this.sceneContainerSessionList.push(sceneContainerSession); - Log.showInfo(TAG, 'Repeat to add scene session. And ContainerId: ' + sceneContainerSession.containerId) - return } + return null; + } - // TODO: is splitScreen - if (this.addToSplitContainer(sceneSession)) { - return + public getSceneContainerSession(sceneSession: HWSceneSession): HWSceneContainerSession { + if (sceneSession === null) { + return null; } - this.containerId = this.containerId + 1 - this.sceneContainerSessionList.push(new HWSceneContainerSession(sceneSession, this.bounds, this.containerId)) - Log.showInfo(TAG, 'after addSceneSession sceneContainerList Length: ' + this.sceneContainerSessionList.length + 'containerId: ' + this.containerId) + const index = this.sceneContainerSessionList.findIndex((item) => { + return item.primarySession === sceneSession || item.secondarySession === sceneSession; + }); + if (index === -1) { + return null; + } + return this.sceneContainerSessionList[index]; } - /** - * Remove the scene session from this screen. - * @param sceneSession The session of the scene which will be removed from the screen - */ - public removeSceneSession(sceneSession: HWSceneSession): void { - Log.showInfo(TAG, 'Remove scene session, id:' + sceneSession.session.persistentId) - const sceneSessionIndex = this.findSceneContainerSession(sceneSession.session.persistentId) - if (sceneSessionIndex == -1) { - Log.showError(TAG, 'Can not find the scene session.') - return + public getActiveSceneContainerSession(): HWSceneContainerSession { + const index = this.sceneContainerSessionList.findIndex((item) => { + return item.isActive === true; + }); + if (index === -1) { + Log.showError(TAG, 'Failed to find active scene container session.'); + return null; } + return this.sceneContainerSessionList[index]; + } - const sceneContainerSession = this.sceneContainerSessionList[sceneSessionIndex] - if (sceneContainerSession.primarySession && sceneContainerSession.primarySession.session.persistentId === sceneSession.session.persistentId) { - sceneContainerSession.primarySession.isActive = false - sceneContainerSession.primarySession = null - Log.showInfo(TAG, 'exit primary session and containerId: ' + sceneContainerSession.containerId) - } else if (sceneContainerSession.secondarySession && sceneContainerSession.secondarySession.session.persistentId === sceneSession.session.persistentId) { - sceneContainerSession.secondarySession.isActive = false - sceneContainerSession.secondarySession = null - Log.showInfo(TAG, 'exit secondary session and containerId: ' + sceneContainerSession.containerId) - } + private refreshList() { + // To trigger ForEach build + let tmp = this.sceneContainerSessionList; + this.sceneContainerSessionList = []; + this.sceneContainerSessionList = tmp; + } - if (!sceneContainerSession.primarySession && !sceneContainerSession.secondarySession) { - this.sceneContainerSessionList.splice(sceneSessionIndex, 1) - Log.showInfo(TAG, 'remove scene ContainerSession length: ' + this.sceneContainerSessionList.length) - } - this.updateListWhenRemove(sceneSession) - Log.showInfo(TAG, 'after removeSceneSession sceneContainerList Length: ' + this.sceneContainerSessionList.length) + public enterHomeView() { + AppStorage.Set('desktopState', 'Home'); + this.recentViewParam.init(); + + this.refreshList(); } - /** - * Get the scene session by the scene information. - * @param sceneInfo The information of the scene - * @return Session of the scene - */ - public getSceneSession(sceneInfo: HWSceneInfo): HWSceneSession { - for(var i: number = 0; i < this.sceneContainerSessionList.length; i++) { - let sceneSession = this.sceneContainerSessionList[i].getSceneSession(sceneInfo); - if (sceneSession) { - return sceneSession - } - } - return null + public enterAppView(sceneContainerSession: HWSceneContainerSession) { + AppStorage.Set('desktopState', 'App'); + this.recentViewParam.init(); + sceneContainerSession.init(); + + // To move the sceneContainerSession to the last of list. + this.removeSceneContainerSession(sceneContainerSession); + this.addSceneContainerSession(sceneContainerSession); + + this.refreshList(); + } + + public enterRecentView() { + AppStorage.Set('desktopState', 'Recent'); + this.recentViewParam.translateX = 0; + this.recentViewParam.translateY = 0; + this.recentViewParam.scaleX = 0.7; + this.recentViewParam.scaleY = 0.7; + this.recentViewParam.centerX = '100%'; + this.recentViewParam.centerY = '50%'; + + this.refreshList(); + } + + public enterSplitView(sceneContainerSession: HWSceneContainerSession) { + AppStorage.Set('desktopState', 'Split'); + this.recentViewParam.init(); + sceneContainerSession.isSplit = true; + + this.refreshList(); } } diff --git a/common/src/main/ets/default/constants/StyleConstants.ts b/common/src/main/ets/default/constants/StyleConstants.ts index ca7f1a9d..d6fb0e04 100644 --- a/common/src/main/ets/default/constants/StyleConstants.ts +++ b/common/src/main/ets/default/constants/StyleConstants.ts @@ -67,8 +67,7 @@ export class StyleConstants { static readonly PERCENTAGE_75 = '75%'; static readonly PERCENTAGE_70 = '70%'; static readonly PERCENTAGE_15 = '15%'; - static readonly PERCENTAGE_48 = '48%'; - static readonly PERCENTAGE_DIVIDER_HEIGHT = '4%'; + static readonly PERCENTAGE_DIVIDER_HEIGHT = '2%'; static readonly DEFAULT_APP_IMAGE = '/common/pics/img_app_default.png'; static readonly DEFAULT_DELETE_IMAGE = '/common/pics/ic_public_delete.svg'; static readonly DEFAULT_BACKGROUND_IMAGE_RECENT = '/common/pics/ic_wallpaper_recent.jpg'; diff --git a/product/phone/src/main/ets/WindowScene/HWDivider.ets b/product/phone/src/main/ets/WindowScene/HWDivider.ets index 767c3ebf..46e0a7b8 100644 --- a/product/phone/src/main/ets/WindowScene/HWDivider.ets +++ b/product/phone/src/main/ets/WindowScene/HWDivider.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { HWDividerParam,StyleConstants } from '@ohos/common' +import { HWDividerParam, StyleConstants } from '@ohos/common' import { Log } from '@ohos/common' import screenSessionManager from '@ohos.screenSessionManager' @@ -21,10 +21,11 @@ const TAG = 'HWDivider' @Component export struct HWDivider { - @Link dividerParam : HWDividerParam - screenBounds : screenSessionManager.RRect + @Link dividerParam: HWDividerParam + screenBounds: screenSessionManager.RRect + buildLog1() { - Log.showInfo(TAG, "Action Update "+ " priScaleY: " + this.dividerParam.primaryScaleY + " secScaleY: " + this.dividerParam.secondaryScaleY) + Log.showInfo(TAG, "Action Update " + " priScaleY: " + this.dividerParam.primaryScaleY + " secScaleY: " + this.dividerParam.secondaryScaleY) Log.showInfo(TAG, "event.offsetY: " + this.dividerParam.translateY) return true } @@ -47,12 +48,12 @@ export struct HWDivider { build() { // Divider - Stack({alignContent: Alignment.Center}) { + Stack({ alignContent: Alignment.Center }) { Button() - .backgroundColor(Color.Gray) - .width('35%') - .height('70%') - .gesture(PanGesture({distance: 1}) + .backgroundColor(Color.White) + .width('25%') + .height('80%') + .gesture(PanGesture({ distance: 1 }) .onActionStart((event: GestureEvent) => { this.dividerParam.blurRadius = 50 }) @@ -78,7 +79,7 @@ export struct HWDivider { this.dividerParam.blurRadius = 0 })) } - .translate({y: this.dividerParam.translateY}) + .translate({ y: this.dividerParam.translateY }) .width('100%') .height(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT) .backgroundColor(Color.Black) diff --git a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets index cf1a8858..beef5b80 100644 --- a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets +++ b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets @@ -13,69 +13,78 @@ * limitations under the License. */ -import { HWSceneContainerSession, HWSceneSessionManager, HWDividerParam } from '@ohos/common' -import { Log } from '@ohos/common' -import { StyleConstants } from '@ohos/common' +import { HWSceneContainerSession, HWDividerParam, HWRecentViewParam } from '@ohos/common'; +import { HWSceneSessionManager, HWScreenSessionManager } from '@ohos/common'; +import { HWScreenSession } from '@ohos/common'; +import { Log } from '@ohos/common'; +import { StyleConstants } from '@ohos/common'; -const TAG = 'HWGestureNavBar' +const TAG = 'HWGestureNavBar'; @Component export struct HWGestureNavBar { - @ObjectLink sceneContainerSession: HWSceneContainerSession - @Link dividerParam : HWDividerParam - - resetContainer() { - this.sceneContainerSession.translateX = 0 - this.sceneContainerSession.translateY = 0 - this.sceneContainerSession.scaleX = 1 - this.sceneContainerSession.scaleY = 1 - } + @Link sceneContainerSession: HWSceneContainerSession; + @Link screenSession: HWScreenSession; + @Link dividerParam: HWDividerParam; + @Link recentViewParam: HWRecentViewParam; build() { - // Gesture navigation bar - Stack({alignContent: Alignment.Center}) { - Button() - .backgroundColor(Color.Black) - .width('35%') - .height('25%') - } - .position({y: '96%'}) - .width('100%') - .height('4%') - .gesture(PanGesture() - .onActionStart((event: GestureEvent) => { + // Gesture navigation bar + Stack({ alignContent: Alignment.Center }) { + Button() + .backgroundColor(Color.Black) + .width('35%') + .height('25%') + } + .position({ y: '97%' }) + .width('100%') + .height('3%') + .backgroundColor(Color.Transparent) + .gesture(PanGesture() + .onActionStart((event: GestureEvent) => { + AppStorage.Set('desktopState', 'Recent'); + + let recentViewSceneSpace = 50; + let scrollWidth = + this.screenSession.sceneContainerSessionList.length * this.sceneContainerSession.screenBounds.width + + (this.screenSession.sceneContainerSessionList.length - 1) * recentViewSceneSpace; + this.recentViewParam.offsetX = this.sceneContainerSession.screenBounds.width - scrollWidth; + + this.recentViewParam.centerX = + (1 - this.sceneContainerSession.screenBounds.width / 2 / scrollWidth) * 100 + '%'; + this.recentViewParam.centerY = '100%'; + }) + .onActionUpdate((event: GestureEvent) => { + let translateRatio = 0.6 * Math.pow(this.recentViewParam.scaleX, 2) + 0.4; + this.recentViewParam.translateX = event.offsetX * translateRatio; + if (1 + event.offsetY / this.sceneContainerSession.screenBounds.height * 1.3 > 0.25) { + this.recentViewParam.translateY = event.offsetY; + } - }) - .onActionUpdate((event: GestureEvent) => { - Log.showInfo(TAG,'onActionUpdate:' + event.offsetY) - // TODO temp test - this.sceneContainerSession.translateX = event.offsetX - if (event.offsetY < 0) { - this.sceneContainerSession.translateY = event.offsetY - this.sceneContainerSession.scaleX = 1 + event.offsetY / 1280 - this.sceneContainerSession.scaleY = 1 + event.offsetY / 1280 - } else { - this.sceneContainerSession.translateY = 0 - this.sceneContainerSession.scaleX = 1 - this.sceneContainerSession.scaleY = 1 - } - }) - .onActionCancel(() => { - }) - .onActionEnd((event: GestureEvent) => { - if ((event.offsetY < -200) && (event.offsetY > -400)) { - this.sceneContainerSession.isSplit = true - this.dividerParam.primaryH = ((100 - parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)) / 2) + '%' - } else if (event.offsetY < -400) { - this.sceneContainerSession.isActive = false - this.sceneContainerSession.isSplit = false - this.dividerParam.init() - HWSceneSessionManager.getInstance().requestSceneBackground(this.sceneContainerSession.primarySession) - if (this.sceneContainerSession.secondarySession) { - HWSceneSessionManager.getInstance().requestSceneBackground(this.sceneContainerSession.secondarySession) - } - } - this.resetContainer() - })) + this.recentViewParam.scaleX = + 1 + this.recentViewParam.translateY / this.sceneContainerSession.screenBounds.height * 1.3; + this.recentViewParam.scaleX = Math.max(this.recentViewParam.scaleX, 0.25); + this.recentViewParam.scaleX = Math.min(this.recentViewParam.scaleX, 1); + this.recentViewParam.scaleY = this.recentViewParam.scaleX; + }) + .onActionEnd((event: GestureEvent) => { + if (event.offsetY < -400) { + HWSceneSessionManager.getInstance().requestSceneContainerBackground(this.sceneContainerSession); + this.screenSession.enterHomeView(); + } else if (event.offsetY < -200) { + this.dividerParam.primaryH = ((100 - parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)) / 2) + '%'; + this.sceneContainerSession.isSplit = true; + this.screenSession.enterSplitView(this.sceneContainerSession); + } else if (event.offsetY < -100) { + let recentViewSceneSpace = 50; + let scrollWidth = + this.screenSession.sceneContainerSessionList.length * this.sceneContainerSession.screenBounds.width + + (this.screenSession.sceneContainerSessionList.length - 1) * recentViewSceneSpace; + this.recentViewParam.offsetX = this.sceneContainerSession.screenBounds.width - scrollWidth; + this.screenSession.enterRecentView(); + } else { + this.screenSession.enterAppView(this.sceneContainerSession); + } + })) } } diff --git a/product/phone/src/main/ets/WindowScene/HWScene.ets b/product/phone/src/main/ets/WindowScene/HWScene.ets index bca8232b..c9ed3c23 100644 --- a/product/phone/src/main/ets/WindowScene/HWScene.ets +++ b/product/phone/src/main/ets/WindowScene/HWScene.ets @@ -21,25 +21,24 @@ const TAG = 'HWScene' @Component export struct HWScene { - @ObjectLink sceneSession: HWSceneSession + sceneSession: HWSceneSession - buildLog(sceneSession:HWSceneSession) { + buildLog(sceneSession: HWSceneSession) { if (sceneSession) { - Log.showInfo(TAG, 'HWScene build begin name: ' + sceneSession.sceneInfo.bundleName + 'id:' + sceneSession.session.persistentId) + Log.showInfo(TAG, 'HWSceneSession bundle name: ' + sceneSession.sceneInfo.bundleName + ' id: ' + sceneSession.session.persistentId); + return true; } else { - Log.showError(TAG, 'HWScene build begin is null') + Log.showError(TAG, 'HWSceneSession is null'); + return false; } - return true } - build() { - Stack({alignContent: Alignment.TopStart}) { - if (this.buildLog(this.sceneSession)) {} - - HostWindowScene(this.sceneSession?.session) - .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) - // Status bar + Stack() { + if (this.buildLog(this.sceneSession)) { + HostWindowScene(this.sceneSession.session) + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + } } } } diff --git a/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets b/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets index c5423250..e52c650c 100644 --- a/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets +++ b/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets @@ -15,73 +15,106 @@ import curves from '@ohos.curves' import { HWSceneContainerSession, HWDividerParam } from '@ohos/common' +import { HWRecentViewParam } from '@ohos/common'; +import { HWScreenSession } from '@ohos/common'; +import { HWSceneSessionManager } from '@ohos/common'; import { HWScene } from './HWScene' import { HWGestureNavBar } from './HWGestureNavBar' import { HWDivider } from './HWDivider' import { Log } from '@ohos/common' import { StyleConstants } from '@ohos/common' -import { HWSceneSession } from '@ohos/common' const TAG = 'HWSceneContainer' @Component export struct HWSceneContainer { - @ObjectLink sceneContainerSession: HWSceneContainerSession - @State dividerParam : HWDividerParam = new HWDividerParam() - buildLog() { - Log.showInfo(TAG, 'scene container session build begin ' + ' isActive: ' + this.sceneContainerSession.isActive + ' containerId: ' + this.sceneContainerSession.containerId) -// Log.showInfo(TAG,'primarySession : ' + JSON.stringify(this.sceneContainerSession.primarySession) + 'secondarySession:' + JSON.stringify(this.sceneContainerSession.secondarySession)) - return true - } - - secondaryLog() { - Log.showError(TAG, 'secondary session build begin: ') - return true - } - - getSecondaryCenterY() { - let centerY = this.sceneContainerSession.bounds.height * (parseFloat(this.dividerParam.primaryH) + parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)) * 0.01 - return centerY; - } - - getSecondaryH(): string { - let str = (100 - parseFloat(this.dividerParam.primaryH) - parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)).toString(); - str += "%"; - return str; - } + @ObjectLink sceneContainerSession: HWSceneContainerSession; + @Link screenSession: HWScreenSession; + @ObjectLink dividerParam: HWDividerParam; + @Link recentViewParam: HWRecentViewParam; + @StorageLink('desktopState') desktopState: string = 'Home'; build() { - Stack({alignContent: Alignment.TopStart}) { + Stack() { Column() { - if (this.buildLog()) {} - if (this.sceneContainerSession.primarySession && this.sceneContainerSession.primarySession.isActive) { - HWScene({sceneSession : this.sceneContainerSession.primarySession}) + if (this.sceneContainerSession.primarySession) { + HWScene({ sceneSession: this.sceneContainerSession.primarySession }) .width('100%') .height(this.dividerParam.primaryH) - .scale({y:this.dividerParam.primaryScaleY, centerY: 0}) + .scale({ y: this.dividerParam.primaryScaleY, centerY: 0 }) .blur(this.dividerParam.blurRadius) } // divider if (this.sceneContainerSession.isSplit) { - HWDivider({dividerParam : $dividerParam, screenBounds : this.sceneContainerSession.bounds}) + HWDivider({ dividerParam: $dividerParam, screenBounds: this.sceneContainerSession.screenBounds }) } + // When primary Exit - if (this.sceneContainerSession.secondarySession && this.sceneContainerSession.secondarySession.isActive && this.secondaryLog() ) { + if (this.sceneContainerSession.secondarySession) { HWScene({ sceneSession: this.sceneContainerSession.secondarySession }) - .scale({y:this.dividerParam.secondaryScaleY, centerY : 0}) + .scale({ y: this.dividerParam.secondaryScaleY, centerY: 0 }) .blur(this.dividerParam.blurRadius) - .translate({y:this.dividerParam.secTransY}) + .translate({ y: this.dividerParam.secTransY }) .flexShrink(1) } - // Freedom scene } - .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) - HWGestureNavBar({ sceneContainerSession: this.sceneContainerSession, dividerParam: $dividerParam }) + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + + if (this.desktopState === 'Recent') { + Stack() { + } + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + .hitTestBehavior(HitTestMode.Default) + .onClick(() => { + let activeSceneContainerSession = this.screenSession.getActiveSceneContainerSession(); + if (activeSceneContainerSession && + activeSceneContainerSession.containerId !== this.sceneContainerSession.containerId) { + HWSceneSessionManager.getInstance().requestSceneContainerBackground(activeSceneContainerSession); + } + + HWSceneSessionManager.getInstance().requestSceneContainerActivation(this.sceneContainerSession); + this.screenSession.enterAppView(this.sceneContainerSession); + }) + .gesture( + PanGesture({ direction: PanDirection.Vertical }) + .onActionStart((event: GestureEvent) => { + }) + .onActionUpdate((event: GestureEvent) => { + if (event.offsetY < 100) { + this.sceneContainerSession.translateY = event.offsetY; + } + }) + .onActionEnd((event: GestureEvent) => { + if (event.offsetY < -300) { + HWSceneSessionManager.getInstance().requestSceneContainerDestruction(this.sceneContainerSession); + + this.screenSession.removeSceneContainerSession(this.sceneContainerSession); + if (this.screenSession.sceneContainerSessionList.length == 0) { + this.screenSession.enterHomeView(); + } + } else { + this.sceneContainerSession.translateY = 0; + } + })) + } + + if (this.desktopState !== 'Recent' && this.desktopState !== 'Split') { + HWGestureNavBar({ + sceneContainerSession: $sceneContainerSession, + screenSession: $screenSession, + dividerParam: $dividerParam, + recentViewParam: $recentViewParam, + }) + } } - .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) - .translate({x: this.sceneContainerSession.translateX, y: this.sceneContainerSession.translateY}) - .scale({x: this.sceneContainerSession.scaleX, y: this.sceneContainerSession.scaleY}) - .animation({curve: curves.responsiveSpringMotion()}) + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + .translate({ x: this.sceneContainerSession.translateX, y: this.sceneContainerSession.translateY }) + .scale({ + x: this.sceneContainerSession.scaleX, + y: this.sceneContainerSession.scaleY, + centerX: this.sceneContainerSession.centerX, + centerY: this.sceneContainerSession.centerY + }) } } diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index 77495750..9142878a 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -13,39 +13,90 @@ * limitations under the License. */ -import { HWSceneSession, SceneContainerSessionArray, HWSceneContainerSession } from '@ohos/common' -import { HWSceneContainer } from './HWSceneContainer' -import { HWScene } from './HWScene' -import { Log } from '@ohos/common' -import { StyleConstants } from '@ohos/common' +import { HWScreenSession } from '@ohos/common'; +import { HWRecentViewParam } from '@ohos/common'; +import { HWSceneContainerSession } from '@ohos/common'; +import { HWSceneSessionManager } from '@ohos/common'; +import { HWSceneContainer } from './HWSceneContainer'; +import { Log } from '@ohos/common'; +import { StyleConstants } from '@ohos/common'; -const TAG = 'HWScenePanel' +const TAG = 'HWScenePanel'; @Component export struct HWScenePanel { - @ObjectLink sceneContainerSessionList: SceneContainerSessionArray + @StorageLink('desktopState') @Watch('onDesktopStateChanged') desktopState: string = 'Home'; + @ObjectLink screenSession: HWScreenSession; + @ObjectLink recentViewParam: HWRecentViewParam; + @State recentViewHitTestMode: HitTestMode = HitTestMode.None; + @State scrollDirection: ScrollDirection = ScrollDirection.None; + @State mBlurRadius: number = 20; - buildLog(containerSession:HWSceneContainerSession) { - Log.showInfo(TAG, 'HWScenePanel build begin scene session list length: ' + this.sceneContainerSessionList.length + ' isActive: ' +containerSession.isActive + - ' containerId: ' + containerSession.containerId) - return true + private scroller: Scroller = new Scroller(); + + onDesktopStateChanged() { + if (this.desktopState === 'Recent') { + this.recentViewHitTestMode = HitTestMode.Default; + this.scrollDirection = ScrollDirection.Horizontal; + } else { + this.recentViewHitTestMode = HitTestMode.None; + this.scrollDirection = ScrollDirection.None; + } + } + + buildLog(sceneContainerSession: HWSceneContainerSession) { + Log.showInfo(TAG, `sceneContainerSession id: ${sceneContainerSession.containerId}`); + Log.showInfo(TAG, `sceneContainerSession isActive: ${sceneContainerSession.isActive}`); + return true; } build() { - Stack({alignContent: Alignment.TopStart}) { - // Full screen scene, using scroll to manager multitask scene. - Scroll() { - ForEach(this.sceneContainerSessionList, (item: HWSceneContainerSession) => { - if (this.buildLog(item) && !!item && item.isActive) { - HWSceneContainer({sceneContainerSession: item}) - } - }, (item: HWSceneContainerSession) => item.containerId.toString()) + Stack({ alignContent: Alignment.TopStart }) { + if (this.desktopState === 'App' || this.desktopState === 'Recent') { + Stack() { + } + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + .blur(this.mBlurRadius) + } + + Scroll(this.scroller) { +// Flex({ direction: FlexDirection.Row }) { + Row({ space: 50 }) { + ForEach(this.screenSession.sceneContainerSessionList, (item: HWSceneContainerSession) => { + if (this.desktopState === 'Recent' || (this.buildLog(item) && item.isActive)) { + HWSceneContainer({ + sceneContainerSession: item, + screenSession: $screenSession, + dividerParam: item.dividerParam, + recentViewParam: $recentViewParam + }) + } + }, (item: HWSceneContainerSession) => item.containerId.toString()) + } + .hitTestBehavior(HitTestMode.None) + .translate({ x: this.recentViewParam.translateX, y: this.recentViewParam.translateY }) + .scale({ + x: this.recentViewParam.scaleX, + y: this.recentViewParam.scaleY, + centerX: this.recentViewParam.centerX, + centerY: this.recentViewParam.centerY + }) + .offset({ x: this.recentViewParam.offsetX, y: this.recentViewParam.offsetY }) } - .scrollable(ScrollDirection.Horizontal) + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + .scrollBar(BarState.Off) + .scrollable(this.scrollDirection) + .edgeEffect(EdgeEffect.Spring) + .hitTestBehavior(this.recentViewHitTestMode) + .onClick(() => { + let activeSceneContainerSession = this.screenSession.getActiveSceneContainerSession(); + HWSceneSessionManager.getInstance().requestSceneContainerBackground(activeSceneContainerSession); + this.screenSession.enterHomeView(); + }) // Freedom scene } - .size({width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100}) - .hitTestBehavior(HitTestMode.Transparent) + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + .hitTestBehavior(HitTestMode.None) } } diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index 08a8f98b..35b8dfab 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -13,7 +13,6 @@ * limitations under the License. */ -import curves from '@ohos.curves' import { HWScenePanel } from './HWScenePanel' import { HWScreenSession } from '@ohos/common' import { HWDesktop } from './HWDesktop' @@ -33,12 +32,15 @@ export struct HWScreen { HWDesktop() // Scene - HWScenePanel({sceneContainerSessionList: this.screenSession.sceneContainerSessionList}) + HWScenePanel({ + screenSession: this.screenSession, + recentViewParam: this.screenSession.recentViewParam + }) // Systemui - HWSystemUi({bounds : this.screenSession.bounds}) + HWSystemUi({ bounds: this.screenSession.bounds }) } - .position({x: this.screenSession.bounds.left, y: this.screenSession.bounds.top}) + .position({ x: this.screenSession.bounds.left, y: this.screenSession.bounds.top }) .width(this.screenSession.bounds.width) .height(this.screenSession.bounds.height) } -- Gitee From 8efa086cc8f80e5fc7e638b52e28fd3cf946bd58 Mon Sep 17 00:00:00 2001 From: qpzeng Date: Tue, 4 Apr 2023 11:17:50 +0800 Subject: [PATCH 356/373] modify desktop state as enum type Signed-off-by: qpzeng --- common/index.ets | 2 +- .../scene/session/HWSceneSessionManager.ts | 6 ++-- .../screen/session/HWScreenSession.ts | 34 +++++++------------ .../main/ets/WindowScene/HWGestureNavBar.ets | 8 ++--- .../main/ets/WindowScene/HWSceneContainer.ets | 10 +++--- .../src/main/ets/WindowScene/HWScenePanel.ets | 23 ++++--------- 6 files changed, 32 insertions(+), 51 deletions(-) diff --git a/common/index.ets b/common/index.ets index c871e7be..80b6cda6 100644 --- a/common/index.ets +++ b/common/index.ets @@ -93,6 +93,6 @@ export { HWDividerParam } from './src/main/ets/WindowScene/scene/session/HWDivid export { HWRecentViewParam } from './src/main/ets/WindowScene/scene/session/HWRecentViewParam' export { HWSceneSession } from './src/main/ets/WindowScene/scene/session/HWSceneSession' export { HWSceneSessionManager } from './src/main/ets/WindowScene/scene/session/HWSceneSessionManager' -export { HWScreenSession, SceneContainerSessionArray } from './src/main/ets/WindowScene/screen/session/HWScreenSession' +export { HWScreenSession, DesktopState, SceneContainerSessionArray } from './src/main/ets/WindowScene/screen/session/HWScreenSession' export { HWScreenSessionManager } from './src/main/ets/WindowScene/screen/session/HWScreenSessionManager' export { HWSceneContainerSession } from './src/main/ets/WindowScene/scene/session/HWSceneContainerSession' \ No newline at end of file diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts index 83eb4e93..097a365b 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts +++ b/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts @@ -19,7 +19,7 @@ import { HWRootSceneSession } from './HWRootSceneSession' import { HWSceneInfo } from './HWSceneInfo' import { HWSceneSession } from './HWSceneSession' import { HWSceneContainerSession } from './HWSceneContainerSession' -import { HWScreenSession } from '../../screen/session/HWScreenSession' +import { HWScreenSession, DesktopState } from '../../screen/session/HWScreenSession' import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager' import { Log } from '../../../default/utils/Log' @@ -101,7 +101,7 @@ export class HWSceneSessionManager { return; } - if (AppStorage.Get('desktopState') === 'Home') { + if (screenSession.desktopState === DesktopState.HOME) { let sceneContainerSession = screenSession.getSceneContainerSession(sceneSession); if (sceneContainerSession === null) { sceneContainerSession = new HWSceneContainerSession(sceneSession, screenSession.bounds); @@ -109,7 +109,7 @@ export class HWSceneSessionManager { } this.requestSceneContainerActivation(sceneContainerSession); screenSession.enterAppView(sceneContainerSession); - } else if (AppStorage.Get('desktopState') === 'Split') { + } else if (screenSession.desktopState === DesktopState.SPLIT) { let sceneContainerSession = screenSession.getSceneContainerSession(sceneSession); if (sceneContainerSession !== null) { screenSession.removeSceneContainerSession(sceneContainerSession); diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts index 874f686d..b8f2a4a5 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts @@ -26,6 +26,13 @@ const TAG = 'HWScreenSession' export class SceneContainerSessionArray extends Array { } +export enum DesktopState { + HOME, + APP, + SPLIT, + RECENT +} + /** * Session of a screen. */ @@ -42,6 +49,7 @@ export class HWScreenSession { public rotation: number = 0; public sceneContainerSessionList: SceneContainerSessionArray = new SceneContainerSessionArray(); public recentViewParam: HWRecentViewParam = new HWRecentViewParam(); + public desktopState: DesktopState = DesktopState.HOME; /** * Constructor. @@ -162,49 +170,33 @@ export class HWScreenSession { return this.sceneContainerSessionList[index]; } - private refreshList() { - // To trigger ForEach build - let tmp = this.sceneContainerSessionList; - this.sceneContainerSessionList = []; - this.sceneContainerSessionList = tmp; - } - public enterHomeView() { - AppStorage.Set('desktopState', 'Home'); + this.desktopState = DesktopState.HOME; this.recentViewParam.init(); - - this.refreshList(); } public enterAppView(sceneContainerSession: HWSceneContainerSession) { - AppStorage.Set('desktopState', 'App'); + this.desktopState = DesktopState.APP; this.recentViewParam.init(); sceneContainerSession.init(); // To move the sceneContainerSession to the last of list. this.removeSceneContainerSession(sceneContainerSession); this.addSceneContainerSession(sceneContainerSession); - - this.refreshList(); } public enterRecentView() { - AppStorage.Set('desktopState', 'Recent'); + this.desktopState = DesktopState.RECENT; this.recentViewParam.translateX = 0; this.recentViewParam.translateY = 0; this.recentViewParam.scaleX = 0.7; this.recentViewParam.scaleY = 0.7; this.recentViewParam.centerX = '100%'; this.recentViewParam.centerY = '50%'; - - this.refreshList(); } - public enterSplitView(sceneContainerSession: HWSceneContainerSession) { - AppStorage.Set('desktopState', 'Split'); + public enterSplitView() { + this.desktopState = DesktopState.SPLIT; this.recentViewParam.init(); - sceneContainerSession.isSplit = true; - - this.refreshList(); } } diff --git a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets index beef5b80..145e5658 100644 --- a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets +++ b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets @@ -14,8 +14,8 @@ */ import { HWSceneContainerSession, HWDividerParam, HWRecentViewParam } from '@ohos/common'; -import { HWSceneSessionManager, HWScreenSessionManager } from '@ohos/common'; -import { HWScreenSession } from '@ohos/common'; +import { HWSceneSessionManager } from '@ohos/common'; +import { HWScreenSession, DesktopState } from '@ohos/common'; import { Log } from '@ohos/common'; import { StyleConstants } from '@ohos/common'; @@ -42,7 +42,7 @@ export struct HWGestureNavBar { .backgroundColor(Color.Transparent) .gesture(PanGesture() .onActionStart((event: GestureEvent) => { - AppStorage.Set('desktopState', 'Recent'); + this.screenSession.desktopState = DesktopState.RECENT; let recentViewSceneSpace = 50; let scrollWidth = @@ -74,7 +74,7 @@ export struct HWGestureNavBar { } else if (event.offsetY < -200) { this.dividerParam.primaryH = ((100 - parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)) / 2) + '%'; this.sceneContainerSession.isSplit = true; - this.screenSession.enterSplitView(this.sceneContainerSession); + this.screenSession.enterSplitView(); } else if (event.offsetY < -100) { let recentViewSceneSpace = 50; let scrollWidth = diff --git a/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets b/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets index e52c650c..19413b0f 100644 --- a/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets +++ b/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets @@ -16,7 +16,7 @@ import curves from '@ohos.curves' import { HWSceneContainerSession, HWDividerParam } from '@ohos/common' import { HWRecentViewParam } from '@ohos/common'; -import { HWScreenSession } from '@ohos/common'; +import { HWScreenSession, DesktopState } from '@ohos/common'; import { HWSceneSessionManager } from '@ohos/common'; import { HWScene } from './HWScene' import { HWGestureNavBar } from './HWGestureNavBar' @@ -29,10 +29,9 @@ const TAG = 'HWSceneContainer' @Component export struct HWSceneContainer { @ObjectLink sceneContainerSession: HWSceneContainerSession; - @Link screenSession: HWScreenSession; + @ObjectLink screenSession: HWScreenSession; @ObjectLink dividerParam: HWDividerParam; @Link recentViewParam: HWRecentViewParam; - @StorageLink('desktopState') desktopState: string = 'Home'; build() { Stack() { @@ -61,7 +60,7 @@ export struct HWSceneContainer { } .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) - if (this.desktopState === 'Recent') { + if (this.screenSession.desktopState === DesktopState.RECENT) { Stack() { } .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) @@ -99,7 +98,8 @@ export struct HWSceneContainer { })) } - if (this.desktopState !== 'Recent' && this.desktopState !== 'Split') { + if (this.screenSession.desktopState !== DesktopState.RECENT + && this.screenSession.desktopState !== DesktopState.SPLIT) { HWGestureNavBar({ sceneContainerSession: $sceneContainerSession, screenSession: $screenSession, diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index 9142878a..5d068b60 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { HWScreenSession } from '@ohos/common'; +import { HWScreenSession, DesktopState } from '@ohos/common'; import { HWRecentViewParam } from '@ohos/common'; import { HWSceneContainerSession } from '@ohos/common'; import { HWSceneSessionManager } from '@ohos/common'; @@ -25,7 +25,6 @@ const TAG = 'HWScenePanel'; @Component export struct HWScenePanel { - @StorageLink('desktopState') @Watch('onDesktopStateChanged') desktopState: string = 'Home'; @ObjectLink screenSession: HWScreenSession; @ObjectLink recentViewParam: HWRecentViewParam; @State recentViewHitTestMode: HitTestMode = HitTestMode.None; @@ -34,16 +33,6 @@ export struct HWScenePanel { private scroller: Scroller = new Scroller(); - onDesktopStateChanged() { - if (this.desktopState === 'Recent') { - this.recentViewHitTestMode = HitTestMode.Default; - this.scrollDirection = ScrollDirection.Horizontal; - } else { - this.recentViewHitTestMode = HitTestMode.None; - this.scrollDirection = ScrollDirection.None; - } - } - buildLog(sceneContainerSession: HWSceneContainerSession) { Log.showInfo(TAG, `sceneContainerSession id: ${sceneContainerSession.containerId}`); Log.showInfo(TAG, `sceneContainerSession isActive: ${sceneContainerSession.isActive}`); @@ -52,7 +41,7 @@ export struct HWScenePanel { build() { Stack({ alignContent: Alignment.TopStart }) { - if (this.desktopState === 'App' || this.desktopState === 'Recent') { + if (this.screenSession.desktopState === DesktopState.APP || this.screenSession.desktopState === DesktopState.RECENT) { Stack() { } .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) @@ -63,10 +52,10 @@ export struct HWScenePanel { // Flex({ direction: FlexDirection.Row }) { Row({ space: 50 }) { ForEach(this.screenSession.sceneContainerSessionList, (item: HWSceneContainerSession) => { - if (this.desktopState === 'Recent' || (this.buildLog(item) && item.isActive)) { + if (this.screenSession.desktopState === DesktopState.RECENT || (this.buildLog(item) && item.isActive)) { HWSceneContainer({ sceneContainerSession: item, - screenSession: $screenSession, + screenSession: this.screenSession, dividerParam: item.dividerParam, recentViewParam: $recentViewParam }) @@ -85,9 +74,9 @@ export struct HWScenePanel { } .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) .scrollBar(BarState.Off) - .scrollable(this.scrollDirection) + .scrollable(this.screenSession.desktopState === DesktopState.RECENT ? ScrollDirection.Horizontal : ScrollDirection.None) .edgeEffect(EdgeEffect.Spring) - .hitTestBehavior(this.recentViewHitTestMode) + .hitTestBehavior(this.screenSession.desktopState === DesktopState.RECENT ? HitTestMode.Default : HitTestMode.None) .onClick(() => { let activeSceneContainerSession = this.screenSession.getActiveSceneContainerSession(); HWSceneSessionManager.getInstance().requestSceneContainerBackground(activeSceneContainerSession); -- Gitee From 8a910fbb1b721db775efcdb0ec61914c0b692dcd Mon Sep 17 00:00:00 2001 From: fanjiaojiao Date: Mon, 10 Apr 2023 11:36:16 +0800 Subject: [PATCH 357/373] =?UTF-8?q?jsdoc=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: fanjiaojiao --- .../screenlock/src/main/ets/com/ohos/model/accountsModel.ts | 2 +- .../screenlock/src/main/ets/com/ohos/model/screenLockModel.ts | 2 +- .../screenlock/src/main/ets/com/ohos/model/screenLockService.ts | 2 +- features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts | 2 +- .../screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts | 2 +- .../screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts | 2 +- .../screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts | 2 +- product/pc/src/main/ets/vm/slideScreenLockViewModel.ts | 2 +- product/phone/src/main/ets/vm/slideScreenLockViewModel.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index 1927666d..29ca8a30 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -17,7 +17,7 @@ import osAccount from '@ohos.account.osAccount' import commonEvent from '@ohos.commonEvent'; import util from '@ohos.util'; -import {Callback} from 'basic'; +import {Callback} from '@ohos.base'; import Trace from '../../../../../../../../common/src/main/ets/default/Trace'; import {SysFaultLogger, FaultID} from '../../../../../../../../common/src/main/ets/default/SysFaultLogger'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index 40a50964..ea6a0cd3 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -19,7 +19,7 @@ import {SysFaultLogger, FaultID} from '../../../../../../../../common/src/main/e import ScreenLockMar from '@ohos.screenlock'; import windowManager from '@ohos.window' import Constants from '../common/constants' -import { Callback } from 'basic'; +import { Callback } from '@ohos.base'; const TAG = 'ScreenLock-ScreenLockModel'; diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 17a3f272..bfc4bb48 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -23,7 +23,7 @@ import Router from '@system.router'; import commonEvent from '@ohos.commonEvent'; import hiDebug from '@ohos.hidebug'; import { CommonEventPublishData } from 'commonEvent/commonEventPublishData'; -import {Callback} from 'basic'; +import {Callback} from '@ohos.base'; const TAG = 'ScreenLock-ScreenLockService'; const URI_DIGITALPASSWORD = 'pages/digitalPassword' diff --git a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts index 49545d20..d42fd5f7 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts @@ -16,7 +16,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log' import Constants from '../common/constants' import service, {UnlockResult, AuthType, AuthSubType} from '../model/screenLockService' -import {Callback} from 'basic'; +import {Callback} from '@ohos.base'; const TAG = 'ScreenLock-BaseViewModel' const MINUTE_NM = '分钟' diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts index 86d3cd63..4655c77a 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts @@ -17,7 +17,7 @@ import Trace from '../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../common/src/main/ets/default/Log' import Constants from '../common/constants' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' -import {Callback} from 'basic'; +import {Callback} from '@ohos.base'; const TAG = 'ScreenLock-CustomPSDViewModel' diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts index 6c3d683b..65c267c6 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -17,7 +17,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log' import Trace from '../../../../../../../../common/src/main/ets/default/Trace' import Constants from '../common/constants' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' -import {Callback} from 'basic'; +import {Callback} from '@ohos.base'; const TAG = 'ScreenLock-DigitalPSDViewModel' diff --git a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts index d9acd643..d502cab6 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts @@ -16,7 +16,7 @@ import Trace from '../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../common/src/main/ets/default/Log' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' -import {Callback} from 'basic'; +import {Callback} from '@ohos.base'; const TAG = 'ScreenLock-MixedPSDViewModel' diff --git a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts index 3b1fb2c2..5a8bfda1 100644 --- a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts @@ -16,7 +16,7 @@ import Log from '../../../../../../common/src/main/ets/default/Log'; import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' import Constants from '../common/constants' -import {Callback} from 'basic'; +import {Callback} from '@ohos.base'; const TAG = 'ScreenLock-SlideScreenLockViewModel' //Height of notification area. diff --git a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts index dde0e2dc..f4699f58 100644 --- a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts @@ -16,7 +16,7 @@ import Log from '../../../../../../common/src/main/ets/default/Log'; import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' import Constants from '../common/constants' -import {Callback} from 'basic'; +import {Callback} from '@ohos.base'; const TAG = 'ScreenLock-SlideScreenLockViewModel' //Height of notification area. -- Gitee From 23bca37fd8c9e5ac7161b87a322396b2952676f7 Mon Sep 17 00:00:00 2001 From: lianyi Date: Thu, 6 Apr 2023 22:25:04 +0800 Subject: [PATCH 358/373] add recent stack animation --- .../scene/session/HWRecentViewParam.ts | 15 +++ .../screen/session/HWScreenSession.ts | 15 ++- .../main/ets/WindowScene/HWGestureNavBar.ets | 7 +- .../src/main/ets/WindowScene/HWScenePanel.ets | 102 +++++++++++++++++- 4 files changed, 127 insertions(+), 12 deletions(-) diff --git a/common/src/main/ets/WindowScene/scene/session/HWRecentViewParam.ts b/common/src/main/ets/WindowScene/scene/session/HWRecentViewParam.ts index fb86955e..f7eae59e 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWRecentViewParam.ts +++ b/common/src/main/ets/WindowScene/scene/session/HWRecentViewParam.ts @@ -58,6 +58,17 @@ export class HWRecentViewParam { */ offsetY: number = 0; + /** + * borderRadius of scene + */ + borderRadius: number | string = 0; + + height: number | string = '100%'; + + width: number | string = '100%'; + + margin: number | string = 0; + /** * init properties of RecentView */ @@ -70,5 +81,9 @@ export class HWRecentViewParam { this.centerY = '50%'; this.offsetX = 0; this.offsetY = 0; + this.borderRadius = 0; + this.height = "100%" + this.width = "100%" + this.margin = 0 } } diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts index b8f2a4a5..fa62e1a5 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts @@ -30,7 +30,8 @@ export enum DesktopState { HOME, APP, SPLIT, - RECENT + RECENT, + DRAGGING } /** @@ -189,10 +190,16 @@ export class HWScreenSession { this.desktopState = DesktopState.RECENT; this.recentViewParam.translateX = 0; this.recentViewParam.translateY = 0; - this.recentViewParam.scaleX = 0.7; - this.recentViewParam.scaleY = 0.7; - this.recentViewParam.centerX = '100%'; + this.recentViewParam.scaleX = 1; + this.recentViewParam.scaleY = 1; + this.recentViewParam.centerX = '50%'; this.recentViewParam.centerY = '50%'; + this.recentViewParam.borderRadius = 35; + this.recentViewParam.offsetX = 0; + this.recentViewParam.offsetY = 0; + this.recentViewParam.width = "70%" + this.recentViewParam.height = "70%" + this.recentViewParam.margin = 0 } public enterSplitView() { diff --git a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets index 145e5658..1715bb45 100644 --- a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets +++ b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets @@ -42,12 +42,11 @@ export struct HWGestureNavBar { .backgroundColor(Color.Transparent) .gesture(PanGesture() .onActionStart((event: GestureEvent) => { - this.screenSession.desktopState = DesktopState.RECENT; - - let recentViewSceneSpace = 50; + this.screenSession.desktopState = DesktopState.DRAGGING; + this.recentViewParam.margin = 50 let scrollWidth = this.screenSession.sceneContainerSessionList.length * this.sceneContainerSession.screenBounds.width + - (this.screenSession.sceneContainerSessionList.length - 1) * recentViewSceneSpace; + (this.screenSession.sceneContainerSessionList.length - 1) * this.recentViewParam.margin; this.recentViewParam.offsetX = this.sceneContainerSession.screenBounds.width - scrollWidth; this.recentViewParam.centerX = diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index 5d068b60..da2ebd89 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -32,13 +32,39 @@ export struct HWScenePanel { @State mBlurRadius: number = 20; private scroller: Scroller = new Scroller(); - + private progress: number[] = [] + private screenWidth: number = -1 + private viewWidth: number = -1 + private currentIndex: number = 0; + private currentState: number = DesktopState.HOME + @State containerTranslation: number[]=[] + @State containerAlpha : number[]=[] + @State containerScale: number[]=[] buildLog(sceneContainerSession: HWSceneContainerSession) { Log.showInfo(TAG, `sceneContainerSession id: ${sceneContainerSession.containerId}`); Log.showInfo(TAG, `sceneContainerSession isActive: ${sceneContainerSession.isActive}`); return true; } + isRecent(): boolean { + Log.showInfo(TAG,"isRecent = " +(this.screenSession.desktopState === DesktopState.RECENT)) + if (this.screenSession.desktopState === this.currentState) { + return this.screenSession.desktopState === DesktopState.RECENT; + } + if (this.screenSession.desktopState == DesktopState.RECENT) { + this.initRecentParams(); + this.currentState = this.screenSession.desktopState; + return true; + } else { + this.containerTranslation = []; + this.containerAlpha = []; + this. containerScale = []; + this.currentState = this.screenSession.desktopState; + Log.showInfo(TAG,"this.containerTranslation = " +this.containerTranslation[this.screenSession.sceneContainerSessionList.length-1]) + return false; + } +} + build() { Stack({ alignContent: Alignment.TopStart }) { if (this.screenSession.desktopState === DesktopState.APP || this.screenSession.desktopState === DesktopState.RECENT) { @@ -50,15 +76,22 @@ export struct HWScenePanel { Scroll(this.scroller) { // Flex({ direction: FlexDirection.Row }) { - Row({ space: 50 }) { - ForEach(this.screenSession.sceneContainerSessionList, (item: HWSceneContainerSession) => { - if (this.screenSession.desktopState === DesktopState.RECENT || (this.buildLog(item) && item.isActive)) { + Row() { + ForEach(this.screenSession.sceneContainerSessionList, (item: HWSceneContainerSession, index) => { + if (this.isRecent() ||this.screenSession.desktopState === DesktopState.DRAGGING || (this.buildLog(item) && item.isActive)) { HWSceneContainer({ sceneContainerSession: item, screenSession: this.screenSession, dividerParam: item.dividerParam, recentViewParam: $recentViewParam }) + .size({width:this.recentViewParam.width, height:this.recentViewParam.height}) + .translate({x:this.containerTranslation[index]}) + .opacity(this.containerAlpha[index]) + .scale({x:this.containerScale[index], y:this.containerScale[index]}) + .margin({left:this.recentViewParam.margin}) + .clip(true) + .borderRadius(this.recentViewParam.borderRadius) } }, (item: HWSceneContainerSession) => item.containerId.toString()) } @@ -81,11 +114,72 @@ export struct HWScenePanel { let activeSceneContainerSession = this.screenSession.getActiveSceneContainerSession(); HWSceneSessionManager.getInstance().requestSceneContainerBackground(activeSceneContainerSession); this.screenSession.enterHomeView(); + this.containerTranslation= []; + this.containerAlpha = []; + this. containerScale = []; }) + .onScroll((xOffset: number, yOffset: number) => { + Log.showInfo(TAG,"this.scroller.currentOffset().xOffset = " +this.scroller.currentOffset().xOffset + ",currentindex = " + this.currentIndex) + this.currentIndex = Math.ceil((this.scroller.currentOffset().xOffset - this.viewWidth / 2) / this.viewWidth) + let currentCenter = this.scroller.currentOffset().xOffset + this.screenWidth / 2; + for (var i = this. currentIndex - 2; i <= this. currentIndex + 2; i ++) { + if (i < 0 || i > this.screenSession.sceneContainerSessionList.length) { + continue; + } + let viewCenterX = i * (this.viewWidth) + (this.viewWidth) / 2 + this.progress[i] = (viewCenterX - currentCenter) / (this.viewWidth) ; + this.updateView(this.progress[i], i) + } + }) + .onScrollEnd(()=>{ + if (this.scroller.currentOffset().xOffset === this.contentOffsetForIndex(this.currentIndex) || this.screenSession.sceneContainerSessionList.length <=1) { + return; + } + this.scroller.scrollTo({ xOffset: this.contentOffsetForIndex(this.currentIndex), yOffset: 0, animation:{duration:100, curve: Curve.Smooth}}) + Log.showInfo(TAG,"onScrollEnd xOffset = " +this.contentOffsetForIndex(this.currentIndex)) + }) // Freedom scene } .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) .hitTestBehavior(HitTestMode.None) } + + updateView(progress:number,index:number) { + if(this.screenSession.sceneContainerSessionList.length <= 1) { + this.containerScale = []; + this.containerTranslation = []; + this.containerAlpha = []; + return; + } + if (progress >= 0) { + this.containerAlpha[index] = 1; + } else { + this.containerAlpha[index] = 1 - Math.abs(progress) * 0.2; + } + this.containerScale[index] = 1 + (progress) * 0.05; + if (progress > 0) { + this.containerTranslation[index] = -Math.abs(progress) * this.screenWidth / 10; + } else { + this.containerTranslation[index] = Math.abs(progress) * this.screenWidth / 1.6; + } + } + + contentOffsetForIndex(index) : number { + let result = index * this.viewWidth - (this.screenWidth - this.viewWidth) / 2 + return result; + } + + initRecentParams() { + this.screenWidth = this.screenSession.bounds.width + this.viewWidth = this.screenWidth * 0.7; + + this.scroller.scrollTo({ xOffset: this.contentOffsetForIndex(this.screenSession.sceneContainerSessionList.length - 1), yOffset: 0 }) + this.currentIndex = Math.ceil( (this.scroller.currentOffset().xOffset - (this.viewWidth/2))/(this.viewWidth)) + this.progress[this.screenSession.sceneContainerSessionList.length - 1 - 2] = -2; + this.progress[this.screenSession.sceneContainerSessionList.length - 1 - 1] = -1; + this.updateView(-2, this.screenSession.sceneContainerSessionList.length - 1 - 2) + this.updateView(-1, this.screenSession.sceneContainerSessionList.length - 1 - 1) + } + } -- Gitee From 2038aa1e3c3405e7703a31f3628e4c3af3554550 Mon Sep 17 00:00:00 2001 From: lianyi Date: Mon, 10 Apr 2023 17:11:36 +0800 Subject: [PATCH 359/373] remove registerMissionListener --- feature/smartdock/src/main/ets/default/model/SmartDockModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/smartdock/src/main/ets/default/model/SmartDockModel.ts b/feature/smartdock/src/main/ets/default/model/SmartDockModel.ts index 690be661..74a0dc0f 100644 --- a/feature/smartdock/src/main/ets/default/model/SmartDockModel.ts +++ b/feature/smartdock/src/main/ets/default/model/SmartDockModel.ts @@ -70,7 +70,7 @@ export default class SmartDockModel { if (this.mDevice === CommonConstants.PAD_DEVICE_TYPE) { this.getRecentDataList().then(() => {}, () => {}); } - this.registerMissionListener(); + // this.registerMissionListener(); Log.showInfo(TAG, 'constructor!'); } -- Gitee From 411ed7e732e67b3c7c8132719ef8cfc10aa6a2e8 Mon Sep 17 00:00:00 2001 From: sunhaiyang Date: Tue, 11 Apr 2023 15:58:21 +0800 Subject: [PATCH 360/373] =?UTF-8?q?=E5=90=88=E5=85=A5=E9=94=81=E5=B1=8F?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore => screenlock4merge/.gitignore | 0 .../AppScope}/app.json5 | 0 .../resources/base/element/string.json | 0 .../resources/base/media/app_icon.png | Bin LICENSE => screenlock4merge/LICENSE | 0 OAT.xml => screenlock4merge/OAT.xml | 0 README.en.md => screenlock4merge/README.en.md | 0 README_zh.md => screenlock4merge/README_zh.md | 0 .../build-profile.json5 | 0 .../common}/.gitignore | 0 .../common}/build-profile.json5 | 0 .../common}/hvigorfile.js | 0 {common => screenlock4merge/common}/index.ets | 0 .../common}/package-lock.json | 0 .../common}/package.json | 0 .../main/ets/components/MainPage/MainPage.ets | 0 .../src/main/ets/default/CheckEmptyUtils.ts | 0 .../common}/src/main/ets/default/Constants.ts | 0 .../src/main/ets/default/DateTimeCommon.ts | 0 .../src/main/ets/default/Decorators.ts | 0 .../common}/src/main/ets/default/Log.ts | 0 .../src/main/ets/default/LunarCalendar.ts | 0 .../src/main/ets/default/ReadConfigUtil.ts | 0 .../src/main/ets/default/ScreenLockCommon.ts | 0 .../src/main/ets/default/ScreenLockManager.ts | 0 .../main/ets/default/SingleInstanceHelper.ts | 0 .../main/ets/default/StyleConfiguration.ts | 0 .../src/main/ets/default/StyleManager.ts | 0 .../src/main/ets/default/SwitchUserManager.ts | 0 .../src/main/ets/default/SysFaultLogger.ts | 118 +++++++++--------- .../src/main/ets/default/TimeManager.ts | 0 .../common}/src/main/ets/default/Trace.ts | 0 .../src/main/ets/default/WindowManager.ts | 0 .../default/abilitymanager/abilityManager.ts | 0 .../default/abilitymanager/bundleManager.ts | 0 .../abilitymanager/featureAbilityManager.ts | 0 .../abilitymanager/notificationManager.ts | 0 .../default/commonEvent/CommonEventManager.ts | 0 .../src/main/ets/default/event/EventBus.ts | 0 .../main/ets/default/event/EventManager.ts | 0 .../src/main/ets/default/event/EventUtil.ts | 0 .../common}/src/main/module.json5 | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../main/resources/zh_CN/element/string.json | 0 {entry => screenlock4merge/entry}/.gitignore | 0 .../entry}/build-profile.json5 | 0 .../entry}/hvigorfile.js | 0 .../entry}/package-lock.json | 0 .../entry}/package.json | 0 .../src/main/ets/Application/AbilityStage.ts | 0 .../src/main/ets/MainAbility/MainAbility.ts | 0 .../entry}/src/main/ets/pages/index.ets | 0 .../entry}/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 14 +-- .../main/resources/base/element/string.json | 0 .../src/main/resources/base/media/icon.png | Bin .../resources/base/profile/main_pages.json | 0 .../features}/batterycomponent/.gitignore | 0 .../batterycomponent/build-profile.json5 | 0 .../features}/batterycomponent/hvigorfile.js | 0 .../features}/batterycomponent/index.ets | 0 .../batterycomponent/package-lock.json | 0 .../features}/batterycomponent/package.json | 0 .../main/ets/components/MainPage/MainPage.ets | 0 .../src/main/ets/default/batteryModel.ts | 0 .../ets/default/common/StyleConfiguration.ts | 0 .../src/main/ets/default/common/constants.ts | 0 .../main/ets/default/pages/batteryIcon.ets | 0 .../src/main/ets/default/pages/batteryPic.ets | 0 .../src/main/ets/default/pages/batterySoc.ets | 0 .../batterycomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../features}/clockcomponent/.gitignore | 0 .../clockcomponent/build-profile.json5 | 0 .../features}/clockcomponent/hvigorfile.js | 0 .../features}/clockcomponent/index.ets | 0 .../clockcomponent/package-lock.json | 0 .../features}/clockcomponent/package.json | 0 .../main/ets/components/MainPage/MainPage.ets | 0 .../src/main/ets/default/app.ets | 0 .../ets/default/common/StyleConfiguration.ts | 0 .../src/main/ets/default/pages/clockIcon.ets | 0 .../clockcomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../features}/datetimecomponent/.gitignore | 0 .../datetimecomponent/build-profile.json5 | 0 .../features}/datetimecomponent/hvigorfile.js | 0 .../features}/datetimecomponent/index.ets | 0 .../datetimecomponent/package-lock.json | 0 .../features}/datetimecomponent/package.json | 0 .../src/main/ets/com/ohos/common/constants.ts | 0 .../ets/com/ohos/view/component/dateTime.ets | 0 .../main/ets/com/ohos/vm/dateTimeViewModel.ts | 0 .../main/ets/components/MainPage/MainPage.ets | 0 .../datetimecomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../features}/noticeitem/.gitignore | 0 .../features}/noticeitem/build-profile.json5 | 0 .../features}/noticeitem/hvigorfile.js | 0 .../features}/noticeitem/index.ets | 0 .../features}/noticeitem/package-lock.json | 0 .../features}/noticeitem/package.json | 0 .../com/ohos/noticeItem/common/CommonUtil.ts | 0 .../noticeItem/common/ScrollbarManager.ts | 0 .../com/ohos/noticeItem/common/constants.ts | 0 .../noticeItem/model/NotificationConfig.ts | 0 .../model/NotificationDistributionManager.ts | 0 .../noticeItem/model/NotificationManager.ts | 0 .../noticeItem/model/NotificationService.ts | 0 .../model/NotificationWindowManager.ts | 0 .../ohos/noticeItem/model/ParseDataUtil.ts | 0 .../noticeItem/model/rule/RuleController.ts | 0 .../view/NotificationListComponent.ets | 0 .../noticeItem/view/item/actionComponent.ets | 0 .../view/item/bannerNotificationItem.ets | 0 .../ohos/noticeItem/view/item/basicItem.ets | 0 .../noticeItem/view/item/confirmDialog.ets | 0 .../ohos/noticeItem/view/item/customItem.ets | 0 .../noticeItem/view/item/devicesDialog.ets | 0 .../ohos/noticeItem/view/item/generalItem.ets | 0 .../ohos/noticeItem/view/item/groupItem.ets | 0 .../view/item/iconListComponent.ets | 0 .../ohos/noticeItem/view/item/longItem.ets | 0 .../ohos/noticeItem/view/item/multiItem.ets | 0 .../noticeItem/view/item/notificationItem.ets | 0 .../ohos/noticeItem/view/item/pictureItem.ets | 0 .../noticeItem/view/item/settingDialog.ets | 0 .../ohos/noticeItem/view/item/titleItem.ets | 0 .../ohos/noticeItem/viewmodel/ViewModel.ts | 0 .../main/ets/components/MainPage/MainPage.ets | 0 .../noticeitem/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../main/resources/base/media/ic_close.svg | 0 .../base/media/ic_notification_down.png | Bin .../base/media/ic_notification_up.png | Bin .../base/media/ic_public_delete_filled.svg | 0 .../base/media/ic_public_settings_filled.svg | 0 .../src/main/resources/base/media/send.svg | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/color.json | 0 .../main/resources/phone/element/float.json | 0 .../resources/rawfile/notificationConfig.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../features}/screenlock/.gitignore | 0 .../features}/screenlock/build-profile.json5 | 0 .../features}/screenlock/hvigorfile.js | 0 .../features}/screenlock/index.ets | 0 .../features}/screenlock/package-lock.json | 0 .../features}/screenlock/package.json | 0 .../src/main/ets/com/ohos/common/constants.ts | 0 .../src/main/ets/com/ohos/data/userData.ts | 0 .../main/ets/com/ohos/model/accountsModel.ts | 0 .../ets/com/ohos/model/screenLockModel.ts | 0 .../ets/com/ohos/model/screenLockService.ts | 0 .../ets/com/ohos/model/screenlockStyle.ts | 0 .../ets/com/ohos/view/component/accounts.ets | 0 .../com/ohos/view/component/batterySoc.ets | 0 .../ets/com/ohos/view/component/customPSD.ets | 0 .../com/ohos/view/component/digitalPSD.ets | 0 .../ets/com/ohos/view/component/lockIcon.ets | 0 .../ets/com/ohos/view/component/mixedPSD.ets | 0 .../com/ohos/view/component/numkeyBoard.ets | 0 .../ets/com/ohos/view/component/statusBar.ets | 0 .../src/main/ets/com/ohos/vm/StatusBarVM.ts | 0 .../main/ets/com/ohos/vm/accountsViewModel.ts | 0 .../src/main/ets/com/ohos/vm/baseViewModel.ts | 0 .../ets/com/ohos/vm/batterySocViewModel.ets | 0 .../ets/com/ohos/vm/customPSDViewModel.ts | 0 .../ets/com/ohos/vm/digitalPSDViewModel.ts | 0 .../main/ets/com/ohos/vm/lockIconViewModel.ts | 0 .../main/ets/com/ohos/vm/mixedPSDViewModel.ts | 0 .../main/ets/components/MainPage/MainPage.ets | 0 .../screenlock/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../main/resources/base/media/delete_all.png | Bin .../resources/base/media/ic_hollow_dot.svg | 0 .../base/media/ic_public_lock_filled.svg | 0 .../base/media/ic_public_unlock_filled.svg | 0 .../resources/base/media/ic_solid_dot.svg | 0 .../resources/base/media/ic_user_portrait.svg | 0 .../src/main/resources/base/media/lock.png | Bin .../src/main/resources/base/media/unlock.png | Bin .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../main/resources/phone/element/string.json | 0 .../src/main/resources/rawfile/antiTouch.json | 0 .../main/resources/rawfile/screenlock.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../features}/shortcutcomponent/.gitignore | 0 .../shortcutcomponent/build-profile.json5 | 0 .../features}/shortcutcomponent/hvigorfile.js | 0 .../features}/shortcutcomponent/index.ets | 0 .../shortcutcomponent/package-lock.json | 0 .../features}/shortcutcomponent/package.json | 0 .../src/main/ets/com/ohos/common/constants.ts | 0 .../ets/com/ohos/view/component/shortcut.ets | 0 .../main/ets/com/ohos/vm/shortcutViewModel.ts | 0 .../main/ets/components/MainPage/MainPage.ets | 0 .../shortcutcomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../src/main/resources/base/media/reboot.svg | 0 .../main/resources/base/media/shutdown.svg | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../features}/signalcomponent/.gitignore | 0 .../signalcomponent/build-profile.json5 | 0 .../features}/signalcomponent/hvigorfile.js | 0 .../features}/signalcomponent/index.ets | 0 .../signalcomponent/package-lock.json | 0 .../features}/signalcomponent/package.json | 0 .../main/ets/components/MainPage/MainPage.ets | 0 .../src/main/ets/default/app.ets | 0 .../ets/default/common/StyleConfiguration.ts | 0 .../src/main/ets/default/common/constants.ts | 0 .../src/main/ets/default/pages/signalIcon.ets | 0 .../src/main/ets/default/signalModel.ts | 0 .../signalcomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../base/media/ic_statusbar_signal_1.svg | 0 .../base/media/ic_statusbar_signal_2.svg | 0 .../base/media/ic_statusbar_signal_3.svg | 0 .../base/media/ic_statusbar_signal_4.svg | 0 .../base/media/ic_statusbar_signal_full.svg | 0 .../base/media/ic_statusbar_signal_no.svg | 0 .../media/ic_statusbar_signal_roaming.png | Bin .../base/media/ic_statusbar_signal_wait.png | Bin .../base/media/ic_statusbar_wifi_connect.png | Bin .../src/main/resources/base/media/icon.png | Bin .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../phone/media/ic_statusbar_signal_1.svg | 0 .../phone/media/ic_statusbar_signal_2.svg | 0 .../phone/media/ic_statusbar_signal_3.svg | 0 .../phone/media/ic_statusbar_signal_4.svg | 0 .../phone/media/ic_statusbar_signal_full.svg | 0 .../phone/media/ic_statusbar_signal_no.svg | 0 .../media/ic_statusbar_signal_roaming.png | Bin .../phone/media/ic_statusbar_signal_wait.png | Bin .../phone/media/ic_statusbar_wifi_connect.png | Bin .../src/main/resources/phone/media/icon.png | Bin .../main/resources/zh_CN/element/string.json | 0 .../features}/wallpapercomponent/.gitignore | 0 .../wallpapercomponent/build-profile.json5 | 0 .../wallpapercomponent/hvigorfile.js | 0 .../features}/wallpapercomponent/index.ets | 0 .../wallpapercomponent/package-lock.json | 0 .../features}/wallpapercomponent/package.json | 0 .../src/main/ets/com/ohos/common/constants.ts | 0 .../ets/com/ohos/view/component/wallpaper.ets | 0 .../ets/com/ohos/vm/wallpaperViewModel.ts | 0 .../main/ets/components/MainPage/MainPage.ets | 0 .../wallpapercomponent/src/main/module.json5 | 0 .../main/resources/base/element/string.json | 0 .../features}/wificomponent/.gitignore | 0 .../wificomponent/build-profile.json5 | 0 .../features}/wificomponent/hvigorfile.js | 0 .../features}/wificomponent/index.ets | 0 .../features}/wificomponent/package-lock.json | 0 .../features}/wificomponent/package.json | 0 .../main/ets/components/MainPage/MainPage.ets | 0 .../src/main/ets/default/app.ets | 0 .../ets/default/common/StyleConfiguration.ts | 0 .../src/main/ets/default/common/constants.ts | 0 .../src/main/ets/default/pages/wifiIcon.ets | 0 .../src/main/ets/default/wifiModel.ts | 0 .../wificomponent/src/main/module.json5 | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../base/media/ic_statusbar_wifi_1.svg | 0 .../base/media/ic_statusbar_wifi_2.svg | 0 .../base/media/ic_statusbar_wifi_3.svg | 0 .../base/media/ic_statusbar_wifi_full.svg | 0 .../base/media/ic_statusbar_wifi_no.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../main/resources/phone/element/float.json | 0 .../phone/media/ic_statusbar_wifi_1.svg | 0 .../phone/media/ic_statusbar_wifi_2.svg | 0 .../phone/media/ic_statusbar_wifi_3.svg | 0 .../phone/media/ic_statusbar_wifi_full.svg | 0 .../phone/media/ic_statusbar_wifi_no.svg | 0 .../src/main/resources/phone/media/icon.png | Bin .../hvigorfile.js | 0 .../infra}/config_exts.gradle | 0 .../package-lock.json | 0 package.json => screenlock4merge/package.json | 0 .../product}/pc/.gitignore | 0 .../product}/pc/build-profile.json5 | 0 .../product}/pc/build.gradle | 0 .../product}/pc/hvigorfile.js | 0 .../product}/pc/package-lock.json | 0 .../product}/pc/package.json | 0 .../src/main/ets/Application/AbilityStage.ts | 0 .../ServiceExtAbility/ServiceExtAbility.ts | 0 .../src/main/ets/common/StyleConfiguration.ts | 0 .../pc/src/main/ets/common/StyleManager.ts | 0 .../pc/src/main/ets/common/constants.ts | 0 .../pc/src/main/ets/pages/customPassword.ets | 0 .../src/main/ets/pages/customscreenlock.ets | 0 .../pc/src/main/ets/pages/digitalPassword.ets | 0 .../product}/pc/src/main/ets/pages/index.ets | 0 .../src/main/ets/pages/journalscreenlock.ets | 0 .../pc/src/main/ets/pages/mixedPassword.ets | 0 .../pc/src/main/ets/pages/slidescreenlock.ets | 0 .../pc/src/main/ets/vm/indexViewModel.ts | 0 .../main/ets/vm/slideScreenLockViewModel.ts | 0 .../product}/pc/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../main/resources/base/media/delete_all.png | Bin .../main/resources/base/media/ic_close.svg | 0 .../resources/base/media/ic_hollow_dot.svg | 0 .../base/media/ic_notification_down.png | Bin .../base/media/ic_notification_up.png | Bin .../base/media/ic_public_delete_filled.svg | 0 .../base/media/ic_public_lock_filled.svg | 0 .../base/media/ic_public_settings_filled.svg | 0 .../base/media/ic_public_unlock_filled.svg | 0 .../resources/base/media/ic_solid_dot.svg | 0 .../base/media/ic_statusbar_signal_1.svg | 0 .../base/media/ic_statusbar_signal_2.svg | 0 .../base/media/ic_statusbar_signal_3.svg | 0 .../base/media/ic_statusbar_signal_4.svg | 0 .../base/media/ic_statusbar_signal_full.svg | 0 .../base/media/ic_statusbar_signal_no.svg | 0 .../media/ic_statusbar_signal_roaming.png | Bin .../base/media/ic_statusbar_signal_wait.png | Bin .../base/media/ic_statusbar_wifi_1.svg | 0 .../base/media/ic_statusbar_wifi_2.svg | 0 .../base/media/ic_statusbar_wifi_3.svg | 0 .../base/media/ic_statusbar_wifi_connect.png | Bin .../base/media/ic_statusbar_wifi_full.svg | 0 .../base/media/ic_statusbar_wifi_no.svg | 0 .../resources/base/media/ic_user_portrait.svg | 0 .../pc/src/main/resources/base/media/icon.png | Bin .../pc/src/main/resources/base/media/lock.png | Bin .../src/main/resources/base/media/reboot.svg | 0 .../pc/src/main/resources/base/media/send.svg | 0 .../main/resources/base/media/shutdown.svg | 0 .../src/main/resources/base/media/unlock.png | Bin .../resources/base/profile/main_pages.json | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../product}/phone/.gitignore | 0 .../product}/phone/build-profile.json5 | 0 .../product}/phone/build.gradle | 0 .../product}/phone/hvigorfile.js | 0 .../product}/phone/package-lock.json | 0 .../product}/phone/package.json | 0 .../phone/src/main/ets/AbilityStage.ts | 0 .../src/main/ets/Application/AbilityStage.ts | 0 .../ServiceExtAbility/ServiceExtAbility.ts | 0 .../src/main/ets/common/StyleConfiguration.ts | 0 .../phone/src/main/ets/common/StyleManager.ts | 0 .../phone/src/main/ets/common/constants.ts | 0 .../src/main/ets/pages/customPassword.ets | 0 .../src/main/ets/pages/customscreenlock.ets | 0 .../src/main/ets/pages/digitalPassword.ets | 0 .../phone/src/main/ets/pages/index.ets | 0 .../src/main/ets/pages/journalscreenlock.ets | 0 .../src/main/ets/pages/mixedPassword.ets | 0 .../src/main/ets/pages/slidescreenlock.ets | 0 .../phone/src/main/ets/vm/indexViewModel.ts | 0 .../main/ets/vm/slideScreenLockViewModel.ts | 0 .../product}/phone/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../src/main/resources/base/media/bg.png | Bin .../main/resources/base/media/delete_all.png | Bin .../main/resources/base/media/ic_close.svg | 0 .../resources/base/media/ic_hollow_dot.svg | 0 .../base/media/ic_notification_down.png | Bin .../base/media/ic_notification_up.png | Bin .../base/media/ic_public_delete_filled.svg | 0 .../base/media/ic_public_lock_filled.svg | 0 .../base/media/ic_public_settings_filled.svg | 0 .../base/media/ic_public_unlock_filled.svg | 0 .../resources/base/media/ic_solid_dot.svg | 0 .../base/media/ic_statusbar_signal_1.svg | 0 .../base/media/ic_statusbar_signal_2.svg | 0 .../base/media/ic_statusbar_signal_3.svg | 0 .../base/media/ic_statusbar_signal_4.svg | 0 .../base/media/ic_statusbar_signal_full.svg | 0 .../base/media/ic_statusbar_signal_no.svg | 0 .../media/ic_statusbar_signal_roaming.png | Bin .../base/media/ic_statusbar_signal_wait.png | Bin .../base/media/ic_statusbar_wifi_1.svg | 0 .../base/media/ic_statusbar_wifi_2.svg | 0 .../base/media/ic_statusbar_wifi_3.svg | 0 .../base/media/ic_statusbar_wifi_connect.png | Bin .../base/media/ic_statusbar_wifi_full.svg | 0 .../base/media/ic_statusbar_wifi_no.svg | 0 .../resources/base/media/ic_user_portrait.svg | 0 .../src/main/resources/base/media/icon.png | Bin .../src/main/resources/base/media/lock.png | Bin .../src/main/resources/base/media/reboot.svg | 0 .../src/main/resources/base/media/send.svg | 0 .../main/resources/base/media/shutdown.svg | 0 .../src/main/resources/base/media/unlock.png | Bin .../resources/base/profile/main_pages.json | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../signature}/systemui.p7b | Bin 432 files changed, 66 insertions(+), 66 deletions(-) rename .gitignore => screenlock4merge/.gitignore (100%) rename {AppScope => screenlock4merge/AppScope}/app.json5 (100%) rename {AppScope => screenlock4merge/AppScope}/resources/base/element/string.json (100%) rename {AppScope => screenlock4merge/AppScope}/resources/base/media/app_icon.png (100%) rename LICENSE => screenlock4merge/LICENSE (100%) rename OAT.xml => screenlock4merge/OAT.xml (100%) rename README.en.md => screenlock4merge/README.en.md (100%) rename README_zh.md => screenlock4merge/README_zh.md (100%) rename build-profile.json5 => screenlock4merge/build-profile.json5 (100%) rename {common => screenlock4merge/common}/.gitignore (100%) rename {common => screenlock4merge/common}/build-profile.json5 (100%) rename {common => screenlock4merge/common}/hvigorfile.js (100%) rename {common => screenlock4merge/common}/index.ets (100%) rename {common => screenlock4merge/common}/package-lock.json (100%) rename {common => screenlock4merge/common}/package.json (100%) rename {common => screenlock4merge/common}/src/main/ets/components/MainPage/MainPage.ets (100%) rename {common => screenlock4merge/common}/src/main/ets/default/CheckEmptyUtils.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/Constants.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/DateTimeCommon.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/Decorators.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/Log.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/LunarCalendar.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/ReadConfigUtil.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/ScreenLockCommon.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/ScreenLockManager.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/SingleInstanceHelper.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/StyleConfiguration.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/StyleManager.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/SwitchUserManager.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/SysFaultLogger.ts (96%) rename {common => screenlock4merge/common}/src/main/ets/default/TimeManager.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/Trace.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/WindowManager.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/abilitymanager/abilityManager.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/abilitymanager/bundleManager.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/abilitymanager/featureAbilityManager.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/abilitymanager/notificationManager.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/commonEvent/CommonEventManager.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/event/EventBus.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/event/EventManager.ts (100%) rename {common => screenlock4merge/common}/src/main/ets/default/event/EventUtil.ts (100%) rename {common => screenlock4merge/common}/src/main/module.json5 (100%) rename {common => screenlock4merge/common}/src/main/resources/base/element/float.json (100%) rename {common => screenlock4merge/common}/src/main/resources/base/element/string.json (100%) rename {common => screenlock4merge/common}/src/main/resources/en_US/element/string.json (100%) rename {common => screenlock4merge/common}/src/main/resources/phone/element/float.json (100%) rename {common => screenlock4merge/common}/src/main/resources/zh_CN/element/string.json (100%) rename {entry => screenlock4merge/entry}/.gitignore (100%) rename {entry => screenlock4merge/entry}/build-profile.json5 (100%) rename {entry => screenlock4merge/entry}/hvigorfile.js (100%) rename {entry => screenlock4merge/entry}/package-lock.json (100%) rename {entry => screenlock4merge/entry}/package.json (100%) rename {entry => screenlock4merge/entry}/src/main/ets/Application/AbilityStage.ts (100%) rename {entry => screenlock4merge/entry}/src/main/ets/MainAbility/MainAbility.ts (100%) rename {entry => screenlock4merge/entry}/src/main/ets/pages/index.ets (100%) rename {entry => screenlock4merge/entry}/src/main/module.json5 (100%) rename {entry => screenlock4merge/entry}/src/main/resources/base/element/color.json (93%) rename {entry => screenlock4merge/entry}/src/main/resources/base/element/string.json (100%) rename {entry => screenlock4merge/entry}/src/main/resources/base/media/icon.png (100%) rename {entry => screenlock4merge/entry}/src/main/resources/base/profile/main_pages.json (100%) rename {features => screenlock4merge/features}/batterycomponent/.gitignore (100%) rename {features => screenlock4merge/features}/batterycomponent/build-profile.json5 (100%) rename {features => screenlock4merge/features}/batterycomponent/hvigorfile.js (100%) rename {features => screenlock4merge/features}/batterycomponent/index.ets (100%) rename {features => screenlock4merge/features}/batterycomponent/package-lock.json (100%) rename {features => screenlock4merge/features}/batterycomponent/package.json (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/ets/components/MainPage/MainPage.ets (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/ets/default/batteryModel.ts (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/ets/default/common/constants.ts (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/ets/default/pages/batteryIcon.ets (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/ets/default/pages/batteryPic.ets (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/ets/default/pages/batterySoc.ets (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/module.json5 (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/resources/base/element/color.json (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/resources/base/element/float.json (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/resources/base/element/string.json (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/resources/base/media/icon.png (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/resources/en_US/element/string.json (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/resources/phone/element/float.json (100%) rename {features => screenlock4merge/features}/batterycomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => screenlock4merge/features}/clockcomponent/.gitignore (100%) rename {features => screenlock4merge/features}/clockcomponent/build-profile.json5 (100%) rename {features => screenlock4merge/features}/clockcomponent/hvigorfile.js (100%) rename {features => screenlock4merge/features}/clockcomponent/index.ets (100%) rename {features => screenlock4merge/features}/clockcomponent/package-lock.json (100%) rename {features => screenlock4merge/features}/clockcomponent/package.json (100%) rename {features => screenlock4merge/features}/clockcomponent/src/main/ets/components/MainPage/MainPage.ets (100%) rename {features => screenlock4merge/features}/clockcomponent/src/main/ets/default/app.ets (100%) rename {features => screenlock4merge/features}/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts (100%) rename {features => screenlock4merge/features}/clockcomponent/src/main/ets/default/pages/clockIcon.ets (100%) rename {features => screenlock4merge/features}/clockcomponent/src/main/module.json5 (100%) rename {features => screenlock4merge/features}/clockcomponent/src/main/resources/base/element/color.json (100%) rename {features => screenlock4merge/features}/clockcomponent/src/main/resources/base/element/float.json (100%) rename {features => screenlock4merge/features}/clockcomponent/src/main/resources/base/element/string.json (100%) rename {features => screenlock4merge/features}/clockcomponent/src/main/resources/base/media/icon.png (100%) rename {features => screenlock4merge/features}/clockcomponent/src/main/resources/en_US/element/string.json (100%) rename {features => screenlock4merge/features}/clockcomponent/src/main/resources/phone/element/float.json (100%) rename {features => screenlock4merge/features}/clockcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => screenlock4merge/features}/datetimecomponent/.gitignore (100%) rename {features => screenlock4merge/features}/datetimecomponent/build-profile.json5 (100%) rename {features => screenlock4merge/features}/datetimecomponent/hvigorfile.js (100%) rename {features => screenlock4merge/features}/datetimecomponent/index.ets (100%) rename {features => screenlock4merge/features}/datetimecomponent/package-lock.json (100%) rename {features => screenlock4merge/features}/datetimecomponent/package.json (100%) rename {features => screenlock4merge/features}/datetimecomponent/src/main/ets/com/ohos/common/constants.ts (100%) rename {features => screenlock4merge/features}/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets (100%) rename {features => screenlock4merge/features}/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts (100%) rename {features => screenlock4merge/features}/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets (100%) rename {features => screenlock4merge/features}/datetimecomponent/src/main/module.json5 (100%) rename {features => screenlock4merge/features}/datetimecomponent/src/main/resources/base/element/color.json (100%) rename {features => screenlock4merge/features}/datetimecomponent/src/main/resources/base/element/float.json (100%) rename {features => screenlock4merge/features}/datetimecomponent/src/main/resources/base/element/string.json (100%) rename {features => screenlock4merge/features}/datetimecomponent/src/main/resources/en_US/element/string.json (100%) rename {features => screenlock4merge/features}/datetimecomponent/src/main/resources/phone/element/float.json (100%) rename {features => screenlock4merge/features}/datetimecomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => screenlock4merge/features}/noticeitem/.gitignore (100%) rename {features => screenlock4merge/features}/noticeitem/build-profile.json5 (100%) rename {features => screenlock4merge/features}/noticeitem/hvigorfile.js (100%) rename {features => screenlock4merge/features}/noticeitem/index.ets (100%) rename {features => screenlock4merge/features}/noticeitem/package-lock.json (100%) rename {features => screenlock4merge/features}/noticeitem/package.json (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/ets/components/MainPage/MainPage.ets (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/module.json5 (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/base/element/color.json (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/base/element/float.json (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/base/element/string.json (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/base/media/ic_close.svg (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/base/media/ic_notification_down.png (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/base/media/ic_notification_up.png (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/base/media/send.svg (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/en_US/element/string.json (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/phone/element/color.json (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/phone/element/float.json (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/rawfile/notificationConfig.json (100%) rename {features => screenlock4merge/features}/noticeitem/src/main/resources/zh_CN/element/string.json (100%) rename {features => screenlock4merge/features}/screenlock/.gitignore (100%) rename {features => screenlock4merge/features}/screenlock/build-profile.json5 (100%) rename {features => screenlock4merge/features}/screenlock/hvigorfile.js (100%) rename {features => screenlock4merge/features}/screenlock/index.ets (100%) rename {features => screenlock4merge/features}/screenlock/package-lock.json (100%) rename {features => screenlock4merge/features}/screenlock/package.json (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/common/constants.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/data/userData.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/model/accountsModel.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/model/screenLockService.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/view/component/accounts.ets (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts (100%) rename {features => screenlock4merge/features}/screenlock/src/main/ets/components/MainPage/MainPage.ets (100%) rename {features => screenlock4merge/features}/screenlock/src/main/module.json5 (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/base/element/color.json (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/base/element/float.json (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/base/element/string.json (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/base/media/delete_all.png (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/base/media/ic_hollow_dot.svg (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/base/media/ic_solid_dot.svg (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/base/media/ic_user_portrait.svg (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/base/media/lock.png (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/base/media/unlock.png (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/en_US/element/string.json (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/phone/element/float.json (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/phone/element/string.json (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/rawfile/antiTouch.json (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/rawfile/screenlock.json (100%) rename {features => screenlock4merge/features}/screenlock/src/main/resources/zh_CN/element/string.json (100%) rename {features => screenlock4merge/features}/shortcutcomponent/.gitignore (100%) rename {features => screenlock4merge/features}/shortcutcomponent/build-profile.json5 (100%) rename {features => screenlock4merge/features}/shortcutcomponent/hvigorfile.js (100%) rename {features => screenlock4merge/features}/shortcutcomponent/index.ets (100%) rename {features => screenlock4merge/features}/shortcutcomponent/package-lock.json (100%) rename {features => screenlock4merge/features}/shortcutcomponent/package.json (100%) rename {features => screenlock4merge/features}/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts (100%) rename {features => screenlock4merge/features}/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets (100%) rename {features => screenlock4merge/features}/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts (100%) rename {features => screenlock4merge/features}/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets (100%) rename {features => screenlock4merge/features}/shortcutcomponent/src/main/module.json5 (100%) rename {features => screenlock4merge/features}/shortcutcomponent/src/main/resources/base/element/color.json (100%) rename {features => screenlock4merge/features}/shortcutcomponent/src/main/resources/base/element/float.json (100%) rename {features => screenlock4merge/features}/shortcutcomponent/src/main/resources/base/element/string.json (100%) rename {features => screenlock4merge/features}/shortcutcomponent/src/main/resources/base/media/reboot.svg (100%) rename {features => screenlock4merge/features}/shortcutcomponent/src/main/resources/base/media/shutdown.svg (100%) rename {features => screenlock4merge/features}/shortcutcomponent/src/main/resources/en_US/element/string.json (100%) rename {features => screenlock4merge/features}/shortcutcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => screenlock4merge/features}/signalcomponent/.gitignore (100%) rename {features => screenlock4merge/features}/signalcomponent/build-profile.json5 (100%) rename {features => screenlock4merge/features}/signalcomponent/hvigorfile.js (100%) rename {features => screenlock4merge/features}/signalcomponent/index.ets (100%) rename {features => screenlock4merge/features}/signalcomponent/package-lock.json (100%) rename {features => screenlock4merge/features}/signalcomponent/package.json (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/ets/components/MainPage/MainPage.ets (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/ets/default/app.ets (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/ets/default/common/constants.ts (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/ets/default/pages/signalIcon.ets (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/ets/default/signalModel.ts (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/module.json5 (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/element/color.json (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/element/float.json (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/element/string.json (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/base/media/icon.png (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/en_US/element/string.json (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/phone/element/float.json (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_roaming.png (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_wait.png (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/phone/media/ic_statusbar_wifi_connect.png (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/phone/media/icon.png (100%) rename {features => screenlock4merge/features}/signalcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {features => screenlock4merge/features}/wallpapercomponent/.gitignore (100%) rename {features => screenlock4merge/features}/wallpapercomponent/build-profile.json5 (100%) rename {features => screenlock4merge/features}/wallpapercomponent/hvigorfile.js (100%) rename {features => screenlock4merge/features}/wallpapercomponent/index.ets (100%) rename {features => screenlock4merge/features}/wallpapercomponent/package-lock.json (100%) rename {features => screenlock4merge/features}/wallpapercomponent/package.json (100%) rename {features => screenlock4merge/features}/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts (100%) rename {features => screenlock4merge/features}/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets (100%) rename {features => screenlock4merge/features}/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts (100%) rename {features => screenlock4merge/features}/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets (100%) rename {features => screenlock4merge/features}/wallpapercomponent/src/main/module.json5 (100%) rename {features => screenlock4merge/features}/wallpapercomponent/src/main/resources/base/element/string.json (100%) rename {features => screenlock4merge/features}/wificomponent/.gitignore (100%) rename {features => screenlock4merge/features}/wificomponent/build-profile.json5 (100%) rename {features => screenlock4merge/features}/wificomponent/hvigorfile.js (100%) rename {features => screenlock4merge/features}/wificomponent/index.ets (100%) rename {features => screenlock4merge/features}/wificomponent/package-lock.json (100%) rename {features => screenlock4merge/features}/wificomponent/package.json (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/ets/components/MainPage/MainPage.ets (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/ets/default/app.ets (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/ets/default/common/StyleConfiguration.ts (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/ets/default/common/constants.ts (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/ets/default/pages/wifiIcon.ets (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/ets/default/wifiModel.ts (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/module.json5 (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/base/element/float.json (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/base/element/string.json (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/base/media/icon.png (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/phone/element/float.json (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg (100%) rename {features => screenlock4merge/features}/wificomponent/src/main/resources/phone/media/icon.png (100%) rename hvigorfile.js => screenlock4merge/hvigorfile.js (100%) rename {infra => screenlock4merge/infra}/config_exts.gradle (100%) rename package-lock.json => screenlock4merge/package-lock.json (100%) rename package.json => screenlock4merge/package.json (100%) rename {product => screenlock4merge/product}/pc/.gitignore (100%) rename {product => screenlock4merge/product}/pc/build-profile.json5 (100%) rename {product => screenlock4merge/product}/pc/build.gradle (100%) rename {product => screenlock4merge/product}/pc/hvigorfile.js (100%) rename {product => screenlock4merge/product}/pc/package-lock.json (100%) rename {product => screenlock4merge/product}/pc/package.json (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/Application/AbilityStage.ts (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/common/StyleConfiguration.ts (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/common/StyleManager.ts (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/common/constants.ts (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/pages/customPassword.ets (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/pages/customscreenlock.ets (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/pages/digitalPassword.ets (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/pages/index.ets (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/pages/journalscreenlock.ets (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/pages/mixedPassword.ets (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/pages/slidescreenlock.ets (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/vm/indexViewModel.ts (100%) rename {product => screenlock4merge/product}/pc/src/main/ets/vm/slideScreenLockViewModel.ts (100%) rename {product => screenlock4merge/product}/pc/src/main/module.json5 (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/element/color.json (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/element/float.json (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/element/string.json (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/delete_all.png (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_close.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_hollow_dot.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_notification_down.png (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_notification_up.png (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_public_delete_filled.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_public_lock_filled.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_public_settings_filled.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_public_unlock_filled.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_solid_dot.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_signal_1.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_signal_2.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_signal_3.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_signal_4.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_signal_full.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_signal_no.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_signal_roaming.png (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_signal_wait.png (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_wifi_1.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_wifi_2.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_wifi_3.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_wifi_connect.png (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_wifi_full.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_statusbar_wifi_no.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/ic_user_portrait.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/icon.png (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/lock.png (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/reboot.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/send.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/shutdown.svg (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/media/unlock.png (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/base/profile/main_pages.json (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/en_US/element/string.json (100%) rename {product => screenlock4merge/product}/pc/src/main/resources/zh_CN/element/string.json (100%) rename {product => screenlock4merge/product}/phone/.gitignore (100%) rename {product => screenlock4merge/product}/phone/build-profile.json5 (100%) rename {product => screenlock4merge/product}/phone/build.gradle (100%) rename {product => screenlock4merge/product}/phone/hvigorfile.js (100%) rename {product => screenlock4merge/product}/phone/package-lock.json (100%) rename {product => screenlock4merge/product}/phone/package.json (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/AbilityStage.ts (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/Application/AbilityStage.ts (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/common/StyleConfiguration.ts (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/common/StyleManager.ts (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/common/constants.ts (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/pages/customPassword.ets (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/pages/customscreenlock.ets (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/pages/digitalPassword.ets (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/pages/index.ets (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/pages/journalscreenlock.ets (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/pages/mixedPassword.ets (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/pages/slidescreenlock.ets (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/vm/indexViewModel.ts (100%) rename {product => screenlock4merge/product}/phone/src/main/ets/vm/slideScreenLockViewModel.ts (100%) rename {product => screenlock4merge/product}/phone/src/main/module.json5 (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/element/color.json (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/element/float.json (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/element/string.json (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/bg.png (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/delete_all.png (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_close.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_hollow_dot.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_notification_down.png (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_notification_up.png (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_public_delete_filled.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_public_lock_filled.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_public_settings_filled.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_public_unlock_filled.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_solid_dot.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/ic_user_portrait.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/icon.png (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/lock.png (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/reboot.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/send.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/shutdown.svg (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/media/unlock.png (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/base/profile/main_pages.json (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/en_US/element/string.json (100%) rename {product => screenlock4merge/product}/phone/src/main/resources/zh_CN/element/string.json (100%) rename {signature => screenlock4merge/signature}/systemui.p7b (100%) diff --git a/.gitignore b/screenlock4merge/.gitignore similarity index 100% rename from .gitignore rename to screenlock4merge/.gitignore diff --git a/AppScope/app.json5 b/screenlock4merge/AppScope/app.json5 similarity index 100% rename from AppScope/app.json5 rename to screenlock4merge/AppScope/app.json5 diff --git a/AppScope/resources/base/element/string.json b/screenlock4merge/AppScope/resources/base/element/string.json similarity index 100% rename from AppScope/resources/base/element/string.json rename to screenlock4merge/AppScope/resources/base/element/string.json diff --git a/AppScope/resources/base/media/app_icon.png b/screenlock4merge/AppScope/resources/base/media/app_icon.png similarity index 100% rename from AppScope/resources/base/media/app_icon.png rename to screenlock4merge/AppScope/resources/base/media/app_icon.png diff --git a/LICENSE b/screenlock4merge/LICENSE similarity index 100% rename from LICENSE rename to screenlock4merge/LICENSE diff --git a/OAT.xml b/screenlock4merge/OAT.xml similarity index 100% rename from OAT.xml rename to screenlock4merge/OAT.xml diff --git a/README.en.md b/screenlock4merge/README.en.md similarity index 100% rename from README.en.md rename to screenlock4merge/README.en.md diff --git a/README_zh.md b/screenlock4merge/README_zh.md similarity index 100% rename from README_zh.md rename to screenlock4merge/README_zh.md diff --git a/build-profile.json5 b/screenlock4merge/build-profile.json5 similarity index 100% rename from build-profile.json5 rename to screenlock4merge/build-profile.json5 diff --git a/common/.gitignore b/screenlock4merge/common/.gitignore similarity index 100% rename from common/.gitignore rename to screenlock4merge/common/.gitignore diff --git a/common/build-profile.json5 b/screenlock4merge/common/build-profile.json5 similarity index 100% rename from common/build-profile.json5 rename to screenlock4merge/common/build-profile.json5 diff --git a/common/hvigorfile.js b/screenlock4merge/common/hvigorfile.js similarity index 100% rename from common/hvigorfile.js rename to screenlock4merge/common/hvigorfile.js diff --git a/common/index.ets b/screenlock4merge/common/index.ets similarity index 100% rename from common/index.ets rename to screenlock4merge/common/index.ets diff --git a/common/package-lock.json b/screenlock4merge/common/package-lock.json similarity index 100% rename from common/package-lock.json rename to screenlock4merge/common/package-lock.json diff --git a/common/package.json b/screenlock4merge/common/package.json similarity index 100% rename from common/package.json rename to screenlock4merge/common/package.json diff --git a/common/src/main/ets/components/MainPage/MainPage.ets b/screenlock4merge/common/src/main/ets/components/MainPage/MainPage.ets similarity index 100% rename from common/src/main/ets/components/MainPage/MainPage.ets rename to screenlock4merge/common/src/main/ets/components/MainPage/MainPage.ets diff --git a/common/src/main/ets/default/CheckEmptyUtils.ts b/screenlock4merge/common/src/main/ets/default/CheckEmptyUtils.ts similarity index 100% rename from common/src/main/ets/default/CheckEmptyUtils.ts rename to screenlock4merge/common/src/main/ets/default/CheckEmptyUtils.ts diff --git a/common/src/main/ets/default/Constants.ts b/screenlock4merge/common/src/main/ets/default/Constants.ts similarity index 100% rename from common/src/main/ets/default/Constants.ts rename to screenlock4merge/common/src/main/ets/default/Constants.ts diff --git a/common/src/main/ets/default/DateTimeCommon.ts b/screenlock4merge/common/src/main/ets/default/DateTimeCommon.ts similarity index 100% rename from common/src/main/ets/default/DateTimeCommon.ts rename to screenlock4merge/common/src/main/ets/default/DateTimeCommon.ts diff --git a/common/src/main/ets/default/Decorators.ts b/screenlock4merge/common/src/main/ets/default/Decorators.ts similarity index 100% rename from common/src/main/ets/default/Decorators.ts rename to screenlock4merge/common/src/main/ets/default/Decorators.ts diff --git a/common/src/main/ets/default/Log.ts b/screenlock4merge/common/src/main/ets/default/Log.ts similarity index 100% rename from common/src/main/ets/default/Log.ts rename to screenlock4merge/common/src/main/ets/default/Log.ts diff --git a/common/src/main/ets/default/LunarCalendar.ts b/screenlock4merge/common/src/main/ets/default/LunarCalendar.ts similarity index 100% rename from common/src/main/ets/default/LunarCalendar.ts rename to screenlock4merge/common/src/main/ets/default/LunarCalendar.ts diff --git a/common/src/main/ets/default/ReadConfigUtil.ts b/screenlock4merge/common/src/main/ets/default/ReadConfigUtil.ts similarity index 100% rename from common/src/main/ets/default/ReadConfigUtil.ts rename to screenlock4merge/common/src/main/ets/default/ReadConfigUtil.ts diff --git a/common/src/main/ets/default/ScreenLockCommon.ts b/screenlock4merge/common/src/main/ets/default/ScreenLockCommon.ts similarity index 100% rename from common/src/main/ets/default/ScreenLockCommon.ts rename to screenlock4merge/common/src/main/ets/default/ScreenLockCommon.ts diff --git a/common/src/main/ets/default/ScreenLockManager.ts b/screenlock4merge/common/src/main/ets/default/ScreenLockManager.ts similarity index 100% rename from common/src/main/ets/default/ScreenLockManager.ts rename to screenlock4merge/common/src/main/ets/default/ScreenLockManager.ts diff --git a/common/src/main/ets/default/SingleInstanceHelper.ts b/screenlock4merge/common/src/main/ets/default/SingleInstanceHelper.ts similarity index 100% rename from common/src/main/ets/default/SingleInstanceHelper.ts rename to screenlock4merge/common/src/main/ets/default/SingleInstanceHelper.ts diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/screenlock4merge/common/src/main/ets/default/StyleConfiguration.ts similarity index 100% rename from common/src/main/ets/default/StyleConfiguration.ts rename to screenlock4merge/common/src/main/ets/default/StyleConfiguration.ts diff --git a/common/src/main/ets/default/StyleManager.ts b/screenlock4merge/common/src/main/ets/default/StyleManager.ts similarity index 100% rename from common/src/main/ets/default/StyleManager.ts rename to screenlock4merge/common/src/main/ets/default/StyleManager.ts diff --git a/common/src/main/ets/default/SwitchUserManager.ts b/screenlock4merge/common/src/main/ets/default/SwitchUserManager.ts similarity index 100% rename from common/src/main/ets/default/SwitchUserManager.ts rename to screenlock4merge/common/src/main/ets/default/SwitchUserManager.ts diff --git a/common/src/main/ets/default/SysFaultLogger.ts b/screenlock4merge/common/src/main/ets/default/SysFaultLogger.ts similarity index 96% rename from common/src/main/ets/default/SysFaultLogger.ts rename to screenlock4merge/common/src/main/ets/default/SysFaultLogger.ts index bb5597ae..01c2d494 100644 --- a/common/src/main/ets/default/SysFaultLogger.ts +++ b/screenlock4merge/common/src/main/ets/default/SysFaultLogger.ts @@ -1,60 +1,60 @@ -// @ts-nocheck -/* - * Copyright (c) 2021-2022 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 Log from "./Log"; -import hiSysEvent from '@ohos.hiSysEvent' - -const TAG = 'SystemFaultLogger'; -const APP_DOMAIN: string = "SYSTEMUI_APP"; -const APP_LOG_NAME: string = "SCREENLOCK_FAULT"; - -interface LogParam { - FAULT_ID: string, - MSG: string -} - -export enum FaultID { - MEMORY = "MEMORY_MONITOR", - SCREEN_LOCK_MANAGER = "CONNECT_SCREENLOCKMANAGERSERVICE_ABNORMAL", - ACCOUNT_SYSTEM = "ACCOUNTSYSTEM_CALL_ABNORMAL" -} - -export function WriteFaultLog(logParam: LogParam) { - const sysEventInfo = { - domain: APP_DOMAIN, - name: APP_LOG_NAME, - eventType: hiSysEvent.EventType.FAULT, - params: logParam - } - hiSysEvent.write(sysEventInfo, (err, val) => { - Log.showInfo(TAG, "fault log params is : " + JSON.stringify(sysEventInfo)) - Log.showInfo(TAG, `write fault log result: ${val}`) - }) -} - -export function SysFaultLogger(logParam: LogParam) { - return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { - const originalFunc = descriptor.value; - descriptor.value = function(...args) { - try { - originalFunc.apply(this, args); - } catch (err: any) { - Log.showInfo(TAG, "catch error in execute: " + propertyKey); - WriteFaultLog(logParam); - } - }; - }; +// @ts-nocheck +/* + * Copyright (c) 2021-2022 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 Log from "./Log"; +import hiSysEvent from '@ohos.hiSysEvent' + +const TAG = 'SystemFaultLogger'; +const APP_DOMAIN: string = "SYSTEMUI_APP"; +const APP_LOG_NAME: string = "SCREENLOCK_FAULT"; + +interface LogParam { + FAULT_ID: string, + MSG: string +} + +export enum FaultID { + MEMORY = "MEMORY_MONITOR", + SCREEN_LOCK_MANAGER = "CONNECT_SCREENLOCKMANAGERSERVICE_ABNORMAL", + ACCOUNT_SYSTEM = "ACCOUNTSYSTEM_CALL_ABNORMAL" +} + +export function WriteFaultLog(logParam: LogParam) { + const sysEventInfo = { + domain: APP_DOMAIN, + name: APP_LOG_NAME, + eventType: hiSysEvent.EventType.FAULT, + params: logParam + } + hiSysEvent.write(sysEventInfo, (err, val) => { + Log.showInfo(TAG, "fault log params is : " + JSON.stringify(sysEventInfo)) + Log.showInfo(TAG, `write fault log result: ${val}`) + }) +} + +export function SysFaultLogger(logParam: LogParam) { + return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + const originalFunc = descriptor.value; + descriptor.value = function(...args) { + try { + originalFunc.apply(this, args); + } catch (err: any) { + Log.showInfo(TAG, "catch error in execute: " + propertyKey); + WriteFaultLog(logParam); + } + }; + }; } \ No newline at end of file diff --git a/common/src/main/ets/default/TimeManager.ts b/screenlock4merge/common/src/main/ets/default/TimeManager.ts similarity index 100% rename from common/src/main/ets/default/TimeManager.ts rename to screenlock4merge/common/src/main/ets/default/TimeManager.ts diff --git a/common/src/main/ets/default/Trace.ts b/screenlock4merge/common/src/main/ets/default/Trace.ts similarity index 100% rename from common/src/main/ets/default/Trace.ts rename to screenlock4merge/common/src/main/ets/default/Trace.ts diff --git a/common/src/main/ets/default/WindowManager.ts b/screenlock4merge/common/src/main/ets/default/WindowManager.ts similarity index 100% rename from common/src/main/ets/default/WindowManager.ts rename to screenlock4merge/common/src/main/ets/default/WindowManager.ts diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/screenlock4merge/common/src/main/ets/default/abilitymanager/abilityManager.ts similarity index 100% rename from common/src/main/ets/default/abilitymanager/abilityManager.ts rename to screenlock4merge/common/src/main/ets/default/abilitymanager/abilityManager.ts diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ts b/screenlock4merge/common/src/main/ets/default/abilitymanager/bundleManager.ts similarity index 100% rename from common/src/main/ets/default/abilitymanager/bundleManager.ts rename to screenlock4merge/common/src/main/ets/default/abilitymanager/bundleManager.ts diff --git a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts b/screenlock4merge/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts similarity index 100% rename from common/src/main/ets/default/abilitymanager/featureAbilityManager.ts rename to screenlock4merge/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts diff --git a/common/src/main/ets/default/abilitymanager/notificationManager.ts b/screenlock4merge/common/src/main/ets/default/abilitymanager/notificationManager.ts similarity index 100% rename from common/src/main/ets/default/abilitymanager/notificationManager.ts rename to screenlock4merge/common/src/main/ets/default/abilitymanager/notificationManager.ts diff --git a/common/src/main/ets/default/commonEvent/CommonEventManager.ts b/screenlock4merge/common/src/main/ets/default/commonEvent/CommonEventManager.ts similarity index 100% rename from common/src/main/ets/default/commonEvent/CommonEventManager.ts rename to screenlock4merge/common/src/main/ets/default/commonEvent/CommonEventManager.ts diff --git a/common/src/main/ets/default/event/EventBus.ts b/screenlock4merge/common/src/main/ets/default/event/EventBus.ts similarity index 100% rename from common/src/main/ets/default/event/EventBus.ts rename to screenlock4merge/common/src/main/ets/default/event/EventBus.ts diff --git a/common/src/main/ets/default/event/EventManager.ts b/screenlock4merge/common/src/main/ets/default/event/EventManager.ts similarity index 100% rename from common/src/main/ets/default/event/EventManager.ts rename to screenlock4merge/common/src/main/ets/default/event/EventManager.ts diff --git a/common/src/main/ets/default/event/EventUtil.ts b/screenlock4merge/common/src/main/ets/default/event/EventUtil.ts similarity index 100% rename from common/src/main/ets/default/event/EventUtil.ts rename to screenlock4merge/common/src/main/ets/default/event/EventUtil.ts diff --git a/common/src/main/module.json5 b/screenlock4merge/common/src/main/module.json5 similarity index 100% rename from common/src/main/module.json5 rename to screenlock4merge/common/src/main/module.json5 diff --git a/common/src/main/resources/base/element/float.json b/screenlock4merge/common/src/main/resources/base/element/float.json similarity index 100% rename from common/src/main/resources/base/element/float.json rename to screenlock4merge/common/src/main/resources/base/element/float.json diff --git a/common/src/main/resources/base/element/string.json b/screenlock4merge/common/src/main/resources/base/element/string.json similarity index 100% rename from common/src/main/resources/base/element/string.json rename to screenlock4merge/common/src/main/resources/base/element/string.json diff --git a/common/src/main/resources/en_US/element/string.json b/screenlock4merge/common/src/main/resources/en_US/element/string.json similarity index 100% rename from common/src/main/resources/en_US/element/string.json rename to screenlock4merge/common/src/main/resources/en_US/element/string.json diff --git a/common/src/main/resources/phone/element/float.json b/screenlock4merge/common/src/main/resources/phone/element/float.json similarity index 100% rename from common/src/main/resources/phone/element/float.json rename to screenlock4merge/common/src/main/resources/phone/element/float.json diff --git a/common/src/main/resources/zh_CN/element/string.json b/screenlock4merge/common/src/main/resources/zh_CN/element/string.json similarity index 100% rename from common/src/main/resources/zh_CN/element/string.json rename to screenlock4merge/common/src/main/resources/zh_CN/element/string.json diff --git a/entry/.gitignore b/screenlock4merge/entry/.gitignore similarity index 100% rename from entry/.gitignore rename to screenlock4merge/entry/.gitignore diff --git a/entry/build-profile.json5 b/screenlock4merge/entry/build-profile.json5 similarity index 100% rename from entry/build-profile.json5 rename to screenlock4merge/entry/build-profile.json5 diff --git a/entry/hvigorfile.js b/screenlock4merge/entry/hvigorfile.js similarity index 100% rename from entry/hvigorfile.js rename to screenlock4merge/entry/hvigorfile.js diff --git a/entry/package-lock.json b/screenlock4merge/entry/package-lock.json similarity index 100% rename from entry/package-lock.json rename to screenlock4merge/entry/package-lock.json diff --git a/entry/package.json b/screenlock4merge/entry/package.json similarity index 100% rename from entry/package.json rename to screenlock4merge/entry/package.json diff --git a/entry/src/main/ets/Application/AbilityStage.ts b/screenlock4merge/entry/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from entry/src/main/ets/Application/AbilityStage.ts rename to screenlock4merge/entry/src/main/ets/Application/AbilityStage.ts diff --git a/entry/src/main/ets/MainAbility/MainAbility.ts b/screenlock4merge/entry/src/main/ets/MainAbility/MainAbility.ts similarity index 100% rename from entry/src/main/ets/MainAbility/MainAbility.ts rename to screenlock4merge/entry/src/main/ets/MainAbility/MainAbility.ts diff --git a/entry/src/main/ets/pages/index.ets b/screenlock4merge/entry/src/main/ets/pages/index.ets similarity index 100% rename from entry/src/main/ets/pages/index.ets rename to screenlock4merge/entry/src/main/ets/pages/index.ets diff --git a/entry/src/main/module.json5 b/screenlock4merge/entry/src/main/module.json5 similarity index 100% rename from entry/src/main/module.json5 rename to screenlock4merge/entry/src/main/module.json5 diff --git a/entry/src/main/resources/base/element/color.json b/screenlock4merge/entry/src/main/resources/base/element/color.json similarity index 93% rename from entry/src/main/resources/base/element/color.json rename to screenlock4merge/entry/src/main/resources/base/element/color.json index 2299b1a8..bb3c02e7 100644 --- a/entry/src/main/resources/base/element/color.json +++ b/screenlock4merge/entry/src/main/resources/base/element/color.json @@ -1,8 +1,8 @@ -{ - "color": [ - { - "name": "startWindowBackground", - "value": "#ffffff" - } - ] +{ + "color": [ + { + "name": "startWindowBackground", + "value": "#ffffff" + } + ] } \ No newline at end of file diff --git a/entry/src/main/resources/base/element/string.json b/screenlock4merge/entry/src/main/resources/base/element/string.json similarity index 100% rename from entry/src/main/resources/base/element/string.json rename to screenlock4merge/entry/src/main/resources/base/element/string.json diff --git a/entry/src/main/resources/base/media/icon.png b/screenlock4merge/entry/src/main/resources/base/media/icon.png similarity index 100% rename from entry/src/main/resources/base/media/icon.png rename to screenlock4merge/entry/src/main/resources/base/media/icon.png diff --git a/entry/src/main/resources/base/profile/main_pages.json b/screenlock4merge/entry/src/main/resources/base/profile/main_pages.json similarity index 100% rename from entry/src/main/resources/base/profile/main_pages.json rename to screenlock4merge/entry/src/main/resources/base/profile/main_pages.json diff --git a/features/batterycomponent/.gitignore b/screenlock4merge/features/batterycomponent/.gitignore similarity index 100% rename from features/batterycomponent/.gitignore rename to screenlock4merge/features/batterycomponent/.gitignore diff --git a/features/batterycomponent/build-profile.json5 b/screenlock4merge/features/batterycomponent/build-profile.json5 similarity index 100% rename from features/batterycomponent/build-profile.json5 rename to screenlock4merge/features/batterycomponent/build-profile.json5 diff --git a/features/batterycomponent/hvigorfile.js b/screenlock4merge/features/batterycomponent/hvigorfile.js similarity index 100% rename from features/batterycomponent/hvigorfile.js rename to screenlock4merge/features/batterycomponent/hvigorfile.js diff --git a/features/batterycomponent/index.ets b/screenlock4merge/features/batterycomponent/index.ets similarity index 100% rename from features/batterycomponent/index.ets rename to screenlock4merge/features/batterycomponent/index.ets diff --git a/features/batterycomponent/package-lock.json b/screenlock4merge/features/batterycomponent/package-lock.json similarity index 100% rename from features/batterycomponent/package-lock.json rename to screenlock4merge/features/batterycomponent/package-lock.json diff --git a/features/batterycomponent/package.json b/screenlock4merge/features/batterycomponent/package.json similarity index 100% rename from features/batterycomponent/package.json rename to screenlock4merge/features/batterycomponent/package.json diff --git a/features/batterycomponent/src/main/ets/components/MainPage/MainPage.ets b/screenlock4merge/features/batterycomponent/src/main/ets/components/MainPage/MainPage.ets similarity index 100% rename from features/batterycomponent/src/main/ets/components/MainPage/MainPage.ets rename to screenlock4merge/features/batterycomponent/src/main/ets/components/MainPage/MainPage.ets diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/screenlock4merge/features/batterycomponent/src/main/ets/default/batteryModel.ts similarity index 100% rename from features/batterycomponent/src/main/ets/default/batteryModel.ts rename to screenlock4merge/features/batterycomponent/src/main/ets/default/batteryModel.ts diff --git a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts b/screenlock4merge/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 100% rename from features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts rename to screenlock4merge/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts diff --git a/features/batterycomponent/src/main/ets/default/common/constants.ts b/screenlock4merge/features/batterycomponent/src/main/ets/default/common/constants.ts similarity index 100% rename from features/batterycomponent/src/main/ets/default/common/constants.ts rename to screenlock4merge/features/batterycomponent/src/main/ets/default/common/constants.ts diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/screenlock4merge/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets similarity index 100% rename from features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets rename to screenlock4merge/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/screenlock4merge/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets similarity index 100% rename from features/batterycomponent/src/main/ets/default/pages/batteryPic.ets rename to screenlock4merge/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets diff --git a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/screenlock4merge/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets similarity index 100% rename from features/batterycomponent/src/main/ets/default/pages/batterySoc.ets rename to screenlock4merge/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets diff --git a/features/batterycomponent/src/main/module.json5 b/screenlock4merge/features/batterycomponent/src/main/module.json5 similarity index 100% rename from features/batterycomponent/src/main/module.json5 rename to screenlock4merge/features/batterycomponent/src/main/module.json5 diff --git a/features/batterycomponent/src/main/resources/base/element/color.json b/screenlock4merge/features/batterycomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/batterycomponent/src/main/resources/base/element/color.json rename to screenlock4merge/features/batterycomponent/src/main/resources/base/element/color.json diff --git a/features/batterycomponent/src/main/resources/base/element/float.json b/screenlock4merge/features/batterycomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/batterycomponent/src/main/resources/base/element/float.json rename to screenlock4merge/features/batterycomponent/src/main/resources/base/element/float.json diff --git a/features/batterycomponent/src/main/resources/base/element/string.json b/screenlock4merge/features/batterycomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/batterycomponent/src/main/resources/base/element/string.json rename to screenlock4merge/features/batterycomponent/src/main/resources/base/element/string.json diff --git a/features/batterycomponent/src/main/resources/base/media/icon.png b/screenlock4merge/features/batterycomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/batterycomponent/src/main/resources/base/media/icon.png rename to screenlock4merge/features/batterycomponent/src/main/resources/base/media/icon.png diff --git a/features/batterycomponent/src/main/resources/en_US/element/string.json b/screenlock4merge/features/batterycomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/batterycomponent/src/main/resources/en_US/element/string.json rename to screenlock4merge/features/batterycomponent/src/main/resources/en_US/element/string.json diff --git a/features/batterycomponent/src/main/resources/phone/element/float.json b/screenlock4merge/features/batterycomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/batterycomponent/src/main/resources/phone/element/float.json rename to screenlock4merge/features/batterycomponent/src/main/resources/phone/element/float.json diff --git a/features/batterycomponent/src/main/resources/zh_CN/element/string.json b/screenlock4merge/features/batterycomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/batterycomponent/src/main/resources/zh_CN/element/string.json rename to screenlock4merge/features/batterycomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/clockcomponent/.gitignore b/screenlock4merge/features/clockcomponent/.gitignore similarity index 100% rename from features/clockcomponent/.gitignore rename to screenlock4merge/features/clockcomponent/.gitignore diff --git a/features/clockcomponent/build-profile.json5 b/screenlock4merge/features/clockcomponent/build-profile.json5 similarity index 100% rename from features/clockcomponent/build-profile.json5 rename to screenlock4merge/features/clockcomponent/build-profile.json5 diff --git a/features/clockcomponent/hvigorfile.js b/screenlock4merge/features/clockcomponent/hvigorfile.js similarity index 100% rename from features/clockcomponent/hvigorfile.js rename to screenlock4merge/features/clockcomponent/hvigorfile.js diff --git a/features/clockcomponent/index.ets b/screenlock4merge/features/clockcomponent/index.ets similarity index 100% rename from features/clockcomponent/index.ets rename to screenlock4merge/features/clockcomponent/index.ets diff --git a/features/clockcomponent/package-lock.json b/screenlock4merge/features/clockcomponent/package-lock.json similarity index 100% rename from features/clockcomponent/package-lock.json rename to screenlock4merge/features/clockcomponent/package-lock.json diff --git a/features/clockcomponent/package.json b/screenlock4merge/features/clockcomponent/package.json similarity index 100% rename from features/clockcomponent/package.json rename to screenlock4merge/features/clockcomponent/package.json diff --git a/features/clockcomponent/src/main/ets/components/MainPage/MainPage.ets b/screenlock4merge/features/clockcomponent/src/main/ets/components/MainPage/MainPage.ets similarity index 100% rename from features/clockcomponent/src/main/ets/components/MainPage/MainPage.ets rename to screenlock4merge/features/clockcomponent/src/main/ets/components/MainPage/MainPage.ets diff --git a/features/clockcomponent/src/main/ets/default/app.ets b/screenlock4merge/features/clockcomponent/src/main/ets/default/app.ets similarity index 100% rename from features/clockcomponent/src/main/ets/default/app.ets rename to screenlock4merge/features/clockcomponent/src/main/ets/default/app.ets diff --git a/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts b/screenlock4merge/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 100% rename from features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts rename to screenlock4merge/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/screenlock4merge/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets similarity index 100% rename from features/clockcomponent/src/main/ets/default/pages/clockIcon.ets rename to screenlock4merge/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets diff --git a/features/clockcomponent/src/main/module.json5 b/screenlock4merge/features/clockcomponent/src/main/module.json5 similarity index 100% rename from features/clockcomponent/src/main/module.json5 rename to screenlock4merge/features/clockcomponent/src/main/module.json5 diff --git a/features/clockcomponent/src/main/resources/base/element/color.json b/screenlock4merge/features/clockcomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/clockcomponent/src/main/resources/base/element/color.json rename to screenlock4merge/features/clockcomponent/src/main/resources/base/element/color.json diff --git a/features/clockcomponent/src/main/resources/base/element/float.json b/screenlock4merge/features/clockcomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/clockcomponent/src/main/resources/base/element/float.json rename to screenlock4merge/features/clockcomponent/src/main/resources/base/element/float.json diff --git a/features/clockcomponent/src/main/resources/base/element/string.json b/screenlock4merge/features/clockcomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/clockcomponent/src/main/resources/base/element/string.json rename to screenlock4merge/features/clockcomponent/src/main/resources/base/element/string.json diff --git a/features/clockcomponent/src/main/resources/base/media/icon.png b/screenlock4merge/features/clockcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/clockcomponent/src/main/resources/base/media/icon.png rename to screenlock4merge/features/clockcomponent/src/main/resources/base/media/icon.png diff --git a/features/clockcomponent/src/main/resources/en_US/element/string.json b/screenlock4merge/features/clockcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/clockcomponent/src/main/resources/en_US/element/string.json rename to screenlock4merge/features/clockcomponent/src/main/resources/en_US/element/string.json diff --git a/features/clockcomponent/src/main/resources/phone/element/float.json b/screenlock4merge/features/clockcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/clockcomponent/src/main/resources/phone/element/float.json rename to screenlock4merge/features/clockcomponent/src/main/resources/phone/element/float.json diff --git a/features/clockcomponent/src/main/resources/zh_CN/element/string.json b/screenlock4merge/features/clockcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/clockcomponent/src/main/resources/zh_CN/element/string.json rename to screenlock4merge/features/clockcomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/datetimecomponent/.gitignore b/screenlock4merge/features/datetimecomponent/.gitignore similarity index 100% rename from features/datetimecomponent/.gitignore rename to screenlock4merge/features/datetimecomponent/.gitignore diff --git a/features/datetimecomponent/build-profile.json5 b/screenlock4merge/features/datetimecomponent/build-profile.json5 similarity index 100% rename from features/datetimecomponent/build-profile.json5 rename to screenlock4merge/features/datetimecomponent/build-profile.json5 diff --git a/features/datetimecomponent/hvigorfile.js b/screenlock4merge/features/datetimecomponent/hvigorfile.js similarity index 100% rename from features/datetimecomponent/hvigorfile.js rename to screenlock4merge/features/datetimecomponent/hvigorfile.js diff --git a/features/datetimecomponent/index.ets b/screenlock4merge/features/datetimecomponent/index.ets similarity index 100% rename from features/datetimecomponent/index.ets rename to screenlock4merge/features/datetimecomponent/index.ets diff --git a/features/datetimecomponent/package-lock.json b/screenlock4merge/features/datetimecomponent/package-lock.json similarity index 100% rename from features/datetimecomponent/package-lock.json rename to screenlock4merge/features/datetimecomponent/package-lock.json diff --git a/features/datetimecomponent/package.json b/screenlock4merge/features/datetimecomponent/package.json similarity index 100% rename from features/datetimecomponent/package.json rename to screenlock4merge/features/datetimecomponent/package.json diff --git a/features/datetimecomponent/src/main/ets/com/ohos/common/constants.ts b/screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/common/constants.ts similarity index 100% rename from features/datetimecomponent/src/main/ets/com/ohos/common/constants.ts rename to screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/common/constants.ts diff --git a/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets b/screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets similarity index 100% rename from features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets rename to screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets diff --git a/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts b/screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts similarity index 100% rename from features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts rename to screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts diff --git a/features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets b/screenlock4merge/features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets similarity index 100% rename from features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets rename to screenlock4merge/features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets diff --git a/features/datetimecomponent/src/main/module.json5 b/screenlock4merge/features/datetimecomponent/src/main/module.json5 similarity index 100% rename from features/datetimecomponent/src/main/module.json5 rename to screenlock4merge/features/datetimecomponent/src/main/module.json5 diff --git a/features/datetimecomponent/src/main/resources/base/element/color.json b/screenlock4merge/features/datetimecomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/datetimecomponent/src/main/resources/base/element/color.json rename to screenlock4merge/features/datetimecomponent/src/main/resources/base/element/color.json diff --git a/features/datetimecomponent/src/main/resources/base/element/float.json b/screenlock4merge/features/datetimecomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/datetimecomponent/src/main/resources/base/element/float.json rename to screenlock4merge/features/datetimecomponent/src/main/resources/base/element/float.json diff --git a/features/datetimecomponent/src/main/resources/base/element/string.json b/screenlock4merge/features/datetimecomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/datetimecomponent/src/main/resources/base/element/string.json rename to screenlock4merge/features/datetimecomponent/src/main/resources/base/element/string.json diff --git a/features/datetimecomponent/src/main/resources/en_US/element/string.json b/screenlock4merge/features/datetimecomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/datetimecomponent/src/main/resources/en_US/element/string.json rename to screenlock4merge/features/datetimecomponent/src/main/resources/en_US/element/string.json diff --git a/features/datetimecomponent/src/main/resources/phone/element/float.json b/screenlock4merge/features/datetimecomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/datetimecomponent/src/main/resources/phone/element/float.json rename to screenlock4merge/features/datetimecomponent/src/main/resources/phone/element/float.json diff --git a/features/datetimecomponent/src/main/resources/zh_CN/element/string.json b/screenlock4merge/features/datetimecomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/datetimecomponent/src/main/resources/zh_CN/element/string.json rename to screenlock4merge/features/datetimecomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/noticeitem/.gitignore b/screenlock4merge/features/noticeitem/.gitignore similarity index 100% rename from features/noticeitem/.gitignore rename to screenlock4merge/features/noticeitem/.gitignore diff --git a/features/noticeitem/build-profile.json5 b/screenlock4merge/features/noticeitem/build-profile.json5 similarity index 100% rename from features/noticeitem/build-profile.json5 rename to screenlock4merge/features/noticeitem/build-profile.json5 diff --git a/features/noticeitem/hvigorfile.js b/screenlock4merge/features/noticeitem/hvigorfile.js similarity index 100% rename from features/noticeitem/hvigorfile.js rename to screenlock4merge/features/noticeitem/hvigorfile.js diff --git a/features/noticeitem/index.ets b/screenlock4merge/features/noticeitem/index.ets similarity index 100% rename from features/noticeitem/index.ets rename to screenlock4merge/features/noticeitem/index.ets diff --git a/features/noticeitem/package-lock.json b/screenlock4merge/features/noticeitem/package-lock.json similarity index 100% rename from features/noticeitem/package-lock.json rename to screenlock4merge/features/noticeitem/package-lock.json diff --git a/features/noticeitem/package.json b/screenlock4merge/features/noticeitem/package.json similarity index 100% rename from features/noticeitem/package.json rename to screenlock4merge/features/noticeitem/package.json diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/basicItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/longItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/multiItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts similarity index 100% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts rename to screenlock4merge/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts diff --git a/features/noticeitem/src/main/ets/components/MainPage/MainPage.ets b/screenlock4merge/features/noticeitem/src/main/ets/components/MainPage/MainPage.ets similarity index 100% rename from features/noticeitem/src/main/ets/components/MainPage/MainPage.ets rename to screenlock4merge/features/noticeitem/src/main/ets/components/MainPage/MainPage.ets diff --git a/features/noticeitem/src/main/module.json5 b/screenlock4merge/features/noticeitem/src/main/module.json5 similarity index 100% rename from features/noticeitem/src/main/module.json5 rename to screenlock4merge/features/noticeitem/src/main/module.json5 diff --git a/features/noticeitem/src/main/resources/base/element/color.json b/screenlock4merge/features/noticeitem/src/main/resources/base/element/color.json similarity index 100% rename from features/noticeitem/src/main/resources/base/element/color.json rename to screenlock4merge/features/noticeitem/src/main/resources/base/element/color.json diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/screenlock4merge/features/noticeitem/src/main/resources/base/element/float.json similarity index 100% rename from features/noticeitem/src/main/resources/base/element/float.json rename to screenlock4merge/features/noticeitem/src/main/resources/base/element/float.json diff --git a/features/noticeitem/src/main/resources/base/element/string.json b/screenlock4merge/features/noticeitem/src/main/resources/base/element/string.json similarity index 100% rename from features/noticeitem/src/main/resources/base/element/string.json rename to screenlock4merge/features/noticeitem/src/main/resources/base/element/string.json diff --git a/features/noticeitem/src/main/resources/base/media/ic_close.svg b/screenlock4merge/features/noticeitem/src/main/resources/base/media/ic_close.svg similarity index 100% rename from features/noticeitem/src/main/resources/base/media/ic_close.svg rename to screenlock4merge/features/noticeitem/src/main/resources/base/media/ic_close.svg diff --git a/features/noticeitem/src/main/resources/base/media/ic_notification_down.png b/screenlock4merge/features/noticeitem/src/main/resources/base/media/ic_notification_down.png similarity index 100% rename from features/noticeitem/src/main/resources/base/media/ic_notification_down.png rename to screenlock4merge/features/noticeitem/src/main/resources/base/media/ic_notification_down.png diff --git a/features/noticeitem/src/main/resources/base/media/ic_notification_up.png b/screenlock4merge/features/noticeitem/src/main/resources/base/media/ic_notification_up.png similarity index 100% rename from features/noticeitem/src/main/resources/base/media/ic_notification_up.png rename to screenlock4merge/features/noticeitem/src/main/resources/base/media/ic_notification_up.png diff --git a/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg b/screenlock4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg similarity index 100% rename from features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg rename to screenlock4merge/features/noticeitem/src/main/resources/base/media/ic_public_delete_filled.svg diff --git a/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg b/screenlock4merge/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg similarity index 100% rename from features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg rename to screenlock4merge/features/noticeitem/src/main/resources/base/media/ic_public_settings_filled.svg diff --git a/features/noticeitem/src/main/resources/base/media/send.svg b/screenlock4merge/features/noticeitem/src/main/resources/base/media/send.svg similarity index 100% rename from features/noticeitem/src/main/resources/base/media/send.svg rename to screenlock4merge/features/noticeitem/src/main/resources/base/media/send.svg diff --git a/features/noticeitem/src/main/resources/en_US/element/string.json b/screenlock4merge/features/noticeitem/src/main/resources/en_US/element/string.json similarity index 100% rename from features/noticeitem/src/main/resources/en_US/element/string.json rename to screenlock4merge/features/noticeitem/src/main/resources/en_US/element/string.json diff --git a/features/noticeitem/src/main/resources/phone/element/color.json b/screenlock4merge/features/noticeitem/src/main/resources/phone/element/color.json similarity index 100% rename from features/noticeitem/src/main/resources/phone/element/color.json rename to screenlock4merge/features/noticeitem/src/main/resources/phone/element/color.json diff --git a/features/noticeitem/src/main/resources/phone/element/float.json b/screenlock4merge/features/noticeitem/src/main/resources/phone/element/float.json similarity index 100% rename from features/noticeitem/src/main/resources/phone/element/float.json rename to screenlock4merge/features/noticeitem/src/main/resources/phone/element/float.json diff --git a/features/noticeitem/src/main/resources/rawfile/notificationConfig.json b/screenlock4merge/features/noticeitem/src/main/resources/rawfile/notificationConfig.json similarity index 100% rename from features/noticeitem/src/main/resources/rawfile/notificationConfig.json rename to screenlock4merge/features/noticeitem/src/main/resources/rawfile/notificationConfig.json diff --git a/features/noticeitem/src/main/resources/zh_CN/element/string.json b/screenlock4merge/features/noticeitem/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/noticeitem/src/main/resources/zh_CN/element/string.json rename to screenlock4merge/features/noticeitem/src/main/resources/zh_CN/element/string.json diff --git a/features/screenlock/.gitignore b/screenlock4merge/features/screenlock/.gitignore similarity index 100% rename from features/screenlock/.gitignore rename to screenlock4merge/features/screenlock/.gitignore diff --git a/features/screenlock/build-profile.json5 b/screenlock4merge/features/screenlock/build-profile.json5 similarity index 100% rename from features/screenlock/build-profile.json5 rename to screenlock4merge/features/screenlock/build-profile.json5 diff --git a/features/screenlock/hvigorfile.js b/screenlock4merge/features/screenlock/hvigorfile.js similarity index 100% rename from features/screenlock/hvigorfile.js rename to screenlock4merge/features/screenlock/hvigorfile.js diff --git a/features/screenlock/index.ets b/screenlock4merge/features/screenlock/index.ets similarity index 100% rename from features/screenlock/index.ets rename to screenlock4merge/features/screenlock/index.ets diff --git a/features/screenlock/package-lock.json b/screenlock4merge/features/screenlock/package-lock.json similarity index 100% rename from features/screenlock/package-lock.json rename to screenlock4merge/features/screenlock/package-lock.json diff --git a/features/screenlock/package.json b/screenlock4merge/features/screenlock/package.json similarity index 100% rename from features/screenlock/package.json rename to screenlock4merge/features/screenlock/package.json diff --git a/features/screenlock/src/main/ets/com/ohos/common/constants.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/common/constants.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/common/constants.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/common/constants.ts diff --git a/features/screenlock/src/main/ets/com/ohos/data/userData.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/data/userData.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/data/userData.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/data/userData.ts diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets diff --git a/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts diff --git a/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts diff --git a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts diff --git a/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts diff --git a/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts diff --git a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts b/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts rename to screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts diff --git a/features/screenlock/src/main/ets/components/MainPage/MainPage.ets b/screenlock4merge/features/screenlock/src/main/ets/components/MainPage/MainPage.ets similarity index 100% rename from features/screenlock/src/main/ets/components/MainPage/MainPage.ets rename to screenlock4merge/features/screenlock/src/main/ets/components/MainPage/MainPage.ets diff --git a/features/screenlock/src/main/module.json5 b/screenlock4merge/features/screenlock/src/main/module.json5 similarity index 100% rename from features/screenlock/src/main/module.json5 rename to screenlock4merge/features/screenlock/src/main/module.json5 diff --git a/features/screenlock/src/main/resources/base/element/color.json b/screenlock4merge/features/screenlock/src/main/resources/base/element/color.json similarity index 100% rename from features/screenlock/src/main/resources/base/element/color.json rename to screenlock4merge/features/screenlock/src/main/resources/base/element/color.json diff --git a/features/screenlock/src/main/resources/base/element/float.json b/screenlock4merge/features/screenlock/src/main/resources/base/element/float.json similarity index 100% rename from features/screenlock/src/main/resources/base/element/float.json rename to screenlock4merge/features/screenlock/src/main/resources/base/element/float.json diff --git a/features/screenlock/src/main/resources/base/element/string.json b/screenlock4merge/features/screenlock/src/main/resources/base/element/string.json similarity index 100% rename from features/screenlock/src/main/resources/base/element/string.json rename to screenlock4merge/features/screenlock/src/main/resources/base/element/string.json diff --git a/features/screenlock/src/main/resources/base/media/delete_all.png b/screenlock4merge/features/screenlock/src/main/resources/base/media/delete_all.png similarity index 100% rename from features/screenlock/src/main/resources/base/media/delete_all.png rename to screenlock4merge/features/screenlock/src/main/resources/base/media/delete_all.png diff --git a/features/screenlock/src/main/resources/base/media/ic_hollow_dot.svg b/screenlock4merge/features/screenlock/src/main/resources/base/media/ic_hollow_dot.svg similarity index 100% rename from features/screenlock/src/main/resources/base/media/ic_hollow_dot.svg rename to screenlock4merge/features/screenlock/src/main/resources/base/media/ic_hollow_dot.svg diff --git a/features/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg b/screenlock4merge/features/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg similarity index 100% rename from features/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg rename to screenlock4merge/features/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg diff --git a/features/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg b/screenlock4merge/features/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg similarity index 100% rename from features/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg rename to screenlock4merge/features/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg diff --git a/features/screenlock/src/main/resources/base/media/ic_solid_dot.svg b/screenlock4merge/features/screenlock/src/main/resources/base/media/ic_solid_dot.svg similarity index 100% rename from features/screenlock/src/main/resources/base/media/ic_solid_dot.svg rename to screenlock4merge/features/screenlock/src/main/resources/base/media/ic_solid_dot.svg diff --git a/features/screenlock/src/main/resources/base/media/ic_user_portrait.svg b/screenlock4merge/features/screenlock/src/main/resources/base/media/ic_user_portrait.svg similarity index 100% rename from features/screenlock/src/main/resources/base/media/ic_user_portrait.svg rename to screenlock4merge/features/screenlock/src/main/resources/base/media/ic_user_portrait.svg diff --git a/features/screenlock/src/main/resources/base/media/lock.png b/screenlock4merge/features/screenlock/src/main/resources/base/media/lock.png similarity index 100% rename from features/screenlock/src/main/resources/base/media/lock.png rename to screenlock4merge/features/screenlock/src/main/resources/base/media/lock.png diff --git a/features/screenlock/src/main/resources/base/media/unlock.png b/screenlock4merge/features/screenlock/src/main/resources/base/media/unlock.png similarity index 100% rename from features/screenlock/src/main/resources/base/media/unlock.png rename to screenlock4merge/features/screenlock/src/main/resources/base/media/unlock.png diff --git a/features/screenlock/src/main/resources/en_US/element/string.json b/screenlock4merge/features/screenlock/src/main/resources/en_US/element/string.json similarity index 100% rename from features/screenlock/src/main/resources/en_US/element/string.json rename to screenlock4merge/features/screenlock/src/main/resources/en_US/element/string.json diff --git a/features/screenlock/src/main/resources/phone/element/float.json b/screenlock4merge/features/screenlock/src/main/resources/phone/element/float.json similarity index 100% rename from features/screenlock/src/main/resources/phone/element/float.json rename to screenlock4merge/features/screenlock/src/main/resources/phone/element/float.json diff --git a/features/screenlock/src/main/resources/phone/element/string.json b/screenlock4merge/features/screenlock/src/main/resources/phone/element/string.json similarity index 100% rename from features/screenlock/src/main/resources/phone/element/string.json rename to screenlock4merge/features/screenlock/src/main/resources/phone/element/string.json diff --git a/features/screenlock/src/main/resources/rawfile/antiTouch.json b/screenlock4merge/features/screenlock/src/main/resources/rawfile/antiTouch.json similarity index 100% rename from features/screenlock/src/main/resources/rawfile/antiTouch.json rename to screenlock4merge/features/screenlock/src/main/resources/rawfile/antiTouch.json diff --git a/features/screenlock/src/main/resources/rawfile/screenlock.json b/screenlock4merge/features/screenlock/src/main/resources/rawfile/screenlock.json similarity index 100% rename from features/screenlock/src/main/resources/rawfile/screenlock.json rename to screenlock4merge/features/screenlock/src/main/resources/rawfile/screenlock.json diff --git a/features/screenlock/src/main/resources/zh_CN/element/string.json b/screenlock4merge/features/screenlock/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/screenlock/src/main/resources/zh_CN/element/string.json rename to screenlock4merge/features/screenlock/src/main/resources/zh_CN/element/string.json diff --git a/features/shortcutcomponent/.gitignore b/screenlock4merge/features/shortcutcomponent/.gitignore similarity index 100% rename from features/shortcutcomponent/.gitignore rename to screenlock4merge/features/shortcutcomponent/.gitignore diff --git a/features/shortcutcomponent/build-profile.json5 b/screenlock4merge/features/shortcutcomponent/build-profile.json5 similarity index 100% rename from features/shortcutcomponent/build-profile.json5 rename to screenlock4merge/features/shortcutcomponent/build-profile.json5 diff --git a/features/shortcutcomponent/hvigorfile.js b/screenlock4merge/features/shortcutcomponent/hvigorfile.js similarity index 100% rename from features/shortcutcomponent/hvigorfile.js rename to screenlock4merge/features/shortcutcomponent/hvigorfile.js diff --git a/features/shortcutcomponent/index.ets b/screenlock4merge/features/shortcutcomponent/index.ets similarity index 100% rename from features/shortcutcomponent/index.ets rename to screenlock4merge/features/shortcutcomponent/index.ets diff --git a/features/shortcutcomponent/package-lock.json b/screenlock4merge/features/shortcutcomponent/package-lock.json similarity index 100% rename from features/shortcutcomponent/package-lock.json rename to screenlock4merge/features/shortcutcomponent/package-lock.json diff --git a/features/shortcutcomponent/package.json b/screenlock4merge/features/shortcutcomponent/package.json similarity index 100% rename from features/shortcutcomponent/package.json rename to screenlock4merge/features/shortcutcomponent/package.json diff --git a/features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts b/screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts similarity index 100% rename from features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts rename to screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts diff --git a/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets b/screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets similarity index 100% rename from features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets rename to screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets diff --git a/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts b/screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts similarity index 100% rename from features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts rename to screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts diff --git a/features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets b/screenlock4merge/features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets similarity index 100% rename from features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets rename to screenlock4merge/features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets diff --git a/features/shortcutcomponent/src/main/module.json5 b/screenlock4merge/features/shortcutcomponent/src/main/module.json5 similarity index 100% rename from features/shortcutcomponent/src/main/module.json5 rename to screenlock4merge/features/shortcutcomponent/src/main/module.json5 diff --git a/features/shortcutcomponent/src/main/resources/base/element/color.json b/screenlock4merge/features/shortcutcomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/shortcutcomponent/src/main/resources/base/element/color.json rename to screenlock4merge/features/shortcutcomponent/src/main/resources/base/element/color.json diff --git a/features/shortcutcomponent/src/main/resources/base/element/float.json b/screenlock4merge/features/shortcutcomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/shortcutcomponent/src/main/resources/base/element/float.json rename to screenlock4merge/features/shortcutcomponent/src/main/resources/base/element/float.json diff --git a/features/shortcutcomponent/src/main/resources/base/element/string.json b/screenlock4merge/features/shortcutcomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/shortcutcomponent/src/main/resources/base/element/string.json rename to screenlock4merge/features/shortcutcomponent/src/main/resources/base/element/string.json diff --git a/features/shortcutcomponent/src/main/resources/base/media/reboot.svg b/screenlock4merge/features/shortcutcomponent/src/main/resources/base/media/reboot.svg similarity index 100% rename from features/shortcutcomponent/src/main/resources/base/media/reboot.svg rename to screenlock4merge/features/shortcutcomponent/src/main/resources/base/media/reboot.svg diff --git a/features/shortcutcomponent/src/main/resources/base/media/shutdown.svg b/screenlock4merge/features/shortcutcomponent/src/main/resources/base/media/shutdown.svg similarity index 100% rename from features/shortcutcomponent/src/main/resources/base/media/shutdown.svg rename to screenlock4merge/features/shortcutcomponent/src/main/resources/base/media/shutdown.svg diff --git a/features/shortcutcomponent/src/main/resources/en_US/element/string.json b/screenlock4merge/features/shortcutcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/shortcutcomponent/src/main/resources/en_US/element/string.json rename to screenlock4merge/features/shortcutcomponent/src/main/resources/en_US/element/string.json diff --git a/features/shortcutcomponent/src/main/resources/zh_CN/element/string.json b/screenlock4merge/features/shortcutcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/shortcutcomponent/src/main/resources/zh_CN/element/string.json rename to screenlock4merge/features/shortcutcomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/signalcomponent/.gitignore b/screenlock4merge/features/signalcomponent/.gitignore similarity index 100% rename from features/signalcomponent/.gitignore rename to screenlock4merge/features/signalcomponent/.gitignore diff --git a/features/signalcomponent/build-profile.json5 b/screenlock4merge/features/signalcomponent/build-profile.json5 similarity index 100% rename from features/signalcomponent/build-profile.json5 rename to screenlock4merge/features/signalcomponent/build-profile.json5 diff --git a/features/signalcomponent/hvigorfile.js b/screenlock4merge/features/signalcomponent/hvigorfile.js similarity index 100% rename from features/signalcomponent/hvigorfile.js rename to screenlock4merge/features/signalcomponent/hvigorfile.js diff --git a/features/signalcomponent/index.ets b/screenlock4merge/features/signalcomponent/index.ets similarity index 100% rename from features/signalcomponent/index.ets rename to screenlock4merge/features/signalcomponent/index.ets diff --git a/features/signalcomponent/package-lock.json b/screenlock4merge/features/signalcomponent/package-lock.json similarity index 100% rename from features/signalcomponent/package-lock.json rename to screenlock4merge/features/signalcomponent/package-lock.json diff --git a/features/signalcomponent/package.json b/screenlock4merge/features/signalcomponent/package.json similarity index 100% rename from features/signalcomponent/package.json rename to screenlock4merge/features/signalcomponent/package.json diff --git a/features/signalcomponent/src/main/ets/components/MainPage/MainPage.ets b/screenlock4merge/features/signalcomponent/src/main/ets/components/MainPage/MainPage.ets similarity index 100% rename from features/signalcomponent/src/main/ets/components/MainPage/MainPage.ets rename to screenlock4merge/features/signalcomponent/src/main/ets/components/MainPage/MainPage.ets diff --git a/features/signalcomponent/src/main/ets/default/app.ets b/screenlock4merge/features/signalcomponent/src/main/ets/default/app.ets similarity index 100% rename from features/signalcomponent/src/main/ets/default/app.ets rename to screenlock4merge/features/signalcomponent/src/main/ets/default/app.ets diff --git a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts b/screenlock4merge/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 100% rename from features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts rename to screenlock4merge/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ts b/screenlock4merge/features/signalcomponent/src/main/ets/default/common/constants.ts similarity index 100% rename from features/signalcomponent/src/main/ets/default/common/constants.ts rename to screenlock4merge/features/signalcomponent/src/main/ets/default/common/constants.ts diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/screenlock4merge/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets similarity index 100% rename from features/signalcomponent/src/main/ets/default/pages/signalIcon.ets rename to screenlock4merge/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ts b/screenlock4merge/features/signalcomponent/src/main/ets/default/signalModel.ts similarity index 100% rename from features/signalcomponent/src/main/ets/default/signalModel.ts rename to screenlock4merge/features/signalcomponent/src/main/ets/default/signalModel.ts diff --git a/features/signalcomponent/src/main/module.json5 b/screenlock4merge/features/signalcomponent/src/main/module.json5 similarity index 100% rename from features/signalcomponent/src/main/module.json5 rename to screenlock4merge/features/signalcomponent/src/main/module.json5 diff --git a/features/signalcomponent/src/main/resources/base/element/color.json b/screenlock4merge/features/signalcomponent/src/main/resources/base/element/color.json similarity index 100% rename from features/signalcomponent/src/main/resources/base/element/color.json rename to screenlock4merge/features/signalcomponent/src/main/resources/base/element/color.json diff --git a/features/signalcomponent/src/main/resources/base/element/float.json b/screenlock4merge/features/signalcomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/signalcomponent/src/main/resources/base/element/float.json rename to screenlock4merge/features/signalcomponent/src/main/resources/base/element/float.json diff --git a/features/signalcomponent/src/main/resources/base/element/string.json b/screenlock4merge/features/signalcomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/signalcomponent/src/main/resources/base/element/string.json rename to screenlock4merge/features/signalcomponent/src/main/resources/base/element/string.json diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg b/screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg rename to screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_1.svg diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg b/screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg rename to screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_2.svg diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg b/screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg rename to screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_3.svg diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg b/screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg rename to screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_4.svg diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg b/screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg rename to screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_full.svg diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg b/screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg rename to screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_no.svg diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png rename to screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_roaming.png diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png b/screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png rename to screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_signal_wait.png diff --git a/features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png rename to screenlock4merge/features/signalcomponent/src/main/resources/base/media/ic_statusbar_wifi_connect.png diff --git a/features/signalcomponent/src/main/resources/base/media/icon.png b/screenlock4merge/features/signalcomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/signalcomponent/src/main/resources/base/media/icon.png rename to screenlock4merge/features/signalcomponent/src/main/resources/base/media/icon.png diff --git a/features/signalcomponent/src/main/resources/en_US/element/string.json b/screenlock4merge/features/signalcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from features/signalcomponent/src/main/resources/en_US/element/string.json rename to screenlock4merge/features/signalcomponent/src/main/resources/en_US/element/string.json diff --git a/features/signalcomponent/src/main/resources/phone/element/float.json b/screenlock4merge/features/signalcomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/signalcomponent/src/main/resources/phone/element/float.json rename to screenlock4merge/features/signalcomponent/src/main/resources/phone/element/float.json diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg b/screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg rename to screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg b/screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg rename to screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg b/screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg rename to screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg b/screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg rename to screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg b/screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg rename to screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg b/screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg rename to screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_roaming.png b/screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_roaming.png similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_roaming.png rename to screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_roaming.png diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_wait.png b/screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_wait.png similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_wait.png rename to screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_wait.png diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_wifi_connect.png b/screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_wifi_connect.png similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/ic_statusbar_wifi_connect.png rename to screenlock4merge/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_wifi_connect.png diff --git a/features/signalcomponent/src/main/resources/phone/media/icon.png b/screenlock4merge/features/signalcomponent/src/main/resources/phone/media/icon.png similarity index 100% rename from features/signalcomponent/src/main/resources/phone/media/icon.png rename to screenlock4merge/features/signalcomponent/src/main/resources/phone/media/icon.png diff --git a/features/signalcomponent/src/main/resources/zh_CN/element/string.json b/screenlock4merge/features/signalcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from features/signalcomponent/src/main/resources/zh_CN/element/string.json rename to screenlock4merge/features/signalcomponent/src/main/resources/zh_CN/element/string.json diff --git a/features/wallpapercomponent/.gitignore b/screenlock4merge/features/wallpapercomponent/.gitignore similarity index 100% rename from features/wallpapercomponent/.gitignore rename to screenlock4merge/features/wallpapercomponent/.gitignore diff --git a/features/wallpapercomponent/build-profile.json5 b/screenlock4merge/features/wallpapercomponent/build-profile.json5 similarity index 100% rename from features/wallpapercomponent/build-profile.json5 rename to screenlock4merge/features/wallpapercomponent/build-profile.json5 diff --git a/features/wallpapercomponent/hvigorfile.js b/screenlock4merge/features/wallpapercomponent/hvigorfile.js similarity index 100% rename from features/wallpapercomponent/hvigorfile.js rename to screenlock4merge/features/wallpapercomponent/hvigorfile.js diff --git a/features/wallpapercomponent/index.ets b/screenlock4merge/features/wallpapercomponent/index.ets similarity index 100% rename from features/wallpapercomponent/index.ets rename to screenlock4merge/features/wallpapercomponent/index.ets diff --git a/features/wallpapercomponent/package-lock.json b/screenlock4merge/features/wallpapercomponent/package-lock.json similarity index 100% rename from features/wallpapercomponent/package-lock.json rename to screenlock4merge/features/wallpapercomponent/package-lock.json diff --git a/features/wallpapercomponent/package.json b/screenlock4merge/features/wallpapercomponent/package.json similarity index 100% rename from features/wallpapercomponent/package.json rename to screenlock4merge/features/wallpapercomponent/package.json diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts b/screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts similarity index 100% rename from features/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts rename to screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets b/screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets similarity index 100% rename from features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets rename to screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts b/screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts similarity index 100% rename from features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts rename to screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts diff --git a/features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets b/screenlock4merge/features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets similarity index 100% rename from features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets rename to screenlock4merge/features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets diff --git a/features/wallpapercomponent/src/main/module.json5 b/screenlock4merge/features/wallpapercomponent/src/main/module.json5 similarity index 100% rename from features/wallpapercomponent/src/main/module.json5 rename to screenlock4merge/features/wallpapercomponent/src/main/module.json5 diff --git a/features/wallpapercomponent/src/main/resources/base/element/string.json b/screenlock4merge/features/wallpapercomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/wallpapercomponent/src/main/resources/base/element/string.json rename to screenlock4merge/features/wallpapercomponent/src/main/resources/base/element/string.json diff --git a/features/wificomponent/.gitignore b/screenlock4merge/features/wificomponent/.gitignore similarity index 100% rename from features/wificomponent/.gitignore rename to screenlock4merge/features/wificomponent/.gitignore diff --git a/features/wificomponent/build-profile.json5 b/screenlock4merge/features/wificomponent/build-profile.json5 similarity index 100% rename from features/wificomponent/build-profile.json5 rename to screenlock4merge/features/wificomponent/build-profile.json5 diff --git a/features/wificomponent/hvigorfile.js b/screenlock4merge/features/wificomponent/hvigorfile.js similarity index 100% rename from features/wificomponent/hvigorfile.js rename to screenlock4merge/features/wificomponent/hvigorfile.js diff --git a/features/wificomponent/index.ets b/screenlock4merge/features/wificomponent/index.ets similarity index 100% rename from features/wificomponent/index.ets rename to screenlock4merge/features/wificomponent/index.ets diff --git a/features/wificomponent/package-lock.json b/screenlock4merge/features/wificomponent/package-lock.json similarity index 100% rename from features/wificomponent/package-lock.json rename to screenlock4merge/features/wificomponent/package-lock.json diff --git a/features/wificomponent/package.json b/screenlock4merge/features/wificomponent/package.json similarity index 100% rename from features/wificomponent/package.json rename to screenlock4merge/features/wificomponent/package.json diff --git a/features/wificomponent/src/main/ets/components/MainPage/MainPage.ets b/screenlock4merge/features/wificomponent/src/main/ets/components/MainPage/MainPage.ets similarity index 100% rename from features/wificomponent/src/main/ets/components/MainPage/MainPage.ets rename to screenlock4merge/features/wificomponent/src/main/ets/components/MainPage/MainPage.ets diff --git a/features/wificomponent/src/main/ets/default/app.ets b/screenlock4merge/features/wificomponent/src/main/ets/default/app.ets similarity index 100% rename from features/wificomponent/src/main/ets/default/app.ets rename to screenlock4merge/features/wificomponent/src/main/ets/default/app.ets diff --git a/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts b/screenlock4merge/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts similarity index 100% rename from features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts rename to screenlock4merge/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts diff --git a/features/wificomponent/src/main/ets/default/common/constants.ts b/screenlock4merge/features/wificomponent/src/main/ets/default/common/constants.ts similarity index 100% rename from features/wificomponent/src/main/ets/default/common/constants.ts rename to screenlock4merge/features/wificomponent/src/main/ets/default/common/constants.ts diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/screenlock4merge/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets similarity index 100% rename from features/wificomponent/src/main/ets/default/pages/wifiIcon.ets rename to screenlock4merge/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ts b/screenlock4merge/features/wificomponent/src/main/ets/default/wifiModel.ts similarity index 100% rename from features/wificomponent/src/main/ets/default/wifiModel.ts rename to screenlock4merge/features/wificomponent/src/main/ets/default/wifiModel.ts diff --git a/features/wificomponent/src/main/module.json5 b/screenlock4merge/features/wificomponent/src/main/module.json5 similarity index 100% rename from features/wificomponent/src/main/module.json5 rename to screenlock4merge/features/wificomponent/src/main/module.json5 diff --git a/features/wificomponent/src/main/resources/base/element/float.json b/screenlock4merge/features/wificomponent/src/main/resources/base/element/float.json similarity index 100% rename from features/wificomponent/src/main/resources/base/element/float.json rename to screenlock4merge/features/wificomponent/src/main/resources/base/element/float.json diff --git a/features/wificomponent/src/main/resources/base/element/string.json b/screenlock4merge/features/wificomponent/src/main/resources/base/element/string.json similarity index 100% rename from features/wificomponent/src/main/resources/base/element/string.json rename to screenlock4merge/features/wificomponent/src/main/resources/base/element/string.json diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/screenlock4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg similarity index 100% rename from features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg rename to screenlock4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_1.svg diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/screenlock4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg similarity index 100% rename from features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg rename to screenlock4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_2.svg diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/screenlock4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg similarity index 100% rename from features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg rename to screenlock4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_3.svg diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/screenlock4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg similarity index 100% rename from features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg rename to screenlock4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_full.svg diff --git a/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/screenlock4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg similarity index 100% rename from features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg rename to screenlock4merge/features/wificomponent/src/main/resources/base/media/ic_statusbar_wifi_no.svg diff --git a/features/wificomponent/src/main/resources/base/media/icon.png b/screenlock4merge/features/wificomponent/src/main/resources/base/media/icon.png similarity index 100% rename from features/wificomponent/src/main/resources/base/media/icon.png rename to screenlock4merge/features/wificomponent/src/main/resources/base/media/icon.png diff --git a/features/wificomponent/src/main/resources/phone/element/float.json b/screenlock4merge/features/wificomponent/src/main/resources/phone/element/float.json similarity index 100% rename from features/wificomponent/src/main/resources/phone/element/float.json rename to screenlock4merge/features/wificomponent/src/main/resources/phone/element/float.json diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg b/screenlock4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg similarity index 100% rename from features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg rename to screenlock4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg b/screenlock4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg similarity index 100% rename from features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg rename to screenlock4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg b/screenlock4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg similarity index 100% rename from features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg rename to screenlock4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg b/screenlock4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg similarity index 100% rename from features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg rename to screenlock4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg b/screenlock4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg similarity index 100% rename from features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg rename to screenlock4merge/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg diff --git a/features/wificomponent/src/main/resources/phone/media/icon.png b/screenlock4merge/features/wificomponent/src/main/resources/phone/media/icon.png similarity index 100% rename from features/wificomponent/src/main/resources/phone/media/icon.png rename to screenlock4merge/features/wificomponent/src/main/resources/phone/media/icon.png diff --git a/hvigorfile.js b/screenlock4merge/hvigorfile.js similarity index 100% rename from hvigorfile.js rename to screenlock4merge/hvigorfile.js diff --git a/infra/config_exts.gradle b/screenlock4merge/infra/config_exts.gradle similarity index 100% rename from infra/config_exts.gradle rename to screenlock4merge/infra/config_exts.gradle diff --git a/package-lock.json b/screenlock4merge/package-lock.json similarity index 100% rename from package-lock.json rename to screenlock4merge/package-lock.json diff --git a/package.json b/screenlock4merge/package.json similarity index 100% rename from package.json rename to screenlock4merge/package.json diff --git a/product/pc/.gitignore b/screenlock4merge/product/pc/.gitignore similarity index 100% rename from product/pc/.gitignore rename to screenlock4merge/product/pc/.gitignore diff --git a/product/pc/build-profile.json5 b/screenlock4merge/product/pc/build-profile.json5 similarity index 100% rename from product/pc/build-profile.json5 rename to screenlock4merge/product/pc/build-profile.json5 diff --git a/product/pc/build.gradle b/screenlock4merge/product/pc/build.gradle similarity index 100% rename from product/pc/build.gradle rename to screenlock4merge/product/pc/build.gradle diff --git a/product/pc/hvigorfile.js b/screenlock4merge/product/pc/hvigorfile.js similarity index 100% rename from product/pc/hvigorfile.js rename to screenlock4merge/product/pc/hvigorfile.js diff --git a/product/pc/package-lock.json b/screenlock4merge/product/pc/package-lock.json similarity index 100% rename from product/pc/package-lock.json rename to screenlock4merge/product/pc/package-lock.json diff --git a/product/pc/package.json b/screenlock4merge/product/pc/package.json similarity index 100% rename from product/pc/package.json rename to screenlock4merge/product/pc/package.json diff --git a/product/pc/src/main/ets/Application/AbilityStage.ts b/screenlock4merge/product/pc/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from product/pc/src/main/ets/Application/AbilityStage.ts rename to screenlock4merge/product/pc/src/main/ets/Application/AbilityStage.ts diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/screenlock4merge/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts similarity index 100% rename from product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename to screenlock4merge/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts diff --git a/product/pc/src/main/ets/common/StyleConfiguration.ts b/screenlock4merge/product/pc/src/main/ets/common/StyleConfiguration.ts similarity index 100% rename from product/pc/src/main/ets/common/StyleConfiguration.ts rename to screenlock4merge/product/pc/src/main/ets/common/StyleConfiguration.ts diff --git a/product/pc/src/main/ets/common/StyleManager.ts b/screenlock4merge/product/pc/src/main/ets/common/StyleManager.ts similarity index 100% rename from product/pc/src/main/ets/common/StyleManager.ts rename to screenlock4merge/product/pc/src/main/ets/common/StyleManager.ts diff --git a/product/pc/src/main/ets/common/constants.ts b/screenlock4merge/product/pc/src/main/ets/common/constants.ts similarity index 100% rename from product/pc/src/main/ets/common/constants.ts rename to screenlock4merge/product/pc/src/main/ets/common/constants.ts diff --git a/product/pc/src/main/ets/pages/customPassword.ets b/screenlock4merge/product/pc/src/main/ets/pages/customPassword.ets similarity index 100% rename from product/pc/src/main/ets/pages/customPassword.ets rename to screenlock4merge/product/pc/src/main/ets/pages/customPassword.ets diff --git a/product/pc/src/main/ets/pages/customscreenlock.ets b/screenlock4merge/product/pc/src/main/ets/pages/customscreenlock.ets similarity index 100% rename from product/pc/src/main/ets/pages/customscreenlock.ets rename to screenlock4merge/product/pc/src/main/ets/pages/customscreenlock.ets diff --git a/product/pc/src/main/ets/pages/digitalPassword.ets b/screenlock4merge/product/pc/src/main/ets/pages/digitalPassword.ets similarity index 100% rename from product/pc/src/main/ets/pages/digitalPassword.ets rename to screenlock4merge/product/pc/src/main/ets/pages/digitalPassword.ets diff --git a/product/pc/src/main/ets/pages/index.ets b/screenlock4merge/product/pc/src/main/ets/pages/index.ets similarity index 100% rename from product/pc/src/main/ets/pages/index.ets rename to screenlock4merge/product/pc/src/main/ets/pages/index.ets diff --git a/product/pc/src/main/ets/pages/journalscreenlock.ets b/screenlock4merge/product/pc/src/main/ets/pages/journalscreenlock.ets similarity index 100% rename from product/pc/src/main/ets/pages/journalscreenlock.ets rename to screenlock4merge/product/pc/src/main/ets/pages/journalscreenlock.ets diff --git a/product/pc/src/main/ets/pages/mixedPassword.ets b/screenlock4merge/product/pc/src/main/ets/pages/mixedPassword.ets similarity index 100% rename from product/pc/src/main/ets/pages/mixedPassword.ets rename to screenlock4merge/product/pc/src/main/ets/pages/mixedPassword.ets diff --git a/product/pc/src/main/ets/pages/slidescreenlock.ets b/screenlock4merge/product/pc/src/main/ets/pages/slidescreenlock.ets similarity index 100% rename from product/pc/src/main/ets/pages/slidescreenlock.ets rename to screenlock4merge/product/pc/src/main/ets/pages/slidescreenlock.ets diff --git a/product/pc/src/main/ets/vm/indexViewModel.ts b/screenlock4merge/product/pc/src/main/ets/vm/indexViewModel.ts similarity index 100% rename from product/pc/src/main/ets/vm/indexViewModel.ts rename to screenlock4merge/product/pc/src/main/ets/vm/indexViewModel.ts diff --git a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts b/screenlock4merge/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts similarity index 100% rename from product/pc/src/main/ets/vm/slideScreenLockViewModel.ts rename to screenlock4merge/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts diff --git a/product/pc/src/main/module.json5 b/screenlock4merge/product/pc/src/main/module.json5 similarity index 100% rename from product/pc/src/main/module.json5 rename to screenlock4merge/product/pc/src/main/module.json5 diff --git a/product/pc/src/main/resources/base/element/color.json b/screenlock4merge/product/pc/src/main/resources/base/element/color.json similarity index 100% rename from product/pc/src/main/resources/base/element/color.json rename to screenlock4merge/product/pc/src/main/resources/base/element/color.json diff --git a/product/pc/src/main/resources/base/element/float.json b/screenlock4merge/product/pc/src/main/resources/base/element/float.json similarity index 100% rename from product/pc/src/main/resources/base/element/float.json rename to screenlock4merge/product/pc/src/main/resources/base/element/float.json diff --git a/product/pc/src/main/resources/base/element/string.json b/screenlock4merge/product/pc/src/main/resources/base/element/string.json similarity index 100% rename from product/pc/src/main/resources/base/element/string.json rename to screenlock4merge/product/pc/src/main/resources/base/element/string.json diff --git a/product/pc/src/main/resources/base/media/delete_all.png b/screenlock4merge/product/pc/src/main/resources/base/media/delete_all.png similarity index 100% rename from product/pc/src/main/resources/base/media/delete_all.png rename to screenlock4merge/product/pc/src/main/resources/base/media/delete_all.png diff --git a/product/pc/src/main/resources/base/media/ic_close.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_close.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_close.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_close.svg diff --git a/product/pc/src/main/resources/base/media/ic_hollow_dot.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_hollow_dot.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_hollow_dot.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_hollow_dot.svg diff --git a/product/pc/src/main/resources/base/media/ic_notification_down.png b/screenlock4merge/product/pc/src/main/resources/base/media/ic_notification_down.png similarity index 100% rename from product/pc/src/main/resources/base/media/ic_notification_down.png rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_notification_down.png diff --git a/product/pc/src/main/resources/base/media/ic_notification_up.png b/screenlock4merge/product/pc/src/main/resources/base/media/ic_notification_up.png similarity index 100% rename from product/pc/src/main/resources/base/media/ic_notification_up.png rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_notification_up.png diff --git a/product/pc/src/main/resources/base/media/ic_public_delete_filled.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_public_delete_filled.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_public_delete_filled.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_public_delete_filled.svg diff --git a/product/pc/src/main/resources/base/media/ic_public_lock_filled.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_public_lock_filled.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_public_lock_filled.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_public_lock_filled.svg diff --git a/product/pc/src/main/resources/base/media/ic_public_settings_filled.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_public_settings_filled.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_public_settings_filled.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_public_settings_filled.svg diff --git a/product/pc/src/main/resources/base/media/ic_public_unlock_filled.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_public_unlock_filled.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_public_unlock_filled.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_public_unlock_filled.svg diff --git a/product/pc/src/main/resources/base/media/ic_solid_dot.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_solid_dot.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_solid_dot.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_solid_dot.svg diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_1.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_1.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_signal_1.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_1.svg diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_2.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_2.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_signal_2.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_2.svg diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_3.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_3.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_signal_3.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_3.svg diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_4.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_4.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_signal_4.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_4.svg diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_full.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_full.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_signal_full.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_full.svg diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_no.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_no.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_signal_no.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_no.svg diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_roaming.png similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_signal_roaming.png rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_roaming.png diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_signal_wait.png b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_wait.png similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_signal_wait.png rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_signal_wait.png diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_wifi_1.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_wifi_1.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_wifi_1.svg diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_wifi_2.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_wifi_2.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_wifi_2.svg diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_wifi_3.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_wifi_3.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_wifi_3.svg diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_wifi_connect.png similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_wifi_connect.png rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_wifi_connect.png diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_wifi_full.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_wifi_full.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_wifi_full.svg diff --git a/product/pc/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_wifi_no.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_statusbar_wifi_no.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_statusbar_wifi_no.svg diff --git a/product/pc/src/main/resources/base/media/ic_user_portrait.svg b/screenlock4merge/product/pc/src/main/resources/base/media/ic_user_portrait.svg similarity index 100% rename from product/pc/src/main/resources/base/media/ic_user_portrait.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/ic_user_portrait.svg diff --git a/product/pc/src/main/resources/base/media/icon.png b/screenlock4merge/product/pc/src/main/resources/base/media/icon.png similarity index 100% rename from product/pc/src/main/resources/base/media/icon.png rename to screenlock4merge/product/pc/src/main/resources/base/media/icon.png diff --git a/product/pc/src/main/resources/base/media/lock.png b/screenlock4merge/product/pc/src/main/resources/base/media/lock.png similarity index 100% rename from product/pc/src/main/resources/base/media/lock.png rename to screenlock4merge/product/pc/src/main/resources/base/media/lock.png diff --git a/product/pc/src/main/resources/base/media/reboot.svg b/screenlock4merge/product/pc/src/main/resources/base/media/reboot.svg similarity index 100% rename from product/pc/src/main/resources/base/media/reboot.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/reboot.svg diff --git a/product/pc/src/main/resources/base/media/send.svg b/screenlock4merge/product/pc/src/main/resources/base/media/send.svg similarity index 100% rename from product/pc/src/main/resources/base/media/send.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/send.svg diff --git a/product/pc/src/main/resources/base/media/shutdown.svg b/screenlock4merge/product/pc/src/main/resources/base/media/shutdown.svg similarity index 100% rename from product/pc/src/main/resources/base/media/shutdown.svg rename to screenlock4merge/product/pc/src/main/resources/base/media/shutdown.svg diff --git a/product/pc/src/main/resources/base/media/unlock.png b/screenlock4merge/product/pc/src/main/resources/base/media/unlock.png similarity index 100% rename from product/pc/src/main/resources/base/media/unlock.png rename to screenlock4merge/product/pc/src/main/resources/base/media/unlock.png diff --git a/product/pc/src/main/resources/base/profile/main_pages.json b/screenlock4merge/product/pc/src/main/resources/base/profile/main_pages.json similarity index 100% rename from product/pc/src/main/resources/base/profile/main_pages.json rename to screenlock4merge/product/pc/src/main/resources/base/profile/main_pages.json diff --git a/product/pc/src/main/resources/en_US/element/string.json b/screenlock4merge/product/pc/src/main/resources/en_US/element/string.json similarity index 100% rename from product/pc/src/main/resources/en_US/element/string.json rename to screenlock4merge/product/pc/src/main/resources/en_US/element/string.json diff --git a/product/pc/src/main/resources/zh_CN/element/string.json b/screenlock4merge/product/pc/src/main/resources/zh_CN/element/string.json similarity index 100% rename from product/pc/src/main/resources/zh_CN/element/string.json rename to screenlock4merge/product/pc/src/main/resources/zh_CN/element/string.json diff --git a/product/phone/.gitignore b/screenlock4merge/product/phone/.gitignore similarity index 100% rename from product/phone/.gitignore rename to screenlock4merge/product/phone/.gitignore diff --git a/product/phone/build-profile.json5 b/screenlock4merge/product/phone/build-profile.json5 similarity index 100% rename from product/phone/build-profile.json5 rename to screenlock4merge/product/phone/build-profile.json5 diff --git a/product/phone/build.gradle b/screenlock4merge/product/phone/build.gradle similarity index 100% rename from product/phone/build.gradle rename to screenlock4merge/product/phone/build.gradle diff --git a/product/phone/hvigorfile.js b/screenlock4merge/product/phone/hvigorfile.js similarity index 100% rename from product/phone/hvigorfile.js rename to screenlock4merge/product/phone/hvigorfile.js diff --git a/product/phone/package-lock.json b/screenlock4merge/product/phone/package-lock.json similarity index 100% rename from product/phone/package-lock.json rename to screenlock4merge/product/phone/package-lock.json diff --git a/product/phone/package.json b/screenlock4merge/product/phone/package.json similarity index 100% rename from product/phone/package.json rename to screenlock4merge/product/phone/package.json diff --git a/product/phone/src/main/ets/AbilityStage.ts b/screenlock4merge/product/phone/src/main/ets/AbilityStage.ts similarity index 100% rename from product/phone/src/main/ets/AbilityStage.ts rename to screenlock4merge/product/phone/src/main/ets/AbilityStage.ts diff --git a/product/phone/src/main/ets/Application/AbilityStage.ts b/screenlock4merge/product/phone/src/main/ets/Application/AbilityStage.ts similarity index 100% rename from product/phone/src/main/ets/Application/AbilityStage.ts rename to screenlock4merge/product/phone/src/main/ets/Application/AbilityStage.ts diff --git a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/screenlock4merge/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts similarity index 100% rename from product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts rename to screenlock4merge/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts diff --git a/product/phone/src/main/ets/common/StyleConfiguration.ts b/screenlock4merge/product/phone/src/main/ets/common/StyleConfiguration.ts similarity index 100% rename from product/phone/src/main/ets/common/StyleConfiguration.ts rename to screenlock4merge/product/phone/src/main/ets/common/StyleConfiguration.ts diff --git a/product/phone/src/main/ets/common/StyleManager.ts b/screenlock4merge/product/phone/src/main/ets/common/StyleManager.ts similarity index 100% rename from product/phone/src/main/ets/common/StyleManager.ts rename to screenlock4merge/product/phone/src/main/ets/common/StyleManager.ts diff --git a/product/phone/src/main/ets/common/constants.ts b/screenlock4merge/product/phone/src/main/ets/common/constants.ts similarity index 100% rename from product/phone/src/main/ets/common/constants.ts rename to screenlock4merge/product/phone/src/main/ets/common/constants.ts diff --git a/product/phone/src/main/ets/pages/customPassword.ets b/screenlock4merge/product/phone/src/main/ets/pages/customPassword.ets similarity index 100% rename from product/phone/src/main/ets/pages/customPassword.ets rename to screenlock4merge/product/phone/src/main/ets/pages/customPassword.ets diff --git a/product/phone/src/main/ets/pages/customscreenlock.ets b/screenlock4merge/product/phone/src/main/ets/pages/customscreenlock.ets similarity index 100% rename from product/phone/src/main/ets/pages/customscreenlock.ets rename to screenlock4merge/product/phone/src/main/ets/pages/customscreenlock.ets diff --git a/product/phone/src/main/ets/pages/digitalPassword.ets b/screenlock4merge/product/phone/src/main/ets/pages/digitalPassword.ets similarity index 100% rename from product/phone/src/main/ets/pages/digitalPassword.ets rename to screenlock4merge/product/phone/src/main/ets/pages/digitalPassword.ets diff --git a/product/phone/src/main/ets/pages/index.ets b/screenlock4merge/product/phone/src/main/ets/pages/index.ets similarity index 100% rename from product/phone/src/main/ets/pages/index.ets rename to screenlock4merge/product/phone/src/main/ets/pages/index.ets diff --git a/product/phone/src/main/ets/pages/journalscreenlock.ets b/screenlock4merge/product/phone/src/main/ets/pages/journalscreenlock.ets similarity index 100% rename from product/phone/src/main/ets/pages/journalscreenlock.ets rename to screenlock4merge/product/phone/src/main/ets/pages/journalscreenlock.ets diff --git a/product/phone/src/main/ets/pages/mixedPassword.ets b/screenlock4merge/product/phone/src/main/ets/pages/mixedPassword.ets similarity index 100% rename from product/phone/src/main/ets/pages/mixedPassword.ets rename to screenlock4merge/product/phone/src/main/ets/pages/mixedPassword.ets diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/screenlock4merge/product/phone/src/main/ets/pages/slidescreenlock.ets similarity index 100% rename from product/phone/src/main/ets/pages/slidescreenlock.ets rename to screenlock4merge/product/phone/src/main/ets/pages/slidescreenlock.ets diff --git a/product/phone/src/main/ets/vm/indexViewModel.ts b/screenlock4merge/product/phone/src/main/ets/vm/indexViewModel.ts similarity index 100% rename from product/phone/src/main/ets/vm/indexViewModel.ts rename to screenlock4merge/product/phone/src/main/ets/vm/indexViewModel.ts diff --git a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts b/screenlock4merge/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts similarity index 100% rename from product/phone/src/main/ets/vm/slideScreenLockViewModel.ts rename to screenlock4merge/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts diff --git a/product/phone/src/main/module.json5 b/screenlock4merge/product/phone/src/main/module.json5 similarity index 100% rename from product/phone/src/main/module.json5 rename to screenlock4merge/product/phone/src/main/module.json5 diff --git a/product/phone/src/main/resources/base/element/color.json b/screenlock4merge/product/phone/src/main/resources/base/element/color.json similarity index 100% rename from product/phone/src/main/resources/base/element/color.json rename to screenlock4merge/product/phone/src/main/resources/base/element/color.json diff --git a/product/phone/src/main/resources/base/element/float.json b/screenlock4merge/product/phone/src/main/resources/base/element/float.json similarity index 100% rename from product/phone/src/main/resources/base/element/float.json rename to screenlock4merge/product/phone/src/main/resources/base/element/float.json diff --git a/product/phone/src/main/resources/base/element/string.json b/screenlock4merge/product/phone/src/main/resources/base/element/string.json similarity index 100% rename from product/phone/src/main/resources/base/element/string.json rename to screenlock4merge/product/phone/src/main/resources/base/element/string.json diff --git a/product/phone/src/main/resources/base/media/bg.png b/screenlock4merge/product/phone/src/main/resources/base/media/bg.png similarity index 100% rename from product/phone/src/main/resources/base/media/bg.png rename to screenlock4merge/product/phone/src/main/resources/base/media/bg.png diff --git a/product/phone/src/main/resources/base/media/delete_all.png b/screenlock4merge/product/phone/src/main/resources/base/media/delete_all.png similarity index 100% rename from product/phone/src/main/resources/base/media/delete_all.png rename to screenlock4merge/product/phone/src/main/resources/base/media/delete_all.png diff --git a/product/phone/src/main/resources/base/media/ic_close.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_close.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_close.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_close.svg diff --git a/product/phone/src/main/resources/base/media/ic_hollow_dot.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_hollow_dot.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_hollow_dot.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_hollow_dot.svg diff --git a/product/phone/src/main/resources/base/media/ic_notification_down.png b/screenlock4merge/product/phone/src/main/resources/base/media/ic_notification_down.png similarity index 100% rename from product/phone/src/main/resources/base/media/ic_notification_down.png rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_notification_down.png diff --git a/product/phone/src/main/resources/base/media/ic_notification_up.png b/screenlock4merge/product/phone/src/main/resources/base/media/ic_notification_up.png similarity index 100% rename from product/phone/src/main/resources/base/media/ic_notification_up.png rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_notification_up.png diff --git a/product/phone/src/main/resources/base/media/ic_public_delete_filled.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_public_delete_filled.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_public_delete_filled.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_public_delete_filled.svg diff --git a/product/phone/src/main/resources/base/media/ic_public_lock_filled.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_public_lock_filled.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_public_lock_filled.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_public_lock_filled.svg diff --git a/product/phone/src/main/resources/base/media/ic_public_settings_filled.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_public_settings_filled.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_public_settings_filled.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_public_settings_filled.svg diff --git a/product/phone/src/main/resources/base/media/ic_public_unlock_filled.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_public_unlock_filled.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_public_unlock_filled.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_public_unlock_filled.svg diff --git a/product/phone/src/main/resources/base/media/ic_solid_dot.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_solid_dot.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_solid_dot.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_solid_dot.svg diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg diff --git a/product/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg diff --git a/product/phone/src/main/resources/base/media/ic_user_portrait.svg b/screenlock4merge/product/phone/src/main/resources/base/media/ic_user_portrait.svg similarity index 100% rename from product/phone/src/main/resources/base/media/ic_user_portrait.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/ic_user_portrait.svg diff --git a/product/phone/src/main/resources/base/media/icon.png b/screenlock4merge/product/phone/src/main/resources/base/media/icon.png similarity index 100% rename from product/phone/src/main/resources/base/media/icon.png rename to screenlock4merge/product/phone/src/main/resources/base/media/icon.png diff --git a/product/phone/src/main/resources/base/media/lock.png b/screenlock4merge/product/phone/src/main/resources/base/media/lock.png similarity index 100% rename from product/phone/src/main/resources/base/media/lock.png rename to screenlock4merge/product/phone/src/main/resources/base/media/lock.png diff --git a/product/phone/src/main/resources/base/media/reboot.svg b/screenlock4merge/product/phone/src/main/resources/base/media/reboot.svg similarity index 100% rename from product/phone/src/main/resources/base/media/reboot.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/reboot.svg diff --git a/product/phone/src/main/resources/base/media/send.svg b/screenlock4merge/product/phone/src/main/resources/base/media/send.svg similarity index 100% rename from product/phone/src/main/resources/base/media/send.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/send.svg diff --git a/product/phone/src/main/resources/base/media/shutdown.svg b/screenlock4merge/product/phone/src/main/resources/base/media/shutdown.svg similarity index 100% rename from product/phone/src/main/resources/base/media/shutdown.svg rename to screenlock4merge/product/phone/src/main/resources/base/media/shutdown.svg diff --git a/product/phone/src/main/resources/base/media/unlock.png b/screenlock4merge/product/phone/src/main/resources/base/media/unlock.png similarity index 100% rename from product/phone/src/main/resources/base/media/unlock.png rename to screenlock4merge/product/phone/src/main/resources/base/media/unlock.png diff --git a/product/phone/src/main/resources/base/profile/main_pages.json b/screenlock4merge/product/phone/src/main/resources/base/profile/main_pages.json similarity index 100% rename from product/phone/src/main/resources/base/profile/main_pages.json rename to screenlock4merge/product/phone/src/main/resources/base/profile/main_pages.json diff --git a/product/phone/src/main/resources/en_US/element/string.json b/screenlock4merge/product/phone/src/main/resources/en_US/element/string.json similarity index 100% rename from product/phone/src/main/resources/en_US/element/string.json rename to screenlock4merge/product/phone/src/main/resources/en_US/element/string.json diff --git a/product/phone/src/main/resources/zh_CN/element/string.json b/screenlock4merge/product/phone/src/main/resources/zh_CN/element/string.json similarity index 100% rename from product/phone/src/main/resources/zh_CN/element/string.json rename to screenlock4merge/product/phone/src/main/resources/zh_CN/element/string.json diff --git a/signature/systemui.p7b b/screenlock4merge/signature/systemui.p7b similarity index 100% rename from signature/systemui.p7b rename to screenlock4merge/signature/systemui.p7b -- Gitee From e6078f5335b982c04467cdffc20c5443abaa8b5a Mon Sep 17 00:00:00 2001 From: lianyi Date: Fri, 14 Apr 2023 12:03:54 +0800 Subject: [PATCH 361/373] update launcher --- .../WindowAnimationControllerImpl.ts | 6 +- .../ets/default/constants/EventConstants.ts | 1 + .../main/ets/default/manager/FormManager.ts | 4 +- .../default/manager/LauncherAbilityManager.ts | 4 + .../ets/default/manager/ResourceManager.ts | 7 +- common/src/main/ets/default/model/AppModel.ts | 4 + .../src/main/ets/default/model/FormModel.ts | 47 ++++ .../ets/default/model/PageDesktopModel.ts | 6 +- .../main/ets/default/model/SettingsModel.ts | 5 +- .../main/ets/default/uicomponents/AppGrid.ets | 31 +-- .../uicomponents/FormItemComponent.ets | 4 + .../uicomponents/FormManagerDialog.ets | 1 + .../uicomponents/RemoteWindowWrapper.ets | 65 +++-- .../uicomponents/ScrollerComponent.ets | 228 ++++++++---------- .../main/ets/default/layout/AppGridLayout.ets | 4 +- .../ets/default/viewmodel/FormViewModel.ts | 7 +- .../common/PageDesktopCloseAppHandler.ts | 3 +- .../default/common/PageDesktopDragHandler.ts | 3 +- .../default/common/components/FolderItem.ets | 2 +- .../default/common/components/GridSwiper.ets | 53 +++- .../default/common/components/SwiperPage.ets | 46 +--- .../ets/default/layout/PageDesktopLayout.ets | 8 +- .../default/viewmodel/PageDesktopViewModel.ts | 73 +++++- .../common/constants/RecentsStyleConstants.ts | 3 +- .../view/RecentMissionsDoubleLayout.ets | 3 +- .../view/RecentMissionsSingleLayout.ets | 1 + .../viewmodel/RecentMissionsViewModel.ets | 9 +- .../ets/default/layout/ResidentLayout.ets | 28 +-- .../main/ets/default/model/SmartDockModel.ts | 51 +++- .../src/main/ets/MainAbility/MainAbility.ts | 42 +++- .../pad/src/main/ets/pages/AppCenterView.ets | 2 +- .../phone/src/main/ets/pages/RecentView.ets | 4 +- 32 files changed, 460 insertions(+), 295 deletions(-) diff --git a/common/src/main/ets/default/animation/remoteanimation/WindowAnimationControllerImpl.ts b/common/src/main/ets/default/animation/remoteanimation/WindowAnimationControllerImpl.ts index 513ea36f..8e0dfeef 100644 --- a/common/src/main/ets/default/animation/remoteanimation/WindowAnimationControllerImpl.ts +++ b/common/src/main/ets/default/animation/remoteanimation/WindowAnimationControllerImpl.ts @@ -12,10 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Prompt from '@ohos.prompt'; +import Prompt from '@ohos.promptAction'; import windowAnimationManager from '@ohos.animation.windowAnimationManager'; -import { CheckEmptyUtils } from '@ohos/common'; -import { Log } from '@ohos/common'; +import { CheckEmptyUtils } from '../../utils/CheckEmptyUtils'; +import { Log } from '../../utils/Log'; import RemoteConstants from '../../constants/RemoteConstants'; const TAG = 'WindowAnimationControllerImpl'; diff --git a/common/src/main/ets/default/constants/EventConstants.ts b/common/src/main/ets/default/constants/EventConstants.ts index 4c3f6671..f15553d3 100644 --- a/common/src/main/ets/default/constants/EventConstants.ts +++ b/common/src/main/ets/default/constants/EventConstants.ts @@ -27,6 +27,7 @@ export const EventConstants = { EVENT_REQUEST_PAGEDESK_ITEM_DELETE: 'launcher.event.REQUEST_PAGEDESK_ITEM_DELETE', //request delete app from pageDesk EVENT_REQUEST_PAGEDESK_ITEM_UPDATE: 'launcher.event.EVENT_REQUEST_PAGEDESK_ITEM_UPDATE', //request pagedesktop rebuild layout EVENT_REQUEST_PAGEDESK_FORM_ITEM_ADD: 'launcher.event.EVENT_REQUEST_PAGEDESK_FORM_ITEM_ADD', + EVENT_REQUEST_FORM_ITEM_VISIBLE: 'launcher.event.REQUEST_FORM_ITEM_VISIBLE', EVENT_SMARTDOCK_INIT_FINISHED: 'launcher.event.EVENT_SMARTDOCK_INIT_FINISHED', EVENT_BADGE_UPDATE: 'launcher.event.EVENT_BADGE_UPDATE', EVENT_REQUEST_PAGEDESK_REFRESH: 'EVENT_REQUEST_PAGEDESK_REFRESH', // pageDesktop refresh diff --git a/common/src/main/ets/default/manager/FormManager.ts b/common/src/main/ets/default/manager/FormManager.ts index c47921e2..d28afc85 100644 --- a/common/src/main/ets/default/manager/FormManager.ts +++ b/common/src/main/ets/default/manager/FormManager.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import formManagerAbility from '@ohos.application.formHost'; -import { FormConstants } from '@ohos/common'; +import formManagerAbility from '@ohos.app.form.formHost'; +import { FormConstants } from '../constants/FormConstants'; import { Log } from '../utils/Log'; import { CardItemInfo } from '../bean/CardItemInfo'; import { CommonConstants } from '../constants/CommonConstants'; diff --git a/common/src/main/ets/default/manager/LauncherAbilityManager.ts b/common/src/main/ets/default/manager/LauncherAbilityManager.ts index d08d998f..a2b05236 100644 --- a/common/src/main/ets/default/manager/LauncherAbilityManager.ts +++ b/common/src/main/ets/default/manager/LauncherAbilityManager.ts @@ -352,6 +352,10 @@ class LauncherAbilityManager { }); Log.showDebug(TAG, `startLauncherAbilityByUri AceApplication : startAbility : ${result}`); } + + cleanAppMapCache() { + this.mAppMap.clear(); + } } export const launcherAbilityManager = LauncherAbilityManager.getInstance(); diff --git a/common/src/main/ets/default/manager/ResourceManager.ts b/common/src/main/ets/default/manager/ResourceManager.ts index 6663230f..99aef149 100644 --- a/common/src/main/ets/default/manager/ResourceManager.ts +++ b/common/src/main/ets/default/manager/ResourceManager.ts @@ -13,6 +13,7 @@ * limitations under the License. */ +import resourceManager from '@ohos.resourceManager'; import { Log } from '../utils/Log'; import { CheckEmptyUtils } from '../utils/CheckEmptyUtils'; import AppResourceCacheManager from '../cache/AppResourceCacheManager'; @@ -228,7 +229,7 @@ export class ResourceManager { || CheckEmptyUtils.isEmpty(globalThis.desktopContext.resourceManager); } - async getStringByResource(res: Resource): Promise{ + async getStringByResource(res: resourceManager.Resource): Promise{ const json = JSON.parse(JSON.stringify(res)); const id = json.id; return await this.getStringByIdSync(id); @@ -256,4 +257,8 @@ export class ResourceManager { return resMgrName; } } + + clearAppResourceCache(): void { + this.getAppResourceCacheManager().clearCache(); + } } \ No newline at end of file diff --git a/common/src/main/ets/default/model/AppModel.ts b/common/src/main/ets/default/model/AppModel.ts index 1e978fc3..ba081d9a 100644 --- a/common/src/main/ets/default/model/AppModel.ts +++ b/common/src/main/ets/default/model/AppModel.ts @@ -146,6 +146,10 @@ export class AppModel { this.closePopup(); this.updateShortcutInfo(bundleName, event); this.mFormModel.updateAppItemFormInfo(bundleName, event); + // initial mBundleInfoList + if (CheckEmptyUtils.isEmptyArr(this.mBundleInfoList)) { + await this.getAppListAsync(); + } if (event === EventConstants.EVENT_PACKAGE_REMOVED) { this.removeItem(bundleName); this.mFormModel.deleteFormByBundleName(bundleName); diff --git a/common/src/main/ets/default/model/FormModel.ts b/common/src/main/ets/default/model/FormModel.ts index cb3b9f96..d057f8e5 100644 --- a/common/src/main/ets/default/model/FormModel.ts +++ b/common/src/main/ets/default/model/FormModel.ts @@ -21,6 +21,8 @@ import { SettingsModel } from './SettingsModel'; import { FormManager } from '../manager/FormManager'; import { RdbStoreManager } from '../manager/RdbStoreManager'; import { FormListInfoCacheManager } from '../cache/FormListInfoCacheManager'; +import {PageDesktopModel} from './PageDesktopModel'; + const TAG = 'FormModel'; const KEY_FORM_LIST = 'formListInfo'; @@ -33,11 +35,13 @@ export class FormModel { private readonly mFormManager: FormManager; private readonly mFormListInfoCacheManager: FormListInfoCacheManager; private readonly mAppItemFormInfoMap = new Map(); + private readonly mPageDesktopModel: PageDesktopModel; private constructor() { this.mRdbStoreManager = RdbStoreManager.getInstance(); this.mFormManager = FormManager.getInstance(); this.mFormListInfoCacheManager = FormListInfoCacheManager.getInstance(); + this.mPageDesktopModel = PageDesktopModel.getInstance(); } /** @@ -234,6 +238,49 @@ export class FormModel { settingsModel.setLayoutInfo(layoutInfo); } + /** + * Delete form by cardId. + * + * @param {number} cardId. + */ + async deleteForm(cardId) { + Log.showDebug(TAG, 'deleteForm start'); + let gridLayoutInfo = { + layoutInfo: [] + }; + gridLayoutInfo = SettingsModel.getInstance().getLayoutInfo(); + const cardIndex = gridLayoutInfo.layoutInfo.findIndex(item => { + return item.typeId === CommonConstants.TYPE_CARD && item.cardId === cardId; + }); + if (cardIndex != CommonConstants.INVALID_VALUE) { + this.deleteFormById(cardId); + const page = gridLayoutInfo.layoutInfo[cardIndex].page; + gridLayoutInfo.layoutInfo.splice(cardIndex, 1); + let ret: boolean = this.mPageDesktopModel.deleteBlankPageFromLayoutInfo(gridLayoutInfo, page); + SettingsModel.getInstance().setLayoutInfo(gridLayoutInfo); + if(ret){ + const curPageIndex = this.mPageDesktopModel.getPageIndex(); + Log.showInfo(TAG, 'deleteForm' + curPageIndex); + this.mPageDesktopModel.setPageIndex(curPageIndex - 1); + } + } + const formInfoList: any = this.mFormListInfoCacheManager.getCache(KEY_FORM_LIST); + if (formInfoList === CommonConstants.INVALID_VALUE) { + return; + } + for(let i = 0; i < formInfoList.length; i++) { + if (formInfoList[i].cardId === cardId){ + formInfoList.splice(i, 1); + break; + } + } + if (formInfoList.length === 0) { + this.mFormListInfoCacheManager.setCache(KEY_FORM_LIST, null); + } else { + this.mFormListInfoCacheManager.setCache(KEY_FORM_LIST, formInfoList); + } + } + /** * update page number if blank page is exist * diff --git a/common/src/main/ets/default/model/PageDesktopModel.ts b/common/src/main/ets/default/model/PageDesktopModel.ts index e5ada35e..26523cb8 100644 --- a/common/src/main/ets/default/model/PageDesktopModel.ts +++ b/common/src/main/ets/default/model/PageDesktopModel.ts @@ -53,7 +53,8 @@ export class PageDesktopModel { EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_UPDATE, EventConstants.EVENT_REQUEST_PAGEDESK_FORM_ITEM_ADD, EventConstants.EVENT_SMARTDOCK_INIT_FINISHED, - EventConstants.EVENT_REQUEST_PAGEDESK_REFRESH + EventConstants.EVENT_REQUEST_PAGEDESK_REFRESH, + EventConstants.EVENT_REQUEST_FORM_ITEM_VISIBLE ]); } @@ -93,6 +94,9 @@ export class PageDesktopModel { return false; } } + if (layoutInfo.layoutDescription.pageCount <= 1) { + return false; + } layoutInfo.layoutDescription.pageCount--; for (let m = 0; m < layoutInfo.layoutInfo.length; m++) { if (layoutInfo.layoutInfo[m].page > page) { diff --git a/common/src/main/ets/default/model/SettingsModel.ts b/common/src/main/ets/default/model/SettingsModel.ts index eb4f1acb..2dfaed40 100644 --- a/common/src/main/ets/default/model/SettingsModel.ts +++ b/common/src/main/ets/default/model/SettingsModel.ts @@ -47,10 +47,7 @@ export class SettingsModel { private constructor() { this.mPageDesktopModeConfig = layoutConfigManager.getModeConfig(PageDesktopModeConfig.DESKTOP_MODE_CONFIG); - let deviceType = CommonConstants.DEFAULT_DEVICE_TYPE; - if (this.mPageDesktopModeConfig != null) { - deviceType = this.mPageDesktopModeConfig.getDeviceType(); - } + const deviceType = this.mPageDesktopModeConfig.getDeviceType(); if (deviceType == CommonConstants.DEFAULT_DEVICE_TYPE) { this.mGridLayoutTable = GridLayoutConfigs.GridLayoutTable; } else if (deviceType == CommonConstants.PAD_DEVICE_TYPE) { diff --git a/common/src/main/ets/default/uicomponents/AppGrid.ets b/common/src/main/ets/default/uicomponents/AppGrid.ets index 9af38ed3..b5dd9374 100644 --- a/common/src/main/ets/default/uicomponents/AppGrid.ets +++ b/common/src/main/ets/default/uicomponents/AppGrid.ets @@ -19,20 +19,19 @@ import { AppItemInfo } from '../bean/AppItemInfo'; import { CommonConstants } from '../constants/CommonConstants'; import { AppGridStyleConfig } from '../layoutconfig/AppGridStyleConfig'; -let mAppGridStyleConfig: AppGridStyleConfig = null; const TAG = 'AppGrid'; @Component export struct AppGrid { @Link appGridList: Array; - appGridStyleConfig: AppGridStyleConfig; + @Link appGridStyleConfig: AppGridStyleConfig; onItemClick: Function = null; buildMenu: Function = null; @State isScroll: boolean = false; private getColumnsTemplate() { let columnsTemplate = ''; - for (let i = 0; i < mAppGridStyleConfig.mColumns; i++) { + for (let i = 0; i < this.appGridStyleConfig.mColumns; i++) { columnsTemplate += ' 1fr'; } return columnsTemplate; @@ -43,26 +42,22 @@ export struct AppGrid { if (this.isScroll) { return rowsTemplate; } - for (let i = 0; i < mAppGridStyleConfig.mRows; i++) { + for (let i = 0; i < this.appGridStyleConfig.mRows; i++) { rowsTemplate += ' 1fr'; } return rowsTemplate; } - aboutToAppear(): void { - mAppGridStyleConfig = this.appGridStyleConfig; - } - build() { Grid() { ForEach(this.appGridList, (item) => { GridItem() { Column() { AppBubble({ - iconSize: mAppGridStyleConfig.mIconSize, - nameSize: mAppGridStyleConfig.mNameSize, - nameFontColor: mAppGridStyleConfig.mNameFontColor, - nameHeight: mAppGridStyleConfig.mNameHeight, + iconSize: this.appGridStyleConfig.mIconSize, + nameSize: this.appGridStyleConfig.mNameSize, + nameFontColor: this.appGridStyleConfig.mNameFontColor, + nameHeight: this.appGridStyleConfig.mNameHeight, appName: item.appName, bundleName: item.bundleName, moduleName: item.moduleName, @@ -71,8 +66,8 @@ export struct AppGrid { appLabelId: item.appLabelId, badgeNumber: item.badgeNumber, menuInfo: this.buildMenu(item), - nameLines: mAppGridStyleConfig.mNameLines, - mPaddingTop: mAppGridStyleConfig.mIconMarginVertical, + nameLines: this.appGridStyleConfig.mNameLines, + mPaddingTop: this.appGridStyleConfig.mIconMarginVertical, dragStart: () => {} }) } @@ -86,14 +81,14 @@ export struct AppGrid { } }) } - .width(mAppGridStyleConfig.mAppItemSize) - .height(mAppGridStyleConfig.mAppItemSize) + .width(this.appGridStyleConfig.mAppItemSize) + .height(this.appGridStyleConfig.mAppItemSize) .transition({ scale: { x: 0.5, y: 0.5 } }) }, (item) => JSON.stringify(item)) } .columnsTemplate(this.getColumnsTemplate()) .rowsTemplate(this.getRowsTemplate()) - .columnsGap(mAppGridStyleConfig.mColumnsGap) - .rowsGap(mAppGridStyleConfig.mRowsGap) + .columnsGap(this.appGridStyleConfig.mColumnsGap) + .rowsGap(this.appGridStyleConfig.mRowsGap) } } \ No newline at end of file diff --git a/common/src/main/ets/default/uicomponents/FormItemComponent.ets b/common/src/main/ets/default/uicomponents/FormItemComponent.ets index a2600564..81fffd5f 100644 --- a/common/src/main/ets/default/uicomponents/FormItemComponent.ets +++ b/common/src/main/ets/default/uicomponents/FormItemComponent.ets @@ -20,6 +20,8 @@ import { FormModel } from '../model/FormModel'; import { StyleConstants } from '../constants/StyleConstants'; import { PresetStyleConstants } from '../constants/PresetStyleConstants'; import { CommonConstants } from '../constants/CommonConstants'; +import { localEventManager } from '../manager/LocalEventManager'; +import { EventConstants } from '../constants/EventConstants'; const TAG = 'FormItemComponent'; @@ -86,6 +88,8 @@ export struct FormItemComponent { }) .onError((error) => { Log.showInfo(TAG, `FormComponent error msg: ${error.msg}`); + this.mFormModel.deleteForm(this.formItem.cardId); + localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_UPDATE, null); }) .onTouch(event => { if (event.type === CommonConstants.TOUCH_TYPE_UP) { diff --git a/common/src/main/ets/default/uicomponents/FormManagerDialog.ets b/common/src/main/ets/default/uicomponents/FormManagerDialog.ets index 1862a419..42b50700 100644 --- a/common/src/main/ets/default/uicomponents/FormManagerDialog.ets +++ b/common/src/main/ets/default/uicomponents/FormManagerDialog.ets @@ -15,6 +15,7 @@ import { Log } from '../utils/Log'; import { FormModel } from '../model/FormModel'; import { StyleConstants } from '../constants/StyleConstants'; +import { CardItemInfo } from '../bean/CardItemInfo'; const TAG = 'FormManagerDialog'; diff --git a/common/src/main/ets/default/uicomponents/RemoteWindowWrapper.ets b/common/src/main/ets/default/uicomponents/RemoteWindowWrapper.ets index bcbe47ee..9edbf17b 100644 --- a/common/src/main/ets/default/uicomponents/RemoteWindowWrapper.ets +++ b/common/src/main/ets/default/uicomponents/RemoteWindowWrapper.ets @@ -15,12 +15,10 @@ import windowAnimationManager from '@ohos.animation.windowAnimationManager'; import curves from '@ohos.curves'; -import { - Log, - Trace, - StyleConstants, - CommonConstants -} from '@ohos/common'; +import { Log } from '../utils/Log'; +import { Trace } from '../utils/Trace'; +import { StyleConstants } from '../constants/StyleConstants'; +import { CommonConstants } from '../constants/CommonConstants'; import OverlayAppIcon from './OverlayAppIcon'; import RemoteConstants from '../constants/RemoteConstants'; import { localEventManager } from '../manager/LocalEventManager'; @@ -83,7 +81,7 @@ class RemoteVo { this.appItemInfo = appItemInfo; this.startAppTypeFromPageDesktop = startAppTypeFromPageDesktop; this.finishCallback = finishCallback; - this.remoteWindowKey = this.target.bundleName + this.target.abilityName; + this.remoteWindowKey = this.target.bundleName + this.target.abilityName + this.target.missionId; this.initRemoteWindowProperty(); } @@ -206,6 +204,7 @@ class RemoteVo { @Component export struct RemoteWindowWrapper { private mCloseAppManager: CloseAppManager; + private mLastRemoteVo: RemoteVo; @StorageLink('remoteWindowList') remoteWindowList: RemoteVo[] = []; getRemoteWindowVo(remoteWindowKey: string): RemoteVo { @@ -214,18 +213,29 @@ export struct RemoteWindowWrapper { }) if (remoteVoIndex != -1) { return this.remoteWindowList[remoteVoIndex]; + } else if (this.mLastRemoteVo && this.mLastRemoteVo.remoteWindowKey === remoteWindowKey) { + return this.mLastRemoteVo; } else { return null; } } + private pushRemoteVoIntoList(remoteVo: RemoteVo): void { + const remoteVoIndex = this.remoteWindowList.findIndex(item => { + return (item.remoteWindowKey) == remoteVo.remoteWindowKey; + }) + if (remoteVoIndex == -1) { + this.remoteWindowList.push(remoteVo); + } + } + aboutToAppear(): void { let control = new WindowAnimationControllerImpl(); this.mCloseAppManager = CloseAppManager.getInstance(); windowAnimationManager.setController(control); control.onStartAppFromLauncher = (startingWindowTarget, finishCallback) => { Log.showInfo(TAG, `remote window animaion onStartAppFromLauncher`); - const remoteWindowKey = startingWindowTarget.bundleName + startingWindowTarget.abilityName; + const remoteWindowKey = startingWindowTarget.bundleName + startingWindowTarget.abilityName + startingWindowTarget.missionId; const startAppTypeFromPageDesktop: number = AppStorage.Get('startAppTypeFromPageDesktop'); const appItemInfo: any = AppStorage.Get('startAppItemInfo'); const startAppIconInfo: any = AppStorage.Get('startAppIconInfo'); @@ -247,15 +257,16 @@ export struct RemoteWindowWrapper { undefined, finishCallback ); - this.remoteWindowList.push(remoteVo); + this.mLastRemoteVo = remoteVo; } + this.pushRemoteVoIntoList(remoteVo); AppStorage.SetOrCreate(remoteWindowKey, remoteVo.count); this.calculateAppProperty(remoteVo, finishCallback); } control.onStartAppFromRecent = (startingWindowTarget, finishCallback) => { Log.showInfo(TAG, `remote window animaion onStartAppFromRecent`); - const remoteWindowKey = startingWindowTarget.bundleName + startingWindowTarget.abilityName; + const remoteWindowKey = startingWindowTarget.bundleName + startingWindowTarget.abilityName + startingWindowTarget.missionId; const startAppTypeFromPageDesktop: number = AppStorage.Get('startAppTypeFromPageDesktop'); const appItemInfo: any = AppStorage.Get('startAppItemInfo'); const startAppIconInfo: any = AppStorage.Get('startAppIconInfo'); @@ -277,18 +288,19 @@ export struct RemoteWindowWrapper { undefined, finishCallback ); - this.remoteWindowList.push(remoteVo); + this.mLastRemoteVo = remoteVo; } + this.pushRemoteVoIntoList(remoteVo); AppStorage.SetOrCreate(remoteWindowKey, remoteVo.count); this.calculateAppProperty(remoteVo, finishCallback); } control.onStartAppFromOther = (startingWindowTarget, finishCallback) => { Log.showInfo(TAG, `remote window animaion onStartAppFromOther`); - const remoteWindowKey = startingWindowTarget.bundleName + startingWindowTarget.abilityName; + const remoteWindowKey = startingWindowTarget.bundleName + startingWindowTarget.abilityName + startingWindowTarget.missionId; const startAppTypeFromPageDesktop: number = AppStorage.Get('startAppTypeFromPageDesktop'); - const appItemInfo: any = AppStorage.Get('startAppItemInfo'); - const startAppIconInfo: any = AppStorage.Get('startAppIconInfo'); + const appItemInfo: any = AppStorage.SetOrCreate('startAppItemInfo', {}); + const startAppIconInfo: any = AppStorage.SetOrCreate('startAppIconInfo', {}); let remoteVo: RemoteVo | null = this.getRemoteWindowVo(remoteWindowKey); if (remoteVo) { remoteVo.remoteAnimationType = RemoteConstants.TYPE_START_APP_FROM_LAUNCHER; @@ -307,15 +319,16 @@ export struct RemoteWindowWrapper { undefined, finishCallback ); - this.remoteWindowList.push(remoteVo); + this.mLastRemoteVo = remoteVo; } + this.pushRemoteVoIntoList(remoteVo); AppStorage.SetOrCreate(remoteWindowKey, remoteVo.count); this.calculateAppProperty(remoteVo, finishCallback); } control.onAppTransition = (fromWindowTarget, toWindowTarget, finishCallback) => { Log.showInfo(TAG, `remote window animaion onAppTransition`); - const remoteWindowKey = toWindowTarget.bundleName + toWindowTarget.abilityName; + const remoteWindowKey = toWindowTarget.bundleName + toWindowTarget.abilityName + toWindowTarget.missionId; const startAppTypeFromPageDesktop: number = AppStorage.Get('startAppTypeFromPageDesktop'); const remoteVo = new RemoteVo( RemoteConstants.TYPE_APP_TRANSITION, @@ -326,7 +339,8 @@ export struct RemoteWindowWrapper { fromWindowTarget, finishCallback ); - this.remoteWindowList.push(remoteVo); + this.mLastRemoteVo = remoteVo; + this.pushRemoteVoIntoList(remoteVo); this.calculateAppProperty(remoteVo, finishCallback); } @@ -334,8 +348,11 @@ export struct RemoteWindowWrapper { Log.showInfo(TAG, `remote window animaion onMinimizeWindow`); const startAppTypeFromPageDesktop: number = AppStorage.Get('startAppTypeFromPageDesktop'); const appInfo: {iconInfo: any, appItemInfo: any} = this.mCloseAppManager.getAppInfo(minimizingWindowTarget); - const remoteWindowKey = minimizingWindowTarget.bundleName + minimizingWindowTarget.abilityName; + const remoteWindowKey = minimizingWindowTarget.bundleName + minimizingWindowTarget.abilityName + minimizingWindowTarget.missionId; let remoteVo: RemoteVo | null = this.getRemoteWindowVo(remoteWindowKey); + if (appInfo.appItemInfo?.page) { + AppStorage.SetOrCreate('pageIndex', appInfo.appItemInfo?.page); + } if (remoteVo) { remoteVo.remoteAnimationType = RemoteConstants.TYPE_MINIMIZE_WINDOW; remoteVo.target = minimizingWindowTarget; @@ -353,8 +370,9 @@ export struct RemoteWindowWrapper { undefined, finishCallback ); - this.remoteWindowList.push(remoteVo); + this.mLastRemoteVo = remoteVo; } + this.pushRemoteVoIntoList(remoteVo); AppStorage.SetOrCreate(remoteWindowKey, remoteVo.count); this.calculateAppProperty(remoteVo, finishCallback); } @@ -363,7 +381,7 @@ export struct RemoteWindowWrapper { Log.showInfo(TAG, `remote window animaion onCloseWindow`); const startAppTypeFromPageDesktop: number = AppStorage.Get('startAppTypeFromPageDesktop'); const appInfo: {iconInfo: any, appItemInfo: any} = this.mCloseAppManager.getAppInfo(closingWindowTarget); - const remoteWindowKey = closingWindowTarget.bundleName + closingWindowTarget.abilityName; + const remoteWindowKey = closingWindowTarget.bundleName + closingWindowTarget.abilityName + closingWindowTarget.missionId; let remoteVo: RemoteVo | null = this.getRemoteWindowVo(remoteWindowKey); if (remoteVo) { remoteVo.remoteAnimationType = RemoteConstants.TYPE_MINIMIZE_WINDOW; @@ -381,8 +399,9 @@ export struct RemoteWindowWrapper { undefined, finishCallback ); - this.remoteWindowList.push(remoteVo); + this.mLastRemoteVo = remoteVo; } + this.pushRemoteVoIntoList(remoteVo); AppStorage.SetOrCreate(remoteWindowKey, remoteVo.count); this.calculateAppProperty(remoteVo, finishCallback); } @@ -425,7 +444,7 @@ export struct RemoteWindowWrapper { Trace.end(Trace.CORE_METHOD_START_APP_ANIMATION); const startCount: number = AppStorage.Get(remoteVo.remoteWindowKey); Log.showDebug(TAG, `calculateAppProperty ${remoteVo.remoteAnimationType}, count: ${count}, startCount: ${startCount}`); - if (startCount === count || count == 0) { + if (startCount === count) { this.removeRemoteWindowFromList(remoteVo.remoteWindowKey); AppStorage.SetOrCreate(remoteVo.remoteWindowKey, 0); } @@ -461,7 +480,7 @@ export struct RemoteWindowWrapper { Trace.end(Trace.CORE_METHOD_CLOSE_APP_ANIMATION); const startCount: number = AppStorage.Get(remoteVo.remoteWindowKey); Log.showDebug(TAG, `calculateAppProperty ${remoteVo.remoteAnimationType}, count: ${count}, startCount: ${startCount}`); - if (startCount === count || count == 0) { + if (startCount === count) { this.removeRemoteWindowFromList(remoteVo.remoteWindowKey); AppStorage.SetOrCreate(remoteVo.remoteWindowKey, 0); } diff --git a/common/src/main/ets/default/uicomponents/ScrollerComponent.ets b/common/src/main/ets/default/uicomponents/ScrollerComponent.ets index 67faeb23..e76b57c4 100644 --- a/common/src/main/ets/default/uicomponents/ScrollerComponent.ets +++ b/common/src/main/ets/default/uicomponents/ScrollerComponent.ets @@ -34,155 +34,115 @@ export struct ScrollerComponent { updateData: Function= null; build() { - Column() { - Stack({ alignContent: Alignment.Center }) { - Scroll(this.scroller) { - Row() { - ForEach(this.dataList, (item) => { - Column() { - Flex({ - direction: FlexDirection.Row, - alignItems: ItemAlign.Center, - justifyContent: FlexAlign.SpaceBetween - }) { - Text(item.name.toString()) - .height(StyleConstants.DEFAULT_24) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize(StyleConstants.DEFAULT_14) - .textAlign(TextAlign.Start) - .maxLines(StyleConstants.DEFAULT_1) - .width(item.boxSize - StyleConstants.DEFAULT_30) - .hoverEffect(HoverEffect.None) - .fontWeight(FontWeight.Medium) + Row() { + Column() { + Button({ type: ButtonType.Circle, stateEffect: true }) { + Image($r('app.media.ic_public_arrow_left')) + .width(20) + .height(20) + .objectFit(ImageFit.Contain) + } + .width(24) + .height(24) + .backgroundColor('#00000005') + .onClick((event: ClickEvent) => { + this.scroller.scrollPage({ next: false }) + }) + } + .alignItems(HorizontalAlign.Center) + .justifyContent(FlexAlign.Center) + .width(StyleConstants.DEFAULT_56) + .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT) + .visibility(this.listWidth > this.screenWidth ? Visibility.Visible : Visibility.None) - Image($r('app.media.ic_public_cancel')) - .width(StyleConstants.DEFAULT_16) - .height(StyleConstants.DEFAULT_16) - .objectFit(ImageFit.Contain) - .margin({ right: StyleConstants.DEFAULT_4 }) - .onClick((event: ClickEvent) => { - if (this.dataList.length <= 1) { - this.updateData(false, "", () => amsMissionManager.clearMission(item.missionId)); - return - } - this.updateData(true, item.bundleName, () => amsMissionManager.clearMission(item.missionId)); - }) - } - .width(item.boxSize) + Scroll(this.scroller) { + Row({ space: StyleConstants.DEFAULT_14 }) { + ForEach(this.dataList, (item) => { + Column() { + Row() { + Text(item.name.toString()) + .height(StyleConstants.DEFAULT_24) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize(StyleConstants.DEFAULT_14) + .textAlign(TextAlign.Start) + .maxLines(StyleConstants.DEFAULT_1) + .width(item.boxSize - StyleConstants.DEFAULT_30) + .hoverEffect(HoverEffect.None) + .fontWeight(FontWeight.Medium) - Image(item.image) - .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_IMAGE_HEIGHT) + Image($r('app.media.ic_public_cancel')) + .width(StyleConstants.DEFAULT_16) + .height(StyleConstants.DEFAULT_16) .objectFit(ImageFit.Contain) - .borderRadius(StyleConstants.DEFAULT_8) - .hoverEffect(HoverEffect.None) + .margin({ right: StyleConstants.DEFAULT_4 }) + .onClick((event: ClickEvent) => { + if (this.dataList.length <= 1) { + this.updateData(false, "", () => amsMissionManager.clearMission(item.missionId)); + return + } + this.updateData(true, item.bundleName, () => amsMissionManager.clearMission(item.missionId)); + }) } - .onClick((event: ClickEvent) => { - this.popupHide() - amsMissionManager.moveMissionToFront(item.missionId); - }) + .alignItems(VerticalAlign.Center) + .justifyContent(FlexAlign.SpaceBetween) .width(item.boxSize) - .margin({ right: StyleConstants.DEFAULT_14 }) - .borderRadius(StyleConstants.DEFAULT_5) - }, item => JSON.stringify(item)) - } - } - .margin({ - left: this.listWidth > this.screenWidth ? StyleConstants.DEFAULT_56 : StyleConstants.DEFAULT_14, - right: this.listWidth > this.screenWidth ? StyleConstants.DEFAULT_56 : StyleConstants.DEFAULT_0 - }) - .constraintSize({ - maxWidth: this.screenWidth, - maxHeight: StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT - }) - .scrollable(ScrollDirection.Horizontal) - .scrollBar(BarState.Off) - .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT) - Flex({ - direction: FlexDirection.Row, - alignItems: ItemAlign.Center, - justifyContent: FlexAlign.SpaceBetween - }) { - Flex({ - direction: FlexDirection.Row, - alignItems: ItemAlign.Center, - justifyContent: FlexAlign.Center - }) { - Button({ type: ButtonType.Circle, stateEffect: true }) { - Image($r('app.media.ic_public_arrow_left')) - .width(20) - .height(20) + Image(item.image) + .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_IMAGE_HEIGHT) .objectFit(ImageFit.Contain) + .borderRadius(StyleConstants.DEFAULT_8) + .hoverEffect(HoverEffect.None) } - .width(24) - .height(24) - .backgroundColor('#00000005') .onClick((event: ClickEvent) => { - this.onClickLeft(); + this.popupHide(); + amsMissionManager.moveMissionToFront(item.missionId); }) - } - .width(StyleConstants.DEFAULT_56) - .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT) - - Flex({ - direction: FlexDirection.Row, - alignItems: ItemAlign.Center, - justifyContent: FlexAlign.Center - }) { - Button({ type: ButtonType.Circle, stateEffect: true }) { - Image($r('app.media.ic_public_arrow_right')) - .width(20) - .height(20) - .objectFit(ImageFit.Contain) - } - .width(24) - .height(24) - .backgroundColor('#00000005') - .onClick((event: ClickEvent) => { - this.onClickLeft(); - }) - } - .width(StyleConstants.DEFAULT_56) - .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT) + .width(item.boxSize) + .borderRadius(StyleConstants.DEFAULT_5) + .justifyContent(FlexAlign.Center) + }, item => JSON.stringify(item)) } - .width(this.screenWidth + 2 * StyleConstants.DEFAULT_56) - .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT) - .visibility(this.listWidth > this.screenWidth ? Visibility.Visible : Visibility.None) - } - } - .visibility(this.dataList.length < 1 ? Visibility.None : Visibility.Visible) - } - - private onClickLeft() { - let currentOffset = this.scroller.currentOffset().xOffset; - let tmp = 0; - for (let i = 0;i < this.dataList.length; i++) { - if ((tmp = tmp + this.dataList[i].boxSize + this.dataList[i].left) >= currentOffset) { - currentOffset = tmp - this.dataList[i].boxSize - this.dataList[i].left; - break; + .alignItems(VerticalAlign.Center) + .margin({ + left: this.listWidth > this.screenWidth ? StyleConstants.DEFAULT_0 : StyleConstants.DEFAULT_14, + right: this.listWidth > this.screenWidth ? StyleConstants.DEFAULT_0 : StyleConstants.DEFAULT_14 + }) } - } + .constraintSize({ + maxWidth: this.screenWidth, + maxHeight: StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT + }) + .scrollable(ScrollDirection.Horizontal) + .scrollBar(BarState.Off) + .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT) - this.scroller.scrollTo({ - yOffset: this.scroller.currentOffset().yOffset, - xOffset: currentOffset - }) - } - - private onClickRight() { - let currentOffset = this.scroller.currentOffset().xOffset; - let tmp = 0; - - for (let i = 0;i < this.dataList.length; i++) { - if ((tmp = tmp + this.dataList[i].boxSize + this.dataList[i].left) > currentOffset + this.screenWidth) { - currentOffset = tmp - (this.screenWidth) + this.dataList[i].left; - break + Column() { + Button({ type: ButtonType.Circle, stateEffect: true }) { + Image($r('app.media.ic_public_arrow_right')) + .width(20) + .height(20) + .objectFit(ImageFit.Contain) + } + .width(24) + .height(24) + .backgroundColor('#00000005') + .onClick((event: ClickEvent) => { + this.scroller.scrollPage({ next: true }) + }) } + .alignItems(HorizontalAlign.Center) + .justifyContent(FlexAlign.Center) + .width(StyleConstants.DEFAULT_56) + .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT) + .visibility(this.listWidth > this.screenWidth ? Visibility.Visible : Visibility.None) } - - this.scroller.scrollTo({ - yOffset: this.scroller.currentOffset().yOffset, - xOffset: currentOffset + .alignItems(VerticalAlign.Center) + .justifyContent(FlexAlign.SpaceBetween) + .constraintSize({ + maxWidth: this.screenWidth + 2 * StyleConstants.DEFAULT_56, + maxHeight: StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT }) + .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT) + .visibility(this.dataList.length < 1 ? Visibility.None : Visibility.Visible) } } \ No newline at end of file diff --git a/feature/appcenter/src/main/ets/default/layout/AppGridLayout.ets b/feature/appcenter/src/main/ets/default/layout/AppGridLayout.ets index 993f6348..3c6c58f5 100644 --- a/feature/appcenter/src/main/ets/default/layout/AppGridLayout.ets +++ b/feature/appcenter/src/main/ets/default/layout/AppGridLayout.ets @@ -38,7 +38,7 @@ export struct AppGridLayout { @State mRows: number = StyleConstants.DEFAULT_APP_GRID_ROW; @StorageLink('listInfo') appGridList: [] = []; mAppGridViewModel: AppGridViewModel = null; - mAppCenterGridStyleConfig: AppCenterGridStyleConfig = null; + @StorageLink('appGridStyleConfig') mAppCenterGridStyleConfig: AppCenterGridStyleConfig = null; mSelectItem = null; private mAppCenterStartAppHandler: AppCenterStartAppHandler; private dialogName: string = ""; @@ -165,7 +165,7 @@ export struct AppGridLayout { AppGrid({ appGridList: $appGridList, isScroll: true, - appGridStyleConfig: this.mAppCenterGridStyleConfig, + appGridStyleConfig: $mAppCenterGridStyleConfig, onItemClick: (event, item) => { Log.showDebug(TAG,`open.onAppGridClick--:${JSON.stringify(item)}`); Trace.start(Trace.CORE_METHOD_START_APP_ANIMATION); diff --git a/feature/form/src/main/ets/default/viewmodel/FormViewModel.ts b/feature/form/src/main/ets/default/viewmodel/FormViewModel.ts index 9216d630..67b98169 100644 --- a/feature/form/src/main/ets/default/viewmodel/FormViewModel.ts +++ b/feature/form/src/main/ets/default/viewmodel/FormViewModel.ts @@ -113,8 +113,13 @@ export class FormViewModel { this.mFormModel.deleteFormById(cardId); const page = gridLayoutInfo.layoutInfo[cardIndex].page; gridLayoutInfo.layoutInfo.splice(cardIndex, 1); - this.mPageDesktopModel.deleteBlankPageFromLayoutInfo(gridLayoutInfo, page); + let ret: boolean = this.mPageDesktopModel.deleteBlankPageFromLayoutInfo(gridLayoutInfo, page); this.mSettingsModel.setLayoutInfo(gridLayoutInfo); + if(ret){ + const curPageIndex = this.mPageDesktopModel.getPageIndex(); + Log.showInfo(TAG, 'deleteForm' + curPageIndex); + this.mPageDesktopModel.setPageIndex(curPageIndex - 1); + } } const formInfoList: any = this.mFormListInfoCacheManager.getCache(KEY_FORM_LIST); if (formInfoList === CommonConstants.INVALID_VALUE) { diff --git a/feature/pagedesktop/src/main/ets/default/common/PageDesktopCloseAppHandler.ts b/feature/pagedesktop/src/main/ets/default/common/PageDesktopCloseAppHandler.ts index 8165d02c..c92cbd9c 100644 --- a/feature/pagedesktop/src/main/ets/default/common/PageDesktopCloseAppHandler.ts +++ b/feature/pagedesktop/src/main/ets/default/common/PageDesktopCloseAppHandler.ts @@ -186,7 +186,8 @@ export class PageDesktopCloseAppHandler extends BaseCloseAppHandler { icon: globalThis.ResourceManager .getCachedAppIcon(item.appIconId, item.bundleName, item.moduleName), row: item.row, - column: item.column + column: item.column, + page: item.page } return appInfo; } diff --git a/feature/pagedesktop/src/main/ets/default/common/PageDesktopDragHandler.ts b/feature/pagedesktop/src/main/ets/default/common/PageDesktopDragHandler.ts index 3c315586..6985c936 100644 --- a/feature/pagedesktop/src/main/ets/default/common/PageDesktopDragHandler.ts +++ b/feature/pagedesktop/src/main/ets/default/common/PageDesktopDragHandler.ts @@ -376,7 +376,8 @@ export class PageDesktopDragHandler extends BaseDragHandler { if (!CheckEmptyUtils.isEmpty(startPosition)) { deleteStartFlag = this.mPageDesktopModel.deleteBlankPageFromLayoutInfo(layoutInfo, startPosition.page); } - if (CheckEmptyUtils.isEmpty(endPosition)) { + if (CheckEmptyUtils.isEmpty(endPosition) || JSON.stringify(startPosition) === JSON.stringify(endPosition)) { + Log.showDebug(TAG, `pageIndex: ${JSON.stringify(startPosition) === JSON.stringify(endPosition)}`); AppStorage.SetOrCreate('pageIndex', startPosition.page); } else if (deleteStartFlag) { if (startPosition.page > endPosition.page) { diff --git a/feature/pagedesktop/src/main/ets/default/common/components/FolderItem.ets b/feature/pagedesktop/src/main/ets/default/common/components/FolderItem.ets index 8babd27f..d024e5ff 100644 --- a/feature/pagedesktop/src/main/ets/default/common/components/FolderItem.ets +++ b/feature/pagedesktop/src/main/ets/default/common/components/FolderItem.ets @@ -70,7 +70,7 @@ export default struct FolderItem { } }) } - .height(this.mFolderStyleConfig.mGridSize * 1.05 + StyleConstants.DEFAULT_10) + .height(this.mFolderStyleConfig.mGridSize * 1.05 + StyleConstants.DEFAULT_40) .width(this.mFolderStyleConfig.mGridSize * 1.05) } diff --git a/feature/pagedesktop/src/main/ets/default/common/components/GridSwiper.ets b/feature/pagedesktop/src/main/ets/default/common/components/GridSwiper.ets index f18238eb..b8f534d2 100644 --- a/feature/pagedesktop/src/main/ets/default/common/components/GridSwiper.ets +++ b/feature/pagedesktop/src/main/ets/default/common/components/GridSwiper.ets @@ -13,16 +13,17 @@ * limitations under the License. */ -import { Log, Trace, StyleConstants, CommonConstants, AppMenu, MenuInfo } from '@ohos/common'; +import { Log, Trace, StyleConstants, CommonConstants, AppMenu, MenuInfo, localEventManager, EventConstants } from '@ohos/common'; import SwiperPage from './SwiperPage'; const TAG = "GridSwiper"; +const APP_INFO_REFRESH_DELAY = 1000; @Component export default struct GridSwiper { @StorageLink('NavigationBarStatusValue') navigationBarStatusValue: boolean = false; @StorageLink('isDesktopLoadFinished') desktopLoadFinished: boolean = false; - @State gridConfig: string = '5X4'; + @Prop gridConfig: string; @StorageLink('pageIndex') pageIndex: number = 0; private mPageDesktopViewModel; @StorageLink('appListInfo') appListInfo: { @@ -78,6 +79,40 @@ export default struct GridSwiper { return menuInfoList; } + itemMove(moveX: number, moveY: number){ + const hotArea: number = 12; + let screenWidth: number = AppStorage.Get('screenWidth') ?? 0; + let screenHeight: number = AppStorage.Get('screenHeight') ?? 0; + const isSwappingPage: boolean = AppStorage.Get('isSwappingPage'); + if (isSwappingPage || !screenWidth || !screenHeight) { + return; + } + let curPageIndex: number = AppStorage.Get('pageIndex'); + if (moveX < hotArea && curPageIndex > 0 && moveY < screenHeight) { + this.mPageDesktopViewModel.showPrevious(); + this.movingIconSwapPageDelay(); + } + if (moveX > (screenWidth - hotArea) && moveY < screenHeight) { + let cachePageIndex = this.mPageDesktopViewModel.getGridPageCount(); + if (curPageIndex == cachePageIndex - 1 && !this.mPageDesktopViewModel.isBlankPage()) { + this.mPageDesktopViewModel.addBlankPage(true); + } else if(curPageIndex < cachePageIndex - 1) { + this.mPageDesktopViewModel.showNext(); + } + this.movingIconSwapPageDelay(); + } + } + + /** + * Increase delay when dragging app to other page. + */ + movingIconSwapPageDelay() { + AppStorage.SetOrCreate('isSwappingPage', true); + setTimeout(() => { + AppStorage.SetOrCreate('isSwappingPage', false); + }, APP_INFO_REFRESH_DELAY); + } + build() { Column() { if (this.buildLog()) {} @@ -88,7 +123,7 @@ export default struct GridSwiper { Column() { SwiperPage({ mAppListInfo: item, - // gridConfig: this.gridConfig, + gridConfig: this.gridConfig, mPageDesktopViewModel: this.mPageDesktopViewModel }) } @@ -102,7 +137,7 @@ export default struct GridSwiper { } else { SwiperPage({ mAppListInfo: item, - // gridConfig: this.gridConfig, + gridConfig: this.gridConfig, mPageDesktopViewModel: this.mPageDesktopViewModel }) .bindContextMenu(this.MenuBuilder, ResponseType.LongPress) @@ -125,6 +160,7 @@ export default struct GridSwiper { .onChange((index) => { this.pageIndex = index; Log.showInfo(TAG, `swiper change to page ${index}`); + localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_FORM_ITEM_VISIBLE, null); }) } } @@ -132,5 +168,14 @@ export default struct GridSwiper { .justifyContent(FlexAlign.Center) .height(StyleConstants.PERCENTAGE_100) .width(StyleConstants.PERCENTAGE_100) + .onDragMove((event: DragEvent, extraParams: string) => { + Log.showInfo(TAG, `onDragMove event: [${event.getX()}, ${event.getY()}]`); + if (!AppStorage.Get('isDrag')) return; + if (AppStorage.Get('deviceType') === CommonConstants.DEFAULT_DEVICE_TYPE + || (AppStorage.Get('deviceType') !== CommonConstants.DEFAULT_DEVICE_TYPE + && AppStorage.Get('dragItemType') === CommonConstants.DRAG_FROM_DESKTOP)) { + this.itemMove(event.getX(), event.getY()); + } + }) } } \ No newline at end of file diff --git a/feature/pagedesktop/src/main/ets/default/common/components/SwiperPage.ets b/feature/pagedesktop/src/main/ets/default/common/components/SwiperPage.ets index 332cb14a..23859875 100644 --- a/feature/pagedesktop/src/main/ets/default/common/components/SwiperPage.ets +++ b/feature/pagedesktop/src/main/ets/default/common/components/SwiperPage.ets @@ -24,14 +24,14 @@ import FolderItem from './FolderItem'; import { PageDesktopGridStyleConfig } from '../PageDesktopGridStyleConfig'; const TAG = "SwiperPage"; -const APP_INFO_REFRESH_DELAY = 1000; @Component export default struct SwiperPage { @StorageLink('workSpaceWidth') @Watch('updateDeskTopScreen') workSpaceWidth: number = 0; + @StorageLink('formRefresh') formRefresh: string = ''; @State ColumnsTemplate: string = ''; @State RowsTemplate: string = '' - @State @Watch('changeColumnAndRow') gridConfig: string = '5X4'; + @Prop @Watch('changeColumnAndRow') gridConfig: string; @State mMargin: number = 0; @State mColumnsGap: number = 0; @State mRowsGap: number = 0; @@ -70,36 +70,6 @@ export default struct SwiperPage { localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_PAGEDESK_ITEM_UPDATE, null); } - itemMove(moveX: number, moveY: number){ - const isSwappingPage: boolean = AppStorage.Get('isSwappingPage'); - if (isSwappingPage) { - return; - } - let curPageIndex: number = AppStorage.Get('pageIndex'); - if ((moveX - this.mIconSize / 2) < this.mMargin && curPageIndex > 0 && moveY < this.mGridSpaceHeight) { - this.mPageDesktopViewModel.showPrevious(); - this.movingIconSwapPageDelay(); - } else if ((moveX + this.mIconSize / 2) > this.mGridSpaceWidth && moveY < this.mGridSpaceHeight) { - let cachePageIndex = this.mPageDesktopViewModel.getGridPageCount(); - if (curPageIndex == cachePageIndex - 1 && !this.mPageDesktopViewModel.isBlankPage()) { - this.mPageDesktopViewModel.addBlankPage(true); - } else if(curPageIndex < cachePageIndex - 1) { - this.mPageDesktopViewModel.showNext(); - } - this.movingIconSwapPageDelay(); - } - } - - /** - * Increase delay when dragging app to other page. - */ - movingIconSwapPageDelay() { - AppStorage.SetOrCreate('isSwappingPage', true); - setTimeout(() => { - AppStorage.SetOrCreate('isSwappingPage', false); - }, APP_INFO_REFRESH_DELAY); - } - private changeColumnAndRow(): void { this.changeConfig(); } @@ -151,7 +121,7 @@ export default struct SwiperPage { .columnEnd(item.column + item.area[0] - 1) }, (item) => { if (item.typeId == CommonConstants.TYPE_FOLDER || item.typeId == CommonConstants.TYPE_CARD) { - return JSON.stringify(item); + return JSON.stringify(item) + this.formRefresh; } else { return `${item.typeId}${item.row}${item.column}`; } @@ -178,14 +148,6 @@ export default struct SwiperPage { .onDragEnter((event: DragEvent, extraParams: string) => { Log.showInfo(TAG, `onDragEnter extraParams: ${extraParams}, event: [${event.getX()}, ${event.getY()}]`); }) - .onDragMove((event: DragEvent, extraParams: string) => { - Log.showInfo(TAG, `onDragMove event: [${event.getX()}, ${event.getY()}]`); - if (AppStorage.Get('deviceType') == CommonConstants.DEFAULT_DEVICE_TYPE - || (AppStorage.Get('deviceType') != CommonConstants.DEFAULT_DEVICE_TYPE - && AppStorage.Get('dragItemType') !== CommonConstants.DRAG_FROM_DOCK)) { - this.itemMove(event.getX(), event.getY()); - } - }) .onDragLeave((event: DragEvent, extraParams: string) => { Log.showInfo(TAG, `onDragLeave event: [${event.getX()}, ${event.getY()}]`); }) @@ -193,7 +155,7 @@ export default struct SwiperPage { const dragItemType: number = AppStorage.Get('dragItemType'); Log.showInfo(TAG, `onDrop event: [${event.getX()}, ${event.getY()}]`); if (dragItemType === CommonConstants.DRAG_FROM_DESKTOP - || (dragItemType === CommonConstants.DRAG_FROM_DOCK && AppStorage.Get('deviceType') == CommonConstants.DEFAULT_DEVICE_TYPE)) { + || (dragItemType === CommonConstants.DRAG_FROM_DOCK && AppStorage.Get('deviceType') === CommonConstants.DEFAULT_DEVICE_TYPE)) { const dragResult = globalThis.PageDesktopDragHandler.onDragDrop(event.getX(), event.getY()); Log.showInfo(TAG, `onDrop dragResult: ${dragResult}`); AppStorage.SetOrCreate('selectAppIndex', null); diff --git a/feature/pagedesktop/src/main/ets/default/layout/PageDesktopLayout.ets b/feature/pagedesktop/src/main/ets/default/layout/PageDesktopLayout.ets index 7ad24c31..b10794bb 100644 --- a/feature/pagedesktop/src/main/ets/default/layout/PageDesktopLayout.ets +++ b/feature/pagedesktop/src/main/ets/default/layout/PageDesktopLayout.ets @@ -33,7 +33,7 @@ export struct PageDesktopLayout { @StorageLink('workSpaceHeight') @Watch('updateDeskTopParams') workSpaceHeight: number = 0; @State @Watch('updateDeskTopParams') mMargin: number = 0; @State mTop: number = 0; - @State @Watch('changeGridConfig') gridConfig: string = '5X4'; + @State @Watch('changeGridConfig') gridConfig: string = ''; @StorageLink('menuId') menuId: number = 0; private mPageDesktopDragHandler: PageDesktopDragHandler = null; private isPad: boolean = false; @@ -102,12 +102,12 @@ export struct PageDesktopLayout { build() { GridSwiper({ - // gridConfig: this.gridConfig, + gridConfig: this.gridConfig, mPageDesktopViewModel: mPageDesktopViewModel, dialogController: this.deviceType == CommonConstants.PAD_DEVICE_TYPE ? null : this.dialogController }) - .width(StyleConstants.PERCENTAGE_100) - .height(StyleConstants.PERCENTAGE_100) + .width(StyleConstants.PERCENTAGE_100) + .height(StyleConstants.PERCENTAGE_100) } } diff --git a/feature/pagedesktop/src/main/ets/default/viewmodel/PageDesktopViewModel.ts b/feature/pagedesktop/src/main/ets/default/viewmodel/PageDesktopViewModel.ts index 180b2eec..427f3d61 100644 --- a/feature/pagedesktop/src/main/ets/default/viewmodel/PageDesktopViewModel.ts +++ b/feature/pagedesktop/src/main/ets/default/viewmodel/PageDesktopViewModel.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Prompt from '@ohos.prompt'; +import Prompt from '@ohos.promptAction'; import { Log } from '@ohos/common'; import { Trace } from '@ohos/common'; import { CheckEmptyUtils } from '@ohos/common'; @@ -37,6 +37,7 @@ import { FormDetailLayoutConfig } from '@ohos/form'; import { localEventManager } from '@ohos/common'; import PageDesktopConstants from '../common/constants/PageDesktopConstants'; import { PageDesktopGridStyleConfig } from '../common/PageDesktopGridStyleConfig'; +import formHost from '@ohos.app.form.formHost'; const TAG = 'PageDesktopViewModel'; const KEY_APP_LIST = 'appListInfo'; @@ -104,6 +105,9 @@ export default class PageDesktopViewModel extends BaseViewModel { case EventConstants.EVENT_REQUEST_PAGEDESK_REFRESH: this.pagingFiltering(); break; + case EventConstants.EVENT_REQUEST_FORM_ITEM_VISIBLE: + this.notifyVisibleForms(); + break; default: if (!this.isPad) { Log.showDebug(TAG, 'localEventListener hideBundleInfoList!') @@ -115,6 +119,31 @@ export default class PageDesktopViewModel extends BaseViewModel { } }; + /** + * Notify forms on current page become visible. + */ + notifyVisibleForms(): void { + let pageIndex = this.mPageDesktopModel.getPageIndex(); + let formList = []; + let items = this.mGridAppsInfos[pageIndex]; + for (let i = 0; i < items.length; i++) { + if (items[i].typeId == CommonConstants.TYPE_CARD) { + formList.push(String(items[i].cardId)); + } + } + if (formList.length > 0) { + try { + formHost.notifyVisibleForms(formList).then(() => { + Log.showInfo(TAG, 'formHost notifyVisibleForms success'); + }).catch((error) => { + Log.showInfo(TAG, 'formHost notifyVisibleForms, error:' + JSON.stringify(error)); + }); + } catch(error) { + Log.showInfo(TAG, `catch err->${JSON.stringify(error)}`); + } + } + } + private readonly mSettingsChangeObserver: SettingsModelObserver = (event: number)=> { this.mGridConfig = this.getGridConfig(); this.pagingFiltering(); @@ -187,6 +216,11 @@ export default class PageDesktopViewModel extends BaseViewModel { this.pagingFiltering(); } + async updateDesktopInfo(): Promise { + await this.mAppModel.getAppListAsync(); + this.getGridList(); + } + private async getAppList() { Log.showInfo(TAG, 'getAppList start'); @@ -522,6 +556,7 @@ export default class PageDesktopViewModel extends BaseViewModel { Log.showInfo(TAG, 'pagingFiltering appListInfo length:' + appListInfo.length); AppStorage.SetOrCreate('selectDesktopAppItem', ''); AppStorage.SetOrCreate(KEY_APP_LIST, appInfo); + AppStorage.SetOrCreate('formRefresh',String(new Date())); } private integrateSwiper(list) { @@ -699,6 +734,16 @@ export default class PageDesktopViewModel extends BaseViewModel { this.mPageDesktopModel.updateAppItemLayoutInfo(info, newApp[i]); } } + let infoOld = this.mSettingsModel.getLayoutInfo(); + for (const item of infoOld.layoutInfo) { + if (item.typeId == CommonConstants.TYPE_APP) { + for (const infoNew of info.layoutInfo) { + if (item.keyName == infoNew.keyName) { + infoNew.page = item.page; + } + } + } + } return info; } @@ -739,7 +784,7 @@ export default class PageDesktopViewModel extends BaseViewModel { 'row': row, 'column': column }; - if (AppStorage.Get('isPortrait')) { + if (AppStorage.Has('isPortrait') && AppStorage.Get('isPortrait')) { let cardInfoHorizontal: any[] = []; for (let i = 0; i < info.layoutInfo.length; i++) { if (info.layoutInfo[i].typeId == CommonConstants.TYPE_FOLDER) { @@ -767,7 +812,7 @@ export default class PageDesktopViewModel extends BaseViewModel { AppStorage.SetOrCreate('isPortraitCard', cardInfoHorizontal); } - if (!AppStorage.Get('isPortrait')) { + if (AppStorage.Has('isPortrait') && !AppStorage.Get('isPortrait')) { for (let i = 0; i < info.layoutInfo.length; i++) { if (info.layoutInfo[i].typeId == CommonConstants.TYPE_FOLDER) { let tt = info.layoutInfo[i].column @@ -801,6 +846,15 @@ export default class PageDesktopViewModel extends BaseViewModel { } } + if (!AppStorage.Has('isPortrait')) { + newLayoutInfo.layoutDescription = { + 'pageCount': pageNum, + 'row': row, + 'column': column + }; + newLayoutInfo.layoutInfo = []; + } + return newLayoutInfo; } @@ -846,6 +900,10 @@ export default class PageDesktopViewModel extends BaseViewModel { isBlankPage(): boolean { const curPageIndex = this.mPageDesktopModel.getPageIndex(); + // ???????????,???????? + if (this.getGridPageCount() <= 1) { + return false; + } if (CheckEmptyUtils.isEmpty(this.mGridAppsInfos) || CheckEmptyUtils.isEmpty(this.mGridAppsInfos[curPageIndex]) || CheckEmptyUtils.isEmpty(this.mGridAppsInfos[curPageIndex].length)) { return true; @@ -909,12 +967,13 @@ export default class PageDesktopViewModel extends BaseViewModel { * Delete the chosen blank page. */ private deleteBlankPage(): void { - - - const curPageIndex = this.mPageDesktopModel.getPageIndex(); this.deleteGridPage(curPageIndex); - this.mPageDesktopModel.setPageIndex(curPageIndex - 1); + if (curPageIndex === 0) { + this.mPageDesktopModel.setPageIndex(curPageIndex); + } else { + this.mPageDesktopModel.setPageIndex(curPageIndex - 1); + } this.setGridPageCount(this.mSettingsModel.getLayoutInfo().layoutDescription.pageCount - 1); this.pagingFiltering(); } diff --git a/feature/recents/src/main/ets/default/common/constants/RecentsStyleConstants.ts b/feature/recents/src/main/ets/default/common/constants/RecentsStyleConstants.ts index 95a40ed4..1ea3468f 100644 --- a/feature/recents/src/main/ets/default/common/constants/RecentsStyleConstants.ts +++ b/feature/recents/src/main/ets/default/common/constants/RecentsStyleConstants.ts @@ -63,10 +63,9 @@ export class RecentsStyleConstants { static readonly SINGLE_LIST_LAYOUT_MARGIN = 10; static readonly DOUBLE_LIST_APP_INFO_LAYOUT_WEIGHT: number = 2; static readonly DOUBLE_LIST_LAYOUT_MARGIN = 20; - static readonly DOUBLE_LIST_LAYOUT_COLUMNSGAP = 40; + static readonly DOUBLE_LIST_LAYOUT_COLUMNSGAP = 38; static readonly DOUBLE_LIST_LAYOUT_ROWSGAP = 40; static readonly DOUBLE_LIST_RIGHT_MARGIN = 72; - static readonly DOUBLE_LIST_LEFT_MARGIN = 80; static readonly DOUBLE_LIST_TOP_MARGIN = 54; static readonly SINGLE_LIST_LOCKED_IMAGE_RIGHT_MARGIN = 24; static readonly DOUBLE_LIST_LOCKED_IMAGE_RIGHT_MARGIN = 12; diff --git a/feature/recents/src/main/ets/default/view/RecentMissionsDoubleLayout.ets b/feature/recents/src/main/ets/default/view/RecentMissionsDoubleLayout.ets index 606cb5fa..17bce3c1 100644 --- a/feature/recents/src/main/ets/default/view/RecentMissionsDoubleLayout.ets +++ b/feature/recents/src/main/ets/default/view/RecentMissionsDoubleLayout.ets @@ -96,18 +96,17 @@ export struct RecentMissionsDoubleLayout { .height(RecentsStyleConstants.RECENT_DELETE_IMAGE_SIZE) } .onClick(() => { - windowManager.minimizeAllApps(); this.isClickSubComponent = true; Log.showDebug(TAG, 'onClick click delete button'); localEventManager.sendLocalEventSticky(EventConstants.EVENT_ANIMATION_CLOSE_APPLICATION, null); this.mRecentMissionsViewModel.deleteRecentMission(true, CommonConstants.INVALID_VALUE); this.mRecentMissionsViewModel.backView(); + this.mRecentMissionsViewModel.getRecentMissionsList(); }) } .width(RecentsStyleConstants.DEFAULT_LAYOUT_PERCENTAGE) } .width(RecentsStyleConstants.DEFAULT_LAYOUT_PERCENTAGE) - .padding({ left: RecentsStyleConstants.DOUBLE_LIST_LEFT_MARGIN }) .height(RecentsStyleConstants.DEFAULT_LAYOUT_PERCENTAGE) } } \ No newline at end of file diff --git a/feature/recents/src/main/ets/default/view/RecentMissionsSingleLayout.ets b/feature/recents/src/main/ets/default/view/RecentMissionsSingleLayout.ets index bd0d6068..6d13ebbc 100644 --- a/feature/recents/src/main/ets/default/view/RecentMissionsSingleLayout.ets +++ b/feature/recents/src/main/ets/default/view/RecentMissionsSingleLayout.ets @@ -82,6 +82,7 @@ export struct RecentMissionsSingleLayout { Log.showDebug(TAG, 'onClick click delete button'); this.mRecentMissionsViewModel.deleteRecentMission(true, -1); this.mRecentMissionsViewModel.backView(); + this.mRecentMissionsViewModel.getRecentMissionsList(); }) } .margin({ bottom: RecentsStyleConstants.SINGLE_LIST_DELETE_IMAGE_FULL_BOTTOM_MARGIN }) diff --git a/feature/recents/src/main/ets/default/viewmodel/RecentMissionsViewModel.ets b/feature/recents/src/main/ets/default/viewmodel/RecentMissionsViewModel.ets index 5478aab4..799bc75d 100644 --- a/feature/recents/src/main/ets/default/viewmodel/RecentMissionsViewModel.ets +++ b/feature/recents/src/main/ets/default/viewmodel/RecentMissionsViewModel.ets @@ -108,9 +108,14 @@ export class RecentMissionsViewModel { return item.missionId != missionId; }); } else { - this.mRecentMissionsList = []; - AppStorage.SetOrCreate('recentMissionsList', []); await this.deleteRecentMissions(); + this.mRecentMissionsList = AppStorage.Get('recentMissionsList'); + this.mRecentMissionsList = this.mRecentMissionsList == null ? this.mRecentMissionsList : this.mRecentMissionsList.filter((item) => { + return item.lockedState === true; + }); + if (this.mRecentMissionsList && this.mRecentMissionsList.length) { + windowManager.minimizeAllApps(); + } return; } animateTo({ diff --git a/feature/smartdock/src/main/ets/default/layout/ResidentLayout.ets b/feature/smartdock/src/main/ets/default/layout/ResidentLayout.ets index b480118c..07f9361a 100644 --- a/feature/smartdock/src/main/ets/default/layout/ResidentLayout.ets +++ b/feature/smartdock/src/main/ets/default/layout/ResidentLayout.ets @@ -42,9 +42,7 @@ export default struct ResidentLayout { aboutToAppear(): void { mSmartDockStyleConfig = this.mSmartDockStyleConfig; - if (this.appList.length > 0) { - this.onDockListChange(); - } + this.onDockListChange(); } getListWidth(): number { @@ -79,17 +77,10 @@ export default struct ResidentLayout { ListItem() { AppItem({ appInfo: item, - buildMenu: this.buildMenu + buildMenu: this.buildMenu, + onItemClick: this.onItemClick }) } - .onClick((event: ClickEvent) => { - const popupIsShow: boolean = AppStorage.Get('popupIsShow'); - Log.showInfo(TAG, `popupIsShow: ` + popupIsShow); - if (!popupIsShow) { - this.onItemClick(event, item); - } - AppStorage.SetOrCreate('popupIsShow', false); - }) }, (item) => JSON.stringify(item)) } .height('100%') @@ -138,6 +129,7 @@ struct AppItem { @StorageLink('dragItemInfo') smartDragItemInfo: any = {}; @StorageLink('dragItemType') dragItemType: number = CommonConstants.DRAG_FROM_DOCK; @State isShow: boolean = false; + onItemClick: Function = null; appInfo: DockItemInfo = null; buildMenu: Function = null; private menuInfo; @@ -150,7 +142,7 @@ struct AppItem { bundleName: this.appInfo.bundleName, moduleName: this.appInfo.moduleName, icon: ResourceManager.getInstance().getCachedAppIcon(this.appInfo.appIconId, - this.appInfo.bundleName, this.appInfo.moduleName), + this.appInfo.bundleName, this.appInfo.moduleName), badgeNumber: CommonConstants.BADGE_DISPLAY_HIDE }) } @@ -187,12 +179,12 @@ struct AppItem { bundleName: this.appInfo.bundleName, moduleName: this.appInfo.moduleName, icon: ResourceManager.getInstance().getCachedAppIcon(this.appInfo.appIconId, - this.appInfo.bundleName, this.appInfo.moduleName), + this.appInfo.bundleName, this.appInfo.moduleName), badgeNumber: this.appInfo.badgeNumber }) } .visibility(this.dragItemType === CommonConstants.DRAG_FROM_DOCK && this.smartDragItemInfo.keyName === this.appInfo.keyName ? - Visibility.Hidden : Visibility.Visible) + Visibility.Hidden : Visibility.Visible) .width(mSmartDockStyleConfig.mListItemWidth) .height(mSmartDockStyleConfig.mListItemHeight) .backgroundColor(mSmartDockStyleConfig.mItemBackgroundColor) @@ -203,8 +195,6 @@ struct AppItem { Log.showInfo(TAG, 'onAction start'); this.isShow = true; AppStorage.SetOrCreate('isLongPress', true); - // Control whether the onClick method is executed or not. - AppStorage.SetOrCreate('popupIsShow', true); }) ) .bindPopup(this.isShow, { @@ -234,6 +224,9 @@ struct AppItem { if (AppStorage.Get('isDrag')) { this.isShow = false; } + if (event.type === CommonConstants.TOUCH_TYPE_UP && !AppStorage.Get('isDrag') && !this.isShow) { + this.onItemClick(event, this.appInfo); + } }) .onMouse((event: MouseEvent) => { Log.showInfo(TAG, `onMouse MouseType: ${event.button}`); @@ -246,7 +239,6 @@ struct AppItem { .onDragStart((event: DragEvent, extraParams: string) => { Log.showInfo(TAG, `DragStart`); AppStorage.SetOrCreate('isDrag', true); - AppStorage.SetOrCreate('popupIsShow', false); this.dragItemType = CommonConstants.DRAG_FROM_DOCK; this.smartDragItemInfo = this.appInfo; Log.showInfo(TAG, `smartDragItemInfo: ${JSON.stringify(this.smartDragItemInfo)}`); diff --git a/feature/smartdock/src/main/ets/default/model/SmartDockModel.ts b/feature/smartdock/src/main/ets/default/model/SmartDockModel.ts index 74a0dc0f..a71b66d9 100644 --- a/feature/smartdock/src/main/ets/default/model/SmartDockModel.ts +++ b/feature/smartdock/src/main/ets/default/model/SmartDockModel.ts @@ -13,10 +13,9 @@ * limitations under the License. */ -import Prompt from '@ohos.prompt'; -import missionManager from '@ohos.application.missionManager'; -import { CloseAppManager } from '@ohos/common'; -import { MissionListener } from 'application/MissionListener'; +import Prompt from '@ohos.promptAction'; +import missionManager from '@ohos.app.ability.missionManager'; +import { CloseAppManager, windowManager } from '@ohos/common'; import { Log } from '@ohos/common'; import { CheckEmptyUtils } from '@ohos/common'; import { EventConstants } from '@ohos/common'; @@ -430,18 +429,16 @@ export default class SmartDockModel { private registerMissionListener(): void { Log.showDebug(TAG, 'registerMissionListener'); - const listener: MissionListener = { - onMissionCreated: () => {}, + const listener: missionManager.MissionListener = { + onMissionCreated: this.onMissionCreatedCallback.bind(this), onMissionDestroyed: this.onMissionDestroyedCallback.bind(this), onMissionSnapshotChanged: this.onMissionSnapshotChangedCallback.bind(this), onMissionMovedToFront: this.onMissionMovedToFrontCallback.bind(this), - onMissionIconUpdated: () => {}, - // @ts-ignore - onMissionClosed: () => {}, - // @ts-ignore - onMissionLabelUpdated: () => {} + onMissionIconUpdated: this.onMissionIconUpdatedCallback.bind(this), + onMissionClosed: this.onMissionClosedCallback.bind(this), + onMissionLabelUpdated: this.onMissionLabelUpdatedCallback.bind(this) }; - missionManager.registerMissionListener(listener); + missionManager.on('mission', listener); } /** @@ -469,9 +466,21 @@ export default class SmartDockModel { } mRecentMissionsList[recentMissionInfoIndex] = recentMissionInfo; } + if (globalThis.recentMode && windowManager.isSplitWindowMode(globalThis.recentMode)) { + mRecentMissionsList.forEach((item, index) => { + if (item.missionId == globalThis.splitMissionId) { + mRecentMissionsList.splice(index, 1); + return; + } + }); + } AppStorage.SetOrCreate('recentMissionsList', mRecentMissionsList); } + onMissionCreatedCallback(missionId: number): void { + Log.showInfo(TAG, 'onMissionCreatedCallback, missionId=' + missionId); + } + onMissionDestroyedCallback(missionId: number): void { Log.showInfo(TAG, 'onMissionDestroyedCallback, missionId=' + missionId); this.getRecentDataList().then(() => {}, ( )=> {}); @@ -489,6 +498,24 @@ export default class SmartDockModel { this.getRecentViewDataList(missionId).then(() => {}, () => {}); } + onMissionIconUpdatedCallback(missionId: number): void { + Log.showInfo(TAG, 'onMissionIconUpdatedCallback, missionId=' + missionId); + this.getRecentDataList().then(() => {}, () => {}); + this.getRecentViewDataList(missionId).then(() => {}, () => {}); + } + + onMissionClosedCallback(missionId: number): void { + Log.showInfo(TAG, 'onMissionClosedCallback, missionId=' + missionId); + this.getRecentDataList().then(() => {}, () => { }); + this.getRecentViewDataList(missionId).then(() => {}, () => {}); + } + + onMissionLabelUpdatedCallback(missionId: number): void { + Log.showInfo(TAG, 'onMissionLabelUpdatedCallback, missionId=' + missionId); + this.getRecentDataList().then(() => {}, () => {}); + this.getRecentViewDataList(missionId).then(() => {}, () => {}); + } + /** * get ShortcutInfo by bundleName * @param bundleName diff --git a/product/pad/src/main/ets/MainAbility/MainAbility.ts b/product/pad/src/main/ets/MainAbility/MainAbility.ts index ac1d519d..516b26ca 100644 --- a/product/pad/src/main/ets/MainAbility/MainAbility.ts +++ b/product/pad/src/main/ets/MainAbility/MainAbility.ts @@ -15,15 +15,18 @@ import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; import display from '@ohos.display'; -import Want from '@ohos.application.Want'; +import Want from '@ohos.app.ability.Want'; import { Log } from '@ohos/common'; import { windowManager } from '@ohos/common'; import { RdbStoreManager } from '@ohos/common'; -import { FormConstants } from '@ohos/common'; +import { FormConstants, FormListInfoCacheManager, ResourceManager, launcherAbilityManager } from '@ohos/common'; import { GestureNavigationManager } from '@ohos/gesturenavigation'; import StyleConstants from '../common/constants/StyleConstants'; import { navigationBarCommonEventManager } from '@ohos/common'; import PageDesktopViewModel from '../../../../../../feature/pagedesktop/src/main/ets/default/viewmodel/PageDesktopViewModel'; +import { localEventManager } from '@ohos/common'; +import { EventConstants } from '@ohos/common'; +import Window from '@ohos.window'; const TAG = 'LauncherMainAbility'; @@ -49,11 +52,22 @@ export default class MainAbility extends ServiceExtension { await dbStore.initRdbConfig(); await dbStore.createTable(); + let registerWinEvent = (win) => { + win.on('lifeCycleEvent', (stageEventType) => { + // 񽹻ʧʱ֪ͨĿƬΪɼ״̬ + if (stageEventType === Window.WindowStageEventType.INACTIVE + || stageEventType === Window.WindowStageEventType.ACTIVE) { + localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_FORM_ITEM_VISIBLE, null); + Log.showInfo(TAG, `lifeCycleEvent change: ${stageEventType}`); + } + }) + }; + windowManager.registerWindowEvent(); navigationBarCommonEventManager.registerNavigationBarEvent(); // create Launcher entry view windowManager.createWindow(globalThis.desktopContext, windowManager.DESKTOP_WINDOW_NAME, - windowManager.DESKTOP_RANK, 'pages/' + windowManager.DESKTOP_WINDOW_NAME, true); + windowManager.DESKTOP_RANK, 'pages/' + windowManager.DESKTOP_WINDOW_NAME, true, registerWinEvent); // load recent windowManager.createRecentWindow(); @@ -73,10 +87,8 @@ export default class MainAbility extends ServiceExtension { private startGestureNavigation(): void { const gestureNavigationManage = GestureNavigationManager.getInstance(); - display.getDefaultDisplay() - .then((dis: { id: number, width: number, height: number, refreshRate: number }): void => { - gestureNavigationManage.initWindowSize(dis); - }); + let dis: display.Display = display.getDefaultDisplaySync(); + dis && gestureNavigationManage.initWindowSize(dis); } onDestroy(): void { @@ -112,4 +124,20 @@ export default class MainAbility extends ServiceExtension { let num: number = AppStorage.Get('sysUiRecentOnClickEvent'); AppStorage.SetOrCreate('sysUiRecentOnClickEvent', ++num); } + + async onConfigurationUpdated(config) { + Log.showInfo(TAG, 'onConfigurationUpdated, config:' + JSON.stringify(config)); + const systemLanguage = AppStorage.Get('systemLanguage'); + if(systemLanguage !== config.language) { + this.clearCacheWhenLanguageChange(); + } + AppStorage.SetOrCreate("systemLanguage", config.language); + } + + private clearCacheWhenLanguageChange() { + FormListInfoCacheManager.getInstance().clearCache(); + ResourceManager.getInstance().clearAppResourceCache(); + launcherAbilityManager.cleanAppMapCache(); + PageDesktopViewModel.getInstance().updateDesktopInfo(); + } } \ No newline at end of file diff --git a/product/pad/src/main/ets/pages/AppCenterView.ets b/product/pad/src/main/ets/pages/AppCenterView.ets index 38857a7f..f19ab482 100644 --- a/product/pad/src/main/ets/pages/AppCenterView.ets +++ b/product/pad/src/main/ets/pages/AppCenterView.ets @@ -115,7 +115,7 @@ struct AppCenterView { Log.showInfo(TAG, 'click appcenter area'); const contextFlag: boolean = AppStorage.Get('contextMenuState'); Log.showInfo(TAG, 'onClick contextFlag: ' + contextFlag); - if (contextFlag) { + if (contextFlag && !ContextMenu.close()) { AppStorage.SetOrCreate('contextMenuState', false); }else { this.onBackPress(); diff --git a/product/phone/src/main/ets/pages/RecentView.ets b/product/phone/src/main/ets/pages/RecentView.ets index f7b0de5b..695335b5 100644 --- a/product/phone/src/main/ets/pages/RecentView.ets +++ b/product/phone/src/main/ets/pages/RecentView.ets @@ -31,7 +31,7 @@ struct RecentView { @StorageLink('recentMissionsList') recentMissionsList: RecentMissionInfo[] = []; @State isClickSubComponent: boolean = false; private mRecentMissionsStage: RecentMissionsStage = new RecentMissionsStage(); - private mRecentMissionsViewModel: RecentMissionsViewModel; + @State mRecentMissionsViewModel: RecentMissionsViewModel = undefined; onPageShow(): void { Log.showInfo(TAG, 'onPageShow'); @@ -56,7 +56,7 @@ struct RecentView { build() { Column() { - if (!Array.isArray(this.recentMissionsList) || this.recentMissionsList.length == 0) { + if (!Array.isArray(this.recentMissionsList) || this.recentMissionsList.length == 0 || !this.mRecentMissionsViewModel) { Text($r('app.string.No_running_apps_recently')) .fontColor(RecentsStyleConstants.DEFAULT_FONT_COLOR) .fontSize(RecentsStyleConstants.DEFAULT_FONT_SIZE); -- Gitee From f550592bb689c1ab42fbc9d979f3cbde5e85a02f Mon Sep 17 00:00:00 2001 From: sunhaiyang Date: Mon, 10 Apr 2023 21:47:03 +0800 Subject: [PATCH 362/373] bannerNotification & window & display --- .../src/main/ets/default/TintStateManager.ts | 2 +- ...WindowManager.ts => WindowPanelManager.ts} | 104 ++++++------------ .../ets/com/ohos/model/LocationService.ts | 33 ++++-- .../view/item/bannerNotificationItem.ets | 11 +- .../src/main/ets/MainAbility/MainAbility.ts | 1 - .../vm/notificationManagenmentViewModel.ts | 13 --- .../src/main/ets/pages/DropdownPanel.ets | 7 +- .../src/main/ets/pages/SCBDropdownPanel.ets | 21 ++-- .../src/main/ets/pages/bannerNotification.ets | 69 +++++++----- .../src/main/ets/pages/StatusBar.ets | 15 ++- .../com/ohos/common/StatusBarConfiguration.ts | 1 - .../ets/com/ohos/pages/IconItemComponent.ets | 2 +- .../ets/com/ohos/viewmodel/StatusBarVM.ts | 16 ++- .../src/main/ets/WindowScene/HWDesktop.ets | 7 +- .../src/main/ets/WindowScene/HWScreen.ets | 2 +- 15 files changed, 141 insertions(+), 163 deletions(-) rename common/src/main/ets/default/{WindowManager.ts => WindowPanelManager.ts} (44%) diff --git a/common/src/main/ets/default/TintStateManager.ts b/common/src/main/ets/default/TintStateManager.ts index c5e9babc..86f3c25a 100644 --- a/common/src/main/ets/default/TintStateManager.ts +++ b/common/src/main/ets/default/TintStateManager.ts @@ -55,7 +55,7 @@ export default class TintStateManager { constructor() { Log.showDebug(TAG, `init TintStateManager. ${LISTENER_SYSTEM_BAR_TINT_CHANGE}`); - // TODO + // TODO 状态栏属性变化,需要依赖WMS接口适配后对接 // Window.on(LISTENER_SYSTEM_BAR_TINT_CHANGE, this.onSystemBarTintChange.bind(this)); } diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowPanelManager.ts similarity index 44% rename from common/src/main/ets/default/WindowManager.ts rename to common/src/main/ets/default/WindowPanelManager.ts index b57689fd..156f8bbd 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowPanelManager.ts @@ -14,8 +14,6 @@ * limitations under the License. */ -import Window from '@ohos.window'; -import ServiceExtensionContext from 'application/ServiceExtensionContext'; import { Log } from './utils/Log'; import EventManager from './event/EventManager'; import { obtainLocalEvent } from './event/EventUtil'; @@ -27,16 +25,26 @@ export type WindowInfo = { rect: Rect; }; +export const SystemUi_StatusBar: string = 'SystemUi_StatusBar'; +export const SystemUi_NavigationBar: string = 'SystemUi_NavigationBar'; +export const SystemUi_DropdownPanel: string = 'SystemUi_DropdownPanel'; +export const SystemUi_NotificationPanel: string = 'SystemUi_NotificationPanel'; +export const SystemUi_ControlPanel: string = 'SystemUi_ControlPanel'; +export const SystemUi_VolumePanel: string = 'SystemUi_VolumePanel'; +export const SystemUi_BannerNotice: string = 'SystemUi_BannerNotice'; +export const SystemUi_SplitBar: string = 'SystemUi_SplitBar'; +export const SystemUi_PrivacyIndicator: string = 'SystemUi_PrivacyIndicator' + export enum WindowType { - STATUS_BAR = 'SystemUi_StatusBar', - NAVIGATION_BAR = 'SystemUi_NavigationBar', - DROPDOWN_PANEL = 'SystemUi_DropdownPanel', - NOTIFICATION_PANEL = 'SystemUi_NotificationPanel', - CONTROL_PANEL = 'SystemUi_ControlPanel', - VOLUME_PANEL = 'SystemUi_VolumePanel', - BANNER_NOTICE = 'SystemUi_BannerNotice', - SPLIT_BAR = 'SystemUi_SplitBar', - PRIVACY_INDICATOR = 'SystemUi_PrivacyIndicator' + STATUS_BAR = SystemUi_StatusBar, + NAVIGATION_BAR = SystemUi_NavigationBar, + DROPDOWN_PANEL = SystemUi_DropdownPanel, + NOTIFICATION_PANEL = SystemUi_NotificationPanel, + CONTROL_PANEL = SystemUi_ControlPanel, + VOLUME_PANEL = SystemUi_VolumePanel, + BANNER_NOTICE = SystemUi_BannerNotice, + SPLIT_BAR = SystemUi_SplitBar, + PRIVACY_INDICATOR = SystemUi_PrivacyIndicator } export const WINDOW_SHOW_HIDE_EVENT = 'WindowShowHideEvent'; @@ -45,19 +53,7 @@ export const WINDOW_RESIZE_EVENT = 'WindowResizeEvent'; export const WINDOW_Destroy = 'WindowDestroy'; -const TAG = "WindowManager"; - -const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: Window.WindowType } = { - SystemUi_StatusBar: Window.WindowType.TYPE_STATUS_BAR, - SystemUi_NavigationBar: Window.WindowType.TYPE_NAVIGATION_BAR, - SystemUi_DropdownPanel: Window.WindowType.TYPE_PANEL, - SystemUi_NotificationPanel: Window.WindowType.TYPE_VOLUME_OVERLAY, - SystemUi_ControlPanel: Window.WindowType.TYPE_VOLUME_OVERLAY, - SystemUi_VolumePanel: Window.WindowType.TYPE_VOLUME_OVERLAY, - SystemUi_BannerNotice: Window.WindowType.TYPE_VOLUME_OVERLAY, - SystemUi_SplitBar: 2101, - SystemUi_PrivacyIndicator: Window.WindowType.TYPE_VOLUME_OVERLAY -}; +const TAG = "WindowPanelManager"; const DEFAULT_WINDOW_INFO: WindowInfo = { visibility: false, @@ -65,27 +61,14 @@ const DEFAULT_WINDOW_INFO: WindowInfo = { }; /** - * Manage window size changes. + * Manage panel size and visibility. */ -class WindowManager { - mWindowInfos: Map = new Map(); - - async createWindow(context: ServiceExtensionContext, name: WindowType, rect: Rect, loadContent: string): Promise { - Log.showInfo(TAG, `createWindow name: ${name}, rect: ${JSON.stringify(rect)}, url: ${loadContent}`); - let winHandle = await Window.create(context, name, SYSTEM_WINDOW_TYPE_MAP[name]); - await winHandle.moveTo(rect.left, rect.top); - await winHandle.resetSize(rect.width, rect.height); - await winHandle.loadContent(loadContent); - this.mWindowInfos.set(name, { visibility: false, rect }); - Log.showInfo(TAG, `create window[${name}] success.`); - return winHandle; - } - +class WindowPanelManager { async resetSizeWindow(name: WindowType, rect: Rect): Promise { - let window = await Window.find(name); - await window.moveTo(rect.left, rect.top); - await window.resetSize(rect.width, rect.height); - this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), rect }); + if (!rect) { + return; + } + AppStorage.SetOrCreate(name, { ...this.getWindowInfo(name) , rect}); EventManager.publish( obtainLocalEvent(WINDOW_RESIZE_EVENT, { windowName: name, @@ -97,14 +80,14 @@ class WindowManager { async moveTo(name: WindowType, rect: Rect): Promise { Log.showInfo(TAG, `moveTo window[${name}] success, rect: ${JSON.stringify(rect)}.`); - let window = await Window.find(name); - await window.moveTo(rect.left, rect.top); + if (!rect) { + return; + } + AppStorage.SetOrCreate(name, { ...this.getWindowInfo(name) , rect}); } async showWindow(name: WindowType): Promise { - let window = await Window.find(name); - await window.show(); - this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), visibility: true }); + AppStorage.SetOrCreate(name, { ...this.getWindowInfo(name) , visibility: true}); EventManager.publish( obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { windowName: name, @@ -115,9 +98,7 @@ class WindowManager { } async hideWindow(name: WindowType): Promise { - let window = await Window.find(name); - await window.hide(); - this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), visibility: false }); + AppStorage.SetOrCreate(name, { ...this.getWindowInfo(name), visibility: false }); EventManager.publish( obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { windowName: name, @@ -128,9 +109,7 @@ class WindowManager { } async destroyWindow(name: WindowType): Promise { - let window = await Window.find(name); - await window.destroy() - this.mWindowInfos.delete(name) + AppStorage.SetOrCreate(name, { ...this.getWindowInfo(name), visibility: false }); EventManager.publish(( obtainLocalEvent(WINDOW_Destroy, { windowName: name, @@ -142,22 +121,11 @@ class WindowManager { } getWindowInfo(name: WindowType): WindowInfo | undefined { - return this.mWindowInfos.get(name); + let windowInfo: WindowInfo = AppStorage.Get(name); + return windowInfo ?? DEFAULT_WINDOW_INFO; } - - async setWindowBgColor(name: WindowType, bgColor: string): void { - let window = await Window.find(name) - window.setWindowBackgroundColor(bgColor); - - } - - async setWindowTouchable(windowName: string, touchable: boolean): void { - let window = await Window.find(windowName) - window.setWindowTouchable(touchable); - } - } -let sWindowManager = createOrGet(WindowManager, TAG); +let sWindowManager = createOrGet(WindowPanelManager, TAG); export default sWindowManager; diff --git a/feature/systemui/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts b/feature/systemui/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts index 0fb84afd..9e189e59 100644 --- a/feature/systemui/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts +++ b/feature/systemui/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts @@ -34,10 +34,15 @@ export class LocationService { Log.showInfo(TAG, 'startService'); this.mIsStart = true; this.getServiceState(); - geolocation.on('locationEnabledChange', (state: boolean) => { - Log.showInfo(TAG, `startService locationChange, state: ${JSON.stringify(state)}`); - this.getServiceState(); - }); + try { + geolocation.on('locationEnabledChange', (state: boolean) => { + Log.showInfo(TAG, `startService locationChange, state: ${JSON.stringify(state)}`); + this.getServiceState(); + }); + } catch (error) { + this.mIsStart = false; + Log.showError(TAG, `startService failed, ${JSON.stringify(error)}`) + } } stopService(): void { @@ -46,9 +51,13 @@ export class LocationService { }; Log.showInfo(TAG, 'stopService'); this.mIsStart = false; - geolocation.off('locationEnabledChange', (state: boolean) => { - Log.showInfo(TAG, `stopService locationChange, state: ${JSON.stringify(state)}`) - }); + try { + geolocation.off('locationEnabledChange', (state: boolean) => { + Log.showInfo(TAG, `stopService locationChange, state: ${JSON.stringify(state)}`) + }); + } catch (error) { + Log.showError(TAG, `stopService failed, ${JSON.stringify(error)}`) + } } registerListener(listener: LocationStatrListener): void { @@ -58,9 +67,13 @@ export class LocationService { getServiceState(): void { Log.showDebug(TAG, 'getServiceState'); - let data = geolocation.isLocationEnabled() - Log.showInfo(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`); - this.mListener?.updateServiceState(data); + try { + let data = geolocation.isLocationEnabled() + Log.showInfo(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`); + this.mListener?.updateServiceState(data); + } catch (error) { + Log.showError(TAG, `getServiceState failed, ${JSON.stringify(error)}`) + } } enableLocation(): void { diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index 0f0c4bfa..b72c1252 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -15,7 +15,7 @@ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import WindowManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowManager'; +import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowPanelManager'; import {notificationData} from '@ohos/common/src/main/ets/plugindatasource/common/Constants' import Constants, {NotificationLayout as Layout} from '../../common/constants'; import NotificationViewModel from '../../viewmodel/NotificationViewModel'; @@ -136,8 +136,8 @@ export default struct BannerNotificationItem { width: this.mDefaultBannerRect['width'], height: heightWin }; - WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, bannerRect); - WindowManager.showWindow(WindowType.BANNER_NOTICE); + WindowPanelManager.resetSizeWindow(WindowType.BANNER_NOTICE, bannerRect); + WindowPanelManager.showWindow(WindowType.BANNER_NOTICE); }) } } else { @@ -163,6 +163,11 @@ export default struct BannerNotificationItem { hideWindowForTimeout() { Log.showInfo(TAG, `check need hide window or not.`); + if (!this.mLastActionTime) { + Log.showInfo(TAG, `hideWindowForTimeout. mLastActionTime undefined`); + this.onBannerNoticeHide(); + return; + } if ((new Date()).getTime() - this.mLastActionTime >= this.mInterval) { if (this.mCloseEnableFlg) { this.mLastActionTime = (new Date()).getTime(); diff --git a/feature/systemui/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts b/feature/systemui/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts index 910a7f87..f49f0812 100644 --- a/feature/systemui/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts +++ b/feature/systemui/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts @@ -17,7 +17,6 @@ import Want from '@ohos.application.Want'; import AbilityConstant from "@ohos.app.ability.AbilityConstant"; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import display from '@ohos.display'; const TAG = 'NotificationManagement-MainAbility'; diff --git a/feature/systemui/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts b/feature/systemui/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts index ee1b2a48..294c5e83 100644 --- a/feature/systemui/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts +++ b/feature/systemui/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts @@ -16,19 +16,16 @@ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import BundleResourceModel from '@ohos/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel'; -import display from '@ohos.display'; import NoDisturbComponentViewModel from '@ohos/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel'; import Router from '@system.router'; const TAG = 'NotificationManagement-NotificationManagenmentViewModel'; export default class NotificationManagenmentViewModel extends NoDisturbComponentViewModel { - isPhone = false; viewModelInit(): void{ Log.showDebug(TAG, 'ViewModelInit'); super.viewModelInit(); this.migrateTo(); - this.judgeDeviceType(); } refreshNoDisturbState(): void { @@ -58,14 +55,4 @@ export default class NotificationManagenmentViewModel extends NoDisturbComponent //clear want globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = null; } - - async judgeDeviceType(){ - Log.showDebug(TAG, "judgeDeviceType"); - let configInfo = await display.getDefaultDisplay(); - Log.showDebug(TAG, `judgeDeviceType, configInfo: ${configInfo} `); - if (configInfo.width < configInfo.height) { - this.isPhone = true; - } - } - } diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets index d111a07e..5f766461 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets @@ -17,8 +17,7 @@ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Trace from '@ohos/common/src/main/ets/default/Trace' -import WindowManager, { WindowType, WINDOW_SHOW_HIDE_EVENT -} from '@ohos/common/src/main/ets/default/WindowManager' +import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowPanelManager' import EventManager, { unsubscribe } from "@ohos/common/src/main/ets/default/event/EventManager" import { START_ABILITY_EVENT } from "@ohos/common/src/main/ets/default/event/EventUtil" import MultimodalInputManager from '@ohos/common/src/main/ets/default/MultimodalInputManager' @@ -247,7 +246,7 @@ export struct DropdownPanel { Trace.end(Trace.CORE_METHOD_START_TOUCHEVENT) Log.showDebug(TAG, `showSelf, showComponentName: ${showComponentName}`) this.showComponentName = showComponentName -// WindowManager.showWindow(WindowType.DROPDOWN_PANEL) + WindowPanelManager.showWindow(WindowType.DROPDOWN_PANEL) this.componentOptAreaTranslateY = '0px' this.backgroundOpacity = 1 Trace.start(Trace.CORE_METHOD_START_DROPDOWNPANEL) @@ -258,7 +257,7 @@ export struct DropdownPanel { this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { Log.showInfo(TAG, `hideSelf, hide anim finish.`); this.showComponentName = undefined -// WindowManager.hideWindow(WindowType.DROPDOWN_PANEL) + WindowPanelManager.hideWindow(WindowType.DROPDOWN_PANEL) } }, () => { this.componentOptAreaTranslateY = (-this.componentOptAreaHeightPX * 0.1) + 'px' this.backgroundOpacity = 0 diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets index 718ea3d4..80e69c3b 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets @@ -17,6 +17,8 @@ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; +import WindowPanelManager, { WindowType, WindowInfo, SystemUi_DropdownPanel, SystemUi_BannerNotice +} from '@ohos/common/src/main/ets/default/WindowPanelManager' import { DropdownPanel } from './DropdownPanel'; import { BannerNotificationPanel } from './bannerNotification'; import screenSessionManager from '@ohos.screenSessionManager'; @@ -28,12 +30,8 @@ export struct SCBDropdownPanel { public bounds: screenSessionManager.RRect; public moduleName: string = '' @State showComponentName: string = undefined; - @State mBannerRect: Area = { - left: 0, - top: 0, - width: 0, - height: 0 - }; + @StorageLink(SystemUi_DropdownPanel) mDropDownInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.DROPDOWN_PANEL); + @StorageLink(SystemUi_BannerNotice) mBannerInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.BANNER_NOTICE); onBackPress(): boolean { return true @@ -55,6 +53,7 @@ export struct SCBDropdownPanel { height: vp2px(this.bounds.height), }; AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect', rect); + this.mDropDownInfo.rect = rect; let bannerRect = { left: 0, @@ -63,7 +62,7 @@ export struct SCBDropdownPanel { height: vp2px(this.bounds.height) / 20 }; AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); - this.mBannerRect = bannerRect; + this.mBannerInfo.rect = bannerRect; } aboutToDisappear() { @@ -78,10 +77,10 @@ export struct SCBDropdownPanel { // BannerNotification BannerNotificationPanel({bounds : this.bounds}) - .hitTestBehavior(HitTestMode.Transparent) - .width(this.mBannerRect.width + 'px') - .height(this.mBannerRect.height + 'px') - .position({x: this.mBannerRect.left + 'px', y: this.mBannerRect.top + 'px'}) + .hitTestBehavior(HitTestMode.Default) + .width(this.mBannerInfo.rect.width + 'px') + .height(this.mBannerInfo.rect.height + 'px') + .position({x: this.mBannerInfo.rect.left + 'px', y: this.mBannerInfo.rect.top + 'px'}) } } } diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets index 670d782b..d48e4150 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets @@ -16,7 +16,7 @@ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import {notificationData} from '@ohos/common/src/main/ets/plugindatasource/common/Constants' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import WindowManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowManager'; +import WindowPanelManager, { WindowType, SystemUi_BannerNotice, WindowInfo } from '@ohos/common/src/main/ets/default/WindowPanelManager'; import EventManager, {unsubscribe} from "@ohos/common/src/main/ets/default/event/EventManager"; import BannerNotification from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem'; import NotificationViewModel from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel'; @@ -60,10 +60,15 @@ export struct BannerNotificationPanel { @State mOpacity: number = 0.0; @State mWidthSize: number = 0.8; @State mTranslate: string = TRANSLATE_SIZE; + @StorageLink(SystemUi_BannerNotice) @Watch('bannerChange') mBannerInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.BANNER_NOTICE); mClearCallbacks: unsubscribe[] mDefaultBannerRect: any; + bannerChange() { + Log.showInfo(TAG, `bannerChange ${JSON.stringify(this.mBannerInfo)}`) + } + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`); AbilityManager.setContextName(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL,AbilityManager.ABILITY_NAME_DROPDOWN_PANEL); @@ -84,37 +89,39 @@ export struct BannerNotificationPanel { } build() { - Column() { + if (this.mBannerInfo.visibility) { Column() { - if (this.mBannerNoticeCnt > 0) { - BannerNotification({ - want: this.pageData, - distributedDeviceName: $distributedDeviceName, - mLastActionTime: $mLastActionTime, - mBannerNoticeCnt: $mBannerNoticeCnt, - needExpand: $needExpand, - isExpand: $isExpand, - onBannerNoticeHide: () => this.onBannerNoticeHide() - }) - } else { - Blank() + Column() { + if (this.mBannerNoticeCnt > 0) { + BannerNotification({ + want: this.pageData, + distributedDeviceName: $distributedDeviceName, + mLastActionTime: $mLastActionTime, + mBannerNoticeCnt: $mBannerNoticeCnt, + needExpand: $needExpand, + isExpand: $isExpand, + onBannerNoticeHide: () => this.onBannerNoticeHide() + }) + } else { + Blank() + } } } + .width('100%') + .height('100%') + .clip(true) + .opacity(this.mOpacity) + .scale({ + x: this.mWidthSize, + centerX: '100%' + }) + .translate({ x: this.mTranslate }) } - .width('100%') - .height('100%') - .clip(true) - .opacity(this.mOpacity) - .scale({ - x: this.mWidthSize, - centerX: '100%' - }) - .translate({x: this.mTranslate}) } onBannerNoticeShow() { Log.showDebug(TAG, `onBannerNoticeShow start`); - let windowInfoDrop = WindowManager.getWindowInfo(WindowType.DROPDOWN_PANEL); + let windowInfoDrop = WindowPanelManager.getWindowInfo(WindowType.DROPDOWN_PANEL); let bannerDisabledFlg = false; let screenLockStatusInfo = AppStorage.Link('lockStatus'); let screenLockStatus = ScreenLockStatus.Unlock; @@ -128,7 +135,7 @@ export struct BannerNotificationPanel { bannerDisabledFlg = true; } } - WindowManager.hideWindow(WindowType.BANNER_NOTICE); + WindowPanelManager.hideWindow(WindowType.BANNER_NOTICE); if (bannerDisabledFlg) { Log.showDebug(TAG, `onBannerNoticeShow end`); return; @@ -144,8 +151,12 @@ export struct BannerNotificationPanel { Log.showDebug(TAG, `onBannerNoticeShow count:` + this.mBannerNoticeCnt); Log.showDebug(TAG, `onBannerNoticeShow pageData:${JSON.stringify(this.pageData)}`); - WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); - WindowManager.showWindow(WindowType.BANNER_NOTICE); + WindowPanelManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect).catch((err) => { + Log.showError(TAG, `resetSizeWindow failed. ${JSON.stringify(err)}`); + }); + WindowPanelManager.showWindow(WindowType.BANNER_NOTICE).catch((err) => { + Log.showError(TAG, `showWindow failed. ${JSON.stringify(err)}`); + }); Log.showDebug(TAG, `onBannerNoticeShow end`); this.showWindowAnim(); } @@ -188,8 +199,8 @@ export struct BannerNotificationPanel { this._animateTo({ ...ANIM_CONFIG, onFinish: () => { Log.showInfo(TAG, `hide anim finish`); this.mBannerNoticeCnt = 0; - WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); - WindowManager.hideWindow(WindowType.BANNER_NOTICE); + WindowPanelManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); + WindowPanelManager.hideWindow(WindowType.BANNER_NOTICE); } }, () => { Log.showInfo(TAG, `do hide anim`); diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets b/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets index 132526e5..a62ee3ba 100644 --- a/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets +++ b/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets @@ -26,8 +26,7 @@ import StyleManager from './common/StyleManager' import StatusbarConfig from './common/StatusbarConfig' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' import Trace from '@ohos/common/src/main/ets/default/Trace' -import WindowManager, {WindowType, WINDOW_SHOW_HIDE_EVENT -} from '@ohos/common/src/main/ets/default/WindowManager' +import { WindowType, WINDOW_SHOW_HIDE_EVENT } from '@ohos/common/src/main/ets/default/WindowPanelManager' const TAG = "StatusBar"; const SLIDING_STATUS_BAR_DISTANCE = 18 @@ -163,11 +162,11 @@ export struct StatusBar { onWindowShowHideEvent(args) { Log.showDebug(TAG, `onWindowShowHideEvent, args: ${JSON.stringify(args)}`) -// if (args.windowName == WindowType.DROPDOWN_PANEL) { -// if (args.isShow) { -// } else { -// StatusBarVM.setUseInWindowName(WindowType.STATUS_BAR) -// } -// } + if (args.windowName == WindowType.DROPDOWN_PANEL) { + if (args.isShow) { + } else { + StatusBarVM.setUseInWindowName(WindowType.STATUS_BAR) + } + } } } \ No newline at end of file diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index 9bb79edd..a9c925ba 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -14,7 +14,6 @@ */ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import display from '@ohos.display' import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import ResourceUtil from '@ohos/common/src/main/ets/default/ResourceUtil' import CommonStyleConfiguration from '@ohos/common/src/main/ets/default/StyleConfiguration' diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index 1b8361aa..cade812c 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -16,7 +16,7 @@ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import EventManager, { unsubscribe } from '@ohos/common/src/main/ets/default/event/EventManager' import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils' -import { WINDOW_SHOW_HIDE_EVENT } from '@ohos/common/src/main/ets/default/WindowManager' +import { WINDOW_SHOW_HIDE_EVENT } from '@ohos/common/src/main/ets/default/WindowPanelManager' import { PluginType,itemData } from "@ohos/common/src/main/ets/plugindatasource/common/Constants" import ViewModel from '../viewmodel/StatusBarVM' import StyleConfigurationCommon, { CommonStyle diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index 7cb76353..2a6b2ac9 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -18,7 +18,7 @@ import EventManager from '@ohos/common/src/main/ets/default/event/EventManager'; import { obtainLocalEvent } from '@ohos/common/src/main/ets/default/event/EventUtil'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; -import WindowManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowManager'; +import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowPanelManager'; import TintStateManager, { TintState, TintContentInfo, getOrCreateTintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager'; import { FASlotName, Rect } from '@ohos/common/src/main/ets/default/Constants'; @@ -28,7 +28,6 @@ import StyleConfigurationCommon from '@ohos/common/src/main/ets/default/StyleCon import { StatusBarData, StatusBarBackgroundData, StatusBarComponentGroupContentData, StatusBarComponentData, StatusBarConfig } from '../common/Constants'; import StatusBarService from '../model/StatusBarService'; -import display from '@ohos.display'; export const STATUS_BAR_LAYOUT_KEY = 'StatusBarLayout'; export const STATUS_BAR_EMPTY_WIDTH_KEY = 'StatusBarEmptyWidth'; @@ -195,12 +194,11 @@ export class StatusBarVM { return; } this.mStatusBarEnable = isEnable; - // TODO -// this.mStatusBarEnable ? WindowManager.showWindow(WindowType.STATUS_BAR).then(() => { -// }).catch((err) => { -// }) : WindowManager.hideWindow(WindowType.STATUS_BAR).then(() => { -// }).catch((err) => { -// }); + this.mStatusBarEnable ? WindowPanelManager.showWindow(WindowType.STATUS_BAR).then(() => { + }).catch((err) => { + }) : WindowPanelManager.hideWindow(WindowType.STATUS_BAR).then(() => { + }).catch((err) => { + }); } changeBackground(tintState: TintState): void{ @@ -349,7 +347,7 @@ export class StatusBarVM { height: panelHeight, }; AbilityManager.setAbilityData(abilityName, 'rect', rect); - await WindowManager.moveTo(windowName, rect); + await WindowPanelManager.moveTo(windowName, rect); } setComponentContent(id: string, contentColor: string): void{ diff --git a/product/phone/src/main/ets/WindowScene/HWDesktop.ets b/product/phone/src/main/ets/WindowScene/HWDesktop.ets index 102ccdf0..55732574 100644 --- a/product/phone/src/main/ets/WindowScene/HWDesktop.ets +++ b/product/phone/src/main/ets/WindowScene/HWDesktop.ets @@ -24,11 +24,13 @@ import { PageDesktopLayout } from '@ohos/pagedesktop'; import { FolderOpenComponent } from '@ohos/bigfolder'; import { BigFolderConstants } from '@ohos/bigfolder'; import PhoneStage from '../common/PhoneStage'; +import screenSessionManager from '@ohos.screenSessionManager'; const TAG = "HWDesktop"; @Component export struct HWDesktop { + public bounds: screenSessionManager.RRect @StorageLink('screenWidth') screenWidth: number = 0; @StorageLink('screenHeight') @Watch('updateScreenInfo') screenHeight: number = 0; @StorageLink('deviceType') deviceType: string = CommonConstants.DEFAULT_DEVICE_TYPE; @@ -94,9 +96,8 @@ export struct HWDesktop { private async getWindowSize(): Promise { try { - // TODO Get from screen - this.screenWidth = px2vp(720); - this.screenHeight = px2vp(1280); + this.screenWidth = this.bounds.width; + this.screenHeight = this.bounds.height; AppStorage.SetOrCreate('screenWidth', this.screenWidth); AppStorage.SetOrCreate('screenHeight', this.screenHeight); } catch (error) { diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index 35b8dfab..edad4c78 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -29,7 +29,7 @@ export struct HWScreen { HWWallpaper() // Desktop - HWDesktop() + HWDesktop({ bounds: this.screenSession.bounds }) // Scene HWScenePanel({ -- Gitee From 9f0588f68ae4101ce81394b628de8b9f15254eae Mon Sep 17 00:00:00 2001 From: sunhaiyang Date: Fri, 14 Apr 2023 11:33:22 +0800 Subject: [PATCH 363/373] support screenLock --- build-profile.json5 | 48 ++++ .../screen/session/HWScreenSession.ts | 2 +- .../src/main/ets/default/DateTimeCommon.ts | 2 +- .../src/main/ets/default/LunarCalendar.ts | 0 .../src/main/ets/default/ScreenLockCommon.ts | 2 +- common/src/main/ets/default/SysFaultLogger.ts | 5 +- common/src/main/ets/default/Trace.ts | 6 + .../main/ets/default/WindowPanelManager.ts | 6 +- .../default/abilitymanager/abilityManager.ts | 1 + .../systemui/datetimecomponent}/.gitignore | 0 .../datetimecomponent}/build-profile.json5 | 0 .../systemui/datetimecomponent/hvigorfile.ts | 0 .../systemui/datetimecomponent}/index.ets | 1 - .../datetimecomponent/package-lock.json | 8 +- .../systemui}/datetimecomponent/package.json | 7 +- .../src/main/ets/com/ohos/common/constants.ts | 0 .../ets/com/ohos/view/component/dateTime.ets | 4 +- .../main/ets/com/ohos/vm/dateTimeViewModel.ts | 8 +- .../datetimecomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../view/NotificationListComponent.ets | 8 +- .../noticeItem/view/item/confirmDialog.ets | 1 + .../ohos/noticeItem/view/item/customItem.ets | 1 + .../noticeItem/view/item/devicesDialog.ets | 1 + .../ohos/noticeItem/view/item/groupItem.ets | 1 + .../noticeItem/view/item/notificationItem.ets | 1 + .../main/resources/base/element/float.json | 4 + .../main/resources/phone/element/float.json | 4 + .../systemui/screenlock}/.gitignore | 0 .../systemui/screenlock}/build-profile.json5 | 0 .../systemui/screenlock/hvigorfile.ts | 0 .../systemui/screenlock}/index.ets | 1 - feature/systemui/screenlock/package-lock.json | 55 +++++ .../systemui}/screenlock/package.json | 9 +- .../src/main/ets/com/ohos/common/constants.ts | 0 .../src/main/ets/com/ohos/data/userData.ts | 0 .../main/ets/com/ohos/model/accountsModel.ts | 14 +- .../ets/com/ohos/model/screenLockModel.ts | 55 +++-- .../ets/com/ohos/model/screenLockService.ts | 20 +- .../ets/com/ohos/model/screenlockStyle.ts | 4 +- .../ets/com/ohos/view/component/accounts.ets | 4 +- .../com/ohos/view/component/batterySoc.ets | 2 +- .../ets/com/ohos/view/component/customPSD.ets | 2 +- .../com/ohos/view/component/digitalPSD.ets | 2 +- .../ets/com/ohos/view/component/lockIcon.ets | 4 +- .../ets/com/ohos/view/component/mixedPSD.ets | 2 +- .../com/ohos/view/component/numkeyBoard.ets | 2 +- .../ets/com/ohos/view/component/statusBar.ets | 10 +- .../src/main/ets/com/ohos/vm/StatusBarVM.ts | 4 +- .../main/ets/com/ohos/vm/accountsViewModel.ts | 2 +- .../src/main/ets/com/ohos/vm/baseViewModel.ts | 4 +- .../ets/com/ohos/vm/batterySocViewModel.ets | 2 +- .../ets/com/ohos/vm/customPSDViewModel.ts | 6 +- .../ets/com/ohos/vm/digitalPSDViewModel.ts | 6 +- .../main/ets/com/ohos/vm/lockIconViewModel.ts | 4 +- .../main/ets/com/ohos/vm/mixedPSDViewModel.ts | 6 +- .../screenlock/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 8 - .../main/resources/base/element/string.json | 0 .../main/resources/base/media/delete_all.png | Bin .../resources/base/media/ic_hollow_dot.svg | 0 .../base/media/ic_public_lock_filled.svg | 0 .../base/media/ic_public_unlock_filled.svg | 0 .../resources/base/media/ic_solid_dot.svg | 0 .../resources/base/media/ic_user_portrait.svg | 0 .../src/main/resources/base/media/lock.png | Bin .../src/main/resources/base/media/unlock.png | Bin .../main/resources/en_US/element/string.json | 0 .../main/resources/phone/element/float.json | 8 - .../main/resources/phone/element/string.json | 0 .../src/main/resources/rawfile/antiTouch.json | 0 .../main/resources/rawfile/screenlock.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../systemui/shortcutcomponent}/.gitignore | 0 .../shortcutcomponent}/build-profile.json5 | 0 .../systemui/shortcutcomponent/hvigorfile.ts | 0 .../systemui}/shortcutcomponent/index.ets | 1 - .../shortcutcomponent/package-lock.json | 8 +- .../systemui}/shortcutcomponent/package.json | 5 +- .../src/main/ets/com/ohos/common/constants.ts | 0 .../ets/com/ohos/view/component/shortcut.ets | 2 +- .../main/ets/com/ohos/vm/shortcutViewModel.ts | 2 +- .../shortcutcomponent/src/main/module.json5 | 0 .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 0 .../main/resources/base/element/string.json | 0 .../src/main/resources/base/media/reboot.svg | 0 .../main/resources/base/media/shutdown.svg | 0 .../main/resources/en_US/element/string.json | 0 .../main/resources/zh_CN/element/string.json | 0 .../systemui/wallpapercomponent}/.gitignore | 0 .../wallpapercomponent}/build-profile.json5 | 0 .../systemui/wallpapercomponent/hvigorfile.ts | 0 .../systemui/wallpapercomponent}/index.ets | 1 - .../wallpapercomponent/package-lock.json | 8 +- .../systemui}/wallpapercomponent/package.json | 5 +- .../src/main/ets/com/ohos/common/constants.ts | 0 .../ets/com/ohos/view/component/wallpaper.ets | 3 +- .../ets/com/ohos/vm/wallpaperViewModel.ts | 2 +- .../wallpapercomponent/src/main/module.json5 | 0 .../main/resources/base/element/string.json | 0 product/phone/package-lock.json | 92 ++++++++ product/phone/package.json | 6 +- .../src/main/ets/WindowScene/HWScreen.ets | 4 + .../screenlock}/common/StyleConfiguration.ts | 11 +- .../ets/screenlock}/common/StyleManager.ts | 4 +- .../main/ets/screenlock}/common/constants.ts | 0 .../ets/screenlock/pages/SCBScreenLock.ets | 69 ++++-- .../ets/screenlock}/pages/customPassword.ets | 14 +- .../screenlock}/pages/customscreenlock.ets | 2 +- .../ets/screenlock}/pages/digitalPassword.ets | 14 +- .../screenlock}/pages/journalscreenlock.ets | 2 +- .../ets/screenlock}/pages/mixedPassword.ets | 13 +- .../ets/screenlock}/pages/slidescreenlock.ets | 18 +- .../main/ets/screenlock}/vm/indexViewModel.ts | 6 +- .../vm/slideScreenLockViewModel.ts | 6 +- product/phone/src/main/module.json5 | 21 ++ .../main/resources/base/element/color.json | 0 .../main/resources/base/element/float.json | 16 -- .../src/main/resources/base/media/bg.png | Bin .../main/resources/base/media/delete_all.png | Bin .../main/resources/base/media/ic_close.svg | 0 .../resources/base/media/ic_hollow_dot.svg | 0 .../base/media/ic_notification_down.png | Bin .../base/media/ic_notification_up.png | Bin .../base/media/ic_public_delete_filled.svg | 0 .../base/media/ic_public_lock_filled.svg | 0 .../base/media/ic_public_settings_filled.svg | 0 .../base/media/ic_public_unlock_filled.svg | 0 .../resources/base/media/ic_solid_dot.svg | 0 .../base/media/ic_statusbar_signal_1.svg | 0 .../base/media/ic_statusbar_signal_2.svg | 0 .../base/media/ic_statusbar_signal_3.svg | 0 .../base/media/ic_statusbar_signal_4.svg | 0 .../base/media/ic_statusbar_signal_full.svg | 0 .../base/media/ic_statusbar_signal_no.svg | 0 .../media/ic_statusbar_signal_roaming.png | Bin .../base/media/ic_statusbar_signal_wait.png | Bin .../base/media/ic_statusbar_wifi_1.svg | 0 .../base/media/ic_statusbar_wifi_2.svg | 0 .../base/media/ic_statusbar_wifi_3.svg | 0 .../base/media/ic_statusbar_wifi_connect.png | Bin .../base/media/ic_statusbar_wifi_full.svg | 0 .../base/media/ic_statusbar_wifi_no.svg | 0 .../resources/base/media/ic_user_portrait.svg | 0 .../src/main/resources/base/media/lock.png | Bin .../src/main/resources/base/media/reboot.svg | 0 .../src/main/resources/base/media/send.svg | 0 .../main/resources/base/media/shutdown.svg | 0 .../src/main/resources/base/media/unlock.png | Bin .../resources/base/profile/main_pages.json | 5 +- screenlock4merge/AppScope/app.json5 | 13 -- .../resources/base/element/string.json | 8 - .../resources/base/media/app_icon.png | Bin 6790 -> 0 bytes screenlock4merge/common/package-lock.json | 5 - screenlock4merge/common/package.json | 14 -- .../main/ets/components/MainPage/MainPage.ets | 32 --- .../src/main/ets/default/CheckEmptyUtils.ts | 47 ---- .../common/src/main/ets/default/Constants.ts | 36 --- .../common/src/main/ets/default/Decorators.ts | 45 ---- .../common/src/main/ets/default/Log.ts | 121 ---------- .../src/main/ets/default/ReadConfigUtil.ts | 40 ---- .../src/main/ets/default/ScreenLockManager.ts | 63 ----- .../main/ets/default/SingleInstanceHelper.ts | 36 --- .../main/ets/default/StyleConfiguration.ts | 32 --- .../src/main/ets/default/StyleManager.ts | 41 ---- .../src/main/ets/default/SwitchUserManager.ts | 108 --------- .../src/main/ets/default/SysFaultLogger.ts | 60 ----- .../src/main/ets/default/TimeManager.ts | 123 ---------- .../common/src/main/ets/default/Trace.ts | 77 ------- .../src/main/ets/default/WindowManager.ts | 154 ------------- .../default/abilitymanager/abilityManager.ts | 68 ------ .../default/abilitymanager/bundleManager.ts | 38 --- .../abilitymanager/featureAbilityManager.ts | 65 ------ .../abilitymanager/notificationManager.ts | 54 ----- .../default/commonEvent/CommonEventManager.ts | 97 -------- .../src/main/ets/default/event/EventBus.ts | 76 ------ .../main/ets/default/event/EventManager.ts | 92 -------- .../src/main/ets/default/event/EventUtil.ts | 81 ------- screenlock4merge/common/src/main/module.json5 | 17 -- .../main/resources/base/element/float.json | 12 - .../main/resources/base/element/string.json | 32 --- .../main/resources/en_US/element/string.json | 36 --- .../main/resources/phone/element/float.json | 12 - .../main/resources/zh_CN/element/string.json | 36 --- screenlock4merge/entry/build-profile.json5 | 13 -- screenlock4merge/entry/hvigorfile.js | 2 - screenlock4merge/entry/package-lock.json | 5 - screenlock4merge/entry/package.json | 14 -- .../src/main/ets/Application/AbilityStage.ts | 25 -- .../src/main/ets/MainAbility/MainAbility.ts | 52 ----- .../entry/src/main/ets/pages/index.ets | 32 --- screenlock4merge/entry/src/main/module.json5 | 45 ---- .../main/resources/base/element/color.json | 8 - .../main/resources/base/element/string.json | 16 -- .../src/main/resources/base/media/icon.png | Bin 6790 -> 0 bytes .../resources/base/profile/main_pages.json | 5 - .../main/ets/components/MainPage/MainPage.ets | 32 --- .../features/screenlock/package-lock.json | 5 - .../main/ets/components/MainPage/MainPage.ets | 32 --- .../features/shortcutcomponent/.gitignore | 3 - .../main/ets/components/MainPage/MainPage.ets | 32 --- .../features/wallpapercomponent/.gitignore | 3 - .../wallpapercomponent/build-profile.json5 | 5 - .../features/wallpapercomponent/hvigorfile.js | 3 - .../features/wallpapercomponent/index.ets | 16 -- .../main/ets/components/MainPage/MainPage.ets | 32 --- screenlock4merge/infra/config_exts.gradle | 6 - .../main/ets/vm/slideScreenLockViewModel.ts | 2 +- screenlock4merge/product/phone/.gitignore | 3 - .../product/phone/build-profile.json5 | 13 -- screenlock4merge/product/phone/build.gradle | 27 --- screenlock4merge/product/phone/hvigorfile.js | 2 - .../product/phone/package-lock.json | 38 --- screenlock4merge/product/phone/package.json | 25 -- .../phone/src/main/ets/AbilityStage.ts | 25 -- .../src/main/ets/Application/AbilityStage.ts | 22 -- .../ServiceExtAbility/ServiceExtAbility.ts | 83 ------- .../product/phone/src/main/module.json5 | 95 -------- .../main/resources/base/element/string.json | 216 ------------------ .../src/main/resources/base/media/icon.png | Bin 6790 -> 0 bytes .../resources/base/profile/main_pages.json | 8 - .../main/resources/en_US/element/string.json | 16 -- .../main/resources/zh_CN/element/string.json | 16 -- screenlock4merge/signature/systemui.p7b | Bin 3823 -> 0 bytes signature/launcher.p7b | Bin 4435 -> 3950 bytes 232 files changed, 499 insertions(+), 2946 deletions(-) rename {screenlock4merge/common => common}/src/main/ets/default/DateTimeCommon.ts (96%) rename {screenlock4merge/common => common}/src/main/ets/default/LunarCalendar.ts (100%) rename {screenlock4merge/common => common}/src/main/ets/default/ScreenLockCommon.ts (97%) rename {screenlock4merge/common => feature/systemui/datetimecomponent}/.gitignore (100%) rename {screenlock4merge/common => feature/systemui/datetimecomponent}/build-profile.json5 (100%) rename screenlock4merge/common/hvigorfile.js => feature/systemui/datetimecomponent/hvigorfile.ts (100%) rename {screenlock4merge/features/screenlock => feature/systemui/datetimecomponent}/index.ets (89%) rename {screenlock4merge/features => feature/systemui}/datetimecomponent/package-lock.json (31%) rename {screenlock4merge/features => feature/systemui}/datetimecomponent/package.json (75%) rename {screenlock4merge/features => feature/systemui}/datetimecomponent/src/main/ets/com/ohos/common/constants.ts (100%) rename {screenlock4merge/features => feature/systemui}/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets (94%) rename {screenlock4merge/features => feature/systemui}/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts (88%) rename {screenlock4merge/features => feature/systemui}/datetimecomponent/src/main/module.json5 (100%) rename {screenlock4merge/features => feature/systemui}/datetimecomponent/src/main/resources/base/element/color.json (100%) rename {screenlock4merge/features => feature/systemui}/datetimecomponent/src/main/resources/base/element/float.json (100%) rename {screenlock4merge/features => feature/systemui}/datetimecomponent/src/main/resources/base/element/string.json (100%) rename {screenlock4merge/features => feature/systemui}/datetimecomponent/src/main/resources/en_US/element/string.json (100%) rename {screenlock4merge/features => feature/systemui}/datetimecomponent/src/main/resources/phone/element/float.json (100%) rename {screenlock4merge/features => feature/systemui}/datetimecomponent/src/main/resources/zh_CN/element/string.json (100%) rename {screenlock4merge/entry => feature/systemui/screenlock}/.gitignore (100%) rename {screenlock4merge/features/datetimecomponent => feature/systemui/screenlock}/build-profile.json5 (100%) rename screenlock4merge/features/datetimecomponent/hvigorfile.js => feature/systemui/screenlock/hvigorfile.ts (100%) rename {screenlock4merge/features/datetimecomponent => feature/systemui/screenlock}/index.ets (89%) create mode 100644 feature/systemui/screenlock/package-lock.json rename {screenlock4merge/features => feature/systemui}/screenlock/package.json (47%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/common/constants.ts (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/data/userData.ts (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/model/accountsModel.ts (94%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts (59%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/model/screenLockService.ts (95%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts (90%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/view/component/accounts.ets (93%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets (95%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets (98%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets (97%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets (92%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets (99%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets (98%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets (78%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts (90%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts (92%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts (97%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets (93%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts (94%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts (95%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts (93%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts (90%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/module.json5 (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/base/element/color.json (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/base/element/float.json (96%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/base/element/string.json (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/base/media/delete_all.png (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/base/media/ic_hollow_dot.svg (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/base/media/ic_solid_dot.svg (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/base/media/ic_user_portrait.svg (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/base/media/lock.png (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/base/media/unlock.png (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/en_US/element/string.json (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/phone/element/float.json (96%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/phone/element/string.json (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/rawfile/antiTouch.json (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/rawfile/screenlock.json (100%) rename {screenlock4merge/features => feature/systemui}/screenlock/src/main/resources/zh_CN/element/string.json (100%) rename {screenlock4merge/features/datetimecomponent => feature/systemui/shortcutcomponent}/.gitignore (100%) rename {screenlock4merge/features/screenlock => feature/systemui/shortcutcomponent}/build-profile.json5 (100%) rename screenlock4merge/features/screenlock/hvigorfile.js => feature/systemui/shortcutcomponent/hvigorfile.ts (100%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/index.ets (89%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/package-lock.json (31%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/package.json (76%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts (100%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets (97%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts (94%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/src/main/module.json5 (100%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/src/main/resources/base/element/color.json (100%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/src/main/resources/base/element/float.json (100%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/src/main/resources/base/element/string.json (100%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/src/main/resources/base/media/reboot.svg (100%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/src/main/resources/base/media/shutdown.svg (100%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/src/main/resources/en_US/element/string.json (100%) rename {screenlock4merge/features => feature/systemui}/shortcutcomponent/src/main/resources/zh_CN/element/string.json (100%) rename {screenlock4merge/features/screenlock => feature/systemui/wallpapercomponent}/.gitignore (100%) rename {screenlock4merge/features/shortcutcomponent => feature/systemui/wallpapercomponent}/build-profile.json5 (100%) rename screenlock4merge/features/shortcutcomponent/hvigorfile.js => feature/systemui/wallpapercomponent/hvigorfile.ts (100%) rename {screenlock4merge/common => feature/systemui/wallpapercomponent}/index.ets (89%) rename {screenlock4merge/features => feature/systemui}/wallpapercomponent/package-lock.json (32%) rename {screenlock4merge/features => feature/systemui}/wallpapercomponent/package.json (76%) rename {screenlock4merge/features => feature/systemui}/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts (100%) rename {screenlock4merge/features => feature/systemui}/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets (89%) rename {screenlock4merge/features => feature/systemui}/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts (96%) rename {screenlock4merge/features => feature/systemui}/wallpapercomponent/src/main/module.json5 (100%) rename {screenlock4merge/features => feature/systemui}/wallpapercomponent/src/main/resources/base/element/string.json (100%) rename {screenlock4merge/product/phone/src/main/ets => product/phone/src/main/ets/screenlock}/common/StyleConfiguration.ts (76%) rename {screenlock4merge/product/phone/src/main/ets => product/phone/src/main/ets/screenlock}/common/StyleManager.ts (89%) rename {screenlock4merge/product/phone/src/main/ets => product/phone/src/main/ets/screenlock}/common/constants.ts (100%) rename screenlock4merge/product/phone/src/main/ets/pages/index.ets => product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets (50%) rename {screenlock4merge/product/phone/src/main/ets => product/phone/src/main/ets/screenlock}/pages/customPassword.ets (77%) rename {screenlock4merge/product/phone/src/main/ets => product/phone/src/main/ets/screenlock}/pages/customscreenlock.ets (93%) rename {screenlock4merge/product/phone/src/main/ets => product/phone/src/main/ets/screenlock}/pages/digitalPassword.ets (77%) rename {screenlock4merge/product/phone/src/main/ets => product/phone/src/main/ets/screenlock}/pages/journalscreenlock.ets (93%) rename {screenlock4merge/product/phone/src/main/ets => product/phone/src/main/ets/screenlock}/pages/mixedPassword.ets (77%) rename {screenlock4merge/product/phone/src/main/ets => product/phone/src/main/ets/screenlock}/pages/slidescreenlock.ets (83%) rename {screenlock4merge/product/phone/src/main/ets => product/phone/src/main/ets/screenlock}/vm/indexViewModel.ts (79%) rename {screenlock4merge/product/phone/src/main/ets => product/phone/src/main/ets/screenlock}/vm/slideScreenLockViewModel.ts (93%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/element/color.json (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/element/float.json (89%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/bg.png (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/delete_all.png (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_close.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_hollow_dot.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_notification_down.png (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_notification_up.png (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_public_delete_filled.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_public_lock_filled.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_public_settings_filled.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_public_unlock_filled.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_solid_dot.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/ic_user_portrait.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/lock.png (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/reboot.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/send.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/shutdown.svg (100%) rename {screenlock4merge/product => product}/phone/src/main/resources/base/media/unlock.png (100%) delete mode 100644 screenlock4merge/AppScope/app.json5 delete mode 100644 screenlock4merge/AppScope/resources/base/element/string.json delete mode 100644 screenlock4merge/AppScope/resources/base/media/app_icon.png delete mode 100644 screenlock4merge/common/package-lock.json delete mode 100644 screenlock4merge/common/package.json delete mode 100644 screenlock4merge/common/src/main/ets/components/MainPage/MainPage.ets delete mode 100644 screenlock4merge/common/src/main/ets/default/CheckEmptyUtils.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/Constants.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/Decorators.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/Log.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/ReadConfigUtil.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/ScreenLockManager.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/SingleInstanceHelper.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/StyleConfiguration.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/StyleManager.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/SwitchUserManager.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/SysFaultLogger.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/TimeManager.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/Trace.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/WindowManager.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/abilitymanager/abilityManager.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/abilitymanager/bundleManager.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/abilitymanager/notificationManager.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/commonEvent/CommonEventManager.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/event/EventBus.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/event/EventManager.ts delete mode 100644 screenlock4merge/common/src/main/ets/default/event/EventUtil.ts delete mode 100644 screenlock4merge/common/src/main/module.json5 delete mode 100644 screenlock4merge/common/src/main/resources/base/element/float.json delete mode 100644 screenlock4merge/common/src/main/resources/base/element/string.json delete mode 100644 screenlock4merge/common/src/main/resources/en_US/element/string.json delete mode 100644 screenlock4merge/common/src/main/resources/phone/element/float.json delete mode 100644 screenlock4merge/common/src/main/resources/zh_CN/element/string.json delete mode 100644 screenlock4merge/entry/build-profile.json5 delete mode 100644 screenlock4merge/entry/hvigorfile.js delete mode 100644 screenlock4merge/entry/package-lock.json delete mode 100644 screenlock4merge/entry/package.json delete mode 100644 screenlock4merge/entry/src/main/ets/Application/AbilityStage.ts delete mode 100644 screenlock4merge/entry/src/main/ets/MainAbility/MainAbility.ts delete mode 100644 screenlock4merge/entry/src/main/ets/pages/index.ets delete mode 100644 screenlock4merge/entry/src/main/module.json5 delete mode 100644 screenlock4merge/entry/src/main/resources/base/element/color.json delete mode 100644 screenlock4merge/entry/src/main/resources/base/element/string.json delete mode 100644 screenlock4merge/entry/src/main/resources/base/media/icon.png delete mode 100644 screenlock4merge/entry/src/main/resources/base/profile/main_pages.json delete mode 100644 screenlock4merge/features/datetimecomponent/src/main/ets/components/MainPage/MainPage.ets delete mode 100644 screenlock4merge/features/screenlock/package-lock.json delete mode 100644 screenlock4merge/features/screenlock/src/main/ets/components/MainPage/MainPage.ets delete mode 100644 screenlock4merge/features/shortcutcomponent/.gitignore delete mode 100644 screenlock4merge/features/shortcutcomponent/src/main/ets/components/MainPage/MainPage.ets delete mode 100644 screenlock4merge/features/wallpapercomponent/.gitignore delete mode 100644 screenlock4merge/features/wallpapercomponent/build-profile.json5 delete mode 100644 screenlock4merge/features/wallpapercomponent/hvigorfile.js delete mode 100644 screenlock4merge/features/wallpapercomponent/index.ets delete mode 100644 screenlock4merge/features/wallpapercomponent/src/main/ets/components/MainPage/MainPage.ets delete mode 100644 screenlock4merge/infra/config_exts.gradle delete mode 100644 screenlock4merge/product/phone/.gitignore delete mode 100644 screenlock4merge/product/phone/build-profile.json5 delete mode 100644 screenlock4merge/product/phone/build.gradle delete mode 100644 screenlock4merge/product/phone/hvigorfile.js delete mode 100644 screenlock4merge/product/phone/package-lock.json delete mode 100644 screenlock4merge/product/phone/package.json delete mode 100644 screenlock4merge/product/phone/src/main/ets/AbilityStage.ts delete mode 100644 screenlock4merge/product/phone/src/main/ets/Application/AbilityStage.ts delete mode 100644 screenlock4merge/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts delete mode 100644 screenlock4merge/product/phone/src/main/module.json5 delete mode 100644 screenlock4merge/product/phone/src/main/resources/base/element/string.json delete mode 100644 screenlock4merge/product/phone/src/main/resources/base/media/icon.png delete mode 100644 screenlock4merge/product/phone/src/main/resources/base/profile/main_pages.json delete mode 100644 screenlock4merge/product/phone/src/main/resources/en_US/element/string.json delete mode 100644 screenlock4merge/product/phone/src/main/resources/zh_CN/element/string.json delete mode 100644 screenlock4merge/signature/systemui.p7b diff --git a/build-profile.json5 b/build-profile.json5 index 4b226b96..ffd3e056 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -404,6 +404,54 @@ ] } ] + }, + { + "name": "screenlock", + "srcPath": "./feature/systemui/screenlock", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "datetimecomponent", + "srcPath": "./feature/systemui/datetimecomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "shortcutcomponent", + "srcPath": "./feature/systemui/shortcutcomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "wallpapercomponent", + "srcPath": "./feature/systemui/wallpapercomponent", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] } ], } \ No newline at end of file diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts index fa62e1a5..80b022a2 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts @@ -40,7 +40,7 @@ export enum DesktopState { @Observed export class HWScreenSession { public readonly session: screenSessionManager.ScreenSession; - public bounds: screenSessionManager.RRect = { + public bounds: screenSessionManager.RRect = { // bounds单位vp left: 0, top: 0, width: 0, diff --git a/screenlock4merge/common/src/main/ets/default/DateTimeCommon.ts b/common/src/main/ets/default/DateTimeCommon.ts similarity index 96% rename from screenlock4merge/common/src/main/ets/default/DateTimeCommon.ts rename to common/src/main/ets/default/DateTimeCommon.ts index adbb121b..a96e1e10 100644 --- a/screenlock4merge/common/src/main/ets/default/DateTimeCommon.ts +++ b/common/src/main/ets/default/DateTimeCommon.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ConvertLunarCalendar } from '../../../../../common/src/main/ets/default/LunarCalendar' +import { ConvertLunarCalendar } from './LunarCalendar' export class DateTimeCommon { getSystemTime(isUsing24hFormat: boolean) { diff --git a/screenlock4merge/common/src/main/ets/default/LunarCalendar.ts b/common/src/main/ets/default/LunarCalendar.ts similarity index 100% rename from screenlock4merge/common/src/main/ets/default/LunarCalendar.ts rename to common/src/main/ets/default/LunarCalendar.ts diff --git a/screenlock4merge/common/src/main/ets/default/ScreenLockCommon.ts b/common/src/main/ets/default/ScreenLockCommon.ts similarity index 97% rename from screenlock4merge/common/src/main/ets/default/ScreenLockCommon.ts rename to common/src/main/ets/default/ScreenLockCommon.ts index 126c9d56..8f5fc4a2 100644 --- a/screenlock4merge/common/src/main/ets/default/ScreenLockCommon.ts +++ b/common/src/main/ets/default/ScreenLockCommon.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from './Log'; +import { Log } from './utils/Log'; import AbilityManager from '../default/abilitymanager/abilityManager' const TAG = 'ScreenLock-ScreenLockCommon'; diff --git a/common/src/main/ets/default/SysFaultLogger.ts b/common/src/main/ets/default/SysFaultLogger.ts index e96010d7..3403eaec 100644 --- a/common/src/main/ets/default/SysFaultLogger.ts +++ b/common/src/main/ets/default/SysFaultLogger.ts @@ -23,7 +23,10 @@ const APP_LOG_NAME: string = "SYSTEMUI_FAULT"; export enum FaultID { META_DIAGRAM_JUMP = "META_DIAGRAM_JUMP", WORKER_ERROR = "WORKER_ABNORMAL_OCCURRENCE", - NOTIFICATION_ADD = "FAILED_NOTIFICATION_ADD" + NOTIFICATION_ADD = "FAILED_NOTIFICATION_ADD", + MEMORY = "MEMORY_MONITOR", + SCREEN_LOCK_MANAGER = "CONNECT_SCREENLOCKMANAGERSERVICE_ABNORMAL", + ACCOUNT_SYSTEM = "ACCOUNTSYSTEM_CALL_ABNORMAL" } export function writeFaultLog(logParam: object) { diff --git a/common/src/main/ets/default/Trace.ts b/common/src/main/ets/default/Trace.ts index 838cb2a0..d4d1ee65 100644 --- a/common/src/main/ets/default/Trace.ts +++ b/common/src/main/ets/default/Trace.ts @@ -25,6 +25,12 @@ export default class Trace { static readonly CORE_METHOD_CLICK_CAPSULE = 'clickCapsuleEvent'; static readonly CORE_METHOD_CLICK_NOTIFICATION = 'clickNotificationEvent'; static readonly CORE_METHOD_START_VOLUMEPANEL = 'startVolumePanel'; + static readonly CORE_METHOD_UNLOCK_SCREEN = "unlockScreen" + static readonly CORE_METHOD_CALL_ACCOUNT_SYSTEM = "callAccountSubsystem"; + static readonly CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT = "passingAccountSubsystemResult"; + static readonly CORE_METHOD_HIDE_PSD_PAGE = "hidePsdPage"; + static readonly CORE_METHOD_SHOW_LOCK_SCREEN = "showLockScreen"; + static readonly CORE_METHOD_SLEEP_TO_LOCK_SCREEN = "sleepToLockScreen" private static readonly TRACE_TAG = 'Systemui:Trace'; private static readonly RECORD_TRACE = true; diff --git a/common/src/main/ets/default/WindowPanelManager.ts b/common/src/main/ets/default/WindowPanelManager.ts index 156f8bbd..db8f1ea1 100644 --- a/common/src/main/ets/default/WindowPanelManager.ts +++ b/common/src/main/ets/default/WindowPanelManager.ts @@ -33,7 +33,8 @@ export const SystemUi_ControlPanel: string = 'SystemUi_ControlPanel'; export const SystemUi_VolumePanel: string = 'SystemUi_VolumePanel'; export const SystemUi_BannerNotice: string = 'SystemUi_BannerNotice'; export const SystemUi_SplitBar: string = 'SystemUi_SplitBar'; -export const SystemUi_PrivacyIndicator: string = 'SystemUi_PrivacyIndicator' +export const SystemUi_PrivacyIndicator: string = 'SystemUi_PrivacyIndicator'; +export const SystemUi_ScreenLock: string = 'SystemUi_ScreenLock'; export enum WindowType { STATUS_BAR = SystemUi_StatusBar, @@ -44,7 +45,8 @@ export enum WindowType { VOLUME_PANEL = SystemUi_VolumePanel, BANNER_NOTICE = SystemUi_BannerNotice, SPLIT_BAR = SystemUi_SplitBar, - PRIVACY_INDICATOR = SystemUi_PrivacyIndicator + PRIVACY_INDICATOR = SystemUi_PrivacyIndicator, + SCREEN_LOCK = SystemUi_ScreenLock, } export const WINDOW_SHOW_HIDE_EVENT = 'WindowShowHideEvent'; diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/common/src/main/ets/default/abilitymanager/abilityManager.ts index 14c5229e..c624d1b1 100644 --- a/common/src/main/ets/default/abilitymanager/abilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/abilityManager.ts @@ -34,6 +34,7 @@ export default class AbilityManager { static readonly ABILITY_NAME_BANNER_NOTICE = 'SystemUi_BannerNotice'; static readonly ABILITY_NAME_APP_LIST = 'SystemUi_AppList'; static readonly ABILITY_NAME_OWNER_WANT = 'Owner_Want'; + static readonly ABILITY_NAME_SCREEN_LOCK = 'SystemUi_ScreenLock'; static setContext(abilityName: string, context): void { Log.showDebug(TAG, `setContext, abilityName: ${abilityName}`); diff --git a/screenlock4merge/common/.gitignore b/feature/systemui/datetimecomponent/.gitignore similarity index 100% rename from screenlock4merge/common/.gitignore rename to feature/systemui/datetimecomponent/.gitignore diff --git a/screenlock4merge/common/build-profile.json5 b/feature/systemui/datetimecomponent/build-profile.json5 similarity index 100% rename from screenlock4merge/common/build-profile.json5 rename to feature/systemui/datetimecomponent/build-profile.json5 diff --git a/screenlock4merge/common/hvigorfile.js b/feature/systemui/datetimecomponent/hvigorfile.ts similarity index 100% rename from screenlock4merge/common/hvigorfile.js rename to feature/systemui/datetimecomponent/hvigorfile.ts diff --git a/screenlock4merge/features/screenlock/index.ets b/feature/systemui/datetimecomponent/index.ets similarity index 89% rename from screenlock4merge/features/screenlock/index.ets rename to feature/systemui/datetimecomponent/index.ets index 2cf6651f..92573f56 100644 --- a/screenlock4merge/features/screenlock/index.ets +++ b/feature/systemui/datetimecomponent/index.ets @@ -13,4 +13,3 @@ * limitations under the License. */ -export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/screenlock4merge/features/datetimecomponent/package-lock.json b/feature/systemui/datetimecomponent/package-lock.json similarity index 31% rename from screenlock4merge/features/datetimecomponent/package-lock.json rename to feature/systemui/datetimecomponent/package-lock.json index 113177a8..b98659b0 100644 --- a/screenlock4merge/features/datetimecomponent/package-lock.json +++ b/feature/systemui/datetimecomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/datetimecomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/screenlock4merge/features/datetimecomponent/package.json b/feature/systemui/datetimecomponent/package.json similarity index 75% rename from screenlock4merge/features/datetimecomponent/package.json rename to feature/systemui/datetimecomponent/package.json index 6b3a089b..5b41fe3e 100644 --- a/screenlock4merge/features/datetimecomponent/package.json +++ b/feature/systemui/datetimecomponent/package.json @@ -10,5 +10,8 @@ "main": "index.ets", "repository": {}, "version": "1.0.0", - "dependencies": {} -} \ No newline at end of file + "type": "module", + "dependencies": { + "@ohos/common": "../../../common" + } +} diff --git a/screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/common/constants.ts b/feature/systemui/datetimecomponent/src/main/ets/com/ohos/common/constants.ts similarity index 100% rename from screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/common/constants.ts rename to feature/systemui/datetimecomponent/src/main/ets/com/ohos/common/constants.ts diff --git a/screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets b/feature/systemui/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets similarity index 94% rename from screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets rename to feature/systemui/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets index f97b6977..e6fc464f 100644 --- a/screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets +++ b/feature/systemui/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log' import ViewModel from '../../vm/dateTimeViewModel' import Constants from '../../common/constants' -import { ScreenLockStatus } from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon' +import { ScreenLockStatus } from '@ohos/common/src/main/ets/default/ScreenLockCommon' import deviceInfo from '@ohos.deviceInfo'; import i18n from '@ohos.i18n'; diff --git a/screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts b/feature/systemui/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts similarity index 88% rename from screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts rename to feature/systemui/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts index e013bc86..414a2509 100644 --- a/screenlock4merge/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts +++ b/feature/systemui/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts @@ -15,11 +15,11 @@ import featureAbility from '@ohos.ability.featureAbility' import commonEvent from '@ohos.commonEvent'; -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import DateTimeCommon from '../../../../../../../../common/src/main/ets/default/DateTimeCommon' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log' +import DateTimeCommon from '@ohos/common/src/main/ets/default/DateTimeCommon' import sTimeManager, {TimeEventArgs, TIME_CHANGE_EVENT, -} from '../../../../../../../../common/src/main/ets/default/TimeManager'; -import EventManager, {unsubscribe} from '../../../../../../../../common/src/main/ets/default/event/EventManager' +} from '@ohos/common/src/main/ets/default/TimeManager'; +import EventManager, {unsubscribe} from '@ohos/common/src/main/ets/default/event/EventManager' const TAG = 'ScreenLock-DateTimeViewModel' diff --git a/screenlock4merge/features/datetimecomponent/src/main/module.json5 b/feature/systemui/datetimecomponent/src/main/module.json5 similarity index 100% rename from screenlock4merge/features/datetimecomponent/src/main/module.json5 rename to feature/systemui/datetimecomponent/src/main/module.json5 diff --git a/screenlock4merge/features/datetimecomponent/src/main/resources/base/element/color.json b/feature/systemui/datetimecomponent/src/main/resources/base/element/color.json similarity index 100% rename from screenlock4merge/features/datetimecomponent/src/main/resources/base/element/color.json rename to feature/systemui/datetimecomponent/src/main/resources/base/element/color.json diff --git a/screenlock4merge/features/datetimecomponent/src/main/resources/base/element/float.json b/feature/systemui/datetimecomponent/src/main/resources/base/element/float.json similarity index 100% rename from screenlock4merge/features/datetimecomponent/src/main/resources/base/element/float.json rename to feature/systemui/datetimecomponent/src/main/resources/base/element/float.json diff --git a/screenlock4merge/features/datetimecomponent/src/main/resources/base/element/string.json b/feature/systemui/datetimecomponent/src/main/resources/base/element/string.json similarity index 100% rename from screenlock4merge/features/datetimecomponent/src/main/resources/base/element/string.json rename to feature/systemui/datetimecomponent/src/main/resources/base/element/string.json diff --git a/screenlock4merge/features/datetimecomponent/src/main/resources/en_US/element/string.json b/feature/systemui/datetimecomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from screenlock4merge/features/datetimecomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/datetimecomponent/src/main/resources/en_US/element/string.json diff --git a/screenlock4merge/features/datetimecomponent/src/main/resources/phone/element/float.json b/feature/systemui/datetimecomponent/src/main/resources/phone/element/float.json similarity index 100% rename from screenlock4merge/features/datetimecomponent/src/main/resources/phone/element/float.json rename to feature/systemui/datetimecomponent/src/main/resources/phone/element/float.json diff --git a/screenlock4merge/features/datetimecomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/datetimecomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from screenlock4merge/features/datetimecomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/datetimecomponent/src/main/resources/zh_CN/element/string.json diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index 11a379b3..0f5830fb 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -27,6 +27,7 @@ type NotificationLayoutConfig = { @Component export default struct NotificationListComponent { + isScreenLock: boolean = false; // 当长通知消息展开时,这里用于重新刷新item布局,扩展高度 @Provide('notificationUpdate') update: number = 0; @StorageLink('notificationList') notificationList: any[] = []; @@ -66,8 +67,9 @@ export default struct NotificationListComponent { } }, (list: any) => JSON.stringify(list.map((item) => `${item.hashcode}_${item.timestamp}`))) } - .align(Alignment.Top) - .width('100%') - .height('100%') + // 锁屏界面只设置了宽度 + .align(this.isScreenLock ? Alignment.Center : Alignment.Top) + .width(this.isScreenLock ? $r("app.float.notificationList_width") : '100%') + .height(this.isScreenLock ? undefined : '100%') } } \ No newline at end of file diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets index 25e24361..a24d399f 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -31,6 +31,7 @@ export default struct ConfirmDialog { public controller: CustomDialogController public action: () => void + // TODO 锁屏布局参数不同 build() { Column() { Column() { diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets index 1ab6fb88..9d527c35 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -38,6 +38,7 @@ export default struct CustomItem { Log.showInfo(TAG, `template = ${JSON.stringify(this.template)} templateData = ${JSON.stringify(this.templateData)} isDebugMode = ${this.isDebugMode}`); } + // TODO 锁屏布局参数不同 build() { Stack({ alignContent: Alignment.TopEnd }) { Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets index ed5ac8bd..5f85396f 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets @@ -81,6 +81,7 @@ export default struct DevicesDialog { } .margin({ bottom: $r("app.float.device_margin_16") }) + // TODO 锁屏 Row() { Column() { Text($r('app.string.cancel')) diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 3a240999..83802d0a 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -27,6 +27,7 @@ import FocusCallBack from '../../model/SwipeLayoutUtils'; const TAG = 'NoticeItem-GroupItem'; const deviceTypeInfo = deviceInfo.deviceType; +// TODO 锁屏 @Component export default struct GroupItem { @Consume('notificationUpdate') updateFlag: number; diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 5052f107..6d06ad98 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -28,6 +28,7 @@ import {getId} from '../../model/SwipeLayoutUtils'; const TAG = 'NoticeItem-NotificationItem'; const deviceTypeInfo = deviceInfo.deviceType; +// TODO 锁屏 @Component export default struct NotificationItem { @State mIconAlpha: number = 0; diff --git a/feature/systemui/noticeitem/src/main/resources/base/element/float.json b/feature/systemui/noticeitem/src/main/resources/base/element/float.json index b84e1f24..862c2313 100644 --- a/feature/systemui/noticeitem/src/main/resources/base/element/float.json +++ b/feature/systemui/noticeitem/src/main/resources/base/element/float.json @@ -1,5 +1,9 @@ { "float": [ + { + "name": "notificationList_width", + "value": "834vp" + }, { "name": "notification_title_fontsize", "value": "20" diff --git a/feature/systemui/noticeitem/src/main/resources/phone/element/float.json b/feature/systemui/noticeitem/src/main/resources/phone/element/float.json index ebf3f0f5..57844ff9 100644 --- a/feature/systemui/noticeitem/src/main/resources/phone/element/float.json +++ b/feature/systemui/noticeitem/src/main/resources/phone/element/float.json @@ -1,5 +1,9 @@ { "float": [ + { + "name": "notificationList_width", + "value": "336vp" + }, { "name": "title_image_width", "value": "24vp" diff --git a/screenlock4merge/entry/.gitignore b/feature/systemui/screenlock/.gitignore similarity index 100% rename from screenlock4merge/entry/.gitignore rename to feature/systemui/screenlock/.gitignore diff --git a/screenlock4merge/features/datetimecomponent/build-profile.json5 b/feature/systemui/screenlock/build-profile.json5 similarity index 100% rename from screenlock4merge/features/datetimecomponent/build-profile.json5 rename to feature/systemui/screenlock/build-profile.json5 diff --git a/screenlock4merge/features/datetimecomponent/hvigorfile.js b/feature/systemui/screenlock/hvigorfile.ts similarity index 100% rename from screenlock4merge/features/datetimecomponent/hvigorfile.js rename to feature/systemui/screenlock/hvigorfile.ts diff --git a/screenlock4merge/features/datetimecomponent/index.ets b/feature/systemui/screenlock/index.ets similarity index 89% rename from screenlock4merge/features/datetimecomponent/index.ets rename to feature/systemui/screenlock/index.ets index 2cf6651f..92573f56 100644 --- a/screenlock4merge/features/datetimecomponent/index.ets +++ b/feature/systemui/screenlock/index.ets @@ -13,4 +13,3 @@ * limitations under the License. */ -export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/feature/systemui/screenlock/package-lock.json b/feature/systemui/screenlock/package-lock.json new file mode 100644 index 00000000..09ca6ce1 --- /dev/null +++ b/feature/systemui/screenlock/package-lock.json @@ -0,0 +1,55 @@ +{ + "name": "@ohos/screenlock", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/batterycomponent": { + "version": "file:../batterycomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/clockcomponent": { + "version": "file:../clockcomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/common": { + "version": "file:../../../common" + }, + "@ohos/signalcomponent": { + "version": "file:../signalcomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + }, + "@ohos/wificomponent": { + "version": "file:../wificomponent", + "requires": { + "@ohos/common": "file:../../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } + } + } +} diff --git a/screenlock4merge/features/screenlock/package.json b/feature/systemui/screenlock/package.json similarity index 47% rename from screenlock4merge/features/screenlock/package.json rename to feature/systemui/screenlock/package.json index 9374c485..8bb8db07 100644 --- a/screenlock4merge/features/screenlock/package.json +++ b/feature/systemui/screenlock/package.json @@ -10,5 +10,12 @@ "main": "index.ets", "repository": {}, "version": "1.0.0", - "dependencies": {} + "dependencies": { + "@ohos/common": "../../../common", + "@ohos/batterycomponent": "../batterycomponent", + "@ohos/clockcomponent": "../clockcomponent", + "@ohos/signalcomponent": "../signalcomponent", + "@ohos/wificomponent": "../wificomponent" + }, + "type": "module" } diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/common/constants.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/common/constants.ts similarity index 100% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/common/constants.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/common/constants.ts diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/data/userData.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/data/userData.ts similarity index 100% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/data/userData.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/data/userData.ts diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/model/accountsModel.ts similarity index 94% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index 29ca8a30..89d059ff 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -17,13 +17,13 @@ import osAccount from '@ohos.account.osAccount' import commonEvent from '@ohos.commonEvent'; import util from '@ohos.util'; -import {Callback} from '@ohos.base'; -import Trace from '../../../../../../../../common/src/main/ets/default/Trace'; -import {SysFaultLogger, FaultID} from '../../../../../../../../common/src/main/ets/default/SysFaultLogger'; -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import { CommonEventManager, getCommonEventManager } from "../../../../../../../../common/src/main/ets/default/commonEvent/CommonEventManager"; -import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager"; -import { obtainLocalEvent } from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import {Callback} from 'basic'; +import Trace from '@ohos/common/src/main/ets/default/Trace'; +import {SysFaultLogger, FaultID} from '@ohos/common/src/main/ets/default/SysFaultLogger'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { CommonEventManager, getCommonEventManager } from "@ohos/common/src/main/ets/default/commonEvent/CommonEventManager"; +import EventManager from "@ohos/common/src/main/ets/default/event/EventManager"; +import { obtainLocalEvent } from "@ohos/common/src/main/ets/default/event/EventUtil"; import {UserData} from '../data/userData'; const TAG = "ScreenLock-AccountsModel" diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts similarity index 59% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index ea6a0cd3..820185a0 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Trace from '../../../../../../../../common/src/main/ets/default/Trace' -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import {SysFaultLogger, FaultID} from '../../../../../../../../common/src/main/ets/default/SysFaultLogger' +import Trace from '@ohos/common/src/main/ets/default/Trace' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import {SysFaultLogger, FaultID} from '@ohos/common/src/main/ets/default/SysFaultLogger' import ScreenLockMar from '@ohos.screenlock'; -import windowManager from '@ohos.window' +import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowPanelManager' import Constants from '../common/constants' -import { Callback } from '@ohos.base'; +import { Callback } from 'basic'; const TAG = 'ScreenLock-ScreenLockModel'; @@ -33,11 +33,13 @@ export default class ScreenLockModel { callback(event.eventType); }); } catch (err: any) { + // TODO 报错{"code":201},需要修改锁屏管理服务的白名单/etc/param/screenlock.para,主干已经修改为权限 Log.showError(TAG, `on callback error -> ${JSON.stringify(err)}`); } - if (!isSuccess) { - callback('serviceRestart'); - } + // TODO 锁屏流程需要修改适配 +// if (!isSuccess) { +// callback('serviceRestart'); +// } } eventCancelListener(typeName: string) { @@ -56,24 +58,33 @@ export default class ScreenLockModel { showScreenLockWindow(callback: Callback) { Log.showInfo(TAG, `isWallpaperShow is true: ${AppStorage.Get('isWallpaperShow')}`); AppStorage.SetOrCreate('isWallpaperShow', true); - windowManager.find(Constants.WIN_NAME).then((win) => { - win.show().then(() => { - Log.showInfo(TAG, `window show`); - callback(); - }) - }) + WindowPanelManager.showWindow(WindowType.SCREEN_LOCK).then(() => { + Log.showInfo(TAG, `window show`); + callback(); + }); +// windowManager.find(Constants.WIN_NAME).then((win) => { +// win.show().then(() => { +// Log.showInfo(TAG, `window show`); +// callback(); +// }) +// }) } hiddenScreenLockWindow(callback: Callback) { Log.showInfo(TAG, `window hide`); Trace.end(Trace.CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT); - windowManager.find(Constants.WIN_NAME).then((win) => { - Trace.start(Trace.CORE_METHOD_HIDE_PSD_PAGE); - win.hide().then(() => { - Log.showInfo(TAG, `window hide`); - callback(); - AppStorage.SetOrCreate('isWallpaperShow', false); - }) - }) + WindowPanelManager.hideWindow(WindowType.SCREEN_LOCK).then(() => { + Log.showInfo(TAG, `window hide`); + callback(); + AppStorage.SetOrCreate('isWallpaperShow', false); + }); +// windowManager.find(Constants.WIN_NAME).then((win) => { +// Trace.start(Trace.CORE_METHOD_HIDE_PSD_PAGE); +// win.hide().then(() => { +// Log.showInfo(TAG, `window hide`); +// callback(); +// AppStorage.SetOrCreate('isWallpaperShow', false); +// }) +// }) } } diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockService.ts similarity index 95% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index bfc4bb48..6e8bbb2d 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -12,23 +12,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import Trace from '../../../../../../../../common/src/main/ets/default/Trace' -import {WriteFaultLog, FaultID} from '../../../../../../../../common/src/main/ets/default/SysFaultLogger' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import Trace from '@ohos/common/src/main/ets/default/Trace' +import {writeFaultLog, FaultID} from '@ohos/common/src/main/ets/default/SysFaultLogger' import ScreenLockModel from './screenLockModel'; import AccountModel, {AuthType, AuthSubType, AuthTurstLevel} from './accountsModel' -import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon'; -import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper' +import {ScreenLockStatus} from '@ohos/common/src/main/ets/default/ScreenLockCommon'; +import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper' import Router from '@system.router'; import commonEvent from '@ohos.commonEvent'; import hiDebug from '@ohos.hidebug'; import { CommonEventPublishData } from 'commonEvent/commonEventPublishData'; -import {Callback} from '@ohos.base'; +import {Callback} from 'basic'; const TAG = 'ScreenLock-ScreenLockService'; -const URI_DIGITALPASSWORD = 'pages/digitalPassword' -const URI_MIXEDPASSWORD = 'pages/mixedPassword' -const URI_CUSTOMPASSWORD = 'pages/customPassword' +const URI_DIGITALPASSWORD = 'screenlock/pages/digitalPassword' +const URI_MIXEDPASSWORD = 'screenlock/pages/mixedPassword' +const URI_CUSTOMPASSWORD = 'screenlock/pages/customPassword' //Event type name @@ -395,7 +395,7 @@ export class ScreenLockService { const pss = hiDebug.getPss(); Log.showInfo(TAG, `app pss info is: ${pss}`); if (pss > MEMORY_MONITOR_LIMIT_KB) { - WriteFaultLog({FAULT_ID: FaultID.MEMORY, MSG: "pss over limit"}) + writeFaultLog({FAULT_ID: FaultID.MEMORY, MSG: "pss over limit"}) } }, MEMORY_MONITOR_PERIOD_MS) } diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts similarity index 90% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts index 4c8c1da3..911c8c78 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts @@ -12,8 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import {ReadConfigFile} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import {ReadConfigFile} from '@ohos/common/src/main/ets/default/ScreenLockCommon' const SCREENLOCK_MODE_FILE_NAME = "screenlock.json"; const TAG = 'ScreenLock-ScreenlockStyle'; diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/accounts.ets similarity index 93% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets rename to feature/systemui/screenlock/src/main/ets/com/ohos/view/component/accounts.ets index 04591699..135e8116 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/accounts.ets @@ -13,12 +13,12 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import ViewModel from '../../vm/accountsViewModel'; import Constants from '../../common/constants'; import {UserData} from '../../data/userData'; import { ACCOUNTS_REFRESH_EVENT } from '../../model/accountsModel' -import EventManager, { unsubscribe } from '../../../../../../../../../common/src/main/ets/default/event/EventManager'; +import EventManager, { unsubscribe } from '@ohos/common/src/main/ets/default/event/EventManager'; const TAG = 'ScreenLock-Accounts' diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets similarity index 95% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets rename to feature/systemui/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets index d2c4e7d3..974555d4 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants from '../../common/constants' const TAG = 'ScreenLock-BatterySoc' diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets similarity index 98% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets rename to feature/systemui/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index 8ac06a4e..6d32c1de 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard' import ViewModel from '../../vm/customPSDViewModel' diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets similarity index 97% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets rename to feature/systemui/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets index 32497878..a7e6bcef 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard' import ViewModel from '../../vm/digitalPSDViewModel' diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets similarity index 92% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets rename to feature/systemui/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets index a27bdd9d..e9b11865 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets @@ -13,8 +13,8 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log' -import {ScreenLockStatus} from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import {ScreenLockStatus} from '@ohos/common/src/main/ets/default/ScreenLockCommon' import ViewModel from '../../vm/lockIconViewModel' import Constants from '../../common/constants' diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets similarity index 99% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets rename to feature/systemui/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets index 883f18ba..81413cb3 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants from '../../common/constants' import ViewModel from '../../vm/mixedPSDViewModel' import deviceInfo from '@ohos.deviceInfo'; diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets similarity index 98% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets rename to feature/systemui/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets index d76375b0..6b7f9c84 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants from '../../common/constants' import BaseViewModel from '../../vm/baseViewModel' import deviceInfo from '@ohos.deviceInfo'; diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets similarity index 78% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets rename to feature/systemui/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets index 128bab7b..595cfd17 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets @@ -13,13 +13,13 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import ViewModel from '../../vm/StatusBarVM' import Constants from '../../common/constants' -import BatteryIcon from '../../../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' -import ClockIcon from '../../../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' -import WifiIcon from '../../../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' -import SignalIcon from '../../../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon' +import BatteryIcon from '@ohos/batterycomponent/src/main/ets/default/pages/batteryIcon' +import ClockIcon from '@ohos/clockcomponent/src/main/ets/default/pages/clockIcon' +import WifiIcon from '@ohos/wificomponent/src/main/ets/default/pages/wifiIcon' +import SignalIcon from '@ohos/signalcomponent/src/main/ets/default/pages/signalIcon' import deviceInfo from '@ohos.deviceInfo'; const deviceTypeInfo = deviceInfo.deviceType diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts similarity index 90% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts index 4cc5cce5..54db2a92 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import WindowManager, { WindowType } from '../../../../../../../../common/src/main/ets/default/WindowManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import WindowManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowPanelManager'; import Constants, {StatusBarGroupComponentData} from '../common/constants'; const TAG = 'StatusBarVM'; diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts similarity index 92% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts index 6718d2aa..c616a943 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/accountsViewModel.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import ScreenLockService from '../model/screenLockService' const TAG = "ScreenLock-AccountsViewModel" diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts similarity index 97% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts index d42fd5f7..5aba1334 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants from '../common/constants' import service, {UnlockResult, AuthType, AuthSubType} from '../model/screenLockService' -import {Callback} from '@ohos.base'; +import {Callback} from 'basic'; const TAG = 'ScreenLock-BaseViewModel' const MINUTE_NM = '分钟' diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets similarity index 93% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets rename to feature/systemui/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets index 8c8ca34b..6367ea9f 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'ScreenLock-BatterySocViewModel' diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts similarity index 94% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts index 4655c77a..9356f4da 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts @@ -13,11 +13,11 @@ * limitations under the License. */ -import Trace from '../../../../../../../../common/src/main/ets/default/Trace' -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Trace from '@ohos/common/src/main/ets/default/Trace' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Constants from '../common/constants' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' -import {Callback} from '@ohos.base'; +import {Callback} from 'basic'; const TAG = 'ScreenLock-CustomPSDViewModel' diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts similarity index 95% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts index 65c267c6..332c06af 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import Trace from '../../../../../../../../common/src/main/ets/default/Trace' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import Trace from '@ohos/common/src/main/ets/default/Trace' import Constants from '../common/constants' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' -import {Callback} from '@ohos.base'; +import {Callback} from 'basic'; const TAG = 'ScreenLock-DigitalPSDViewModel' diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts similarity index 93% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts index 4ac29aae..751334e6 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import {ScreenLockStatus} from '@ohos/common/src/main/ets/default/ScreenLockCommon' import screenLockService from '../model/screenLockService' const TAG = 'ScreenLock-LockIconViewModel' diff --git a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts similarity index 90% rename from screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts rename to feature/systemui/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts index d502cab6..0b1d6f84 100644 --- a/screenlock4merge/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts @@ -13,10 +13,10 @@ * limitations under the License. */ -import Trace from '../../../../../../../../common/src/main/ets/default/Trace' -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Trace from '@ohos/common/src/main/ets/default/Trace' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' -import {Callback} from '@ohos.base'; +import {Callback} from 'basic'; const TAG = 'ScreenLock-MixedPSDViewModel' diff --git a/screenlock4merge/features/screenlock/src/main/module.json5 b/feature/systemui/screenlock/src/main/module.json5 similarity index 100% rename from screenlock4merge/features/screenlock/src/main/module.json5 rename to feature/systemui/screenlock/src/main/module.json5 diff --git a/screenlock4merge/features/screenlock/src/main/resources/base/element/color.json b/feature/systemui/screenlock/src/main/resources/base/element/color.json similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/base/element/color.json rename to feature/systemui/screenlock/src/main/resources/base/element/color.json diff --git a/screenlock4merge/features/screenlock/src/main/resources/base/element/float.json b/feature/systemui/screenlock/src/main/resources/base/element/float.json similarity index 96% rename from screenlock4merge/features/screenlock/src/main/resources/base/element/float.json rename to feature/systemui/screenlock/src/main/resources/base/element/float.json index aaab9765..0ade2ebc 100644 --- a/screenlock4merge/features/screenlock/src/main/resources/base/element/float.json +++ b/feature/systemui/screenlock/src/main/resources/base/element/float.json @@ -224,14 +224,6 @@ "name": "numkeyBoard_rowsGap", "value": "0" }, - { - "name": "status_bar_height", - "value": "48vp" - }, - { - "name": "status_bar_padding_left_right", - "value": "0" - }, { "name": "status_bar_margin_top", "value": "0" diff --git a/screenlock4merge/features/screenlock/src/main/resources/base/element/string.json b/feature/systemui/screenlock/src/main/resources/base/element/string.json similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/base/element/string.json rename to feature/systemui/screenlock/src/main/resources/base/element/string.json diff --git a/screenlock4merge/features/screenlock/src/main/resources/base/media/delete_all.png b/feature/systemui/screenlock/src/main/resources/base/media/delete_all.png similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/base/media/delete_all.png rename to feature/systemui/screenlock/src/main/resources/base/media/delete_all.png diff --git a/screenlock4merge/features/screenlock/src/main/resources/base/media/ic_hollow_dot.svg b/feature/systemui/screenlock/src/main/resources/base/media/ic_hollow_dot.svg similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/base/media/ic_hollow_dot.svg rename to feature/systemui/screenlock/src/main/resources/base/media/ic_hollow_dot.svg diff --git a/screenlock4merge/features/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg b/feature/systemui/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg rename to feature/systemui/screenlock/src/main/resources/base/media/ic_public_lock_filled.svg diff --git a/screenlock4merge/features/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg b/feature/systemui/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg rename to feature/systemui/screenlock/src/main/resources/base/media/ic_public_unlock_filled.svg diff --git a/screenlock4merge/features/screenlock/src/main/resources/base/media/ic_solid_dot.svg b/feature/systemui/screenlock/src/main/resources/base/media/ic_solid_dot.svg similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/base/media/ic_solid_dot.svg rename to feature/systemui/screenlock/src/main/resources/base/media/ic_solid_dot.svg diff --git a/screenlock4merge/features/screenlock/src/main/resources/base/media/ic_user_portrait.svg b/feature/systemui/screenlock/src/main/resources/base/media/ic_user_portrait.svg similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/base/media/ic_user_portrait.svg rename to feature/systemui/screenlock/src/main/resources/base/media/ic_user_portrait.svg diff --git a/screenlock4merge/features/screenlock/src/main/resources/base/media/lock.png b/feature/systemui/screenlock/src/main/resources/base/media/lock.png similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/base/media/lock.png rename to feature/systemui/screenlock/src/main/resources/base/media/lock.png diff --git a/screenlock4merge/features/screenlock/src/main/resources/base/media/unlock.png b/feature/systemui/screenlock/src/main/resources/base/media/unlock.png similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/base/media/unlock.png rename to feature/systemui/screenlock/src/main/resources/base/media/unlock.png diff --git a/screenlock4merge/features/screenlock/src/main/resources/en_US/element/string.json b/feature/systemui/screenlock/src/main/resources/en_US/element/string.json similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/en_US/element/string.json rename to feature/systemui/screenlock/src/main/resources/en_US/element/string.json diff --git a/screenlock4merge/features/screenlock/src/main/resources/phone/element/float.json b/feature/systemui/screenlock/src/main/resources/phone/element/float.json similarity index 96% rename from screenlock4merge/features/screenlock/src/main/resources/phone/element/float.json rename to feature/systemui/screenlock/src/main/resources/phone/element/float.json index c50dbbaa..ecfb87bc 100644 --- a/screenlock4merge/features/screenlock/src/main/resources/phone/element/float.json +++ b/feature/systemui/screenlock/src/main/resources/phone/element/float.json @@ -224,14 +224,6 @@ "name": "numkeyBoard_rowsGap", "value": "22vp" }, - { - "name": "status_bar_height", - "value": "24vp" - }, - { - "name": "status_bar_padding_left_right", - "value": "24vp" - }, { "name": "status_bar_margin_top", "value": "4vp" diff --git a/screenlock4merge/features/screenlock/src/main/resources/phone/element/string.json b/feature/systemui/screenlock/src/main/resources/phone/element/string.json similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/phone/element/string.json rename to feature/systemui/screenlock/src/main/resources/phone/element/string.json diff --git a/screenlock4merge/features/screenlock/src/main/resources/rawfile/antiTouch.json b/feature/systemui/screenlock/src/main/resources/rawfile/antiTouch.json similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/rawfile/antiTouch.json rename to feature/systemui/screenlock/src/main/resources/rawfile/antiTouch.json diff --git a/screenlock4merge/features/screenlock/src/main/resources/rawfile/screenlock.json b/feature/systemui/screenlock/src/main/resources/rawfile/screenlock.json similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/rawfile/screenlock.json rename to feature/systemui/screenlock/src/main/resources/rawfile/screenlock.json diff --git a/screenlock4merge/features/screenlock/src/main/resources/zh_CN/element/string.json b/feature/systemui/screenlock/src/main/resources/zh_CN/element/string.json similarity index 100% rename from screenlock4merge/features/screenlock/src/main/resources/zh_CN/element/string.json rename to feature/systemui/screenlock/src/main/resources/zh_CN/element/string.json diff --git a/screenlock4merge/features/datetimecomponent/.gitignore b/feature/systemui/shortcutcomponent/.gitignore similarity index 100% rename from screenlock4merge/features/datetimecomponent/.gitignore rename to feature/systemui/shortcutcomponent/.gitignore diff --git a/screenlock4merge/features/screenlock/build-profile.json5 b/feature/systemui/shortcutcomponent/build-profile.json5 similarity index 100% rename from screenlock4merge/features/screenlock/build-profile.json5 rename to feature/systemui/shortcutcomponent/build-profile.json5 diff --git a/screenlock4merge/features/screenlock/hvigorfile.js b/feature/systemui/shortcutcomponent/hvigorfile.ts similarity index 100% rename from screenlock4merge/features/screenlock/hvigorfile.js rename to feature/systemui/shortcutcomponent/hvigorfile.ts diff --git a/screenlock4merge/features/shortcutcomponent/index.ets b/feature/systemui/shortcutcomponent/index.ets similarity index 89% rename from screenlock4merge/features/shortcutcomponent/index.ets rename to feature/systemui/shortcutcomponent/index.ets index 2cf6651f..92573f56 100644 --- a/screenlock4merge/features/shortcutcomponent/index.ets +++ b/feature/systemui/shortcutcomponent/index.ets @@ -13,4 +13,3 @@ * limitations under the License. */ -export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/screenlock4merge/features/shortcutcomponent/package-lock.json b/feature/systemui/shortcutcomponent/package-lock.json similarity index 31% rename from screenlock4merge/features/shortcutcomponent/package-lock.json rename to feature/systemui/shortcutcomponent/package-lock.json index fef5628d..40d60efe 100644 --- a/screenlock4merge/features/shortcutcomponent/package-lock.json +++ b/feature/systemui/shortcutcomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/shortcutcomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/screenlock4merge/features/shortcutcomponent/package.json b/feature/systemui/shortcutcomponent/package.json similarity index 76% rename from screenlock4merge/features/shortcutcomponent/package.json rename to feature/systemui/shortcutcomponent/package.json index 3c45ae0b..4e9c7226 100644 --- a/screenlock4merge/features/shortcutcomponent/package.json +++ b/feature/systemui/shortcutcomponent/package.json @@ -10,5 +10,8 @@ "main": "index.ets", "repository": {}, "version": "1.0.0", - "dependencies": {} + "type": "module", + "dependencies": { + "@ohos/common": "../../../common" + } } diff --git a/screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts b/feature/systemui/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts similarity index 100% rename from screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts rename to feature/systemui/shortcutcomponent/src/main/ets/com/ohos/common/constants.ts diff --git a/screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets b/feature/systemui/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets similarity index 97% rename from screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets rename to feature/systemui/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets index 933da1e2..fae1dbbb 100644 --- a/screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets +++ b/feature/systemui/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log' import Constants from '../../common/constants' import ViewModel from '../../vm/shortcutViewModel' import power from '@ohos.power' diff --git a/screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts b/feature/systemui/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts similarity index 94% rename from screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts rename to feature/systemui/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts index cc897a59..31114cb2 100644 --- a/screenlock4merge/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts +++ b/feature/systemui/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log' import Constants from '../common/constants' import power from '@ohos.power' diff --git a/screenlock4merge/features/shortcutcomponent/src/main/module.json5 b/feature/systemui/shortcutcomponent/src/main/module.json5 similarity index 100% rename from screenlock4merge/features/shortcutcomponent/src/main/module.json5 rename to feature/systemui/shortcutcomponent/src/main/module.json5 diff --git a/screenlock4merge/features/shortcutcomponent/src/main/resources/base/element/color.json b/feature/systemui/shortcutcomponent/src/main/resources/base/element/color.json similarity index 100% rename from screenlock4merge/features/shortcutcomponent/src/main/resources/base/element/color.json rename to feature/systemui/shortcutcomponent/src/main/resources/base/element/color.json diff --git a/screenlock4merge/features/shortcutcomponent/src/main/resources/base/element/float.json b/feature/systemui/shortcutcomponent/src/main/resources/base/element/float.json similarity index 100% rename from screenlock4merge/features/shortcutcomponent/src/main/resources/base/element/float.json rename to feature/systemui/shortcutcomponent/src/main/resources/base/element/float.json diff --git a/screenlock4merge/features/shortcutcomponent/src/main/resources/base/element/string.json b/feature/systemui/shortcutcomponent/src/main/resources/base/element/string.json similarity index 100% rename from screenlock4merge/features/shortcutcomponent/src/main/resources/base/element/string.json rename to feature/systemui/shortcutcomponent/src/main/resources/base/element/string.json diff --git a/screenlock4merge/features/shortcutcomponent/src/main/resources/base/media/reboot.svg b/feature/systemui/shortcutcomponent/src/main/resources/base/media/reboot.svg similarity index 100% rename from screenlock4merge/features/shortcutcomponent/src/main/resources/base/media/reboot.svg rename to feature/systemui/shortcutcomponent/src/main/resources/base/media/reboot.svg diff --git a/screenlock4merge/features/shortcutcomponent/src/main/resources/base/media/shutdown.svg b/feature/systemui/shortcutcomponent/src/main/resources/base/media/shutdown.svg similarity index 100% rename from screenlock4merge/features/shortcutcomponent/src/main/resources/base/media/shutdown.svg rename to feature/systemui/shortcutcomponent/src/main/resources/base/media/shutdown.svg diff --git a/screenlock4merge/features/shortcutcomponent/src/main/resources/en_US/element/string.json b/feature/systemui/shortcutcomponent/src/main/resources/en_US/element/string.json similarity index 100% rename from screenlock4merge/features/shortcutcomponent/src/main/resources/en_US/element/string.json rename to feature/systemui/shortcutcomponent/src/main/resources/en_US/element/string.json diff --git a/screenlock4merge/features/shortcutcomponent/src/main/resources/zh_CN/element/string.json b/feature/systemui/shortcutcomponent/src/main/resources/zh_CN/element/string.json similarity index 100% rename from screenlock4merge/features/shortcutcomponent/src/main/resources/zh_CN/element/string.json rename to feature/systemui/shortcutcomponent/src/main/resources/zh_CN/element/string.json diff --git a/screenlock4merge/features/screenlock/.gitignore b/feature/systemui/wallpapercomponent/.gitignore similarity index 100% rename from screenlock4merge/features/screenlock/.gitignore rename to feature/systemui/wallpapercomponent/.gitignore diff --git a/screenlock4merge/features/shortcutcomponent/build-profile.json5 b/feature/systemui/wallpapercomponent/build-profile.json5 similarity index 100% rename from screenlock4merge/features/shortcutcomponent/build-profile.json5 rename to feature/systemui/wallpapercomponent/build-profile.json5 diff --git a/screenlock4merge/features/shortcutcomponent/hvigorfile.js b/feature/systemui/wallpapercomponent/hvigorfile.ts similarity index 100% rename from screenlock4merge/features/shortcutcomponent/hvigorfile.js rename to feature/systemui/wallpapercomponent/hvigorfile.ts diff --git a/screenlock4merge/common/index.ets b/feature/systemui/wallpapercomponent/index.ets similarity index 89% rename from screenlock4merge/common/index.ets rename to feature/systemui/wallpapercomponent/index.ets index 2cf6651f..92573f56 100644 --- a/screenlock4merge/common/index.ets +++ b/feature/systemui/wallpapercomponent/index.ets @@ -13,4 +13,3 @@ * limitations under the License. */ -export { MainPage } from './src/main/ets/components/MainPage/MainPage' diff --git a/screenlock4merge/features/wallpapercomponent/package-lock.json b/feature/systemui/wallpapercomponent/package-lock.json similarity index 32% rename from screenlock4merge/features/wallpapercomponent/package-lock.json rename to feature/systemui/wallpapercomponent/package-lock.json index 0556d065..ad148b43 100644 --- a/screenlock4merge/features/wallpapercomponent/package-lock.json +++ b/feature/systemui/wallpapercomponent/package-lock.json @@ -1,5 +1,11 @@ { "name": "@ohos/wallpapercomponent", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/common": { + "version": "file:../../../common" + } + } } diff --git a/screenlock4merge/features/wallpapercomponent/package.json b/feature/systemui/wallpapercomponent/package.json similarity index 76% rename from screenlock4merge/features/wallpapercomponent/package.json rename to feature/systemui/wallpapercomponent/package.json index a9b279f1..8bbfd79e 100644 --- a/screenlock4merge/features/wallpapercomponent/package.json +++ b/feature/systemui/wallpapercomponent/package.json @@ -10,5 +10,8 @@ "main": "index.ets", "repository": {}, "version": "1.0.0", - "dependencies": {} + "type": "module", + "dependencies": { + "@ohos/common": "../../../common" + } } diff --git a/screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts b/feature/systemui/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts similarity index 100% rename from screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts rename to feature/systemui/wallpapercomponent/src/main/ets/com/ohos/common/constants.ts diff --git a/screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets b/feature/systemui/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets similarity index 89% rename from screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets rename to feature/systemui/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets index 36cb18b5..96ab18f6 100644 --- a/screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets +++ b/feature/systemui/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets @@ -13,10 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log' import ViewModel from '../../vm/wallpaperViewModel' import Constants from '../../common/constants' -import Trace from '../../../../../../../../../common/src/main/ets/default/Trace' const TAG = 'ScreenLock-Wallpaper' diff --git a/screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts b/feature/systemui/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts similarity index 96% rename from screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts rename to feature/systemui/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts index 3d2608e6..c229111c 100644 --- a/screenlock4merge/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts +++ b/feature/systemui/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts @@ -15,7 +15,7 @@ import image from '@ohos.multimedia.image'; import WallpaperMar from '@ohos.wallpaper' -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log' const TAG = 'ScreenLock-WallpaperViewModel' diff --git a/screenlock4merge/features/wallpapercomponent/src/main/module.json5 b/feature/systemui/wallpapercomponent/src/main/module.json5 similarity index 100% rename from screenlock4merge/features/wallpapercomponent/src/main/module.json5 rename to feature/systemui/wallpapercomponent/src/main/module.json5 diff --git a/screenlock4merge/features/wallpapercomponent/src/main/resources/base/element/string.json b/feature/systemui/wallpapercomponent/src/main/resources/base/element/string.json similarity index 100% rename from screenlock4merge/features/wallpapercomponent/src/main/resources/base/element/string.json rename to feature/systemui/wallpapercomponent/src/main/resources/base/element/string.json diff --git a/product/phone/package-lock.json b/product/phone/package-lock.json index 1a024f1b..3e8bbee9 100644 --- a/product/phone/package-lock.json +++ b/product/phone/package-lock.json @@ -18,6 +18,17 @@ "@ohos/common": { "version": "file:../../common" }, + "@ohos/datetimecomponent": { + "version": "file:../../feature/systemui/datetimecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, "@ohos/default_volumepanel": { "version": "file:../../feature/systemui/volumepanel", "requires": { @@ -63,6 +74,17 @@ } } }, + "@ohos/noticeitem": { + "version": "file:../../feature/systemui/noticeitem", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, "@ohos/numbadge": { "version": "file:../../feature/numbadge", "requires": { @@ -598,6 +620,65 @@ } } }, + "@ohos/screenlock": { + "version": "file:../../feature/systemui/screenlock", + "requires": { + "@ohos/batterycomponent": "file:../../feature/systemui/batterycomponent", + "@ohos/clockcomponent": "file:../../feature/systemui/clockcomponent", + "@ohos/common": "file:../../common", + "@ohos/signalcomponent": "file:../../feature/systemui/signalcomponent", + "@ohos/wificomponent": "file:../../feature/systemui/wificomponent" + }, + "dependencies": { + "@ohos/batterycomponent": { + "version": "file:../../feature/systemui/batterycomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/clockcomponent": { + "version": "file:../../feature/systemui/clockcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/common": { + "version": "file:../../common" + }, + "@ohos/signalcomponent": { + "version": "file:../../feature/systemui/signalcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/wificomponent": { + "version": "file:../../feature/systemui/wificomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + } + } + }, "@ohos/smartdock": { "version": "file:../../feature/smartdock", "requires": { @@ -608,6 +689,17 @@ "version": "file:../../common" } } + }, + "@ohos/wallpapercomponent": { + "version": "file:../../feature/systemui/wallpapercomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } } } } diff --git a/product/phone/package.json b/product/phone/package.json index c24cded7..09183bb0 100644 --- a/product/phone/package.json +++ b/product/phone/package.json @@ -18,6 +18,10 @@ "@ohos/numbadge": "../../feature/numbadge", "@ohos/phone_statusbar": "../../feature/systemui/phone/statusbar", "@ohos/phone_dropdownpanel": "../../feature/systemui/phone/dropdownpanel", - "@ohos/default_volumepanel": "../../feature/systemui/volumepanel" + "@ohos/default_volumepanel": "../../feature/systemui/volumepanel", + "@ohos/screenlock": "../../feature/systemui/screenlock", + "@ohos/noticeitem": "../../feature/systemui/noticeitem", + "@ohos/datetimecomponent": "../../feature/systemui/datetimecomponent", + "@ohos/wallpapercomponent": "../../feature/systemui/wallpapercomponent" } } diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index edad4c78..cc6f3e55 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -18,6 +18,7 @@ import { HWScreenSession } from '@ohos/common' import { HWDesktop } from './HWDesktop' import { HWWallpaper } from './HWWallpaper' import { HWSystemUi } from './HWSystemUi' +import { SCBScreenLock } from '../screenlock/pages/SCBScreenLock' @Component export struct HWScreen { @@ -39,6 +40,9 @@ export struct HWScreen { // Systemui HWSystemUi({ bounds: this.screenSession.bounds }) + + // screenlock + SCBScreenLock({ bounds: this.screenSession.bounds }) } .position({ x: this.screenSession.bounds.left, y: this.screenSession.bounds.top }) .width(this.screenSession.bounds.width) diff --git a/screenlock4merge/product/phone/src/main/ets/common/StyleConfiguration.ts b/product/phone/src/main/ets/screenlock/common/StyleConfiguration.ts similarity index 76% rename from screenlock4merge/product/phone/src/main/ets/common/StyleConfiguration.ts rename to product/phone/src/main/ets/screenlock/common/StyleConfiguration.ts index 3fa9a07e..1996ef2a 100644 --- a/screenlock4merge/product/phone/src/main/ets/common/StyleConfiguration.ts +++ b/product/phone/src/main/ets/screenlock/common/StyleConfiguration.ts @@ -13,17 +13,18 @@ * limitations under the License. */ -import StyleManager from '../../../../../../common/src/main/ets/default/StyleManager'; -import Log from '../../../../../../common/src/main/ets/default/Log'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'Lock_StatusBar-StyleConfiguration'; +export class ScreenLockStyle { +} + export default class StyleConfiguration { static getIndexStyle() { Log.showInfo(TAG, `setStyle`) const key: string = TAG + "-Index"; - return StyleManager.getStyle(key, () => { - return {}; - }); + return CommonStyleManager.getStyle(key, ScreenLockStyle); } } \ No newline at end of file diff --git a/screenlock4merge/product/phone/src/main/ets/common/StyleManager.ts b/product/phone/src/main/ets/screenlock/common/StyleManager.ts similarity index 89% rename from screenlock4merge/product/phone/src/main/ets/common/StyleManager.ts rename to product/phone/src/main/ets/screenlock/common/StyleManager.ts index 5a6c851f..e02ab999 100644 --- a/screenlock4merge/product/phone/src/main/ets/common/StyleManager.ts +++ b/product/phone/src/main/ets/screenlock/common/StyleManager.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import Log from '../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import IndexStyleConfiguration from './StyleConfiguration' const TAG = 'StatusBar-StyleManager'; diff --git a/screenlock4merge/product/phone/src/main/ets/common/constants.ts b/product/phone/src/main/ets/screenlock/common/constants.ts similarity index 100% rename from screenlock4merge/product/phone/src/main/ets/common/constants.ts rename to product/phone/src/main/ets/screenlock/common/constants.ts diff --git a/screenlock4merge/product/phone/src/main/ets/pages/index.ets b/product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets similarity index 50% rename from screenlock4merge/product/phone/src/main/ets/pages/index.ets rename to product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets index 9c17ef5b..afa2a168 100644 --- a/screenlock4merge/product/phone/src/main/ets/pages/index.ets +++ b/product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Log from '../../../../../../common/src/main/ets/default/Log' -import Trace from '../../../../../../common/src/main/ets/default/Trace' -import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' -import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import {LockStyleMode} from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import Trace from '@ohos/common/src/main/ets/default/Trace' +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager' +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' +import {LockStyleMode} from '@ohos/screenlock/src/main/ets/com/ohos/model/screenlockStyle' import ViewModel from '../vm/indexViewModel' import SlideScreenLock from './slidescreenlock' import CustomScreenLock from './customscreenlock' @@ -25,22 +25,29 @@ import JournalScreenLock from './journalscreenlock' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' import Router from '@system.router'; +import sTimeManager from '@ohos/common/src/main/ets/default/TimeManager' +import WindowPanelManager, { WindowType, WindowInfo, SystemUi_ScreenLock } from '@ohos/common/src/main/ets/default/WindowPanelManager'; +import screenSessionManager from '@ohos.screenSessionManager'; const TAG = 'ScreenLock-Entry'; -@Entry @Component -struct Index { +export struct SCBScreenLock { + public bounds: screenSessionManager.RRect @State mViewModel: ViewModel = new ViewModel() @State pageStatus: number = Constants.STATUS_ABOUT_TO_APPEAR @State mHeightPx: number = 48 + @StorageLink(SystemUi_ScreenLock) mScreenLockInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.SCREEN_LOCK); aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) + AbilityManager.setContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK, getContext(this)); + sTimeManager.init(getContext(this)); + this.initStatusBarRect(); + this.mScreenLockInfo.visibility = true; this.mViewModel.ViewModelInit() this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR try { - CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height @@ -51,10 +58,38 @@ struct Index { } } + private async initStatusBarRect() { + let rect; + let widthPx = vp2px(this.bounds.width); + let heightPx = vp2px(this.bounds.height); + if (widthPx > heightPx) { // Pad、PC horizontalScreen Mode + rect = { + left: 0, + top: 0, + width: '100%', + height: (48 * widthPx) / 1280, + } + } else { // Phone verticalScreen Mode + rect = { + left: 0, + top: 0, + width: '100%', + height: (48 * widthPx) / 720 + } + } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "rect", rect); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "dis", { + width: widthPx, + height: heightPx, + }); + Log.showInfo(TAG, `createWindow success.`); + } + aboutToDisappear() { Log.showInfo(TAG, `aboutToDisAppear`) this.pageStatus = Constants.STATUS_ABOUT_TO_DISAPPEAR this.mViewModel.ViewModelDestroy() + sTimeManager.release() } onPageShow() { @@ -81,14 +116,16 @@ struct Index { } build() { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - if (this.mViewModel.mode == LockStyleMode.SlideScreenLock) { - // Slide of lock screen - SlideScreenLock({ pageStatus: this.pageStatus, mHeightPx: this.mHeightPx }) - } else if (this.mViewModel.mode == LockStyleMode.JournalScreenLock) { - JournalScreenLock() - } else if (this.mViewModel.mode == LockStyleMode.CustomScreenLock) { - CustomScreenLock() + if (this.mScreenLockInfo.visibility) { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + if (this.mViewModel.mode == LockStyleMode.SlideScreenLock) { + // Slide of lock screen + SlideScreenLock({ pageStatus: this.pageStatus, mHeightPx: this.mHeightPx }) + } else if (this.mViewModel.mode == LockStyleMode.JournalScreenLock) { + JournalScreenLock() + } else if (this.mViewModel.mode == LockStyleMode.CustomScreenLock) { + CustomScreenLock() + } } } } diff --git a/screenlock4merge/product/phone/src/main/ets/pages/customPassword.ets b/product/phone/src/main/ets/screenlock/pages/customPassword.ets similarity index 77% rename from screenlock4merge/product/phone/src/main/ets/pages/customPassword.ets rename to product/phone/src/main/ets/screenlock/pages/customPassword.ets index 79bb1b24..1adbec5b 100644 --- a/screenlock4merge/product/phone/src/main/ets/pages/customPassword.ets +++ b/product/phone/src/main/ets/screenlock/pages/customPassword.ets @@ -13,12 +13,12 @@ * limitations under the License. */ -import Trace from '../../../../../../common/src/main/ets/default/Trace' -import Log from '../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' -import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' -import CustomPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/customPSD' +import Trace from '@ohos/common/src/main/ets/default/Trace' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager' +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBar from '@ohos/screenlock/src/main/ets/com/ohos/view/component/statusBar' +import CustomPSD from '@ohos/screenlock/src/main/ets/com/ohos/view/component/customPSD' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' @@ -31,7 +31,7 @@ export default struct CustomPassword { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - CommonStyleManager.setAbilityPageName(TAG) +// CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height diff --git a/screenlock4merge/product/phone/src/main/ets/pages/customscreenlock.ets b/product/phone/src/main/ets/screenlock/pages/customscreenlock.ets similarity index 93% rename from screenlock4merge/product/phone/src/main/ets/pages/customscreenlock.ets rename to product/phone/src/main/ets/screenlock/pages/customscreenlock.ets index 514cb35e..42c026a8 100644 --- a/screenlock4merge/product/phone/src/main/ets/pages/customscreenlock.ets +++ b/product/phone/src/main/ets/screenlock/pages/customscreenlock.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'ScreenLock-CustomScreenlock' diff --git a/screenlock4merge/product/phone/src/main/ets/pages/digitalPassword.ets b/product/phone/src/main/ets/screenlock/pages/digitalPassword.ets similarity index 77% rename from screenlock4merge/product/phone/src/main/ets/pages/digitalPassword.ets rename to product/phone/src/main/ets/screenlock/pages/digitalPassword.ets index a9dfff0e..5db8ccf5 100644 --- a/screenlock4merge/product/phone/src/main/ets/pages/digitalPassword.ets +++ b/product/phone/src/main/ets/screenlock/pages/digitalPassword.ets @@ -13,12 +13,12 @@ * limitations under the License. */ -import Trace from '../../../../../../common/src/main/ets/default/Trace' -import Log from '../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' -import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' -import DigitalPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD' +import Trace from '@ohos/common/src/main/ets/default/Trace' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager' +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBar from '@ohos/screenlock/src/main/ets/com/ohos/view/component/statusBar' +import DigitalPSD from '@ohos/screenlock/src/main/ets/com/ohos/view/component/digitalPSD' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' @@ -31,7 +31,7 @@ export default struct DigitalPassword { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - CommonStyleManager.setAbilityPageName(TAG) +// CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height diff --git a/screenlock4merge/product/phone/src/main/ets/pages/journalscreenlock.ets b/product/phone/src/main/ets/screenlock/pages/journalscreenlock.ets similarity index 93% rename from screenlock4merge/product/phone/src/main/ets/pages/journalscreenlock.ets rename to product/phone/src/main/ets/screenlock/pages/journalscreenlock.ets index e4359658..708d575f 100644 --- a/screenlock4merge/product/phone/src/main/ets/pages/journalscreenlock.ets +++ b/product/phone/src/main/ets/screenlock/pages/journalscreenlock.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../common/src/main/ets/default/Log' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'ScreenLock-JournalScreenlock' diff --git a/screenlock4merge/product/phone/src/main/ets/pages/mixedPassword.ets b/product/phone/src/main/ets/screenlock/pages/mixedPassword.ets similarity index 77% rename from screenlock4merge/product/phone/src/main/ets/pages/mixedPassword.ets rename to product/phone/src/main/ets/screenlock/pages/mixedPassword.ets index faf24876..547d03fa 100644 --- a/screenlock4merge/product/phone/src/main/ets/pages/mixedPassword.ets +++ b/product/phone/src/main/ets/screenlock/pages/mixedPassword.ets @@ -13,12 +13,12 @@ * limitations under the License. */ -import Trace from '../../../../../../common/src/main/ets/default/Trace' -import Log from '../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' -import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' -import MixedPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD' +import Trace from '@ohos/common/src/main/ets/default/Trace' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager' +import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' +import StatusBar from '@ohos/screenlock/src/main/ets/com/ohos/view/component/statusBar' +import MixedPSD from '@ohos/screenlock/src/main/ets/com/ohos/view/component/mixedPSD' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' @@ -31,7 +31,6 @@ export default struct MixedPassword { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height diff --git a/screenlock4merge/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/screenlock/pages/slidescreenlock.ets similarity index 83% rename from screenlock4merge/product/phone/src/main/ets/pages/slidescreenlock.ets rename to product/phone/src/main/ets/screenlock/pages/slidescreenlock.ets index 86375f12..b93f6ce1 100644 --- a/screenlock4merge/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/screenlock/pages/slidescreenlock.ets @@ -13,14 +13,14 @@ * limitations under the License. */ -import Log from '../../../../../../common/src/main/ets/default/Log' -import Accounts from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts' -import {UserData} from '../../../../../../features/screenlock/src/main/ets/com/ohos/data/userData' -import DateTime from '../../../../../../features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime' -import LockIcon from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/lockIcon' -import Wallpaper from '../../../../../../features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper' -import NotificationListComponent from '../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent' -import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import Accounts from '@ohos/screenlock/src/main/ets/com/ohos/view/component/accounts' +import {UserData} from '@ohos/screenlock/src/main/ets/com/ohos/data/userData' +import DateTime from '@ohos/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime' +import LockIcon from '@ohos/screenlock/src/main/ets/com/ohos/view/component/lockIcon' +import Wallpaper from '@ohos/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper' +import NotificationListComponent from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent' +import StatusBar from '@ohos/screenlock/src/main/ets/com/ohos/view/component/statusBar' import Constants from '../common/constants' import ViewModel from '../vm/slideScreenLockViewModel' @@ -106,7 +106,7 @@ export default struct SlideScreenlock { .margin({ top: $r("app.float.DateTime_margin_top"), bottom: $r("app.float.DateTime_margin_bottom") }) Column() { - NotificationListComponent() + NotificationListComponent({ isScreenLock: true }) } .alignItems(HorizontalAlign.Center) .width(Constants.NOTIFICATION_AREA_WIDTH) diff --git a/screenlock4merge/product/phone/src/main/ets/vm/indexViewModel.ts b/product/phone/src/main/ets/screenlock/vm/indexViewModel.ts similarity index 79% rename from screenlock4merge/product/phone/src/main/ets/vm/indexViewModel.ts rename to product/phone/src/main/ets/screenlock/vm/indexViewModel.ts index 7eb22188..ffefd5c9 100644 --- a/screenlock4merge/product/phone/src/main/ets/vm/indexViewModel.ts +++ b/product/phone/src/main/ets/screenlock/vm/indexViewModel.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import Log from '../../../../../../common/src/main/ets/default/Log'; -import ScreenlockStyle, {LockStyleMode} from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' -import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import ScreenlockStyle, {LockStyleMode} from '@ohos/screenlock/src/main/ets/com/ohos/model/screenlockStyle' +import ScreenLockService from '@ohos/screenlock/src/main/ets/com/ohos/model/screenLockService' const TAG = 'ScreenLock-IndexViewModel' diff --git a/screenlock4merge/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/screenlock/vm/slideScreenLockViewModel.ts similarity index 93% rename from screenlock4merge/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts rename to product/phone/src/main/ets/screenlock/vm/slideScreenLockViewModel.ts index f4699f58..56699255 100644 --- a/screenlock4merge/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/phone/src/main/ets/screenlock/vm/slideScreenLockViewModel.ts @@ -13,10 +13,10 @@ * limitations under the License. */ -import Log from '../../../../../../common/src/main/ets/default/Log'; -import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' +import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import ScreenLockService from '@ohos/screenlock/src/main/ets/com/ohos/model/screenLockService' import Constants from '../common/constants' -import {Callback} from '@ohos.base'; +import {Callback} from 'basic'; const TAG = 'ScreenLock-SlideScreenLockViewModel' //Height of notification area. diff --git a/product/phone/src/main/module.json5 b/product/phone/src/main/module.json5 index 892a5093..3a939c83 100644 --- a/product/phone/src/main/module.json5 +++ b/product/phone/src/main/module.json5 @@ -116,6 +116,27 @@ }, { "name": "ohos.permission.PERMISSION_USED_STATS" + }, + { + "name": "ohos.permission.USE_USER_IDM" + }, + { + "name": "ohos.permission.ACCESS_USER_AUTH_INTERNAL" + }, + { + "name": "ohos.permission.ACCESS_PIN_AUTH" + }, + { + "name": "ohos.permission.GET_WALLPAPER" + }, + { + "name": "ohos.permission.SET_WALLPAPER" + }, + { + "name": "ohos.permission.CONNECT_IME_ABILITY" + }, + { + "name": "ohos.permission.ACCESS_SCREEN_LOCK_INNER" } ] } diff --git a/screenlock4merge/product/phone/src/main/resources/base/element/color.json b/product/phone/src/main/resources/base/element/color.json similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/element/color.json rename to product/phone/src/main/resources/base/element/color.json diff --git a/screenlock4merge/product/phone/src/main/resources/base/element/float.json b/product/phone/src/main/resources/base/element/float.json similarity index 89% rename from screenlock4merge/product/phone/src/main/resources/base/element/float.json rename to product/phone/src/main/resources/base/element/float.json index 2d8171a8..bbe65086 100644 --- a/screenlock4merge/product/phone/src/main/resources/base/element/float.json +++ b/product/phone/src/main/resources/base/element/float.json @@ -1,9 +1,5 @@ { "float": [ - { - "name": "status_bar_height", - "value": "24vp" - }, { "name": "DateTime_margin_top", "value": "7vp" @@ -12,18 +8,6 @@ "name": "DateTime_margin_bottom", "value": "52vp" }, - - { "name": "status_bar_padding_left_right", - "value": "24vp" - }, - { - "name": "status_bar_margin_top", - "value": "4vp" - }, - { - "name": "status_bar_opacity", - "value": "0.7" - }, { "name": "signal_status_margin_Left_right", "value": "0" diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/bg.png b/product/phone/src/main/resources/base/media/bg.png similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/bg.png rename to product/phone/src/main/resources/base/media/bg.png diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/delete_all.png b/product/phone/src/main/resources/base/media/delete_all.png similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/delete_all.png rename to product/phone/src/main/resources/base/media/delete_all.png diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_close.svg b/product/phone/src/main/resources/base/media/ic_close.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_close.svg rename to product/phone/src/main/resources/base/media/ic_close.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_hollow_dot.svg b/product/phone/src/main/resources/base/media/ic_hollow_dot.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_hollow_dot.svg rename to product/phone/src/main/resources/base/media/ic_hollow_dot.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_notification_down.png b/product/phone/src/main/resources/base/media/ic_notification_down.png similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_notification_down.png rename to product/phone/src/main/resources/base/media/ic_notification_down.png diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_notification_up.png b/product/phone/src/main/resources/base/media/ic_notification_up.png similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_notification_up.png rename to product/phone/src/main/resources/base/media/ic_notification_up.png diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_public_delete_filled.svg b/product/phone/src/main/resources/base/media/ic_public_delete_filled.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_public_delete_filled.svg rename to product/phone/src/main/resources/base/media/ic_public_delete_filled.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_public_lock_filled.svg b/product/phone/src/main/resources/base/media/ic_public_lock_filled.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_public_lock_filled.svg rename to product/phone/src/main/resources/base/media/ic_public_lock_filled.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_public_settings_filled.svg b/product/phone/src/main/resources/base/media/ic_public_settings_filled.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_public_settings_filled.svg rename to product/phone/src/main/resources/base/media/ic_public_settings_filled.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_public_unlock_filled.svg b/product/phone/src/main/resources/base/media/ic_public_unlock_filled.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_public_unlock_filled.svg rename to product/phone/src/main/resources/base/media/ic_public_unlock_filled.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_solid_dot.svg b/product/phone/src/main/resources/base/media/ic_solid_dot.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_solid_dot.svg rename to product/phone/src/main/resources/base/media/ic_solid_dot.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg b/product/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_signal_1.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg b/product/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_signal_2.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg b/product/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_signal_3.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg b/product/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_signal_4.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg b/product/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_signal_full.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg b/product/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_signal_no.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png b/product/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png rename to product/phone/src/main/resources/base/media/ic_statusbar_signal_roaming.png diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png b/product/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png rename to product/phone/src/main/resources/base/media/ic_statusbar_signal_wait.png diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_wifi_1.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_wifi_2.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_wifi_3.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png rename to product/phone/src/main/resources/base/media/ic_statusbar_wifi_connect.png diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_wifi_full.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg b/product/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_wifi_no.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/ic_user_portrait.svg b/product/phone/src/main/resources/base/media/ic_user_portrait.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/ic_user_portrait.svg rename to product/phone/src/main/resources/base/media/ic_user_portrait.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/lock.png b/product/phone/src/main/resources/base/media/lock.png similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/lock.png rename to product/phone/src/main/resources/base/media/lock.png diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/reboot.svg b/product/phone/src/main/resources/base/media/reboot.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/reboot.svg rename to product/phone/src/main/resources/base/media/reboot.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/send.svg b/product/phone/src/main/resources/base/media/send.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/send.svg rename to product/phone/src/main/resources/base/media/send.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/shutdown.svg b/product/phone/src/main/resources/base/media/shutdown.svg similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/shutdown.svg rename to product/phone/src/main/resources/base/media/shutdown.svg diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/unlock.png b/product/phone/src/main/resources/base/media/unlock.png similarity index 100% rename from screenlock4merge/product/phone/src/main/resources/base/media/unlock.png rename to product/phone/src/main/resources/base/media/unlock.png diff --git a/product/phone/src/main/resources/base/profile/main_pages.json b/product/phone/src/main/resources/base/profile/main_pages.json index 63bff641..daf941ed 100644 --- a/product/phone/src/main/resources/base/profile/main_pages.json +++ b/product/phone/src/main/resources/base/profile/main_pages.json @@ -3,6 +3,9 @@ "pages/FormManagerView", "pages/EmptyPage", "pages/EntryView", - "pages/RecentView" + "pages/RecentView", + "screenlock/pages/digitalPassword", + "screenlock/pages/mixedPassword", + "screenlock/pages/customPassword" ] } diff --git a/screenlock4merge/AppScope/app.json5 b/screenlock4merge/AppScope/app.json5 deleted file mode 100644 index 2143e68f..00000000 --- a/screenlock4merge/AppScope/app.json5 +++ /dev/null @@ -1,13 +0,0 @@ -{ - "app": { - "bundleName": "com.ohos.systemui", - "vendor": "ohos", - "versionCode": 1000000, - "versionName": "1.0.0", - "icon": "$media:app_icon", - "label": "$string:app_name", - "distributedNotificationEnabled": true, - "minAPIVersion": 8, - "targetAPIVersion": 9 - } -} diff --git a/screenlock4merge/AppScope/resources/base/element/string.json b/screenlock4merge/AppScope/resources/base/element/string.json deleted file mode 100644 index 0b640493..00000000 --- a/screenlock4merge/AppScope/resources/base/element/string.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "string": [ - { - "name": "app_name", - "value": "ScreenLock" - } - ] -} diff --git a/screenlock4merge/AppScope/resources/base/media/app_icon.png b/screenlock4merge/AppScope/resources/base/media/app_icon.png deleted file mode 100644 index ce307a8827bd75456441ceb57d530e4c8d45d36c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6790 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 original.call(this, ...args), timeout); - }; - }; -} - -export function throttle(waitTime: number) { - return function inner(target: any, propKey: string, descriptor: PropertyDescriptor) { - let lastTime: number = 0; - const original = descriptor.value; - descriptor.value = function (...args: string[]) { - let curTime = Date.now(); - Log.showInfo(TAG, `throttle invoke ${propKey} timeInterval: ${curTime - lastTime}`); - if (curTime - lastTime >= waitTime) { - original.call(this, ...args); - lastTime = curTime; - } - }; - }; -} diff --git a/screenlock4merge/common/src/main/ets/default/Log.ts b/screenlock4merge/common/src/main/ets/default/Log.ts deleted file mode 100644 index de667141..00000000 --- a/screenlock4merge/common/src/main/ets/default/Log.ts +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2021-2022 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'; - -const DOMAIN: number = 0x002A; -const TAG = "ScreenLock_Default"; -const SYMBOL = " --> "; -const FILTER_KEYS = [ - new RegExp('hide', "gi") -] - -export function filterKey(target: any, propKey: string, descriptor: PropertyDescriptor) { - const original = descriptor.value; - descriptor.value = function (...args: string[]) { - let filterResult = args.map((str) => { - let tempStr = str - FILTER_KEYS.forEach((filterKey) => tempStr = tempStr.replace(filterKey, "**")) - return tempStr - }); - const result = original.call(this, ...filterResult); - return result; - }; -} - -/** - * Basic log class - */ -export default class Log { - /** - * Outputs debug-level logs. - * - * @param tag Identifies the log tag. - * @param format Indicates the log format string. - * @param args Indicates the log parameters. - * @since 7 - */ - static showDebug(tag: string, format: string, ...args: any[]) { - if (Log.isLogGable(hiLog.LogLevel.DEBUG)) { - hiLog.debug(DOMAIN, TAG, tag + SYMBOL + format, args); - } - } - - /** - * Outputs info-level logs. - * - * @param tag Identifies the log tag. - * @param format Indicates the log format string. - * @param args Indicates the log parameters. - * @since 7 - */ - static showInfo(tag: string, format: string, ...args: any[]) { - if (Log.isLogGable(hiLog.LogLevel.INFO)) { - hiLog.info(DOMAIN, TAG, tag + SYMBOL + format, args); - } - } - - /** - * Outputs warning-level logs. - * - * @param tag Identifies the log tag. - * @param format Indicates the log format string. - * @param args Indicates the log parameters. - * @since 7 - */ - static showWarn(tag: string, format: string, ...args: any[]) { - if (Log.isLogGable(hiLog.LogLevel.WARN)) { - hiLog.warn(DOMAIN, TAG, tag + SYMBOL + format, args); - } - } - - /** - * Outputs error-level logs. - * - * @param tag Identifies the log tag. - * @param format Indicates the log format string. - * @param args Indicates the log parameters. - * @since 7 - */ - static showError(tag: string, format: string, ...args: any[]) { - if (Log.isLogGable(hiLog.LogLevel.ERROR)) { - hiLog.error(DOMAIN, TAG, tag + SYMBOL + format, args); - } - } - - /** - * Outputs fatal-level logs. - * - * @param tag Identifies the log tag. - * @param format Indicates the log format string. - * @param args Indicates the log parameters. - * @since 7 - */ - static showFatal(tag: string, format: string, ...args: any[]) { - if (Log.isLogGable(hiLog.LogLevel.FATAL)) { - hiLog.fatal(DOMAIN, TAG, tag + SYMBOL + format, args); - } - } - - /** - * Checks whether logs of the specified tag, and level can be printed. - * - * @param tag Identifies the log tag. - * @param level log level - * @since 7 - */ - private static isLogGable(level: hiLog.LogLevel): boolean { - return hiLog.isLoggable(DOMAIN, TAG, level); - } -} diff --git a/screenlock4merge/common/src/main/ets/default/ReadConfigUtil.ts b/screenlock4merge/common/src/main/ets/default/ReadConfigUtil.ts deleted file mode 100644 index 7332fdf9..00000000 --- a/screenlock4merge/common/src/main/ets/default/ReadConfigUtil.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2021-2022 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 Log from './Log'; -import AbilityManager from '../default/abilitymanager/abilityManager' - -const TAG = 'ReadConfigUtil'; - -export class ReadConfigUtil { - ReadConfigFile(fileName, callBack:(data)=>void) { - Log.showInfo(TAG, `readConfigFile fileName:${fileName}`); - let jsonCfg : string = ""; - let resManager = AbilityManager.getContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK)?.resourceManager; - resManager.getRawFile(fileName).then((data)=>{ - let content : string = String.fromCharCode.apply(null, data); - Log.showInfo(TAG, `readDefaultFile content length: ${content.length}`); - jsonCfg = JSON.parse(content); - callBack(jsonCfg); - }) - .catch((error)=>{ - Log.showError(TAG, `readDefaultFile filed: ${JSON.stringify(error)}`); - }); - } -} - -let readConfigUtil = new ReadConfigUtil(); - -export default readConfigUtil as ReadConfigUtil diff --git a/screenlock4merge/common/src/main/ets/default/ScreenLockManager.ts b/screenlock4merge/common/src/main/ets/default/ScreenLockManager.ts deleted file mode 100644 index d38431d5..00000000 --- a/screenlock4merge/common/src/main/ets/default/ScreenLockManager.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2022 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 commonEvent from "@ohos.commonEvent"; -import { CommonEventSubscriber } from "commonEvent/commonEventSubscriber"; -import createOrGet from "./SingleInstanceHelper"; -import EventManager from "./event/EventManager"; -import Log from "./Log"; -import { obtainLocalEvent } from "./event/EventUtil"; -import { debounce } from "./Decorators"; -export const SCREEN_CHANGE_EVENT = "screenChangeEvent"; - -const TAG = "ScreenLockManager"; -const SCREEN_COMMON_EVENT_INFO = { - events: [commonEvent.Support.COMMON_EVENT_SCREEN_OFF, commonEvent.Support.COMMON_EVENT_SCREEN_ON], -}; -const debounceTimeout = 500; - -class ScreenLockManager { - mSubscriber: CommonEventSubscriber | undefined; - - async init() { - this.mSubscriber = await commonEvent.createSubscriber(SCREEN_COMMON_EVENT_INFO); - commonEvent.subscribe(this.mSubscriber, (err, data) => { - if (err.code != 0) { - Log.showError(TAG, `Can't handle screen change, err: ${JSON.stringify(err)}`); - return; - } - Log.showDebug(TAG, `screenChange, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - switch (data.event) { - case commonEvent.Support.COMMON_EVENT_SCREEN_OFF: - this.notifyScreenEvent(false); - break; - case commonEvent.Support.COMMON_EVENT_SCREEN_ON: - this.notifyScreenEvent(true); - break; - default: - Log.showError(TAG, `unknow event`); - } - }); - } - - @debounce(debounceTimeout) - notifyScreenEvent(isScreenOn: boolean) { - EventManager.publish(obtainLocalEvent(SCREEN_CHANGE_EVENT, isScreenOn)); - Log.showDebug(TAG, `publish ${SCREEN_CHANGE_EVENT} screenState: ${isScreenOn}`); - } -} - -let sScreenLockManager = createOrGet(ScreenLockManager, TAG); -export default sScreenLockManager as ScreenLockManager; \ No newline at end of file diff --git a/screenlock4merge/common/src/main/ets/default/SingleInstanceHelper.ts b/screenlock4merge/common/src/main/ets/default/SingleInstanceHelper.ts deleted file mode 100644 index 00ab5d59..00000000 --- a/screenlock4merge/common/src/main/ets/default/SingleInstanceHelper.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) 2021-2022 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 Log from './Log'; -import audio from '@ohos.multimedia.audio'; - -const TAG = "SingleInstanceHelper"; -const AUDIO_MANAGER_KEY = 'MultiMediaAudioManager'; - -export default function createOrGet(objectClass: { new(): T }, storageKey: string): T { - if (!globalThis[storageKey]) { - globalThis[storageKey] = new objectClass(); - Log.showDebug(TAG, `Create key of ${storageKey}`); - } - return globalThis[storageKey]; -} - -export function getAudioManager() { - if (!globalThis[AUDIO_MANAGER_KEY]) { - globalThis[AUDIO_MANAGER_KEY] = audio.getAudioManager(); - Log.showInfo(TAG, `Create Audio Manager.`); - } - return globalThis[AUDIO_MANAGER_KEY]; -} diff --git a/screenlock4merge/common/src/main/ets/default/StyleConfiguration.ts b/screenlock4merge/common/src/main/ets/default/StyleConfiguration.ts deleted file mode 100644 index 35e326d0..00000000 --- a/screenlock4merge/common/src/main/ets/default/StyleConfiguration.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 StyleManager from './StyleManager'; - -const TAG = 'Common-StyleConfiguration'; - -export default class StyleConfiguration { - static getCommonStyle() { - const key: string = TAG + "-Common"; - return StyleManager.getStyle(key, () => { - return { - statusBarFontSize: $r("app.float.signal_fontSize"), - statusBarIconWidth: '24vp', - statusBarIconHeight: '24vp', - statusBarMarginLeftRight: $r("app.float.signal_status_margin_Left_right"), - }; - }); - } -} \ No newline at end of file diff --git a/screenlock4merge/common/src/main/ets/default/StyleManager.ts b/screenlock4merge/common/src/main/ets/default/StyleManager.ts deleted file mode 100644 index 18fc5e6c..00000000 --- a/screenlock4merge/common/src/main/ets/default/StyleManager.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 Log from './Log'; - -const TAG = 'Common-StyleManager'; - -export class StyleManager { - mAbilityPageName: string = ''; - - setAbilityPageName(name: string): void{ - Log.showDebug(TAG, `setAbilityPageName, name: ${name}`); - this.mAbilityPageName = name; - } - - getStyle(key: string, generateDefaultFunction: Function) { - let newKey = this.mAbilityPageName + '-' + key; - if (!AppStorage.Has(newKey)) { - let defaultStyle = generateDefaultFunction(); - AppStorage.SetOrCreate(newKey, defaultStyle); - Log.showDebug(TAG, `Create storageKey of ${newKey}`); - } - return AppStorage.Get(newKey); - } -} - -let styleManager = new StyleManager(); - -export default styleManager as StyleManager; \ No newline at end of file diff --git a/screenlock4merge/common/src/main/ets/default/SwitchUserManager.ts b/screenlock4merge/common/src/main/ets/default/SwitchUserManager.ts deleted file mode 100644 index bee3bf7e..00000000 --- a/screenlock4merge/common/src/main/ets/default/SwitchUserManager.ts +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 AccountManager from "@ohos.account.osAccount"; -import Log from "./Log"; -import getSingleInstance from "./SingleInstanceHelper"; - -const TAG = "SwitchUserManagerSc"; -const SUBSCRIBE_KEY = "SystemUiAccount"; -const USER_CHANGE_EVENT = "activate"; -const DELAY_TIME = 50 * 1000; -export const INVALID_USER_ID = -1; - -type AccountInfo = { - localId: number; - localName: string; - photo: string; -}; -export type UserChangeListener = { - userChange: (data: UserInfo) => void; -}; - -export class UserInfo { - userId: number = INVALID_USER_ID; - userName: string = ""; - userIcon: string | Resource = ""; - [key: string]: any; -} - -async function getCurrentAccountInfo(): Promise { - let accountInfos = await AccountManager.getAccountManager().queryAllCreatedOsAccounts(); - Log.showInfo(TAG, `accountInfos size:${accountInfos.length}`); - for (let accountInfo of accountInfos) { - Log.showDebug(TAG, `accountInfo: ${accountInfo.localId}, isActive: ${accountInfo.isActived}`); - if (accountInfo.isActived) { - return accountInfo; - } - } - return Promise.reject("Can't get active userInfo."); -} - -function parseAccountInfo(accountInfo: AccountInfo): UserInfo { - return { - userId: accountInfo.localId, - userName: accountInfo.localName, - userIcon: accountInfo.photo, - }; -} - -export default class SwitchUserManager { - mUserInfo: UserInfo = new UserInfo(); - mListeners = new Set(); - mHasWait: boolean = false; - - static getInstance(): SwitchUserManager { - return getSingleInstance(SwitchUserManager, TAG); - } - - constructor() { - Log.showDebug(TAG, `SwitchUserManager constructor`); - AccountManager.getAccountManager().on(USER_CHANGE_EVENT, SUBSCRIBE_KEY, this.handleUserChange.bind(this)); - } - - public async getCurrentUserInfo(): Promise { - if (this.mUserInfo.userId == INVALID_USER_ID) { - !this.mHasWait && (await new Promise((resolve) => setTimeout(resolve, DELAY_TIME))); - this.mHasWait = true; - this.mUserInfo = parseAccountInfo(await getCurrentAccountInfo()); - } - Log.showInfo(TAG, `getCurrentUserInfo userId: ${this.mUserInfo.userId}`); - return this.mUserInfo; - } - - public registerListener(listener: UserChangeListener) { - this.mListeners.add(listener); - } - - public unregisterListener(listener: UserChangeListener) { - this.mListeners.delete(listener); - } - - handleUserChange(accountId: number): void { - AccountManager.getAccountManager() - .queryOsAccountById(accountId) - .then((accountInfo) => { - Log.showInfo(TAG, `userChange, accountInfo: ${JSON.stringify(accountInfo)}`); - this.mUserInfo = parseAccountInfo(accountInfo); - this.notifyUserChange(); - }) - .catch((err) => Log.showError(TAG, `Can't query account by ${accountId}, err: ${err}`)); - } - - notifyUserChange() { - this.mListeners.forEach((listener) => listener.userChange(this.mUserInfo)); - } -} \ No newline at end of file diff --git a/screenlock4merge/common/src/main/ets/default/SysFaultLogger.ts b/screenlock4merge/common/src/main/ets/default/SysFaultLogger.ts deleted file mode 100644 index 01c2d494..00000000 --- a/screenlock4merge/common/src/main/ets/default/SysFaultLogger.ts +++ /dev/null @@ -1,60 +0,0 @@ -// @ts-nocheck -/* - * Copyright (c) 2021-2022 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 Log from "./Log"; -import hiSysEvent from '@ohos.hiSysEvent' - -const TAG = 'SystemFaultLogger'; -const APP_DOMAIN: string = "SYSTEMUI_APP"; -const APP_LOG_NAME: string = "SCREENLOCK_FAULT"; - -interface LogParam { - FAULT_ID: string, - MSG: string -} - -export enum FaultID { - MEMORY = "MEMORY_MONITOR", - SCREEN_LOCK_MANAGER = "CONNECT_SCREENLOCKMANAGERSERVICE_ABNORMAL", - ACCOUNT_SYSTEM = "ACCOUNTSYSTEM_CALL_ABNORMAL" -} - -export function WriteFaultLog(logParam: LogParam) { - const sysEventInfo = { - domain: APP_DOMAIN, - name: APP_LOG_NAME, - eventType: hiSysEvent.EventType.FAULT, - params: logParam - } - hiSysEvent.write(sysEventInfo, (err, val) => { - Log.showInfo(TAG, "fault log params is : " + JSON.stringify(sysEventInfo)) - Log.showInfo(TAG, `write fault log result: ${val}`) - }) -} - -export function SysFaultLogger(logParam: LogParam) { - return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { - const originalFunc = descriptor.value; - descriptor.value = function(...args) { - try { - originalFunc.apply(this, args); - } catch (err: any) { - Log.showInfo(TAG, "catch error in execute: " + propertyKey); - WriteFaultLog(logParam); - } - }; - }; -} \ No newline at end of file diff --git a/screenlock4merge/common/src/main/ets/default/TimeManager.ts b/screenlock4merge/common/src/main/ets/default/TimeManager.ts deleted file mode 100644 index b890c954..00000000 --- a/screenlock4merge/common/src/main/ets/default/TimeManager.ts +++ /dev/null @@ -1,123 +0,0 @@ -// @ts-nocheck -/** - * Copyright (c) 2021-2022 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 settings from "@ohos.settings"; -import commonEvent from "@ohos.commonEvent"; -import dataShare from '@ohos.data.dataShare'; -import featureAbility from "@ohos.ability.featureAbility"; -import { DataAbilityHelper } from "ability/dataAbilityHelper"; -import Log from "./Log"; -import EventManager from "./event/EventManager"; -import createOrGet from "./SingleInstanceHelper"; -import Constants from "./Constants"; -import { obtainLocalEvent } from "./event/EventUtil"; -import { CommonEventManager, getCommonEventManager, POLICY } from "./commonEvent/CommonEventManager"; - -export const TIME_CHANGE_EVENT = "Time_Change_Event"; - -export type TimeEventArgs = { - date: Date; - timeFormat: boolean; -}; - -const TAG = "TimeManagerSc"; -//const URI_VAR = "dataability:///com.ohos.settingsdata.DataAbility"; -const TIME_FORMAT_KEY = settings.date.TIME_FORMAT; -const TIME_SUBSCRIBE_INFO = { - events: [ - commonEvent.Support.COMMON_EVENT_TIME_CHANGED, - commonEvent.Support.COMMON_EVENT_TIMEZONE_CHANGED, - commonEvent.Support.COMMON_EVENT_TIME_TICK, - ], -}; - -function fill(value: number) { - return (value > 9 ? "" : "0") + value; -} - -export function concatTime(h: number, m: number) { - return `${fill(h)}:${fill(m)}`; -} - -class TimeManager { - private mUse24hFormat: boolean = false; - private mSettingsHelper?: DataAbilityHelper; - private mManager?: CommonEventManager; - - public init(context: any) { - this.mManager = getCommonEventManager( - TAG, - TIME_SUBSCRIBE_INFO, - () => this.notifyTimeChange(), - (isSubscribe) => isSubscribe && this.notifyTimeChange() - ); - this.mManager.subscriberCommonEvent(); - this.mManager.applyPolicy([POLICY.SCREEN_POLICY]); - this.initTimeFormat(context); - } - - public release() { - this.mManager?.release(); - this.mManager = undefined; - this.mSettingsHelper?.off("dataChange", Constants.getUriSync(TIME_FORMAT_KEY)); - } - - public formatTime(date: Date) { - return concatTime(date.getHours() % (this.mUse24hFormat ? 24 : 12), date.getMinutes()); - } - - private async initTimeFormat(context: any) { - Log.showDebug(TAG, "initTimeFormat"); - //this.mSettingsHelper = featureAbility.acquireDataAbilityHelper(context, URI_VAR); - this.mSettingsHelper = await dataShare.createDataShareHelper(context, Constants.getUriSync(TIME_FORMAT_KEY)); - //Log.showDebug(TAG, "url:"+Constants.getUriSync(TIME_FORMAT_KEY)); - //Log.showDebug(TAG, "mSettingsHelper:"+JSON.stringify(this.mSettingsHelper)); - try { - this.mSettingsHelper.on("dataChange", Constants.getUriSync(TIME_FORMAT_KEY), () => { - Log.showDebug(TAG, "mSettingsHelper on"); - this.handleTimeFormatChange(context); - }); - this.handleTimeFormatChange(context); - } catch (e) { - Log.showError(TAG, `Can't listen timeformate change.`); - } - } - - private handleTimeFormatChange(context: any) { - Log.showDebug(TAG, "handleTimeFormatChange") - if (!this.mSettingsHelper) { - Log.showError(TAG, `Can't get dataAbility helper.`); - return; - } - let timeString = settings.getValueSync(context, TIME_FORMAT_KEY, "24"); - Log.showDebug(TAG, `timeFormat change: ${timeString}`); - this.mUse24hFormat = timeString == "24"; - this.notifyTimeChange(); - }; - - private notifyTimeChange() { - Log.showDebug(TAG, "notifyTimeChange"); - let args: TimeEventArgs = { - date: new Date(), - timeFormat: this.mUse24hFormat, - }; - EventManager.publish(obtainLocalEvent(TIME_CHANGE_EVENT, args)); - } -} - -let sTimeManager = createOrGet(TimeManager, TAG); - -export default sTimeManager as TimeManager; diff --git a/screenlock4merge/common/src/main/ets/default/Trace.ts b/screenlock4merge/common/src/main/ets/default/Trace.ts deleted file mode 100644 index ee7102ad..00000000 --- a/screenlock4merge/common/src/main/ets/default/Trace.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2022 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 byTrace from "@ohos.bytrace"; -import Log from "./Log"; - -export default class Trace { - static readonly CORE_METHOD_UNLOCK_SCREEN = "unlockScreen" - static readonly CORE_METHOD_CALL_ACCOUNT_SYSTEM = "callAccountSubsystem"; - static readonly CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT = "passingAccountSubsystemResult"; - static readonly CORE_METHOD_HIDE_PSD_PAGE = "hidePsdPage"; - static readonly CORE_METHOD_SHOW_LOCK_SCREEN = "showLockScreen"; - static readonly CORE_METHOD_SLEEP_TO_LOCK_SCREEN = "sleepToLockScreen" - - private static readonly TRACE_TAG = 'ScreenLock:Trace'; - private static readonly RECORD_TRACE = true; - private static readonly TRACE_LIMIT = 2000; - - private static readonly TRACE_BASE_INDEX = 10020; - - private static init() { - Log.showInfo(this.TRACE_TAG, 'init trace parameters'); - globalThis.taskIdMap = new Map(); - globalThis.traceIndex = Trace.TRACE_BASE_INDEX; - } - - /** - * start trace method - * - * @param {string} methodName - methodName for tracing - */ - static start(methodName: string) { - if (!Trace.RECORD_TRACE) return; - if (typeof globalThis.taskIdMap === 'undefined' || typeof globalThis.traceIndex === 'undefined') { - Trace.init(); - } - let taskId = globalThis.taskIdMap.get(methodName); - if (taskId == undefined) { - taskId = globalThis.traceIndex; - globalThis.traceIndex++; - globalThis.taskIdMap.set(methodName, taskId); - } - Log.showInfo(this.TRACE_TAG, `start trace ${taskId} for ${methodName}`); - byTrace.startTrace(this.TRACE_TAG + methodName, taskId, Trace.TRACE_LIMIT); - } - - /** - * stop trace method - * - * @param {string} methodName - methodName for tracing - */ - static end(methodName: string) { - if (!Trace.RECORD_TRACE) return; - if (typeof globalThis.taskIdMap === 'undefined') { - return; - } - const taskId = globalThis.taskIdMap.get(methodName); - if (taskId == undefined) { - Log.showError(this.TRACE_TAG, `fail to end trace name ${methodName}`); - return; - } - Log.showInfo(this.TRACE_TAG, `end trace ${taskId} for ${methodName}`); - byTrace.finishTrace(this.TRACE_TAG + methodName, taskId); - } -} diff --git a/screenlock4merge/common/src/main/ets/default/WindowManager.ts b/screenlock4merge/common/src/main/ets/default/WindowManager.ts deleted file mode 100644 index fde57465..00000000 --- a/screenlock4merge/common/src/main/ets/default/WindowManager.ts +++ /dev/null @@ -1,154 +0,0 @@ -// @ts-nocheck -/* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Window from "@ohos.window"; -import Log from "./Log"; -import EventManager from "./event/EventManager"; -import { obtainLocalEvent } from "./event/EventUtil"; -import { Rect } from "./Constants"; -import createOrGet from "./SingleInstanceHelper"; - -export type WindowInfo = { - visibility: boolean; - rect: Rect; -}; -export enum WindowType { - STATUS_BAR = "SystemUi_StatusBar", - NAVIGATION_BAR = "SystemUi_NavigationBar", - DROPDOWN_PANEL = "SystemUi_DropdownPanel", - NOTIFICATION_PANEL = "SystemUi_NotificationPanel", - CONTROL_PANEL = "SystemUi_ControlPanel", - VOLUME_PANEL = "SystemUi_VolumePanel", - BANNER_NOTICE = 'SystemUi_BannerNotice' -} - -export const WINDOW_SHOW_HIDE_EVENT = "WindowShowHideEvent"; -export const WINDOW_RESIZE_EVENT = "WindowResizeEvent"; - -type WindowHandle = typeof Window.Window; -const TAG = "WindowManagerSc"; -const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: number } = { - SystemUi_StatusBar: 2108, - SystemUi_NavigationBar: 2112, - SystemUi_DropdownPanel: 2109, - SystemUi_NotificationPanel: 2111, - SystemUi_ControlPanel: 2111, - SystemUi_VolumePanel: 2111, - SystemUi_BannerNotice: 2111, -}; -const DEFAULT_WINDOW_INFO: WindowInfo = { - visibility: false, - rect: { left: 0, top: 0, width: 0, height: 0 }, -}; - -/** - * Manage window size changes. - */ -class WindowManager { - mWindowInfos: Map = new Map(); - - async createWindow(context: any, name: WindowType, rect: Rect, loadContent: string): Promise { - Log.showInfo(TAG, `createWindow name: ${name}, rect: ${JSON.stringify(rect)}, url: ${loadContent}`); - let winHandle = null; - try{ - winHandle = await Window.create(context, name, SYSTEM_WINDOW_TYPE_MAP[name]); - await winHandle.moveTo(rect.left, rect.top); - await winHandle.resetSize(rect.width, rect.height); - await winHandle.loadContent(loadContent); - this.mWindowInfos.set(name, { visibility: false, rect }); - Log.showInfo(TAG, `create window[${name}] success.`); - } catch (err) { - Log.showError(TAG, `create window[${name}] failed. error:${JSON.stringify(err)}`); - } - return winHandle; - } - - async resetSizeWindow(name: WindowType, rect: Rect): Promise { - Log.showInfo(TAG, `resetSizeWindow name: ${name}, rect: ${JSON.stringify(rect)}`); - let window = null; - try { - window = await Window.find(name); - await window.moveTo(rect.left, rect.top); - await window.resetSize(rect.width, rect.height); - } catch(err) { - Log.showError(TAG, `resetSizeWindow failed. error:${JSON.stringify(err)}`); - } - this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), rect }); - EventManager.publish( - obtainLocalEvent(WINDOW_RESIZE_EVENT, { - windowName: name, - rect, - }) - ); - Log.showInfo(TAG, `resize window[${name}] success.`); - } - - async showWindow(name: WindowType): Promise { - Log.showInfo(TAG, `showWindow name: ${name}`); - let window = null; - try { - window = await Window.find(name); - await window.show(); - } catch (err) { - Log.showError(TAG, `showWindow failed. error:${JSON.stringify(err)}`); - } - this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), visibility: true }); - EventManager.publish( - obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { - windowName: name, - isShow: true, - }) - ); - Log.showInfo(TAG, `show window[${name}] success.`); - } - - async hideWindow(name: WindowType): Promise { - Log.showInfo(TAG, `hideWindow name: ${name}`); - let window = null; - try { - window = await Window.find(name); - await window.hide(); - } catch (err) { - Log.showError(TAG, `hideWindow failed. error:${JSON.stringify(err)}`); - } - this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), visibility: false }); - EventManager.publish( - obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { - windowName: name, - isShow: false, - }) - ); - Log.showInfo(TAG, `hide window[${name}] success.`); - } - - getWindowInfo(name: WindowType): WindowInfo | undefined { - return this.mWindowInfos.get(name); - } - - // function need remove - setWindowInfo(configInfo) { - Log.showDebug(TAG, `setWindowInfo, configInfo ${JSON.stringify(configInfo)}`); - let maxWidth = AppStorage.SetAndLink("maxWidth", configInfo.maxWidth); - let maxHeight = AppStorage.SetAndLink("maxHeight", configInfo.maxHeight); - let minHeight = AppStorage.SetAndLink("minHeight", configInfo.minHeight); - maxWidth.set(configInfo.maxWidth); - maxHeight.set(configInfo.maxHeight); - minHeight.set(configInfo.minHeight); - } -} - -let sWindowManager = createOrGet(WindowManager, TAG); -export default sWindowManager as WindowManager; diff --git a/screenlock4merge/common/src/main/ets/default/abilitymanager/abilityManager.ts b/screenlock4merge/common/src/main/ets/default/abilitymanager/abilityManager.ts deleted file mode 100644 index b2441693..00000000 --- a/screenlock4merge/common/src/main/ets/default/abilitymanager/abilityManager.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 Log from '../Log'; - -const TAG = 'AbilityManager'; - -export default class AbilityManager { - static ABILITY_NAME_ENTRY = 'SystemUi_Entry'; - static ABILITY_NAME_STATUS_BAR = 'SystemUi_StatusBar'; - static ABILITY_NAME_NAVIGATION_BAR = 'SystemUi_NavigationBar'; - static ABILITY_NAME_VOLUME_PANEL = 'SystemUi_VolumePanel'; - static ABILITY_NAME_NOTIFICATION_MANAGEMENT = 'SystemUi_NotificationManagement'; - static ABILITY_NAME_DROPDOWN_PANEL = 'SystemUi_DropdownPanel'; - static ABILITY_NAME_NOTIFICATION_PANEL = 'SystemUi_NotificationPanel'; - static ABILITY_NAME_CONTROL_PANEL = 'SystemUi_ControlPanel'; - static ABILITY_NAME_BANNER_NOTICE = 'SystemUi_BannerNotice'; - static ABILITY_NAME_SCREEN_LOCK = 'SystemUi_ScreenLock'; - - static setContext(abilityName: string, context) { - Log.showDebug(TAG, `setContext, abilityName: ${abilityName}`); - globalThis[abilityName + '_Context'] = context; - } - - static getContext(abilityName?: string) { - Log.showDebug(TAG, `getContext, abilityName: ${abilityName}`); - if (!abilityName) { - abilityName = AbilityManager.ABILITY_NAME_ENTRY; - } - return globalThis[abilityName + '_Context']; - } - - static setAbilityData(abilityName, key, data) { - Log.showDebug(TAG, `setAbilityData, abilityName: ${abilityName} key: ${key} data: ${JSON.stringify(data)}`); - globalThis[abilityName + '_data_' + key] = data; - } - - static getAbilityData(abilityName, key) { - Log.showDebug(TAG, `getAbilityData, abilityName: ${abilityName} key: ${key} `); - return globalThis[abilityName + '_data_' + key]; - } - - static startAbility(want, callback?: Function) { - Log.showDebug(TAG, `startAbility, want: ${JSON.stringify(want)}`); - let context = AbilityManager.getContext(); - context.startAbility(want).then(() => { - Log.showInfo(TAG, `startAbility, then`); - if (callback) { - callback(null); - } - }).catch((error) => { - Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); - callback(error); - }) - } -} diff --git a/screenlock4merge/common/src/main/ets/default/abilitymanager/bundleManager.ts b/screenlock4merge/common/src/main/ets/default/abilitymanager/bundleManager.ts deleted file mode 100644 index d4d55de0..00000000 --- a/screenlock4merge/common/src/main/ets/default/abilitymanager/bundleManager.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 BundleMgr from "@ohos.bundle"; -import Context from "application/ServiceExtensionContext"; -import Log from "../Log"; -import SwitchUserManager from "../SwitchUserManager"; - -const TAG = "BRManager"; - -export default class BundleManager { - static async getResourceManager(tag: string, context: Context, bundleName: string) { - Log.showInfo(TAG, `getResourceManager from: ${tag}`); - let bundleContext = await context.createBundleContext(bundleName) - return await bundleContext.resourceManager; - } - - static async getBundleInfo(tag: string, bundleName: string, getInfo: - any, requestId?: number) { - let userInfo = { - userId: requestId ?? (await SwitchUserManager.getInstance().getCurrentUserInfo()).userId, - }; - Log.showDebug(TAG, `getBundleInfo from: ${tag}, userId: ${userInfo.userId}`); - return await BundleMgr.getBundleInfo(bundleName, getInfo, userInfo); - } -} \ No newline at end of file diff --git a/screenlock4merge/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts b/screenlock4merge/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts deleted file mode 100644 index 90a33a51..00000000 --- a/screenlock4merge/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 FeatureAbility from '@ohos.ability.featureAbility'; -import Log from '../Log'; - -const TAG = 'FeatureAbilityManager'; - -export default class FeatureAbilityManager { - - openAbility(tag, want) { - Log.showInfo(TAG, `openAbility from: ${tag}`); - let result = FeatureAbility.startAbility(want) - .then(data => - Log.showInfo(TAG, `tag: ${tag} promise then: ${JSON.stringify(data)}`)) - .catch(error => - Log.showError(TAG, `tag: ${tag} promise catch: ${JSON.stringify(error)}, openAbility result: ${result}`)); - } - - getAbilityWant(listener) { - FeatureAbility.getWant((err, data) => { - Log.showDebug(TAG, `getAbilityWant callBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - if (err.code !== 0) { - Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); - return; - } else { - if(listener != null && listener != undefined) { - listener(data); - } - } - }); - } - - finishAbilityWithResult(abilityResult) { - FeatureAbility.finishWithResult(abilityResult, (err, data) => { - if (err.code !== 0) { - Log.showError(TAG, `failed to finishWithResult because ${JSON.stringify(err)}`); - return; - } - FeatureAbilityManager.finishAbility(); - }); - } - - static finishAbility() { - FeatureAbility.terminateAbility((err, data) => { - if (err.code !== 0) { - Log.showError(TAG, `failed to finishAbility because ${JSON.stringify(err)}`); - return; - } - Log.showInfo(TAG, ` finishAbility callback: data:${data}`); - }); - } -} \ No newline at end of file diff --git a/screenlock4merge/common/src/main/ets/default/abilitymanager/notificationManager.ts b/screenlock4merge/common/src/main/ets/default/abilitymanager/notificationManager.ts deleted file mode 100644 index ad137fc6..00000000 --- a/screenlock4merge/common/src/main/ets/default/abilitymanager/notificationManager.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 { NotificationSubscriber } from './notification/notificationSubscriber'; -import Notification from '@ohos.notification'; -import Log from '../Log'; - -const TAG = 'NotificationManager'; - - -export default class NotificationManager { - - static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; - static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; - static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; - - static subscribeNotification(tag, subscriber, asyncCallback) { - Log.showInfo(TAG, `subscribeNotification from: ${tag}`)); - Notification.subscribe(subscriber, asyncCallback); - } - - static unsubscribeNotification(tag, subscriber) { - Log.showInfo(TAG, `subscribeNotification from: ${tag}`)); - Notification.unsubscribe(subscriber); - } - - static removeAll(tag, callback) { - Log.showInfo(TAG, `removeAll from: ${tag}`)); - Notification.removeAll(callback); - } - - static remove(tag, hashCode, callback) { - Log.showInfo(TAG, `remove from: ${tag}`)); - Notification.remove(hashCode, callback) - } - - static getAllActiveNotifications(tag, callback) { - Log.showInfo(TAG, `getAllActiveNotifications from: ${tag}`)); - Notification.getAllActiveNotifications(callback); - } - -} \ No newline at end of file diff --git a/screenlock4merge/common/src/main/ets/default/commonEvent/CommonEventManager.ts b/screenlock4merge/common/src/main/ets/default/commonEvent/CommonEventManager.ts deleted file mode 100644 index 1f9b048c..00000000 --- a/screenlock4merge/common/src/main/ets/default/commonEvent/CommonEventManager.ts +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 commonEvent from "@ohos.commonEvent"; -import { CommonEventData } from "commonEvent/commonEventData"; -import EventManager from "../event/EventManager"; -import Log from "../Log"; -import { SCREEN_CHANGE_EVENT } from "../ScreenLockManager"; - -export type CommonEventManager = { - subscriberCommonEvent: () => Promise; - unSubscriberCommonEvent: () => void; - applyPolicy: (policys: Array) => void; - release: () => void; -}; - -export enum POLICY { - SCREEN_POLICY = "screenOnOffPolicy", -} - -type ClearPolicy = () => void; -type InnerManager = { subscriberCommonEvent: () => void; unSubscriberCommonEvent: () => void }; -const policyMap: { [key in POLICY]: (manager: InnerManager) => ClearPolicy } = { - screenOnOffPolicy: ScreenPolicy, -}; - -export function getCommonEventManager( - tag: string, - subscribeInfos: { events: Array }, - commonEventCallback: (data: CommonEventData) => void, - subscribeStateChange?: (isSubscribe: boolean) => void -): CommonEventManager { - const TAG = `CommonEvent_${tag}`; - const SUBSCRIBE_INFOS = subscribeInfos; - let unSubcribers: Array<() => void> = []; - let policyClearCb: Map | undefined = undefined; - - async function subscriberCommonEvent() { - Log.showDebug(TAG, "registerSubscriber start"); - let subscriber = await commonEvent.createSubscriber(SUBSCRIBE_INFOS); - commonEvent.subscribe(subscriber, (err, data) => { - if (err.code != 0) { - Log.showError(TAG, `Can't handle common event, err: ${JSON.stringify(err)}`); - return; - } - Log.showInfo(TAG, `handle common event: ${data.event}`); - commonEventCallback(data); - }); - unSubcribers.push(() => commonEvent.unsubscribe(subscriber)); - subscribeStateChange && subscribeStateChange(true); - Log.showInfo(TAG, `registerSubscriber success, size: ${unSubcribers.length}`); - } - - function unSubscriberCommonEvent() { - Log.showDebug(TAG, `UnSubcribers size: ${unSubcribers.length}`); - unSubcribers.forEach((unsubscribe) => unsubscribe()); - unSubcribers.length = 0; - subscribeStateChange && subscribeStateChange(false); - } - - function applyPolicy(policys: Array) { - const innerManager = { subscriberCommonEvent, unSubscriberCommonEvent }; - policyClearCb = policyClearCb ?? new Map(); - policys.forEach((policy) => { - if (policyClearCb) { - !policyClearCb.has(policy) && policyClearCb.set(policy, policyMap[policy](innerManager)); - Log.showDebug(TAG, `apply policy: ${policy}`); - } - }); - } - - function release() { - policyClearCb?.forEach((cb) => cb()); - policyClearCb?.clear(); - unSubscriberCommonEvent(); - } - - return { subscriberCommonEvent, unSubscriberCommonEvent, applyPolicy, release }; -} - -function ScreenPolicy(manager: InnerManager): ClearPolicy { - return EventManager.subscribe(SCREEN_CHANGE_EVENT, (isScreenOn: boolean) => { - isScreenOn ? manager.subscriberCommonEvent() : manager.unSubscriberCommonEvent(); - }); -} diff --git a/screenlock4merge/common/src/main/ets/default/event/EventBus.ts b/screenlock4merge/common/src/main/ets/default/event/EventBus.ts deleted file mode 100644 index 9195cc25..00000000 --- a/screenlock4merge/common/src/main/ets/default/event/EventBus.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2022 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 Log from "../Log"; - -export type Callback = (args: any) => void; -const TAG = "EventBus"; - -export interface EventBus { - on(event: T | T[], cb: Callback): () => void; - once(event: T, cb: Callback): () => void; - off(event: T | T[] | undefined, cb: Callback): void; - emit(event: T, args: any): void; -} - -export function createEventBus(): EventBus { - let _cbs: { [key: string]: Set } = {}; - - function on(events: T | T[], cb: Callback): () => void { - if (Array.isArray(events)) { - events.forEach((e) => on(e, cb)); - } else { - (_cbs[events] || (_cbs[events] = new Set())).add(cb); - Log.showInfo(TAG, `add event[${events}] callback, size: ${_cbs[events]?.size}`); - } - return () => off(events, cb); - } - - function once(event: T, cb: Callback): () => void { - let newCallback = (args: any) => { - cb(args); - removeSelf(); - }; - function removeSelf() { - off(event, newCallback); - } - return on(event, newCallback); - } - - function off(event: T | T[] | undefined, cb: Callback) { - if (!event) { - _cbs = {}; - Log.showInfo(TAG, `remove event[${event}] all callback`); - return; - } - if (Array.isArray(event)) { - event.forEach((e) => off(e, cb)); - return; - } - _cbs[event]?.delete(cb); - Log.showInfo(TAG, `remove event[${event}] callback, size: ${_cbs[event]?.size}`); - } - - function emit(event: T, args: any) { - _cbs[event]?.forEach((cb) => cb(args)); - } - - function stickyEmit(event: T, argument: any[]) {} - return { - on, - once, - off, - emit, - }; -} \ No newline at end of file diff --git a/screenlock4merge/common/src/main/ets/default/event/EventManager.ts b/screenlock4merge/common/src/main/ets/default/event/EventManager.ts deleted file mode 100644 index 91890758..00000000 --- a/screenlock4merge/common/src/main/ets/default/event/EventManager.ts +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2022 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 ServiceExtensionContext from "application/ServiceExtensionContext"; -import Log from "../Log"; -import createOrGet from "../SingleInstanceHelper"; -import { EventParser, START_ABILITY_EVENT, Event, LocalEvent } from "./EventUtil"; -import { Callback, createEventBus, EventBus } from "./EventBus"; - -export type unsubscribe = () => void; -export type Events = string | string[]; - -const TAG = "EventManagerSc"; - -class EventManager { - mEventBus: EventBus; - eventParser: EventParser; - mContext: ServiceExtensionContext | undefined; - - constructor() { - this.mEventBus = createEventBus(); - this.eventParser = { - local: this.publishLocalEvent, - ability: this.startAbility, - commonEvent: this.publishCommonEvent, - remote: this.publishRemoteEvent, - }; - } - - setContext(ctx: ServiceExtensionContext) { - this.mContext = ctx; - } - - publish(event: Event): boolean { - return this.eventParser[event.target].call(this, event.data); - } - - subscribe(eventType: Events, callback: Callback): unsubscribe { - return this.mEventBus.on(eventType, callback); - } - - subscribeOnce(eventType: string, callback: Callback): unsubscribe { - return this.mEventBus.once(eventType, callback); - } - - private publishLocalEvent(data: LocalEvent): boolean { - Log.showInfo(TAG, `publish localEvent type: ${data.eventName}`); - if (data.eventName) { - this.mEventBus.emit(data.eventName, data.args); - return true; - } - return false; - } - - private startAbility(data: { [key: string]: any }): boolean { - Log.showInfo(TAG, `start Ability: ${data.abilityName}`); - if (data.bundleName && data.abilityName && this.mContext) { - this.mEventBus.emit(START_ABILITY_EVENT, { abilityName: data.abilityName }); - this.mContext.startAbility({ - bundleName: data.bundleName, - abilityName: data.abilityName, - parameters: data.args??undefined - }); - return true; - } - return false; - } - - private publishRemoteEvent(data: { [key: string]: any }): boolean { - return false; - } - - private publishCommonEvent(data: { [key: string]: any }): boolean { - return false; - } -} - -let sEventManager = createOrGet(EventManager, TAG); - -export default sEventManager as EventManager; \ No newline at end of file diff --git a/screenlock4merge/common/src/main/ets/default/event/EventUtil.ts b/screenlock4merge/common/src/main/ets/default/event/EventUtil.ts deleted file mode 100644 index 33ba707e..00000000 --- a/screenlock4merge/common/src/main/ets/default/event/EventUtil.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2022 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 Log from "../Log"; - -export type EventTarget = "local" | "remote" | "ability" | "commonEvent"; -export type Event = { - target: EventTarget; - data: { [key: string]: any }; -}; -export type EventParser = { - [key in EventTarget]: (data: any) => boolean; -}; -export type LocalEvent = { - eventName: string; - args: any; -}; - -export const START_ABILITY_EVENT = "startAbilityEvent"; -export const PUBLISH_COMMON_EVENT = "publishCommonEvent"; - -const TAG = "EventUtil"; -const LOCAL_EVENT_TYPE = "local"; -const START_ABILITY_TYPE = "ability"; - -export function obtainLocalEvent(event: string, args: any): Event & { data: LocalEvent } { - return { - target: LOCAL_EVENT_TYPE, - data: { - eventName: event, - args, - }, - }; -} - -export function obtainStartAbility(bundleName: string, abilityName: string, args?: any): Event { - return { - target: START_ABILITY_TYPE, - data: { - bundleName, - abilityName, - args - }, - }; -} - -export function parseEventString(eventString: string | undefined): Event | undefined { - // string must be "local=eventName|args" or "ability=bundleName|abilityName" - if (!eventString) { - return; - } - let [eventType, eventData] = eventString.split("="); - if (eventType == LOCAL_EVENT_TYPE && eventData) { - let [localEventName, args] = eventData.split("|"); - if (localEventName) { - Log.showDebug(TAG, `parseEventData name:${localEventName}, args: ${args}`); - return obtainLocalEvent(localEventName, args); - } - } - if (eventType == START_ABILITY_TYPE && eventData) { - let [bundleName, abilityName] = eventData.split("|"); - if (bundleName && abilityName) { - Log.showDebug(TAG, `parseEventData bundleName:${bundleName}, abilityName: ${abilityName}`); - return obtainStartAbility(bundleName, abilityName); - } - } - Log.showError(TAG, `Can't parse event data: ${eventString}`); - return undefined; -} diff --git a/screenlock4merge/common/src/main/module.json5 b/screenlock4merge/common/src/main/module.json5 deleted file mode 100644 index 36beeaf4..00000000 --- a/screenlock4merge/common/src/main/module.json5 +++ /dev/null @@ -1,17 +0,0 @@ -{ - "module": { - "name": "common", - "type": "har", - "deviceTypes": [ - "default", - "tablet" - ], - "metadata": [ - { - "name": "ArkTSPartialUpdate", - "value": "true" - } - ], - "uiSyntax": "ets" - } -} diff --git a/screenlock4merge/common/src/main/resources/base/element/float.json b/screenlock4merge/common/src/main/resources/base/element/float.json deleted file mode 100644 index 03bfc6ff..00000000 --- a/screenlock4merge/common/src/main/resources/base/element/float.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "float": [ - { - "name": "signal_status_margin_Left_right", - "value": "5vp" - }, - { - "name": "signal_fontSize", - "value": "16fp" - } - ] -} \ No newline at end of file diff --git a/screenlock4merge/common/src/main/resources/base/element/string.json b/screenlock4merge/common/src/main/resources/base/element/string.json deleted file mode 100644 index 5b6f96ed..00000000 --- a/screenlock4merge/common/src/main/resources/base/element/string.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "string": [ - { - "name": "monday", - "value": "星期一" - }, - { - "name": "tuesday", - "value": "星期二" - }, - { - "name": "wednesday", - "value": "星期三" - }, - { - "name": "thursday", - "value": "星期四" - }, - { - "name": "friday", - "value": "星期五" - }, - { - "name": "saturday", - "value": "星期六" - }, - { - "name": "sunday", - "value": "星期日" - } - ] -} \ No newline at end of file diff --git a/screenlock4merge/common/src/main/resources/en_US/element/string.json b/screenlock4merge/common/src/main/resources/en_US/element/string.json deleted file mode 100644 index fd39e096..00000000 --- a/screenlock4merge/common/src/main/resources/en_US/element/string.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "string": [ - { - "name": "app_name", - "value": "ScreenLock" - }, - { - "name": "monday", - "value": "Monday" - }, - { - "name": "tuesday", - "value": "Tuesday" - }, - { - "name": "wednesday", - "value": "Wednesday" - }, - { - "name": "thursday", - "value": "Thursday" - }, - { - "name": "friday", - "value": "Friday" - }, - { - "name": "saturday", - "value": "Saturday" - }, - { - "name": "sunday", - "value": "Sunday" - } - ] -} \ No newline at end of file diff --git a/screenlock4merge/common/src/main/resources/phone/element/float.json b/screenlock4merge/common/src/main/resources/phone/element/float.json deleted file mode 100644 index ffc86e2b..00000000 --- a/screenlock4merge/common/src/main/resources/phone/element/float.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "float": [ - { - "name": "signal_status_margin_Left_right", - "value": "0" - }, - { - "name": "signal_fontSize", - "value": "12fp" - } - ] -} \ No newline at end of file diff --git a/screenlock4merge/common/src/main/resources/zh_CN/element/string.json b/screenlock4merge/common/src/main/resources/zh_CN/element/string.json deleted file mode 100644 index 92e33923..00000000 --- a/screenlock4merge/common/src/main/resources/zh_CN/element/string.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "string": [ - { - "name": "app_name", - "value": "ScreenLock" - }, - { - "name": "monday", - "value": "星期一" - }, - { - "name": "tuesday", - "value": "星期二" - }, - { - "name": "wednesday", - "value": "星期三" - }, - { - "name": "thursday", - "value": "星期四" - }, - { - "name": "friday", - "value": "星期五" - }, - { - "name": "saturday", - "value": "星期六" - }, - { - "name": "sunday", - "value": "星期日" - } - ] -} \ No newline at end of file diff --git a/screenlock4merge/entry/build-profile.json5 b/screenlock4merge/entry/build-profile.json5 deleted file mode 100644 index 7dc37bb9..00000000 --- a/screenlock4merge/entry/build-profile.json5 +++ /dev/null @@ -1,13 +0,0 @@ -{ - "apiType": 'stageMode', - "buildOption": { - }, - "targets": [ - { - "name": "default", - }, - { - "name": "ohosTest", - } - ] -} \ No newline at end of file diff --git a/screenlock4merge/entry/hvigorfile.js b/screenlock4merge/entry/hvigorfile.js deleted file mode 100644 index d7720ee6..00000000 --- a/screenlock4merge/entry/hvigorfile.js +++ /dev/null @@ -1,2 +0,0 @@ -// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/screenlock4merge/entry/package-lock.json b/screenlock4merge/entry/package-lock.json deleted file mode 100644 index 15bc7145..00000000 --- a/screenlock4merge/entry/package-lock.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "entry", - "version": "1.0.0", - "lockfileVersion": 1 -} diff --git a/screenlock4merge/entry/package.json b/screenlock4merge/entry/package.json deleted file mode 100644 index c7685ac4..00000000 --- a/screenlock4merge/entry/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "license": "ISC", - "devDependencies": {}, - "name": "entry", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" - }, - "description": "example description", - "repository": {}, - "version": "1.0.0", - "dependencies": {} -} diff --git a/screenlock4merge/entry/src/main/ets/Application/AbilityStage.ts b/screenlock4merge/entry/src/main/ets/Application/AbilityStage.ts deleted file mode 100644 index 78dd5641..00000000 --- a/screenlock4merge/entry/src/main/ets/Application/AbilityStage.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import AbilityStage from "@ohos.app.ability.AbilityStage"; -import Log from '../../../../../common/src/main/ets/default/Log'; - -const TAG = "Entry_AbilityStage"; - -export default class MyAbilityStage extends AbilityStage { - onCreate() { - Log.showInfo(TAG, "MyAbilityStage onCreate") - } -} \ No newline at end of file diff --git a/screenlock4merge/entry/src/main/ets/MainAbility/MainAbility.ts b/screenlock4merge/entry/src/main/ets/MainAbility/MainAbility.ts deleted file mode 100644 index 087cfb48..00000000 --- a/screenlock4merge/entry/src/main/ets/MainAbility/MainAbility.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Ability from '@ohos.app.ability.UIAbility' -import Log from '../../../../../common/src/main/ets/default/Log'; - -const TAG = "Entry_MainAbility"; - -export default class MainAbility extends Ability { - onCreate(want, launchParam) { - Log.showInfo(TAG, "MainAbility onCreate") - globalThis.abilityWant = want; - } - - onDestroy() { - Log.showInfo(TAG, "MainAbility onDestroy") - } - - onWindowStageCreate(windowStage) { - // Main window is created, set main page for this ability - Log.showInfo(TAG, "MainAbility onWindowStageCreate") - - windowStage.setUIContent(this.context, "pages/index", null) - } - - onWindowStageDestroy() { - // Main window is destroyed, release UI related resources - Log.showInfo(TAG, "MainAbility onWindowStageDestroy") - } - - onForeground() { - // Ability has brought to foreground - Log.showInfo(TAG, "MainAbility onForeground") - } - - onBackground() { - // Ability has back to background - Log.showInfo(TAG, "MainAbility onBackground") - } -}; diff --git a/screenlock4merge/entry/src/main/ets/pages/index.ets b/screenlock4merge/entry/src/main/ets/pages/index.ets deleted file mode 100644 index f32a5a18..00000000 --- a/screenlock4merge/entry/src/main/ets/pages/index.ets +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2021-2022 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. - */ - -@Entry -@Component -struct Index { - @State message: string = 'Hello World' - - build() { - Row() { - Column() { - Text(this.message) - .fontSize(50) - .fontWeight(FontWeight.Bold) - } - .width('100%') - } - .height('100%') - } -} \ No newline at end of file diff --git a/screenlock4merge/entry/src/main/module.json5 b/screenlock4merge/entry/src/main/module.json5 deleted file mode 100644 index 1821c59b..00000000 --- a/screenlock4merge/entry/src/main/module.json5 +++ /dev/null @@ -1,45 +0,0 @@ -{ - "module": { - "name": "entry", - "type": "entry", - "srcEntrance": "./ets/Application/AbilityStage.ts", - "description": "$string:entry_desc", - "mainElement": "MainAbility", - "deviceTypes": [ - "default", - "tablet" - ], - "metadata": [ - { - "name": "ArkTSPartialUpdate", - "value": "true" - } - ], - "deliveryWithInstall": true, - "installationFree": false, - "pages": "$profile:main_pages", - "uiSyntax": "ets", - "abilities": [ - { - "name": "MainAbility", - "srcEntrance": "./ets/MainAbility/MainAbility.ts", - "description": "$string:MainAbility_desc", - "icon": "$media:icon", - "label": "$string:MainAbility_label", - "visible": true, - "startWindowIcon": "$media:icon", - "startWindowBackground": "$color:startWindowBackground", - "skills": [ - { - "entities": [ - "entity.system.home" - ], - "actions": [ - "action.system.home" - ] - } - ] - } - ] - } -} \ No newline at end of file diff --git a/screenlock4merge/entry/src/main/resources/base/element/color.json b/screenlock4merge/entry/src/main/resources/base/element/color.json deleted file mode 100644 index bb3c02e7..00000000 --- a/screenlock4merge/entry/src/main/resources/base/element/color.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "color": [ - { - "name": "startWindowBackground", - "value": "#ffffff" - } - ] -} \ No newline at end of file diff --git a/screenlock4merge/entry/src/main/resources/base/element/string.json b/screenlock4merge/entry/src/main/resources/base/element/string.json deleted file mode 100644 index 490210a3..00000000 --- a/screenlock4merge/entry/src/main/resources/base/element/string.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "string": [ - { - "name": "entry_desc", - "value": "description" - }, - { - "name": "MainAbility_desc", - "value": "description" - }, - { - "name": "MainAbility_label", - "value": "label" - } - ] -} \ No newline at end of file diff --git a/screenlock4merge/entry/src/main/resources/base/media/icon.png b/screenlock4merge/entry/src/main/resources/base/media/icon.png deleted file mode 100644 index ce307a8827bd75456441ceb57d530e4c8d45d36c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6790 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 { - win.loadContent("pages/index").then(() => { - Log.showInfo(TAG, name + " window loadContent in then! ") - win.show().then(() => { - Log.showInfo(TAG, "then begin " + name + " window show in then! "); - }) - }) - }, (error) => { - Log.showError(TAG, name + " window createFailed, error.code = " + error.code) - }) - } - - private async statusBarWindow() { - let dis = await display.getDefaultDisplay(); - Log.showDebug(TAG, `api8New onCreate, dis: ${JSON.stringify(dis)}`); - let rect; - if (dis.width > dis.height) { // Pad、PC horizontalScreen Mode - rect = { - left: 0, - top: 0, - width: '100%', - height: (48 * dis.width) / 1280, - } - } else { // Phone verticalScreen Mode - rect = { - left: 0, - top: 0, - width: '100%', - height: (48 * dis.width) / 720 - } - } - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "rect", rect); - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "dis", { - width: dis.width, - height: dis.height, - }); - Log.showInfo(TAG, `createWindow success.`); - } - - onDestroy() { - Log.showInfo(TAG, 'api8New onDestroy'); - sTimeManager.release() - - } -} - -export default ServiceExtAbility \ No newline at end of file diff --git a/screenlock4merge/product/phone/src/main/module.json5 b/screenlock4merge/product/phone/src/main/module.json5 deleted file mode 100644 index 4e5b6b2e..00000000 --- a/screenlock4merge/product/phone/src/main/module.json5 +++ /dev/null @@ -1,95 +0,0 @@ -{ - "module": { - "name": "phone", - "type": "feature", - "srcEntrance": "./ets/Application/AbilityStage.ts", - "description": "$string:phone_desc", - "mainElement": "com.ohos.systemui.screenlock.ServiceExtAbility", - "deviceTypes": [ - "default" - ], - "metadata": [ - { - "name": "ArkTSPartialUpdate", - "value": "true" - } - ], - "deliveryWithInstall": true, - "installationFree": false, - "pages": "$profile:main_pages", - "uiSyntax": "ets", - "requestPermissions": [ - { - "name": "ohos.permission.MANAGE_LOCAL_ACCOUNTS" - }, - { - "name": "ohos.permission.INTERACT_ACROSS_LOCAL_ACCOUNTS_EXTENSION" - }, - { - "name": "ohos.permission.USE_USER_IDM" - }, - { - "name": "ohos.permission.ACCESS_USER_AUTH_INTERNAL" - }, - { - "name": "ohos.permission.ACCESS_PIN_AUTH" - }, - { - "name": "ohos.permission.NOTIFICATION_CONTROLLER" - }, - { - "name": "ohos.permission.GET_WALLPAPER" - }, - { - "name": "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED" - }, - { - "name": "ohos.permission.GET_WIFI_INFO" - }, - { - "name": "ohos.permission.SET_WIFI_INFO" - }, - { - "name": "ohos.permission.MANAGE_WIFI_CONNECTION" - }, - { - "name": "ohos.permission.GET_NETWORK_INFO" - }, - { - "name": "ohos.permission.USE_BLUETOOTH" - }, - { - "name": "ohos.permission.DISCOVER_BLUETOOTH" - }, - { - "name": "ohos.permission.MANAGE_BLUETOOTH" - }, - { - "name": "ohos.permission.CAPTURE_SCREEN" - }, - { - "name": "ohos.permission.MANAGE_SECURE_SETTINGS" - }, - { - "name": "ohos.permission.SET_WALLPAPER" - }, - { - "name": "ohos.permission.CONNECT_IME_ABILITY" - }, - { - "name": "ohos.permission.ACCESS_SCREEN_LOCK_INNER" - } - ], - "extensionAbilities": [ - { - "name": "com.ohos.systemui.screenlock.ServiceExtAbility", - "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", - "description": "$string:MainAbility_desc", - "icon": "$media:icon", - "label": "$string:app_name", - "visible": true, - "type": "service" - } - ] - } -} \ No newline at end of file diff --git a/screenlock4merge/product/phone/src/main/resources/base/element/string.json b/screenlock4merge/product/phone/src/main/resources/base/element/string.json deleted file mode 100644 index 93513a9c..00000000 --- a/screenlock4merge/product/phone/src/main/resources/base/element/string.json +++ /dev/null @@ -1,216 +0,0 @@ -{ - "string": [ - { - "name": "phone_desc", - "value": "description" - }, - { - "name": "app_name", - "value": "ScreenLock" - }, - { - "name": "MainAbility_desc", - "value": "JS_Phone_Empty Feature Ability" - }, - { - "name": "description_mainability", - "value": "JS_Phone_Empty Feature Ability" - }, - { - "name": "input", - "value": "输入密码" - }, - { - "name": "monday", - "value": "星期一" - }, - { - "name": "tuesday", - "value": "星期二" - }, - { - "name": "wednesday", - "value": "星期三" - }, - { - "name": "thursday", - "value": "星期四" - }, - { - "name": "friday", - "value": "星期五" - }, - { - "name": "saturday", - "value": "星期六" - }, - { - "name": "sunday", - "value": "星期日" - }, - { - "name": "yyyy_mm_dd", - "value": "%d/%d/%d" - }, - { - "name": "mm_dd", - "value": "%d/%d" - }, - { - "name": "noticeitem", - "value": "noticeitem" - }, - { - "name": "nonotification_text", - "value": "无通知" - }, - { - "name": "closeNotification", - "value": "关闭通知" - }, - { - "name": "moreSettings", - "value": "更多设置" - }, - { - "name": "cancel", - "value": "取消" - }, - { - "name": "enter", - "value": "回复" - }, - { - "name": "Sending", - "value": "发送中" - }, - { - "name": "close", - "value": "关闭" - }, - { - "name": "closeNovice", - "value": "关闭通知" - }, - { - "name": "confirm_message", - "value": "是否关掉”%s“的所有通知?" - }, - { - "name": "device_dialog_title", - "value": "设备选择" - }, - { - "name": "distributed_devicename", - "value": "来自”%s“设备" - }, - { - "name": "lock_prompt", - "value": "屏幕锁定中" - }, - { - "name": "unlock_prompt", - "value": "上滑解锁" - }, - { - "name": "recognizing_face", - "value": "正在识别人脸" - }, - { - "name": "face_not_recognized", - "value": "未识别成功, 双击重试" - }, - { - "name": "incorrect", - "value": "密码错误" - }, - { - "name": "incorrect_promp_times", - "value": "密码错误,还可尝试%d次" - }, - { - "name": "incorrect_promp_freezing", - "value": "密码错误,还可尝试%d次,失败后将锁定%s" - }, - { - "name": "input_promp", - "value": "请%s后重试" - }, - { - "name": "emergency_call", - "value": "紧急呼叫" - }, - { - "name": "back", - "value": "返回" - }, - { - "name": "delete", - "value": "删除" - }, - { - "name": "done", - "value": "确定" - }, - { - "name": "charge_full", - "value": "已充满" - }, - { - "name": "charging", - "value": "正在充电%s" - }, - { - "name": "battery_soc", - "value": "目前电量%s" - }, - { - "name": "shutdown", - "value": "关机" - }, - { - "name": "reboot", - "value": "重启" - }, - { - "name": "signalcomponent", - "value": "signalcomponent" - }, - { - "name": "china_mobile", - "value": "中国移动" - }, - { - "name": "china_telecom", - "value": "中国电信" - }, - { - "name": "china_unicom", - "value": "中国联通" - }, - { - "name": "net_null", - "value": "没有 SIM 卡" - }, - { - "name": "2G", - "value": "2G" - }, - { - "name": "3G", - "value": "3G" - }, - { - "name": "4G", - "value": "4G" - }, - { - "name": "5G", - "value": "5G" - }, - { - "name": "signal_null", - "value": "×" - } - ] -} \ No newline at end of file diff --git a/screenlock4merge/product/phone/src/main/resources/base/media/icon.png b/screenlock4merge/product/phone/src/main/resources/base/media/icon.png deleted file mode 100644 index ce307a8827bd75456441ceb57d530e4c8d45d36c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6790 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 J{ieff{|mM`-7^3H diff --git a/signature/launcher.p7b b/signature/launcher.p7b index a43130791551aaea7c210d9fe6e6dff803bcc680..eebe2f01476ce27c35b7861253daf005221e311a 100644 GIT binary patch delta 319 zcmcbt^iIyfpou?=jZ>@5qwPB{BRkWACjMxkP&gAKqam*WHydX{n+IbmGYb==K@&TW z3scCrpo#4dOB36VjShcUCO5FNPtIbMp1g$BcXA1vHJJa6O=GdXtKwxTUY93{v4|fMAi=h&W!u9A)_u0REJ+s&>DPX2=jicC||J!PK z(}Ou$ZEtOyvVy~ai;V;5@N>2-%uFoq2ChsBs*ekIHZnb5{C7pyAz1<6TAnROlVfwQ z+`p#y*J^fEiXf9B!^um}V%D5GaQT&cTjO%por3EnFR|ru?Bl4F_;I4-+jgnt0KIQ) AY5)KL delta 720 zcmaDScUj57ph?i5jZ>@5qwPB{BRkWACP9#p4HF}yA+G^98)rhB2V*KT3lpP36URq{ zLdFG69FJIKE@6>gVF)8t?4k=;uCJgVl^D$Tcw3GsrdG%|FO@ zvNvnOWCJ#~dPgTuAI}g^*Wh@!Ab;O@Cr4**_aJ|uRwW&!{EYl!y@J%D+|1(Q%=|n( zUq?Sjch~q}SLaZmF~P1OA)bEj!MGLr_&YoL#5+1W1I-J;rq0uE@>*6)U3b@z_;61* z&v;KiH-9X~0c}FaPrl4*QxDSN=Nc03ALNZoQ)sYjypvC;Yly#phzAx!T|9%G{li>? z@G64(7~P!7%xt=o8`#*b{rp3K?sj$z@$~nL5AgT#bdJPgm9M{xr(0yaW2lR#KRnnb z%d**8gZvTV>f;*V;qMn29~|Ns;)+FofNPMiXK*mc4xq1G!0LiG&tRLv&I(K(j5d=E z`PSAO8yOl{7?>McMj7bCQwArCp%RNi(8Y&;x8K?I=z`3{UhS-!r|R!E><(FT;{yNO zB$u_tcP<)mv2g&?+&NnoW+oOl0~aO*3)NYM*OkIeHtXK@HD>K~c)`lyBl74q_n}Fi udls> Date: Thu, 13 Apr 2023 17:22:33 +0800 Subject: [PATCH 364/373] Add service extension ablity OnConnect callback. Change-Id: I12ad326c12fac5d89b0a6257777758accf0d4309 --- product/phone/src/main/ets/MainAbility/MainAbility.ts | 10 ++++++++-- product/phone/src/main/module.json5 | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/product/phone/src/main/ets/MainAbility/MainAbility.ts b/product/phone/src/main/ets/MainAbility/MainAbility.ts index 922d5cb4..c771f0da 100644 --- a/product/phone/src/main/ets/MainAbility/MainAbility.ts +++ b/product/phone/src/main/ets/MainAbility/MainAbility.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility'; +import ServiceExtensionAbility from '@ohos.app.ability.ServiceExtensionAbility'; import display from '@ohos.display'; import Want from '@ohos.application.Want'; import { Log } from '@ohos/common'; @@ -28,10 +28,11 @@ import { navigationBarCommonEventManager } from '@ohos/common'; import PageDesktopViewModel from '../../../../../../feature/pagedesktop/src/main/ets/default/viewmodel/PageDesktopViewModel'; import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import initSystemUi from '../../../../../../common/src/main/ets/default/InitSystemUi'; +import SessionManagerService from '@ohos.session_manager_service' const TAG = 'LauncherMainAbility'; -export default class MainAbility extends ServiceExtension { +export default class MainAbility extends ServiceExtensionAbility { onCreate(want: Want): void { Log.showInfo(TAG,'onCreate start'); this.context.area = 0; @@ -110,6 +111,11 @@ export default class MainAbility extends ServiceExtension { this.closeFolder(); } + onConnect(want) : rpc.RemoteObject { + Log.showInfo(TAG, `onConnect, want:${want.abilityName}`); + return SessionManagerService.getRemoteObject(); + } + private closeFolder(): void { AppStorage.SetOrCreate('openFolderPageIndex', StyleConstants.DEFAULT_NUMBER_0); AppStorage.SetOrCreate('openFolderStatus', StyleConstants.DEFAULT_NUMBER_0); diff --git a/product/phone/src/main/module.json5 b/product/phone/src/main/module.json5 index 892a5093..a759eb0f 100644 --- a/product/phone/src/main/module.json5 +++ b/product/phone/src/main/module.json5 @@ -35,7 +35,7 @@ ] } ], - "visible": false, + "visible": true, "name": "com.ohos.launcher.MainAbility", "icon": "$media:icon", "description": "$string:mainability_description", -- Gitee From deba0644a3f8364c47822aa081a32c377ea8b0a3 Mon Sep 17 00:00:00 2001 From: qpzeng Date: Tue, 18 Apr 2023 21:37:20 +0800 Subject: [PATCH 365/373] modify screen size unit as px Signed-off-by: qpzeng --- .../WindowScene/screen/session/HWScreenSession.ts | 11 ++++++----- .../src/main/ets/pages/SCBDropdownPanel.ets | 14 +++++++------- .../ets/com/ohos/common/StatusBarConfiguration.ts | 4 ++-- .../src/main/ets/pages/SCBVolumePanel.ets | 4 ++-- .../phone/src/main/ets/WindowScene/HWDesktop.ets | 4 ++-- .../phone/src/main/ets/WindowScene/HWDivider.ets | 8 ++++---- .../src/main/ets/WindowScene/HWGestureNavBar.ets | 14 +++++++------- .../src/main/ets/WindowScene/HWScenePanel.ets | 3 +-- .../phone/src/main/ets/WindowScene/HWScreen.ets | 6 +++--- .../main/ets/screenlock/pages/SCBScreenLock.ets | 4 ++-- 10 files changed, 36 insertions(+), 36 deletions(-) diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts index 80b022a2..37e93b12 100644 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts +++ b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts @@ -40,7 +40,8 @@ export enum DesktopState { @Observed export class HWScreenSession { public readonly session: screenSessionManager.ScreenSession; - public bounds: screenSessionManager.RRect = { // bounds单位vp + // Unit: px + public bounds: screenSessionManager.RRect = { left: 0, top: 0, width: 0, @@ -71,10 +72,10 @@ export class HWScreenSession { private updateProperty(screenProperty: screenSessionManager.ScreenProperty) { this.bounds = { - left: px2vp(screenProperty.bounds.left), - top: px2vp(screenProperty.bounds.top), - width: px2vp(screenProperty.bounds.width), - height: px2vp(screenProperty.bounds.height), + left: screenProperty.bounds.left, + top: screenProperty.bounds.top, + width: screenProperty.bounds.width, + height: screenProperty.bounds.height, radius: screenProperty.bounds.radius } this.rotation = screenProperty.rotation diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets index 80e69c3b..a9c0c8aa 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets @@ -49,17 +49,17 @@ export struct SCBDropdownPanel { let rect = { left: 0, top: 0, - width: vp2px(this.bounds.width), - height: vp2px(this.bounds.height), + width: this.bounds.width, + height: this.bounds.height, }; AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect', rect); this.mDropDownInfo.rect = rect; let bannerRect = { left: 0, - top: vp2px(this.bounds.height) / 5, - width: vp2px(this.bounds.width), - height: vp2px(this.bounds.height) / 20 + top: this.bounds.height / 5, + width: this.bounds.width, + height: this.bounds.height / 20 }; AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); this.mBannerInfo.rect = bannerRect; @@ -72,11 +72,11 @@ export struct SCBDropdownPanel { build() { Stack({ alignContent: Alignment.Top }) { // dropdown panel - DropdownPanel({bounds : this.bounds, moduleName: this.moduleName}) + DropdownPanel({moduleName: this.moduleName}) .hitTestBehavior(HitTestMode.Transparent) // BannerNotification - BannerNotificationPanel({bounds : this.bounds}) + BannerNotificationPanel() .hitTestBehavior(HitTestMode.Default) .width(this.mBannerInfo.rect.width + 'px') .height(this.mBannerInfo.rect.height + 'px') diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index a9c925ba..3a844ce5 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -49,8 +49,8 @@ class StatusBarConfiguration { Log.showInfo(TAG, 'initWindowManager'); minHeight = 0; - maxWidth = vp2px(bounds.width); - maxHeight = vp2px(bounds.height); + maxWidth = bounds.width; + maxHeight = bounds.height; } async getDirectionAndPosition() { diff --git a/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets b/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets index 6e50c3a1..2b7ac91c 100644 --- a/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets +++ b/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets @@ -87,8 +87,8 @@ export struct SCBVolumePanel { init() { AbilityManager.setContext(AbilityManager.ABILITY_NAME_VOLUME_PANEL, getContext(this)); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis', { - width: vp2px(this.bounds.width), - height: vp2px(this.bounds.height), + width: this.bounds.width, + height: this.bounds.height, }); VolumeWindowController.getInstance().setWindowHandle(this.mShowControl); } diff --git a/product/phone/src/main/ets/WindowScene/HWDesktop.ets b/product/phone/src/main/ets/WindowScene/HWDesktop.ets index 55732574..dc98c9b9 100644 --- a/product/phone/src/main/ets/WindowScene/HWDesktop.ets +++ b/product/phone/src/main/ets/WindowScene/HWDesktop.ets @@ -96,8 +96,8 @@ export struct HWDesktop { private async getWindowSize(): Promise { try { - this.screenWidth = this.bounds.width; - this.screenHeight = this.bounds.height; + this.screenWidth = px2vp(this.bounds.width); + this.screenHeight = px2vp(this.bounds.height); AppStorage.SetOrCreate('screenWidth', this.screenWidth); AppStorage.SetOrCreate('screenHeight', this.screenHeight); } catch (error) { diff --git a/product/phone/src/main/ets/WindowScene/HWDivider.ets b/product/phone/src/main/ets/WindowScene/HWDivider.ets index 46e0a7b8..3eb2767e 100644 --- a/product/phone/src/main/ets/WindowScene/HWDivider.ets +++ b/product/phone/src/main/ets/WindowScene/HWDivider.ets @@ -60,9 +60,9 @@ export struct HWDivider { .onActionUpdate((event: GestureEvent) => { this.dividerParam.translateX = event.offsetX this.dividerParam.translateY = event.offsetY - let beginPrimaryH = this.screenBounds.height * parseFloat(this.dividerParam.primaryH) * 0.01 + let beginPrimaryH = px2vp(this.screenBounds.height) * parseFloat(this.dividerParam.primaryH) * 0.01 this.dividerParam.primaryScaleY = (beginPrimaryH + event.offsetY) / beginPrimaryH - let beginSecH = this.screenBounds.height * parseFloat(this.getSecondaryH()) * 0.01 + let beginSecH = px2vp(this.screenBounds.height) * parseFloat(this.getSecondaryH()) * 0.01 this.dividerParam.secondaryScaleY = (beginSecH - event.offsetY) / beginSecH this.dividerParam.secTransY = event.offsetY }) @@ -74,8 +74,8 @@ export struct HWDivider { this.dividerParam.secTransY = 0 this.dividerParam.primaryScaleY = 1 this.dividerParam.secondaryScaleY = 1 - let beginPrimaryH = this.screenBounds.height * parseFloat(this.dividerParam.primaryH) * 0.01 - this.dividerParam.primaryH = ((beginPrimaryH + event.offsetY) / this.screenBounds.height) * 100 + '%' + let beginPrimaryH = px2vp(this.screenBounds.height) * parseFloat(this.dividerParam.primaryH) * 0.01 + this.dividerParam.primaryH = ((beginPrimaryH + event.offsetY) / px2vp(this.screenBounds.height)) * 100 + '%' this.dividerParam.blurRadius = 0 })) } diff --git a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets index 1715bb45..61bf1830 100644 --- a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets +++ b/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets @@ -45,23 +45,23 @@ export struct HWGestureNavBar { this.screenSession.desktopState = DesktopState.DRAGGING; this.recentViewParam.margin = 50 let scrollWidth = - this.screenSession.sceneContainerSessionList.length * this.sceneContainerSession.screenBounds.width + + this.screenSession.sceneContainerSessionList.length * px2vp(this.sceneContainerSession.screenBounds.width) + (this.screenSession.sceneContainerSessionList.length - 1) * this.recentViewParam.margin; - this.recentViewParam.offsetX = this.sceneContainerSession.screenBounds.width - scrollWidth; + this.recentViewParam.offsetX = px2vp(this.sceneContainerSession.screenBounds.width) - scrollWidth; this.recentViewParam.centerX = - (1 - this.sceneContainerSession.screenBounds.width / 2 / scrollWidth) * 100 + '%'; + (1 - px2vp(this.sceneContainerSession.screenBounds.width) / 2 / scrollWidth) * 100 + '%'; this.recentViewParam.centerY = '100%'; }) .onActionUpdate((event: GestureEvent) => { let translateRatio = 0.6 * Math.pow(this.recentViewParam.scaleX, 2) + 0.4; this.recentViewParam.translateX = event.offsetX * translateRatio; - if (1 + event.offsetY / this.sceneContainerSession.screenBounds.height * 1.3 > 0.25) { + if (1 + event.offsetY / px2vp(this.sceneContainerSession.screenBounds.height) * 1.3 > 0.25) { this.recentViewParam.translateY = event.offsetY; } this.recentViewParam.scaleX = - 1 + this.recentViewParam.translateY / this.sceneContainerSession.screenBounds.height * 1.3; + 1 + this.recentViewParam.translateY / px2vp(this.sceneContainerSession.screenBounds.height) * 1.3; this.recentViewParam.scaleX = Math.max(this.recentViewParam.scaleX, 0.25); this.recentViewParam.scaleX = Math.min(this.recentViewParam.scaleX, 1); this.recentViewParam.scaleY = this.recentViewParam.scaleX; @@ -77,9 +77,9 @@ export struct HWGestureNavBar { } else if (event.offsetY < -100) { let recentViewSceneSpace = 50; let scrollWidth = - this.screenSession.sceneContainerSessionList.length * this.sceneContainerSession.screenBounds.width + + this.screenSession.sceneContainerSessionList.length * px2vp(this.sceneContainerSession.screenBounds.width) + (this.screenSession.sceneContainerSessionList.length - 1) * recentViewSceneSpace; - this.recentViewParam.offsetX = this.sceneContainerSession.screenBounds.width - scrollWidth; + this.recentViewParam.offsetX = px2vp(this.sceneContainerSession.screenBounds.width) - scrollWidth; this.screenSession.enterRecentView(); } else { this.screenSession.enterAppView(this.sceneContainerSession); diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets index da2ebd89..4c0ac4fe 100644 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets @@ -171,7 +171,7 @@ export struct HWScenePanel { } initRecentParams() { - this.screenWidth = this.screenSession.bounds.width + this.screenWidth = px2vp(this.screenSession.bounds.width); this.viewWidth = this.screenWidth * 0.7; this.scroller.scrollTo({ xOffset: this.contentOffsetForIndex(this.screenSession.sceneContainerSessionList.length - 1), yOffset: 0 }) @@ -181,5 +181,4 @@ export struct HWScenePanel { this.updateView(-2, this.screenSession.sceneContainerSessionList.length - 1 - 2) this.updateView(-1, this.screenSession.sceneContainerSessionList.length - 1 - 1) } - } diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index cc6f3e55..3f555648 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -44,8 +44,8 @@ export struct HWScreen { // screenlock SCBScreenLock({ bounds: this.screenSession.bounds }) } - .position({ x: this.screenSession.bounds.left, y: this.screenSession.bounds.top }) - .width(this.screenSession.bounds.width) - .height(this.screenSession.bounds.height) + .position({ x: this.screenSession.bounds.left + 'px', y: this.screenSession.bounds.top + 'px' }) + .width(this.screenSession.bounds.width + 'px') + .height(this.screenSession.bounds.height + 'px') } } diff --git a/product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets b/product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets index afa2a168..935137f0 100644 --- a/product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets +++ b/product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets @@ -60,8 +60,8 @@ export struct SCBScreenLock { private async initStatusBarRect() { let rect; - let widthPx = vp2px(this.bounds.width); - let heightPx = vp2px(this.bounds.height); + let widthPx = this.bounds.width; + let heightPx = this.bounds.height; if (widthPx > heightPx) { // Pad、PC horizontalScreen Mode rect = { left: 0, -- Gitee From 2eaf271b80bed3641e9e3d50f23aed7555865438 Mon Sep 17 00:00:00 2001 From: qpzeng Date: Sun, 23 Apr 2023 11:35:42 +0800 Subject: [PATCH 366/373] modify interface of HostWindowScene and Screen Signed-off-by: qpzeng --- product/phone/src/main/ets/WindowScene/HWScene.ets | 2 +- product/phone/src/main/ets/WindowScene/HWScreen.ets | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/product/phone/src/main/ets/WindowScene/HWScene.ets b/product/phone/src/main/ets/WindowScene/HWScene.ets index c9ed3c23..098875a8 100644 --- a/product/phone/src/main/ets/WindowScene/HWScene.ets +++ b/product/phone/src/main/ets/WindowScene/HWScene.ets @@ -36,7 +36,7 @@ export struct HWScene { build() { Stack() { if (this.buildLog(this.sceneSession)) { - HostWindowScene(this.sceneSession.session) + HostWindowScene(this.sceneSession.session.persistentId) .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) } } diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index 3f555648..976122fa 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -25,7 +25,7 @@ export struct HWScreen { @ObjectLink screenSession: HWScreenSession build() { - Screen(this.screenSession.session) { + Screen(this.screenSession.session.screenId) { // Wallpaper HWWallpaper() -- Gitee From 00050b55ae086bdccce82d184bb7a2d3f556f639 Mon Sep 17 00:00:00 2001 From: njuptkid Date: Sun, 23 Apr 2023 11:50:42 +0800 Subject: [PATCH 367/373] fix compile error. Change-Id: I301352e6220446285cc4db254794abf9a4601c64 --- product/phone/src/main/ets/MainAbility/MainAbility.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/product/phone/src/main/ets/MainAbility/MainAbility.ts b/product/phone/src/main/ets/MainAbility/MainAbility.ts index c771f0da..19236e0c 100644 --- a/product/phone/src/main/ets/MainAbility/MainAbility.ts +++ b/product/phone/src/main/ets/MainAbility/MainAbility.ts @@ -28,7 +28,8 @@ import { navigationBarCommonEventManager } from '@ohos/common'; import PageDesktopViewModel from '../../../../../../feature/pagedesktop/src/main/ets/default/viewmodel/PageDesktopViewModel'; import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import initSystemUi from '../../../../../../common/src/main/ets/default/InitSystemUi'; -import SessionManagerService from '@ohos.session_manager_service' +import SessionManagerService from '@ohos.session_manager_service'; +import rpc from '@ohos.rpc'; const TAG = 'LauncherMainAbility'; -- Gitee From 02a8797af32f2480e35ad2b73c9da0cd73c5aefa Mon Sep 17 00:00:00 2001 From: lianyi Date: Tue, 25 Apr 2023 17:41:33 +0800 Subject: [PATCH 368/373] =?UTF-8?q?common=E5=B1=82=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/index.ets | 4 +- .../src/main/ets/default/CheckEmptyUtils.ts | 47 ---------- common/src/main/ets/default/InitSystemUi.ts | 31 ------- .../main/ets/default/StyleConfiguration.ts | 35 -------- common/src/main/ets/default/Trace.ts | 85 ------------------- .../default/abilitymanager/bundleManager.ts | 2 +- .../main/ets/default/base/BaseDragHandler.ts | 2 +- .../default/{interface => base}/DragArea.ts | 0 .../{interface => base}/DragItemPosition.ts | 0 .../base}/SimpleToggleBase.ets | 4 +- .../base}/iconTitleBase.ets | 6 +- .../default/commonEvent/CommonEventManager.ts | 4 +- .../ets/default/{ => constants}/Constants.ts | 0 .../constants/PluginConstants.ts} | 4 +- .../HeightConfigUtils.ts | 2 +- .../layoutconfig}/StyleConfiguration.ts | 18 +++- .../{ => manager}/CommonStyleManager.ts | 2 +- .../{ => manager}/MultimodalInputManager.ts | 4 +- .../{ => manager}/ScreenLockManager.ts | 10 +-- .../{ => manager}/SwitchUserManager.ts | 8 +- .../ets/default/{ => manager}/TimeManager.ts | 12 +-- .../default/{ => manager}/TintStateManager.ts | 10 +-- .../{ => manager}/WindowPanelManager.ts | 10 +-- .../main/ets/default/model/SettingsModel.ts | 1 - .../uicomponents}/iconComponent.ets | 4 +- .../utils}/BundleParseUtil.ts | 4 +- .../ets/default/{ => utils}/DateTimeCommon.ts | 0 .../ets/default/{ => utils}/Decorators.ts | 2 +- .../ets/default/{event => utils}/EventBus.ts | 2 +- .../default/{event => utils}/EventManager.ts | 8 +- .../ets/default/{event => utils}/EventUtil.ts | 2 +- .../ets/default/{ => utils}/LunarCalendar.ts | 0 .../utils}/PluginComponentManagerUtil.ts | 4 +- .../ets/default/{ => utils}/ReadConfigUtil.ts | 2 +- .../ets/default/{ => utils}/ResourceUtil.ts | 2 +- .../default/{ => utils}/ScreenLockCommon.ts | 4 +- .../ets/default/{ => utils}/SettingsUtil.ts | 8 +- .../{ => utils}/SingleInstanceHelper.ts | 4 +- .../ets/default/{ => utils}/SysFaultLogger.ts | 2 +- common/src/main/ets/default/utils/Trace.ts | 15 +++- .../PluginDataSourceAdapter.ts | 2 +- .../PluginDataSourceManager.ts | 4 +- .../sourceloader/DataAbilitySourceLoader.ts | 4 +- .../sourceloader/MetaSourceLoader.ts | 6 +- .../sourceloader/PluginSourceLoader.ts | 4 +- .../sourceloader/PluginSourceLoaderPatch.ts | 4 +- .../sourceloader/SourceLoader.ts | 4 +- .../sourceloader/SourceLoaderFactory.ts | 2 +- .../ets/default/pages/airplaneComponent.ets | 2 +- .../ets/com/ohos/model/AutoRotateService.ts | 2 +- ...lCenterSimpleToggleAutoRotateComponent.ets | 2 +- .../ets/com/ohos/viewmodel/AutoRotateVM.ts | 2 +- .../src/main/ets/default/batteryModel.ts | 2 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../main/ets/default/pages/batteryIcon.ets | 2 +- .../src/main/ets/default/pages/batteryPic.ets | 2 +- .../src/main/ets/default/pages/batterySoc.ets | 4 +- .../main/ets/default/viewmodel/BatteryVM.ts | 6 +- .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../ets/com/ohos/model/BluetoothService.ts | 2 +- ...lCenterComplexToggleBluetoothComponent.ets | 6 +- .../StatusBarIconItemBluetoothComponent.ets | 4 +- .../ets/com/ohos/viewmodel/BluetoothVM.ts | 6 +- .../src/main/ets/default/brightnessManager.ts | 4 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../main/ets/default/pages/CapsuleIcon.ets | 2 +- .../ets/default/viewmodel/CapsuleViewModel.ts | 4 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../src/main/ets/default/pages/clockIcon.ets | 8 +- .../src/main/ets/default/viewmodel/ClockVM.ts | 6 +- .../src/main/ets/com/ohos/common/Constants.ts | 2 +- .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../com/ohos/model/ControlCenterService.ts | 10 +-- .../com/ohos/pages/ComplexToggleComponent.ets | 6 +- .../ohos/pages/ComplexToggleLoadComponent.ets | 2 +- .../ohos/pages/PluginIconItemComponent.ets | 6 +- .../com/ohos/pages/SimpleToggleComponent.ets | 6 +- .../ohos/pages/SimpleToggleLoadComponent.ets | 4 +- .../src/main/ets/com/ohos/pages/UpTitle.ets | 4 +- .../ets/com/ohos/viewmodel/ControlCenterVM.ts | 4 +- .../ets/com/ohos/view/component/dateTime.ets | 2 +- .../main/ets/com/ohos/vm/dateTimeViewModel.ts | 6 +- .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../ets/com/ohos/model/LocationService.ts | 2 +- ...rolCenterSimpleToggleLocationComponent.ets | 6 +- .../StatusBarIconItemLocationComponent.ets | 4 +- .../main/ets/com/ohos/viewmodel/LocationVM.ts | 8 +- .../ets/com/ohos/model/bundleResourceModel.ts | 2 +- .../ets/com/ohos/model/noDisturbingModel.ts | 2 +- .../ohos/vm/noDisturbComponentViewModel.ts | 2 +- .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../main/ets/com/ohos/model/NFCModeService.ts | 2 +- .../ControlCenterSimpleToggleNFComponent.ets | 2 +- .../pages/StatusBarIconItemNFComponent.ets | 4 +- .../main/ets/com/ohos/viewmodel/NFCModeVM.ts | 6 +- .../com/ohos/noticeItem/common/CommonUtil.ts | 2 +- .../noticeItem/model/NotificationConfig.ts | 2 +- .../noticeItem/model/NotificationService.ts | 4 +- .../model/NotificationWindowManager.ts | 4 +- .../ohos/noticeItem/model/ParseDataUtil.ts | 2 +- .../noticeItem/model/rule/RuleController.ts | 3 +- .../noticeItem/view/item/actionComponent.ets | 2 +- .../view/item/bannerNotificationItem.ets | 4 +- .../ohos/noticeItem/view/item/generalItem.ets | 3 +- .../ohos/noticeItem/view/item/pictureItem.ets | 1 - .../noticeItem/view/item/settingDialog.ets | 7 +- .../ohos/noticeItem/view/item/titleItem.ets | 3 +- .../viewmodel/NotificationViewModel.ts | 11 ++- .../src/main/ets/pages/noDisturb.ets | 2 +- .../src/main/ets/pages/DropdownPanel.ets | 14 +-- .../src/main/ets/pages/SCBDropdownPanel.ets | 2 +- .../src/main/ets/pages/bannerNotification.ets | 6 +- .../ets/pages/common/ControlCenterConfig.ts | 4 +- .../ets/pages/common/StyleConfiguration.ts | 2 +- .../src/main/ets/pages/common/StyleManager.ts | 2 +- .../src/main/ets/pages/control.ets | 2 +- .../src/main/ets/pages/notification.ets | 10 +-- .../src/main/ets/pages/SCBStatusBar.ets | 2 +- .../src/main/ets/pages/StatusBar.ets | 12 ++- .../main/ets/pages/common/StatusbarConfig.ts | 2 +- .../ets/pages/common/StyleConfiguration.ts | 2 +- .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../ets/com/ohos/model/RingModeService.ts | 4 +- ...rolCenterSimpleToggleRingModeComponent.ets | 6 +- .../StatusBarIconItemRingModeComponent.ets | 4 +- .../main/ets/com/ohos/viewmodel/RingModeVM.ts | 6 +- .../main/ets/com/ohos/model/accountsModel.ts | 9 +- .../ets/com/ohos/model/screenLockModel.ts | 7 +- .../ets/com/ohos/model/screenLockService.ts | 9 +- .../ets/com/ohos/model/screenlockStyle.ts | 2 +- .../ets/com/ohos/view/component/accounts.ets | 2 +- .../ets/com/ohos/view/component/lockIcon.ets | 2 +- .../src/main/ets/com/ohos/vm/StatusBarVM.ts | 2 +- .../ets/com/ohos/vm/customPSDViewModel.ts | 3 +- .../ets/com/ohos/vm/digitalPSDViewModel.ts | 3 +- .../main/ets/com/ohos/vm/lockIconViewModel.ts | 2 +- .../main/ets/com/ohos/vm/mixedPSDViewModel.ts | 3 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../src/main/ets/default/pages/signalIcon.ets | 4 +- .../main/ets/default/viewmodel/SignalVM.ts | 6 +- .../src/main/ets/com/ohos/common/Constants.ts | 4 +- .../com/ohos/common/StatusBarConfiguration.ts | 4 +- .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../ets/com/ohos/model/StatusBarService.ts | 10 +-- .../ets/com/ohos/pages/IconItemComponent.ets | 11 ++- .../com/ohos/pages/MetaIconItemComponent.ets | 9 +- .../ohos/pages/PluginIconItemComponent.ets | 6 +- .../ets/com/ohos/pages/StatusBarComponent.ets | 8 +- .../ets/com/ohos/viewmodel/StatusBarVM.ts | 18 ++-- .../src/main/ets/common/StyleConfiguration.ts | 2 +- .../src/main/ets/pages/SCBVolumePanel.ets | 2 +- .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../com/ohos/common/VolumeWindowController.ts | 6 +- .../ets/com/ohos/model/VolumePanelService.ts | 6 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../main/ets/default/pages/wifiComponent.ets | 6 +- .../src/main/ets/default/pages/wifiIcon.ets | 4 +- .../src/main/ets/default/viewmodel/WifiVM.ts | 6 +- .../src/main/ets/MainAbility/MainAbility.ts | 16 +++- .../src/main/ets/WindowScene/HWSystemUi.ets | 2 +- .../screenlock/common/StyleConfiguration.ts | 2 +- .../ets/screenlock/pages/SCBScreenLock.ets | 9 +- .../ets/screenlock/pages/customPassword.ets | 5 +- .../ets/screenlock/pages/digitalPassword.ets | 5 +- .../ets/screenlock/pages/mixedPassword.ets | 5 +- .../ets/workers/PluginDataSourceWorker.js | 2 +- 167 files changed, 365 insertions(+), 545 deletions(-) delete mode 100644 common/src/main/ets/default/CheckEmptyUtils.ts delete mode 100644 common/src/main/ets/default/InitSystemUi.ts delete mode 100644 common/src/main/ets/default/StyleConfiguration.ts delete mode 100644 common/src/main/ets/default/Trace.ts rename common/src/main/ets/default/{interface => base}/DragArea.ts (100%) rename common/src/main/ets/default/{interface => base}/DragItemPosition.ts (100%) rename common/src/main/ets/{template => default/base}/SimpleToggleBase.ets (97%) rename common/src/main/ets/{template => default/base}/iconTitleBase.ets (93%) rename common/src/main/ets/default/{ => constants}/Constants.ts (100%) rename common/src/main/ets/{plugindatasource/common/Constants.ts => default/constants/PluginConstants.ts} (97%) rename common/src/main/ets/default/{heightcofigUtils => layoutconfig}/HeightConfigUtils.ts (96%) rename common/src/main/ets/{template/common => default/layoutconfig}/StyleConfiguration.ts (83%) rename common/src/main/ets/default/{ => manager}/CommonStyleManager.ts (97%) rename common/src/main/ets/default/{ => manager}/MultimodalInputManager.ts (97%) rename common/src/main/ets/default/{ => manager}/ScreenLockManager.ts (89%) rename common/src/main/ets/default/{ => manager}/SwitchUserManager.ts (94%) rename common/src/main/ets/default/{ => manager}/TimeManager.ts (92%) rename common/src/main/ets/default/{ => manager}/TintStateManager.ts (93%) rename common/src/main/ets/default/{ => manager}/WindowPanelManager.ts (94%) rename common/src/main/ets/{template => default/uicomponents}/iconComponent.ets (94%) rename common/src/main/ets/{plugindatasource/common => default/utils}/BundleParseUtil.ts (98%) rename common/src/main/ets/default/{ => utils}/DateTimeCommon.ts (100%) rename common/src/main/ets/default/{ => utils}/Decorators.ts (97%) rename common/src/main/ets/default/{event => utils}/EventBus.ts (98%) rename common/src/main/ets/default/{event => utils}/EventManager.ts (94%) rename common/src/main/ets/default/{event => utils}/EventUtil.ts (98%) rename common/src/main/ets/default/{ => utils}/LunarCalendar.ts (100%) rename common/src/main/ets/{plugindatasource/common => default/utils}/PluginComponentManagerUtil.ts (97%) rename common/src/main/ets/default/{ => utils}/ReadConfigUtil.ts (97%) rename common/src/main/ets/default/{ => utils}/ResourceUtil.ts (96%) rename common/src/main/ets/default/{ => utils}/ScreenLockCommon.ts (93%) rename common/src/main/ets/default/{ => utils}/SettingsUtil.ts (90%) rename common/src/main/ets/default/{ => utils}/SingleInstanceHelper.ts (90%) rename common/src/main/ets/default/{ => utils}/SysFaultLogger.ts (98%) diff --git a/common/index.ets b/common/index.ets index 80b6cda6..def2fa4c 100644 --- a/common/index.ets +++ b/common/index.ets @@ -83,8 +83,8 @@ export { FormListInfoCacheManager } from './src/main/ets/default/cache/FormList export { SettingItemsConfig } from './src/main/ets/default/configs/SettingItemsConfig' export { SettingItemsManager } from './src/main/ets/default/settings/SettingItemsManager' export { SettingItemOptionsChecker } from './src/main/ets/default/settings/SettingItemOptionsChecker' -export { DragArea } from './src/main/ets/default/interface/DragArea' -export { DragItemPosition } from './src/main/ets/default/interface/DragItemPosition' +export { DragArea } from './src/main/ets/default/base/DragArea' +export { DragItemPosition } from './src/main/ets/default/base/DragItemPosition' // Window scene export { HWRootSceneSession } from './src/main/ets/WindowScene/scene/session/HWRootSceneSession' diff --git a/common/src/main/ets/default/CheckEmptyUtils.ts b/common/src/main/ets/default/CheckEmptyUtils.ts deleted file mode 100644 index 5061c49c..00000000 --- a/common/src/main/ets/default/CheckEmptyUtils.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 default class CheckEmptyUtils { - - /** - * Check obj is empty. - * - * @param {Object} obj need checked object - * @return {boolean} true(empty) - */ - static isEmpty(obj) { - return (typeof obj === 'undefined' || obj === null || obj === '' || Object.keys(obj).length === 0); - } - - /** - * Check str is empty. - * - * @param {string} str need checked string - * @return {boolean} true(empty) - */ - static checkStrIsEmpty(str) { - return str.trim().length === 0; - } - - /** - * Check array is empty. - * - * @param {Array} arr need checked array - * @return {boolean} true(empty) - */ - static isEmptyArr(arr) { - return arr.length === 0; - } -} \ No newline at end of file diff --git a/common/src/main/ets/default/InitSystemUi.ts b/common/src/main/ets/default/InitSystemUi.ts deleted file mode 100644 index fedc3735..00000000 --- a/common/src/main/ets/default/InitSystemUi.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2022 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 EventManager from './event/EventManager'; -import { Log } from './utils/Log'; -import ScreenLockManager from './ScreenLockManager'; -import ServiceExtensionContext from 'application/ServiceExtensionContext'; -import TimeManager from './TimeManager'; - -const TAG = 'initSystemui'; - -export default function initSystemUi(context: ServiceExtensionContext): void { - EventManager.setContext(context); - ScreenLockManager.init().then(() => { - }).catch(err => { - }); - TimeManager.init(context); - Log.showDebug(TAG, `init done, ctx: ${context}`); -} diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts deleted file mode 100644 index 92370d8f..00000000 --- a/common/src/main/ets/default/StyleConfiguration.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 CommonStyleManager from './CommonStyleManager'; -import deviceInfo from '@ohos.deviceInfo'; - -const TAG = 'Common-StyleConfiguration'; -const deviceTypeInfo = deviceInfo.deviceType; - -export class CommonStyle { - statusBarFontSize: Length = deviceTypeInfo === 'phone' ? '12fp' : '16fp'; - statusBarIconWidth: Length = '24vp'; - statusBarIconHeight: Length = '24vp'; - statusBarMarginLeftRight: Length = deviceTypeInfo === 'phone' ? '0vp' : $r("app.float.status_bar_margin_left_right"); - deviceTypeInfo = deviceTypeInfo; -} - -export default class StyleConfiguration { - static getCommonStyle(): CommonStyle { - const key: string = TAG + '-Common'; - return CommonStyleManager.getStyle(key, CommonStyle); - } -} \ No newline at end of file diff --git a/common/src/main/ets/default/Trace.ts b/common/src/main/ets/default/Trace.ts deleted file mode 100644 index d4d1ee65..00000000 --- a/common/src/main/ets/default/Trace.ts +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2022 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 byTrace from '@ohos.bytrace'; -import { Log } from './utils/Log'; - -/** - * Add method trace. Modify RECORD_TRACE before using. - */ -export default class Trace { - static readonly CORE_METHOD_START_DROPDOWNPANEL = 'startDropdownPanel'; - static readonly CORE_METHOD_START_TOUCHEVENT = 'startTouchEvent'; - static readonly CORE_METHOD_CLICK_CAPSULE = 'clickCapsuleEvent'; - static readonly CORE_METHOD_CLICK_NOTIFICATION = 'clickNotificationEvent'; - static readonly CORE_METHOD_START_VOLUMEPANEL = 'startVolumePanel'; - static readonly CORE_METHOD_UNLOCK_SCREEN = "unlockScreen" - static readonly CORE_METHOD_CALL_ACCOUNT_SYSTEM = "callAccountSubsystem"; - static readonly CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT = "passingAccountSubsystemResult"; - static readonly CORE_METHOD_HIDE_PSD_PAGE = "hidePsdPage"; - static readonly CORE_METHOD_SHOW_LOCK_SCREEN = "showLockScreen"; - static readonly CORE_METHOD_SLEEP_TO_LOCK_SCREEN = "sleepToLockScreen" - - private static readonly TRACE_TAG = 'Systemui:Trace'; - private static readonly RECORD_TRACE = true; - private static readonly TRACE_LIMIT = 2000; - - private static readonly TRACE_BASE_INDEX = 10000; - - /** - * start trace method - * - * @param {string} methodName - methodName for tracing - */ - static start(methodName: string) { - if (!Trace.RECORD_TRACE) return; - if (typeof globalThis.taskIdMap === 'undefined' || typeof globalThis.traceIndex === 'undefined') { - Trace.init(); - } - let taskId = globalThis.taskIdMap.get(methodName); - if (taskId == undefined) { - taskId = globalThis.traceIndex; - globalThis.traceIndex++; - globalThis.taskIdMap.set(methodName, taskId); - } - Log.showInfo(this.TRACE_TAG, `start trace ${taskId}`); - byTrace.startTrace(this.TRACE_TAG + methodName, taskId, Trace.TRACE_LIMIT); - } - - private static init() { - Log.showInfo(this.TRACE_TAG, 'init trace parameters'); - globalThis.taskIdMap = new Map(); - globalThis.traceIndex = Trace.TRACE_BASE_INDEX; - } - - /** - * stop trace method - * - * @param {string} methodName - methodName for tracing - */ - static end(methodName: string) { - if (!Trace.RECORD_TRACE) return; - if (typeof globalThis.taskIdMap === 'undefined') { - return; - } - const taskId = globalThis.taskIdMap.get(methodName); - if (taskId == undefined) { - Log.showError(this.TRACE_TAG, `fail to end trace name ${methodName}`); - return; - } - Log.showInfo(this.TRACE_TAG, `end trace ${taskId}`); - byTrace.finishTrace(this.TRACE_TAG + methodName, taskId); - } -} \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ts b/common/src/main/ets/default/abilitymanager/bundleManager.ts index 91191c5c..38ddc22d 100644 --- a/common/src/main/ets/default/abilitymanager/bundleManager.ts +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ts @@ -15,7 +15,7 @@ import BundleMgr from "@ohos.bundle.bundleManager"; import { Log } from '../utils/Log'; -import SwitchUserManager from "../SwitchUserManager"; +import {SwitchUserManager} from "../manager/SwitchUserManager"; import AbilityManager from "./abilityManager"; const TAG = "BRManager"; diff --git a/common/src/main/ets/default/base/BaseDragHandler.ts b/common/src/main/ets/default/base/BaseDragHandler.ts index dd7c7abf..9e74ae83 100644 --- a/common/src/main/ets/default/base/BaseDragHandler.ts +++ b/common/src/main/ets/default/base/BaseDragHandler.ts @@ -14,7 +14,7 @@ */ import { Log } from '../utils/Log'; -import { DragArea } from '../interface/DragArea'; +import { DragArea } from './DragArea'; import { CommonConstants } from '../constants/CommonConstants'; const TAG = 'BaseDragHandler'; diff --git a/common/src/main/ets/default/interface/DragArea.ts b/common/src/main/ets/default/base/DragArea.ts similarity index 100% rename from common/src/main/ets/default/interface/DragArea.ts rename to common/src/main/ets/default/base/DragArea.ts diff --git a/common/src/main/ets/default/interface/DragItemPosition.ts b/common/src/main/ets/default/base/DragItemPosition.ts similarity index 100% rename from common/src/main/ets/default/interface/DragItemPosition.ts rename to common/src/main/ets/default/base/DragItemPosition.ts diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/default/base/SimpleToggleBase.ets similarity index 97% rename from common/src/main/ets/template/SimpleToggleBase.ets rename to common/src/main/ets/default/base/SimpleToggleBase.ets index 91604136..ffc91d03 100644 --- a/common/src/main/ets/template/SimpleToggleBase.ets +++ b/common/src/main/ets/default/base/SimpleToggleBase.ets @@ -13,8 +13,8 @@ * limitations under the License. */ -import { Log } from '../default/utils/Log' -import StyleConfiguration, { SimpleToggleBaseStyle } from './common/StyleConfiguration' +import { Log } from '../utils/Log' +import StyleConfiguration, { SimpleToggleBaseStyle } from '../layoutconfig/StyleConfiguration' const TAG = 'SimpleToggleBase' diff --git a/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/default/base/iconTitleBase.ets similarity index 93% rename from common/src/main/ets/template/iconTitleBase.ets rename to common/src/main/ets/default/base/iconTitleBase.ets index 95fb448e..5a212b09 100644 --- a/common/src/main/ets/template/iconTitleBase.ets +++ b/common/src/main/ets/default/base/iconTitleBase.ets @@ -13,9 +13,9 @@ * limitations under the License. */ -import { Log } from '../default/utils/Log' -import StyleConfiguration, { IconTitleBaseStyle } from './common/StyleConfiguration' -import iconComponent from './iconComponent' +import { Log } from '../utils/Log' +import StyleConfiguration, { IconTitleBaseStyle } from '../layoutconfig/StyleConfiguration' +import iconComponent from '../uicomponents/iconComponent' const TAG = 'iconTitleBase' diff --git a/common/src/main/ets/default/commonEvent/CommonEventManager.ts b/common/src/main/ets/default/commonEvent/CommonEventManager.ts index 90cb1fb8..a03f12d3 100644 --- a/common/src/main/ets/default/commonEvent/CommonEventManager.ts +++ b/common/src/main/ets/default/commonEvent/CommonEventManager.ts @@ -15,9 +15,9 @@ import commonEvent from "@ohos.commonEvent"; import { CommonEventData } from "commonEvent/commonEventData"; -import EventManager from "../event/EventManager"; +import EventManager from "../utils/EventManager"; import { Log } from '../utils/Log'; -import { SCREEN_CHANGE_EVENT } from "../ScreenLockManager"; +import { SCREEN_CHANGE_EVENT } from "../manager/ScreenLockManager"; export type CommonEventManager = { subscriberCommonEvent: () => Promise; diff --git a/common/src/main/ets/default/Constants.ts b/common/src/main/ets/default/constants/Constants.ts similarity index 100% rename from common/src/main/ets/default/Constants.ts rename to common/src/main/ets/default/constants/Constants.ts diff --git a/common/src/main/ets/plugindatasource/common/Constants.ts b/common/src/main/ets/default/constants/PluginConstants.ts similarity index 97% rename from common/src/main/ets/plugindatasource/common/Constants.ts rename to common/src/main/ets/default/constants/PluginConstants.ts index 2db0f695..d9d0191f 100644 --- a/common/src/main/ets/plugindatasource/common/Constants.ts +++ b/common/src/main/ets/default/constants/PluginConstants.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import { Event } from '../../default/event/EventUtil'; +import { Event } from '../utils/EventUtil'; -export default class Constants { +export default class PluginConstants { static readonly INIT_CONFIG = 'initConfig'; static readonly INIT_FINISH = 'initFinish'; static readonly CLEAR_ALL = 'clearAll'; diff --git a/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts b/common/src/main/ets/default/layoutconfig/HeightConfigUtils.ts similarity index 96% rename from common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts rename to common/src/main/ets/default/layoutconfig/HeightConfigUtils.ts index a1df1a7b..2c2aa37d 100644 --- a/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils.ts +++ b/common/src/main/ets/default/layoutconfig/HeightConfigUtils.ts @@ -19,7 +19,7 @@ const STATUS_BAR_COEFFICIENT = 1.0 const NAV_BAR_MIN_HEIGHT = 32 const NAV_BAR_COEFFICIENT = 1.0 -export default class HeightConfigUtils { +export class HeightConfigUtils { getStatusMinH(){ return STATUS_BAR_MIN_HEIGHT; diff --git a/common/src/main/ets/template/common/StyleConfiguration.ts b/common/src/main/ets/default/layoutconfig/StyleConfiguration.ts similarity index 83% rename from common/src/main/ets/template/common/StyleConfiguration.ts rename to common/src/main/ets/default/layoutconfig/StyleConfiguration.ts index 0c0e248b..ac6a388e 100644 --- a/common/src/main/ets/template/common/StyleConfiguration.ts +++ b/common/src/main/ets/default/layoutconfig/StyleConfiguration.ts @@ -13,10 +13,11 @@ * limitations under the License. */ -import CommonStyleManager from '../../default/CommonStyleManager'; +import CommonStyleManager from '../manager/CommonStyleManager'; +import deviceInfo from '@ohos.deviceInfo'; const TAG = 'CommonTemplate-StyleConfiguration'; - +const deviceTypeInfo = deviceInfo.deviceType; export class IconTitleBaseStyle { marginLeft: Length = '24vp'; marginRight: Length = '16vp'; @@ -69,6 +70,14 @@ export class SimpleToggleBaseStyle { transparentColor: ResourceColor = 'rgba(255, 255, 255, 0)'; } +export class CommonStyle { + statusBarFontSize: Length = deviceTypeInfo === 'phone' ? '12fp' : '16fp'; + statusBarIconWidth: Length = '24vp'; + statusBarIconHeight: Length = '24vp'; + statusBarMarginLeftRight: Length = deviceTypeInfo === 'phone' ? '0vp' : $r("app.float.status_bar_margin_left_right"); + deviceTypeInfo = deviceTypeInfo; +} + export default class StyleConfiguration { static getIconTitleBaseStyle(): IconTitleBaseStyle { const key: string = TAG + '-IconTitleBase'; @@ -84,4 +93,9 @@ export default class StyleConfiguration { const key: string = TAG + '-SimpleToggleBase'; return CommonStyleManager.getStyle(key, SimpleToggleBaseStyle); } + + static getCommonStyle(): CommonStyle { + const key: string = TAG + '-Common'; + return CommonStyleManager.getStyle(key, CommonStyle); + } } \ No newline at end of file diff --git a/common/src/main/ets/default/CommonStyleManager.ts b/common/src/main/ets/default/manager/CommonStyleManager.ts similarity index 97% rename from common/src/main/ets/default/CommonStyleManager.ts rename to common/src/main/ets/default/manager/CommonStyleManager.ts index 715a9894..d860b966 100644 --- a/common/src/main/ets/default/CommonStyleManager.ts +++ b/common/src/main/ets/default/manager/CommonStyleManager.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Log } from './utils/Log'; +import { Log } from '../utils/Log'; const TAG = "Common-StyleManager"; export class CommonStyleManager { diff --git a/common/src/main/ets/default/MultimodalInputManager.ts b/common/src/main/ets/default/manager/MultimodalInputManager.ts similarity index 97% rename from common/src/main/ets/default/MultimodalInputManager.ts rename to common/src/main/ets/default/manager/MultimodalInputManager.ts index 6c2494a5..93357738 100644 --- a/common/src/main/ets/default/MultimodalInputManager.ts +++ b/common/src/main/ets/default/manager/MultimodalInputManager.ts @@ -13,8 +13,8 @@ * limitations under the License. */ import inputConsumer from "@ohos.multimodalInput.inputConsumer"; -import { Log } from './utils/Log'; -import createOrGet from "./SingleInstanceHelper"; +import { Log } from '../utils/Log'; +import { createOrGet } from "../utils/SingleInstanceHelper"; export type MultiCallback = (keyOptions: inputConsumer.KeyOptions) => void; export enum MultiKeyCode { diff --git a/common/src/main/ets/default/ScreenLockManager.ts b/common/src/main/ets/default/manager/ScreenLockManager.ts similarity index 89% rename from common/src/main/ets/default/ScreenLockManager.ts rename to common/src/main/ets/default/manager/ScreenLockManager.ts index 6ba2ac5f..49276d6d 100644 --- a/common/src/main/ets/default/ScreenLockManager.ts +++ b/common/src/main/ets/default/manager/ScreenLockManager.ts @@ -15,11 +15,11 @@ import commonEvent from '@ohos.commonEvent'; import { CommonEventSubscriber } from 'commonEvent/commonEventSubscriber'; -import createOrGet from './SingleInstanceHelper'; -import EventManager from './event/EventManager'; -import { Log } from './utils/Log'; -import { obtainLocalEvent } from './event/EventUtil'; -import { debounce } from './Decorators'; +import { createOrGet } from '../utils/SingleInstanceHelper'; +import EventManager from '../utils/EventManager'; +import { Log } from '../utils/Log'; +import { obtainLocalEvent } from '../utils/EventUtil'; +import { debounce } from '../utils/Decorators'; export const SCREEN_CHANGE_EVENT = 'screenChangeEvent'; diff --git a/common/src/main/ets/default/SwitchUserManager.ts b/common/src/main/ets/default/manager/SwitchUserManager.ts similarity index 94% rename from common/src/main/ets/default/SwitchUserManager.ts rename to common/src/main/ets/default/manager/SwitchUserManager.ts index e86862e3..2e1c0c52 100644 --- a/common/src/main/ets/default/SwitchUserManager.ts +++ b/common/src/main/ets/default/manager/SwitchUserManager.ts @@ -14,8 +14,8 @@ */ import AccountManager from "@ohos.account.osAccount"; -import { Log } from './utils/Log'; -import getSingleInstance from "./SingleInstanceHelper"; +import { Log } from '../utils/Log'; +import { createOrGet } from "../utils/SingleInstanceHelper"; const TAG = "SwitchUserManager"; const SUBSCRIBE_KEY = "SystemUiAccount"; @@ -58,13 +58,13 @@ function parseAccountInfo(accountInfo: AccountInfo): UserInfo { }; } -export default class SwitchUserManager { +export class SwitchUserManager { mUserInfo: UserInfo = new UserInfo(); mListeners = new Set(); mHasWait: boolean = false; static getInstance(): SwitchUserManager { - return getSingleInstance(SwitchUserManager, TAG); + return createOrGet(SwitchUserManager, TAG); } constructor() { diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/manager/TimeManager.ts similarity index 92% rename from common/src/main/ets/default/TimeManager.ts rename to common/src/main/ets/default/manager/TimeManager.ts index 78b77c0f..f981b399 100644 --- a/common/src/main/ets/default/TimeManager.ts +++ b/common/src/main/ets/default/manager/TimeManager.ts @@ -17,12 +17,12 @@ import settings from "@ohos.settings"; import commonEvent from "@ohos.commonEvent"; import dataShare from '@ohos.data.dataShare'; -import { Log } from './utils/Log'; -import EventManager from "./event/EventManager"; -import createOrGet from "./SingleInstanceHelper"; -import { obtainLocalEvent } from "./event/EventUtil"; -import Constants from "./Constants"; -import { CommonEventManager, getCommonEventManager, POLICY } from "./commonEvent/CommonEventManager"; +import { Log } from '../utils/Log'; +import EventManager from "../utils/EventManager"; +import { createOrGet } from "../utils/SingleInstanceHelper"; +import { obtainLocalEvent } from "../utils/EventUtil"; +import Constants from "../constants/Constants"; +import { CommonEventManager, getCommonEventManager, POLICY } from "../commonEvent/CommonEventManager"; export const TIME_CHANGE_EVENT = "Time_Change_Event"; diff --git a/common/src/main/ets/default/TintStateManager.ts b/common/src/main/ets/default/manager/TintStateManager.ts similarity index 93% rename from common/src/main/ets/default/TintStateManager.ts rename to common/src/main/ets/default/manager/TintStateManager.ts index 86f3c25a..eb1aaa2f 100644 --- a/common/src/main/ets/default/TintStateManager.ts +++ b/common/src/main/ets/default/manager/TintStateManager.ts @@ -16,9 +16,9 @@ // TODO Window import Window from '@ohos.window'; import display from '@ohos.display'; -import { Log } from './utils/Log'; -import { WindowType, Rect, getWindowName } from './Constants'; -import getSingleInstance from './SingleInstanceHelper'; +import { Log } from '../utils/Log'; +import { WindowType, Rect, getWindowName } from '../constants/Constants'; +import { createOrGet } from '../utils/SingleInstanceHelper'; const TAG = 'TintStateManager'; const LISTENER_SYSTEM_BAR_TINT_CHANGE = 'systemBarTintChange'; @@ -45,12 +45,12 @@ export function getOrCreateTintContentInfo(key: string): TintContentInfo { return AppStorage.Get(storageKey); } -export default class TintStateManager { +export class TintStateManager { mListeners: Map = new Map(); mStates: Map = new Map(); static getInstance(): TintStateManager { - return getSingleInstance(TintStateManager, TAG); + return createOrGet(TintStateManager, TAG); } constructor() { diff --git a/common/src/main/ets/default/WindowPanelManager.ts b/common/src/main/ets/default/manager/WindowPanelManager.ts similarity index 94% rename from common/src/main/ets/default/WindowPanelManager.ts rename to common/src/main/ets/default/manager/WindowPanelManager.ts index db8f1ea1..238bd200 100644 --- a/common/src/main/ets/default/WindowPanelManager.ts +++ b/common/src/main/ets/default/manager/WindowPanelManager.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { Log } from './utils/Log'; -import EventManager from './event/EventManager'; -import { obtainLocalEvent } from './event/EventUtil'; -import { Rect } from './Constants'; -import createOrGet from './SingleInstanceHelper'; +import { Log } from '../utils/Log'; +import EventManager from '../utils/EventManager'; +import { obtainLocalEvent } from '../utils/EventUtil'; +import { Rect } from '../constants/Constants'; +import { createOrGet } from '../utils/SingleInstanceHelper'; export type WindowInfo = { visibility: boolean; diff --git a/common/src/main/ets/default/model/SettingsModel.ts b/common/src/main/ets/default/model/SettingsModel.ts index 2dfaed40..e327fb3b 100644 --- a/common/src/main/ets/default/model/SettingsModel.ts +++ b/common/src/main/ets/default/model/SettingsModel.ts @@ -12,7 +12,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { DataAbilityHelper } from 'ability/dataAbilityHelper'; import { Log } from '../utils/Log'; import FileUtils from '../utils/FileUtils'; diff --git a/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/default/uicomponents/iconComponent.ets similarity index 94% rename from common/src/main/ets/template/iconComponent.ets rename to common/src/main/ets/default/uicomponents/iconComponent.ets index 1b7c8723..9f9f315c 100644 --- a/common/src/main/ets/template/iconComponent.ets +++ b/common/src/main/ets/default/uicomponents/iconComponent.ets @@ -13,8 +13,8 @@ * limitations under the License. */ -import { Log } from '../default/utils/Log' -import StyleConfiguration, { IconComponentStyle } from './common/StyleConfiguration' +import { Log } from '../utils/Log' +import StyleConfiguration, { IconComponentStyle } from '../layoutconfig/StyleConfiguration' const TAG = 'iconComponent' diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/default/utils/BundleParseUtil.ts similarity index 98% rename from common/src/main/ets/plugindatasource/common/BundleParseUtil.ts rename to common/src/main/ets/default/utils/BundleParseUtil.ts index 0432fd5e..5815844e 100644 --- a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts +++ b/common/src/main/ets/default/utils/BundleParseUtil.ts @@ -19,8 +19,8 @@ import { AbilityInfo } from 'bundleManager/AbilityInfo'; import { ExtensionAbilityInfo } from 'bundleManager/ExtensionAbilityInfo'; import { CustomizeData } from 'bundle/customizeData'; import { Metadata } from 'bundleManager/Metadata'; -import { Log } from '../../default/utils/Log'; -import switchUserManager from '../../default/SwitchUserManager'; +import { Log } from './Log'; +import switchUserManager from '../manager/SwitchUserManager'; export type AbilityInfoWithId = (AbilityInfo | ExtensionAbilityInfo) & { itemId: string }; export type BundleListener = { diff --git a/common/src/main/ets/default/DateTimeCommon.ts b/common/src/main/ets/default/utils/DateTimeCommon.ts similarity index 100% rename from common/src/main/ets/default/DateTimeCommon.ts rename to common/src/main/ets/default/utils/DateTimeCommon.ts diff --git a/common/src/main/ets/default/Decorators.ts b/common/src/main/ets/default/utils/Decorators.ts similarity index 97% rename from common/src/main/ets/default/Decorators.ts rename to common/src/main/ets/default/utils/Decorators.ts index 26661eef..c6f44729 100644 --- a/common/src/main/ets/default/Decorators.ts +++ b/common/src/main/ets/default/utils/Decorators.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import { Log } from './utils/Log'; +import { Log } from './Log'; const TAG = 'Decorators'; diff --git a/common/src/main/ets/default/event/EventBus.ts b/common/src/main/ets/default/utils/EventBus.ts similarity index 98% rename from common/src/main/ets/default/event/EventBus.ts rename to common/src/main/ets/default/utils/EventBus.ts index 586fcb86..7b06e078 100644 --- a/common/src/main/ets/default/event/EventBus.ts +++ b/common/src/main/ets/default/utils/EventBus.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Log } from '../utils/Log'; +import { Log } from './Log'; export type Callback = (args: any) => void; const TAG = "EventBus"; diff --git a/common/src/main/ets/default/event/EventManager.ts b/common/src/main/ets/default/utils/EventManager.ts similarity index 94% rename from common/src/main/ets/default/event/EventManager.ts rename to common/src/main/ets/default/utils/EventManager.ts index aff83de3..7f8efbff 100644 --- a/common/src/main/ets/default/event/EventManager.ts +++ b/common/src/main/ets/default/utils/EventManager.ts @@ -14,13 +14,13 @@ */ import ServiceExtensionContext from "application/ServiceExtensionContext"; -import { Log } from '../utils/Log'; -import createOrGet from "../SingleInstanceHelper"; +import { Log } from './Log'; +import { createOrGet } from "./SingleInstanceHelper"; import { EventParser, START_ABILITY_EVENT, Event, LocalEvent } from "./EventUtil"; import { Callback, createEventBus, EventBus } from "./EventBus"; import { BusinessError } from 'basic'; -import {PluginType} from "../../plugindatasource/common/Constants"; -import {writeFaultLog, FaultID} from '../SysFaultLogger'; +import {PluginType} from "../constants/PluginConstants"; +import {writeFaultLog, FaultID} from './SysFaultLogger'; import { launcherAbilityManager } from '../manager/LauncherAbilityManager'; export type unsubscribe = () => void; diff --git a/common/src/main/ets/default/event/EventUtil.ts b/common/src/main/ets/default/utils/EventUtil.ts similarity index 98% rename from common/src/main/ets/default/event/EventUtil.ts rename to common/src/main/ets/default/utils/EventUtil.ts index 8e64cd48..7ac5b076 100644 --- a/common/src/main/ets/default/event/EventUtil.ts +++ b/common/src/main/ets/default/utils/EventUtil.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import { Log } from '../utils/Log'; +import { Log } from './Log'; export type EventTarget = "local" | "remote" | "ability" | "commonEvent"; export type Event = { diff --git a/common/src/main/ets/default/LunarCalendar.ts b/common/src/main/ets/default/utils/LunarCalendar.ts similarity index 100% rename from common/src/main/ets/default/LunarCalendar.ts rename to common/src/main/ets/default/utils/LunarCalendar.ts diff --git a/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts b/common/src/main/ets/default/utils/PluginComponentManagerUtil.ts similarity index 97% rename from common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts rename to common/src/main/ets/default/utils/PluginComponentManagerUtil.ts index 4ae6cd62..d35c5e9e 100644 --- a/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts +++ b/common/src/main/ets/default/utils/PluginComponentManagerUtil.ts @@ -16,8 +16,8 @@ import pluginComponentManager from '@ohos.pluginComponent'; import { Want } from 'ability/want'; -import { ItemComponentData } from './Constants'; -import { Log } from '../../default/utils/Log'; +import { ItemComponentData } from '../constants/PluginConstants'; +import { Log } from './Log'; const TAG = 'PluginComponentManagerUtil'; diff --git a/common/src/main/ets/default/ReadConfigUtil.ts b/common/src/main/ets/default/utils/ReadConfigUtil.ts similarity index 97% rename from common/src/main/ets/default/ReadConfigUtil.ts rename to common/src/main/ets/default/utils/ReadConfigUtil.ts index 217dcf1e..f9e06e97 100644 --- a/common/src/main/ets/default/ReadConfigUtil.ts +++ b/common/src/main/ets/default/utils/ReadConfigUtil.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import { Log } from './utils/Log'; +import { Log } from './Log'; import FileIo from '@ohos.fileio'; const DFAULT_SIZE = 4096; diff --git a/common/src/main/ets/default/ResourceUtil.ts b/common/src/main/ets/default/utils/ResourceUtil.ts similarity index 96% rename from common/src/main/ets/default/ResourceUtil.ts rename to common/src/main/ets/default/utils/ResourceUtil.ts index 9f57e18c..3859ca74 100644 --- a/common/src/main/ets/default/ResourceUtil.ts +++ b/common/src/main/ets/default/utils/ResourceUtil.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityManager from './abilitymanager/abilityManager' +import AbilityManager from '../abilitymanager/abilityManager' /** * Resource util diff --git a/common/src/main/ets/default/ScreenLockCommon.ts b/common/src/main/ets/default/utils/ScreenLockCommon.ts similarity index 93% rename from common/src/main/ets/default/ScreenLockCommon.ts rename to common/src/main/ets/default/utils/ScreenLockCommon.ts index 8f5fc4a2..33303b8b 100644 --- a/common/src/main/ets/default/ScreenLockCommon.ts +++ b/common/src/main/ets/default/utils/ScreenLockCommon.ts @@ -12,8 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Log } from './utils/Log'; -import AbilityManager from '../default/abilitymanager/abilityManager' +import { Log } from './Log'; +import AbilityManager from '../abilitymanager/abilityManager' const TAG = 'ScreenLock-ScreenLockCommon'; export enum ScreenLockStatus { diff --git a/common/src/main/ets/default/SettingsUtil.ts b/common/src/main/ets/default/utils/SettingsUtil.ts similarity index 90% rename from common/src/main/ets/default/SettingsUtil.ts rename to common/src/main/ets/default/utils/SettingsUtil.ts index 897b06cc..334d20f1 100644 --- a/common/src/main/ets/default/SettingsUtil.ts +++ b/common/src/main/ets/default/utils/SettingsUtil.ts @@ -15,11 +15,11 @@ */ import settings from '@ohos.settings'; -import { Log } from './utils/Log'; -import Constants from './Constants'; -import createOrGet from './SingleInstanceHelper'; +import { Log } from './Log'; +import Constants from '../constants/Constants'; +import { createOrGet } from './SingleInstanceHelper'; import Context from 'application/ServiceExtensionContext'; -import AbilityManager from './abilitymanager/abilityManager'; +import AbilityManager from '../abilitymanager/abilityManager'; const TAG = 'SettingsUtil'; diff --git a/common/src/main/ets/default/SingleInstanceHelper.ts b/common/src/main/ets/default/utils/SingleInstanceHelper.ts similarity index 90% rename from common/src/main/ets/default/SingleInstanceHelper.ts rename to common/src/main/ets/default/utils/SingleInstanceHelper.ts index c9178421..a77f563d 100644 --- a/common/src/main/ets/default/SingleInstanceHelper.ts +++ b/common/src/main/ets/default/utils/SingleInstanceHelper.ts @@ -13,13 +13,13 @@ * limitations under the License. */ -import { Log } from './utils/Log'; +import { Log } from './Log'; import audio from '@ohos.multimedia.audio'; const TAG = 'SingleInstanceHelper'; const AUDIO_MANAGER_KEY = 'MultiMediaAudioManager'; -export default function createOrGet(objectClass: { new(): T }, storageKey: string): T { +export function createOrGet(objectClass: { new(): T }, storageKey: string): T { if (!globalThis[storageKey]) { globalThis[storageKey] = new objectClass(); Log.showInfo(TAG, `Create key of ${storageKey}`); diff --git a/common/src/main/ets/default/SysFaultLogger.ts b/common/src/main/ets/default/utils/SysFaultLogger.ts similarity index 98% rename from common/src/main/ets/default/SysFaultLogger.ts rename to common/src/main/ets/default/utils/SysFaultLogger.ts index 3403eaec..4ef5f8d6 100644 --- a/common/src/main/ets/default/SysFaultLogger.ts +++ b/common/src/main/ets/default/utils/SysFaultLogger.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Log } from './utils/Log'; +import { Log } from './Log'; import hiSysEvent from '@ohos.hiSysEvent' const TAG = 'SystemFaultLogger'; diff --git a/common/src/main/ets/default/utils/Trace.ts b/common/src/main/ets/default/utils/Trace.ts index 9ec8d048..86d0b9fa 100644 --- a/common/src/main/ets/default/utils/Trace.ts +++ b/common/src/main/ets/default/utils/Trace.ts @@ -29,7 +29,20 @@ export class Trace { static readonly CORE_METHOD_START_APP_ANIMATION = 'startAppAnimation'; static readonly CORE_METHOD_CLOSE_APP_ANIMATION = 'closeAppAnimation'; - private static readonly TRACE_TAG = 'L:Trace'; + //systemUI trace + static readonly CORE_METHOD_START_DROPDOWNPANEL = 'startDropdownPanel'; + static readonly CORE_METHOD_START_TOUCHEVENT = 'startTouchEvent'; + static readonly CORE_METHOD_CLICK_CAPSULE = 'clickCapsuleEvent'; + static readonly CORE_METHOD_CLICK_NOTIFICATION = 'clickNotificationEvent'; + static readonly CORE_METHOD_START_VOLUMEPANEL = 'startVolumePanel'; + static readonly CORE_METHOD_UNLOCK_SCREEN = "unlockScreen" + static readonly CORE_METHOD_CALL_ACCOUNT_SYSTEM = "callAccountSubsystem"; + static readonly CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT = "passingAccountSubsystemResult"; + static readonly CORE_METHOD_HIDE_PSD_PAGE = "hidePsdPage"; + static readonly CORE_METHOD_SHOW_LOCK_SCREEN = "showLockScreen"; + static readonly CORE_METHOD_SLEEP_TO_LOCK_SCREEN = "sleepToLockScreen" + + private static readonly TRACE_TAG = 'SceneBoard:Trace'; private static readonly RECORD_TRACE = true; private static readonly TRACE_LIMIT = 2000; diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts index ba27aea9..bc0a5151 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts @@ -17,7 +17,7 @@ import worker from '@ohos.worker'; import { Log } from '../default/utils/Log'; import BundleManager from '../default/abilitymanager/bundleManager'; import { Want } from 'ability/want'; -import Constants, { ItemComponentData, obtainMsg, RootConfigInfo } from './common/Constants'; +import Constants, { ItemComponentData, obtainMsg, RootConfigInfo } from '../default/constants/PluginConstants'; import ServiceExtensionContext from 'application/ServiceExtensionContext'; import PluginSourceLoaderPatch from './sourceloader/PluginSourceLoaderPatch' diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts index 357308be..ac56b68a 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts @@ -17,14 +17,14 @@ import { Log } from '../default/utils/Log'; import SourceLoaderFactory from './sourceloader/SourceLoaderFactory'; import SourceLoader from './sourceloader/SourceLoader'; import PluginSourceLoader from './sourceloader/PluginSourceLoader'; -import { FilterData, ItemComponentData, RootConfigInfo } from './common/Constants'; +import { FilterData, ItemComponentData, RootConfigInfo } from '../default/constants/PluginConstants'; import { AbilityInfoWithId, BundleEventType, ListenerHandle, queryAbility, registerBundleListener, -} from './common/BundleParseUtil'; +} from '../default/utils/BundleParseUtil'; import { AbilityInfo } from 'bundle/abilityInfo'; import { ExtensionAbilityInfo } from 'bundleManager/ExtensionAbilityInfo'; diff --git a/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts index 78e5565e..7297ba13 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts @@ -14,8 +14,8 @@ */ import { Log } from '../../default/utils/Log'; -import { AbilityInfoWithId } from '../common/BundleParseUtil'; -import { LoaderConfigInfo } from '../common/Constants'; +import { AbilityInfoWithId } from '../../default/utils/BundleParseUtil'; +import { LoaderConfigInfo } from '../../default/constants/PluginConstants'; import SourceLoader from './SourceLoader'; const TAG = 'DataAbilitySourceLoader'; diff --git a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts index cbdfce0d..996889a2 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts @@ -15,9 +15,9 @@ import { Log } from '../../default/utils/Log'; import SourceLoader from './SourceLoader'; -import Constants, { PluginType, ItemComponentData, LoaderConfigInfo } from '../common/Constants'; -import { AbilityInfoWithId, filterAbilityInfo, PluginData } from '../common/BundleParseUtil'; -import { parseEventString } from '../../default/event/EventUtil'; +import Constants, { PluginType, ItemComponentData, LoaderConfigInfo } from '../../default/constants/PluginConstants'; +import { AbilityInfoWithId, filterAbilityInfo, PluginData } from '../../default/utils/BundleParseUtil'; +import { parseEventString } from '../../default/utils/EventUtil'; const TAG = 'MetaSourceLoader'; diff --git a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts index ad2caafa..9058f793 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts @@ -15,8 +15,8 @@ import { Log } from '../../default/utils/Log'; import SourceLoader from './SourceLoader'; -import Constants, { PluginType, ItemComponentData, LoaderConfigInfo, PluginComponentData } from '../common/Constants'; -import { AbilityInfoWithId, filterAbilityInfo, PluginData } from '../common/BundleParseUtil'; +import Constants, { PluginType, ItemComponentData, LoaderConfigInfo, PluginComponentData } from '../../default/constants/PluginConstants'; +import { AbilityInfoWithId, filterAbilityInfo, PluginData } from '../../default/utils/BundleParseUtil'; const TAG = 'PluginSourceLoader'; diff --git a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts index d8c1844c..dc7752dc 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts @@ -15,9 +15,9 @@ import { Want } from 'ability/want'; import { Log } from '../../default/utils/Log'; -import { ItemComponentData } from '../common/Constants'; +import { ItemComponentData } from '../../default/constants/PluginConstants'; import { ListenerHandle, registerPushListener, requestFunction, PluginComponentInfo -} from '../common/PluginComponentManagerUtil'; +} from '../../default/utils/PluginComponentManagerUtil'; const TAG = 'PluginSourceLoaderPatch'; diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts index 151f3c50..bdfc1b44 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts @@ -14,8 +14,8 @@ */ import { Log } from '../../default/utils/Log'; -import { ItemComponentData, LoaderConfigInfo } from '../common/Constants'; -import { AbilityInfoWithId } from '../common/BundleParseUtil'; +import { ItemComponentData, LoaderConfigInfo } from '../../default/constants/PluginConstants'; +import { AbilityInfoWithId } from '../../default/utils/BundleParseUtil'; const TAG = 'SourceLoader'; diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts b/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts index dfa5f6c4..714f3593 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts @@ -18,7 +18,7 @@ import SourceLoader, { LoaderChannel } from './SourceLoader'; import DataAbilitySourceLoader from './DataAbilitySourceLoader'; import MetaSourceLoader from './MetaSourceLoader'; import PluginSourceLoader from './PluginSourceLoader'; -import { LoaderConfigInfo } from '../common/Constants'; +import { LoaderConfigInfo } from '../../default/constants/PluginConstants'; const TAG = 'SourceLoaderFactory'; diff --git a/feature/systemui/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets b/feature/systemui/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets index c6047d5b..52fdc52c 100644 --- a/feature/systemui/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets +++ b/feature/systemui/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets @@ -15,7 +15,7 @@ import wifi from '@ohos.wifi'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import iconTitleBase from '@ohos/common/src/main/ets/template/iconTitleBase'; +import iconTitleBase from '@ohos/common/src/main/ets/default/base/iconTitleBase'; const TAG = 'Control-airPlaneComponent'; diff --git a/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts index 7931a8d5..3e69aaf3 100644 --- a/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts +++ b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -16,7 +16,7 @@ import screen from '@ohos.screen'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; const TAG = 'AutoRotateModel'; diff --git a/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets index 18851040..a8b1c768 100644 --- a/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets +++ b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets @@ -16,7 +16,7 @@ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import {AutoRotateData} from '../common/Constants'; import ViewModel from '../viewmodel/AutoRotateVM'; -import SimpleToggleBase from '@ohos/common/src/main/ets/template/SimpleToggleBase'; +import SimpleToggleBase from '@ohos/common/src/main/ets/default/base/SimpleToggleBase'; const TAG = 'autorotate-ControlCenterSimpleToggleAutoRotateComponent'; diff --git a/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts index 096733b1..5f3093d4 100644 --- a/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts +++ b/feature/systemui/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts @@ -14,7 +14,7 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import {createOrGet} from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; import AutoRotateService from '../model/AutoRotateService'; import { AutoRotateData } from '../common/Constants'; diff --git a/feature/systemui/batterycomponent/src/main/ets/default/batteryModel.ts b/feature/systemui/batterycomponent/src/main/ets/default/batteryModel.ts index f4f1ac28..a16a1ea3 100644 --- a/feature/systemui/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/feature/systemui/batterycomponent/src/main/ets/default/batteryModel.ts @@ -15,7 +15,7 @@ import BatteryInfo from "@ohos.batteryInfo"; import commonEvent from "@ohos.commonEvent"; -import createOrGet from "@ohos/common/src/main/ets/default/SingleInstanceHelper"; +import { createOrGet } from "@ohos/common/src/main/ets/default/utils/SingleInstanceHelper"; import Constants from "./common/constants"; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import {CommonEventManager, getCommonEventManager, POLICY} from "@ohos/common/src/main/ets/default/commonEvent/CommonEventManager"; diff --git a/feature/systemui/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts b/feature/systemui/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts index 14bf63e5..6308ed98 100644 --- a/feature/systemui/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/feature/systemui/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; const TAG = 'battery-StyleConfiguration'; diff --git a/feature/systemui/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/feature/systemui/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index 2343e9c5..b3f38e66 100644 --- a/feature/systemui/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/feature/systemui/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -19,7 +19,7 @@ import BatterySoc from './batterySoc'; import Constants from '../common/constants'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration' import StyleConfiguration, { BatteryComponentStyle } from '../common/StyleConfiguration' const TAG = 'BatteryComponent-batteryIcon'; diff --git a/feature/systemui/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/feature/systemui/batterycomponent/src/main/ets/default/pages/batteryPic.ets index 008fcaf9..5ab707e8 100644 --- a/feature/systemui/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/feature/systemui/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -15,7 +15,7 @@ import Constants from '../common/constants' import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager' import StyleConfiguration, { BatteryPicStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/BatteryVM' diff --git a/feature/systemui/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/feature/systemui/batterycomponent/src/main/ets/default/pages/batterySoc.ets index 25d781db..0086b1c6 100644 --- a/feature/systemui/batterycomponent/src/main/ets/default/pages/batterySoc.ets +++ b/feature/systemui/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -15,8 +15,8 @@ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration'; -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager'; +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager'; import ViewModel from '../viewmodel/BatteryVM'; const TAG = 'BatteryComponent-batterySoc'; diff --git a/feature/systemui/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts b/feature/systemui/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts index 4dd4790a..d696ff4d 100644 --- a/feature/systemui/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts +++ b/feature/systemui/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts @@ -14,10 +14,10 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; +import { FASlotName } from '@ohos/common/src/main/ets/default/constants/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '@ohos/common/src/main/ets/default/TintStateManager'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/manager/TintStateManager'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; const TAG = 'BatteryVM'; diff --git a/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 4c3f812b..eec24c6e 100644 --- a/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; const TAG = 'bluetooth-StyleConfiguration'; diff --git a/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts index cc67123b..5f7bad45 100644 --- a/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts +++ b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -15,7 +15,7 @@ import bluetooth from '@ohos.bluetooth'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; const TAG = 'BluetoothModel'; diff --git a/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets index 4b2dfa54..c45d1853 100644 --- a/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets +++ b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets @@ -14,10 +14,10 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import EventManager from "@ohos/common/src/main/ets/default/event/EventManager"; -import {obtainStartAbility} from "@ohos/common/src/main/ets/default/event/EventUtil"; +import EventManager from "@ohos/common/src/main/ets/default/utils/EventManager"; +import {obtainStartAbility} from "@ohos/common/src/main/ets/default/utils/EventUtil"; import ViewModel from '../viewmodel/BluetoothVM'; -import iconTitleBase from '@ohos/common/src/main/ets/template/iconTitleBase'; +import iconTitleBase from '@ohos/common/src/main/ets/default/base/iconTitleBase'; const TAG = 'bluetooth-ControlCenterComplexToggleBluetoothComponent'; diff --git a/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets index ede830b4..3fbdc5f6 100644 --- a/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets +++ b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets @@ -14,9 +14,9 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager'; import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration'; +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration'; import StyleConfiguration, { StatusBarBluetoothComponentStyle } from '../common/StyleConfiguration'; import Constants from '../common/Constants'; import ViewModel from '../viewmodel/BluetoothVM'; diff --git a/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts index 5f3573dc..3faa5607 100644 --- a/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts +++ b/feature/systemui/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts @@ -14,10 +14,10 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; +import { FASlotName } from '@ohos/common/src/main/ets/default/constants/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '@ohos/common/src/main/ets/default/TintStateManager'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/manager/TintStateManager'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; import BluetoothService from '../model/BluetoothService'; export const BLUETOOTH_OPEN_STATUS_KEY = 'BluetoothOpenStatus'; diff --git a/feature/systemui/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/feature/systemui/brightnesscomponent/src/main/ets/default/brightnessManager.ts index 6c2b9131..0b18280e 100644 --- a/feature/systemui/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/feature/systemui/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -22,8 +22,8 @@ import systemParameter from '@ohos.systemparameter' import dataShare from '@ohos.data.dataShare'; import Brightness from '@ohos.brightness'; import Context from 'application/ServiceExtensionContext'; -import Constants from "@ohos/common/src/main/ets/default/Constants"; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import Constants from "@ohos/common/src/main/ets/default/constants/Constants"; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; const TAG = 'Control-brightnessManager'; var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 100); diff --git a/feature/systemui/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts b/feature/systemui/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts index 722f222a..b8423434 100644 --- a/feature/systemui/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/feature/systemui/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; const TAG = 'brightness-StyleConfiguration'; diff --git a/feature/systemui/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts b/feature/systemui/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts index aa9203c0..ab2cef89 100644 --- a/feature/systemui/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/feature/systemui/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; import Constants from './constants'; const TAG = 'capsule-StyleConfiguration'; diff --git a/feature/systemui/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/feature/systemui/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index 290e251b..7abb4f96 100644 --- a/feature/systemui/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/feature/systemui/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -17,7 +17,7 @@ import Constants from '../common/constants' import CapsuleViewModel, { VIEW_MODEL_ID, CallState } from '../viewmodel/CapsuleViewModel' import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration' import StyleConfiguration, { CapsuleComponentStyle } from '../common/StyleConfiguration' const TAG = "CapsuleIcon"; diff --git a/feature/systemui/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/feature/systemui/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts index e51cc662..22711df9 100644 --- a/feature/systemui/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts +++ b/feature/systemui/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts @@ -16,8 +16,8 @@ import CapsuleModel from '../model/CapsuleModel'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import ResourceUtil from '@ohos/common/src/main/ets/default/ResourceUtil'; -import Trace from '@ohos/common/src/main/ets/default/Trace' +import ResourceUtil from '@ohos/common/src/main/ets/default/utils/ResourceUtil'; +import { Trace } from '@ohos/common/src/main/ets/default/utils/Trace' let sCapsuleViewModel; diff --git a/feature/systemui/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts b/feature/systemui/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts index 70622f89..6771ff0c 100644 --- a/feature/systemui/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/feature/systemui/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; const TAG = 'clock-StyleConfiguration'; diff --git a/feature/systemui/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/feature/systemui/clockcomponent/src/main/ets/default/pages/clockIcon.ets index 92a77353..72512b52 100644 --- a/feature/systemui/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/feature/systemui/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -14,16 +14,16 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager' import StyleConfiguration, { ClockComponentStyle } from '../common/StyleConfiguration' import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration' import ViewModel from '../viewmodel/ClockVM' import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT, -} from '@ohos/common/src/main/ets/default/TimeManager' -import EventManager, { unsubscribe } from '@ohos/common/src/main/ets/default/event/EventManager' +} from '@ohos/common/src/main/ets/default/manager/TimeManager' +import EventManager, { unsubscribe } from '@ohos/common/src/main/ets/default/utils/EventManager' const TAG = 'ClockComponent-clockIcon'; diff --git a/feature/systemui/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts b/feature/systemui/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts index ace0b88d..13951e68 100644 --- a/feature/systemui/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts +++ b/feature/systemui/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts @@ -14,10 +14,10 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; +import { FASlotName } from '@ohos/common/src/main/ets/default/constants/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '@ohos/common/src/main/ets/default/TintStateManager'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/manager/TintStateManager'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; const TAG = 'ClockVM'; diff --git a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts index 4962c051..589647cf 100644 --- a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts @@ -14,7 +14,7 @@ */ import { ItemComponentData, FilterData -} from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; +} from '@ohos/common/src/main/ets/default/constants/PluginConstants'; export default class Constants { static readonly TOUCHTYPE_DOWN = 0; diff --git a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index ee02a5a6..fbd26abe 100644 --- a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; import Constants from './Constants'; const TAG = 'ControlCenter-StyleConfiguration'; diff --git a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index 50d21b13..04a022c2 100644 --- a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -14,14 +14,14 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; -import SwitchUserManager, { UserInfo } from '@ohos/common/src/main/ets/default/SwitchUserManager'; -import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; -import SettingsUtil from '@ohos/common/src/main/ets/default/SettingsUtil'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; +import { SwitchUserManager, UserInfo } from '@ohos/common/src/main/ets/default/manager/SwitchUserManager'; +import { CheckEmptyUtils } from '@ohos/common/src/main/ets/default/utils/CheckEmptyUtils'; +import SettingsUtil from '@ohos/common/src/main/ets/default/utils/SettingsUtil'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import PluginDataSourceAdapter from '@ohos/common/src/main/ets/plugindatasource/PluginDataSourceAdapter'; import { ItemComponentData, FilterData -} from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; +} from '@ohos/common/src/main/ets/default/constants/PluginConstants'; import Constants, { ControlComponentData, ControlCenterConfig } from '../common/Constants'; export interface ControlCenterListener { diff --git a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets index ef623235..af8733a1 100644 --- a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets @@ -14,9 +14,9 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import EventManager from '@ohos/common/src/main/ets/default/event/EventManager'; -import iconTitleBase from '@ohos/common/src/main/ets/template/iconTitleBase'; -import { itemData } from "@ohos/common/src/main/ets/plugindatasource/common/Constants" +import EventManager from '@ohos/common/src/main/ets/default/utils/EventManager'; +import iconTitleBase from '@ohos/common/src/main/ets/default/base/iconTitleBase'; +import { itemData } from "@ohos/common/src/main/ets/default/constants/PluginConstants" const TAG = 'ComplexToggleComponent'; diff --git a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets index b8ce520b..35b72030 100644 --- a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets @@ -14,7 +14,7 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import {FASlotName} from '@ohos/common/src/main/ets/default/Constants'; +import {FASlotName} from '@ohos/common/src/main/ets/default/constants/Constants'; import AirPlaneComponent from "@ohos/airplanecomponent/src/main/ets/default/pages/airplaneComponent"; import WifiComponent from '@ohos/wificomponent/src/main/ets/default/pages/wifiComponent'; import BluetoothComponent from '@ohos/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent'; diff --git a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets index 5a62645f..b357d0c7 100644 --- a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -14,10 +14,10 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager'; -import { PluginComponentData } from "@ohos/common/src/main/ets/plugindatasource/common/Constants"; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager'; +import { PluginComponentData } from "@ohos/common/src/main/ets/default/constants/PluginConstants"; import ViewModel from '../viewmodel/ControlCenterVM'; -import StyleConfiguration from '@ohos/common/src/main/ets/template/common/StyleConfiguration'; +import StyleConfiguration from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration'; const TAG = 'PluginIconItemComponent'; diff --git a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index 880fe1e3..429c6207 100644 --- a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -14,10 +14,10 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import EventManager from '@ohos/common/src/main/ets/default/event/EventManager'; -import SimpleToggleBase from '@ohos/common/src/main/ets/template/SimpleToggleBase'; +import EventManager from '@ohos/common/src/main/ets/default/utils/EventManager'; +import SimpleToggleBase from '@ohos/common/src/main/ets/default/base/SimpleToggleBase'; import PluginIconItemComponent from './PluginIconItemComponent'; -import {PluginType,itemData} from "@ohos/common/src/main/ets/plugindatasource/common/Constants" +import {PluginType,itemData} from "@ohos/common/src/main/ets/default/constants/PluginConstants" const TAG = 'SimpleToggleComponent'; diff --git a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets index 4bf687c7..fd935e6c 100644 --- a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets @@ -13,9 +13,9 @@ * limitations under the License. */ -import {isNfcAvailable} from '@ohos/common/src/main/ets/default/Constants'; +import {isNfcAvailable} from '@ohos/common/src/main/ets/default/constants/Constants'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import {FASlotName} from '@ohos/common/src/main/ets/default/Constants'; +import {FASlotName} from '@ohos/common/src/main/ets/default/constants/Constants'; import LocationComponent from '@ohos/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent'; import RingModeComponent from '@ohos/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent'; import AutoRotateComponent from '@ohos/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent'; diff --git a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets index 064f6c15..1af60d99 100644 --- a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets @@ -14,8 +14,8 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import EventManager from "@ohos/common/src/main/ets/default/event/EventManager"; -import { obtainStartAbility } from "@ohos/common/src/main/ets/default/event/EventUtil"; +import EventManager from "@ohos/common/src/main/ets/default/utils/EventManager"; +import { obtainStartAbility } from "@ohos/common/src/main/ets/default/utils/EventUtil"; import Constants from '../common/Constants'; import StyleConfiguration, { ControlCenterUpTitleStyle } from '../common/StyleConfiguration'; diff --git a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts index 7c0d546d..a503cd00 100644 --- a/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts +++ b/feature/systemui/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts @@ -14,11 +14,11 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; import { ControlComponentData, ControlCenterConfig } from '../common/Constants'; import ControlCenterService from '../model/ControlCenterService'; import { PluginType, PluginComponentData -} from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; +} from '@ohos/common/src/main/ets/default/constants/PluginConstants'; export const CONTROL_CENTER_COMPLEX_TOGGLE_LAYOUT_KEY = 'ControlCenterComplexToggleLayout'; diff --git a/feature/systemui/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets b/feature/systemui/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets index e6fc464f..94ce365a 100644 --- a/feature/systemui/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets +++ b/feature/systemui/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets @@ -16,7 +16,7 @@ import { Log } from '@ohos/common/src/main/ets/default/utils/Log' import ViewModel from '../../vm/dateTimeViewModel' import Constants from '../../common/constants' -import { ScreenLockStatus } from '@ohos/common/src/main/ets/default/ScreenLockCommon' +import { ScreenLockStatus } from '@ohos/common/src/main/ets/default/utils/ScreenLockCommon' import deviceInfo from '@ohos.deviceInfo'; import i18n from '@ohos.i18n'; diff --git a/feature/systemui/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts b/feature/systemui/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts index 414a2509..ec28ac1b 100644 --- a/feature/systemui/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts +++ b/feature/systemui/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts @@ -16,10 +16,10 @@ import featureAbility from '@ohos.ability.featureAbility' import commonEvent from '@ohos.commonEvent'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log' -import DateTimeCommon from '@ohos/common/src/main/ets/default/DateTimeCommon' +import DateTimeCommon from '@ohos/common/src/main/ets/default/utils/DateTimeCommon' import sTimeManager, {TimeEventArgs, TIME_CHANGE_EVENT, -} from '@ohos/common/src/main/ets/default/TimeManager'; -import EventManager, {unsubscribe} from '@ohos/common/src/main/ets/default/event/EventManager' +} from '@ohos/common/src/main/ets/default/manager/TimeManager'; +import EventManager, {unsubscribe} from '@ohos/common/src/main/ets/default/utils/EventManager' const TAG = 'ScreenLock-DateTimeViewModel' diff --git a/feature/systemui/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index a4db19b0..a961e690 100644 --- a/feature/systemui/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; const TAG = 'location-StyleConfiguration'; diff --git a/feature/systemui/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts b/feature/systemui/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts index 9e189e59..31a6b641 100644 --- a/feature/systemui/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts +++ b/feature/systemui/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts @@ -15,7 +15,7 @@ import geolocation from '@ohos.geoLocationManager'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; const TAG = 'LocationModel'; diff --git a/feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets b/feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets index e108346f..bb6c65c2 100644 --- a/feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets +++ b/feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets @@ -14,11 +14,11 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import EventManager from "@ohos/common/src/main/ets/default/event/EventManager"; -import {obtainStartAbility} from "@ohos/common/src/main/ets/default/event/EventUtil"; +import EventManager from "@ohos/common/src/main/ets/default/utils/EventManager"; +import {obtainStartAbility} from "@ohos/common/src/main/ets/default/utils/EventUtil"; import {LocationData} from '../common/Constants'; import ViewModel from '../viewmodel/LocationVM'; -import SimpleToggleBase from '@ohos/common/src/main/ets/template/SimpleToggleBase'; +import SimpleToggleBase from '@ohos/common/src/main/ets/default/base/SimpleToggleBase'; const TAG = 'location-ControlCenterSimpleToggleLocationComponent'; diff --git a/feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets b/feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets index e643975f..367f7e1c 100644 --- a/feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets +++ b/feature/systemui/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets @@ -14,9 +14,9 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager'; import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration'; +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration'; import StyleConfiguration, { StartsBarLocationComponentStyle } from '../common/StyleConfiguration'; import Constants from '../common/Constants'; import ViewModel from '../viewmodel/LocationVM'; diff --git a/feature/systemui/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts b/feature/systemui/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts index 727021c3..2ebd431a 100644 --- a/feature/systemui/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts +++ b/feature/systemui/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts @@ -14,11 +14,11 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import SwitchUserManager from '@ohos/common/src/main/ets/default/SwitchUserManager'; -import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; +import { SwitchUserManager } from '@ohos/common/src/main/ets/default/manager/SwitchUserManager'; +import { FASlotName } from '@ohos/common/src/main/ets/default/constants/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '@ohos/common/src/main/ets/default/TintStateManager'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/manager/TintStateManager'; +import {createOrGet} from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; import { LocationData } from '../common/Constants'; import LocationService from '../model/LocationService'; diff --git a/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index ad73f89e..d2d17355 100644 --- a/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -20,7 +20,7 @@ import Bundle from '@ohos.bundle'; import { BundleInfo } from 'bundle/bundleInfo'; import ResMgr from '@ohos.resourceManager'; import {BusinessError} from 'basic'; -import SwitchUserManager from '@ohos/common/src/main/ets/default/SwitchUserManager'; +import SwitchUserManager from '@ohos/common/src/main/ets/default/manager/SwitchUserManager'; const INDEX = 0; const IS_INCLUDE_ABILITY_INFO = 0; diff --git a/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts b/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts index 94db1b5f..43697439 100644 --- a/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts @@ -15,7 +15,7 @@ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Notification from '@ohos.notification'; import {DoNotDisturbType} from '../common/constants'; -import TimeManager from '@ohos/common/src/main/ets/default/TimeManager'; +import TimeManager from '@ohos/common/src/main/ets/default/manager/TimeManager'; const TAG = 'NotificationManagenment-NoDisturbingModel'; const MK_DATE_SPLIT = '-'; diff --git a/feature/systemui/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts b/feature/systemui/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts index 6f769dbf..ba9ee133 100644 --- a/feature/systemui/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts @@ -15,7 +15,7 @@ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import ResourceUtil from '@ohos/common/src/main/ets/default/ResourceUtil'; +import ResourceUtil from '@ohos/common/src/main/ets/default/utils/ResourceUtil'; import NoDisturbingModel from '../model/noDisturbingModel'; import ConfigData, {DoNotDisturbType} from '../common/constants'; diff --git a/feature/systemui/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 56837f3b..3b844383 100644 --- a/feature/systemui/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; const TAG = 'capsule-StyleConfiguration'; diff --git a/feature/systemui/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts b/feature/systemui/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts index 5f64a6e2..46716a8c 100644 --- a/feature/systemui/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts +++ b/feature/systemui/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts @@ -16,7 +16,7 @@ import NfcController from '@ohos.nfc.controller'; import { BusinessError } from 'basic'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; const TAG = 'NFCModel'; diff --git a/feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets b/feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets index 43b109b2..cb0b91e8 100644 --- a/feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets +++ b/feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets @@ -16,7 +16,7 @@ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import NfcController from '@ohos.nfc.controller'; import ViewModel from '../viewmodel/NFCModeVM'; -import SimpleToggleBase from '@ohos/common/src/main/ets/template/SimpleToggleBase'; +import SimpleToggleBase from '@ohos/common/src/main/ets/default/base/SimpleToggleBase'; const TAG = 'nfcmode-ControlCenterSimpleToggleNFComponent'; diff --git a/feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets b/feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets index 817c80a5..e6f626f9 100644 --- a/feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets +++ b/feature/systemui/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets @@ -14,9 +14,9 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager'; +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager'; import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration'; +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration'; import StyleConfiguration, { StatusRingModeComponentStyle } from '../common/StyleConfiguration'; import NfcController from '@ohos.nfc.controller'; import ViewModel from '../viewmodel/NFCModeVM'; diff --git a/feature/systemui/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts b/feature/systemui/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts index 08fa46b9..3f8afb13 100644 --- a/feature/systemui/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts +++ b/feature/systemui/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts @@ -15,10 +15,10 @@ import parameter from '@ohos.systemparameter' import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; +import { FASlotName } from '@ohos/common/src/main/ets/default/constants/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '@ohos/common/src/main/ets/default/TintStateManager'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/manager/TintStateManager'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; import NFCModeService from '../model/NFCModeService'; import NfcController from '@ohos.nfc.controller'; diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts index ae38bd2f..e261b6d3 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -14,7 +14,7 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import Trace from '@ohos/common/src/main/ets/default/Trace' +import {Trace }from '@ohos/common/src/main/ets/default/utils/Trace' import WantAgent from '@ohos.wantAgent'; const TAG = 'CommonUtil'; diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts index ce205c0d..27fe4135 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import ReadConfigUtil from '@ohos/common/src/main/ets/default/ReadConfigUtil'; +import ReadConfigUtil from '@ohos/common/src/main/ets/default/utils/ReadConfigUtil'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'NotificationConfig'; diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index 247a56a7..c75052d8 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -18,10 +18,10 @@ import NotificationManager from './NotificationManager'; import ParseDataUtil from './ParseDataUtil'; import RuleController from './rule/RuleController'; import CommonUtil from '../common/CommonUtil'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; import DistributionManager from './NotificationDistributionManager'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import {writeFaultLog, FaultID} from '@ohos/common/src/main/ets/default/SysFaultLogger'; +import {writeFaultLog, FaultID} from '@ohos/common/src/main/ets/default/utils/SysFaultLogger'; const TAG = 'NotificationService'; diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts index 2a83543d..800b190a 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts @@ -14,8 +14,8 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import EventManager from '@ohos/common/src/main/ets/default/event/EventManager'; -import {obtainLocalEvent} from '@ohos/common/src/main/ets/default/event/EventUtil'; +import EventManager from '@ohos/common/src/main/ets/default/utils/EventManager'; +import {obtainLocalEvent} from '@ohos/common/src/main/ets/default/utils/EventUtil'; const TAG = 'NotificationWindowManager'; diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index a9c48ef9..48367a2f 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -24,7 +24,7 @@ import DistributionManager from './NotificationDistributionManager'; import NotificationManager from './NotificationManager'; import Constants, {NotificationItemData} from '../common/constants'; import {NotificationConfig} from './NotificationConfig'; -import TimeManager from '@ohos/common/src/main/ets/default/TimeManager' +import TimeManager from '@ohos/common/src/main/ets/default/manager/TimeManager' const TAG = 'Notification_ParseDataUtil'; let mDate = new Date(); diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts index 761f4a3c..a617cc6e 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts @@ -16,7 +16,7 @@ import {NotificationItemData} from '../../common/constants'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import Notification from '@ohos.notification'; -import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; +import { CheckEmptyUtils } from '@ohos/common/src/main/ets/default/utils/CheckEmptyUtils'; import Bundle from '@ohos.bundle'; const TAG = 'NotificationRuleController'; @@ -79,7 +79,6 @@ export class RuleController { callback(sound, vibrationValues); } - /** * Get notification data of the notification * diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets index 38ea970a..5af0834d 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets @@ -14,7 +14,7 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; +import { CheckEmptyUtils } from '@ohos/common/src/main/ets/default/utils/CheckEmptyUtils'; import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import Constants, {InputActionButtonData, NotificationLayout as Layout} from '../../common/constants'; diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index b72c1252..b340ce58 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -15,8 +15,8 @@ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowPanelManager'; -import {notificationData} from '@ohos/common/src/main/ets/plugindatasource/common/Constants' +import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager'; +import {notificationData} from '@ohos/common/src/main/ets/default/constants/PluginConstants' import Constants, {NotificationLayout as Layout} from '../../common/constants'; import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import CustomItem from './customItem'; diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index 311d8d67..9f9f0ce0 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -19,8 +19,7 @@ import longItem from './longItem'; import multiItem from './multiItem'; import pictureItem from './pictureItem'; import titleItem from './titleItem'; -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; +import { CheckEmptyUtils, Log } from '@ohos/common'; import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import ActionComponent from './actionComponent'; diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets index 8d15e1e6..9fd03278 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets @@ -14,7 +14,6 @@ */ import Constants, {NotificationItemData, NotificationLayout as Layout} from '../../common/constants'; -import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; @Component export default struct PictureItem { diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets index 0a8fcf1c..a200e0e8 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -14,10 +14,9 @@ */ import Constants, { NotificationItemData } from '../../common/constants'; -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; -import EventManager from "@ohos/common/src/main/ets/default/event/EventManager" -import { obtainStartAbility } from "@ohos/common/src/main/ets/default/event/EventUtil" +import { CheckEmptyUtils, Log } from '@ohos/common'; +import EventManager from "@ohos/common/src/main/ets/default/utils/EventManager" +import { obtainStartAbility } from "@ohos/common/src/main/ets/default/utils/EventUtil" import Notification from '@ohos.notification'; import deviceInfo from '@ohos.deviceInfo'; diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets index 0e4dcb8c..504111ad 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets @@ -14,8 +14,7 @@ */ import Constants, { NotificationLayout as Layout } from '../../common/constants'; -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; +import { CheckEmptyUtils, Log } from '@ohos/common'; const TAG = 'NoticeItem-TitleItem'; @Component diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts index 159ad01d..44263a9c 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import SwitchUserManager from '@ohos/common/src/main/ets/default/SwitchUserManager'; +import { Log, Trace } from '@ohos/common'; +import { SwitchUserManager } from '@ohos/common/src/main/ets/default/manager/SwitchUserManager'; import media from '@ohos.multimedia.media'; import vibrator from '@ohos.vibrator'; import wantAgent from '@ohos.wantAgent'; @@ -22,11 +22,10 @@ import Notification from '@ohos.notification'; import NotificationService from '../model/NotificationService'; import NotificationWindowManager from '../model/NotificationWindowManager'; import NotificationConfig from '../model/NotificationConfig'; -import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils'; +import {CheckEmptyUtils} from '@ohos/common/src/main/ets/default/utils/CheckEmptyUtils'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import EventManager from '@ohos/common/src/main/ets/default/event/EventManager'; -import {obtainLocalEvent} from '@ohos/common/src/main/ets/default/event/EventUtil'; -import Trace from '@ohos/common/src/main/ets/default/Trace' +import EventManager from '@ohos/common/src/main/ets/default/utils/EventManager'; +import {obtainLocalEvent} from '@ohos/common/src/main/ets/default/utils/EventUtil'; import CommonUtil from '../common/CommonUtil'; import Constants,{NotificationItemData} from '../common/constants'; diff --git a/feature/systemui/notificationmanagement/src/main/ets/pages/noDisturb.ets b/feature/systemui/notificationmanagement/src/main/ets/pages/noDisturb.ets index fafe4925..fcc1bcef 100644 --- a/feature/systemui/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/feature/systemui/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -17,7 +17,7 @@ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import HeadComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/headComponent'; import ConfigData from '../common/constants'; import deviceInfo from '@ohos.deviceInfo'; -import { concatTime } from '@ohos/common/src/main/ets/default/TimeManager'; +import { concatTime } from '@ohos/common/src/main/ets/default/manager/TimeManager'; import ItemComponent from '@ohos/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent'; import {DoNotDisturbType} from '@ohos/managementcomponent/src/main/ets/com/ohos/common/constants'; import NoDisturbingModel from '@ohos/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel'; diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets index 5f766461..5ce8e089 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets @@ -16,20 +16,20 @@ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import Trace from '@ohos/common/src/main/ets/default/Trace' -import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowPanelManager' -import EventManager, { unsubscribe } from "@ohos/common/src/main/ets/default/event/EventManager" -import { START_ABILITY_EVENT } from "@ohos/common/src/main/ets/default/event/EventUtil" -import MultimodalInputManager from '@ohos/common/src/main/ets/default/MultimodalInputManager' +import Trace from '@ohos/common/src/main/ets/default/utils/Trace' +import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager' +import EventManager, { unsubscribe } from "@ohos/common/src/main/ets/default/utils/EventManager" +import { START_ABILITY_EVENT } from "@ohos/common/src/main/ets/default/utils/EventUtil" +import MultimodalInputManager from '@ohos/common/src/main/ets/default/manager/MultimodalInputManager' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' -import HeightConfigUtils from '@ohos/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' +import HeightConfigUtils from '@ohos/common/src/main/ets/default/layoutconfig/HeightConfigUtils' import StatusBarVM from '@ohos/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' import NavigationEvent from './common/navigationEvent' import Notification from './notification' import ControlCenterComponent from './control' import StyleManager from './common/StyleManager' import dataShare from '@ohos.data.dataShare'; -import Constants from "@ohos/common/src/main/ets/default/Constants"; +import Constants from "@ohos/common/src/main/ets/default/constants/Constants"; const TAG = 'DropdownPanel' diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets index a9c0c8aa..0bbec2de 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets @@ -18,7 +18,7 @@ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abi import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import WindowPanelManager, { WindowType, WindowInfo, SystemUi_DropdownPanel, SystemUi_BannerNotice -} from '@ohos/common/src/main/ets/default/WindowPanelManager' +} from '@ohos/common/src/main/ets/default/manager/WindowPanelManager' import { DropdownPanel } from './DropdownPanel'; import { BannerNotificationPanel } from './bannerNotification'; import screenSessionManager from '@ohos.screenSessionManager'; diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets index d48e4150..b059644d 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets @@ -14,10 +14,10 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import {notificationData} from '@ohos/common/src/main/ets/plugindatasource/common/Constants' +import {notificationData} from '@ohos/common/src/main/ets/default/constants/PluginConstants' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import WindowPanelManager, { WindowType, SystemUi_BannerNotice, WindowInfo } from '@ohos/common/src/main/ets/default/WindowPanelManager'; -import EventManager, {unsubscribe} from "@ohos/common/src/main/ets/default/event/EventManager"; +import WindowPanelManager, { WindowType, SystemUi_BannerNotice, WindowInfo } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager'; +import EventManager, {unsubscribe} from "@ohos/common/src/main/ets/default/utils/EventManager"; import BannerNotification from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem'; import NotificationViewModel from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel'; import NotificationConstants, { ScreenLockStatus } from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants'; diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts index f5163282..9cd343cd 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts @@ -12,10 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; +import { FASlotName } from '@ohos/common/src/main/ets/default/constants/Constants'; import { ControlCenterConfig } from '@ohos/controlcentercomponent/src/main/ets/com/ohos/common/Constants'; -import {isNfcAvailable} from '@ohos/common/src/main/ets/default/Constants'; +import {isNfcAvailable} from '@ohos/common/src/main/ets/default/constants/Constants'; const controlCenterConfig: ControlCenterConfig = { ComplexToggleLayout: [FASlotName.WIFI, FASlotName.BLUETOOTH], diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts index 5295f337..a5f52817 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; import Constants from './constants'; import deviceInfo from '@ohos.deviceInfo'; diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts index c2d96cc3..32f86b03 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts @@ -14,7 +14,7 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import CommonTemplateStyleConfiguration from '@ohos/common/src/main/ets/template/common/StyleConfiguration'; +import CommonTemplateStyleConfiguration from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration'; import ControlCenterStyleConfiguration from '@ohos/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration'; import BrightnessStyleConfiguration from '@ohos/brightnesscomponent/src/main/ets/default/common/StyleConfiguration'; import RingModeStyleConfiguration from '@ohos/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration'; diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/control.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/control.ets index 4a88944f..f8eae8fb 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/control.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/control.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import {isNfcAvailable} from '@ohos/common/src/main/ets/default/Constants'; +import {isNfcAvailable} from '@ohos/common/src/main/ets/default/constants/Constants'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import ControlCenterComponent from '@ohos/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent' import BatteryIcon from '@ohos/batterycomponent/src/main/ets/default/pages/batteryIcon' diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets index ebe8de04..2cbb0516 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import {isNfcAvailable} from '@ohos/common/src/main/ets/default/Constants'; +import {isNfcAvailable} from '@ohos/common/src/main/ets/default/constants/Constants'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import EventManager, { unsubscribe } from "@ohos/common/src/main/ets/default/event/EventManager"; -import { obtainStartAbility } from "@ohos/common/src/main/ets/default/event/EventUtil"; +import EventManager, { unsubscribe } from "@ohos/common/src/main/ets/default/utils/EventManager"; +import { obtainStartAbility } from "@ohos/common/src/main/ets/default/utils/EventUtil"; import Constants from './common/constants'; import BatteryIcon from '@ohos/batterycomponent/src/main/ets/default/pages/batteryIcon'; import ClockIcon from '@ohos/clockcomponent/src/main/ets/default/pages/clockIcon'; @@ -29,9 +29,9 @@ import RingModeIcon from '@ohos/ringmodecomponent/src/main/ets/com/ohos/pages/St import NfcIcon from '@ohos/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent'; import NotificationListComponent from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent'; import NotificationViewModel from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel'; -import ResourceUtil from '@ohos/common/src/main/ets/default/ResourceUtil'; +import ResourceUtil from '@ohos/common/src/main/ets/default/utils/ResourceUtil'; import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT -} from '@ohos/common/src/main/ets/default/TimeManager'; +} from '@ohos/common/src/main/ets/default/manager/TimeManager'; import deviceInfo from '@ohos.deviceInfo'; const TAG = 'DropdownPanel-notification'; diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/SCBStatusBar.ets b/feature/systemui/phone/statusbar/src/main/ets/pages/SCBStatusBar.ets index 1ffa688e..6d1c7227 100644 --- a/feature/systemui/phone/statusbar/src/main/ets/pages/SCBStatusBar.ets +++ b/feature/systemui/phone/statusbar/src/main/ets/pages/SCBStatusBar.ets @@ -14,7 +14,7 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { Rect as Area } from '@ohos/common/src/main/ets/default/Constants' +import { Rect as Area } from '@ohos/common/src/main/ets/default/constants/Constants' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' import StatusBarConfiguration from '@ohos/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; import screenSessionManager from '@ohos.screenSessionManager' diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets b/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets index a62ee3ba..a2e220cb 100644 --- a/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets +++ b/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets @@ -13,11 +13,9 @@ * limitations under the License. */ -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; - -import EventManager, {unsubscribe} from "@ohos/common/src/main/ets/default/event/EventManager" -import {obtainLocalEvent} from "@ohos/common/src/main/ets/default/event/EventUtil" -import HeightConfigUtils from '@ohos/common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' +import EventManager, {unsubscribe} from "@ohos/common/src/main/ets/default/utils/EventManager" +import {obtainLocalEvent} from "@ohos/common/src/main/ets/default/utils/EventUtil" +import { HeightConfigUtils } from '@ohos/common/src/main/ets/default/layoutconfig/HeightConfigUtils' import StatusBarComponent from '@ohos/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' import StatusBarVM from '@ohos/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' import {StatusBarData} from '@ohos/statusbarcomponent/src/main/ets/com/ohos/common/Constants' @@ -25,8 +23,8 @@ import Constants from './common/constants' import StyleManager from './common/StyleManager' import StatusbarConfig from './common/StatusbarConfig' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' -import Trace from '@ohos/common/src/main/ets/default/Trace' -import { WindowType, WINDOW_SHOW_HIDE_EVENT } from '@ohos/common/src/main/ets/default/WindowPanelManager' +import { Trace, Log } from '@ohos/common'; +import { WindowType, WINDOW_SHOW_HIDE_EVENT } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager' const TAG = "StatusBar"; const SLIDING_STATUS_BAR_DISTANCE = 18 diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts b/feature/systemui/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts index 523dcb71..cc81c063 100644 --- a/feature/systemui/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts +++ b/feature/systemui/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; +import { FASlotName } from '@ohos/common/src/main/ets/default/constants/Constants'; import { StatusBarConfig } from '@ohos/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts index ec014638..7e7ef2cc 100644 --- a/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts +++ b/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; const TAG = 'StatusBar-StyleConfiguration'; diff --git a/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 56837f3b..3b844383 100644 --- a/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; const TAG = 'capsule-StyleConfiguration'; diff --git a/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts index afc24e0c..6cd3a25e 100644 --- a/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts +++ b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts @@ -16,8 +16,8 @@ import audio from '@ohos.multimedia.audio'; import { BusinessError } from 'basic'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; -import { getAudioManager } from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; +import { getAudioManager } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; import { AudioRingMode } from '../common/Constants'; const TAG = 'RingModeModel'; diff --git a/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets index 95c7d073..22e1c13f 100644 --- a/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets +++ b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets @@ -14,11 +14,11 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log' -import EventManager from "@ohos/common/src/main/ets/default/event/EventManager" -import { obtainStartAbility } from "@ohos/common/src/main/ets/default/event/EventUtil" +import EventManager from "@ohos/common/src/main/ets/default/utils/EventManager" +import { obtainStartAbility } from "@ohos/common/src/main/ets/default/utils/EventUtil" import { AudioRingMode } from '../common/Constants' import ViewModel from '../viewmodel/RingModeVM' -import SimpleToggleBase from '@ohos/common/src/main/ets/template/SimpleToggleBase' +import SimpleToggleBase from '@ohos/common/src/main/ets/default/base/SimpleToggleBase' import StyleConfiguration, { ControlCenterRingModeComponentStyle } from '../common/StyleConfiguration' const TAG = 'ringmode-ControlCenterSimpleToggleRingModeComponent' diff --git a/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets index 3b18da86..787dbec0 100644 --- a/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets +++ b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets @@ -14,9 +14,9 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log' -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager' import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration' import StyleConfiguration, { StatusRingModeComponentStyle } from '../common/StyleConfiguration' import Constants, { AudioRingMode } from '../common/Constants' import ViewModel from '../viewmodel/RingModeVM' diff --git a/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts index c4c46f6a..f2dcf1b2 100644 --- a/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts +++ b/feature/systemui/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts @@ -14,10 +14,10 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; +import { FASlotName } from '@ohos/common/src/main/ets/default/constants/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '@ohos/common/src/main/ets/default/TintStateManager'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/manager/TintStateManager'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; import { AudioRingMode } from '../common/Constants'; import RingModeService from '../model/RingModeService'; diff --git a/feature/systemui/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index 89d059ff..a4367355 100644 --- a/feature/systemui/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -18,12 +18,11 @@ import osAccount from '@ohos.account.osAccount' import commonEvent from '@ohos.commonEvent'; import util from '@ohos.util'; import {Callback} from 'basic'; -import Trace from '@ohos/common/src/main/ets/default/Trace'; -import {SysFaultLogger, FaultID} from '@ohos/common/src/main/ets/default/SysFaultLogger'; -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { Trace, Log } from '@ohos/common'; +import {SysFaultLogger, FaultID} from '@ohos/common/src/main/ets/default/utils/SysFaultLogger'; import { CommonEventManager, getCommonEventManager } from "@ohos/common/src/main/ets/default/commonEvent/CommonEventManager"; -import EventManager from "@ohos/common/src/main/ets/default/event/EventManager"; -import { obtainLocalEvent } from "@ohos/common/src/main/ets/default/event/EventUtil"; +import EventManager from "@ohos/common/src/main/ets/default/utils/EventManager"; +import { obtainLocalEvent } from "@ohos/common/src/main/ets/default/utils/EventUtil"; import {UserData} from '../data/userData'; const TAG = "ScreenLock-AccountsModel" diff --git a/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index 820185a0..7c1bb7da 100644 --- a/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -13,11 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Trace from '@ohos/common/src/main/ets/default/Trace' -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import {SysFaultLogger, FaultID} from '@ohos/common/src/main/ets/default/SysFaultLogger' +import { Trace, Log } from '@ohos/common'; +import {SysFaultLogger, FaultID} from '@ohos/common/src/main/ets/default/utils/SysFaultLogger' import ScreenLockMar from '@ohos.screenlock'; -import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowPanelManager' +import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager' import Constants from '../common/constants' import { Callback } from 'basic'; diff --git a/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 6e8bbb2d..84a94a19 100644 --- a/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -12,13 +12,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import Trace from '@ohos/common/src/main/ets/default/Trace' -import {writeFaultLog, FaultID} from '@ohos/common/src/main/ets/default/SysFaultLogger' +import { Trace, Log } from '@ohos/common'; +import {writeFaultLog, FaultID} from '@ohos/common/src/main/ets/default/utils/SysFaultLogger' import ScreenLockModel from './screenLockModel'; import AccountModel, {AuthType, AuthSubType, AuthTurstLevel} from './accountsModel' -import {ScreenLockStatus} from '@ohos/common/src/main/ets/default/ScreenLockCommon'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper' +import {ScreenLockStatus} from '@ohos/common/src/main/ets/default/utils/ScreenLockCommon'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper' import Router from '@system.router'; import commonEvent from '@ohos.commonEvent'; import hiDebug from '@ohos.hidebug'; diff --git a/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts index 911c8c78..2842c860 100644 --- a/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import {ReadConfigFile} from '@ohos/common/src/main/ets/default/ScreenLockCommon' +import {ReadConfigFile} from '@ohos/common/src/main/ets/default/utils/ScreenLockCommon' const SCREENLOCK_MODE_FILE_NAME = "screenlock.json"; const TAG = 'ScreenLock-ScreenlockStyle'; diff --git a/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/accounts.ets b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/accounts.ets index 135e8116..5a028a99 100644 --- a/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/accounts.ets +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/accounts.ets @@ -18,7 +18,7 @@ import ViewModel from '../../vm/accountsViewModel'; import Constants from '../../common/constants'; import {UserData} from '../../data/userData'; import { ACCOUNTS_REFRESH_EVENT } from '../../model/accountsModel' -import EventManager, { unsubscribe } from '@ohos/common/src/main/ets/default/event/EventManager'; +import EventManager, { unsubscribe } from '@ohos/common/src/main/ets/default/utils/EventManager'; const TAG = 'ScreenLock-Accounts' diff --git a/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets index e9b11865..0c52908b 100644 --- a/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets @@ -14,7 +14,7 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import {ScreenLockStatus} from '@ohos/common/src/main/ets/default/ScreenLockCommon' +import {ScreenLockStatus} from '@ohos/common/src/main/ets/default/utils/ScreenLockCommon' import ViewModel from '../../vm/lockIconViewModel' import Constants from '../../common/constants' diff --git a/feature/systemui/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts index 54db2a92..2fd6653c 100644 --- a/feature/systemui/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts @@ -14,7 +14,7 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import WindowManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowPanelManager'; +import WindowManager, { WindowType } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager'; import Constants, {StatusBarGroupComponentData} from '../common/constants'; const TAG = 'StatusBarVM'; diff --git a/feature/systemui/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts index 9356f4da..1a49c481 100644 --- a/feature/systemui/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts @@ -13,8 +13,7 @@ * limitations under the License. */ -import Trace from '@ohos/common/src/main/ets/default/Trace' -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { Trace, Log } from '@ohos/common'; import Constants from '../common/constants' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' import {Callback} from 'basic'; diff --git a/feature/systemui/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts index 332c06af..3bf1aa3e 100644 --- a/feature/systemui/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -13,8 +13,7 @@ * limitations under the License. */ -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import Trace from '@ohos/common/src/main/ets/default/Trace' +import { Trace, Log } from '@ohos/common'; import Constants from '../common/constants' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' import {Callback} from 'basic'; diff --git a/feature/systemui/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts index 751334e6..c12912da 100644 --- a/feature/systemui/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts @@ -14,7 +14,7 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import {ScreenLockStatus} from '@ohos/common/src/main/ets/default/ScreenLockCommon' +import {ScreenLockStatus} from '@ohos/common/src/main/ets/default/utils/ScreenLockCommon' import screenLockService from '../model/screenLockService' const TAG = 'ScreenLock-LockIconViewModel' diff --git a/feature/systemui/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts index 0b1d6f84..bb48803b 100644 --- a/feature/systemui/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts +++ b/feature/systemui/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts @@ -13,8 +13,7 @@ * limitations under the License. */ -import Trace from '@ohos/common/src/main/ets/default/Trace' -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; +import { Trace, Log } from '@ohos/common'; import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' import {Callback} from 'basic'; diff --git a/feature/systemui/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts b/feature/systemui/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts index 5c7da693..2d979c33 100644 --- a/feature/systemui/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/feature/systemui/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; const TAG = 'signal-StyleConfiguration'; diff --git a/feature/systemui/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/feature/systemui/signalcomponent/src/main/ets/default/pages/signalIcon.ets index c122aad4..7f978cf1 100644 --- a/feature/systemui/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/feature/systemui/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -16,9 +16,9 @@ import Constants from '../common/constants'; import mSignalModel from '../signalModel'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager' import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration' import StyleConfiguration, { SignalComponentStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/SignalVM' diff --git a/feature/systemui/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts b/feature/systemui/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts index 3b735469..9de12dec 100644 --- a/feature/systemui/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts +++ b/feature/systemui/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts @@ -14,10 +14,10 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; +import { FASlotName } from '@ohos/common/src/main/ets/default/constants/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '@ohos/common/src/main/ets/default/TintStateManager'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/manager/TintStateManager'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; const TAG = 'SignalVM'; diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts index 2bfa34be..8700afe2 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import { Event } from '@ohos/common/src/main/ets/default/event/EventUtil'; +import { Event } from '@ohos/common/src/main/ets/default/utils/EventUtil'; import { ItemComponentData, ActionData, FilterData -} from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; +} from '@ohos/common/src/main/ets/default/constants/PluginConstants'; export default class Constants { static readonly EMPTY_AREA_POSITION_LEFT = 'left'; diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index 3a844ce5..171b9a09 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -15,8 +15,8 @@ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import ResourceUtil from '@ohos/common/src/main/ets/default/ResourceUtil' -import CommonStyleConfiguration from '@ohos/common/src/main/ets/default/StyleConfiguration' +import ResourceUtil from '@ohos/common/src/main/ets/default/utils/ResourceUtil' +import CommonStyleConfiguration from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration' import screenSessionManager from '@ohos.screenSessionManager' const TAG = 'StatusBarConfiguration'; diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index c6c44747..0a852b0f 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; import Constants from './Constants'; const TAG = 'statusBar-StyleConfiguration'; diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts index f479b338..bac852cd 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -14,15 +14,15 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; -import SwitchUserManager, { UserInfo } from '@ohos/common/src/main/ets/default/SwitchUserManager'; +import { FASlotName } from '@ohos/common/src/main/ets/default/constants/Constants'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; +import {SwitchUserManager, UserInfo } from '@ohos/common/src/main/ets/default/manager/SwitchUserManager'; import { ItemComponentData, PluginComponentData, FilterData -} from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; +} from '@ohos/common/src/main/ets/default/constants/PluginConstants'; import PluginDataSourceAdapter from '@ohos/common/src/main/ets/plugindatasource/PluginDataSourceAdapter'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import Constants, { StatusBarData, StatusBarComponentData, LayoutGroup, StatusBarConfig } from '../common/Constants'; -import { parseEventString } from '@ohos/common/src/main/ets/default/event/EventUtil'; +import { parseEventString } from '@ohos/common/src/main/ets/default/utils/EventUtil'; export interface StatusBarListener { setStatusBarLayout(layout: string[][]): void; diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index cade812c..c43ad6c5 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -13,14 +13,13 @@ * limitations under the License. */ -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import EventManager, { unsubscribe } from '@ohos/common/src/main/ets/default/event/EventManager' -import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils' -import { WINDOW_SHOW_HIDE_EVENT } from '@ohos/common/src/main/ets/default/WindowPanelManager' -import { PluginType,itemData } from "@ohos/common/src/main/ets/plugindatasource/common/Constants" +import EventManager, { unsubscribe } from '@ohos/common/src/main/ets/default/utils/EventManager' +import { CheckEmptyUtils, Log } from '@ohos/common'; +import { WINDOW_SHOW_HIDE_EVENT } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager' +import { PluginType,itemData } from "@ohos/common/src/main/ets/default/constants/PluginConstants" import ViewModel from '../viewmodel/StatusBarVM' import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration' import StyleConfiguration, { IconItemComponentStyle } from '../common/StyleConfiguration' import MetaIconItemComponent from './MetaIconItemComponent' import PluginIconItemComponent from './PluginIconItemComponent' diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets index 41159396..71ac7733 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets @@ -13,14 +13,13 @@ * limitations under the License. */ -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' -import CheckEmptyUtils from '@ohos/common/src/main/ets/default/CheckEmptyUtils' +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager' +import { CheckEmptyUtils, Log } from '@ohos/common'; import ViewModel from '../viewmodel/StatusBarVM' import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration' import StyleConfiguration, { IconItemComponentStyle } from '../common/StyleConfiguration' -import { itemData } from "@ohos/common/src/main/ets/plugindatasource/common/Constants" +import { itemData } from "@ohos/common/src/main/ets/default/constants/PluginConstants" const TAG = 'MetaIconItemComponent' diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets index eb8b0d06..be5c81f9 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -14,10 +14,10 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' -import { PluginComponentData } from "@ohos/common/src/main/ets/plugindatasource/common/Constants" +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager' +import { PluginComponentData } from "@ohos/common/src/main/ets/default/constants/PluginConstants" import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration' import StyleConfiguration, { PluginIconItemComponentStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/StatusBarVM' diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index 759f3b7d..cd44c58f 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -13,13 +13,13 @@ * limitations under the License. */ -import {isNfcAvailable} from '@ohos/common/src/main/ets/default/Constants'; +import {isNfcAvailable} from '@ohos/common/src/main/ets/default/constants/Constants'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import { StatusBarData, StatusBarBackgroundData, StatusBarConfig } from '../common/Constants' -import { FASlotName } from '@ohos/common/src/main/ets/default/Constants' -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' +import { FASlotName } from '@ohos/common/src/main/ets/default/constants/Constants' +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager' import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration' import StyleConfiguration, { StatusBarNotificationIconStyle, VerticalStatusBarItemLoadComponentStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/StatusBarVM' diff --git a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index 2a6b2ac9..6fe3070d 100644 --- a/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/feature/systemui/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -14,17 +14,17 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import EventManager from '@ohos/common/src/main/ets/default/event/EventManager'; -import { obtainLocalEvent } from '@ohos/common/src/main/ets/default/event/EventUtil'; +import EventManager from '@ohos/common/src/main/ets/default/utils/EventManager'; +import { obtainLocalEvent } from '@ohos/common/src/main/ets/default/utils/EventUtil'; import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; -import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/WindowPanelManager'; -import TintStateManager, { TintState, TintContentInfo, getOrCreateTintContentInfo -} from '@ohos/common/src/main/ets/default/TintStateManager'; -import { FASlotName, Rect } from '@ohos/common/src/main/ets/default/Constants'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; +import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager'; +import { TintStateManager,TintState, TintContentInfo, getOrCreateTintContentInfo +} from '@ohos/common/src/main/ets/default/manager/TintStateManager'; +import { FASlotName, Rect } from '@ohos/common/src/main/ets/default/constants/Constants'; import { PluginType, PluginComponentData -} from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; -import StyleConfigurationCommon from '@ohos/common/src/main/ets/default/StyleConfiguration'; +} from '@ohos/common/src/main/ets/default/constants/PluginConstants'; +import StyleConfigurationCommon from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration'; import { StatusBarData, StatusBarBackgroundData, StatusBarComponentGroupContentData, StatusBarComponentData, StatusBarConfig } from '../common/Constants'; import StatusBarService from '../model/StatusBarService'; diff --git a/feature/systemui/volumepanel/src/main/ets/common/StyleConfiguration.ts b/feature/systemui/volumepanel/src/main/ets/common/StyleConfiguration.ts index 66c3c1a6..acf542cb 100644 --- a/feature/systemui/volumepanel/src/main/ets/common/StyleConfiguration.ts +++ b/feature/systemui/volumepanel/src/main/ets/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; const TAG = 'VolumePanel-StyleConfiguration'; diff --git a/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets b/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets index 2b7ac91c..c01c63ba 100644 --- a/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets +++ b/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets @@ -18,7 +18,7 @@ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abi import StyleManager from '../common/StyleManager' import screenSessionManager from '@ohos.screenSessionManager' import VolumeWindowController from '@ohos/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController' -import { Rect as Area } from '@ohos/common/src/main/ets/default/Constants' +import { Rect as Area } from '@ohos/common/src/main/ets/default/constants/Constants' const TAG = 'SCBVolumePanel' diff --git a/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 9692fdc1..5d9005b4 100644 --- a/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; import Constants from './Constants'; const TAG = 'volumepanel-StyleConfiguration'; diff --git a/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts index 671d47cc..20577261 100644 --- a/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts +++ b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts @@ -14,8 +14,8 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import getSingleInstance from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; -import Trace from '@ohos/common/src/main/ets/default/Trace' +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; +import {Trace} from '@ohos/common/src/main/ets/default/utils/Trace' import VolumePanelService from '../model/VolumePanelService'; import { VolumeInfo } from '../common/Constants'; @@ -30,7 +30,7 @@ export default class VolumeWindowController { mIsWindowShown: boolean; static getInstance(): VolumeWindowController{ - return getSingleInstance(VolumeWindowController, SINGLE_STANCE_KEY); + return createOrGet(VolumeWindowController, SINGLE_STANCE_KEY); } constructor() { diff --git a/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts index fc326ea3..9f39d628 100644 --- a/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts +++ b/feature/systemui/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts @@ -16,8 +16,8 @@ import audio from '@ohos.multimedia.audio'; import { BusinessError } from 'basic'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import getSingleInstance, { getAudioManager -} from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +import {createOrGet, getAudioManager +} from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; import { AudioVolumeType, VolumeInfo } from '../common/Constants'; const TAG = 'VolumePanelModel'; @@ -316,6 +316,6 @@ export class VolumePanelService { } } -let volumePanelService = getSingleInstance(VolumePanelService, TAG); +let volumePanelService = createOrGet(VolumePanelService, TAG); export default volumePanelService; \ No newline at end of file diff --git a/feature/systemui/wificomponent/src/main/ets/default/common/StyleConfiguration.ts b/feature/systemui/wificomponent/src/main/ets/default/common/StyleConfiguration.ts index 55440d15..3039c3b2 100644 --- a/feature/systemui/wificomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/feature/systemui/wificomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; const TAG = 'wifi-StyleConfiguration'; diff --git a/feature/systemui/wificomponent/src/main/ets/default/pages/wifiComponent.ets b/feature/systemui/wificomponent/src/main/ets/default/pages/wifiComponent.ets index 7bb0d04f..0533a871 100644 --- a/feature/systemui/wificomponent/src/main/ets/default/pages/wifiComponent.ets +++ b/feature/systemui/wificomponent/src/main/ets/default/pages/wifiComponent.ets @@ -15,9 +15,9 @@ import mWifiManger from '../wifiModel' import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import EventManager from "@ohos/common/src/main/ets/default/event/EventManager" -import {obtainStartAbility} from "@ohos/common/src/main/ets/default/event/EventUtil" -import iconTitleBase from '@ohos/common/src/main/ets/template/iconTitleBase' +import EventManager from "@ohos/common/src/main/ets/default/utils/EventManager" +import {obtainStartAbility} from "@ohos/common/src/main/ets/default/utils/EventUtil" +import iconTitleBase from '@ohos/common/src/main/ets/default/base/iconTitleBase' import Constants from '../common/constants' const TAG = 'Control-wifiComponent' diff --git a/feature/systemui/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/feature/systemui/wificomponent/src/main/ets/default/pages/wifiIcon.ets index 1a65054f..526bb827 100644 --- a/feature/systemui/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/feature/systemui/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -16,9 +16,9 @@ import Constants from '../common/constants' import mWifiModel from '../wifiModel' import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { TintContentInfo } from '@ohos/common/src/main/ets/default/TintStateManager' +import { TintContentInfo } from '@ohos/common/src/main/ets/default/manager/TintStateManager' import StyleConfigurationCommon, { CommonStyle -} from '@ohos/common/src/main/ets/default/StyleConfiguration' +} from '@ohos/common/src/main/ets/default/layoutconfig/StyleConfiguration' import StyleConfiguration, { StartsBarWifiComponentStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/WifiVM' diff --git a/feature/systemui/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts b/feature/systemui/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts index 8947787a..8c61a1a2 100644 --- a/feature/systemui/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts +++ b/feature/systemui/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts @@ -14,10 +14,10 @@ */ import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import { FASlotName } from '@ohos/common/src/main/ets/default/Constants'; +import { FASlotName } from '@ohos/common/src/main/ets/default/constants/Constants'; import { TintContentInfo, getOrCreateTintContentInfo -} from '@ohos/common/src/main/ets/default/TintStateManager'; -import createOrGet from '@ohos/common/src/main/ets/default/SingleInstanceHelper'; +} from '@ohos/common/src/main/ets/default/manager/TintStateManager'; +import { createOrGet } from '@ohos/common/src/main/ets/default/utils/SingleInstanceHelper'; const TAG = 'WifiVM'; diff --git a/product/phone/src/main/ets/MainAbility/MainAbility.ts b/product/phone/src/main/ets/MainAbility/MainAbility.ts index 19236e0c..4c055dd8 100644 --- a/product/phone/src/main/ets/MainAbility/MainAbility.ts +++ b/product/phone/src/main/ets/MainAbility/MainAbility.ts @@ -27,9 +27,12 @@ import StyleConstants from '../common/constants/StyleConstants'; import { navigationBarCommonEventManager } from '@ohos/common'; import PageDesktopViewModel from '../../../../../../feature/pagedesktop/src/main/ets/default/viewmodel/PageDesktopViewModel'; import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import initSystemUi from '../../../../../../common/src/main/ets/default/InitSystemUi'; import SessionManagerService from '@ohos.session_manager_service'; import rpc from '@ohos.rpc'; +import EventManager from '@ohos/common/src/main/ets/default/utils/EventManager'; +import ScreenLockManager from '@ohos/common/src/main/ets/default/manager/ScreenLockManager'; +import ServiceExtensionContext from 'application/ServiceExtensionContext'; +import TimeManager from '@ohos/common/src/main/ets/default/manager/TimeManager'; const TAG = 'LauncherMainAbility'; @@ -38,7 +41,7 @@ export default class MainAbility extends ServiceExtensionAbility { Log.showInfo(TAG,'onCreate start'); this.context.area = 0; this.initLauncher(); - initSystemUi(this.context); + this.initSystemUi(this.context); AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context); } @@ -121,4 +124,13 @@ export default class MainAbility extends ServiceExtensionAbility { AppStorage.SetOrCreate('openFolderPageIndex', StyleConstants.DEFAULT_NUMBER_0); AppStorage.SetOrCreate('openFolderStatus', StyleConstants.DEFAULT_NUMBER_0); } + + private initSystemUi(context: ServiceExtensionContext): void { + EventManager.setContext(context); + ScreenLockManager.init().then(() => { + }).catch(err => { + }); + TimeManager.init(context); + Log.showDebug(TAG, `init done, ctx: ${context}`); + } } diff --git a/product/phone/src/main/ets/WindowScene/HWSystemUi.ets b/product/phone/src/main/ets/WindowScene/HWSystemUi.ets index 2644e95b..72e53fda 100644 --- a/product/phone/src/main/ets/WindowScene/HWSystemUi.ets +++ b/product/phone/src/main/ets/WindowScene/HWSystemUi.ets @@ -15,7 +15,7 @@ import AbilityManager from '../../../../../../common/src/main/ets/default/abilit */ import { Log } from '@ohos/common'; -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager' +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager' import screenSessionManager from '@ohos.screenSessionManager'; import { SCBStatusBar } from '@ohos/phone_statusbar/src/main/ets/pages/SCBStatusBar'; import { SCBDropdownPanel } from '@ohos/phone_dropdownpanel/src/main/ets/pages/SCBDropdownPanel'; diff --git a/product/phone/src/main/ets/screenlock/common/StyleConfiguration.ts b/product/phone/src/main/ets/screenlock/common/StyleConfiguration.ts index 1996ef2a..27ff2a2b 100644 --- a/product/phone/src/main/ets/screenlock/common/StyleConfiguration.ts +++ b/product/phone/src/main/ets/screenlock/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; const TAG = 'Lock_StatusBar-StyleConfiguration'; diff --git a/product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets b/product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets index 935137f0..94cf0f19 100644 --- a/product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets +++ b/product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets @@ -13,9 +13,8 @@ * limitations under the License. */ -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import Trace from '@ohos/common/src/main/ets/default/Trace' -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager' +import { Trace, Log } from '@ohos/common'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' import {LockStyleMode} from '@ohos/screenlock/src/main/ets/com/ohos/model/screenlockStyle' import ViewModel from '../vm/indexViewModel' @@ -25,8 +24,8 @@ import JournalScreenLock from './journalscreenlock' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' import Router from '@system.router'; -import sTimeManager from '@ohos/common/src/main/ets/default/TimeManager' -import WindowPanelManager, { WindowType, WindowInfo, SystemUi_ScreenLock } from '@ohos/common/src/main/ets/default/WindowPanelManager'; +import sTimeManager from '@ohos/common/src/main/ets/default/manager/TimeManager' +import WindowPanelManager, { WindowType, WindowInfo, SystemUi_ScreenLock } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager'; import screenSessionManager from '@ohos.screenSessionManager'; const TAG = 'ScreenLock-Entry'; diff --git a/product/phone/src/main/ets/screenlock/pages/customPassword.ets b/product/phone/src/main/ets/screenlock/pages/customPassword.ets index 1adbec5b..9f8de758 100644 --- a/product/phone/src/main/ets/screenlock/pages/customPassword.ets +++ b/product/phone/src/main/ets/screenlock/pages/customPassword.ets @@ -13,9 +13,8 @@ * limitations under the License. */ -import Trace from '@ohos/common/src/main/ets/default/Trace' -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager' +import { Trace, Log } from '@ohos/common'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' import StatusBar from '@ohos/screenlock/src/main/ets/com/ohos/view/component/statusBar' import CustomPSD from '@ohos/screenlock/src/main/ets/com/ohos/view/component/customPSD' diff --git a/product/phone/src/main/ets/screenlock/pages/digitalPassword.ets b/product/phone/src/main/ets/screenlock/pages/digitalPassword.ets index 5db8ccf5..88809cf0 100644 --- a/product/phone/src/main/ets/screenlock/pages/digitalPassword.ets +++ b/product/phone/src/main/ets/screenlock/pages/digitalPassword.ets @@ -13,9 +13,8 @@ * limitations under the License. */ -import Trace from '@ohos/common/src/main/ets/default/Trace' -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager' +import { Trace, Log } from '@ohos/common'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' import StatusBar from '@ohos/screenlock/src/main/ets/com/ohos/view/component/statusBar' import DigitalPSD from '@ohos/screenlock/src/main/ets/com/ohos/view/component/digitalPSD' diff --git a/product/phone/src/main/ets/screenlock/pages/mixedPassword.ets b/product/phone/src/main/ets/screenlock/pages/mixedPassword.ets index 547d03fa..6a96c0bf 100644 --- a/product/phone/src/main/ets/screenlock/pages/mixedPassword.ets +++ b/product/phone/src/main/ets/screenlock/pages/mixedPassword.ets @@ -13,9 +13,8 @@ * limitations under the License. */ -import Trace from '@ohos/common/src/main/ets/default/Trace' -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import CommonStyleManager from '@ohos/common/src/main/ets/default/CommonStyleManager' +import { Trace, Log } from '@ohos/common'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' import StatusBar from '@ohos/screenlock/src/main/ets/com/ohos/view/component/statusBar' import MixedPSD from '@ohos/screenlock/src/main/ets/com/ohos/view/component/mixedPSD' diff --git a/product/phone/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/src/main/ets/workers/PluginDataSourceWorker.js index be1c95fd..0683f6b0 100644 --- a/product/phone/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/src/main/ets/workers/PluginDataSourceWorker.js @@ -16,7 +16,7 @@ import worker from '@ohos.worker'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; import PluginDataSourceManager from '@ohos/common/src/main/ets/plugindatasource/PluginDataSourceManager'; -import Constants, { obtainMsg } from '@ohos/common/src/main/ets/plugindatasource/common/Constants'; +import Constants, { obtainMsg } from '@ohos/common/src/main/ets/default/constants/PluginConstants'; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; -- Gitee From 762f7367872023e2af821de9951040f7d97a8272 Mon Sep 17 00:00:00 2001 From: sunhaiyang Date: Thu, 27 Apr 2023 19:03:52 +0800 Subject: [PATCH 369/373] =?UTF-8?q?product=E5=B1=82=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-profile.json5 | 24 - .../main/ets/default/utils/BundleParseUtil.ts | 4 +- .../ets/com/ohos/model/bundleResourceModel.ts | 2 +- .../systemui/phone/dropdownpanel/.gitignore | 1 - .../phone/dropdownpanel/package-lock.json | 369 ---------- .../systemui/phone/dropdownpanel/package.json | 28 - .../src/main/ets/pages/SCBDropdownPanel.ets | 86 --- .../phone/dropdownpanel/src/main/module.json5 | 10 - .../main/resources/base/element/color.json | 44 -- .../main/resources/base/element/float.json | 140 ---- .../main/resources/base/element/string.json | 104 --- .../main/resources/en_US/element/string.json | 104 --- .../main/resources/zh_CN/element/string.json | 104 --- feature/systemui/phone/statusbar/.gitignore | 1 - .../phone/statusbar/package-lock.json | 130 ---- feature/systemui/phone/statusbar/package.json | 15 - .../ets/pages/common/StyleConfiguration.ts | 28 - .../src/main/ets/pages/common/StyleManager.ts | 47 -- .../src/main/ets/pages/common/constants.ts | 20 - .../phone/statusbar/src/main/module.json5 | 10 - .../main/resources/base/element/float.json | 152 ---- .../main/resources/base/element/string.json | 64 -- .../main/resources/en_US/element/string.json | 48 -- .../main/resources/zh_CN/element/string.json | 48 -- .../src/main/ets/pages/SCBVolumePanel.ets | 20 +- product/phone/package-lock.json | 667 +++++++----------- product/phone/package.json | 15 +- .../src/main/ets/WindowScene/HWScreen.ets | 53 +- .../src/main/ets/WindowScene/HWSystemUi.ets | 61 -- .../dropdownpanel}/DropdownPanel.ets | 114 ++- .../dropdownpanel}/bannerNotification.ets | 12 +- .../common/ControlCenterConfig.ts | 0 .../common/StyleConfiguration.ts | 0 .../dropdownpanel}/common/StyleManager.ts | 0 .../dropdownpanel}/common/constants.ts | 0 .../dropdownpanel}/common/navigationEvent.ts | 0 .../WindowScene/dropdownpanel}/control.ets | 0 .../dropdownpanel}/notification.ets | 0 .../screenlock/common/constants.ts | 0 .../screenlock/pages/SCBScreenLock.ets | 6 +- .../screenlock/pages/customPassword.ets | 2 - .../screenlock/pages/customscreenlock.ets | 0 .../screenlock/pages/digitalPassword.ets | 2 - .../screenlock/pages/journalscreenlock.ets | 0 .../screenlock/pages/mixedPassword.ets | 2 - .../screenlock/pages/slidescreenlock.ets | 0 .../screenlock/vm/indexViewModel.ts | 0 .../screenlock/vm/slideScreenLockViewModel.ts | 0 .../WindowScene/statusbar}/SCBStatusBar.ets | 0 .../ets/WindowScene/statusbar}/StatusBar.ets | 13 +- .../WindowScene/statusbar}/StatusbarConfig.ts | 0 .../phone/src/main/ets/pages/EntryView.ets | 16 + .../screenlock/common/StyleConfiguration.ts | 30 - .../ets/screenlock/common/StyleManager.ts | 51 -- .../main/resources/base/element/color.json | 52 ++ .../main/resources/base/element/float.json | 193 ++++- .../main/resources/base/element/string.json | 140 ++++ .../main/resources/base/media/airplane.svg | 0 .../main/resources/base/media/airplane_d.svg | 0 .../base/media/ic_brightness_plus.svg | 0 .../base/media/ic_brightness_reduce.svg | 0 .../base/media/ic_controlcenter_bt.svg | 0 .../base/media/ic_controlcenter_bt_d.svg | 0 .../base/media/ic_controlcenter_gps.svg | 0 .../ic_controlcenter_ring_off_filled.svg | 0 .../media/ic_controlcenter_ring_on_filled.svg | 0 .../ic_controlcenter_vibration_filled.svg | 0 .../base/media/ic_notification_nfc.svg | 0 .../base/media/ic_notification_nfc_filled.svg | 0 .../resources/base/media/ic_public_delete.svg | 0 .../base/media/ic_public_settings.svg | 0 .../main/resources/base/media/ic_settings.png | Bin .../resources/base/media/ic_status_bt.svg | 0 .../resources/base/media/ic_statusbar_gps.svg | 0 .../base}/media/ic_statusbar_nfc.svg | 0 .../base/media/ic_statusbar_phone.svg | 0 .../media/ic_statusbar_ring_off_filled.svg | 0 .../base/media/ic_statusbar_vibration_on.svg | 0 .../src/main/resources/base/media/wifi.svg | 0 .../src/main/resources/base/media/wifi_d.svg | 0 .../resources/base/profile/main_pages.json | 6 +- .../main/resources/en_US/element/string.json | 128 ++++ .../main/resources/phone/element/float.json | 0 .../phone/media/dropdownpanel_bgc.png | Bin .../resources/phone/media/ic_status_bt.svg | 0 .../phone/media/ic_statusbar_gps.svg | 0 .../phone}/media/ic_statusbar_nfc.svg | 0 .../phone/media/ic_statusbar_phone.svg | 0 .../media/ic_statusbar_ring_off_filled.svg | 0 .../phone/media/ic_statusbar_signal_1.svg | 0 .../phone/media/ic_statusbar_signal_2.svg | 0 .../phone/media/ic_statusbar_signal_3.svg | 0 .../phone/media/ic_statusbar_signal_4.svg | 0 .../phone/media/ic_statusbar_signal_full.svg | 0 .../phone/media/ic_statusbar_signal_no.svg | 0 .../phone/media/ic_statusbar_vibration_on.svg | 0 .../phone/media/ic_statusbar_wifi_1.svg | 0 .../phone/media/ic_statusbar_wifi_2.svg | 0 .../phone/media/ic_statusbar_wifi_3.svg | 0 .../phone/media/ic_statusbar_wifi_full.svg | 0 .../phone/media/ic_statusbar_wifi_no.svg | 0 .../main/resources/zh_CN/element/string.json | 128 ++++ 102 files changed, 1061 insertions(+), 2233 deletions(-) delete mode 100644 feature/systemui/phone/dropdownpanel/.gitignore delete mode 100644 feature/systemui/phone/dropdownpanel/package-lock.json delete mode 100644 feature/systemui/phone/dropdownpanel/package.json delete mode 100644 feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets delete mode 100644 feature/systemui/phone/dropdownpanel/src/main/module.json5 delete mode 100644 feature/systemui/phone/dropdownpanel/src/main/resources/base/element/color.json delete mode 100644 feature/systemui/phone/dropdownpanel/src/main/resources/base/element/float.json delete mode 100644 feature/systemui/phone/dropdownpanel/src/main/resources/base/element/string.json delete mode 100644 feature/systemui/phone/dropdownpanel/src/main/resources/en_US/element/string.json delete mode 100644 feature/systemui/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json delete mode 100644 feature/systemui/phone/statusbar/.gitignore delete mode 100644 feature/systemui/phone/statusbar/package-lock.json delete mode 100644 feature/systemui/phone/statusbar/package.json delete mode 100644 feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts delete mode 100644 feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleManager.ts delete mode 100644 feature/systemui/phone/statusbar/src/main/ets/pages/common/constants.ts delete mode 100644 feature/systemui/phone/statusbar/src/main/module.json5 delete mode 100644 feature/systemui/phone/statusbar/src/main/resources/base/element/float.json delete mode 100644 feature/systemui/phone/statusbar/src/main/resources/base/element/string.json delete mode 100644 feature/systemui/phone/statusbar/src/main/resources/en_US/element/string.json delete mode 100644 feature/systemui/phone/statusbar/src/main/resources/zh_CN/element/string.json delete mode 100644 product/phone/src/main/ets/WindowScene/HWSystemUi.ets rename {feature/systemui/phone/dropdownpanel/src/main/ets/pages => product/phone/src/main/ets/WindowScene/dropdownpanel}/DropdownPanel.ets (71%) rename {feature/systemui/phone/dropdownpanel/src/main/ets/pages => product/phone/src/main/ets/WindowScene/dropdownpanel}/bannerNotification.ets (94%) rename {feature/systemui/phone/dropdownpanel/src/main/ets/pages => product/phone/src/main/ets/WindowScene/dropdownpanel}/common/ControlCenterConfig.ts (100%) rename {feature/systemui/phone/dropdownpanel/src/main/ets/pages => product/phone/src/main/ets/WindowScene/dropdownpanel}/common/StyleConfiguration.ts (100%) rename {feature/systemui/phone/dropdownpanel/src/main/ets/pages => product/phone/src/main/ets/WindowScene/dropdownpanel}/common/StyleManager.ts (100%) rename {feature/systemui/phone/dropdownpanel/src/main/ets/pages => product/phone/src/main/ets/WindowScene/dropdownpanel}/common/constants.ts (100%) rename {feature/systemui/phone/dropdownpanel/src/main/ets/pages => product/phone/src/main/ets/WindowScene/dropdownpanel}/common/navigationEvent.ts (100%) rename {feature/systemui/phone/dropdownpanel/src/main/ets/pages => product/phone/src/main/ets/WindowScene/dropdownpanel}/control.ets (100%) rename {feature/systemui/phone/dropdownpanel/src/main/ets/pages => product/phone/src/main/ets/WindowScene/dropdownpanel}/notification.ets (100%) rename product/phone/src/main/ets/{ => WindowScene}/screenlock/common/constants.ts (100%) rename product/phone/src/main/ets/{ => WindowScene}/screenlock/pages/SCBScreenLock.ets (95%) rename product/phone/src/main/ets/{ => WindowScene}/screenlock/pages/customPassword.ets (96%) rename product/phone/src/main/ets/{ => WindowScene}/screenlock/pages/customscreenlock.ets (100%) rename product/phone/src/main/ets/{ => WindowScene}/screenlock/pages/digitalPassword.ets (96%) rename product/phone/src/main/ets/{ => WindowScene}/screenlock/pages/journalscreenlock.ets (100%) rename product/phone/src/main/ets/{ => WindowScene}/screenlock/pages/mixedPassword.ets (96%) rename product/phone/src/main/ets/{ => WindowScene}/screenlock/pages/slidescreenlock.ets (100%) rename product/phone/src/main/ets/{ => WindowScene}/screenlock/vm/indexViewModel.ts (100%) rename product/phone/src/main/ets/{ => WindowScene}/screenlock/vm/slideScreenLockViewModel.ts (100%) rename {feature/systemui/phone/statusbar/src/main/ets/pages => product/phone/src/main/ets/WindowScene/statusbar}/SCBStatusBar.ets (100%) rename {feature/systemui/phone/statusbar/src/main/ets/pages => product/phone/src/main/ets/WindowScene/statusbar}/StatusBar.ets (94%) rename {feature/systemui/phone/statusbar/src/main/ets/pages/common => product/phone/src/main/ets/WindowScene/statusbar}/StatusbarConfig.ts (100%) delete mode 100644 product/phone/src/main/ets/screenlock/common/StyleConfiguration.ts delete mode 100644 product/phone/src/main/ets/screenlock/common/StyleManager.ts rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/base/media/airplane.svg (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/base/media/airplane_d.svg (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/base/media/ic_brightness_plus.svg (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/base/media/ic_brightness_reduce.svg (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/base/media/ic_controlcenter_bt.svg (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/base/media/ic_controlcenter_bt_d.svg (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/base/media/ic_controlcenter_gps.svg (100%) rename {feature/systemui/ringmodecomponent => product/phone}/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg (100%) rename {feature/systemui/ringmodecomponent => product/phone}/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg (100%) rename {feature/systemui/ringmodecomponent => product/phone}/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/base/media/ic_notification_nfc.svg (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/base/media/ic_notification_nfc_filled.svg (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/base/media/ic_public_delete.svg (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/base/media/ic_public_settings.svg (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/base/media/ic_settings.png (100%) rename {feature/systemui/phone/statusbar => product/phone}/src/main/resources/base/media/ic_status_bt.svg (100%) rename {feature/systemui/phone/statusbar => product/phone}/src/main/resources/base/media/ic_statusbar_gps.svg (100%) rename {feature/systemui/phone/statusbar/src/main/resources/phone => product/phone/src/main/resources/base}/media/ic_statusbar_nfc.svg (100%) rename {feature/systemui/phone/statusbar => product/phone}/src/main/resources/base/media/ic_statusbar_phone.svg (100%) rename {feature/systemui/ringmodecomponent => product/phone}/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg (100%) rename {feature/systemui/ringmodecomponent => product/phone}/src/main/resources/base/media/ic_statusbar_vibration_on.svg (100%) rename {feature/systemui/wificomponent => product/phone}/src/main/resources/base/media/wifi.svg (100%) rename {feature/systemui/wificomponent => product/phone}/src/main/resources/base/media/wifi_d.svg (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/phone/element/float.json (100%) rename {feature/systemui/phone/dropdownpanel => product/phone}/src/main/resources/phone/media/dropdownpanel_bgc.png (100%) rename {feature/systemui/phone/statusbar => product/phone}/src/main/resources/phone/media/ic_status_bt.svg (100%) rename {feature/systemui/phone/statusbar => product/phone}/src/main/resources/phone/media/ic_statusbar_gps.svg (100%) rename {feature/systemui/statusbarcomponent/src/main/resources/base => product/phone/src/main/resources/phone}/media/ic_statusbar_nfc.svg (100%) rename {feature/systemui/phone/statusbar => product/phone}/src/main/resources/phone/media/ic_statusbar_phone.svg (100%) rename {feature/systemui/ringmodecomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg (100%) rename {feature/systemui/signalcomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_signal_1.svg (100%) rename {feature/systemui/signalcomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_signal_2.svg (100%) rename {feature/systemui/signalcomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_signal_3.svg (100%) rename {feature/systemui/signalcomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_signal_4.svg (100%) rename {feature/systemui/signalcomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_signal_full.svg (100%) rename {feature/systemui/signalcomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_signal_no.svg (100%) rename {feature/systemui/ringmodecomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_vibration_on.svg (100%) rename {feature/systemui/wificomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_wifi_1.svg (100%) rename {feature/systemui/wificomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_wifi_2.svg (100%) rename {feature/systemui/wificomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_wifi_3.svg (100%) rename {feature/systemui/wificomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_wifi_full.svg (100%) rename {feature/systemui/wificomponent => product/phone}/src/main/resources/phone/media/ic_statusbar_wifi_no.svg (100%) diff --git a/build-profile.json5 b/build-profile.json5 index ffd3e056..f55d2746 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -381,30 +381,6 @@ } ] }, - { - "name": "phone_statusbar", - "srcPath": "./feature/systemui/phone/statusbar", - "targets": [ - { - "name": "default", - "applyToProducts": [ - "default" - ] - } - ] - }, - { - "name": "phone_dropdownpanel", - "srcPath": "./feature/systemui/phone/dropdownpanel", - "targets": [ - { - "name": "default", - "applyToProducts": [ - "default" - ] - } - ] - }, { "name": "screenlock", "srcPath": "./feature/systemui/screenlock", diff --git a/common/src/main/ets/default/utils/BundleParseUtil.ts b/common/src/main/ets/default/utils/BundleParseUtil.ts index 5815844e..f355d43b 100644 --- a/common/src/main/ets/default/utils/BundleParseUtil.ts +++ b/common/src/main/ets/default/utils/BundleParseUtil.ts @@ -20,7 +20,7 @@ import { ExtensionAbilityInfo } from 'bundleManager/ExtensionAbilityInfo'; import { CustomizeData } from 'bundle/customizeData'; import { Metadata } from 'bundleManager/Metadata'; import { Log } from './Log'; -import switchUserManager from '../manager/SwitchUserManager'; +import { SwitchUserManager } from '../manager/SwitchUserManager'; export type AbilityInfoWithId = (AbilityInfo | ExtensionAbilityInfo) & { itemId: string }; export type BundleListener = { @@ -159,7 +159,7 @@ export function registerBundleListener(listener: BundleListener, callback: (hand return; } - switchUserManager.getInstance() + SwitchUserManager.getInstance() .getCurrentUserInfo() .then((userInfo) => { if (data.parameters.userId != userInfo.userId) { diff --git a/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index d2d17355..2979003f 100644 --- a/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/feature/systemui/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -20,7 +20,7 @@ import Bundle from '@ohos.bundle'; import { BundleInfo } from 'bundle/bundleInfo'; import ResMgr from '@ohos.resourceManager'; import {BusinessError} from 'basic'; -import SwitchUserManager from '@ohos/common/src/main/ets/default/manager/SwitchUserManager'; +import { SwitchUserManager } from '@ohos/common/src/main/ets/default/manager/SwitchUserManager'; const INDEX = 0; const IS_INCLUDE_ABILITY_INFO = 0; diff --git a/feature/systemui/phone/dropdownpanel/.gitignore b/feature/systemui/phone/dropdownpanel/.gitignore deleted file mode 100644 index c795b054..00000000 --- a/feature/systemui/phone/dropdownpanel/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build \ No newline at end of file diff --git a/feature/systemui/phone/dropdownpanel/package-lock.json b/feature/systemui/phone/dropdownpanel/package-lock.json deleted file mode 100644 index fc7a5fc2..00000000 --- a/feature/systemui/phone/dropdownpanel/package-lock.json +++ /dev/null @@ -1,369 +0,0 @@ -{ - "name": "@ohos/phone_dropdownpanel", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@ohos/airplanecomponent": { - "version": "file:../../airplanecomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/autorotatecomponent": { - "version": "file:../../autorotatecomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/batterycomponent": { - "version": "file:../../batterycomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/bluetoothcomponent": { - "version": "file:../../bluetoothcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/brightnesscomponent": { - "version": "file:../../brightnesscomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/clockcomponent": { - "version": "file:../../clockcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/common": { - "version": "file:../../../../common" - }, - "@ohos/controlcentercomponent": { - "version": "file:../../controlcentercomponent", - "requires": { - "@ohos/airplanecomponent": "file:../../airplanecomponent", - "@ohos/autorotatecomponent": "file:../../autorotatecomponent", - "@ohos/bluetoothcomponent": "file:../../bluetoothcomponent", - "@ohos/brightnesscomponent": "file:../../brightnesscomponent", - "@ohos/common": "file:../../../../common", - "@ohos/locationcomponent": "file:../../locationcomponent", - "@ohos/nfccomponent": "file:../../nfccomponent", - "@ohos/ringmodecomponent": "file:../../ringmodecomponent", - "@ohos/wificomponent": "file:../../wificomponent" - }, - "dependencies": { - "@ohos/airplanecomponent": { - "version": "file:../../airplanecomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/autorotatecomponent": { - "version": "file:../../autorotatecomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/bluetoothcomponent": { - "version": "file:../../bluetoothcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/brightnesscomponent": { - "version": "file:../../brightnesscomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/common": { - "version": "file:../../../../common" - }, - "@ohos/locationcomponent": { - "version": "file:../../locationcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/nfccomponent": { - "version": "file:../../nfccomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/ringmodecomponent": { - "version": "file:../../ringmodecomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/wificomponent": { - "version": "file:../../wificomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - } - } - }, - "@ohos/locationcomponent": { - "version": "file:../../locationcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/nfccomponent": { - "version": "file:../../nfccomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/noticeitem": { - "version": "file:../../noticeitem", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/ringmodecomponent": { - "version": "file:../../ringmodecomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/signalcomponent": { - "version": "file:../../signalcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/statusbarcomponent": { - "version": "file:../../statusbarcomponent", - "requires": { - "@ohos/batterycomponent": "file:../../batterycomponent", - "@ohos/bluetoothcomponent": "file:../../bluetoothcomponent", - "@ohos/capsulecomponent": "file:../../capsulecomponent", - "@ohos/clockcomponent": "file:../../clockcomponent", - "@ohos/common": "file:../../../../common", - "@ohos/locationcomponent": "file:../../locationcomponent", - "@ohos/nfccomponent": "file:../../nfccomponent", - "@ohos/ringmodecomponent": "file:../../ringmodecomponent", - "@ohos/signalcomponent": "file:../../signalcomponent", - "@ohos/wificomponent": "file:../../wificomponent" - }, - "dependencies": { - "@ohos/batterycomponent": { - "version": "file:../../batterycomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/bluetoothcomponent": { - "version": "file:../../bluetoothcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/capsulecomponent": { - "version": "file:../../capsulecomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/clockcomponent": { - "version": "file:../../clockcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/common": { - "version": "file:../../../../common" - }, - "@ohos/locationcomponent": { - "version": "file:../../locationcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/nfccomponent": { - "version": "file:../../nfccomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/ringmodecomponent": { - "version": "file:../../ringmodecomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/signalcomponent": { - "version": "file:../../signalcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/wificomponent": { - "version": "file:../../wificomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - } - } - }, - "@ohos/wificomponent": { - "version": "file:../../wificomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - } - } -} diff --git a/feature/systemui/phone/dropdownpanel/package.json b/feature/systemui/phone/dropdownpanel/package.json deleted file mode 100644 index 6534c5b9..00000000 --- a/feature/systemui/phone/dropdownpanel/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "devDependencies": {}, - "name": "@ohos/phone_dropdownpanel", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" - }, - "version": "1.0.0", - "type": "module", - "dependencies": { - "@ohos/statusbarcomponent": "file:../../statusbarcomponent", - "@ohos/wificomponent": "file:../../wificomponent", - "@ohos/bluetoothcomponent": "file:../../bluetoothcomponent", - "@ohos/signalcomponent": "file:../../signalcomponent", - "@ohos/clockcomponent": "file:../../clockcomponent", - "@ohos/locationcomponent": "file:../../locationcomponent", - "@ohos/batterycomponent": "file:../../batterycomponent", - "@ohos/controlcentercomponent": "file:../../controlcentercomponent", - "@ohos/ringmodecomponent": "file:../../ringmodecomponent", - "@ohos/autorotatecomponent": "file:../../autorotatecomponent", - "@ohos/airplanecomponent": "file:../../airplanecomponent", - "@ohos/brightnesscomponent": "file:../../brightnesscomponent", - "@ohos/nfccomponent": "../../nfccomponent", - "@ohos/noticeitem": "file:../../noticeitem", - "@ohos/common": "../../../../common" - } -} diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets b/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets deleted file mode 100644 index 0bbec2de..00000000 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/SCBDropdownPanel.ets +++ /dev/null @@ -1,86 +0,0 @@ -//@ts-nocheck -/* - * Copyright (c) 2021-2022 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 AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import WindowPanelManager, { WindowType, WindowInfo, SystemUi_DropdownPanel, SystemUi_BannerNotice -} from '@ohos/common/src/main/ets/default/manager/WindowPanelManager' -import { DropdownPanel } from './DropdownPanel'; -import { BannerNotificationPanel } from './bannerNotification'; -import screenSessionManager from '@ohos.screenSessionManager'; - -const TAG = 'SCBDropdownPanel' - -@Component -export struct SCBDropdownPanel { - public bounds: screenSessionManager.RRect; - public moduleName: string = '' - @State showComponentName: string = undefined; - @StorageLink(SystemUi_DropdownPanel) mDropDownInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.DROPDOWN_PANEL); - @StorageLink(SystemUi_BannerNotice) mBannerInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.BANNER_NOTICE); - - onBackPress(): boolean { - return true - } - - aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, start`); - this.init(); - Log.showDebug(TAG, `aboutToAppear, end`); - } - - private init() { - AbilityManager.setContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, getContext(this)); - - let rect = { - left: 0, - top: 0, - width: this.bounds.width, - height: this.bounds.height, - }; - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect', rect); - this.mDropDownInfo.rect = rect; - - let bannerRect = { - left: 0, - top: this.bounds.height / 5, - width: this.bounds.width, - height: this.bounds.height / 20 - }; - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); - this.mBannerInfo.rect = bannerRect; - } - - aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) - } - - build() { - Stack({ alignContent: Alignment.Top }) { - // dropdown panel - DropdownPanel({moduleName: this.moduleName}) - .hitTestBehavior(HitTestMode.Transparent) - - // BannerNotification - BannerNotificationPanel() - .hitTestBehavior(HitTestMode.Default) - .width(this.mBannerInfo.rect.width + 'px') - .height(this.mBannerInfo.rect.height + 'px') - .position({x: this.mBannerInfo.rect.left + 'px', y: this.mBannerInfo.rect.top + 'px'}) - } - } -} diff --git a/feature/systemui/phone/dropdownpanel/src/main/module.json5 b/feature/systemui/phone/dropdownpanel/src/main/module.json5 deleted file mode 100644 index cae87755..00000000 --- a/feature/systemui/phone/dropdownpanel/src/main/module.json5 +++ /dev/null @@ -1,10 +0,0 @@ -{ - "module": { - "name": "phone_dropdownpanel", - "type": "har", - "deviceTypes": [ - "default" - ], - "uiSyntax": "ets" - } -} \ No newline at end of file diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/color.json b/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/color.json deleted file mode 100644 index 1601adf7..00000000 --- a/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/color.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "color": [ - { - "name": "default_background", - "value": "#999999" - }, - { - "name": "notification_delete_all_background", - "value": "#4C000000" - }, - { - "name": "default_font_color", - "value": "#ffffffff" - }, - { - "name": "quickly_setting_time_font_color", - "value": "#ffffffff" - }, - { - "name": "quickly_setting_date_font_color", - "value": "#ffffffff" - }, - { - "name": "statusbar_background_color", - "value": "#00ffff00" - }, - { - "name": "brightness_slider_block_color", - "value": "#FFFFFFFF" - }, - { - "name": "brightness_slider_track_color", - "value": "#1A000000" - }, - { - "name": "brightness_slider_selected_color", - "value": "#FF007DFF" - }, - { - "name": "control_center_complex_toggle_ring_mode_on_bg_color", - "value": "#FFFF9800" - } - ] -} \ No newline at end of file diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/float.json b/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/float.json deleted file mode 100644 index a698877b..00000000 --- a/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/float.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "float": [ - { - "name": "status_bar_margin_left_right", - "value": "5vp" - }, - { - "name": "status_bar_height", - "value": "46vp" - }, - { - "name": "phone_status_bar_height", - "value": "39vp" - }, - { - "name": "notification_delete_all", - "value": "32" - }, - { - "name": "quickly_setting_time_font_size", - "value": "30fp" - }, - { - "name": "quickly_setting_date_font_size", - "value": "20fp" - }, - { - "name": "quickly_setting_text_flex_margin_left", - "value": "10vp" - }, - { - "name": "quickly_setting_image_width", - "value": "50vp" - }, - { - "name": "quickly_setting_image_height", - "value": "50vp" - }, - { - "name": "quickly_setting_image_margin_right", - "value": "10vp" - }, - { - "name": "quickly_setting_border_radius", - "value": "20vp" - }, - { - "name": "quickly_setting_margin_left", - "value": "10vp" - }, - { - "name": "quickly_setting_margin_right", - "value": "10vp" - }, - { - "name": "delete_all_image_width", - "value": "50vp" - }, - { - "name": "delete_all_image_height", - "value": "50vp" - }, - { - "name": "delete_all_image_border_radius", - "value": "25vp" - }, - { - "name": "delete_all_image_opacity", - "value": "0.9" - }, - { - "name": "brightness_margin_left", - "value": "26vp" - }, - { - "name": "brightness_margin_right", - "value": "26vp" - }, - { - "name": "brightness_component_gap", - "value": "26vp" - }, - { - "name": "brightness_reduce_width", - "value": "44vp" - }, - { - "name": "brightness_reduce_height", - "value": "44vp" - }, - { - "name": "brightness_plus_width", - "value": "44vp" - }, - { - "name": "brightness_plus_height", - "value": "44vp" - }, - { - "name": "brightness_height", - "value": "44vp" - }, - { - "name": "brightness_slider_height", - "value": "40vp" - }, - { - "name": "status_bar_location_width", - "value": "20vp" - }, - { - "name": "status_bar_location_height", - "value": "24vp" - }, - { - "name": "status_bar_ring_mode_width", - "value": "27vp" - }, - { - "name": "status_bar_ring_mode_height", - "value": "24vp" - }, - { - "name": "status_bar_padding_left_right", - "value": "12vp" - }, - { - "name": "status_bar_padding_top_bottom", - "value": "4vp" - }, - { - "name": "notification_title_setting_icon_width", - "value": "48px" - }, - { - "name": "notification_title_setting_icon_height", - "value": "48px" - } - ] -} \ No newline at end of file diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/string.json b/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/string.json deleted file mode 100644 index 7f420f4a..00000000 --- a/feature/systemui/phone/dropdownpanel/src/main/resources/base/element/string.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "string": [ - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, - { - "name": "monday", - "value": "星期一" - }, - { - "name": "tuesday", - "value": "星期二" - }, - { - "name": "wednesday", - "value": "星期三" - }, - { - "name": "thursday", - "value": "星期四" - }, - { - "name": "friday", - "value": "星期五" - }, - { - "name": "saturday", - "value": "星期六" - }, - { - "name": "sunday", - "value": "星期日" - }, - { - "name": "day", - "value": "日" - }, - { - "name": "month", - "value": "月" - }, - { - "name": "no_notification", - "value": "没有通知" - }, - { - "name": "airplane_mode", - "value": "飞行模式" - }, - { - "name": "control_center_complex_toggle_bluetooth_title", - "value": "蓝牙" - }, - { - "name": "control_center_complex_toggle_location_title", - "value": "位置信息" - }, - { - "name": "control_center_complex_toggle_ring_mode_title_on", - "value": "响铃" - }, - { - "name": "control_center_complex_toggle_ring_mode_title_off", - "value": "静音" - }, - { - "name": "control_center_complex_toggle_ring_mode_title_vibration", - "value": "振动" - }, - { - "name": "status_bar_position_landscape", - "value": "2" - }, - { - "name": "nav_bar_position_landscape", - "value": "4" - }, - { - "name": "status_bar_size_landscape", - "value": "48" - }, - { - "name": "nav_bar_size_landscape", - "value": "36" - }, - { - "name": "status_bar_position_portrait", - "value": "2" - }, - { - "name": "nav_bar_position_portrait", - "value": "4" - }, - { - "name": "nav_bar_size_portrait", - "value": "36" - }, - { - "name": "control_center_complex_toggle_nfc_mode_title", - "value": "NFC" - } - ] -} \ No newline at end of file diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/en_US/element/string.json b/feature/systemui/phone/dropdownpanel/src/main/resources/en_US/element/string.json deleted file mode 100644 index aaf028b4..00000000 --- a/feature/systemui/phone/dropdownpanel/src/main/resources/en_US/element/string.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "string": [ - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, - { - "name": "monday", - "value": "monday" - }, - { - "name": "tuesday", - "value": "tuesday" - }, - { - "name": "wednesday", - "value": "wednesday" - }, - { - "name": "thursday", - "value": "thursday" - }, - { - "name": "friday", - "value": "friday" - }, - { - "name": "saturday", - "value": "saturday" - }, - { - "name": "sunday", - "value": "sunday" - }, - { - "name": "day", - "value": "day" - }, - { - "name": "month", - "value": "month" - }, - { - "name": "no_notification", - "value": "No Notification" - }, - { - "name": "airplane_mode", - "value": "Airplane mode" - }, - { - "name": "control_center_complex_toggle_bluetooth_title", - "value": "Bluetooth" - }, - { - "name": "control_center_complex_toggle_location_title", - "value": "Location" - }, - { - "name": "control_center_complex_toggle_ring_mode_title_on", - "value": "Sound" - }, - { - "name": "control_center_complex_toggle_ring_mode_title_off", - "value": "Silent" - }, - { - "name": "control_center_complex_toggle_ring_mode_title_vibration", - "value": "Vibration" - }, - { - "name": "status_bar_position_landscape", - "value": "2" - }, - { - "name": "nav_bar_position_landscape", - "value": "4" - }, - { - "name": "status_bar_size_landscape", - "value": "48" - }, - { - "name": "nav_bar_size_landscape", - "value": "36" - }, - { - "name": "status_bar_position_portrait", - "value": "2" - }, - { - "name": "nav_bar_position_portrait", - "value": "4" - }, - { - "name": "nav_bar_size_portrait", - "value": "36" - }, - { - "name": "control_center_complex_toggle_nfc_mode_title", - "value": "NFC" - } - ] -} \ No newline at end of file diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json b/feature/systemui/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json deleted file mode 100644 index 7f420f4a..00000000 --- a/feature/systemui/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "string": [ - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, - { - "name": "monday", - "value": "星期一" - }, - { - "name": "tuesday", - "value": "星期二" - }, - { - "name": "wednesday", - "value": "星期三" - }, - { - "name": "thursday", - "value": "星期四" - }, - { - "name": "friday", - "value": "星期五" - }, - { - "name": "saturday", - "value": "星期六" - }, - { - "name": "sunday", - "value": "星期日" - }, - { - "name": "day", - "value": "日" - }, - { - "name": "month", - "value": "月" - }, - { - "name": "no_notification", - "value": "没有通知" - }, - { - "name": "airplane_mode", - "value": "飞行模式" - }, - { - "name": "control_center_complex_toggle_bluetooth_title", - "value": "蓝牙" - }, - { - "name": "control_center_complex_toggle_location_title", - "value": "位置信息" - }, - { - "name": "control_center_complex_toggle_ring_mode_title_on", - "value": "响铃" - }, - { - "name": "control_center_complex_toggle_ring_mode_title_off", - "value": "静音" - }, - { - "name": "control_center_complex_toggle_ring_mode_title_vibration", - "value": "振动" - }, - { - "name": "status_bar_position_landscape", - "value": "2" - }, - { - "name": "nav_bar_position_landscape", - "value": "4" - }, - { - "name": "status_bar_size_landscape", - "value": "48" - }, - { - "name": "nav_bar_size_landscape", - "value": "36" - }, - { - "name": "status_bar_position_portrait", - "value": "2" - }, - { - "name": "nav_bar_position_portrait", - "value": "4" - }, - { - "name": "nav_bar_size_portrait", - "value": "36" - }, - { - "name": "control_center_complex_toggle_nfc_mode_title", - "value": "NFC" - } - ] -} \ No newline at end of file diff --git a/feature/systemui/phone/statusbar/.gitignore b/feature/systemui/phone/statusbar/.gitignore deleted file mode 100644 index c795b054..00000000 --- a/feature/systemui/phone/statusbar/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build \ No newline at end of file diff --git a/feature/systemui/phone/statusbar/package-lock.json b/feature/systemui/phone/statusbar/package-lock.json deleted file mode 100644 index 3f27340d..00000000 --- a/feature/systemui/phone/statusbar/package-lock.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "name": "@ohos/phone_statusbar", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - }, - "@ohos/statusbarcomponent": { - "version": "file:../../statusbarcomponent", - "requires": { - "@ohos/batterycomponent": "file:../../batterycomponent", - "@ohos/bluetoothcomponent": "file:../../bluetoothcomponent", - "@ohos/capsulecomponent": "file:../../capsulecomponent", - "@ohos/clockcomponent": "file:../../clockcomponent", - "@ohos/common": "file:../../../../common", - "@ohos/locationcomponent": "file:../../locationcomponent", - "@ohos/nfccomponent": "file:../../nfccomponent", - "@ohos/ringmodecomponent": "file:../../ringmodecomponent", - "@ohos/signalcomponent": "file:../../signalcomponent", - "@ohos/wificomponent": "file:../../wificomponent" - }, - "dependencies": { - "@ohos/batterycomponent": { - "version": "file:../../batterycomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/bluetoothcomponent": { - "version": "file:../../bluetoothcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/capsulecomponent": { - "version": "file:../../capsulecomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/clockcomponent": { - "version": "file:../../clockcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/common": { - "version": "file:../../../../common" - }, - "@ohos/locationcomponent": { - "version": "file:../../locationcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/nfccomponent": { - "version": "file:../../nfccomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/ringmodecomponent": { - "version": "file:../../ringmodecomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/signalcomponent": { - "version": "file:../../signalcomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - }, - "@ohos/wificomponent": { - "version": "file:../../wificomponent", - "requires": { - "@ohos/common": "file:../../../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../../../common" - } - } - } - } - } - } -} diff --git a/feature/systemui/phone/statusbar/package.json b/feature/systemui/phone/statusbar/package.json deleted file mode 100644 index 263647f7..00000000 --- a/feature/systemui/phone/statusbar/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "devDependencies": {}, - "name": "@ohos/phone_statusbar", - "ohos": { - "org": "huawei", - "directoryLevel": "module", - "buildTool": "hvigor" - }, - "version": "1.0.0", - "type": "module", - "dependencies": { - "@ohos/statusbarcomponent": "../../statusbarcomponent", - "@ohos/common": "../../../../common" - } -} diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts deleted file mode 100644 index 7e7ef2cc..00000000 --- a/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; - -const TAG = 'StatusBar-StyleConfiguration'; - -export class IndexStyle { -} - -export default class StyleConfiguration { - static getIndexStyle(): IndexStyle { - const key: string = TAG + '-Index'; - return CommonStyleManager.getStyle(key, IndexStyle); - } -} \ No newline at end of file diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleManager.ts b/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleManager.ts deleted file mode 100644 index f8aa3b39..00000000 --- a/feature/systemui/phone/statusbar/src/main/ets/pages/common/StyleManager.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; - -const TAG = 'StatusBar-StyleManager'; - -export default class StyleManager { - static readonly STANDARD_DISPLAY_WIDTH = 720; - static readonly STANDARD_DISPLAY_HEIGHT = 1280; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - - static setStyle(): void { - Log.showDebug(TAG, 'setStyle'); - - let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); - StyleManager.maxWidth = config.maxWidth; - - // xxx - { - } - } - - static number2px(n: number): string { - return n.toString() + 'px'; - } - - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } - - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } -} \ No newline at end of file diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/common/constants.ts b/feature/systemui/phone/statusbar/src/main/ets/pages/common/constants.ts deleted file mode 100644 index 53f97c35..00000000 --- a/feature/systemui/phone/statusbar/src/main/ets/pages/common/constants.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 default class Constants { - static readonly TOUCHTYPE_DOWN = 0; - static readonly TOUCHTYPE_UP = 1; - static readonly TOUCHTYPE_MOVE = 2; -} \ No newline at end of file diff --git a/feature/systemui/phone/statusbar/src/main/module.json5 b/feature/systemui/phone/statusbar/src/main/module.json5 deleted file mode 100644 index 53f35bd3..00000000 --- a/feature/systemui/phone/statusbar/src/main/module.json5 +++ /dev/null @@ -1,10 +0,0 @@ -{ - "module": { - "name": "phone_statusbar", - "type": "har", - "deviceTypes": [ - "default" - ], - "uiSyntax": "ets" - } -} \ No newline at end of file diff --git a/feature/systemui/phone/statusbar/src/main/resources/base/element/float.json b/feature/systemui/phone/statusbar/src/main/resources/base/element/float.json deleted file mode 100644 index fdb640c9..00000000 --- a/feature/systemui/phone/statusbar/src/main/resources/base/element/float.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "float": [ - { - "name": "status_bar_clock_width", - "value": "37vp" - }, - { - "name": "battery_component_gap", - "value": "0vp" - }, - { - "name": "battery_component_pic_gap", - "value": "1.2vp" - }, - { - "name": "battery_component_pic_body_height", - "value": "11vp" - }, - { - "name": "battery_component_pic_body_width", - "value": "18.5vp" - }, - { - "name": "battery_component_pic_body_padding", - "value": "1vp" - }, - { - "name": "battery_component_pic_body_border_width", - "value": "1vp" - }, - { - "name": "battery_component_pic_border_radius", - "value": "2.5vp" - }, - { - "name": "battery_component_pic_head_radius", - "value": "3vp" - }, - { - "name": "battery_component_pic_head_width", - "value": "1.5vp" - }, - { - "name": "battery_component_pic_head_height", - "value": "5.75vp" - }, - { - "name": "green_capsule_phone_width", - "value": "14vp" - }, - { - "name": "green_capsule_phone_height", - "value": "14vp" - }, - { - "name": "green_capsule_height", - "value": "20vp" - }, - { - "name": "green_capsule_text_left_right", - "value": "6vp" - }, - { - "name": "green_capsule_radius", - "value": "10vp" - }, - { - "name": "signal_component_icon_width", - "value": "21.5vp" - }, - { - "name": "signal_component_icon_height", - "value": "15vp" - }, - { - "name": "status_bar_signal_unknown_font_size", - "value": "7fp" - }, - { - "name": "signal_text_max_width", - "value": "113vp" - }, - { - "name": "status_bar_signal_net_signal_text_max_width", - "value": "15vp" - }, - { - "name": "status_bar_bluetooth_width", - "value": "11.5vp" - }, - { - "name": "status_bar_bluetooth_height", - "value": "15vp" - }, - { - "name": "status_bar_ring_mode_width", - "value": "17vp" - }, - { - "name": "status_bar_ring_mode_height", - "value": "15vp" - }, - { - "name": "status_bar_signal_type_font_size", - "value": "5.5fp" - }, - { - "name": "status_bar_wifi_width", - "value": "15.75vp" - }, - { - "name": "status_bar_wifi_height", - "value": "15vp" - }, - { - "name": "status_bar_location_width", - "value": "13vp" - }, - { - "name": "status_bar_location_height", - "value": "15vp" - }, - { - "name": "icon_component_opacity", - "value": "0.7" - }, - { - "name": "mTime_text_margin_left", - "value": "2vp" - }, - { - "name": "signal_component_text_margin_left", - "value": "3vp" - }, - { - "name": "green_capsule_phone_text_left", - "value": "1vp" - }, - { - "name": "green_capsule_phone_margin_left", - "value": "2vp" - }, - { - "name": "battery_component_margin", - "value": "2vp" - }, - { - "name": "status_bar_margin_left_right", - "value": "5vp" - } - ] -} \ No newline at end of file diff --git a/feature/systemui/phone/statusbar/src/main/resources/base/element/string.json b/feature/systemui/phone/statusbar/src/main/resources/base/element/string.json deleted file mode 100644 index 4d06d0d7..00000000 --- a/feature/systemui/phone/statusbar/src/main/resources/base/element/string.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "string": [ - { - "name": "status_bar_size_portrait", - "value": "36" - }, - { - "name": "status_bar_size_landscape", - "value": "36" - }, - { - "name": "phone_status_bar_size_portrait", - "value": "54" - }, - { - "name": "phone_status_bar_size_landscape", - "value": "54" - }, - { - "name": "status_bar_position_landscape", - "value": "2" - }, - { - "name": "status_bar_position_portrait", - "value": "2" - }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, - { - "name": "net_null", - "value": "没有 SIM 卡" - }, - { - "name": "2G", - "value": "2G" - }, - { - "name": "3G", - "value": "3G" - }, - { - "name": "4G", - "value": "4G" - }, - { - "name": "5G", - "value": "5G" - }, - { - "name": "signal_null", - "value": "×" - }, - { - "name": "incoming_call", - "value": "来电" - }, - { - "name": "communicate_by_phone", - "value": "通话" - } - ] -} \ No newline at end of file diff --git a/feature/systemui/phone/statusbar/src/main/resources/en_US/element/string.json b/feature/systemui/phone/statusbar/src/main/resources/en_US/element/string.json deleted file mode 100644 index 7da82deb..00000000 --- a/feature/systemui/phone/statusbar/src/main/resources/en_US/element/string.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "string": [ - { - "name": "status_bar_position_landscape", - "value": "2" - }, - { - "name": "status_bar_position_portrait", - "value": "2" - }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, - { - "name": "net_null", - "value": "No SIM" - }, - { - "name": "2G", - "value": "2G" - }, - { - "name": "3G", - "value": "3G" - }, - { - "name": "4G", - "value": "4G" - }, - { - "name": "5G", - "value": "5G" - }, - { - "name": "signal_null", - "value": "×" - }, - { - "name": "incoming_call", - "value": "Incoming call" - }, - { - "name": "communicate_by_phone", - "value": "communicate" - } - ] -} \ No newline at end of file diff --git a/feature/systemui/phone/statusbar/src/main/resources/zh_CN/element/string.json b/feature/systemui/phone/statusbar/src/main/resources/zh_CN/element/string.json deleted file mode 100644 index 8edb6a13..00000000 --- a/feature/systemui/phone/statusbar/src/main/resources/zh_CN/element/string.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "string": [ - { - "name": "status_bar_position_landscape", - "value": "2" - }, - { - "name": "status_bar_position_portrait", - "value": "2" - }, - { - "name": "mainability_description", - "value": "JS_Phone_Empty Feature Ability" - }, - { - "name": "net_null", - "value": "没有 SIM 卡" - }, - { - "name": "2G", - "value": "2G" - }, - { - "name": "3G", - "value": "3G" - }, - { - "name": "4G", - "value": "4G" - }, - { - "name": "5G", - "value": "5G" - }, - { - "name": "signal_null", - "value": "×" - }, - { - "name": "incoming_call", - "value": "来电" - }, - { - "name": "communicate_by_phone", - "value": "通话" - } - ] -} \ No newline at end of file diff --git a/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets b/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets index c01c63ba..9c70a972 100644 --- a/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets +++ b/feature/systemui/volumepanel/src/main/ets/pages/SCBVolumePanel.ets @@ -18,7 +18,8 @@ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abi import StyleManager from '../common/StyleManager' import screenSessionManager from '@ohos.screenSessionManager' import VolumeWindowController from '@ohos/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController' -import { Rect as Area } from '@ohos/common/src/main/ets/default/constants/Constants' +import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager' +import VolumePanelVM from '@ohos/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM' const TAG = 'SCBVolumePanel' @@ -29,12 +30,14 @@ class ShowControl { async show() { Log.showInfo(TAG, "show"); this.mIsShown = true; + WindowPanelManager.showWindow(WindowType.VOLUME_PANEL); return; } async hide() { Log.showInfo(TAG, "hide"); this.mIsShown = false; + WindowPanelManager.hideWindow(WindowType.VOLUME_PANEL); return; } } @@ -42,12 +45,6 @@ class ShowControl { @Component export struct SCBVolumePanel { public bounds: screenSessionManager.RRect - @State mVolumeRect: Area = { - left: 0, - top: 0, - width: 0, - height: 0 - } @State mShowControl: ShowControl = new ShowControl(); aboutToAppear() { @@ -75,9 +72,8 @@ export struct SCBVolumePanel { }; } AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'rect', volumeRect); - this.mVolumeRect = volumeRect; + WindowPanelManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); - setAppBgColor('#00000000'); Log.showDebug(TAG, `configInfo Start, configInfo ${JSON.stringify(configInfo)}`); if (configInfo.width > configInfo.height) { // Pad、PC Mode StyleManager.setStyle(); @@ -91,6 +87,7 @@ export struct SCBVolumePanel { height: this.bounds.height, }); VolumeWindowController.getInstance().setWindowHandle(this.mShowControl); + VolumePanelVM.initViewModel(); } aboutToDisappear() { @@ -102,9 +99,8 @@ export struct SCBVolumePanel { Column() { VolumePanelComponent() } - .width(this.mVolumeRect.width + 'px') - .height(this.mVolumeRect.height + 'px') - .position({x:this.mVolumeRect.left + 'px', y:this.mVolumeRect.top + 'px'}) + .width('100%') + .height('100%') } } } diff --git a/product/phone/package-lock.json b/product/phone/package-lock.json index 3e8bbee9..b93a1b79 100644 --- a/product/phone/package-lock.json +++ b/product/phone/package-lock.json @@ -4,8 +4,8 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@ohos/bigfolder": { - "version": "file:../../feature/bigfolder", + "@ohos/airplanecomponent": { + "version": "file:../../feature/systemui/airplanecomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -15,11 +15,8 @@ } } }, - "@ohos/common": { - "version": "file:../../common" - }, - "@ohos/datetimecomponent": { - "version": "file:../../feature/systemui/datetimecomponent", + "@ohos/autorotatecomponent": { + "version": "file:../../feature/systemui/autorotatecomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -29,31 +26,19 @@ } } }, - "@ohos/default_volumepanel": { - "version": "file:../../feature/systemui/volumepanel", + "@ohos/batterycomponent": { + "version": "file:../../feature/systemui/batterycomponent", "requires": { - "@ohos/common": "file:../../common", - "@ohos/volumepanelcomponent": "file:../../feature/systemui/volumepanelcomponent" + "@ohos/common": "file:../../common" }, "dependencies": { "@ohos/common": { "version": "file:../../common" - }, - "@ohos/volumepanelcomponent": { - "version": "file:../../feature/systemui/volumepanelcomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } } } }, - "@ohos/form": { - "version": "file:../../feature/form", + "@ohos/bigfolder": { + "version": "file:../../feature/bigfolder", "requires": { "@ohos/common": "file:../../common" }, @@ -63,8 +48,8 @@ } } }, - "@ohos/gesturenavigation": { - "version": "file:../../feature/gesturenavigation", + "@ohos/bluetoothcomponent": { + "version": "file:../../feature/systemui/bluetoothcomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -74,8 +59,8 @@ } } }, - "@ohos/noticeitem": { - "version": "file:../../feature/systemui/noticeitem", + "@ohos/brightnesscomponent": { + "version": "file:../../feature/systemui/brightnesscomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -85,8 +70,8 @@ } } }, - "@ohos/numbadge": { - "version": "file:../../feature/numbadge", + "@ohos/clockcomponent": { + "version": "file:../../feature/systemui/clockcomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -96,58 +81,20 @@ } } }, - "@ohos/pagedesktop": { - "version": "file:../../feature/pagedesktop", - "requires": { - "@ohos/bigfolder": "file:../../feature/bigfolder", - "@ohos/common": "file:../../common", - "@ohos/form": "file:../../feature/form" - }, - "dependencies": { - "@ohos/bigfolder": { - "version": "file:../../feature/bigfolder", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/common": { - "version": "file:../../common" - }, - "@ohos/form": { - "version": "file:../../feature/form", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - } - } + "@ohos/common": { + "version": "file:../../common" }, - "@ohos/phone_dropdownpanel": { - "version": "file:../../feature/systemui/phone/dropdownpanel", + "@ohos/controlcentercomponent": { + "version": "file:../../feature/systemui/controlcentercomponent", "requires": { "@ohos/airplanecomponent": "file:../../feature/systemui/airplanecomponent", "@ohos/autorotatecomponent": "file:../../feature/systemui/autorotatecomponent", - "@ohos/batterycomponent": "file:../../feature/systemui/batterycomponent", "@ohos/bluetoothcomponent": "file:../../feature/systemui/bluetoothcomponent", "@ohos/brightnesscomponent": "file:../../feature/systemui/brightnesscomponent", - "@ohos/clockcomponent": "file:../../feature/systemui/clockcomponent", "@ohos/common": "file:../../common", - "@ohos/controlcentercomponent": "file:../../feature/systemui/controlcentercomponent", "@ohos/locationcomponent": "file:../../feature/systemui/locationcomponent", "@ohos/nfccomponent": "file:../../feature/systemui/nfccomponent", - "@ohos/noticeitem": "file:../../feature/systemui/noticeitem", "@ohos/ringmodecomponent": "file:../../feature/systemui/ringmodecomponent", - "@ohos/signalcomponent": "file:../../feature/systemui/signalcomponent", - "@ohos/statusbarcomponent": "file:../../feature/systemui/statusbarcomponent", "@ohos/wificomponent": "file:../../feature/systemui/wificomponent" }, "dependencies": { @@ -173,8 +120,8 @@ } } }, - "@ohos/batterycomponent": { - "version": "file:../../feature/systemui/batterycomponent", + "@ohos/bluetoothcomponent": { + "version": "file:../../feature/systemui/bluetoothcomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -184,8 +131,8 @@ } } }, - "@ohos/bluetoothcomponent": { - "version": "file:../../feature/systemui/bluetoothcomponent", + "@ohos/brightnesscomponent": { + "version": "file:../../feature/systemui/brightnesscomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -195,8 +142,11 @@ } } }, - "@ohos/brightnesscomponent": { - "version": "file:../../feature/systemui/brightnesscomponent", + "@ohos/common": { + "version": "file:../../common" + }, + "@ohos/locationcomponent": { + "version": "file:../../feature/systemui/locationcomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -206,8 +156,8 @@ } } }, - "@ohos/clockcomponent": { - "version": "file:../../feature/systemui/clockcomponent", + "@ohos/nfccomponent": { + "version": "file:../../feature/systemui/nfccomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -217,118 +167,19 @@ } } }, - "@ohos/common": { - "version": "file:../../common" - }, - "@ohos/controlcentercomponent": { - "version": "file:../../feature/systemui/controlcentercomponent", + "@ohos/ringmodecomponent": { + "version": "file:../../feature/systemui/ringmodecomponent", "requires": { - "@ohos/airplanecomponent": "file:../../feature/systemui/airplanecomponent", - "@ohos/autorotatecomponent": "file:../../feature/systemui/autorotatecomponent", - "@ohos/bluetoothcomponent": "file:../../feature/systemui/bluetoothcomponent", - "@ohos/brightnesscomponent": "file:../../feature/systemui/brightnesscomponent", - "@ohos/common": "file:../../common", - "@ohos/locationcomponent": "file:../../feature/systemui/locationcomponent", - "@ohos/nfccomponent": "file:../../feature/systemui/nfccomponent", - "@ohos/ringmodecomponent": "file:../../feature/systemui/ringmodecomponent", - "@ohos/wificomponent": "file:../../feature/systemui/wificomponent" + "@ohos/common": "file:../../common" }, "dependencies": { - "@ohos/airplanecomponent": { - "version": "file:../../feature/systemui/airplanecomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/autorotatecomponent": { - "version": "file:../../feature/systemui/autorotatecomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/bluetoothcomponent": { - "version": "file:../../feature/systemui/bluetoothcomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/brightnesscomponent": { - "version": "file:../../feature/systemui/brightnesscomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, "@ohos/common": { "version": "file:../../common" - }, - "@ohos/locationcomponent": { - "version": "file:../../feature/systemui/locationcomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/nfccomponent": { - "version": "file:../../feature/systemui/nfccomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/ringmodecomponent": { - "version": "file:../../feature/systemui/ringmodecomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/wificomponent": { - "version": "file:../../feature/systemui/wificomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } } } }, - "@ohos/locationcomponent": { - "version": "file:../../feature/systemui/locationcomponent", + "@ohos/wificomponent": { + "version": "file:../../feature/systemui/wificomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -337,9 +188,32 @@ "version": "file:../../common" } } + } + } + }, + "@ohos/datetimecomponent": { + "version": "file:../../feature/systemui/datetimecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/default_volumepanel": { + "version": "file:../../feature/systemui/volumepanel", + "requires": { + "@ohos/common": "file:../../common", + "@ohos/volumepanelcomponent": "file:../../feature/systemui/volumepanelcomponent" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" }, - "@ohos/nfccomponent": { - "version": "file:../../feature/systemui/nfccomponent", + "@ohos/volumepanelcomponent": { + "version": "file:../../feature/systemui/volumepanelcomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -348,9 +222,85 @@ "version": "file:../../common" } } - }, - "@ohos/noticeitem": { - "version": "file:../../feature/systemui/noticeitem", + } + } + }, + "@ohos/form": { + "version": "file:../../feature/form", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/gesturenavigation": { + "version": "file:../../feature/gesturenavigation", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/locationcomponent": { + "version": "file:../../feature/systemui/locationcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/nfccomponent": { + "version": "file:../../feature/systemui/nfccomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/noticeitem": { + "version": "file:../../feature/systemui/noticeitem", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/numbadge": { + "version": "file:../../feature/numbadge", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/pagedesktop": { + "version": "file:../../feature/pagedesktop", + "requires": { + "@ohos/bigfolder": "file:../../feature/bigfolder", + "@ohos/common": "file:../../common", + "@ohos/form": "file:../../feature/form" + }, + "dependencies": { + "@ohos/bigfolder": { + "version": "file:../../feature/bigfolder", "requires": { "@ohos/common": "file:../../common" }, @@ -360,8 +310,56 @@ } } }, - "@ohos/ringmodecomponent": { - "version": "file:../../feature/systemui/ringmodecomponent", + "@ohos/common": { + "version": "file:../../common" + }, + "@ohos/form": { + "version": "file:../../feature/form", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + } + } + }, + "@ohos/recents": { + "version": "file:../../feature/recents", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/ringmodecomponent": { + "version": "file:../../feature/systemui/ringmodecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/screenlock": { + "version": "file:../../feature/systemui/screenlock", + "requires": { + "@ohos/batterycomponent": "file:../../feature/systemui/batterycomponent", + "@ohos/clockcomponent": "file:../../feature/systemui/clockcomponent", + "@ohos/common": "file:../../common", + "@ohos/signalcomponent": "file:../../feature/systemui/signalcomponent", + "@ohos/wificomponent": "file:../../feature/systemui/wificomponent" + }, + "dependencies": { + "@ohos/batterycomponent": { + "version": "file:../../feature/systemui/batterycomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -371,8 +369,8 @@ } } }, - "@ohos/signalcomponent": { - "version": "file:../../feature/systemui/signalcomponent", + "@ohos/clockcomponent": { + "version": "file:../../feature/systemui/clockcomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -382,122 +380,17 @@ } } }, - "@ohos/statusbarcomponent": { - "version": "file:../../feature/systemui/statusbarcomponent", + "@ohos/common": { + "version": "file:../../common" + }, + "@ohos/signalcomponent": { + "version": "file:../../feature/systemui/signalcomponent", "requires": { - "@ohos/batterycomponent": "file:../../feature/systemui/batterycomponent", - "@ohos/bluetoothcomponent": "file:../../feature/systemui/bluetoothcomponent", - "@ohos/capsulecomponent": "file:../../feature/systemui/capsulecomponent", - "@ohos/clockcomponent": "file:../../feature/systemui/clockcomponent", - "@ohos/common": "file:../../common", - "@ohos/locationcomponent": "file:../../feature/systemui/locationcomponent", - "@ohos/nfccomponent": "file:../../feature/systemui/nfccomponent", - "@ohos/ringmodecomponent": "file:../../feature/systemui/ringmodecomponent", - "@ohos/signalcomponent": "file:../../feature/systemui/signalcomponent", - "@ohos/wificomponent": "file:../../feature/systemui/wificomponent" + "@ohos/common": "file:../../common" }, "dependencies": { - "@ohos/batterycomponent": { - "version": "file:../../feature/systemui/batterycomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/bluetoothcomponent": { - "version": "file:../../feature/systemui/bluetoothcomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/capsulecomponent": { - "version": "file:../../feature/systemui/capsulecomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/clockcomponent": { - "version": "file:../../feature/systemui/clockcomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, "@ohos/common": { "version": "file:../../common" - }, - "@ohos/locationcomponent": { - "version": "file:../../feature/systemui/locationcomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/nfccomponent": { - "version": "file:../../feature/systemui/nfccomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/ringmodecomponent": { - "version": "file:../../feature/systemui/ringmodecomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/signalcomponent": { - "version": "file:../../feature/systemui/signalcomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } - }, - "@ohos/wificomponent": { - "version": "file:../../feature/systemui/wificomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": { - "@ohos/common": { - "version": "file:../../common" - } - } } } }, @@ -514,103 +407,19 @@ } } }, - "@ohos/phone_statusbar": { - "version": "file:../../feature/systemui/phone/statusbar", + "@ohos/signalcomponent": { + "version": "file:../../feature/systemui/signalcomponent", "requires": { - "@ohos/common": "file:../../common", - "@ohos/statusbarcomponent": "file:../../feature/systemui/statusbarcomponent" + "@ohos/common": "file:../../common" }, "dependencies": { "@ohos/common": { "version": "file:../../common" - }, - "@ohos/statusbarcomponent": { - "version": "file:../../feature/systemui/statusbarcomponent", - "requires": { - "@ohos/batterycomponent": "file:../../feature/systemui/batterycomponent", - "@ohos/bluetoothcomponent": "file:../../feature/systemui/bluetoothcomponent", - "@ohos/capsulecomponent": "file:../../feature/systemui/capsulecomponent", - "@ohos/clockcomponent": "file:../../feature/systemui/clockcomponent", - "@ohos/common": "file:../../common", - "@ohos/locationcomponent": "file:../../feature/systemui/locationcomponent", - "@ohos/nfccomponent": "file:../../feature/systemui/nfccomponent", - "@ohos/ringmodecomponent": "file:../../feature/systemui/ringmodecomponent", - "@ohos/signalcomponent": "file:../../feature/systemui/signalcomponent", - "@ohos/wificomponent": "file:../../feature/systemui/wificomponent" - }, - "dependencies": { - "@ohos/batterycomponent": { - "version": "file:../../feature/systemui/batterycomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": {} - }, - "@ohos/bluetoothcomponent": { - "version": "file:../../feature/systemui/bluetoothcomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": {} - }, - "@ohos/capsulecomponent": { - "version": "file:../../feature/systemui/capsulecomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": {} - }, - "@ohos/clockcomponent": { - "version": "file:../../feature/systemui/clockcomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": {} - }, - "@ohos/common": { - "version": "file:../../common" - }, - "@ohos/locationcomponent": { - "version": "file:../../feature/systemui/locationcomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": {} - }, - "@ohos/nfccomponent": { - "version": "file:../../feature/systemui/nfccomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": {} - }, - "@ohos/ringmodecomponent": { - "version": "file:../../feature/systemui/ringmodecomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": {} - }, - "@ohos/signalcomponent": { - "version": "file:../../feature/systemui/signalcomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": {} - }, - "@ohos/wificomponent": { - "version": "file:../../feature/systemui/wificomponent", - "requires": { - "@ohos/common": "file:../../common" - }, - "dependencies": {} - } - } } } }, - "@ohos/recents": { - "version": "file:../../feature/recents", + "@ohos/smartdock": { + "version": "file:../../feature/smartdock", "requires": { "@ohos/common": "file:../../common" }, @@ -620,12 +429,17 @@ } } }, - "@ohos/screenlock": { - "version": "file:../../feature/systemui/screenlock", + "@ohos/statusbarcomponent": { + "version": "file:../../feature/systemui/statusbarcomponent", "requires": { "@ohos/batterycomponent": "file:../../feature/systemui/batterycomponent", + "@ohos/bluetoothcomponent": "file:../../feature/systemui/bluetoothcomponent", + "@ohos/capsulecomponent": "file:../../feature/systemui/capsulecomponent", "@ohos/clockcomponent": "file:../../feature/systemui/clockcomponent", "@ohos/common": "file:../../common", + "@ohos/locationcomponent": "file:../../feature/systemui/locationcomponent", + "@ohos/nfccomponent": "file:../../feature/systemui/nfccomponent", + "@ohos/ringmodecomponent": "file:../../feature/systemui/ringmodecomponent", "@ohos/signalcomponent": "file:../../feature/systemui/signalcomponent", "@ohos/wificomponent": "file:../../feature/systemui/wificomponent" }, @@ -641,6 +455,28 @@ } } }, + "@ohos/bluetoothcomponent": { + "version": "file:../../feature/systemui/bluetoothcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/capsulecomponent": { + "version": "file:../../feature/systemui/capsulecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, "@ohos/clockcomponent": { "version": "file:../../feature/systemui/clockcomponent", "requires": { @@ -655,6 +491,39 @@ "@ohos/common": { "version": "file:../../common" }, + "@ohos/locationcomponent": { + "version": "file:../../feature/systemui/locationcomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/nfccomponent": { + "version": "file:../../feature/systemui/nfccomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, + "@ohos/ringmodecomponent": { + "version": "file:../../feature/systemui/ringmodecomponent", + "requires": { + "@ohos/common": "file:../../common" + }, + "dependencies": { + "@ohos/common": { + "version": "file:../../common" + } + } + }, "@ohos/signalcomponent": { "version": "file:../../feature/systemui/signalcomponent", "requires": { @@ -679,8 +548,8 @@ } } }, - "@ohos/smartdock": { - "version": "file:../../feature/smartdock", + "@ohos/wallpapercomponent": { + "version": "file:../../feature/systemui/wallpapercomponent", "requires": { "@ohos/common": "file:../../common" }, @@ -690,8 +559,8 @@ } } }, - "@ohos/wallpapercomponent": { - "version": "file:../../feature/systemui/wallpapercomponent", + "@ohos/wificomponent": { + "version": "file:../../feature/systemui/wificomponent", "requires": { "@ohos/common": "file:../../common" }, diff --git a/product/phone/package.json b/product/phone/package.json index 09183bb0..a86f43aa 100644 --- a/product/phone/package.json +++ b/product/phone/package.json @@ -16,8 +16,19 @@ "@ohos/gesturenavigation": "../../feature/gesturenavigation", "@ohos/common": "../../common", "@ohos/numbadge": "../../feature/numbadge", - "@ohos/phone_statusbar": "../../feature/systemui/phone/statusbar", - "@ohos/phone_dropdownpanel": "../../feature/systemui/phone/dropdownpanel", + "@ohos/statusbarcomponent": "../../feature/systemui/statusbarcomponent", + "@ohos/wificomponent": "../../feature/systemui/wificomponent", + "@ohos/bluetoothcomponent": "../../feature/systemui/bluetoothcomponent", + "@ohos/signalcomponent": "../../feature/systemui/signalcomponent", + "@ohos/clockcomponent": "../../feature/systemui/clockcomponent", + "@ohos/locationcomponent": "../../feature/systemui/locationcomponent", + "@ohos/batterycomponent": "../../feature/systemui/batterycomponent", + "@ohos/controlcentercomponent": "../../feature/systemui/controlcentercomponent", + "@ohos/ringmodecomponent": "../../feature/systemui/ringmodecomponent", + "@ohos/autorotatecomponent": "../../feature/systemui/autorotatecomponent", + "@ohos/airplanecomponent": "../../feature/systemui/airplanecomponent", + "@ohos/brightnesscomponent": "../../feature/systemui/brightnesscomponent", + "@ohos/nfccomponent": "../../feature/systemui/nfccomponent", "@ohos/default_volumepanel": "../../feature/systemui/volumepanel", "@ohos/screenlock": "../../feature/systemui/screenlock", "@ohos/noticeitem": "../../feature/systemui/noticeitem", diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/WindowScene/HWScreen.ets index 976122fa..eac8d13b 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/WindowScene/HWScreen.ets @@ -13,16 +13,31 @@ * limitations under the License. */ -import { HWScenePanel } from './HWScenePanel' -import { HWScreenSession } from '@ohos/common' -import { HWDesktop } from './HWDesktop' -import { HWWallpaper } from './HWWallpaper' -import { HWSystemUi } from './HWSystemUi' -import { SCBScreenLock } from '../screenlock/pages/SCBScreenLock' +import { HWScenePanel } from './HWScenePanel'; +import { HWScreenSession } from '@ohos/common'; +import { HWDesktop } from './HWDesktop'; +import { HWWallpaper } from './HWWallpaper'; +import { SCBStatusBar } from './statusbar/SCBStatusBar'; +import { DropdownPanel } from './dropdownpanel/DropdownPanel'; +import { BannerNotificationPanel } from './dropdownpanel/bannerNotification'; +import { SCBVolumePanel } from '@ohos/default_volumepanel/src/main/ets/pages/SCBVolumePanel'; +import { SCBScreenLock } from './screenlock/pages/SCBScreenLock'; +import WindowPanelManager, { + WindowInfo, + WindowType, + SystemUi_DropdownPanel, + SystemUi_BannerNotice, + SystemUi_VolumePanel +} from '@ohos/common/src/main/ets/default/manager/WindowPanelManager'; + +const MODULE_NAME = "phone-launcher"; @Component export struct HWScreen { - @ObjectLink screenSession: HWScreenSession + @ObjectLink screenSession: HWScreenSession; + @StorageLink(SystemUi_DropdownPanel) mDropDownInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.DROPDOWN_PANEL); + @StorageLink(SystemUi_BannerNotice) mBannerInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.BANNER_NOTICE); + @StorageLink(SystemUi_VolumePanel) mVolumeInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.VOLUME_PANEL); build() { Screen(this.screenSession.session.screenId) { @@ -38,8 +53,28 @@ export struct HWScreen { recentViewParam: this.screenSession.recentViewParam }) - // Systemui - HWSystemUi({ bounds: this.screenSession.bounds }) + // status bar + SCBStatusBar({bounds : this.screenSession.bounds, moduleName: MODULE_NAME}) + .position({x: 0, y: 0}) + .hitTestBehavior(HitTestMode.Transparent) + + // dropdown panel + DropdownPanel({bounds : this.screenSession.bounds, moduleName: MODULE_NAME}) + .visibility(this.mDropDownInfo.visibility ? Visibility.Visible : Visibility.Hidden) + + // BannerNotification + BannerNotificationPanel({bounds : this.screenSession.bounds}) + .width(this.mBannerInfo.rect.width + 'px') + .height(this.mBannerInfo.rect.height + 'px') + .position({x: this.mBannerInfo.rect.left + 'px', y: this.mBannerInfo.rect.top + 'px'}) + .visibility(this.mBannerInfo.visibility ? Visibility.Visible : Visibility.Hidden) + + // volume + SCBVolumePanel({bounds : this.screenSession.bounds}) + .width(this.mVolumeInfo.rect.width + 'px') + .height(this.mVolumeInfo.rect.height + 'px') + .position({x: this.mVolumeInfo.rect.left + 'px', y: this.mVolumeInfo.rect.top + 'px'}) + .visibility(this.mVolumeInfo.visibility ? Visibility.Visible : Visibility.Hidden) // screenlock SCBScreenLock({ bounds: this.screenSession.bounds }) diff --git a/product/phone/src/main/ets/WindowScene/HWSystemUi.ets b/product/phone/src/main/ets/WindowScene/HWSystemUi.ets deleted file mode 100644 index 72e53fda..00000000 --- a/product/phone/src/main/ets/WindowScene/HWSystemUi.ets +++ /dev/null @@ -1,61 +0,0 @@ -import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -/* - * Copyright (c) 2023 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 { Log } from '@ohos/common'; -import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager' -import screenSessionManager from '@ohos.screenSessionManager'; -import { SCBStatusBar } from '@ohos/phone_statusbar/src/main/ets/pages/SCBStatusBar'; -import { SCBDropdownPanel } from '@ohos/phone_dropdownpanel/src/main/ets/pages/SCBDropdownPanel'; -import { SCBVolumePanel } from '@ohos/default_volumepanel/src/main/ets/pages/SCBVolumePanel'; - -const TAG = "HWSystemUi"; -const MODULE_NAME = "phone-launcher"; - -@Component -export struct HWSystemUi { - public bounds: screenSessionManager.RRect - - onBackPress(): boolean { - return true; - } - - aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, ${this.bounds.width}, ${this.bounds.height}`); - // 原来在StatusBar/DropdownPanel等处setAbilityPageName会相互覆盖,导致Style不对 - CommonStyleManager.setAbilityPageName(TAG) - } - - aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`); - } - - build() { - Stack() { - // status bar - SCBStatusBar({bounds : this.bounds, moduleName: MODULE_NAME}) - - // dropdown panel - SCBDropdownPanel({bounds : this.bounds, moduleName: MODULE_NAME}) - .hitTestBehavior(HitTestMode.Transparent) - - // volume - SCBVolumePanel({bounds : this.bounds}) - } - .hitTestBehavior(HitTestMode.Transparent) - .width('100%') - .height('100%') - } -} \ No newline at end of file diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets b/product/phone/src/main/ets/WindowScene/dropdownpanel/DropdownPanel.ets similarity index 71% rename from feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets rename to product/phone/src/main/ets/WindowScene/dropdownpanel/DropdownPanel.ets index 5ce8e089..150bb5d5 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/DropdownPanel.ets +++ b/product/phone/src/main/ets/WindowScene/dropdownpanel/DropdownPanel.ets @@ -16,20 +16,20 @@ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import Trace from '@ohos/common/src/main/ets/default/utils/Trace' -import WindowPanelManager, { WindowType } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager' +import { Trace } from '@ohos/common/src/main/ets/default/utils/Trace' +import WindowPanelManager, { WindowInfo, WindowType, SystemUi_DropdownPanel } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager' import EventManager, { unsubscribe } from "@ohos/common/src/main/ets/default/utils/EventManager" import { START_ABILITY_EVENT } from "@ohos/common/src/main/ets/default/utils/EventUtil" import MultimodalInputManager from '@ohos/common/src/main/ets/default/manager/MultimodalInputManager' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' -import HeightConfigUtils from '@ohos/common/src/main/ets/default/layoutconfig/HeightConfigUtils' +import { HeightConfigUtils } from '@ohos/common/src/main/ets/default/layoutconfig/HeightConfigUtils' import StatusBarVM from '@ohos/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' import NavigationEvent from './common/navigationEvent' import Notification from './notification' import ControlCenterComponent from './control' import StyleManager from './common/StyleManager' import dataShare from '@ohos.data.dataShare'; -import Constants from "@ohos/common/src/main/ets/default/constants/Constants"; +import screenSessionManager from '@ohos.screenSessionManager' const TAG = 'DropdownPanel' @@ -60,6 +60,7 @@ class insertTemplate{ @Component export struct DropdownPanel { + public bounds: screenSessionManager.RRect @State showComponentName: string = undefined; @State componentOptAreaHeightPX: number = 0; @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0; @@ -79,6 +80,7 @@ export struct DropdownPanel { @State componentOptAreaTranslateY: string = '0px'; @State backgroundOpacity: number = 0; private moduleName: string = '' + @StorageLink(SystemUi_DropdownPanel) mDropDownInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.DROPDOWN_PANEL); onBackPress(): boolean { return true @@ -86,16 +88,18 @@ export struct DropdownPanel { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, start`); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, getContext(this)); - setAppBgColor('#00000000'); + let dropdownRect = { + left: 0, + top: 0, + width: this.bounds.width, + height: this.bounds.height, + }; + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect', dropdownRect); StyleManager.setStyle(); - // TODO 导航栏 - let dropdownRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect'); this.componentOptAreaHeightPX = dropdownRect.height; -// let navigationBarRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); -// this.initHelper(dropdownRect, navigationBarRect); -// this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); Log.showDebug(TAG, `getValueSync componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`); this.componentOptAreaTranslateY = (-this.componentOptAreaHeightPX * 0.1) + 'px'; @@ -126,16 +130,6 @@ export struct DropdownPanel { Log.showDebug(TAG, `aboutToAppear, end`); } - private async initHelper(dropdownRect, navigationBarRect): Promise { - this.urivar = Constants.getUriSync(Constants.KEY_NAVIGATIONBAR_STATUS); - this.helper = await dataShare.createDataShareHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL), this.urivar); - Log.showDebug(TAG, `initHelper ${this.helper}, uri: ${JSON.stringify(this.urivar)}`); - this.helper?.on("dataChange", this.urivar, () => { - this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); - Log.showInfo(TAG, `NavigationBar status change, componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`); - }); - } - onPageShow() { Log.showInfo(TAG, `onPageShow, start`) if (!this.showComponentName) { @@ -154,16 +148,6 @@ export struct DropdownPanel { this.mClearCallbacks = undefined } - resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect) { - Log.showDebug(TAG, `resizeDropdownPanelAndNavigationBar, dropdownRect: ${JSON.stringify(dropdownRect)} navigationBarRect: ${JSON.stringify(navigationBarRect)}`) -// let context = AbilityManager.getContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL); -// this.mNavigationBarStatusDefaultValue = settings.getValueSync(context, this.settingDataKey, '1'); -// this.componentOptAreaHeightPX = this.mNavigationBarStatusDefaultValue == '1' ? dropdownRect.height - navigationBarRect.realHeight : dropdownRect.height; -// this.navigationBarWidth = this.mNavigationBarStatusDefaultValue == '1' ? navigationBarRect.height : 0; -// WindowManager.resetSizeWindow(WindowType.NAVIGATION_BAR, { ...navigationBarRect, height: this.navigationBarWidth }) -// WindowManager.resetSizeWindow(WindowType.DROPDOWN_PANEL, { ...dropdownRect, height: this.componentOptAreaHeightPX }) - } - onNotificationShowOrHide(data) { Log.showDebug(TAG, `mNotificationAsyncCallback preKeys: ${data.preKeys}, finalKey: ${data.finalKey}`); Log.showDebug(TAG, `this.showComponentName: ${this.showComponentName}`); @@ -271,46 +255,48 @@ export struct DropdownPanel { } build() { - Stack({ alignContent: Alignment.Top }) { - Image($r("app.media.dropdownpanel_bgc")) - .width('100%') - .height('100%') - .objectFit(ImageFit.Fill) - .blur(25) - .opacity(this.backgroundOpacity) - Column() { - if (this.showComponentName == 'Notification') { - Column() { - Notification({ touchMoveCallback: (data) => this.onTouchMove(data) }) - } + if (this.mDropDownInfo.visibility) { + Stack({ alignContent: Alignment.Top }) { + Image($r("app.media.dropdownpanel_bgc")) .width('100%') .height('100%') - .transition(this.mNotificationInsert) - .transition(this.mNotificationDelete) - } else if (this.showComponentName == 'ControlCenter') { - Column() { - ControlCenterComponent({ - touchMoveCallback: (data) => this.onTouchMove(data), - moduleName: this.moduleName - }) + .objectFit(ImageFit.Fill) + .blur(25) + .opacity(this.backgroundOpacity) + Column() { + if (this.showComponentName == 'Notification') { + Column() { + Notification({ touchMoveCallback: (data) => this.onTouchMove(data) }) + } + .width('100%') + .height('100%') + .transition(this.mNotificationInsert) + .transition(this.mNotificationDelete) + } else if (this.showComponentName == 'ControlCenter') { + Column() { + ControlCenterComponent({ + touchMoveCallback: (data) => this.onTouchMove(data), + moduleName: this.moduleName + }) + } + .width('100%') + .height('100%') + .transition(this.mControlCenterInsert) + .transition(this.mControlCenterDelete) } - .width('100%') - .height('100%') - .transition(this.mControlCenterInsert) - .transition(this.mControlCenterDelete) } + .width('100%') + .height(this.componentOptAreaHeightPX + 'px') + .translate({ y: this.componentOptAreaTranslateY }) } .width('100%') - .height(this.componentOptAreaHeightPX + 'px') - .translate({ y: this.componentOptAreaTranslateY }) + .height('100%') + .backgroundColor($r("app.color.default_background")) + .opacity(this.backgroundOpacity) + .onAreaChange((e, e2) => { + Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + this.mWidthPx = vp2px(Number(e2.width)) + }) } - .width('100%') - .height('100%') - .backgroundColor($r("app.color.default_background")) - .opacity(this.backgroundOpacity) - .onAreaChange((e, e2) => { - Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); - this.mWidthPx = vp2px(Number(e2.width)) - }) } } diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/product/phone/src/main/ets/WindowScene/dropdownpanel/bannerNotification.ets similarity index 94% rename from feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets rename to product/phone/src/main/ets/WindowScene/dropdownpanel/bannerNotification.ets index b059644d..fc493418 100644 --- a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/phone/src/main/ets/WindowScene/dropdownpanel/bannerNotification.ets @@ -21,6 +21,7 @@ import EventManager, {unsubscribe} from "@ohos/common/src/main/ets/default/utils import BannerNotification from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem'; import NotificationViewModel from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel'; import NotificationConstants, { ScreenLockStatus } from '@ohos/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants'; +import screenSessionManager from '@ohos.screenSessionManager' const TAG = 'DropdownPanel-BannerNotification'; const TRANSLATE_SIZE = '382vp'; @@ -51,6 +52,7 @@ const OPACITY_HIDE_ANIM_CONFIG = { @Component export struct BannerNotificationPanel { + public bounds: screenSessionManager.RRect @State distributedDeviceName: string = ''; @State mBannerNoticeCnt: number = 0; @State mLastActionTime: number = 0; @@ -63,7 +65,7 @@ export struct BannerNotificationPanel { @StorageLink(SystemUi_BannerNotice) @Watch('bannerChange') mBannerInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.BANNER_NOTICE); mClearCallbacks: unsubscribe[] - mDefaultBannerRect: any; + mDefaultBannerRect = { left: 0, top: 0, width: 0, height: 0 }; bannerChange() { Log.showInfo(TAG, `bannerChange ${JSON.stringify(this.mBannerInfo)}`) @@ -72,7 +74,13 @@ export struct BannerNotificationPanel { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`); AbilityManager.setContextName(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL,AbilityManager.ABILITY_NAME_DROPDOWN_PANEL); - setAppBgColor('#00000000') + let bannerRect = { + left: 0, + top: this.bounds.height / 5, + width: this.bounds.width, + height: this.bounds.height / 20 + }; + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); this.mClearCallbacks = [] this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeShow', () => this.onBannerNoticeShow())) this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeHide', () => this.onBannerNoticeHide())) diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/product/phone/src/main/ets/WindowScene/dropdownpanel/common/ControlCenterConfig.ts similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts rename to product/phone/src/main/ets/WindowScene/dropdownpanel/common/ControlCenterConfig.ts diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/phone/src/main/ets/WindowScene/dropdownpanel/common/StyleConfiguration.ts similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts rename to product/phone/src/main/ets/WindowScene/dropdownpanel/common/StyleConfiguration.ts diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts b/product/phone/src/main/ets/WindowScene/dropdownpanel/common/StyleManager.ts similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts rename to product/phone/src/main/ets/WindowScene/dropdownpanel/common/StyleManager.ts diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/constants.ts b/product/phone/src/main/ets/WindowScene/dropdownpanel/common/constants.ts similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/constants.ts rename to product/phone/src/main/ets/WindowScene/dropdownpanel/common/constants.ts diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts b/product/phone/src/main/ets/WindowScene/dropdownpanel/common/navigationEvent.ts similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts rename to product/phone/src/main/ets/WindowScene/dropdownpanel/common/navigationEvent.ts diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/control.ets b/product/phone/src/main/ets/WindowScene/dropdownpanel/control.ets similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/ets/pages/control.ets rename to product/phone/src/main/ets/WindowScene/dropdownpanel/control.ets diff --git a/feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/src/main/ets/WindowScene/dropdownpanel/notification.ets similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/ets/pages/notification.ets rename to product/phone/src/main/ets/WindowScene/dropdownpanel/notification.ets diff --git a/product/phone/src/main/ets/screenlock/common/constants.ts b/product/phone/src/main/ets/WindowScene/screenlock/common/constants.ts similarity index 100% rename from product/phone/src/main/ets/screenlock/common/constants.ts rename to product/phone/src/main/ets/WindowScene/screenlock/common/constants.ts diff --git a/product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets b/product/phone/src/main/ets/WindowScene/screenlock/pages/SCBScreenLock.ets similarity index 95% rename from product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets rename to product/phone/src/main/ets/WindowScene/screenlock/pages/SCBScreenLock.ets index 94cf0f19..564023a6 100644 --- a/product/phone/src/main/ets/screenlock/pages/SCBScreenLock.ets +++ b/product/phone/src/main/ets/WindowScene/screenlock/pages/SCBScreenLock.ets @@ -14,7 +14,6 @@ */ import { Trace, Log } from '@ohos/common'; -import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' import {LockStyleMode} from '@ohos/screenlock/src/main/ets/com/ohos/model/screenlockStyle' import ViewModel from '../vm/indexViewModel' @@ -22,11 +21,11 @@ import SlideScreenLock from './slidescreenlock' import CustomScreenLock from './customscreenlock' import JournalScreenLock from './journalscreenlock' import Constants from '../common/constants' -import StyleManager from '../common/StyleManager' import Router from '@system.router'; import sTimeManager from '@ohos/common/src/main/ets/default/manager/TimeManager' import WindowPanelManager, { WindowType, WindowInfo, SystemUi_ScreenLock } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager'; import screenSessionManager from '@ohos.screenSessionManager'; +import ScreenLockService from '@ohos/screenlock/src/main/ets/com/ohos/model/screenLockService' const TAG = 'ScreenLock-Entry'; @@ -43,14 +42,13 @@ export struct SCBScreenLock { AbilityManager.setContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK, getContext(this)); sTimeManager.init(getContext(this)); this.initStatusBarRect(); - this.mScreenLockInfo.visibility = true; + ScreenLockService.lockScreen(); this.mViewModel.ViewModelInit() this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR try { let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height - StyleManager.setStyle() this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR } catch (error) { Log.showError(TAG, `set status error:` + JSON.stringify(error)); diff --git a/product/phone/src/main/ets/screenlock/pages/customPassword.ets b/product/phone/src/main/ets/WindowScene/screenlock/pages/customPassword.ets similarity index 96% rename from product/phone/src/main/ets/screenlock/pages/customPassword.ets rename to product/phone/src/main/ets/WindowScene/screenlock/pages/customPassword.ets index 9f8de758..c0547be8 100644 --- a/product/phone/src/main/ets/screenlock/pages/customPassword.ets +++ b/product/phone/src/main/ets/WindowScene/screenlock/pages/customPassword.ets @@ -19,7 +19,6 @@ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abi import StatusBar from '@ohos/screenlock/src/main/ets/com/ohos/view/component/statusBar' import CustomPSD from '@ohos/screenlock/src/main/ets/com/ohos/view/component/customPSD' import Constants from '../common/constants' -import StyleManager from '../common/StyleManager' const TAG = 'ScreenLock-CustomPassword' @@ -34,7 +33,6 @@ export default struct CustomPassword { let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height - StyleManager.setStyle() } aboutToDisappear() { diff --git a/product/phone/src/main/ets/screenlock/pages/customscreenlock.ets b/product/phone/src/main/ets/WindowScene/screenlock/pages/customscreenlock.ets similarity index 100% rename from product/phone/src/main/ets/screenlock/pages/customscreenlock.ets rename to product/phone/src/main/ets/WindowScene/screenlock/pages/customscreenlock.ets diff --git a/product/phone/src/main/ets/screenlock/pages/digitalPassword.ets b/product/phone/src/main/ets/WindowScene/screenlock/pages/digitalPassword.ets similarity index 96% rename from product/phone/src/main/ets/screenlock/pages/digitalPassword.ets rename to product/phone/src/main/ets/WindowScene/screenlock/pages/digitalPassword.ets index 88809cf0..77a79251 100644 --- a/product/phone/src/main/ets/screenlock/pages/digitalPassword.ets +++ b/product/phone/src/main/ets/WindowScene/screenlock/pages/digitalPassword.ets @@ -19,7 +19,6 @@ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abi import StatusBar from '@ohos/screenlock/src/main/ets/com/ohos/view/component/statusBar' import DigitalPSD from '@ohos/screenlock/src/main/ets/com/ohos/view/component/digitalPSD' import Constants from '../common/constants' -import StyleManager from '../common/StyleManager' const TAG = 'ScreenLock-DigitalPassword' @@ -34,7 +33,6 @@ export default struct DigitalPassword { let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height - StyleManager.setStyle() } aboutToDisappear() { diff --git a/product/phone/src/main/ets/screenlock/pages/journalscreenlock.ets b/product/phone/src/main/ets/WindowScene/screenlock/pages/journalscreenlock.ets similarity index 100% rename from product/phone/src/main/ets/screenlock/pages/journalscreenlock.ets rename to product/phone/src/main/ets/WindowScene/screenlock/pages/journalscreenlock.ets diff --git a/product/phone/src/main/ets/screenlock/pages/mixedPassword.ets b/product/phone/src/main/ets/WindowScene/screenlock/pages/mixedPassword.ets similarity index 96% rename from product/phone/src/main/ets/screenlock/pages/mixedPassword.ets rename to product/phone/src/main/ets/WindowScene/screenlock/pages/mixedPassword.ets index 6a96c0bf..77b82237 100644 --- a/product/phone/src/main/ets/screenlock/pages/mixedPassword.ets +++ b/product/phone/src/main/ets/WindowScene/screenlock/pages/mixedPassword.ets @@ -19,7 +19,6 @@ import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abi import StatusBar from '@ohos/screenlock/src/main/ets/com/ohos/view/component/statusBar' import MixedPSD from '@ohos/screenlock/src/main/ets/com/ohos/view/component/mixedPSD' import Constants from '../common/constants' -import StyleManager from '../common/StyleManager' const TAG = 'ScreenLock-MixedPassword' @@ -33,7 +32,6 @@ export default struct MixedPassword { let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height - StyleManager.setStyle() } aboutToDisappear() { diff --git a/product/phone/src/main/ets/screenlock/pages/slidescreenlock.ets b/product/phone/src/main/ets/WindowScene/screenlock/pages/slidescreenlock.ets similarity index 100% rename from product/phone/src/main/ets/screenlock/pages/slidescreenlock.ets rename to product/phone/src/main/ets/WindowScene/screenlock/pages/slidescreenlock.ets diff --git a/product/phone/src/main/ets/screenlock/vm/indexViewModel.ts b/product/phone/src/main/ets/WindowScene/screenlock/vm/indexViewModel.ts similarity index 100% rename from product/phone/src/main/ets/screenlock/vm/indexViewModel.ts rename to product/phone/src/main/ets/WindowScene/screenlock/vm/indexViewModel.ts diff --git a/product/phone/src/main/ets/screenlock/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/WindowScene/screenlock/vm/slideScreenLockViewModel.ts similarity index 100% rename from product/phone/src/main/ets/screenlock/vm/slideScreenLockViewModel.ts rename to product/phone/src/main/ets/WindowScene/screenlock/vm/slideScreenLockViewModel.ts diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/SCBStatusBar.ets b/product/phone/src/main/ets/WindowScene/statusbar/SCBStatusBar.ets similarity index 100% rename from feature/systemui/phone/statusbar/src/main/ets/pages/SCBStatusBar.ets rename to product/phone/src/main/ets/WindowScene/statusbar/SCBStatusBar.ets diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets b/product/phone/src/main/ets/WindowScene/statusbar/StatusBar.ets similarity index 94% rename from feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets rename to product/phone/src/main/ets/WindowScene/statusbar/StatusBar.ets index a2e220cb..d79f7f6a 100644 --- a/feature/systemui/phone/statusbar/src/main/ets/pages/StatusBar.ets +++ b/product/phone/src/main/ets/WindowScene/statusbar/StatusBar.ets @@ -19,9 +19,7 @@ import { HeightConfigUtils } from '@ohos/common/src/main/ets/default/layoutconfi import StatusBarComponent from '@ohos/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' import StatusBarVM from '@ohos/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' import {StatusBarData} from '@ohos/statusbarcomponent/src/main/ets/com/ohos/common/Constants' -import Constants from './common/constants' -import StyleManager from './common/StyleManager' -import StatusbarConfig from './common/StatusbarConfig' +import StatusbarConfig from './StatusbarConfig' import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager' import { Trace, Log } from '@ohos/common'; import { WindowType, WINDOW_SHOW_HIDE_EVENT } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager' @@ -51,9 +49,6 @@ export struct StatusBar { Log.showInfo(TAG, `aboutToAppear, start`); this.updateStatusBarData(); - setAppBgColor('#00000000'); - StyleManager.setStyle(); - this.mClearCallback = EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => this.onWindowShowHideEvent(args)); mHeightConfigUtils = new HeightConfigUtils(); @@ -116,14 +111,14 @@ export struct StatusBar { touchEvent(event: TouchEvent) { Trace.start(Trace.CORE_METHOD_START_TOUCHEVENT); Log.showDebug(TAG, 'touchEvent' + event.touches) - if (event.type == Constants.TOUCHTYPE_DOWN) { //down + if (event.type == TouchType.Down) { //down this.startX = event.touches[0].screenX this.startY = event.touches[0].screenY Log.showInfo(TAG, `touchStart, startX: ${this.startX}, startY: ${this.startY}`) - } else if (event.type == Constants.TOUCHTYPE_MOVE) { //move + } else if (event.type == TouchType.Move) { //move this.moveX = event.touches[0].screenX - this.startX this.moveY = event.touches[0].screenY - this.startY - } else if (event.type == Constants.TOUCHTYPE_UP) { //up + } else if (event.type == TouchType.Up) { //up Log.showInfo(TAG, `touchEnd, moveX: ${this.moveX}, moveY: ${this.moveY}`) if (this.moveY > SLIDING_STATUS_BAR_DISTANCE) { this.onDropdown(); diff --git a/feature/systemui/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts b/product/phone/src/main/ets/WindowScene/statusbar/StatusbarConfig.ts similarity index 100% rename from feature/systemui/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts rename to product/phone/src/main/ets/WindowScene/statusbar/StatusbarConfig.ts diff --git a/product/phone/src/main/ets/pages/EntryView.ets b/product/phone/src/main/ets/pages/EntryView.ets index 25909b7f..ea0fa4e9 100644 --- a/product/phone/src/main/ets/pages/EntryView.ets +++ b/product/phone/src/main/ets/pages/EntryView.ets @@ -17,6 +17,10 @@ import { HWRootSceneSession } from '@ohos/common' import { HWSceneSessionManager } from '@ohos/common' import { HWScreen } from '../WindowScene/HWScreen' import { HWScreenSession } from '@ohos/common' +import { Log } from '@ohos/common'; +import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; + +const TAG = "EntryView"; @Entry @Component @@ -24,6 +28,18 @@ struct EntryView { @StorageLink('screenSessionList') screenSessionList: HWScreenSession[] = [] private rootSceneSession: HWRootSceneSession = HWSceneSessionManager.getInstance().getRootSceneSession() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`); + + // 原来在StatusBar/DropdownPanel等处setAbilityPageName会相互覆盖,导致Style不对 + CommonStyleManager.setAbilityPageName(TAG); + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`); + } + build() { RootScene(this.rootSceneSession.session) { ForEach(this.screenSessionList, (item) => { diff --git a/product/phone/src/main/ets/screenlock/common/StyleConfiguration.ts b/product/phone/src/main/ets/screenlock/common/StyleConfiguration.ts deleted file mode 100644 index 27ff2a2b..00000000 --- a/product/phone/src/main/ets/screenlock/common/StyleConfiguration.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; -import { Log } from '@ohos/common/src/main/ets/default/utils/Log'; - -const TAG = 'Lock_StatusBar-StyleConfiguration'; - -export class ScreenLockStyle { -} - -export default class StyleConfiguration { - static getIndexStyle() { - Log.showInfo(TAG, `setStyle`) - const key: string = TAG + "-Index"; - return CommonStyleManager.getStyle(key, ScreenLockStyle); - } -} \ No newline at end of file diff --git a/product/phone/src/main/ets/screenlock/common/StyleManager.ts b/product/phone/src/main/ets/screenlock/common/StyleManager.ts deleted file mode 100644 index e02ab999..00000000 --- a/product/phone/src/main/ets/screenlock/common/StyleManager.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 { Log } from '@ohos/common/src/main/ets/default/utils/Log'; -import AbilityManager from '@ohos/common/src/main/ets/default/abilitymanager/abilityManager'; -import IndexStyleConfiguration from './StyleConfiguration' - -const TAG = 'StatusBar-StyleManager'; - -export default class StyleManager { - static STANDARD_DISPLAY_WIDTH: number = 720; - static STANDARD_DISPLAY_HEIGHT: number = 1280; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - - static setStyle() { - Log.showInfo(TAG, `setStyle`) - - let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'dis'); - StyleManager.maxWidth = config.maxWidth; - - // xxx - { - - } - - } - - static number2px(n: number): string { - return n.toString() + 'px'; - } - - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } - - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } -} \ No newline at end of file diff --git a/product/phone/src/main/resources/base/element/color.json b/product/phone/src/main/resources/base/element/color.json index b1a9a9db..a30a85f3 100644 --- a/product/phone/src/main/resources/base/element/color.json +++ b/product/phone/src/main/resources/base/element/color.json @@ -123,6 +123,58 @@ { "name": "screenlock_backgroundcolor", "value": "#000000" + }, + { + "name": "default_font_color", + "value": "#ffffffff" + }, + { + "name": "capsule_background_color", + "value": "#64BB5C" + }, + { + "name" : "green_capsule_text_color", + "value" : "#ccFFFFFF" + }, + { + "name": "background_color", + "value": "#DCDCDC" + }, + { + "name": "control_center_complex_toggle_ring_mode_on_bg_color", + "value": "#FFFF9800" + }, + { + "name": "default_background", + "value": "#999999" + }, + { + "name": "notification_delete_all_background", + "value": "#4C000000" + }, + { + "name": "quickly_setting_time_font_color", + "value": "#ffffffff" + }, + { + "name": "quickly_setting_date_font_color", + "value": "#ffffffff" + }, + { + "name": "statusbar_background_color", + "value": "#00ffff00" + }, + { + "name": "brightness_slider_block_color", + "value": "#FFFFFFFF" + }, + { + "name": "brightness_slider_track_color", + "value": "#1A000000" + }, + { + "name": "brightness_slider_selected_color", + "value": "#FF007DFF" } ] } \ No newline at end of file diff --git a/product/phone/src/main/resources/base/element/float.json b/product/phone/src/main/resources/base/element/float.json index bbe65086..87187b39 100644 --- a/product/phone/src/main/resources/base/element/float.json +++ b/product/phone/src/main/resources/base/element/float.json @@ -119,7 +119,198 @@ { "name": "accounts_area_height", "value": "80vp" - + }, + { + "name": "status_bar_clock_width", + "value": "37vp" + }, + { + "name": "green_capsule_phone_width", + "value": "14vp" + }, + { + "name": "green_capsule_phone_height", + "value": "14vp" + }, + { + "name": "green_capsule_height", + "value": "20vp" + }, + { + "name": "green_capsule_text_left_right", + "value": "6vp" + }, + { + "name": "green_capsule_radius", + "value": "10vp" + }, + { + "name": "status_bar_bluetooth_width", + "value": "11.5vp" + }, + { + "name": "status_bar_bluetooth_height", + "value": "15vp" + }, + { + "name": "status_bar_ring_mode_width", + "value": "17vp" + }, + { + "name": "status_bar_ring_mode_height", + "value": "15vp" + }, + { + "name": "status_bar_location_width", + "value": "13vp" + }, + { + "name": "status_bar_location_height", + "value": "15vp" + }, + { + "name": "icon_component_opacity", + "value": "0.7" + }, + { + "name": "mTime_text_margin_left", + "value": "2vp" + }, + { + "name": "signal_component_text_margin_left", + "value": "3vp" + }, + { + "name": "green_capsule_phone_text_left", + "value": "1vp" + }, + { + "name": "green_capsule_phone_margin_left", + "value": "2vp" + }, + { + "name": "battery_component_margin", + "value": "2vp" + }, + { + "name": "status_bar_margin_left_right", + "value": "5vp" + }, + { + "name": "status_bar_height", + "value": "46vp" + }, + { + "name": "phone_status_bar_height", + "value": "39vp" + }, + { + "name": "notification_delete_all", + "value": "32" + }, + { + "name": "quickly_setting_time_font_size", + "value": "30fp" + }, + { + "name": "quickly_setting_date_font_size", + "value": "20fp" + }, + { + "name": "quickly_setting_text_flex_margin_left", + "value": "10vp" + }, + { + "name": "quickly_setting_image_width", + "value": "50vp" + }, + { + "name": "quickly_setting_image_height", + "value": "50vp" + }, + { + "name": "quickly_setting_image_margin_right", + "value": "10vp" + }, + { + "name": "quickly_setting_border_radius", + "value": "20vp" + }, + { + "name": "quickly_setting_margin_left", + "value": "10vp" + }, + { + "name": "quickly_setting_margin_right", + "value": "10vp" + }, + { + "name": "delete_all_image_width", + "value": "50vp" + }, + { + "name": "delete_all_image_height", + "value": "50vp" + }, + { + "name": "delete_all_image_border_radius", + "value": "25vp" + }, + { + "name": "delete_all_image_opacity", + "value": "0.9" + }, + { + "name": "brightness_margin_left", + "value": "26vp" + }, + { + "name": "brightness_margin_right", + "value": "26vp" + }, + { + "name": "brightness_component_gap", + "value": "26vp" + }, + { + "name": "brightness_reduce_width", + "value": "44vp" + }, + { + "name": "brightness_reduce_height", + "value": "44vp" + }, + { + "name": "brightness_plus_width", + "value": "44vp" + }, + { + "name": "brightness_plus_height", + "value": "44vp" + }, + { + "name": "brightness_height", + "value": "44vp" + }, + { + "name": "brightness_slider_height", + "value": "40vp" + }, + { + "name": "status_bar_padding_left_right", + "value": "12vp" + }, + { + "name": "status_bar_padding_top_bottom", + "value": "4vp" + }, + { + "name": "notification_title_setting_icon_width", + "value": "48px" + }, + { + "name": "notification_title_setting_icon_height", + "value": "48px" } ] } \ No newline at end of file diff --git a/product/phone/src/main/resources/base/element/string.json b/product/phone/src/main/resources/base/element/string.json index 0123072d..97bf4ff9 100644 --- a/product/phone/src/main/resources/base/element/string.json +++ b/product/phone/src/main/resources/base/element/string.json @@ -171,6 +171,146 @@ { "name": "remove_app_from_folder", "value": "remove app from folder" + }, + { + "name": "status_bar_size_portrait", + "value": "36" + }, + { + "name": "status_bar_size_landscape", + "value": "36" + }, + { + "name": "phone_status_bar_size_portrait", + "value": "54" + }, + { + "name": "phone_status_bar_size_landscape", + "value": "54" + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, + { + "name": "status_bar_position_portrait", + "value": "2" + }, + { + "name": "net_null", + "value": "没有 SIM 卡" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + }, + { + "name": "signal_null", + "value": "×" + }, + { + "name": "incoming_call", + "value": "来电" + }, + { + "name": "communicate_by_phone", + "value": "通话" + }, + { + "name": "monday", + "value": "星期一" + }, + { + "name": "tuesday", + "value": "星期二" + }, + { + "name": "wednesday", + "value": "星期三" + }, + { + "name": "thursday", + "value": "星期四" + }, + { + "name": "friday", + "value": "星期五" + }, + { + "name": "saturday", + "value": "星期六" + }, + { + "name": "sunday", + "value": "星期日" + }, + { + "name": "day", + "value": "日" + }, + { + "name": "month", + "value": "月" + }, + { + "name": "no_notification", + "value": "没有通知" + }, + { + "name": "airplane_mode", + "value": "飞行模式" + }, + { + "name": "control_center_complex_toggle_bluetooth_title", + "value": "蓝牙" + }, + { + "name": "control_center_complex_toggle_location_title", + "value": "位置信息" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_on", + "value": "响铃" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_off", + "value": "静音" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_vibration", + "value": "振动" + }, + { + "name": "nav_bar_position_landscape", + "value": "4" + }, + { + "name": "nav_bar_size_landscape", + "value": "36" + }, + { + "name": "nav_bar_position_portrait", + "value": "4" + }, + { + "name": "nav_bar_size_portrait", + "value": "36" + }, + { + "name": "control_center_complex_toggle_nfc_mode_title", + "value": "NFC" } ] } \ No newline at end of file diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/airplane.svg b/product/phone/src/main/resources/base/media/airplane.svg similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/base/media/airplane.svg rename to product/phone/src/main/resources/base/media/airplane.svg diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg b/product/phone/src/main/resources/base/media/airplane_d.svg similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/base/media/airplane_d.svg rename to product/phone/src/main/resources/base/media/airplane_d.svg diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg b/product/phone/src/main/resources/base/media/ic_brightness_plus.svg similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_plus.svg rename to product/phone/src/main/resources/base/media/ic_brightness_plus.svg diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg b/product/phone/src/main/resources/base/media/ic_brightness_reduce.svg similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_brightness_reduce.svg rename to product/phone/src/main/resources/base/media/ic_brightness_reduce.svg diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg b/product/phone/src/main/resources/base/media/ic_controlcenter_bt.svg similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt.svg rename to product/phone/src/main/resources/base/media/ic_controlcenter_bt.svg diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg b/product/phone/src/main/resources/base/media/ic_controlcenter_bt_d.svg similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_bt_d.svg rename to product/phone/src/main/resources/base/media/ic_controlcenter_bt_d.svg diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg b/product/phone/src/main/resources/base/media/ic_controlcenter_gps.svg similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_controlcenter_gps.svg rename to product/phone/src/main/resources/base/media/ic_controlcenter_gps.svg diff --git a/feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg b/product/phone/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg similarity index 100% rename from feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg rename to product/phone/src/main/resources/base/media/ic_controlcenter_ring_off_filled.svg diff --git a/feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg b/product/phone/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg similarity index 100% rename from feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg rename to product/phone/src/main/resources/base/media/ic_controlcenter_ring_on_filled.svg diff --git a/feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg b/product/phone/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg similarity index 100% rename from feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg rename to product/phone/src/main/resources/base/media/ic_controlcenter_vibration_filled.svg diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg b/product/phone/src/main/resources/base/media/ic_notification_nfc.svg similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg rename to product/phone/src/main/resources/base/media/ic_notification_nfc.svg diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg b/product/phone/src/main/resources/base/media/ic_notification_nfc_filled.svg similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg rename to product/phone/src/main/resources/base/media/ic_notification_nfc_filled.svg diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg b/product/phone/src/main/resources/base/media/ic_public_delete.svg similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg rename to product/phone/src/main/resources/base/media/ic_public_delete.svg diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg b/product/phone/src/main/resources/base/media/ic_public_settings.svg similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg rename to product/phone/src/main/resources/base/media/ic_public_settings.svg diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png b/product/phone/src/main/resources/base/media/ic_settings.png similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/base/media/ic_settings.png rename to product/phone/src/main/resources/base/media/ic_settings.png diff --git a/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg b/product/phone/src/main/resources/base/media/ic_status_bt.svg similarity index 100% rename from feature/systemui/phone/statusbar/src/main/resources/base/media/ic_status_bt.svg rename to product/phone/src/main/resources/base/media/ic_status_bt.svg diff --git a/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg b/product/phone/src/main/resources/base/media/ic_statusbar_gps.svg similarity index 100% rename from feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_gps.svg diff --git a/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg b/product/phone/src/main/resources/base/media/ic_statusbar_nfc.svg similarity index 100% rename from feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_nfc.svg diff --git a/feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg b/product/phone/src/main/resources/base/media/ic_statusbar_phone.svg similarity index 100% rename from feature/systemui/phone/statusbar/src/main/resources/base/media/ic_statusbar_phone.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_phone.svg diff --git a/feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg b/product/phone/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_ring_off_filled.svg diff --git a/feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg b/product/phone/src/main/resources/base/media/ic_statusbar_vibration_on.svg similarity index 100% rename from feature/systemui/ringmodecomponent/src/main/resources/base/media/ic_statusbar_vibration_on.svg rename to product/phone/src/main/resources/base/media/ic_statusbar_vibration_on.svg diff --git a/feature/systemui/wificomponent/src/main/resources/base/media/wifi.svg b/product/phone/src/main/resources/base/media/wifi.svg similarity index 100% rename from feature/systemui/wificomponent/src/main/resources/base/media/wifi.svg rename to product/phone/src/main/resources/base/media/wifi.svg diff --git a/feature/systemui/wificomponent/src/main/resources/base/media/wifi_d.svg b/product/phone/src/main/resources/base/media/wifi_d.svg similarity index 100% rename from feature/systemui/wificomponent/src/main/resources/base/media/wifi_d.svg rename to product/phone/src/main/resources/base/media/wifi_d.svg diff --git a/product/phone/src/main/resources/base/profile/main_pages.json b/product/phone/src/main/resources/base/profile/main_pages.json index daf941ed..53da1808 100644 --- a/product/phone/src/main/resources/base/profile/main_pages.json +++ b/product/phone/src/main/resources/base/profile/main_pages.json @@ -4,8 +4,8 @@ "pages/EmptyPage", "pages/EntryView", "pages/RecentView", - "screenlock/pages/digitalPassword", - "screenlock/pages/mixedPassword", - "screenlock/pages/customPassword" + "WindowScene/screenlock/pages/digitalPassword", + "WindowScene/screenlock/pages/mixedPassword", + "WindowScene/screenlock/pages/customPassword" ] } diff --git a/product/phone/src/main/resources/en_US/element/string.json b/product/phone/src/main/resources/en_US/element/string.json index 004f9620..f23e17e1 100644 --- a/product/phone/src/main/resources/en_US/element/string.json +++ b/product/phone/src/main/resources/en_US/element/string.json @@ -175,6 +175,134 @@ { "name": "isUninstall", "value": "Uninstall " + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, + { + "name": "status_bar_position_portrait", + "value": "2" + }, + { + "name": "net_null", + "value": "No SIM" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + }, + { + "name": "signal_null", + "value": "×" + }, + { + "name": "incoming_call", + "value": "Incoming call" + }, + { + "name": "communicate_by_phone", + "value": "communicate" + }, + { + "name": "monday", + "value": "monday" + }, + { + "name": "tuesday", + "value": "tuesday" + }, + { + "name": "wednesday", + "value": "wednesday" + }, + { + "name": "thursday", + "value": "thursday" + }, + { + "name": "friday", + "value": "friday" + }, + { + "name": "saturday", + "value": "saturday" + }, + { + "name": "sunday", + "value": "sunday" + }, + { + "name": "day", + "value": "day" + }, + { + "name": "month", + "value": "month" + }, + { + "name": "no_notification", + "value": "No Notification" + }, + { + "name": "airplane_mode", + "value": "Airplane mode" + }, + { + "name": "control_center_complex_toggle_bluetooth_title", + "value": "Bluetooth" + }, + { + "name": "control_center_complex_toggle_location_title", + "value": "Location" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_on", + "value": "Sound" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_off", + "value": "Silent" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_vibration", + "value": "Vibration" + }, + { + "name": "nav_bar_position_landscape", + "value": "4" + }, + { + "name": "status_bar_size_landscape", + "value": "48" + }, + { + "name": "nav_bar_size_landscape", + "value": "36" + }, + { + "name": "nav_bar_position_portrait", + "value": "4" + }, + { + "name": "nav_bar_size_portrait", + "value": "36" + }, + { + "name": "control_center_complex_toggle_nfc_mode_title", + "value": "NFC" } ] } \ No newline at end of file diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/phone/element/float.json b/product/phone/src/main/resources/phone/element/float.json similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/phone/element/float.json rename to product/phone/src/main/resources/phone/element/float.json diff --git a/feature/systemui/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png b/product/phone/src/main/resources/phone/media/dropdownpanel_bgc.png similarity index 100% rename from feature/systemui/phone/dropdownpanel/src/main/resources/phone/media/dropdownpanel_bgc.png rename to product/phone/src/main/resources/phone/media/dropdownpanel_bgc.png diff --git a/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg b/product/phone/src/main/resources/phone/media/ic_status_bt.svg similarity index 100% rename from feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg rename to product/phone/src/main/resources/phone/media/ic_status_bt.svg diff --git a/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_gps.svg similarity index 100% rename from feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_gps.svg diff --git a/feature/systemui/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_nfc.svg similarity index 100% rename from feature/systemui/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_nfc.svg diff --git a/feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_phone.svg similarity index 100% rename from feature/systemui/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_phone.svg diff --git a/feature/systemui/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg similarity index 100% rename from feature/systemui/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg diff --git a/feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_signal_1.svg similarity index 100% rename from feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_signal_1.svg diff --git a/feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_signal_2.svg similarity index 100% rename from feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_signal_2.svg diff --git a/feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_signal_3.svg similarity index 100% rename from feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_signal_3.svg diff --git a/feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_signal_4.svg similarity index 100% rename from feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_signal_4.svg diff --git a/feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_signal_full.svg similarity index 100% rename from feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_signal_full.svg diff --git a/feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_signal_no.svg similarity index 100% rename from feature/systemui/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_signal_no.svg diff --git a/feature/systemui/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_vibration_on.svg similarity index 100% rename from feature/systemui/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_vibration_on.svg diff --git a/feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_wifi_1.svg similarity index 100% rename from feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_wifi_1.svg diff --git a/feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_wifi_2.svg similarity index 100% rename from feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_wifi_2.svg diff --git a/feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_wifi_3.svg similarity index 100% rename from feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_wifi_3.svg diff --git a/feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_wifi_full.svg similarity index 100% rename from feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_wifi_full.svg diff --git a/feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg b/product/phone/src/main/resources/phone/media/ic_statusbar_wifi_no.svg similarity index 100% rename from feature/systemui/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg rename to product/phone/src/main/resources/phone/media/ic_statusbar_wifi_no.svg diff --git a/product/phone/src/main/resources/zh_CN/element/string.json b/product/phone/src/main/resources/zh_CN/element/string.json index 5cc319c1..97f01352 100644 --- a/product/phone/src/main/resources/zh_CN/element/string.json +++ b/product/phone/src/main/resources/zh_CN/element/string.json @@ -175,6 +175,134 @@ { "name": "remove_app_from_folder", "value": "移出文件夹" + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, + { + "name": "status_bar_position_portrait", + "value": "2" + }, + { + "name": "net_null", + "value": "没有 SIM 卡" + }, + { + "name": "2G", + "value": "2G" + }, + { + "name": "3G", + "value": "3G" + }, + { + "name": "4G", + "value": "4G" + }, + { + "name": "5G", + "value": "5G" + }, + { + "name": "signal_null", + "value": "×" + }, + { + "name": "incoming_call", + "value": "来电" + }, + { + "name": "communicate_by_phone", + "value": "通话" + }, + { + "name": "monday", + "value": "星期一" + }, + { + "name": "tuesday", + "value": "星期二" + }, + { + "name": "wednesday", + "value": "星期三" + }, + { + "name": "thursday", + "value": "星期四" + }, + { + "name": "friday", + "value": "星期五" + }, + { + "name": "saturday", + "value": "星期六" + }, + { + "name": "sunday", + "value": "星期日" + }, + { + "name": "day", + "value": "日" + }, + { + "name": "month", + "value": "月" + }, + { + "name": "no_notification", + "value": "没有通知" + }, + { + "name": "airplane_mode", + "value": "飞行模式" + }, + { + "name": "control_center_complex_toggle_bluetooth_title", + "value": "蓝牙" + }, + { + "name": "control_center_complex_toggle_location_title", + "value": "位置信息" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_on", + "value": "响铃" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_off", + "value": "静音" + }, + { + "name": "control_center_complex_toggle_ring_mode_title_vibration", + "value": "振动" + }, + { + "name": "nav_bar_position_landscape", + "value": "4" + }, + { + "name": "status_bar_size_landscape", + "value": "48" + }, + { + "name": "nav_bar_size_landscape", + "value": "36" + }, + { + "name": "nav_bar_position_portrait", + "value": "4" + }, + { + "name": "nav_bar_size_portrait", + "value": "36" + }, + { + "name": "control_center_complex_toggle_nfc_mode_title", + "value": "NFC" } ] } \ No newline at end of file -- Gitee From d1d5cfd60dfeb973eb11f15f43d6a1fbcb7f2908 Mon Sep 17 00:00:00 2001 From: njuptkid Date: Thu, 4 May 2023 14:24:25 +0800 Subject: [PATCH 370/373] modify import ts file name Change-Id: I2df96451147d10b61f29e5ec70c808c0e70e1afe --- product/phone/src/main/ets/MainAbility/MainAbility.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/product/phone/src/main/ets/MainAbility/MainAbility.ts b/product/phone/src/main/ets/MainAbility/MainAbility.ts index 4c055dd8..d9acf9f7 100644 --- a/product/phone/src/main/ets/MainAbility/MainAbility.ts +++ b/product/phone/src/main/ets/MainAbility/MainAbility.ts @@ -27,7 +27,7 @@ import StyleConstants from '../common/constants/StyleConstants'; import { navigationBarCommonEventManager } from '@ohos/common'; import PageDesktopViewModel from '../../../../../../feature/pagedesktop/src/main/ets/default/viewmodel/PageDesktopViewModel'; import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import SessionManagerService from '@ohos.session_manager_service'; +import SessionManagerService from '@ohos.sessionManagerService'; import rpc from '@ohos.rpc'; import EventManager from '@ohos/common/src/main/ets/default/utils/EventManager'; import ScreenLockManager from '@ohos/common/src/main/ets/default/manager/ScreenLockManager'; -- Gitee From 37127a7627b299dd01f21d86dc468a3e699dc142 Mon Sep 17 00:00:00 2001 From: chyyy0213 Date: Thu, 4 May 2023 16:34:33 +0800 Subject: [PATCH 371/373] =?UTF-8?q?SceneBoard=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=BE=A7=E9=87=8D=E6=9E=84=EF=BC=8Cui=E4=BE=A7=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=95=B0=E6=8D=AE=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chyyy0213 --- common/index.ets | 19 +- ...sitionEffect.ts => SCBTransitionEffect.ts} | 34 +- .../SCBGestureAction.ts} | 116 ++-- .../ets/WindowScene/common/SCBGestureModel.ts | 84 ++- .../{HWDividerParam.ts => SCBDividerParam.ts} | 50 +- ...SceneSession.ts => SCBRootSceneSession.ts} | 21 +- ...Session.ts => SCBSceneContainerSession.ts} | 82 ++- .../{HWSceneInfo.ts => SCBSceneInfo.ts} | 18 +- .../{HWSceneSession.ts => SCBSceneSession.ts} | 57 +- ...onManager.ts => SCBSceneSessionManager.ts} | 209 ++++--- .../screen/session/HWScreenSession.ts | 210 ------- .../screen/session/HWScreenSessionManager.ts | 131 ----- .../screen/session/SCBScreenSession.ts | 115 ++++ .../ets/default/constants/StyleConstants.ts | 11 +- .../default/manager/LauncherAbilityManager.ts | 8 +- .../src/main/ets/MainAbility/MainAbility.ts | 6 +- .../SCBDesktop.ets} | 292 +++++----- .../SCBDivider.ets} | 66 ++- .../SCBGestureNavBar.ets} | 97 ++-- .../src/main/ets/SceneBoard/SCBScene.ets | 112 ++++ .../main/ets/SceneBoard/SCBSceneContainer.ets | 156 ++++++ .../src/main/ets/SceneBoard/SCBScenePanel.ets | 523 ++++++++++++++++++ .../HWScreen.ets => SceneBoard/SCBScreen.ets} | 42 +- .../SCBWallpaper.ets} | 48 +- .../dropdownpanel/DropdownPanel.ets | 0 .../dropdownpanel/bannerNotification.ets | 0 .../common/ControlCenterConfig.ts | 0 .../common/StyleConfiguration.ts | 0 .../dropdownpanel/common/StyleManager.ts | 0 .../dropdownpanel/common/constants.ts | 0 .../dropdownpanel/common/navigationEvent.ts | 0 .../dropdownpanel/control.ets | 0 .../dropdownpanel/notification.ets | 0 .../screenlock/common/constants.ts | 0 .../screenlock/pages/SCBScreenLock.ets | 0 .../screenlock/pages/customPassword.ets | 0 .../screenlock/pages/customscreenlock.ets | 0 .../screenlock/pages/digitalPassword.ets | 0 .../screenlock/pages/journalscreenlock.ets | 0 .../screenlock/pages/mixedPassword.ets | 0 .../screenlock/pages/slidescreenlock.ets | 0 .../screenlock/vm/indexViewModel.ts | 0 .../screenlock/vm/slideScreenLockViewModel.ts | 0 .../statusbar/SCBStatusBar.ets | 0 .../statusbar/StatusBar.ets | 0 .../statusbar/StatusbarConfig.ts | 0 .../main/ets/WindowScene/HWSceneContainer.ets | 120 ---- .../src/main/ets/WindowScene/HWScenePanel.ets | 184 ------ .../phone/src/main/ets/pages/EntryView.ets | 85 ++- .../resources/base/profile/main_pages.json | 6 +- 50 files changed, 1673 insertions(+), 1229 deletions(-) rename common/src/main/ets/WindowScene/animation/{HWTransitionEffect.ts => SCBTransitionEffect.ts} (54%) rename common/src/main/ets/WindowScene/{scene/session/HWRecentViewParam.ts => common/SCBGestureAction.ts} (34%) rename product/phone/src/main/ets/WindowScene/HWScene.ets => common/src/main/ets/WindowScene/common/SCBGestureModel.ts (30%) rename common/src/main/ets/WindowScene/scene/session/{HWDividerParam.ts => SCBDividerParam.ts} (54%) rename common/src/main/ets/WindowScene/scene/session/{HWRootSceneSession.ts => SCBRootSceneSession.ts} (65%) rename common/src/main/ets/WindowScene/scene/session/{HWSceneContainerSession.ts => SCBSceneContainerSession.ts} (51%) rename common/src/main/ets/WindowScene/scene/session/{HWSceneInfo.ts => SCBSceneInfo.ts} (74%) rename common/src/main/ets/WindowScene/scene/session/{HWSceneSession.ts => SCBSceneSession.ts} (43%) rename common/src/main/ets/WindowScene/scene/session/{HWSceneSessionManager.ts => SCBSceneSessionManager.ts} (30%) delete mode 100644 common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts delete mode 100644 common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ts create mode 100644 common/src/main/ets/WindowScene/screen/session/SCBScreenSession.ts rename product/phone/src/main/ets/{WindowScene/HWDesktop.ets => SceneBoard/SCBDesktop.ets} (96%) rename product/phone/src/main/ets/{WindowScene/HWDivider.ets => SceneBoard/SCBDivider.ets} (45%) rename product/phone/src/main/ets/{WindowScene/HWGestureNavBar.ets => SceneBoard/SCBGestureNavBar.ets} (31%) create mode 100644 product/phone/src/main/ets/SceneBoard/SCBScene.ets create mode 100644 product/phone/src/main/ets/SceneBoard/SCBSceneContainer.ets create mode 100644 product/phone/src/main/ets/SceneBoard/SCBScenePanel.ets rename product/phone/src/main/ets/{WindowScene/HWScreen.ets => SceneBoard/SCBScreen.ets} (70%) rename product/phone/src/main/ets/{WindowScene/HWWallpaper.ets => SceneBoard/SCBWallpaper.ets} (93%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/dropdownpanel/DropdownPanel.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/dropdownpanel/bannerNotification.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/dropdownpanel/common/ControlCenterConfig.ts (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/dropdownpanel/common/StyleConfiguration.ts (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/dropdownpanel/common/StyleManager.ts (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/dropdownpanel/common/constants.ts (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/dropdownpanel/common/navigationEvent.ts (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/dropdownpanel/control.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/dropdownpanel/notification.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/screenlock/common/constants.ts (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/screenlock/pages/SCBScreenLock.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/screenlock/pages/customPassword.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/screenlock/pages/customscreenlock.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/screenlock/pages/digitalPassword.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/screenlock/pages/journalscreenlock.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/screenlock/pages/mixedPassword.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/screenlock/pages/slidescreenlock.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/screenlock/vm/indexViewModel.ts (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/screenlock/vm/slideScreenLockViewModel.ts (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/statusbar/SCBStatusBar.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/statusbar/StatusBar.ets (100%) rename product/phone/src/main/ets/{WindowScene => SceneBoard}/statusbar/StatusbarConfig.ts (100%) delete mode 100644 product/phone/src/main/ets/WindowScene/HWSceneContainer.ets delete mode 100644 product/phone/src/main/ets/WindowScene/HWScenePanel.ets diff --git a/common/index.ets b/common/index.ets index def2fa4c..257845fd 100644 --- a/common/index.ets +++ b/common/index.ets @@ -87,12 +87,13 @@ export { DragArea } from './src/main/ets/default/base/DragArea' export { DragItemPosition } from './src/main/ets/default/base/DragItemPosition' // Window scene -export { HWRootSceneSession } from './src/main/ets/WindowScene/scene/session/HWRootSceneSession' -export { HWSceneInfo } from './src/main/ets/WindowScene/scene/session/HWSceneInfo' -export { HWDividerParam } from './src/main/ets/WindowScene/scene/session/HWDividerParam' -export { HWRecentViewParam } from './src/main/ets/WindowScene/scene/session/HWRecentViewParam' -export { HWSceneSession } from './src/main/ets/WindowScene/scene/session/HWSceneSession' -export { HWSceneSessionManager } from './src/main/ets/WindowScene/scene/session/HWSceneSessionManager' -export { HWScreenSession, DesktopState, SceneContainerSessionArray } from './src/main/ets/WindowScene/screen/session/HWScreenSession' -export { HWScreenSessionManager } from './src/main/ets/WindowScene/screen/session/HWScreenSessionManager' -export { HWSceneContainerSession } from './src/main/ets/WindowScene/scene/session/HWSceneContainerSession' \ No newline at end of file +export { SCBRootSceneSession } from './src/main/ets/WindowScene/scene/session/SCBRootSceneSession' +export { SCBSceneInfo } from './src/main/ets/WindowScene/scene/session/SCBSceneInfo' +export { SCBDividerParam } from './src/main/ets/WindowScene/scene/session/SCBDividerParam' +export { SCBSceneSession } from './src/main/ets/WindowScene/scene/session/SCBSceneSession' +export { SCBSceneSessionManager } from './src/main/ets/WindowScene/scene/session/SCBSceneSessionManager' +export { SCBScreenSession, SCBScreenProperty } from './src/main/ets/WindowScene/screen/session/SCBScreenSession' +export { SCBSceneContainerSession } from './src/main/ets/WindowScene/scene/session/SCBSceneContainerSession' +export { SCBSceneContainerSessionArray } from './src/main/ets/WindowScene/scene/session/SCBSceneContainerSession' +export { SCBGestureModel, SceneState } from './src/main/ets/WindowScene/common/SCBGestureModel' +export { SCBGestureActionId, SCBGestureActionOption, SCBGestureAction } from './src/main/ets/WindowScene/common/SCBGestureAction' \ No newline at end of file diff --git a/common/src/main/ets/WindowScene/animation/HWTransitionEffect.ts b/common/src/main/ets/WindowScene/animation/SCBTransitionEffect.ts similarity index 54% rename from common/src/main/ets/WindowScene/animation/HWTransitionEffect.ts rename to common/src/main/ets/WindowScene/animation/SCBTransitionEffect.ts index a369f67a..70ff532e 100644 --- a/common/src/main/ets/WindowScene/animation/HWTransitionEffect.ts +++ b/common/src/main/ets/WindowScene/animation/SCBTransitionEffect.ts @@ -21,17 +21,17 @@ export class SharedTransitionParam { } // TODO Transition configuration -export class HWTransitionEffect { - static DEFAULT: HWTransitionEffect +export class SCBTransitionEffect { + static DEFAULT: SCBTransitionEffect - static APPEAR_FROM_ITEM: HWTransitionEffect - static APPEAR_FROM_ITEM_PC: HWTransitionEffect - static APPEAR_FROM_NONE: HWTransitionEffect - static APPEAR_FROM_SCENE: HWTransitionEffect + static APPEAR_FROM_ITEM: SCBTransitionEffect + static APPEAR_FROM_ITEM_PC: SCBTransitionEffect + static APPEAR_FROM_NONE: SCBTransitionEffect + static APPEAR_FROM_SCENE: SCBTransitionEffect - static DISAPPEAR_FROM_SCENE: HWTransitionEffect - static DISAPPEAR_TO_HOME: HWTransitionEffect - static DISAPPEAR_TO_HOME_PC: HWTransitionEffect + static DISAPPEAR_FROM_SCENE: SCBTransitionEffect + static DISAPPEAR_TO_HOME: SCBTransitionEffect + static DISAPPEAR_TO_HOME_PC: SCBTransitionEffect constructor() {} @@ -51,11 +51,11 @@ export class HWTransitionEffect { animationParam: AnimateParam } -HWTransitionEffect.DEFAULT = new HWTransitionEffect() -HWTransitionEffect.APPEAR_FROM_ITEM = new HWTransitionEffect() -HWTransitionEffect.APPEAR_FROM_NONE = new HWTransitionEffect() -HWTransitionEffect.APPEAR_FROM_SCENE = new HWTransitionEffect() -HWTransitionEffect.APPEAR_FROM_ITEM_PC = new HWTransitionEffect() -HWTransitionEffect.DISAPPEAR_FROM_SCENE = new HWTransitionEffect() -HWTransitionEffect.DISAPPEAR_TO_HOME = new HWTransitionEffect() -HWTransitionEffect.DISAPPEAR_TO_HOME_PC = new HWTransitionEffect() +SCBTransitionEffect.DEFAULT = new SCBTransitionEffect() +SCBTransitionEffect.APPEAR_FROM_ITEM = new SCBTransitionEffect() +SCBTransitionEffect.APPEAR_FROM_NONE = new SCBTransitionEffect() +SCBTransitionEffect.APPEAR_FROM_SCENE = new SCBTransitionEffect() +SCBTransitionEffect.APPEAR_FROM_ITEM_PC = new SCBTransitionEffect() +SCBTransitionEffect.DISAPPEAR_FROM_SCENE = new SCBTransitionEffect() +SCBTransitionEffect.DISAPPEAR_TO_HOME = new SCBTransitionEffect() +SCBTransitionEffect.DISAPPEAR_TO_HOME_PC = new SCBTransitionEffect() diff --git a/common/src/main/ets/WindowScene/scene/session/HWRecentViewParam.ts b/common/src/main/ets/WindowScene/common/SCBGestureAction.ts similarity index 34% rename from common/src/main/ets/WindowScene/scene/session/HWRecentViewParam.ts rename to common/src/main/ets/WindowScene/common/SCBGestureAction.ts index f7eae59e..b62bf6db 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWRecentViewParam.ts +++ b/common/src/main/ets/WindowScene/common/SCBGestureAction.ts @@ -13,77 +13,55 @@ * limitations under the License. */ -/** - * param of RecentView - */ -@Observed -export class HWRecentViewParam { - /** - * translateX of RecentView - */ - translateX: number = 0; - - /** - * translateY of RecentView - */ - translateY: number = 0; - - /** - * scaleX of RecentView - */ - scaleX: number = 1; - - /** - * scaleY of RecentView - */ - scaleY: number = 1; - - /** - * centerX of RecentView - */ - centerX: number | string = '50%'; - - /** - * centerY of RecentView - */ - centerY: number | string = '50%'; +import { Log } from '../../default/utils/Log' - /** - * offsetX of RecentView - */ - offsetX: number = 0; - /** - * offsetY of RecentView - */ - offsetY: number = 0; +const TAG = 'SCBGestureAction' - /** - * borderRadius of scene - */ - borderRadius: number | string = 0; +export enum SCBGestureActionId { + HOME, + FULLSCENE, + ENTER_SPLIT, + EXIT_SPILT, + ENTER_RECENT, + SLIDE_UP_BEGIN, + SLIDING_UP, + SLIDE_UP_END, + DESTROY_IN_RECENT, + EXIT_SPLIT +}; - height: number | string = '100%'; - - width: number | string = '100%'; - - margin: number | string = 0; - - /** - * init properties of RecentView - */ - public init() { - this.translateX = 0; - this.translateY = 0; - this.scaleX = 1; - this.scaleY = 1; - this.centerX = '50%'; - this.centerY = '50%'; - this.offsetX = 0; - this.offsetY = 0; - this.borderRadius = 0; - this.height = "100%" - this.width = "100%" - this.margin = 0 - } +export interface SCBGestureActionOption { + id: number; + destroyLen?: number; + screenId?: number; + gestureOffsetX?: number; + gestureOffsetY?: number; + sessionId?: number; +} +/** + * Manage info of gesture + */ +@Observed +export class SCBGestureAction { + readonly actionId: number = SCBGestureActionId.HOME; + readonly screenId: number; + readonly gestureOffsetX: number = 0; + readonly gestureOffsetY: number = 0; + readonly sessionId: number = -1; + constructor(options: SCBGestureActionOption) { + this.actionId = options.id; + if (options.screenId) { + this.screenId = options.screenId; + } + if (options.gestureOffsetX) { + this.gestureOffsetX = options.gestureOffsetX; + } + if (options.gestureOffsetY) { + this.gestureOffsetY = options.gestureOffsetY; + } + if (options.sessionId) { + this.sessionId = options.sessionId; + } + } } diff --git a/product/phone/src/main/ets/WindowScene/HWScene.ets b/common/src/main/ets/WindowScene/common/SCBGestureModel.ts similarity index 30% rename from product/phone/src/main/ets/WindowScene/HWScene.ets rename to common/src/main/ets/WindowScene/common/SCBGestureModel.ts index 098875a8..5a270669 100644 --- a/product/phone/src/main/ets/WindowScene/HWScene.ets +++ b/common/src/main/ets/WindowScene/common/SCBGestureModel.ts @@ -13,32 +13,64 @@ * limitations under the License. */ -import { HWSceneSession } from '@ohos/common' -import { StyleConstants } from '@ohos/common' -import { Log } from '@ohos/common' - -const TAG = 'HWScene' - -@Component -export struct HWScene { - sceneSession: HWSceneSession - - buildLog(sceneSession: HWSceneSession) { - if (sceneSession) { - Log.showInfo(TAG, 'HWSceneSession bundle name: ' + sceneSession.sceneInfo.bundleName + ' id: ' + sceneSession.session.persistentId); - return true; - } else { - Log.showError(TAG, 'HWSceneSession is null'); - return false; +import screenSessionManager from '@ohos.screenSessionManager' +import { SCBSceneSession } from '../scene/session/SCBSceneSession' +import { SCBSceneContainerSession } from '../scene/session/SCBSceneContainerSession' +import { Log } from '../../default/utils/Log' +import { SCBSceneInfo } from '../scene/session/SCBSceneInfo' +import { SCBDividerParam } from '../scene/session/SCBDividerParam' + +const TAG = 'SCBGestureModel' + +export enum SceneState { + HOME, + FULLSCENE, + SPLIT, + SLIDING_UP, + RECENT +} +/** + * Manage info of gesture + */ +@Observed +export class SCBGestureModel { + + sceneState: SceneState = SceneState.HOME; + + flexWidth: number | string = '100%'; + + flexHeight: number | string = '100%'; + + flexPadding: number = 0; + + flexOffsetX: number = 0; + + flexOffsetY: number = 0; + + multiViewShow: boolean = false; + + enableScroll: boolean = true; + + /** + * Constructor. + * @param session Session of the screen + */ + constructor() { + } + + public updateSceneState(state: SceneState) { + Log.showInfo(TAG, `updateSceneState from ${this.sceneState} to ${state}`); + this.sceneState = state; } - } - - build() { - Stack() { - if (this.buildLog(this.sceneSession)) { - HostWindowScene(this.sceneSession.session.persistentId) - .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) - } + /** + * init properties of all container or scene + */ + public initAll() { + this.flexWidth = "100%"; + this.flexHeight = "100%"; + this.flexPadding = 0; + this.flexOffsetX = 0; + this.flexOffsetY = 0; + this.multiViewShow = false; } - } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWDividerParam.ts b/common/src/main/ets/WindowScene/scene/session/SCBDividerParam.ts similarity index 54% rename from common/src/main/ets/WindowScene/scene/session/HWDividerParam.ts rename to common/src/main/ets/WindowScene/scene/session/SCBDividerParam.ts index 44694fb1..87952eed 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWDividerParam.ts +++ b/common/src/main/ets/WindowScene/scene/session/SCBDividerParam.ts @@ -13,63 +13,63 @@ * limitations under the License. */ /** - * param of HWDivider + * param of SCBDivider */ @Observed -export class HWDividerParam { +export class SCBDividerParam { /** * translateX of Divider */ - translateX: number = 0 + translateX: number = 0; /** * translateY of Divider */ - translateY: number = 0 + translateY: number = 0; /** * scaleX of Divider */ - scaleX: number = 1 + scaleX: number = 1; /** * scaleY of Divider */ - scaleY: number = 1 + scaleY: number = 1; /** - * scaleY of primary HWScene + * scaleY of primary SCBScene */ - primaryScaleY : number = 1 + primaryScaleY : number = 1; /** - * scaleY of secondary HWScene + * scaleY of secondary SCBScene */ - secondaryScaleY : number = 1 + secondaryScaleY : number = 1; /** - * Height of primary HWScene + * Height of primary SCBScene */ - primaryH : string = '100%' + primaryH : string = '100%'; /** - * translateY of secondary HWScene + * translateY of secondary SCBScene */ - secTransY: number = 0 + secTransY: number = 0; /** - * blurRadius of primary/secondary HWScene when drag divider + * blurRadius of primary/secondary SCBScene when drag divider */ - blurRadius : number = 0 + blurRadius : number = 0; public init() { - this.translateX = 0 - this.translateY = 0 - this.scaleX = 1 - this.scaleY = 1 - this.primaryScaleY = 1 - this.secondaryScaleY = 1 - this.primaryH = '100%' - this.secTransY = 0 - this.blurRadius = 0 + this.translateX = 0; + this.translateY = 0; + this.scaleX = 1; + this.scaleY = 1; + this.primaryScaleY = 1; + this.secondaryScaleY = 1; + this.primaryH = '100%'; + this.secTransY = 0; + this.blurRadius = 0; } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ts b/common/src/main/ets/WindowScene/scene/session/SCBRootSceneSession.ts similarity index 65% rename from common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ts rename to common/src/main/ets/WindowScene/scene/session/SCBRootSceneSession.ts index 8cb92aeb..8fd78f8b 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWRootSceneSession.ts +++ b/common/src/main/ets/WindowScene/scene/session/SCBRootSceneSession.ts @@ -15,22 +15,21 @@ import sceneSessionManager from '@ohos.sceneSessionManager' -import { HWSceneInfo } from './HWSceneInfo' -import { HWSceneSessionManager } from './HWSceneSessionManager' -import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager' -import { HWTransitionEffect } from '../../animation/HWTransitionEffect' +import { SCBSceneInfo } from './SCBSceneInfo' +import { SCBSceneSessionManager } from './SCBSceneSessionManager' import ServiceExtensionContext from 'application/ServiceExtensionContext' /** * Scene session of the root scene. */ -export class HWRootSceneSession { - readonly session: sceneSessionManager.RootSceneSession +export class SCBRootSceneSession { + readonly session: sceneSessionManager.RootSceneSession; + usrId: number = -1; constructor() { - this.session = sceneSessionManager.getRootSceneSession() + this.session = sceneSessionManager.getRootSceneSession(); this.session.on('pendingSceneSessionActivation', (info) => { - this.onPendingSceneSessionActivation(info) + this.onPendingSceneSessionActivation(info); }) } @@ -40,11 +39,11 @@ export class HWRootSceneSession { * @param context Context of the service extension */ public loadContent(path: string, context: ServiceExtensionContext): void { - this.session.loadContent(path, context) + this.session.loadContent(path, context); } private onPendingSceneSessionActivation(sceneInfo: sceneSessionManager.SceneInfo): void { - let hwSceneInfo = new HWSceneInfo(sceneInfo.bundleName, sceneInfo.abilityName); - HWSceneSessionManager.getInstance().startScene(hwSceneInfo) + let info = new SCBSceneInfo(sceneInfo.bundleName, sceneInfo.abilityName); + SCBSceneSessionManager.getInstance().startScene(info); } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts b/common/src/main/ets/WindowScene/scene/session/SCBSceneContainerSession.ts similarity index 51% rename from common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts rename to common/src/main/ets/WindowScene/scene/session/SCBSceneContainerSession.ts index f3254147..65f94050 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneContainerSession.ts +++ b/common/src/main/ets/WindowScene/scene/session/SCBSceneContainerSession.ts @@ -14,48 +14,64 @@ */ import screenSessionManager from '@ohos.screenSessionManager' -import { HWSceneSession } from './HWSceneSession' -import { HWDividerParam } from './HWDividerParam' +import { SCBSceneSession } from './SCBSceneSession' +import { SCBDividerParam } from './SCBDividerParam' +import { SCBScreenProperty } from './../../screen/session/SCBScreenSession' + import { Log } from '../../../default/utils/Log' -const TAG = 'HWSceneContainerSession' +const TAG = 'SCBSceneContainerSession' + +@Observed +export class SCBSceneContainerSessionArray extends Array { +} /** * Session of a scene. */ @Observed -export class HWSceneContainerSession { +export class SCBSceneContainerSession { readonly containerId: number; - primarySession: HWSceneSession = null; - secondarySession: HWSceneSession = null; - screenBounds: screenSessionManager.RRect; - dividerParam: HWDividerParam = new HWDividerParam(); + primarySession: SCBSceneSession = null; + secondarySession: SCBSceneSession = null; + screenProperty: SCBScreenProperty; + dividerParam: SCBDividerParam = new SCBDividerParam(); isSplit: boolean = false; isActive: boolean = false; + translateX: number = 0; translateY: number = 0; scaleX: number = 1; scaleY: number = 1; centerX: number | string = '50%'; centerY: number | string = '50%'; + width: number | string = '100%'; + height: number | string = '100%'; + offsetX: number = 0; + offsetY: number = 0; + margin: number = 0; + borderRadius: number = 0; + alpha: number = 0; private static gContainerId: number = 0; /** * Constructor. */ - constructor(primarySession: HWSceneSession, screenBounds: screenSessionManager.RRect) { - this.containerId = ++HWSceneContainerSession.gContainerId; + constructor(primarySession: SCBSceneSession, screenProperty: SCBScreenProperty) { + this.containerId = ++SCBSceneContainerSession.gContainerId; this.primarySession = primarySession; this.secondarySession = null; - this.screenBounds = screenBounds; + this.screenProperty = screenProperty; + this.width = px2vp(this.screenProperty.width); + this.height = px2vp(this.screenProperty.height); } /** * Add scene session to this container. * @param sceneSession The scene session to add. */ - public addSceneSession(sceneSession: HWSceneSession) { + public addSceneSession(sceneSession: SCBSceneSession) { if (sceneSession === null) { Log.showError(TAG, 'Add scene session failed as scene session is null!'); return; @@ -79,7 +95,7 @@ export class HWSceneContainerSession { * Remove scene session from this container. * @param sceneSession The scene session to remove. */ - public removeSceneSession(sceneSession: HWSceneSession) { + public removeSceneSession(sceneSession: SCBSceneSession) { if (sceneSession === null) { Log.showError(TAG, 'Remove scene session failed as scene session is null!'); return; @@ -98,6 +114,39 @@ export class HWSceneContainerSession { } } + public requestActivation() { + if (this.isActive) { + Log.showWarn(TAG, 'The scene is already active.'); + return; + } + + Log.showInfo(TAG, 'Request scene container session activation, id: ' + this.containerId); + this.isActive = true; + this.primarySession && this.primarySession.requestSessionActivation(); + if (this.isSplit) { + this.secondarySession && this.secondarySession.requestSessionActivation(); + } + } + + public requestBackground() { + if (!this.isActive) { + Log.showError(TAG, 'The scene is already background.'); + return; + } + + Log.showInfo(TAG, 'Request scene container session background, containerId: ' + this.containerId); + this.isActive = false; + this.primarySession && this.primarySession.requestSessionBackground(); + this.secondarySession && this.secondarySession.requestSessionBackground(); + } + + public requestDestruction() { + Log.showInfo(TAG, 'Request scene container session destruction, id: ' + this.containerId); + this.isActive = false; + this.primarySession && this.primarySession.requestSessionDestruction(); + this.secondarySession && this.secondarySession.requestSessionDestruction(); + } + public init() { this.translateX = 0; this.translateY = 0; @@ -105,5 +154,12 @@ export class HWSceneContainerSession { this.scaleY = 1; this.centerX = '50%'; this.centerY = '50%'; + this.width = px2vp(this.screenProperty.width); + this.height = px2vp(this.screenProperty.height); + this.offsetX = 0; + this.offsetY = 0; + this.margin = 0; + this.borderRadius = 0; + Log.showInfo(TAG, 'id: ' + this.containerId + ' initWidth: ' + this.width + ' initHeight: ' + this.height); } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts b/common/src/main/ets/WindowScene/scene/session/SCBSceneInfo.ts similarity index 74% rename from common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts rename to common/src/main/ets/WindowScene/scene/session/SCBSceneInfo.ts index 42a74e14..476cb36c 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneInfo.ts +++ b/common/src/main/ets/WindowScene/scene/session/SCBSceneInfo.ts @@ -13,39 +13,39 @@ * limitations under the License. */ -import { HWTransitionEffect } from '../../animation/HWTransitionEffect' +import { SCBTransitionEffect } from '../../animation/SCBTransitionEffect' /** * Information of a scene. */ -export class HWSceneInfo { +export class SCBSceneInfo { /** * Bundle name. */ - bundleName : string + bundleName : string; /** * Ability name. */ - abilityName: string + abilityName: string; /** * Identifier which screen the scene is displayed. default is main screen */ - screenId: number = -1 + screenId: number = -1; /** * True start a new scene otherwise priority to start the exist scene. */ - isNewInstance: boolean = false + isNewInstance: boolean = false; /** * Transition effect when scene appearing or disappearing. */ - transitionEffect: HWTransitionEffect = HWTransitionEffect.DEFAULT + transitionEffect: SCBTransitionEffect = SCBTransitionEffect.DEFAULT; constructor(bundleName: string, abilityName: string) { - this.bundleName = bundleName - this.abilityName = abilityName + this.bundleName = bundleName; + this.abilityName = abilityName; } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ts b/common/src/main/ets/WindowScene/scene/session/SCBSceneSession.ts similarity index 43% rename from common/src/main/ets/WindowScene/scene/session/HWSceneSession.ts rename to common/src/main/ets/WindowScene/scene/session/SCBSceneSession.ts index d1c20d82..7bca8944 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSession.ts +++ b/common/src/main/ets/WindowScene/scene/session/SCBSceneSession.ts @@ -14,44 +14,57 @@ */ import sceneSessionManager from '@ohos.sceneSessionManager' -import { HWSceneInfo } from './HWSceneInfo' -import { HWSceneSessionManager } from './HWSceneSessionManager' -import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager' -import { HWTransitionEffect } from '../../animation/HWTransitionEffect' +import { SCBSceneInfo } from './SCBSceneInfo' +import { SCBSceneSessionManager } from './SCBSceneSessionManager' +import { SCBTransitionEffect } from '../../animation/SCBTransitionEffect' /** * Session of a scene. */ @Observed -export class HWSceneSession { - readonly sceneInfo: HWSceneInfo - readonly session: sceneSessionManager.SceneSession - isActive: boolean = false - translateX: number = 0 - translateY: number = 0 - scaleX: number = 1 - scaleY: number = 1 +export class SCBSceneSession { + readonly sceneInfo: SCBSceneInfo; + readonly session: sceneSessionManager.SceneSession; + isActive: boolean = false; + translateX: number = 0; + translateY: number = 0; + scaleX: number = 1; + scaleY: number = 1; /** * Constructor. * @param session Session of the scene * @param sceneInfo Information of the scene */ - constructor(session: sceneSessionManager.SceneSession, sceneInfo: HWSceneInfo) { - this.sceneInfo = sceneInfo - this.session = session + constructor(session: sceneSessionManager.SceneSession, sceneInfo: SCBSceneInfo) { + this.sceneInfo = sceneInfo; + this.session = session; this.session.on('pendingSceneSessionActivation', (info) => { - this.onPendingSceneSessionActivation(info) + this.onPendingSceneSessionActivation(info); }) } private onPendingSceneSessionActivation(sceneInfo: sceneSessionManager.SceneInfo) { - let toSceneInfo = new HWSceneInfo(sceneInfo.bundleName, sceneInfo.abilityName); - toSceneInfo.screenId = this.sceneInfo.screenId - toSceneInfo.transitionEffect = HWTransitionEffect.APPEAR_FROM_SCENE - this.sceneInfo.transitionEffect = HWTransitionEffect.DISAPPEAR_FROM_SCENE + let toSceneInfo = new SCBSceneInfo(sceneInfo.bundleName, sceneInfo.abilityName); + toSceneInfo.screenId = this.sceneInfo.screenId; + toSceneInfo.transitionEffect = SCBTransitionEffect.APPEAR_FROM_SCENE; + this.sceneInfo.transitionEffect = SCBTransitionEffect.DISAPPEAR_FROM_SCENE; - HWSceneSessionManager.getInstance().startScene(toSceneInfo) -// HWSceneSessionManager.getInstance().requestSceneBackground(this) + SCBSceneSessionManager.getInstance().startScene(toSceneInfo); + } + + public async requestSessionActivation(): Promise { + this.isActive = true; + sceneSessionManager.requestSceneSessionActivation(this.session); + } + + public async requestSessionBackground(): Promise { + this.isActive = false; + sceneSessionManager.requestSceneSessionBackground(this.session); + } + + public async requestSessionDestruction(): Promise { + this.isActive = false; + sceneSessionManager.requestSceneSessionDestruction(this.session); } } diff --git a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts b/common/src/main/ets/WindowScene/scene/session/SCBSceneSessionManager.ts similarity index 30% rename from common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts rename to common/src/main/ets/WindowScene/scene/session/SCBSceneSessionManager.ts index 097a365b..1df83208 100644 --- a/common/src/main/ets/WindowScene/scene/session/HWSceneSessionManager.ts +++ b/common/src/main/ets/WindowScene/scene/session/SCBSceneSessionManager.ts @@ -13,56 +13,45 @@ * limitations under the License. */ -import sceneSessionManager from '@ohos.sceneSessionManager' import ServiceExtensionContext from 'application/ServiceExtensionContext' -import { HWRootSceneSession } from './HWRootSceneSession' -import { HWSceneInfo } from './HWSceneInfo' -import { HWSceneSession } from './HWSceneSession' -import { HWSceneContainerSession } from './HWSceneContainerSession' -import { HWScreenSession, DesktopState } from '../../screen/session/HWScreenSession' -import { HWScreenSessionManager } from '../../screen/session/HWScreenSessionManager' +import { SCBRootSceneSession } from './SCBRootSceneSession' +import { SCBSceneInfo } from './SCBSceneInfo' import { Log } from '../../../default/utils/Log' -const TAG = 'HWSceneSessionManager'; +const TAG = 'SCBSceneSessionManager'; /** * Scene session manager */ -export class HWSceneSessionManager { - private rootSceneSession: HWRootSceneSession; +export class SCBSceneSessionManager { + private rootSceneSession: SCBRootSceneSession; + private startSceneFuncMap: Map = new Map(); + private backgroundSceneFuncMap: Map = new Map(); + private destroySceneFuncMap: Map = new Map(); + private activateSceneFuncMap: Map = new Map(); + public mainScreenId: number = -1; private constructor() { - this.rootSceneSession = new HWRootSceneSession(); + this.rootSceneSession = new SCBRootSceneSession(); } /** * Get the singleton of the scene session manager. */ - static getInstance(): HWSceneSessionManager { - if (!globalThis.HWSceneSessionManagerInstance) { - globalThis.HWSceneSessionManagerInstance = new HWSceneSessionManager(); + static getInstance(): SCBSceneSessionManager { + if (!globalThis.SCBSceneSessionManagerInstance) { + globalThis.SCBSceneSessionManagerInstance = new SCBSceneSessionManager(); } - return globalThis.HWSceneSessionManagerInstance; + return globalThis.SCBSceneSessionManagerInstance; } - private async requestSceneSessionActivation(sceneSession: HWSceneSession): Promise { - sceneSessionManager.requestSceneSessionActivation(sceneSession.session); - } - - private async requestSceneSessionBackground(sceneSession: HWSceneSession): Promise { - sceneSessionManager.requestSceneSessionBackground(sceneSession.session); - } - - private async requestSceneSessionDestruction(sceneSession: HWSceneSession): Promise { - sceneSessionManager.requestSceneSessionDestruction(sceneSession.session); - } /** * Get the session of the root scene. * @return Session of the root scene */ - public getRootSceneSession(): HWRootSceneSession { + public getRootSceneSession(): SCBRootSceneSession { return this.rootSceneSession; } @@ -75,128 +64,134 @@ export class HWSceneSessionManager { this.rootSceneSession.loadContent(path, context); } - /** - * Start a scene. - * @param sceneInfo The info of the scene which to be activated - */ - public startScene(sceneInfo: HWSceneInfo) { - Log.showInfo(TAG, 'start scene:' + ' bundle:' + sceneInfo.bundleName + ' ability:' + sceneInfo.abilityName + - ' screenId:' + sceneInfo.screenId + ' isNewInstance:' + sceneInfo.isNewInstance); - let screenSession: HWScreenSession = null; - if (sceneInfo.screenId === -1) { - screenSession = HWScreenSessionManager.getInstance().getMainScreenSession(); - sceneInfo.screenId = screenSession.session.screenId; - } else { - screenSession = HWScreenSessionManager.getInstance().getScreenSession(sceneInfo.screenId); + public registerStartSceneCallback(screenId:number, callback: Function): void { + if (this.startSceneFuncMap.has(screenId)) { + Log.showError(TAG, `StartSceneFunc alreay exists with screenId: ${screenId}`); + return; } + Log.showInfo(TAG, `Register StartSceneFunc with screenId: ${screenId}`); + this.startSceneFuncMap.set(screenId, callback); + } - if (screenSession == null) { - Log.showError(TAG, 'Failed to get screen session!'); + public unRegisterSceneCallback(screenId: number): void { + if (!this.startSceneFuncMap.has(screenId)) { + Log.showError(TAG, `Failed to find startSceneFunc with screenId: ${screenId}`); return; } + this.startSceneFuncMap.delete(screenId); + this.backgroundSceneFuncMap.delete(screenId); + this.destroySceneFuncMap.delete(screenId); + this.activateSceneFuncMap.delete(screenId); + } - let sceneSession = this.requestSceneSession(sceneInfo, screenSession); - if (sceneSession == null) { - Log.showError(TAG, 'Failed to request scene session!'); + public registerActivateSceneCallback(screenId:number, callback: Function): void { + if (this.activateSceneFuncMap.has(screenId)) { + Log.showError(TAG, `ActivateSceneFunc alreay exists with screenId: ${screenId}`); return; } + this.activateSceneFuncMap.set(screenId, callback); + } - if (screenSession.desktopState === DesktopState.HOME) { - let sceneContainerSession = screenSession.getSceneContainerSession(sceneSession); - if (sceneContainerSession === null) { - sceneContainerSession = new HWSceneContainerSession(sceneSession, screenSession.bounds); - screenSession.addSceneContainerSession(sceneContainerSession); - } - this.requestSceneContainerActivation(sceneContainerSession); - screenSession.enterAppView(sceneContainerSession); - } else if (screenSession.desktopState === DesktopState.SPLIT) { - let sceneContainerSession = screenSession.getSceneContainerSession(sceneSession); - if (sceneContainerSession !== null) { - screenSession.removeSceneContainerSession(sceneContainerSession); - } - let activeSceneContainerSession = screenSession.getActiveSceneContainerSession(); - activeSceneContainerSession.addSceneSession(sceneSession); - this.requestSceneSessionActivation(sceneSession); - screenSession.enterAppView(activeSceneContainerSession); + public registerBackgroundSceneCallback(screenId:number, callback: Function): void { + if (this.backgroundSceneFuncMap.has(screenId)) { + Log.showError(TAG, `BackgroundSceneFunc alreay exists with screenId: ${screenId}`); + return; } + this.backgroundSceneFuncMap.set(screenId, callback); } - private requestSceneSession(sceneInfo: HWSceneInfo, screenSession: HWScreenSession): HWSceneSession { - if (screenSession == null) { - Log.showError(TAG, 'The screen session is null!'); - return null; + public registerDestroySceneCallback(screenId:number, callback: Function): void { + if (this.destroySceneFuncMap.has(screenId)) { + Log.showError(TAG, `DestroySceneFunc alreay exists with screenId: ${screenId}`); + return; } + this.destroySceneFuncMap.set(screenId, callback); + } - let hwSceneSession = screenSession.getSceneSession(sceneInfo); - if (hwSceneSession == null || sceneInfo.isNewInstance) { - let sceneSession = sceneSessionManager.requestSceneSession({ - bundleName: sceneInfo.bundleName, - abilityName: sceneInfo.abilityName - }); - hwSceneSession = new HWSceneSession(sceneSession, sceneInfo); + /** + * Start a scene. + * @param sceneInfo The info of the scene which to be activated + */ + public startScene(sceneInfo: SCBSceneInfo) { + Log.showInfo(TAG, 'start scene:' + ' bundle:' + sceneInfo.bundleName + ' ability:' + sceneInfo.abilityName + + ' screenId:' + sceneInfo.screenId + ' isNewInstance:' + sceneInfo.isNewInstance); + if (this.startSceneFuncMap.size == 0) { + Log.showError(TAG, 'No start scene func from scenePanel has registered!'); + return; } - - return hwSceneSession; + let screenId = -1; + if (sceneInfo.screenId === -1) { + screenId = this.mainScreenId; + } else { + screenId = sceneInfo.screenId; + } + if (!this.startSceneFuncMap.has(screenId)) { + Log.showError(TAG, `No start scene func has registered screenId: ${this.mainScreenId}!`); + return; + } + Log.showInfo(TAG, `Start scene on screen with screenId: ${screenId}!`); + this.startSceneFuncMap.get(screenId)(sceneInfo); } /** * Request the scene container session activation. * @param sceneContainerSession The session of the scene container which to be activated. */ - public requestSceneContainerActivation(sceneContainerSession: HWSceneContainerSession) { - if (sceneContainerSession === null) { - Log.showError(TAG, 'The scene container session is null!'); + public requestSceneContainerActivation(screenId: number, containerId: number) { + if (this.activateSceneFuncMap.size == 0) { + Log.showError(TAG, 'No activate scene func from scenePanel has registered!'); return; + }; + if (screenId === -1) { + screenId = this.mainScreenId; } - if (sceneContainerSession.isActive) { - Log.showError(TAG, 'The scene is already active.'); + if (!this.activateSceneFuncMap.has(screenId)) { + Log.showError(TAG, 'No activate scene func has registered screenId: ${this.mainScreenId}!`'); return; } - - Log.showInfo(TAG, 'Request scene container session activation, id: ' + sceneContainerSession.containerId); - sceneContainerSession.isActive = true; - this.requestSceneSessionActivation(sceneContainerSession.primarySession); - if (sceneContainerSession.isSplit) { - this.requestSceneSessionActivation(sceneContainerSession.secondarySession); - } + Log.showInfo(TAG, `activate scene: ${containerId} on screen with screenId: ${screenId}!`); + this.activateSceneFuncMap.get(screenId)(containerId); } /** * Request the scene container session background. * @param sceneContainerSession The session of the scene container which to be background. */ - public requestSceneContainerBackground(sceneContainerSession: HWSceneContainerSession) { - if (sceneContainerSession === null) { - Log.showError(TAG, 'The scene container session is null!'); + // todo: change with emitter + public requestSceneContainerBackground(screenId: number, containerId: number) { + if (this.backgroundSceneFuncMap.size == 0) { + Log.showError(TAG, 'No background scene func from scenePanel has registered!'); return; + }; + if (screenId === -1) { + screenId = this.mainScreenId; } - if (!sceneContainerSession.isActive) { - Log.showError(TAG, 'The scene is already background.'); + if (!this.backgroundSceneFuncMap.has(screenId)) { + Log.showError(TAG, 'No background scene func has registered screenId: ${this.mainScreenId}!`'); return; } - - Log.showInfo(TAG, 'Request scene container session background, id: ' + sceneContainerSession.containerId); - sceneContainerSession.isActive = false; - this.requestSceneSessionBackground(sceneContainerSession.primarySession); - if (sceneContainerSession.isSplit) { - this.requestSceneSessionBackground(sceneContainerSession.secondarySession); - } + Log.showInfo(TAG, `background scene on screen with screenId: ${screenId}!`); + this.backgroundSceneFuncMap.get(screenId)(containerId); } /** * Request the scene container session destruction. * @param sceneContainerSession The session of the scene container which to be destroyed. */ - public requestSceneContainerDestruction(sceneContainerSession: HWSceneContainerSession) { - if (sceneContainerSession === null) { - Log.showError(TAG, 'The scene container session is null!'); + public requestSceneContainerDestruction(screenId: number, containerId: number) { + if (this.destroySceneFuncMap.size == 0) { + Log.showError(TAG, 'No destroy scene func from scenePanel has registered!'); return; + }; + Log.showInfo(TAG, 'Request scene container session destruction, id: ' + containerId); + if (screenId === -1) { + screenId = this.mainScreenId; } - - Log.showInfo(TAG, 'Request scene container session destruction, id: ' + sceneContainerSession.containerId); - this.requestSceneSessionDestruction(sceneContainerSession.primarySession); - if (sceneContainerSession.isSplit) { - this.requestSceneSessionDestruction(sceneContainerSession.secondarySession); + if (!this.destroySceneFuncMap.has(screenId)) { + Log.showError(TAG, 'No destroy scene func has registered screenId: ${this.mainScreenId}!`'); + return; } + Log.showInfo(TAG, `Destroy scene on screen with screenId: ${screenId}!`); + this.destroySceneFuncMap.get(screenId)(containerId); } } diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts b/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts deleted file mode 100644 index 37e93b12..00000000 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSession.ts +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (c) 2023 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 screenSessionManager from '@ohos.screenSessionManager' -import { HWSceneSession } from '../../scene/session/HWSceneSession' -import { HWSceneContainerSession } from '../../scene/session/HWSceneContainerSession' -import { HWRecentViewParam } from '../../scene/session/HWRecentViewParam'; -import { Log } from '../../../default/utils/Log' -import { HWSceneInfo } from '../../scene/session/HWSceneInfo' - -const TAG = 'HWScreenSession' - -@Observed -export class SceneContainerSessionArray extends Array { -} - -export enum DesktopState { - HOME, - APP, - SPLIT, - RECENT, - DRAGGING -} - -/** - * Session of a screen. - */ -@Observed -export class HWScreenSession { - public readonly session: screenSessionManager.ScreenSession; - // Unit: px - public bounds: screenSessionManager.RRect = { - left: 0, - top: 0, - width: 0, - height: 0, - radius: 0 - }; - public rotation: number = 0; - public sceneContainerSessionList: SceneContainerSessionArray = new SceneContainerSessionArray(); - public recentViewParam: HWRecentViewParam = new HWRecentViewParam(); - public desktopState: DesktopState = DesktopState.HOME; - - /** - * Constructor. - * @param session Session of the screen - */ - constructor(session: screenSessionManager.ScreenSession) { - this.session = session - this.session.on('connect', (screenProperty: screenSessionManager.ScreenProperty) => { - this.onScreenConnect(screenProperty) - }) - this.session.on('disconnect', () => { - this.onScreenDisconnect() - }) - this.session.on('propertyChange', (screenProperty: screenSessionManager.ScreenProperty) => { - this.onScreenPropertyChange(screenProperty) - }) - } - - private updateProperty(screenProperty: screenSessionManager.ScreenProperty) { - this.bounds = { - left: screenProperty.bounds.left, - top: screenProperty.bounds.top, - width: screenProperty.bounds.width, - height: screenProperty.bounds.height, - radius: screenProperty.bounds.radius - } - this.rotation = screenProperty.rotation - Log.showInfo(TAG, `Update screen bounds[${this.bounds.left}, ${this.bounds.top}, - ${this.bounds.width}, ${this.bounds.height}]`) - } - - private onScreenConnect(screenProperty: screenSessionManager.ScreenProperty): void { - Log.showInfo(TAG, 'On screen connection.') - this.updateProperty(screenProperty) - } - - private onScreenDisconnect(): void { - Log.showInfo(TAG, 'On screen disconnection.') - } - - private onScreenPropertyChange(screenProperty: screenSessionManager.ScreenProperty): void { - Log.showInfo(TAG, 'On screen property change.') - this.updateProperty(screenProperty) - } - - /** - * Add the scene container session to this screen. - * @param sceneContainerSession The scene container session which will be added to this screen. - */ - public addSceneContainerSession(sceneContainerSession: HWSceneContainerSession): void { - const index = this.sceneContainerSessionList.findIndex(item => { - return item.containerId === sceneContainerSession.containerId; - }); - if (index == -1) { - Log.showInfo(TAG, 'Add scene container session, id: ' + sceneContainerSession.containerId); - this.sceneContainerSessionList.push(sceneContainerSession); - } - } - - /** - * Remove the scene container session from this screen. - * @param sceneContainerSession The scene container session which will be removed from this screen. - */ - public removeSceneContainerSession(sceneContainerSession: HWSceneContainerSession): void { - const index = this.sceneContainerSessionList.findIndex((item) => { - return item.containerId === sceneContainerSession.containerId; - }); - if (index != -1) { - Log.showInfo(TAG, 'Remove scene container session, id: ' + sceneContainerSession.containerId); - this.sceneContainerSessionList.splice(index, 1); - } - } - - /** - * Get the scene session by the scene information. - * @param sceneInfo The information of the scene - * @return Session of the scene - */ - public getSceneSession(sceneInfo: HWSceneInfo): HWSceneSession { - for (let i = 0; i < this.sceneContainerSessionList.length; ++i) { - let primarySession = this.sceneContainerSessionList[i].primarySession; - let secondarySession = this.sceneContainerSessionList[i].secondarySession; - if (primarySession && - primarySession.sceneInfo.bundleName == sceneInfo.bundleName && - primarySession.sceneInfo.abilityName == sceneInfo.abilityName) { - return primarySession; - } - if (secondarySession && - secondarySession.sceneInfo.bundleName == sceneInfo.bundleName && - secondarySession.sceneInfo.abilityName == sceneInfo.abilityName) { - return secondarySession; - } - } - return null; - } - - public getSceneContainerSession(sceneSession: HWSceneSession): HWSceneContainerSession { - if (sceneSession === null) { - return null; - } - const index = this.sceneContainerSessionList.findIndex((item) => { - return item.primarySession === sceneSession || item.secondarySession === sceneSession; - }); - if (index === -1) { - return null; - } - return this.sceneContainerSessionList[index]; - } - - public getActiveSceneContainerSession(): HWSceneContainerSession { - const index = this.sceneContainerSessionList.findIndex((item) => { - return item.isActive === true; - }); - if (index === -1) { - Log.showError(TAG, 'Failed to find active scene container session.'); - return null; - } - return this.sceneContainerSessionList[index]; - } - - public enterHomeView() { - this.desktopState = DesktopState.HOME; - this.recentViewParam.init(); - } - - public enterAppView(sceneContainerSession: HWSceneContainerSession) { - this.desktopState = DesktopState.APP; - this.recentViewParam.init(); - sceneContainerSession.init(); - - // To move the sceneContainerSession to the last of list. - this.removeSceneContainerSession(sceneContainerSession); - this.addSceneContainerSession(sceneContainerSession); - } - - public enterRecentView() { - this.desktopState = DesktopState.RECENT; - this.recentViewParam.translateX = 0; - this.recentViewParam.translateY = 0; - this.recentViewParam.scaleX = 1; - this.recentViewParam.scaleY = 1; - this.recentViewParam.centerX = '50%'; - this.recentViewParam.centerY = '50%'; - this.recentViewParam.borderRadius = 35; - this.recentViewParam.offsetX = 0; - this.recentViewParam.offsetY = 0; - this.recentViewParam.width = "70%" - this.recentViewParam.height = "70%" - this.recentViewParam.margin = 0 - } - - public enterSplitView() { - this.desktopState = DesktopState.SPLIT; - this.recentViewParam.init(); - } -} diff --git a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ts b/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ts deleted file mode 100644 index e0be604c..00000000 --- a/common/src/main/ets/WindowScene/screen/session/HWScreenSessionManager.ts +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2023 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 screenSessionManager from '@ohos.screenSessionManager' -import { HWScreenSession } from './HWScreenSession' -import { Log } from '../../../default/utils/Log' - -const TAG = 'HWScreenSessionManager' - -/** - * Screen session manager. - */ -export class HWScreenSessionManager { - private screenSessionList: HWScreenSession[] = [] - - private constructor() { - this.screenSessionList = AppStorage.SetAndLink('screenSessionList', this.screenSessionList).get() - } - - /** - * Get the singleton of the screen session manager. - */ - static getInstance(): HWScreenSessionManager { - if (!globalThis.HWScreenSessionManagerInstance) { - globalThis.HWScreenSessionManagerInstance = new HWScreenSessionManager() - } - - return globalThis.HWScreenSessionManagerInstance - } - - /** - * Init the screen session manager. - */ - public init(): void { - this.registerScreenConnectionListener() - } - - private registerScreenConnectionListener(): void { - screenSessionManager.on('screenConnectChange', ({ screenSession, screenConnectChangeType }) => { - this.onScreenConnectChange(screenSession, screenConnectChangeType) - }) - } - - private onScreenConnectChange(session: screenSessionManager.ScreenSession, - changeType: screenSessionManager.ScreenConnectChangeType) { - Log.showInfo(TAG, 'On screen connect change, type:' + changeType + ' ' + session.screenId) - if (changeType === screenSessionManager.ScreenConnectChangeType.CONNECT) { - this.onScreenConnect(session) - } - - if (changeType === screenSessionManager.ScreenConnectChangeType.DISCONNECT) { - this.onScreenDisconnect(session) - } - } - - private onScreenConnect(session: screenSessionManager.ScreenSession): void { - Log.showInfo(TAG, 'On screen connect.') - let screenSession: HWScreenSession = new HWScreenSession(session) - this.addScreenSession(screenSession) - } - - private onScreenDisconnect(session: screenSessionManager.ScreenSession): void { - Log.showInfo(TAG, 'On screen disconnect.') - this.removeScreenSession(session.screenId) - } - - private addScreenSession(screenSession: HWScreenSession) { - const screenSessionIndex = this.screenSessionList.findIndex(item => { - return item.session.screenId === screenSession.session.screenId - }) - if (screenSessionIndex != -1) { - Log.showError(TAG, 'Failed to add screen session, screen id:' + screenSession.session.screenId) - return - } - - this.screenSessionList.push(screenSession) - } - - private removeScreenSession(screenId: number) { - const screenSessionIndex = this.screenSessionList.findIndex(item => { - return item.session.screenId === screenId - }) - if (screenSessionIndex == -1) { - Log.showError(TAG, 'Failed to remove screen session, screen id:' + screenId) - return - } - - this.screenSessionList.splice(screenSessionIndex, 1) - } - - /** - * Get the screen session by screen id. - * @param screenId Id of the screen - * @return Session of the screen - */ - public getScreenSession(screenId: number): HWScreenSession { - const screenSessionIndex = this.screenSessionList.findIndex(item => { - return item.session.screenId === screenId - }) - if (screenSessionIndex == -1) { - Log.showError(TAG, 'Failed to get screen session, screen id:' + screenId) - return null - } - - return this.screenSessionList[screenSessionIndex] - } - - /** - * Get the root screen session. - * @return Session of the main screen - */ - public getMainScreenSession(): HWScreenSession { - if (this.screenSessionList.length > 0) { - return this.screenSessionList[0] - } - - return null - } -} diff --git a/common/src/main/ets/WindowScene/screen/session/SCBScreenSession.ts b/common/src/main/ets/WindowScene/screen/session/SCBScreenSession.ts new file mode 100644 index 00000000..5e5295de --- /dev/null +++ b/common/src/main/ets/WindowScene/screen/session/SCBScreenSession.ts @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2023 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 screenSessionManager from '@ohos.screenSessionManager' +import { SCBSceneContainerSessionArray } from '../../scene/session/SCBSceneContainerSession' +import { Log } from '../../../default/utils/Log' + +const TAG = 'SCBScreenSession' + +@Observed +export class SCBScreenProperty { + left: number = 0; + top: number = 0; + width: number = 0; + height: number = 0; + radius: number = 0; + rotation: number = 0; + screenId: number = -1; + + constructor() { + } + + update(screenProperty: screenSessionManager.ScreenProperty) { + this.left = screenProperty.bounds.left; + this.top = screenProperty.bounds.top; + this.width = screenProperty.bounds.width; + this.height = screenProperty.bounds.height; + this.radius = screenProperty.bounds.radius; + this.rotation = screenProperty.rotation; + } +} + +/** + * Session of a screen. + */ +@Observed +export class SCBScreenSession { + public readonly session: screenSessionManager.ScreenSession; + // Unit: px + public bounds: screenSessionManager.RRect = { + left: 0, + top: 0, + width: 0, + height: 0, + radius: 0 + }; + public rotation: number = 0; + onPropertyChange: Function; + + /** + * Constructor. + * @param session Session of the screen + */ + constructor(session: screenSessionManager.ScreenSession) { + this.session = session; + this.session.on('connect', (screenProperty: screenSessionManager.ScreenProperty) => { + this.onScreenConnect(screenProperty); + }) + this.session.on('disconnect', () => { + this.onScreenDisconnect(); + }) + this.session.on('propertyChange', (screenProperty: screenSessionManager.ScreenProperty) => { + this.onScreenPropertyChange(screenProperty); + }) + } + + registerPropertyChange(func: Function) { + Log.showInfo(TAG, 'registerPropertyChange ') + this.onPropertyChange = func + this.onPropertyChange && this.onPropertyChange({ + bounds: this.bounds, + rotation: this.rotation, + }) + } + + public updateProperty(screenProperty: screenSessionManager.ScreenProperty) { + this.bounds = { + left: screenProperty.bounds.left, + top: screenProperty.bounds.top, + width: screenProperty.bounds.width, + height: screenProperty.bounds.height, + radius: screenProperty.bounds.radius + } + this.rotation = screenProperty.rotation; + this.onPropertyChange && this.onPropertyChange(screenProperty) + Log.showInfo(TAG, `Update screen bounds[${this.bounds.left}, ${this.bounds.top}, + ${this.bounds.width}, ${this.bounds.height}]`) + } + + private onScreenConnect(screenProperty: screenSessionManager.ScreenProperty): void { + Log.showInfo(TAG, 'On screen connection.'); + this.updateProperty(screenProperty); + } + + private onScreenDisconnect(): void { + Log.showInfo(TAG, 'On screen disconnection.'); + } + + private onScreenPropertyChange(screenProperty: screenSessionManager.ScreenProperty): void { + Log.showInfo(TAG, 'On screen property change.'); + this.updateProperty(screenProperty); + } +} diff --git a/common/src/main/ets/default/constants/StyleConstants.ts b/common/src/main/ets/default/constants/StyleConstants.ts index d6fb0e04..a560e826 100644 --- a/common/src/main/ets/default/constants/StyleConstants.ts +++ b/common/src/main/ets/default/constants/StyleConstants.ts @@ -67,7 +67,8 @@ export class StyleConstants { static readonly PERCENTAGE_75 = '75%'; static readonly PERCENTAGE_70 = '70%'; static readonly PERCENTAGE_15 = '15%'; - static readonly PERCENTAGE_DIVIDER_HEIGHT = '2%'; + static readonly DIVIDER_HEIGHT = 8; + static readonly DIVIDER_BUTTON_WIDTH = '46vp'; static readonly DEFAULT_APP_IMAGE = '/common/pics/img_app_default.png'; static readonly DEFAULT_DELETE_IMAGE = '/common/pics/ic_public_delete.svg'; static readonly DEFAULT_BACKGROUND_IMAGE_RECENT = '/common/pics/ic_wallpaper_recent.jpg'; @@ -126,6 +127,7 @@ export class StyleConstants { static readonly DEFAULT_SMART_DOCK_MISSION_MERGIN_BOTTOM = 6; static readonly DEFAULT_SMART_DOCK_MISSION_MERGIN_RIGHT = 2; static readonly DEFAULT_SMART_DOCK_MISSION_IMAGE_HEIGHT = 80; + static readonly DEFAULT_SPLIT_EXIT_RATIO = 0.1; //image resources static readonly DEFAULT_FORM_MGR_BACKGROUND_IMAGE = '/common/pics/ic_wallpaper_form_manager.jpg'; @@ -174,4 +176,11 @@ export class StyleConstants { // the dpi of phone should be 480, but it is 320 currently. // so all dimensions have to be multiplied by 1.5 static readonly DPI_RATIO = 1; + + // gesture model + static readonly GESTURE_KEY = 'gestureModel' + static readonly RECENT_MARGIN = 50 + + // recent + static readonly RECENT_SCALE = 0.7 } \ No newline at end of file diff --git a/common/src/main/ets/default/manager/LauncherAbilityManager.ts b/common/src/main/ets/default/manager/LauncherAbilityManager.ts index a2b05236..50fab10e 100644 --- a/common/src/main/ets/default/manager/LauncherAbilityManager.ts +++ b/common/src/main/ets/default/manager/LauncherAbilityManager.ts @@ -26,8 +26,8 @@ import { CommonConstants } from '../constants/CommonConstants'; import { ResourceManager } from './ResourceManager'; import { EventConstants } from '../constants/EventConstants'; import { BadgeManager } from '../manager/BadgeManager'; -import { HWSceneSessionManager } from '../../WindowScene/scene/session/HWSceneSessionManager' -import { HWSceneInfo } from '../../WindowScene/scene/session/HWSceneInfo' +import { SCBSceneSessionManager } from '../../WindowScene/scene/session/SCBSceneSessionManager' +import { SCBSceneInfo } from '../../WindowScene/scene/session/SCBSceneInfo' const TAG = 'LauncherAbilityManager'; @@ -278,8 +278,8 @@ class LauncherAbilityManager { // Log.showError(TAG, `startApplication promise error: ${JSON.stringify(err)}`); // }); - let sceneInfo = new HWSceneInfo(paramBundleName, paramAbilityName) - HWSceneSessionManager.getInstance().startScene(sceneInfo) + let sceneInfo = new SCBSceneInfo(paramBundleName, paramAbilityName) + SCBSceneSessionManager.getInstance().startScene(sceneInfo) const sysEventInfo = { domain: 'LAUNCHER_APP', diff --git a/product/phone/src/main/ets/MainAbility/MainAbility.ts b/product/phone/src/main/ets/MainAbility/MainAbility.ts index d9acf9f7..db5623d0 100644 --- a/product/phone/src/main/ets/MainAbility/MainAbility.ts +++ b/product/phone/src/main/ets/MainAbility/MainAbility.ts @@ -20,8 +20,7 @@ import { Log } from '@ohos/common'; import { windowManager } from '@ohos/common'; import { RdbStoreManager } from '@ohos/common'; import { FormConstants } from '@ohos/common'; -import { HWSceneSessionManager } from '@ohos/common' -import { HWScreenSessionManager } from '@ohos/common' +import { SCBSceneSessionManager } from '@ohos/common' import { GestureNavigationManager } from '@ohos/gesturenavigation'; import StyleConstants from '../common/constants/StyleConstants'; import { navigationBarCommonEventManager } from '@ohos/common'; @@ -70,8 +69,7 @@ export default class MainAbility extends ServiceExtensionAbility { // // load recent // windowManager.createRecentWindow(); - HWScreenSessionManager.getInstance().init(); - HWSceneSessionManager.getInstance().loadContent('pages/EntryView', this.context); + SCBSceneSessionManager.getInstance().loadContent('pages/EntryView', this.context); } private initGlobalConst(): void { diff --git a/product/phone/src/main/ets/WindowScene/HWDesktop.ets b/product/phone/src/main/ets/SceneBoard/SCBDesktop.ets similarity index 96% rename from product/phone/src/main/ets/WindowScene/HWDesktop.ets rename to product/phone/src/main/ets/SceneBoard/SCBDesktop.ets index dc98c9b9..28d5244d 100644 --- a/product/phone/src/main/ets/WindowScene/HWDesktop.ets +++ b/product/phone/src/main/ets/SceneBoard/SCBDesktop.ets @@ -1,147 +1,147 @@ -/* - * Copyright (c) 2023 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 { Log } from '@ohos/common'; -import { CommonConstants } from '@ohos/common'; -import { EventConstants } from '@ohos/common'; -import { localEventManager } from '@ohos/common'; -import { SettingsModel } from '@ohos/common'; -import { LayoutViewModel } from '@ohos/common'; -import { SmartDock } from '@ohos/smartdock'; -import { PageDesktopLayout } from '@ohos/pagedesktop'; -import { FolderOpenComponent } from '@ohos/bigfolder'; -import { BigFolderConstants } from '@ohos/bigfolder'; -import PhoneStage from '../common/PhoneStage'; -import screenSessionManager from '@ohos.screenSessionManager'; - -const TAG = "HWDesktop"; - -@Component -export struct HWDesktop { - public bounds: screenSessionManager.RRect - @StorageLink('screenWidth') screenWidth: number = 0; - @StorageLink('screenHeight') @Watch('updateScreenInfo') screenHeight: number = 0; - @StorageLink('deviceType') deviceType: string = CommonConstants.DEFAULT_DEVICE_TYPE; - @State workSpaceWidth: number = 0; - @State workSpaceHeight: number = 0; - @State dockHeight: number = 0; - private mStage: PhoneStage = new PhoneStage(); - private mLayoutViewModel: LayoutViewModel; - private navigationBarStatus: string | undefined = '0'; - - aboutToAppear(): void { - Log.showInfo(TAG, 'aboutToAppear'); - this.mStage.onCreate(); - - // init layout config - this.mLayoutViewModel = LayoutViewModel.getInstance(); - this.getWindowSize(); - this.updateScreenSize(); - - this.registerPageDesktopNavigatorStatusChangeEvent(this.mLocalEventListener); - // this.navigationBarStatus = SettingsModel.getInstance().getValue(); - } - - registerPageDesktopNavigatorStatusChangeEvent(listener): void { - localEventManager.registerEventListener(listener, [EventConstants.EVENT_NAVIGATOR_BAR_STATUS_CHANGE]); - } - - private readonly mLocalEventListener = { - onReceiveEvent: (event, params) => { - Log.showDebug(TAG, `receive event: ${event}, params: ${params}`); - if (event === EventConstants.EVENT_NAVIGATOR_BAR_STATUS_CHANGE) { - this.navigationBarStatus = params; - this.updateScreenInfo(); - } - } - }; - - aboutToDisappear(): void { - this.mStage.onDestroy(); - Log.showInfo(TAG, 'aboutToDisappear'); - } - - onBackPress(): boolean { - Log.showInfo(TAG, 'onBackPress'); - ContextMenu.close(); - AppStorage.SetOrCreate('dialogControllerStatus', !AppStorage.Get('dialogControllerStatus')); - AppStorage.SetOrCreate('overlayMode', CommonConstants.OVERLAY_TYPE_HIDE); - AppStorage.SetOrCreate('openFolderStatus', BigFolderConstants.OPEN_FOLDER_STATUS_CLOSE); - return true; - } - - private updateScreenInfo(): void { - Log.showDebug(TAG, 'updateScreenInfo'); - if (this.screenWidth != 0 && this.screenHeight != 0) { - this.mLayoutViewModel.initScreen(this.navigationBarStatus); - globalThis.SmartDockStyleConfig.initConfig(); - globalThis.PhonePageDesktopGridStyleConfig.initConfig(); - globalThis.BigFolderStyleConfigInstance.initConfig(); - globalThis.FormStyleConfigInstance.initConfig(); - this.updateScreenSize(); - } - } - - private async getWindowSize(): Promise { - try { - this.screenWidth = px2vp(this.bounds.width); - this.screenHeight = px2vp(this.bounds.height); - AppStorage.SetOrCreate('screenWidth', this.screenWidth); - AppStorage.SetOrCreate('screenHeight', this.screenHeight); - } catch (error) { - Log.showError(TAG, `getWindowWidth or getWindowHeight error: ${error}`); - } - } - - private updateScreenSize(): void { - this.workSpaceWidth = this.screenWidth; - this.workSpaceHeight = this.mLayoutViewModel.getWorkSpaceHeight(); - this.dockHeight = this.mLayoutViewModel.getDockHeight(); - AppStorage.SetOrCreate('workSpaceWidth', this.workSpaceWidth); - AppStorage.SetOrCreate('workSpaceHeight', this.workSpaceHeight); - AppStorage.SetOrCreate('dockHeight', this.dockHeight); - Log.showDebug(TAG, `updateScreenSize product: ${this.deviceType}, screenWidth: ${this.screenWidth}, screenHeight: ${this.screenHeight}, - workSpaceWidth: ${this.workSpaceWidth}, workSpaceHeight: ${this.workSpaceHeight}, dockHeight: ${this.dockHeight}`); - } - - build() { - Stack() { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - Column() { - PageDesktopLayout(); - } - .height(this.workSpaceHeight) - .onAreaChange((oldValue: Area, newValue: Area): void => { - Log.showDebug(TAG, `onAreaChange navigationBarStatus: ${this.navigationBarStatus}`); - if (JSON.stringify(oldValue) == JSON.stringify(newValue)) return; - if (this.navigationBarStatus == "1") { - setTimeout(() => { - SettingsModel.getInstance().setValue(this.navigationBarStatus); - }, 50) - } - }) - - Column() { - SmartDock(); - } - .height(this.dockHeight) - } - - FolderOpenComponent(); - } - .width('100%') - .height('100%') - } +/* + * Copyright (c) 2023 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 { Log } from '@ohos/common'; +import { CommonConstants } from '@ohos/common'; +import { EventConstants } from '@ohos/common'; +import { localEventManager } from '@ohos/common'; +import { SettingsModel } from '@ohos/common'; +import { LayoutViewModel } from '@ohos/common'; +import { SmartDock } from '@ohos/smartdock'; +import { PageDesktopLayout } from '@ohos/pagedesktop'; +import { FolderOpenComponent } from '@ohos/bigfolder'; +import { BigFolderConstants } from '@ohos/bigfolder'; +import PhoneStage from '../common/PhoneStage'; +import screenSessionManager from '@ohos.screenSessionManager'; + +const TAG = "SCBDesktop"; + +@Component +export struct SCBDesktop { + public bounds: screenSessionManager.RRect + @StorageLink('screenWidth') screenWidth: number = 0; + @StorageLink('screenHeight') @Watch('updateScreenInfo') screenHeight: number = 0; + @StorageLink('deviceType') deviceType: string = CommonConstants.DEFAULT_DEVICE_TYPE; + @State workSpaceWidth: number = 0; + @State workSpaceHeight: number = 0; + @State dockHeight: number = 0; + private mStage: PhoneStage = new PhoneStage(); + private mLayoutViewModel: LayoutViewModel; + private navigationBarStatus: string | undefined = '0'; + + aboutToAppear(): void { + Log.showInfo(TAG, 'aboutToAppear'); + this.mStage.onCreate(); + + // init layout config + this.mLayoutViewModel = LayoutViewModel.getInstance(); + this.getWindowSize(); + this.updateScreenSize(); + + this.registerPageDesktopNavigatorStatusChangeEvent(this.mLocalEventListener); + // this.navigationBarStatus = SettingsModel.getInstance().getValue(); + } + + registerPageDesktopNavigatorStatusChangeEvent(listener): void { + localEventManager.registerEventListener(listener, [EventConstants.EVENT_NAVIGATOR_BAR_STATUS_CHANGE]); + } + + private readonly mLocalEventListener = { + onReceiveEvent: (event, params) => { + Log.showDebug(TAG, `receive event: ${event}, params: ${params}`); + if (event === EventConstants.EVENT_NAVIGATOR_BAR_STATUS_CHANGE) { + this.navigationBarStatus = params; + this.updateScreenInfo(); + } + } + }; + + aboutToDisappear(): void { + this.mStage.onDestroy(); + Log.showInfo(TAG, 'aboutToDisappear'); + } + + onBackPress(): boolean { + Log.showInfo(TAG, 'onBackPress'); + ContextMenu.close(); + AppStorage.SetOrCreate('dialogControllerStatus', !AppStorage.Get('dialogControllerStatus')); + AppStorage.SetOrCreate('overlayMode', CommonConstants.OVERLAY_TYPE_HIDE); + AppStorage.SetOrCreate('openFolderStatus', BigFolderConstants.OPEN_FOLDER_STATUS_CLOSE); + return true; + } + + private updateScreenInfo(): void { + Log.showDebug(TAG, 'updateScreenInfo'); + if (this.screenWidth != 0 && this.screenHeight != 0) { + this.mLayoutViewModel.initScreen(this.navigationBarStatus); + globalThis.SmartDockStyleConfig.initConfig(); + globalThis.PhonePageDesktopGridStyleConfig.initConfig(); + globalThis.BigFolderStyleConfigInstance.initConfig(); + globalThis.FormStyleConfigInstance.initConfig(); + this.updateScreenSize(); + } + } + + private async getWindowSize(): Promise { + try { + this.screenWidth = px2vp(this.bounds.width); + this.screenHeight = px2vp(this.bounds.height); + AppStorage.SetOrCreate('screenWidth', this.screenWidth); + AppStorage.SetOrCreate('screenHeight', this.screenHeight); + } catch (error) { + Log.showError(TAG, `getWindowWidth or getWindowHeight error: ${error}`); + } + } + + private updateScreenSize(): void { + this.workSpaceWidth = this.screenWidth; + this.workSpaceHeight = this.mLayoutViewModel.getWorkSpaceHeight(); + this.dockHeight = this.mLayoutViewModel.getDockHeight(); + AppStorage.SetOrCreate('workSpaceWidth', this.workSpaceWidth); + AppStorage.SetOrCreate('workSpaceHeight', this.workSpaceHeight); + AppStorage.SetOrCreate('dockHeight', this.dockHeight); + Log.showDebug(TAG, `updateScreenSize product: ${this.deviceType}, screenWidth: ${this.screenWidth}, screenHeight: ${this.screenHeight}, + workSpaceWidth: ${this.workSpaceWidth}, workSpaceHeight: ${this.workSpaceHeight}, dockHeight: ${this.dockHeight}`); + } + + build() { + Stack() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Column() { + PageDesktopLayout(); + } + .height(this.workSpaceHeight) + .onAreaChange((oldValue: Area, newValue: Area): void => { + Log.showDebug(TAG, `onAreaChange navigationBarStatus: ${this.navigationBarStatus}`); + if (JSON.stringify(oldValue) == JSON.stringify(newValue)) return; + if (this.navigationBarStatus == "1") { + setTimeout(() => { + SettingsModel.getInstance().setValue(this.navigationBarStatus); + }, 50) + } + }) + + Column() { + SmartDock(); + } + .height(this.dockHeight) + } + + FolderOpenComponent(); + } + .width('100%') + .height('100%') + } } \ No newline at end of file diff --git a/product/phone/src/main/ets/WindowScene/HWDivider.ets b/product/phone/src/main/ets/SceneBoard/SCBDivider.ets similarity index 45% rename from product/phone/src/main/ets/WindowScene/HWDivider.ets rename to product/phone/src/main/ets/SceneBoard/SCBDivider.ets index 3eb2767e..4fe3749a 100644 --- a/product/phone/src/main/ets/WindowScene/HWDivider.ets +++ b/product/phone/src/main/ets/SceneBoard/SCBDivider.ets @@ -13,35 +13,27 @@ * limitations under the License. */ -import { HWDividerParam, StyleConstants } from '@ohos/common' +import { SCBDividerParam, StyleConstants } from '@ohos/common' import { Log } from '@ohos/common' -import screenSessionManager from '@ohos.screenSessionManager' +import { SCBSceneSessionManager, SCBSceneContainerSession, SCBScreenProperty } from '@ohos/common' +import { SCBGestureAction, SCBGestureActionId } from '@ohos/common' -const TAG = 'HWDivider' +const TAG = 'SCBDivider' @Component -export struct HWDivider { - @Link dividerParam: HWDividerParam - screenBounds: screenSessionManager.RRect +export struct SCBDivider { + @Link dividerParam: SCBDividerParam + @Link sceneContainerSession: SCBSceneContainerSession; + @Link screenProperty: SCBScreenProperty; + onGestureChange: Function; buildLog1() { - Log.showInfo(TAG, "Action Update " + " priScaleY: " + this.dividerParam.primaryScaleY + " secScaleY: " + this.dividerParam.secondaryScaleY) - Log.showInfo(TAG, "event.offsetY: " + this.dividerParam.translateY) - return true - } - - buildLog2() { - Log.showInfo(TAG, "Action end primaryH: " + parseFloat(this.dividerParam.primaryH) + " secondaryH: " + parseFloat(this.getSecondaryH())) - return true - } - - buildLog3() { - Log.showInfo(TAG, "Action begin primaryH: " + parseFloat(this.dividerParam.primaryH) + " secondaryH: " + parseFloat(this.getSecondaryH())) + Log.showInfo(TAG, "Action begin primaryH: " + parseFloat(this.dividerParam.primaryH)) return true } getSecondaryH(): string { - let str = (100 - parseFloat(this.dividerParam.primaryH) - parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)).toString(); + let str = (100 - parseFloat(this.dividerParam.primaryH) - StyleConstants.DIVIDER_HEIGHT / this.screenProperty.height * 100).toString(); str += "%"; return str; } @@ -50,9 +42,10 @@ export struct HWDivider { // Divider Stack({ alignContent: Alignment.Center }) { Button() - .backgroundColor(Color.White) - .width('25%') - .height('80%') + .responseRegion({ x: 0, y: '-500%', width: '100%', height: '1100%' }) + .backgroundColor('#CCFFFFFF') + .width(StyleConstants.DIVIDER_BUTTON_WIDTH) + .height('50%') .gesture(PanGesture({ distance: 1 }) .onActionStart((event: GestureEvent) => { this.dividerParam.blurRadius = 50 @@ -60,9 +53,9 @@ export struct HWDivider { .onActionUpdate((event: GestureEvent) => { this.dividerParam.translateX = event.offsetX this.dividerParam.translateY = event.offsetY - let beginPrimaryH = px2vp(this.screenBounds.height) * parseFloat(this.dividerParam.primaryH) * 0.01 + let beginPrimaryH = px2vp(this.screenProperty.height) * parseFloat(this.dividerParam.primaryH) * 0.01 this.dividerParam.primaryScaleY = (beginPrimaryH + event.offsetY) / beginPrimaryH - let beginSecH = px2vp(this.screenBounds.height) * parseFloat(this.getSecondaryH()) * 0.01 + let beginSecH = px2vp(this.screenProperty.height) * parseFloat(this.getSecondaryH()) * 0.01 this.dividerParam.secondaryScaleY = (beginSecH - event.offsetY) / beginSecH this.dividerParam.secTransY = event.offsetY }) @@ -74,14 +67,33 @@ export struct HWDivider { this.dividerParam.secTransY = 0 this.dividerParam.primaryScaleY = 1 this.dividerParam.secondaryScaleY = 1 - let beginPrimaryH = px2vp(this.screenBounds.height) * parseFloat(this.dividerParam.primaryH) * 0.01 - this.dividerParam.primaryH = ((beginPrimaryH + event.offsetY) / px2vp(this.screenBounds.height)) * 100 + '%' + let beginPrimaryH = px2vp(this.screenProperty.height) * parseFloat(this.dividerParam.primaryH) * 0.01 + let heightRatio = (beginPrimaryH + event.offsetY) / px2vp(this.screenProperty.height); + this.dividerParam.primaryH = heightRatio * 100 + '%' this.dividerParam.blurRadius = 0 + if (this.buildLog1()){} + if (heightRatio < StyleConstants.DEFAULT_SPLIT_EXIT_RATIO) { + Log.showInfo(TAG, "exit primarySession with ratio: " + heightRatio) + this.dividerParam.init() + let action = new SCBGestureAction({ + id: SCBGestureActionId.EXIT_SPILT, + sessionId: this.sceneContainerSession.primarySession.session.persistentId, + }); + this.onGestureChange && this.onGestureChange(action); + } else if (heightRatio > (1 - StyleConstants.DEFAULT_SPLIT_EXIT_RATIO)) { + this.dividerParam.init() + Log.showInfo(TAG, "exit secondarySession with ratio: " + heightRatio) + let action = new SCBGestureAction({ + id: SCBGestureActionId.EXIT_SPILT, + sessionId: this.sceneContainerSession.secondarySession.session.persistentId, + }); + this.onGestureChange && this.onGestureChange(action); + } })) } .translate({ y: this.dividerParam.translateY }) .width('100%') - .height(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT) + .height(StyleConstants.DIVIDER_HEIGHT.toString() + 'vp') .backgroundColor(Color.Black) } } diff --git a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets b/product/phone/src/main/ets/SceneBoard/SCBGestureNavBar.ets similarity index 31% rename from product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets rename to product/phone/src/main/ets/SceneBoard/SCBGestureNavBar.ets index 61bf1830..c00908d3 100644 --- a/product/phone/src/main/ets/WindowScene/HWGestureNavBar.ets +++ b/product/phone/src/main/ets/SceneBoard/SCBGestureNavBar.ets @@ -13,21 +13,19 @@ * limitations under the License. */ -import { HWSceneContainerSession, HWDividerParam, HWRecentViewParam } from '@ohos/common'; -import { HWSceneSessionManager } from '@ohos/common'; -import { HWScreenSession, DesktopState } from '@ohos/common'; -import { Log } from '@ohos/common'; +import { SCBGestureModel ,SCBSceneContainerSessionArray} from '@ohos/common'; +import { SCBSceneSessionManager } from '@ohos/common'; +import { SCBGestureAction, SCBGestureActionId} from '@ohos/common'; +import { Log, Trace } from '@ohos/common'; import { StyleConstants } from '@ohos/common'; -const TAG = 'HWGestureNavBar'; +const TAG = 'SCBGestureNavBar'; @Component -export struct HWGestureNavBar { - @Link sceneContainerSession: HWSceneContainerSession; - @Link screenSession: HWScreenSession; - @Link dividerParam: HWDividerParam; - @Link recentViewParam: HWRecentViewParam; - +export struct SCBGestureNavBar { + @ObjectLink containerSessionList: SCBSceneContainerSessionArray; + @StorageLink('gestureModel') gestureModel: SCBGestureModel = new SCBGestureModel(); + onGestureChange: Function; build() { // Gesture navigation bar Stack({ alignContent: Alignment.Center }) { @@ -39,51 +37,60 @@ export struct HWGestureNavBar { .position({ y: '97%' }) .width('100%') .height('3%') - .backgroundColor(Color.Transparent) + .opacity(0) .gesture(PanGesture() .onActionStart((event: GestureEvent) => { - this.screenSession.desktopState = DesktopState.DRAGGING; - this.recentViewParam.margin = 50 - let scrollWidth = - this.screenSession.sceneContainerSessionList.length * px2vp(this.sceneContainerSession.screenBounds.width) + - (this.screenSession.sceneContainerSessionList.length - 1) * this.recentViewParam.margin; - this.recentViewParam.offsetX = px2vp(this.sceneContainerSession.screenBounds.width) - scrollWidth; - - this.recentViewParam.centerX = - (1 - px2vp(this.sceneContainerSession.screenBounds.width) / 2 / scrollWidth) * 100 + '%'; - this.recentViewParam.centerY = '100%'; + let action = new SCBGestureAction({ + id: SCBGestureActionId.SLIDE_UP_BEGIN + }); + this.onGestureChange && this.onGestureChange(action); }) .onActionUpdate((event: GestureEvent) => { - let translateRatio = 0.6 * Math.pow(this.recentViewParam.scaleX, 2) + 0.4; - this.recentViewParam.translateX = event.offsetX * translateRatio; - if (1 + event.offsetY / px2vp(this.sceneContainerSession.screenBounds.height) * 1.3 > 0.25) { - this.recentViewParam.translateY = event.offsetY; - } - - this.recentViewParam.scaleX = - 1 + this.recentViewParam.translateY / px2vp(this.sceneContainerSession.screenBounds.height) * 1.3; - this.recentViewParam.scaleX = Math.max(this.recentViewParam.scaleX, 0.25); - this.recentViewParam.scaleX = Math.min(this.recentViewParam.scaleX, 1); - this.recentViewParam.scaleY = this.recentViewParam.scaleX; + let action = new SCBGestureAction({ + id: SCBGestureActionId.SLIDING_UP, + gestureOffsetX: event.offsetX, + gestureOffsetY: event.offsetY + }); + this.onGestureChange && this.onGestureChange(action); }) .onActionEnd((event: GestureEvent) => { + const index = this.containerSessionList.findIndex((item) => { + return item.isActive === true; + }); + if (index === -1) { + Log.showError(TAG, 'Failed to find active scene container session.'); + return null; + } + let activeSceneContainerSession = this.containerSessionList[index]; + var action; if (event.offsetY < -400) { - HWSceneSessionManager.getInstance().requestSceneContainerBackground(this.sceneContainerSession); - this.screenSession.enterHomeView(); + SCBSceneSessionManager.getInstance().requestSceneContainerBackground(activeSceneContainerSession.screenProperty.screenId, activeSceneContainerSession.containerId); + action = new SCBGestureAction({ + id: SCBGestureActionId.HOME + }); } else if (event.offsetY < -200) { - this.dividerParam.primaryH = ((100 - parseFloat(StyleConstants.PERCENTAGE_DIVIDER_HEIGHT)) / 2) + '%'; - this.sceneContainerSession.isSplit = true; - this.screenSession.enterSplitView(); + activeSceneContainerSession.dividerParam.primaryH = ((100 - StyleConstants.DIVIDER_HEIGHT / activeSceneContainerSession.screenProperty.height * 100) / 2) + '%'; + if (!activeSceneContainerSession.isSplit) { + activeSceneContainerSession.isSplit = true; + action = new SCBGestureAction({ + id: SCBGestureActionId.ENTER_SPLIT + }); + } else { + action = new SCBGestureAction({ + id: SCBGestureActionId.ENTER_RECENT + }); + } } else if (event.offsetY < -100) { - let recentViewSceneSpace = 50; - let scrollWidth = - this.screenSession.sceneContainerSessionList.length * px2vp(this.sceneContainerSession.screenBounds.width) + - (this.screenSession.sceneContainerSessionList.length - 1) * recentViewSceneSpace; - this.recentViewParam.offsetX = px2vp(this.sceneContainerSession.screenBounds.width) - scrollWidth; - this.screenSession.enterRecentView(); + action = new SCBGestureAction({ + id: SCBGestureActionId.ENTER_RECENT + }); } else { - this.screenSession.enterAppView(this.sceneContainerSession); + action = new SCBGestureAction({ + id: SCBGestureActionId.FULLSCENE + }); + SCBSceneSessionManager.getInstance().requestSceneContainerActivation(activeSceneContainerSession.screenProperty.screenId, activeSceneContainerSession.containerId); } + this.onGestureChange && this.onGestureChange(action); })) } } diff --git a/product/phone/src/main/ets/SceneBoard/SCBScene.ets b/product/phone/src/main/ets/SceneBoard/SCBScene.ets new file mode 100644 index 00000000..924f564f --- /dev/null +++ b/product/phone/src/main/ets/SceneBoard/SCBScene.ets @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2023 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 { SCBSceneSession, SCBDividerParam, SceneState, SCBGestureModel } from '@ohos/common' +import { SCBGestureActionId, SCBGestureAction } from '@ohos/common' +import { StyleConstants } from '@ohos/common' +import { Log } from '@ohos/common' + + +const TAG = 'SCBScene' + +@Component +export struct SCBScene { + @ObjectLink sceneSession: SCBSceneSession + @Link dividerParam: SCBDividerParam + @StorageLink('gestureModel') gestureModel: SCBGestureModel = new SCBGestureModel() + onGestureChange: Function; + + buildLog(sceneSession: SCBSceneSession) { + if (sceneSession) { + Log.showInfo(TAG, 'SCBSceneSession bundle name: ' + sceneSession.sceneInfo.bundleName + ' id: ' + sceneSession.session.persistentId); + } else { + Log.showError(TAG, 'SCBSceneSession is null'); + } + Log.showInfo(TAG, 'SCBScene build: ' + this.sceneSession?.sceneInfo.bundleName + ' id: ' + this.sceneSession?.session.persistentId); + return true + } + + buildLog1() { + Log.showInfo(TAG, 'SCBScene panGesture end '); + return true + } + + buildLog3() { + Log.showInfo(TAG, 'SCBScene longPress begin'); + return true + } + + enableShow() { + if (this.sceneSession) { + if (this.sceneSession.isActive) { + return true; + } + if (this.gestureModel.sceneState === SceneState.SLIDING_UP || this.gestureModel.sceneState === SceneState.RECENT) { + return true; + } + } + Log.showInfo(TAG, 'enable show is false'); + return false; + } + + build() { + if (this.enableShow()) { + Stack() { + if (this.buildLog(this.sceneSession)) { + } + HostWindowScene(this.sceneSession?.session.persistentId) + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + if (this.gestureModel?.sceneState === SceneState.RECENT) { + Stack() { + } + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + .priorityGesture( + GestureGroup(GestureMode.Sequence, + LongPressGesture({ repeat: true }) + .onAction((event: GestureEvent) => { + if (this.buildLog3()) { + } + }) + .onActionEnd(() => { + this.gestureModel.enableScroll = false + }), + PanGesture({ direction: PanDirection.Horizontal }) // when screen is vertical, use Vertical + .onActionStart((event: GestureEvent) => { + }) + .onActionUpdate((event: GestureEvent) => { + this.sceneSession.translateX = event.offsetX; + }) + .onActionEnd((event: GestureEvent) => { + if (this.buildLog1()) { + } + if (event.offsetX < -200 || event.offsetX > 200) { + let action = new SCBGestureAction({ + id: SCBGestureActionId.EXIT_SPILT, + sessionId: this.sceneSession.session.persistentId + }); + this.onGestureChange && this.onGestureChange(action); + } + this.dividerParam.init(); + this.sceneSession.translateX = 0; + }) + ) + ) + } + } + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + .translate({ x: this.sceneSession?.translateX }) + } + } +} diff --git a/product/phone/src/main/ets/SceneBoard/SCBSceneContainer.ets b/product/phone/src/main/ets/SceneBoard/SCBSceneContainer.ets new file mode 100644 index 00000000..60b55a8f --- /dev/null +++ b/product/phone/src/main/ets/SceneBoard/SCBSceneContainer.ets @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2023 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 curves from '@ohos.curves' +import { SCBSceneContainerSession, SCBDividerParam, SCBGestureModel } from '@ohos/common' +import { SceneState } from '@ohos/common'; +import { SCBSceneSessionManager, SCBGestureAction, SCBGestureActionId, SCBScreenProperty } from '@ohos/common'; +import { SCBScene } from './SCBScene' +import { SCBDivider } from './SCBDivider' +import { Log } from '@ohos/common' +import { StyleConstants } from '@ohos/common' + +const TAG = 'SCBSceneContainer' + +@Component +export struct SCBSceneContainer { + @ObjectLink sceneContainerSession: SCBSceneContainerSession; + @ObjectLink dividerParam: SCBDividerParam; + @Link screenProperty: SCBScreenProperty; + @StorageLink('gestureModel') gestureModel: SCBGestureModel = new SCBGestureModel(); + + containerIdx : number; + onGestureChange: Function; + + buildLog2() { + Log.showInfo(TAG, " containerIdx: "+ this.containerIdx + " containerId: " + this.sceneContainerSession.containerId + + ' transX: ' + this.sceneContainerSession.translateX + ' transY: ' + this.sceneContainerSession.translateY + ' scaleX: ' + + this.sceneContainerSession.scaleX + ' scaleY: ' + this.sceneContainerSession.scaleY) + return true + } + + buildLog() { + return true + } + + enableShow() { + if (!this.sceneContainerSession) { + return false; + } + if (this.sceneContainerSession && this.sceneContainerSession.isActive) { + return true + } + if (this.gestureModel.sceneState === SceneState.SLIDING_UP || this.gestureModel.sceneState === SceneState.RECENT) { + return true + } + return false + } + + build() { + if (this.enableShow()) { + Stack() { + Column() { + if (this.buildLog2()) {} + if (this.sceneContainerSession.primarySession) { + SCBScene({ sceneSession: this.sceneContainerSession.primarySession, dividerParam: $dividerParam, onGestureChange: this.onGestureChange }) + .width('100%') + .height(this.dividerParam.primaryH) + .scale({ y: this.dividerParam.primaryScaleY, centerY: 0 }) + .blur(this.dividerParam.blurRadius) + } + + // divider + if (this.sceneContainerSession.isSplit) { + SCBDivider({ dividerParam: $dividerParam, sceneContainerSession: $sceneContainerSession, + screenProperty: $screenProperty, onGestureChange: this.onGestureChange}) + } + + // When primary Exit + if (this.sceneContainerSession.secondarySession) { + SCBScene({ sceneSession: this.sceneContainerSession.secondarySession, dividerParam: $dividerParam, onGestureChange: this.onGestureChange }) + .scale({ y: this.dividerParam.secondaryScaleY, centerY: 0 }) + .blur(this.dividerParam.blurRadius) + .translate({ y: this.dividerParam.secTransY }) + .flexShrink(1) + } + } + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + + if (this.gestureModel?.sceneState === SceneState.RECENT) { + Stack() { + } + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + .hitTestBehavior(HitTestMode.Transparent) + .onClick(() => { + SCBSceneSessionManager.getInstance().requestSceneContainerActivation(this.screenProperty.screenId, this.sceneContainerSession.containerId); + let action = new SCBGestureAction({ + id: SCBGestureActionId.FULLSCENE + }); + this.onGestureChange && this.onGestureChange(action); + }) + .parallelGesture( + PanGesture({ direction: PanDirection.Vertical }) + .onActionStart((event: GestureEvent) => { + }) + .onActionUpdate((event: GestureEvent) => { + if (event.offsetY < 100) { + this.sceneContainerSession.translateY = event.offsetY; + } + }) + .onActionEnd((event: GestureEvent) => { + var action; + if (event.offsetY < -300) { + SCBSceneSessionManager.getInstance().requestSceneContainerDestruction( + this.screenProperty.screenId, this.sceneContainerSession.containerId); + action = new SCBGestureAction({ + id: SCBGestureActionId.DESTROY_IN_RECENT + }); + } else { + this.sceneContainerSession.translateY = 0; + action = new SCBGestureAction({ + id: SCBGestureActionId.FULLSCENE + }); + } + this.onGestureChange && this.onGestureChange(action); + })) + } + + if (this.gestureModel?.sceneState !== SceneState.RECENT + && this.gestureModel?.sceneState !== SceneState.SPLIT) { + Stack({ alignContent: Alignment.Center }) { + Button() + .backgroundColor(Color.Black) + .width('35%') + .height('25%') + } + .position({ y: '97%' }) + .width('100%') + .height('3%') + .hitTestBehavior(HitTestMode.None) + } + } + .id('containerSession' + this.sceneContainerSession.containerId.toString()) + .size({ width: this.sceneContainerSession.width, height: this.sceneContainerSession.height }) + .scale({ + x: this.sceneContainerSession.scaleX, + y: this.sceneContainerSession.scaleY, + centerX: this.sceneContainerSession.centerX, + centerY: this.sceneContainerSession.centerY + }) + .translate({ x: this.sceneContainerSession.translateX, y: this.sceneContainerSession.translateY }) + } + + } +} diff --git a/product/phone/src/main/ets/SceneBoard/SCBScenePanel.ets b/product/phone/src/main/ets/SceneBoard/SCBScenePanel.ets new file mode 100644 index 00000000..2357b204 --- /dev/null +++ b/product/phone/src/main/ets/SceneBoard/SCBScenePanel.ets @@ -0,0 +1,523 @@ +/* + * Copyright (c) 2023 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 { SCBScreenProperty }from '@ohos/common'; +import { SceneState, SCBGestureModel, SCBSceneContainerSessionArray} from '@ohos/common'; +import { SCBSceneContainerSession, SCBSceneInfo } from '@ohos/common'; +import { SCBSceneSessionManager, SCBSceneSession } from '@ohos/common'; +import { SCBGestureActionId, SCBGestureAction } from '@ohos/common'; +import { SCBSceneContainer } from './SCBSceneContainer'; +import { Log, Trace } from '@ohos/common'; +import { StyleConstants } from '@ohos/common'; +import { SCBGestureNavBar } from './SCBGestureNavBar' +import sceneSessionManager from '@ohos.sceneSessionManager' +const TAG = 'SCBScenePanel'; + +@Component +export struct SCBScenePanel { + @State containerSessionList: SCBSceneContainerSessionArray = new SCBSceneContainerSessionArray(); + @Link screenProperty: SCBScreenProperty; + + @StorageLink('gestureModel') gestureModel: SCBGestureModel = new SCBGestureModel(); + @State recentViewHitTestMode: HitTestMode = HitTestMode.None; + @State scrollDirection: ScrollDirection = ScrollDirection.None; + @State mBlurRadius: number = 20; + + private scroller: Scroller = new Scroller(); + private screenWidth: number = -1 + private viewWidth: number = -1 + private currentState: number = SceneState.HOME + @State containerTranslation: number[]=[] + @State containerAlpha : number[]=[] + @State containerScale: number[]=[] + + buildLog(sceneContainerSession: SCBSceneContainerSession) { + Log.showInfo(TAG, `sceneContainerSession id: ${sceneContainerSession.containerId}`); + Log.showInfo(TAG, `sceneContainerSession isActive: ${sceneContainerSession.isActive}`); + Log.showInfo(TAG, 'sceneState:' + this.gestureModel?.sceneState + ' length: ' + this.containerSessionList.length); + return true; + } + + // sceneSessionManager 当前屏幕的scene的添加 + isRecent(): boolean { + Log.showInfo(TAG,"isRecent = " +(this.gestureModel.sceneState === SceneState.RECENT)) + Log.showInfo(TAG, "this.gestureModel.flexOffsetX: " + (this.gestureModel.flexOffsetX) + ' flexWidth: ' + (this.gestureModel.flexWidth)) + Log.showInfo(TAG, "this.scroller.currentOffset().xOffset: " + (this.scroller.currentOffset().xOffset)) + + if (this.gestureModel.sceneState === SceneState.RECENT) { + this.initRecentParams(); + this.currentState = this.gestureModel.sceneState; + Log.showInfo(TAG, "after scrollTo this.scroller.currentOffset().xOffset: " + (this.scroller.currentOffset().xOffset)) + return true; + } else { + this.containerTranslation = []; + this.containerAlpha = []; + this. containerScale = []; + this.currentState = this.gestureModel.sceneState; + return false; + } + } + + private initView() { + this.gestureModel.initAll(); + this.containerSessionList.forEach((containerSession, index)=>{ + containerSession.init(); + }); + } + + private enterRecentView() { + Log.showInfo(TAG, 'enterRecentView') + let screenW = px2vp(this.screenProperty.width); + let listLen = this.containerSessionList.length; + this.gestureModel.flexWidth = (listLen * screenW * StyleConstants.RECENT_SCALE + Number(StyleConstants.RECENT_MARGIN) * (listLen - 1)) + + this.gestureModel.flexPadding * 2 + if (listLen > 2) { + let tmpX = (screenW * StyleConstants.RECENT_SCALE - (this.gestureModel.flexPadding - Number(StyleConstants.RECENT_MARGIN))); + this.gestureModel.flexOffsetX = -(this.gestureModel.flexWidth - screenW - tmpX - this.gestureModel.flexPadding) + } else { + this.gestureModel.flexOffsetX = -(this.gestureModel.flexWidth - screenW) // decide final show pos with scroll to + } + this.gestureModel.multiViewShow = true; + for (let i = 0; i < listLen; i++) { + let containerSession = this.containerSessionList[i]; + containerSession.translateX = -this.gestureModel.flexPadding - i * (this.gestureModel.flexPadding * 2 - Number(StyleConstants.RECENT_MARGIN)) + containerSession.translateY = 0; + containerSession.scaleX = StyleConstants.RECENT_SCALE; + containerSession.scaleY = StyleConstants.RECENT_SCALE; + Log.showDebug(TAG, `idx: ${i} translateX: ${containerSession.translateX}.`); + } + Log.showDebug(TAG, `listLen: ${listLen} flexOffsetX: ${this.gestureModel.flexOffsetX}, flexWidth:${this.gestureModel.flexWidth}.`); + } + + private exitSplitView(persistentId: number) { + Log.showInfo(TAG, 'exitSplitView.'); + const index = this.containerSessionList.findIndex((item) => { + return item.primarySession.session.persistentId === persistentId || + item.secondarySession.session.persistentId === persistentId; + }); + if (index === -1) { + Log.showError(TAG, 'Failed to get scene containerSession with session id: ' + + persistentId); + return null; + } + let currContainerSession = this.containerSessionList[index] + let sceneSession = null; + if (currContainerSession.primarySession && currContainerSession.primarySession.session.persistentId === persistentId) { + sceneSession = currContainerSession.primarySession; + } else { + sceneSession = currContainerSession.secondarySession; + } + if (!sceneSession) { + Log.showError(TAG, 'Failed to get scene sceneSession with session id: ' + + persistentId); + return; + } + currContainerSession.removeSceneSession(sceneSession); + currContainerSession.init(); + currContainerSession.isSplit = false; + let newSceneContainerSession = new SCBSceneContainerSession(sceneSession, this.screenProperty); + newSceneContainerSession.isActive = false; + this.containerSessionList.splice(index, 0, newSceneContainerSession); + sceneSession.requestSessionBackground(); + if (this.gestureModel.sceneState !== SceneState.RECENT) { + let action = new SCBGestureAction({ + id: SCBGestureActionId.FULLSCENE + }); + this.onGestureChange(action); + } else { + this.enterRecentView(); + } + } + + private updateRecentView(offsetX:number, offsetY:number) { + Log.showDebug(TAG, 'updateRecentView') + let currContainerSession = this.getActiveSceneContainerSession(); + let screenH = px2vp(this.screenProperty.height); + let screenW = px2vp(this.screenProperty.width); + currContainerSession.scaleX = + 1 + currContainerSession.translateY / screenH * 1.3; + currContainerSession.scaleX = Math.max(currContainerSession.scaleX, 0.25); + currContainerSession.scaleX = Math.min(currContainerSession.scaleX, 1); + currContainerSession.scaleY = currContainerSession.scaleX; + currContainerSession.translateX = offsetX - this.gestureModel.flexPadding; + currContainerSession.translateY = offsetY + (1 - currContainerSession.scaleY) * Number(currContainerSession.height) / 2; + if (offsetY > -(screenW * 0.1)) { + this.gestureModel.multiViewShow = false + let nowFinalFlexWidth = screenW * StyleConstants.RECENT_SCALE + this.gestureModel.flexPadding * 2; + if (this.gestureModel.flexWidth !== nowFinalFlexWidth) { + this.gestureModel.flexWidth = nowFinalFlexWidth; + } + return; + } + this.gestureModel.multiViewShow = true + let listLen = this.containerSessionList.length + + let tmpFinalFlexWith = (listLen * screenW * StyleConstants.RECENT_SCALE + Number(StyleConstants.RECENT_MARGIN) * (listLen - 1)) + + this.gestureModel.flexPadding * 2 + if (this.gestureModel.flexWidth !== tmpFinalFlexWith) { + this.gestureModel.flexWidth = tmpFinalFlexWith; + } + let tmpFlexWidth = (listLen * screenW * currContainerSession.scaleX + Number(StyleConstants.RECENT_MARGIN) * (listLen - 1)) + this.gestureModel.flexPadding * 2 + let disToEndX = (tmpFlexWidth - screenW + ((1 - currContainerSession.scaleX) * screenW) - this.gestureModel.flexPadding) // final view left space to right side is pad + (1 -scaleX) * W / 2, expect (1 -scaleX) * W / 2 + for (let i = 0; i < listLen; i++) { + let containerSession = this.containerSessionList[i]; + containerSession.translateX = offsetX - i * ((1 - currContainerSession.scaleX) * screenW - Number(StyleConstants.RECENT_MARGIN)) - disToEndX + containerSession.translateY = currContainerSession.translateY; + containerSession.scaleX = currContainerSession.scaleX; + containerSession.scaleY = currContainerSession.scaleY; + } + } + + private calculateCurrViewOnSlidingBegin() { + let screenH = px2vp(this.screenProperty.height); + let screenW = px2vp(this.screenProperty.width); + this.gestureModel.flexPadding = (1 - StyleConstants.RECENT_SCALE) * screenW / 2 + this.gestureModel.flexHeight = screenH; + let listLen = this.containerSessionList.length; + this.gestureModel.flexWidth = (listLen * screenW * StyleConstants.RECENT_SCALE + Number(StyleConstants.RECENT_MARGIN) * (listLen - 1)) + + this.gestureModel.flexPadding * 2 + } + + private addSceneContainerSession(sceneContainerSession: SCBSceneContainerSession): void { + const index = this.containerSessionList.findIndex(item => { + return item.containerId === sceneContainerSession.containerId; + }); + if (index == -1) { + Log.showInfo(TAG, 'Add scene container session, id: ' + sceneContainerSession.containerId); + this.containerSessionList.push(sceneContainerSession); + } + } + + private removeSceneContainerSession(sceneContainerSession: SCBSceneContainerSession): void { + const index = this.containerSessionList.findIndex((item) => { + return item.containerId === sceneContainerSession.containerId; + }); + if (index != -1) { + Log.showInfo(TAG, 'Remove scene container session, id: ' + sceneContainerSession.containerId); + this.containerSessionList.splice(index, 1); + } + } + + private raiseSceneToTop(sceneContainerSession: SCBSceneContainerSession) { + Log.showInfo(TAG, 'raiseSceneToTop.'); + + // To move the sceneContainerSession to the last of list. + this.removeSceneContainerSession(sceneContainerSession); + this.addSceneContainerSession(sceneContainerSession); + } + + private getSceneSession(sceneInfo: SCBSceneInfo): SCBSceneSession { + for (let i = 0; i < this.containerSessionList.length; ++i) { + let primarySession = this.containerSessionList[i].primarySession; + let secondarySession = this.containerSessionList[i].secondarySession; + if (primarySession && + primarySession.sceneInfo.bundleName == sceneInfo.bundleName && + primarySession.sceneInfo.abilityName == sceneInfo.abilityName) { + return primarySession; + } + if (secondarySession && + secondarySession.sceneInfo.bundleName == sceneInfo.bundleName && + secondarySession.sceneInfo.abilityName == sceneInfo.abilityName) { + return secondarySession; + } + } + return null; + } + + private requestSceneSession(sceneInfo: SCBSceneInfo): SCBSceneSession { + let scbSceneSession = this.getSceneSession(sceneInfo); + if (scbSceneSession == null || sceneInfo.isNewInstance) { + let sceneSession = sceneSessionManager.requestSceneSession({ + bundleName: sceneInfo.bundleName, + abilityName: sceneInfo.abilityName + }); + scbSceneSession = new SCBSceneSession(sceneSession, sceneInfo); + } + return scbSceneSession; + } + + private getSceneContainerSession(sceneSession: SCBSceneSession): SCBSceneContainerSession { + if (sceneSession === null) { + return null; + } + const index = this.containerSessionList.findIndex((item) => { + return item.primarySession === sceneSession || item.secondarySession === sceneSession; + }); + if (index === -1) { + return null; + } + return this.containerSessionList[index]; + } + + private getSceneContainerSessionWithContainerId(containerId: number): SCBSceneContainerSession { + const index = this.containerSessionList.findIndex(item => { + return item.containerId === containerId; + }); + if (index === -1) { + Log.showError(TAG, `Failed to find containerSession with id:${containerId}`) + return; + } + return this.containerSessionList[index]; + } + + private getActiveSceneContainerSession(): SCBSceneContainerSession { + const index = this.containerSessionList.findIndex((item) => { + return item.isActive === true; + }); + if (index === -1) { + Log.showError(TAG, 'Failed to find active scene container session.'); + return null; + } + return this.containerSessionList[index]; + } + + onStartScene(sceneInfo: SCBSceneInfo) { + let sceneSession = this.requestSceneSession(sceneInfo); + if (sceneSession == null) { + Log.showError(TAG, 'Failed to request scene session!'); + return; + } + Log.showInfo(TAG,"sceneState: " + this.gestureModel.sceneState ); + if (this.gestureModel.sceneState === SceneState.HOME) { + let sceneContainerSession = this.getSceneContainerSession(sceneSession); + if (sceneContainerSession === null) { + sceneContainerSession = new SCBSceneContainerSession(sceneSession, this.screenProperty); + this.addSceneContainerSession(sceneContainerSession); + Log.showInfo(TAG,"start scene add new container session: " + sceneContainerSession.containerId); + } + sceneContainerSession.requestActivation(); + this.raiseSceneToTop(sceneContainerSession); + let action = new SCBGestureAction({ + id: SCBGestureActionId.FULLSCENE + }); + this.onGestureChange(action); + + } else if (this.gestureModel.sceneState === SceneState.SPLIT) { + let sceneContainerSession = this.getSceneContainerSession(sceneSession); + if (sceneContainerSession !== null && !sceneContainerSession.isActive) { + this.removeSceneContainerSession(sceneContainerSession); // delete old scene containerSession in background + Log.showInfo(TAG,"start scene split remove old fullscene container session: " + sceneContainerSession.containerId); + } + let activeSceneContainerSession = this.getActiveSceneContainerSession(); + activeSceneContainerSession.addSceneSession(sceneSession); + Log.showInfo(TAG,"start scene split after add active sceneSession container: " + activeSceneContainerSession.containerId); + sceneSession.requestSessionActivation(); + this.raiseSceneToTop(activeSceneContainerSession); + let action = new SCBGestureAction({ + id: SCBGestureActionId.FULLSCENE + }); + this.onGestureChange(action); + } + } + + onActivateScene(containerId: number) { + let containerSession = this.getSceneContainerSessionWithContainerId(containerId); + let curActiveContainerSession = this.getActiveSceneContainerSession() // just for full session + if (containerSession) { + if (containerSession.containerId !== curActiveContainerSession.containerId) { + curActiveContainerSession.requestBackground(); + } + } + containerSession.requestActivation(); + this.raiseSceneToTop(containerSession); + } + + onBackgroundScene(containerId: number) { + let containerSession = this.getSceneContainerSessionWithContainerId(containerId); + if (containerSession) { + containerSession.requestBackground(); + } + } + + onDestroyScene(containerId: number) { + let containerSession = this.getSceneContainerSessionWithContainerId(containerId); + if (containerSession) { + containerSession.requestDestruction(); + } + this.removeSceneContainerSession(containerSession); + // test + this.containerSessionList.forEach((item, index)=> { + Log.showInfo(TAG, `onDestroyScene length: ${this.containerSessionList.length}, index: ${index}, containerId:${item.containerId}}`); + }) + + + } + + onGestureChange(action: SCBGestureAction) { + Log.showInfo(TAG, `onGestureChange! action: ${action.actionId} sceneState: ${this.gestureModel.sceneState}`); + switch(action.actionId) { + case SCBGestureActionId.ENTER_SPLIT: + this.initView(); + this.gestureModel.updateSceneState(SceneState.SPLIT); + break; + case SCBGestureActionId.HOME: + this.initView(); + this.gestureModel.updateSceneState(SceneState.HOME); + break; + case SCBGestureActionId.SLIDING_UP: + this.updateRecentView(action.gestureOffsetX, action.gestureOffsetY); + break; + case SCBGestureActionId.SLIDE_UP_BEGIN: + this.calculateCurrViewOnSlidingBegin(); + this.gestureModel.updateSceneState(SceneState.SLIDING_UP); + break; + case SCBGestureActionId.ENTER_RECENT: + this.enterRecentView(); + this.gestureModel.updateSceneState(SceneState.RECENT); + break; + case SCBGestureActionId.FULLSCENE: + this.initView(); + this.gestureModel.updateSceneState(SceneState.FULLSCENE); + break; + case SCBGestureActionId.EXIT_SPILT: + this.exitSplitView(action.sessionId); + break; + case SCBGestureActionId.DESTROY_IN_RECENT: + if (this.containerSessionList.length == 0) { + this.initView(); + this.gestureModel.updateSceneState(SceneState.HOME); + } else { + // todo: need modify not scorll to final view + this.enterRecentView(); + this.gestureModel.updateSceneState(SceneState.RECENT); + } + break; + default: + break; + } + } + + aboutToAppear() { + this.onGestureChange = this.onGestureChange.bind(this) + SCBSceneSessionManager.getInstance().registerStartSceneCallback(this.screenProperty.screenId, + (sceneInfo: SCBSceneInfo) => { + this.onStartScene(sceneInfo); + }) + SCBSceneSessionManager.getInstance().registerBackgroundSceneCallback(this.screenProperty.screenId, + (containerId: number) => { + this.onBackgroundScene(containerId); + }) + + SCBSceneSessionManager.getInstance().registerDestroySceneCallback(this.screenProperty.screenId, + (containerId: number) => { + this.onDestroyScene(containerId); + }) + SCBSceneSessionManager.getInstance().registerActivateSceneCallback(this.screenProperty.screenId, + (containerId: number) => { + this.onActivateScene(containerId); + }) + } + + build() { + Stack({ alignContent: Alignment.TopStart }) { + // SLIDING_UP is needed in order to use blur when slide + if (this.gestureModel.sceneState === SceneState.FULLSCENE || this.gestureModel.sceneState === SceneState.RECENT || this.gestureModel.sceneState === SceneState.SLIDING_UP) { + Stack() { + } + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + .blur(this.mBlurRadius) + } + Scroll(this.scroller) { + Flex({ direction: FlexDirection.Row }) { + ForEach(this.containerSessionList, (item: SCBSceneContainerSession, index) => { + if (this.buildLog(item) && this.isRecent() || (this.gestureModel.multiViewShow === true) || (this.buildLog(item) && item.isActive)) { + SCBSceneContainer({ + sceneContainerSession: item, + dividerParam: item.dividerParam, + screenProperty: $screenProperty, + containerIdx: index, + onGestureChange: this.onGestureChange + }) + .flexShrink(0) + } + }, (item: SCBSceneContainerSession) => item.containerId.toString()) + } + .flexShrink(0) + .id('flexTest1') + .size({ width: this.gestureModel.flexWidth, height: this.gestureModel.flexHeight}) + .padding({ left: this.gestureModel.flexPadding, right: this.gestureModel.flexPadding}) + .hitTestBehavior(HitTestMode.None) + } + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + .scrollBar(BarState.Off) + .scrollable(this.gestureModel.sceneState === SceneState.RECENT ? ScrollDirection.Horizontal : ScrollDirection.None) + .edgeEffect(EdgeEffect.Spring) + .hitTestBehavior(this.gestureModel.sceneState === SceneState.RECENT ? HitTestMode.Default : HitTestMode.None) + .onClick(() => { + let activeSceneContainerSession = this.getActiveSceneContainerSession(); + activeSceneContainerSession?.requestBackground() + let action = new SCBGestureAction({ + id: SCBGestureActionId.HOME + }); + this.onGestureChange && this.onGestureChange(action); + this.containerTranslation= []; + this.containerAlpha = []; + this. containerScale = []; + }) + .onScroll((xOffset: number, yOffset: number) => { + Log.showInfo(TAG, `enableScroll: ${this.gestureModel.enableScroll}`) + if (!this.gestureModel.enableScroll) { + return + } + }) + .onScrollEnd(()=>{ + if (!this.gestureModel.enableScroll) { + return + } + }) + // Freedom scene + + if (this.gestureModel?.sceneState !== SceneState.RECENT + && this.gestureModel?.sceneState !== SceneState.SPLIT) { // todo: 放开 == recent + SCBGestureNavBar({ + containerSessionList: this.containerSessionList, + onGestureChange: this.onGestureChange + }) + } + } + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + .hitTestBehavior(HitTestMode.None) + } + + updateView(progress:number,index:number) { + if(this.containerSessionList.length <= 1) { + this.containerScale = []; + this.containerTranslation = []; + this.containerAlpha = []; + return; + } + if (progress >= 0) { + this.containerAlpha[index] = 1; + } else { + this.containerAlpha[index] = 1 - Math.abs(progress) * 0.2; + } + this.containerScale[index] = 1 + (progress) * 0.05; + if (progress > 0) { + this.containerTranslation[index] = -Math.abs(progress) * this.screenWidth / 10; + } else { + this.containerTranslation[index] = Math.abs(progress) * this.screenWidth / 1.6; + } + } + + contentOffsetForIndex(index) : number { + let result = index * this.viewWidth - (this.screenWidth - this.viewWidth) / 2 + return result; + } + + initRecentParams() { + this.screenWidth = px2vp(this.screenProperty.width); + this.scroller.scrollTo({ xOffset: -this.gestureModel.flexOffsetX, yOffset: 0}) + } +} diff --git a/product/phone/src/main/ets/WindowScene/HWScreen.ets b/product/phone/src/main/ets/SceneBoard/SCBScreen.ets similarity index 70% rename from product/phone/src/main/ets/WindowScene/HWScreen.ets rename to product/phone/src/main/ets/SceneBoard/SCBScreen.ets index eac8d13b..ef8ac91b 100644 --- a/product/phone/src/main/ets/WindowScene/HWScreen.ets +++ b/product/phone/src/main/ets/SceneBoard/SCBScreen.ets @@ -13,15 +13,17 @@ * limitations under the License. */ -import { HWScenePanel } from './HWScenePanel'; -import { HWScreenSession } from '@ohos/common'; -import { HWDesktop } from './HWDesktop'; -import { HWWallpaper } from './HWWallpaper'; +import { SCBScenePanel } from './SCBScenePanel' +import { SCBScreenSession, SCBScreenProperty } from '@ohos/common' +import { SCBDesktop } from './SCBDesktop' +import { SCBWallpaper } from './SCBWallpaper' import { SCBStatusBar } from './statusbar/SCBStatusBar'; import { DropdownPanel } from './dropdownpanel/DropdownPanel'; import { BannerNotificationPanel } from './dropdownpanel/bannerNotification'; import { SCBVolumePanel } from '@ohos/default_volumepanel/src/main/ets/pages/SCBVolumePanel'; -import { SCBScreenLock } from './screenlock/pages/SCBScreenLock'; +import { SCBScreenLock } from './screenlock/pages/SCBScreenLock' +import screenSessionManager from '@ohos.screenSessionManager' +import { Log, Trace } from '@ohos/common'; import WindowPanelManager, { WindowInfo, WindowType, @@ -31,26 +33,42 @@ import WindowPanelManager, { } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager'; const MODULE_NAME = "phone-launcher"; +const TAG = 'SCBScreen'; @Component -export struct HWScreen { - @ObjectLink screenSession: HWScreenSession; +export struct SCBScreen { + @ObjectLink screenSession: SCBScreenSession + @State scbScreenProperty: SCBScreenProperty = new SCBScreenProperty(); @StorageLink(SystemUi_DropdownPanel) mDropDownInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.DROPDOWN_PANEL); @StorageLink(SystemUi_BannerNotice) mBannerInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.BANNER_NOTICE); @StorageLink(SystemUi_VolumePanel) mVolumeInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.VOLUME_PANEL); + // screen 数据改变 + onScreenPropertyChange(screenProperty: screenSessionManager.ScreenProperty) { + Log.showInfo(TAG, 'scbScreenProperty'); + this.scbScreenProperty.update(screenProperty); + this.scbScreenProperty.screenId = this.screenSession.session.screenId; + Log.showInfo(TAG, `Update scbScreenProperty[${this.scbScreenProperty.left}, ${this.scbScreenProperty.top}, ${this.scbScreenProperty.width}, ${this.scbScreenProperty.height}]`) + } + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear'); + this.screenSession.registerPropertyChange((screenProperty: screenSessionManager.ScreenProperty) => { + this.onScreenPropertyChange(screenProperty); + }) + } + build() { Screen(this.screenSession.session.screenId) { // Wallpaper - HWWallpaper() + SCBWallpaper() // Desktop - HWDesktop({ bounds: this.screenSession.bounds }) + SCBDesktop({ bounds: this.screenSession.bounds }) // Scene - HWScenePanel({ - screenSession: this.screenSession, - recentViewParam: this.screenSession.recentViewParam + SCBScenePanel({ + screenProperty: $scbScreenProperty }) // status bar diff --git a/product/phone/src/main/ets/WindowScene/HWWallpaper.ets b/product/phone/src/main/ets/SceneBoard/SCBWallpaper.ets similarity index 93% rename from product/phone/src/main/ets/WindowScene/HWWallpaper.ets rename to product/phone/src/main/ets/SceneBoard/SCBWallpaper.ets index e9834423..98d14e6e 100644 --- a/product/phone/src/main/ets/WindowScene/HWWallpaper.ets +++ b/product/phone/src/main/ets/SceneBoard/SCBWallpaper.ets @@ -1,25 +1,25 @@ -/* - * Copyright (c) 2023 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 StyleConstants from '../common/constants/StyleConstants' - -@Component -export struct HWWallpaper { - - build() { - Image(StyleConstants.DEFAULT_BACKGROUND_IMAGE) - .objectFit(ImageFit.Cover) - } +/* + * Copyright (c) 2023 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 StyleConstants from '../common/constants/StyleConstants' + +@Component +export struct SCBWallpaper { + + build() { + Image(StyleConstants.DEFAULT_BACKGROUND_IMAGE) + .objectFit(ImageFit.Cover) + } } \ No newline at end of file diff --git a/product/phone/src/main/ets/WindowScene/dropdownpanel/DropdownPanel.ets b/product/phone/src/main/ets/SceneBoard/dropdownpanel/DropdownPanel.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/dropdownpanel/DropdownPanel.ets rename to product/phone/src/main/ets/SceneBoard/dropdownpanel/DropdownPanel.ets diff --git a/product/phone/src/main/ets/WindowScene/dropdownpanel/bannerNotification.ets b/product/phone/src/main/ets/SceneBoard/dropdownpanel/bannerNotification.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/dropdownpanel/bannerNotification.ets rename to product/phone/src/main/ets/SceneBoard/dropdownpanel/bannerNotification.ets diff --git a/product/phone/src/main/ets/WindowScene/dropdownpanel/common/ControlCenterConfig.ts b/product/phone/src/main/ets/SceneBoard/dropdownpanel/common/ControlCenterConfig.ts similarity index 100% rename from product/phone/src/main/ets/WindowScene/dropdownpanel/common/ControlCenterConfig.ts rename to product/phone/src/main/ets/SceneBoard/dropdownpanel/common/ControlCenterConfig.ts diff --git a/product/phone/src/main/ets/WindowScene/dropdownpanel/common/StyleConfiguration.ts b/product/phone/src/main/ets/SceneBoard/dropdownpanel/common/StyleConfiguration.ts similarity index 100% rename from product/phone/src/main/ets/WindowScene/dropdownpanel/common/StyleConfiguration.ts rename to product/phone/src/main/ets/SceneBoard/dropdownpanel/common/StyleConfiguration.ts diff --git a/product/phone/src/main/ets/WindowScene/dropdownpanel/common/StyleManager.ts b/product/phone/src/main/ets/SceneBoard/dropdownpanel/common/StyleManager.ts similarity index 100% rename from product/phone/src/main/ets/WindowScene/dropdownpanel/common/StyleManager.ts rename to product/phone/src/main/ets/SceneBoard/dropdownpanel/common/StyleManager.ts diff --git a/product/phone/src/main/ets/WindowScene/dropdownpanel/common/constants.ts b/product/phone/src/main/ets/SceneBoard/dropdownpanel/common/constants.ts similarity index 100% rename from product/phone/src/main/ets/WindowScene/dropdownpanel/common/constants.ts rename to product/phone/src/main/ets/SceneBoard/dropdownpanel/common/constants.ts diff --git a/product/phone/src/main/ets/WindowScene/dropdownpanel/common/navigationEvent.ts b/product/phone/src/main/ets/SceneBoard/dropdownpanel/common/navigationEvent.ts similarity index 100% rename from product/phone/src/main/ets/WindowScene/dropdownpanel/common/navigationEvent.ts rename to product/phone/src/main/ets/SceneBoard/dropdownpanel/common/navigationEvent.ts diff --git a/product/phone/src/main/ets/WindowScene/dropdownpanel/control.ets b/product/phone/src/main/ets/SceneBoard/dropdownpanel/control.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/dropdownpanel/control.ets rename to product/phone/src/main/ets/SceneBoard/dropdownpanel/control.ets diff --git a/product/phone/src/main/ets/WindowScene/dropdownpanel/notification.ets b/product/phone/src/main/ets/SceneBoard/dropdownpanel/notification.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/dropdownpanel/notification.ets rename to product/phone/src/main/ets/SceneBoard/dropdownpanel/notification.ets diff --git a/product/phone/src/main/ets/WindowScene/screenlock/common/constants.ts b/product/phone/src/main/ets/SceneBoard/screenlock/common/constants.ts similarity index 100% rename from product/phone/src/main/ets/WindowScene/screenlock/common/constants.ts rename to product/phone/src/main/ets/SceneBoard/screenlock/common/constants.ts diff --git a/product/phone/src/main/ets/WindowScene/screenlock/pages/SCBScreenLock.ets b/product/phone/src/main/ets/SceneBoard/screenlock/pages/SCBScreenLock.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/screenlock/pages/SCBScreenLock.ets rename to product/phone/src/main/ets/SceneBoard/screenlock/pages/SCBScreenLock.ets diff --git a/product/phone/src/main/ets/WindowScene/screenlock/pages/customPassword.ets b/product/phone/src/main/ets/SceneBoard/screenlock/pages/customPassword.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/screenlock/pages/customPassword.ets rename to product/phone/src/main/ets/SceneBoard/screenlock/pages/customPassword.ets diff --git a/product/phone/src/main/ets/WindowScene/screenlock/pages/customscreenlock.ets b/product/phone/src/main/ets/SceneBoard/screenlock/pages/customscreenlock.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/screenlock/pages/customscreenlock.ets rename to product/phone/src/main/ets/SceneBoard/screenlock/pages/customscreenlock.ets diff --git a/product/phone/src/main/ets/WindowScene/screenlock/pages/digitalPassword.ets b/product/phone/src/main/ets/SceneBoard/screenlock/pages/digitalPassword.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/screenlock/pages/digitalPassword.ets rename to product/phone/src/main/ets/SceneBoard/screenlock/pages/digitalPassword.ets diff --git a/product/phone/src/main/ets/WindowScene/screenlock/pages/journalscreenlock.ets b/product/phone/src/main/ets/SceneBoard/screenlock/pages/journalscreenlock.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/screenlock/pages/journalscreenlock.ets rename to product/phone/src/main/ets/SceneBoard/screenlock/pages/journalscreenlock.ets diff --git a/product/phone/src/main/ets/WindowScene/screenlock/pages/mixedPassword.ets b/product/phone/src/main/ets/SceneBoard/screenlock/pages/mixedPassword.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/screenlock/pages/mixedPassword.ets rename to product/phone/src/main/ets/SceneBoard/screenlock/pages/mixedPassword.ets diff --git a/product/phone/src/main/ets/WindowScene/screenlock/pages/slidescreenlock.ets b/product/phone/src/main/ets/SceneBoard/screenlock/pages/slidescreenlock.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/screenlock/pages/slidescreenlock.ets rename to product/phone/src/main/ets/SceneBoard/screenlock/pages/slidescreenlock.ets diff --git a/product/phone/src/main/ets/WindowScene/screenlock/vm/indexViewModel.ts b/product/phone/src/main/ets/SceneBoard/screenlock/vm/indexViewModel.ts similarity index 100% rename from product/phone/src/main/ets/WindowScene/screenlock/vm/indexViewModel.ts rename to product/phone/src/main/ets/SceneBoard/screenlock/vm/indexViewModel.ts diff --git a/product/phone/src/main/ets/WindowScene/screenlock/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/SceneBoard/screenlock/vm/slideScreenLockViewModel.ts similarity index 100% rename from product/phone/src/main/ets/WindowScene/screenlock/vm/slideScreenLockViewModel.ts rename to product/phone/src/main/ets/SceneBoard/screenlock/vm/slideScreenLockViewModel.ts diff --git a/product/phone/src/main/ets/WindowScene/statusbar/SCBStatusBar.ets b/product/phone/src/main/ets/SceneBoard/statusbar/SCBStatusBar.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/statusbar/SCBStatusBar.ets rename to product/phone/src/main/ets/SceneBoard/statusbar/SCBStatusBar.ets diff --git a/product/phone/src/main/ets/WindowScene/statusbar/StatusBar.ets b/product/phone/src/main/ets/SceneBoard/statusbar/StatusBar.ets similarity index 100% rename from product/phone/src/main/ets/WindowScene/statusbar/StatusBar.ets rename to product/phone/src/main/ets/SceneBoard/statusbar/StatusBar.ets diff --git a/product/phone/src/main/ets/WindowScene/statusbar/StatusbarConfig.ts b/product/phone/src/main/ets/SceneBoard/statusbar/StatusbarConfig.ts similarity index 100% rename from product/phone/src/main/ets/WindowScene/statusbar/StatusbarConfig.ts rename to product/phone/src/main/ets/SceneBoard/statusbar/StatusbarConfig.ts diff --git a/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets b/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets deleted file mode 100644 index 19413b0f..00000000 --- a/product/phone/src/main/ets/WindowScene/HWSceneContainer.ets +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2023 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 curves from '@ohos.curves' -import { HWSceneContainerSession, HWDividerParam } from '@ohos/common' -import { HWRecentViewParam } from '@ohos/common'; -import { HWScreenSession, DesktopState } from '@ohos/common'; -import { HWSceneSessionManager } from '@ohos/common'; -import { HWScene } from './HWScene' -import { HWGestureNavBar } from './HWGestureNavBar' -import { HWDivider } from './HWDivider' -import { Log } from '@ohos/common' -import { StyleConstants } from '@ohos/common' - -const TAG = 'HWSceneContainer' - -@Component -export struct HWSceneContainer { - @ObjectLink sceneContainerSession: HWSceneContainerSession; - @ObjectLink screenSession: HWScreenSession; - @ObjectLink dividerParam: HWDividerParam; - @Link recentViewParam: HWRecentViewParam; - - build() { - Stack() { - Column() { - if (this.sceneContainerSession.primarySession) { - HWScene({ sceneSession: this.sceneContainerSession.primarySession }) - .width('100%') - .height(this.dividerParam.primaryH) - .scale({ y: this.dividerParam.primaryScaleY, centerY: 0 }) - .blur(this.dividerParam.blurRadius) - } - - // divider - if (this.sceneContainerSession.isSplit) { - HWDivider({ dividerParam: $dividerParam, screenBounds: this.sceneContainerSession.screenBounds }) - } - - // When primary Exit - if (this.sceneContainerSession.secondarySession) { - HWScene({ sceneSession: this.sceneContainerSession.secondarySession }) - .scale({ y: this.dividerParam.secondaryScaleY, centerY: 0 }) - .blur(this.dividerParam.blurRadius) - .translate({ y: this.dividerParam.secTransY }) - .flexShrink(1) - } - } - .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) - - if (this.screenSession.desktopState === DesktopState.RECENT) { - Stack() { - } - .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) - .hitTestBehavior(HitTestMode.Default) - .onClick(() => { - let activeSceneContainerSession = this.screenSession.getActiveSceneContainerSession(); - if (activeSceneContainerSession && - activeSceneContainerSession.containerId !== this.sceneContainerSession.containerId) { - HWSceneSessionManager.getInstance().requestSceneContainerBackground(activeSceneContainerSession); - } - - HWSceneSessionManager.getInstance().requestSceneContainerActivation(this.sceneContainerSession); - this.screenSession.enterAppView(this.sceneContainerSession); - }) - .gesture( - PanGesture({ direction: PanDirection.Vertical }) - .onActionStart((event: GestureEvent) => { - }) - .onActionUpdate((event: GestureEvent) => { - if (event.offsetY < 100) { - this.sceneContainerSession.translateY = event.offsetY; - } - }) - .onActionEnd((event: GestureEvent) => { - if (event.offsetY < -300) { - HWSceneSessionManager.getInstance().requestSceneContainerDestruction(this.sceneContainerSession); - - this.screenSession.removeSceneContainerSession(this.sceneContainerSession); - if (this.screenSession.sceneContainerSessionList.length == 0) { - this.screenSession.enterHomeView(); - } - } else { - this.sceneContainerSession.translateY = 0; - } - })) - } - - if (this.screenSession.desktopState !== DesktopState.RECENT - && this.screenSession.desktopState !== DesktopState.SPLIT) { - HWGestureNavBar({ - sceneContainerSession: $sceneContainerSession, - screenSession: $screenSession, - dividerParam: $dividerParam, - recentViewParam: $recentViewParam, - }) - } - } - .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) - .translate({ x: this.sceneContainerSession.translateX, y: this.sceneContainerSession.translateY }) - .scale({ - x: this.sceneContainerSession.scaleX, - y: this.sceneContainerSession.scaleY, - centerX: this.sceneContainerSession.centerX, - centerY: this.sceneContainerSession.centerY - }) - } -} diff --git a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets b/product/phone/src/main/ets/WindowScene/HWScenePanel.ets deleted file mode 100644 index 4c0ac4fe..00000000 --- a/product/phone/src/main/ets/WindowScene/HWScenePanel.ets +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2023 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 { HWScreenSession, DesktopState } from '@ohos/common'; -import { HWRecentViewParam } from '@ohos/common'; -import { HWSceneContainerSession } from '@ohos/common'; -import { HWSceneSessionManager } from '@ohos/common'; -import { HWSceneContainer } from './HWSceneContainer'; -import { Log } from '@ohos/common'; -import { StyleConstants } from '@ohos/common'; - -const TAG = 'HWScenePanel'; - -@Component -export struct HWScenePanel { - @ObjectLink screenSession: HWScreenSession; - @ObjectLink recentViewParam: HWRecentViewParam; - @State recentViewHitTestMode: HitTestMode = HitTestMode.None; - @State scrollDirection: ScrollDirection = ScrollDirection.None; - @State mBlurRadius: number = 20; - - private scroller: Scroller = new Scroller(); - private progress: number[] = [] - private screenWidth: number = -1 - private viewWidth: number = -1 - private currentIndex: number = 0; - private currentState: number = DesktopState.HOME - @State containerTranslation: number[]=[] - @State containerAlpha : number[]=[] - @State containerScale: number[]=[] - buildLog(sceneContainerSession: HWSceneContainerSession) { - Log.showInfo(TAG, `sceneContainerSession id: ${sceneContainerSession.containerId}`); - Log.showInfo(TAG, `sceneContainerSession isActive: ${sceneContainerSession.isActive}`); - return true; - } - - isRecent(): boolean { - Log.showInfo(TAG,"isRecent = " +(this.screenSession.desktopState === DesktopState.RECENT)) - if (this.screenSession.desktopState === this.currentState) { - return this.screenSession.desktopState === DesktopState.RECENT; - } - if (this.screenSession.desktopState == DesktopState.RECENT) { - this.initRecentParams(); - this.currentState = this.screenSession.desktopState; - return true; - } else { - this.containerTranslation = []; - this.containerAlpha = []; - this. containerScale = []; - this.currentState = this.screenSession.desktopState; - Log.showInfo(TAG,"this.containerTranslation = " +this.containerTranslation[this.screenSession.sceneContainerSessionList.length-1]) - return false; - } -} - - build() { - Stack({ alignContent: Alignment.TopStart }) { - if (this.screenSession.desktopState === DesktopState.APP || this.screenSession.desktopState === DesktopState.RECENT) { - Stack() { - } - .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) - .blur(this.mBlurRadius) - } - - Scroll(this.scroller) { -// Flex({ direction: FlexDirection.Row }) { - Row() { - ForEach(this.screenSession.sceneContainerSessionList, (item: HWSceneContainerSession, index) => { - if (this.isRecent() ||this.screenSession.desktopState === DesktopState.DRAGGING || (this.buildLog(item) && item.isActive)) { - HWSceneContainer({ - sceneContainerSession: item, - screenSession: this.screenSession, - dividerParam: item.dividerParam, - recentViewParam: $recentViewParam - }) - .size({width:this.recentViewParam.width, height:this.recentViewParam.height}) - .translate({x:this.containerTranslation[index]}) - .opacity(this.containerAlpha[index]) - .scale({x:this.containerScale[index], y:this.containerScale[index]}) - .margin({left:this.recentViewParam.margin}) - .clip(true) - .borderRadius(this.recentViewParam.borderRadius) - } - }, (item: HWSceneContainerSession) => item.containerId.toString()) - } - .hitTestBehavior(HitTestMode.None) - .translate({ x: this.recentViewParam.translateX, y: this.recentViewParam.translateY }) - .scale({ - x: this.recentViewParam.scaleX, - y: this.recentViewParam.scaleY, - centerX: this.recentViewParam.centerX, - centerY: this.recentViewParam.centerY - }) - .offset({ x: this.recentViewParam.offsetX, y: this.recentViewParam.offsetY }) - } - .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) - .scrollBar(BarState.Off) - .scrollable(this.screenSession.desktopState === DesktopState.RECENT ? ScrollDirection.Horizontal : ScrollDirection.None) - .edgeEffect(EdgeEffect.Spring) - .hitTestBehavior(this.screenSession.desktopState === DesktopState.RECENT ? HitTestMode.Default : HitTestMode.None) - .onClick(() => { - let activeSceneContainerSession = this.screenSession.getActiveSceneContainerSession(); - HWSceneSessionManager.getInstance().requestSceneContainerBackground(activeSceneContainerSession); - this.screenSession.enterHomeView(); - this.containerTranslation= []; - this.containerAlpha = []; - this. containerScale = []; - }) - .onScroll((xOffset: number, yOffset: number) => { - Log.showInfo(TAG,"this.scroller.currentOffset().xOffset = " +this.scroller.currentOffset().xOffset + ",currentindex = " + this.currentIndex) - this.currentIndex = Math.ceil((this.scroller.currentOffset().xOffset - this.viewWidth / 2) / this.viewWidth) - let currentCenter = this.scroller.currentOffset().xOffset + this.screenWidth / 2; - for (var i = this. currentIndex - 2; i <= this. currentIndex + 2; i ++) { - if (i < 0 || i > this.screenSession.sceneContainerSessionList.length) { - continue; - } - let viewCenterX = i * (this.viewWidth) + (this.viewWidth) / 2 - this.progress[i] = (viewCenterX - currentCenter) / (this.viewWidth) ; - this.updateView(this.progress[i], i) - - } - }) - .onScrollEnd(()=>{ - if (this.scroller.currentOffset().xOffset === this.contentOffsetForIndex(this.currentIndex) || this.screenSession.sceneContainerSessionList.length <=1) { - return; - } - this.scroller.scrollTo({ xOffset: this.contentOffsetForIndex(this.currentIndex), yOffset: 0, animation:{duration:100, curve: Curve.Smooth}}) - Log.showInfo(TAG,"onScrollEnd xOffset = " +this.contentOffsetForIndex(this.currentIndex)) - }) - // Freedom scene - } - .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) - .hitTestBehavior(HitTestMode.None) - } - - updateView(progress:number,index:number) { - if(this.screenSession.sceneContainerSessionList.length <= 1) { - this.containerScale = []; - this.containerTranslation = []; - this.containerAlpha = []; - return; - } - if (progress >= 0) { - this.containerAlpha[index] = 1; - } else { - this.containerAlpha[index] = 1 - Math.abs(progress) * 0.2; - } - this.containerScale[index] = 1 + (progress) * 0.05; - if (progress > 0) { - this.containerTranslation[index] = -Math.abs(progress) * this.screenWidth / 10; - } else { - this.containerTranslation[index] = Math.abs(progress) * this.screenWidth / 1.6; - } - } - - contentOffsetForIndex(index) : number { - let result = index * this.viewWidth - (this.screenWidth - this.viewWidth) / 2 - return result; - } - - initRecentParams() { - this.screenWidth = px2vp(this.screenSession.bounds.width); - this.viewWidth = this.screenWidth * 0.7; - - this.scroller.scrollTo({ xOffset: this.contentOffsetForIndex(this.screenSession.sceneContainerSessionList.length - 1), yOffset: 0 }) - this.currentIndex = Math.ceil( (this.scroller.currentOffset().xOffset - (this.viewWidth/2))/(this.viewWidth)) - this.progress[this.screenSession.sceneContainerSessionList.length - 1 - 2] = -2; - this.progress[this.screenSession.sceneContainerSessionList.length - 1 - 1] = -1; - this.updateView(-2, this.screenSession.sceneContainerSessionList.length - 1 - 2) - this.updateView(-1, this.screenSession.sceneContainerSessionList.length - 1 - 1) - } -} diff --git a/product/phone/src/main/ets/pages/EntryView.ets b/product/phone/src/main/ets/pages/EntryView.ets index ea0fa4e9..6f56b7cb 100644 --- a/product/phone/src/main/ets/pages/EntryView.ets +++ b/product/phone/src/main/ets/pages/EntryView.ets @@ -13,27 +13,90 @@ * limitations under the License. */ -import { HWRootSceneSession } from '@ohos/common' -import { HWSceneSessionManager } from '@ohos/common' -import { HWScreen } from '../WindowScene/HWScreen' -import { HWScreenSession } from '@ohos/common' -import { Log } from '@ohos/common'; +import { SCBRootSceneSession } from '@ohos/common' +import { SCBSceneSessionManager } from '@ohos/common' +import { SCBScreen } from '../SceneBoard/SCBScreen' +import { SCBScreenSession, SCBGestureModel } from '@ohos/common' +import { Log, Trace } from '@ohos/common'; import CommonStyleManager from '@ohos/common/src/main/ets/default/manager/CommonStyleManager'; +import screenSessionManager from '@ohos.screenSessionManager' -const TAG = "EntryView"; +const TAG = 'SCBEntryView'; + +@Observed +export class SCBScreenSessionArray extends Array { +} @Entry @Component struct EntryView { - @StorageLink('screenSessionList') screenSessionList: HWScreenSession[] = [] - private rootSceneSession: HWRootSceneSession = HWSceneSessionManager.getInstance().getRootSceneSession() + @State screenSessionList: SCBScreenSessionArray = new SCBScreenSessionArray() + private rootSceneSession: SCBRootSceneSession = SCBSceneSessionManager.getInstance().getRootSceneSession() + + private registerScreenConnectionListener(): void { + screenSessionManager.on('screenConnectChange', ({ screenSession, screenConnectChangeType }) => { + this.onScreenConnectChange(screenSession, screenConnectChangeType); + }) + } + + private onScreenConnectChange(session: screenSessionManager.ScreenSession, + changeType: screenSessionManager.ScreenConnectChangeType) { + Log.showInfo(TAG, 'On screen connect change, type:' + changeType + ' ' + session.screenId); + if (changeType === screenSessionManager.ScreenConnectChangeType.CONNECT) { + this.onScreenConnect(session); + } + + if (changeType === screenSessionManager.ScreenConnectChangeType.DISCONNECT) { + this.onScreenDisconnect(session); + } + } + + private onScreenConnect(session: screenSessionManager.ScreenSession): void { + Log.showInfo(TAG, 'On screen connect.'); + let screenSession: SCBScreenSession = new SCBScreenSession(session); + this.addScreenSession(screenSession); + } + + private onScreenDisconnect(session: screenSessionManager.ScreenSession): void { + Log.showInfo(TAG, 'On screen disconnect.'); + this.removeScreenSession(session.screenId); + } + + private addScreenSession(screenSession: SCBScreenSession) { + const screenSessionIndex = this.screenSessionList.findIndex(item => { + return item.session.screenId === screenSession.session.screenId; + }) + if (screenSessionIndex != -1) { + Log.showError(TAG, 'Failed to add screen session, screen id:' + screenSession.session.screenId); + return; + } + this.screenSessionList.push(screenSession); + if (SCBSceneSessionManager.getInstance().mainScreenId === -1) { + Log.showInfo(TAG, `addScreenSession after push: ${this.screenSessionList[0].session.screenId}, mainSreenId: ${SCBSceneSessionManager.getInstance().mainScreenId}`); + SCBSceneSessionManager.getInstance().mainScreenId = this.screenSessionList[0].session.screenId; + Log.showInfo(TAG, `addScreenSession after = : ${this.screenSessionList[0].session.screenId}, mainSreenId: ${SCBSceneSessionManager.getInstance().mainScreenId}`); + } + Log.showInfo(TAG, `addScreenSession with screenId: ${screenSession.session.screenId}, mainSreenId: ${SCBSceneSessionManager.getInstance().mainScreenId}`); + } + + private removeScreenSession(screenId: number) { + const screenSessionIndex = this.screenSessionList.findIndex(item => { + return item.session.screenId === screenId; + }) + if (screenSessionIndex == -1) { + Log.showError(TAG, 'Failed to remove screen session, screen id:' + screenId); + return; + } + this.screenSessionList.splice(screenSessionIndex, 1); + } aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`); // 原来在StatusBar/DropdownPanel等处setAbilityPageName会相互覆盖,导致Style不对 CommonStyleManager.setAbilityPageName(TAG); + this.registerScreenConnectionListener() } aboutToDisappear() { @@ -43,8 +106,10 @@ struct EntryView { build() { RootScene(this.rootSceneSession.session) { ForEach(this.screenSessionList, (item) => { - HWScreen({screenSession: item}) - }, (item: HWScreenSession) => item.session.screenId.toString()) + SCBScreen({ + screenSession: item, + }) + }, (item: SCBScreenSession) => item.session.screenId.toString()) } } } diff --git a/product/phone/src/main/resources/base/profile/main_pages.json b/product/phone/src/main/resources/base/profile/main_pages.json index 53da1808..d0dcd93d 100644 --- a/product/phone/src/main/resources/base/profile/main_pages.json +++ b/product/phone/src/main/resources/base/profile/main_pages.json @@ -4,8 +4,8 @@ "pages/EmptyPage", "pages/EntryView", "pages/RecentView", - "WindowScene/screenlock/pages/digitalPassword", - "WindowScene/screenlock/pages/mixedPassword", - "WindowScene/screenlock/pages/customPassword" + "SceneBoard/screenlock/pages/digitalPassword", + "SceneBoard/screenlock/pages/mixedPassword", + "SceneBoard/screenlock/pages/customPassword" ] } -- Gitee From 028bffb769414b26ba76a287e2aa3f65c1bf673f Mon Sep 17 00:00:00 2001 From: sunhaiyang Date: Fri, 28 Apr 2023 18:11:25 +0800 Subject: [PATCH 372/373] =?UTF-8?q?=E5=8C=85=E5=90=8D=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BAsceneboard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AppScope/app.json5 | 2 +- AppScope/resources/base/element/string.json | 2 +- build-profile.json5 | 6 +++--- .../ets/default/configs/SystemApplication.ts | 2 +- .../ets/default/constants/CommonConstants.ts | 10 +++++----- common/src/main/module.json5 | 2 +- feature/settings/build-profile.json5 | 2 +- feature/settings/src/main/module.json5 | 4 ++-- .../model/NotificationDistributionManager.ts | 2 +- .../noticeItem/view/item/settingDialog.ets | 2 +- .../build-profile.json5 | 2 +- package.json | 2 +- product/pad/package.json | 2 +- product/pad/src/main/module.json5 | 6 +++--- .../main/resources/base/element/string.json | 2 +- .../main/resources/en_US/element/string.json | 2 +- .../main/resources/zh_CN/element/string.json | 2 +- product/phone/package.json | 2 +- .../src/main/ets/MainAbility/MainAbility.ts | 2 +- .../src/main/ets/SceneBoard/SCBScreen.ets | 2 +- .../SceneBoard/dropdownpanel/notification.ets | 2 +- product/phone/src/main/module.json5 | 6 +++--- .../main/resources/base/element/string.json | 2 +- .../main/resources/en_US/element/string.json | 2 +- .../main/resources/zh_CN/element/string.json | 2 +- signature/{launcher.p7b => sceneboard.p7b} | Bin 3950 -> 3952 bytes 26 files changed, 36 insertions(+), 36 deletions(-) rename signature/{launcher.p7b => sceneboard.p7b} (75%) diff --git a/AppScope/app.json5 b/AppScope/app.json5 index df6d54c9..9e63c6ee 100644 --- a/AppScope/app.json5 +++ b/AppScope/app.json5 @@ -1,6 +1,6 @@ { "app": { - "bundleName": "com.ohos.launcher", + "bundleName": "com.ohos.sceneboard", "vendor": "ohos", "versionCode": 1000000, "versionName": "1.0.0", diff --git a/AppScope/resources/base/element/string.json b/AppScope/resources/base/element/string.json index 4131987c..63d7a29c 100644 --- a/AppScope/resources/base/element/string.json +++ b/AppScope/resources/base/element/string.json @@ -2,7 +2,7 @@ "string": [ { "name": "app_name", - "value": "Launcher" + "value": "SceneBoard" } ] } diff --git a/build-profile.json5 b/build-profile.json5 index f55d2746..0de1d1d1 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -10,7 +10,7 @@ }, "modules": [ { - "name": "launcher_common", + "name": "sceneboard_common", "srcPath": "./common", "targets": [ { @@ -118,7 +118,7 @@ ], }, { - "name": "phone-launcher", + "name": "phone-sceneboard", "srcPath": "./product/phone", "targets": [ { @@ -130,7 +130,7 @@ ], }, { - "name": "pad-launcher", + "name": "pad-sceneboard", "srcPath": "./product/pad", "targets": [ { diff --git a/common/src/main/ets/default/configs/SystemApplication.ts b/common/src/main/ets/default/configs/SystemApplication.ts index d2519002..79733019 100644 --- a/common/src/main/ets/default/configs/SystemApplication.ts +++ b/common/src/main/ets/default/configs/SystemApplication.ts @@ -14,7 +14,7 @@ */ const SystemApplication = { - SystemApplicationName: 'com.ohos.launcher,com.ohos.systemui,com.ohos.devicemanagerui,com.ohos.callui,com.example.kikakeyboard,com.ohos.contactdataability,com.ohos.telephonydataability,com.ohos.medialibrary.MediaLibraryDataA,com.ohos.medialibrary.MediaScannerAbilityA,com.ohos.adminprovisioning' + SystemApplicationName: 'com.ohos.sceneboard,com.ohos.launcher,com.ohos.systemui,com.ohos.devicemanagerui,com.ohos.callui,com.example.kikakeyboard,com.ohos.contactdataability,com.ohos.telephonydataability,com.ohos.medialibrary.MediaLibraryDataA,com.ohos.medialibrary.MediaScannerAbilityA,com.ohos.adminprovisioning' }; export default SystemApplication; \ No newline at end of file diff --git a/common/src/main/ets/default/constants/CommonConstants.ts b/common/src/main/ets/default/constants/CommonConstants.ts index 0a4b0464..c589f75f 100644 --- a/common/src/main/ets/default/constants/CommonConstants.ts +++ b/common/src/main/ets/default/constants/CommonConstants.ts @@ -26,7 +26,7 @@ export class CommonConstants { /** * Bundle name of launcher */ - static LAUNCHER_BUNDLE = 'com.ohos.launcher'; + static LAUNCHER_BUNDLE = 'com.ohos.sceneboard'; /** * Module name of AppCenter. @@ -36,12 +36,12 @@ export class CommonConstants { /** * Ability name of AppCenter. */ - static APPCENTER_ABILITY = 'com.ohos.launcher.appcenter.MainAbility'; + static APPCENTER_ABILITY = 'com.ohos.sceneboard.appcenter.MainAbility'; /** * Ability name of launcher settings. */ - static SETTING_ABILITY = 'com.ohos.launcher.settings.MainAbility'; + static SETTING_ABILITY = 'com.ohos.sceneboard.settings.MainAbility'; /** * Module name of launcher settings. @@ -51,12 +51,12 @@ export class CommonConstants { /** * Ability name of launcher Recents. */ - static RECENT_ABILITY = 'com.ohos.launcher.recents.MainAbility'; + static RECENT_ABILITY = 'com.ohos.sceneboard.recents.MainAbility'; /** * Launcher Ability name. */ - static LAUNCHER_ABILITY = 'com.ohos.launcher.MainAbility'; + static LAUNCHER_ABILITY = 'com.ohos.sceneboard.MainAbility'; /** * Default invalid value. diff --git a/common/src/main/module.json5 b/common/src/main/module.json5 index 37b01840..525b9ad4 100644 --- a/common/src/main/module.json5 +++ b/common/src/main/module.json5 @@ -1,6 +1,6 @@ { "module": { - "name": "launcher_common", + "name": "sceneboard_common", "type": "har", "deviceTypes": [ "default", diff --git a/feature/settings/build-profile.json5 b/feature/settings/build-profile.json5 index 06fa1ec6..accb9e5b 100644 --- a/feature/settings/build-profile.json5 +++ b/feature/settings/build-profile.json5 @@ -7,5 +7,5 @@ "name": "default", } ], - "entryModules": ["pad-launcher","phone-launcher"] + "entryModules": ["pad-sceneboard","phone-sceneboard"] } \ No newline at end of file diff --git a/feature/settings/src/main/module.json5 b/feature/settings/src/main/module.json5 index fbf4c62a..4485c39b 100644 --- a/feature/settings/src/main/module.json5 +++ b/feature/settings/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "feature", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", - "mainElement": "com.ohos.launcher.settings.MainAbility", + "mainElement": "com.ohos.sceneboard.settings.MainAbility", "deviceTypes": [ "default", "tablet" @@ -21,7 +21,7 @@ "uiSyntax": "ets", "abilities": [ { - "name": "com.ohos.launcher.settings.MainAbility", + "name": "com.ohos.sceneboard.settings.MainAbility", "srcEntrance": "./ets/MainAbility/MainAbility.ts", "startWindowIcon": "$media:startWindowIcon", "startWindowBackground": "$color:startWindowBackground", diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts index beac9b13..83e7e3cd 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts @@ -41,7 +41,7 @@ export default class NotificationDistributionManager { initDeviceManager(): void { Log.showInfo(TAG, 'initDeviceManager'); - DeviceManager.createDeviceManager('com.ohos.launcher', (err, data) => { + DeviceManager.createDeviceManager('com.ohos.sceneboard', (err, data) => { Log.showInfo(TAG, `initDeviceManager createDeviceManager err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); if (data) { this.deviceManager = data; diff --git a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets index a200e0e8..b554469a 100644 --- a/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets +++ b/feature/systemui/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -124,7 +124,7 @@ export default struct SettingDialog { openAbility() { Log.showInfo(TAG, ` openAbility:showNotificationManagement`); - EventManager.publish(obtainStartAbility('com.ohos.launcher', 'com.ohos.sceneboard.notificationmanagement.MainAbility', + EventManager.publish(obtainStartAbility('com.ohos.sceneboard', 'com.ohos.sceneboard.notificationmanagement.MainAbility', { 'migrateUri': 'pages/setEnable', 'migrateBundle': this.itemData.bundleName })) this.closeAbility() } diff --git a/feature/systemui/notificationmanagement/build-profile.json5 b/feature/systemui/notificationmanagement/build-profile.json5 index 5f5cd5aa..451c3df7 100644 --- a/feature/systemui/notificationmanagement/build-profile.json5 +++ b/feature/systemui/notificationmanagement/build-profile.json5 @@ -5,5 +5,5 @@ "name": "default", } ], - "entryModules": ["pad-launcher","phone-launcher"] + "entryModules": ["pad-sceneboard","phone-sceneboard"] } \ No newline at end of file diff --git a/package.json b/package.json index 47de8136..0c7ecff5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "devDependencies": {}, - "name": "launcher", + "name": "sceneboard", "ohos": { "org": "huawei", "directoryLevel": "project", diff --git a/product/pad/package.json b/product/pad/package.json index 36dbac1e..7375e9d5 100644 --- a/product/pad/package.json +++ b/product/pad/package.json @@ -1,6 +1,6 @@ { "devDependencies": {}, - "name": "launcher", + "name": "sceneboard", "ohos": { "org": "huawei", "directoryLevel": "module", diff --git a/product/pad/src/main/module.json5 b/product/pad/src/main/module.json5 index 1d8b1a17..8ca50388 100644 --- a/product/pad/src/main/module.json5 +++ b/product/pad/src/main/module.json5 @@ -1,10 +1,10 @@ { "module": { - "name": "pad-launcher", + "name": "pad-sceneboard", "type": "entry", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", - "mainElement": "com.ohos.launcher.MainAbility", + "mainElement": "com.ohos.sceneboard.MainAbility", "deviceTypes": [ "default", "tablet" @@ -36,7 +36,7 @@ } ], "visible": false, - "name": "com.ohos.launcher.MainAbility", + "name": "com.ohos.sceneboard.MainAbility", "icon": "$media:icon", "description": "$string:mainability_description", "label": "$string:entry_MainAbility", diff --git a/product/pad/src/main/resources/base/element/string.json b/product/pad/src/main/resources/base/element/string.json index 04bfac4e..c09d536a 100644 --- a/product/pad/src/main/resources/base/element/string.json +++ b/product/pad/src/main/resources/base/element/string.json @@ -2,7 +2,7 @@ "string": [ { "name": "entry_MainAbility", - "value": "Launcher" + "value": "SceneBoard" }, { "name": "mainability_description", diff --git a/product/pad/src/main/resources/en_US/element/string.json b/product/pad/src/main/resources/en_US/element/string.json index 08ad7856..abbf6a9f 100644 --- a/product/pad/src/main/resources/en_US/element/string.json +++ b/product/pad/src/main/resources/en_US/element/string.json @@ -2,7 +2,7 @@ "string": [ { "name": "entry_MainAbility", - "value": "Launcher" + "value": "SceneBoard" }, { "name": "mainability_description", diff --git a/product/pad/src/main/resources/zh_CN/element/string.json b/product/pad/src/main/resources/zh_CN/element/string.json index 7d3690d0..e15bc971 100644 --- a/product/pad/src/main/resources/zh_CN/element/string.json +++ b/product/pad/src/main/resources/zh_CN/element/string.json @@ -2,7 +2,7 @@ "string": [ { "name": "entry_MainAbility", - "value": "Launcher" + "value": "SceneBoard" }, { "name": "mainability_description", diff --git a/product/phone/package.json b/product/phone/package.json index a86f43aa..366cf2ce 100644 --- a/product/phone/package.json +++ b/product/phone/package.json @@ -1,6 +1,6 @@ { "devDependencies": {}, - "name": "launcher", + "name": "sceneboard", "ohos": { "org": "huawei", "directoryLevel": "module", diff --git a/product/phone/src/main/ets/MainAbility/MainAbility.ts b/product/phone/src/main/ets/MainAbility/MainAbility.ts index db5623d0..7a1c9977 100644 --- a/product/phone/src/main/ets/MainAbility/MainAbility.ts +++ b/product/phone/src/main/ets/MainAbility/MainAbility.ts @@ -33,7 +33,7 @@ import ScreenLockManager from '@ohos/common/src/main/ets/default/manager/ScreenL import ServiceExtensionContext from 'application/ServiceExtensionContext'; import TimeManager from '@ohos/common/src/main/ets/default/manager/TimeManager'; -const TAG = 'LauncherMainAbility'; +const TAG = 'SceneBoardMainAbility'; export default class MainAbility extends ServiceExtensionAbility { onCreate(want: Want): void { diff --git a/product/phone/src/main/ets/SceneBoard/SCBScreen.ets b/product/phone/src/main/ets/SceneBoard/SCBScreen.ets index ef8ac91b..85c78061 100644 --- a/product/phone/src/main/ets/SceneBoard/SCBScreen.ets +++ b/product/phone/src/main/ets/SceneBoard/SCBScreen.ets @@ -32,7 +32,7 @@ import WindowPanelManager, { SystemUi_VolumePanel } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager'; -const MODULE_NAME = "phone-launcher"; +const MODULE_NAME = "phone-sceneboard"; const TAG = 'SCBScreen'; @Component diff --git a/product/phone/src/main/ets/SceneBoard/dropdownpanel/notification.ets b/product/phone/src/main/ets/SceneBoard/dropdownpanel/notification.ets index 2cbb0516..af0f8c79 100644 --- a/product/phone/src/main/ets/SceneBoard/dropdownpanel/notification.ets +++ b/product/phone/src/main/ets/SceneBoard/dropdownpanel/notification.ets @@ -269,7 +269,7 @@ struct CenterTitle { settingClick() { Log.showDebug(TAG, ` settingClick `) // TODO 修改为合一服务的Ability - EventManager.publish(obtainStartAbility('com.ohos.launcher', 'com.ohos.sceneboard.notificationmanagement.MainAbility')) + EventManager.publish(obtainStartAbility('com.ohos.sceneboard', 'com.ohos.sceneboard.notificationmanagement.MainAbility')) } touchEvent(event: TouchEvent) { diff --git a/product/phone/src/main/module.json5 b/product/phone/src/main/module.json5 index 2b0272b9..2539e7d5 100644 --- a/product/phone/src/main/module.json5 +++ b/product/phone/src/main/module.json5 @@ -1,10 +1,10 @@ { "module": { - "name": "phone-launcher", + "name": "phone-sceneboard", "type": "entry", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", - "mainElement": "com.ohos.launcher.MainAbility", + "mainElement": "com.ohos.sceneboard.MainAbility", "deviceTypes": [ "default", "tablet" @@ -36,7 +36,7 @@ } ], "visible": true, - "name": "com.ohos.launcher.MainAbility", + "name": "com.ohos.sceneboard.MainAbility", "icon": "$media:icon", "description": "$string:mainability_description", "label": "$string:entry_MainAbility", diff --git a/product/phone/src/main/resources/base/element/string.json b/product/phone/src/main/resources/base/element/string.json index 97bf4ff9..7aac3ae6 100644 --- a/product/phone/src/main/resources/base/element/string.json +++ b/product/phone/src/main/resources/base/element/string.json @@ -2,7 +2,7 @@ "string": [ { "name": "entry_MainAbility", - "value": "Launcher" + "value": "SceneBoard" }, { "name": "mainability_description", diff --git a/product/phone/src/main/resources/en_US/element/string.json b/product/phone/src/main/resources/en_US/element/string.json index f23e17e1..64d41586 100644 --- a/product/phone/src/main/resources/en_US/element/string.json +++ b/product/phone/src/main/resources/en_US/element/string.json @@ -2,7 +2,7 @@ "string": [ { "name": "entry_MainAbility", - "value": "Launcher" + "value": "SceneBoard" }, { "name": "mainability_description", diff --git a/product/phone/src/main/resources/zh_CN/element/string.json b/product/phone/src/main/resources/zh_CN/element/string.json index 97f01352..caaaebe1 100644 --- a/product/phone/src/main/resources/zh_CN/element/string.json +++ b/product/phone/src/main/resources/zh_CN/element/string.json @@ -2,7 +2,7 @@ "string": [ { "name": "entry_MainAbility", - "value": "Launcher" + "value": "SceneBoard" }, { "name": "mainability_description", diff --git a/signature/launcher.p7b b/signature/sceneboard.p7b similarity index 75% rename from signature/launcher.p7b rename to signature/sceneboard.p7b index eebe2f01476ce27c35b7861253daf005221e311a..d81e1dd5a7b2d90178a966b40a7577ba7b7d921f 100644 GIT binary patch delta 234 zcmaDS_d(9Vpou?+jZ>@5qwPB{BRkWACjMBUP$Uy0qam*WHydX{n+IbmGYb==K@&SK zLLuXVCboYpO>Dn5Iux^T6(^_Wr6%Pk7Nu<7&7#6pZ)9O$ZenR{7GDzY1dcHpNd7)gDM&&ZaD{-?vY@L+1P|kphjRWYIbG9tZOf2pOu1tyy z&DDiZ-U@SX6x0l`DqEpx9s2Br)->m?S=^~pz4rgqd(5O@7Ni;%yZP%o7TJpYZx`k) X5?B`KkaosJj+5p5D)F6btX}{CBf?PX delta 232 zcmew$_fF2ipou?=jZ>@5qwPB{BRkWACjMxkP&gAKqam*WHydX{n+IbmGYb==K@&TW z3scCrpo#4dOB36VjSj^u965=ldC3{6MVt4ssBqOA0)eTasdDPX2=jicC||J!PK(}Ou$ZEtOyvVy~ai;V+l!#P_PW+oPQ16L*m)yIW9 z8=0Oj{=1^6j8xcth!t#LW)&h-M4 Um)P<+_Hooo{5VnaZM)QR0184=umAu6 -- Gitee From e5ba0cd199aee9f024918aebaae1074f5fd599ff Mon Sep 17 00:00:00 2001 From: liuqi Date: Thu, 11 May 2023 16:26:47 +0800 Subject: [PATCH 373/373] add specific session Signed-off-by: liuqi --- common/index.ets | 3 +- .../scene/session/SCBSceneSession.ts | 46 +++++- .../scene/session/SCBSceneSessionManager.ts | 22 +++ .../scene/session/SCBSpecificSession.ts | 61 ++++++++ .../src/main/ets/SceneBoard/SCBDivider.ets | 2 +- .../src/main/ets/SceneBoard/SCBScene.ets | 89 ++++++------ .../main/ets/SceneBoard/SCBSceneContainer.ets | 136 ++++++++++++++++-- .../src/main/ets/SceneBoard/SCBScenePanel.ets | 2 +- .../src/main/ets/SceneBoard/SCBScreen.ets | 48 ++++++- .../main/ets/SceneBoard/SCBSpecificScene.ets | 57 ++++++++ .../ets/SceneBoard/SCBSpecificScenePanel.ets | 38 +++++ 11 files changed, 442 insertions(+), 62 deletions(-) create mode 100644 common/src/main/ets/WindowScene/scene/session/SCBSpecificSession.ts create mode 100644 product/phone/src/main/ets/SceneBoard/SCBSpecificScene.ets create mode 100644 product/phone/src/main/ets/SceneBoard/SCBSpecificScenePanel.ets diff --git a/common/index.ets b/common/index.ets index 257845fd..29c43d02 100644 --- a/common/index.ets +++ b/common/index.ets @@ -91,7 +91,8 @@ export { SCBRootSceneSession } from './src/main/ets/WindowScene/scene/session/SC export { SCBSceneInfo } from './src/main/ets/WindowScene/scene/session/SCBSceneInfo' export { SCBDividerParam } from './src/main/ets/WindowScene/scene/session/SCBDividerParam' export { SCBSceneSession } from './src/main/ets/WindowScene/scene/session/SCBSceneSession' -export { SCBSceneSessionManager } from './src/main/ets/WindowScene/scene/session/SCBSceneSessionManager' +export { SCBSpecificSession } from './src/main/ets/WindowScene/scene/session/SCBSpecificSession' +export { SCBSceneSessionManager, SCBSpecificSceneSessionList } from './src/main/ets/WindowScene/scene/session/SCBSceneSessionManager' export { SCBScreenSession, SCBScreenProperty } from './src/main/ets/WindowScene/screen/session/SCBScreenSession' export { SCBSceneContainerSession } from './src/main/ets/WindowScene/scene/session/SCBSceneContainerSession' export { SCBSceneContainerSessionArray } from './src/main/ets/WindowScene/scene/session/SCBSceneContainerSession' diff --git a/common/src/main/ets/WindowScene/scene/session/SCBSceneSession.ts b/common/src/main/ets/WindowScene/scene/session/SCBSceneSession.ts index 7bca8944..724386d2 100644 --- a/common/src/main/ets/WindowScene/scene/session/SCBSceneSession.ts +++ b/common/src/main/ets/WindowScene/scene/session/SCBSceneSession.ts @@ -12,12 +12,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import sceneSessionManager from '@ohos.sceneSessionManager' + +import { Log } from '../../../default/utils/Log' import { SCBSceneInfo } from './SCBSceneInfo' -import { SCBSceneSessionManager } from './SCBSceneSessionManager' +import { SCBSceneSessionManager, SCBSpecificSceneSessionList } from './SCBSceneSessionManager' import { SCBTransitionEffect } from '../../animation/SCBTransitionEffect' +const TAG = 'SCBSceneSession' + /** * Session of a scene. */ @@ -31,6 +34,12 @@ export class SCBSceneSession { scaleX: number = 1; scaleY: number = 1; + sessionState: sceneSessionManager.SessionState; + sessionRectChangeCallback: Function; + createSubSessionCallback: Function; + subSessionStateChangeCallback: Function; + subSessionList: SCBSpecificSceneSessionList = new SCBSpecificSceneSessionList(); + /** * Constructor. * @param session Session of the scene @@ -42,6 +51,20 @@ export class SCBSceneSession { this.session.on('pendingSceneSessionActivation', (info) => { this.onPendingSceneSessionActivation(info); }) + + this.session.on('sessionStateChange', (state) => { + this.onSessionStateChange(state); + }) + } + + public registerCreateSubSessionCallback(callback: Function) { + Log.showInfo(TAG, `registerCreateSubSessionCallback`); + this.createSubSessionCallback = callback; + } + + public registerSubSessionActiveStatueChangeCallback(callback: Function) { + Log.showInfo(TAG, `registerSubSessionActiveStatueChangeCallback`); + this.subSessionStateChangeCallback = callback; } private onPendingSceneSessionActivation(sceneInfo: sceneSessionManager.SceneInfo) { @@ -67,4 +90,23 @@ export class SCBSceneSession { this.isActive = false; sceneSessionManager.requestSceneSessionDestruction(this.session); } + + public handleSubSessionStateChange(state: sceneSessionManager.SessionState, sessionId: Number) { + Log.showInfo(TAG, `handleSubSessionStateChange, state: ${state}, sessionId: ${sessionId}`); + if (this.subSessionStateChangeCallback) { + this.subSessionStateChangeCallback(this, sessionId, state); + } + } + + private onCreateSpecificSession(specificSession: sceneSessionManager.SceneSession) { + Log.showInfo(TAG, 'onCreateSpecificSession'); + if (this.createSubSessionCallback) { + this.createSubSessionCallback(this, specificSession); + } + } + + private onSessionStateChange(state: sceneSessionManager.SessionState) { + Log.showDebug(TAG, `onSessionStageChange, state: ${state}`); + this.sessionState = state; + } } diff --git a/common/src/main/ets/WindowScene/scene/session/SCBSceneSessionManager.ts b/common/src/main/ets/WindowScene/scene/session/SCBSceneSessionManager.ts index 1df83208..d105d996 100644 --- a/common/src/main/ets/WindowScene/scene/session/SCBSceneSessionManager.ts +++ b/common/src/main/ets/WindowScene/scene/session/SCBSceneSessionManager.ts @@ -13,13 +13,20 @@ * limitations under the License. */ +import sceneSessionManager from '@ohos.sceneSessionManager' import ServiceExtensionContext from 'application/ServiceExtensionContext' + import { SCBRootSceneSession } from './SCBRootSceneSession' import { SCBSceneInfo } from './SCBSceneInfo' +import { SCBSpecificSession } from './SCBSpecificSession' import { Log } from '../../../default/utils/Log' const TAG = 'SCBSceneSessionManager'; +@Observed +export class SCBSpecificSceneSessionList extends Array { +} + /** * Scene session manager */ @@ -29,10 +36,20 @@ export class SCBSceneSessionManager { private backgroundSceneFuncMap: Map = new Map(); private destroySceneFuncMap: Map = new Map(); private activateSceneFuncMap: Map = new Map(); + private createSpecificSceneCallback: Function; // callback of create system specific session public mainScreenId: number = -1; private constructor() { this.rootSceneSession = new SCBRootSceneSession(); + // register native function for create specific session + sceneSessionManager.on('createSpecificSession', (specificSession) => { + this.onCreateSpecificSession(specificSession); + }) + } + + private onCreateSpecificSession(specificSession: sceneSessionManager.SceneSession) { + Log.showError(TAG, `onCreateSpecificSession: persistentId: ${specificSession.persistentId}`); + this.createSpecificSceneCallback(specificSession); } /** @@ -108,6 +125,11 @@ export class SCBSceneSessionManager { this.destroySceneFuncMap.set(screenId, callback); } + public registerCreateSpecificSceneCallback(callback: Function) { + Log.showDebug(TAG, `registerCreateSpecificSceneCallback`); + this.createSpecificSceneCallback = callback; + } + /** * Start a scene. * @param sceneInfo The info of the scene which to be activated diff --git a/common/src/main/ets/WindowScene/scene/session/SCBSpecificSession.ts b/common/src/main/ets/WindowScene/scene/session/SCBSpecificSession.ts new file mode 100644 index 00000000..febefb76 --- /dev/null +++ b/common/src/main/ets/WindowScene/scene/session/SCBSpecificSession.ts @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2023 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 sceneSessionManager from '@ohos.sceneSessionManager' +import { Log } from '../../../default/utils/Log' + +const TAG = 'SCBSpecificSession' + +/** + * Session of system scene or sub scene + */ +@Observed +export class SCBSpecificSession { + readonly session: sceneSessionManager.SceneSession; + isActive: boolean = false; + translateX: number = 0; + translateY: number = 0; + scaleX: number = 1; + scaleY: number = 1; + sessionState: sceneSessionManager.SessionState; + + /* + * callback of session state change + */ + stateChangeCallback: Function + + + /** + * Constructor. + * @param session Session of the scene + * @param sceneInfo Information of the scene + */ + constructor(session: sceneSessionManager.SceneSession, callback: Function) { + Log.showInfo(TAG, 'constructor'); + this.session = session; + this.stateChangeCallback = callback; + this.isActive = false; + this.sessionState = sceneSessionManager.SessionState.STATE_DISCONNECT; + this.session.on('sessionStateChange', (state) => { + this.onSessionStateChange(state); + }) + } + + private onSessionStateChange(state: sceneSessionManager.SessionState) { + if (this.stateChangeCallback) { + this.stateChangeCallback(state, this.session.persistentId); + } + }; +} diff --git a/product/phone/src/main/ets/SceneBoard/SCBDivider.ets b/product/phone/src/main/ets/SceneBoard/SCBDivider.ets index 4fe3749a..b9db02de 100644 --- a/product/phone/src/main/ets/SceneBoard/SCBDivider.ets +++ b/product/phone/src/main/ets/SceneBoard/SCBDivider.ets @@ -29,7 +29,7 @@ export struct SCBDivider { buildLog1() { Log.showInfo(TAG, "Action begin primaryH: " + parseFloat(this.dividerParam.primaryH)) - return true + return true; } getSecondaryH(): string { diff --git a/product/phone/src/main/ets/SceneBoard/SCBScene.ets b/product/phone/src/main/ets/SceneBoard/SCBScene.ets index 924f564f..c48bf823 100644 --- a/product/phone/src/main/ets/SceneBoard/SCBScene.ets +++ b/product/phone/src/main/ets/SceneBoard/SCBScene.ets @@ -13,12 +13,13 @@ * limitations under the License. */ + +import sceneSessionManager from '@ohos.sceneSessionManager' import { SCBSceneSession, SCBDividerParam, SceneState, SCBGestureModel } from '@ohos/common' import { SCBGestureActionId, SCBGestureAction } from '@ohos/common' import { StyleConstants } from '@ohos/common' import { Log } from '@ohos/common' - const TAG = 'SCBScene' @Component @@ -27,6 +28,8 @@ export struct SCBScene { @Link dividerParam: SCBDividerParam @StorageLink('gestureModel') gestureModel: SCBGestureModel = new SCBGestureModel() onGestureChange: Function; + onCreateSubSession: Function; + onSubSessionChange: Function; buildLog(sceneSession: SCBSceneSession) { if (sceneSession) { @@ -35,32 +38,38 @@ export struct SCBScene { Log.showError(TAG, 'SCBSceneSession is null'); } Log.showInfo(TAG, 'SCBScene build: ' + this.sceneSession?.sceneInfo.bundleName + ' id: ' + this.sceneSession?.session.persistentId); - return true + return true; } buildLog1() { Log.showInfo(TAG, 'SCBScene panGesture end '); - return true + return true; } buildLog3() { Log.showInfo(TAG, 'SCBScene longPress begin'); - return true + return true; } enableShow() { - if (this.sceneSession) { - if (this.sceneSession.isActive) { - return true; - } - if (this.gestureModel.sceneState === SceneState.SLIDING_UP || this.gestureModel.sceneState === SceneState.RECENT) { - return true; - } + if (this.sceneSession && this.sceneSession.isActive) { + return true; + } + if (this.sceneSession && (this.gestureModel.sceneState === SceneState.SLIDING_UP || this.gestureModel.sceneState === SceneState.RECENT)) { + return true; } Log.showInfo(TAG, 'enable show is false'); return false; } + aboutToAppear() { + // registerCreateSubSessionCallback + this.sceneSession?.registerCreateSubSessionCallback(this.onCreateSubSession); + + // registerSubSessionActiveStatueChangeCallback + this.sceneSession?.registerSubSessionActiveStatueChangeCallback(this.onSubSessionChange); + } + build() { if (this.enableShow()) { Stack() { @@ -73,35 +82,35 @@ export struct SCBScene { } .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) .priorityGesture( - GestureGroup(GestureMode.Sequence, - LongPressGesture({ repeat: true }) - .onAction((event: GestureEvent) => { - if (this.buildLog3()) { - } - }) - .onActionEnd(() => { - this.gestureModel.enableScroll = false - }), - PanGesture({ direction: PanDirection.Horizontal }) // when screen is vertical, use Vertical - .onActionStart((event: GestureEvent) => { - }) - .onActionUpdate((event: GestureEvent) => { - this.sceneSession.translateX = event.offsetX; - }) - .onActionEnd((event: GestureEvent) => { - if (this.buildLog1()) { - } - if (event.offsetX < -200 || event.offsetX > 200) { - let action = new SCBGestureAction({ - id: SCBGestureActionId.EXIT_SPILT, - sessionId: this.sceneSession.session.persistentId - }); - this.onGestureChange && this.onGestureChange(action); - } - this.dividerParam.init(); - this.sceneSession.translateX = 0; - }) - ) + GestureGroup(GestureMode.Sequence, + LongPressGesture({ repeat: true }) + .onAction((event: GestureEvent) => { + if (this.buildLog3()) { + } + }) + .onActionEnd(() => { + this.gestureModel.enableScroll = false + }), + PanGesture({ direction: PanDirection.Horizontal }) // when screen is vertical, use Vertical + .onActionStart((event: GestureEvent) => { + }) + .onActionUpdate((event: GestureEvent) => { + this.sceneSession.translateX = event.offsetX; + }) + .onActionEnd((event: GestureEvent) => { + if (this.buildLog1()) { + } + if (event.offsetX < -200 || event.offsetX > 200) { + let action = new SCBGestureAction({ + id: SCBGestureActionId.EXIT_SPILT, + sessionId: this.sceneSession.session.persistentId + }); + this.onGestureChange && this.onGestureChange(action); + } + this.dividerParam.init(); + this.sceneSession.translateX = 0; + }) + ) ) } } diff --git a/product/phone/src/main/ets/SceneBoard/SCBSceneContainer.ets b/product/phone/src/main/ets/SceneBoard/SCBSceneContainer.ets index 60b55a8f..80f844d1 100644 --- a/product/phone/src/main/ets/SceneBoard/SCBSceneContainer.ets +++ b/product/phone/src/main/ets/SceneBoard/SCBSceneContainer.ets @@ -14,22 +14,36 @@ */ import curves from '@ohos.curves' -import { SCBSceneContainerSession, SCBDividerParam, SCBGestureModel } from '@ohos/common' +import sceneSessionManager from '@ohos.sceneSessionManager' +import { SCBSceneContainerSession, SCBDividerParam, SCBGestureModel, SCBSceneSession } from '@ohos/common' +import { SCBSpecificSession, SCBSpecificSceneSessionList } from '@ohos/common' import { SceneState } from '@ohos/common'; import { SCBSceneSessionManager, SCBGestureAction, SCBGestureActionId, SCBScreenProperty } from '@ohos/common'; import { SCBScene } from './SCBScene' +import { SCBSpecificScene } from './SCBSpecificScene' import { SCBDivider } from './SCBDivider' import { Log } from '@ohos/common' import { StyleConstants } from '@ohos/common' const TAG = 'SCBSceneContainer' +export const ACTIVE_STATUS_MAP: Map = new Map([ + [sceneSessionManager.SessionState.STATE_CONNECT, false], + [sceneSessionManager.SessionState.STATE_FOREGROUND, true], + [sceneSessionManager.SessionState.STATE_ACTIVE, true], + [sceneSessionManager.SessionState.STATE_INACTIVE, true], + [sceneSessionManager.SessionState.STATE_BACKGROUND, false], + [sceneSessionManager.SessionState.STATE_DISCONNECT, false], +]); + @Component export struct SCBSceneContainer { @ObjectLink sceneContainerSession: SCBSceneContainerSession; @ObjectLink dividerParam: SCBDividerParam; @Link screenProperty: SCBScreenProperty; @StorageLink('gestureModel') gestureModel: SCBGestureModel = new SCBGestureModel(); + @State priSubList: SCBSpecificSceneSessionList = new SCBSpecificSceneSessionList(); + @State secSubList: SCBSpecificSceneSessionList = new SCBSpecificSceneSessionList(); containerIdx : number; onGestureChange: Function; @@ -38,7 +52,7 @@ export struct SCBSceneContainer { Log.showInfo(TAG, " containerIdx: "+ this.containerIdx + " containerId: " + this.sceneContainerSession.containerId + ' transX: ' + this.sceneContainerSession.translateX + ' transY: ' + this.sceneContainerSession.translateY + ' scaleX: ' + this.sceneContainerSession.scaleX + ' scaleY: ' + this.sceneContainerSession.scaleY) - return true + return true; } buildLog() { @@ -50,12 +64,76 @@ export struct SCBSceneContainer { return false; } if (this.sceneContainerSession && this.sceneContainerSession.isActive) { - return true + return true; } if (this.gestureModel.sceneState === SceneState.SLIDING_UP || this.gestureModel.sceneState === SceneState.RECENT) { - return true + return true; + } + return false; + } + + onCreateSubSession(sceneSession: SCBSceneSession, specificSession: sceneSessionManager.SceneSession) { + var subList; + if (this.sceneContainerSession.primarySession && + this.sceneContainerSession.primarySession.session.persistentId == sceneSession.session.persistentId) { + subList = this.priSubList; + Log.showInfo(TAG,'Parent of subSession is primary'); + } else if (this.sceneContainerSession.secondarySession && + this.sceneContainerSession.secondarySession.session.persistentId == sceneSession.session.persistentId) { + subList = this.secSubList; + Log.showInfo(TAG,'Parent of subSession is secondary'); + } else { + Log.showError(TAG, 'Invalid scene session'); + return; + } + const indexInAll = subList.findIndex(item => { + return item.session.persistentId === specificSession.persistentId; + }); + if (indexInAll == -1) { + let hwSceneSession = new SCBSpecificSession(specificSession, sceneSession.handleSubSessionStateChange.bind(sceneSession)); + subList.push(hwSceneSession); + } else { + Log.showInfo(TAG, `Session is already in subList, id: ${specificSession.persistentId}, index: ${indexInAll}`); + } + } + + onSubSessionActiveStatueChange(sceneSession: SCBSceneSession, persistentId: number, state: sceneSessionManager.SessionState) { + var subList; + if (this.sceneContainerSession.primarySession && + this.sceneContainerSession.primarySession.session.persistentId == sceneSession.session.persistentId) { + subList = this.priSubList; + Log.showInfo(TAG,'Parent of subSession is primary'); + } else if (this.sceneContainerSession.secondarySession && + this.sceneContainerSession.secondarySession.session.persistentId == sceneSession.session.persistentId) { + subList = this.secSubList; + Log.showInfo(TAG,'Parent of subSession is secondary'); + } else { + Log.showError(TAG, 'Invalid scene session'); + return; + } + const index = subList.findIndex(item => { + return item.session.persistentId == persistentId; + }); + if (index != -1) { + let isActive = ACTIVE_STATUS_MAP.get(state) + if (isActive == undefined || !subList[index]) { + return; + } + if (state == sceneSessionManager.SessionState.STATE_DISCONNECT) { + subList.splice(index, 1); + return; + } + subList[index].isActive = isActive; + subList[index].sessionState = state; + Log.showInfo(TAG, `Session avtive status change, persistentId: ${persistentId}, isActive: ${subList[index].isActive}, length: ${subList.length}}`); } - return false + } + + aboutToAppear() { + this.priSubList = this.sceneContainerSession.primarySession?.subSessionList; + this.secSubList = this.sceneContainerSession.secondarySession?.subSessionList; + this.onCreateSubSession = this.onCreateSubSession.bind(this); + this.onSubSessionActiveStatueChange = this.onSubSessionActiveStatueChange.bind(this); } build() { @@ -64,11 +142,25 @@ export struct SCBSceneContainer { Column() { if (this.buildLog2()) {} if (this.sceneContainerSession.primarySession) { - SCBScene({ sceneSession: this.sceneContainerSession.primarySession, dividerParam: $dividerParam, onGestureChange: this.onGestureChange }) - .width('100%') - .height(this.dividerParam.primaryH) - .scale({ y: this.dividerParam.primaryScaleY, centerY: 0 }) - .blur(this.dividerParam.blurRadius) + Stack() { + // Scene Session + SCBScene({ + sceneSession: this.sceneContainerSession.primarySession, + dividerParam: $dividerParam, + onGestureChange: this.onGestureChange, + onCreateSubSession: this.onCreateSubSession, + onSubSessionChange: this.onSubSessionActiveStatueChange + }) + .width('100%') + .height(this.dividerParam.primaryH) + .scale({ y: this.dividerParam.primaryScaleY, centerY: 0 }) + .blur(this.dividerParam.blurRadius) + + // Sub SceneSession + ForEach(this.priSubList, (item: SCBSpecificSession) => { + SCBSpecificScene({ specificSession: item, screenProperty: $screenProperty}) + }, (item: SCBSpecificSession) => item.session.persistentId.toString()) + } } // divider @@ -79,11 +171,25 @@ export struct SCBSceneContainer { // When primary Exit if (this.sceneContainerSession.secondarySession) { - SCBScene({ sceneSession: this.sceneContainerSession.secondarySession, dividerParam: $dividerParam, onGestureChange: this.onGestureChange }) - .scale({ y: this.dividerParam.secondaryScaleY, centerY: 0 }) - .blur(this.dividerParam.blurRadius) - .translate({ y: this.dividerParam.secTransY }) - .flexShrink(1) + Stack() { + // Scene Session + SCBScene({ + sceneSession: this.sceneContainerSession.secondarySession, + dividerParam: $dividerParam, + onGestureChange: this.onGestureChange, + onCreateSubSession: this.onCreateSubSession, + onSubSessionChange: this.onSubSessionActiveStatueChange + }) + .scale({ y: this.dividerParam.secondaryScaleY, centerY: 0 }) + .blur(this.dividerParam.blurRadius) + .translate({ y: this.dividerParam.secTransY }) + .flexShrink(1) + + // Sub SceneSession + ForEach(this.secSubList, (item: SCBSpecificSession) => { + SCBSpecificScene({ specificSession: item, screenProperty: $screenProperty}) + }, (item: SCBSpecificSession) => item.session.persistentId.toString()) + } } } .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) diff --git a/product/phone/src/main/ets/SceneBoard/SCBScenePanel.ets b/product/phone/src/main/ets/SceneBoard/SCBScenePanel.ets index 2357b204..7b01f498 100644 --- a/product/phone/src/main/ets/SceneBoard/SCBScenePanel.ets +++ b/product/phone/src/main/ets/SceneBoard/SCBScenePanel.ets @@ -50,7 +50,7 @@ export struct SCBScenePanel { return true; } - // sceneSessionManager 当前屏幕的scene的添加 + // sceneSessionManager Add scene of current screen isRecent(): boolean { Log.showInfo(TAG,"isRecent = " +(this.gestureModel.sceneState === SceneState.RECENT)) Log.showInfo(TAG, "this.gestureModel.flexOffsetX: " + (this.gestureModel.flexOffsetX) + ' flexWidth: ' + (this.gestureModel.flexWidth)) diff --git a/product/phone/src/main/ets/SceneBoard/SCBScreen.ets b/product/phone/src/main/ets/SceneBoard/SCBScreen.ets index 85c78061..c69fabb1 100644 --- a/product/phone/src/main/ets/SceneBoard/SCBScreen.ets +++ b/product/phone/src/main/ets/SceneBoard/SCBScreen.ets @@ -15,6 +15,7 @@ import { SCBScenePanel } from './SCBScenePanel' import { SCBScreenSession, SCBScreenProperty } from '@ohos/common' +import { SCBSpecificSceneSessionList, SCBSceneSessionManager, SCBSpecificSession } from '@ohos/common' import { SCBDesktop } from './SCBDesktop' import { SCBWallpaper } from './SCBWallpaper' import { SCBStatusBar } from './statusbar/SCBStatusBar'; @@ -31,6 +32,9 @@ import WindowPanelManager, { SystemUi_BannerNotice, SystemUi_VolumePanel } from '@ohos/common/src/main/ets/default/manager/WindowPanelManager'; +import { SCBSpecificScenePanel } from './SCBSpecificScenePanel' +import sceneSessionManager from '@ohos.sceneSessionManager' +import { ACTIVE_STATUS_MAP } from './SCBSceneContainer' const MODULE_NAME = "phone-sceneboard"; const TAG = 'SCBScreen'; @@ -42,13 +46,46 @@ export struct SCBScreen { @StorageLink(SystemUi_DropdownPanel) mDropDownInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.DROPDOWN_PANEL); @StorageLink(SystemUi_BannerNotice) mBannerInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.BANNER_NOTICE); @StorageLink(SystemUi_VolumePanel) mVolumeInfo: WindowInfo = WindowPanelManager.getWindowInfo(WindowType.VOLUME_PANEL); + @State systemSceneList: SCBSpecificSceneSessionList = new SCBSpecificSceneSessionList(); - // screen 数据改变 + // screen property change onScreenPropertyChange(screenProperty: screenSessionManager.ScreenProperty) { Log.showInfo(TAG, 'scbScreenProperty'); this.scbScreenProperty.update(screenProperty); this.scbScreenProperty.screenId = this.screenSession.session.screenId; - Log.showInfo(TAG, `Update scbScreenProperty[${this.scbScreenProperty.left}, ${this.scbScreenProperty.top}, ${this.scbScreenProperty.width}, ${this.scbScreenProperty.height}]`) + Log.showInfo(TAG, `Update scbScreenProperty[${this.scbScreenProperty.left}, ${this.scbScreenProperty.top}, + ${this.scbScreenProperty.width}, ${this.scbScreenProperty.height}]`) + } + + onSessionStateChange(state: sceneSessionManager.SessionState, sessionId: Number) { + const index = this.systemSceneList.findIndex(item => { + return item.session.persistentId == sessionId; + }); + if (index != -1) { + let isActive = ACTIVE_STATUS_MAP.get(state) + if (isActive == undefined || !this.systemSceneList[index]) { + return; + } + this.systemSceneList[index].isActive = isActive; + if (state == sceneSessionManager.SessionState.STATE_DISCONNECT) { + this.systemSceneList.splice(index, 1); + return; + } + Log.showInfo(TAG, `onSubSessionActiveStatueChange persistentId: ${sessionId}, isActive: ${this.systemSceneList[index].isActive}, length: ${this.systemSceneList.length}}`); + } + } + + onCreateSpecificScene(specificSession: sceneSessionManager.SceneSession) { + const indexInAll = this.systemSceneList.findIndex(item => { + return item.session?.persistentId === specificSession?.persistentId; + }); + if (indexInAll == -1) { + let hwSceneSession = new SCBSpecificSession(specificSession, this.onSessionStateChange); + this.systemSceneList.push(hwSceneSession); + } else { + Log.showInfo(TAG, `Session is already in subList, id: ${specificSession.persistentId}, index: ${indexInAll}`); + } + Log.showInfo(TAG, `onCreateSpecificScene`); } aboutToAppear() { @@ -56,6 +93,10 @@ export struct SCBScreen { this.screenSession.registerPropertyChange((screenProperty: screenSessionManager.ScreenProperty) => { this.onScreenPropertyChange(screenProperty); }) + this.onSessionStateChange = this.onSessionStateChange.bind(this); + SCBSceneSessionManager.getInstance().registerCreateSpecificSceneCallback((specificSession: sceneSessionManager.SceneSession) => { + this.onCreateSpecificScene(specificSession); + }) } build() { @@ -71,6 +112,9 @@ export struct SCBScreen { screenProperty: $scbScreenProperty }) + // system app + SCBSpecificScenePanel({systemSceneList: this.systemSceneList, screenProperty: $scbScreenProperty}) + // status bar SCBStatusBar({bounds : this.screenSession.bounds, moduleName: MODULE_NAME}) .position({x: 0, y: 0}) diff --git a/product/phone/src/main/ets/SceneBoard/SCBSpecificScene.ets b/product/phone/src/main/ets/SceneBoard/SCBSpecificScene.ets new file mode 100644 index 00000000..1bfaafd2 --- /dev/null +++ b/product/phone/src/main/ets/SceneBoard/SCBSpecificScene.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2023 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 { Log } from '@ohos/common' +import { SCBSpecificSession, SCBScreenProperty } from '@ohos/common' +import { StyleConstants } from '@ohos/common' + +const TAG = 'SCBSpecificScene' + +@Component +export struct SCBSpecificScene { + @ObjectLink @Watch("BuildSCBSpecificScene") specificSession: SCBSpecificSession; + @Link screenProperty: SCBScreenProperty; + + BuildSCBSpecificScene() { + Log.showInfo(TAG, 'Build BuildSCBSpecificScene'); + } + + buildLog(specificSession: SCBSpecificSession) { + if (specificSession) { + Log.showDebug(TAG, 'Build SCBSpecificSession' + ' id: ' + this.specificSession?.session.persistentId); + } else { + Log.showError(TAG, 'SCBSceneSession is null'); + } + return true; + } + + enableShow() { + if (this.specificSession && this.specificSession.isActive) { + Log.showDebug(TAG, 'enable show is true'); + return true; + } + Log.showError(TAG, 'enable show is false'); + return false; + } + + build() { + if (this.enableShow()) { + if (this.buildLog(this.specificSession)) { + } + HostWindowScene(this.specificSession?.session.persistentId) + .size({ width: StyleConstants.PERCENTAGE_100, height: StyleConstants.PERCENTAGE_100 }) + } + } +} diff --git a/product/phone/src/main/ets/SceneBoard/SCBSpecificScenePanel.ets b/product/phone/src/main/ets/SceneBoard/SCBSpecificScenePanel.ets new file mode 100644 index 00000000..832207c9 --- /dev/null +++ b/product/phone/src/main/ets/SceneBoard/SCBSpecificScenePanel.ets @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023 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 { Log } from '@ohos/common' +import { SCBSpecificSession, SCBSpecificSceneSessionList, SCBScreenProperty } from '@ohos/common' +import { SCBSpecificScene } from './SCBSpecificScene' + +const TAG = 'SCBSpecificScenePanel' + +@Component +export struct SCBSpecificScenePanel { + @ObjectLink @Watch("BuildSCBSpecificScenePanel") systemSceneList: SCBSpecificSceneSessionList; + @Link screenProperty: SCBScreenProperty; + + BuildSCBSpecificScenePanel() { + Log.showInfo(TAG, 'Build SCBSpecificScenePanel'); + } + + build() { + Stack() { + ForEach(this.systemSceneList, (item: SCBSpecificSession) => { + SCBSpecificScene({ specificSession: item, screenProperty: $screenProperty }) + }, (item: SCBSpecificSession) => item.session?.persistentId.toString()) + } + } +} -- Gitee

    Nm<_62yOMh)=|3N%3(OSHQ)|*-<7={rUym=* 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 YDv;t+&#hlb0^BqnJyorEU>){<0CTmNwEzGB literal 0 HcmV?d00001 -- Gitee From 08bb0e8ea6a2f9c758b40d1ed8c0f28d2b2db18f Mon Sep 17 00:00:00 2001 From: r00498791 Date: Thu, 12 May 2022 11:08:03 +0800 Subject: [PATCH 076/373] modify settingsData key Signed-off-by: r00498791 --- common/src/main/ets/default/TimeManager.ts | 2 +- .../src/main/ets/default/brightnessManager.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts index 7fbdf1f1..8b432915 100644 --- a/common/src/main/ets/default/TimeManager.ts +++ b/common/src/main/ets/default/TimeManager.ts @@ -32,7 +32,7 @@ export type TimeEventArgs = { const TAG = "TimeManager"; const URI_VAR = "dataability:///com.ohos.settingsdata.DataAbility"; -const TIME_FORMAT_KEY = "settings.time.format"; +const TIME_FORMAT_KEY = settings.date.TIME_FORMAT; const TIME_SUBSCRIBE_INFO = { events: [ commonEvent.Support.COMMON_EVENT_TIME_CHANGED, diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index eb06e36b..ef9bae2b 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -21,7 +21,7 @@ import featureAbility from '@ohos.ability.featureAbility'; import Brightness from '@ohos.brightness'; import CommonConstants from "../../../../../../common/src/main/ets/default/Constants"; -const SYSTEMUI_BRIGHTNESS = 'settings.screen.brightness'; +const SYSTEMUI_BRIGHTNESS = settings.display.SCREEN_BRIGHTNESS_STATUS;; const TAG = 'Control-brightnessManager'; var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 100); -- Gitee From c572224b7dcc572f8c939e16286403002784f059 Mon Sep 17 00:00:00 2001 From: r00498791 Date: Thu, 12 May 2022 15:58:23 +0800 Subject: [PATCH 077/373] modify mainElement Signed-off-by: r00498791 --- entry/pc/src/main/module.json5 | 2 +- entry/phone/src/main/module.json5 | 2 +- product/default/navigationBar/src/main/module.json5 | 2 +- product/default/notificationmanagement/src/main/module.json5 | 2 +- product/default/volumepanel/src/main/module.json5 | 2 +- product/pc/controlpanel/src/main/module.json5 | 2 +- product/pc/notificationpanel/src/main/module.json5 | 2 +- product/pc/statusbar/src/main/module.json5 | 2 +- product/phone/dropdownpanel/src/main/module.json5 | 2 +- product/phone/statusbar/src/main/module.json5 | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/entry/pc/src/main/module.json5 b/entry/pc/src/main/module.json5 index c1efd44a..7bb6c058 100644 --- a/entry/pc/src/main/module.json5 +++ b/entry/pc/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "entry", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:description_mainability", - "mainElement": "ServiceExtAbility", + "mainElement": "com.ohos.systemui.ServiceExtAbility", "deviceTypes": [ "tablet" ], diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index 94485653..ea40de6c 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "entry", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:description_mainability", - "mainElement": "ServiceExtAbility", + "mainElement": "com.ohos.systemui.ServiceExtAbility", "deviceTypes": [ "phone" ], diff --git a/product/default/navigationBar/src/main/module.json5 b/product/default/navigationBar/src/main/module.json5 index 2ab07ce1..0636f23d 100644 --- a/product/default/navigationBar/src/main/module.json5 +++ b/product/default/navigationBar/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "feature", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", - "mainElement": "navigationbar.ServiceExtAbility", + "mainElement": "com.ohos.systemui.navigationbar.ServiceExtAbility", "deviceTypes": [ "phone", "tablet" ], diff --git a/product/default/notificationmanagement/src/main/module.json5 b/product/default/notificationmanagement/src/main/module.json5 index c007e48c..fc225cc8 100644 --- a/product/default/notificationmanagement/src/main/module.json5 +++ b/product/default/notificationmanagement/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "feature", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", - "mainElement": "notificationmanagement.MainAbility", + "mainElement": "com.ohos.systemui.notificationmanagement.MainAbility", "deviceTypes": [ "phone", "tablet" ], diff --git a/product/default/volumepanel/src/main/module.json5 b/product/default/volumepanel/src/main/module.json5 index 1d0ff71a..a570a5ac 100644 --- a/product/default/volumepanel/src/main/module.json5 +++ b/product/default/volumepanel/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "feature", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", - "mainElement": "volumepanel.ServiceExtAbility", + "mainElement": "com.ohos.systemui.volumepanel.ServiceExtAbility", "deviceTypes": [ "phone", "tablet" ], diff --git a/product/pc/controlpanel/src/main/module.json5 b/product/pc/controlpanel/src/main/module.json5 index 9e47a3f7..5d8c7c5c 100644 --- a/product/pc/controlpanel/src/main/module.json5 +++ b/product/pc/controlpanel/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "feature", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", - "mainElement": "controlpanel.ServiceExtAbility", + "mainElement": "com.ohos.systemui.controlpanel.ServiceExtAbility", "deviceTypes": [ "tablet" ], diff --git a/product/pc/notificationpanel/src/main/module.json5 b/product/pc/notificationpanel/src/main/module.json5 index b39d3459..16d9a1ce 100644 --- a/product/pc/notificationpanel/src/main/module.json5 +++ b/product/pc/notificationpanel/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "feature", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", - "mainElement": "notificationpanel.ServiceExtAbility", + "mainElement": "com.ohos.systemui.notificationpanel.ServiceExtAbility", "deviceTypes": [ "tablet" ], diff --git a/product/pc/statusbar/src/main/module.json5 b/product/pc/statusbar/src/main/module.json5 index 36c0ccd6..9d39c446 100644 --- a/product/pc/statusbar/src/main/module.json5 +++ b/product/pc/statusbar/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "feature", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", - "mainElement": "statusbar.ServiceExtAbility", + "mainElement": "com.ohos.systemui.statusbar.ServiceExtAbility", "deviceTypes": [ "tablet" ], diff --git a/product/phone/dropdownpanel/src/main/module.json5 b/product/phone/dropdownpanel/src/main/module.json5 index 0af93fca..7af54b91 100644 --- a/product/phone/dropdownpanel/src/main/module.json5 +++ b/product/phone/dropdownpanel/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "feature", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", - "mainElement": "dropdownpanel.ServiceExtAbility", + "mainElement": "com.ohos.systemui.dropdownpanel.ServiceExtAbility", "deviceTypes": [ "phone" ], diff --git a/product/phone/statusbar/src/main/module.json5 b/product/phone/statusbar/src/main/module.json5 index 57494f67..5a1fc3f4 100644 --- a/product/phone/statusbar/src/main/module.json5 +++ b/product/phone/statusbar/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "feature", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", - "mainElement": "statusbar.ServiceExtAbility", + "mainElement": "com.ohos.systemui.statusbar.ServiceExtAbility", "deviceTypes": [ "phone" ], -- Gitee From e9b39771a81b722ac6fea75f812930417bfe196e Mon Sep 17 00:00:00 2001 From: r00498791 Date: Thu, 12 May 2022 16:18:14 +0800 Subject: [PATCH 078/373] retry 1000ms Signed-off-by: r00498791 --- .../ets/ServiceExtAbility/ServiceExtAbility.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index b9b90861..830e2335 100644 --- a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -47,13 +47,15 @@ var notificationPanelWant = { class ServiceExtAbility extends ServiceExtension { onCreate(want) { Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`) - initSystemUi(this.context); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) - AbilityManager.startAbility(statusBarWant) - AbilityManager.startAbility(navigationBarWant) - AbilityManager.startAbility(volumePanelWant) - AbilityManager.startAbility(controlPanelWant) - AbilityManager.startAbility(notificationPanelWant) + setTimeout(() => { + initSystemUi(this.context); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) + AbilityManager.startAbility(statusBarWant) + AbilityManager.startAbility(navigationBarWant) + AbilityManager.startAbility(volumePanelWant) + AbilityManager.startAbility(controlPanelWant) + AbilityManager.startAbility(notificationPanelWant) + }, 1000) } onDestroy() { -- Gitee From 42e1d3c958a63e54e54b642549bff338b4cdc81f Mon Sep 17 00:00:00 2001 From: lvxiaoqiang Date: Thu, 12 May 2022 16:50:53 +0800 Subject: [PATCH 079/373] add timeout 1000ms Signed-off-by: lvxiaoqiang --- .../pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 0f08194a..d4ae9f53 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -52,6 +52,10 @@ class ServiceExtAbility extends ServiceExtension { private async statusBarWindow() { Log.showInfo(TAG, `statusBarWindow`); let dis = await display.getDefaultDisplay(); + while (dis === null) { + await new Promise((resolve)=>{setTimeout(resolve, 1000)}); + dis = await display.getDefaultDisplay(); + } Log.showInfo(TAG, `getDefaultDisplay, dis: ${JSON.stringify(dis)}`); let rect; if (dis.width > dis.height) { // PadPC horizontalScreen Mode -- Gitee From b88831ef2d1ecb0d89c2e42d190a13af9c855e77 Mon Sep 17 00:00:00 2001 From: r00498791 Date: Sat, 14 May 2022 22:01:29 +0800 Subject: [PATCH 080/373] delay 2s Signed-off-by: r00498791 --- .../ServiceExtAbility/ServiceExtAbility.ts | 15 +++++-------- .../com/ohos/common/StatusBarConfiguration.ts | 22 +++++++++++++------ .../main/ets/common/NavBarConfiguration.ts | 22 +++++++++++++------ 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 830e2335..f38b3e72 100644 --- a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -47,15 +47,12 @@ var notificationPanelWant = { class ServiceExtAbility extends ServiceExtension { onCreate(want) { Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`) - setTimeout(() => { - initSystemUi(this.context); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) - AbilityManager.startAbility(statusBarWant) - AbilityManager.startAbility(navigationBarWant) - AbilityManager.startAbility(volumePanelWant) - AbilityManager.startAbility(controlPanelWant) - AbilityManager.startAbility(notificationPanelWant) - }, 1000) + AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) + AbilityManager.startAbility(statusBarWant) + AbilityManager.startAbility(navigationBarWant) + AbilityManager.startAbility(volumePanelWant) + AbilityManager.startAbility(controlPanelWant) + AbilityManager.startAbility(notificationPanelWant) } onDestroy() { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index 0ab0eeeb..14825446 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -47,13 +47,21 @@ class StatusBarConfiguration { Log.showInfo(TAG, 'initWindowManager'); minHeight = 0; - await display.getDefaultDisplay() - .then(dis => { - Log.showInfo(TAG, `initWindowManager dis ${JSON.stringify(dis)}`); - maxWidth = dis.width; - maxHeight = dis.height; - Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); - }) + let displayData = null; + while (displayData == null) { + await display.getDefaultDisplay() + .then((res) => { + Log.showInfo(TAG, `getDefaultDisplay dis ${JSON.stringify(res)}`); + displayData = res; + maxWidth = res.width; + maxHeight = res.height; + Log.showInfo(TAG, `getDefaultDisplay maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); + }) + .catch((err) => { + Log.showInfo(TAG, 'getDefaultDisplay err: ' + err); + }); + await new Promise((resolve) => setTimeout(resolve, 2000)); + } } async getDirectionAndPosition() { diff --git a/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts b/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts index 54317156..bd27aff0 100644 --- a/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts +++ b/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts @@ -48,13 +48,21 @@ class NavBarConfiguration { Log.showInfo(TAG, 'initNavBarConfiguration'); minHeight = 0; - await display.getDefaultDisplay() - .then(dis => { - Log.showInfo(TAG, `initNavBarConfiguration dis ${JSON.stringify(dis)}`); - maxWidth = dis.width; - maxHeight = dis.height; - Log.showInfo(TAG, `initNavBarConfiguration maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); - }) + let displayData = null; + while (displayData == null) { + await display.getDefaultDisplay() + .then((res) => { + Log.showInfo(TAG, `getDefaultDisplay dis ${JSON.stringify(res)}`); + displayData = res; + maxWidth = res.width; + maxHeight = res.height; + Log.showInfo(TAG, `getDefaultDisplay maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); + }) + .catch((err) => { + Log.showInfo(TAG, 'getDefaultDisplay err: ' + err); + }); + await new Promise((resolve) => setTimeout(resolve, 2000)); + } } async getDirectionAndPosition() { -- Gitee From 9a865a524bc9c4ab3efed4e9d0527320d2dfeed5 Mon Sep 17 00:00:00 2001 From: r00498791 Date: Tue, 17 May 2022 16:39:28 +0800 Subject: [PATCH 081/373] modify queryExtensionAbilityInfos interface Signed-off-by: r00498791 --- .../ets/plugindatasource/common/BundleParseUtil.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts index a5d435d8..c5dace65 100644 --- a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts +++ b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts @@ -40,6 +40,8 @@ export enum BundleEventType { const TAG = "SourceLoader-BundleParseUtil"; const DEFAULT_BUNDLE_FLAG = bundleManager.BundleFlag.GET_ABILITY_INFO_WITH_METADATA | bundleManager.BundleFlag.GET_ABILITY_INFO_WITH_PERMISSION; +const EXTENSIONTYPE = 20; + const BUNDLE_SUBSCRIBE_INFO = { events: [ commonEvent.Support.COMMON_EVENT_PACKAGE_ADDED, @@ -67,16 +69,17 @@ export async function queryAbility(action: string, userId: number, bundleName?: } let extensionAbilitys = []; try { - extensionAbilitys = await bundleManager.queryExtensionAbilityInfosByWant( + extensionAbilitys = await bundleManager.queryExtensionAbilityInfos( { action: action, bundleName: bundleName, }, + EXTENSIONTYPE, DEFAULT_BUNDLE_FLAG, userId ); } catch (error) { - Log.showInfo(TAG, `queryAbility, queryExtensionAbilityInfosByWant error: ${JSON.stringify(error)}`); + Log.showInfo(TAG, `queryAbility, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); } Log.showInfo(TAG, `queryAbility, end`); let rets = [...abilitys, ...extensionAbilitys]; @@ -91,9 +94,9 @@ export async function queryAbility(action: string, userId: number, bundleName?: } let extensionAbilitys = []; try { - extensionAbilitys = await bundleManager.queryExtensionAbilityInfosByWant({ action: action }, DEFAULT_BUNDLE_FLAG, userId); + extensionAbilitys = await bundleManager.queryExtensionAbilityInfos({ action: action }, EXTENSIONTYPE, DEFAULT_BUNDLE_FLAG, userId); } catch (error) { - Log.showInfo(TAG, `queryAbility, queryExtensionAbilityInfosByWant error: ${JSON.stringify(error)}`); + Log.showInfo(TAG, `queryAbility, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); } Log.showInfo(TAG, `queryAbility, end`); let rets = [...abilitys, ...extensionAbilitys]; -- Gitee From b26ec1db621f75d2cfe0ed486dd56aaf114e7cb0 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 17 May 2022 15:51:57 +0800 Subject: [PATCH 082/373] =?UTF-8?q?=E9=9F=B3=E9=87=8F=E6=9D=A1=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: jyj_0306 --- .../ets/com/ohos/pages/VolumePanelComponent.ets | 17 +++++++++-------- .../ets/com/ohos/viewmodel/VolumePanelVM.ts | 4 ++-- .../src/main/resources/phone/element/float.json | 4 ++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets index 6b475323..c0b1dd1f 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets @@ -49,16 +49,17 @@ export default struct VolumePanelComponent { max: this.VolumePanelMaxVolume, step: 1, style: SliderStyle.OutSet, - direction: Axis.Vertical + direction: Axis.Vertical, + reverse: true }) - .height('100%') .trackThickness(this.style.volumePanSliderWidth) .blockColor(this.style.volumePanelSliderBlockColor) - .trackColor(this.style.volumeSelectedColor) - .selectedColor(this.style.volumeSliderTrackColor) + .trackColor($r('sys.color.ohos_id_color_component_normal')) + .selectedColor(this.style.volumeSelectedColor) .onChange(this.onVolumeChange.bind(this)) } - .height(this.style.volumePanSliderHeight) + .flexGrow(1) + .flexShrink(1) Column() .width('100%') @@ -128,11 +129,11 @@ export default struct VolumePanelComponent { if (isMute) { icon = $r('app.media.ic_public_mute') } else { - if (volume <= ((maxVolume - minVolume) / 3 + minVolume)) { + if (volume >= (((maxVolume - minVolume) / 3) * 2 + minVolume)) { icon = $r('app.media.ic_public_sound_03') - } else if (volume <= (((maxVolume - minVolume) / 3) * 2 + minVolume)) { + } else if (volume >= ((maxVolume - minVolume) / 3 + minVolume)) { icon = $r('app.media.ic_public_sound_02') - } else if (volume == (maxVolume - minVolume)) { + } else if (volume == minVolume) { icon = $r('app.media.ic_public_sound_04') } else { icon = $r('app.media.ic_public_sound_01') diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts index 5d345eb6..0e379b27 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts @@ -141,14 +141,14 @@ export class VolumePanelVM { updateDisplayVolume(volume: number, maxVolume: number, minVolume: number): void{ Log.showInfo(TAG, `updateDisplayVolume, volume: ${volume} maxVolume: ${maxVolume} minVolume: ${minVolume}`) - let displayVolume: number = maxVolume - volume + minVolume; + let displayVolume: number = volume + minVolume; this.mVolumeValue.set(displayVolume); Log.showInfo(TAG, `updateDisplayVolume, mVolumeValue: ${this.mVolumeValue.get()}`) } calcVolumeByDisplayVolume(displayVolume: number): number{ Log.showInfo(TAG, `calcVolumeByDisplayVolume, displayVolume: ${displayVolume}`) - let volume: number = this.mMaxVolume.get() - displayVolume + this.mMinVolume.get(); + let volume: number = displayVolume + this.mMinVolume.get(); Log.showInfo(TAG, `calcVolumeByDisplayVolume, volume: ${volume}`) return volume; } diff --git a/features/volumepanelcomponent/src/main/resources/phone/element/float.json b/features/volumepanelcomponent/src/main/resources/phone/element/float.json index 59849c81..cf9eafcc 100644 --- a/features/volumepanelcomponent/src/main/resources/phone/element/float.json +++ b/features/volumepanelcomponent/src/main/resources/phone/element/float.json @@ -5,7 +5,7 @@ "float": [ { "name": "volume_panel_component_slider_margin_top", - "value": "20vp" + "value": "6.5vp" }, { "name": "volume_panel_component_slider_width", @@ -21,7 +21,7 @@ }, { "name": "volume_panel_component_slider_margin_bottom", - "value": "20vp" + "value": "6.5vp" }, { "name": "volume_panel_component_mute_btn_icon_size", -- Gitee From fc748e3fca0efe907321ace371aa130ab9e06ac8 Mon Sep 17 00:00:00 2001 From: r00498791 Date: Wed, 18 May 2022 15:19:33 +0800 Subject: [PATCH 083/373] remove api8 log Signed-off-by: r00498791 --- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 5 +++-- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 4 ++-- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 8 ++++---- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 6 +++--- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 4 ++-- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 10 +++++----- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 6 +++--- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 8 ++++---- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 6 +++--- 9 files changed, 29 insertions(+), 28 deletions(-) diff --git a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index f38b3e72..d7065518 100644 --- a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -46,7 +46,8 @@ var notificationPanelWant = { class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`) + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`) + initSystemUi(this.context); AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) AbilityManager.startAbility(statusBarWant) AbilityManager.startAbility(navigationBarWant) @@ -56,7 +57,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, 'api8New onDestroy') + Log.showInfo(TAG, 'onDestroy') } } diff --git a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 38ddf9ec..9437dcb6 100644 --- a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -41,7 +41,7 @@ var dropdownPanelWant = { class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`) + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`) initSystemUi(this.context) AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) AbilityManager.startAbility(statusBarWant) @@ -51,7 +51,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, 'api8New onDestroy') + Log.showInfo(TAG, 'onDestroy') } } diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 394ce35e..c19e7d0a 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -23,7 +23,7 @@ const TAG = "NavigationBar_ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, this.context) let configInfo = await NavBarConfiguration.getConfiguration(); @@ -49,7 +49,7 @@ class ServiceExtAbility extends ServiceExtension { } } AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config', configInfo) - Log.showInfo(TAG, `api8New onCreate, configInfo: ${JSON.stringify(configInfo)}`) + Log.showInfo(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`) let navigationBarRect = { left: configInfo.xCoordinate, @@ -59,14 +59,14 @@ class ServiceExtAbility extends ServiceExtension { } WindowManager.createWindow(this.context, WindowType.NAVIGATION_BAR, navigationBarRect, "pages/index") .then(() => { - Log.showInfo(TAG, `api8New onCreate, createWindow success.`); + Log.showInfo(TAG, `onCreate, createWindow success.`); WindowManager.showWindow(WindowType.NAVIGATION_BAR); }) .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); } onDestroy() { - Log.showInfo(TAG, 'api8New onDestroy'); + Log.showInfo(TAG, 'onDestroy'); } } diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index ac826951..34c537f1 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -24,7 +24,7 @@ const TAG = "VolumePanel_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showInfo(TAG, "api8New onCreate, want:" + want.abilityName); + Log.showInfo(TAG, "onCreate, want:" + want.abilityName); AbilityManager.setContext(AbilityManager.ABILITY_NAME_VOLUME_PANEL, this.context); display.getDefaultDisplay().then((dis) => { let volumeRect = { @@ -40,7 +40,7 @@ class ServiceExtAbility extends ServiceExtension { }); WindowManager.createWindow(this.context, WindowType.VOLUME_PANEL, volumeRect, "pages/index") .then((win) => { - Log.showInfo(TAG, `api8New onCreate, createWindow callback`); + Log.showInfo(TAG, `onCreate, createWindow callback`); VolumeWindowController.getInstance().setWindowHandle(win); }) .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); @@ -48,7 +48,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, "api8New onDestroy"); + Log.showInfo(TAG, "onDestroy"); } } diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index f018fc24..eb803a44 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -25,11 +25,11 @@ const TAG = "ControlPanel_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_CONTROL_PANEL, this.context); let dis = await display.getDefaultDisplay(); - Log.showInfo(TAG, `api8New onCreate, dis: ${JSON.stringify(dis)}`); + Log.showInfo(TAG, `onCreate, dis: ${JSON.stringify(dis)}`); let rect = { left: (872 * dis.width) / 1280, top: (44 * dis.width) / 1280, diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index bf4f1f24..e79500ed 100644 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -26,12 +26,12 @@ const TAG = "NotificationPanel_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, this.context); globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT] = want; let dis = await display.getDefaultDisplay(); - Log.showInfo(TAG, `api8New onCreate, dis: ${JSON.stringify(dis)}`); + Log.showInfo(TAG, `onCreate, dis: ${JSON.stringify(dis)}`); let rect = { left: (834 * dis.width) / 1280, top: (44 * dis.width) / 1280, @@ -45,7 +45,7 @@ class ServiceExtAbility extends ServiceExtension { }); WindowManager.createWindow(this.context, WindowType.NOTIFICATION_PANEL, rect, "pages/index").then(() => { - Log.showInfo(TAG, `api8New onCreate, createWindow callback`); + Log.showInfo(TAG, `onCreate, createWindow callback`); }); AbilityManager.setContext(AbilityManager.ABILITY_NAME_BANNER_NOTICE, this.context); @@ -58,13 +58,13 @@ class ServiceExtAbility extends ServiceExtension { AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); WindowManager.createWindow(this.context, WindowType.BANNER_NOTICE, bannerRect, 'pages/bannerNotification') .then((win) => { - Log.showInfo(TAG, `api8New onCreate, createWindow callback`); + Log.showInfo(TAG, `onCreate, createWindow callback`); }) .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); } onDestroy() { - Log.showInfo(TAG, "api8New onDestroy"); + Log.showInfo(TAG, "onDestroy"); } } diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 90d29629..85516462 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -23,7 +23,7 @@ const TAG = "StatusBar_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context); let configInfo = await StatusBarConfiguration.getConfiguration(); @@ -41,7 +41,7 @@ class ServiceExtAbility extends ServiceExtension { } } AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "config", configInfo); - Log.showInfo(TAG, `api8New onCreate, configInfo: ${JSON.stringify(configInfo)}`); + Log.showInfo(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); let statusBarRect = { left: configInfo.xCoordinate, @@ -55,7 +55,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, "api8New onDestroy"); + Log.showInfo(TAG, "onDestroy"); } } diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index e736c50e..4f3189cc 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -24,7 +24,7 @@ const TAG = "DropdownPanel_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, this.context); globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT] = want; @@ -37,7 +37,7 @@ class ServiceExtAbility extends ServiceExtension { }; AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, "rect", rect); WindowManager.createWindow(this.context, WindowType.DROPDOWN_PANEL, rect, "pages/index").then(() => - Log.showInfo(TAG, `api8New onCreate, createWindow callback`) + Log.showInfo(TAG, `onCreate, createWindow callback`) ); AbilityManager.setContext(AbilityManager.ABILITY_NAME_BANNER_NOTICE, this.context); @@ -50,14 +50,14 @@ class ServiceExtAbility extends ServiceExtension { AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); WindowManager.createWindow(this.context, WindowType.BANNER_NOTICE, bannerRect, 'pages/bannerNotification') .then((win) => { - Log.showInfo(TAG, `api8New onCreate, createWindow callback`); + Log.showInfo(TAG, `onCreate, createWindow callback`); }) .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); }); } onDestroy() { - Log.showInfo(TAG, "api8New onDestroy"); + Log.showInfo(TAG, "onDestroy"); } } diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 7cd14d0c..5bca6b57 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -23,12 +23,12 @@ const TAG = "StatusBar_ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showInfo(TAG, `api8New onCreate, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context) let configInfo = await StatusBarConfiguration.getConfiguration(); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo) - Log.showInfo(TAG, `api8New onCreate, configInfo: ${JSON.stringify(configInfo)}`) + Log.showInfo(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`) let statusBarRect = { left: configInfo.xCoordinate, @@ -42,7 +42,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, 'api8New onDestroy'); + Log.showInfo(TAG, 'onDestroy'); } } -- Gitee From 66c8a32b615d5395ad625fae1eb18d0efacf2c8a Mon Sep 17 00:00:00 2001 From: qp Date: Thu, 19 May 2022 10:16:56 +0800 Subject: [PATCH 084/373] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: qp --- .../main/ets/default/pages/batteryIcon.ets | 16 +++- .../src/main/ets/default/pages/batterySoc.ets | 23 +++-- .../main/resources/phone/element/float.json | 44 ++++++++++ .../ets/com/ohos/view/component/statusBar.ets | 37 +++++--- .../src/main/ets/default/pages/signalIcon.ets | 82 ++++++++++-------- .../main/resources/phone/element/float.json | 28 ++++++ .../phone/media/ic_statusbar_signal_1.svg | 22 +++++ .../phone/media/ic_statusbar_signal_2.svg | 22 +++++ .../phone/media/ic_statusbar_signal_3.svg | 22 +++++ .../phone/media/ic_statusbar_signal_4.svg | 22 +++++ .../phone/media/ic_statusbar_signal_full.svg | 9 ++ .../phone/media/ic_statusbar_signal_no.svg | 9 ++ .../media/ic_statusbar_signal_roaming.png | Bin 0 -> 411 bytes .../phone/media/ic_statusbar_signal_wait.png | Bin 0 -> 442 bytes .../phone/media/ic_statusbar_wifi_connect.png | Bin 0 -> 331 bytes .../src/main/resources/phone/media/icon.png | Bin 0 -> 6790 bytes .../src/main/ets/default/pages/wifiIcon.ets | 14 ++- .../main/resources/phone/element/float.json | 12 +++ .../phone/media/ic_statusbar_wifi_1.svg | 20 +++++ .../phone/media/ic_statusbar_wifi_2.svg | 22 +++++ .../phone/media/ic_statusbar_wifi_3.svg | 24 +++++ .../phone/media/ic_statusbar_wifi_full.svg | 20 +++++ .../phone/media/ic_statusbar_wifi_no.svg | 20 +++++ .../src/main/resources/phone/media/icon.png | Bin 0 -> 6790 bytes 24 files changed, 408 insertions(+), 60 deletions(-) create mode 100644 features/batterycomponent/src/main/resources/phone/element/float.json create mode 100644 features/signalcomponent/src/main/resources/phone/element/float.json create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_roaming.png create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_wait.png create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_wifi_connect.png create mode 100644 features/signalcomponent/src/main/resources/phone/media/icon.png create mode 100644 features/wificomponent/src/main/resources/phone/element/float.json create mode 100644 features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg create mode 100644 features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg create mode 100644 features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg create mode 100644 features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg create mode 100644 features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg create mode 100644 features/wificomponent/src/main/resources/phone/media/icon.png diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index e62c6693..2710a55b 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -20,10 +20,12 @@ import Constants from '../common/constants' import Log from '../../../../../../../common/src/main/ets/default/Log' import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' import StyleConfiguration from '../common/StyleConfiguration' -import {StatusBarGroupComponentData +import { StatusBarGroupComponentData } from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vM/StatusBarVM' +import deviceInfo from '@ohos.deviceInfo'; +const deviceTypeInfo = deviceInfo.deviceType const TAG = 'BatteryComponent-batteryIcon' @Component @@ -34,11 +36,17 @@ export default struct BatteryIcon { @State mStatusBarGroupComponentData: StatusBarGroupComponentData = new StatusBarGroupComponentData() @State style: any = StyleConfiguration.getBatteryComponentStyle() @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + private isPhone: boolean= false aboutToAppear() { this.mStatusBarGroupComponentData = StatusBarVM.getStatusBarGroupComponentData(this.mGroupId) mBatteryModel.initBatteryModel(); Log.showInfo(TAG, 'aboutToAppear'); + if (deviceTypeInfo === "phone") { + this.isPhone = true + } else { + this.isPhone = false + } } aboutToDisappear() { @@ -47,11 +55,11 @@ export default struct BatteryIcon { build() { Row() { - Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + Row().width(this.isPhone ? "2vp" : this.styleCommon.statusBarMarginLeftRight).height('100%') BatterySoc({ mContentColor: this.mStatusBarGroupComponentData.contentColor }) - Row().width(this.style.componentGap).height('100%') + Row().width(this.isPhone ? "2vp" : this.style.componentGap).height('100%') BatteryPic({ mContentColor: this.mStatusBarGroupComponentData.contentColor }) - Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + Row().width(this.isPhone ? 0 : this.styleCommon.statusBarMarginLeftRight).height('100%') } .height('100%') } diff --git a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets index fc268cef..50be99f7 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -15,26 +15,35 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import deviceInfo from '@ohos.deviceInfo'; +const deviceTypeInfo = deviceInfo.deviceType const TAG = 'BatteryComponent-batterySoc' + @Component -export default -struct BatterySoc { +export default struct BatterySoc { @StorageLink('batterySoc') batterySoc: number = 100 @Prop mContentColor: string @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + private isPhone: boolean= false - aboutToAppear(){ - Log.showInfo(TAG,'aboutToAppear Start'); + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear Start'); + if (deviceTypeInfo === "phone") { + this.isPhone = true + } else { + this.isPhone = false + } } - aboutToDisappear(){ - Log.showInfo(TAG,'aboutToDisappear'); + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear'); } build() { Text(this.batterySoc + '%') .fontColor(this.mContentColor) - .fontSize(this.styleCommon.statusBarFontSize) + .fontSize(this.isPhone ? '12fp' : this.styleCommon.statusBarFontSize) + .fontWeight(this.isPhone ? FontWeight.Medium : FontWeight.Normal) } } diff --git a/features/batterycomponent/src/main/resources/phone/element/float.json b/features/batterycomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..099ec2ed --- /dev/null +++ b/features/batterycomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,44 @@ +{ + "float": [ + { + "name": "battery_component_gap", + "value": "0vp" + }, + { + "name": "battery_component_pic_gap", + "value": "1.2vp" + }, + { + "name": "battery_component_pic_body_height", + "value": "11vp" + }, + { + "name": "battery_component_pic_body_width", + "value": "18.5vp" + }, + { + "name": "battery_component_pic_body_padding", + "value": "1vp" + }, + { + "name": "battery_component_pic_body_border_width", + "value": "1vp" + }, + { + "name": "battery_component_pic_border_radius", + "value": "2.5vp" + }, + { + "name": "battery_component_pic_head_radius", + "value": "3vp" + }, + { + "name": "battery_component_pic_head_width", + "value": "1.5vp" + }, + { + "name": "battery_component_pic_head_height", + "value": "5.75vp" + } + ] +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets index b310ab31..31c0a07b 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets @@ -20,29 +20,46 @@ import BatteryIcon from '../../../../../../../../../features/batterycomponent/sr import ClockIcon from '../../../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' import WifiIcon from '../../../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' import SignalIcon from '../../../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon' +import deviceInfo from '@ohos.deviceInfo'; +const deviceTypeInfo = deviceInfo.deviceType const TAG = 'ScreenLock-StatusBar' @Component export default struct statusBar { + private isPhone: boolean= false + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear`) + if (deviceTypeInfo === "phone") { + this.isPhone = true + } else { + this.isPhone = false + } + } + build() { - Row(){ + Row() { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { SignalIcon() WifiIcon() }.width(Constants.HALF_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - BatteryIcon() - ClockIcon() + if (this.isPhone) { + BatteryIcon() + } else { + BatteryIcon() + ClockIcon() + } }.width(Constants.HALF_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) - }.width(Constants.FULL_CONTAINER_WIDTH) - .height(Constants.FULL_CONTAINER_HEIGHT) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(this.isPhone ? '24vp' : Constants.FULL_CONTAINER_HEIGHT) + .padding({ left: this.isPhone ? '24vp' : 0, right: this.isPhone ? '24vp' : 0 }) + .margin({ top: this.isPhone ? '4vp' : 0 }) + .opacity(this.isPhone ? 0.7 : 1) } - - aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) - } - } \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index cf0b9300..9aecab7e 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -18,22 +18,25 @@ import mSignalModel from '../SignalModel'; import Log from '../../../../../../../common/src/main/ets/default/Log' import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' import StyleConfiguration from '../common/StyleConfiguration' -import {StatusBarGroupComponentData +import { StatusBarGroupComponentData } from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vm/StatusBarVM' +import deviceInfo from '@ohos.deviceInfo'; + +const deviceTypeInfo = deviceInfo.deviceType const TAG = 'SignalComponent-SignalIcon' @Component -export default -struct SignalIcon { - @StorageLink('cellularLevel') cellularLevel : number = Constants.CELLULAR_NO_SIM_CARD - @StorageLink('cellularType') cellularType : number = Constants.NETWORK_TYPE_UNKNOWN - @StorageLink('networkState') networkState : string = Constants.NET_NULL - @StorageLink('signalObserved') signalObserved:boolean = false +export default struct SignalIcon { + @StorageLink('cellularLevel') cellularLevel: number = Constants.CELLULAR_NO_SIM_CARD + @StorageLink('cellularType') cellularType: number = Constants.NETWORK_TYPE_UNKNOWN + @StorageLink('networkState') networkState: string = Constants.NET_NULL + @StorageLink('signalObserved') signalObserved: boolean = false private mGroupId: string = '' @State mStatusBarGroupComponentData: StatusBarGroupComponentData = new StatusBarGroupComponentData() @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() @State style: any = StyleConfiguration.getSignalComponentStyle() + private isPhone: boolean= false aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); @@ -42,6 +45,11 @@ struct SignalIcon { mSignalModel.initSignalModel(); this.signalObserved = true; } + if (deviceTypeInfo === "phone") { + this.isPhone = true + } else { + this.isPhone = false + } } aboutToDisappear() { @@ -50,16 +58,17 @@ struct SignalIcon { build() { Row() { - Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + Row().width(this.isPhone ? 0 : this.styleCommon.statusBarMarginLeftRight).height('100%') Text(this.updateNetworkState(this.networkState)) - .fontSize(this.styleCommon.statusBarFontSize) - .fontColor(this.mStatusBarGroupComponentData.contentColor) + .fontSize(this.isPhone ? '12fp' : this.styleCommon.statusBarFontSize) + .fontWeight(this.isPhone ? FontWeight.Medium : FontWeight.Normal) + .fontColor(this.isPhone ? "#FFFFFF" : this.mStatusBarGroupComponentData.contentColor) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .constraintSize({ maxWidth: this.style.signalTextMaxWeight}) + .constraintSize({ maxWidth: this.style.signalTextMaxWeight }) .flexShrink(0) .maxLines(1) .textAlign(TextAlign.Center) - Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + Row().width(this.isPhone ? 0 : this.styleCommon.statusBarMarginLeftRight).height('100%') Stack({ alignContent: Alignment.TopStart }) { Text(this.updateCellularType(this.cellularType)) @@ -67,7 +76,8 @@ struct SignalIcon { .fontColor(this.mStatusBarGroupComponentData.contentColor) .width(this.style.netSignalTextMaxWidth) .fontWeight(FontWeight.Bold) - .textAlign(TextAlign.Center) + .textAlign(this.isPhone ? TextAlign.Start : TextAlign.Center) + .margin({ left: this.isPhone ? "3vp" : 0 }) Image(this.updateCellularImage(this.cellularLevel)) .objectFit(ImageFit.Contain) .width(this.style.cellularImageWidth) @@ -75,19 +85,19 @@ struct SignalIcon { .fillColor(this.mStatusBarGroupComponentData.contentColor) }.flexShrink(1) - Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + Row().width(this.isPhone ? 0 : this.styleCommon.statusBarMarginLeftRight).height('100%') } .height('100%') } -/** - * Get the string of cellular type - * - * @param {number} type - number of cellular type - * @return {string} typeString type of cellular type - */ - private updateCellularType(signalType) : string { - Log.showInfo(TAG, `updateCellularType, signalType: ${ signalType }`); + /** + * Get the string of cellular type + * + * @param {number} type - number of cellular type + * @return {string} typeString type of cellular type + */ + private updateCellularType(signalType): string { + Log.showInfo(TAG, `updateCellularType, signalType: ${signalType}`); let typeString; switch (signalType) { case Constants.NETWORK_TYPE_UNKNOWN: @@ -112,12 +122,12 @@ struct SignalIcon { return typeString; } -/** - * Get the cellular signal image - * - * @param {number} level - signal level from signalModel - * @return {string} cellularImage image of cellular signal - */ + /** + * Get the cellular signal image + * + * @param {number} level - signal level from signalModel + * @return {string} cellularImage image of cellular signal + */ private updateCellularImage(level) { Log.showInfo(TAG, `updateCellularImage, level: ${level}`); let cellularImage; @@ -149,18 +159,18 @@ struct SignalIcon { return cellularImage; } -/** - * Get the NetworkState signal name - * - * @param {string} netWorkState - network state from signal model - * @return {string} vendor's name or signal state - */ + /** + * Get the NetworkState signal name + * + * @param {string} netWorkState - network state from signal model + * @return {string} vendor's name or signal state + */ private updateNetworkState(netWorkState) { Log.showInfo(TAG, `updateNetworkState, netWorkState: ${netWorkState}`); let networkStateName; - if(netWorkState == Constants.NET_NULL){ + if (netWorkState == Constants.NET_NULL) { networkStateName = $r('app.string.net_null'); - }else { + } else { networkStateName = netWorkState; } return networkStateName; diff --git a/features/signalcomponent/src/main/resources/phone/element/float.json b/features/signalcomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..7961e28e --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,28 @@ +{ + "float": [ + { + "name": "status_bar_signal_type_font_size", + "value": "5.5fp" + }, + { + "name": "status_bar_signal_unknown_font_size", + "value": "7fp" + }, + { + "name": "signal_component_icon_width", + "value": "21.5vp" + }, + { + "name": "signal_component_icon_height", + "value": "15vp" + }, + { + "name": "signal_text_max_width", + "value": "113vp" + }, + { + "name": "status_bar_signal_net_signal_text_max_width", + "value": "15vp" + } + ] +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg new file mode 100644 index 00000000..5934a33d --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_signal_single1 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg new file mode 100644 index 00000000..90275d8b --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_signal_single2 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg new file mode 100644 index 00000000..cac34872 --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_signal_single3 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg new file mode 100644 index 00000000..e7b903a8 --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_signal_single4 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg new file mode 100644 index 00000000..0f891e9a --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg @@ -0,0 +1,9 @@ + + + ic_statusbar_signal_single0 + + + + + + \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg new file mode 100644 index 00000000..7498a24a --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg @@ -0,0 +1,9 @@ + + + ic_statusbar_signal_single0 + + + + + + \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_roaming.png b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_roaming.png new file mode 100644 index 0000000000000000000000000000000000000000..c37dc10f00c0b991f31faf014841cf015c33684c GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T|AsMW1 zr|r*Tauhgb>uGgStNy^P_6?#FMVve)-}~+{vHSx2h4Kqd0!I#AJEhio!_(qmL#x@T zpSs)Gn>|we64(6@yY@40Z{hx*ckd+W9d~3>abQv@U~YV{|Bgo2svr9l-`#Z7H*j|p z$T?bNrpoo>*dCL*jT+p>+6wcFo{K;E8sK7>`tR-~6V@#ovL%b(l-Ikism>KMVSRJ) zySBw!uI-`=eU~h2IPySIu!9xIT*dHZkM-7jEti*GxH;KC$A6)~_3Se#ISTXE#@cJ} z*mPF+UzlH^?zAyY$yC>*_3)C^811vZGV^m+X)fr!(|5kS@_qXL)S{J|2P9=Urpr6c z_6%iw@l)QS^ndG}6%SSQj$V2f9NMt`=J$_+8#B{w?^*gX&dgezef&j$z`ROZ$3KTk m{2!cOZ#aR06Bo+hn8VPgo36`mR;~mLZ3a(QKbLh*2~7YkC#n4a literal 0 HcmV?d00001 diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_wait.png b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_wait.png new file mode 100644 index 0000000000000000000000000000000000000000..11a8958a11189755d4328343ef68453f27411739 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T*yPaTIC&-l?5c*qkBay7^*~k>r&$Ly!18Z`L!$ld*I$=K*~7KJU*Af*d#L=Z)eW|&9^-1WKCL{L`wsFSMNNuj zo;@#oKi6*J``r=D+vFAZzdX&!wO{D@!naFz?&iD0QN=Umih7i5_KI$&tpRsscd#-Q z@Yya7c<9U0nzdN6`r2Cd5~;llLuAh^iB8~VdttH5|H-oZkB+~IoGy1Fo4K|lf7aKj z-Y-~KUrcMfYxp_V_`XkZxavrqt&mjfgarZk{)LRCI6 Y|5;yC(^}(m1{fI(p00i_>zopr0MHz`#sB~S literal 0 HcmV?d00001 diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_wifi_connect.png b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_wifi_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a905dfc0f9c219e48db7edb5ca93b1041766f5 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g;!3HGxU+kX;q!^2X+?^QKos)S9a~60+7BevL9R^{>w;^3X z&tcIc38B^<9WJX2SbJUOI4-=R?dq7gXZz<9H|CyL=e05ZQ|h<+|7YgkRMpV3nV zx}zc3^^8>kYjoGA=EK<@@49B>=A@)`?U}M=*@1(W(3wAXhqV%sM z<);f5H`OeQzHv>={)WIo?mrH>N8z90L;+t&5DvDvqxncelwvtDnm{r-UW|#=MI2 literal 0 HcmV?d00001 diff --git a/features/signalcomponent/src/main/resources/phone/media/icon.png b/features/signalcomponent/src/main/resources/phone/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 zcmX|G1ymHk)?T_}Vd;>R?p|tHQo6fg38|$UVM!6BLrPFWk?s;$LOP{GmJpBl$qoSA!PUg~PA65-S00{{S`XKG6NkG0RgjEntPrmV+?0|00mu7;+5 zrdpa{2QLqPJ4Y{j7=Mrl{BaxrkdY69+c~(w{Fv-v&aR%aEI&JYSeRTLWm!zbv;?)_ ziZB;fwGbbeL5Q}YLx`J$lp~A09KK8t_z}PZ=4ZzgdeKtgoc+o5EvN9A1K1_<>M?MBqb#!ASf&# zEX?<)!RH(7>1P+j=jqG(58}TVN-$psA6K}atCuI!KTJD&FMmH-78ZejBm)0qc{ESp z|LuG1{QnBUJRg_E=h1#XMWt2%fcoN@l7eAS!Es?Q+;XsRNPhiiE=@AqlLkJzF`O18 zbsbSmKN=aaq8k3NFYZfDWpKmM!coBU0(XnL8R{4=i|wi{!uWYM2je{U{B*K2PVdu&=E zTq*-XsEsJ$u5H4g6DIm2Y!DN`>^v|AqlwuCD;w45K0@eqauiqWf7l&o)+YLHm~|L~ z7$0v5mkobriU!H<@mVJHLlmQqzQ3d6Rh_-|%Yy2li*tHO>_vcnuZ7OR_xkAIuIU&x z-|8Y0wj|6|a6_I(v91y%k_kNw6pnkNdxjqG8!%Vz_d%c_!X+6-;1`GC9_FpjoHev5fEV7RhJ>r=mh-jp$fqbqRJ=obwdgLDVP5+s zy1=_DWG0Y-Jb3t^WXmkr(d9~08k-|#Ly zaNOmT(^9tIb&eb4%CzIT zAm3CUtWSr1t4?h1kk#NBi{U|pJslvME{q|_eS^3En>SOqSxyuN1x;Is@8~m?*>}** znrRFArP!K_52RpX*&JHMR<^lVdm8ypJ}0R(SD(51j;6@ni$6bQ+2XL+R^|NnSp5}(kzvMZ^(@4fD_{QVu$(&K6H|C37TG1Am9Re{<<3gd zh@`>;BqkXMW&p0T6rt|iB$)~CvFe(XC)F9WgAZn*0@t$oZo;!*}r@_`h?KKH&6A@3= zISXoQB+~`op>NP-buiA*^0n{@i{_?MRG)&k)c)k_F+-2Lud!S9pc+i`s74NpBCaGF zXN+pHkubw*msGBTY27BKHv)RRh3;nMg4&$fD_6X9Vt~;_4D+5XPH~#Kn-yjcy!$}1 zigv#FNY>TqMhtIBb@UoF!cE~Q8~;!Pek>SQQwHnHuWKoVBosAiOr}q>!>aE*Krc)V zBUMEcJ5NU0g8}-h6i1zpMY9>m4ne?=U2~`w7K7Q0gB_=p@$5K7p6}thw z-~3dMj?YNX2X$lZ+7ngQ$=s}3mizNN@kE%OtB)?c&i~2L55z8^=yz;xMHLmlY>&Q# zJj?!)M#q_SyfkQh)k?j8IfLtB)ZCp|*vf4_B zos?73yd^h-Ac+;?E4*bpf=o*^3x3-`TVjbY4n6!EN10K6o@fxdyps05Vo3PU)otB} z`3kR+2w7_C#8Z!q`J)p{Vh!+m9-UP!$STp+Hb}}#@#_u^SsUQg<}59< zTvH3%XS4G+6FF^(m6bVF&nSUIXcl;nw{=H$%fgeJ>CgDYiLdpDXr{;-AnG z8dvcrHYVMI&`R6;GWekI@Ir3!uo)oz4^{6q0m^}@f2tM9&=YHNi6-?rh0-{+k@cQm zdp`g#YdQn%MDVg2GR>wZ`n2<0l4)9nx1Wfr&!Dvz=bPwU!h2S?ez6MVc5APE4-xLB zi&W9Q8k2@0w!C53g?iAIQ}~p*3O(@zja6KQ=M3zfW*_6o5SwR-)6VBh~m7{^-=MC-owYH5-u40a}a0liho3QZZ5L{bS_xM1)4}19)zTU$$MY zq3eZML1WC{K%YFd`Be0M-rkO^l?h{kM{$2oK1*A@HVJ57*yhDkUF!2WZ&oA4Y-sK( zCY69%#`mBCi6>6uw(x4gbFaP0+FD*JKJ-q!F1E?vLJ+d35!I5d7@^eU?(CS|C^tmI5?lv@s{{*|1F zFg|OzNpZ0hxljdjaW%45O0MOttRrd(Z?h{HYbB-KFUx&9GfFL3b8NwZ$zNu)WbBD` zYkj$^UB5%3Pj1MDr>S2Ejr9pUcgA!;ZG!@{uAy12)vG=*^9-|dNQBc8&`oxBlU~#y zs!anJX&T?57Jdr^sb>e+V`MVfY>Y0ESg7MG<7W0g&bR-ZYzzZ%2H&Etcp zcd6QeXO1D!5A#zM0lx*GH}`M)2~ZFLE;sP^RSB5wVMNfiZXPd(cmO>j=OSA3`o5r& zna(|^jGXbdN7PK)U8b7^zYtYkkeb%<%F~=OqB~kXMQkq}ii|skh@WSRt>5za;cjP0 zZ~nD%6)wzedqE}BMLt~qKwlvTr33))#uP~xyw#*Eaa|DbMQ_%mG0U8numf8)0DX`r zRoG2bM;#g|p-8gWnwRV5SCW0tLjLO&9Z?K>FImeIxlGUgo0Zk`9Qzhj1eco~7XZy+hXc@YF&ZQ=? zn*^1O56yK^x{y}q`j7}blGCx%dydV!c7)g~tJzmHhV=W~jbWRRR{1<^oDK+1clprm zz$eCy7y9+?{E|YgkW~}}iB#I4XoJ*xr8R?i_Hv$=Cof5bo-Nj~f`-DLebH}&0% zfQj9@WGd4;N~Y?mzQsHJTJq6!Qzl^-vwol(+fMt#Pl=Wh#lI5Vmu@QM0=_r+1wHt` z+8WZ~c2}KQQ+q)~2Ki77QvV&`xb|xVcTms99&cD$Zz4+-^R4kvUBxG8gDk7Y`K*)JZ^2rL(+ZWV~%W(@6 z)0bPArG#BROa_PHs~&WplQ_UIrpd)1N1QGPfv!J(Z9jNT#i%H?CE6|pPZb9hJ1JW4 z^q;ft#!HRNV0YgPojzIYT`8LuET2rUe-J|c!9l4`^*;4WtY@Ew@pL>wkjmMgGfN7 ze}}GtmU0@<_#08~I-Suk=^*9GLW=H4xhsml;vAV{%hy5Eegl@!6qKqbG024%n2HHw zCc@ivW_$@5ZoHP70(7D+(`PvgjW1Pd`wsiuv-aCukMrafwDm)B!xXVy*j2opohhoU zcJz%ADmj>i3`-3-$7nQKBQQuGY;2Qt&+(L~C>vSGFj5{Mlv?T_^dql;{zkpe4R1}R z%XfZyQ}wr*sr>jrKgm*PWLjuVc%6&&`Kbf1SuFpHPN&>W)$GmqC;pIoBC`=4-hPY8 zT*>%I2fP}vGW;R=^!1be?ta2UQd2>alOFFbVl;(SQJ4Jk#)4Z0^wpWEVvY4=vyDk@ zqlModi@iVPMC+{?rm=4(n+<;|lmUO@UKYA>EPTS~AndtK^Wy^%#3<;(dQdk3WaUkRtzSMC9}7x2||CNpF#(3T4C)@ z$~RWs`BNABKX|{cmBt>Q=&gkXl&x!!NK_%5hW0LS)Z4PB>%sV?F-{Wyj#s7W%$F{D zXdK^Fp3wvy+48+GP6F_|^PCRx=ddcTO3sG;B23A49~Qaw31SZ0Rc~`r4qqt%#OGW{ zCA_(LG5^N>yzUn&kAgVmxb=EA8s&tBXC}S1CZ(KoW)(%^JjLTPo^fs`Va;`=YlVPgmB$!yB}<(4ym6OeZ3xAJJ#;)2+B%p3P1Wt+d$eo`vz`T zXfUP2))kBDPoscH;Jc7I3NU<({|@wM$&GaDt`n7WLgIY3IA7A6-_R?z8N3mz|}*i z(zl5ot--Oq@f2-nv{X(ujT2T(k1vY_qh93pK@>H-qc%2Xta)IP0Q%zt%bqYgI`o!wv!0QerB`nCN^1n|@$sVOQ!V0teVG!I z_fD%JvfDeT1cK#-{o6Gv7}& zY0#NWin~kVaf$aufV&;63Hbs|`QVZWpDX6IMk1Hj2G}fiH9e-^6u2zf^FIr^BwD<6zjw63+{yUe8PUFvk8v{sJ=R{d#`O!sz`Q13~< zPT$JS(w=yQfU2`zPCNfSw=&zup@DXc(98afjhv@1w_f!m2Z>rMJ19AB&dB%P#Ls3b z=lK7OILM+SQ&VEd=1GN6o&>YVVtIzoZ%=Z_SdqJN2}E43{bE`>w+A;=y->@^k{oCC z$F*WTY&?34;kfyFV?b*Xb1Pq`Z=%OgwEg)Rz)tx=`f%5#w_INP=x&z5!jI;#;N$ma zhO)+MDm;SxOEVL15; zGq(v2pL3&P1Sl)8P*;G-fd{l1QJsv@e@d8)1PK4w2m*M%V3j-V~L^$i|&C@b?D?9tfwE{B^}Z$k8e5FmQ>v7Xz)sG32g9t}YBt zyR$+*_00RmPx+0mW+vVG4mxd(n$(eQf3-w>JPl2UJpafrPaL5@2j}%{VE-) zBI%6Qpj*dsdH<;g!S!avA~bv^0E+ zfyJbSjPb+j;J52U)<|cIcntQBI2T#>2;tOxu{%D?kML476AErF(qN9hPva5Nkc@BF zC-tLF@3ZFb%Kpj)M<{)x*l|*Ia@ECeXo2E4h2f!aV=cHAhi_E_mfUth(sM4^hJq7B zQsGWqdZUm9S%F`$nQ*_#NcuD`&)Ek%_s{&^78{9Hm ztri&rYLOxgFdG>O@+XHy z9#;|&vBCPXH5Mon^I`jSuR$&~ZWtyB67ujzFSj!51>#C}C17~TffQ{c-!QFQkTQ%! zIR^b1`zHx|*1GU?tbBx23weFLz5H?y_Q%N&t$}k?w+``2A=aotj0;2v$~AL z{scF-cL{wsdrmPvf#a9OHyYLcwQD4Kcm)`LLwMh4WT~p29f7M!iafJSU`IV}QY5Wa z(n44-9oA}?J{a+ah*@31WTs#&J#o1`H98#6IQf;Wv0N_!);f&9g7o-k(lW5rWnDUR zQBFIRG+X=6NnsI@mxnwm;tf5;_Uxg?jZ8m-m0}&6+DA!qam(p$mN5R})yA_7m$q@| zFEd|dpS595rxQr-n#GjI5i-AhnUE>Cr;jpCqSrD~EwK_DqI^7%3#p5)%T_od!t3SOmH9MyXeeGO2(UQL;ax|x?Ncixmeo1=$ z{-);Au{*tfzOG?KQ~K|ak8-HQ?`Pekhe2WM(8s{xv-p>Zmu_6{G!-oE$7$mY`MOJorI=+mMx?H;`pr!;fVYz?5~yXBACruWB`Ph zZM}90_<^OBxIhyZ9BW$`>6JvO;%VFpqVr8|7t3~AmxYak6?`Pp#c;**_SYmi`&z23 z`p6_~ePvH)C6x-G9$hgL=eVALq`-AiamN>!3~Lxw&{H(b{B(7xSRm6<3<{%{yXiH# zos5Rv1L+8fUKJLo%P>4I&$}y + + ic_statusbar_wifi1 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg new file mode 100644 index 00000000..9e977e86 --- /dev/null +++ b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_wifi2 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg new file mode 100644 index 00000000..3fe7fef5 --- /dev/null +++ b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg @@ -0,0 +1,24 @@ + + + ic_statusbar_wifi3 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg new file mode 100644 index 00000000..18c5e416 --- /dev/null +++ b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg @@ -0,0 +1,20 @@ + + + ic_statusbar_wifi0 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg new file mode 100644 index 00000000..02b9a179 --- /dev/null +++ b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg @@ -0,0 +1,20 @@ + + + ic_statusbar_wifi0 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/phone/media/icon.png b/features/wificomponent/src/main/resources/phone/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 Date: Thu, 19 May 2022 14:05:38 +0800 Subject: [PATCH 085/373] =?UTF-8?q?systemui=20=E6=89=8B=E6=9C=BAux?= =?UTF-8?q?=E9=80=82=E9=85=8D=20svg=E5=9B=BE=E7=89=87=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: match --- .../resources/phone/media/ic_status_bt.svg | 9 +++++++ .../phone/media/ic_statusbar_phone.svg | 13 ++++++++++ .../phone/media/ic_statusbar_gps.svg | 17 +++++++++++++ .../media/ic_statusbar_ring_off_filled.svg | 17 +++++++++++++ .../phone/media/ic_statusbar_vibration_on.svg | 11 +++++++++ .../phone/media/ic_statusbar_signal_1.svg | 22 +++++++++++++++++ .../phone/media/ic_statusbar_signal_2.svg | 22 +++++++++++++++++ .../phone/media/ic_statusbar_signal_3.svg | 22 +++++++++++++++++ .../phone/media/ic_statusbar_signal_4.svg | 22 +++++++++++++++++ .../phone/media/ic_statusbar_signal_full.svg | 9 +++++++ .../phone/media/ic_statusbar_signal_no.svg | 9 +++++++ .../phone/media/ic_statusbar_wifi_1.svg | 20 ++++++++++++++++ .../phone/media/ic_statusbar_wifi_2.svg | 22 +++++++++++++++++ .../phone/media/ic_statusbar_wifi_3.svg | 24 +++++++++++++++++++ .../phone/media/ic_statusbar_wifi_full.svg | 20 ++++++++++++++++ .../phone/media/ic_statusbar_wifi_no.svg | 20 ++++++++++++++++ .../src/main/resources/phone/media/wifi.svg | 6 +++++ .../src/main/resources/phone/media/wifi_d.svg | 6 +++++ .../resources/phone/media/ic_status_bt.svg | 9 +++++++ .../phone/media/ic_statusbar_gps.svg | 17 +++++++++++++ .../phone/media/ic_statusbar_phone.svg | 13 ++++++++++ .../media/ic_statusbar_ring_off_filled.svg | 17 +++++++++++++ .../phone/media/ic_statusbar_signal_1.svg | 22 +++++++++++++++++ .../phone/media/ic_statusbar_signal_2.svg | 22 +++++++++++++++++ .../phone/media/ic_statusbar_signal_3.svg | 22 +++++++++++++++++ .../phone/media/ic_statusbar_signal_4.svg | 22 +++++++++++++++++ .../phone/media/ic_statusbar_signal_full.svg | 9 +++++++ .../phone/media/ic_statusbar_signal_no.svg | 9 +++++++ .../phone/media/ic_statusbar_vibration_on.svg | 11 +++++++++ .../phone/media/ic_statusbar_wifi_1.svg | 20 ++++++++++++++++ .../phone/media/ic_statusbar_wifi_2.svg | 22 +++++++++++++++++ .../phone/media/ic_statusbar_wifi_3.svg | 24 +++++++++++++++++++ .../phone/media/ic_statusbar_wifi_full.svg | 20 ++++++++++++++++ .../phone/media/ic_statusbar_wifi_no.svg | 20 ++++++++++++++++ 34 files changed, 570 insertions(+) create mode 100644 features/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg create mode 100644 features/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg create mode 100644 features/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg create mode 100644 features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg create mode 100644 features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg create mode 100644 features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg create mode 100644 features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg create mode 100644 features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg create mode 100644 features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg create mode 100644 features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg create mode 100644 features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg create mode 100644 features/wificomponent/src/main/resources/phone/media/wifi.svg create mode 100644 features/wificomponent/src/main/resources/phone/media/wifi_d.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg diff --git a/features/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg b/features/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg new file mode 100644 index 00000000..eef790e1 --- /dev/null +++ b/features/bluetoothcomponent/src/main/resources/phone/media/ic_status_bt.svg @@ -0,0 +1,9 @@ + + + ic_statusbar_bluetooth + + + + + + \ No newline at end of file diff --git a/features/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg b/features/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg new file mode 100644 index 00000000..939ce0c0 --- /dev/null +++ b/features/capsulecomponent/src/main/resources/phone/media/ic_statusbar_phone.svg @@ -0,0 +1,13 @@ + + + ic_status_calling + + + + + + + + + + \ No newline at end of file diff --git a/features/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg b/features/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg new file mode 100644 index 00000000..9f51a6bd --- /dev/null +++ b/features/locationcomponent/src/main/resources/phone/media/ic_statusbar_gps.svg @@ -0,0 +1,17 @@ + + + ic_statusbar_gps + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg b/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg new file mode 100644 index 00000000..3ca44fb7 --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg @@ -0,0 +1,17 @@ + + + ic_statusbar_mute + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg b/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg new file mode 100644 index 00000000..8a7f6951 --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg @@ -0,0 +1,11 @@ + + + ic_statusbar_vibration_on + + + + + + + + \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg new file mode 100644 index 00000000..5934a33d --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_1.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_signal_single1 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg new file mode 100644 index 00000000..90275d8b --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_2.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_signal_single2 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg new file mode 100644 index 00000000..5f0cb34c --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_3.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_signal_single3 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg new file mode 100644 index 00000000..bf9f9cc9 --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_4.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_signal_single4 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg new file mode 100644 index 00000000..0f891e9a --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_full.svg @@ -0,0 +1,9 @@ + + + ic_statusbar_signal_single0 + + + + + + \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg new file mode 100644 index 00000000..a1c7d5c5 --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/media/ic_statusbar_signal_no.svg @@ -0,0 +1,9 @@ + + + ic_statusbar_signal_single0 + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg new file mode 100644 index 00000000..237033bb --- /dev/null +++ b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_1.svg @@ -0,0 +1,20 @@ + + + ic_statusbar_wifi1 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg new file mode 100644 index 00000000..9e977e86 --- /dev/null +++ b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_2.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_wifi2 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg new file mode 100644 index 00000000..3fe7fef5 --- /dev/null +++ b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_3.svg @@ -0,0 +1,24 @@ + + + ic_statusbar_wifi3 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg new file mode 100644 index 00000000..18c5e416 --- /dev/null +++ b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_full.svg @@ -0,0 +1,20 @@ + + + ic_statusbar_wifi0 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg new file mode 100644 index 00000000..02b9a179 --- /dev/null +++ b/features/wificomponent/src/main/resources/phone/media/ic_statusbar_wifi_no.svg @@ -0,0 +1,20 @@ + + + ic_statusbar_wifi0 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/phone/media/wifi.svg b/features/wificomponent/src/main/resources/phone/media/wifi.svg new file mode 100644 index 00000000..94e46456 --- /dev/null +++ b/features/wificomponent/src/main/resources/phone/media/wifi.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/features/wificomponent/src/main/resources/phone/media/wifi_d.svg b/features/wificomponent/src/main/resources/phone/media/wifi_d.svg new file mode 100644 index 00000000..4ce456d7 --- /dev/null +++ b/features/wificomponent/src/main/resources/phone/media/wifi_d.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg new file mode 100644 index 00000000..eef790e1 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_status_bt.svg @@ -0,0 +1,9 @@ + + + ic_statusbar_bluetooth + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg new file mode 100644 index 00000000..9f51a6bd --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_gps.svg @@ -0,0 +1,17 @@ + + + ic_statusbar_gps + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg new file mode 100644 index 00000000..939ce0c0 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_phone.svg @@ -0,0 +1,13 @@ + + + ic_status_calling + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg new file mode 100644 index 00000000..3ca44fb7 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg @@ -0,0 +1,17 @@ + + + ic_statusbar_mute + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg new file mode 100644 index 00000000..5934a33d --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_1.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_signal_single1 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg new file mode 100644 index 00000000..90275d8b --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_2.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_signal_single2 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg new file mode 100644 index 00000000..5f0cb34c --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_3.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_signal_single3 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg new file mode 100644 index 00000000..bf9f9cc9 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_4.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_signal_single4 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg new file mode 100644 index 00000000..0f891e9a --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_full.svg @@ -0,0 +1,9 @@ + + + ic_statusbar_signal_single0 + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg new file mode 100644 index 00000000..a1c7d5c5 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_signal_no.svg @@ -0,0 +1,9 @@ + + + ic_statusbar_signal_single0 + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg new file mode 100644 index 00000000..8a7f6951 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_vibration_on.svg @@ -0,0 +1,11 @@ + + + ic_statusbar_vibration_on + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg new file mode 100644 index 00000000..237033bb --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_1.svg @@ -0,0 +1,20 @@ + + + ic_statusbar_wifi1 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg new file mode 100644 index 00000000..9e977e86 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_2.svg @@ -0,0 +1,22 @@ + + + ic_statusbar_wifi2 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg new file mode 100644 index 00000000..3fe7fef5 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_3.svg @@ -0,0 +1,24 @@ + + + ic_statusbar_wifi3 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg new file mode 100644 index 00000000..18c5e416 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_full.svg @@ -0,0 +1,20 @@ + + + ic_statusbar_wifi0 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg new file mode 100644 index 00000000..02b9a179 --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_wifi_no.svg @@ -0,0 +1,20 @@ + + + ic_statusbar_wifi0 + + + + + + + + + + + + + + + + + \ No newline at end of file -- Gitee From 8328d12344f8519023651c0c0e5405c8479d2b7a Mon Sep 17 00:00:00 2001 From: Mst Date: Thu, 19 May 2022 14:33:38 +0800 Subject: [PATCH 086/373] =?UTF-8?q?=E6=A8=AA=E7=AB=96=E5=B1=8F=E7=9A=84?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mst --- .../ets/com/ohos/view/component/customPSD.ets | 24 ++- .../com/ohos/view/component/digitalPSD.ets | 11 +- .../com/ohos/view/component/numkeyBoard.ets | 48 +++-- .../main/resources/phone/element/float.json | 184 ++++++++++++++++++ .../main/resources/phone/element/string.json | 76 ++++++++ .../src/main/ets/pages/customPassword.ets | 22 ++- .../src/main/ets/pages/digitalPassword.ets | 24 ++- .../src/main/resources/base/media/bg.png | Bin 0 -> 69792 bytes 8 files changed, 338 insertions(+), 51 deletions(-) create mode 100644 features/screenlock/src/main/resources/phone/element/float.json create mode 100644 features/screenlock/src/main/resources/phone/element/string.json create mode 100644 product/phone/src/main/resources/base/media/bg.png diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index 104f9e3d..c662edf7 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -17,6 +17,7 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard' import ViewModel from '../../vm/customPSDViewModel' +import deviceInfo from '@ohos.deviceInfo'; const TAG = 'ScreenLock-CustomPSD' @@ -42,7 +43,7 @@ export default struct CustomPSD { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { Text(this.mViewModel.prompt) .fontSize($r('app.float.custompsd_prompt_fontsize')) - .fontWeight(FontWeight.Bold) + .fontWeight(deviceInfo.deviceType === 'tablet' ? FontWeight.Bold : 'Medium') .fontColor(Color.White) .margin({ bottom: $r('app.float.custompsd_prompt_margin_bottom') }) .textAlign(TextAlign.Center) @@ -52,37 +53,42 @@ export default struct CustomPSD { Stack({ alignContent: Alignment.Center }) { Text() - .width(Constants.FULL_CONTAINER_WIDTH) - .height(Constants.FULL_CONTAINER_HEIGHT) + .width(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_WIDTH : 288) + .height(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_HEIGHT : 36) .backgroundColor(Color.Gray) .borderRadius($r('app.float.custompsd_input_radius')) + .opacity(deviceInfo.deviceType === 'tablet' ? 1 : 0.2) List({ space: Constants.DIGITALPSD_IC_DIAMETER }) { ForEach(this.passwordArr, (item) => { ListItem() { Image($r("app.media.ic_solid_dot")) - .width(Constants.DIGITALPSD_IC_DIAMETER) - .height(Constants.DIGITALPSD_IC_DIAMETER) + .width(deviceInfo.deviceType === 'tablet' ? Constants.DIGITALPSD_IC_DIAMETER : 9) + .height(deviceInfo.deviceType === 'tablet' ? Constants.DIGITALPSD_IC_DIAMETER : 9) } }) } .listDirection(Axis.Horizontal) - .height(Constants.DIGITALPSD_IC_DIAMETER) + .height(deviceInfo.deviceType === 'tablet' ? Constants.DIGITALPSD_IC_DIAMETER : 9) } .width($r('app.float.custompsd_input_width')) .height($r('app.float.custompsd_input_height')) - Button($r('app.string.done'), { type: ButtonType.Capsule, stateEffect: true }) + Button($r('app.string.done'), { + type: ButtonType.Capsule, + stateEffect: true + }) .width($r('app.float.custompsd_input_width')) - .height($r('app.float.custompsd_input_height')) + .height(deviceInfo.deviceType === 'tablet' ? $r('app.float.custompsd_input_height') : 40) .enabled(this.passwordArr.length > 1) + .opacity(deviceInfo.deviceType === 'tablet' ? 1 : (this.passwordArr.length > 1 ? 1 : 0.4)) .onClick(() => { Log.showInfo(TAG, `onClick`) this.mViewModel.onAuthPassword(() => { Log.showInfo(TAG, `onClick callback promptText:${JSON.stringify(this.mViewModel.prompt)}`) }); }) - .margin({ top: $r('sys.float.ohos_id_elements_margin_vertical_l') }) + .margin({ top: deviceInfo.deviceType === 'tablet' ? $r('sys.float.ohos_id_elements_margin_vertical_l') : 16 }) } .width(Constants.FULL_CONTAINER_WIDTH) .height($r('app.float.custompsd_input_area_height')) diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets index 3ad93895..64e32436 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -17,6 +17,7 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard' import ViewModel from '../../vm/digitalPSDViewModel' +import deviceInfo from '@ohos.deviceInfo'; const TAG = 'ScreenLock-DigitalPSD' @@ -42,7 +43,7 @@ export default struct DigitalPSD { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { Text(this.mViewModel.prompt) .fontSize($r('app.float.digitalpsd_prompt_fontsize')) - .fontWeight(FontWeight.Bold) + .fontWeight(deviceInfo.deviceType === 'tablet' ? FontWeight.Bold : "Medium") .fontColor(Color.White) .margin({ bottom: $r('app.float.digitalpsd_prompt_margin_bottom') }) .textAlign(TextAlign.Center) @@ -54,8 +55,8 @@ export default struct DigitalPSD { ForEach(this.passwdMaskArr, (item) => { GridItem() { Image(item) - .width(Constants.DIGITALPSD_IC_DIAMETER) - .height(Constants.DIGITALPSD_IC_DIAMETER) + .width(deviceInfo.deviceType === 'tablet' ? Constants.DIGITALPSD_IC_DIAMETER : 12) + .height(deviceInfo.deviceType === 'tablet' ? Constants.DIGITALPSD_IC_DIAMETER : 12) } }) } @@ -64,7 +65,9 @@ export default struct DigitalPSD { .height($r('app.float.digitalpsd_passwdmask_height')) .margin(0) } - .margin({ bottom: $r('app.float.digitalpsd_passwdmask_margin_bottom') }) + .margin({ + bottom: $r('app.float.digitalpsd_passwdmask_margin_bottom') + }) .width(Constants.FULL_CONTAINER_WIDTH) .height($r('app.float.digitalpsd_input_area_height')) .flexShrink(1) diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets index d94dbd19..509a498a 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets @@ -16,6 +16,7 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' import BaseViewModel from '../../vm/baseViewModel' +import deviceInfo from '@ohos.deviceInfo'; const TAG = 'ScreenLock-NumkeyBoard' @@ -50,51 +51,57 @@ export default struct NumkeyBoard { item.value == Constants.DEL_PWD) { Text(item.row1) .fontSize($r('app.float.digitalpsd_prompt_fontsize')) - .fontWeight(FontWeight.Bold) + .fontWeight(deviceInfo.deviceType === 'tablet' ? FontWeight.Bold : 'Medium') .fontColor(Color.White) .textAlign(TextAlign.Center) .width(Constants.FULL_CONTAINER_WIDTH) + .lineHeight(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_HEIGHT : 21) .padding(0) .margin(0) } else { Text(item.row1) .fontSize($r('app.float.digitalpsd_row1_fontsize')) - .fontWeight(FontWeight.Bold) + .fontWeight(deviceInfo.deviceType === 'tablet' ? FontWeight.Bold : 'Medium') .fontColor(Color.White) .textAlign(TextAlign.Center) .width(Constants.FULL_CONTAINER_WIDTH) + .lineHeight(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_HEIGHT : 38) .padding(0) .margin(0) } if (!!item.row2) { Text(item.row2) .fontSize($r('app.float.digitalpsd_row2_fontsize')) - .fontWeight(FontWeight.Bold) + .fontWeight(deviceInfo.deviceType === 'tablet' ? FontWeight.Bold : 'Regular') .fontColor(Color.White) + .opacity(deviceInfo.deviceType === 'tablet' ? 1 : 0.6) .textAlign(TextAlign.Center) .width(Constants.FULL_CONTAINER_WIDTH) .padding(0) .margin(0) } } + .width(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_WIDTH : 98.75) .height($r('app.float.digitalpsd_row_height')) } - if (item.value == Constants.CALL_PHONE || - item.value == Constants.GO_BACK || - item.value == Constants.DEL_PWD) { - Column() { - Button({ type: ButtonType.Normal, stateEffect: true }) - .backgroundColor("#00FFFFFF") - .width(Constants.DIGITALPSD_BUTTON_RECT_WH) - .height(Constants.DIGITALPSD_BUTTON_RECT_HH) - } - } else { - Column() { - Button({ type: ButtonType.Circle, stateEffect: !this.viewModel.inhibitInput }) - .backgroundColor("#00FFFFFF") - .width(Constants.DIGITALPSD_BUTTON_DIAMETER) - .height(Constants.DIGITALPSD_BUTTON_DIAMETER) + if (deviceInfo.deviceType === 'tablet') { + if (item.value == Constants.CALL_PHONE || + item.value == Constants.GO_BACK || + item.value == Constants.DEL_PWD) { + Column() { + Button({ type: ButtonType.Normal, stateEffect: true }) + .backgroundColor("#00FFFFFF") + .width(Constants.DIGITALPSD_BUTTON_RECT_WH) + .height(Constants.DIGITALPSD_BUTTON_RECT_HH) + } + } else { + Column() { + Button({ type: ButtonType.Circle, stateEffect: !this.viewModel.inhibitInput }) + .backgroundColor("#00FFFFFF") + .width(Constants.DIGITALPSD_BUTTON_DIAMETER) + .height(Constants.DIGITALPSD_BUTTON_DIAMETER) + } } } } @@ -109,8 +116,9 @@ export default struct NumkeyBoard { } .columnsTemplate('1fr 1fr 1fr') .rowsTemplate('1fr 1fr 1fr 1fr') - .width(Constants.FULL_CONTAINER_WIDTH) - .height(Constants.FULL_CONTAINER_HEIGHT) + .rowsGap(deviceInfo.deviceType === 'tablet' ? 0 : 22) + .width(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_WIDTH : 312) + .height(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_HEIGHT : 288) } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) diff --git a/features/screenlock/src/main/resources/phone/element/float.json b/features/screenlock/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..479daa25 --- /dev/null +++ b/features/screenlock/src/main/resources/phone/element/float.json @@ -0,0 +1,184 @@ +{ + "float": [ + { + "name": "lockicon_width", + "value": "40" + }, + { + "name": "lockicon_height", + "value": "45" + }, + { + "name": "lockicon_top_margin", + "value": "10" + }, + { + "name": "lockicon_bottom_margin", + "value": "10" + }, + { + "name": "lock_prompt_fontsize", + "value": "32" + }, + { + "name": "deleteall_image_opacity", + "value": "0.9" + }, + { + "name": "batterysoc_fontsize", + "value": "36" + }, + { + "name": "accounts_component_height", + "value": "120" + }, + { + "name": "accounts_ic_width", + "value": "72" + }, + { + "name": "accounts_ic_height", + "value": "72" + }, + { + "name": "accounts_name_fontsize", + "value": "24" + }, + { + "name": "accounts_block", + "value": "8" + }, + { + "name": "digitalpsd_prompt_fontsize", + "value": "16vp" + }, + { + "name": "digitalpsd_prompt_margin_bottom", + "value": "24vp" + }, + { + "name": "digitalpsd_prompt_width", + "value": "800" + }, + { + "name": "digitalpsd_prompt_height", + "value": "22vp" + }, + { + "name": "digitalpsd_passwdmask_width", + "value": "192vp" + }, + { + "name": "digitalpsd_passwdmask_height", + "value": "12vp" + }, + { + "name": "digitalpsd_passwdmask_margin_bottom", + "value": "151vp" + }, + { + "name": "digitalpsd_input_area_height", + "value": "60vp" + }, + { + "name": "digitalpsd_row1_fontsize", + "value": "28vp" + }, + { + "name": "digitalpsd_row2_fontsize", + "value": "12vp" + }, + { + "name": "digitalpsd_row_height", + "value": "48vp" + }, + { + "name": "digitalpsd_key_area_height", + "value": "800" + }, + { + "name": "digitalpsd_key_area_margin_bottom", + "value": "52vp" + }, + { + "name": "mixedpsd_prompt_fontsize", + "value": "32" + }, + { + "name": "mixedpsd_prompt_margin_bottom", + "value": "48" + }, + { + "name": "mixedpsd_prompt_width", + "value": "800" + }, + { + "name": "mixedpsd_prompt_height", + "value": "72" + }, + { + "name": "mixedpsd_input_maxlen", + "value": "30" + }, + { + "name": "mixedpsd_input_width", + "value": "600" + }, + { + "name": "mixedpsd_input_height", + "value": "72" + }, + { + "name": "mixedpsd_input_margin_bottom", + "value": "128" + }, + { + "name": "custompsd_prompt_fontsize", + "value": "16vp" + }, + { + "name": "custompsd_prompt_margin_bottom", + "value": "24vp" + }, + { + "name": "custompsd_prompt_width", + "value": "800" + }, + { + "name": "custompsd_prompt_height", + "value": "22vp" + }, + { + "name": "custompsd_input_width", + "value": "288vp" + }, + { + "name": "custompsd_input_height", + "value": "36vp" + }, + { + "name": "custompsd_input_radius", + "value": "18vp" + }, + { + "name": "custompsd_input_margin_bottom", + "value": "90" + }, + { + "name": "custompsd_passwdmask_margin_bottom", + "value": "71vp" + }, + { + "name": "custompsd_input_area_height", + "value": "138vp" + }, + { + "name": "custompsd_key_area_height", + "value": "800" + }, + { + "name": "custompsd_key_area_margin_bottom", + "value": "52vp" + } + ] +} \ No newline at end of file diff --git a/features/screenlock/src/main/resources/phone/element/string.json b/features/screenlock/src/main/resources/phone/element/string.json new file mode 100644 index 00000000..fcf0366a --- /dev/null +++ b/features/screenlock/src/main/resources/phone/element/string.json @@ -0,0 +1,76 @@ +{ + "string": [ + { + "name": "lock_prompt", + "value": "屏幕锁定中" + }, + { + "name": "unlock_prompt", + "value": "上滑解锁" + }, + { + "name": "recognizing_face", + "value": "正在识别人脸" + }, + { + "name": "face_not_recognized", + "value": "未识别成功, 双击重试" + }, + { + "name": "yyyy_mm_dd", + "value": "%d/%d/%d" + }, + { + "name": "nonotification_text", + "value": "无通知" + }, + { + "name": "input", + "value": "输入密码" + }, + { + "name": "incorrect", + "value": "密码错误" + }, + { + "name": "incorrect_promp_times", + "value": "密码错误,还可尝试%d次" + }, + { + "name": "incorrect_promp_freezing", + "value": "密码错误,还可尝试%d次,失败后将锁定%s" + }, + { + "name": "input_promp", + "value": "请%s后重试" + }, + { + "name": "emergency_call", + "value": "紧急呼叫" + }, + { + "name": "back", + "value": "返回" + }, + { + "name": "delete", + "value": "删除" + }, + { + "name": "done", + "value": "确认" + }, + { + "name": "charge_full", + "value": "已充满" + }, + { + "name": "charging", + "value": "正在充电%s" + }, + { + "name": "battery_soc", + "value": "目前电量%s" + } + ] +} \ No newline at end of file diff --git a/product/phone/src/main/ets/pages/customPassword.ets b/product/phone/src/main/ets/pages/customPassword.ets index b5e4d779..b62c835f 100644 --- a/product/phone/src/main/ets/pages/customPassword.ets +++ b/product/phone/src/main/ets/pages/customPassword.ets @@ -43,18 +43,22 @@ export default struct CustomPassword { } build() { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Column() { - StatusBar() - }.height(this.mHeightPx + 'px' ) + Stack() { + Image($r('app.media.bg')).width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Column() { + StatusBar() + }.height(this.mHeightPx + 'px') - Column() { - CustomPSD() + Column() { + CustomPSD() + } + .width(Constants.PASSWORD_AREA_WIDTH) } - .width(Constants.PASSWORD_AREA_WIDTH) + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) } - .width(Constants.FULL_CONTAINER_WIDTH) - .height(Constants.FULL_CONTAINER_HEIGHT) .backgroundColor($r('app.color.page_background')) } } \ No newline at end of file diff --git a/product/phone/src/main/ets/pages/digitalPassword.ets b/product/phone/src/main/ets/pages/digitalPassword.ets index 264e0257..adefcb8f 100644 --- a/product/phone/src/main/ets/pages/digitalPassword.ets +++ b/product/phone/src/main/ets/pages/digitalPassword.ets @@ -43,17 +43,23 @@ export default struct DigitalPassword { } build() { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Column() { - StatusBar() - }.height(this.mHeightPx + 'px' ) - Column() { - DigitalPSD() + Stack() { + Image($r('app.media.bg')).width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Column() { + StatusBar() + }.height(this.mHeightPx + 'px') + + Column() { + DigitalPSD() + } + .width(Constants.PASSWORD_AREA_WIDTH) } - .width(Constants.PASSWORD_AREA_WIDTH) + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + } - .width(Constants.FULL_CONTAINER_WIDTH) - .height(Constants.FULL_CONTAINER_HEIGHT) .backgroundColor($r('app.color.page_background')) } } \ No newline at end of file diff --git a/product/phone/src/main/resources/base/media/bg.png b/product/phone/src/main/resources/base/media/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b665321b31ef04e92c4d215bded0898b631866ad GIT binary patch literal 69792 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 mL6dIJIyNxaq$vnFC;1PjsmdgFQj8b?0000 Date: Thu, 19 May 2022 16:19:33 +0800 Subject: [PATCH 087/373] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=9A=84wifi=E2=80=94=20svg=E5=9B=BE?= =?UTF-8?q?=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: match --- .../wificomponent/src/main/resources/phone/media/wifi.svg | 6 ------ .../wificomponent/src/main/resources/phone/media/wifi_d.svg | 6 ------ 2 files changed, 12 deletions(-) delete mode 100644 features/wificomponent/src/main/resources/phone/media/wifi.svg delete mode 100644 features/wificomponent/src/main/resources/phone/media/wifi_d.svg diff --git a/features/wificomponent/src/main/resources/phone/media/wifi.svg b/features/wificomponent/src/main/resources/phone/media/wifi.svg deleted file mode 100644 index 94e46456..00000000 --- a/features/wificomponent/src/main/resources/phone/media/wifi.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/features/wificomponent/src/main/resources/phone/media/wifi_d.svg b/features/wificomponent/src/main/resources/phone/media/wifi_d.svg deleted file mode 100644 index 4ce456d7..00000000 --- a/features/wificomponent/src/main/resources/phone/media/wifi_d.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - -- Gitee From e6adddcee3f378d63156a3fcc4cf9832019f4179 Mon Sep 17 00:00:00 2001 From: match Date: Fri, 20 May 2022 17:21:34 +0800 Subject: [PATCH 088/373] =?UTF-8?q?systemui=20=E6=89=8B=E6=9C=BAux?= =?UTF-8?q?=E9=80=82=E9=85=8D-=E9=80=9A=E7=9F=A5=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: match --- .../main/ets/default/StyleConfiguration.ts | 4 +- .../ohos/view/component/appItemComponent.ets | 59 ++- .../com/ohos/view/component/headComponent.ets | 3 +- .../com/ohos/view/component/itemComponent.ets | 2 +- .../view/component/noDisturbComponent.ets | 16 +- .../ohos/view/component/slotLstComponent.ets | 2 +- .../ohos/view/component/switchComponent.ets | 8 +- .../main/resources/base/element/float.json | 4 + .../main/resources/phone/element/color.json | 36 ++ .../main/resources/phone/element/float.json | 364 ++++++++++++++++++ .../src/main/ets/pages/batchSetEnable.ets | 4 +- .../src/main/ets/pages/noDisturbPre.ets | 11 +- .../ets/pages/notificationManagenment.ets | 27 +- 13 files changed, 497 insertions(+), 43 deletions(-) create mode 100644 features/managementcomponent/src/main/resources/phone/element/color.json create mode 100644 features/managementcomponent/src/main/resources/phone/element/float.json diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts index 1d8f3e26..dd853bb3 100644 --- a/common/src/main/ets/default/StyleConfiguration.ts +++ b/common/src/main/ets/default/StyleConfiguration.ts @@ -22,10 +22,10 @@ export default class StyleConfiguration { const key: string = TAG + "-Common"; return StyleManager.getStyle(key, () => { return { - statusBarFontSize: '16fp', + statusBarFontSize: '12fp', statusBarIconWidth: '24vp', statusBarIconHeight: '24vp', - statusBarMarginLeftRight: '5vp', + statusBarMarginLeftRight: '0vp', }; }); } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets index fb5cc8ca..e47412ec 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets @@ -56,78 +56,104 @@ export default struct AppItemComponent { Text(this.appTitle) .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontWeight(FontWeight.Medium) .textAlign(TextAlign.Start) .maxLines(ConfigData.MAX_LINES_3) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .margin({ top: $r('app.float.appitem_label_margin_t'), bottom: $r('app.float.appitem_label_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + .margin({ + top: $r('app.float.appitem_label_margin_t'), + bottom: $r('app.float.appitem_label_margin_b'), + left: $r('app.float.page_notice_info_label_margin') + }); Row() { if (this.appSwitch === 3) { if (parseInt(this.appValue) == 0) { Text($r('app.string.slot_unknown')) - .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('sys.float.ohos_id_text_size_body2')) .textAlign(TextAlign.Start) .maxLines(ConfigData.MAX_LINES_1) .textOverflow({ overflow: TextOverflow.Ellipsis }) .visibility(Visibility.Visible) - .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + .margin({ + bottom: $r('app.float.appitem_version_margin_b'), + left: $r('app.float.page_notice_info_label_margin') + }); } else if (parseInt(this.appValue) == 1) { Text($r('app.string.slot_social_communication')) - .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('sys.float.ohos_id_text_size_body2')) .textAlign(TextAlign.Start) .maxLines(ConfigData.MAX_LINES_1) .textOverflow({ overflow: TextOverflow.Ellipsis }) .visibility(Visibility.Visible) - .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + .margin({ + bottom: $r('app.float.appitem_version_margin_b'), + left: $r('app.float.page_notice_info_label_margin') + }); } else if (parseInt(this.appValue) == 2) { Text($r('app.string.slot_service_information')) - .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('sys.float.ohos_id_text_size_body2')) .textAlign(TextAlign.Start) .maxLines(ConfigData.MAX_LINES_1) .textOverflow({ overflow: TextOverflow.Ellipsis }) .visibility(Visibility.Visible) - .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + .margin({ + bottom: $r('app.float.appitem_version_margin_b'), + left: $r('app.float.page_notice_info_label_margin') + }); } else if (parseInt(this.appValue) == 3) { Text($r('app.string.slot_content_information')) - .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('sys.float.ohos_id_text_size_body2')) .textAlign(TextAlign.Start) .maxLines(ConfigData.MAX_LINES_1) .textOverflow({ overflow: TextOverflow.Ellipsis }) .visibility(Visibility.Visible) - .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + .margin({ + bottom: $r('app.float.appitem_version_margin_b'), + left: $r('app.float.page_notice_info_label_margin') + }); } else if (parseInt(this.appValue) == 0xFFFF) { Text($r('app.string.slot_other')) - .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('sys.float.ohos_id_text_size_body2')) .textAlign(TextAlign.Start) .maxLines(ConfigData.MAX_LINES_1) .textOverflow({ overflow: TextOverflow.Ellipsis }) .visibility(Visibility.Visible) - .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + .margin({ + bottom: $r('app.float.appitem_version_margin_b'), + left: $r('app.float.page_notice_info_label_margin') + }); } else { Text('') - .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('sys.float.ohos_id_text_size_body2')) .textAlign(TextAlign.Start) .maxLines(ConfigData.MAX_LINES_1) .textOverflow({ overflow: TextOverflow.Ellipsis }) .visibility(Visibility.Visible) - .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + .margin({ + bottom: $r('app.float.appitem_version_margin_b'), + left: $r('app.float.page_notice_info_label_margin') + }); } } else { Text($r('app.string.version')) - .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('sys.float.ohos_id_text_size_body2')) .textAlign(TextAlign.Start) .maxLines(ConfigData.MAX_LINES_1) .textOverflow({ overflow: TextOverflow.Ellipsis }) .visibility(Visibility.Visible) - .margin({ bottom: $r('app.float.appitem_version_margin_b'), left: $r('app.float.page_notice_info_label_margin') }); + .margin({ + bottom: $r('app.float.appitem_version_margin_b'), + left: $r('app.float.page_notice_info_label_margin') + }); Text(this.appSummary) - .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('sys.float.ohos_id_text_size_body2')) .textAlign(TextAlign.Start) .maxLines(ConfigData.MAX_LINES_1) @@ -180,6 +206,7 @@ export default struct AppItemComponent { } else { Toggle({ type: ToggleType.Switch, isOn: this.canNotice }) .align(Alignment.End) + .selectedColor($r("app.color.font_color_007DFF")) .width($r('app.float.toggle_comp_width')) .height($r('app.float.toggle_comp_height')) .enabled(this.isCanChange) diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets index 57188627..6614740a 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets @@ -43,7 +43,7 @@ struct HeadComponent { Text(this.headName) .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('app.float.page_phrases_tittle_font')) - .fontWeight(FontWeight.Bold) + .fontWeight(FontWeight.Medium) .width(ConfigData.WH_100_100) .maxLines(ConfigData.MAX_LINES_1) .textOverflow({ overflow: TextOverflow.Ellipsis }) @@ -51,7 +51,6 @@ struct HeadComponent { } .width(ConfigData.WH_100_100) .height($r('app.float.page_title_height')) - .margin({top:$r('app.float.page_header_margin_t')}) .alignItems(VerticalAlign.Center) .align(Alignment.Start) } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets index 770643a6..48ddac44 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/itemComponent.ets @@ -28,7 +28,7 @@ export default struct ItemComponent { .fontColor($r('app.color.itemComp_title_color')) .width(ConfigData.WH_45_100) .textAlign(TextAlign.Start) - .fontWeight(FontWeight.Bold) + .fontWeight(FontWeight.Medium) Blank() Text(this.value) .fontSize($r('app.float.itemComp_value_font')) diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets index f8152088..712413b0 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets @@ -13,7 +13,7 @@ * limitations under the License. */ import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -import ConfigData, {DoNotDisturbType} from '../../common/constants'; +import ConfigData, { DoNotDisturbType } from '../../common/constants'; import ViewModel from '../../vm/noDisturbComponentViewModel' const TAG = 'ManagementComponent-NoDisturbComponent'; @@ -52,8 +52,9 @@ export default struct NoDisturbComponent { .fontSize($r('app.float.itemComp_titel_font')) .fontColor($r('app.color.itemComp_title_color')) .textAlign(TextAlign.Start) - .fontWeight(FontWeight.Bold) + .fontWeight(FontWeight.Medium) } + Row() { if (this.mRefreshCnt > 0) { if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_ONCE) { @@ -65,6 +66,7 @@ export default struct NoDisturbComponent { .fontSize($r('app.float.itemComp_value_font')) .fontColor($r('app.color.itemComp_font_color')) .textAlign(TextAlign.Start) + .margin({ top: $r("sys.float.ohos_id_text_margin_vertical") }) } else if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_DAILY) { Text($r('app.string.noDisturb_daily_label')) .fontSize($r('app.float.itemComp_value_font')) @@ -74,6 +76,7 @@ export default struct NoDisturbComponent { .fontSize($r('app.float.itemComp_value_font')) .fontColor($r('app.color.itemComp_font_color')) .textAlign(TextAlign.Start) + .margin({ top: $r("sys.float.ohos_id_text_margin_vertical") }) } else if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { Text($r('app.string.noDisturb_clearly_label')) .fontSize($r('app.float.itemComp_value_font')) @@ -83,11 +86,13 @@ export default struct NoDisturbComponent { .fontSize($r('app.float.itemComp_value_font')) .fontColor($r('app.color.itemComp_font_color')) .textAlign(TextAlign.Start) + .margin({ top: $r("sys.float.ohos_id_text_margin_vertical") }) } else { Text($r('app.string.noDisturb_closed')) .fontSize($r('app.float.itemComp_value_font')) .fontColor($r('app.color.itemComp_font_color')) .textAlign(TextAlign.Start) + .margin({ top: $r("sys.float.ohos_id_text_margin_vertical") }) } } else { Blank(); @@ -106,6 +111,7 @@ export default struct NoDisturbComponent { .align(Alignment.End) .width($r('app.float.toggle_comp_width')) .height($r('app.float.toggle_comp_height')) + .selectedColor($r("app.color.font_color_007DFF")) .onChange((data) => { Log.showInfo(TAG, `Toggle onChange param: data = ${data}`) if (this.mPrevGetCnt == 0) { @@ -124,8 +130,8 @@ export default struct NoDisturbComponent { this.mViewModel.repeatMode = this.mViewModel.isEffective ? this.mPrevReapMode : DoNotDisturbType.TYPE_NONE; if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_NONE) { this.mViewModel.refreshDate.bind(this.mViewModel)(this.mViewModel.repeatMode, - this.mViewModel.getDateByHHMI(ConfigData.TIME_EMPTY), - this.mViewModel.getDateByHHMI(ConfigData.TIME_EMPTY)); + this.mViewModel.getDateByHHMI(ConfigData.TIME_EMPTY), + this.mViewModel.getDateByHHMI(ConfigData.TIME_EMPTY)); } else { this.mViewModel.refreshDate.bind(this.mViewModel)(this.mViewModel.repeatMode, this.mPrevStartTime, @@ -140,7 +146,7 @@ export default struct NoDisturbComponent { .flexShrink(0) .align(Alignment.End) .alignItems(VerticalAlign.Center) - .padding({ right: $r('sys.float.ohos_id_max_padding_end') }) + .padding({ right: $r('sys.float.ohos_id_default_padding_end') }) } .width(ConfigData.WH_100_100) .height($r('app.float.itemComp_noDisturb_height')) diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets index de2088b3..cf073136 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets @@ -33,7 +33,7 @@ export default struct SlotLstComponent { Text($r('app.string.slotType')) .fontColor($r('sys.color.ohos_id_color_text_secondary')) .fontSize($r('sys.float.ohos_id_text_size_body2')) - .fontWeight(FontWeight.Bold) + .fontWeight(FontWeight.Medium) .width(ConfigData.WH_100_100) .maxLines(ConfigData.MAX_LINES_1) .textOverflow({ overflow: TextOverflow.Ellipsis }) diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index 4c4f5a56..d39d889c 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -34,11 +34,11 @@ export default struct SwitchComponent { Text(this.title) .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('sys.float.ohos_id_text_size_body1')) - .fontWeight(FontWeight.Bold) + .fontWeight(FontWeight.Medium) .align(Alignment.Start) Text(this.describe) .fontColor($r('sys.color.ohos_id_color_text_primary')) - .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) .align(Alignment.Start) .visibility((this.describe ? true : false) ? Visibility.Visible : Visibility.None) }.alignItems(HorizontalAlign.Start) @@ -53,6 +53,8 @@ export default struct SwitchComponent { Row() { Toggle({ type: ToggleType.Switch, isOn: this.initState }) .align(Alignment.End) + .offset({ x: $r("app.float.noDisturb_offset_x"), y: 0 }) + .selectedColor($r("app.color.font_color_007DFF")) .width($r('app.float.toggle_comp_width')) .height($r('app.float.toggle_comp_height')) .enabled(this.isCanChange) @@ -66,7 +68,7 @@ export default struct SwitchComponent { .align(Alignment.End) .padding({ right: $r('app.float.switchComp_padding_r') }) }.width(ConfigData.WH_100_100) - .height($r('app.float.switchComp_height') ) + .height($r('app.float.switchComp_height')) .border({ width: $r('app.float.border_width'), color: Color.White, radius: $r('app.float.border_radius') }) .backgroundColor(Color.White) diff --git a/features/managementcomponent/src/main/resources/base/element/float.json b/features/managementcomponent/src/main/resources/base/element/float.json index 95c96582..73fd5720 100644 --- a/features/managementcomponent/src/main/resources/base/element/float.json +++ b/features/managementcomponent/src/main/resources/base/element/float.json @@ -355,6 +355,10 @@ { "name": "noDisturb_margin_16", "value": "16vp" + }, + { + "name": "noDisturb_offset_x", + "value": "0" } ] } \ No newline at end of file diff --git a/features/managementcomponent/src/main/resources/phone/element/color.json b/features/managementcomponent/src/main/resources/phone/element/color.json new file mode 100644 index 00000000..bf9ed9c0 --- /dev/null +++ b/features/managementcomponent/src/main/resources/phone/element/color.json @@ -0,0 +1,36 @@ +{ + "color": [ + { + "name": "background_color", + "value": "#0xDCDCDC" + }, + { + "name": "background_transparent", + "value": "#00000000" + }, + { + "name": "appitem_label_fontcolor", + "value": "#333333" + }, + { + "name": "appitem_version_fontcolor", + "value": "#999999" + }, + { + "name": "divider_color", + "value": "#0C000000" + }, + { + "name": "itemComp_title_color", + "value": "#182431" + }, + { + "name": "itemComp_font_color", + "value": "#182431" + }, + { + "name": "font_color_007DFF", + "value": "#007DFF" + } + ] +} \ No newline at end of file diff --git a/features/managementcomponent/src/main/resources/phone/element/float.json b/features/managementcomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..fd2c343f --- /dev/null +++ b/features/managementcomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,364 @@ +{ + "float": [ + { + "name": "page_margin_l", + "value": "12pv" + }, + { + "name": "page_margin_r", + "value": "12pv" + }, + { + "name": "page_margin_t", + "value": "5" + }, + { + "name": "page_margin_b", + "value": "5" + }, + { + "name": "page_title_font", + "value": "24vp" + }, + { + "name": "page_title_height", + "value": "56vp" + }, + { + "name": "page_phrases_font", + "value": "14fp" + }, + { + "name": "page_phrases_padding_t", + "value": "19vp" + }, + { + "name": "applist_hieght", + "value": "476vp" + }, + { + "name": "applist_hieght_phone", + "value": "800vp" + }, + { + "name": "applist_hieght_bat", + "value": "584vp" + }, + { + "name": "applist_hieght_bat_phone", + "value": "1022vp" + }, + { + "name": "page_header_margin_t", + "value": "24vp" + }, + { + "name": "applist_margin_t", + "value": "12vp" + }, + { + "name": "page_phrases_height", + "value": "48vp" + }, + { + "name": "page_phrases_tittle_font", + "value": "20fp" + }, + { + "name": "dialog_title_height", + "value": "60vp" + }, + { + "name": "dialog_title_font", + "value": "20fp" + }, + { + "name": "dialog_title_margin_l", + "value": "50" + }, + { + "name": "dialog_button_font", + "value": "20fp" + }, + { + "name": "timeDialog_height", + "value": "310vp" + }, + { + "name": "timeDialog_datePicker_height", + "value": "200vp" + }, + { + "name": "repeatDialog_cont_font", + "value": "16fp" + }, + { + "name": "repeatDialog_height", + "value": "320vp" + }, + { + "name": "border_width", + "value": "1" + }, + { + "name": "border_radius", + "value": "24vp" + }, + { + "name": "image_border_radius", + "value": "15" + }, + { + "name": "appitem_item_height", + "value": "72vp" + }, + { + "name": "appitem_header_icon_width", + "value": "24vp" + }, + { + "name": "appitem_header_icon_height", + "value": "24vp" + }, + { + "name": "appitem_icon_width", + "value": "48vp" + }, + { + "name": "appitem_icon_height", + "value": "48vp" + }, + { + "name": "appitem_icon_info_margin_r", + "value": "4vp" + }, + { + "name": "appitem_icon_info_list_margin_r", + "value": "4vp" + }, + { + "name": "appitem_icon_margin_r", + "value": "16vp" + }, + { + "name": "appitem_label_margin_t", + "value": "10" + }, + { + "name": "appitem_label_margin_b", + "value": "5" + }, + { + "name": "appitem_label_font", + "value": "20vp" + }, + { + "name": "appitem_version_font", + "value": "18vp" + }, + { + "name": "appitem_version_margin_b", + "value": "10" + }, + { + "name": "appitem_version_margin_r", + "value": "10" + }, + { + "name": "arrow_icon_width", + "value": "40" + }, + { + "name": "arrow_icon_height", + "value": "40" + }, + { + "name": "toggle_comp_width", + "value": "44vp" + }, + { + "name": "toggle_comp_height", + "value": "44vp" + }, + { + "name": "toggle_check_width", + "value": "25" + }, + { + "name": "divider_stroke_width", + "value": "1" + }, + { + "name": "divider_margin_l_info", + "value": "64vp" + }, + { + "name": "divider_margin_l", + "value": "12vp" + }, + { + "name": "divider_margin_r", + "value": "12vp" + }, + { + "name": "divider_height", + "value": "20" + }, + { + "name": "itemComp_height", + "value": "48vp" + }, + { + "name": "itemComp_noDisturb_height", + "value": "72vp" + }, + { + "name": "itemComp_titel_font", + "value": "16vp" + }, + { + "name": "itemComp_value_font", + "value": "14fp" + }, + { + "name": "itemComp_image_width", + "value": "12vp" + }, + { + "name": "itemComp_image_height", + "value": "24vp" + }, + { + "name": "itemComp_image_margin_left", + "value": "30" + }, + { + "name": "itemComp_padding_l", + "value": "12vp" + }, + { + "name": "itemComp_padding_r", + "value": "12vp" + }, + { + "name": "itemComp_margin_b", + "value": "8vp" + }, + { + "name": "slotComp_font", + "value": "20" + }, + { + "name": "page_header_icon_margin_l", + "value": "18vp" + }, + { + "name": "page_header_margin_l", + "value": "18vp" + }, + { + "name": "slotComp_image_width", + "value": "18vp" + }, + { + "name": "slotComp_image_height", + "value": "18vp" + }, + { + "name": "slotComp_margin_t", + "value": "20" + }, + { + "name": "switchComp_titel_font", + "value": "20" + }, + { + "name": "switchComp_height", + "value": "64vp" + }, + { + "name": "switchComp_padding_r", + "value": "12vp" + }, + { + "name": "slotComp_height", + "value": "56vp" + }, + { + "name": "distance_24", + "value": "15" + }, + { + "name": "page_notice_title_margin_t", + "value": "8vp" + }, + { + "name": "page_notice_part_margin_t", + "value": "8vp" + }, + { + "name": "page_notice_row_margin_t", + "value": "18vp" + }, + { + "name": "page_notice_app_item_row_height", + "value": "72vp" + }, + { + "name": "appitem_notice_info_icon_width_l", + "value": "64vp" + }, + { + "name": "appitem_notice_info_icon_height_l", + "value": "64vp" + }, + { + "name": "appitem_notice_info_icon_width", + "value": "48vp" + }, + { + "name": "appitem_notice_info_icon_height", + "value": "48vp" + }, + { + "name": "appitem_notice_infopop_icon_width", + "value": "22vp" + }, + { + "name": "appitem_notice_infopop_icon_height", + "value": "22vp" + }, + { + "name": "appitem_notice_infopop_icon_margin_r", + "value": "24vp" + }, + { + "name": "appitem_notice_info_icon_margin_r", + "value": "12vp" + }, + { + "name": "page_notice_info_label_margin", + "value": "12vp" + }, + { + "name": "notice_title_height", + "value": "48vp" + }, + { + "name": "notice_row_height", + "value": "56vp" + }, + { + "name": "noDisturb_margin_lf", + "value": "4vp" + }, + { + "name": "noDisturb_margin_16", + "value": "16vp" + }, + { + "name": "noDisturb_offset_x", + "value": "-18" + } + ] +} \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets index 80d2b369..4d24c308 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets @@ -28,7 +28,7 @@ const TAG = 'NotificationManagement-BatchSetEnable'; export default struct BatchSetEnable { @State mViewModel: ViewModel = new ViewModel(); @StorageLink('appManagementList') appList: any[]= []; - @State headName:Resource = $r('app.string.notificationManagement') + @State headName:Resource = $r('app.string.batch_Management') build() { Column() { @@ -58,7 +58,7 @@ export default struct BatchSetEnable { } .divider({ strokeWidth: 1, - color: $r('app.color.background_color'), + color: $r('app.color.divider_color'), startMargin: $r('app.float.divider_margin_l_info'), endMargin: $r('app.float.divider_margin_r') }) diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets index de148a55..ee399db0 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets @@ -28,7 +28,7 @@ const TAG = 'NotificationManagement-NoDisturbPre'; @Component export default struct notificationManagenment { @State columnMargin: string = '24vp'; - @State headName: Resource = $r('app.string.notificationManagement') + @State headName: Resource = $r('app.string.noDisturb') @State refreshRequest: number= 0 build() { @@ -45,8 +45,12 @@ export default struct notificationManagenment { Row() { Text($r('app.string.timing_on')) .fontSize($r('app.float.page_phrases_font')) - .margin({top:$r('app.float.page_phrases_padding_t')}) + .fontColor($r('sys.color.ohos_id_color_text_secondary')) + .fontWeight(FontWeight.Medium) + .fontFamily('HarmonyHeiTi-Medium') + .margin({ top: $r('app.float.page_phrases_padding_t') }) } + .align(Alignment.Start) .width(ConfigData.WH_100_100) .height($r('app.float.page_phrases_height')) .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) @@ -58,7 +62,8 @@ export default struct notificationManagenment { .onClick(() => { Log.showInfo(TAG, `NoDisturbComponent on click`) Router.push({ uri: 'pages/noDisturb' }); - }).width(ConfigData.WH_100_100) + }) + .width(ConfigData.WH_100_100) .backgroundColor(Color.White) .border({ width: $r('app.float.border_width'), color: Color.White, radius: $r('app.float.border_radius') }) diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index bd0cfeb3..af6fae5b 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -75,11 +75,15 @@ export default struct notificationManagenment { .fontSize($r('sys.float.ohos_id_text_size_body1')) .fontColor($r('app.color.itemComp_title_color')) .align(Alignment.End) + .margin({ right: $r("sys.float.ohos_id_dialog_margin_end") }) + .fontWeight(FontWeight.Medium) } else { Text($r('app.string.noDisturb_closed')) .fontSize($r('sys.float.ohos_id_text_size_body1')) .fontColor($r('app.color.itemComp_title_color')) .align(Alignment.End) + .margin({ right: $r("sys.float.ohos_id_dialog_margin_end") }) + .fontWeight(FontWeight.Medium) } Image($r('app.media.ic_settings_arrow')) .align(Alignment.End) @@ -103,11 +107,18 @@ export default struct notificationManagenment { .onClick(() => { Log.showInfo(TAG, `NoDisturbComponent on click`) Router.push({ uri: 'pages/noDisturbPre' }); - }).width(ConfigData.WH_100_100) + }) + .width(ConfigData.WH_100_100) .flexShrink(0) + Column() { Divider().color($r('app.color.divider_color')).strokeWidth(1) - }.padding({ left: $r('sys.float.ohos_id_default_padding_start'),right:$r('sys.float.ohos_id_default_padding_end') }) + } + .padding({ + left: $r('sys.float.ohos_id_default_padding_start'), + right: $r('sys.float.ohos_id_default_padding_end') + }) + Row() { Row() { SwitchComponent({ @@ -123,19 +134,19 @@ export default struct notificationManagenment { .backgroundColor(Color.White) .border({ width: $r('app.float.border_width'), color: Color.White, radius: $r('app.float.border_radius') }) - .margin({top:$r('app.float.page_notice_title_margin_t')}); + .margin({ top: $r('app.float.page_notice_title_margin_t') }); Row() { Text($r('app.string.notificationManagement')) .fontColor($r('sys.color.ohos_id_color_text_secondary')) .fontSize($r('sys.float.ohos_id_text_size_body2')) - .fontWeight(FontWeight.Bold) + .fontWeight(FontWeight.Medium) .fontFamily('HarmonyHeiTi-Medium') - .margin({top:$r('app.float.page_phrases_padding_t')}) + .margin({ top: $r('app.float.page_phrases_padding_t') }) }.align(Alignment.Start) .width(ConfigData.WH_100_100) .height($r('app.float.page_phrases_height')) - .padding({ left: $r('sys.float.ohos_id_default_padding_start')}) + .padding({ left: $r('sys.float.ohos_id_default_padding_start') }) Row() { ItemComponent({ title: $title, value: '', arrow: $arrow }) @@ -148,8 +159,8 @@ export default struct notificationManagenment { Column() { AppLstComponent() }.width(ConfigData.WH_100_100) - .height(this.mViewModel.isPhone?$r('app.float.applist_hieght_phone'):$r('app.float.applist_hieght')) - .margin({top:$r('app.float.applist_margin_t')}); + .height(this.mViewModel.isPhone ? $r('app.float.applist_hieght_phone') : $r('app.float.applist_hieght')) + .margin({ top: $r('app.float.applist_margin_t') }); } .width(ConfigData.WH_100_100) -- Gitee From e6cdf2fa0b2d57c7620058b0e5b7b90ad753d261 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Sun, 22 May 2022 10:33:28 +0800 Subject: [PATCH 089/373] Log rectification Signed-off-by: xuchangzhou --- .../src/main/ets/default/pages/airplaneComponent.ets | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets index 21423825..9b9883f9 100644 --- a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets +++ b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets @@ -42,25 +42,25 @@ struct airplaneComponent { this.flyModelStatus =!this.flyModelStatus if (this.flyModelStatus == true) { this.mWifiOriginalStatus = wifi.isWifiActive(); - console.log(`airplane status is opening, WLAN Original Status :${this.mWifiOriginalStatus}`) + Log.showInfo(TAG, `airplane status is opening, WLAN Original Status :${this.mWifiOriginalStatus}`) wifi.disableWifi(); }else{ if(this.mWifiOriginalStatus == true) { wifi.enableWifi() - console.log(`airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},get system interface, set WLAN status enableWifi`) + Log.showInfo(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},get system interface, set WLAN status enableWifi`) } else { wifi.disableWifi(); - console.log(`airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},,get system interface, set WLAN status disableWifi`) + Log.showInfo(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},,get system interface, set WLAN status disableWifi`) } } } aboutToAppear(){ - Log.showInfo(TAG,'aboutToAppear') + Log.showInfo(TAG, 'aboutToAppear') } aboutToDisappear (){ - Log.showInfo(TAG,'aboutToDisappear ') + Log.showInfo(TAG, 'aboutToDisappear ') } build() { -- Gitee From 205c421861f7518f9322b0d388e804c7374e24c8 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Sun, 22 May 2022 11:50:02 +0800 Subject: [PATCH 090/373] Log rectification Signed-off-by: xuchangzhou --- .../ets/default/pages/airplaneComponent.ets | 27 +-- .../ets/com/ohos/model/AutoRotateService.ts | 24 +-- ...lCenterSimpleToggleAutoRotateComponent.ets | 36 ++-- .../ets/com/ohos/viewmodel/AutoRotateVM.ts | 8 +- .../src/main/ets/default/batteryModel.ts | 8 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../src/main/ets/default/common/constants.ts | 2 +- .../main/ets/default/pages/batteryIcon.ets | 26 +-- .../src/main/ets/default/pages/batteryPic.ets | 24 +-- .../src/main/ets/default/pages/batterySoc.ets | 20 +- .../main/ets/default/viewmodel/BatteryVM.ts | 2 +- .../ets/com/ohos/common/StyleConfiguration.ts | 4 +- .../ets/com/ohos/model/BluetoothService.ts | 16 +- ...lCenterComplexToggleBluetoothComponent.ets | 36 ++-- .../StatusBarIconItemBluetoothComponent.ets | 26 +-- .../ets/com/ohos/viewmodel/BluetoothVM.ts | 4 +- .../src/main/ets/default/brightnessManager.ts | 6 +- .../ets/default/pages/brightnessComponent.ets | 10 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../main/ets/default/model/CapsuleModel.ts | 2 +- .../main/ets/default/pages/CapsuleIcon.ets | 32 +-- .../ets/default/viewmodel/CapsuleViewModel.ts | 20 +- .../src/main/ets/default/pages/clockIcon.ets | 27 ++- .../src/main/ets/default/viewmodel/ClockVM.ts | 2 +- .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../com/ohos/model/ControlCenterService.ts | 45 ++-- .../com/ohos/pages/ComplexToggleComponent.ets | 36 ++-- .../ohos/pages/ComplexToggleLoadComponent.ets | 20 +- .../com/ohos/pages/ControlCenterComponent.ets | 148 +++++++------ .../com/ohos/pages/SimpleToggleComponent.ets | 45 ++-- .../pages/SimpleToggleLayoutEditComponent.ets | 202 +++++++++--------- .../SimpleToggleLayoutEditDialogComponent.ets | 26 ++- .../ohos/pages/SimpleToggleLayoutEditGrid.ets | 150 ++++++------- .../ohos/pages/SimpleToggleLoadComponent.ets | 17 +- .../src/main/ets/com/ohos/pages/UpTitle.ets | 68 +++--- .../ets/com/ohos/viewmodel/ControlCenterVM.ts | 25 ++- .../ets/com/ohos/common/StyleConfiguration.ts | 4 +- .../ets/com/ohos/model/LocationService.ts | 18 +- ...rolCenterSimpleToggleLocationComponent.ets | 46 ++-- .../StatusBarIconItemLocationComponent.ets | 28 +-- .../main/ets/com/ohos/viewmodel/LocationVM.ts | 14 +- 41 files changed, 627 insertions(+), 633 deletions(-) diff --git a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets index 9b9883f9..003caae6 100644 --- a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets +++ b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets @@ -15,8 +15,9 @@ import wifi from '@ohos.wifi'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import iconTitleBase from '../../../../../../../common/src/main/ets/template/iconTitleBase' -const TAG = 'Control-airPlaneComponent' +import iconTitleBase from '../../../../../../../common/src/main/ets/template/iconTitleBase'; + +const TAG = 'Control-airPlaneComponent'; @Component export default @@ -25,10 +26,10 @@ struct airplaneComponent { private IconInfo: any[] = [ $r('app.media.airplane_d'), $r('app.media.airplane'), - ] - @State flyModelTitle: any = $r("app.string.airplane_mode") - @StorageLink('flyModelStatus') flyModelStatus: boolean = false - private mWifiOriginalStatus: boolean = false + ]; + @State flyModelTitle: any = $r("app.string.airplane_mode"); + @StorageLink('flyModelStatus') flyModelStatus: boolean = false; + private mWifiOriginalStatus: boolean = false; /* when flyModelStatus == true, so airplane is opening, @@ -39,28 +40,28 @@ struct airplaneComponent { * if variable mWifiOriginalStatus == true, set WLAN status enableWifi(),conversely disableWifi(). */ mClickEvent() { - this.flyModelStatus =!this.flyModelStatus + this.flyModelStatus =!this.flyModelStatus; if (this.flyModelStatus == true) { this.mWifiOriginalStatus = wifi.isWifiActive(); - Log.showInfo(TAG, `airplane status is opening, WLAN Original Status :${this.mWifiOriginalStatus}`) + Log.showInfo(TAG, `airplane status is opening, WLAN Original Status :${this.mWifiOriginalStatus}`); wifi.disableWifi(); }else{ if(this.mWifiOriginalStatus == true) { - wifi.enableWifi() - Log.showInfo(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},get system interface, set WLAN status enableWifi`) + wifi.enableWifi(); + Log.showInfo(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},get system interface, set WLAN status enableWifi`); } else { wifi.disableWifi(); - Log.showInfo(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},,get system interface, set WLAN status disableWifi`) + Log.showInfo(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},,get system interface, set WLAN status disableWifi`); } } } aboutToAppear(){ - Log.showInfo(TAG, 'aboutToAppear') + Log.showDebug(TAG, 'aboutToAppear'); } aboutToDisappear (){ - Log.showInfo(TAG, 'aboutToDisappear ') + Log.showDebug(TAG, 'aboutToDisappear '); } build() { diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts index 747600a6..f741db81 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -29,7 +29,7 @@ export class AutoRotateService { registerListener(listener: { 'updateAutoRotateSwitchStatus': Function, }) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`) + Log.showInfo(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; } @@ -37,13 +37,13 @@ export class AutoRotateService { if (this.mIsStart) { return; } - Log.showInfo(TAG, `startService`) + Log.showInfo(TAG, `startService`); this.mIsStart = true; this.asyncStartService(); } async asyncStartService(): Promise { - Log.showInfo(TAG, `asyncStartService`) + Log.showInfo(TAG, `asyncStartService`); this.getOrientation(); screen.on('change', this.onOrientationChange.bind(this)); } @@ -52,39 +52,39 @@ export class AutoRotateService { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `stopService`) + Log.showInfo(TAG, `stopService`); this.mIsStart = false; this.asyncStopService(); } async asyncStopService(): Promise { - Log.showInfo(TAG, `asyncStopService`) + Log.showInfo(TAG, `asyncStopService`); screen.off('change', (value: number) => { - Log.showInfo(TAG, `asyncStopService, off change value: ${value}`) + Log.showInfo(TAG, `asyncStopService, off change value: ${value}`); }); } onOrientationChange(value: number): void{ - Log.showInfo(TAG, `onOrientationChange, value: ${value}`) + Log.showInfo(TAG, `onOrientationChange, value: ${value}`); this.getOrientation(); } async getOrientation(): Promise { - Log.showInfo(TAG, `getOrientation`) + Log.showInfo(TAG, `getOrientation`); let mScreen = await this.getScreen(); this.updateAutoRotateSwitchStatus(mScreen.orientation); } async changeSwitch(status: boolean): Promise { - Log.showInfo(TAG, `changeSwitch, status: ${status}`) + Log.showInfo(TAG, `changeSwitch, status: ${status}`); let newOrientation = status ? 5 : 0; let mScreen = await this.getScreen(); let ret = await mScreen.setOrientation(newOrientation); - Log.showInfo(TAG, `changeSwitch, ret: ${ret}`) + Log.showInfo(TAG, `changeSwitch, ret: ${ret}`); } updateAutoRotateSwitchStatus(orientation: number): void{ - Log.showInfo(TAG, `updateAutoRotateSwitchStatus, orientation: ${orientation}`) + Log.showInfo(TAG, `updateAutoRotateSwitchStatus, orientation: ${orientation}`); if (orientation == 0) { this.mListener?.updateAutoRotateSwitchStatus(false); } else if (orientation == 5) { @@ -93,7 +93,7 @@ export class AutoRotateService { } async getScreen(): Promise { - Log.showInfo(TAG, `getScreen`) + Log.showInfo(TAG, `getScreen`); let screens = await screen.getAllScreen(); return screens[0]; } diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets b/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets index 3d89439a..544b1a71 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets +++ b/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets @@ -13,34 +13,34 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; import {AutoRotateData} from '../common/Constants'; -import ViewModel from '../viewmodel/AutoRotateVM' -import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase' +import ViewModel from '../viewmodel/AutoRotateVM'; +import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase'; -const TAG = 'autorotate-ControlCenterSimpleToggleAutoRotateComponent' +const TAG = 'autorotate-ControlCenterSimpleToggleAutoRotateComponent'; @Component export default struct ControlCenterSimpleToggleAutoRotateComponent { - private keyId: string - private mEditMode: boolean = false - private mDragMode: boolean = false - @State mIcon: Resource = $r("app.media.ic_controlcenter_auto_rotate_off") - @State mLabel: Resource = $r("app.string.control_center_complex_toggle_auto_rotate_title") - @State @Watch('onAutoRotateDataChange') mAutoRotateData: AutoRotateData = ViewModel.getAutoRotateData() + private keyId: string; + private mEditMode: boolean = false; + private mDragMode: boolean = false; + @State mIcon: Resource = $r("app.media.ic_controlcenter_auto_rotate_off"); + @State mLabel: Resource = $r("app.string.control_center_complex_toggle_auto_rotate_title"); + @State @Watch('onAutoRotateDataChange') mAutoRotateData: AutoRotateData = ViewModel.getAutoRotateData(); aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear') - this.onAutoRotateDataChange('mAutoRotateData') + Log.showDebug(TAG, 'aboutToAppear'); + this.onAutoRotateDataChange('mAutoRotateData'); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear') + Log.showDebug(TAG, 'aboutToDisappear') } onAutoRotateDataChange(propName: string): void { - Log.showInfo(TAG, `onAutoRotateDataChange, propName: ${propName}`) - this.mIcon = this.mAutoRotateData.switchStatus ? $r("app.media.ic_controlcenter_auto_rotate_on") : $r("app.media.ic_controlcenter_auto_rotate_off") + Log.showInfo(TAG, `onAutoRotateDataChange, propName: ${propName}`); + this.mIcon = this.mAutoRotateData.switchStatus ? $r("app.media.ic_controlcenter_auto_rotate_on") : $r("app.media.ic_controlcenter_auto_rotate_off"); } build() { @@ -56,8 +56,8 @@ export default struct ControlCenterSimpleToggleAutoRotateComponent { } mClickEvent() { - Log.showInfo(TAG, `mClickEvent, status: ${this.mAutoRotateData.switchStatus}`) - let newStatus = !this.mAutoRotateData.switchStatus - ViewModel.processAutoRotateSwitchStatusChange(newStatus) + Log.showInfo(TAG, `mClickEvent, status: ${this.mAutoRotateData.switchStatus}`); + let newStatus = !this.mAutoRotateData.switchStatus; + ViewModel.processAutoRotateSwitchStatusChange(newStatus); } } \ No newline at end of file diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts index f695f0f5..61c251dc 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts @@ -26,24 +26,24 @@ export class AutoRotateVM { }; constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); this.mAutoRotateData = AppStorage.SetAndLink(TAG + '_AutoRotateData', this.mAutoRotateData).get(); AutoRotateService.registerListener(this); AutoRotateService.startService(); } getAutoRotateData(): AutoRotateData { - Log.showInfo(TAG, `getAutoRotateData`) + Log.showInfo(TAG, `getAutoRotateData`); return this.mAutoRotateData; } updateAutoRotateSwitchStatus(status: boolean): void{ - Log.showInfo(TAG, `updateAutoRotateSwitchStatus, status: ${status}`) + Log.showInfo(TAG, `updateAutoRotateSwitchStatus, status: ${status}`); this.mAutoRotateData.switchStatus = status; } processAutoRotateSwitchStatusChange(status: boolean): void{ - Log.showInfo(TAG, `processAutoRotateSwitchStatusChange, status: ${status}`) + Log.showInfo(TAG, `processAutoRotateSwitchStatusChange, status: ${status}`); AutoRotateService.changeSwitch(status); } } diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts index 90a4642e..032b968e 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -18,12 +18,8 @@ import commonEvent from "@ohos.commonEvent"; import createOrGet from "../../../../../../common/src/main/ets/default/SingleInstanceHelper"; import Constants from "./common/constants"; import Log from "../../../../../../common/src/main/ets/default/Log"; -import { CommonEventData } from "commonEvent/commonEventData"; -import { - CommonEventManager, - getCommonEventManager, - POLICY, -} from "../../../../../../common/src/main/ets/default/commonEvent/CommonEventManager"; +import {CommonEventData} from "commonEvent/commonEventData"; +import {CommonEventManager, getCommonEventManager, POLICY} from "../../../../../../common/src/main/ets/default/commonEvent/CommonEventManager"; const TAG = "BatteryComponent-batteryModel"; const DEFAULT_PROGRESS = 100; diff --git a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts index 23be8d20..1ea881d4 100644 --- a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -14,7 +14,7 @@ */ import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; -import Constants from './Constants' +import Constants from './Constants'; const TAG = 'battery-StyleConfiguration'; diff --git a/features/batterycomponent/src/main/ets/default/common/constants.ts b/features/batterycomponent/src/main/ets/default/common/constants.ts index ec4471ba..0cd35442 100644 --- a/features/batterycomponent/src/main/ets/default/common/constants.ts +++ b/features/batterycomponent/src/main/ets/default/common/constants.ts @@ -14,6 +14,6 @@ */ export default class Constants { - static BATTERY_LEVEL_LOW = 20 + static BATTERY_LEVEL_LOW = 20; static PERCENT_NUMBER = 100; } \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index fcfb030d..71fbca78 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -14,29 +14,29 @@ */ import mBatteryModel from '../batteryModel'; -import BatteryPic from './batteryPic' -import BatterySoc from './batterySoc' -import Constants from '../common/constants' -import Log from '../../../../../../../common/src/main/ets/default/Log' -import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' -import StyleConfiguration from '../common/StyleConfiguration' +import BatteryPic from './batteryPic'; +import BatterySoc from './batterySoc'; +import Constants from '../common/constants'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import StyleConfiguration from '../common/StyleConfiguration'; -const TAG = 'BatteryComponent-batteryIcon' +const TAG = 'BatteryComponent-batteryIcon'; @Component export default struct BatteryIcon { - @StorageLink('batterySoc') batterySoc: number = 100 - @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 - @State style: any = StyleConfiguration.getBatteryComponentStyle() - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @StorageLink('batterySoc') batterySoc: number = 100; + @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0; + @State style: any = StyleConfiguration.getBatteryComponentStyle(); + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); aboutToAppear() { mBatteryModel.initBatteryModel(); - Log.showInfo(TAG, 'aboutToAppear'); + Log.showDebug(TAG, 'aboutToAppear'); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear'); + Log.showDebug(TAG, 'aboutToDisappear'); } build() { diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets index 1a80c253..2dbf9da5 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -13,28 +13,28 @@ * limitations under the License. */ -import Constants from '../common/constants' -import Log from '../../../../../../../common/src/main/ets/default/Log' -import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager' -import StyleConfiguration from '../common/StyleConfiguration' -import ViewModel from '../viewmodel/BatteryVM' +import Constants from '../common/constants'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import StyleConfiguration from '../common/StyleConfiguration'; +import ViewModel from '../viewmodel/BatteryVM'; -const TAG = 'BatteryComponent-batteryPic' +const TAG = 'BatteryComponent-batteryPic'; @Component export default struct BatteryPic { - @StorageLink('batterySoc') batterySoc: number = 100 - @StorageLink('batteryCharging') batteryCharging : boolean = false - @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() - @State style: any = StyleConfiguration.getBatteryPicStyle() + @StorageLink('batterySoc') batterySoc: number = 100; + @StorageLink('batteryCharging') batteryCharging : boolean = false; + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); + @State style: any = StyleConfiguration.getBatteryPicStyle(); aboutToAppear(){ - Log.showInfo(TAG,'aboutToAppear Start'); + Log.showDebug(TAG,'aboutToAppear Start'); } aboutToDisappear(){ - Log.showInfo(TAG,'aboutToDisappear'); + Log.showDebug(TAG,'aboutToDisappear'); } build() { diff --git a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets index 17cdbfe5..3fd1e42f 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -13,25 +13,25 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' -import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager' -import ViewModel from '../viewmodel/BatteryVM' +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import ViewModel from '../viewmodel/BatteryVM'; -const TAG = 'BatteryComponent-batterySoc' +const TAG = 'BatteryComponent-batterySoc'; @Component export default struct BatterySoc { - @StorageLink('batterySoc') batterySoc: number = 100 - @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @StorageLink('batterySoc') batterySoc: number = 100; + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); aboutToAppear(){ - Log.showInfo(TAG,'aboutToAppear Start'); + Log.showDebug(TAG,'aboutToAppear Start'); } aboutToDisappear(){ - Log.showInfo(TAG,'aboutToDisappear'); + Log.showDebug(TAG,'aboutToDisappear'); } build() { diff --git a/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts b/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts index 2031e1d3..afafaada 100644 --- a/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts +++ b/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts @@ -24,7 +24,7 @@ export class BatteryVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.BATTERY); constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); } getTintContentInfo(): TintContentInfo { diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 054a0081..27bf18b9 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' -import Constants from './Constants' +import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import Constants from './Constants'; const TAG = 'bluetooth-StyleConfiguration'; diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts index 2611980e..56d1e0a1 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -20,7 +20,7 @@ import createOrGet from '../../../../../../../../common/src/main/ets/default/Sin const TAG = 'BluetoothModel'; function isBluetoothOpen(state) { - Log.showInfo(TAG, `BluetoothState is: ${state}`) + Log.showInfo(TAG, `BluetoothState is: ${state}`); return state == bluetooth.BluetoothState.STATE_ON || state == bluetooth.BluetoothState.STATE_BLE_ON || state == bluetooth.BluetoothState.STATE_TURNING_ON || state == bluetooth.BluetoothState.STATE_BLE_TURNING_ON; } @@ -31,7 +31,7 @@ export class BluetoothService { mIsBluetoothOpen: boolean = false; constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); } startService() { @@ -48,14 +48,14 @@ export class BluetoothService { this.mListener?.updateState(this.mIsBluetoothOpen); } }); - Log.showInfo(TAG, `startService, mIsBluetoothOpen: ${this.mIsBluetoothOpen}`) + Log.showInfo(TAG, `startService, mIsBluetoothOpen: ${this.mIsBluetoothOpen}`); } stopService() { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `stopService`) + Log.showInfo(TAG, `stopService`); this.mIsStart = false; bluetooth.off('stateChange'); } @@ -63,9 +63,9 @@ export class BluetoothService { registerListener(listener: { 'updateState': Function }) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`) + Log.showInfo(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; - this.mListener.updateState(this.mIsBluetoothOpen) + this.mListener.updateState(this.mIsBluetoothOpen); } getState(): boolean { @@ -80,9 +80,9 @@ export class BluetoothService { } disableBluetooth(): boolean{ - Log.showInfo(TAG, `disableBluetooth`) + Log.showInfo(TAG, `disableBluetooth`); let result = bluetooth.disableBluetooth(); - Log.showInfo(TAG, `disableBluetooth, result: ${result}`) + Log.showInfo(TAG, `disableBluetooth, result: ${result}`); return result; } } diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets index 0604e92a..8da994c6 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets @@ -13,30 +13,30 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager" -import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" -import ViewModel from '../viewmodel/BluetoothVM' -import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager"; +import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import ViewModel from '../viewmodel/BluetoothVM'; +import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase'; -const TAG = 'bluetooth-ControlCenterComplexToggleBluetoothComponent' +const TAG = 'bluetooth-ControlCenterComplexToggleBluetoothComponent'; @Component export default struct ControlCenterComplexToggleBluetoothComponent { private IconInfo: any[] = [ $r("app.media.ic_controlcenter_bt_d"), $r("app.media.ic_controlcenter_bt"), - ] - @State mTitle: Resource = $r("app.string.control_center_complex_toggle_bluetooth_title") - @StorageLink('BluetoothOpenStatus') BluetoothOpenStatus: boolean = false + ]; + @State mTitle: Resource = $r("app.string.control_center_complex_toggle_bluetooth_title"); + @StorageLink('BluetoothOpenStatus') BluetoothOpenStatus: boolean = false; aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear') - ViewModel.initViewModel() + Log.showDebug(TAG, 'aboutToAppear'); + ViewModel.initViewModel(); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear') + Log.showDebug(TAG, 'aboutToDisappear'); } build() { @@ -54,16 +54,16 @@ export default struct ControlCenterComplexToggleBluetoothComponent { } mClickEvent() { - Log.showInfo(TAG, `mClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`) + Log.showInfo(TAG, `mClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`); if (this.BluetoothOpenStatus) { - ViewModel.disableBluetooth() + ViewModel.disableBluetooth(); } else { - ViewModel.enableBluetooth() - } + ViewModel.enableBluetooth(); + }; } mLongClickEvent() { - Log.showInfo(TAG, `mLongClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`) - EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.BluetoothAbility')) + Log.showInfo(TAG, `mLongClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`); + EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.BluetoothAbility')); } } \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets index 2181d2bc..1e74c486 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets @@ -13,29 +13,29 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; -import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' -import StyleConfiguration from '../common/StyleConfiguration' -import Constants from '../common/Constants' -import ViewModel from '../viewmodel/BluetoothVM' +import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import StyleConfiguration from '../common/StyleConfiguration'; +import Constants from '../common/Constants'; +import ViewModel from '../viewmodel/BluetoothVM'; -const TAG = 'bluetooth-StatusBarIconItemBluetoothComponent' +const TAG = 'bluetooth-StatusBarIconItemBluetoothComponent'; @Component export default struct StatusBarIconItemBluetoothComponent { - @StorageLink('BluetoothOpenStatus') BluetoothOpenStatus: boolean = false - @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() - @State style: any = StyleConfiguration.getStatusBarBluetoothComponentStyle() + @StorageLink('BluetoothOpenStatus') BluetoothOpenStatus: boolean = false; + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); + @State style: any = StyleConfiguration.getStatusBarBluetoothComponentStyle(); aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear') - ViewModel.initViewModel() + Log.showDebug(TAG, 'aboutToAppear'); + ViewModel.initViewModel(); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear') + Log.showDebug(TAG, 'aboutToDisappear'); } build() { diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts index 0e0d1169..b29b3463 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts @@ -30,7 +30,7 @@ export class BluetoothVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.BLUETOOTH); constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); } initViewModel() { @@ -45,7 +45,7 @@ export class BluetoothVM { } updateState(state: boolean) { - Log.showInfo(TAG, `updateState, state: ${state} this.mBluetoothOpenStatus ${this.mBluetoothOpenStatus}`) + Log.showInfo(TAG, `updateState, state: ${state} this.mBluetoothOpenStatus ${this.mBluetoothOpenStatus}`); this.mBluetoothOpenStatus.set(state); } diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index ef9bae2b..4e807fbb 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -26,8 +26,8 @@ const TAG = 'Control-brightnessManager'; var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 100); export class brightnessManager { - helper: any - uri: string + helper: any; + uri: string; SLIDER_CHANG_MODE_MOVING = 1; init(): void{ @@ -40,7 +40,7 @@ export class brightnessManager { registerBrightness() { this.helper.on("dataChange", this.uri, (err) => { - let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '100') + let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '100'); Log.showInfo(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); }) diff --git a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets index e7d11126..276c0522 100644 --- a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets +++ b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets @@ -15,15 +15,15 @@ import brightness from '@ohos.brightness'; import mBrightnessManager from '../brightnessManager'; -import StyleConfiguration from '../common/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -const TAG = 'Control-brightnessComponent' +const TAG = 'Control-brightnessComponent'; @Component export default struct MyBrightness { @StorageLink('BrightnessValue') brightnessValue: number = 0; - @State style: any = StyleConfiguration.getBrightnessComponentStyle() + @State style: any = StyleConfiguration.getBrightnessComponentStyle(); @State brightnessItem: any = { min: 4, max: 100, @@ -31,13 +31,13 @@ export default struct MyBrightness { }; aboutToAppear() { - Log.showInfo(TAG, `Brightness aboutToAppear ${JSON.stringify(this.brightnessItem)}`); + Log.showDebug(TAG, `Brightness aboutToAppear ${JSON.stringify(this.brightnessItem)}`); mBrightnessManager.init(); mBrightnessManager.registerBrightness(); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear') + Log.showDebug(TAG, 'aboutToDisappear'); mBrightnessManager.unRegisterBrightness(); } diff --git a/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts index 495d7ff5..cb040e4b 100644 --- a/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -14,7 +14,7 @@ */ import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; -import Constants from './Constants' +import Constants from './Constants'; const TAG = 'capsule-StyleConfiguration'; diff --git a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts index 1005a997..07111997 100644 --- a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts +++ b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts @@ -14,7 +14,7 @@ */ import commonEvent from '@ohos.commonEvent'; -import Log from '../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'CapsuleModel'; diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index 6ba5c39b..15b5f55c 100644 --- a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -13,31 +13,31 @@ * limitations under the License. */ -import Constants from '../common/constants' -import CapsuleViewModel, {VIEW_MODEL_ID, CallState} from '../viewmodel/CapsuleViewModel' -import Log from '../../../../../../../common/src/main/ets/default/Log' -import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' -import StyleConfiguration from '../common/StyleConfiguration' +import Constants from '../common/constants'; +import CapsuleViewModel, {VIEW_MODEL_ID, CallState} from '../viewmodel/CapsuleViewModel'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import StyleConfiguration from '../common/StyleConfiguration'; const TAG = "CapsuleIcon"; @Component export default struct CapsuleIcon { @StorageLink(VIEW_MODEL_ID) mCapsuleViewModel: CapsuleViewModel = CapsuleViewModel.getInstance(); - startX: number = 0 - startY: number = 0 - moveX: number = 0 - moveY: number = 0 - @State style: any = StyleConfiguration.getCapsuleComponentStyle() - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + startX: number = 0; + startY: number = 0; + moveX: number = 0; + moveY: number = 0; + @State style: any = StyleConfiguration.getCapsuleComponentStyle(); + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); aboutToAppear() { this.mCapsuleViewModel.initViewModel(); - Log.showInfo(TAG, 'aboutToAppear, text: ' + this.mCapsuleViewModel.mText); + Log.showDebug(TAG, 'aboutToAppear, text: ' + this.mCapsuleViewModel.mText); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear'); + Log.showDebug(TAG, 'aboutToDisappear'); } build() { @@ -70,7 +70,7 @@ export default struct CapsuleIcon { } touchEvent(event: TouchEvent) { - Log.showInfo(TAG, `touchEventtouchEventtouchEvent`) + Log.showInfo(TAG, `touchEventtouchEventtouchEvent`); if (event.type == Constants.TOUCH_TYPE_DOWN) { this.startX = event.touches[0].screenX; this.startY = event.touches[0].screenY; @@ -86,7 +86,7 @@ export default struct CapsuleIcon { event.stopPropagation(); this.mCapsuleViewModel.onClickEvent(); this.mCapsuleViewModel.mIsBackground = false; - } - } + }; + }; } } \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts index a4f83633..d59fda32 100644 --- a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts +++ b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts @@ -13,10 +13,10 @@ * limitations under the License. */ -import CapsuleModel from '../model/CapsuleModel' -import Log from '../../../../../../../common/src/main/ets/default/Log' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil' +import CapsuleModel from '../model/CapsuleModel'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil'; let sCapsuleViewModel; @@ -59,7 +59,7 @@ export default class CapsuleViewModel { async initViewModel() { this.mCallback = { "onStateChange": this.onStateChange.bind(this) - } + }; CapsuleModel.registerCallback(this.mCallback); } @@ -75,7 +75,7 @@ export default class CapsuleViewModel { clearTimeout(this.mTimeMeter); if (this.mCallState != CallState.CALL_ACTIVE) { this.mStartTime = new Date().valueOf(); - } + }; this.mCallState = data.callState; let startTime; @@ -86,10 +86,10 @@ export default class CapsuleViewModel { startTime = new Date().valueOf(); } else { startTime = this.mStartTime; - } + }; } else { startTime = data.startTime; - } + }; this.startUpdateTime(startTime); } else if (data.callState == CallState.CALL_DISCONNECTED){ @@ -101,7 +101,7 @@ export default class CapsuleViewModel { } else { this.mStartTime = 0; this.mText =await ResourceUtil.getString($r("app.string.communicate_by_phone")); - } + }; this.mCallState = data.callState; } @@ -135,7 +135,7 @@ export default class CapsuleViewModel { if (sCapsuleViewModel == null) { sCapsuleViewModel = new CapsuleViewModel(); AppStorage.SetAndLink(VIEW_MODEL_ID, sCapsuleViewModel); - } + }; return sCapsuleViewModel; } } \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index 4dd70f27..85cadcaa 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -13,29 +13,26 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager' -import StyleConfiguration from '../common/StyleConfiguration' -import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' -import ViewModel from '../viewmodel/ClockVM' -import TimeManager, { - TimeEventArgs, - TIME_CHANGE_EVENT, -} from '../../../../../../../common/src/main/ets/default/TimeManager' -import EventManager, {unsubscribe} from '../../../../../../../common/src/main/ets/default/event/EventManager' +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import StyleConfiguration from '../common/StyleConfiguration'; +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import ViewModel from '../viewmodel/ClockVM'; +import TimeManager, {TimeEventArgs, TIME_CHANGE_EVENT} from '../../../../../../../common/src/main/ets/default/TimeManager'; +import EventManager, {unsubscribe} from '../../../../../../../common/src/main/ets/default/event/EventManager'; const TAG = 'ClockComponent-clockIcon'; @Component export default struct ClockIcon { - @State mTime: string = '16:01' - @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() - @State style: any = StyleConfiguration.getClockComponentStyle() - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @State mTime: string = '16:01'; + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); + @State style: any = StyleConfiguration.getClockComponentStyle(); + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); unSubscriber?: unsubscribe; aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear'); + Log.showDebug(TAG, 'aboutToAppear'); this.unSubscriber = EventManager.subscribe(TIME_CHANGE_EVENT, (args: TimeEventArgs) => { this.mTime = TimeManager.formatTime(args.date); }); diff --git a/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts b/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts index 6c698d8e..63ccd124 100644 --- a/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts +++ b/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts @@ -24,7 +24,7 @@ export class ClockVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.CLOCK); constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); } getTintContentInfo(): TintContentInfo { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index d8a7dc3d..dd48fafe 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -14,7 +14,7 @@ */ import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; -import Constants from './Constants' +import Constants from './Constants'; const TAG = 'ControlCenter-StyleConfiguration'; diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index 37e1d810..55456a20 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -27,8 +27,7 @@ export type ControlCenterListener = { setComplexToggleLayout: (layout: string[]) => void; setSimpleToggleLayout: (layout: string[]) => void; setItemData: (id: string, itemData: ControlComponentData) => void; -} -; +}; const TAG = "ControlCenterModel"; const SETTINGS_CONTROL_SIMPLE_TOGGLE_LAYOUT = "settings.control.simpleToggleLayout"; @@ -101,24 +100,24 @@ export class ControlCenterService { }); this.loadSimpleToggleLayoutTemplate(); Log.showInfo(TAG, - `parseConfig, ComplexToggleLayoutTemplate: ${JSON.stringify(this.mComplexToggleLayoutTemplate)}`) + `parseConfig, ComplexToggleLayoutTemplate: ${JSON.stringify(this.mComplexToggleLayoutTemplate)}`); Log.showInfo(TAG, - `parseConfig, SimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`) + `parseConfig, SimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); config.LocalToggles.ComplexToggles.forEach((name) => { this.mAllComplexToggles.push(name); }); - Log.showInfo(TAG, `parseConfig, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`) + Log.showInfo(TAG, `parseConfig, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); this.calcComplexToggleLayout(); config.LocalToggles.SimpleToggles.forEach((name) => { this.mAllSimpleToggles.push(name); }); - Log.showInfo(TAG, `parseConfig, allSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`) + Log.showInfo(TAG, `parseConfig, allSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); this.calcSimpleToggleLayout(); } loadSimpleToggleLayoutTemplate(): void{ - Log.showInfo(TAG, `loadSimpleToggleLayoutTemplate`) + Log.showInfo(TAG, `loadSimpleToggleLayoutTemplate`); this.mSimpleToggleLayoutTemplate = []; let simpleToggleLayout = this.getSimpleToggleLayoutFromSettings(); if (simpleToggleLayout) { @@ -129,11 +128,11 @@ export class ControlCenterService { }); this.setSimpleToggleLayoutToSettings(this.mSimpleToggleLayoutTemplate); } - Log.showInfo(TAG, `loadSimpleToggleLayoutTemplate, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`) + Log.showInfo(TAG, `loadSimpleToggleLayoutTemplate, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); } calcComplexToggleLayout(): void { - Log.showInfo(TAG, `calcComplexToggleLayout`) + Log.showInfo(TAG, `calcComplexToggleLayout`); let complexToggleLayout: string[] = []; this.mComplexToggleLayoutTemplate.forEach((name) => { @@ -142,13 +141,13 @@ export class ControlCenterService { } }); - Log.showInfo(TAG, `calcComplexToggleLayout, complexToggleLayout: ${JSON.stringify(complexToggleLayout)}`) + Log.showInfo(TAG, `calcComplexToggleLayout, complexToggleLayout: ${JSON.stringify(complexToggleLayout)}`); this.mComplexToggleLayout = complexToggleLayout; this.mListener?.setComplexToggleLayout(complexToggleLayout); } calcSimpleToggleLayout(): void { - Log.showInfo(TAG, `calcSimpleToggleLayout`) + Log.showInfo(TAG, `calcSimpleToggleLayout`); let simpleToggleLayout: string[] = []; this.mSimpleToggleLayoutTemplate.forEach((name) => { @@ -157,7 +156,7 @@ export class ControlCenterService { } }); - Log.showInfo(TAG, `calcSimpleToggleLayout, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`) + Log.showInfo(TAG, `calcSimpleToggleLayout, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); this.mSimpleToggleLayout = simpleToggleLayout; this.mListener?.setSimpleToggleLayout(simpleToggleLayout); } @@ -186,16 +185,18 @@ export class ControlCenterService { let controlData: ControlComponentData = parseData(itemData); let id: string = controlData.id; this.mListener?.setItemData(id, controlData); + Log.showInfo(TAG, `controlData.toggleType == Constants.TOGGLE_TYPE_COMPLEX: ${controlData.toggleType == Constants.TOGGLE_TYPE_COMPLEX}`); + Log.showInfo(TAG, `this.mAllComplexToggles.indexOf(id) < 0: ${this.mAllComplexToggles.indexOf(id) < 0}`); if (controlData.toggleType == Constants.TOGGLE_TYPE_COMPLEX) { if (this.mAllComplexToggles.indexOf(id) < 0) { this.mAllComplexToggles.push(id); - Log.showInfo(TAG, `onItemAdd, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`) + Log.showInfo(TAG, `onItemAdd, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); this.calcComplexToggleLayout(); } } else { if (this.mAllSimpleToggles.indexOf(id) < 0) { this.mAllSimpleToggles.push(id); - Log.showInfo(TAG, `onItemAdd, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`) + Log.showInfo(TAG, `onItemAdd, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); this.calcSimpleToggleLayout(); } } @@ -206,11 +207,11 @@ export class ControlCenterService { let id: string = itemData.id; if (this.mAllComplexToggles.indexOf(id) >= 0) { this.mAllComplexToggles.splice(this.mAllComplexToggles.indexOf(id), 1); - Log.showInfo(TAG, `onItemRemove, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`) + Log.showInfo(TAG, `onItemRemove, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); this.calcComplexToggleLayout(); } else if (this.mAllSimpleToggles.indexOf(id) >= 0) { this.mAllSimpleToggles.splice(this.mAllSimpleToggles.indexOf(id), 1); - Log.showInfo(TAG, `onItemRemove, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`) + Log.showInfo(TAG, `onItemRemove, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); this.calcSimpleToggleLayout(); } this.mListener?.setItemData(id, undefined); @@ -234,37 +235,37 @@ export class ControlCenterService { } getHidingSimpleToggles(): string[] { - Log.showInfo(TAG, `getHidingSimpleToggles`) + Log.showInfo(TAG, `getHidingSimpleToggles`); let hidingSimpleToggles: string[] = []; this.mAllSimpleToggles.forEach((toggleName) => { if (this.mSimpleToggleLayout.indexOf(toggleName) < 0) { hidingSimpleToggles.push(toggleName); } }); - Log.showInfo(TAG, `getHidingSimpleToggles, hidingSimpleToggles: ${JSON.stringify(hidingSimpleToggles)}`) + Log.showInfo(TAG, `getHidingSimpleToggles, hidingSimpleToggles: ${JSON.stringify(hidingSimpleToggles)}`); return hidingSimpleToggles; } getDefaultSimpleToggleLayout(): string[] { - Log.showInfo(TAG, `getDefaultSimpleToggleLayout`) + Log.showInfo(TAG, `getDefaultSimpleToggleLayout`); let defaultToggles: string[] = []; this.mConfig.DefaultSimpleToggleLayout.forEach((toggleName) => { if (this.mAllSimpleToggles.indexOf(toggleName) >= 0) { defaultToggles.push(toggleName); } }); - Log.showInfo(TAG, `getDefaultSimpleToggleLayout, defaultToggles: ${JSON.stringify(defaultToggles)}`) + Log.showInfo(TAG, `getDefaultSimpleToggleLayout, defaultToggles: ${JSON.stringify(defaultToggles)}`); return defaultToggles; } saveSimpleToggleLayout(layout: string[]): void{ - Log.showInfo(TAG, `saveSimpleToggleLayout, layout: ${JSON.stringify(layout)}`) + Log.showInfo(TAG, `saveSimpleToggleLayout, layout: ${JSON.stringify(layout)}`); this.setSimpleToggleLayoutToSettings(layout); this.mSimpleToggleLayoutTemplate = []; layout.forEach((name) => { this.mSimpleToggleLayoutTemplate.push(name); }); - Log.showInfo(TAG, `saveSimpleToggleLayout, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`) + Log.showInfo(TAG, `saveSimpleToggleLayout, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); this.calcSimpleToggleLayout(); } } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets index 7cc9e065..db6b826d 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets @@ -13,35 +13,33 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager' -import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase' -import Constants from '../common/Constants' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager'; +import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase'; +import Constants from '../common/Constants'; -const TAG = 'ComplexToggleComponent' +const TAG = 'ComplexToggleComponent'; @Component export default struct ComplexToggleComponent { - @Prop keyId: string - @State mItemData: any = {} - @State mStatus: boolean = false - @State mDefaultTitle: string = '' + @Prop keyId: string; + @State mItemData: any = {}; + @State mStatus: boolean = false; + @State mDefaultTitle: string = ''; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) - this.linkItemData() + Log.showDebug(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); + this.linkItemData(); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`); } linkItemData() { - Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`) - this.mItemData = AppStorage.Link('ControlCenter_' + this.keyId) - Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ - this.mItemData.get() - .iconUrl}`) + Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`); + this.mItemData = AppStorage.Link('ControlCenter_' + this.keyId); + Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${this.mItemData.get().iconUrl}`); } build() { @@ -65,14 +63,14 @@ export default struct ComplexToggleComponent { } onIconItemClick() { - Log.showInfo(TAG, `onIconItemClick`) + Log.showInfo(TAG, `onIconItemClick`); if (this.mItemData.get()?.actionData?.clickAction) { EventManager.publish(this.mItemData.get().actionData.clickAction); } } onIconItemLongPressGesture() { - Log.showInfo(TAG, `onIconItemLongPressGesture`) + Log.showInfo(TAG, `onIconItemLongPressGesture`); if (this.mItemData.get()?.actionData?.longClickAction) { EventManager.publish(this.mItemData.get().actionData.longClickAction); } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets index 83db5105..1e921396 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets @@ -13,25 +13,25 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants' -import AirPlaneComponent from "../../../../../../../airplanecomponent/src/main/ets/default/pages/airplaneComponent" -import WifiComponent from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiComponent' -import BluetoothComponent from '../../../../../../../bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent' -import ComplexToggleComponent from './ComplexToggleComponent' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; +import AirPlaneComponent from "../../../../../../../airplanecomponent/src/main/ets/default/pages/airplaneComponent"; +import WifiComponent from '../../../../../../../wificomponent/src/main/ets/default/pages/wifiComponent'; +import BluetoothComponent from '../../../../../../../bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent'; +import ComplexToggleComponent from './ComplexToggleComponent'; -const TAG = 'ComplexToggleLoadComponent' +const TAG = 'ComplexToggleLoadComponent'; @Component export default struct ComplexToggleLoadComponent { - @Prop keyId: string + @Prop keyId: string; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) + LLog.showDebug(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`); } build() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index 3fda4f8e..02a94ccd 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -13,61 +13,60 @@ * limitations under the License. */ -import UpTitle from './UpTitle' -import MyBrightness from '../../../../../../../brightnesscomponent/src/main/ets/default/pages/brightnessComponent' -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../common/Constants' -import StyleConfiguration from '../common/StyleConfiguration' -import ViewModel from '../viewmodel/ControlCenterVM' -import ComplexToggleLoadComponent from './ComplexToggleLoadComponent' -import SimpleToggleLoadComponent from './SimpleToggleLoadComponent' -import SimpleToggleLayoutEditComponent from './SimpleToggleLayoutEditComponent' - -const TAG = 'Control-ControlCenter' -const TAG_ControlCenterComplexToggleLayout = 'Control-ControlCenterComplexToggleLayout' -const TAG_ControlCenterSimpleToggleLayout = 'Control-ControlCenterSimpleToggleLayout' +import UpTitle from './UpTitle'; +import MyBrightness from '../../../../../../../brightnesscomponent/src/main/ets/default/pages/brightnessComponent'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import Constants from '../common/Constants'; +import StyleConfiguration from '../common/StyleConfiguration'; +import ViewModel from '../viewmodel/ControlCenterVM'; +import ComplexToggleLoadComponent from './ComplexToggleLoadComponent'; +import SimpleToggleLoadComponent from './SimpleToggleLoadComponent'; +import SimpleToggleLayoutEditComponent from './SimpleToggleLayoutEditComponent'; + +const TAG = 'Control-ControlCenter'; +const TAG_ControlCenterComplexToggleLayout = 'Control-ControlCenterComplexToggleLayout'; +const TAG_ControlCenterSimpleToggleLayout = 'Control-ControlCenterSimpleToggleLayout'; var mUniform; @Component export default struct ControlCenterComponent { - private touchMoveCallback: Function - private modeChangeCallback: Function - @State mSimpleToggleColumnCount: number = Constants.DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT - private mControlCenterComponentConfig: any = {} - @State mIsEditSimpleToggleLayout: boolean = false - @State style: any = StyleConfiguration.getControlCenterComponentStyle() - private mWidthPx: number = 0 - private mDisplayingSimpleToggles: string[] = [] - private mHidingSimpleToggles: string[] = [] - private mDefaultDisplaySimpleToggles: string[] = [] - private titleDisplayInside: boolean = false + private touchMoveCallback: Function; + private modeChangeCallback: Function; + @State mSimpleToggleColumnCount: number = Constants.DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT; + private mControlCenterComponentConfig: any = {}; + @State mIsEditSimpleToggleLayout: boolean = false; + @State style: any = StyleConfiguration.getControlCenterComponentStyle(); + private mWidthPx: number = 0; + private mDisplayingSimpleToggles: string[] = []; + private mHidingSimpleToggles: string[] = []; + private mDefaultDisplaySimpleToggles: string[] = []; + private titleDisplayInside: boolean = false; aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear') - Log.showInfo(TAG, `aboutToAppear, mControlCenterComponentConfig: ${JSON.stringify(this.mControlCenterComponentConfig)}`) - ViewModel.initViewModel(this.mControlCenterComponentConfig) + Log.showDebug(TAG, `aboutToAppear, mControlCenterComponentConfig: ${JSON.stringify(this.mControlCenterComponentConfig)}`); + ViewModel.initViewModel(this.mControlCenterComponentConfig); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear ') + Log.Log.showDebug(TAG, 'aboutToDisappear'); } onSimpleToggleLayoutEditStart() { - Log.showInfo(TAG, 'onSimpleToggleLayoutEditStart') - this.mDisplayingSimpleToggles = ViewModel.getDisplayingSimpleToggles() - this.mHidingSimpleToggles = ViewModel.getHidingSimpleToggles() - this.mDefaultDisplaySimpleToggles = ViewModel.getDefaultSimpleToggleLayout() - this.setIsEditSimpleToggleLayout(true) + Log.showInfo(TAG, 'onSimpleToggleLayoutEditStart'); + this.mDisplayingSimpleToggles = ViewModel.getDisplayingSimpleToggles(); + this.mHidingSimpleToggles = ViewModel.getHidingSimpleToggles(); + this.mDefaultDisplaySimpleToggles = ViewModel.getDefaultSimpleToggleLayout(); + this.setIsEditSimpleToggleLayout(true); } onSimpleToggleLayoutEditEnd() { - Log.showInfo(TAG, 'onSimpleToggleLayoutEditEnd') - this.setIsEditSimpleToggleLayout(false) + Log.showInfo(TAG, 'onSimpleToggleLayoutEditEnd'); + this.setIsEditSimpleToggleLayout(false); } setIsEditSimpleToggleLayout(isEdit: boolean): void { - Log.showInfo(TAG, `setIsEditSimpleToggleLayout, isEdit: ${isEdit}`) + Log.showInfo(TAG, `setIsEditSimpleToggleLayout, isEdit: ${isEdit}`); animateTo({ duration: 300, tempo: 1.0, @@ -79,17 +78,18 @@ export default struct ControlCenterComponent { Log.showInfo(TAG, `setIsEditSimpleToggleLayout, show anim finish.`) } }, () => { - Log.showInfo(TAG, `setIsEditSimpleToggleLayout, animateTo`) - this.mIsEditSimpleToggleLayout = isEdit - }) + Log.showInfo(TAG, `setIsEditSimpleToggleLayout, animateTo`); + this.mIsEditSimpleToggleLayout = isEdit; + }); + Log.showInfo(TAG, `this.modeChangeCallback: ${this.modeChangeCallback}`); if (this.modeChangeCallback) { - this.modeChangeCallback(isEdit) + this.modeChangeCallback(isEdit); } } onSaveDisplayingToggles(toggles: string[]): void { - Log.showInfo(TAG, `onSaveDisplayingToggles, toggles: ${JSON.stringify(toggles)}`) - ViewModel.saveSimpleToggleLayout(toggles) + Log.showInfo(TAG, `onSaveDisplayingToggles, toggles: ${JSON.stringify(toggles)}`); + ViewModel.saveSimpleToggleLayout(toggles); } build() { @@ -170,16 +170,15 @@ export default struct ControlCenterComponent { @Component struct ControlCenterComplexToggleLayout { - @StorageLink('ControlCenterComplexToggleLayout') mComplexToggleLayout: string[] = [] - @State style: any = StyleConfiguration.getControlCenterComplexToggleLayoutStyle() + @StorageLink('ControlCenterComplexToggleLayout') mComplexToggleLayout: string[] = []; + @State style: any = StyleConfiguration.getControlCenterComplexToggleLayoutStyle(); aboutToAppear() { - Log.showInfo(TAG_ControlCenterComplexToggleLayout, `aboutToAppear Start`) - Log.showInfo(TAG_ControlCenterComplexToggleLayout, `aboutToAppear, mComplexToggleLayout: ${this.mComplexToggleLayout} `) + Log.showDebug(TAG_ControlCenterComplexToggleLayout, `aboutToAppear, mComplexToggleLayout: ${this.mComplexToggleLayout} `) } aboutToDisappear() { - Log.showInfo(TAG_ControlCenterComplexToggleLayout, `aboutToDisAppear`) + Log.showDebug(TAG_ControlCenterComplexToggleLayout, `aboutToDisAppear`); } build() { @@ -204,38 +203,37 @@ struct ControlCenterComplexToggleLayout { } calcGridHeight(rowCount, rowHeight, rowGap) { - Log.showInfo(TAG_ControlCenterComplexToggleLayout, `calcGridHeight, rowCount: ${rowCount} rowHeight: ${rowHeight} rowGap: ${rowGap}`) - let height = rowCount * rowHeight + (rowCount - 1) * rowGap + Log.showInfo(TAG_ControlCenterComplexToggleLayout, `calcGridHeight, rowCount: ${rowCount} rowHeight: ${rowHeight} rowGap: ${rowGap}`); + let height = rowCount * rowHeight + (rowCount - 1) * rowGap; if (height < 0) { height = 0 - } - Log.showInfo(TAG_ControlCenterComplexToggleLayout, `calcGridHeight, height: ${height}`) - return height + 'px' + }; + Log.showInfo(TAG_ControlCenterComplexToggleLayout, `calcGridHeight, height: ${height}`); + return height + 'px'; } generateRowsTemplate(rowCount) { - Log.showInfo(TAG_ControlCenterComplexToggleLayout, `generateRowsTemplate, rowCount: ${rowCount}`) - let rowsTemplate = '1fr' + Log.showInfo(TAG_ControlCenterComplexToggleLayout, `generateRowsTemplate, rowCount: ${rowCount}`); + let rowsTemplate = '1fr'; for (let i = 1;i < rowCount; i++) { rowsTemplate += ' 1fr' - } - return rowsTemplate + }; + return rowsTemplate; } } @Component struct ControlCenterSimpleToggleLayout { - @Prop mColumnCount: number - @StorageLink('ControlCenterSimpleToggleLayout') mSimpleToggleLayout: string[] = [] - @State style: any = StyleConfiguration.getControlCenterSimpleToggleLayoutStyle() + @Prop mColumnCount: number; + @StorageLink('ControlCenterSimpleToggleLayout') mSimpleToggleLayout: string[] = []; + @State style: any = StyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); aboutToAppear() { - Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `aboutToAppear Start`) - Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `aboutToAppear, mSimpleToggleLayout: ${this.mSimpleToggleLayout} `) + Log.showDebug(TAG_ControlCenterSimpleToggleLayout, `aboutToAppear, mSimpleToggleLayout: ${this.mSimpleToggleLayout} `); } aboutToDisappear() { - Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `aboutToDisAppear`) + Log.showDebug(TAG_ControlCenterSimpleToggleLayout, `aboutToDisAppear`); } build() { @@ -266,30 +264,30 @@ struct ControlCenterSimpleToggleLayout { } calcGridHeight(rowCount, rowHeight, rowGap) { - Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `calcGridHeight, rowCount: ${rowCount} rowHeight: ${rowHeight} rowGap: ${rowGap}`) - let height = rowCount * rowHeight + (rowCount - 1) * rowGap + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `calcGridHeight, rowCount: ${rowCount} rowHeight: ${rowHeight} rowGap: ${rowGap}`); + let height = rowCount * rowHeight + (rowCount - 1) * rowGap; if (height < 0) { - height = 0 + height = 0; } - Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `calcGridHeight, height: ${height}`) - return height + 'px' + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `calcGridHeight, height: ${height}`); + return height + 'px'; } generateColumnsTemplate(columnCount) { - Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `generateColumnsTemplate, columnCount: ${columnCount}`) - let columnsTemplate = '1fr' + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `generateColumnsTemplate, columnCount: ${columnCount}`); + let columnsTemplate = '1fr'; for (let i = 1;i < columnCount; i++) { - columnsTemplate += ' 1fr' + columnsTemplate += ' 1fr'; } - return columnsTemplate + return columnsTemplate; } generateRowsTemplate(rowCount) { - Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `generateRowsTemplate, rowCount: ${rowCount}`) - let rowsTemplate = '1fr' + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `generateRowsTemplate, rowCount: ${rowCount}`); + let rowsTemplate = '1fr'; for (let i = 1;i < rowCount; i++) { - rowsTemplate += ' 1fr' + rowsTemplate += ' 1fr'; } - return rowsTemplate + return rowsTemplate; } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index ea0667ef..45a18df0 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -13,38 +13,35 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager' -import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager'; +import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase'; -const TAG = 'SimpleToggleComponent' +const TAG = 'SimpleToggleComponent'; @Component export default struct SimpleToggleComponent { - private keyId: string - @State mItemData: any = {} - private mEditMode: boolean = false - private mDragMode: boolean = false - @State mDefaultIcon: Resource = $r("app.media.icon") - @State mDefaultChangeSwitch: boolean = false - @State mDefaultLabel: string = '' + private keyId: string; + @State mItemData: any = {}; + private mEditMode: boolean = false; + private mDragMode: boolean = false; + @State mDefaultIcon: Resource = $r("app.media.icon"); + @State mDefaultChangeSwitch: boolean = false; + @State mDefaultLabel: string = ''; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) - Log.showInfo(TAG, `aboutToAppear Start, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode}`) - this.linkItemData() + Log.showDebug(TAG, `aboutToAppear Start, keyId: ${this.keyId}, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode}`); + this.linkItemData(); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`); } linkItemData() { - Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`) - this.mItemData = AppStorage.Link('ControlCenter_' + this.keyId) - Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ - this.mItemData.get() - .iconUrl}`) + Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`); + this.mItemData = AppStorage.Link('ControlCenter_' + this.keyId); + Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${this.mItemData.get().iconUrl}`); } build() { @@ -68,16 +65,16 @@ export default struct SimpleToggleComponent { } onIconItemClick() { - Log.showInfo(TAG, `onIconItemClick`) + Log.showInfo(TAG, `onIconItemClick`); if (this.mItemData.get()?.actionData?.clickAction) { EventManager.publish(this.mItemData.get().actionData.clickAction); - } + }; } onIconItemLongPressGesture() { - Log.showInfo(TAG, `onIconItemLongPressGesture`) + Log.showInfo(TAG, `onIconItemLongPressGesture`); if (this.mItemData.get()?.actionData?.longClickAction) { EventManager.publish(this.mItemData.get().actionData.longClickAction); - } + }; } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets index 05d4a813..f6ddecb3 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets @@ -13,34 +13,34 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../common/Constants' -import StyleConfiguration from '../common/StyleConfiguration' -import SimpleToggleLayoutEditGrid from './SimpleToggleLayoutEditGrid' -import SimpleToggleLayoutEditDialogComponent from './SimpleToggleLayoutEditDialogComponent' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import Constants from '../common/Constants'; +import StyleConfiguration from '../common/StyleConfiguration'; +import SimpleToggleLayoutEditGrid from './SimpleToggleLayoutEditGrid'; +import SimpleToggleLayoutEditDialogComponent from './SimpleToggleLayoutEditDialogComponent'; -const TAG = 'Control-SimpleToggleLayoutEditComponent' -const TAG_SimpleToggleLayoutEditUpTitle = 'Control-SimpleToggleLayoutEditUpTitle' -const TAG_SimpleToggleLayoutEditOptMsg = 'Control-SimpleToggleLayoutEditOptMsg' +const TAG = 'Control-SimpleToggleLayoutEditComponent'; +const TAG_SimpleToggleLayoutEditUpTitle = 'Control-SimpleToggleLayoutEditUpTitle'; +const TAG_SimpleToggleLayoutEditOptMsg = 'Control-SimpleToggleLayoutEditOptMsg'; @Component export default struct SimpleToggleLayoutEditComponent { - private mDisplayingToggles: string[] = [] - private mHidingToggles: string[] = [] - private mDefaultDisplayToggles: string[] = [] - @Prop mColumnCount: number - private simpleToggleLayoutEditEndCallback: () => void - private onSaveDisplayingToggles: (toggles: string[]) => void - @State mNewDisplayingToggles: string[] = [] - @State mNewHidingToggles: string[] = [] - @State style: any = StyleConfiguration.getSimpleToggleLayoutEditComponentStyle() - @State mOptMsg: Resource = $r('app.string.control_center_simple_toggle_layout_edit_opt_desc') - private mDisplayingTogglesMaxCount: number = Constants.SIMPLE_TOGGLE_LAYOUT_MAX_TOGGLE_COUNT - private mDisplayingTogglesMinCount: number = Constants.SIMPLE_TOGGLE_LAYOUT_MIN_TOGGLE_COUNT - private mHidingTogglesMaxCount: number = 0 - private mHidingTogglesMinCount: number = 0 - @State mCurrentDragToggleName: string = '' - private titleDisplayInside: boolean = false + private mDisplayingToggles: string[] = []; + private mHidingToggles: string[] = []; + private mDefaultDisplayToggles: string[] = []; + @Prop mColumnCount: number; + private simpleToggleLayoutEditEndCallback: () => void; + private onSaveDisplayingToggles: (toggles: string[]) => void; + @State mNewDisplayingToggles: string[] = []; + @State mNewHidingToggles: string[] = []; + @State style: any = StyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); + @State mOptMsg: Resource = $r('app.string.control_center_simple_toggle_layout_edit_opt_desc'); + private mDisplayingTogglesMaxCount: number = Constants.SIMPLE_TOGGLE_LAYOUT_MAX_TOGGLE_COUNT; + private mDisplayingTogglesMinCount: number = Constants.SIMPLE_TOGGLE_LAYOUT_MIN_TOGGLE_COUNT; + private mHidingTogglesMaxCount: number = 0; + private mHidingTogglesMinCount: number = 0; + @State mCurrentDragToggleName: string = ''; + private titleDisplayInside: boolean = false; private backDialogController: CustomDialogController = new CustomDialogController({ builder: SimpleToggleLayoutEditDialogComponent({ title: $r("app.string.control_center_simple_toggle_layout_edit_back_confirm"), @@ -68,22 +68,22 @@ export default struct SimpleToggleLayoutEditComponent { }); aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear') - this.mNewDisplayingToggles = [...this.mDisplayingToggles] - this.mNewHidingToggles = [...this.mHidingToggles] - let allTogglesCount = this.mNewDisplayingToggles.length + this.mNewHidingToggles.length - this.mHidingTogglesMaxCount = allTogglesCount - this.mDisplayingTogglesMinCount + Log.showDebug(TAG, 'aboutToAppear'); + this.mNewDisplayingToggles = [...this.mDisplayingToggles]; + this.mNewHidingToggles = [...this.mHidingToggles]; + let allTogglesCount = this.mNewDisplayingToggles.length + this.mNewHidingToggles.length; + this.mHidingTogglesMaxCount = allTogglesCount - this.mDisplayingTogglesMinCount; if (this.mHidingTogglesMaxCount < 0) { - this.mHidingTogglesMaxCount = 0 - } - this.mHidingTogglesMinCount = allTogglesCount - this.mDisplayingTogglesMaxCount + this.mHidingTogglesMaxCount = 0; + }; + this.mHidingTogglesMinCount = allTogglesCount - this.mDisplayingTogglesMaxCount; if (this.mHidingTogglesMinCount < 0) { - this.mHidingTogglesMinCount = 0 - } + this.mHidingTogglesMinCount = 0; + }; } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear ') + Log.showDebug(TAG, 'aboutToDisappear '); } build() { @@ -242,123 +242,123 @@ export default struct SimpleToggleLayoutEditComponent { } onSimpleToggleLayoutEditEnd() { - Log.showInfo(TAG, `onSimpleToggleLayoutEditEnd`) - let changed = JSON.stringify(this.mDisplayingToggles) != JSON.stringify(this.mNewDisplayingToggles) - Log.showInfo(TAG, `onSimpleToggleLayoutEditEnd, changed: ${changed}`) + Log.showInfo(TAG, `onSimpleToggleLayoutEditEnd`); + let changed = JSON.stringify(this.mDisplayingToggles) != JSON.stringify(this.mNewDisplayingToggles); + Log.showInfo(TAG, `onSimpleToggleLayoutEditEnd, changed: ${changed}`); if (changed) { - this.backDialogController.open() + this.backDialogController.open(); } else { - this.callSimpleToggleLayoutEditEnd() - } + this.callSimpleToggleLayoutEditEnd(); + }; } callSimpleToggleLayoutEditEnd() { - Log.showInfo(TAG, `callSimpleToggleLayoutEditEnd`) + Log.showInfo(TAG, `callSimpleToggleLayoutEditEnd`); if (this.simpleToggleLayoutEditEndCallback) { - this.simpleToggleLayoutEditEndCallback() - } + this.simpleToggleLayoutEditEndCallback(); + }; } onResetBtnClick(event: ClickEvent) { - Log.showInfo(TAG, `onResetBtnClick`) - let equalDefault = JSON.stringify(this.mDefaultDisplayToggles) == JSON.stringify(this.mNewDisplayingToggles) - Log.showInfo(TAG, `onResetBtnClick, equalDefault: ${equalDefault}`) + Log.showInfo(TAG, `onResetBtnClick`); + let equalDefault = JSON.stringify(this.mDefaultDisplayToggles) == JSON.stringify(this.mNewDisplayingToggles); + Log.showInfo(TAG, `onResetBtnClick, equalDefault: ${equalDefault}`); if (!equalDefault) { - this.resetDialogController.open() - } + this.resetDialogController.open(); + }; } editResetConfirm() { - Log.showInfo(TAG, `editResetConfirm`) - this.resetData() - this.callSaveDisplayingToggles() + Log.showInfo(TAG, `editResetConfirm`); + this.resetData(); + this.callSaveDisplayingToggles(); } resetData(): void{ - Log.showInfo(TAG, `resetData`) - let tempDisplayingToggles: string[] = [...this.mDefaultDisplayToggles] - let tempHidingToggles: string[] = [] + Log.showInfo(TAG, `resetData`); + let tempDisplayingToggles: string[] = [...this.mDefaultDisplayToggles]; + let tempHidingToggles: string[] = []; this.mDisplayingToggles.forEach((toggleName) => { if (tempDisplayingToggles.indexOf(toggleName) < 0) { - tempHidingToggles.push(toggleName) - } + tempHidingToggles.push(toggleName); + }; }) this.mHidingToggles.forEach((toggleName) => { if (tempDisplayingToggles.indexOf(toggleName) < 0) { - tempHidingToggles.push(toggleName) - } + tempHidingToggles.push(toggleName); + }; }) - this.mNewDisplayingToggles = tempDisplayingToggles - this.mNewHidingToggles = tempHidingToggles - this.mDisplayingToggles = [...tempDisplayingToggles] - this.mHidingToggles = [...tempHidingToggles] - Log.showInfo(TAG, `resetData, mNewDisplayingToggles: ${JSON.stringify(this.mNewDisplayingToggles)}`) - Log.showInfo(TAG, `resetData, mNewHidingToggles: ${JSON.stringify(this.mNewHidingToggles)}`) + this.mNewDisplayingToggles = tempDisplayingToggles; + this.mNewHidingToggles = tempHidingToggles; + this.mDisplayingToggles = [...tempDisplayingToggles]; + this.mHidingToggles = [...tempHidingToggles]; + Log.showInfo(TAG, `resetData, mNewDisplayingToggles: ${JSON.stringify(this.mNewDisplayingToggles)}`); + Log.showInfo(TAG, `resetData, mNewHidingToggles: ${JSON.stringify(this.mNewHidingToggles)}`); } onFinishBtnClick(event: ClickEvent) { - Log.showInfo(TAG, `onFinishBtnClick`) - let changed = JSON.stringify(this.mDisplayingToggles) != JSON.stringify(this.mNewDisplayingToggles) - Log.showInfo(TAG, `onFinishBtnClick, changed: ${changed}`) + Log.showInfo(TAG, `onFinishBtnClick`); + let changed = JSON.stringify(this.mDisplayingToggles) != JSON.stringify(this.mNewDisplayingToggles); + Log.showInfo(TAG, `onFinishBtnClick, changed: ${changed}`); if (changed) { - this.callSaveDisplayingToggles() + this.callSaveDisplayingToggles(); } - this.callSimpleToggleLayoutEditEnd() + this.callSimpleToggleLayoutEditEnd(); } callSaveDisplayingToggles(): void{ - Log.showInfo(TAG, `callSaveDisplayingToggles`) + Log.showInfo(TAG, `callSaveDisplayingToggles`); if (this.onSaveDisplayingToggles) { - this.onSaveDisplayingToggles(this.mNewDisplayingToggles) - } + this.onSaveDisplayingToggles(this.mNewDisplayingToggles); + }; } async onDisplayingGridItemDragStart(toggleName: string): Promise { - Log.showInfo(TAG, `onDisplayingGridItemDragStart, toggleName: ${toggleName}`) - this.mCurrentDragToggleName = toggleName - this.setOptMsg(toggleName) + Log.showInfo(TAG, `onDisplayingGridItemDragStart, toggleName: ${toggleName}`); + this.mCurrentDragToggleName = toggleName; + this.setOptMsg(toggleName); } async onDisplayingGridItemDrop(status: string): Promise { - Log.showInfo(TAG, `onDisplayingGridItemDrop, status: ${status}`) - this.setOptMsg(null) + Log.showInfo(TAG, `onDisplayingGridItemDrop, status: ${status}`); + this.setOptMsg(null); } async onHidingGridItemDragStart(toggleName: string): Promise { - Log.showInfo(TAG, `onHidingGridItemDragStart, toggleName: ${toggleName}`) - this.mCurrentDragToggleName = toggleName - this.setOptMsg(toggleName) + Log.showInfo(TAG, `onHidingGridItemDragStart, toggleName: ${toggleName}`); + this.mCurrentDragToggleName = toggleName; + this.setOptMsg(toggleName); } async onHidingGridItemDrop(status: string): Promise { - Log.showInfo(TAG, `onHidingGridItemDrop, status: ${status}`) - this.setOptMsg(null) + Log.showInfo(TAG, `onHidingGridItemDrop, status: ${status}`); + this.setOptMsg(null); } setOptMsg(toggleName: string): void { - Log.showInfo(TAG, `setOptMsg, toggleName: ${toggleName}`) + Log.showInfo(TAG, `setOptMsg, toggleName: ${toggleName}, toggleName.length: ${toggleName.length}`); if (!toggleName || toggleName.length == 0) { - this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_desc') - return + this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_desc'); + return; } if (this.mNewDisplayingToggles.indexOf(toggleName) >= 0) { if (this.mNewDisplayingToggles.length <= this.mDisplayingTogglesMinCount) { - this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_min', this.mDisplayingTogglesMinCount.toString()) + this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_min', this.mDisplayingTogglesMinCount.toString()); } else { - this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_drag') + this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_drag'); } } else if (this.mNewHidingToggles.indexOf(toggleName) >= 0) { if (this.mNewDisplayingToggles.length >= this.mDisplayingTogglesMaxCount) { - this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_max', this.mDisplayingTogglesMaxCount.toString()) + this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_max', this.mDisplayingTogglesMaxCount.toString()); } else { - this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_drag') + this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_drag'); } - } + }; } onComponentTouch(event: TouchEvent) { - Log.showInfo(TAG, `onComponentTouch`) - event.stopPropagation() + Log.showInfo(TAG, `onComponentTouch`); + event.stopPropagation(); } } @@ -368,11 +368,11 @@ struct SimpleToggleLayoutEditUpTitle { @State style: any = StyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle() aboutToAppear() { - Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToAppear') + Log.showDebug(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToAppear'); } aboutToDisappear() { - Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToDisappear ') + Log.showDebug(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToDisappear '); } build() { @@ -398,22 +398,22 @@ struct SimpleToggleLayoutEditUpTitle { } backClick(event: ClickEvent) { - Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, `backClick, event: ${JSON.stringify(event)}`) - this.simpleToggleLayoutEditEndCallback() + Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, `backClick, event: ${JSON.stringify(event)}`); + this.simpleToggleLayoutEditEndCallback(); } } @Component struct SimpleToggleLayoutEditOptMsg { - @Link mOptMsg: Resource - @State style: any = StyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle() + @Link mOptMsg: Resource; + @State style: any = StyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); aboutToAppear() { - Log.showInfo(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToAppear') + Log.showDebug(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToAppear'); } aboutToDisappear() { - Log.showInfo(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToDisappear ') + Log.showDebug(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToDisappear '); } build() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets index b9f262f4..ab47b269 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets @@ -13,20 +13,28 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import StyleConfiguration from '../common/StyleConfiguration' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import StyleConfiguration from '../common/StyleConfiguration'; const TAG = 'Control-SimpleToggleLayoutEditDialogComponent'; @CustomDialog export default struct SimpleToggleLayoutEditDialogComponent { - private title: Resource - private leftButton: Resource - private rightButton: Resource - private controller: CustomDialogController - private leftAction: () => void - private rightAction: () => void - @State style: any = StyleConfiguration.getControlEditDialogStyle() + private title: Resource; + private leftButton: Resource; + private rightButton: Resource; + private controller: CustomDialogController; + private leftAction: () => void; + private rightAction: () => void; + @State style: any = StyleConfiguration.getControlEditDialogStyle(); + + aboutToAppear() { + Log.showDebug(TAG, 'aboutToAppear'); + } + + aboutToDisappear() { + Log.showDebug(TAG, 'aboutToDisappear'); + } build() { Column() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets index d8f214b9..4043997f 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets @@ -13,25 +13,25 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import SimpleToggleLoadComponent from './SimpleToggleLoadComponent' -import StyleConfiguration from '../common/StyleConfiguration' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import SimpleToggleLoadComponent from './SimpleToggleLoadComponent'; +import StyleConfiguration from '../common/StyleConfiguration'; -const TAG = 'Control-SimpleToggleLayoutEditGrid' +const TAG = 'Control-SimpleToggleLayoutEditGrid'; @Component export default struct SimpleToggleLayoutEditGrid { - @Link mToggles: string[] - private mMaxCount: number = 0 - private mMinCount: number = 0 - @Prop mColumnCount: number - @Prop mGlobalDragToggleName: string - private gridTag: string = '' - private logTag: string = '' - private onItemDragStart: (toggleName: string) => void - private onItemDrop: (status: string) => void - @State style: any = StyleConfiguration.getSimpleToggleLayoutEditGridStyle() - private mCurrentDragToggleName: string = '' + @Link mToggles: string[]; + private mMaxCount: number = 0; + private mMinCount: number = 0; + @Prop mColumnCount: number; + @Prop mGlobalDragToggleName: string; + private gridTag: string = ''; + private logTag: string = ''; + private onItemDragStart: (toggleName: string) => void; + private onItemDrop: (status: string) => void; + @State style: any = StyleConfiguration.getSimpleToggleLayoutEditGridStyle(); + private mCurrentDragToggleName: string = ''; @Builder DragComponent() { Column() { @@ -47,11 +47,11 @@ export default struct SimpleToggleLayoutEditGrid { aboutToAppear() { this.logTag = TAG + '-' + this.gridTag - Log.showInfo(this.logTag, this.gridTag + 'aboutToAppear') + Log.showDebug(this.logTag, this.gridTag + 'aboutToAppear'); } aboutToDisappear() { - Log.showInfo(this.logTag, 'aboutToDisappear ') + Log.showInfo(this.logTag, 'aboutToDisappear '); } build() { @@ -94,105 +94,105 @@ export default struct SimpleToggleLayoutEditGrid { } calcColumnsTemplate(columnCount: number): string{ - Log.showInfo(this.logTag, `calcColumnsTemplate, columnCount: ${columnCount}`) - let columnsTemplate = '1fr' + Log.showInfo(this.logTag, `calcColumnsTemplate, columnCount: ${columnCount}`); + let columnsTemplate = '1fr'; for (let i = 1;i < columnCount; i++) { - columnsTemplate += ' 1fr' + columnsTemplate += ' 1fr'; } - Log.showInfo(this.logTag, `calcColumnsTemplate, columnsTemplate: ${columnsTemplate}`) - return columnsTemplate + Log.showInfo(this.logTag, `calcColumnsTemplate, columnsTemplate: ${columnsTemplate}`); + return columnsTemplate; } calcMaxRowCount(maxCount: number, columnCount: number): number{ - Log.showInfo(this.logTag, `calcMaxRowCount, maxCount: ${maxCount} columnCount: ${columnCount}`) - let maxRowCount = Math.ceil(maxCount / columnCount) + Log.showInfo(this.logTag, `calcMaxRowCount, maxCount: ${maxCount} columnCount: ${columnCount}`); + let maxRowCount = Math.ceil(maxCount / columnCount); if (maxRowCount < 1) { - maxRowCount = 1 - } - Log.showInfo(this.logTag, `calcMaxRowCount, maxRowCount: ${maxRowCount}`) - return maxRowCount + maxRowCount = 1; + }; + Log.showInfo(this.logTag, `calcMaxRowCount, maxRowCount: ${maxRowCount}`); + return maxRowCount; } calcMinRowCount(minCount: number, columnCount: number): number{ - Log.showInfo(this.logTag, `calcMinRowCount, minCount: ${minCount} columnCount: ${columnCount}`) - let minRowCount = Math.ceil(minCount / columnCount) + Log.showInfo(this.logTag, `calcMinRowCount, minCount: ${minCount} columnCount: ${columnCount}`); + let minRowCount = Math.ceil(minCount / columnCount); if (minRowCount < 1) { - minRowCount = 1 + minRowCount = 1; } - Log.showInfo(this.logTag, `calcMinRowCount, minRowCount: ${minRowCount}`) - return minRowCount + Log.showInfo(this.logTag, `calcMinRowCount, minRowCount: ${minRowCount}`); + return minRowCount; } onItemDragEnter(event) { - Log.showInfo(this.logTag, `onItemDragEnter, event: ${JSON.stringify(event)}`) + Log.showInfo(this.logTag, `onItemDragEnter, event: ${JSON.stringify(event)}`); } onItemDragMove(event, itemIndex, insertIndex) { - Log.showInfo(this.logTag, `onItemDragMove, itemIndex: ${itemIndex} insertIndex: ${insertIndex} event: ${JSON.stringify(event)}`) + Log.showInfo(this.logTag, `onItemDragMove, itemIndex: ${itemIndex} insertIndex: ${insertIndex} event: ${JSON.stringify(event)}`); } onItemDragLeave(event, itemIndex) { - Log.showInfo(this.logTag, `onItemDragLeave, itemIndex: ${itemIndex} event: ${JSON.stringify(event)}`) + Log.showInfo(this.logTag, `onItemDragLeave, itemIndex: ${itemIndex} event: ${JSON.stringify(event)}`); } onGridItemDragStart(event, itemIndex) { - Log.showInfo(this.logTag, `onGridItemDragStart, itemIndex: ${itemIndex} event: ${JSON.stringify(event)}`) - this.mCurrentDragToggleName = this.mToggles[itemIndex] + Log.showInfo(this.logTag, `onGridItemDragStart, itemIndex: ${itemIndex} event: ${JSON.stringify(event)}`); + this.mCurrentDragToggleName = this.mToggles[itemIndex]; if (this.onItemDragStart) { - this.onItemDragStart(this.mCurrentDragToggleName) - } - Log.showInfo(this.logTag, `onGridItemDragStart, mCurrentDragToggleName: ${this.mCurrentDragToggleName}`) + this.onItemDragStart(this.mCurrentDragToggleName); + }; + Log.showInfo(this.logTag, `onGridItemDragStart, mCurrentDragToggleName: ${this.mCurrentDragToggleName}`); } onGridItemDrop(event, itemIndex, insertIndex, isSuccess) { - Log.showInfo(this.logTag, `onGridItemDrop, itemIndex: ${itemIndex} insertIndex: ${insertIndex} isSuccess: ${isSuccess} event: ${JSON.stringify(event)}`) + Log.showInfo(this.logTag, `onGridItemDrop, itemIndex: ${itemIndex} insertIndex: ${insertIndex} isSuccess: ${isSuccess} event: ${JSON.stringify(event)}`); if (!isSuccess) { - this.callOnItemDrop('fail') - return - } + this.callOnItemDrop('fail'); + return; + }; if (itemIndex == insertIndex) { - this.callOnItemDrop('cancel') - return - } - let status = 'success' - let currentDragToggleName = this.mCurrentDragToggleName - let globalDragToggleName = this.mGlobalDragToggleName - Log.showInfo(this.logTag, `onItemDrop, currentDragToggleName: ${currentDragToggleName}`) - Log.showInfo(this.logTag, `onItemDrop, globalDragToggleName: ${globalDragToggleName}`) + this.callOnItemDrop('cancel'); + return; + }; + let status = 'success'; + let currentDragToggleName = this.mCurrentDragToggleName; + let globalDragToggleName = this.mGlobalDragToggleName; + Log.showInfo(this.logTag, `onItemDrop, currentDragToggleName: ${currentDragToggleName}`); + Log.showInfo(this.logTag, `onItemDrop, globalDragToggleName: ${globalDragToggleName}`); if (itemIndex >= 0 && insertIndex >= 0) { // move - Log.showInfo(this.logTag, `onItemDrop, move`) + Log.showInfo(this.logTag, `onItemDrop, move`); if (itemIndex > insertIndex) { - this.mToggles.splice(insertIndex, 0, currentDragToggleName) - this.mToggles.splice(itemIndex + 1, 1) + this.mToggles.splice(insertIndex, 0, currentDragToggleName); + this.mToggles.splice(itemIndex + 1, 1); } else { - this.mToggles.splice(insertIndex + 1, 0, currentDragToggleName) - this.mToggles.splice(itemIndex, 1) - } + this.mToggles.splice(insertIndex + 1, 0, currentDragToggleName); + this.mToggles.splice(itemIndex, 1); + }; } else if (itemIndex == -1 && insertIndex >= 0) { // insert - Log.showInfo(this.logTag, `onItemDrop, insert`) + Log.showInfo(this.logTag, `onItemDrop, insert`); if (this.mToggles.length < this.mMaxCount) { - this.mToggles.splice(insertIndex, 0, globalDragToggleName) + this.mToggles.splice(insertIndex, 0, globalDragToggleName); } else { - this.mToggles = JSON.parse(JSON.stringify(this.mToggles)) - status = 'cancel' - } + this.mToggles = JSON.parse(JSON.stringify(this.mToggles)); + status = 'cancel'; + }; } else if (itemIndex >= 0 && insertIndex == -1) { // delete - Log.showInfo(this.logTag, `onItemDrop, delete`) + Log.showInfo(this.logTag, `onItemDrop, delete`); if (this.mToggles.length > this.mMinCount) { - this.mToggles.splice(itemIndex, 1) + this.mToggles.splice(itemIndex, 1); } else { - this.mToggles = JSON.parse(JSON.stringify(this.mToggles)) - status = 'cancel' - } - } - this.callOnItemDrop(status) + this.mToggles = JSON.parse(JSON.stringify(this.mToggles)); + status = 'cancel'; + }; + }; + this.callOnItemDrop(status); } callOnItemDrop(status: string): void { - Log.showInfo(this.logTag, `callOnItemDrop, status: ${status}`) + Log.showInfo(this.logTag, `callOnItemDrop, status: ${status}`); if (this.onItemDrop) { - this.onItemDrop(status) - } - this.mCurrentDragToggleName = '' + this.onItemDrop(status); + }; + this.mCurrentDragToggleName = ''; } } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets index dc5dc946..854696f4 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets @@ -13,13 +13,13 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants' -import LocationComponent from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent' -import RingModeComponent from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent' -import SimpleToggleComponent from './SimpleToggleComponent' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; +import LocationComponent from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent'; +import RingModeComponent from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent'; +import SimpleToggleComponent from './SimpleToggleComponent'; -const TAG = 'SimpleToggleLoadComponent' +const TAG = 'SimpleToggleLoadComponent'; @Component export default struct SimpleToggleLoadComponent { @@ -28,12 +28,11 @@ export default struct SimpleToggleLoadComponent { private mDragMode: boolean = false aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) - Log.showInfo(TAG, `aboutToAppear Start, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode}`) + Log.showDebug(TAG, `aboutToAppear Start, keyId: ${this.keyId}, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode}`); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`); } build() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets index 32dc9917..2c072c47 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets @@ -13,32 +13,32 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager" -import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" -import Constants from '../common/Constants' -import StyleConfiguration from '../common/StyleConfiguration' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager"; +import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import Constants from '../common/Constants'; +import StyleConfiguration from '../common/StyleConfiguration'; -const TAG = 'Control-UpTitle' +const TAG = 'Control-UpTitle'; @Component export default struct UpTitle { - private touchMoveCallback: Function - private simpleToggleLayoutEditStartCallback: Function - startX: number = 0 - startY: number = 0 - @State moveX: number = 0 - @State moveY: number = 0 - @State mSettingIsHover: boolean = false - @State mEditIsHover: boolean = false - @State style: any = StyleConfiguration.getControlCenterUpTitleStyle() + private touchMoveCallback: Function; + private simpleToggleLayoutEditStartCallback: Function; + startX: number = 0; + startY: number = 0; + @State moveX: number = 0; + @State moveY: number = 0; + @State mSettingIsHover: boolean = false; + @State mEditIsHover: boolean = false; + @State style: any = StyleConfiguration.getControlCenterUpTitleStyle(); aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear'); + Log.showDebug(TAG, 'aboutToAppear'); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear') + Log.showDebug(TAG, 'aboutToDisappear'); } build() { @@ -114,36 +114,36 @@ export default struct UpTitle { } settingClick() { - Log.showInfo(TAG, `settingClick`) - EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.MainAbility')) + Log.showInfo(TAG, `settingClick`); + EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.MainAbility')); } editClick() { - Log.showInfo(TAG, `editClick`) + Log.showInfo(TAG, `editClick`); if (this.simpleToggleLayoutEditStartCallback) { - this.simpleToggleLayoutEditStartCallback() - } + this.simpleToggleLayoutEditStartCallback(); + }; } touchEvent(event: TouchEvent) { if (event.type == Constants.TOUCHTYPE_DOWN) { - this.startX = event.touches[0].screenX - this.startY = event.touches[0].screenY - Log.showInfo(TAG, `quicklySetting touchStart2=======startX: ${this.startX}, startY: ${this.startY}`) + this.startX = event.touches[0].screenX; + this.startY = event.touches[0].screenY; + Log.showInfo(TAG, `quicklySetting touchStart2=======startX: ${this.startX}, startY: ${this.startY}`); } else if (event.type == Constants.TOUCHTYPE_MOVE) { - this.moveX = event.touches[0].screenX - this.startX - this.moveY = event.touches[0].screenY - this.startY + this.moveX = event.touches[0].screenX - this.startX; + this.moveY = event.touches[0].screenY - this.startY; } else if (event.type == Constants.TOUCHTYPE_UP) { - Log.showInfo(TAG, `quicklySetting touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`) + Log.showInfo(TAG, `quicklySetting touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`); if (this.moveX < -30) { if (this.touchMoveCallback) { - this.touchMoveCallback({ 'direction': 'left' }) - } + this.touchMoveCallback({ 'direction': 'left' }); + }; } else if (this.moveX > 30) { if (this.touchMoveCallback) { - this.touchMoveCallback({ 'direction': 'right' }) - } - } - } + this.touchMoveCallback({ 'direction': 'right' }); + }; + }; + }; } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts index b9992ce0..695721a6 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts @@ -30,7 +30,7 @@ export class ControlCenterVM { mSimpleToggleLayout: any; constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); this.mComplexToggleLayout = AppStorage.SetAndLink(ControlCenterComplexToggleLayoutKey, []); this.mSimpleToggleLayout = AppStorage.SetAndLink(ControlCenterSimpleToggleLayoutKey, []); ControlCenterService.registerListener(this); @@ -40,58 +40,57 @@ export class ControlCenterVM { if (this.mIsStart) { return; } - Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)} `) + Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)} `); this.mIsStart = true; ControlCenterService.startService(config); } setComplexToggleLayout(layout: string[]): void{ - Log.showInfo(TAG, `setComplexToggleLayout, layout: ${JSON.stringify(layout)}`) + Log.showInfo(TAG, `setComplexToggleLayout, layout: ${JSON.stringify(layout)}`); if (JSON.stringify(layout) != JSON.stringify(this.mComplexToggleLayout.get())) { this.mComplexToggleLayout.set(layout); } - Log.showInfo(TAG, `setComplexToggleLayout, mComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`) + Log.showInfo(TAG, `setComplexToggleLayout, mComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`); } setSimpleToggleLayout(layout: string[]): void{ - Log.showInfo(TAG, `setSimpleToggleLayout, layout: ${JSON.stringify(layout)}`) + Log.showInfo(TAG, `setSimpleToggleLayout, layout: ${JSON.stringify(layout)}`); if (JSON.stringify(layout) != JSON.stringify(this.mSimpleToggleLayout.get())) { this.mSimpleToggleLayout.set(layout); } - Log.showInfo(TAG, `setSimpleToggleLayout, mSimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`) + Log.showInfo(TAG, `setSimpleToggleLayout, mSimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`); } setItemData(id: string, itemData: ControlComponentData): void{ - Log.showInfo(TAG, `setItemData, id: ${id} itemData: ${JSON.stringify(itemData)}`) + Log.showInfo(TAG, `setItemData, id: ${id} itemData: ${JSON.stringify(itemData)}`); let storageKey: string = 'ControlCenter_' + id; if (itemData) { AppStorage.SetOrCreate(storageKey, itemData); } else { let deleteRs: boolean = AppStorage.Delete(storageKey); - Log.showInfo(TAG, `setItemData, AppStorage.Delete rs: ${deleteRs} `) + Log.showInfo(TAG, `setItemData, AppStorage.Delete rs: ${deleteRs} `); } } getDisplayingSimpleToggles(): string[]{ - Log.showInfo(TAG, `getDisplayingSimpleToggles`) let simpleToggles = this.mSimpleToggleLayout.get(); - Log.showInfo(TAG, `getDisplayingSimpleToggles, simpleToggles: ${JSON.stringify(simpleToggles)}`) + Log.showInfo(TAG, `getDisplayingSimpleToggles, simpleToggles: ${JSON.stringify(simpleToggles)}`); return simpleToggles; } getHidingSimpleToggles(): string[] { - Log.showInfo(TAG, `getHidingSimpleToggles`) + Log.showInfo(TAG, `getHidingSimpleToggles`); return ControlCenterService.getHidingSimpleToggles(); } getDefaultSimpleToggleLayout() { - Log.showInfo(TAG, `getDefaultSimpleToggleLayout`) + Log.showInfo(TAG, `getDefaultSimpleToggleLayout`); return ControlCenterService.getDefaultSimpleToggleLayout(); } saveSimpleToggleLayout(layout: string[]): void{ - Log.showInfo(TAG, `saveSimpleToggleLayout, layout: ${JSON.stringify(layout)}`) + Log.showInfo(TAG, `saveSimpleToggleLayout, layout: ${JSON.stringify(layout)}`); ControlCenterService.saveSimpleToggleLayout(layout); } } diff --git a/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 2d50fbda..fd836f66 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' -import Constants from './Constants' +import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import Constants from './Constants'; const TAG = 'location-StyleConfiguration'; diff --git a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts index 154997ef..6244f5f9 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts @@ -27,11 +27,11 @@ export class LocationService { if (this.mIsStart) { return; } - Log.showInfo(TAG, `startService`) + Log.showInfo(TAG, `startService`); this.mIsStart = true; this.getServiceState(); geolocation.on('locationServiceState', (state) => { - Log.showInfo(TAG, `startService locationChange, state: ${JSON.stringify(state)}`) + Log.showInfo(TAG, `startService locationChange, state: ${JSON.stringify(state)}`); this.getServiceState(); }); } @@ -39,8 +39,8 @@ export class LocationService { stopService() { if (!this.mIsStart) { return; - } - Log.showInfo(TAG, `stopService`) + }; + Log.showInfo(TAG, `stopService`); this.mIsStart = false; geolocation.off('locationServiceState', (state) => { Log.showInfo(TAG, `stopService locationChange, state: ${JSON.stringify(state)}`) @@ -50,26 +50,26 @@ export class LocationService { registerListener(listener: { 'updateServiceState': Function, }) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`) + Log.showInfo(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; } getServiceState() { - Log.showInfo(TAG, `getServiceState`) + Log.showInfo(TAG, `getServiceState`); geolocation.isLocationEnabled().then((data) => { - Log.showInfo(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`); this.mListener?.updateServiceState(data); }); } enableLocation() { - Log.showInfo(TAG, `enableLocation`) + Log.showInfo(TAG, `enableLocation`); geolocation.enableLocation() .then((res) => Log.showInfo(TAG, `enableLocation, result: ${JSON.stringify(res)}`)); } disableLocation() { - Log.showInfo(TAG, `disableLocation`) + Log.showInfo(TAG, `disableLocation`); geolocation.disableLocation() .then((res) => Log.showInfo(TAG, `disableLocation, result: ${JSON.stringify(res)}`)); } diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets index 48f97ec4..97f10c61 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets @@ -13,32 +13,32 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager" -import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" -import {LocationData} from '../common/Constants' -import ViewModel from '../viewmodel/LocationVM' -import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager"; +import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import {LocationData} from '../common/Constants'; +import ViewModel from '../viewmodel/LocationVM'; +import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase'; -const TAG = 'location-ControlCenterSimpleToggleLocationComponent' +const TAG = 'location-ControlCenterSimpleToggleLocationComponent'; @Component export default struct ControlCenterSimpleToggleLocationComponent { - private keyId: string - private mEditMode: boolean = false - private mDragMode: boolean = false - @State mIcon: Resource = $r("app.media.ic_controlcenter_gps") - @State mLabel: Resource = $r("app.string.control_center_complex_toggle_location_title") - @State mLocationData: LocationData = new LocationData() + private keyId: string; + private mEditMode: boolean = false; + private mDragMode: boolean = false; + @State mIcon: Resource = $r("app.media.ic_controlcenter_gps"); + @State mLabel: Resource = $r("app.string.control_center_complex_toggle_location_title"); + @State mLocationData: LocationData = new LocationData(); aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear') - ViewModel.initViewModel() - this.mLocationData = ViewModel.getLocationData() + Log.showDebug(TAG, 'aboutToAppear'); + ViewModel.initViewModel(); + this.mLocationData = ViewModel.getLocationData(); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear') + Log.showDebug(TAG, 'aboutToDisappear'); } build() { @@ -55,16 +55,16 @@ export default struct ControlCenterSimpleToggleLocationComponent { } mClickEvent() { - Log.showInfo(TAG, `mClickEvent, isEnabled: ${this.mLocationData.isEnabled}`) + Log.showInfo(TAG, `mClickEvent, isEnabled: ${this.mLocationData.isEnabled}`); if (this.mLocationData.isEnabled) { - ViewModel.disableLocation() + ViewModel.disableLocation(); } else { - ViewModel.enableLocation() - } + ViewModel.enableLocation(); + }; } mLongClickEvent() { - Log.showInfo(TAG, `mLongClickEvent`) - EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.MainAbility')) + Log.showInfo(TAG, `mLongClickEvent`); + EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.MainAbility')); } } \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets index c456a363..615d83ea 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets @@ -13,29 +13,29 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager' -import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' -import StyleConfiguration from '../common/StyleConfiguration' -import Constants from '../common/Constants' -import ViewModel from '../viewmodel/LocationVM' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import StyleConfiguration from '../common/StyleConfiguration'; +import Constants from '../common/Constants'; +import ViewModel from '../viewmodel/LocationVM'; -const TAG = 'location-StatusBarIconItemLocationComponent' +const TAG = 'location-StatusBarIconItemLocationComponent'; @Component export default struct StatusBarIconItemLocationComponent { - @StorageLink('LocationServiceUseStatus') LocationServiceUseStatus: boolean = false - @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() - @State style: any = StyleConfiguration.getStartsBarLocationComponentStyle() - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @StorageLink('LocationServiceUseStatus') LocationServiceUseStatus: boolean = false; + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); + @State style: any = StyleConfiguration.getStartsBarLocationComponentStyle(); + @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear') - ViewModel.initViewModel() + Log.showDebug(TAG, 'aboutToAppear'); + ViewModel.initViewModel(); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear') + Log.showDebug(TAG, 'aboutToDisappear'); } build() { diff --git a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts index 4913212e..a4f427b2 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts @@ -30,14 +30,14 @@ export class LocationVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.LOCATION); constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); } initViewModel() { if (this.mIsStart) { return; - } - Log.showInfo(TAG, `initViewModel `) + }; + Log.showInfo(TAG, `initViewModel `); this.mIsStart = true; this.mLocationData = AppStorage.SetAndLink(TAG + '_LocationData', this.mLocationData).get(); LocationService.registerListener(this); @@ -45,22 +45,22 @@ export class LocationVM { } getLocationData(): LocationData { - Log.showInfo(TAG, `getLocationData`) + Log.showInfo(TAG, `getLocationData`); return this.mLocationData; } updateServiceState(state) { - Log.showInfo(TAG, `updateServiceState, state: ${state} `) + Log.showInfo(TAG, `updateServiceState, state: ${state} `); this.mLocationData.isEnabled = state; } enableLocation() { - Log.showInfo(TAG, `enableLocation`) + Log.showInfo(TAG, `enableLocation`); LocationService.enableLocation(); } disableLocation() { - Log.showInfo(TAG, `disableLocation`) + Log.showInfo(TAG, `disableLocation`); LocationService.disableLocation(); } -- Gitee From f4ca0f37bff9b234dd36525ac8877ce558695cf8 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Sun, 22 May 2022 15:37:14 +0800 Subject: [PATCH 091/373] log rectification Signed-off-by: xuchangzhou --- .../src/main/ets/default/pages/airplaneComponent.ets | 5 +++-- .../src/main/ets/com/ohos/model/AutoRotateService.ts | 2 +- .../batterycomponent/src/main/ets/default/batteryModel.ts | 2 +- .../src/main/ets/default/pages/batteryPic.ets | 2 +- .../src/main/ets/com/ohos/model/ControlCenterService.ts | 3 +-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets index 003caae6..e39897f2 100644 --- a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets +++ b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets @@ -41,6 +41,7 @@ struct airplaneComponent { */ mClickEvent() { this.flyModelStatus =!this.flyModelStatus; + Log.showDebug(TAG, `flyModelStatus:${this.flyModelStatus}`); if (this.flyModelStatus == true) { this.mWifiOriginalStatus = wifi.isWifiActive(); Log.showInfo(TAG, `airplane status is opening, WLAN Original Status :${this.mWifiOriginalStatus}`); @@ -52,8 +53,8 @@ struct airplaneComponent { } else { wifi.disableWifi(); Log.showInfo(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},,get system interface, set WLAN status disableWifi`); - } - } + }; + }; } aboutToAppear(){ diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts index f741db81..0a40e003 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -84,7 +84,7 @@ export class AutoRotateService { } updateAutoRotateSwitchStatus(orientation: number): void{ - Log.showInfo(TAG, `updateAutoRotateSwitchStatus, orientation: ${orientation}`); + Log.showDebug(TAG, `updateAutoRotateSwitchStatus, orientation: ${orientation}`); if (orientation == 0) { this.mListener?.updateAutoRotateSwitchStatus(false); } else if (orientation == 5) { diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts index 032b968e..132c5bcb 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -28,7 +28,7 @@ const SUBSCRIBE_INFO = { }; function getChargingStatus(state: typeof BatteryInfo.BatteryChargeState): boolean { - Log.showInfo(TAG, `charging status update: ${state}`); + Log.showDebug(TAG, `charging status update: ${state}`); let batteryStatus = false; switch (state) { case BatteryInfo.BatteryChargeState.DISABLE: diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets index 2dbf9da5..43812ee7 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -74,7 +74,7 @@ struct BatteryPic { } private getBatteryColor(val, charging) { - Log.showInfo(TAG, `getBatteryColor, val: ${ val } charging: ${ charging } `); + Log.showDebug(TAG, `getBatteryColor, val: ${ val } charging: ${ charging } `); if (charging) { return this.style.picChargingColor; } else if (val <= Constants.BATTERY_LEVEL_LOW) { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index 55456a20..6542d805 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -120,6 +120,7 @@ export class ControlCenterService { Log.showInfo(TAG, `loadSimpleToggleLayoutTemplate`); this.mSimpleToggleLayoutTemplate = []; let simpleToggleLayout = this.getSimpleToggleLayoutFromSettings(); + Log.showDebug(TAG, `simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); if (simpleToggleLayout) { this.mSimpleToggleLayoutTemplate = simpleToggleLayout; } else { @@ -185,8 +186,6 @@ export class ControlCenterService { let controlData: ControlComponentData = parseData(itemData); let id: string = controlData.id; this.mListener?.setItemData(id, controlData); - Log.showInfo(TAG, `controlData.toggleType == Constants.TOGGLE_TYPE_COMPLEX: ${controlData.toggleType == Constants.TOGGLE_TYPE_COMPLEX}`); - Log.showInfo(TAG, `this.mAllComplexToggles.indexOf(id) < 0: ${this.mAllComplexToggles.indexOf(id) < 0}`); if (controlData.toggleType == Constants.TOGGLE_TYPE_COMPLEX) { if (this.mAllComplexToggles.indexOf(id) < 0) { this.mAllComplexToggles.push(id); -- Gitee From e7b365ba2d0baf5cb89a4719585d6d2a7fb8a809 Mon Sep 17 00:00:00 2001 From: lvxiaoqiang Date: Sun, 22 May 2022 21:26:41 +0800 Subject: [PATCH 092/373] add reboot permission Signed-off-by: lvxiaoqiang --- .../src/main/ets/com/ohos/model/screenlockStyle.ts | 11 ++++++++--- product/pc/src/main/module.json5 | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts index 93ec41cc..2e7a4af6 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts @@ -42,9 +42,14 @@ class ScreenlockStyle { readMode(deviceType: string): number{ Log.showInfo(TAG, `readMode deviceType:${deviceType}`); - let modeJson = ReadConfigFile(FILE_URI.replace('{0}', deviceType)) - Log.showInfo(TAG, `ReadConfigFile content:` + JSON.stringify(modeJson)); - this.screenMode = modeJson.mode + try { + let modeJson = ReadConfigFile(FILE_URI.replace('{0}', deviceType)) + Log.showInfo(TAG, `ReadConfigFile content:` + JSON.stringify(modeJson)); + this.screenMode = modeJson.mode + } catch(error) { + Log.showInfo(TAG, `ReadConfigFile content error: ${error}`); + this.screenMode = 1 + } return this.screenMode } } diff --git a/product/pc/src/main/module.json5 b/product/pc/src/main/module.json5 index aeae5a37..f66362a8 100644 --- a/product/pc/src/main/module.json5 +++ b/product/pc/src/main/module.json5 @@ -69,6 +69,9 @@ }, { "name": "ohos.permission.SET_WALLPAPER" + }, + { + "name": "ohos.permission.REBOOT" } ], "extensionAbilities": [ -- Gitee From fbaf0930049f824ec3d46b02559186a1a5f0a84b Mon Sep 17 00:00:00 2001 From: r00498791 Date: Mon, 23 May 2022 09:16:07 +0800 Subject: [PATCH 093/373] log rectification of product entry and common module Signed-off-by: r00498791 --- .../ets/default/MultimodalInputManager.ts | 12 ++--- common/src/main/ets/default/ReadConfigUtil.ts | 10 ++-- common/src/main/ets/default/SettingsUtil.ts | 16 +++---- .../src/main/ets/default/SwitchUserManager.ts | 6 +-- common/src/main/ets/default/TimeManager.ts | 4 +- .../src/main/ets/default/TintStateManager.ts | 16 +++---- common/src/main/ets/default/WindowManager.ts | 10 ++-- .../default/abilitymanager/abilityManager.ts | 12 ++--- .../default/abilitymanager/bundleManager.ts | 4 +- .../abilitymanager/featureAbilityManager.ts | 4 +- .../abilitymanager/notificationManager.ts | 10 ++-- .../default/commonEvent/CommonEventManager.ts | 10 ++-- .../main/ets/default/event/EventManager.ts | 4 +- .../PluginDataSourceAdapter.ts | 24 +++++----- .../PluginDataSourceManager.ts | 19 ++++---- .../common/BundleParseUtil.ts | 20 ++++---- .../sourceloader/DataAbilitySourceLoader.ts | 2 +- .../sourceloader/MetaSourceLoader.ts | 4 +- .../sourceloader/SourceLoader.ts | 2 +- .../sourceloader/SourceLoaderFactory.ts | 2 +- .../main/ets/template/SimpleToggleBase.ets | 10 ++-- .../src/main/ets/template/iconComponent.ets | 5 +- .../src/main/ets/template/iconTitleBase.ets | 4 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 4 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 4 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 6 +-- .../main/ets/common/NavBarConfiguration.ts | 23 ++++----- .../src/main/ets/common/StyleManager.ts | 4 +- .../src/main/ets/common/utils/configReader.ts | 6 +-- .../src/main/ets/pages/index.ets | 4 +- .../src/main/ets/pages/keyButton.ets | 6 +-- .../src/main/ets/pages/oneLayout.ets | 4 +- .../src/main/ets/pages/threeLayout.ets | 4 +- .../ets/viewmodel/NavigationBarViewModel.ts | 17 ++++--- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../src/main/ets/MainAbility/MainAbility.ts | 12 ++--- .../src/main/ets/pages/batchSetEnable.ets | 4 +- .../src/main/ets/pages/noDisturb.ets | 10 ++-- .../src/main/ets/pages/noDisturbPre.ets | 10 ++-- .../ets/pages/notificationManagenment.ets | 16 +++---- .../src/main/ets/pages/setEnable.ets | 12 ++--- .../src/main/ets/pages/slotSetting.ets | 18 +++---- .../src/main/ets/vm/noDisturbViewModel.ts | 18 ++++--- .../vm/notificationManagenmentViewModel.ts | 12 ++--- .../src/main/ets/Application/AbilityStage.ts | 25 +--------- .../ServiceExtAbility/ServiceExtAbility.ts | 4 +- .../src/main/ets/common/StyleManager.ts | 2 +- .../volumepanel/src/main/ets/pages/index.ets | 6 +-- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 8 ++-- .../src/main/ets/pages/common/StyleManager.ts | 4 +- .../src/main/ets/pages/control.ets | 4 +- .../controlpanel/src/main/ets/pages/index.ets | 14 +++--- .../ets/workers/PluginDataSourceWorker.js | 16 +++---- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 6 +-- .../src/main/ets/pages/bannerNotification.ets | 16 +++---- .../src/main/ets/pages/common/StyleManager.ts | 2 +- .../src/main/ets/pages/index.ets | 12 ++--- .../src/main/ets/pages/notification.ets | 8 ++-- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 6 +-- .../src/main/ets/pages/common/StyleManager.ts | 2 +- .../pc/statusbar/src/main/ets/pages/index.ets | 6 +-- .../ets/workers/PluginDataSourceWorker.js | 14 +++--- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 4 +- .../src/main/ets/pages/bannerNotification.ets | 16 +++---- .../src/main/ets/pages/common/StyleManager.ts | 4 +- .../main/ets/pages/common/navigationEvent.ts | 4 +- .../src/main/ets/pages/control.ets | 8 ++-- .../src/main/ets/pages/index.ets | 48 +++++++++---------- .../src/main/ets/pages/notification.ets | 10 ++-- .../ets/workers/PluginDataSourceWorker.js | 14 +++--- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 6 +-- .../src/main/ets/pages/common/StyleManager.ts | 2 +- .../statusbar/src/main/ets/pages/index.ets | 12 ++--- .../ets/workers/PluginDataSourceWorker.js | 14 +++--- 82 files changed, 338 insertions(+), 381 deletions(-) diff --git a/common/src/main/ets/default/MultimodalInputManager.ts b/common/src/main/ets/default/MultimodalInputManager.ts index 85d80349..014527ee 100644 --- a/common/src/main/ets/default/MultimodalInputManager.ts +++ b/common/src/main/ets/default/MultimodalInputManager.ts @@ -63,32 +63,32 @@ class MultimodalInputManager { } registerControlListener(callback) { - Log.showInfo(TAG, `registerListener control`); + Log.showDebug(TAG, `registerListener control`); inputConsumer.on("key", this.controlKeyOptions, (err, data) => { Log.showInfo(TAG, `controlRegisterCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); callback.onControlShowOrHide(err, data); }); - Log.showInfo(TAG, `registerListener end`); + Log.showDebug(TAG, `registerListener end`); } registerNotificationListener(callback) { - Log.showInfo(TAG, `registerListener notification`); + Log.showDebug(TAG, `registerListener notification`); inputConsumer.on("key", this.notificationKeyOptions, (err, data) => { Log.showInfo(TAG, `notificationRegisterCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); callback.onNotificationShowOrHide(err, data); }); - Log.showInfo(TAG, `registerListener end`); + Log.showDebug(TAG, `registerListener end`); } unregisterListener() { - Log.showInfo(TAG, `unregisterListener start`); + Log.showDebug(TAG, `unregisterListener start`); inputConsumer.off("key", this.notificationKeyOptions, (err, data) => { Log.showInfo(TAG, `notificationUnregisterCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); }); inputConsumer.off("key", this.controlKeyOptions, (err, data) => { Log.showInfo(TAG, `controlUnregisterCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); }); - Log.showInfo(TAG, `unregisterListener end`); + Log.showDebug(TAG, `unregisterListener end`); } } let sMultimodalInputManager = createOrGet(MultimodalInputManager, TAG); diff --git a/common/src/main/ets/default/ReadConfigUtil.ts b/common/src/main/ets/default/ReadConfigUtil.ts index c7eb8b90..b347a1ed 100644 --- a/common/src/main/ets/default/ReadConfigUtil.ts +++ b/common/src/main/ets/default/ReadConfigUtil.ts @@ -22,13 +22,13 @@ const TAG = 'ReadConfigUtil'; export class ReadConfigUtil { ReadConfigFile(fileName) { - Log.showInfo(TAG, `readConfigFile fileName:${fileName}`); + Log.showDebug(TAG, `readConfigFile fileName:${fileName}`); try { let stream = FileIo.createStreamSync(fileName, 'r'); - Log.showInfo(TAG, `readConfigFile stream:` + stream); + Log.showDebug(TAG, `readConfigFile stream:` + stream); let buf = new ArrayBuffer(DFAULT_SIZE); let len = stream.readSync(buf); - Log.showInfo(TAG, `readConfigFile len:` + len); + Log.showDebug(TAG, `readConfigFile len:` + len); let arr = new Uint8Array(buf); let charAt = ' '.charCodeAt(CHAR_CODE_AT_INDEX); for (let i = len;i < DFAULT_SIZE; i++) { @@ -36,10 +36,10 @@ export class ReadConfigUtil { } let content = String.fromCharCode.apply(null, arr); stream.closeSync(); - Log.showInfo(TAG, `readConfigFile content:` + JSON.stringify(content)); + Log.showDebug(TAG, `readConfigFile content:` + JSON.stringify(content)); return JSON.parse(content); } catch (error) { - Log.showInfo(TAG, `readConfigFile error:` + JSON.stringify(error)); + Log.showError(TAG, `readConfigFile error:` + JSON.stringify(error)); } } } diff --git a/common/src/main/ets/default/SettingsUtil.ts b/common/src/main/ets/default/SettingsUtil.ts index 6c025e59..e6b4515c 100644 --- a/common/src/main/ets/default/SettingsUtil.ts +++ b/common/src/main/ets/default/SettingsUtil.ts @@ -27,35 +27,35 @@ export class SettingsUtil { helper: DataAbilityHelper; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); try { this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), Constants.URI_VAR); } catch (e) { - Log.showInfo(TAG, `constructor, acquire helper error: ${e.toString()}`); + Log.showError(TAG, `constructor, acquire helper error: ${e.toString()}`); } } getValue(name: string, defValue?: string): string { - Log.showInfo(TAG, `getValue, name: ${name} defValue: ${defValue}`); + Log.showDebug(TAG, `getValue, name: ${name} defValue: ${defValue}`); let value: string = null; try { value = settings.getValueSync(this.helper, name, defValue ? defValue : ""); } catch (e) { - Log.showInfo(TAG, `getValue e: ${e.toString()}`); + Log.showError(TAG, `getValue e: ${e.toString()}`); } - Log.showInfo(TAG, `getValue, value: ${value}`); + Log.showDebug(TAG, `getValue, value: ${value}`); return value; } setValue(name: string, value: string): boolean { - Log.showInfo(TAG, `setValue, name: ${name} value: ${value}`); + Log.showDebug(TAG, `setValue, name: ${name} value: ${value}`); let result = false; try { result = settings.setValueSync(this.helper, name, value); } catch (e) { - Log.showInfo(TAG, `setValue e: ${e.toString()}`); + Log.showError(TAG, `setValue e: ${e.toString()}`); } - Log.showInfo(TAG, `setValue, result: ${result}`); + Log.showDebug(TAG, `setValue, result: ${result}`); return result; } } diff --git a/common/src/main/ets/default/SwitchUserManager.ts b/common/src/main/ets/default/SwitchUserManager.ts index b352e6c9..32970e87 100644 --- a/common/src/main/ets/default/SwitchUserManager.ts +++ b/common/src/main/ets/default/SwitchUserManager.ts @@ -42,7 +42,7 @@ export class UserInfo { async function getCurrentAccountInfo(): Promise { let accountInfos = await AccountManager.getAccountManager().queryAllCreatedOsAccounts(); for (let accountInfo of accountInfos) { - Log.showInfo(TAG, `accountInfo: ${accountInfo.localId}, isActive: ${accountInfo.isActived}`); + Log.showDebug(TAG, `accountInfo: ${accountInfo.localId}, isActive: ${accountInfo.isActived}`); if (accountInfo.isActived) { return accountInfo; } @@ -68,7 +68,7 @@ export default class SwitchUserManager { } constructor() { - Log.showInfo(TAG, `SwitchUserManager constructor`); + Log.showDebug(TAG, `SwitchUserManager constructor`); AccountManager.getAccountManager().on(USER_CHANGE_EVENT, SUBSCRIBE_KEY, this.handleUserChange.bind(this)); } @@ -82,7 +82,7 @@ export default class SwitchUserManager { this.mHasWait = true; this.mUserInfo = parseAccountInfo(await getCurrentAccountInfo()); } - Log.showInfo(TAG, `getCurrentUserInfo userId: ${this.mUserInfo.userId}`); + Log.showDebug(TAG, `getCurrentUserInfo userId: ${this.mUserInfo.userId}`); return this.mUserInfo; } diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts index 8b432915..c459ceb2 100644 --- a/common/src/main/ets/default/TimeManager.ts +++ b/common/src/main/ets/default/TimeManager.ts @@ -77,7 +77,7 @@ class TimeManager { } private initTimeFormat(context: any) { - Log.showInfo(TAG, "initTimeFormat"); + Log.showDebug(TAG, "initTimeFormat"); this.mSettingsHelper = featureAbility.acquireDataAbilityHelper(context, URI_VAR); const handleTimeFormatChange = () => { @@ -106,7 +106,7 @@ class TimeManager { } private notifyTimeChange() { - Log.showInfo(TAG, "notifyTimeChange"); + Log.showDebug(TAG, "notifyTimeChange"); let args: TimeEventArgs = { date: new Date(), timeFormat: this.mUse24hFormat, diff --git a/common/src/main/ets/default/TintStateManager.ts b/common/src/main/ets/default/TintStateManager.ts index 887f47ec..7b27d91c 100644 --- a/common/src/main/ets/default/TintStateManager.ts +++ b/common/src/main/ets/default/TintStateManager.ts @@ -54,7 +54,7 @@ export default class TintStateManager { } constructor() { - Log.showInfo(TAG, `init TintStateManager. ${LISTENER_SYSTEM_BAR_TINT_CHANGE}`); + Log.showDebug(TAG, `init TintStateManager. ${LISTENER_SYSTEM_BAR_TINT_CHANGE}`); Window.on(LISTENER_SYSTEM_BAR_TINT_CHANGE, this.onSystemBarTintChange.bind(this)); } @@ -62,27 +62,27 @@ export default class TintStateManager { let tintState = this.mStates.get(windowType); tintState && listener.onTintStateChange(tintState); let res = this.mListeners.set(windowType, listener); - Log.showInfo(TAG, `registser listenerSize: ${res.size}`); + Log.showDebug(TAG, `registser listenerSize: ${res.size}`); } unregisterListener(windowType: WindowType) { let res = this.mListeners.delete(windowType); - Log.showInfo(TAG, `unregistser ${windowType}, res: ${res}`); + Log.showDebug(TAG, `unregistser ${windowType}, res: ${res}`); } async onSystemBarTintChange(data) { - Log.showInfo(TAG, `onSystemBarTintChange, data: ${JSON.stringify(data)}`); + Log.showDebug(TAG, `onSystemBarTintChange, data: ${JSON.stringify(data)}`); if (!Array.isArray(data.regionTint)) { - Log.showInfo(TAG, `regionTint is not array.`); + Log.showDebug(TAG, `regionTint is not array.`); return; } let dis = await display.getDefaultDisplay(); if (dis.id != data.displayId) { - Log.showInfo(TAG, `Needn't change, displayId: ${data.displayId}`); + Log.showDebug(TAG, `Needn't change, displayId: ${data.displayId}`); return; } data.regionTint.forEach((regionTintData) => { - Log.showInfo(TAG, `onSystemBarTintChange, type: ${WindowNameMap[regionTintData["type"]]}`); + Log.showDebug(TAG, `onSystemBarTintChange, type: ${WindowNameMap[regionTintData["type"]]}`); let windowType = WindowNameMap[regionTintData["type"]]; if (!windowType) { return; @@ -93,7 +93,7 @@ export default class TintStateManager { backgroundColor: regionTintData.backgroundColor, contentColor: regionTintData.contentColor, }; - Log.showInfo(TAG, `tintState: ${JSON.stringify(tintState)}`); + Log.showDebug(TAG, `tintState: ${JSON.stringify(tintState)}`); this.mStates.set(windowType, tintState); this.mListeners.get(windowType)?.onTintStateChange(tintState); }); diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index 9f3f23c7..bd58c48c 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -60,13 +60,13 @@ class WindowManager { mWindowInfos: Map = new Map(); async createWindow(context: any, name: WindowType, rect: Rect, loadContent: string): Promise { - Log.showInfo(TAG, `createWindow name: ${name}, rect: ${JSON.stringify(rect)}, url: ${loadContent}`); + Log.showDebug(TAG, `createWindow name: ${name}, rect: ${JSON.stringify(rect)}, url: ${loadContent}`); let winHandle = await Window.create(context, name, SYSTEM_WINDOW_TYPE_MAP[name]); await winHandle.moveTo(rect.left, rect.top); await winHandle.resetSize(rect.width, rect.height); await winHandle.loadContent(loadContent); this.mWindowInfos.set(name, { visibility: false, rect }); - Log.showInfo(TAG, `create window[${name}] success.`); + Log.showDebug(TAG, `create window[${name}] success.`); return winHandle; } @@ -81,7 +81,7 @@ class WindowManager { rect, }) ); - Log.showInfo(TAG, `resize window[${name}] success, rect: ${JSON.stringify(rect)}.`); + Log.showDebug(TAG, `resize window[${name}] success, rect: ${JSON.stringify(rect)}.`); } async showWindow(name: WindowType): Promise { @@ -94,7 +94,7 @@ class WindowManager { isShow: true, }) ); - Log.showInfo(TAG, `show window[${name}] success.`); + Log.showDebug(TAG, `show window[${name}] success.`); } async hideWindow(name: WindowType): Promise { @@ -107,7 +107,7 @@ class WindowManager { isShow: false, }) ); - Log.showInfo(TAG, `hide window[${name}] success.`); + Log.showDebug(TAG, `hide window[${name}] success.`); } getWindowInfo(name: WindowType): WindowInfo | undefined { diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/common/src/main/ets/default/abilitymanager/abilityManager.ts index db98d624..ce891fdc 100644 --- a/common/src/main/ets/default/abilitymanager/abilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/abilityManager.ts @@ -32,12 +32,12 @@ export default class AbilityManager { static ABILITY_NAME_OWNER_WANT = 'Owner_Want'; static setContext(abilityName: string, context) { - Log.showInfo(TAG, `setContext, abilityName: ${abilityName}`); + Log.showDebug(TAG, `setContext, abilityName: ${abilityName}`); globalThis[abilityName + '_Context'] = context; } static getContext(abilityName?: string) { - Log.showInfo(TAG, `getContext, abilityName: ${abilityName}`); + Log.showDebug(TAG, `getContext, abilityName: ${abilityName}`); if (!abilityName) { abilityName = AbilityManager.ABILITY_NAME_ENTRY; } @@ -45,17 +45,17 @@ export default class AbilityManager { } static setAbilityData(abilityName, key, data) { - Log.showInfo(TAG, `setAbilityData, abilityName: ${abilityName} key: ${key} data: ${JSON.stringify(data)}`); + Log.showDebug(TAG, `setAbilityData, abilityName: ${abilityName} key: ${key} data: ${JSON.stringify(data)}`); globalThis[abilityName + '_data_' + key] = data; } static getAbilityData(abilityName, key) { - Log.showInfo(TAG, `getAbilityData, abilityName: ${abilityName} key: ${key} `); + Log.showDebug(TAG, `getAbilityData, abilityName: ${abilityName} key: ${key} `); return globalThis[abilityName + '_data_' + key]; } static startAbility(want, callback?: Function) { - Log.showInfo(TAG, `startAbility, want: ${JSON.stringify(want)}`); + Log.showDebug(TAG, `startAbility, want: ${JSON.stringify(want)}`); let context = AbilityManager.getContext(); context.startAbility(want).then(() => { Log.showInfo(TAG, `startAbility, then`); @@ -63,7 +63,7 @@ export default class AbilityManager { callback(null); } }).catch((error) => { - Log.showInfo(TAG, `startAbility, error: ${JSON.stringify(error)}`); + Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); callback(error); }) } diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ts b/common/src/main/ets/default/abilitymanager/bundleManager.ts index b38fdc5b..09dc39c7 100644 --- a/common/src/main/ets/default/abilitymanager/bundleManager.ts +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ts @@ -22,7 +22,7 @@ const TAG = "BRManager"; export default class BundleManager { static async getResourceManager(tag: string, context: Context, bundleName: string) { - Log.showInfo(TAG, `getResourceManager from: ${tag}`); + Log.showDebug(TAG, `getResourceManager from: ${tag}`); let bundleContext = await context.createBundleContext(bundleName); return await bundleContext.resourceManager; } @@ -32,7 +32,7 @@ export default class BundleManager { let userInfo = { userId: requestId ?? (await SwitchUserManager.getInstance().getCurrentUserInfo()).userId, }; - Log.showInfo(TAG, `getBundleInfo from: ${tag}, userId: ${userInfo.userId}`); + Log.showDebug(TAG, `getBundleInfo from: ${tag}, userId: ${userInfo.userId}`); return await BundleMgr.getBundleInfo(bundleName, getInfo, userInfo); } } \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts index 876cd06f..d78ef390 100644 --- a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts @@ -21,7 +21,7 @@ const TAG = 'FeatureAbilityManager'; export default class FeatureAbilityManager { openAbility(tag, want) { - Log.showInfo(TAG, `openAbility from: ${tag}`)); + Log.showDebug(TAG, `openAbility from: ${tag}`)); let result = FeatureAbility.startAbility(want) .then(data => Log.showInfo(TAG, `tag: ${tag} promise then: ${JSON.stringify(data)}`)) @@ -60,7 +60,7 @@ export default class FeatureAbilityManager { Log.showError(TAG, `failed to finishAbility because ${JSON.stringify(err)}`); return; } - Log.showInfo(TAG, ` finishAbility callback err: ${JSON.stringify(err)} data:${data}`); + Log.showDebug(TAG, ` finishAbility callback err: ${JSON.stringify(err)} data:${data}`); }); } } \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/notificationManager.ts b/common/src/main/ets/default/abilitymanager/notificationManager.ts index ad137fc6..4c8d6624 100644 --- a/common/src/main/ets/default/abilitymanager/notificationManager.ts +++ b/common/src/main/ets/default/abilitymanager/notificationManager.ts @@ -27,27 +27,27 @@ export default class NotificationManager { static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; static subscribeNotification(tag, subscriber, asyncCallback) { - Log.showInfo(TAG, `subscribeNotification from: ${tag}`)); + Log.showDebug(TAG, `subscribeNotification from: ${tag}`)); Notification.subscribe(subscriber, asyncCallback); } static unsubscribeNotification(tag, subscriber) { - Log.showInfo(TAG, `subscribeNotification from: ${tag}`)); + Log.showDebug(TAG, `subscribeNotification from: ${tag}`)); Notification.unsubscribe(subscriber); } static removeAll(tag, callback) { - Log.showInfo(TAG, `removeAll from: ${tag}`)); + Log.showDebug(TAG, `removeAll from: ${tag}`)); Notification.removeAll(callback); } static remove(tag, hashCode, callback) { - Log.showInfo(TAG, `remove from: ${tag}`)); + Log.showDebug(TAG, `remove from: ${tag}`)); Notification.remove(hashCode, callback) } static getAllActiveNotifications(tag, callback) { - Log.showInfo(TAG, `getAllActiveNotifications from: ${tag}`)); + Log.showDebug(TAG, `getAllActiveNotifications from: ${tag}`)); Notification.getAllActiveNotifications(callback); } diff --git a/common/src/main/ets/default/commonEvent/CommonEventManager.ts b/common/src/main/ets/default/commonEvent/CommonEventManager.ts index bdd974a7..841a570f 100644 --- a/common/src/main/ets/default/commonEvent/CommonEventManager.ts +++ b/common/src/main/ets/default/commonEvent/CommonEventManager.ts @@ -48,23 +48,23 @@ export function getCommonEventManager( let policyClearCb: Map | undefined = undefined; async function subscriberCommonEvent() { - Log.showInfo(TAG, "registerSubscriber start"); + Log.showDebug(TAG, "registerSubscriber start"); let subscriber = await commonEvent.createSubscriber(SUBSCRIBE_INFOS); commonEvent.subscribe(subscriber, (err, data) => { if (err.code != 0) { Log.showError(TAG, `Can't handle common event, err: ${JSON.stringify(err)}`); return; } - Log.showInfo(TAG, `handle common event: ${data.event}`); + Log.showDebug(TAG, `handle common event: ${data.event}`); commonEventCallback(data); }); unSubcribers.push(() => commonEvent.unsubscribe(subscriber)); subscribeStateChange && subscribeStateChange(true); - Log.showInfo(TAG, `registerSubscriber success, size: ${unSubcribers.length}`); + Log.showDebug(TAG, `registerSubscriber success, size: ${unSubcribers.length}`); } function unSubscriberCommonEvent() { - Log.showInfo(TAG, `UnSubcribers size: ${unSubcribers.length}`); + Log.showDebug(TAG, `UnSubcribers size: ${unSubcribers.length}`); unSubcribers.forEach((unsubscribe) => unsubscribe()); unSubcribers.length = 0; subscribeStateChange && subscribeStateChange(false); @@ -76,7 +76,7 @@ export function getCommonEventManager( policys.forEach((policy) => { if (policyClearCb) { !policyClearCb.has(policy) && policyClearCb.set(policy, policyMap[policy](innerManager)); - Log.showInfo(TAG, `apply policy: ${policy}`); + Log.showDebug(TAG, `apply policy: ${policy}`); } }); } diff --git a/common/src/main/ets/default/event/EventManager.ts b/common/src/main/ets/default/event/EventManager.ts index c6764345..656ed282 100644 --- a/common/src/main/ets/default/event/EventManager.ts +++ b/common/src/main/ets/default/event/EventManager.ts @@ -56,7 +56,7 @@ class EventManager { } private publishLocalEvent(data: LocalEvent): boolean { - Log.showInfo(TAG, `publish localEvent type: ${data.eventName}`); + Log.showDebug(TAG, `publish localEvent type: ${data.eventName}`); if (data.eventName) { this.mEventBus.emit(data.eventName, data.args); return true; @@ -65,7 +65,7 @@ class EventManager { } private startAbility(data: { [key: string]: any }): boolean { - Log.showInfo(TAG, `start Ability: ${data.abilityName}`); + Log.showDebug(TAG, `start Ability: ${data.abilityName}`); if (data.bundleName && data.abilityName && this.mContext) { this.mEventBus.emit(START_ABILITY_EVENT, { abilityName: data.abilityName }); this.mContext.startAbility({ diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts index 2928aaf1..09fd1fd3 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts @@ -35,7 +35,7 @@ export default class PluginDataSourceAdapter { mListener: pluginWorkerListener; constructor(name: string, context: Context, listener: pluginWorkerListener) { - Log.showInfo(TAG, `constructor, name: ${name}`); + Log.showDebug(TAG, `constructor, name: ${name}`); this.mName = name; this.mContext = context; this.mListener = listener; @@ -51,22 +51,22 @@ export default class PluginDataSourceAdapter { } initDataSource(configs: RootConfigInfo) { - Log.showInfo(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`); + Log.showDebug(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`); this.mWorker.postMessage(obtainMsg(Constants.INIT_CONFIG, configs)); } loadData(userId: number) { - Log.showInfo(TAG, `loadData`); + Log.showDebug(TAG, `loadData`); this.mWorker.postMessage(obtainMsg(Constants.LOAD_DATA, userId)); } clearAll() { - Log.showInfo(TAG, `clearAll`); + Log.showDebug(TAG, `clearAll`); this.mWorker.postMessage(obtainMsg(Constants.CLEAR_ALL, {})); } onMessage(msg: { data: any }) { - Log.showInfo(TAG, `onMessage, msg: ${JSON.stringify(msg)}`); + Log.showDebug(TAG, `onMessage, msg: ${JSON.stringify(msg)}`); let data = msg.data; switch (data.action) { case Constants.INIT_FINISH: @@ -84,19 +84,19 @@ export default class PluginDataSourceAdapter { } onInitFinish() { - Log.showInfo(TAG, `onInitFinish`); + Log.showDebug(TAG, `onInitFinish`); this.mListener.initFinish(); } async onItemAdd(itemData: ItemComponentData) { - Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); + Log.showDebug(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); itemData.label && (itemData.label = decodeURIComponent(itemData.label)); if (itemData.label && itemData.iconUrl) { this.mListener.onItemAdd(itemData); return; } let manager = await BundleManager.getResourceManager(TAG, this.mContext, itemData.bundleName); - Log.showInfo(TAG, `${itemData.id} Can't find label or icon, fetch data from ${manager}`); + Log.showDebug(TAG, `${itemData.id} Can't find label or icon, fetch data from ${manager}`); if (manager) { Promise.all([ itemData.iconUrl ?? manager.getMediaBase64(itemData.abilityIconId), @@ -112,19 +112,19 @@ export default class PluginDataSourceAdapter { } onItemRemove(itemData: ItemComponentData) { - Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); + Log.showDebug(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); this.mListener.onItemRemove(itemData); } onMessageError(event: any) { - Log.showInfo(TAG, `mWorker.onmessageerror, event: ${event}`); + Log.showDebug(TAG, `mWorker.onmessageerror, event: ${event}`); } onExit(code: any) { - Log.showInfo(TAG, `mWorker.onexit, code: ${code}`); + Log.showDebug(TAG, `mWorker.onexit, code: ${code}`); } onError(err: any) { - Log.showInfo(TAG, `mWorker.onerror, err: ${JSON.stringify(err)}`); + Log.showDebug(TAG, `mWorker.onerror, err: ${JSON.stringify(err)}`); } } diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts index 97295e39..c05bec12 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts @@ -51,7 +51,7 @@ export default class PluginDataSourceManager { } initDataSource(configs: RootConfigInfo) { - Log.showInfo(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`); + Log.showDebug(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`); this.mAction = configs.action; configs.filterDatas.forEach((data: FilterData) => this.mFilterDatas.set(data.abilityName, data.id)); for (let pluginType in configs.loaderConfig) { @@ -61,14 +61,14 @@ export default class PluginDataSourceManager { Log.showInfo(TAG, `getSourceLoader plugin: ${pluginType}, loader${this.mLoaders.get(pluginType)}`); } } - Log.showInfo(TAG, `action:${this.mAction}, filterData: ${JSON.stringify(this.mFilterDatas)}`); + Log.showDebug(TAG, `action:${this.mAction}, filterData: ${JSON.stringify(this.mFilterDatas)}`); registerBundleListener(this, (handle) => { this.mListenerHandle = handle; }); } async onBundleNotify(bundleName: string, event: BundleEventType) { - Log.showInfo(TAG, `onBundleNotify, bundleName: ${bundleName}, event: ${event}`); + Log.showDebug(TAG, `onBundleNotify, bundleName: ${bundleName}, event: ${event}`); if (event == BundleEventType.BUNDLE_CHANGE || event == BundleEventType.BUNDLE_REMOVE) { this.mLoaders.forEach((loader) => loader.onBundleRemove(bundleName)); } @@ -80,29 +80,28 @@ export default class PluginDataSourceManager { } clearAll() { - Log.showInfo(TAG, `clearAll`); + Log.showDebug(TAG, `clearAll`); this.unregisterListener(); this.mLoaders.forEach((sourceLoader) => sourceLoader.clearData()); } async loadData(userId: number) { - Log.showInfo(TAG, `loadData, userId: ${userId}`); - Log.showInfo(TAG, `loadData, this.mUserId: ${this.mUserId}`); + Log.showDebug(TAG, `loadData, userId: ${userId}, this.mUserId: ${this.mUserId}`); if (this.mUserId != userId) { this.mUserId = userId; this.mLoaders.forEach((sourceLoader) => sourceLoader.clearData()); let abilityInfos = await queryAbility(this.mAction, this.mUserId); - Log.showInfo(TAG, `loadData, abilityInfos: ${JSON.stringify(abilityInfos)}`); + Log.showDebug(TAG, `loadData, abilityInfos: ${JSON.stringify(abilityInfos)}`); abilityInfos.forEach((info) => this.notifyAbilityAdd(info)); } this.mLoaders.forEach((sourceLoader) => sourceLoader.reloadData(this.mUserId)); } private notifyAbilityAdd(info: AbilityInfo | ExtensionAbilityInfo) { - Log.showInfo(TAG, `notifyAbilityAdd, info: ${JSON.stringify(info)}`); + Log.showDebug(TAG, `notifyAbilityAdd, info: ${JSON.stringify(info)}`); let itemId = this.mFilterDatas.get(info.name); if (!itemId) { - Log.showInfo(TAG, `notifyAbilityAdd, can't find itemId, ability:${info.name}`); + Log.showError(TAG, `notifyAbilityAdd, can't find itemId, ability:${info.name}`); return; } let abilityInfo: AbilityInfoWithId = { @@ -110,7 +109,7 @@ export default class PluginDataSourceManager { itemId: itemId, }; if ((!abilityInfo.metaData || !abilityInfo.metaData.length) && (!abilityInfo.metadata || !abilityInfo.metadata.length) ) { - Log.showInfo(TAG, `Can't find metadata, abilityId: ${abilityInfo.name}`); + Log.showError(TAG, `Can't find metadata, abilityId: ${abilityInfo.name}`); return; } this.mLoaders.forEach((loader) => loader.onAbilityAdd(abilityInfo)); diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts index c5dace65..60407a5c 100644 --- a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts +++ b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts @@ -51,9 +51,9 @@ const BUNDLE_SUBSCRIBE_INFO = { }; export async function queryAbility(action: string, userId: number, bundleName?: string): Promise> { - Log.showInfo(TAG, `queryAbility, action: ${action} , userId: ${userId}`); + Log.showDebug(TAG, `queryAbility, action: ${action} , userId: ${userId}`); if (bundleName) { - Log.showInfo(TAG, `queryAbility, bundleName: ${bundleName}`); + Log.showDebug(TAG, `queryAbility, bundleName: ${bundleName}`); let abilitys = []; try { abilitys = await bundleManager.queryAbilityByWant( @@ -65,7 +65,7 @@ export async function queryAbility(action: string, userId: number, bundleName?: userId ); } catch (error) { - Log.showInfo(TAG, `queryAbility, queryAbilityByWant error: ${JSON.stringify(error)}`); + Log.showError(TAG, `queryAbility, queryAbilityByWant error: ${JSON.stringify(error)}`); } let extensionAbilitys = []; try { @@ -79,28 +79,28 @@ export async function queryAbility(action: string, userId: number, bundleName?: userId ); } catch (error) { - Log.showInfo(TAG, `queryAbility, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); + Log.showError(TAG, `queryAbility, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); } - Log.showInfo(TAG, `queryAbility, end`); + Log.showDebug(TAG, `queryAbility, end`); let rets = [...abilitys, ...extensionAbilitys]; - Log.showInfo(TAG, `queryAbility, rets: ${JSON.stringify(rets)}`); + Log.showDebug(TAG, `queryAbility, rets: ${JSON.stringify(rets)}`); return rets; } let abilitys = []; try { abilitys = await bundleManager.queryAbilityByWant({ action: action }, DEFAULT_BUNDLE_FLAG, userId); } catch (error) { - Log.showInfo(TAG, `queryAbility, queryAbilityByWant error: ${JSON.stringify(error)}`); + Log.showError(TAG, `queryAbility, queryAbilityByWant error: ${JSON.stringify(error)}`); } let extensionAbilitys = []; try { extensionAbilitys = await bundleManager.queryExtensionAbilityInfos({ action: action }, EXTENSIONTYPE, DEFAULT_BUNDLE_FLAG, userId); } catch (error) { - Log.showInfo(TAG, `queryAbility, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); + Log.showError(TAG, `queryAbility, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); } - Log.showInfo(TAG, `queryAbility, end`); + Log.showDebug(TAG, `queryAbility, end`); let rets = [...abilitys, ...extensionAbilitys]; - Log.showInfo(TAG, `queryAbility, rets: ${JSON.stringify(rets)}`); + Log.showDebug(TAG, `queryAbility, rets: ${JSON.stringify(rets)}`); return rets; } diff --git a/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts index 424e43d2..504d43c7 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts @@ -23,7 +23,7 @@ const TAG = "DataAbilitySourceLoader"; export default class DataAbilitySourceLoader extends SourceLoader { constructor(config: LoaderConfigInfo) { super(config); - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } clearData(): void {} diff --git a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts index 5a4944a4..3ec5f2fe 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts @@ -30,7 +30,7 @@ export default class MetaSourceLoader extends SourceLoader { super(config); this.mPluginFilter = config.action; this.mPermission = config.permission; - Log.showInfo(TAG, `init loader, mPluginFilter: ${this.mPluginFilter}, mPermission: ${this.mPermission}`); + Log.showDebug(TAG, `init loader, mPluginFilter: ${this.mPluginFilter}, mPermission: ${this.mPermission}`); } onAbilityAdd(abilityInfo: AbilityInfoWithId): void { @@ -42,7 +42,7 @@ export default class MetaSourceLoader extends SourceLoader { } this.mItemDatas.push(itemData); this.addItem(itemData); - Log.showInfo(TAG, `item[${itemData.id}] add success, name: ${abilityInfo.name}`); + Log.showDebug(TAG, `item[${itemData.id}] add success, name: ${abilityInfo.name}`); return; } Log.showDebug(TAG, `Can't filter ${abilityInfo.name}.`); diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts index bec6e183..99188008 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts @@ -28,7 +28,7 @@ export default abstract class SourceLoader { mChannel: LoaderChannel | undefined; constructor(config: LoaderConfigInfo) { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } public setChannel(channel: LoaderChannel) { diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts b/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts index 8487bdad..e0e5c577 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts @@ -32,7 +32,7 @@ export default class SourceLoaderFactory { mChannel: LoaderChannel; constructor(channel: LoaderChannel) { - Log.showInfo(TAG, `constructor, channel: ${channel}`); + Log.showDebug(TAG, `constructor, channel: ${channel}`); this.mChannel = channel; } diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/template/SimpleToggleBase.ets index cc035858..dfde3076 100644 --- a/common/src/main/ets/template/SimpleToggleBase.ets +++ b/common/src/main/ets/template/SimpleToggleBase.ets @@ -39,13 +39,11 @@ export default struct SimpleToggleBase { @State style: any = StyleConfiguration.getSimpleToggleBaseStyle() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, mToggleId: ${this.mToggleId}`) - Log.showInfo(TAG, `aboutToAppear, mLabel: ${JSON.stringify(this.mLabel)}`) - Log.showInfo(TAG, `aboutToAppear, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode}`) + Log.showDebug(TAG, `aboutToAppear, mToggleId: ${this.mToggleId}, mLabel: ${JSON.stringify(this.mLabel)}, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode} `) } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear') + Log.showDebug(TAG, 'aboutToDisappear') } build() { @@ -112,7 +110,7 @@ export default struct SimpleToggleBase { if (this.mDragMode) { return } - Log.showInfo(TAG, `onIconItemClick`) + Log.showDebug(TAG, `onIconItemClick`) if (this.mClickEvent) { this.mClickEvent() } @@ -122,7 +120,7 @@ export default struct SimpleToggleBase { if (this.mEditMode || this.mDragMode) { return } - Log.showInfo(TAG, `onIconItemLongPressGesture, event: ${JSON.stringify(event)}`) + Log.showDebug(TAG, `onIconItemLongPressGesture, event: ${JSON.stringify(event)}`) if (this.mLongClickEvent) { this.mLongClickEvent() } diff --git a/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/template/iconComponent.ets index bf118848..4dd93259 100644 --- a/common/src/main/ets/template/iconComponent.ets +++ b/common/src/main/ets/template/iconComponent.ets @@ -34,12 +34,11 @@ struct iconComponent { @State style: any = StyleConfiguration.getIconComponentStyle() aboutToAppear() { - Log.showInfo(TAG,`aboutToAppear, ${this.changeSwitch} ${JSON.stringify(this.iconOff)} ${JSON.stringify(this.iconOn)}`) - Log.showInfo(TAG,`aboutToAppear, useIconStr: ${this.useIconStr}`) + Log.showDebug(TAG,`aboutToAppear, ${this.changeSwitch} ${JSON.stringify(this.iconOff)} ${JSON.stringify(this.iconOn)} , useIconStr: ${this.useIconStr}`) } aboutToDisappear () { - Log.showInfo(TAG,'aboutToDisappear') + Log.showDebug(TAG,'aboutToDisappear') } build() { diff --git a/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/template/iconTitleBase.ets index 69385c69..02d0de93 100644 --- a/common/src/main/ets/template/iconTitleBase.ets +++ b/common/src/main/ets/template/iconTitleBase.ets @@ -40,11 +40,11 @@ struct iconBaseComponent { @State style: any = StyleConfiguration.getIconTitleBaseStyle() aboutToAppear() { - Log.showInfo(TAG,'aboutToAppear') + Log.showDebug(TAG,'aboutToAppear') } aboutToDisappear () { - Log.showInfo(TAG,'aboutToDisappear') + Log.showDebug(TAG,'aboutToDisappear') } build() { diff --git a/entry/pc/src/main/ets/Application/AbilityStage.ts b/entry/pc/src/main/ets/Application/AbilityStage.ts index 255cde1c..ca7ef482 100644 --- a/entry/pc/src/main/ets/Application/AbilityStage.ts +++ b/entry/pc/src/main/ets/Application/AbilityStage.ts @@ -19,6 +19,6 @@ const TAG = "SystemUI_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showInfo(TAG, "onCreate") + Log.showDebug(TAG, "onCreate") } } \ No newline at end of file diff --git a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index d7065518..fa2f2e6c 100644 --- a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -46,7 +46,7 @@ var notificationPanelWant = { class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`) + Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`) initSystemUi(this.context); AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) AbilityManager.startAbility(statusBarWant) @@ -57,7 +57,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, 'onDestroy') + Log.showDebug(TAG, 'onDestroy') } } diff --git a/entry/phone/src/main/ets/Application/AbilityStage.ts b/entry/phone/src/main/ets/Application/AbilityStage.ts index 9a59509b..3baec6f7 100644 --- a/entry/phone/src/main/ets/Application/AbilityStage.ts +++ b/entry/phone/src/main/ets/Application/AbilityStage.ts @@ -19,6 +19,6 @@ const TAG = "SystemUI_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showInfo(TAG, "onCreate") + Log.showDebug(TAG, "onCreate") } } \ No newline at end of file diff --git a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 9437dcb6..29db7cb0 100644 --- a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -41,7 +41,7 @@ var dropdownPanelWant = { class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`) + Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`) initSystemUi(this.context) AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) AbilityManager.startAbility(statusBarWant) @@ -51,7 +51,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, 'onDestroy') + Log.showDebug(TAG, 'onDestroy') } } diff --git a/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts b/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts index 7c1ded02..0c8497b3 100644 --- a/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts +++ b/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "NavigationBar_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showInfo(TAG, "onCreate") + Log.showDebug(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index c19e7d0a..4ab98a0c 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -23,7 +23,7 @@ const TAG = "NavigationBar_ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); + Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, this.context) let configInfo = await NavBarConfiguration.getConfiguration(); @@ -49,7 +49,7 @@ class ServiceExtAbility extends ServiceExtension { } } AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config', configInfo) - Log.showInfo(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`) + Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`) let navigationBarRect = { left: configInfo.xCoordinate, @@ -66,7 +66,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, 'onDestroy'); + Log.showDebug(TAG, 'onDestroy'); } } diff --git a/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts b/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts index bd27aff0..0766f6ad 100644 --- a/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts +++ b/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts @@ -45,7 +45,7 @@ enum Position { */ class NavBarConfiguration { async initNavBarConfiguration() { - Log.showInfo(TAG, 'initNavBarConfiguration'); + Log.showDebug(TAG, 'initNavBarConfiguration'); minHeight = 0; let displayData = null; @@ -59,7 +59,7 @@ class NavBarConfiguration { Log.showInfo(TAG, `getDefaultDisplay maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); }) .catch((err) => { - Log.showInfo(TAG, 'getDefaultDisplay err: ' + err); + Log.showError(TAG, 'getDefaultDisplay err: ' + err); }); await new Promise((resolve) => setTimeout(resolve, 2000)); } @@ -88,11 +88,7 @@ class NavBarConfiguration { } statusShortSideLength = parseInt(statusShortSideLength) + ''; navShortSideLength = parseInt(navShortSideLength) + ''; - Log.showInfo(TAG, 'statusShortSideLength = ' + statusShortSideLength); - Log.showInfo(TAG, 'navShortSideLength = ' + navShortSideLength); - Log.showInfo(TAG, 'directionnav = ' + directionNav.direction); - Log.showInfo(TAG, 'statusbarPosition = ' + statusbarPosition); - Log.showInfo(TAG, 'NavbarPosition = ' + navbarPosition); + Log.showDebug(TAG, 'statusShortSideLength = ' + statusShortSideLength + 'navShortSideLength = ' + navShortSideLength + 'directionnav = ' + directionNav.direction + 'statusbarPosition = ' + statusbarPosition + 'NavbarPosition = ' + navbarPosition); } /** @@ -107,24 +103,24 @@ class NavBarConfiguration { if (navbarPosition == Position.TOP_POSITION || navbarPosition == Position.BOTTOM_POSITION) { showNavHorizontal = true; minHeight = parseInt(navShortSideLength); - Log.showInfo(TAG, 'TOP_POSITION = ' + 2); + Log.showDebug(TAG, 'TOP_POSITION = ' + 2); if (statusbarPosition == Position.LEFT_POSITION || statusbarPosition == Position.RIGHT_POSITION) { realWidth = parseInt(maxWidth) - parseInt(statusShortSideLength); } else { realWidth = maxWidth; } - Log.showInfo(TAG, 'TOP_POSITION = ' + 3); + Log.showDebug(TAG, 'TOP_POSITION = ' + 3); realHeight = parseInt(navShortSideLength); - Log.showInfo(TAG, 'TOP_POSITION = ' + 4); + Log.showDebug(TAG, 'TOP_POSITION = ' + 4); if (statusbarPosition == Position.LEFT_POSITION) { xCoordinate = parseInt(statusShortSideLength); } else { xCoordinate = 0; } - Log.showInfo(TAG, 'TOP_POSITION = ' + 5); + Log.showDebug(TAG, 'TOP_POSITION = ' + 5); if (navbarPosition == Position.BOTTOM_POSITION) { yCoordinate = parseInt(maxHeight) - parseInt(navShortSideLength); - Log.showInfo(TAG, 'BOTTOM_POSITION = ' + yCoordinate); + Log.showDebug(TAG, 'BOTTOM_POSITION = ' + yCoordinate); } } else if (navbarPosition == Position.LEFT_POSITION || navbarPosition == Position.RIGHT_POSITION) { showNavHorizontal = false; @@ -147,8 +143,7 @@ class NavBarConfiguration { realWidth = 0; realHeight = 0; } - Log.showInfo(TAG, `initWindowManager xCoordinate ${xCoordinate} yCoordinate ${yCoordinate}`); - Log.showInfo(TAG, `initWindowManager realWidth ${realWidth} realHeight ${realHeight}`); + Log.showDebug(TAG, `initWindowManager xCoordinate ${xCoordinate} yCoordinate ${yCoordinate}, realWidth ${realWidth} realHeight ${realHeight}`); var configuration = { maxWidth: maxWidth, maxHeight: maxHeight, diff --git a/product/default/navigationBar/src/main/ets/common/StyleManager.ts b/product/default/navigationBar/src/main/ets/common/StyleManager.ts index b5d56d67..f4f6c52a 100644 --- a/product/default/navigationBar/src/main/ets/common/StyleManager.ts +++ b/product/default/navigationBar/src/main/ets/common/StyleManager.ts @@ -28,7 +28,7 @@ export default class StyleManager { static rumMode: string = 'pad'; static setPadStyle() { - Log.showInfo(TAG, `setPadStyle`) + Log.showDebug(TAG, `setPadStyle`) let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); StyleManager.maxWidth = config.maxWidth; @@ -46,7 +46,7 @@ export default class StyleManager { } static setPhoneStyle() { - Log.showInfo(TAG, `setPhoneStyle`) + Log.showDebug(TAG, `setPhoneStyle`) let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); StyleManager.maxWidth = config.maxWidth; diff --git a/product/default/navigationBar/src/main/ets/common/utils/configReader.ts b/product/default/navigationBar/src/main/ets/common/utils/configReader.ts index ec880832..6e4b1d3b 100644 --- a/product/default/navigationBar/src/main/ets/common/utils/configReader.ts +++ b/product/default/navigationBar/src/main/ets/common/utils/configReader.ts @@ -23,7 +23,7 @@ const TAG = "ConfigReader"; export default class ConfigReader { public readLayoutConfig() { - Log.showInfo(TAG, "navigationbar ConfigReader readLayoutConfig start"); + Log.showDebug(TAG, "navigationbar ConfigReader readLayoutConfig start"); var mLayoutConfig = AppStorage.SetAndLink("navigationLayoutConfig", {}); var configObj = this.readFileToJson(DEFAULT_LAYOUT_INFO_FILE_PATH); mLayoutConfig.set(configObj) @@ -44,7 +44,7 @@ export default class ConfigReader { } public getContent(readStreamSync) { - Log.showInfo(TAG, "navigationbar ConfigReader getContent start"); + Log.showDebug(TAG, "navigationbar ConfigReader getContent start"); let buf = new ArrayBuffer(READ_DATA_SIZE); let len = readStreamSync.readSync(buf); let arr = new Uint8Array(buf) @@ -53,7 +53,7 @@ export default class ConfigReader { arr[i] = charAt } let contentBuf = String.fromCharCode.apply(null, arr) - Log.showInfo(TAG, "navigationbar ConfigReader getContent read finished " + contentBuf); + Log.showDebug(TAG, "navigationbar ConfigReader getContent read finished " + contentBuf); return contentBuf; } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/pages/index.ets b/product/default/navigationBar/src/main/ets/pages/index.ets index 9af0780c..99ab46eb 100644 --- a/product/default/navigationBar/src/main/ets/pages/index.ets +++ b/product/default/navigationBar/src/main/ets/pages/index.ets @@ -40,7 +40,7 @@ struct Index { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config') AppStorage.SetAndLink("showNavHorizontal", configInfo.showNavHorizontal) mConfigManager.initConfig() @@ -59,7 +59,7 @@ struct Index { } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showDebug(TAG, `aboutToDisAppear`) NavigationBarViewModel.getInstance().uninstall() } diff --git a/product/default/navigationBar/src/main/ets/pages/keyButton.ets b/product/default/navigationBar/src/main/ets/pages/keyButton.ets index af21119d..23a255c7 100644 --- a/product/default/navigationBar/src/main/ets/pages/keyButton.ets +++ b/product/default/navigationBar/src/main/ets/pages/keyButton.ets @@ -34,11 +34,11 @@ export default struct keyButton { @State style: any = StyleConfiguration.getKeyButtonStyle() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) } aboutToDisappear(){ - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showDebug(TAG, `aboutToDisAppear`) } build() { @@ -62,7 +62,7 @@ export default struct keyButton { } private onKeyTouch(event:TouchEvent) { - Log.showInfo(TAG, `onKeyTouch event: ${ event }`) + Log.showDebug(TAG, `onKeyTouch event: ${ event }`) let eventType = event.type; switch(eventType) { case Constants.KEY_DOWN: diff --git a/product/default/navigationBar/src/main/ets/pages/oneLayout.ets b/product/default/navigationBar/src/main/ets/pages/oneLayout.ets index 8bdf6d7c..725685fa 100644 --- a/product/default/navigationBar/src/main/ets/pages/oneLayout.ets +++ b/product/default/navigationBar/src/main/ets/pages/oneLayout.ets @@ -29,11 +29,11 @@ export default struct oneLayout { @StorageLink('minNavHeight') minNavHeight:number = 32 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) } aboutToDisappear(){ - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showDebug(TAG, `aboutToDisAppear`) } build() { diff --git a/product/default/navigationBar/src/main/ets/pages/threeLayout.ets b/product/default/navigationBar/src/main/ets/pages/threeLayout.ets index 33d72b0a..68dca13e 100644 --- a/product/default/navigationBar/src/main/ets/pages/threeLayout.ets +++ b/product/default/navigationBar/src/main/ets/pages/threeLayout.ets @@ -38,11 +38,11 @@ struct threeLayout { @StorageLink('minNavHeight') minNavHeight:number = 32 @StorageLink("showNavHorizontal") showNavHorizontal: boolean = AppStorage.SetAndLink("showNavHorizontal", false).get(); aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) } aboutToDisappear(){ - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showDebug(TAG, `aboutToDisAppear`) } build() { diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index dd99caaa..8ea52f49 100644 --- a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -54,7 +54,7 @@ export default class NavigationBarViewModel { } install?() { - Log.showInfo(TAG, `install, useCount: ${this.mUseCount}`); + Log.showDebug(TAG, `install, useCount: ${this.mUseCount}`); if (!this.mUseCount) { TintStateManager.getInstance().registerListener('navigation', this as TintStateListener); } @@ -62,7 +62,7 @@ export default class NavigationBarViewModel { } uninstall?() { - Log.showInfo(TAG, `uninstall, useCount: ${this.mUseCount}`); + Log.showDebug(TAG, `uninstall, useCount: ${this.mUseCount}`); this.mUseCount--; if (this.mUseCount) { TintStateManager.getInstance().unregisterListener('navigation'); @@ -70,12 +70,12 @@ export default class NavigationBarViewModel { } getNavigationBarComponentData?(): NavigationBarComponentData { - Log.showInfo(TAG, `getNavigationBarComponentData`) + Log.showDebug(TAG, `getNavigationBarComponentData`) return this.mNavigationBarComponentData; } onTintStateChange?(tintState: TintState) { - Log.showInfo(TAG, `onTintStateChange, tintState: ${JSON.stringify(tintState)}`) + Log.showDebug(TAG, `onTintStateChange, tintState: ${JSON.stringify(tintState)}`) if (typeof (tintState.isEnable) == 'boolean') { this.setWindowEnable(tintState.isEnable); } @@ -85,12 +85,11 @@ export default class NavigationBarViewModel { if (tintState.contentColor) { this.mNavigationBarComponentData.contentColor = tintState.contentColor; } - Log.showInfo(TAG, `onTintStateChange, backgroundColor ${this.mNavigationBarComponentData.backgroundColor}`); - Log.showInfo(TAG, `onTintStateChange, contentColor ${this.mNavigationBarComponentData.contentColor}`); + Log.showDebug(TAG, `onTintStateChange, backgroundColor ${this.mNavigationBarComponentData.backgroundColor}, contentColor ${this.mNavigationBarComponentData.contentColor}`); } setWindowEnable?(isEnable: boolean) { - Log.showInfo(TAG, `setWindowEnable, isEnable ${isEnable}`); + Log.showDebug(TAG, `setWindowEnable, isEnable ${isEnable}`); if (this.mNavigationBarComponentData.isEnable == isEnable) { return; } @@ -128,7 +127,7 @@ export default class NavigationBarViewModel { this.windowSwitches(initValue); this.registerListenForDataChanges(this.dataChangesCallback.bind(this)); } catch (e) { - Log.showInfo(TAG, `initNavigationBarStatus error: ${e.toString()}`); + Log.showError(TAG, `initNavigationBarStatus error: ${e.toString()}`); } } @@ -138,7 +137,7 @@ export default class NavigationBarViewModel { */ public dataChangesCallback(data: any) { if (data.code !== 0) { - Log.showInfo(TAG, `dataChangesCallback failed, because ${data.message}`); + Log.showError(TAG, `dataChangesCallback failed, because ${data.message}`); return; } else { let getRetValue = this.getValue(); diff --git a/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts b/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts index 788ef5b3..81e2110f 100644 --- a/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts +++ b/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "NotificationManagement_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showInfo(TAG, "onCreate") + Log.showDebug(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts index cab2e4d7..20e1f533 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts @@ -21,7 +21,7 @@ const TAG = "NotificationManagement-MainAbility" export default class MainAbility extends Ability { onCreate(want, launchParam) { - Log.showInfo(TAG, "MainAbility onCreate") + Log.showDebug(TAG, "MainAbility onCreate") globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = want; display.getDefaultDisplay().then((dis) => { AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_APP_LIST, "dis", { @@ -32,24 +32,24 @@ export default class MainAbility extends Ability { } onDestroy() { - Log.showInfo(TAG, "MainAbility onDestroy") + Log.showDebug(TAG, "MainAbility onDestroy") } onWindowStageCreate(windowStage) { - Log.showInfo(TAG, "MainAbility onWindowStageCreate") + Log.showDebug(TAG, "MainAbility onWindowStageCreate") AbilityManager.setContext(AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT, this.context) windowStage.setUIContent(this.context, "pages/notificationManagenment", null) } onWindowStageDestroy() { - Log.showInfo(TAG, "MainAbility onWindowStageDestroy") + Log.showDebug(TAG, "MainAbility onWindowStageDestroy") } onForeground() { - Log.showInfo(TAG, "MainAbility onForeground") + Log.showDebug(TAG, "MainAbility onForeground") } onBackground() { - Log.showInfo(TAG, "MainAbility onBackground") + Log.showDebug(TAG, "MainAbility onBackground") } }; diff --git a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets index 80d2b369..24234850 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets @@ -91,12 +91,12 @@ export default struct BatchSetEnable { } aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit(); } onBackPress() { - Log.showInfo(TAG, `onBackPress`) + Log.showDebug(TAG, `onBackPress`) Router.back(); } diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index cf6c59a9..e6c154de 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -260,14 +260,14 @@ export default struct NoDisturb { aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() this.mRefreshCnt++; } onBackPress() { - Log.showInfo(TAG, `onBackPress`) + Log.showDebug(TAG, `onBackPress`) Router.back(); } } @@ -325,7 +325,7 @@ struct DateDialog { .fontColor(Color.Blue) }.onClick(() => { - Log.showInfo(TAG, `confirm button of DateDialog on click`) + Log.showDebug(TAG, `confirm button of DateDialog on click`) this.controller.close(); if(this.selectedDate != '') { this.action(this.selectedDate); @@ -393,7 +393,7 @@ struct TimeDialog { .fontColor(Color.Blue) }.onClick(() => { - Log.showInfo(TAG, `confirm button of TimeDialog on click`) + Log.showDebug(TAG, `confirm button of TimeDialog on click`) this.controller.close(); if(this.selectedTime != '') { this.action(this.selectedTime); @@ -534,7 +534,7 @@ struct RepeatModeDialog { .fontColor($r("app.color.font_color_007DFF")) }.onClick(() => { - Log.showInfo(TAG, `confirm button of TimeDialog on click`) + Log.showDebug(TAG, `confirm button of TimeDialog on click`) this.controller.close(); if (this.itSelectedBefore != -1 && this.itSelectedBefore != this.selectMode){ this.action(this.selectMode); diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets index de148a55..704e873c 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets @@ -56,7 +56,7 @@ export default struct notificationManagenment { } .align(Alignment.Start) .onClick(() => { - Log.showInfo(TAG, `NoDisturbComponent on click`) + Log.showDebug(TAG, `NoDisturbComponent on click`) Router.push({ uri: 'pages/noDisturb' }); }).width(ConfigData.WH_100_100) .backgroundColor(Color.White) @@ -84,19 +84,19 @@ export default struct notificationManagenment { } aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) } aboutToDisappear(): void{ - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) } onPageShow(): void{ - Log.showInfo(TAG, `onPageShow`) + Log.showDebug(TAG, `onPageShow`) this.refreshRequest++; } onBackPress() { - Log.showInfo(TAG, `onBackPress`) + Log.showDebug(TAG, `onBackPress`) } } diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index bd0cfeb3..19e10d83 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -101,7 +101,7 @@ export default struct notificationManagenment { .margin({ top: $r('app.float.noDisturb_margin_lf') }) .align(Alignment.Start) .onClick(() => { - Log.showInfo(TAG, `NoDisturbComponent on click`) + Log.showDebug(TAG, `NoDisturbComponent on click`) Router.push({ uri: 'pages/noDisturbPre' }); }).width(ConfigData.WH_100_100) .flexShrink(0) @@ -140,7 +140,7 @@ export default struct notificationManagenment { Row() { ItemComponent({ title: $title, value: '', arrow: $arrow }) }.onClick(() => { - Log.showInfo(TAG, `BatchManagement on click`) + Log.showDebug(TAG, `BatchManagement on click`) Router.push({ uri: 'pages/batchSetEnable' }); }).width(ConfigData.WH_100_100) .flexShrink(0) @@ -176,30 +176,30 @@ export default struct notificationManagenment { } aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit(); } aboutToDisappear(): void{ - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) } onPageShow(): void{ - Log.showInfo(TAG, `onPageShow`) + Log.showDebug(TAG, `onPageShow`) this.mViewModel.RefreshNoDisturbState(); } onBackPress() { - Log.showInfo(TAG, `onBackPress`) + Log.showDebug(TAG, `onBackPress`) } switchComponentInit() { - Log.showInfo(TAG, `switchComponentInit`) + Log.showDebug(TAG, `switchComponentInit`) return Notification.isDistributedEnabled(); } switchComponentSet(params) { - Log.showInfo(TAG, `switchComponentSet`) + Log.showDebug(TAG, `switchComponentSet`) Notification.enableDistributed(params); } } diff --git a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets index 499a5d04..6afdc949 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets @@ -95,30 +95,30 @@ export default struct SetEnable { } aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) appInfo = Router.getParams(); appInfo.slotSettingUrl = 'pages/slotSetting' Notification.subscribeEnableChanged(); - Log.showInfo(TAG, `aboutToAppear end`) + Log.showDebug(TAG, `aboutToAppear end`) } aboutToDisappear(): void{ - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) Notification.unsubscribeEnableChanged(); } onBackPress() { - Log.showInfo(TAG, `onBackPress`) + Log.showDebug(TAG, `onBackPress`) Router.back(); } switchComponentInit() { - Log.showInfo(TAG, `switchComponentInit`) + Log.showDebug(TAG, `switchComponentInit`) return Notification.isNotificationEnabled({ bundle: appInfo.appBundleName, uid: appInfo.appUid }) } switchComponentSet(params) { - Log.showInfo(TAG, `switchComponentSet`) + Log.showDebug(TAG, `switchComponentSet`) Notification.enableNotification({ bundle: appInfo.appBundleName, uid: appInfo.appUid }, params); } } diff --git a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets index 27e5574d..0ed49795 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets @@ -153,29 +153,29 @@ export default struct SlotSetting { } aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) params = Router.getParams(); this.appInfo = params.appInfo; this.slotInfo = params.slotInfo } onBackPress() { - Log.showInfo(TAG, `onBackPress`) + Log.showDebug(TAG, `onBackPress`) Router.back(); } notificationEnableInit() { - Log.showInfo(TAG, `notificationEnableInit`) + Log.showDebug(TAG, `notificationEnableInit`) return Notification.isNotificationEnabled({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }) } notificationEnableSet(data) { - Log.showInfo(TAG, `notificationEnableSet data:${JSON.stringify(data)}`) + Log.showDebug(TAG, `notificationEnableSet data:${JSON.stringify(data)}`) Notification.enableNotification({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }, data); } soundEnableInit() { - Log.showInfo(TAG, `soundEnableInit`) + Log.showDebug(TAG, `soundEnableInit`) return new Promise((resolve, reject) => { let result: boolean = false; if (!!this.slotInfo.sound) { @@ -187,7 +187,7 @@ export default struct SlotSetting { } soundEnableSet(params) { - Log.showInfo(TAG, `soundEnableSet params:${JSON.stringify(params)}`) + Log.showDebug(TAG, `soundEnableSet params:${JSON.stringify(params)}`) if (params == 0) { this.slotInfo.sound = ''; this.slotInfo.level = SlotLevel.LEVEL_LOW @@ -201,7 +201,7 @@ export default struct SlotSetting { } bannerEnableInit() { - Log.showInfo(TAG, `bannerEnableInit`) + Log.showDebug(TAG, `bannerEnableInit`) return new Promise((resolve, reject) => { let result: boolean = false; if (this.slotInfo.level == SlotLevel.LEVEL_HIGH) { @@ -213,7 +213,7 @@ export default struct SlotSetting { } bannerEnableSet(params) { - Log.showInfo(TAG, `bannerEnableSet params:${JSON.stringify(params)}`) + Log.showDebug(TAG, `bannerEnableSet params:${JSON.stringify(params)}`) if (params == 0) { if (this.slotInfo.sound) { this.slotInfo.level = SlotLevel.LEVEL_DEFAULT; @@ -227,7 +227,7 @@ export default struct SlotSetting { } notificationSlotSet() { - Log.showInfo(TAG, `notificationSlotSet slotInfo:${JSON.stringify(this.slotInfo)}`) + Log.showDebug(TAG, `notificationSlotSet slotInfo:${JSON.stringify(this.slotInfo)}`) Notification.notificationSlotSet({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }, this.slotInfo); } } diff --git a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts index 42b8ad00..688c3bfb 100644 --- a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts @@ -30,26 +30,24 @@ export default class NoDisturbViewModel extends NoDisturbComponentViewModel { endTimeClue: string = '' ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); + Log.showDebug(TAG, 'ViewModelInit'); this.getNextDayLabel(); this.getNoDisturbingDate.bind(this)() } getNoDisturbingDate() { - Log.showInfo(TAG, 'getNoDisturbingDate'); + Log.showDebug(TAG, 'getNoDisturbingDate'); NoDisturbingModel.getNoDisturbingDate((data) => { Log.showInfo(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); this.repeatMode = data.type this.startTime = data.begin this.endTime = data.end - Log.showInfo(TAG, `getNoDisturbingDate this.repeatMode : ${this.repeatMode}`) - Log.showInfo(TAG, `getNoDisturbingDate this.startTime : ${this.startTime}`) - Log.showInfo(TAG, `getNoDisturbingDate this.endTime : ${this.endTime}`) + Log.showInfo(TAG, `getNoDisturbingDate this.repeatMode : ${this.repeatMode}, this.startTime : ${this.startTime}, this.endTime : ${this.endTime}`) this.setClues.bind(this)() }) } setClues() { - Log.showInfo(TAG, `setClues`) + Log.showDebug(TAG, `setClues`) if (this.repeatMode == DoNotDisturbType.TYPE_DAILY || this.repeatMode == DoNotDisturbType.TYPE_ONCE || this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { @@ -84,7 +82,7 @@ export default class NoDisturbViewModel extends NoDisturbComponentViewModel { } onStartTimeAccept(data) { - Log.showInfo(TAG, `onStartTimeAccept`) + Log.showDebug(TAG, `onStartTimeAccept`) this.startTime = data if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { let tmpDateTime = this.getDateByDateTime(this.startTime); @@ -98,7 +96,7 @@ export default class NoDisturbViewModel extends NoDisturbComponentViewModel { } onEndTimeAccept(data) { - Log.showInfo(TAG, `onEndTimeAccept`) + Log.showDebug(TAG, `onEndTimeAccept`) this.endTime = data if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { let tmpDateTime = this.getDateByDateTime(this.endTime); @@ -111,7 +109,7 @@ export default class NoDisturbViewModel extends NoDisturbComponentViewModel { } onRepeatModeAccect(data) { - Log.showInfo(TAG, `onRepeatModeAccect`) + Log.showDebug(TAG, `onRepeatModeAccect`) this.repeatMode = data; if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { let dateSource = new Date(); @@ -136,6 +134,6 @@ export default class NoDisturbViewModel extends NoDisturbComponentViewModel { } onCancel() { - Log.showInfo(TAG, `onCancel`) + Log.showDebug(TAG, `onCancel`) } } \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts index 8b46792b..57a9c642 100644 --- a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts @@ -25,7 +25,7 @@ const TAG = 'NotificationManagement-NotificationManagenmentViewModel' export default class NotificationManagenmentViewModel extends NoDisturbComponentViewModel { isPhone = false; ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); + Log.showDebug(TAG, 'ViewModelInit'); super.ViewModelInit(); this.MigrateTo(); this.judgeDeviceType(); @@ -36,16 +36,16 @@ export default class NotificationManagenmentViewModel extends NoDisturbComponent } MigrateTo() { - Log.showInfo(TAG, 'MigrateTo'); + Log.showDebug(TAG, 'MigrateTo'); //get the want let want = globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want']; - Log.showInfo(TAG, `aboutToAppear want:${JSON.stringify(want)}`) + Log.showDebug(TAG, `aboutToAppear want:${JSON.stringify(want)}`) if (!want || !want.parameters.migrateUri || !want.parameters.migrateBundle) { return; } let migrateUri = want.parameters.migrateUri; let bundleName = want.parameters.migrateBundle; - Log.showInfo(TAG, `aboutToAppear migrateUri:${migrateUri} migrateBundle:${JSON.stringify(bundleName)}`) + Log.showDebug(TAG, `aboutToAppear migrateUri:${migrateUri} migrateBundle:${JSON.stringify(bundleName)}`) let dataModel: BundleResourceModel = new BundleResourceModel() dataModel.getBundleInfo(bundleName, (bundleInfo) => { @@ -60,9 +60,9 @@ export default class NotificationManagenmentViewModel extends NoDisturbComponent } judgeDeviceType(){ - Log.showInfo(TAG, "judgeDeviceType"); + Log.showDebug(TAG, "judgeDeviceType"); let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_APP_LIST, 'dis'); - Log.showInfo(TAG, `judgeDeviceType, configInfo: ${configInfo} `); + Log.showDebug(TAG, `judgeDeviceType, configInfo: ${configInfo} `); if (configInfo.width < configInfo.height) { this.isPhone = true; } diff --git a/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts b/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts index 9fccb6e4..cd6d7e5b 100644 --- a/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts +++ b/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts @@ -20,29 +20,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "volume_AbilityStage" export default class MainAbilityStage extends AbilityStage { async onCreate() { - Log.showInfo(TAG, "onCreate") -// let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis') -// let volumeRect; -// if (configInfo.width > configInfo.height) { // Pad、PC Mode -// const realWidth = 48; -// const realHeight = 284; -// volumeRect = { -// left: configInfo.width - vp2px(16) - vp2px(realWidth), -// top: (configInfo.height - vp2px(realHeight) ) / 2, -// width: vp2px(realWidth) , -// height: vp2px(realHeight) -// } -// } else { // Phone Mode -// const realWidth = 96; -// const realHeight = 568; -// volumeRect = { -// left: configInfo.width - vp2px(32) - vp2px(realWidth), -// top: configInfo.height * 0.1, -// width: vp2px(realWidth) , -// height: vp2px(realHeight) -// } -// } -// AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'rect', volumeRect) -// WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); + Log.showDebug(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 34c537f1..0532ce4c 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -24,7 +24,7 @@ const TAG = "VolumePanel_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showInfo(TAG, "onCreate, want:" + want.abilityName); + Log.showDebug(TAG, "onCreate, want:" + want.abilityName); AbilityManager.setContext(AbilityManager.ABILITY_NAME_VOLUME_PANEL, this.context); display.getDefaultDisplay().then((dis) => { let volumeRect = { @@ -48,7 +48,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, "onDestroy"); + Log.showDebug(TAG, "onDestroy"); } } diff --git a/product/default/volumepanel/src/main/ets/common/StyleManager.ts b/product/default/volumepanel/src/main/ets/common/StyleManager.ts index 38b1f34e..d01b8454 100644 --- a/product/default/volumepanel/src/main/ets/common/StyleManager.ts +++ b/product/default/volumepanel/src/main/ets/common/StyleManager.ts @@ -25,7 +25,7 @@ export default class StyleManager { static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; static setStyle() { - Log.showInfo(TAG, `setStyle`) + Log.showDebug(TAG, `setStyle`) let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis'); StyleManager.maxWidth = config.width; diff --git a/product/default/volumepanel/src/main/ets/pages/index.ets b/product/default/volumepanel/src/main/ets/pages/index.ets index d49503cb..cb9bb8b0 100644 --- a/product/default/volumepanel/src/main/ets/pages/index.ets +++ b/product/default/volumepanel/src/main/ets/pages/index.ets @@ -28,7 +28,7 @@ const TAG = 'VolumePanel-Index' @Component struct Index { aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis') let volumeRect; if (configInfo.width > configInfo.height) { // Pad、PC Mode @@ -55,14 +55,14 @@ struct Index { setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) - Log.showInfo(TAG, `configInfo Start, configInfo ${JSON.stringify(configInfo)}`); + Log.showDebug(TAG, `configInfo Start, configInfo ${JSON.stringify(configInfo)}`); if (configInfo.width > configInfo.height) { // Pad、PC Mode StyleManager.setStyle() } } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showDebug(TAG, `aboutToDisAppear`) } build() { diff --git a/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts b/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts index a32f8d75..468e3672 100644 --- a/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "ControlPanel_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showInfo(TAG, "onCreate") + Log.showDebug(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index eb803a44..4ba04b5e 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -25,11 +25,11 @@ const TAG = "ControlPanel_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); + Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_CONTROL_PANEL, this.context); let dis = await display.getDefaultDisplay(); - Log.showInfo(TAG, `onCreate, dis: ${JSON.stringify(dis)}`); + Log.showDebug(TAG, `onCreate, dis: ${JSON.stringify(dis)}`); let rect = { left: (872 * dis.width) / 1280, top: (44 * dis.width) / 1280, @@ -43,12 +43,12 @@ class ServiceExtAbility extends ServiceExtension { height: dis.height, }); WindowManager.createWindow(this.context, WindowType.CONTROL_PANEL, rect, "pages/index").then(() => { - Log.showInfo(TAG, `createWindow success.`); + Log.showDebug(TAG, `createWindow success.`); }); } onDestroy() { - Log.showInfo(TAG, "onDestroy"); + Log.showDebug(TAG, "onDestroy"); } } diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts index 3a155700..80f395ae 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts @@ -29,7 +29,7 @@ export default class StyleManager { static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; static setStyle() { - Log.showInfo(TAG, `setStyle`) + Log.showDebug(TAG, `setStyle`) let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'dis'); StyleManager.maxWidth = dis.width; @@ -251,7 +251,7 @@ export default class StyleManager { style.editDialogBtnBgColor = '#00FFFFFF'; style.editDialogDividerColor = $r("sys.color.ohos_id_color_secondary"); style.editDialogDividerWidth = StyleManager.calcScaleSizePx(1); - Log.showInfo(TAG, `getControlEditDialogStyle`) + Log.showDebug(TAG, `getControlEditDialogStyle`) } } diff --git a/product/pc/controlpanel/src/main/ets/pages/control.ets b/product/pc/controlpanel/src/main/ets/pages/control.ets index 3418cfbc..c9048914 100644 --- a/product/pc/controlpanel/src/main/ets/pages/control.ets +++ b/product/pc/controlpanel/src/main/ets/pages/control.ets @@ -24,11 +24,11 @@ export default struct Control { private modeChangeCallback: Function aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showDebug(TAG, `aboutToDisAppear`) } build() { diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index 9474e2a7..9fda6b4c 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -69,7 +69,7 @@ struct Index { mShowAnimReady: boolean = false; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, start`) + Log.showDebug(TAG, `aboutToAppear, start`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) @@ -86,7 +86,7 @@ struct Index { StatusCoefficient.set(mHeightConfigUtils.getStatusCoefficient()); this.initWindowPolicy(); - Log.showInfo(TAG, `aboutToAppear, end`) + Log.showDebug(TAG, `aboutToAppear, end`) } onPageShow() { @@ -94,7 +94,7 @@ struct Index { } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) this.mClearCallbacks.forEach((unsubscribe) => unsubscribe()); this.mClearCallbacks.length = 0; } @@ -140,7 +140,7 @@ struct Index { } initWindowPolicy() { - Log.showInfo(TAG, `init controlcenter panel window Policy`); + Log.showDebug(TAG, `init controlcenter panel window Policy`); this.mClearCallbacks.push( EventManager.subscribe(SHOW_EVENT, () => WindowManager.showWindow(WindowType.CONTROL_PANEL)), EventManager.subscribe(HIDE_EVENT, () => this.hideWindow()), @@ -185,7 +185,7 @@ struct Index { } hideWindow() { - Log.showInfo(TAG, `hide anim start: ${JSON.stringify(this)}`); + Log.showDebug(TAG, `hide anim start: ${JSON.stringify(this)}`); this._animateTo({ ...HIDE_ANIM_CONFIG, onFinish: () => { Log.showInfo(TAG, `anim finish, hide Notification window.`); this.mBlur = 0 @@ -200,14 +200,14 @@ struct Index { } onModeChange(isEdit) { - Log.showInfo(TAG, `onModeChange, isEdit: ${isEdit}`) + Log.showDebug(TAG, `onModeChange, isEdit: ${isEdit}`) let initRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'rect') let newRect = initRect if (isEdit) { let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'dis') newRect = { ...initRect, height: StyleManager.calcScaleSize(346) } } - Log.showInfo(TAG, `onModeChange, newRect: ${JSON.stringify(newRect)}`) + Log.showDebug(TAG, `onModeChange, newRect: ${JSON.stringify(newRect)}`) this._animateTo({ duration: 300, tempo: 1.0, diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index 967798c6..6f468ba6 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -26,7 +26,7 @@ Log.showInfo(TAG, `Start.`); var sManager; parentPort.onmessage = (msg) => { - Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); + Log.showDebug(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); let data = msg.data; switch (data.action) { case Constants.INIT_CONFIG: @@ -44,7 +44,7 @@ parentPort.onmessage = (msg) => { }; function initConfig(config) { - Log.showInfo(TAG, `initConfig, config = ${JSON.stringify(config)}`); + Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); sManager = new PluginDataSourceManager({ onItemAdd: (itemData) => { Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); @@ -61,26 +61,24 @@ function initConfig(config) { } function clearAll() { - Log.showInfo(TAG, `clearAll `); + Log.showDebug(TAG, `clearAll `); sManager?.clearAll(); } function loadData(userId) { - Log.showInfo(TAG, `loadData `); + Log.showDebug(TAG, `loadData `); sManager?.loadData(userId); } parentPort.onclose = function () { - Log.showInfo(TAG, `onclose`); + Log.showDebug(TAG, `onclose`); }; parentPort.onmessageerror = function () { - Log.showInfo(TAG, `onmessageerror`); + Log.showDebug(TAG, `onmessageerror`); }; parentPort.onerror = function (data) { - Log.showInfo( - TAG, - `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + Log.showDebug(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts b/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts index 38c5cf94..175c401b 100644 --- a/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "NotificationPanel_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showInfo(TAG, "onCreate") + Log.showDebug(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index e79500ed..d23e52c4 100644 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -26,12 +26,12 @@ const TAG = "NotificationPanel_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); + Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, this.context); globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT] = want; let dis = await display.getDefaultDisplay(); - Log.showInfo(TAG, `onCreate, dis: ${JSON.stringify(dis)}`); + Log.showDebug(TAG, `onCreate, dis: ${JSON.stringify(dis)}`); let rect = { left: (834 * dis.width) / 1280, top: (44 * dis.width) / 1280, @@ -64,7 +64,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, "onDestroy"); + Log.showDebug(TAG, "onDestroy"); } } diff --git a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets index 4cc8324e..401c6fac 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets @@ -38,16 +38,16 @@ struct Index { mDefaultBannerRect: any; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) setAppBgColor('#00000000') this.mClearCallbacks = [] this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeShow', () => this.onBannerNoticeShow())) this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeHide', () => this.onBannerNoticeHide())) - Log.showInfo(TAG, `aboutToAppear End`) + Log.showDebug(TAG, `aboutToAppear End`) } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showDebug(TAG, `aboutToDisAppear`) this.mClearCallbacks.forEach((mClearCallback: Function) => { mClearCallback() mClearCallback = undefined @@ -79,7 +79,7 @@ struct Index { } onBannerNoticeShow() { - Log.showInfo(TAG, `onBannerNoticeShow start`); + Log.showDebug(TAG, `onBannerNoticeShow start`); let winInfoNotice = WindowManager.getWindowInfo(WindowType.NOTIFICATION_PANEL); let bannerDisabledFlg = false; let screenLockStatusInfo = AppStorage.Link('lockStatus'); @@ -96,7 +96,7 @@ struct Index { } WindowManager.hideWindow(WindowType.BANNER_NOTICE); if (bannerDisabledFlg) { - Log.showInfo(TAG, `onBannerNoticeShow end`); + Log.showDebug(TAG, `onBannerNoticeShow end`); return; } this.pageData = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'itemData'); @@ -107,12 +107,12 @@ struct Index { this.isExpand = false; this.mBannerNoticeCnt++; this.mLastActionTime = (new Date()).getTime(); - Log.showInfo(TAG, `onBannerNoticeShow count:` + this.mBannerNoticeCnt); - Log.showInfo(TAG, `onBannerNoticeShow pageData:${JSON.stringify(this.pageData)}`); + Log.showDebug(TAG, `onBannerNoticeShow count:` + this.mBannerNoticeCnt); + Log.showDebug(TAG, `onBannerNoticeShow pageData:${JSON.stringify(this.pageData)}`); WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); WindowManager.showWindow(WindowType.BANNER_NOTICE); - Log.showInfo(TAG, `onBannerNoticeShow end`); + Log.showDebug(TAG, `onBannerNoticeShow end`); } onBannerNoticeHide() { diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts b/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts index 873a848c..ba6ca818 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts @@ -25,7 +25,7 @@ export default class StyleManager { static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; static setStyle() { - Log.showInfo(TAG, `setStyle`) + Log.showDebug(TAG, `setStyle`) let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'dis'); StyleManager.maxWidth = dis.width; diff --git a/product/pc/notificationpanel/src/main/ets/pages/index.ets b/product/pc/notificationpanel/src/main/ets/pages/index.ets index bdbb04ac..72b9e133 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/index.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/index.ets @@ -58,22 +58,22 @@ struct Index { mShowAnimReady: boolean = false; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, start`) + Log.showDebug(TAG, `aboutToAppear, start`) setAppBgColor('#00000000') this.initWindowPolicy(); } onPageShow() { - Log.showInfo(TAG, `onPageShow`) + Log.showDebug(TAG, `onPageShow`) this.startShowAnim(); } onPageHide() { - Log.showInfo(TAG, `onPageHide`) + Log.showDebug(TAG, `onPageHide`) } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) this.mClearCallbacks.forEach((unsubscribe) => unsubscribe()); this.mClearCallbacks.length = 0; } @@ -106,7 +106,7 @@ struct Index { } initWindowPolicy() { - Log.showInfo(TAG, `init notification panel window Policy`); + Log.showDebug(TAG, `init notification panel window Policy`); this.mClearCallbacks.push( EventManager.subscribe(SHOW_EVENT, () => WindowManager.showWindow(WindowType.NOTIFICATION_PANEL)), EventManager.subscribe(HIDE_EVENT, () => this.hideWindow()), @@ -151,7 +151,7 @@ struct Index { } hideWindow() { - Log.showInfo(TAG, `hide anim start`); + Log.showDebug(TAG, `hide anim start`); this._animateTo({ ...HIDE_ANIM_CONFIG, onFinish: () => { Log.showInfo(TAG, `anim finish, hide Notification window, view: ${JSON.stringify(this)}`); this.mBlur = 0 diff --git a/product/pc/notificationpanel/src/main/ets/pages/notification.ets b/product/pc/notificationpanel/src/main/ets/pages/notification.ets index cccb68e6..ec89afc6 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/notification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/notification.ets @@ -34,7 +34,7 @@ export default struct Notification { @StorageLink('notificationList') notificationList: any[] = [] aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) } build() { @@ -61,11 +61,11 @@ export default struct Notification { @Component struct CenterTitle { aboutToAppear() { - Log.showInfo(TAG, `CenterTitle, aboutToAppear`) + Log.showDebug(TAG, `CenterTitle, aboutToAppear`) } aboutToDisappear() { - Log.showInfo(TAG, `CenterTitle, aboutToDisappear`) + Log.showDebug(TAG, `CenterTitle, aboutToDisappear`) } build() { @@ -97,7 +97,7 @@ struct CenterTitle { } settingClick() { - Log.showInfo(TAG, ` settingClick `) + Log.showDebug(TAG, ` settingClick `) EventManager.publish(obtainStartAbility('com.ohos.systemui', 'com.ohos.systemui.notificationmanagement.MainAbility')) } } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts b/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts index 4d550466..1fd2be01 100644 --- a/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "StatusBar_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showInfo(TAG, "onCreate") + Log.showDebug(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 85516462..afd337ad 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -23,7 +23,7 @@ const TAG = "StatusBar_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); + Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context); let configInfo = await StatusBarConfiguration.getConfiguration(); @@ -41,7 +41,7 @@ class ServiceExtAbility extends ServiceExtension { } } AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "config", configInfo); - Log.showInfo(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); + Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); let statusBarRect = { left: configInfo.xCoordinate, @@ -55,7 +55,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, "onDestroy"); + Log.showDebug(TAG, "onDestroy"); } } diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts index b8788c7b..79c61e9a 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -35,7 +35,7 @@ export default class StyleManager { static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; static setStyle() { - Log.showInfo(TAG, `setStyle`) + Log.showDebug(TAG, `setStyle`) let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); StyleManager.maxWidth = config.maxWidth; diff --git a/product/pc/statusbar/src/main/ets/pages/index.ets b/product/pc/statusbar/src/main/ets/pages/index.ets index 1d73180a..c0382536 100644 --- a/product/pc/statusbar/src/main/ets/pages/index.ets +++ b/product/pc/statusbar/src/main/ets/pages/index.ets @@ -38,7 +38,7 @@ struct Index { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, start`); + Log.showDebug(TAG, `aboutToAppear, start`); let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config') let statusBarData: StatusBarData = new StatusBarData(); @@ -68,11 +68,11 @@ struct Index { let signalObserved = AppStorage.SetAndLink("signalObserved", false); signalObserved.set(false); - Log.showInfo(TAG, `aboutToAppear, end`); + Log.showDebug(TAG, `aboutToAppear, end`); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`); + Log.showDebug(TAG, `aboutToDisappear`); } build() { diff --git a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 967798c6..4b409798 100644 --- a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -44,7 +44,7 @@ parentPort.onmessage = (msg) => { }; function initConfig(config) { - Log.showInfo(TAG, `initConfig, config = ${JSON.stringify(config)}`); + Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); sManager = new PluginDataSourceManager({ onItemAdd: (itemData) => { Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); @@ -61,26 +61,24 @@ function initConfig(config) { } function clearAll() { - Log.showInfo(TAG, `clearAll `); + Log.showDebug(TAG, `clearAll `); sManager?.clearAll(); } function loadData(userId) { - Log.showInfo(TAG, `loadData `); + Log.showDebug(TAG, `loadData `); sManager?.loadData(userId); } parentPort.onclose = function () { - Log.showInfo(TAG, `onclose`); + Log.showDebug(TAG, `onclose`); }; parentPort.onmessageerror = function () { - Log.showInfo(TAG, `onmessageerror`); + Log.showDebug(TAG, `onmessageerror`); }; parentPort.onerror = function (data) { - Log.showInfo( - TAG, - `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + Log.showDebug(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts b/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts index 20bb96f4..2325b1e3 100644 --- a/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts +++ b/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "DropdownPanel_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showInfo(TAG, "onCreate") + Log.showDebug(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 4f3189cc..8da7203f 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -24,7 +24,7 @@ const TAG = "DropdownPanel_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); + Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, this.context); globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT] = want; @@ -57,7 +57,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, "onDestroy"); + Log.showDebug(TAG, "onDestroy"); } } diff --git a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets index b00451fb..6bbc8bb1 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets @@ -38,16 +38,16 @@ struct Index { mDefaultBannerRect: any; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) setAppBgColor('#00000000') this.mClearCallbacks = [] this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeShow', () => this.onBannerNoticeShow())) this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeHide', () => this.onBannerNoticeHide())) - Log.showInfo(TAG, `aboutToAppear End`) + Log.showDebug(TAG, `aboutToAppear End`) } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showDebug(TAG, `aboutToDisAppear`) this.mClearCallbacks.forEach((mClearCallback: Function) => { mClearCallback() mClearCallback = undefined @@ -78,7 +78,7 @@ struct Index { } onBannerNoticeShow() { - Log.showInfo(TAG, `onBannerNoticeShow start`); + Log.showDebug(TAG, `onBannerNoticeShow start`); let windowInfoDrop = WindowManager.getWindowInfo(WindowType.DROPDOWN_PANEL); let bannerDisabledFlg = false; let screenLockStatusInfo = AppStorage.Link('lockStatus'); @@ -95,7 +95,7 @@ struct Index { } WindowManager.hideWindow(WindowType.BANNER_NOTICE); if (bannerDisabledFlg) { - Log.showInfo(TAG, `onBannerNoticeShow end`); + Log.showDebug(TAG, `onBannerNoticeShow end`); return; } this.pageData = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'itemData'); @@ -106,12 +106,12 @@ struct Index { this.isExpand = false; this.mBannerNoticeCnt++; this.mLastActionTime = (new Date()).getTime(); - Log.showInfo(TAG, `onBannerNoticeShow count:` + this.mBannerNoticeCnt); - Log.showInfo(TAG, `onBannerNoticeShow pageData:${JSON.stringify(this.pageData)}`); + Log.showDebug(TAG, `onBannerNoticeShow count:` + this.mBannerNoticeCnt); + Log.showDebug(TAG, `onBannerNoticeShow pageData:${JSON.stringify(this.pageData)}`); WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); WindowManager.showWindow(WindowType.BANNER_NOTICE); - Log.showInfo(TAG, `onBannerNoticeShow end`); + Log.showDebug(TAG, `onBannerNoticeShow end`); } onBannerNoticeHide() { diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts index b24043c3..ebc7c4a5 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts @@ -31,7 +31,7 @@ export default class StyleManager { static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; static setStyle() { - Log.showInfo(TAG, `setStyle`) + Log.showDebug(TAG, `setStyle`) let rect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect'); StyleManager.maxWidth = rect.width; @@ -248,7 +248,7 @@ export default class StyleManager { style.editDialogBtnBgColor = '#00FFFFFF'; style.editDialogDividerColor = $r("sys.color.ohos_id_color_secondary"); style.editDialogDividerWidth = StyleManager.calcScaleSizePx(1); - Log.showInfo(TAG, `getControlEditDialogStyle`) + Log.showDebug(TAG, `getControlEditDialogStyle`) } } diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts index c2a99a61..7d50b704 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts @@ -28,7 +28,7 @@ export class navigationEvent { mCallback: any; registerCallback(callback) { - Log.showInfo(TAG, 'registerCallback'); + Log.showDebug(TAG, 'registerCallback'); this.mCallback = callback; if (commonEventSubscriber == null) { commonEvent.createSubscriber( @@ -39,7 +39,7 @@ export class navigationEvent { } createCapsuleSubscriberCallBack(err, data) { - Log.showInfo(TAG, `createCapsuleSubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + Log.showDebug(TAG, `createCapsuleSubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); commonEventSubscriber = data; commonEvent.subscribe(data, (err, data) => { Log.showInfo(TAG, `subscribe err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); diff --git a/product/phone/dropdownpanel/src/main/ets/pages/control.ets b/product/phone/dropdownpanel/src/main/ets/pages/control.ets index eaeb9e43..3c6f6992 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/control.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/control.ets @@ -37,11 +37,11 @@ export default struct Control { @State style: any = StyleConfiguration.getControlStyle() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showDebug(TAG, `aboutToDisAppear`) } build() { @@ -72,7 +72,7 @@ export default struct Control { } controlTouch(event: TouchEvent) { - Log.showInfo(TAG, `controlTouch================ event: ${event}`) + Log.showDebug(TAG, `controlTouch================ event: ${event}`) if (event.type == Constants.TOUCHTYPE_DOWN) { this.startX = event.touches[0].screenX this.startY = event.touches[0].screenY @@ -91,7 +91,7 @@ export default struct Control { } controlCenterTouchMoveCallback(data) { - Log.showInfo(TAG, `controlCenterTouchMoveCallback data: ${JSON.stringify(data)}`) + Log.showDebug(TAG, `controlCenterTouchMoveCallback data: ${JSON.stringify(data)}`) data['touchComponent'] = 'control' if (this.touchMoveCallback) { this.touchMoveCallback(data) diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index e4214b69..9e7acf56 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -83,7 +83,7 @@ struct Index { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, start`) + Log.showDebug(TAG, `aboutToAppear, start`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) @@ -94,10 +94,10 @@ struct Index { this.urivar = settings.getUriSync(this.settingDataKey); this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), CommonConstants.URI_VAR); this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); - Log.showInfo(TAG, `getValueSync componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`) + Log.showDebug(TAG, `getValueSync componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`) this.helper.on("dataChange", this.urivar, (data) => { if (data.code !== 0) { - Log.showInfo(TAG, `dataChangesCallback failed, because ${data.message}`); + Log.showError(TAG, `dataChangesCallback failed, because ${data.message}`); return; } else { this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); @@ -130,11 +130,11 @@ struct Index { NavigationEvent.registerCallback(this.mCallback); MultimodalInputManager.registerControlListener(this.mCallback); MultimodalInputManager.registerNotificationListener(this.mCallback); - Log.showInfo(TAG, `aboutToAppear, end`) + Log.showDebug(TAG, `aboutToAppear, end`) } onPageShow() { - Log.showInfo(TAG, `onPageShow, start`) + Log.showDebug(TAG, `onPageShow, start`) if (!this.showComponentName) { return } @@ -148,7 +148,7 @@ struct Index { } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) this.mClearCallbacks.forEach((mClearCallback: Function) => { mClearCallback() mClearCallback = undefined @@ -157,7 +157,7 @@ struct Index { } resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect) { - Log.showInfo(TAG, `resizeDropdownPanelAndNavigationBar, dropdownRect: ${JSON.stringify(dropdownRect)} navigationBarRect: ${JSON.stringify(navigationBarRect)}`) + Log.showDebug(TAG, `resizeDropdownPanelAndNavigationBar, dropdownRect: ${JSON.stringify(dropdownRect)} navigationBarRect: ${JSON.stringify(navigationBarRect)}`) this.mNavigationBarStatusDefaultValue = settings.getValueSync(this.helper, this.settingDataKey, '1'); this.componentOptAreaHeightPX = this.mNavigationBarStatusDefaultValue == '1' ? dropdownRect.height - navigationBarRect.realHeight : dropdownRect.height; this.navigationBarWidth = this.mNavigationBarStatusDefaultValue == '1' ? navigationBarRect.height : 0; @@ -166,52 +166,52 @@ struct Index { } onNotificationShowOrHide(err, data) { - Log.showInfo(TAG, `mNotificationAsyncCallback preKeys: ${data.preKeys}, finalKey: ${data.finalKey}`); - Log.showInfo(TAG, `this.showComponentName: ${this.showComponentName}`); + Log.showDebug(TAG, `mNotificationAsyncCallback preKeys: ${data.preKeys}, finalKey: ${data.finalKey}`); + Log.showDebug(TAG, `this.showComponentName: ${this.showComponentName}`); if (this.showComponentName == 'Notification') { this.hideSelf(); } else { this.showSelf('Notification'); } - Log.showInfo(TAG, `mNotificationAsyncCallback end`); + Log.showDebug(TAG, `mNotificationAsyncCallback end`); } onControlShowOrHide(err, data) { - Log.showInfo(TAG, `mControlAsyncCallback preKeys: ${data.preKeys}, finalKey: ${data.finalKey}`); - Log.showInfo(TAG, `this.showComponentName: ${this.showComponentName}`); + Log.showDebug(TAG, `mControlAsyncCallback preKeys: ${data.preKeys}, finalKey: ${data.finalKey}`); + Log.showDebug(TAG, `this.showComponentName: ${this.showComponentName}`); if (this.showComponentName == 'ControlCenter') { this.hideSelf(); } else { this.showSelf('ControlCenter'); } - Log.showInfo(TAG, `mControlAsyncCallback end`); + Log.showDebug(TAG, `mControlAsyncCallback end`); } onStateChange(data) { - Log.showInfo(TAG, `onStateChange, data: ${JSON.stringify(data)}`) - Log.showInfo(TAG, `onStateChange, showComponentName: ${this.showComponentName}`) + Log.showDebug(TAG, `onStateChange, data: ${JSON.stringify(data)}`) + Log.showDebug(TAG, `onStateChange, showComponentName: ${this.showComponentName}`) if (this.showComponentName) { this.hideSelf() } } onDropdownEvent(args) { - Log.showInfo(TAG, `onDropdownEvent, args: ${JSON.stringify(args)}`) + Log.showDebug(TAG, `onDropdownEvent, args: ${JSON.stringify(args)}`) this.showSelf(args.dropdownArea == 'left' ? 'Notification' : 'ControlCenter') } onStartAbility(args) { - Log.showInfo(TAG, `onStartAbility, args: ${args}`) + Log.showDebug(TAG, `onStartAbility, args: ${args}`) this.hideSelf() } onHideNotificationWindowEvent(args) { - Log.showInfo(TAG, `onHideNotificationWindowEvent, args: ${args}`) + Log.showDebug(TAG, `onHideNotificationWindowEvent, args: ${args}`) this.hideSelf() } onTouchMove(data) { - Log.showInfo(TAG, `onTouchMove, data: ${JSON.stringify(data)}`) + Log.showDebug(TAG, `onTouchMove, data: ${JSON.stringify(data)}`) if (data.direction == 'top') { this.hideSelf() } else if (data.direction == 'left' && data.touchComponent == 'notification') { @@ -222,7 +222,7 @@ struct Index { } switchNotificationOrControlCenter(showComponentName) { - Log.showInfo(TAG, `switchNotificationOrControlCenter, showComponentName: ${showComponentName}`) + Log.showDebug(TAG, `switchNotificationOrControlCenter, showComponentName: ${showComponentName}`) this.mNotificationInsert = { type: TransitionType.Insert, opacity: 0, translate: { x: (-this.mWidthPx) + 'px' } } this.mControlCenterInsert = { type: TransitionType.Insert, opacity: 0, translate: { x: (this.mWidthPx) + 'px' } } let transitionDelete = { @@ -240,14 +240,14 @@ struct Index { } showSelf(showComponentName) { - Log.showInfo(TAG, `showSelf, showComponentName: ${showComponentName}`) + Log.showDebug(TAG, `showSelf, showComponentName: ${showComponentName}`) this.showComponentName = showComponentName this.updateBackground() WindowManager.showWindow(WindowType.DROPDOWN_PANEL) } hideSelf() { - Log.showInfo(TAG, `hideSelf`) + Log.showDebug(TAG, `hideSelf`) this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { Log.showInfo(TAG, `hideSelf, hide anim finish.`); this.showComponentName = undefined @@ -262,7 +262,7 @@ struct Index { updateBackground() { let rect = WindowManager.getWindowInfo(WindowType.DROPDOWN_PANEL)?.rect; - Log.showInfo(TAG, `start get snapShot, rect: ${JSON.stringify(rect)}`) + Log.showDebug(TAG, `start get snapShot, rect: ${JSON.stringify(rect)}`) screenshot.save({ screenRect: rect }) .then((snapImage) => { Log.showInfo(TAG, `get snap: ${JSON.stringify(snapImage)}`) @@ -271,7 +271,7 @@ struct Index { } _animateTo(config, callback) { - Log.showInfo(TAG, `_animateTo, config: ${JSON.stringify(config)}`) + Log.showDebug(TAG, `_animateTo, config: ${JSON.stringify(config)}`) animateTo(config, callback) setTimeout(config.onFinish, config.duration + config.delay) } diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 3447619b..b5c9b525 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -48,7 +48,7 @@ export default struct Notification { @StorageLink('notificationList') notificationList: any[] = [] aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) } build() { @@ -114,7 +114,7 @@ export default struct Notification { } CenterTitleTouchMoveCallback(data) { - Log.showInfo(TAG, `CenterTitleTouchMoveCallback, data: ${JSON.stringify(data)}`) + Log.showDebug(TAG, `CenterTitleTouchMoveCallback, data: ${JSON.stringify(data)}`) data['touchComponent'] = 'notification' if (this.touchMoveCallback) { this.touchMoveCallback(data) @@ -158,7 +158,7 @@ struct CenterTitle { unSubscriber?: unsubscribe; aboutToAppear() { - Log.showInfo(TAG, `CenterTitle, aboutToAppear`) + Log.showDebug(TAG, `CenterTitle, aboutToAppear`) this.unSubscriber = EventManager.subscribe(TIME_CHANGE_EVENT, (args: TimeEventArgs) => { this.updateTimeString(args.date) }); @@ -166,7 +166,7 @@ struct CenterTitle { } aboutToDisappear() { - Log.showInfo(TAG, 'CenterTitle aboutToDisappear'); + Log.showDebug(TAG, 'CenterTitle aboutToDisappear'); this.unSubscriber && this.unSubscriber(); this.unSubscriber = undefined; } @@ -204,7 +204,7 @@ struct CenterTitle { } settingClick() { - Log.showInfo(TAG, ` settingClick `) + Log.showDebug(TAG, ` settingClick `) EventManager.publish(obtainStartAbility('com.ohos.systemui', 'com.ohos.systemui.notificationmanagement.MainAbility')) } diff --git a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js index 967798c6..4b409798 100644 --- a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -44,7 +44,7 @@ parentPort.onmessage = (msg) => { }; function initConfig(config) { - Log.showInfo(TAG, `initConfig, config = ${JSON.stringify(config)}`); + Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); sManager = new PluginDataSourceManager({ onItemAdd: (itemData) => { Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); @@ -61,26 +61,24 @@ function initConfig(config) { } function clearAll() { - Log.showInfo(TAG, `clearAll `); + Log.showDebug(TAG, `clearAll `); sManager?.clearAll(); } function loadData(userId) { - Log.showInfo(TAG, `loadData `); + Log.showDebug(TAG, `loadData `); sManager?.loadData(userId); } parentPort.onclose = function () { - Log.showInfo(TAG, `onclose`); + Log.showDebug(TAG, `onclose`); }; parentPort.onmessageerror = function () { - Log.showInfo(TAG, `onmessageerror`); + Log.showDebug(TAG, `onmessageerror`); }; parentPort.onerror = function (data) { - Log.showInfo( - TAG, - `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + Log.showDebug(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts b/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts index 9164e500..ee06c984 100644 --- a/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts +++ b/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' const TAG = "StatusBar_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showInfo(TAG, "onCreate") + Log.showDebug(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 5bca6b57..62674ecd 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -23,12 +23,12 @@ const TAG = "StatusBar_ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); + Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context) let configInfo = await StatusBarConfiguration.getConfiguration(); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo) - Log.showInfo(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`) + Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`) let statusBarRect = { left: configInfo.xCoordinate, @@ -42,7 +42,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showInfo(TAG, 'onDestroy'); + Log.showDebug(TAG, 'onDestroy'); } } diff --git a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts index 52c4f840..e6eda3e6 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -25,7 +25,7 @@ export default class StyleManager { static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; static setStyle() { - Log.showInfo(TAG, `setStyle`) + Log.showDebug(TAG, `setStyle`) let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); StyleManager.maxWidth = config.maxWidth; diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index 1d24c94a..4d0f3938 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -50,7 +50,7 @@ struct Index { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, start`); + Log.showDebug(TAG, `aboutToAppear, start`); let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config') let statusBarData: StatusBarData = new StatusBarData(); @@ -83,11 +83,11 @@ struct Index { let signalObserved = AppStorage.SetAndLink("signalObserved", false); signalObserved.set(false); - Log.showInfo(TAG, `aboutToAppear, end`); + Log.showDebug(TAG, `aboutToAppear, end`); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`); + Log.showDebug(TAG, `aboutToDisappear`); this.mClearCallback && this.mClearCallback() this.mClearCallback = undefined } @@ -112,7 +112,7 @@ struct Index { } touchEvent(event: TouchEvent) { - Log.showInfo(TAG, 'touchEvent================' + event.touches) + Log.showDebug(TAG, 'touchEvent================' + event.touches) if (event.type == Constants.TOUCHTYPE_DOWN) { //down this.startX = event.touches[0].screenX this.startY = event.touches[0].screenY @@ -130,7 +130,7 @@ struct Index { } onDropdown() { - Log.showInfo(TAG, `onDropdown`) + Log.showDebug(TAG, `onDropdown`) if (!this.mStatusBarData.showHorizontal || !this.mStatusBarData.ableToMaximize) { return } @@ -154,7 +154,7 @@ struct Index { } onWindowShowHideEvent(args) { - Log.showInfo(TAG, `onWindowShowHideEvent, args: ${JSON.stringify(args)}`) + Log.showDebug(TAG, `onWindowShowHideEvent, args: ${JSON.stringify(args)}`) if (args.windowName == WindowType.DROPDOWN_PANEL) { if (args.isShow) { WindowManager.hideWindow(WindowType.STATUS_BAR) diff --git a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 967798c6..4b409798 100644 --- a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -44,7 +44,7 @@ parentPort.onmessage = (msg) => { }; function initConfig(config) { - Log.showInfo(TAG, `initConfig, config = ${JSON.stringify(config)}`); + Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); sManager = new PluginDataSourceManager({ onItemAdd: (itemData) => { Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); @@ -61,26 +61,24 @@ function initConfig(config) { } function clearAll() { - Log.showInfo(TAG, `clearAll `); + Log.showDebug(TAG, `clearAll `); sManager?.clearAll(); } function loadData(userId) { - Log.showInfo(TAG, `loadData `); + Log.showDebug(TAG, `loadData `); sManager?.loadData(userId); } parentPort.onclose = function () { - Log.showInfo(TAG, `onclose`); + Log.showDebug(TAG, `onclose`); }; parentPort.onmessageerror = function () { - Log.showInfo(TAG, `onmessageerror`); + Log.showDebug(TAG, `onmessageerror`); }; parentPort.onerror = function (data) { - Log.showInfo( - TAG, - `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + Log.showDebug(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file -- Gitee From b7069ad85166dd8675efb17efc725af3b47330aa Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Mon, 23 May 2022 10:46:51 +0800 Subject: [PATCH 094/373] log rectification Signed-off-by: xuchangzhou --- .../ets/default/pages/airplaneComponent.ets | 6 +- .../ets/com/ohos/model/AutoRotateService.ts | 20 +++--- ...lCenterSimpleToggleAutoRotateComponent.ets | 4 +- .../ets/com/ohos/viewmodel/AutoRotateVM.ts | 8 +-- .../src/main/ets/default/batteryModel.ts | 8 +-- .../main/ets/default/viewmodel/BatteryVM.ts | 2 +- .../ets/com/ohos/model/BluetoothService.ts | 8 +-- ...lCenterComplexToggleBluetoothComponent.ets | 2 +- .../ets/com/ohos/viewmodel/BluetoothVM.ts | 4 +- .../src/main/ets/default/brightnessManager.ts | 14 ++--- .../main/ets/default/model/CapsuleModel.ts | 8 +-- .../main/ets/default/pages/CapsuleIcon.ets | 6 +- .../ets/default/viewmodel/CapsuleViewModel.ts | 8 +-- .../src/main/ets/default/viewmodel/ClockVM.ts | 2 +- .../com/ohos/model/ControlCenterService.ts | 62 +++++++++---------- .../com/ohos/pages/ComplexToggleComponent.ets | 8 +-- .../com/ohos/pages/ControlCenterComponent.ets | 12 ++-- .../com/ohos/pages/SimpleToggleComponent.ets | 8 +-- .../ohos/pages/SimpleToggleLayoutEditGrid.ets | 38 ++++++------ .../src/main/ets/com/ohos/pages/UpTitle.ets | 8 +-- .../ets/com/ohos/viewmodel/ControlCenterVM.ts | 24 +++---- .../ets/com/ohos/model/LocationService.ts | 14 ++--- ...rolCenterSimpleToggleLocationComponent.ets | 4 +- .../main/ets/com/ohos/viewmodel/LocationVM.ts | 6 +- 24 files changed, 142 insertions(+), 142 deletions(-) diff --git a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets index e39897f2..dcea3168 100644 --- a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets +++ b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets @@ -44,15 +44,15 @@ struct airplaneComponent { Log.showDebug(TAG, `flyModelStatus:${this.flyModelStatus}`); if (this.flyModelStatus == true) { this.mWifiOriginalStatus = wifi.isWifiActive(); - Log.showInfo(TAG, `airplane status is opening, WLAN Original Status :${this.mWifiOriginalStatus}`); + Log.showDebug(TAG, `airplane status is opening, WLAN Original Status :${this.mWifiOriginalStatus}`); wifi.disableWifi(); }else{ if(this.mWifiOriginalStatus == true) { wifi.enableWifi(); - Log.showInfo(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},get system interface, set WLAN status enableWifi`); + Log.showDebug(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},get system interface, set WLAN status enableWifi`); } else { wifi.disableWifi(); - Log.showInfo(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},,get system interface, set WLAN status disableWifi`); + Log.showDebug(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},,get system interface, set WLAN status disableWifi`); }; }; } diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts index 0a40e003..25722f4e 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -29,7 +29,7 @@ export class AutoRotateService { registerListener(listener: { 'updateAutoRotateSwitchStatus': Function, }) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`); + Log.showDebug(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; } @@ -37,13 +37,13 @@ export class AutoRotateService { if (this.mIsStart) { return; } - Log.showInfo(TAG, `startService`); + Log.showDebug(TAG, `startService`); this.mIsStart = true; this.asyncStartService(); } async asyncStartService(): Promise { - Log.showInfo(TAG, `asyncStartService`); + Log.showDebug(TAG, `asyncStartService`); this.getOrientation(); screen.on('change', this.onOrientationChange.bind(this)); } @@ -52,31 +52,31 @@ export class AutoRotateService { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `stopService`); + Log.showDebug(TAG, `stopService`); this.mIsStart = false; this.asyncStopService(); } async asyncStopService(): Promise { - Log.showInfo(TAG, `asyncStopService`); + Log.showDebug(TAG, `asyncStopService`); screen.off('change', (value: number) => { - Log.showInfo(TAG, `asyncStopService, off change value: ${value}`); + Log.showDebug(TAG, `asyncStopService, off change value: ${value}`); }); } onOrientationChange(value: number): void{ - Log.showInfo(TAG, `onOrientationChange, value: ${value}`); + Log.showDebug(TAG, `onOrientationChange, value: ${value}`); this.getOrientation(); } async getOrientation(): Promise { - Log.showInfo(TAG, `getOrientation`); + Log.showDebug(TAG, `getOrientation`); let mScreen = await this.getScreen(); this.updateAutoRotateSwitchStatus(mScreen.orientation); } async changeSwitch(status: boolean): Promise { - Log.showInfo(TAG, `changeSwitch, status: ${status}`); + Log.showDebug(TAG, `changeSwitch, status: ${status}`); let newOrientation = status ? 5 : 0; let mScreen = await this.getScreen(); let ret = await mScreen.setOrientation(newOrientation); @@ -93,7 +93,7 @@ export class AutoRotateService { } async getScreen(): Promise { - Log.showInfo(TAG, `getScreen`); + Log.showDebug(TAG, `getScreen`); let screens = await screen.getAllScreen(); return screens[0]; } diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets b/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets index 544b1a71..0ae24369 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets +++ b/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets @@ -39,7 +39,7 @@ export default struct ControlCenterSimpleToggleAutoRotateComponent { } onAutoRotateDataChange(propName: string): void { - Log.showInfo(TAG, `onAutoRotateDataChange, propName: ${propName}`); + Log.showDebug(TAG, `onAutoRotateDataChange, propName: ${propName}`); this.mIcon = this.mAutoRotateData.switchStatus ? $r("app.media.ic_controlcenter_auto_rotate_on") : $r("app.media.ic_controlcenter_auto_rotate_off"); } @@ -56,7 +56,7 @@ export default struct ControlCenterSimpleToggleAutoRotateComponent { } mClickEvent() { - Log.showInfo(TAG, `mClickEvent, status: ${this.mAutoRotateData.switchStatus}`); + Log.showDebug(TAG, `mClickEvent, status: ${this.mAutoRotateData.switchStatus}`); let newStatus = !this.mAutoRotateData.switchStatus; ViewModel.processAutoRotateSwitchStatusChange(newStatus); } diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts index 61c251dc..9b037b76 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts @@ -26,24 +26,24 @@ export class AutoRotateVM { }; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); this.mAutoRotateData = AppStorage.SetAndLink(TAG + '_AutoRotateData', this.mAutoRotateData).get(); AutoRotateService.registerListener(this); AutoRotateService.startService(); } getAutoRotateData(): AutoRotateData { - Log.showInfo(TAG, `getAutoRotateData`); + Log.showDebug(TAG, `getAutoRotateData`); return this.mAutoRotateData; } updateAutoRotateSwitchStatus(status: boolean): void{ - Log.showInfo(TAG, `updateAutoRotateSwitchStatus, status: ${status}`); + Log.showDebug(TAG, `updateAutoRotateSwitchStatus, status: ${status}`); this.mAutoRotateData.switchStatus = status; } processAutoRotateSwitchStatusChange(status: boolean): void{ - Log.showInfo(TAG, `processAutoRotateSwitchStatusChange, status: ${status}`); + Log.showDebug(TAG, `processAutoRotateSwitchStatusChange, status: ${status}`); AutoRotateService.changeSwitch(status); } } diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts index 132c5bcb..a86e2638 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -58,7 +58,7 @@ export class BatteryModel { () => this.updateBatteryStatus(), (isSubscribe: boolean) => isSubscribe && this.updateBatteryStatus() ); - Log.showInfo(TAG, "initBatteryModel"); + Log.showDebug(TAG, "initBatteryModel"); this.mBatterySoc = AppStorage.SetAndLink("batterySoc", 0); this.mBatteryCharging = AppStorage.SetAndLink("batteryCharging", false); this.mManager.subscriberCommonEvent(); @@ -66,7 +66,7 @@ export class BatteryModel { } unInitBatteryModel() { - Log.showInfo(TAG, "unInitBatteryModel"); + Log.showDebug(TAG, "unInitBatteryModel"); this.mManager?.release(); this.mManager = undefined; } @@ -75,7 +75,7 @@ export class BatteryModel { * Get battery status and remaining power */ private updateBatteryStatus() { - Log.showInfo(TAG, "updateBatteryStatus"); + Log.showDebug(TAG, "updateBatteryStatus"); let batterySoc = BatteryInfo.batterySOC ?? DEFAULT_PROGRESS; let batteryCharging = BatteryInfo.chargingStatus; if (batterySoc <= 0) { @@ -83,7 +83,7 @@ export class BatteryModel { batterySoc = Math.abs(batterySoc) * Constants.PERCENT_NUMBER; } - Log.showInfo(TAG, "batterySoc = " + batterySoc); + Log.showDebug(TAG, "batterySoc = " + batterySoc); // Set the battery status as charging when there is no battery hardware this.mBatterySoc.set(batterySoc); diff --git a/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts b/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts index afafaada..ff87c012 100644 --- a/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts +++ b/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts @@ -24,7 +24,7 @@ export class BatteryVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.BATTERY); constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } getTintContentInfo(): TintContentInfo { diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts index 56d1e0a1..89cbe641 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -31,7 +31,7 @@ export class BluetoothService { mIsBluetoothOpen: boolean = false; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } startService() { @@ -48,14 +48,14 @@ export class BluetoothService { this.mListener?.updateState(this.mIsBluetoothOpen); } }); - Log.showInfo(TAG, `startService, mIsBluetoothOpen: ${this.mIsBluetoothOpen}`); + Log.showDebug(TAG, `startService, mIsBluetoothOpen: ${this.mIsBluetoothOpen}`); } stopService() { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `stopService`); + Log.showDebug(TAG, `stopService`); this.mIsStart = false; bluetooth.off('stateChange'); } @@ -63,7 +63,7 @@ export class BluetoothService { registerListener(listener: { 'updateState': Function }) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`); + Log.showDebug(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; this.mListener.updateState(this.mIsBluetoothOpen); } diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets index 8da994c6..b7201eeb 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets @@ -63,7 +63,7 @@ export default struct ControlCenterComplexToggleBluetoothComponent { } mLongClickEvent() { - Log.showInfo(TAG, `mLongClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`); + Log.showDebug(TAG, `mLongClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`); EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.BluetoothAbility')); } } \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts index b29b3463..72ba2f2c 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts @@ -30,14 +30,14 @@ export class BluetoothVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.BLUETOOTH); constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } initViewModel() { if (this.mIsStart) { return; } - Log.showInfo(TAG, `initViewModel `) + Log.showDebug(TAG, `initViewModel `) this.mIsStart = true; this.mBluetoothOpenStatus = AppStorage.SetAndLink(BluetoothOpenStatusKey, false); BluetoothService.startService(); diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index 4e807fbb..cd0dd755 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -31,9 +31,9 @@ export class brightnessManager { SLIDER_CHANG_MODE_MOVING = 1; init(): void{ - Log.showInfo(TAG, 'init'); + Log.showDebug(TAG, 'init'); this.uri = settings.getUriSync(SYSTEMUI_BRIGHTNESS); - Log.showInfo(TAG, 'settings geturi of brightness is ' + this.uri); + Log.showDebug(TAG, 'settings geturi of brightness is ' + this.uri); this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), CommonConstants.URI_VAR); this.getValue(); } @@ -41,33 +41,33 @@ export class brightnessManager { registerBrightness() { this.helper.on("dataChange", this.uri, (err) => { let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '100'); - Log.showInfo(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); + Log.showDebug(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); }) } unRegisterBrightness() { this.helper.off("dataChange", this.uri, (err) => { - Log.showInfo(TAG, `unregister brightness helper`); + Log.showDebug(TAG, `unregister brightness helper`); }) } getValue() { Log.showInfo(TAG, 'getValue'); let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '100'); - Log.showInfo(TAG, `settings getValue ${parseInt(data)}`); + Log.showDebug(TAG, `settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); } setValue(callback, sliderChangeMode:number) { let value = parseInt(callback.value); - Log.showInfo(TAG, `setValue ${value}`); + Log.showDebug(TAG, `setValue ${value}`); mBrightnessValue.set(value); if(sliderChangeMode === this.SLIDER_CHANG_MODE_MOVING){ Brightness.setValue(callback.value); }else{ settings.setValueSync(this.helper, SYSTEMUI_BRIGHTNESS, callback.value.toString()); - Log.showInfo(TAG, `settings setValue ${callback.value} end`); + Log.showDebug(TAG, `settings setValue ${callback.value} end`); } } } diff --git a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts index 07111997..0b9125cb 100644 --- a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts +++ b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts @@ -27,7 +27,7 @@ export class CapsuleModel { mCallback: any; registerCallback(callback) { - Log.showInfo(TAG, 'registerCallback'); + Log.showDebug(TAG, 'registerCallback'); this.mCallback = callback; if (commonEventSubscriber == null) { commonEvent.createSubscriber( @@ -40,11 +40,11 @@ export class CapsuleModel { createCapsuleSubscriberCallBack(err, data) { commonEventSubscriber = data; commonEvent.subscribe(commonEventSubscriber, (err, data) => { - Log.showInfo(TAG, `createCapsuleSubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + Log.showDebug(TAG, `createCapsuleSubscriberCallBack err: ${err.code}`); if (err.code == 0) { const processingData = JSON.parse(data.data); if (processingData) { - Log.showInfo(TAG, `createCapsuleSubscriberCallBack processingData: ${JSON.stringify(processingData)} `); + Log.showDebug(TAG, `createCapsuleSubscriberCallBack processingData: ${JSON.stringify(processingData)} `); this.mCallback.onStateChange(processingData); } } else { @@ -56,7 +56,7 @@ export class CapsuleModel { unregisterCallback() { if (commonEventSubscriber != null) { commonEvent.unsubscribe(commonEventSubscriber, () => { - Log.showInfo(TAG, 'Subscriberregister unregister Capsule Status Listener ==============='); + Log.showDebug(TAG, 'Subscriberregister unregister Capsule Status Listener ==============='); }); } } diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index 15b5f55c..82407aff 100644 --- a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -70,18 +70,18 @@ export default struct CapsuleIcon { } touchEvent(event: TouchEvent) { - Log.showInfo(TAG, `touchEventtouchEventtouchEvent`); + Log.showDebug(TAG, `touchEventtouchEventtouchEvent`); if (event.type == Constants.TOUCH_TYPE_DOWN) { this.startX = event.touches[0].screenX; this.startY = event.touches[0].screenY; this.moveX = 0; this.moveY = 0; - Log.showInfo(TAG, `touchStart2=======startX: ${this.startX}, startY: ${this.startY}`); + Log.showDebug(TAG, `touchStart2=======startX: ${this.startX}, startY: ${this.startY}`); } else if (event.type == Constants.TOUCH_TYPE_MOVE) { this.moveX = event.touches[0].screenX - this.startX; this.moveY = event.touches[0].screenY - this.startY; } else if (event.type == Constants.TOUCH_TYPE_UP) { - Log.showInfo(TAG, `touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`); + Log.showDebug(TAG, `touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`); if (this.moveX < 5 && this.moveX > -5 && this.moveY < 5 && this.moveY > -5) { event.stopPropagation(); this.mCapsuleViewModel.onClickEvent(); diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts index d59fda32..b5a4e2b2 100644 --- a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts +++ b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts @@ -64,7 +64,7 @@ export default class CapsuleViewModel { } async onStateChange(data) { - Log.showInfo(TAG, `onStateChange, data: ${JSON.stringify(data)}`); + Log.showDebug(TAG, `onStateChange, data: ${JSON.stringify(data)}`); this.mIsBackground = data.isBackground; this.mWantBundleName = data.wantBundleName; this.mWantAbilityName = data.wantAbilityName; @@ -97,7 +97,7 @@ export default class CapsuleViewModel { this.mStartTime = 0; this.mIsBackground = false; this.mText = ""; - Log.showInfo(TAG, `cannot show`); + Log.showDebug(TAG, `cannot show`); } else { this.mStartTime = 0; this.mText =await ResourceUtil.getString($r("app.string.communicate_by_phone")); @@ -123,8 +123,8 @@ export default class CapsuleViewModel { if (this.mIsBackground) { this.mIsBackground = false; } - Log.showInfo(TAG, `onClickEvent `); - Log.showInfo(TAG, `startAbility`); + Log.showDebug(TAG, `onClickEvent `); + Log.showDebug(TAG, `startAbility`); AbilityManager.startAbility({ bundleName: this.mWantBundleName, abilityName: this.mWantAbilityName diff --git a/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts b/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts index 63ccd124..963fb381 100644 --- a/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts +++ b/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts @@ -24,7 +24,7 @@ export class ClockVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.CLOCK); constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } getTintContentInfo(): TintContentInfo { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index 6542d805..d4ad1e51 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -64,14 +64,14 @@ export class ControlCenterService { mSimpleToggleLayout: string[]; constructor() { - Log.showInfo(TAG, `constructor`) + Log.showDebug(TAG, `constructor`) } startService(config): void { if (this.mIsStart) { return; } - Log.showInfo(TAG, `start ControlCenterService.`); + Log.showDebug(TAG, `start ControlCenterService.`); this.mIsStart = true; this.parseConfig(config); @@ -85,13 +85,13 @@ export class ControlCenterService { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `stop ControlCenterService.`); + Log.showDebug(TAG, `stop ControlCenterService.`); this.mIsStart = false; this.mAdapter.clearAll(); } parseConfig(config): void { - Log.showInfo(TAG, `parseConfig, config: ${JSON.stringify(config)}`); + Log.showDebug(TAG, `parseConfig, config: ${JSON.stringify(config)}`); this.mConfig = config; this.mComplexToggleLayoutTemplate = []; @@ -99,25 +99,25 @@ export class ControlCenterService { this.mComplexToggleLayoutTemplate.push(name); }); this.loadSimpleToggleLayoutTemplate(); - Log.showInfo(TAG, + Log.showDebug(TAG, `parseConfig, ComplexToggleLayoutTemplate: ${JSON.stringify(this.mComplexToggleLayoutTemplate)}`); - Log.showInfo(TAG, + Log.showDebug(TAG, `parseConfig, SimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); config.LocalToggles.ComplexToggles.forEach((name) => { this.mAllComplexToggles.push(name); }); - Log.showInfo(TAG, `parseConfig, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); + Log.showDebug(TAG, `parseConfig, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); this.calcComplexToggleLayout(); config.LocalToggles.SimpleToggles.forEach((name) => { this.mAllSimpleToggles.push(name); }); - Log.showInfo(TAG, `parseConfig, allSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); + Log.showDebug(TAG, `parseConfig, allSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); this.calcSimpleToggleLayout(); } loadSimpleToggleLayoutTemplate(): void{ - Log.showInfo(TAG, `loadSimpleToggleLayoutTemplate`); + Log.showDebug(TAG, `loadSimpleToggleLayoutTemplate`); this.mSimpleToggleLayoutTemplate = []; let simpleToggleLayout = this.getSimpleToggleLayoutFromSettings(); Log.showDebug(TAG, `simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); @@ -129,11 +129,11 @@ export class ControlCenterService { }); this.setSimpleToggleLayoutToSettings(this.mSimpleToggleLayoutTemplate); } - Log.showInfo(TAG, `loadSimpleToggleLayoutTemplate, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); + Log.showDebug(TAG, `loadSimpleToggleLayoutTemplate, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); } calcComplexToggleLayout(): void { - Log.showInfo(TAG, `calcComplexToggleLayout`); + Log.showDebug(TAG, `calcComplexToggleLayout`); let complexToggleLayout: string[] = []; this.mComplexToggleLayoutTemplate.forEach((name) => { @@ -142,13 +142,13 @@ export class ControlCenterService { } }); - Log.showInfo(TAG, `calcComplexToggleLayout, complexToggleLayout: ${JSON.stringify(complexToggleLayout)}`); + Log.showDebug(TAG, `calcComplexToggleLayout, complexToggleLayout: ${JSON.stringify(complexToggleLayout)}`); this.mComplexToggleLayout = complexToggleLayout; this.mListener?.setComplexToggleLayout(complexToggleLayout); } calcSimpleToggleLayout(): void { - Log.showInfo(TAG, `calcSimpleToggleLayout`); + Log.showDebug(TAG, `calcSimpleToggleLayout`); let simpleToggleLayout: string[] = []; this.mSimpleToggleLayoutTemplate.forEach((name) => { @@ -157,7 +157,7 @@ export class ControlCenterService { } }); - Log.showInfo(TAG, `calcSimpleToggleLayout, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); + Log.showDebug(TAG, `calcSimpleToggleLayout, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); this.mSimpleToggleLayout = simpleToggleLayout; this.mListener?.setSimpleToggleLayout(simpleToggleLayout); } @@ -168,12 +168,12 @@ export class ControlCenterService { } registerListener(listener: ControlCenterListener) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`); + Log.showDebug(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; } initFinish() { - Log.showInfo(TAG, `initFinish`); + Log.showDebug(TAG, `initFinish`); SwitchUserManager.getInstance() .getCurrentUserInfo() .then((userInfo) => { @@ -182,89 +182,89 @@ export class ControlCenterService { } onItemAdd(itemData: ItemComponentData): void { - Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); + Log.showDebug(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); let controlData: ControlComponentData = parseData(itemData); let id: string = controlData.id; this.mListener?.setItemData(id, controlData); if (controlData.toggleType == Constants.TOGGLE_TYPE_COMPLEX) { if (this.mAllComplexToggles.indexOf(id) < 0) { this.mAllComplexToggles.push(id); - Log.showInfo(TAG, `onItemAdd, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); + Log.showDebug(TAG, `onItemAdd, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); this.calcComplexToggleLayout(); } } else { if (this.mAllSimpleToggles.indexOf(id) < 0) { this.mAllSimpleToggles.push(id); - Log.showInfo(TAG, `onItemAdd, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); + Log.showDebug(TAG, `onItemAdd, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); this.calcSimpleToggleLayout(); } } } onItemRemove(itemData: ItemComponentData): void { - Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); + Log.showDebug(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); let id: string = itemData.id; if (this.mAllComplexToggles.indexOf(id) >= 0) { this.mAllComplexToggles.splice(this.mAllComplexToggles.indexOf(id), 1); - Log.showInfo(TAG, `onItemRemove, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); + Log.showDebug(TAG, `onItemRemove, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); this.calcComplexToggleLayout(); } else if (this.mAllSimpleToggles.indexOf(id) >= 0) { this.mAllSimpleToggles.splice(this.mAllSimpleToggles.indexOf(id), 1); - Log.showInfo(TAG, `onItemRemove, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); + Log.showDebug(TAG, `onItemRemove, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); this.calcSimpleToggleLayout(); } this.mListener?.setItemData(id, undefined); } getSimpleToggleLayoutFromSettings(): string[] { - Log.showInfo(TAG, `getSimpleToggleLayoutFromSettings`); + Log.showDebug(TAG, `getSimpleToggleLayoutFromSettings`); let value = SettingsUtil.getValue(SETTINGS_CONTROL_SIMPLE_TOGGLE_LAYOUT); let simpleToggleLayout: string[] = null; if (!CheckEmptyUtils.isEmpty(value)) { simpleToggleLayout = JSON.parse(value); } - Log.showInfo(TAG, `getSimpleToggleLayoutFromSettings, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); + Log.showDebug(TAG, `getSimpleToggleLayoutFromSettings, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); return simpleToggleLayout; } setSimpleToggleLayoutToSettings(simpleToggleLayout: string[]): void { - Log.showInfo(TAG, `setSimpleToggleLayoutToSettings, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); + Log.showDebug(TAG, `setSimpleToggleLayoutToSettings, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); let value: string = JSON.stringify(simpleToggleLayout); SettingsUtil.setValue(SETTINGS_CONTROL_SIMPLE_TOGGLE_LAYOUT, value); } getHidingSimpleToggles(): string[] { - Log.showInfo(TAG, `getHidingSimpleToggles`); + Log.showDebug(TAG, `getHidingSimpleToggles`); let hidingSimpleToggles: string[] = []; this.mAllSimpleToggles.forEach((toggleName) => { if (this.mSimpleToggleLayout.indexOf(toggleName) < 0) { hidingSimpleToggles.push(toggleName); } }); - Log.showInfo(TAG, `getHidingSimpleToggles, hidingSimpleToggles: ${JSON.stringify(hidingSimpleToggles)}`); + Log.showDebug(TAG, `getHidingSimpleToggles, hidingSimpleToggles: ${JSON.stringify(hidingSimpleToggles)}`); return hidingSimpleToggles; } getDefaultSimpleToggleLayout(): string[] { - Log.showInfo(TAG, `getDefaultSimpleToggleLayout`); + Log.showDebug(TAG, `getDefaultSimpleToggleLayout`); let defaultToggles: string[] = []; this.mConfig.DefaultSimpleToggleLayout.forEach((toggleName) => { if (this.mAllSimpleToggles.indexOf(toggleName) >= 0) { defaultToggles.push(toggleName); } }); - Log.showInfo(TAG, `getDefaultSimpleToggleLayout, defaultToggles: ${JSON.stringify(defaultToggles)}`); + Log.showDebug(TAG, `getDefaultSimpleToggleLayout, defaultToggles: ${JSON.stringify(defaultToggles)}`); return defaultToggles; } saveSimpleToggleLayout(layout: string[]): void{ - Log.showInfo(TAG, `saveSimpleToggleLayout, layout: ${JSON.stringify(layout)}`); + Log.showDebug(TAG, `saveSimpleToggleLayout, layout: ${JSON.stringify(layout)}`); this.setSimpleToggleLayoutToSettings(layout); this.mSimpleToggleLayoutTemplate = []; layout.forEach((name) => { this.mSimpleToggleLayoutTemplate.push(name); }); - Log.showInfo(TAG, `saveSimpleToggleLayout, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); + Log.showDebug(TAG, `saveSimpleToggleLayout, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); this.calcSimpleToggleLayout(); } } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets index db6b826d..dcaa5274 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets @@ -37,9 +37,9 @@ export default struct ComplexToggleComponent { } linkItemData() { - Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`); + Log.showDebug(TAG, `linkItemData, keyId: ${this.keyId}`); this.mItemData = AppStorage.Link('ControlCenter_' + this.keyId); - Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${this.mItemData.get().iconUrl}`); + Log.showDebug(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${this.mItemData.get().iconUrl}`); } build() { @@ -63,14 +63,14 @@ export default struct ComplexToggleComponent { } onIconItemClick() { - Log.showInfo(TAG, `onIconItemClick`); + Log.showDebug(TAG, `onIconItemClick`); if (this.mItemData.get()?.actionData?.clickAction) { EventManager.publish(this.mItemData.get().actionData.clickAction); } } onIconItemLongPressGesture() { - Log.showInfo(TAG, `onIconItemLongPressGesture`); + Log.showDebug(TAG, `onIconItemLongPressGesture`); if (this.mItemData.get()?.actionData?.longClickAction) { EventManager.publish(this.mItemData.get().actionData.longClickAction); } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index 02a94ccd..a7025724 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -203,12 +203,12 @@ struct ControlCenterComplexToggleLayout { } calcGridHeight(rowCount, rowHeight, rowGap) { - Log.showInfo(TAG_ControlCenterComplexToggleLayout, `calcGridHeight, rowCount: ${rowCount} rowHeight: ${rowHeight} rowGap: ${rowGap}`); + Log.showDebug(TAG_ControlCenterComplexToggleLayout, `calcGridHeight, rowCount: ${rowCount} rowHeight: ${rowHeight} rowGap: ${rowGap}`); let height = rowCount * rowHeight + (rowCount - 1) * rowGap; if (height < 0) { height = 0 }; - Log.showInfo(TAG_ControlCenterComplexToggleLayout, `calcGridHeight, height: ${height}`); + Log.showDebug(TAG_ControlCenterComplexToggleLayout, `calcGridHeight, height: ${height}`); return height + 'px'; } @@ -264,17 +264,17 @@ struct ControlCenterSimpleToggleLayout { } calcGridHeight(rowCount, rowHeight, rowGap) { - Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `calcGridHeight, rowCount: ${rowCount} rowHeight: ${rowHeight} rowGap: ${rowGap}`); + Log.showDebug(TAG_ControlCenterSimpleToggleLayout, `calcGridHeight, rowCount: ${rowCount} rowHeight: ${rowHeight} rowGap: ${rowGap}`); let height = rowCount * rowHeight + (rowCount - 1) * rowGap; if (height < 0) { height = 0; } - Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `calcGridHeight, height: ${height}`); + Log.showDebug(TAG_ControlCenterSimpleToggleLayout, `calcGridHeight, height: ${height}`); return height + 'px'; } generateColumnsTemplate(columnCount) { - Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `generateColumnsTemplate, columnCount: ${columnCount}`); + Log.showDebug(TAG_ControlCenterSimpleToggleLayout, `generateColumnsTemplate, columnCount: ${columnCount}`); let columnsTemplate = '1fr'; for (let i = 1;i < columnCount; i++) { columnsTemplate += ' 1fr'; @@ -283,7 +283,7 @@ struct ControlCenterSimpleToggleLayout { } generateRowsTemplate(rowCount) { - Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `generateRowsTemplate, rowCount: ${rowCount}`); + Log.showDebug(TAG_ControlCenterSimpleToggleLayout, `generateRowsTemplate, rowCount: ${rowCount}`); let rowsTemplate = '1fr'; for (let i = 1;i < rowCount; i++) { rowsTemplate += ' 1fr'; diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index 45a18df0..614a797b 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -39,9 +39,9 @@ export default struct SimpleToggleComponent { } linkItemData() { - Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`); + Log.showDebug(TAG, `linkItemData, keyId: ${this.keyId}`); this.mItemData = AppStorage.Link('ControlCenter_' + this.keyId); - Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${this.mItemData.get().iconUrl}`); + Log.showDebug(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${this.mItemData.get().iconUrl}`); } build() { @@ -65,14 +65,14 @@ export default struct SimpleToggleComponent { } onIconItemClick() { - Log.showInfo(TAG, `onIconItemClick`); + Log.showDebug(TAG, `onIconItemClick`); if (this.mItemData.get()?.actionData?.clickAction) { EventManager.publish(this.mItemData.get().actionData.clickAction); }; } onIconItemLongPressGesture() { - Log.showInfo(TAG, `onIconItemLongPressGesture`); + Log.showDebug(TAG, `onIconItemLongPressGesture`); if (this.mItemData.get()?.actionData?.longClickAction) { EventManager.publish(this.mItemData.get().actionData.longClickAction); }; diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets index 4043997f..17d7b5e5 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets @@ -51,7 +51,7 @@ export default struct SimpleToggleLayoutEditGrid { } aboutToDisappear() { - Log.showInfo(this.logTag, 'aboutToDisappear '); + Log.showDebug(this.logTag, 'aboutToDisappear '); } build() { @@ -94,58 +94,58 @@ export default struct SimpleToggleLayoutEditGrid { } calcColumnsTemplate(columnCount: number): string{ - Log.showInfo(this.logTag, `calcColumnsTemplate, columnCount: ${columnCount}`); + Log.showDebug(this.logTag, `calcColumnsTemplate, columnCount: ${columnCount}`); let columnsTemplate = '1fr'; for (let i = 1;i < columnCount; i++) { columnsTemplate += ' 1fr'; } - Log.showInfo(this.logTag, `calcColumnsTemplate, columnsTemplate: ${columnsTemplate}`); + Log.showDebug(this.logTag, `calcColumnsTemplate, columnsTemplate: ${columnsTemplate}`); return columnsTemplate; } calcMaxRowCount(maxCount: number, columnCount: number): number{ - Log.showInfo(this.logTag, `calcMaxRowCount, maxCount: ${maxCount} columnCount: ${columnCount}`); + Log.showDebug(this.logTag, `calcMaxRowCount, maxCount: ${maxCount} columnCount: ${columnCount}`); let maxRowCount = Math.ceil(maxCount / columnCount); if (maxRowCount < 1) { maxRowCount = 1; }; - Log.showInfo(this.logTag, `calcMaxRowCount, maxRowCount: ${maxRowCount}`); + Log.showDebug(this.logTag, `calcMaxRowCount, maxRowCount: ${maxRowCount}`); return maxRowCount; } calcMinRowCount(minCount: number, columnCount: number): number{ - Log.showInfo(this.logTag, `calcMinRowCount, minCount: ${minCount} columnCount: ${columnCount}`); + Log.showDebug(this.logTag, `calcMinRowCount, minCount: ${minCount} columnCount: ${columnCount}`); let minRowCount = Math.ceil(minCount / columnCount); if (minRowCount < 1) { minRowCount = 1; } - Log.showInfo(this.logTag, `calcMinRowCount, minRowCount: ${minRowCount}`); + Log.showDebug(this.logTag, `calcMinRowCount, minRowCount: ${minRowCount}`); return minRowCount; } onItemDragEnter(event) { - Log.showInfo(this.logTag, `onItemDragEnter, event: ${JSON.stringify(event)}`); + Log.showDebug(this.logTag, `onItemDragEnter, event: ${JSON.stringify(event)}`); } onItemDragMove(event, itemIndex, insertIndex) { - Log.showInfo(this.logTag, `onItemDragMove, itemIndex: ${itemIndex} insertIndex: ${insertIndex} event: ${JSON.stringify(event)}`); + Log.showDebug(this.logTag, `onItemDragMove, itemIndex: ${itemIndex} insertIndex: ${insertIndex} event: ${JSON.stringify(event)}`); } onItemDragLeave(event, itemIndex) { - Log.showInfo(this.logTag, `onItemDragLeave, itemIndex: ${itemIndex} event: ${JSON.stringify(event)}`); + Log.showDebug(this.logTag, `onItemDragLeave, itemIndex: ${itemIndex} event: ${JSON.stringify(event)}`); } onGridItemDragStart(event, itemIndex) { - Log.showInfo(this.logTag, `onGridItemDragStart, itemIndex: ${itemIndex} event: ${JSON.stringify(event)}`); + Log.showDebug(this.logTag, `onGridItemDragStart, itemIndex: ${itemIndex} event: ${JSON.stringify(event)}`); this.mCurrentDragToggleName = this.mToggles[itemIndex]; if (this.onItemDragStart) { this.onItemDragStart(this.mCurrentDragToggleName); }; - Log.showInfo(this.logTag, `onGridItemDragStart, mCurrentDragToggleName: ${this.mCurrentDragToggleName}`); + Log.showDebug(this.logTag, `onGridItemDragStart, mCurrentDragToggleName: ${this.mCurrentDragToggleName}`); } onGridItemDrop(event, itemIndex, insertIndex, isSuccess) { - Log.showInfo(this.logTag, `onGridItemDrop, itemIndex: ${itemIndex} insertIndex: ${insertIndex} isSuccess: ${isSuccess} event: ${JSON.stringify(event)}`); + Log.showDebug(this.logTag, `onGridItemDrop, itemIndex: ${itemIndex} insertIndex: ${insertIndex} isSuccess: ${isSuccess} event: ${JSON.stringify(event)}`); if (!isSuccess) { this.callOnItemDrop('fail'); return; @@ -157,10 +157,10 @@ export default struct SimpleToggleLayoutEditGrid { let status = 'success'; let currentDragToggleName = this.mCurrentDragToggleName; let globalDragToggleName = this.mGlobalDragToggleName; - Log.showInfo(this.logTag, `onItemDrop, currentDragToggleName: ${currentDragToggleName}`); - Log.showInfo(this.logTag, `onItemDrop, globalDragToggleName: ${globalDragToggleName}`); + Log.showDebug(this.logTag, `onItemDrop, currentDragToggleName: ${currentDragToggleName}`); + Log.showDebug(this.logTag, `onItemDrop, globalDragToggleName: ${globalDragToggleName}`); if (itemIndex >= 0 && insertIndex >= 0) { // move - Log.showInfo(this.logTag, `onItemDrop, move`); + Log.showDebug(this.logTag, `onItemDrop, move`); if (itemIndex > insertIndex) { this.mToggles.splice(insertIndex, 0, currentDragToggleName); this.mToggles.splice(itemIndex + 1, 1); @@ -169,7 +169,7 @@ export default struct SimpleToggleLayoutEditGrid { this.mToggles.splice(itemIndex, 1); }; } else if (itemIndex == -1 && insertIndex >= 0) { // insert - Log.showInfo(this.logTag, `onItemDrop, insert`); + Log.showDebug(this.logTag, `onItemDrop, insert`); if (this.mToggles.length < this.mMaxCount) { this.mToggles.splice(insertIndex, 0, globalDragToggleName); } else { @@ -177,7 +177,7 @@ export default struct SimpleToggleLayoutEditGrid { status = 'cancel'; }; } else if (itemIndex >= 0 && insertIndex == -1) { // delete - Log.showInfo(this.logTag, `onItemDrop, delete`); + Log.showDebug(this.logTag, `onItemDrop, delete`); if (this.mToggles.length > this.mMinCount) { this.mToggles.splice(itemIndex, 1); } else { @@ -189,7 +189,7 @@ export default struct SimpleToggleLayoutEditGrid { } callOnItemDrop(status: string): void { - Log.showInfo(this.logTag, `callOnItemDrop, status: ${status}`); + Log.showDebug(this.logTag, `callOnItemDrop, status: ${status}`); if (this.onItemDrop) { this.onItemDrop(status); }; diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets index 2c072c47..1c82988d 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets @@ -114,12 +114,12 @@ export default struct UpTitle { } settingClick() { - Log.showInfo(TAG, `settingClick`); + Log.showDebug(TAG, `settingClick`); EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.MainAbility')); } editClick() { - Log.showInfo(TAG, `editClick`); + Log.showDebug(TAG, `editClick`); if (this.simpleToggleLayoutEditStartCallback) { this.simpleToggleLayoutEditStartCallback(); }; @@ -129,12 +129,12 @@ export default struct UpTitle { if (event.type == Constants.TOUCHTYPE_DOWN) { this.startX = event.touches[0].screenX; this.startY = event.touches[0].screenY; - Log.showInfo(TAG, `quicklySetting touchStart2=======startX: ${this.startX}, startY: ${this.startY}`); + Log.showDebug(TAG, `quicklySetting touchStart2=======startX: ${this.startX}, startY: ${this.startY}`); } else if (event.type == Constants.TOUCHTYPE_MOVE) { this.moveX = event.touches[0].screenX - this.startX; this.moveY = event.touches[0].screenY - this.startY; } else if (event.type == Constants.TOUCHTYPE_UP) { - Log.showInfo(TAG, `quicklySetting touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`); + Log.showDebug(TAG, `quicklySetting touchEnd2, moveX: ${this.moveX}, moveY: ${this.moveY}`); if (this.moveX < -30) { if (this.touchMoveCallback) { this.touchMoveCallback({ 'direction': 'left' }); diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts index 695721a6..ef89103c 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts @@ -30,7 +30,7 @@ export class ControlCenterVM { mSimpleToggleLayout: any; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); this.mComplexToggleLayout = AppStorage.SetAndLink(ControlCenterComplexToggleLayoutKey, []); this.mSimpleToggleLayout = AppStorage.SetAndLink(ControlCenterSimpleToggleLayoutKey, []); ControlCenterService.registerListener(this); @@ -40,57 +40,57 @@ export class ControlCenterVM { if (this.mIsStart) { return; } - Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)} `); + Log.showDebug(TAG, `initViewModel, config: ${JSON.stringify(config)} `); this.mIsStart = true; ControlCenterService.startService(config); } setComplexToggleLayout(layout: string[]): void{ - Log.showInfo(TAG, `setComplexToggleLayout, layout: ${JSON.stringify(layout)}`); + Log.showDebug(TAG, `setComplexToggleLayout, layout: ${JSON.stringify(layout)}`); if (JSON.stringify(layout) != JSON.stringify(this.mComplexToggleLayout.get())) { this.mComplexToggleLayout.set(layout); } - Log.showInfo(TAG, `setComplexToggleLayout, mComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`); + Log.showDebug(TAG, `setComplexToggleLayout, mComplexToggleLayout: ${JSON.stringify(this.mComplexToggleLayout.get())}`); } setSimpleToggleLayout(layout: string[]): void{ - Log.showInfo(TAG, `setSimpleToggleLayout, layout: ${JSON.stringify(layout)}`); + Log.showDebug(TAG, `setSimpleToggleLayout, layout: ${JSON.stringify(layout)}`); if (JSON.stringify(layout) != JSON.stringify(this.mSimpleToggleLayout.get())) { this.mSimpleToggleLayout.set(layout); } - Log.showInfo(TAG, `setSimpleToggleLayout, mSimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`); + Log.showDebug(TAG, `setSimpleToggleLayout, mSimpleToggleLayout: ${JSON.stringify(this.mSimpleToggleLayout.get())}`); } setItemData(id: string, itemData: ControlComponentData): void{ - Log.showInfo(TAG, `setItemData, id: ${id} itemData: ${JSON.stringify(itemData)}`); + Log.showDebug(TAG, `setItemData, id: ${id} itemData: ${JSON.stringify(itemData)}`); let storageKey: string = 'ControlCenter_' + id; if (itemData) { AppStorage.SetOrCreate(storageKey, itemData); } else { let deleteRs: boolean = AppStorage.Delete(storageKey); - Log.showInfo(TAG, `setItemData, AppStorage.Delete rs: ${deleteRs} `); + Log.showDebug(TAG, `setItemData, AppStorage.Delete rs: ${deleteRs} `); } } getDisplayingSimpleToggles(): string[]{ let simpleToggles = this.mSimpleToggleLayout.get(); - Log.showInfo(TAG, `getDisplayingSimpleToggles, simpleToggles: ${JSON.stringify(simpleToggles)}`); + Log.showDebug(TAG, `getDisplayingSimpleToggles, simpleToggles: ${JSON.stringify(simpleToggles)}`); return simpleToggles; } getHidingSimpleToggles(): string[] { - Log.showInfo(TAG, `getHidingSimpleToggles`); + Log.showDebug(TAG, `getHidingSimpleToggles`); return ControlCenterService.getHidingSimpleToggles(); } getDefaultSimpleToggleLayout() { - Log.showInfo(TAG, `getDefaultSimpleToggleLayout`); + Log.showDebug(TAG, `getDefaultSimpleToggleLayout`); return ControlCenterService.getDefaultSimpleToggleLayout(); } saveSimpleToggleLayout(layout: string[]): void{ - Log.showInfo(TAG, `saveSimpleToggleLayout, layout: ${JSON.stringify(layout)}`); + Log.showDebug(TAG, `saveSimpleToggleLayout, layout: ${JSON.stringify(layout)}`); ControlCenterService.saveSimpleToggleLayout(layout); } } diff --git a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts index 6244f5f9..312f8889 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts @@ -27,11 +27,11 @@ export class LocationService { if (this.mIsStart) { return; } - Log.showInfo(TAG, `startService`); + Log.showDebug(TAG, `startService`); this.mIsStart = true; this.getServiceState(); geolocation.on('locationServiceState', (state) => { - Log.showInfo(TAG, `startService locationChange, state: ${JSON.stringify(state)}`); + Log.showDebug(TAG, `startService locationChange, state: ${JSON.stringify(state)}`); this.getServiceState(); }); } @@ -40,24 +40,24 @@ export class LocationService { if (!this.mIsStart) { return; }; - Log.showInfo(TAG, `stopService`); + Log.showDebug(TAG, `stopService`); this.mIsStart = false; geolocation.off('locationServiceState', (state) => { - Log.showInfo(TAG, `stopService locationChange, state: ${JSON.stringify(state)}`) + Log.showDebug(TAG, `stopService locationChange, state: ${JSON.stringify(state)}`) }); } registerListener(listener: { 'updateServiceState': Function, }) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`); + Log.showDebug(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; } getServiceState() { - Log.showInfo(TAG, `getServiceState`); + Log.showDebug(TAG, `getServiceState`); geolocation.isLocationEnabled().then((data) => { - Log.showInfo(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`); + Log.showDebug(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`); this.mListener?.updateServiceState(data); }); } diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets index 97f10c61..fb7f9408 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets @@ -55,7 +55,7 @@ export default struct ControlCenterSimpleToggleLocationComponent { } mClickEvent() { - Log.showInfo(TAG, `mClickEvent, isEnabled: ${this.mLocationData.isEnabled}`); + Log.showDebug(TAG, `mClickEvent, isEnabled: ${this.mLocationData.isEnabled}`); if (this.mLocationData.isEnabled) { ViewModel.disableLocation(); } else { @@ -64,7 +64,7 @@ export default struct ControlCenterSimpleToggleLocationComponent { } mLongClickEvent() { - Log.showInfo(TAG, `mLongClickEvent`); + Log.showDebug(TAG, `mLongClickEvent`); EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.MainAbility')); } } \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts index a4f427b2..b027b5f1 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts @@ -30,14 +30,14 @@ export class LocationVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.LOCATION); constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } initViewModel() { if (this.mIsStart) { return; }; - Log.showInfo(TAG, `initViewModel `); + Log.showDebug(TAG, `initViewModel `); this.mIsStart = true; this.mLocationData = AppStorage.SetAndLink(TAG + '_LocationData', this.mLocationData).get(); LocationService.registerListener(this); @@ -45,7 +45,7 @@ export class LocationVM { } getLocationData(): LocationData { - Log.showInfo(TAG, `getLocationData`); + Log.showDebug(TAG, `getLocationData`); return this.mLocationData; } -- Gitee From ba833f2215c43715843c49c95cfee06fc916e150 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Mon, 23 May 2022 11:20:42 +0800 Subject: [PATCH 095/373] log rectification Signed-off-by: xuchangzhou --- .../ets/com/ohos/model/AutoRotateService.ts | 6 ++-- .../ets/com/ohos/model/BluetoothService.ts | 4 +-- ...lCenterComplexToggleBluetoothComponent.ets | 2 +- .../src/main/ets/default/brightnessManager.ts | 4 +-- .../main/ets/default/model/CapsuleModel.ts | 8 ++--- .../ets/default/viewmodel/CapsuleViewModel.ts | 4 +-- .../src/main/ets/default/pages/clockIcon.ets | 2 +- .../com/ohos/model/ControlCenterService.ts | 4 +-- .../com/ohos/pages/ControlCenterComponent.ets | 12 +++---- .../pages/SimpleToggleLayoutEditComponent.ets | 36 +++++++++---------- .../ets/com/ohos/model/LocationService.ts | 12 +++---- 11 files changed, 47 insertions(+), 47 deletions(-) diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts index 25722f4e..4d4b6a3d 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -60,12 +60,12 @@ export class AutoRotateService { async asyncStopService(): Promise { Log.showDebug(TAG, `asyncStopService`); screen.off('change', (value: number) => { - Log.showDebug(TAG, `asyncStopService, off change value: ${value}`); + Log.showInfo(TAG, `asyncStopService, off change value: ${value}`); }); } onOrientationChange(value: number): void{ - Log.showDebug(TAG, `onOrientationChange, value: ${value}`); + Log.showInfo(TAG, `onOrientationChange, value: ${value}`); this.getOrientation(); } @@ -80,7 +80,7 @@ export class AutoRotateService { let newOrientation = status ? 5 : 0; let mScreen = await this.getScreen(); let ret = await mScreen.setOrientation(newOrientation); - Log.showInfo(TAG, `changeSwitch, ret: ${ret}`); + Log.showDebug(TAG, `changeSwitch, ret: ${ret}`); } updateAutoRotateSwitchStatus(orientation: number): void{ diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts index 89cbe641..1d24eda1 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -55,7 +55,7 @@ export class BluetoothService { if (!this.mIsStart) { return; } - Log.showDebug(TAG, `stopService`); + Log.showInfo(TAG, `stopService`); this.mIsStart = false; bluetooth.off('stateChange'); } @@ -63,7 +63,7 @@ export class BluetoothService { registerListener(listener: { 'updateState': Function }) { - Log.showDebug(TAG, `registerListener, listener: ${listener}`); + Log.showInfo(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; this.mListener.updateState(this.mIsBluetoothOpen); } diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets index b7201eeb..e345ff67 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets @@ -54,7 +54,7 @@ export default struct ControlCenterComplexToggleBluetoothComponent { } mClickEvent() { - Log.showInfo(TAG, `mClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`); + Log.showDebug(TAG, `mClickEvent, BluetoothOpenStatus: ${this.BluetoothOpenStatus}`); if (this.BluetoothOpenStatus) { ViewModel.disableBluetooth(); } else { diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index cd0dd755..3b19db5b 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -41,14 +41,14 @@ export class brightnessManager { registerBrightness() { this.helper.on("dataChange", this.uri, (err) => { let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '100'); - Log.showDebug(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); + Log.showInfo(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); }) } unRegisterBrightness() { this.helper.off("dataChange", this.uri, (err) => { - Log.showDebug(TAG, `unregister brightness helper`); + Log.showInfo(TAG, `unregister brightness helper`); }) } diff --git a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts index 0b9125cb..1b34b042 100644 --- a/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts +++ b/features/capsulecomponent/src/main/ets/default/model/CapsuleModel.ts @@ -27,7 +27,7 @@ export class CapsuleModel { mCallback: any; registerCallback(callback) { - Log.showDebug(TAG, 'registerCallback'); + Log.showInfo(TAG, 'registerCallback'); this.mCallback = callback; if (commonEventSubscriber == null) { commonEvent.createSubscriber( @@ -40,11 +40,11 @@ export class CapsuleModel { createCapsuleSubscriberCallBack(err, data) { commonEventSubscriber = data; commonEvent.subscribe(commonEventSubscriber, (err, data) => { - Log.showDebug(TAG, `createCapsuleSubscriberCallBack err: ${err.code}`); + Log.showInfo(TAG, `createCapsuleSubscriberCallBack err: ${err.code}`); if (err.code == 0) { const processingData = JSON.parse(data.data); if (processingData) { - Log.showDebug(TAG, `createCapsuleSubscriberCallBack processingData: ${JSON.stringify(processingData)} `); + Log.showInfo(TAG, `createCapsuleSubscriberCallBack processingData: ${JSON.stringify(processingData)} `); this.mCallback.onStateChange(processingData); } } else { @@ -56,7 +56,7 @@ export class CapsuleModel { unregisterCallback() { if (commonEventSubscriber != null) { commonEvent.unsubscribe(commonEventSubscriber, () => { - Log.showDebug(TAG, 'Subscriberregister unregister Capsule Status Listener ==============='); + Log.showInfo(TAG, 'Subscriberregister unregister Capsule Status Listener ==============='); }); } } diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts index b5a4e2b2..954e9819 100644 --- a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts +++ b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts @@ -64,7 +64,7 @@ export default class CapsuleViewModel { } async onStateChange(data) { - Log.showDebug(TAG, `onStateChange, data: ${JSON.stringify(data)}`); + Log.showInfo(TAG, `onStateChange, data: ${JSON.stringify(data)}`); this.mIsBackground = data.isBackground; this.mWantBundleName = data.wantBundleName; this.mWantAbilityName = data.wantAbilityName; @@ -97,7 +97,7 @@ export default class CapsuleViewModel { this.mStartTime = 0; this.mIsBackground = false; this.mText = ""; - Log.showDebug(TAG, `cannot show`); + Log.showInfo(TAG, `cannot show`); } else { this.mStartTime = 0; this.mText =await ResourceUtil.getString($r("app.string.communicate_by_phone")); diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index 85cadcaa..0c9d2e0d 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -40,7 +40,7 @@ export default struct ClockIcon { } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear'); + Log.showDebug(TAG, 'aboutToDisappear'); this.unSubscriber && this.unSubscriber(); this.unSubscriber = undefined; } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index d4ad1e51..2e84316b 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -71,7 +71,7 @@ export class ControlCenterService { if (this.mIsStart) { return; } - Log.showDebug(TAG, `start ControlCenterService.`); + Log.showInfo(TAG, `start ControlCenterService.`); this.mIsStart = true; this.parseConfig(config); @@ -85,7 +85,7 @@ export class ControlCenterService { if (!this.mIsStart) { return; } - Log.showDebug(TAG, `stop ControlCenterService.`); + Log.showInfo(TAG, `stop ControlCenterService.`); this.mIsStart = false; this.mAdapter.clearAll(); } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index a7025724..e4184ae5 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -53,7 +53,7 @@ export default struct ControlCenterComponent { } onSimpleToggleLayoutEditStart() { - Log.showInfo(TAG, 'onSimpleToggleLayoutEditStart'); + Log.showDebug(TAG, 'onSimpleToggleLayoutEditStart'); this.mDisplayingSimpleToggles = ViewModel.getDisplayingSimpleToggles(); this.mHidingSimpleToggles = ViewModel.getHidingSimpleToggles(); this.mDefaultDisplaySimpleToggles = ViewModel.getDefaultSimpleToggleLayout(); @@ -61,12 +61,12 @@ export default struct ControlCenterComponent { } onSimpleToggleLayoutEditEnd() { - Log.showInfo(TAG, 'onSimpleToggleLayoutEditEnd'); + Log.showDebug(TAG, 'onSimpleToggleLayoutEditEnd'); this.setIsEditSimpleToggleLayout(false); } setIsEditSimpleToggleLayout(isEdit: boolean): void { - Log.showInfo(TAG, `setIsEditSimpleToggleLayout, isEdit: ${isEdit}`); + Log.showDebug(TAG, `setIsEditSimpleToggleLayout, isEdit: ${isEdit}`); animateTo({ duration: 300, tempo: 1.0, @@ -81,14 +81,14 @@ export default struct ControlCenterComponent { Log.showInfo(TAG, `setIsEditSimpleToggleLayout, animateTo`); this.mIsEditSimpleToggleLayout = isEdit; }); - Log.showInfo(TAG, `this.modeChangeCallback: ${this.modeChangeCallback}`); + Log.showDebug(TAG, `this.modeChangeCallback: ${this.modeChangeCallback}`); if (this.modeChangeCallback) { this.modeChangeCallback(isEdit); } } onSaveDisplayingToggles(toggles: string[]): void { - Log.showInfo(TAG, `onSaveDisplayingToggles, toggles: ${JSON.stringify(toggles)}`); + Log.showDebug(TAG, `onSaveDisplayingToggles, toggles: ${JSON.stringify(toggles)}`); ViewModel.saveSimpleToggleLayout(toggles); } @@ -213,7 +213,7 @@ struct ControlCenterComplexToggleLayout { } generateRowsTemplate(rowCount) { - Log.showInfo(TAG_ControlCenterComplexToggleLayout, `generateRowsTemplate, rowCount: ${rowCount}`); + Log.showDebug(TAG_ControlCenterComplexToggleLayout, `generateRowsTemplate, rowCount: ${rowCount}`); let rowsTemplate = '1fr'; for (let i = 1;i < rowCount; i++) { rowsTemplate += ' 1fr' diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets index f6ddecb3..cad2db65 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets @@ -242,9 +242,9 @@ export default struct SimpleToggleLayoutEditComponent { } onSimpleToggleLayoutEditEnd() { - Log.showInfo(TAG, `onSimpleToggleLayoutEditEnd`); + Log.showDebug(TAG, `onSimpleToggleLayoutEditEnd`); let changed = JSON.stringify(this.mDisplayingToggles) != JSON.stringify(this.mNewDisplayingToggles); - Log.showInfo(TAG, `onSimpleToggleLayoutEditEnd, changed: ${changed}`); + Log.showDebug(TAG, `onSimpleToggleLayoutEditEnd, changed: ${changed}`); if (changed) { this.backDialogController.open(); } else { @@ -253,29 +253,29 @@ export default struct SimpleToggleLayoutEditComponent { } callSimpleToggleLayoutEditEnd() { - Log.showInfo(TAG, `callSimpleToggleLayoutEditEnd`); + Log.showDebug(TAG, `callSimpleToggleLayoutEditEnd`); if (this.simpleToggleLayoutEditEndCallback) { this.simpleToggleLayoutEditEndCallback(); }; } onResetBtnClick(event: ClickEvent) { - Log.showInfo(TAG, `onResetBtnClick`); + Log.showDebug(TAG, `onResetBtnClick`); let equalDefault = JSON.stringify(this.mDefaultDisplayToggles) == JSON.stringify(this.mNewDisplayingToggles); - Log.showInfo(TAG, `onResetBtnClick, equalDefault: ${equalDefault}`); + Log.showDebug(TAG, `onResetBtnClick, equalDefault: ${equalDefault}`); if (!equalDefault) { this.resetDialogController.open(); }; } editResetConfirm() { - Log.showInfo(TAG, `editResetConfirm`); + Log.showDebug(TAG, `editResetConfirm`); this.resetData(); this.callSaveDisplayingToggles(); } resetData(): void{ - Log.showInfo(TAG, `resetData`); + Log.showDebug(TAG, `resetData`); let tempDisplayingToggles: string[] = [...this.mDefaultDisplayToggles]; let tempHidingToggles: string[] = []; this.mDisplayingToggles.forEach((toggleName) => { @@ -292,14 +292,14 @@ export default struct SimpleToggleLayoutEditComponent { this.mNewHidingToggles = tempHidingToggles; this.mDisplayingToggles = [...tempDisplayingToggles]; this.mHidingToggles = [...tempHidingToggles]; - Log.showInfo(TAG, `resetData, mNewDisplayingToggles: ${JSON.stringify(this.mNewDisplayingToggles)}`); - Log.showInfo(TAG, `resetData, mNewHidingToggles: ${JSON.stringify(this.mNewHidingToggles)}`); + Log.showDebug(TAG, `resetData, mNewDisplayingToggles: ${JSON.stringify(this.mNewDisplayingToggles)}`); + Log.showDebug(TAG, `resetData, mNewHidingToggles: ${JSON.stringify(this.mNewHidingToggles)}`); } onFinishBtnClick(event: ClickEvent) { - Log.showInfo(TAG, `onFinishBtnClick`); + Log.showDebug(TAG, `onFinishBtnClick`); let changed = JSON.stringify(this.mDisplayingToggles) != JSON.stringify(this.mNewDisplayingToggles); - Log.showInfo(TAG, `onFinishBtnClick, changed: ${changed}`); + Log.showDebug(TAG, `onFinishBtnClick, changed: ${changed}`); if (changed) { this.callSaveDisplayingToggles(); } @@ -307,31 +307,31 @@ export default struct SimpleToggleLayoutEditComponent { } callSaveDisplayingToggles(): void{ - Log.showInfo(TAG, `callSaveDisplayingToggles`); + Log.showDebug(TAG, `callSaveDisplayingToggles`); if (this.onSaveDisplayingToggles) { this.onSaveDisplayingToggles(this.mNewDisplayingToggles); }; } async onDisplayingGridItemDragStart(toggleName: string): Promise { - Log.showInfo(TAG, `onDisplayingGridItemDragStart, toggleName: ${toggleName}`); + Log.showDebug(TAG, `onDisplayingGridItemDragStart, toggleName: ${toggleName}`); this.mCurrentDragToggleName = toggleName; this.setOptMsg(toggleName); } async onDisplayingGridItemDrop(status: string): Promise { - Log.showInfo(TAG, `onDisplayingGridItemDrop, status: ${status}`); + Log.showDebug(TAG, `onDisplayingGridItemDrop, status: ${status}`); this.setOptMsg(null); } async onHidingGridItemDragStart(toggleName: string): Promise { - Log.showInfo(TAG, `onHidingGridItemDragStart, toggleName: ${toggleName}`); + Log.showDebug(TAG, `onHidingGridItemDragStart, toggleName: ${toggleName}`); this.mCurrentDragToggleName = toggleName; this.setOptMsg(toggleName); } async onHidingGridItemDrop(status: string): Promise { - Log.showInfo(TAG, `onHidingGridItemDrop, status: ${status}`); + Log.showDebug(TAG, `onHidingGridItemDrop, status: ${status}`); this.setOptMsg(null); } @@ -357,7 +357,7 @@ export default struct SimpleToggleLayoutEditComponent { } onComponentTouch(event: TouchEvent) { - Log.showInfo(TAG, `onComponentTouch`); + Log.showDebug(TAG, `onComponentTouch`); event.stopPropagation(); } } @@ -398,7 +398,7 @@ struct SimpleToggleLayoutEditUpTitle { } backClick(event: ClickEvent) { - Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, `backClick, event: ${JSON.stringify(event)}`); + Log.showDebug(TAG_SimpleToggleLayoutEditUpTitle, `backClick, event: ${JSON.stringify(event)}`); this.simpleToggleLayoutEditEndCallback(); } } diff --git a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts index 312f8889..40429d13 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts @@ -27,11 +27,11 @@ export class LocationService { if (this.mIsStart) { return; } - Log.showDebug(TAG, `startService`); + Log.showInfo(TAG, `startService`); this.mIsStart = true; this.getServiceState(); geolocation.on('locationServiceState', (state) => { - Log.showDebug(TAG, `startService locationChange, state: ${JSON.stringify(state)}`); + Log.showInfo(TAG, `startService locationChange, state: ${JSON.stringify(state)}`); this.getServiceState(); }); } @@ -40,24 +40,24 @@ export class LocationService { if (!this.mIsStart) { return; }; - Log.showDebug(TAG, `stopService`); + Log.showInfo(TAG, `stopService`); this.mIsStart = false; geolocation.off('locationServiceState', (state) => { - Log.showDebug(TAG, `stopService locationChange, state: ${JSON.stringify(state)}`) + Log.showInfo(TAG, `stopService locationChange, state: ${JSON.stringify(state)}`) }); } registerListener(listener: { 'updateServiceState': Function, }) { - Log.showDebug(TAG, `registerListener, listener: ${listener}`); + Log.showInfo(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; } getServiceState() { Log.showDebug(TAG, `getServiceState`); geolocation.isLocationEnabled().then((data) => { - Log.showDebug(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`); + Log.showInfo(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`); this.mListener?.updateServiceState(data); }); } -- Gitee From 1faee69c9fb091e9118b6bb74d047ff0d6b7636e Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Mon, 23 May 2022 11:45:58 +0800 Subject: [PATCH 096/373] log rectification Signed-off-by: xuchangzhou --- .../src/main/ets/com/ohos/model/AutoRotateService.ts | 12 ++++++------ .../src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts | 2 +- .../src/main/ets/default/batteryModel.ts | 4 ++-- .../src/main/ets/com/ohos/model/BluetoothService.ts | 2 +- .../src/main/ets/default/brightnessManager.ts | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts index 4d4b6a3d..111640b1 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -29,7 +29,7 @@ export class AutoRotateService { registerListener(listener: { 'updateAutoRotateSwitchStatus': Function, }) { - Log.showDebug(TAG, `registerListener, listener: ${listener}`); + Log.showInfo(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; } @@ -37,13 +37,13 @@ export class AutoRotateService { if (this.mIsStart) { return; } - Log.showDebug(TAG, `startService`); + Log.showInfo(TAG, `startService`); this.mIsStart = true; this.asyncStartService(); } async asyncStartService(): Promise { - Log.showDebug(TAG, `asyncStartService`); + Log.showInfo(TAG, `asyncStartService`); this.getOrientation(); screen.on('change', this.onOrientationChange.bind(this)); } @@ -52,13 +52,13 @@ export class AutoRotateService { if (!this.mIsStart) { return; } - Log.showDebug(TAG, `stopService`); + Log.showInfo(TAG, `stopService`); this.mIsStart = false; this.asyncStopService(); } async asyncStopService(): Promise { - Log.showDebug(TAG, `asyncStopService`); + Log.showInfo(TAG, `asyncStopService`); screen.off('change', (value: number) => { Log.showInfo(TAG, `asyncStopService, off change value: ${value}`); }); @@ -84,7 +84,7 @@ export class AutoRotateService { } updateAutoRotateSwitchStatus(orientation: number): void{ - Log.showDebug(TAG, `updateAutoRotateSwitchStatus, orientation: ${orientation}`); + Log.showInfo(TAG, `updateAutoRotateSwitchStatus, orientation: ${orientation}`); if (orientation == 0) { this.mListener?.updateAutoRotateSwitchStatus(false); } else if (orientation == 5) { diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts index 9b037b76..781b0efc 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts @@ -38,7 +38,7 @@ export class AutoRotateVM { } updateAutoRotateSwitchStatus(status: boolean): void{ - Log.showDebug(TAG, `updateAutoRotateSwitchStatus, status: ${status}`); + Log.showInfo(TAG, `updateAutoRotateSwitchStatus, status: ${status}`); this.mAutoRotateData.switchStatus = status; } diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts index a86e2638..5775fc44 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -75,7 +75,7 @@ export class BatteryModel { * Get battery status and remaining power */ private updateBatteryStatus() { - Log.showDebug(TAG, "updateBatteryStatus"); + Log.showInfo(TAG, "updateBatteryStatus"); let batterySoc = BatteryInfo.batterySOC ?? DEFAULT_PROGRESS; let batteryCharging = BatteryInfo.chargingStatus; if (batterySoc <= 0) { @@ -83,7 +83,7 @@ export class BatteryModel { batterySoc = Math.abs(batterySoc) * Constants.PERCENT_NUMBER; } - Log.showDebug(TAG, "batterySoc = " + batterySoc); + Log.showInfo(TAG, "batterySoc = " + batterySoc); // Set the battery status as charging when there is no battery hardware this.mBatterySoc.set(batterySoc); diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts index 1d24eda1..8a70727e 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -48,7 +48,7 @@ export class BluetoothService { this.mListener?.updateState(this.mIsBluetoothOpen); } }); - Log.showDebug(TAG, `startService, mIsBluetoothOpen: ${this.mIsBluetoothOpen}`); + Log.showInfo(TAG, `startService, mIsBluetoothOpen: ${this.mIsBluetoothOpen}`); } stopService() { diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index 3b19db5b..c8f61271 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -55,19 +55,19 @@ export class brightnessManager { getValue() { Log.showInfo(TAG, 'getValue'); let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '100'); - Log.showDebug(TAG, `settings getValue ${parseInt(data)}`); + Log.showInfo(TAG, `settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); } setValue(callback, sliderChangeMode:number) { let value = parseInt(callback.value); - Log.showDebug(TAG, `setValue ${value}`); + Log.showInfo(TAG, `setValue ${value}`); mBrightnessValue.set(value); if(sliderChangeMode === this.SLIDER_CHANG_MODE_MOVING){ Brightness.setValue(callback.value); }else{ settings.setValueSync(this.helper, SYSTEMUI_BRIGHTNESS, callback.value.toString()); - Log.showDebug(TAG, `settings setValue ${callback.value} end`); + Log.showInfo(TAG, `settings setValue ${callback.value} end`); } } } -- Gitee From 41da67a3131d48b6304dda58ed2a686fd8330923 Mon Sep 17 00:00:00 2001 From: username <1037761763@qq.com> Date: Mon, 23 May 2022 13:28:08 +0800 Subject: [PATCH 097/373] =?UTF-8?q?featrues=E5=B1=82=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: username <1037761763@qq.com> --- .../src/main/ets/com/ohos/common/constants.ts | 1 - .../ets/com/ohos/model/bundleResourceModel.ts | 10 +++--- .../ets/com/ohos/model/noDisturbingModel.ts | 7 ++--- .../com/ohos/model/notificationListener.ts | 5 +-- .../ohos/view/component/appItemComponent.ets | 2 +- .../ohos/vm/noDisturbComponentViewModel.ts | 5 +-- .../ohos/navigationservice/KeyCodeEvent.ts | 14 ++++----- .../noticeItem/common/ScrollbarManager.ts | 1 - .../model/NotificationDistributionManager.ts | 6 ++-- .../noticeItem/model/NotificationManager.ts | 3 +- .../noticeItem/model/NotificationService.ts | 1 - .../ohos/noticeItem/model/ParseDataUtil.ts | 5 ++- .../view/item/bannerNotificationItem.ets | 3 +- .../ohos/noticeItem/view/item/customItem.ets | 4 +-- .../noticeItem/view/item/devicesDialog.ets | 1 - .../ohos/noticeItem/view/item/generalItem.ets | 2 +- .../ohos/noticeItem/view/item/groupItem.ets | 3 +- .../ohos/noticeItem/viewmodel/ViewModel.ts | 31 +++++++------------ .../ets/com/ohos/model/RingModeService.ts | 3 +- .../src/main/ets/default/pages/signalIcon.ets | 2 +- .../src/main/ets/default/signalModel.ts | 2 +- .../com/ohos/common/StatusBarConfiguration.ts | 18 ++++------- .../ets/com/ohos/model/StatusBarService.ts | 9 ++---- .../ets/com/ohos/pages/IconItemComponent.ets | 1 - .../com/ohos/pages/MetaIconItemComponent.ets | 1 - .../ets/com/ohos/pages/StatusBarComponent.ets | 6 ++-- .../src/main/ets/default/VolumeModel.ts | 1 - .../ets/default/pages/volumeComponent.ets | 3 +- .../com/ohos/common/VolumeWindowController.ts | 2 +- .../ets/com/ohos/model/VolumePanelService.ts | 4 +-- .../ets/com/ohos/viewmodel/VolumePanelVM.ts | 10 ++---- .../src/main/ets/default/wifiModel.ts | 4 --- 32 files changed, 59 insertions(+), 111 deletions(-) diff --git a/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts b/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts index 29e5ff12..a03a9775 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts @@ -14,7 +14,6 @@ */ export default class Constants { - static WH_45_100 = '45%'; static WH_50_100 = '50%'; static WH_60_100 = '60%'; diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index ce5c922f..35fc367f 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -53,9 +53,8 @@ export default class BundleResourceModel { if (value != null) { Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() value:' + value); label = value; - Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() label:' + label); } else { - Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() error:' + error); + Log.showError(TAG, 'getIconItem ResMgr.getResourceManager getString() error:' + error); } }); } else { @@ -91,7 +90,7 @@ export default class BundleResourceModel { this.nextIconItem(index, count, data, this.mBundleInfoList, that) }); } catch (error) { - Log.showInfo(TAG, 'getIconItem catch error:' + error); + Log.showError(TAG, 'getIconItem catch error:' + error); } Log.showInfo(TAG, 'getIconItem end'); } @@ -108,7 +107,6 @@ export default class BundleResourceModel { } async getBundleInfo(bundleName, callback) { - Log.showInfo(TAG, 'getBundleInfo entry'); let mBundleInfo: any = {}; let label = ''; @@ -125,10 +123,10 @@ export default class BundleResourceModel { if (appInfo.labelId > 0) { item.getString(appInfo.labelId, (error, value) => { if (value != null) { - Log.showInfo(TAG, `getBundleInfo getResourceManager getString() value:${JSON.stringify(value)}`); + Log.showInfo(TAG, `getBundleInfo getResourceManager getString() value: ` + value); mBundleInfo.appTitle = value } else { - Log.showInfo(TAG, `getBundleInfo getResourceManager getString() error:${JSON.stringify(error)}`); + Log.showError(TAG, `getBundleInfo getResourceManager getString() error:${JSON.stringify(error)}`); } }); } diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts index 6eca12e5..87c694c9 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts @@ -26,7 +26,7 @@ export default class NoDisturbingModel { static getNoDisturbingDate(callback) { Notification.getDoNotDisturbDate((error, data) => { if (error.code != 0) { - Log.showInfo(TAG, 'getNoDisturbingDate error:' + JSON.stringify(error)); + Log.showError(TAG, 'getNoDisturbingDate error:' + JSON.stringify(error)); } else { Log.showInfo(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); let noDisturbingData = {} @@ -48,9 +48,8 @@ export default class NoDisturbingModel { targetDate['type'] = noDisturbingTime.type targetDate['begin'] = noDisturbingTime.begin targetDate['end'] = noDisturbingTime.end - Log.showInfo(TAG, `Notification.setDoNotDisturbDate targetDate['type'] : ` + JSON.stringify(targetDate['type'])); - Log.showInfo(TAG, `Notification.setDoNotDisturbDate targetDate['begin'] : ` + JSON.stringify(targetDate['begin'])); - Log.showInfo(TAG, `Notification.setDoNotDisturbDate targetDate['end'] : ` + JSON.stringify(targetDate['end'])); + Log.showInfo(TAG, `setDoNotDisturbDate targetDate['type'] : ` + JSON.stringify(targetDate['type']) + + ` ['begin'] : ` + JSON.stringify(targetDate['begin']) + ` ['end'] : ` + JSON.stringify(targetDate['end'])); Notification.setDoNotDisturbDate(targetDate, callback) } static formatDate (data: Date): string { diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts index 8628e955..3ad0a258 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts @@ -48,10 +48,11 @@ export class NotificationListener { handleEnabledNotificationChanged(data) { Log.showInfo(TAG, `handleEnabledNotificationChanged data:${JSON.stringify(data)} `); this.listeners.forEach((listener) => { - Log.showInfo(TAG, `handleEnabledNotificationChanged listener:${listener.bundle}`); if (!!listener && listener.bundle == data.bundle) { Log.showInfo(TAG, `handleEnabledNotificationChanged call:${listener.bundle} ${data.enable}`); listener.onEnableChanged(data.enable); + } else { + Log.showError(TAG, `handleEnabledNotificationChanged error`); } }) } @@ -110,7 +111,7 @@ export class NotificationListener { Log.showInfo(TAG, `isDistributedEnabled data:${data}`) resolve(data); }).catch((err) => { - Log.showInfo(TAG, `isDistributedEnabled err:${JSON.stringify(err)} `) + Log.showError(TAG, `isDistributedEnabled err:${JSON.stringify(err)} `) reject(err) }) }); diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets index fb5cc8ca..67b34bfb 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets @@ -213,7 +213,7 @@ export default struct AppItemComponent { this.canNotice = stateValue; }) .catch((error) => { - Log.showInfo(TAG, `Notification.isNotificationEnabled error:${JSON.stringify(error)}`) + Log.showError(TAG, `Notification.isNotificationEnabled error:${JSON.stringify(error)}`) }); } } diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts index 9ab93048..95f439ce 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts @@ -44,16 +44,13 @@ export default class NoDisturbComponentViewModel { this.repeatMode = data.type this.startTime = data.begin this.endTime = data.end - Log.showInfo(TAG, `getNoDisturbingDate this.repeatMode : ${this.repeatMode}`) - Log.showInfo(TAG, `getNoDisturbingDate this.startTime : ${this.startTime}`) - Log.showInfo(TAG, `getNoDisturbingDate this.endTime : ${this.endTime}`) + Log.showInfo(TAG, `getNoDisturbingDate repeatMode : ${this.repeatMode} startTime : ${this.startTime} endTime : ${this.endTime}`); this.repeatName = this.refreshRepeatName(this.repeatMode); this.setClues.bind(this)() }) } setNoDisturbingDate() { - Log.showInfo(TAG, 'setNoDisturbingDate'); if (!this.isEffective) { this.repeatMode = DoNotDisturbType.TYPE_NONE } diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts index a8edb9f2..5f36feab 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts @@ -29,10 +29,10 @@ export class KeyCodeEvent { case Constants.KEYCODE_BACK: Log.showInfo(TAG, `sendKeyEvent case back type: ${eventType}`); if (eventType === Constants.KEY_DOWN) { - Log.showInfo(TAG, 'sendKeyEvent, if'); + Log.showInfo(TAG, 'sendKeyEvent : KEY_DOWN'); this.sendBackKeyEventStart(); //down } else if (eventType === Constants.KEY_UP) { - Log.showInfo(TAG, `sendKeyEvent, else type: ${eventType}`); + Log.showInfo(TAG, `sendKeyEvent : KEY_UP`); this.sentEvnt(); this.sendBackKeyEventEnd(); //up } @@ -40,7 +40,7 @@ export class KeyCodeEvent { case Constants.KEYCODE_HOME: Log.showInfo(TAG, `sendKeyEvent case home type: ${eventType}`); if (eventType === Constants.KEY_UP) { - Log.showInfo(TAG, 'sendKeyEvent, if'); + Log.showInfo(TAG, 'sendKeyEvent : KEY_UP'); this.sentEvnt(); this.sendHomeKeyEvent(); } @@ -48,7 +48,7 @@ export class KeyCodeEvent { case Constants.KEYCODE_RECENT: Log.showInfo(TAG, `sendKeyEvent case recent type: ${eventType}`); if (eventType === Constants.KEY_UP) { - Log.showInfo(TAG, 'sendKeyEvent, if'); + Log.showInfo(TAG, 'sendKeyEvent : KEY_UP'); this.sentEvnt(); this.sendRecentKeyEvent(); } @@ -106,8 +106,7 @@ export class KeyCodeEvent { private sendRecentKeyEvent() { Log.showInfo(TAG, 'sendRecentKeyEvent'); commonEvent.publish('CREATE_RECENT_WINDOW_EVENT', (err, data) => { - Log.showInfo(TAG, `publish launcher err ${JSON.stringify(err)}`); - Log.showInfo(TAG, `publish launcher data ${JSON.stringify(data)}`); + Log.showInfo(TAG, `publish launcher err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); }); Log.showInfo(TAG, `startAbility`); @@ -126,8 +125,7 @@ export class KeyCodeEvent { } commonEvent.publish('SET_STATUSBAR_MIN_EVENT', commonEventPublishData, (err, data) => { - Log.showInfo(TAG, `publish statusbar err ${JSON.stringify(err)}`); - Log.showInfo(TAG, `publish statusbar data ${JSON.stringify(data)}`); + Log.showInfo(TAG, `publish launcher err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); }); } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts index a2eea8fd..f3fe8080 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts @@ -20,7 +20,6 @@ export default class ScrollbarManager { static NotificationScrollBar = new Set(); static add(scroller) { - Log.showInfo(TAG, `add`); let res = ScrollbarManager.NotificationScrollBar.add(scroller); Log.showInfo(TAG, `add set's size:${res.size}`); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts index f2c94c4f..cb20bb52 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts @@ -25,7 +25,6 @@ export default class NotificationDistributionManager { deviceManager = null static getInstance() { - Log.showInfo(TAG, `getInstance`); if (distributionManager == null) { Log.showInfo(TAG, `getInstance distributionManager new`); distributionManager = new NotificationDistributionManager(); @@ -44,10 +43,10 @@ export default class NotificationDistributionManager { Log.showInfo(TAG, `initDeviceManager`); DeviceManager.createDeviceManager("com.ohos.systemui", (err, data) => { if (err) { - console.info("createDeviceManager err:" + JSON.stringify(err)); + Log.showInfo(TAG, "createDeviceManager err:" + JSON.stringify(err)); return; } - console.info("createDeviceManager success"); + Log.showInfo(TAG, "createDeviceManager success"); this.deviceManager = data; }); } @@ -59,7 +58,6 @@ export default class NotificationDistributionManager { Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceArr:${JSON.stringify(deviceArr)}`); if (deviceArr && deviceArr.length > 0) { for (let item of deviceArr) { - Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceArr item:${JSON.stringify(item)}`); if (item.deviceId == deviceId) { deviceName = item.deviceName; break; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index a67e78be..5188041e 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -120,8 +120,7 @@ export default class NotificationManager { Log.showInfo(TAG, `requestTemplate requestParam: ${JSON.stringify(requestParam)}`) NotificationManager.request(tag, requestParam, (err, data) => { - Log.showInfo(TAG, `request finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) - Log.showInfo(TAG, `request finished templateData: ${templateName} data: ${JSON.stringify(data.componentTemplate)}`) + Log.showInfo(TAG, `request finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)} templateData: ${templateName}`) if (data?.componentTemplate?.source) { Log.showInfo(TAG, `request finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`) let templates = JSON.parse(data.componentTemplate.source); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index 36ad7983..4e2b9575 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -56,7 +56,6 @@ export class NotificationService { } public removeAll() { - Log.showInfo(TAG, 'removeAll start'); NotificationManager.removeAll(TAG, (data) => { Log.showInfo(TAG, `removeAll => data: ${JSON.stringify(data)}`); }); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index 286c031d..de29d463 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -52,8 +52,7 @@ export default class ParseDataUtil { if (!request) { return Promise.reject('consumeCallback request is empty'); } - Log.showInfo(TAG, `parse data start, want = ${JSON.stringify(request.wantAgent)}`); - Log.showInfo(TAG, `actionButtons = ${JSON.stringify(request.actionButtons)}`); + Log.showInfo(TAG, `parse data start, want = ${JSON.stringify(request.wantAgent)} actionButtons = ${JSON.stringify(request.actionButtons)}`); let userId = await getUserId(request.creatorUid); let appMessage = await ParseDataUtil.getAppData(request.creatorBundleName, userId); let notificationItem: NotificationItemData = { @@ -84,7 +83,7 @@ export default class ParseDataUtil { groupName: request.groupName??request.hashcode, tapDismissed: request.tapDismissed }; - Log.showInfo(TAG, `notificationItem construct over ====================`); + Log.showInfo(TAG, `notificationItem construct over`); notificationItem = { ...notificationItem, ...ParseDataUtil.getContentByType(request?.content?.contentType, request) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index 407ed6db..2c9ea538 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -229,8 +229,7 @@ struct ContentComponent { itemData: any; aboutToAppear() { - Log.showInfo(TAG, `aboutToDisappear pict: ${this.itemData.picture}`); - Log.showInfo(TAG, `NotificationItemData: ${JSON.stringify(this.itemData)}`) + Log.showInfo(TAG, `aboutToAppear NotificationItemData: ${JSON.stringify(this.itemData)}`) } build() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets index 4dd19e78..ae0d9b41 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -35,9 +35,7 @@ export default struct CustomItem { this.template = ViewModel.getPluginTempLate(this.customItemData.template.name); this.templateData = this.customItemData.template.data; this.isDebugMode = NotificationManager.isDebugMode(TAG); - Log.showInfo(TAG, `template = ${JSON.stringify(this.template)}`) - Log.showInfo(TAG, `templateData = ${JSON.stringify(this.templateData)}`) - Log.showInfo(TAG, `isDebugMode = ${this.isDebugMode}`) + Log.showInfo(TAG, `template = ${JSON.stringify(this.template)} templateData = ${JSON.stringify(this.templateData)} isDebugMode = ${this.isDebugMode}`) } build() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets index 6b8fce71..4b3f28d6 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets @@ -102,7 +102,6 @@ export default struct DevicesDialog { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) this.deviceInfoList = DistributionManager.getInstance().getTrustedDeviceListSync(); Log.showInfo(TAG, `aboutToAppear deviceInfoList:${JSON.stringify(this.deviceInfoList)}`) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index 2374770f..b4bb4f79 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -102,7 +102,7 @@ struct ContentComponent { itemData: any; aboutToAppear() { - Log.showInfo(TAG, `aboutToDisappear pict: ${this.itemData.picture}`); + Log.showInfo(TAG, `aboutToAppear pict: ${this.itemData.picture}`); } build() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index cc0dab78..52dea087 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -106,7 +106,6 @@ struct ContentList { @State remainderNum: number= 0 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) this.remainderNum = this.groupData.length - 2; Log.showInfo(TAG, `aboutToAppear remainderNum:${this.remainderNum}`) } @@ -189,6 +188,6 @@ struct ContentList { remainderChange() { this.remainderNum = this.groupData.length - 2; - Log.showInfo(TAG, `aboutToAppear remainderNum:${this.remainderNum}`) + Log.showInfo(TAG, `remainderChange remainderNum:${this.remainderNum}`) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index 21f00914..336cf1e2 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -83,7 +83,7 @@ export class ViewModel { */ onNotificationConsume(notificationItemData) { if (notificationItemData === undefined) { - Log.showInfo(TAG, `onNotificationConsume notificationItemData is undefined`); + Log.showError(TAG, `onNotificationConsume notificationItemData is undefined`); return; } this.onNotificationCancel(notificationItemData.hashcode) @@ -111,13 +111,13 @@ export class ViewModel { * notification CancelCallback */ onNotificationCancel(hashCode: string) { - Log.showInfo(TAG, `onNotificationCancel hashCode: ${JSON.stringify(hashCode)}`); + Log.showInfo(TAG, `onNotificationCancel hashCode: ` + hashCode); + // Common Notification Deletion Logic Processing for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].hashcode == hashCode) { - Log.showInfo(TAG, `removeNotificationItem i = ${i}`); let removeItemArr = this.mNotificationList.splice(i, 1); - Log.showInfo(TAG, `onNotificationCancel removeItemArr= ${JSON.stringify(removeItemArr)}`); + Log.showInfo(TAG, `onNotificationCancel i = ${i} removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { this.updateFlowControlInfos(removeItemArr[0].bundleName, false) } @@ -128,8 +128,7 @@ export class ViewModel { } updateNotification() { - Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(this.mNotificationList)}`); - Log.showInfo(TAG, `updateNotification length: ${this.mNotificationList.length}`); + Log.showInfo(TAG, `updateNotification length: ${this.mNotificationList.length} list: ${JSON.stringify(this.mNotificationList)}`); this.sortNotification() let notificationList = this.groupByGroupName(); AppStorage.SetOrCreate('notificationList', notificationList); @@ -191,18 +190,16 @@ export class ViewModel { } else { let index = this.mNotificationList.length while (index--) { - Log.showInfo(TAG, `removeAllNotifications isRemoveAllowed: ${index} ${this.mNotificationList[index].isRemoveAllowed} `); - Log.showInfo(TAG, `removeAllNotifications isOngoing: ${index} ${this.mNotificationList[index].isOngoing} `); - Log.showInfo(TAG, `removeAllNotifications isUnremovable: ${index} ${this.mNotificationList[index].isUnremovable} `); + Log.showInfo(TAG, `removeAllNotifications isRemoveAllowed: ${index} ${this.mNotificationList[index].isRemoveAllowed} + isOngoing: ${this.mNotificationList[index].isOngoing} isUnremovable: ${this.mNotificationList[index].isUnremovable}`); //Except the Long term notifications if (this.mNotificationList[index].isRemoveAllowed && !this.mNotificationList[index].isOngoing && !this.mNotificationList[index].isUnremovable) { - Log.showInfo(TAG, `mNotificationList[${index}].hashcode: ${this.mNotificationList[index].hashcode}`); let hashCode = this.mNotificationList[index].hashcode this.removeSysNotificationItem(hashCode) let removeItemArr = this.mNotificationList.splice(index, 1) - Log.showInfo(TAG, `removeAllNotifications removeItemArr= ${JSON.stringify(removeItemArr)}`); + Log.showInfo(TAG, `removeAllNotifications hashCode = ${hashCode}, removeItemArr = ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { this.updateFlowControlInfos(removeItemArr[0].bundleName, false) } @@ -216,9 +213,8 @@ export class ViewModel { Log.showInfo(TAG, `removeNotificationItem, hashcode: ${itemData.hashcode}`); for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].hashcode == itemData.hashcode) { - Log.showInfo(TAG, `removeNotificationItem i = ${i}`); let removeItemArr = this.mNotificationList.splice(i, 1); - Log.showInfo(TAG, `removeNotificationItem removeItemArr= ${JSON.stringify(removeItemArr)}`); + Log.showInfo(TAG, `removeNotificationItem i = ${i} removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { this.updateFlowControlInfos(removeItemArr[0].bundleName, false) } @@ -237,11 +233,10 @@ export class ViewModel { let groupName = itemData.groupName for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].groupName == groupName) { - Log.showInfo(TAG, `removeGroupNotification i = ${i}`); let id = this.mNotificationList[i].id let hashcode = this.mNotificationList[i].hashcode let removeItemArr = this.mNotificationList.splice(i, 1); - Log.showInfo(TAG, `removeGroupNotification removeItemArr= ${JSON.stringify(removeItemArr)}`); + Log.showInfo(TAG, `removeGroupNotification i = ${i} removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { this.updateFlowControlInfos(removeItemArr[0].bundleName, false) } @@ -361,7 +356,7 @@ export class ViewModel { this.audioPlayer.play(); Log.showInfo(TAG, `sound end `); } catch (e) { - Log.showInfo(TAG, `sound notificationItem id:${itemData.id} alert error: ${e.toString()}`); + Log.showError(TAG, `sound notificationItem id:${itemData.id} alert error: ${e.toString()}`); } } } @@ -401,9 +396,7 @@ export class ViewModel { //get distributed device name getDistributedDeviceName(itemData): Promise{ - Log.showInfo(TAG, `getDistributedDeviceName`); - Log.showInfo(TAG, `getDistributedDeviceName itemData want:${JSON.stringify(itemData.want)}`); - Log.showInfo(TAG, `getDistributedDeviceName itemData deviceId:${itemData.deviceId}`); + Log.showInfo(TAG, `getDistributedDeviceName itemData want:${JSON.stringify(itemData.want)} deviceId:${itemData.deviceId}`); return new Promise((resolve) => { let deviceName: string = ''; diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts index 004f019f..f8568c94 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts @@ -60,7 +60,6 @@ export class RingModeService { } getRingerMode() { - Log.showInfo(TAG, `getRingerMode`) this.mAudioManager.getRingerMode((error, action) => { Log.showInfo(TAG, `getRingerMode, error: ${JSON.stringify(error)} action: ${JSON.stringify(action)}`) if (error) { @@ -73,7 +72,7 @@ export class RingModeService { setRingerMode(mode) { Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)}`) this.mAudioManager.setRingerMode(mode, (err, data) => { - Log.showInfo(TAG, `mAudioManager.setRingerMode, mode: ${JSON.stringify(mode)}`) + Log.showInfo(TAG, `mAudioManager.setRingerMode`) }) } } diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 7eb481f1..b348b532 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -143,7 +143,7 @@ struct SignalIcon { cellularImage = $r('app.media.ic_statusbar_signal_no'); break; } - console.info('systemui updateCellularImage = ' + cellularImage); + Log.showInfo(TAG, 'updateCellularImage = ' + cellularImage); return cellularImage; } diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ts b/features/signalcomponent/src/main/ets/default/signalModel.ts index a31c4d6a..d262db18 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ts +++ b/features/signalcomponent/src/main/ets/default/signalModel.ts @@ -55,7 +55,7 @@ export class SignalModel { checkCellularStatus() { let cellularStatus; let slotId = 0; - Log.showInfo(TAG, 'enter checkCellularStatus ============'); + Log.showInfo(TAG, 'enter checkCellularStatus'); Sim.hasSimCard(slotId, (err, value) => { if (value === true) { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index 0ab0eeeb..93e374c7 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -49,7 +49,6 @@ class StatusBarConfiguration { await display.getDefaultDisplay() .then(dis => { - Log.showInfo(TAG, `initWindowManager dis ${JSON.stringify(dis)}`); maxWidth = dis.width; maxHeight = dis.height; Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); @@ -57,11 +56,10 @@ class StatusBarConfiguration { } async getDirectionAndPosition() { - Log.showInfo(TAG, 'getDirectionAndPosition' + 1); + Log.showInfo(TAG, 'getDirectionAndPosition'); directionStatus = await ResourceUtil.getConfiguration(); - Log.showInfo(TAG, 'getDirectionAndPosition' + 2); if (directionStatus.direction == -1) { - Log.showInfo(TAG, 'getDirectionAndPosition' + 3); + Log.showInfo(TAG, 'direction is -1'); statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); } else if (directionStatus.direction == 1) { @@ -71,11 +69,9 @@ class StatusBarConfiguration { statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_portrait")) shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_portrait")); } - Log.showInfo(TAG, 'getDirectionAndPosition' + 4); shortSideLength = parseInt(shortSideLength) + ''; - Log.showInfo(TAG, 'directionStatus = ' + directionStatus.direction); - Log.showInfo(TAG, 'statusbarPosition = ' + statusbarPosition); - Log.showInfo(TAG, 'lpx2px(parseInt(shortSideLength)) = ' + shortSideLength); + Log.showInfo(TAG, 'directionStatus = ' + directionStatus.direction + 'statusbarPosition = ' + statusbarPosition + + 'shortSideLength = ' + shortSideLength); } /** @@ -87,9 +83,8 @@ class StatusBarConfiguration { let showHorizontal = false; let ableToMaximize = false; if (statusbarPosition == Position.TOP_POSITION || statusbarPosition == Position.BOTTOM_POSITION) { - Log.showInfo(TAG, `showHorizontal1`); + Log.showInfo(TAG, `getConfiguration`); showHorizontal = true; - Log.showInfo(TAG, `showHorizontal2`); minHeight = parseInt(shortSideLength); realWidth = maxWidth; realHeight = parseInt(shortSideLength); @@ -110,8 +105,7 @@ class StatusBarConfiguration { realWidth = 0; realHeight = 0; } - Log.showInfo(TAG, `initWindowManager xCoordinate ${xCoordinate} yCoordinate ${yCoordinate}`); - Log.showInfo(TAG, `initWindowManager realWidth ${realWidth} realHeight ${realHeight}`); + Log.showInfo(TAG, `initWindowManager xCoordinate ${xCoordinate} yCoordinate ${yCoordinate} realWidth ${realWidth} realHeight ${realHeight}`); var configuration = { maxWidth: maxWidth, diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts index a0b8992d..f211473b 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -119,8 +119,7 @@ export class StatusBarService { } } }); - Log.showInfo(TAG, - `parseConfig, statusBarLayoutGroupTemplate: ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`) + Log.showInfo(TAG, `parseConfig, statusBarLayoutGroupTemplate: ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`) this.mStatusBarAllLayout = [...config.LocalSlots]; this.onDisplayRotate(0); @@ -227,8 +226,7 @@ export class StatusBarService { y2: this.mStatusBarData.top + this.mStatusBarData.realHeight }; } - Log.showInfo(TAG, `calcEmptyAreaPosition, statusBarLeft: ${JSON.stringify(statusBarLeft)}`); - Log.showInfo(TAG, `calcEmptyAreaPosition, statusBarRight: ${JSON.stringify(statusBarRight)}`); + Log.showInfo(TAG, `calcEmptyAreaPosition, statusBarLeft: ${JSON.stringify(statusBarLeft)} statusBarRight: ${JSON.stringify(statusBarRight)}`); let emptyPosition; if (rotation == 0) { @@ -271,8 +269,7 @@ export class StatusBarService { } isEmptyAreaGlandStatusBar(emptyPosition, statusBarArea): boolean { - Log.showInfo(TAG, `isEmptyAreaGlandStatusBar, emptyPosition: ${JSON.stringify(emptyPosition)}`); - Log.showInfo(TAG, `isEmptyAreaGlandStatusBar, statusBarArea: ${JSON.stringify(statusBarArea)}`); + Log.showInfo(TAG, `isEmptyAreaGlandStatusBar, emptyPosition: ${JSON.stringify(emptyPosition)} statusBarArea: ${JSON.stringify(statusBarArea)}`); let ex1 = emptyPosition.x1; let ey1 = emptyPosition.y1; let ex2 = emptyPosition.x2; diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index fd119752..a6ed2f8b 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -51,7 +51,6 @@ export default struct IconItemComponent { } linkItemData() { - Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`) this.mItemData = AppStorage.Link('StatusBar_' + this.keyId) Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ this.mItemData.get() diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets index a2aec257..abb389ee 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets @@ -41,7 +41,6 @@ export default struct MetaIconItemComponent { } linkItemData() { - Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`) this.mItemData = AppStorage.Link('StatusBar_' + this.keyId) Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ this.mItemData.get() diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index 9e5593d5..bbcd5452 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -115,7 +115,7 @@ struct StatusBarBackground { @State mBackgroundDatas: StatusBarBackgroundData[] = ViewModel.getBackgroundDatas() aboutToAppear() { - Log.showInfo(TAG_StatusBarBackground, `aboutToAppear Start`) + Log.showInfo(TAG_StatusBarBackground, `aboutToAppear`) } aboutToDisappear() { @@ -163,7 +163,6 @@ struct StatusBarGroup { @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() aboutToAppear() { - Log.showInfo(TAG_StatusBarGroup, `aboutToAppear Start`) Log.showInfo(TAG_StatusBarGroup, `aboutToAppear, mLayoutWeight: ${this.mLayoutWeight} mAlignItems: ${this.mAlignItems} `) } @@ -283,7 +282,6 @@ struct StatusBarEmptyIcon { @State mTintContentInfo: TintContentInfo = ViewModel.getEmptyTintContentInfo() aboutToAppear() { - Log.showInfo(TAG_StatusBarEmptyIcon, `aboutToAppear Start`) Log.showInfo(TAG_StatusBarEmptyIcon, `aboutToAppear, mStatusBarEmptyWidth: ${this.mStatusBarEmptyWidth} `) } @@ -305,7 +303,7 @@ struct StatusBarNotificationIcon { @State style: any = StyleConfiguration.getStatusBarNotificationIconStyle() aboutToAppear() { - Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToAppear Start`) + Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToAppear`) } aboutToDisappear() { diff --git a/features/volumecomponent/src/main/ets/default/VolumeModel.ts b/features/volumecomponent/src/main/ets/default/VolumeModel.ts index 3f5b5313..74a46a8a 100644 --- a/features/volumecomponent/src/main/ets/default/VolumeModel.ts +++ b/features/volumecomponent/src/main/ets/default/VolumeModel.ts @@ -34,7 +34,6 @@ export class VolumeModel { } setVolume(callback) { - Log.showInfo(TAG, 'setVolume'); let value = parseInt(callback.value); Log.showInfo(TAG, `setVolume ${value}`); mVolumeValue.set(value); diff --git a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets index d11b7f37..d7551f53 100644 --- a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets +++ b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets @@ -30,8 +30,7 @@ export struct MyVol { }; aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear') - Log.showInfo(TAG,'Start init Volume!') + Log.showInfo(TAG,'aboutToAppear Start init Volume!') this.initVolume() Log.showInfo(TAG,'Finished init Volume!') VolumeModel.init(); diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts index 2df48624..e277cf9e 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts @@ -74,7 +74,7 @@ export default class VolumeWindowController { .then(() => { Log.showInfo(TAG, `updateShowStatus ${isShow}.`); }) - .catch((err) => Log.showInfo(TAG, `Can't set volueme window: ${err}.`)) + .catch((err) => Log.showError(TAG, `Can't set volueme window: ${err}.`)) } } } \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts index 8b92ca31..e416c2ea 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts @@ -43,9 +43,8 @@ export class VolumePanelService { if (this.mIsStart) { return; } - Log.showInfo(TAG, `startService`) this.mIsStart = true; - Log.showInfo(TAG, `registser volumeChange.`) + Log.showInfo(TAG, `startService`) this.mAudioManager.on('volumeChange', this.onVolumeChange.bind(this)); } @@ -191,7 +190,6 @@ export class VolumePanelService { interfaceName: InterfaceName.setVolume, params: [interfaceVolumeType, volume], callbackFunction: (err) => { - Log.showInfo(TAG, `setVolume, callback volumeType: ${volumeType} volume: ${volume}`) Log.showInfo(TAG, `setVolume, callback err: ${err} `) if (err) { return; diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts index 5d345eb6..e3ca1aea 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts @@ -73,7 +73,6 @@ export class VolumePanelVM { } getInitVolumeInfo() { - Log.showInfo(TAG, `getInitVolumeInfo`) this.getActiveVolumeType(JSON.parse(JSON.stringify(this.mAllVolumeTypes)), (activeVolumeType: AudioVolumeType) => { Log.showInfo(TAG, `getInitVolumeInfo, activeVolumeType: ${activeVolumeType}`) if (activeVolumeType == undefined) { @@ -114,8 +113,7 @@ export class VolumePanelVM { } updateVolumeInfo(volumeInfo: VolumeInfo) { - Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} `) - Log.showInfo(TAG, `updateVolumeInfo, mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType} `) + Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} , mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType}`) if (!volumeInfo.updateUi && volumeInfo.volumeType != this.mCurrentAudioVolumeType) { return; } @@ -124,13 +122,11 @@ export class VolumePanelVM { let minVolume = this.mVolumeBaseMap[volumeType].minVolume; this.mMaxVolume.set(maxVolume); this.mMinVolume.set(minVolume); - Log.showInfo(TAG, `updateVolumeInfo, mMaxVolume: ${this.mMaxVolume.get()} `) - Log.showInfo(TAG, `updateVolumeInfo, mMinVolume: ${this.mMinVolume.get()} `) + Log.showInfo(TAG, `updateVolumeInfo, mMaxVolume: ${this.mMaxVolume.get()} , mMinVolume: ${this.mMinVolume.get()}`) this.mCurrentAudioVolume = volumeInfo.volume; this.mCurrentAudioVolumeType = volumeType; - Log.showInfo(TAG, `updateVolumeInfo, mCurrentAudioVolume: ${this.mCurrentAudioVolume} `) - Log.showInfo(TAG, `updateVolumeInfo, mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType} `) + Log.showInfo(TAG, `updateVolumeInfo, mCurrentAudioVolume: ${this.mCurrentAudioVolume} , mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType}`) this.mVolumeBeforeMute = minVolume; this.mIsMute.set(volumeInfo.isMute); diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ts b/features/wificomponent/src/main/ets/default/wifiModel.ts index e25a9e6d..41e9b9b8 100644 --- a/features/wificomponent/src/main/ets/default/wifiModel.ts +++ b/features/wificomponent/src/main/ets/default/wifiModel.ts @@ -96,7 +96,6 @@ export class WifiModel { } getWifiInfo() { - Log.showInfo(TAG, `getWifiInfo`) let isWifiActive = wifi.isWifiActive(); Log.showInfo(TAG, `getWifiInfo, isWifiActive: ${isWifiActive}`) mWifiOpenStatus.set(isWifiActive); @@ -108,7 +107,6 @@ export class WifiModel { } getWifiConnectInfo() { - Log.showInfo(TAG, `getWifiConnectInfo`) let isConnected = wifi.isConnected(); Log.showInfo(TAG, `getWifiConnectInfo, isConnected: ${isConnected}`) if (isConnected) { @@ -142,13 +140,11 @@ export class WifiModel { } enableWifi() { - Log.showInfo(TAG, 'enableWifi'); let result = wifi.enableWifi(); Log.showInfo(TAG, `enableWifi, result: ${result}`); } disableWifi() { - Log.showInfo(TAG, 'disableWifi'); let result = wifi.disableWifi(); Log.showInfo(TAG, `disableWifi, result: ${result}`); } -- Gitee From 5a6d8fc56fea56702eaeb76de74c4ed06f950c77 Mon Sep 17 00:00:00 2001 From: username <1037761763@qq.com> Date: Mon, 23 May 2022 13:55:07 +0800 Subject: [PATCH 098/373] =?UTF-8?q?featrues=E5=B1=82=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: username <1037761763@qq.com> --- .../com/ohos/common/StatusBarConfiguration.ts | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index 93e374c7..53523b39 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -47,12 +47,21 @@ class StatusBarConfiguration { Log.showInfo(TAG, 'initWindowManager'); minHeight = 0; - await display.getDefaultDisplay() - .then(dis => { - maxWidth = dis.width; - maxHeight = dis.height; - Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); - }) + let displayData = null; + while (displayData == null) { + await display.getDefaultDisplay() + .then((res) => { + Log.showInfo(TAG, `getDefaultDisplay dis ${JSON.stringify(res)}`); + displayData = res; + maxWidth = res.width; + maxHeight = res.height; + Log.showInfo(TAG, `getDefaultDisplay maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); + }) + .catch((err) => { + Log.showInfo(TAG, 'getDefaultDisplay err: ' + err); + }); + await new Promise((resolve) => setTimeout(resolve, 2000)); + } } async getDirectionAndPosition() { -- Gitee From ed84b9a99793fa4aed86260cbd9ca71c3c337601 Mon Sep 17 00:00:00 2001 From: YangPeng Date: Mon, 23 May 2022 14:12:23 +0800 Subject: [PATCH 099/373] change some log Signed-off-by: yangpeng85 --- .../main/ets/com/ohos/model/accountsModel.ts | 27 ++++++------ .../ets/com/ohos/model/screenLockModel.ts | 10 ++--- .../ets/com/ohos/model/screenLockService.ts | 41 +++++++++---------- .../ets/com/ohos/model/screenlockStyle.ts | 5 +-- .../ets/com/ohos/view/component/accounts.ets | 4 +- .../com/ohos/view/component/batterySoc.ets | 2 +- .../ets/com/ohos/view/component/customPSD.ets | 4 +- .../com/ohos/view/component/digitalPSD.ets | 4 +- .../ets/com/ohos/view/component/lockIcon.ets | 3 +- .../ets/com/ohos/view/component/mixedPSD.ets | 4 +- .../com/ohos/view/component/numkeyBoard.ets | 4 +- .../ets/com/ohos/view/component/statusBar.ets | 2 +- .../src/main/ets/com/ohos/vm/baseViewModel.ts | 11 ++--- .../ets/com/ohos/vm/customPSDViewModel.ts | 1 - .../ets/com/ohos/vm/digitalPSDViewModel.ts | 2 - .../main/ets/com/ohos/vm/mixedPSDViewModel.ts | 2 +- .../ets/com/ohos/view/component/shortcut.ets | 6 +-- .../main/ets/com/ohos/vm/shortcutViewModel.ts | 1 - .../src/main/ets/default/pages/signalIcon.ets | 4 +- .../src/main/ets/default/signalModel.ts | 12 +++--- .../ets/com/ohos/view/component/wallpaper.ets | 2 +- .../ets/com/ohos/vm/wallpaperViewModel.ts | 4 +- .../src/main/ets/default/pages/wifiIcon.ets | 4 +- .../src/main/ets/default/wifiModel.ts | 10 ++--- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 13 +++--- .../pc/src/main/ets/common/StyleManager.ts | 15 +++---- .../pc/src/main/ets/pages/customPassword.ets | 4 +- .../src/main/ets/pages/customscreenlock.ets | 4 +- .../pc/src/main/ets/pages/digitalPassword.ets | 4 +- product/pc/src/main/ets/pages/index.ets | 12 +++--- .../src/main/ets/pages/journalscreenlock.ets | 4 +- .../pc/src/main/ets/pages/mixedPassword.ets | 6 +-- .../pc/src/main/ets/pages/slidescreenlock.ets | 2 +- product/pc/src/main/ets/vm/indexViewModel.ts | 7 +--- product/phone/src/main/ets/AbilityStage.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 12 +++--- .../src/main/ets/pages/customPassword.ets | 6 +-- .../src/main/ets/pages/customscreenlock.ets | 4 +- .../src/main/ets/pages/digitalPassword.ets | 6 +-- product/phone/src/main/ets/pages/index.ets | 14 +++---- .../src/main/ets/pages/journalscreenlock.ets | 4 +- .../src/main/ets/pages/mixedPassword.ets | 6 +-- .../src/main/ets/pages/slidescreenlock.ets | 4 +- .../phone/src/main/ets/vm/indexViewModel.ts | 5 +-- .../main/ets/vm/slideScreenLockViewModel.ts | 2 +- 46 files changed, 137 insertions(+), 170 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index 0b57bc67..e1b9b006 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -79,8 +79,7 @@ export default class AccountsModel { pinAuthManager = new osAccount.PINAuth(); modelInit() { - Log.showInfo(TAG, "start ModelInit") - Log.showInfo(TAG, "start ModelInit finish") + Log.showDebug(TAG, "start ModelInit") } eventListener(typeName: "activate" | "activating", name: string, callback: Callback) { @@ -112,12 +111,12 @@ export default class AccountsModel { private addAllUsers() { Log.showInfo(TAG, "start getAllUsers") osAccount.getAccountManager().queryAllCreatedOsAccounts().then((list) => { - Log.showInfo(TAG, "start sort") + Log.showDebug(TAG, "start sort") let accountList = []; let accountMap = new Map(); list.sort(this.sortAccount.bind(this)); for (const user of list) { - Log.showInfo(TAG, "start get user" + JSON.stringify(user)) + Log.showDebug(TAG, "start get user" + JSON.stringify(user)) if (user.isActived) { mCurrentUserId = user.localId } @@ -129,7 +128,7 @@ export default class AccountsModel { accountList.push(userData) accountMap.set(user.localId, userData) osAccount.getAccountManager().getOsAccountProfilePhoto(user.localId).then((path) => { - Log.showInfo(TAG, "start get photo:" + path) + Log.showDebug(TAG, "start get photo:" + path) accountMap.get(user.localId).userIconPath = path }) } @@ -150,15 +149,15 @@ export default class AccountsModel { } onUserSwitch(userId: number) { - Log.showInfo(TAG, "onUserSwitch:" + userId) + Log.showDebug(TAG, "onUserSwitch:" + userId) osAccount.getAccountManager().activateOsAccount(userId).then(() => { Log.showInfo(TAG, "activateOsAccount") }) - Log.showInfo(TAG, "onUserSwitch:" + userId + "finish") + Log.showDebug(TAG, "onUserSwitch:" + userId + "finish") } authUser(challenge, authType: AuthType, authLevel: number, callback) { - Log.showInfo(TAG, `authUser param: userId ${mCurrentUserId} challenge ${challenge}`); + Log.showDebug(TAG, `authUser param: userId ${mCurrentUserId} challenge ${challenge}`); this.userAuthManager.authUser(mCurrentUserId, challenge, authType, authLevel, { onResult: (result, extraInfo) => { Log.showInfo(TAG, `authUser UserAuthManager.authUser onResult`); @@ -172,7 +171,7 @@ export default class AccountsModel { } getAuthProperty(authType, callback) { - Log.showInfo(TAG, `getAuthProperty param: authType ${authType}`); + Log.showDebug(TAG, `getAuthProperty param: authType ${authType}`); let keyArray = [GetPropertyType.AUTH_SUB_TYPE, GetPropertyType.REMAIN_TIMES, GetPropertyType.FREEZING_TIME] let request = { 'authType': authType, @@ -185,7 +184,7 @@ export default class AccountsModel { } registerPWDInputer(password: string): Promise { - Log.showInfo(TAG, `registerPWDInputer`); + Log.showDebug(TAG, `registerPWDInputer`); let result = this.registerInputer(password); if (result) { return Promise.resolve(); @@ -195,13 +194,13 @@ export default class AccountsModel { } private registerInputer(password: string): boolean { - Log.showInfo(TAG, `registerInputer`); + Log.showDebug(TAG, `registerInputer`); let result = this.pinAuthManager.registerInputer({ onGetData: (passType, inputData) => { - Log.showInfo(TAG, `registerInputer onSetData passType:${passType}`); + Log.showDebug(TAG, `registerInputer onSetData passType:${passType}`); let textEncoder = new util.TextEncoder(); let uint8PW = textEncoder.encode(password); - Log.showInfo(TAG, `registerInputer onSetData call`); + Log.showDebug(TAG, `registerInputer onSetData call`); inputData.onSetData(passType, uint8PW); } }) @@ -219,7 +218,7 @@ export default class AccountsModel { } isActivateAccount(callback: Callback) { - Log.showInfo(TAG, `isActivateAccount userId:${mCurrentUserId}`) + Log.showDebug(TAG, `isActivateAccount userId:${mCurrentUserId}`) osAccount.getAccountManager().isOsAccountActived(mCurrentUserId).then((isActivate) => { Log.showInfo(TAG, `isActivateAccount userId:${mCurrentUserId} result: ${isActivate}`) callback(isActivate) diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index a64f314c..0ca48e59 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -22,7 +22,7 @@ const TAG = 'ScreenLock-ScreenLockModel'; export default class ScreenLockModel { eventListener(typeName: string, callback: Callback) { - Log.showInfo(TAG, `eventListener:typeName ${typeName}`); + Log.showDebug(TAG, `eventListener:typeName ${typeName}`); switch (typeName) { case "endScreenOn": case "unlockScreen": @@ -41,7 +41,7 @@ export default class ScreenLockModel { Log.showError(TAG, `eventListener:typeName ${typeName}`) } - Log.showInfo(TAG, `eventListener:typeName ${typeName} finish`); + Log.showDebug(TAG, `eventListener:typeName ${typeName} finish`); } eventCancelListener(typeName: string) { @@ -52,15 +52,13 @@ export default class ScreenLockModel { sendScreenLockEvent(typeName: string, typeNo: number, callback) { Log.showInfo(TAG, `sendScreenLockEvent: typeName ${typeName} typeNo ${typeNo} `); ScreenLockMar.sendScreenLockEvent(typeName, typeNo, (err, data) => { - Log.showInfo(TAG, `sendScreenLockEvent:callback err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); + Log.showDebug(TAG, `sendScreenLockEvent:callback err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); callback(err, data); }) } showScreenLockWindow(callback: Callback) { - Log.showInfo(TAG, 'showScreenLockWindow'); windowManager.find(Constants.WIN_NAME).then((win) => { - Log.showInfo(TAG, 'find window finish'); win.show().then(() => { Log.showInfo(TAG, `window show`); callback(); @@ -69,9 +67,7 @@ export default class ScreenLockModel { } hiddenScreenLockWindow(callback: Callback) { - Log.showInfo(TAG, 'hiddenScreenLockWindow'); windowManager.find(Constants.WIN_NAME).then((win) => { - Log.showInfo(TAG, 'find window finish'); win.hide().then(() => { Log.showInfo(TAG, `window hide`); callback(); diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index c1cb148f..aba08045 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -74,7 +74,7 @@ export class ScreenLockService { screenLockModel: ScreenLockModel = new ScreenLockModel() init() { - Log.showInfo(TAG, 'init'); + Log.showInfo(TAG, 'screen lock service init'); this.accountModel.modelInit(); this.monitorEvents(); this.accountModel.updateAllUsers() @@ -85,7 +85,7 @@ export class ScreenLockService { } monitorEvents() { - Log.showInfo(TAG, 'registered events start'); + Log.showDebug(TAG, 'registered events start'); //Bright screen this.screenLockModel.eventListener(EVENT_END_SCREEN_ON, () => { @@ -122,13 +122,13 @@ export class ScreenLockService { this.unlockScreen(); }); - Log.showInfo(TAG, 'registered events end'); + Log.showDebug(TAG, 'registered events end'); } lockScreen() { - Log.showInfo(TAG, `lockScreen`); + Log.showDebug(TAG, `lockScreen`); let length = Router.getLength() - Log.showInfo(TAG, `Router.getLength: ${length}`) + Log.showDebug(TAG, `Router.getLength: ${length}`) for (let index = 1;index < length; index++) { Log.showInfo(TAG, `back to index`); Router.back(); @@ -143,12 +143,12 @@ export class ScreenLockService { } private checkPinAuthProperty(callback: Callback) { - Log.showInfo(TAG, "checkPinAuthProperty") + Log.showDebug(TAG, "checkPinAuthProperty") this.accountModel.getAuthProperty(AuthType.PIN, (properties) => { Log.showInfo(TAG, `checkPinAuthProperty:AUTH_SUB_TYPE:${properties.authSubType}`); switch (properties.authSubType) { case AuthSubType.PIN_SIX: - Log.showInfo(TAG, "AuthSubType.PIN_SIX") + Log.showDebug(TAG, "AuthSubType.PIN_SIX") AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Locking); mRouterPath = URI_DIGITALPASSWORD; this.checkFaceAuthProperty(() => { @@ -156,7 +156,7 @@ export class ScreenLockService { }) break; case AuthSubType.PIN_MIXED: - Log.showInfo(TAG, "AuthSubType.PIN_MIXED") + Log.showDebug(TAG, "AuthSubType.PIN_MIXED") AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Locking); mRouterPath = URI_MIXEDPASSWORD; this.checkFaceAuthProperty(() => { @@ -164,7 +164,7 @@ export class ScreenLockService { }) break; case AuthSubType.PIN_NUMBER: - Log.showInfo(TAG, "AuthSubType.PIN_NUMBER") + Log.showDebug(TAG, "AuthSubType.PIN_NUMBER") AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Locking); mRouterPath = URI_CUSTOMPASSWORD; this.checkFaceAuthProperty(() => { @@ -172,7 +172,7 @@ export class ScreenLockService { }) break; default: - Log.showInfo(TAG, "lockStatus: unlocked") + Log.showDebug(TAG, "lockStatus: unlocked") AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Unlock); mWillRecognizeFace = false } @@ -180,7 +180,7 @@ export class ScreenLockService { } private checkFaceAuthProperty(callback: Callback) { - Log.showInfo(TAG, "checkFaceAuthProperty") + Log.showDebug(TAG, "checkFaceAuthProperty") this.accountModel.getAuthProperty(AuthType.FACE, (properties) => { Log.showInfo(TAG, `checkFaceAuthProperty:AUTH_SUB_TYPE:${properties.authSubType}`); switch (properties.authSubType) { @@ -199,12 +199,11 @@ export class ScreenLockService { Log.showInfo(TAG, `unlockScreen`); this.accountModel.isActivateAccount((isActivate: boolean) => { if (!isActivate) { - Log.showInfo(TAG, "isActivitings") return } mUnLockBeginAnimation(() => { let status = AppStorage.Link('lockStatus') - Log.showInfo(TAG, `unlocking lockStatus:${JSON.stringify(status?.get())}`); + Log.showDebug(TAG, `unlocking lockStatus:${JSON.stringify(status?.get())}`); if (status?.get() == ScreenLockStatus.Unlock) { Log.showInfo(TAG, `unlock the screen`); this.unlocking(); @@ -232,7 +231,7 @@ export class ScreenLockService { notifyScreenResult(result: UnlockResult) { Log.showInfo(TAG, `notifyScreenResult`); this.screenLockModel.sendScreenLockEvent(UNLOCK_SCREEN_RESULT, result, (error, data) => { - Log.showInfo(TAG, `notifyScreenResult: error:${JSON.stringify(error)} data:${JSON.stringify(data)}`); + Log.showDebug(TAG, `notifyScreenResult: error:${JSON.stringify(error)} data:${JSON.stringify(data)}`); }); } @@ -240,12 +239,12 @@ export class ScreenLockService { Log.showInfo(TAG, `notifyDrawDone`); //notify the base service that the screen is loaded this.screenLockModel.sendScreenLockEvent(SCREENLOCK_DRAW_DONE, 0, (error, result) => { - Log.showInfo(TAG, `notifyDrawDone: error:${JSON.stringify(error)} result:${JSON.stringify(result)}`); + Log.showDebug(TAG, `notifyDrawDone: error:${JSON.stringify(error)} result:${JSON.stringify(result)}`); }); } authUser(authSubType: AuthSubType, passwordData: number[] | string, callback): void { - Log.showInfo(TAG, `authUser authSubType:${authSubType}`); + Log.showInfo(TAG, `authUser authSubType:${authSubType}`); let password: string = ''; if (typeof passwordData == 'string') { password = passwordData; @@ -255,12 +254,12 @@ export class ScreenLockService { this.accountModel.registerPWDInputer(password).then(() => { Log.showInfo(TAG, `registerPWDInputer success`); this.accountModel.authUser(CHALLENGE_INT, AuthType.PIN, AuthTurstLevel.ATL4, (result, extraInfo) => { - Log.showInfo(TAG, `authUser callback:${result} extraInfo:${JSON.stringify(extraInfo)}`); + Log.showDebug(TAG, `authUser callback:${result} extraInfo:${JSON.stringify(extraInfo)}`); this.accountModel.unregisterInputer(); callback(result, extraInfo); }) }).catch(() => { - Log.showInfo(TAG, `registerPWDInputer fails`); + Log.showError(TAG, `registerPWDInputer fails`); }) } @@ -271,7 +270,7 @@ export class ScreenLockService { } Log.showInfo(TAG, `authUserByFace`); this.accountModel.authUser(CHALLENGE_INT, AuthType.FACE, AuthTurstLevel.ATL1, (result, extraInfo) => { - Log.showInfo(TAG, `authUserByFace callback:${result} extraInfo:${JSON.stringify(extraInfo)}`); + Log.showDebug(TAG, `authUserByFace callback:${result} extraInfo:${JSON.stringify(extraInfo)}`); if (result == 0) { AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Unlock); this.unlockScreen() @@ -286,7 +285,7 @@ export class ScreenLockService { } goBack() { - Log.showInfo(TAG, `goBack`); + Log.showInfo(TAG, `screen lock service goBack`); Router.back(); this.accountModel.unregisterInputer(); } @@ -317,7 +316,7 @@ export class ScreenLockService { if (error.code) { Log.showError(TAG, 'Operation failed. Cause: ' + JSON.stringify(error)); } else { - Log.showInfo(TAG, 'publish common event success. ' + JSON.stringify(value)); + Log.showDebug(TAG, 'publish common event success. ' + JSON.stringify(value)); } }); } diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts index 93ec41cc..7632c4b2 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts @@ -31,19 +31,18 @@ class ScreenlockStyle { private screenMode: LockStyleMode = LockStyleMode.SlideScreenLock setMode(mode: LockStyleMode): number { - Log.showInfo(TAG, 'setMode:${mode}'); + Log.showInfo(TAG, `setMode:${mode}`); return this.screenMode = mode } getMode(): number { - Log.showInfo(TAG, 'getMode'); return this.screenMode } readMode(deviceType: string): number{ Log.showInfo(TAG, `readMode deviceType:${deviceType}`); let modeJson = ReadConfigFile(FILE_URI.replace('{0}', deviceType)) - Log.showInfo(TAG, `ReadConfigFile content:` + JSON.stringify(modeJson)); + Log.showDebug(TAG, `ReadConfigFile content:` + JSON.stringify(modeJson)); this.screenMode = modeJson.mode return this.screenMode } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets index 8f2a7aa0..383b042d 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets @@ -26,11 +26,11 @@ export default struct Accounts { private mViewModel: ViewModel = new ViewModel() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) } build() { diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets index 6bfaec81..05419675 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets @@ -25,7 +25,7 @@ export default struct BatterySoc { @State batterySocText: string | Resource = '' aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.onBatterySocChanged(''); } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index 104f9e3d..dbe172c9 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -26,14 +26,14 @@ export default struct CustomPSD { @StorageLink('passwordArr') passwordArr: any[] = this.mViewModel.passwordArr aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.mViewModel.checkFreezingTime(() => { Log.showInfo(TAG, `onClick callback is called`) }); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) this.mViewModel.clearPassword() } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets index 3ad93895..30c5f503 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -26,14 +26,14 @@ export default struct DigitalPSD { @StorageLink('passwdMaskArr') passwdMaskArr: any[] = this.mViewModel.passwdMaskArr aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.mViewModel.checkFreezingTime(() => { Log.showInfo(TAG, `onClick callback is called`) }); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) this.mViewModel.clearPassword() } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets index 3153527d..23804f7a 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets @@ -26,7 +26,7 @@ export default struct LockIcon { @State mViewModel: ViewModel = new ViewModel() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() } @@ -51,7 +51,6 @@ export default struct LockIcon { } onStatusChange(propName: string): void { - Log.showInfo(TAG, `onStatusChange`) Log.showInfo(TAG, `lockStatus:${this.lockStatus}`); this.mViewModel.onStatusChange(this.lockStatus) } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets index 82bd579d..0274c0e8 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets @@ -24,14 +24,14 @@ export default struct MixedPSD { @State mViewModel: ViewModel = new ViewModel() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.mViewModel.checkFreezingTime(() => { Log.showInfo(TAG, `onClick callback is called`) }); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) this.mViewModel.clearPassword() } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets index d94dbd19..30d58e68 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets @@ -26,11 +26,11 @@ export default struct NumkeyBoard { @StorageLink('numKeyboard') numKeyboard: any[] = Constants.NUMKEY_BOARD; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) } build() { diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets index b310ab31..d50791b7 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets @@ -42,7 +42,7 @@ export default struct statusBar { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) } } \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts index 5cc35b7e..721af283 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts @@ -49,11 +49,11 @@ export default class BaseViewModel { promptText += TRY_AGAIN; setTimeout(this.countdown.bind(this), Constants.INTERVAL) } else { - Log.showInfo(TAG, `countdown clearInterval`) + Log.showDebug(TAG, `countdown clearInterval`) this.inhibitInput = false promptText = $r('app.string.input'); } - Log.showInfo(TAG, `countdown promptText:${promptText}`) + Log.showDebug(TAG, `countdown promptText:${promptText}`) this.prompt = promptText; }) } @@ -80,15 +80,13 @@ export default class BaseViewModel { this.updateStorage(callback) //notify the base service that the unlock is fail service.notifyScreenResult(UnlockResult.Fail); - Log.showInfo(TAG, `changePrompt end`) + Log.showDebug(TAG, `changePrompt end`) } getFreezingTimeNm(freezingMillisecond: number): string { - Log.showInfo(TAG, `getFreezingTimeNm start`) let minute = Math.floor(freezingMillisecond / (60 * 1000)); - Log.showInfo(TAG, `getFreezingTimeNm minute:${minute}`) let second = Math.round((freezingMillisecond % (60 * 1000)) / 1000); - Log.showInfo(TAG, `getFreezingTimeNm second:${second}`) + Log.showInfo(TAG, `getFreezingTimeNm minute:${minute}, second:${second}`) let timeName = ''; if (minute != 0) { timeName += minute + MINUTE_NM @@ -96,7 +94,6 @@ export default class BaseViewModel { if (second != 0) { timeName += second + SECOND_NM } - Log.showInfo(TAG, `getFreezingTimeNm end`) return timeName; } diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts index 3ff02956..9c6a0e8d 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts @@ -54,7 +54,6 @@ export default class CustomPSDViewModel extends BaseViewModel { service.goBack(); } else if (keyValue == Constants.CALL_PHONE) { } - Log.showInfo(TAG, `onKeyPress end`) } onCallPhone() { diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts index e83bf679..175c3cc9 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -72,8 +72,6 @@ export default class DigitalPSDViewModel extends BaseViewModel { service.goBack(); } else if (keyValue == Constants.CALL_PHONE) { } - - Log.showInfo(TAG, `onKeyPress end`) } clearPassword() { diff --git a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts index 215cdb79..43e17b66 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts @@ -58,7 +58,7 @@ export default class MixedPSDViewModel extends BaseViewModel { }); } - clearPassword() { + clearPassword() { Log.showInfo(TAG, `clearPassword`) this.password = ''; } diff --git a/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets b/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets index 933da1e2..4b8d7e08 100644 --- a/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets +++ b/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets @@ -29,7 +29,7 @@ export default struct Shortcut { private rebootLabel: Resource = $r("app.string.reboot") aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) } build() { @@ -60,11 +60,11 @@ struct ShortcutComponent { private mClickEvent: Function aboutToAppear() { - Log.showInfo(this.mTag, `aboutToAppear Start`) + Log.showDebug(this.mTag, `aboutToAppear Start`) } aboutToDisappear() { - Log.showInfo(this.mTag, `aboutToDisAppear`) + Log.showDebug(this.mTag, `aboutToDisAppear`) } build() { diff --git a/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts b/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts index 943db61f..a9415392 100644 --- a/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts +++ b/features/shortcutcomponent/src/main/ets/com/ohos/vm/shortcutViewModel.ts @@ -32,6 +32,5 @@ export default class ShortcutViewModel { default: Log.showError(TAG, `${shortcutType} is not support`) } - Log.showInfo(TAG, `onShortcutClick ${shortcutType} success`) } } \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index cf0b9300..4acf94a4 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -36,7 +36,7 @@ struct SignalIcon { @State style: any = StyleConfiguration.getSignalComponentStyle() aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear'); + Log.showDebug(TAG, 'aboutToAppear'); this.mStatusBarGroupComponentData = StatusBarVM.getStatusBarGroupComponentData(this.mGroupId) if (!this.signalObserved) { mSignalModel.initSignalModel(); @@ -45,7 +45,7 @@ struct SignalIcon { } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear'); + Log.showDebug(TAG, 'aboutToDisappear'); } build() { diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ts b/features/signalcomponent/src/main/ets/default/signalModel.ts index a31c4d6a..8740c259 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ts +++ b/features/signalcomponent/src/main/ets/default/signalModel.ts @@ -55,7 +55,7 @@ export class SignalModel { checkCellularStatus() { let cellularStatus; let slotId = 0; - Log.showInfo(TAG, 'enter checkCellularStatus ============'); + Log.showInfo(TAG, 'enter checkCellularStatus'); Sim.hasSimCard(slotId, (err, value) => { if (value === true) { @@ -69,7 +69,6 @@ export class SignalModel { mTypeLink.set(Constants.NETWORK_TYPE_UNKNOWN); } else { // Call interface succeed,error is null - Log.showInfo(TAG, `success to getSignalInformation: ${JSON.stringify(value)}`); // Since the value might be empty, set it as no signal by hand if (!value || !value.length) { Log.showError(TAG, 'value from api is empty, set 0'); @@ -82,7 +81,6 @@ export class SignalModel { } } - Log.showInfo(TAG, 'enter checknetworkState ============'); //The interface of getting the cellular signal status is unavailable temporarily Radio.getNetworkState((err, value) => { if (err) { @@ -92,7 +90,7 @@ export class SignalModel { mStateLink.set(Constants.NET_NULL); } else { // Call interface succeed,error is null - Log.showInfo(TAG, `success to getnetworkState: ${JSON.stringify(value)}`); + Log.showDebug(TAG, `success to getnetworkState: ${JSON.stringify(value)}`); // Since the value might be empty, set it as no signal by hand if (!value) { Log.showError(TAG, 'value from api is empty, set 0'); @@ -125,15 +123,15 @@ export class SignalModel { Log.showInfo(TAG, 'initObserver'); isInitObserver = true; Observer.on('signalInfoChange', (signalInfoChange) => { - Log.showInfo(TAG, `signalInfoChange ${JSON.stringify(signalInfoChange)}`); + Log.showInfo(TAG, 'signalInfoChange'); this.checkCellularStatus(); }); Observer.on('networkStateChange', (networkState) => { - Log.showInfo(TAG, `networkStateChange ${JSON.stringify(networkState)}`); + Log.showInfo(TAG, 'networkStateChange'); this.checkCellularStatus(); }); Observer.on('simStateChange', (simStateInfo) => { - Log.showInfo(TAG, `simStateChange ${JSON.stringify(simStateInfo)}`); + Log.showInfo(TAG, 'simStateChange'); this.checkCellularStatus(); }); } diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets b/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets index e6806c3b..12717d8a 100644 --- a/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets +++ b/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets @@ -24,7 +24,7 @@ export default struct Wallpaper { @State mViewModel: ViewModel = new ViewModel() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() } diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts index b41a53c4..094e8dc6 100644 --- a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts +++ b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts @@ -30,9 +30,9 @@ export default class WallpaperViewModel { Log.showInfo(TAG, 'getScreenLockWallpaper'); WallpaperMar.getPixelMap(WallpaperMar.WALLPAPER_LOCKSCREEN, (error, data) => { if (error != undefined && error != null) { - Log.showInfo(TAG, 'getScreenLockWallpaper error:' + JSON.stringify(error)); + Log.showError(TAG, 'getScreenLockWallpaper error:' + JSON.stringify(error)); } else { - Log.showInfo(TAG, 'getScreenLockWallpaper data:' + JSON.stringify(data)); + Log.showDebug(TAG, 'getScreenLockWallpaper data:' + JSON.stringify(data)); this.screenlockWallpaper = data } }) diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index 6b6712eb..4b3728db 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -34,13 +34,13 @@ export default struct WifiIcon { @State style: any = StyleConfiguration.getStartsBarWifiComponentStyle() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.mStatusBarGroupComponentData = StatusBarVM.getStatusBarGroupComponentData(this.mGroupId) mWifiModel.initWifiModel() } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) } build() { diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ts b/features/wificomponent/src/main/ets/default/wifiModel.ts index e25a9e6d..7be7604d 100644 --- a/features/wificomponent/src/main/ets/default/wifiModel.ts +++ b/features/wificomponent/src/main/ets/default/wifiModel.ts @@ -55,13 +55,13 @@ export class WifiModel { this.mIsStart = false; this.mListener.off('wifiRssiChange', (data) => { - Log.showInfo(TAG, `uninitWifiModel->wifiRssiChange, data: ${JSON.stringify(data)}`) + Log.showDebug(TAG, `uninitWifiModel->wifiRssiChange, data: ${JSON.stringify(data)}`) }); this.mListener.off('wifiConnectionChange', (data) => { - Log.showInfo(TAG, `uninitWifiModel->wifiConnectionChange, data: ${JSON.stringify(data)}`) + Log.showDebug(TAG, `uninitWifiModel->wifiConnectionChange, data: ${JSON.stringify(data)}`) }); this.mListener.off('wifiStateChange', (data) => { - Log.showInfo(TAG, `uninitWifiModel->wifiStateChange, data: ${JSON.stringify(data)}`) + Log.showDebug(TAG, `uninitWifiModel->wifiStateChange, data: ${JSON.stringify(data)}`) }); this.mListener = null; mWifiOpenStatus.set(Constants.DEFAULT_WIFI_OPEN_STATUS); @@ -91,12 +91,11 @@ export class WifiModel { } onWifiRssiChange(data) { - Log.showInfo(TAG, `onWifiRssiChange, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, 'onWifiRssiChange') this.getLinkedInfo(); } getWifiInfo() { - Log.showInfo(TAG, `getWifiInfo`) let isWifiActive = wifi.isWifiActive(); Log.showInfo(TAG, `getWifiInfo, isWifiActive: ${isWifiActive}`) mWifiOpenStatus.set(isWifiActive); @@ -108,7 +107,6 @@ export class WifiModel { } getWifiConnectInfo() { - Log.showInfo(TAG, `getWifiConnectInfo`) let isConnected = wifi.isConnected(); Log.showInfo(TAG, `getWifiConnectInfo, isConnected: ${isConnected}`) if (isConnected) { diff --git a/product/pc/src/main/ets/Application/AbilityStage.ts b/product/pc/src/main/ets/Application/AbilityStage.ts index 7df13e65..e1e71b28 100644 --- a/product/pc/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/src/main/ets/Application/AbilityStage.ts @@ -20,6 +20,6 @@ const TAG = "ScreenLock-MainAbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showInfo(TAG, "onCreate") + Log.showDebug(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index d4ae9f53..28755f22 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -26,7 +26,7 @@ const TAG = "ScreenLock-ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showInfo(TAG, 'onCreate, want:' + want.abilityName); + Log.showDebug(TAG, 'onCreate, want:' + want.abilityName); AbilityManager.setContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK, this.context) sTimeManager.init(this.context) this.statusBarWindow() @@ -38,15 +38,13 @@ class ServiceExtAbility extends ServiceExtension { windowManager.create(this.context, name, 2110).then((win) => { Log.showInfo(TAG, "before begin " + name + " window show!") win.loadContent("pages/index").then(() => { - Log.showInfo(TAG, name + " window loadContent in then! ") win.show().then(() => { - Log.showInfo(TAG, "then begin " + name + " window show in then! "); + Log.showInfo(TAG, "window show in then!"); }) }) }, (error) => { - Log.showInfo(TAG, name + " window createFailed, error.code = " + error.code) + Log.showError(TAG, name + " window createFailed, error.code = " + error.code) }) - Log.showInfo(TAG, name + " after window create") } private async statusBarWindow() { @@ -58,7 +56,7 @@ class ServiceExtAbility extends ServiceExtension { } Log.showInfo(TAG, `getDefaultDisplay, dis: ${JSON.stringify(dis)}`); let rect; - if (dis.width > dis.height) { // PadPC horizontalScreen Mode + if (dis.width > dis.height) { // Pad��PC horizontalScreen Mode rect = { left: 0, top: 0, @@ -78,11 +76,10 @@ class ServiceExtAbility extends ServiceExtension { width: dis.width, height: dis.height, }); - Log.showInfo(TAG, `createWindow success.`); } onDestroy() { - Log.showInfo(TAG, 'api8New onDestroy'); + Log.showDebug(TAG, 'api8New onDestroy'); sTimeManager.release() } } diff --git a/product/pc/src/main/ets/common/StyleManager.ts b/product/pc/src/main/ets/common/StyleManager.ts index 0918bfe1..0d46d6d2 100644 --- a/product/pc/src/main/ets/common/StyleManager.ts +++ b/product/pc/src/main/ets/common/StyleManager.ts @@ -30,27 +30,24 @@ export default class StyleManager { static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; static setStyle() { - Log.showInfo(TAG, `setStyle`) let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'dis'); - Log.showInfo(TAG, `configMaxWidth${JSON.stringify(dis.width)}`) + Log.showInfo(TAG, `setStyle, configMaxWidth${JSON.stringify(dis.width)}`) StyleManager.maxWidth = dis.width; // Common { - Log.showInfo(TAG, `setStyle_Common`) let style: any = CommonStyleConfiguration.getCommonStyle(); style.statusBarFontSize = StyleManager.calcScaleSizePx(14); style.statusBarMarginLeftRight = StyleManager.calcScaleSizePx(10); - Log.showInfo(TAG, `setStyle ${JSON.stringify(style.statusBarFontSize)}`) - Log.showInfo(TAG, `setStyle ${JSON.stringify(style.statusBarMarginLeftRight)}`) + Log.showDebug(TAG, `setStyle ${JSON.stringify(style.statusBarFontSize)}, + ${JSON.stringify(style.statusBarMarginLeftRight)}`) } // Clock { let style: any = ClockStyleConfiguration.getClockComponentStyle(); style.statusBarClockMaxWidth = StyleManager.calcScaleSizePx(37); - Log.showInfo(TAG, `statusBarClockMaxWidth ${JSON.stringify(style.statusBarClockMaxWidth)}`) - + Log.showDebug(TAG, `statusBarClockMaxWidth ${JSON.stringify(style.statusBarClockMaxWidth)}`) } // Battery-Icon @@ -73,7 +70,7 @@ export default class StyleManager { style.picLevelLowColor = '#ff0000'; style.picHeadWidth = StyleManager.calcScaleSizePx(1.5); style.picHeadHeight = StyleManager.calcScaleSizePx(5); - Log.showInfo(TAG, `picHeadHeight: ${JSON.stringify(style.picHeadHeight)}`) + Log.showDebug(TAG, `picHeadHeight: ${JSON.stringify(style.picHeadHeight)}`) } @@ -94,7 +91,7 @@ export default class StyleManager { let style: any = WifiStyleConfiguration.getStartsBarWifiComponentStyle(); style.statusBarWifiWidth = StyleManager.calcScaleSizePx(20); style.statusBarWifiHeight = StyleManager.calcScaleSizePx(20); - Log.showInfo(TAG, `statusBarWifiHeight ${JSON.stringify(style.statusBarWifiHeight)}`) + Log.showDebug(TAG, `statusBarWifiHeight ${JSON.stringify(style.statusBarWifiHeight)}`) } } diff --git a/product/pc/src/main/ets/pages/customPassword.ets b/product/pc/src/main/ets/pages/customPassword.ets index 961b8f92..b3517833 100644 --- a/product/pc/src/main/ets/pages/customPassword.ets +++ b/product/pc/src/main/ets/pages/customPassword.ets @@ -29,7 +29,7 @@ export default struct CustomPassword { @State mHeightPx: number = 44 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') @@ -38,7 +38,7 @@ export default struct CustomPassword { } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) } build() { diff --git a/product/pc/src/main/ets/pages/customscreenlock.ets b/product/pc/src/main/ets/pages/customscreenlock.ets index 514cb35e..45af5e55 100644 --- a/product/pc/src/main/ets/pages/customscreenlock.ets +++ b/product/pc/src/main/ets/pages/customscreenlock.ets @@ -25,11 +25,11 @@ export default struct CustomScreenlock { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) } onDisappear() { - Log.showInfo(TAG, `onDisappear Start`) + Log.showDebug(TAG, `onDisappear Start`) } } \ No newline at end of file diff --git a/product/pc/src/main/ets/pages/digitalPassword.ets b/product/pc/src/main/ets/pages/digitalPassword.ets index 97751fcc..8760fa4f 100644 --- a/product/pc/src/main/ets/pages/digitalPassword.ets +++ b/product/pc/src/main/ets/pages/digitalPassword.ets @@ -29,7 +29,7 @@ export default struct DigitalPassword { @State mHeightPx: number = 44 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') @@ -38,7 +38,7 @@ export default struct DigitalPassword { } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) } build() { diff --git a/product/pc/src/main/ets/pages/index.ets b/product/pc/src/main/ets/pages/index.ets index af48245b..0cf9d8d8 100644 --- a/product/pc/src/main/ets/pages/index.ets +++ b/product/pc/src/main/ets/pages/index.ets @@ -35,15 +35,15 @@ struct Index { @State mHeightPx: number = 0 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) try { setAppBgColor('#00000000') } catch (error) { - Log.showInfo(TAG, `setAppBgColor error:` + JSON.stringify(error)); + Log.showDebug(TAG, `setAppBgColor error:` + JSON.stringify(error)); } CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') - Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height StyleManager.setStyle() this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR @@ -51,19 +51,19 @@ struct Index { } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showDebug(TAG, `aboutToDisAppear`) this.pageStatus = Constants.STATUS_ABOUT_TO_DISAPPEAR this.mViewModel.ViewModelDestroy() } onPageShow() { - Log.showInfo(TAG, `onPageShow`) + Log.showDebug(TAG, `onPageShow`) this.pageStatus = Constants.STATUS_ON_PAGE_SHOW this.mViewModel.onPageShow(); } onPageHide() { - Log.showInfo(TAG, `onPageHide`) + Log.showDebugTAG, `onPageHide`) this.pageStatus = Constants.STATUS_ON_PAGE_HIDE } diff --git a/product/pc/src/main/ets/pages/journalscreenlock.ets b/product/pc/src/main/ets/pages/journalscreenlock.ets index e4359658..371db3a2 100644 --- a/product/pc/src/main/ets/pages/journalscreenlock.ets +++ b/product/pc/src/main/ets/pages/journalscreenlock.ets @@ -25,11 +25,11 @@ export default struct JournalScreenlock { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) } onDisappear() { - Log.showInfo(TAG, `onDisappear Start`) + Log.showDebug(TAG, `onDisappear Start`) } } \ No newline at end of file diff --git a/product/pc/src/main/ets/pages/mixedPassword.ets b/product/pc/src/main/ets/pages/mixedPassword.ets index 77e25deb..972c27c2 100644 --- a/product/pc/src/main/ets/pages/mixedPassword.ets +++ b/product/pc/src/main/ets/pages/mixedPassword.ets @@ -29,16 +29,16 @@ export default struct MixedPassword { @State mHeightPx: number = 44 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') - Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) StyleManager.setStyle() } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) } build() { diff --git a/product/pc/src/main/ets/pages/slidescreenlock.ets b/product/pc/src/main/ets/pages/slidescreenlock.ets index 086df03e..9563af3b 100644 --- a/product/pc/src/main/ets/pages/slidescreenlock.ets +++ b/product/pc/src/main/ets/pages/slidescreenlock.ets @@ -36,7 +36,7 @@ export default struct SlideScreenlock { private mHeightPx : number = 44 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() } diff --git a/product/pc/src/main/ets/vm/indexViewModel.ts b/product/pc/src/main/ets/vm/indexViewModel.ts index 9dd21fc2..26108969 100644 --- a/product/pc/src/main/ets/vm/indexViewModel.ts +++ b/product/pc/src/main/ets/vm/indexViewModel.ts @@ -24,29 +24,26 @@ export default class IndexViewModel { mode: LockStyleMode = LockStyleMode.SlideScreenLock ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); this.serviceInit(); this.mode = this.getMode(); Log.showInfo(TAG, `ViewModelInit this.mode=${this.mode}`); } serviceInit() { - Log.showInfo(TAG, `monitorEvents`) ScreenLockService.init(); } getMode(): number { - Log.showInfo(TAG, `getMode`) return ScreenlockStyle.readMode("pc") } onPageShow() { - Log.showInfo(TAG, `onPageShow`) + Log.showDebug(TAG, `onPageShow`) ScreenLockService.notifyDrawDone(); } ViewModelDestroy() { - Log.showInfo(TAG, 'ViewModelDestroy'); + Log.showDebug(TAG, 'ViewModelDestroy'); ScreenLockService.destroy() } } \ No newline at end of file diff --git a/product/phone/src/main/ets/AbilityStage.ts b/product/phone/src/main/ets/AbilityStage.ts index f9b1f6e2..a7a7f4e2 100644 --- a/product/phone/src/main/ets/AbilityStage.ts +++ b/product/phone/src/main/ets/AbilityStage.ts @@ -20,6 +20,6 @@ const TAG = "ScreenLock-MainAbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showInfo(TAG, "onCreate") + Log.showDebug(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 87e77c3c..31b41a8a 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -25,7 +25,7 @@ const TAG = "ScreenLock-ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showInfo(TAG, 'onCreate, want:' + want.abilityName); + Log.showDebug(TAG, 'onCreate, want:' + want.abilityName); AbilityManager.setContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK, this.context) sTimeManager.init(this.context) this.statusBarWindow() @@ -35,7 +35,6 @@ class ServiceExtAbility extends ServiceExtension { private createWindow(name: string) { Log.showInfo(TAG, `createWindow name:${name}`) windowManager.create(this.context, name, 2110).then((win) => { - Log.showInfo(TAG, "before begin " + name + " window show!") win.loadContent("pages/index").then(() => { Log.showInfo(TAG, name + " window loadContent in then! ") win.show().then(() => { @@ -43,13 +42,13 @@ class ServiceExtAbility extends ServiceExtension { }) }) }, (error) => { - Log.showInfo(TAG, name + " window createFailed, error.code = " + error.code) + Log.showError(TAG, name + " window createFailed, error.code = " + error.code) }) - Log.showInfo(TAG, name + " after window create") } + private async statusBarWindow() { let dis = await display.getDefaultDisplay(); - Log.showInfo(TAG, `api8New onCreate, dis: ${JSON.stringify(dis)}`); + Log.showDebug(TAG, `api8New onCreate, dis: ${JSON.stringify(dis)}`); let rect; if (dis.width > dis.height) { // Pad、PC horizontalScreen Mode rect = { @@ -74,9 +73,8 @@ class ServiceExtAbility extends ServiceExtension { Log.showInfo(TAG, `createWindow success.`); } - onDestroy() { - Log.showInfo(TAG, 'api8New onDestroy'); + Log.showDebug(TAG, 'api8New onDestroy'); sTimeManager.release() } diff --git a/product/phone/src/main/ets/pages/customPassword.ets b/product/phone/src/main/ets/pages/customPassword.ets index b5e4d779..13e9b4fe 100644 --- a/product/phone/src/main/ets/pages/customPassword.ets +++ b/product/phone/src/main/ets/pages/customPassword.ets @@ -29,17 +29,17 @@ export default struct CustomPassword { @State mHeightPx: number = 48 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') - Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height StyleManager.setStyle() } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) } build() { diff --git a/product/phone/src/main/ets/pages/customscreenlock.ets b/product/phone/src/main/ets/pages/customscreenlock.ets index 514cb35e..45af5e55 100644 --- a/product/phone/src/main/ets/pages/customscreenlock.ets +++ b/product/phone/src/main/ets/pages/customscreenlock.ets @@ -25,11 +25,11 @@ export default struct CustomScreenlock { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) } onDisappear() { - Log.showInfo(TAG, `onDisappear Start`) + Log.showDebug(TAG, `onDisappear Start`) } } \ No newline at end of file diff --git a/product/phone/src/main/ets/pages/digitalPassword.ets b/product/phone/src/main/ets/pages/digitalPassword.ets index 264e0257..f9d7ed1c 100644 --- a/product/phone/src/main/ets/pages/digitalPassword.ets +++ b/product/phone/src/main/ets/pages/digitalPassword.ets @@ -29,17 +29,17 @@ export default struct DigitalPassword { @State mHeightPx: number = 48 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') - Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height StyleManager.setStyle() } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) } build() { diff --git a/product/phone/src/main/ets/pages/index.ets b/product/phone/src/main/ets/pages/index.ets index 51cfbeff..f676d6c3 100644 --- a/product/phone/src/main/ets/pages/index.ets +++ b/product/phone/src/main/ets/pages/index.ets @@ -35,42 +35,42 @@ struct Index { @State mHeightPx: number = 48 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR try { setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') - Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height StyleManager.setStyle() this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR } catch (error) { - Log.showInfo(TAG, `set status error:` + JSON.stringify(error)); + Log.showError(TAG, `set status error:` + JSON.stringify(error)); } } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showDebug(TAG, `aboutToDisAppear`) this.pageStatus = Constants.STATUS_ABOUT_TO_DISAPPEAR this.mViewModel.ViewModelDestroy() } onPageShow() { - Log.showInfo(TAG, `onPageShow`) + Log.showDebug(TAG, `onPageShow`) this.pageStatus = Constants.STATUS_ON_PAGE_SHOW this.mViewModel.onPageShow(); } onPageHide() { - Log.showInfo(TAG, `onPageHide`) + Log.showDebug(TAG, `onPageHide`) this.pageStatus = Constants.STATUS_ON_PAGE_HIDE } onBackPress(): boolean { let length = Router.getLength() - Log.showInfo(TAG, `onBackPress length: ${length}`) + Log.showDebug(TAG, `onBackPress length: ${length}`) if (length > 1) { Router.back() return false diff --git a/product/phone/src/main/ets/pages/journalscreenlock.ets b/product/phone/src/main/ets/pages/journalscreenlock.ets index e4359658..371db3a2 100644 --- a/product/phone/src/main/ets/pages/journalscreenlock.ets +++ b/product/phone/src/main/ets/pages/journalscreenlock.ets @@ -25,11 +25,11 @@ export default struct JournalScreenlock { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showDebug(TAG, `aboutToAppear Start`) } onDisappear() { - Log.showInfo(TAG, `onDisappear Start`) + Log.showDebug(TAG, `onDisappear Start`) } } \ No newline at end of file diff --git a/product/phone/src/main/ets/pages/mixedPassword.ets b/product/phone/src/main/ets/pages/mixedPassword.ets index 611d4d80..36d2ed1c 100644 --- a/product/phone/src/main/ets/pages/mixedPassword.ets +++ b/product/phone/src/main/ets/pages/mixedPassword.ets @@ -29,17 +29,17 @@ export default struct MixedPassword { @State mHeightPx: number = 48 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') - Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) + Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) this.mHeightPx = configInfo.height StyleManager.setStyle() } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showDebug(TAG, `aboutToDisappear`) } build() { diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets index 2151567b..cd64cb05 100644 --- a/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -33,7 +33,7 @@ export default struct SlideScreenlock { @StorageLink('deviceStatus') @Watch('onDeviceStatusChange') deviceStatus: string = "" private mHeightPx : number = 48 aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showDebug(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() } @@ -62,7 +62,7 @@ export default struct SlideScreenlock { } .height(this.mHeightPx + 'px' ) .onAreaChange((e, e2) => { - Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + Log.showDebug(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); }) } diff --git a/product/phone/src/main/ets/vm/indexViewModel.ts b/product/phone/src/main/ets/vm/indexViewModel.ts index 8e766de8..7dacd630 100644 --- a/product/phone/src/main/ets/vm/indexViewModel.ts +++ b/product/phone/src/main/ets/vm/indexViewModel.ts @@ -23,24 +23,21 @@ export default class IndexViewModel { mode: LockStyleMode = LockStyleMode.SlideScreenLock ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); this.serviceInit(); this.mode = this.getMode(); Log.showInfo(TAG, `ViewModelInit this.mode=${this.mode}`); } serviceInit() { - Log.showInfo(TAG, `monitorEvents`) ScreenLockService.init(); } getMode(): number { - Log.showInfo(TAG, `getMode`) return ScreenlockStyle.readMode("phone") } onPageShow() { - Log.showInfo(TAG, `onPageShow`) + Log.showDebug(TAG, `onPageShow`) ScreenLockService.notifyDrawDone(); } diff --git a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts index 87d1cc91..5fd65e7c 100644 --- a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts @@ -55,7 +55,7 @@ export default class SlideScreenLockViewModel { } touchEvent(event: TouchEvent) { - Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) + Log.showDebug(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) if (event.type == Constants.TOUCHTYPE_DOWN) { this.startX = event.touches[0].screenX this.startY = event.touches[0].screenY -- Gitee From afd0cdfbd8f2053fab5b86d05435346e52d0bfda Mon Sep 17 00:00:00 2001 From: username <1037761763@qq.com> Date: Mon, 23 May 2022 14:20:39 +0800 Subject: [PATCH 100/373] =?UTF-8?q?featrues=E5=B1=82=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: username <1037761763@qq.com> --- .../com/ohos/model/notificationListener.ts | 34 +++++----- .../ohos/view/component/appItemComponent.ets | 12 ++-- .../ohos/view/component/appLstComponent.ets | 12 ++-- .../view/component/noDisturbComponent.ets | 14 ++-- .../ohos/view/component/slotItemComponent.ets | 2 +- .../ohos/view/component/slotLstComponent.ets | 10 +-- .../ohos/view/component/switchComponent.ets | 8 +-- .../ohos/vm/noDisturbComponentViewModel.ts | 36 +++++------ .../noticeItem/model/NotificationManager.ts | 12 ++-- .../noticeItem/model/NotificationService.ts | 2 +- .../noticeItem/model/rule/RuleController.ts | 6 +- .../view/NotificationListComponent.ets | 2 +- .../view/item/bannerNotificationItem.ets | 16 ++--- .../noticeItem/view/item/confirmDialog.ets | 2 +- .../ohos/noticeItem/view/item/customItem.ets | 8 +-- .../noticeItem/view/item/devicesDialog.ets | 2 +- .../ohos/noticeItem/view/item/generalItem.ets | 4 +- .../ohos/noticeItem/view/item/groupItem.ets | 6 +- .../view/item/iconListComponent.ets | 2 +- .../noticeItem/view/item/notificationItem.ets | 6 +- .../noticeItem/view/item/settingDialog.ets | 4 +- .../ets/com/ohos/model/RingModeService.ts | 14 ++-- ...rolCenterSimpleToggleRingModeComponent.ets | 10 +-- .../StatusBarIconItemRingModeComponent.ets | 12 ++-- .../main/ets/com/ohos/viewmodel/RingModeVM.ts | 8 +-- .../main/ets/default/viewmodel/SignalVM.ts | 2 +- .../ets/com/ohos/model/StatusBarService.ts | 18 +++--- .../ets/com/ohos/pages/IconItemComponent.ets | 14 ++-- .../com/ohos/pages/MetaIconItemComponent.ets | 6 +- .../ets/com/ohos/pages/StatusBarComponent.ets | 30 ++++----- .../ets/com/ohos/viewmodel/StatusBarVM.ts | 24 +++---- .../ets/default/pages/volumeComponent.ets | 6 +- .../com/ohos/common/VolumeWindowController.ts | 12 ++-- .../ets/com/ohos/model/VolumePanelService.ts | 64 +++++++++---------- .../com/ohos/pages/VolumePanelComponent.ets | 12 ++-- .../ets/com/ohos/viewmodel/VolumePanelVM.ts | 40 ++++++------ .../main/ets/default/pages/wifiComponent.ets | 14 ++-- .../src/main/ets/default/pages/wifiIcon.ets | 8 +-- .../src/main/ets/default/viewmodel/WifiVM.ts | 2 +- .../src/main/ets/default/wifiModel.ts | 26 ++++---- 40 files changed, 261 insertions(+), 261 deletions(-) diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts index 3ad0a258..bf358aa1 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts @@ -58,21 +58,21 @@ export class NotificationListener { } register(listener: EnableListener) { - Log.showInfo(TAG, `register listener:${JSON.stringify(listener)}`) + Log.showInfo(TAG, `register listener:${JSON.stringify(listener)}`); this.listeners.add(listener); - Log.showInfo(TAG, `register finished`) + Log.showInfo(TAG, `register finished`); } unRegister(listener: EnableListener) { - Log.showInfo(TAG, `unRegister`) + Log.showInfo(TAG, `unRegister`); this.listeners.delete(listener); - Log.showInfo(TAG, `unRegister finished`) + Log.showInfo(TAG, `unRegister finished`); } unRegisterAll() { - Log.showInfo(TAG, `unRegisterAll`) + Log.showInfo(TAG, `unRegisterAll`); this.listeners.clear(); - Log.showInfo(TAG, `unRegisterAll finished`) + Log.showInfo(TAG, `unRegisterAll finished`); } isNotificationEnabled(bundleOption): Promise { @@ -81,9 +81,9 @@ export class NotificationListener { Notification.isNotificationEnabled(bundleOption, (err, data) => { Log.showInfo(TAG, `isNotificationEnabled callback data:${JSON.stringify(data)} err:${JSON.stringify(err)}`) if (!!data) { - resolve(data) + resolve(data); } else { - reject(err) + reject(err); } }) }); @@ -93,35 +93,35 @@ export class NotificationListener { Log.showInfo(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`) let enableValue: boolean = data ? true : false Notification.enableNotification(bundleOption, enableValue, (err, result) => { - Log.showInfo(TAG, `enableNotification err:${JSON.stringify(err)} result:${JSON.stringify(result)} `) + Log.showInfo(TAG, `enableNotification err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); }) } notificationSlotSet(bundleOption, data) { - Log.showInfo(TAG, `notificationSlotSet bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`) + Log.showInfo(TAG, `notificationSlotSet bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); Notification.setSlotByBundle(bundleOption, data, (err, result) => { - Log.showInfo(TAG, `notificationSlotSet err:${JSON.stringify(err)} result:${JSON.stringify(result)} `) + Log.showInfo(TAG, `notificationSlotSet err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); }) } isDistributedEnabled(): Promise { - Log.showInfo(TAG, `isDistributedEnabled`) + Log.showInfo(TAG, `isDistributedEnabled`); return new Promise((resolve, reject) => { Notification.isDistributedEnabled().then((data) => { - Log.showInfo(TAG, `isDistributedEnabled data:${data}`) + Log.showInfo(TAG, `isDistributedEnabled data:${data}`); resolve(data); }).catch((err) => { - Log.showError(TAG, `isDistributedEnabled err:${JSON.stringify(err)} `) - reject(err) + Log.showError(TAG, `isDistributedEnabled err:${JSON.stringify(err)}`); + reject(err); }) }); } enableDistributed(data) { - Log.showInfo(TAG, `enableDistributed data:${JSON.stringify(data)}`) + Log.showInfo(TAG, `enableDistributed data:${JSON.stringify(data)}`); let enableValue: boolean = data ? true : false Notification.enableDistributed(enableValue, (err, result) => { - Log.showInfo(TAG, `enableDistributed err:${JSON.stringify(err)} result:${JSON.stringify(result)} `) + Log.showInfo(TAG, `enableDistributed err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); }) } } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets index 67b34bfb..4db6bdd4 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets @@ -198,35 +198,35 @@ export default struct AppItemComponent { } aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`); if (this.appSwitch === 1) { Notification.subscribeEnableChanged(); Notification.register({ bundle: this.appBundleName, onEnableChanged: (stateValue: boolean) => { - Log.showInfo(TAG, `aboutToAppear listener call`) + Log.showInfo(TAG, `aboutToAppear listener call`); this.canNotice = stateValue; } }); Notification.isNotificationEnabled({ bundle: this.appBundleName, uid: this.appUid }) .then((stateValue) => { - Log.showInfo(TAG, `Notification.isNotificationEnabled data:${JSON.stringify(stateValue)}`) + Log.showInfo(TAG, `Notification.isNotificationEnabled data:${JSON.stringify(stateValue)}`); this.canNotice = stateValue; }) .catch((error) => { - Log.showError(TAG, `Notification.isNotificationEnabled error:${JSON.stringify(error)}`) + Log.showError(TAG, `Notification.isNotificationEnabled error:${JSON.stringify(error)}`); }); } } aboutToDisappear(): void{ - Log.showInfo(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`); if (this.appSwitch === 1) { Notification.unsubscribeEnableChanged(); } } onBackPress() { - Log.showInfo(TAG, `onBackPress`) + Log.showInfo(TAG, `onBackPress`); Router.back(); } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets index 38b98301..a2349d64 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets @@ -26,20 +26,20 @@ export default struct AppLstComponent { @StorageLink('appManagementList') appList: any[]= []; aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) - ViewModel.ViewModelInit() + Log.showInfo(TAG, `aboutToAppear`); + ViewModel.ViewModelInit(); } aboutToDisappear(): void{ - Log.showInfo(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`); } onPageShow(): void{ - Log.showInfo(TAG, `onPageShow`) + Log.showInfo(TAG, `onPageShow`); } onBackPress() { - Log.showInfo(TAG, `onBackPress`) + Log.showInfo(TAG, `onBackPress`); } build() { @@ -62,7 +62,7 @@ export default struct AppLstComponent { }) } .onClick(() => { - Log.showInfo(TAG, `onClick`) + Log.showInfo(TAG, `onClick`); Router.push({ uri: item.appUri, params: item }); }) .height($r('app.float.appitem_item_height')) diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets index f8152088..1815e5b4 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets @@ -30,17 +30,17 @@ export default struct NoDisturbComponent { @State mRefreshCnt: number = 0; aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) - this.mViewModel.ViewModelInit() + Log.showInfo(TAG, `aboutToAppear`); + this.mViewModel.ViewModelInit(); this.mPrevGetCnt = 0; - this.mRefreshCnt++ + this.mRefreshCnt++; } onRefresh(propName: string): void { - Log.showInfo(TAG, `onRefresh`) - this.mViewModel.ViewModelInit() + Log.showInfo(TAG, `onRefresh`); + this.mViewModel.ViewModelInit(); this.mPrevGetCnt = 0; - this.mRefreshCnt++ + this.mRefreshCnt++; } build() { @@ -107,7 +107,7 @@ export default struct NoDisturbComponent { .width($r('app.float.toggle_comp_width')) .height($r('app.float.toggle_comp_height')) .onChange((data) => { - Log.showInfo(TAG, `Toggle onChange param: data = ${data}`) + Log.showInfo(TAG, `Toggle onChange param: data = ${data}`); if (this.mPrevGetCnt == 0) { this.mPrevReapMode = this.mViewModel.repeatMode if (this.mPrevReapMode == DoNotDisturbType.TYPE_NONE) { diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets index a085e3dd..a3769da2 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets @@ -78,6 +78,6 @@ export default struct SlotItemComponent { } aboutToAppear() { - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`); } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets index de2088b3..2605cbbb 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets @@ -48,7 +48,7 @@ export default struct SlotLstComponent { SlotItemComponent({ slotType: item.type }) } .onClick(() => { - Log.showInfo(TAG, `onClick`) + Log.showInfo(TAG, `onClick`); Router.push({ uri: this.appInfo.slotSettingUrl, params: {appInfo:this.appInfo,slotInfo:item} }); }) }); @@ -74,18 +74,18 @@ export default struct SlotLstComponent { } aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear Notification.getSlotsByBundle bundle:` + 'bundle:' + this.appInfo.appBundleName + 'uid' + this.appInfo.appUid) + Log.showInfo(TAG, `aboutToAppear Notification.getSlotsByBundle bundle:` + 'bundle:' + this.appInfo.appBundleName + 'uid' + this.appInfo.appUid); Notification.getSlotsByBundle({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }, (err, data) => { - Log.showInfo(TAG, `aboutToAppear Notification.getSlotsByBundle data:` + JSON.stringify(data)) + Log.showInfo(TAG, `aboutToAppear Notification.getSlotsByBundle data:` + JSON.stringify(data)); data.forEach((val, idx, array) => { - Log.showInfo(TAG, `aboutToAppear Notification.getSlotsByBundle data.forEach:` + JSON.stringify(val)) + Log.showInfo(TAG, `aboutToAppear Notification.getSlotsByBundle data.forEach:` + JSON.stringify(val)); this.slotLst.push(val); }) }) } onBackPress() { - Log.showInfo(TAG, `onBackPress`) + Log.showInfo(TAG, `onBackPress`); Router.back(); } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index 4c4f5a56..eac29ceb 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -73,16 +73,16 @@ export default struct SwitchComponent { } aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`); if (this.register) { - Log.showInfo(TAG, `aboutToAppear register listener`) + Log.showInfo(TAG, `aboutToAppear register listener`); this.register((stateValue: boolean) => { - Log.showInfo(TAG, `aboutToAppear listener call`) + Log.showInfo(TAG, `aboutToAppear listener call`); this.initState = stateValue; }); } this.initializationAction().then((data) => { - Log.showInfo(TAG, `initializationAction:${data}`) + Log.showInfo(TAG, `initializationAction:${data}`); this.initState = data; }) } diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts index 95f439ce..c29dd0e3 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts @@ -59,43 +59,43 @@ export default class NoDisturbComponentViewModel { type: this.repeatMode, begin: this.defaultStartTime, end: this.defaultEndTime } NoDisturbingModel.setNoDisturbingDate(noDisturbingTime, () => { - Log.showInfo(TAG, 'setNoDisturbingDate is success') + Log.showInfo(TAG, 'setNoDisturbingDate is success'); }) } setClues() { - Log.showInfo(TAG, `setClues`) + Log.showInfo(TAG, `setClues`); if (this.repeatMode == DoNotDisturbType.TYPE_DAILY || this.repeatMode == DoNotDisturbType.TYPE_ONCE || this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { - this.isEffective = true + this.isEffective = true; } else { - this.isEffective = false + this.isEffective = false; } this.setCluesWithoutSetEffect(); - Log.showInfo(TAG, `this.prompt : ${this.prompt}`) + Log.showInfo(TAG, `this.prompt : ${this.prompt}`); } setCluesWithoutSetEffect() { - Log.showInfo(TAG, `setCluesWithoutSetEffect start`) + Log.showInfo(TAG, `setCluesWithoutSetEffect start`); if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { - this.prompt = this.getDateTimeLabel(this.startTime) + ' - ' + this.getDateTimeLabel(this.endTime) - this.defaultStartTime = this.getDateByDateTime(this.startTime) - this.defaultEndTime = this.getDateByDateTime(this.endTime) + this.prompt = this.getDateTimeLabel(this.startTime) + ' - ' + this.getDateTimeLabel(this.endTime); + this.defaultStartTime = this.getDateByDateTime(this.startTime); + this.defaultEndTime = this.getDateByDateTime(this.endTime); } else if (this.repeatMode == DoNotDisturbType.TYPE_DAILY || this.repeatMode == DoNotDisturbType.TYPE_ONCE) { if (this.startTime >= this.endTime) { - this.prompt = this.startTime + ' - ' + this.nextDayLabel + this.endTime + this.prompt = this.startTime + ' - ' + this.nextDayLabel + this.endTime; } else { - this.prompt = this.startTime + ' - ' + this.endTime + this.prompt = this.startTime + ' - ' + this.endTime; } - this.defaultStartTime = this.getDateByHHMI(this.startTime) - this.defaultEndTime = this.getDateByHHMI(this.endTime) + this.defaultStartTime = this.getDateByHHMI(this.startTime); + this.defaultEndTime = this.getDateByHHMI(this.endTime); } else { this.prompt = '' - this.defaultStartTime = this.getDateByHHMI(this.startTime) - this.defaultEndTime = this.getDateByHHMI(this.endTime) + this.defaultStartTime = this.getDateByHHMI(this.startTime); + this.defaultEndTime = this.getDateByHHMI(this.endTime); } - Log.showInfo(TAG, `setCluesWithoutSetEffect end`) + Log.showInfo(TAG, `setCluesWithoutSetEffect end`); } refreshDate(repeatMode: number, inputStartTime: Date, inputEndTime: Date) { this.defaultStartTime = inputStartTime; @@ -123,7 +123,7 @@ export default class NoDisturbComponentViewModel { } getDateByHHMI(selectDate: string): Date{ - Log.showInfo(TAG, `getDateByHHMI selectDate:` + selectDate) + Log.showInfo(TAG, `getDateByHHMI selectDate:` + selectDate); let tempDate: Date = new Date() let HHmiArr = selectDate.split(':') let hour = parseInt(HHmiArr[0]) @@ -133,7 +133,7 @@ export default class NoDisturbComponentViewModel { return tempDate; } getDateByDateTime(selectDate: string): Date{ - Log.showInfo(TAG, `getDateByDateTime selectDate:` + selectDate) + Log.showInfo(TAG, `getDateByDateTime selectDate:` + selectDate); let arrayValue = this.getValuesFromDate(selectDate); let tempDate: Date = new Date() tempDate = new Date(arrayValue[ConfigData.DATE_YEAR_IDX], arrayValue[ConfigData.DATE_MONTH_IDX] - 1, diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index 5188041e..394d00e7 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -118,13 +118,13 @@ export default class NotificationManager { jsonPath: templatePath }; - Log.showInfo(TAG, `requestTemplate requestParam: ${JSON.stringify(requestParam)}`) + Log.showInfo(TAG, `requestTemplate requestParam: ${JSON.stringify(requestParam)}`); NotificationManager.request(tag, requestParam, (err, data) => { - Log.showInfo(TAG, `request finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)} templateData: ${templateName}`) + Log.showInfo(TAG, `request finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)} templateData: ${templateName}`); if (data?.componentTemplate?.source) { - Log.showInfo(TAG, `request finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`) + Log.showInfo(TAG, `request finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`); let templates = JSON.parse(data.componentTemplate.source); - Log.showInfo(TAG, `request templates: ${JSON.stringify(templates)}`) + Log.showInfo(TAG, `request templates: ${JSON.stringify(templates)}`); for (let key in templates) { NotificationManager.NotificationTemplateMap.set(key, { "source": templates[key], "ability": "" @@ -149,9 +149,9 @@ export default class NotificationManager { }; Log.showInfo(TAG, `requestDebugTemplate requestParam: ${JSON.stringify(requestParam)}`); NotificationManager.request(tag, requestParam, (err, data) => { - Log.showInfo(TAG, `requestDebugTemplate finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `requestDebugTemplate finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); if (!!data) { - Log.showInfo(TAG, `requestDebugTemplate finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`) + Log.showInfo(TAG, `requestDebugTemplate finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`); NotificationManager.NotificationTemplateMap.set(DEBUG_TEMPLATE_NAME, data.componentTemplate); } }); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index 4e2b9575..5e0502fa 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -122,7 +122,7 @@ export class NotificationService { subscribeNotification(subscriber) { let callback = (err, data) => { - Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); }; NotificationManager.subscribeNotification(TAG, subscriber, callback); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts index 25a33b41..65fbf239 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts @@ -30,7 +30,7 @@ export class RuleController { * @param {callback} Data of the type to show the notification */ getNotificationData(notificationItemData: NotificationItemData, callback) { - Log.showInfo(TAG, "getNotificationData start") + Log.showInfo(TAG, "getNotificationData start"); this.isAllowSendNotification(notificationItemData, (isSuccess) => { if (!isSuccess) { @@ -93,7 +93,7 @@ export class RuleController { * @param {callback} The type to show notification */ getNotificationDataByApp(notificationItemData, callback) { - Log.showInfo(TAG, "getNotificationDataByApp start") + Log.showInfo(TAG, "getNotificationDataByApp start"); let mNotificationItemData : NotificationItemData = notificationItemData; mNotificationItemData.ruleData = { isAllowBanner: false, @@ -138,7 +138,7 @@ export class RuleController { * @param {callback} The final notification data */ updateNotificationDataBySense(notificationItemData, callback) { - Log.showInfo(TAG, "updateNotificationDataBySense start") + Log.showInfo(TAG, "updateNotificationDataBySense start"); let mNotificationItemData = notificationItemData; // TODO Scenario Management callback(mNotificationItemData); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index 1ed225a6..a3b0535c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -34,7 +34,7 @@ export default struct NotificationListComponent { } aboutToAppear() { - Log.showInfo(TAG, `notificationList, aboutToAppear`) + Log.showInfo(TAG, `notificationList, aboutToAppear`); } aboutToDisappear() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index 2c9ea538..d5c29b8c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -56,18 +56,18 @@ export default struct BannerNotificationItem { expandPaddingBottom: number = Layout.EXPAND_PADDING_BOTTOM; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) - setAppBgColor('#00000000') + Log.showInfo(TAG, `aboutToAppear Start`); + setAppBgColor('#00000000'); this.mCloseEnableFlg = false; this.mDefaultBannerRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect'); setTimeout(() => { this.hideWindowForTimeout(); }, this.mInterval); - Log.showInfo(TAG, `aboutToAppear End`) + Log.showInfo(TAG, `aboutToAppear End`); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`); } build() { @@ -159,7 +159,7 @@ export default struct BannerNotificationItem { } hideWindowForTimeout() { - Log.showInfo(TAG, `check need hide window or not.`) + Log.showInfo(TAG, `check need hide window or not.`); if ((new Date()).getTime() - this.mLastActionTime >= this.mInterval) { if (this.mCloseEnableFlg) { this.mLastActionTime = (new Date()).getTime(); @@ -182,7 +182,7 @@ export default struct BannerNotificationItem { } showDevicesDialog() { - Log.showInfo(TAG, `showDevicesDialog`) + Log.showInfo(TAG, `showDevicesDialog`); if (!this.want?.distributedOption?.isDistributed) { ViewModel.clickItem(this.want); this.onBannerNoticeHide(); @@ -203,7 +203,7 @@ export default struct BannerNotificationItem { } selectedDevice(deviceID) { - Log.showInfo(TAG, `selectedDevice deviceID:${deviceID}`) + Log.showInfo(TAG, `selectedDevice deviceID:${deviceID}`); this.nowWant.deviceId = deviceID; let triggerInfo = { code: 0, @@ -229,7 +229,7 @@ struct ContentComponent { itemData: any; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear NotificationItemData: ${JSON.stringify(this.itemData)}`) + Log.showInfo(TAG, `aboutToAppear NotificationItemData: ${JSON.stringify(this.itemData)}`); } build() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets index 2e0f1e12..6e5d976a 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -65,7 +65,7 @@ export default struct ConfirmDialog { .fontSize($r('app.float.confirm_cont_fontsize')) .fontColor(Color.Red) }.onClick(() => { - Log.showInfo(TAG, `confirm button of TimeDialog on click`) + Log.showInfo(TAG, `confirm button of TimeDialog on click`); this.controller.close(); this.action(); }) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets index ae0d9b41..2b8dcb5e 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -31,11 +31,11 @@ export default struct CustomItem { private clickAction: () => void aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`); this.template = ViewModel.getPluginTempLate(this.customItemData.template.name); this.templateData = this.customItemData.template.data; this.isDebugMode = NotificationManager.isDebugMode(TAG); - Log.showInfo(TAG, `template = ${JSON.stringify(this.template)} templateData = ${JSON.stringify(this.templateData)} isDebugMode = ${this.isDebugMode}`) + Log.showInfo(TAG, `template = ${JSON.stringify(this.template)} templateData = ${JSON.stringify(this.templateData)} isDebugMode = ${this.isDebugMode}`); } build() { @@ -45,9 +45,9 @@ export default struct CustomItem { template: this.template, data: this.templateData }).onComplete(() => { - Log.showInfo(TAG, `Complete`) + Log.showInfo(TAG, `Complete`); }).onError(({errcode, msg}) => { - Log.showInfo(TAG, `Error code:${errcode} message:${msg}`) + Log.showInfo(TAG, `Error code:${errcode} message:${msg}`); }) .size({ width: 200, height: 110 }) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets index 4b3f28d6..7806c45e 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets @@ -103,6 +103,6 @@ export default struct DevicesDialog { aboutToAppear() { this.deviceInfoList = DistributionManager.getInstance().getTrustedDeviceListSync(); - Log.showInfo(TAG, `aboutToAppear deviceInfoList:${JSON.stringify(this.deviceInfoList)}`) + Log.showInfo(TAG, `aboutToAppear deviceInfoList:${JSON.stringify(this.deviceInfoList)}`); } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index b4bb4f79..ebb4dce6 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -42,13 +42,13 @@ export default struct GeneralItem { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`); if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { this.hasPicture = false; } else { this.hasPicture = true; } - this.needExpand = this.checkItemNeedExpand() + this.needExpand = this.checkItemNeedExpand(); ViewModel.getDistributedDeviceName(this.itemData).then((deviceName) => { this.distributedDeviceName = deviceName; }) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 52dea087..76655aad 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -33,7 +33,7 @@ export default struct GroupItem { @State @Watch('scrollEdge') mEdgeEnd: boolean = false; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`); } aboutToDisappear() { @@ -107,7 +107,7 @@ struct ContentList { aboutToAppear() { this.remainderNum = this.groupData.length - 2; - Log.showInfo(TAG, `aboutToAppear remainderNum:${this.remainderNum}`) + Log.showInfo(TAG, `aboutToAppear remainderNum:${this.remainderNum}`); } build() { @@ -188,6 +188,6 @@ struct ContentList { remainderChange() { this.remainderNum = this.groupData.length - 2; - Log.showInfo(TAG, `remainderChange remainderNum:${this.remainderNum}`) + Log.showInfo(TAG, `remainderChange remainderNum:${this.remainderNum}`); } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets index f4bf5289..08faebbc 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -82,7 +82,7 @@ export default struct IconListComponent { ] aboutToAppear() { - Log.showInfo(TAG, `iconConfigs: ${JSON.stringify(this.iconConfigs)}`) + Log.showInfo(TAG, `iconConfigs: ${JSON.stringify(this.iconConfigs)}`); iconSize = this.iconConfigs.length; } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 2adc430a..d332f678 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -93,7 +93,7 @@ struct FrontItem { } showDevicesDialog() { - Log.showInfo(TAG, `showDevicesDialog isDistributed: ${this.itemData?.distributedOption?.isDistributed}`) + Log.showInfo(TAG, `showDevicesDialog isDistributed: ${this.itemData?.distributedOption?.isDistributed}`); if (!this.itemData?.distributedOption?.isDistributed) { ViewModel.clickItem(this.itemData); return; @@ -102,7 +102,7 @@ struct FrontItem { if (!!wantAgent) { WantAgent.getWant(wantAgent).then((want) => { this.nowWant = want - Log.showInfo(TAG, `showDevicesDialog want: ${JSON.stringify(this.nowWant)}`) + Log.showInfo(TAG, `showDevicesDialog want: ${JSON.stringify(this.nowWant)}`); if (!want?.deviceId) { this.devicesDialogController.open() } else { @@ -115,7 +115,7 @@ struct FrontItem { } selectedDevice(deviceID) { - Log.showInfo(TAG, `selectedDevice deviceID:${deviceID}`) + Log.showInfo(TAG, `selectedDevice deviceID:${deviceID}`); this.nowWant.deviceId = deviceID; let triggerInfo = { code: 0, diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets index 351febca..5732777a 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -113,14 +113,14 @@ export default struct SettingDialog { } openAbility() { - Log.showInfo(TAG, ` openAbility:showNotificationManagement`) + Log.showInfo(TAG, ` openAbility:showNotificationManagement`); EventManager.publish(obtainStartAbility('com.ohos.systemui', 'com.ohos.systemui.notificationmanagement.MainAbility', { 'migrateUri': 'pages/setEnable', 'migrateBundle': this.itemData.bundleName })) this.closeAbility() } closeAbility() { - Log.showInfo(TAG, `closeAbility`) + Log.showInfo(TAG, `closeAbility`); this.controller.close() } } \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts index f8568c94..cb63a641 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts @@ -29,7 +29,7 @@ export class RingModeService { if (this.mIsStart) { return; } - Log.showInfo(TAG, `startService`) + Log.showInfo(TAG, `startService`); this.mIsStart = true; this.mAudioManager = getAudioManager(); @@ -37,7 +37,7 @@ export class RingModeService { this.getRingerMode(); this.mAudioManager.on('ringerModeChange', (data) => { - Log.showInfo(TAG, `startService->ringerModeChange, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `startService->ringerModeChange, data: ${JSON.stringify(data)}`); this.mListener?.updateRingerMode(data); }); } @@ -46,7 +46,7 @@ export class RingModeService { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `stopService`) + Log.showInfo(TAG, `stopService`); this.mIsStart = false; this.mAudioManager = null; @@ -55,13 +55,13 @@ export class RingModeService { registerListener(listener: { 'updateRingerMode': Function }) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`) + Log.showInfo(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; } getRingerMode() { this.mAudioManager.getRingerMode((error, action) => { - Log.showInfo(TAG, `getRingerMode, error: ${JSON.stringify(error)} action: ${JSON.stringify(action)}`) + Log.showInfo(TAG, `getRingerMode, error: ${JSON.stringify(error)} action: ${JSON.stringify(action)}`); if (error) { return; } @@ -70,9 +70,9 @@ export class RingModeService { } setRingerMode(mode) { - Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)}`) + Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)}`); this.mAudioManager.setRingerMode(mode, (err, data) => { - Log.showInfo(TAG, `mAudioManager.setRingerMode`) + Log.showInfo(TAG, `mAudioManager.setRingerMode`); }) } } diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets index b048cb04..b22554e0 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets @@ -35,17 +35,17 @@ export default struct ControlCenterSimpleToggleRingModeComponent { @State style: any = StyleConfiguration.getControlCenterRingModeComponentStyle() aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear') + Log.showInfo(TAG, 'aboutToAppear'); ViewModel.initViewModel() this.onRingModeUpdated('RingModeComponentMode') } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear') + Log.showInfo(TAG, 'aboutToDisappear'); } onRingModeUpdated(propName: string): void { - Log.showInfo(TAG, `onRingModeUpdated, propName: ${propName} RingModeComponentMode: ${JSON.stringify(this.RingModeComponentMode)}`) + Log.showInfo(TAG, `onRingModeUpdated, propName: ${propName} RingModeComponentMode: ${JSON.stringify(this.RingModeComponentMode)}`); if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_SILENT) { this.mIcon = $r("app.media.ic_controlcenter_ring_off_filled") this.mLabel = $r("app.string.control_center_complex_toggle_ring_mode_title_off") @@ -73,7 +73,7 @@ export default struct ControlCenterSimpleToggleRingModeComponent { } mClickEvent() { - Log.showInfo(TAG, `mClickEvent, RingModeComponentMode: ${JSON.stringify(this.RingModeComponentMode)}`) + Log.showInfo(TAG, `mClickEvent, RingModeComponentMode: ${JSON.stringify(this.RingModeComponentMode)}`); if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_SILENT) { ViewModel.setRingerMode(AudioRingMode.RINGER_MODE_NORMAL) } else if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_VIBRATE) { @@ -84,7 +84,7 @@ export default struct ControlCenterSimpleToggleRingModeComponent { } mLongClickEvent() { - Log.showInfo(TAG, `mLongClickEvent, RingModeComponentMode: ${JSON.stringify(this.RingModeComponentMode)}`) + Log.showInfo(TAG, `mLongClickEvent, RingModeComponentMode: ${JSON.stringify(this.RingModeComponentMode)}`); EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.MainAbility')) } } \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets index ac257330..98f97dab 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets @@ -31,15 +31,15 @@ export default struct StatusBarIconItemRingModeComponent { private ringModeIcons: any aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear') - this.ringModeIcons = {} - this.ringModeIcons[AudioRingMode.RINGER_MODE_SILENT.toString()] = $r("app.media.ic_statusbar_ring_off_filled") - this.ringModeIcons[AudioRingMode.RINGER_MODE_VIBRATE.toString()] = $r("app.media.ic_statusbar_vibration_on") - ViewModel.initViewModel() + Log.showInfo(TAG, 'aboutToAppear'); + this.ringModeIcons = {}; + this.ringModeIcons[AudioRingMode.RINGER_MODE_SILENT.toString()] = $r("app.media.ic_statusbar_ring_off_filled"); + this.ringModeIcons[AudioRingMode.RINGER_MODE_VIBRATE.toString()] = $r("app.media.ic_statusbar_vibration_on"); + ViewModel.initViewModel(); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear') + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts b/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts index 60bc0a5e..9d9e641b 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts @@ -30,14 +30,14 @@ export class RingModeVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.RING_MODE); constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); } initViewModel() { if (this.mIsStart) { return; } - Log.showInfo(TAG, `initViewModel `) + Log.showInfo(TAG, `initViewModel `); this.mIsStart = true; this.mRingModeComponentMode = AppStorage.SetAndLink(RingModeComponentModeKey, AudioRingMode.RINGER_MODE_NORMAL); @@ -49,12 +49,12 @@ export class RingModeVM { } updateRingerMode(mode) { - Log.showInfo(TAG, `updateRingerMode, mode: ${JSON.stringify(mode)} `) + Log.showInfo(TAG, `updateRingerMode, mode: ${JSON.stringify(mode)} `); this.mRingModeComponentMode.set(mode); } setRingerMode(mode) { - Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)} `) + Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)} `); RingModeService.setRingerMode(mode); } diff --git a/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts b/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts index d4049dcd..58313fe6 100644 --- a/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts +++ b/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts @@ -24,7 +24,7 @@ export class SignalVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.SIGNAL); constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); } getTintContentInfo(): TintContentInfo { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts index f211473b..46827d74 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -70,7 +70,7 @@ export class StatusBarService { mStatusBarAllLayout: string[] ; constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); } setStatusBarData(data: StatusBarData): void{ @@ -126,7 +126,7 @@ export class StatusBarService { } calcStatusBarLayout() { - Log.showInfo(TAG, `calcStatusBarLayout`) + Log.showInfo(TAG, `calcStatusBarLayout`); let statusBarLayout = []; for (let i = 0;i < this.mStatusBarLayoutGroupTemplate.length; i++) { let componentsTemplate = this.mStatusBarLayoutGroupTemplate[i]; @@ -185,7 +185,7 @@ export class StatusBarService { } onDisplayRotate(rotation: number) { - Log.showInfo(TAG, `onDisplayRotate, rotation: ${rotation}`) + Log.showInfo(TAG, `onDisplayRotate, rotation: ${rotation}`); let position: string = this.calcEmptyAreaPosition(rotation); this.onEmptyAreaChange(position, rotation); } @@ -292,7 +292,7 @@ export class StatusBarService { } onEmptyAreaChange(position: string, rotation: number) { - Log.showInfo(TAG, `onEmptyAreaChange, position: ${position} rotation: ${rotation}`) + Log.showInfo(TAG, `onEmptyAreaChange, position: ${position} rotation: ${rotation}`); this.calcEmptyWidth(rotation); this.setEmptyAreaToLayoutTemplate(position); let id = FASlotName.EMPTY; @@ -302,12 +302,12 @@ export class StatusBarService { if (position) { this.mStatusBarAllLayout.push(id); } - Log.showInfo(TAG, `onEmptyAreaChange, mStatusBarAllLayout: ${JSON.stringify(this.mStatusBarAllLayout)}`) + Log.showInfo(TAG, `onEmptyAreaChange, mStatusBarAllLayout: ${JSON.stringify(this.mStatusBarAllLayout)}`); this.calcStatusBarLayout(); } setEmptyAreaToLayoutTemplate(position: string) { - Log.showInfo(TAG, `setEmptyAreaToLayoutTemplate, position: ${position}`) + Log.showInfo(TAG, `setEmptyAreaToLayoutTemplate, position: ${position}`); for (let i = 0;i < this.mStatusBarLayoutGroupTemplate.length; i++) { let componentsTemplate = this.mStatusBarLayoutGroupTemplate[i]; let index = componentsTemplate.indexOf(FASlotName.EMPTY); @@ -323,11 +323,11 @@ export class StatusBarService { } else if (position == Constants.EMPTY_AREA_POSITION_RIGHT) { this.mStatusBarLayoutGroupTemplate[2].push(FASlotName.EMPTY); } - Log.showInfo(TAG, `setEmptyAreaToLayoutTemplate, template: ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`) + Log.showInfo(TAG, `setEmptyAreaToLayoutTemplate, template: ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`); } calcEmptyWidth(rotation: number) { - Log.showInfo(TAG, `calcEmptyWidth, rotation: ${rotation}`) + Log.showInfo(TAG, `calcEmptyWidth, rotation: ${rotation}`); let width: number = 0; if (this.mConfig.emptyPosition) { if (rotation == 0 || rotation == 180) { @@ -336,7 +336,7 @@ export class StatusBarService { width = this.mConfig.emptyPosition.y2 - this.mConfig.emptyPosition.y1; } } - Log.showInfo(TAG, `calcEmptyWidth, width: ${width}`) + Log.showInfo(TAG, `calcEmptyWidth, width: ${width}`); this.mListener?.setStatusBarEmptyWidth(width); } } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index a6ed2f8b..d1b7bd06 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -37,7 +37,7 @@ export default struct IconItemComponent { @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId} `) + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId} `); this.linkItemData() if (this.mItemData.get()?.relationWindowId) { this.mClearCallback = EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => this.onWindowChange(args)) @@ -45,7 +45,7 @@ export default struct IconItemComponent { } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`); this.mClearCallback && this.mClearCallback() this.mClearCallback = undefined } @@ -94,7 +94,7 @@ export default struct IconItemComponent { } onIconItemClick(event: ClickEvent) { - Log.showInfo(TAG, `onIconItemClick`) + Log.showInfo(TAG, `onIconItemClick`); if (!this.mItemStatus.selected) { this.execClickAction() } else { @@ -103,27 +103,27 @@ export default struct IconItemComponent { } execClickAction() { - Log.showInfo(TAG, `execClickAction`) + Log.showInfo(TAG, `execClickAction`); if (this.mItemData.get()?.actionData?.clickAction) { EventManager.publish(this.mItemData.get().actionData.clickAction) } } execSelectedClickAction() { - Log.showInfo(TAG, `execSelectedClickAction ${this.mItemData.get()?.actionData?.selectedClickAction}`) + Log.showInfo(TAG, `execSelectedClickAction ${this.mItemData.get()?.actionData?.selectedClickAction}`); if (this.mItemData.get()?.actionData?.selectedClickAction) { EventManager.publish(this.mItemData.get().actionData.selectedClickAction) } } onIconItemLongPressGesture(event: GestureEvent) { - Log.showInfo(TAG, `onIconItemLongPressGesture, event: ${JSON.stringify(event)}`) + Log.showInfo(TAG, `onIconItemLongPressGesture, event: ${JSON.stringify(event)}`); let longClickEvent = this.mItemData.get().actionData.longClickAction; longClickEvent && EventManager.publish(longClickEvent); } onIconItemTouch(event: TouchEvent) { - Log.showInfo(TAG, `onIconItemTouch, event: ${JSON.stringify(event)}`) + Log.showInfo(TAG, `onIconItemTouch, event: ${JSON.stringify(event)}`); if (this.mItemData.get()?.actionData?.clickAction || this.mItemData.get()?.actionData?.longClickAction) { event.stopPropagation() } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets index abb389ee..f1ab8a31 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets @@ -31,17 +31,17 @@ export default struct MetaIconItemComponent { @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); this.linkItemData() this.mTintContentInfo = ViewModel.getPluginTintContentInfo(this.keyId) } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`); } linkItemData() { - this.mItemData = AppStorage.Link('StatusBar_' + this.keyId) + this.mItemData = AppStorage.Link('StatusBar_' + this.keyId); Log.showInfo(TAG, `linkItemData, mItemData: ${this.keyId} ${this.mItemData.get().label} ${ this.mItemData.get() .iconUrl}`) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index bbcd5452..1a3d4240 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -45,18 +45,18 @@ export default struct StatusBarComponent { @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`) - this.initViewModel() - Log.showInfo(TAG, `aboutToAppear End`) + Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`); + this.initViewModel(); + Log.showInfo(TAG, `aboutToAppear End`); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`); } initViewModel() { - Log.showInfo(TAG, `initViewModel`) - ViewModel.initViewModel(this.mStatusBarComponentConfig) + Log.showInfo(TAG, `initViewModel`); + ViewModel.initViewModel(this.mStatusBarComponentConfig); } build() { @@ -115,11 +115,11 @@ struct StatusBarBackground { @State mBackgroundDatas: StatusBarBackgroundData[] = ViewModel.getBackgroundDatas() aboutToAppear() { - Log.showInfo(TAG_StatusBarBackground, `aboutToAppear`) + Log.showInfo(TAG_StatusBarBackground, `aboutToAppear`); } aboutToDisappear() { - Log.showInfo(TAG_StatusBarBackground, `aboutToDisAppear`) + Log.showInfo(TAG_StatusBarBackground, `aboutToDisAppear`); } build() { @@ -163,11 +163,11 @@ struct StatusBarGroup { @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() aboutToAppear() { - Log.showInfo(TAG_StatusBarGroup, `aboutToAppear, mLayoutWeight: ${this.mLayoutWeight} mAlignItems: ${this.mAlignItems} `) + Log.showInfo(TAG_StatusBarGroup, `aboutToAppear, mLayoutWeight: ${this.mLayoutWeight} mAlignItems: ${this.mAlignItems} `); } aboutToDisappear() { - Log.showInfo(TAG_StatusBarGroup, `aboutToDisAppear`) + Log.showInfo(TAG_StatusBarGroup, `aboutToDisAppear`); } build() { @@ -208,11 +208,11 @@ struct VerticalStatusBarItemLoadComponent { @State style: any = StyleConfiguration.getVerticalStatusBarItemLoadComponentStyle() aboutToAppear() { - Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName}`) + Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName}`); } aboutToDisappear() { - Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `aboutToDisAppear, mComponentName: ${this.mComponentName}`) + Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `aboutToDisAppear, mComponentName: ${this.mComponentName}`); } build() { @@ -286,7 +286,7 @@ struct StatusBarEmptyIcon { } aboutToDisappear() { - Log.showInfo(TAG_StatusBarEmptyIcon, `aboutToDisAppear`) + Log.showInfo(TAG_StatusBarEmptyIcon, `aboutToDisAppear`); } build() { @@ -303,11 +303,11 @@ struct StatusBarNotificationIcon { @State style: any = StyleConfiguration.getStatusBarNotificationIconStyle() aboutToAppear() { - Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToAppear`) + Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToAppear`); } aboutToDisappear() { - Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToDisAppear`) + Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToDisAppear`); } build() { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index 1d5c1171..518572c1 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -45,7 +45,7 @@ export class StatusBarVM { mUseInWindowName: WindowType = WindowType.STATUS_BAR; constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); this.mStatusBarData = AppStorage.SetAndLink(TAG + '_StatusBarData', this.mStatusBarData).get(); StatusBarService.setStatusBarData(this.mStatusBarData); @@ -86,7 +86,7 @@ export class StatusBarVM { if (this.mIsStart) { return; } - Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)}`) + Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)}`); this.mIsStart = true; this.install(); @@ -94,7 +94,7 @@ export class StatusBarVM { } setStatusBarLayout(layout: string[][]): void{ - Log.showInfo(TAG, `setStatusBarLayout, layout: ${JSON.stringify(layout)}`) + Log.showInfo(TAG, `setStatusBarLayout, layout: ${JSON.stringify(layout)}`); for (let i = 0;i < layout.length; i++) { if (JSON.stringify(layout[i]) != JSON.stringify(this.mStatusBarLayout[i])) { this.mStatusBarLayout[i] = layout[i]; @@ -103,23 +103,23 @@ export class StatusBarVM { } setStatusBarEmptyWidth(width: number): void{ - Log.showInfo(TAG, `setStatusBarEmptyWidth, width: ${width}`) + Log.showInfo(TAG, `setStatusBarEmptyWidth, width: ${width}`); this.mStatusBarEmptyWidth.set(width); } setItemData(id: string, itemData: StatusBarComponentData): void{ - Log.showInfo(TAG, `setItemData, id: ${id} itemData: ${JSON.stringify(itemData)}`) + Log.showInfo(TAG, `setItemData, id: ${id} itemData: ${JSON.stringify(itemData)}`); let storageKey: string = 'StatusBar_' + id; if (itemData) { AppStorage.SetOrCreate(storageKey, itemData); } else { let deleteRs: boolean = AppStorage.Delete(storageKey); - Log.showInfo(TAG, `setItemData, AppStorage.Delete rs: ${deleteRs} `) + Log.showInfo(TAG, `setItemData, AppStorage.Delete rs: ${deleteRs} `); } } onTintStateChange(tintState: TintState) { - Log.showInfo(TAG, `onTintStateChange, tintState: ${JSON.stringify(tintState)}`) + Log.showInfo(TAG, `onTintStateChange, tintState: ${JSON.stringify(tintState)}`); if (typeof (tintState.isEnable) == 'boolean') { this.setStatusBarEnable(tintState.isEnable); } @@ -141,7 +141,7 @@ export class StatusBarVM { } changeBackground(tintState: TintState): void{ - Log.showInfo(TAG, `changeBackground, backgroundColor: ${tintState.backgroundColor} region: ${JSON.stringify(tintState.region)}`) + Log.showInfo(TAG, `changeBackground, backgroundColor: ${tintState.backgroundColor} region: ${JSON.stringify(tintState.region)}`); let data = new StatusBarBackgroundData(); data.backgroundColor = tintState.backgroundColor; if (this.mStatusBarData.showHorizontal) { @@ -177,11 +177,11 @@ export class StatusBarVM { } } } - Log.showInfo(TAG, `changeBackground, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `changeBackground, data: ${JSON.stringify(data)}`); } changeContent(tintState: TintState): void{ - Log.showInfo(TAG, `changeContent, contentColor: ${tintState.contentColor} region: ${JSON.stringify(tintState.region)}`) + Log.showInfo(TAG, `changeContent, contentColor: ${tintState.contentColor} region: ${JSON.stringify(tintState.region)}`); let data = new StatusBarComponentGroupContentData(); data.contentColor = tintState.contentColor; if (this.mStatusBarData.showHorizontal) { @@ -217,7 +217,7 @@ export class StatusBarVM { } } } - Log.showInfo(TAG, `changeContent, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `changeContent, data: ${JSON.stringify(data)}`); this.mComponentAreaMap.forEach((value: Rect, key: string) => { this.changeComponentContent(key, value); @@ -287,7 +287,7 @@ export class StatusBarVM { } updateStatusBarData(data: StatusBarData): void{ - Log.showInfo(TAG, `updateStatusBarData, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `updateStatusBarData, data: ${JSON.stringify(data)}`); for (let key in data) { this.mStatusBarData[key] = data[key]; } diff --git a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets index d7551f53..9010c27a 100644 --- a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets +++ b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets @@ -30,16 +30,16 @@ export struct MyVol { }; aboutToAppear() { - Log.showInfo(TAG,'aboutToAppear Start init Volume!') + Log.showInfo(TAG,'aboutToAppear Start init Volume!'); this.initVolume() - Log.showInfo(TAG,'Finished init Volume!') + Log.showInfo(TAG,'Finished init Volume!'); VolumeModel.init(); VolumeModel.registerVolume(); VolumeModel.unRegisterVolume(); } aboutToDisappear () { - Log.showInfo(TAG,'aboutToDisappear') + Log.showInfo(TAG,'aboutToDisappear'); } initVolume() { diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts index e277cf9e..23ecd60c 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts @@ -35,7 +35,7 @@ export default class VolumeWindowController { constructor() { VolumePanelService.startService(); VolumePanelService.registerListener(this); - Log.showInfo(TAG, `constructor done.`) + Log.showInfo(TAG, `constructor done.`); } setInterval(interval) { @@ -43,19 +43,19 @@ export default class VolumeWindowController { } setWindowHandle(windowHandle) { - Log.showInfo(TAG, `setWindowHandle windowHandle:${windowHandle}`) + Log.showInfo(TAG, `setWindowHandle windowHandle:${windowHandle}`); this.mWindowHandle = windowHandle; } updateVolumeInfo(volumeInfo: VolumeInfo) { - Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} `) + Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} `); if (volumeInfo && !volumeInfo.updateUi && !this.mIsWindowShown) { return; } this.setWindowState(true); this.mLastActionTime = (new Date()).getTime(); setTimeout(() => { - Log.showInfo(TAG, `check need hide window or not.`) + Log.showInfo(TAG, `check need hide window or not.`); if ((new Date()).getTime() - this.mLastActionTime >= this.mInterval) { this.setWindowState(false); } @@ -65,7 +65,7 @@ export default class VolumeWindowController { setWindowState(isShow: boolean) { Log.showInfo(TAG, `setWindowState ${isShow}.`); if (this.mIsWindowShown == isShow) { - Log.showInfo(TAG, `Neen't set volueme window state.`) + Log.showInfo(TAG, `Neen't set volueme window state.`); return; } if (this.mWindowHandle) { @@ -74,7 +74,7 @@ export default class VolumeWindowController { .then(() => { Log.showInfo(TAG, `updateShowStatus ${isShow}.`); }) - .catch((err) => Log.showError(TAG, `Can't set volueme window: ${err}.`)) + .catch((err) => Log.showError(TAG, `Can't set volueme window: ${err}.`)); } } } \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts index e416c2ea..74c954fd 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts @@ -36,7 +36,7 @@ export class VolumePanelService { mInterfaceCallQueue = []; constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); } startService() { @@ -44,7 +44,7 @@ export class VolumePanelService { return; } this.mIsStart = true; - Log.showInfo(TAG, `startService`) + Log.showInfo(TAG, `startService`); this.mAudioManager.on('volumeChange', this.onVolumeChange.bind(this)); } @@ -52,7 +52,7 @@ export class VolumePanelService { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `stopService`) + Log.showInfo(TAG, `stopService`); this.mIsStart = false; } @@ -67,10 +67,10 @@ export class VolumePanelService { } async onVolumeChange(data) { - Log.showInfo(TAG, `onVolumeChange, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `onVolumeChange, data: ${JSON.stringify(data)}`); let volumeType = this.formatAudioVolumeTypeFromInterface(data.volumeType); this.isMute(volumeType, (volumeType2, data2) => { - Log.showInfo(TAG, `onVolumeChange->isMute, volumeType2: ${volumeType2} data2: ${data2}`) + Log.showInfo(TAG, `onVolumeChange->isMute, volumeType2: ${volumeType2} data2: ${data2}`); let volumeInfo: VolumeInfo = { volumeType: volumeType, volume: data.volume, @@ -82,13 +82,13 @@ export class VolumePanelService { } isMute(volumeType: AudioVolumeType, callback: Function) { - Log.showInfo(TAG, `isMute, volumeType: ${volumeType}`) + Log.showInfo(TAG, `isMute, volumeType: ${volumeType}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); this.addInterfaceCallQueue({ interfaceName: InterfaceName.isMute, params: [interfaceVolumeType], callbackFunction: (err, data) => { - Log.showInfo(TAG, `isMute, err: ${err} data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `isMute, err: ${err} data: ${JSON.stringify(data)}`); if (err) { return; } @@ -98,11 +98,11 @@ export class VolumePanelService { } getVolumeInfo(volumeType: AudioVolumeType, callback?: (volumeInfo: VolumeInfo) => void) { - Log.showInfo(TAG, `getVolumeInfo, volumeType: ${volumeType}`) + Log.showInfo(TAG, `getVolumeInfo, volumeType: ${volumeType}`); this.getVolume(volumeType, (volumeType, data) => { - Log.showInfo(TAG, `getVolumeInfo->getVolume, volumeType: ${volumeType} data: ${data}`) + Log.showInfo(TAG, `getVolumeInfo->getVolume, volumeType: ${volumeType} data: ${data}`); this.isMute(volumeType, (volumeType2, data2) => { - Log.showInfo(TAG, `getVolumeInfo->isMute, volumeType2: ${volumeType2} data2: ${data2}`) + Log.showInfo(TAG, `getVolumeInfo->isMute, volumeType2: ${volumeType2} data2: ${data2}`); let volumeInfo: VolumeInfo = { volumeType: volumeType, volume: data, @@ -118,10 +118,10 @@ export class VolumePanelService { } isActive(volumeType: AudioVolumeType, callback: Function) { - Log.showInfo(TAG, `isActive, volumeType: ${volumeType}`) + Log.showInfo(TAG, `isActive, volumeType: ${volumeType}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); this.mAudioManager.isActive(interfaceVolumeType, (err, data) => { - Log.showInfo(TAG, `isActive, err: ${err} data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `isActive, err: ${err} data: ${JSON.stringify(data)}`); if (err) { return; } @@ -130,13 +130,13 @@ export class VolumePanelService { } getVolume(volumeType: AudioVolumeType, callback: Function) { - Log.showInfo(TAG, `getVolume, volumeType: ${volumeType}`) + Log.showInfo(TAG, `getVolume, volumeType: ${volumeType}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); this.addInterfaceCallQueue({ interfaceName: InterfaceName.getVolume, params: [interfaceVolumeType], callbackFunction: (err, data) => { - Log.showInfo(TAG, `getVolume, err: ${err} data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `getVolume, err: ${err} data: ${JSON.stringify(data)}`); if (err) { return; } @@ -146,10 +146,10 @@ export class VolumePanelService { } getMaxVolume(volumeType: AudioVolumeType, callback: Function) { - Log.showInfo(TAG, `getMaxVolume, volumeType: ${volumeType}`) + Log.showInfo(TAG, `getMaxVolume, volumeType: ${volumeType}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); this.mAudioManager.getMaxVolume(interfaceVolumeType, (err, data) => { - Log.showInfo(TAG, `getMaxVolume, err: ${err} data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `getMaxVolume, err: ${err} data: ${JSON.stringify(data)}`); if (err) { return; } @@ -158,10 +158,10 @@ export class VolumePanelService { } getMinVolume(volumeType: AudioVolumeType, callback: Function) { - Log.showInfo(TAG, `getMinVolume, volumeType: ${volumeType}`) + Log.showInfo(TAG, `getMinVolume, volumeType: ${volumeType}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); this.mAudioManager.getMinVolume(interfaceVolumeType, (err, data) => { - Log.showInfo(TAG, `getMinVolume, err: ${err} data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `getMinVolume, err: ${err} data: ${JSON.stringify(data)}`); if (err) { return; } @@ -170,10 +170,10 @@ export class VolumePanelService { } setVolumeAndMute(volumeType: AudioVolumeType, volume: number, mute: boolean, callback?: () => void) { - Log.showInfo(TAG, `setVolumeAndMute, volumeType: ${volumeType} volume: ${volume} mute: ${mute}`) + Log.showInfo(TAG, `setVolumeAndMute, volumeType: ${volumeType} volume: ${volume} mute: ${mute}`); if (volume !== undefined && mute !== undefined) { this.setVolume(volumeType, volume, () => { - Log.showInfo(TAG, `setVolumeAndMute, setVolume callback volumeType: ${volumeType} volume: ${volume} mute: ${mute}`) + Log.showInfo(TAG, `setVolumeAndMute, setVolume callback volumeType: ${volumeType} volume: ${volume} mute: ${mute}`); this.setMute(volumeType, mute, callback); }); } else if (volume !== undefined) { @@ -184,13 +184,13 @@ export class VolumePanelService { } setVolume(volumeType: AudioVolumeType, volume: number, callback?: () => void) { - Log.showInfo(TAG, `setVolume, volumeType: ${volumeType} volume: ${volume}`) + Log.showInfo(TAG, `setVolume, volumeType: ${volumeType} volume: ${volume}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); this.addInterfaceCallQueue({ interfaceName: InterfaceName.setVolume, params: [interfaceVolumeType, volume], callbackFunction: (err) => { - Log.showInfo(TAG, `setVolume, callback err: ${err} `) + Log.showInfo(TAG, `setVolume, callback err: ${err} `); if (err) { return; } @@ -202,18 +202,18 @@ export class VolumePanelService { } setMute(volumeType: AudioVolumeType, mute: boolean, callback?: () => void) { - Log.showInfo(TAG, `setMute, volumeType: ${volumeType} mute: ${mute}`) + Log.showInfo(TAG, `setMute, volumeType: ${volumeType} mute: ${mute}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); this.addInterfaceCallQueue({ interfaceName: InterfaceName.mute, params: [interfaceVolumeType, mute], callbackFunction: (err) => { - Log.showInfo(TAG, `setMute, err: ${err}`) + Log.showInfo(TAG, `setMute, err: ${err}`); if (err) { return; } this.getVolumeInfo(volumeType, (volumeInfo: VolumeInfo) => { - Log.showInfo(TAG, `setMute, volumeInfo: ${JSON.stringify(volumeInfo)}`) + Log.showInfo(TAG, `setMute, volumeInfo: ${JSON.stringify(volumeInfo)}`); if (callback) { callback(); } @@ -255,7 +255,7 @@ export class VolumePanelService { params: any[], callbackFunction: Function }) { - Log.showInfo(TAG, `addInterfaceCallQueue, interfaceName: ${data.interfaceName} params: ${JSON.stringify(data.params)}`) + Log.showInfo(TAG, `addInterfaceCallQueue, interfaceName: ${data.interfaceName} params: ${JSON.stringify(data.params)}`); this.mInterfaceCallQueue.push(data); if (this.mInterfaceCallQueue.length == 1) { this.execInterfaceCallQueueFirst(); @@ -263,29 +263,29 @@ export class VolumePanelService { } execInterfaceCallQueueFirst() { - Log.showInfo(TAG, `execInterfaceCallQueueFirst, ${this.mInterfaceCallQueue.length}`) + Log.showInfo(TAG, `execInterfaceCallQueueFirst, ${this.mInterfaceCallQueue.length}`); let queueData = this.mInterfaceCallQueue[0]; if (queueData.interfaceName == InterfaceName.isMute) { this.mAudioManager.isMute(queueData.params[0], (err, data) => { - Log.showInfo(TAG, `execInterfaceCallQueueFirst, isMute callback`) + Log.showInfo(TAG, `execInterfaceCallQueueFirst, isMute callback`); this.execInterfaceCallQueueNext(); queueData.callbackFunction(err, data); }); } else if (queueData.interfaceName == InterfaceName.mute) { this.mAudioManager.mute(queueData.params[0], queueData.params[1], (err) => { - Log.showInfo(TAG, `execInterfaceCallQueueFirst, mute callback`) + Log.showInfo(TAG, `execInterfaceCallQueueFirst, mute callback`); this.execInterfaceCallQueueNext(); queueData.callbackFunction(err); }); } else if (queueData.interfaceName == InterfaceName.getVolume) { this.mAudioManager.getVolume(queueData.params[0], (err, data) => { - Log.showInfo(TAG, `execInterfaceCallQueueFirst, getVolume callback`) + Log.showInfo(TAG, `execInterfaceCallQueueFirst, getVolume callback`); this.execInterfaceCallQueueNext(); queueData.callbackFunction(err, data); }); } else if (queueData.interfaceName == InterfaceName.setVolume) { this.mAudioManager.setVolume(queueData.params[0], queueData.params[1], (err) => { - Log.showInfo(TAG, `execInterfaceCallQueueFirst, setVolume callback`) + Log.showInfo(TAG, `execInterfaceCallQueueFirst, setVolume callback`); this.execInterfaceCallQueueNext(); queueData.callbackFunction(err); }); @@ -293,7 +293,7 @@ export class VolumePanelService { } async execInterfaceCallQueueNext() { - Log.showInfo(TAG, `execInterfaceCallQueueNext, ${this.mInterfaceCallQueue.length}`) + Log.showInfo(TAG, `execInterfaceCallQueueNext, ${this.mInterfaceCallQueue.length}`); this.mInterfaceCallQueue.splice(0, 1); if (this.mInterfaceCallQueue.length > 0) { this.execInterfaceCallQueueFirst(); diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets index c0b1dd1f..8c04181e 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets @@ -31,12 +31,12 @@ export default struct VolumePanelComponent { @State style: any = StyleConfiguration.getVolumePanelComponentStyle() aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear') + Log.showInfo(TAG, 'aboutToAppear'); ViewModel.initViewModel() } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear') + Log.showInfo(TAG, 'aboutToDisappear'); } build() { @@ -124,7 +124,7 @@ export default struct VolumePanelComponent { } getVolumeIcon(isMute, volume, maxVolume, minVolume) { - Log.showInfo(TAG, `getVolumeIcon, isMute: ${isMute} volume: ${volume} maxVolume: ${maxVolume} minVolume: ${minVolume}`) + Log.showInfo(TAG, `getVolumeIcon, isMute: ${isMute} volume: ${volume} maxVolume: ${maxVolume} minVolume: ${minVolume}`); let icon if (isMute) { icon = $r('app.media.ic_public_mute') @@ -143,17 +143,17 @@ export default struct VolumePanelComponent { } onVolumeChange(value: number, mode: SliderChangeMode) { - Log.showInfo(TAG, `onVolumeChange, value: ${value} mode: ${mode}`) + Log.showInfo(TAG, `onVolumeChange, value: ${value} mode: ${mode}`); ViewModel.setVolume(value) } onMuteBtnClick(event: ClickEvent) { - Log.showInfo(TAG, `onMuteBtnClick`) + Log.showInfo(TAG, `onMuteBtnClick`); ViewModel.mute() } onSettingsBtnClick(event: ClickEvent) { - Log.showInfo(TAG, `onSettingsBtnClick`) + Log.showInfo(TAG, `onSettingsBtnClick`); AbilityManager.startAbility({ bundleName: 'com.ohos.settings', abilityName: 'com.ohos.settings.MainAbility', diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts index b6c3ee45..2228c093 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts @@ -43,14 +43,14 @@ export class VolumePanelVM { mVolumeBeforeMute: number; constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); } initViewModel() { if (this.mIsStart) { return; } - Log.showInfo(TAG, `initViewModel `) + Log.showInfo(TAG, `initViewModel `); this.mIsStart = true; this.mMaxVolume = AppStorage.SetAndLink(VolumePanelMaxVolumeKey, Constants.DEFAULT_MAX_VOLUME); @@ -74,7 +74,7 @@ export class VolumePanelVM { getInitVolumeInfo() { this.getActiveVolumeType(JSON.parse(JSON.stringify(this.mAllVolumeTypes)), (activeVolumeType: AudioVolumeType) => { - Log.showInfo(TAG, `getInitVolumeInfo, activeVolumeType: ${activeVolumeType}`) + Log.showInfo(TAG, `getInitVolumeInfo, activeVolumeType: ${activeVolumeType}`); if (activeVolumeType == undefined) { activeVolumeType = AudioVolumeType.MEDIA; } @@ -84,13 +84,13 @@ export class VolumePanelVM { } getActiveVolumeType(volumeTypes: number[], callback: Function) { - Log.showInfo(TAG, `getActiveVolumeType, volumeTypes: ${JSON.stringify(volumeTypes)}`) + Log.showInfo(TAG, `getActiveVolumeType, volumeTypes: ${JSON.stringify(volumeTypes)}`); if (volumeTypes.length == 0) { callback(undefined); return; } VolumePanelService.isActive(volumeTypes[0], (volumeType: AudioVolumeType, data: boolean) => { - Log.showInfo(TAG, `getActiveVolumeType, volumeType: ${volumeType} data: ${data}`) + Log.showInfo(TAG, `getActiveVolumeType, volumeType: ${volumeType} data: ${data}`); if (data) { callback(volumeType); } else { @@ -101,19 +101,19 @@ export class VolumePanelVM { } updateMaxVolume(volumeType: AudioVolumeType, value: number) { - Log.showInfo(TAG, `updateMaxVolume, volumeType: ${volumeType} value: ${value}`) + Log.showInfo(TAG, `updateMaxVolume, volumeType: ${volumeType} value: ${value}`); this.mVolumeBaseMap[volumeType].maxVolume = value; - Log.showInfo(TAG, `updateMaxVolume, mVolumeBaseMap: ${JSON.stringify(this.mVolumeBaseMap)}`) + Log.showInfo(TAG, `updateMaxVolume, mVolumeBaseMap: ${JSON.stringify(this.mVolumeBaseMap)}`); } updateMinVolume(volumeType: AudioVolumeType, value: number) { - Log.showInfo(TAG, `updateMinVolume, volumeType: ${volumeType} value: ${value}`) + Log.showInfo(TAG, `updateMinVolume, volumeType: ${volumeType} value: ${value}`); this.mVolumeBaseMap[volumeType].minVolume = value; - Log.showInfo(TAG, `updateMinVolume, mVolumeBaseMap: ${JSON.stringify(this.mVolumeBaseMap)}`) + Log.showInfo(TAG, `updateMinVolume, mVolumeBaseMap: ${JSON.stringify(this.mVolumeBaseMap)}`); } updateVolumeInfo(volumeInfo: VolumeInfo) { - Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} , mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType}`) + Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} , mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType}`); if (!volumeInfo.updateUi && volumeInfo.volumeType != this.mCurrentAudioVolumeType) { return; } @@ -122,35 +122,35 @@ export class VolumePanelVM { let minVolume = this.mVolumeBaseMap[volumeType].minVolume; this.mMaxVolume.set(maxVolume); this.mMinVolume.set(minVolume); - Log.showInfo(TAG, `updateVolumeInfo, mMaxVolume: ${this.mMaxVolume.get()} , mMinVolume: ${this.mMinVolume.get()}`) + Log.showInfo(TAG, `updateVolumeInfo, mMaxVolume: ${this.mMaxVolume.get()} , mMinVolume: ${this.mMinVolume.get()}`); this.mCurrentAudioVolume = volumeInfo.volume; this.mCurrentAudioVolumeType = volumeType; - Log.showInfo(TAG, `updateVolumeInfo, mCurrentAudioVolume: ${this.mCurrentAudioVolume} , mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType}`) + Log.showInfo(TAG, `updateVolumeInfo, mCurrentAudioVolume: ${this.mCurrentAudioVolume} , mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType}`); this.mVolumeBeforeMute = minVolume; this.mIsMute.set(volumeInfo.isMute); - Log.showInfo(TAG, `updateVolumeInfo, mIsMute: ${this.mIsMute.get()} `) + Log.showInfo(TAG, `updateVolumeInfo, mIsMute: ${this.mIsMute.get()} `); this.updateDisplayVolume(volumeInfo.isMute ? minVolume : volumeInfo.volume, maxVolume, minVolume); } updateDisplayVolume(volume: number, maxVolume: number, minVolume: number): void{ - Log.showInfo(TAG, `updateDisplayVolume, volume: ${volume} maxVolume: ${maxVolume} minVolume: ${minVolume}`) + Log.showInfo(TAG, `updateDisplayVolume, volume: ${volume} maxVolume: ${maxVolume} minVolume: ${minVolume}`); let displayVolume: number = volume + minVolume; this.mVolumeValue.set(displayVolume); - Log.showInfo(TAG, `updateDisplayVolume, mVolumeValue: ${this.mVolumeValue.get()}`) + Log.showInfo(TAG, `updateDisplayVolume, mVolumeValue: ${this.mVolumeValue.get()}`); } calcVolumeByDisplayVolume(displayVolume: number): number{ - Log.showInfo(TAG, `calcVolumeByDisplayVolume, displayVolume: ${displayVolume}`) + Log.showInfo(TAG, `calcVolumeByDisplayVolume, displayVolume: ${displayVolume}`); let volume: number = displayVolume + this.mMinVolume.get(); - Log.showInfo(TAG, `calcVolumeByDisplayVolume, volume: ${volume}`) + Log.showInfo(TAG, `calcVolumeByDisplayVolume, volume: ${volume}`); return volume; } setVolume(displayVolume: number) { - Log.showInfo(TAG, `setVolume, displayVolume: ${displayVolume} `) + Log.showInfo(TAG, `setVolume, displayVolume: ${displayVolume} `); let volume: number = this.calcVolumeByDisplayVolume(displayVolume); if (this.mUpdatingAudioVolume != undefined && volume == this.mUpdatingAudioVolume) { return; @@ -165,7 +165,7 @@ export class VolumePanelVM { } mute() { - Log.showInfo(TAG, `mute, isMute: ${this.mIsMute.get()} mCurrentAudioVolume: ${this.mCurrentAudioVolume}`) + Log.showInfo(TAG, `mute, isMute: ${this.mIsMute.get()} mCurrentAudioVolume: ${this.mCurrentAudioVolume}`); this.mUpdatingAudioVolume = undefined; let isMute = this.mIsMute.get(); isMute = !isMute; @@ -175,7 +175,7 @@ export class VolumePanelVM { let currentAudioVolume = this.mCurrentAudioVolume; let volumeType = this.mCurrentAudioVolumeType; VolumePanelService.setVolumeAndMute(volumeType, volume, isMute, () => { - Log.showInfo(TAG, `mute, setVolumeAndMute callback`) + Log.showInfo(TAG, `mute, setVolumeAndMute callback`); if (volumeType == this.mCurrentAudioVolumeType && this.mIsMute.get()) { this.mVolumeBeforeMute = currentAudioVolume; } diff --git a/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets b/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets index 7885436e..e80208ff 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets @@ -32,29 +32,29 @@ export default struct WifiComponent { @StorageLink('wifiOpenStatus') wifiOpenStatus: boolean = Constants.DEFAULT_WIFI_OPEN_STATUS mClickEvent() { - Log.showInfo(TAG, `mClickEvent, wifiOpenStatus: ${this.wifiOpenStatus}`) + Log.showInfo(TAG, `mClickEvent, wifiOpenStatus: ${this.wifiOpenStatus}`); if (this.wifiOpenStatus == false) { - Log.showInfo(TAG, `WLAN status is closing:${this.wifiOpenStatus} “no”, set WLAN status enableWifi`) + Log.showInfo(TAG, `WLAN status is closing:${this.wifiOpenStatus} “no”, set WLAN status enableWifi`); mWifiManger.enableWifi() } else { - Log.showInfo(TAG, `WLAN status is opening:${this.wifiOpenStatus} “yes”,se WLAN status disableWifi`) + Log.showInfo(TAG, `WLAN status is opening:${this.wifiOpenStatus} “yes”,se WLAN status disableWifi`); mWifiManger.disableWifi() } } mLongClickEvent() { - Log.showInfo(TAG, `mLongClickEvent, wifiOpenStatus: ${this.wifiOpenStatus}`) + Log.showInfo(TAG, `mLongClickEvent, wifiOpenStatus: ${this.wifiOpenStatus}`); EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.WifiAbility')) } aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear') - mWifiManger.initWifiModel() + Log.showInfo(TAG, 'aboutToAppear'); + mWifiManger.initWifiModel(); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear') + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index 483c8e35..04b242b3 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -32,12 +32,12 @@ export default struct WifiIcon { @State style: any = StyleConfiguration.getStartsBarWifiComponentStyle() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) - mWifiModel.initWifiModel() + Log.showInfo(TAG, `aboutToAppear`); + mWifiModel.initWifiModel(); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`); } build() { @@ -56,7 +56,7 @@ export default struct WifiIcon { } private getImage(wifiInfo: number) { - Log.showInfo(TAG, `getImage, wifiInfo: ${JSON.stringify(wifiInfo)}`) + Log.showInfo(TAG, `getImage, wifiInfo: ${JSON.stringify(wifiInfo)}`); let wifiImage; switch (wifiInfo) { case Constants.WIFI_SIGNAL_NO: diff --git a/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts b/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts index 5016f646..a066eb52 100644 --- a/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts +++ b/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts @@ -24,7 +24,7 @@ export class WifiVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.WIFI); constructor() { - Log.showInfo(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); } getTintContentInfo(): TintContentInfo { diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ts b/features/wificomponent/src/main/ets/default/wifiModel.ts index 41e9b9b8..30918b3c 100644 --- a/features/wificomponent/src/main/ets/default/wifiModel.ts +++ b/features/wificomponent/src/main/ets/default/wifiModel.ts @@ -32,7 +32,7 @@ export class WifiModel { if (this.mIsStart) { return; } - Log.showInfo(TAG, `initWifiModel`) + Log.showInfo(TAG, `initWifiModel`); this.mIsStart = true; mWifiInfo = AppStorage.SetAndLink("wifiInfo", Constants.DEFAULT_WIFI_INFO); @@ -51,17 +51,17 @@ export class WifiModel { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `uninitWifiModel`) + Log.showInfo(TAG, `uninitWifiModel`); this.mIsStart = false; this.mListener.off('wifiRssiChange', (data) => { - Log.showInfo(TAG, `uninitWifiModel->wifiRssiChange, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `uninitWifiModel->wifiRssiChange, data: ${JSON.stringify(data)}`); }); this.mListener.off('wifiConnectionChange', (data) => { - Log.showInfo(TAG, `uninitWifiModel->wifiConnectionChange, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `uninitWifiModel->wifiConnectionChange, data: ${JSON.stringify(data)}`); }); this.mListener.off('wifiStateChange', (data) => { - Log.showInfo(TAG, `uninitWifiModel->wifiStateChange, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `uninitWifiModel->wifiStateChange, data: ${JSON.stringify(data)}`); }); this.mListener = null; mWifiOpenStatus.set(Constants.DEFAULT_WIFI_OPEN_STATUS); @@ -69,7 +69,7 @@ export class WifiModel { } onWifiStateChange(data) { - Log.showInfo(TAG, `onWifiStateChange, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `onWifiStateChange, data: ${JSON.stringify(data)}`); let isWifiInactive = data == WifiState.STATE_OFF; mWifiOpenStatus.set(!isWifiInactive); @@ -81,7 +81,7 @@ export class WifiModel { } onWifiConnectionChange(data) { - Log.showInfo(TAG, `onWifiConnectionChange, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `onWifiConnectionChange, data: ${JSON.stringify(data)}`); if (data == WifiConnectionState.CONNECTED) { this.getLinkedInfo(); @@ -91,13 +91,13 @@ export class WifiModel { } onWifiRssiChange(data) { - Log.showInfo(TAG, `onWifiRssiChange, data: ${JSON.stringify(data)}`) + Log.showInfo(TAG, `onWifiRssiChange, data: ${JSON.stringify(data)}`); this.getLinkedInfo(); } getWifiInfo() { let isWifiActive = wifi.isWifiActive(); - Log.showInfo(TAG, `getWifiInfo, isWifiActive: ${isWifiActive}`) + Log.showInfo(TAG, `getWifiInfo, isWifiActive: ${isWifiActive}`); mWifiOpenStatus.set(isWifiActive); if (isWifiActive) { this.getWifiConnectInfo(); @@ -108,7 +108,7 @@ export class WifiModel { getWifiConnectInfo() { let isConnected = wifi.isConnected(); - Log.showInfo(TAG, `getWifiConnectInfo, isConnected: ${isConnected}`) + Log.showInfo(TAG, `getWifiConnectInfo, isConnected: ${isConnected}`); if (isConnected) { mWifiStatus.set(true); this.getLinkedInfo(); @@ -118,13 +118,13 @@ export class WifiModel { } getLinkedInfo() { - Log.showInfo(TAG, `getLinkedInfo`) + Log.showInfo(TAG, `getLinkedInfo`); wifi.getLinkedInfo((err, data) => { if (wifi.isConnected()) { mWifiStatus.set(true); mWifiName.set(data.ssid); let signalLevel = wifi.getSignalLevel(data.rssi, data.band); - Log.showInfo(TAG, `getLinkedInfo, signalLevel: ${signalLevel}`) + Log.showInfo(TAG, `getLinkedInfo, signalLevel: ${signalLevel}`); mWifiInfo.set(signalLevel); } else { this.setDisconnectedStatus(); @@ -133,7 +133,7 @@ export class WifiModel { } setDisconnectedStatus() { - Log.showInfo(TAG, `setDisconnectedStatus`) + Log.showInfo(TAG, `setDisconnectedStatus`); mWifiStatus.set(Constants.DEFAULT_WIFI_STATUS); mWifiInfo.set(Constants.DEFAULT_WIFI_INFO); mWifiName.set(Constants.DEFAULT_WIFI_NAME); -- Gitee From ba74ef24f8c1fc51293ff935330dac5631da6a8e Mon Sep 17 00:00:00 2001 From: username <1037761763@qq.com> Date: Mon, 23 May 2022 14:26:53 +0800 Subject: [PATCH 101/373] =?UTF-8?q?featrues=E5=B1=82=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: username <1037761763@qq.com> --- .../ohos/view/component/appItemComponent.ets | 8 ++--- .../ohos/view/component/appLstComponent.ets | 2 +- .../view/component/noDisturbComponent.ets | 2 +- .../ohos/view/component/slotItemComponent.ets | 2 +- .../ohos/view/component/slotLstComponent.ets | 2 +- .../ohos/view/component/switchComponent.ets | 2 +- .../view/NotificationListComponent.ets | 4 +-- .../noticeItem/view/item/actionComponent.ets | 4 +-- .../view/item/bannerNotificationItem.ets | 4 +-- .../ohos/noticeItem/view/item/customItem.ets | 2 +- .../ohos/noticeItem/view/item/generalItem.ets | 2 +- .../ohos/noticeItem/view/item/groupItem.ets | 4 +-- .../view/item/iconListComponent.ets | 2 +- .../ohos/noticeItem/view/item/titleItem.ets | 4 +-- ...rolCenterSimpleToggleRingModeComponent.ets | 4 +-- .../StatusBarIconItemRingModeComponent.ets | 4 +-- .../src/main/ets/default/pages/signalIcon.ets | 4 +-- .../ets/com/ohos/pages/IconItemComponent.ets | 4 +-- .../com/ohos/pages/MetaIconItemComponent.ets | 4 +-- .../ets/com/ohos/pages/StatusBarComponent.ets | 30 +++++++++---------- .../ets/default/pages/volumeComponent.ets | 4 +-- .../com/ohos/pages/VolumePanelComponent.ets | 4 +-- .../main/ets/default/pages/wifiComponent.ets | 4 +-- .../src/main/ets/default/pages/wifiIcon.ets | 4 +-- 24 files changed, 55 insertions(+), 55 deletions(-) diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets index 4db6bdd4..49c5ecf2 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets @@ -198,12 +198,12 @@ export default struct AppItemComponent { } aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`); + Log.showDebug(TAG, `aboutToAppear`); if (this.appSwitch === 1) { Notification.subscribeEnableChanged(); Notification.register({ bundle: this.appBundleName, onEnableChanged: (stateValue: boolean) => { - Log.showInfo(TAG, `aboutToAppear listener call`); + Log.showDebug(TAG, `aboutToAppear listener call`); this.canNotice = stateValue; } }); @@ -219,14 +219,14 @@ export default struct AppItemComponent { } aboutToDisappear(): void{ - Log.showInfo(TAG, `aboutToDisappear`); + Log.showDebug(TAG, `aboutToDisappear`); if (this.appSwitch === 1) { Notification.unsubscribeEnableChanged(); } } onBackPress() { - Log.showInfo(TAG, `onBackPress`); + Log.showDebug(TAG, `onBackPress`); Router.back(); } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets index a2349d64..7fc47a79 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets @@ -26,7 +26,7 @@ export default struct AppLstComponent { @StorageLink('appManagementList') appList: any[]= []; aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`); + Log.showDebug(TAG, `aboutToAppear`); ViewModel.ViewModelInit(); } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets index 1815e5b4..157ebf6c 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets @@ -30,7 +30,7 @@ export default struct NoDisturbComponent { @State mRefreshCnt: number = 0; aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`); + Log.showDebug(TAG, `aboutToAppear`); this.mViewModel.ViewModelInit(); this.mPrevGetCnt = 0; this.mRefreshCnt++; diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets index a3769da2..bbc476a4 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets @@ -78,6 +78,6 @@ export default struct SlotItemComponent { } aboutToAppear() { - Log.showInfo(TAG, `aboutToDisAppear`); + Log.showDebug(TAG, `aboutToDisAppear`); } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets index 2605cbbb..9be52cf9 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets @@ -85,7 +85,7 @@ export default struct SlotLstComponent { } onBackPress() { - Log.showInfo(TAG, `onBackPress`); + Log.showDebug(TAG, `onBackPress`); Router.back(); } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index eac29ceb..36c86b82 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -73,7 +73,7 @@ export default struct SwitchComponent { } aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`); + Log.showDebug(TAG, `aboutToAppear`); if (this.register) { Log.showInfo(TAG, `aboutToAppear register listener`); this.register((stateValue: boolean) => { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index a3b0535c..c9d5b94b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -34,11 +34,11 @@ export default struct NotificationListComponent { } aboutToAppear() { - Log.showInfo(TAG, `notificationList, aboutToAppear`); + Log.showDebug(TAG, `notificationList, aboutToAppear`); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`); + Log.showDebug(TAG, `aboutToDisAppear`); } build() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets index bfdf349d..632ad517 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets @@ -29,13 +29,13 @@ export default struct ActionComponent { private itemData: any = undefined; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`); + Log.showDebug(TAG, `aboutToAppear Start`); let actionData = AppStorage.Get(Constants.KEY_INPUT + this.itemData.id); this.inputActionData = (actionData instanceof InputActionButtonData) ? actionData : this.inputActionData; } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`); + Log.showDebug(TAG, `aboutToDisAppear`); } build() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index d5c29b8c..c3e00c18 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -56,7 +56,7 @@ export default struct BannerNotificationItem { expandPaddingBottom: number = Layout.EXPAND_PADDING_BOTTOM; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`); + Log.showDebug(TAG, `aboutToAppear Start`); setAppBgColor('#00000000'); this.mCloseEnableFlg = false; this.mDefaultBannerRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect'); @@ -67,7 +67,7 @@ export default struct BannerNotificationItem { } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`); + Log.showDebug(TAG, `aboutToDisAppear`); } build() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets index 2b8dcb5e..af090e18 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -31,7 +31,7 @@ export default struct CustomItem { private clickAction: () => void aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`); + Log.showDebug(TAG, `aboutToAppear Start`); this.template = ViewModel.getPluginTempLate(this.customItemData.template.name); this.templateData = this.customItemData.template.data; this.isDebugMode = NotificationManager.isDebugMode(TAG); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index ebb4dce6..b9c2e643 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -42,7 +42,7 @@ export default struct GeneralItem { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`); + Log.showDebug(TAG, `aboutToAppear Start`); if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { this.hasPicture = false; } else { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 76655aad..29581b06 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -33,11 +33,11 @@ export default struct GroupItem { @State @Watch('scrollEdge') mEdgeEnd: boolean = false; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`); + Log.showDebug(TAG, `aboutToAppear`); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`); + Log.showDebug(TAG, `aboutToDisAppear`); } expandChange() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets index 08faebbc..88d94fd7 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -82,7 +82,7 @@ export default struct IconListComponent { ] aboutToAppear() { - Log.showInfo(TAG, `iconConfigs: ${JSON.stringify(this.iconConfigs)}`); + Log.showDebug(TAG, `iconConfigs: ${JSON.stringify(this.iconConfigs)}`); iconSize = this.iconConfigs.length; } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets index 5d894315..cf98da15 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets @@ -32,11 +32,11 @@ export default struct TitleItem { private clickTitleAction: () => void aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`); + Log.showDebug(TAG, `aboutToAppear Start`); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisAppear`); + Log.showDebug(TAG, `aboutToDisAppear`); } build() { diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets index b22554e0..0026be02 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets @@ -35,13 +35,13 @@ export default struct ControlCenterSimpleToggleRingModeComponent { @State style: any = StyleConfiguration.getControlCenterRingModeComponentStyle() aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear'); + Log.showDebug(TAG, 'aboutToAppear'); ViewModel.initViewModel() this.onRingModeUpdated('RingModeComponentMode') } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear'); + Log.showDebug(TAG, 'aboutToDisappear'); } onRingModeUpdated(propName: string): void { diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets index 98f97dab..0a2a6a8f 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets @@ -31,7 +31,7 @@ export default struct StatusBarIconItemRingModeComponent { private ringModeIcons: any aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear'); + Log.showDebug(TAG, 'aboutToAppear'); this.ringModeIcons = {}; this.ringModeIcons[AudioRingMode.RINGER_MODE_SILENT.toString()] = $r("app.media.ic_statusbar_ring_off_filled"); this.ringModeIcons[AudioRingMode.RINGER_MODE_VIBRATE.toString()] = $r("app.media.ic_statusbar_vibration_on"); @@ -39,7 +39,7 @@ export default struct StatusBarIconItemRingModeComponent { } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear'); + Log.showDebug(TAG, 'aboutToDisappear'); } build() { diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index b348b532..41a3e5b5 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -35,7 +35,7 @@ struct SignalIcon { @State style: any = StyleConfiguration.getSignalComponentStyle() aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear'); + Log.showDebug(TAG, 'aboutToAppear'); if (!this.signalObserved) { mSignalModel.initSignalModel(); this.signalObserved = true; @@ -43,7 +43,7 @@ struct SignalIcon { } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear'); + Log.showDebug(TAG, 'aboutToDisappear'); } build() { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index d1b7bd06..9ff15ff9 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -37,7 +37,7 @@ export default struct IconItemComponent { @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId} `); + Log.showDebug(TAG, `aboutToAppear Start, keyId: ${this.keyId} `); this.linkItemData() if (this.mItemData.get()?.relationWindowId) { this.mClearCallback = EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => this.onWindowChange(args)) @@ -45,7 +45,7 @@ export default struct IconItemComponent { } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`); + Log.showDebug(TAG, `aboutToDisappear`); this.mClearCallback && this.mClearCallback() this.mClearCallback = undefined } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets index f1ab8a31..46bd6dc0 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets @@ -31,13 +31,13 @@ export default struct MetaIconItemComponent { @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); + Log.showDebug(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); this.linkItemData() this.mTintContentInfo = ViewModel.getPluginTintContentInfo(this.keyId) } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`); + Log.showDebug(TAG, `aboutToDisappear`); } linkItemData() { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index 1a3d4240..f463c615 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -45,13 +45,13 @@ export default struct StatusBarComponent { @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`); + Log.showDebug(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`); this.initViewModel(); - Log.showInfo(TAG, `aboutToAppear End`); + Log.showDebug(TAG, `aboutToAppear End`); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`); + Log.showDebug(TAG, `aboutToDisappear`); } initViewModel() { @@ -115,11 +115,11 @@ struct StatusBarBackground { @State mBackgroundDatas: StatusBarBackgroundData[] = ViewModel.getBackgroundDatas() aboutToAppear() { - Log.showInfo(TAG_StatusBarBackground, `aboutToAppear`); + Log.showDebug(TAG_StatusBarBackground, `aboutToAppear`); } aboutToDisappear() { - Log.showInfo(TAG_StatusBarBackground, `aboutToDisAppear`); + Log.showDebug(TAG_StatusBarBackground, `aboutToDisAppear`); } build() { @@ -163,11 +163,11 @@ struct StatusBarGroup { @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() aboutToAppear() { - Log.showInfo(TAG_StatusBarGroup, `aboutToAppear, mLayoutWeight: ${this.mLayoutWeight} mAlignItems: ${this.mAlignItems} `); + Log.showDebug(TAG_StatusBarGroup, `aboutToAppear, mLayoutWeight: ${this.mLayoutWeight} mAlignItems: ${this.mAlignItems} `); } aboutToDisappear() { - Log.showInfo(TAG_StatusBarGroup, `aboutToDisAppear`); + Log.showDebug(TAG_StatusBarGroup, `aboutToDisAppear`); } build() { @@ -208,11 +208,11 @@ struct VerticalStatusBarItemLoadComponent { @State style: any = StyleConfiguration.getVerticalStatusBarItemLoadComponentStyle() aboutToAppear() { - Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName}`); + Log.showDebug(TAG_VerticalStatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName}`); } aboutToDisappear() { - Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `aboutToDisAppear, mComponentName: ${this.mComponentName}`); + Log.showDebug(TAG_VerticalStatusBarItemLoadComponent, `aboutToDisAppear, mComponentName: ${this.mComponentName}`); } build() { @@ -235,11 +235,11 @@ struct StatusBarItemLoadComponent { private mComponentName: string aboutToAppear() { - Log.showInfo(TAG_StatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName} `) + Log.showDebug(TAG_StatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName} `) } aboutToDisappear() { - Log.showInfo(TAG_StatusBarGroup, `aboutToDisAppear, mComponentName: ${this.mComponentName} `) + Log.showDebug(TAG_StatusBarGroup, `aboutToDisAppear, mComponentName: ${this.mComponentName} `) } build() { @@ -282,11 +282,11 @@ struct StatusBarEmptyIcon { @State mTintContentInfo: TintContentInfo = ViewModel.getEmptyTintContentInfo() aboutToAppear() { - Log.showInfo(TAG_StatusBarEmptyIcon, `aboutToAppear, mStatusBarEmptyWidth: ${this.mStatusBarEmptyWidth} `) + Log.showDebug(TAG_StatusBarEmptyIcon, `aboutToAppear, mStatusBarEmptyWidth: ${this.mStatusBarEmptyWidth} `) } aboutToDisappear() { - Log.showInfo(TAG_StatusBarEmptyIcon, `aboutToDisAppear`); + Log.showDebug(TAG_StatusBarEmptyIcon, `aboutToDisAppear`); } build() { @@ -303,11 +303,11 @@ struct StatusBarNotificationIcon { @State style: any = StyleConfiguration.getStatusBarNotificationIconStyle() aboutToAppear() { - Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToAppear`); + Log.showDebug(TAG_StatusBarNotificationIcon, `aboutToAppear`); } aboutToDisappear() { - Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToDisAppear`); + Log.showDebug(TAG_StatusBarNotificationIcon, `aboutToDisAppear`); } build() { diff --git a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets index 9010c27a..3b2c7d6e 100644 --- a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets +++ b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets @@ -30,7 +30,7 @@ export struct MyVol { }; aboutToAppear() { - Log.showInfo(TAG,'aboutToAppear Start init Volume!'); + Log.showDebug(TAG,'aboutToAppear Start init Volume!'); this.initVolume() Log.showInfo(TAG,'Finished init Volume!'); VolumeModel.init(); @@ -39,7 +39,7 @@ export struct MyVol { } aboutToDisappear () { - Log.showInfo(TAG,'aboutToDisappear'); + Log.showDebug(TAG,'aboutToDisappear'); } initVolume() { diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets index 8c04181e..d85edaed 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets @@ -31,12 +31,12 @@ export default struct VolumePanelComponent { @State style: any = StyleConfiguration.getVolumePanelComponentStyle() aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear'); + Log.showDebug(TAG, 'aboutToAppear'); ViewModel.initViewModel() } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear'); + Log.showDebug(TAG, 'aboutToDisappear'); } build() { diff --git a/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets b/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets index e80208ff..19b63d73 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiComponent.ets @@ -49,12 +49,12 @@ export default struct WifiComponent { } aboutToAppear() { - Log.showInfo(TAG, 'aboutToAppear'); + Log.showDebug(TAG, 'aboutToAppear'); mWifiManger.initWifiModel(); } aboutToDisappear() { - Log.showInfo(TAG, 'aboutToDisappear'); + Log.showDebug(TAG, 'aboutToDisappear'); } build() { diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index 04b242b3..612a1db3 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -32,12 +32,12 @@ export default struct WifiIcon { @State style: any = StyleConfiguration.getStartsBarWifiComponentStyle() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`); + Log.showDebug(TAG, `aboutToAppear`); mWifiModel.initWifiModel(); } aboutToDisappear() { - Log.showInfo(TAG, `aboutToDisappear`); + Log.showDebug(TAG, `aboutToDisappear`); } build() { -- Gitee From 05fdee22175ae8f7ee9f438ac861a08174407c62 Mon Sep 17 00:00:00 2001 From: panshunli Date: Mon, 23 May 2022 15:00:23 +0800 Subject: [PATCH 102/373] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83ux?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: panshunli --- .../noticeItem/view/item/confirmDialog.ets | 8 +- .../noticeItem/view/item/devicesDialog.ets | 2 +- .../ohos/noticeItem/view/item/generalItem.ets | 3 +- .../ohos/noticeItem/view/item/groupItem.ets | 7 +- .../view/item/iconListComponent.ets | 2 + .../noticeItem/view/item/settingDialog.ets | 9 +- .../ohos/noticeItem/view/item/titleItem.ets | 2 +- .../main/resources/base/element/color.json | 8 +- .../main/resources/base/element/float.json | 4 + .../main/resources/phone/element/color.json | 12 ++ .../main/resources/phone/element/float.json | 116 ++++++++++++++++++ .../src/main/ets/pages/notification.ets | 47 ++++--- .../main/resources/base/element/color.json | 4 + .../main/resources/base/element/float.json | 4 + .../resources/base/media/ic_public_delete.svg | 13 ++ .../base/media/ic_public_delete_filled.svg | 13 ++ .../base/media/ic_public_settings.svg | 13 ++ .../main/resources/phone/element/color.json | 4 + .../main/resources/phone/element/float.json | 8 ++ 19 files changed, 246 insertions(+), 33 deletions(-) create mode 100644 features/noticeitem/src/main/resources/phone/element/color.json create mode 100644 features/noticeitem/src/main/resources/phone/element/float.json create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/phone/element/float.json diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets index 2e0f1e12..6803822f 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -44,11 +44,11 @@ export default struct ConfirmDialog { }.width($r('app.float.confirm_dialog_row_width')) .margin({ top: $r('app.float.message_font_margin_t') }) - Row() { + Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}) { Column() { Text($r('app.string.cancel')) .fontSize($r('app.float.confirm_cont_fontsize')) - .fontColor(Color.Blue) + .fontColor($r("app.color.button_text_color")) }.onClick(() => { this.controller.close(); }) @@ -63,7 +63,7 @@ export default struct ConfirmDialog { Column() { Text($r('app.string.close')) .fontSize($r('app.float.confirm_cont_fontsize')) - .fontColor(Color.Red) + .fontColor($r("app.color.button_text_color")) }.onClick(() => { Log.showInfo(TAG, `confirm button of TimeDialog on click`) this.controller.close(); @@ -76,7 +76,7 @@ export default struct ConfirmDialog { .margin({ top: $r('app.float.confirm_button_margin_t') }) }.height($r('app.float.confirm_dialog_height')) .width($r('app.float.confirm_dialog_width')) - .backgroundColor('#FFFFFFFF') + .backgroundColor('#FFFFFF') .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.notification_border_radius') }) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets index 6b8fce71..cc296cea 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets @@ -85,7 +85,7 @@ export default struct DevicesDialog { Column() { Text($r('app.string.cancel')) .fontSize($r('app.float.device_button_font')) - .fontColor(Color.Blue) + .fontColor($r("app.color.button_text_color")) }.onClick(() => { this.controller.close(); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index 2374770f..293b8175 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import Constants, { NotificationLayout as Layout } from '../../common/constants'; import basicItem from './basicItem'; import longItem from './longItem'; import multiItem from './multiItem'; @@ -138,6 +138,7 @@ struct ContentComponent { .objectFit(ImageFit.Contain) .width(Layout.NOTIFICATION_PIC_SIZE) .height(Layout.NOTIFICATION_PIC_SIZE) + .borderRadius($r("app.float.notice_image_boderRadius")) } }.margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index cc0dab78..bbca5309 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -14,10 +14,10 @@ */ import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; -import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import Constants, { NotificationLayout as Layout } from '../../common/constants'; import NotificationItem from './notificationItem' import titleItem from './titleItem'; -import IconListComponent, {getIconListSize} from './iconListComponent'; +import IconListComponent, { getIconListSize } from './iconListComponent'; import ScrollbarManager from '../../common/ScrollbarManager'; const TAG = 'NoticeItem-GroupItem'; @@ -62,6 +62,9 @@ export default struct GroupItem { }.backgroundColor($r('app.color.notificationitem_background')) .width(Constants.FULL_CONTAINER_WIDTH) + if (this.toExpand) { + Row().height(1).width('100%') + } Row() { ContentList({ groupData: this.groupData, toExpand: this.toExpand }) }.width(Constants.FULL_CONTAINER_WIDTH) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets index f4bf5289..af0dcdb0 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -47,6 +47,7 @@ export default struct IconListComponent { action: () => this.confirmDialogController.open() }), autoCancel: false, + alignment:DialogAlignment.Bottom, offset: { dx: 0, dy: $r('app.float.setting_dialog_dy') }, customStyle:true }); @@ -57,6 +58,7 @@ export default struct IconListComponent { action: () => ViewModel.enableNotification(this.itemData, false) }), autoCancel: false, + alignment:DialogAlignment.Bottom, offset: { dx: 0, dy: $r('app.float.confirm_dialog_dy') }, customStyle:true }); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets index 351febca..cad5ba6b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -69,7 +69,7 @@ export default struct SettingDialog { Column() { Text($r('app.string.moreSettings')) .fontSize($r('app.float.setting_cont_fontsize')) - .fontColor($r('app.color.dialog_font_back_color')) + .fontColor($r('app.color.button_text_color')) .height($r('app.float.setting_dialog_row_height')) }.alignItems(HorizontalAlign.Center) .width(Constants.SETTING_CONTENT_WITH) @@ -88,7 +88,7 @@ export default struct SettingDialog { .maxLines(Constants.DEFAULT_MAX_LINES) .textOverflow({ overflow: TextOverflow.Ellipsis }) .fontSize($r('app.float.setting_cont_fontsize')) - .fontColor($r('app.color.dialog_font_back_color')) + .fontColor($r('app.color.button_text_color')) }.alignItems(HorizontalAlign.Center) .width(Constants.SETTING_CONTENT_WITH) } @@ -100,9 +100,10 @@ export default struct SettingDialog { radius: $r('app.float.setting_border_radius') }) .backgroundColor($r('app.color.dialog_font_color')) .onClick(this.closeAbility.bind(this)) - }.height($r('app.float.setting_dialog_height')) + } + .height($r('app.float.setting_dialog_height')) .width($r('app.float.setting_dialog_width')) - .backgroundColor('#FFFFFFFF') + .backgroundColor('#FFFFFF') .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.notification_border_radius') }) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets index 5d894315..8474ac1c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import Constants, { NotificationLayout as Layout } from '../../common/constants'; import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; diff --git a/features/noticeitem/src/main/resources/base/element/color.json b/features/noticeitem/src/main/resources/base/element/color.json index da334c07..974d5c02 100644 --- a/features/noticeitem/src/main/resources/base/element/color.json +++ b/features/noticeitem/src/main/resources/base/element/color.json @@ -2,7 +2,7 @@ "color": [ { "name":"notificationitem_background", - "value":"#ffffffff" + "value":"#8CFAFAFA" }, { "name":"title_text_color", @@ -50,7 +50,11 @@ }, { "name": "device_divider_color", - "value": "#E3E3E3" + "value": "transparent" + }, + { + "name": "button_text_color", + "value": "#007DFF" } ] } \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index 243d6b67..a2eeb1cf 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -215,6 +215,10 @@ { "name": "device_margin_16", "value": "16fp" + }, + { + "name": "notice_image_boderRadius", + "value": "0" } ] } \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/phone/element/color.json b/features/noticeitem/src/main/resources/phone/element/color.json new file mode 100644 index 00000000..23f6370e --- /dev/null +++ b/features/noticeitem/src/main/resources/phone/element/color.json @@ -0,0 +1,12 @@ +{ + "color": [ + { + "name": "button_text_color", + "value": "#007DFF" + }, + { + "name":"dialog_font_back_color", + "value":"#007DFF" + } + ] +} \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/phone/element/float.json b/features/noticeitem/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..17f0aa9d --- /dev/null +++ b/features/noticeitem/src/main/resources/phone/element/float.json @@ -0,0 +1,116 @@ +{ + "float": [ + { + "name": "title_image_width", + "value": "24vp" + }, + { + "name": "title_image_height", + "value": "24vp" + }, + { + "name": "title_font_height", + "value": "28vp" + }, + { + "name": "title_font_margin_t", + "value": "11vp" + }, + { + "name": "message_font_margin_t", + "value": "17.65vp" + }, + { + "name": "setting_title_fontsize", + "value": "20vp" + }, + { + "name": "setting_cont_fontsize", + "value": "16vp" + }, + { + "name": "setting_border_width", + "value": "0.5vp" + }, + { + "name": "setting_border_radius", + "value": "24vp" + }, + { + "name": "setting_dialog_height", + "value": "192vp" + }, + { + "name": "setting_dialog_width", + "value": "336vp" + }, + { + "name": "setting_dialog_row_width", + "value": "304vp" + }, + { + "name": "setting_dialog_row_height", + "value": "40vp" + }, + { + "name": "confirm_dialog_height", + "value": "142vp" + }, + { + "name": "confirm_dialog_width", + "value": "336vp" + }, + { + "name": "confirm_dialog_row_width", + "value": "288vp" + }, + { + "name": "confirm_dialog_button_width", + "value": "127.59vp" + }, + { + "name": "confirm_title_fontsize", + "value": "20vp" + }, + { + "name": "confirm_cont_fontsize", + "value": "16vp" + }, + { + "name": "confirm_divider_height", + "value": "22vp" + }, + { + "name": "confirm_button_height", + "value": "30vp" + }, + { + "name": "confirm_button_margin_t", + "value": "25vp" + }, + { + "name": "setting_dialog_dy", + "value": "-12vp" + }, + { + "name": "confirm_dialog_dy", + "value": "-12vp" + }, + { + "name": "notification_appname_margin_top", + "value": "11vp" + }, + { + "name": "close_notification_margin_top", + "value": "17vp" + }, + { + "name": "notification_cancle_margin_top", + "value": "13.28vp" + }, + { + "name": "notice_image_boderRadius", + "value": "12" + } + ] +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 3447619b..671f574d 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -14,8 +14,8 @@ */ import Log from '../../../../../../../common/src/main/ets/default/log' -import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager" -import {obtainStartAbility} from "../../../../../../../common/src/main/ets/default/event/eventutil" +import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/eventmanager" +import { obtainStartAbility } from "../../../../../../../common/src/main/ets/default/event/eventutil" import Constants from './common/constants' import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryicon' import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockicon' @@ -27,16 +27,19 @@ import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/ma import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/notificationlistcomponent' import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/viewmodel' import ResourceUtil from '../../../../../../../common/src/main/ets/default/resourceutil' -import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT } from '../../../../../../../common/src/main/ets/default/timemanager' +import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT +} from '../../../../../../../common/src/main/ets/default/timemanager' const TAG = 'DropdownPanel-notification' const GRID_SIZE = 6; -const IMAGE_SIZE_L = 40; -const IMAGE_SIZE_S = 48; +const IMAGE_SIZE_L = 24; +const IMAGE_SIZE_S = 20; +const BGC_SIZE_L = 40; const NO_NOTIFICATION_TOP_MARGIN = 40; -const TIME_TEXT_MARGIN = 8; +const TIME_TEXT_MARGIN = 4; +const CENTER_TITLE_MARGIN_TOP = 12; const TIME_BOTTOM_OFFSET = 7; -const SETTING_ICON_MARGIN = 12; +const CENTER_MARGIN = 12; @Component export default struct Notification { @@ -84,13 +87,20 @@ export default struct Notification { } if (this.notificationList.length > 0) { - Image($r('app.media.delete_all')) - .width(IMAGE_SIZE_L) - .height(IMAGE_SIZE_L) - .margin({ bottom: 32 }) - .onClick(() => { - ViewModel.removeAllNotifications(); - }) + Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Image($r('app.media.ic_public_delete_filled')) + .fillColor("#FFFFFF") + .width(IMAGE_SIZE_L) + .height(IMAGE_SIZE_L) + } + .width(BGC_SIZE_L) + .height(BGC_SIZE_L) + .margin({ bottom: $r('app.float.notification_delete_all') }) + .borderRadius(BGC_SIZE_L) + .backgroundColor($r('app.color.notification_delete_all_background')) + .onClick(() => { + ViewModel.removeAllNotifications(); + }) } }.onTouch(this.touchEvent.bind(this)) } @@ -177,21 +187,22 @@ struct CenterTitle { .fontColor($r("sys.color.ohos_id_color_text_primary_contrary")) .fontSize('36fp') .fontWeight(FontWeight.Medium) - .margin({ left: TIME_TEXT_MARGIN }) + .margin({ left: CENTER_MARGIN }) Text(this.mTimeString) .fontColor($r("sys.color.ohos_id_color_text_primary_contrary")) .fontSize($r("sys.float.ohos_id_text_size_sub_title3")) .fontWeight(FontWeight.Medium) .margin({ left: TIME_TEXT_MARGIN, bottom: TIME_BOTTOM_OFFSET }) .flexGrow(1) - Image($r('app.media.ic_settings')) + Image($r("app.media.ic_public_settings")) .objectFit(ImageFit.Contain) .width(IMAGE_SIZE_S) .height(IMAGE_SIZE_S) - .margin({ right: SETTING_ICON_MARGIN, bottom: TIME_BOTTOM_OFFSET }) + .fillColor("#FFFFFF") + .margin({ right: CENTER_MARGIN, bottom: TIME_BOTTOM_OFFSET }) .onClick(this.settingClick.bind(this)) } - .margin({ top: TIME_TEXT_MARGIN, bottom: TIME_TEXT_MARGIN }) + .margin({ top: CENTER_TITLE_MARGIN_TOP, bottom: TIME_TEXT_MARGIN }) .onTouch(this.touchEvent.bind(this)) } diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/color.json b/product/phone/dropdownpanel/src/main/resources/base/element/color.json index 6751f30d..ad111924 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/color.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/color.json @@ -4,6 +4,10 @@ "name": "default_background", "value": "#4D999999" }, + { + "name": "notification_delete_all_background", + "value": "#4C000000" + }, { "name": "default_font_color", "value": "#ffffffff" diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/float.json b/product/phone/dropdownpanel/src/main/resources/base/element/float.json index 8f400c91..fd8bb0cc 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/float.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/float.json @@ -4,6 +4,10 @@ "name": "status_bar_height", "value": "48vp" }, + { + "name": "notification_delete_all", + "value": "32" + }, { "name": "quickly_setting_time_font_size", "value": "30fp" diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg new file mode 100644 index 00000000..422ec497 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_delete + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg new file mode 100644 index 00000000..9807c565 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_delete_filled.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_delete_filled + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg new file mode 100644 index 00000000..98a78dac --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_public_settings.svg @@ -0,0 +1,13 @@ + + + Public/ic_public_settings + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/phone/element/color.json b/product/phone/dropdownpanel/src/main/resources/phone/element/color.json index 38963e6c..5de4e7cf 100644 --- a/product/phone/dropdownpanel/src/main/resources/phone/element/color.json +++ b/product/phone/dropdownpanel/src/main/resources/phone/element/color.json @@ -3,6 +3,10 @@ { "name": "default_background", "value": "#999999" + }, + { + "name": "notification_delete_all_background", + "value": "#4C000000" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/phone/element/float.json b/product/phone/dropdownpanel/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..1f5716f6 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/phone/element/float.json @@ -0,0 +1,8 @@ + { + "float": [ + { + "name": "notification_delete_all", + "value": "64vp" + } + ] +} \ No newline at end of file -- Gitee From 95858f28195ce3933d729a1cd695c12dff21fad6 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Mon, 23 May 2022 16:06:51 +0800 Subject: [PATCH 103/373] log rectification Signed-off-by: xuchangzhou --- .../src/main/ets/default/pages/airplaneComponent.ets | 10 +++++----- .../ControlCenterSimpleToggleAutoRotateComponent.ets | 4 ++-- .../src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts | 2 +- .../src/main/ets/default/batteryModel.ts | 4 ++-- .../src/main/ets/default/pages/batteryIcon.ets | 4 ++-- .../src/main/ets/default/pages/batteryPic.ets | 4 ++-- .../src/main/ets/default/pages/batterySoc.ets | 4 ++-- .../src/main/ets/default/viewmodel/BatteryVM.ts | 2 +- .../src/main/ets/com/ohos/model/BluetoothService.ts | 2 +- .../ControlCenterComplexToggleBluetoothComponent.ets | 4 ++-- .../pages/StatusBarIconItemBluetoothComponent.ets | 4 ++-- .../src/main/ets/com/ohos/viewmodel/BluetoothVM.ts | 4 ++-- .../src/main/ets/default/brightnessManager.ts | 4 ++-- .../src/main/ets/default/pages/CapsuleIcon.ets | 4 ++-- .../main/ets/default/viewmodel/CapsuleViewModel.ts | 2 +- .../src/main/ets/default/pages/clockIcon.ets | 4 ++-- .../src/main/ets/default/viewmodel/ClockVM.ts | 2 +- .../main/ets/com/ohos/model/ControlCenterService.ts | 6 +++--- .../ets/com/ohos/pages/ComplexToggleComponent.ets | 4 ++-- .../com/ohos/pages/ComplexToggleLoadComponent.ets | 4 ++-- .../ets/com/ohos/pages/ControlCenterComponent.ets | 12 ++++++------ .../ets/com/ohos/pages/SimpleToggleComponent.ets | 4 ++-- .../ohos/pages/SimpleToggleLayoutEditComponent.ets | 12 ++++++------ .../pages/SimpleToggleLayoutEditDialogComponent.ets | 4 ++-- .../com/ohos/pages/SimpleToggleLayoutEditGrid.ets | 4 ++-- .../ets/com/ohos/pages/SimpleToggleLoadComponent.ets | 4 ++-- .../src/main/ets/com/ohos/pages/UpTitle.ets | 4 ++-- .../main/ets/com/ohos/viewmodel/ControlCenterVM.ts | 4 ++-- .../ControlCenterSimpleToggleLocationComponent.ets | 4 ++-- .../pages/StatusBarIconItemLocationComponent.ets | 4 ++-- .../src/main/ets/com/ohos/viewmodel/LocationVM.ts | 4 ++-- 31 files changed, 69 insertions(+), 69 deletions(-) diff --git a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets index dcea3168..c03e5820 100644 --- a/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets +++ b/features/airplanecomponent/src/main/ets/default/pages/airplaneComponent.ets @@ -44,25 +44,25 @@ struct airplaneComponent { Log.showDebug(TAG, `flyModelStatus:${this.flyModelStatus}`); if (this.flyModelStatus == true) { this.mWifiOriginalStatus = wifi.isWifiActive(); - Log.showDebug(TAG, `airplane status is opening, WLAN Original Status :${this.mWifiOriginalStatus}`); + Log.showInfo(TAG, `airplane status is opening, WLAN Original Status :${this.mWifiOriginalStatus}`); wifi.disableWifi(); }else{ if(this.mWifiOriginalStatus == true) { wifi.enableWifi(); - Log.showDebug(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},get system interface, set WLAN status enableWifi`); + Log.showInfo(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},get system interface, set WLAN status enableWifi`); } else { wifi.disableWifi(); - Log.showDebug(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},,get system interface, set WLAN status disableWifi`); + Log.showInfo(TAG, `airplane status closed, WLAN Original Status:${this.mWifiOriginalStatus},,get system interface, set WLAN status disableWifi`); }; }; } aboutToAppear(){ - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); } aboutToDisappear (){ - Log.showDebug(TAG, 'aboutToDisappear '); + Log.showInfo(TAG, 'aboutToDisappear '); } build() { diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets b/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets index 0ae24369..5db31470 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets +++ b/features/autorotatecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleAutoRotateComponent.ets @@ -30,12 +30,12 @@ export default struct ControlCenterSimpleToggleAutoRotateComponent { @State @Watch('onAutoRotateDataChange') mAutoRotateData: AutoRotateData = ViewModel.getAutoRotateData(); aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); this.onAutoRotateDataChange('mAutoRotateData'); } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear') + Log.showInfo(TAG, 'aboutToDisappear') } onAutoRotateDataChange(propName: string): void { diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts index 781b0efc..98e8c3d1 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts @@ -26,7 +26,7 @@ export class AutoRotateVM { }; constructor() { - Log.showDebug(TAG, `constructor`); + Log.showInfo(TAG, `constructor`); this.mAutoRotateData = AppStorage.SetAndLink(TAG + '_AutoRotateData', this.mAutoRotateData).get(); AutoRotateService.registerListener(this); AutoRotateService.startService(); diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts index 5775fc44..132c5bcb 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -58,7 +58,7 @@ export class BatteryModel { () => this.updateBatteryStatus(), (isSubscribe: boolean) => isSubscribe && this.updateBatteryStatus() ); - Log.showDebug(TAG, "initBatteryModel"); + Log.showInfo(TAG, "initBatteryModel"); this.mBatterySoc = AppStorage.SetAndLink("batterySoc", 0); this.mBatteryCharging = AppStorage.SetAndLink("batteryCharging", false); this.mManager.subscriberCommonEvent(); @@ -66,7 +66,7 @@ export class BatteryModel { } unInitBatteryModel() { - Log.showDebug(TAG, "unInitBatteryModel"); + Log.showInfo(TAG, "unInitBatteryModel"); this.mManager?.release(); this.mManager = undefined; } diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index 71fbca78..5e78570d 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -32,11 +32,11 @@ export default struct BatteryIcon { aboutToAppear() { mBatteryModel.initBatteryModel(); - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets index 43812ee7..0102321d 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -30,11 +30,11 @@ struct BatteryPic { @State style: any = StyleConfiguration.getBatteryPicStyle(); aboutToAppear(){ - Log.showDebug(TAG,'aboutToAppear Start'); + Log.showInfo(TAG,'aboutToAppear Start'); } aboutToDisappear(){ - Log.showDebug(TAG,'aboutToDisappear'); + Log.showInfo(TAG,'aboutToDisappear'); } build() { diff --git a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets index 3fd1e42f..3bcc7c37 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -27,11 +27,11 @@ struct BatterySoc { @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); aboutToAppear(){ - Log.showDebug(TAG,'aboutToAppear Start'); + Log.showInfo(TAG,'aboutToAppear Start'); } aboutToDisappear(){ - Log.showDebug(TAG,'aboutToDisappear'); + Log.showInfo(TAG,'aboutToDisappear'); } build() { diff --git a/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts b/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts index ff87c012..afafaada 100644 --- a/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts +++ b/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts @@ -24,7 +24,7 @@ export class BatteryVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.BATTERY); constructor() { - Log.showDebug(TAG, `constructor`); + Log.showInfo(TAG, `constructor`); } getTintContentInfo(): TintContentInfo { diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts index 8a70727e..56d1e0a1 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -31,7 +31,7 @@ export class BluetoothService { mIsBluetoothOpen: boolean = false; constructor() { - Log.showDebug(TAG, `constructor`); + Log.showInfo(TAG, `constructor`); } startService() { diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets index e345ff67..151efd1a 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/ControlCenterComplexToggleBluetoothComponent.ets @@ -31,12 +31,12 @@ export default struct ControlCenterComplexToggleBluetoothComponent { @StorageLink('BluetoothOpenStatus') BluetoothOpenStatus: boolean = false; aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); ViewModel.initViewModel(); } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets index 1e74c486..2f818cca 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets @@ -30,12 +30,12 @@ export default struct StatusBarIconItemBluetoothComponent { @State style: any = StyleConfiguration.getStatusBarBluetoothComponentStyle(); aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); ViewModel.initViewModel(); } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts index 72ba2f2c..b29b3463 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts @@ -30,14 +30,14 @@ export class BluetoothVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.BLUETOOTH); constructor() { - Log.showDebug(TAG, `constructor`); + Log.showInfo(TAG, `constructor`); } initViewModel() { if (this.mIsStart) { return; } - Log.showDebug(TAG, `initViewModel `) + Log.showInfo(TAG, `initViewModel `) this.mIsStart = true; this.mBluetoothOpenStatus = AppStorage.SetAndLink(BluetoothOpenStatusKey, false); BluetoothService.startService(); diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index c8f61271..4e807fbb 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -31,9 +31,9 @@ export class brightnessManager { SLIDER_CHANG_MODE_MOVING = 1; init(): void{ - Log.showDebug(TAG, 'init'); + Log.showInfo(TAG, 'init'); this.uri = settings.getUriSync(SYSTEMUI_BRIGHTNESS); - Log.showDebug(TAG, 'settings geturi of brightness is ' + this.uri); + Log.showInfo(TAG, 'settings geturi of brightness is ' + this.uri); this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), CommonConstants.URI_VAR); this.getValue(); } diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index 82407aff..6ca48914 100644 --- a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -33,11 +33,11 @@ export default struct CapsuleIcon { aboutToAppear() { this.mCapsuleViewModel.initViewModel(); - Log.showDebug(TAG, 'aboutToAppear, text: ' + this.mCapsuleViewModel.mText); + Log.showInfo(TAG, 'aboutToAppear, text: ' + this.mCapsuleViewModel.mText); } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts index 954e9819..b6df1f9f 100644 --- a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts +++ b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts @@ -124,7 +124,7 @@ export default class CapsuleViewModel { this.mIsBackground = false; } Log.showDebug(TAG, `onClickEvent `); - Log.showDebug(TAG, `startAbility`); + Log.showInfo(TAG, `startAbility`); AbilityManager.startAbility({ bundleName: this.mWantBundleName, abilityName: this.mWantAbilityName diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index 0c9d2e0d..3e0c8ff1 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -32,7 +32,7 @@ export default struct ClockIcon { unSubscriber?: unsubscribe; aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); this.unSubscriber = EventManager.subscribe(TIME_CHANGE_EVENT, (args: TimeEventArgs) => { this.mTime = TimeManager.formatTime(args.date); }); @@ -40,7 +40,7 @@ export default struct ClockIcon { } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); this.unSubscriber && this.unSubscriber(); this.unSubscriber = undefined; } diff --git a/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts b/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts index 963fb381..63ccd124 100644 --- a/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts +++ b/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts @@ -24,7 +24,7 @@ export class ClockVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.CLOCK); constructor() { - Log.showDebug(TAG, `constructor`); + Log.showInfo(TAG, `constructor`); } getTintContentInfo(): TintContentInfo { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index 2e84316b..41112a1b 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -64,7 +64,7 @@ export class ControlCenterService { mSimpleToggleLayout: string[]; constructor() { - Log.showDebug(TAG, `constructor`) + Log.showInfo(TAG, `constructor`); } startService(config): void { @@ -168,12 +168,12 @@ export class ControlCenterService { } registerListener(listener: ControlCenterListener) { - Log.showDebug(TAG, `registerListener, listener: ${listener}`); + Log.showInfo(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; } initFinish() { - Log.showDebug(TAG, `initFinish`); + Log.showInfo(TAG, `initFinish`); SwitchUserManager.getInstance() .getCurrentUserInfo() .then((userInfo) => { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets index dcaa5274..dcfa0094 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets @@ -28,12 +28,12 @@ export default struct ComplexToggleComponent { @State mDefaultTitle: string = ''; aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); this.linkItemData(); } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`); + Log.showInfo(TAG, `aboutToDisappear`); } linkItemData() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets index 1e921396..f13549a9 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets @@ -27,11 +27,11 @@ export default struct ComplexToggleLoadComponent { @Prop keyId: string; aboutToAppear() { - LLog.showDebug(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); + LLog.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`); + Log.showInfo(TAG, `aboutToDisappear`); } build() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index e4184ae5..4808aae1 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -44,12 +44,12 @@ export default struct ControlCenterComponent { private titleDisplayInside: boolean = false; aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear, mControlCenterComponentConfig: ${JSON.stringify(this.mControlCenterComponentConfig)}`); + Log.showInfo(TAG, `aboutToAppear, mControlCenterComponentConfig: ${JSON.stringify(this.mControlCenterComponentConfig)}`); ViewModel.initViewModel(this.mControlCenterComponentConfig); } aboutToDisappear() { - Log.Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } onSimpleToggleLayoutEditStart() { @@ -174,11 +174,11 @@ struct ControlCenterComplexToggleLayout { @State style: any = StyleConfiguration.getControlCenterComplexToggleLayoutStyle(); aboutToAppear() { - Log.showDebug(TAG_ControlCenterComplexToggleLayout, `aboutToAppear, mComplexToggleLayout: ${this.mComplexToggleLayout} `) + Log.showInfo(TAG_ControlCenterComplexToggleLayout, `aboutToAppear, mComplexToggleLayout: ${this.mComplexToggleLayout} `) } aboutToDisappear() { - Log.showDebug(TAG_ControlCenterComplexToggleLayout, `aboutToDisAppear`); + Log.showInfo(TAG_ControlCenterComplexToggleLayout, `aboutToDisAppear`); } build() { @@ -229,11 +229,11 @@ struct ControlCenterSimpleToggleLayout { @State style: any = StyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); aboutToAppear() { - Log.showDebug(TAG_ControlCenterSimpleToggleLayout, `aboutToAppear, mSimpleToggleLayout: ${this.mSimpleToggleLayout} `); + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `aboutToAppear, mSimpleToggleLayout: ${this.mSimpleToggleLayout} `); } aboutToDisappear() { - Log.showDebug(TAG_ControlCenterSimpleToggleLayout, `aboutToDisAppear`); + Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `aboutToDisAppear`); } build() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index 614a797b..b78c392c 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -30,12 +30,12 @@ export default struct SimpleToggleComponent { @State mDefaultLabel: string = ''; aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start, keyId: ${this.keyId}, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode}`); + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode}`); this.linkItemData(); } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`); + Log.showInfo(TAG, `aboutToDisappear`); } linkItemData() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets index cad2db65..0b1f7dd7 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets @@ -68,7 +68,7 @@ export default struct SimpleToggleLayoutEditComponent { }); aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); this.mNewDisplayingToggles = [...this.mDisplayingToggles]; this.mNewHidingToggles = [...this.mHidingToggles]; let allTogglesCount = this.mNewDisplayingToggles.length + this.mNewHidingToggles.length; @@ -83,7 +83,7 @@ export default struct SimpleToggleLayoutEditComponent { } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear '); + Log.showInfo(TAG, 'aboutToDisappear '); } build() { @@ -368,11 +368,11 @@ struct SimpleToggleLayoutEditUpTitle { @State style: any = StyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle() aboutToAppear() { - Log.showDebug(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToAppear'); + Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToAppear'); } aboutToDisappear() { - Log.showDebug(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToDisappear '); + Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToDisappear '); } build() { @@ -409,11 +409,11 @@ struct SimpleToggleLayoutEditOptMsg { @State style: any = StyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); aboutToAppear() { - Log.showDebug(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToAppear'); + Log.showInfo(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToAppear'); } aboutToDisappear() { - Log.showDebug(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToDisappear '); + Log.showInfo(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToDisappear '); } build() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets index ab47b269..b26a73ae 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets @@ -29,11 +29,11 @@ export default struct SimpleToggleLayoutEditDialogComponent { @State style: any = StyleConfiguration.getControlEditDialogStyle(); aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets index 17d7b5e5..16b5352c 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets @@ -47,11 +47,11 @@ export default struct SimpleToggleLayoutEditGrid { aboutToAppear() { this.logTag = TAG + '-' + this.gridTag - Log.showDebug(this.logTag, this.gridTag + 'aboutToAppear'); + Log.showInfo(this.logTag, this.gridTag + 'aboutToAppear'); } aboutToDisappear() { - Log.showDebug(this.logTag, 'aboutToDisappear '); + Log.showInfo(this.logTag, 'aboutToDisappear '); } build() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets index 854696f4..1469ac34 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets @@ -28,11 +28,11 @@ export default struct SimpleToggleLoadComponent { private mDragMode: boolean = false aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start, keyId: ${this.keyId}, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode}`); + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode}`); } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`); + Log.showInfo(TAG, `aboutToDisappear`); } build() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets index 1c82988d..a9d28390 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets @@ -34,11 +34,11 @@ export default struct UpTitle { @State style: any = StyleConfiguration.getControlCenterUpTitleStyle(); aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts index ef89103c..59ca1c65 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts @@ -30,7 +30,7 @@ export class ControlCenterVM { mSimpleToggleLayout: any; constructor() { - Log.showDebug(TAG, `constructor`); + Log.showInfo(TAG, `constructor`); this.mComplexToggleLayout = AppStorage.SetAndLink(ControlCenterComplexToggleLayoutKey, []); this.mSimpleToggleLayout = AppStorage.SetAndLink(ControlCenterSimpleToggleLayoutKey, []); ControlCenterService.registerListener(this); @@ -40,7 +40,7 @@ export class ControlCenterVM { if (this.mIsStart) { return; } - Log.showDebug(TAG, `initViewModel, config: ${JSON.stringify(config)} `); + Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)} `); this.mIsStart = true; ControlCenterService.startService(config); diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets index fb7f9408..f19825cd 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent.ets @@ -32,13 +32,13 @@ export default struct ControlCenterSimpleToggleLocationComponent { @State mLocationData: LocationData = new LocationData(); aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); ViewModel.initViewModel(); this.mLocationData = ViewModel.getLocationData(); } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets index 615d83ea..a0fc6f59 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets @@ -30,12 +30,12 @@ export default struct StatusBarIconItemLocationComponent { @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); ViewModel.initViewModel(); } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts index b027b5f1..cc1902f3 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts @@ -30,14 +30,14 @@ export class LocationVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.LOCATION); constructor() { - Log.showDebug(TAG, `constructor`); + Log.showInfo(TAG, `constructor`); } initViewModel() { if (this.mIsStart) { return; }; - Log.showDebug(TAG, `initViewModel `); + Log.showInfo(TAG, `initViewModel `); this.mIsStart = true; this.mLocationData = AppStorage.SetAndLink(TAG + '_LocationData', this.mLocationData).get(); LocationService.registerListener(this); -- Gitee From d23e2e336e2a8670d1c5340d418c653139afca64 Mon Sep 17 00:00:00 2001 From: match Date: Mon, 23 May 2022 16:07:43 +0800 Subject: [PATCH 104/373] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=89=8B=E6=9C=BAux=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: match --- common/src/main/ets/default/StyleConfiguration.ts | 6 ++++-- .../ets/com/ohos/view/component/noDisturbComponent.ets | 8 ++++---- .../src/main/resources/base/element/float.json | 8 ++++++++ .../src/main/resources/phone/element/float.json | 8 ++++++++ .../src/main/ets/pages/notificationManagenment.ets | 4 ++-- 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts index dd853bb3..4a23b516 100644 --- a/common/src/main/ets/default/StyleConfiguration.ts +++ b/common/src/main/ets/default/StyleConfiguration.ts @@ -14,18 +14,20 @@ */ import StyleManager from './StyleManager'; +import deviceInfo from '@ohos.deviceInfo'; const TAG = 'Common-StyleConfiguration'; +const deviceTypeInfo = deviceInfo.deviceType export default class StyleConfiguration { static getCommonStyle() { const key: string = TAG + "-Common"; return StyleManager.getStyle(key, () => { return { - statusBarFontSize: '12fp', + statusBarFontSize: deviceTypeInfo === 'phone' ? '12fp' : '16fp', statusBarIconWidth: '24vp', statusBarIconHeight: '24vp', - statusBarMarginLeftRight: '0vp', + statusBarMarginLeftRight: deviceTypeInfo === 'phone' ? '0vp' : '5vp', }; }); } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets index 712413b0..91b60594 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets @@ -66,7 +66,7 @@ export default struct NoDisturbComponent { .fontSize($r('app.float.itemComp_value_font')) .fontColor($r('app.color.itemComp_font_color')) .textAlign(TextAlign.Start) - .margin({ top: $r("sys.float.ohos_id_text_margin_vertical") }) + .margin({ top: $r("app.float.noDisturb_text_margin_vertical") }) } else if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_DAILY) { Text($r('app.string.noDisturb_daily_label')) .fontSize($r('app.float.itemComp_value_font')) @@ -76,7 +76,7 @@ export default struct NoDisturbComponent { .fontSize($r('app.float.itemComp_value_font')) .fontColor($r('app.color.itemComp_font_color')) .textAlign(TextAlign.Start) - .margin({ top: $r("sys.float.ohos_id_text_margin_vertical") }) + .margin({ top: $r("app.float.noDisturb_text_margin_vertical") }) } else if (this.mViewModel.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { Text($r('app.string.noDisturb_clearly_label')) .fontSize($r('app.float.itemComp_value_font')) @@ -86,13 +86,13 @@ export default struct NoDisturbComponent { .fontSize($r('app.float.itemComp_value_font')) .fontColor($r('app.color.itemComp_font_color')) .textAlign(TextAlign.Start) - .margin({ top: $r("sys.float.ohos_id_text_margin_vertical") }) + .margin({ top: $r("app.float.noDisturb_text_margin_vertical") }) } else { Text($r('app.string.noDisturb_closed')) .fontSize($r('app.float.itemComp_value_font')) .fontColor($r('app.color.itemComp_font_color')) .textAlign(TextAlign.Start) - .margin({ top: $r("sys.float.ohos_id_text_margin_vertical") }) + .margin({ top: $r("app.float.noDisturb_text_margin_vertical") }) } } else { Blank(); diff --git a/features/managementcomponent/src/main/resources/base/element/float.json b/features/managementcomponent/src/main/resources/base/element/float.json index 73fd5720..3be998b0 100644 --- a/features/managementcomponent/src/main/resources/base/element/float.json +++ b/features/managementcomponent/src/main/resources/base/element/float.json @@ -359,6 +359,14 @@ { "name": "noDisturb_offset_x", "value": "0" + }, + { + "name": "noDisturb_text_margin_vertical", + "value": "0vp" + }, + { + "name": "noDisturb_text_margin_right", + "value": "0vp" } ] } \ No newline at end of file diff --git a/features/managementcomponent/src/main/resources/phone/element/float.json b/features/managementcomponent/src/main/resources/phone/element/float.json index fd2c343f..24ea9b6e 100644 --- a/features/managementcomponent/src/main/resources/phone/element/float.json +++ b/features/managementcomponent/src/main/resources/phone/element/float.json @@ -359,6 +359,14 @@ { "name": "noDisturb_offset_x", "value": "-18" + }, + { + "name": "noDisturb_text_margin_vertical", + "value": "2vp" + }, + { + "name": "noDisturb_text_margin_right", + "value": "12vp" } ] } \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index af6fae5b..d3c21a93 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -75,14 +75,14 @@ export default struct notificationManagenment { .fontSize($r('sys.float.ohos_id_text_size_body1')) .fontColor($r('app.color.itemComp_title_color')) .align(Alignment.End) - .margin({ right: $r("sys.float.ohos_id_dialog_margin_end") }) + .margin({ right: $r("app.float.noDisturb_text_margin_right") }) .fontWeight(FontWeight.Medium) } else { Text($r('app.string.noDisturb_closed')) .fontSize($r('sys.float.ohos_id_text_size_body1')) .fontColor($r('app.color.itemComp_title_color')) .align(Alignment.End) - .margin({ right: $r("sys.float.ohos_id_dialog_margin_end") }) + .margin({ right: $r("app.float.noDisturb_text_margin_right") }) .fontWeight(FontWeight.Medium) } Image($r('app.media.ic_settings_arrow')) -- Gitee From 748106939dc3ad585bc62c3af6e19bb9b566eeb1 Mon Sep 17 00:00:00 2001 From: panshunli Date: Mon, 23 May 2022 17:06:48 +0800 Subject: [PATCH 105/373] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83UX?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: panshunli --- .../ets/com/ohos/noticeItem/view/item/groupItem.ets | 2 +- .../ohos/noticeItem/view/item/iconListComponent.ets | 12 +++++++----- .../src/main/resources/base/element/float.json | 4 ++++ .../src/main/resources/phone/element/float.json | 4 ++++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index bbca5309..32612686 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -63,7 +63,7 @@ export default struct GroupItem { .width(Constants.FULL_CONTAINER_WIDTH) if (this.toExpand) { - Row().height(1).width('100%') + Row().height($r("app.float.notice_divider")).width('100%') } Row() { ContentList({ groupData: this.groupData, toExpand: this.toExpand }) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets index af0dcdb0..c25cb729 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -13,12 +13,14 @@ * limitations under the License. */ -import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import Constants, { NotificationLayout as Layout } from '../../common/constants'; import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; import SettingDialog from './settingDialog'; import ConfirmDialog from './confirmDialog' import ViewModel from '../../viewmodel/ViewModel'; +import deviceInfo from '@ohos.deviceInfo'; +const deviceTypeInfo = deviceInfo.deviceType; const TAG = 'NoticeItem-IconListComponent'; let iconSize: number = 0; @@ -47,9 +49,9 @@ export default struct IconListComponent { action: () => this.confirmDialogController.open() }), autoCancel: false, - alignment:DialogAlignment.Bottom, + alignment: deviceTypeInfo === 'phone' ? DialogAlignment.Bottom : DialogAlignment.Default, offset: { dx: 0, dy: $r('app.float.setting_dialog_dy') }, - customStyle:true + customStyle: true }); private confirmDialogController: CustomDialogController = new CustomDialogController({ builder: ConfirmDialog({ @@ -58,9 +60,9 @@ export default struct IconListComponent { action: () => ViewModel.enableNotification(this.itemData, false) }), autoCancel: false, - alignment:DialogAlignment.Bottom, + alignment: deviceTypeInfo === 'phone' ? DialogAlignment.Bottom : DialogAlignment.Default, offset: { dx: 0, dy: $r('app.float.confirm_dialog_dy') }, - customStyle:true + customStyle: true }); private iconConfigs: IconData[] = [ { diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index a2eeb1cf..21d57da6 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -219,6 +219,10 @@ { "name": "notice_image_boderRadius", "value": "0" + }, + { + "name": "notice_divider", + "value": "1vp" } ] } \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/phone/element/float.json b/features/noticeitem/src/main/resources/phone/element/float.json index 17f0aa9d..1c1b1d6a 100644 --- a/features/noticeitem/src/main/resources/phone/element/float.json +++ b/features/noticeitem/src/main/resources/phone/element/float.json @@ -111,6 +111,10 @@ { "name": "notice_image_boderRadius", "value": "12" + }, + { + "name": "notice_divider", + "value": "1vp" } ] } \ No newline at end of file -- Gitee From 9b2daee1d626ec0888708c2914382513af9f31bf Mon Sep 17 00:00:00 2001 From: username <1037761763@qq.com> Date: Mon, 23 May 2022 17:13:18 +0800 Subject: [PATCH 106/373] =?UTF-8?q?featrues=E5=B1=82=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: username <1037761763@qq.com> --- .../ets/com/ohos/model/bundleResourceModel.ts | 25 ++++++------------- .../ets/com/ohos/model/noDisturbingModel.ts | 4 +-- .../com/ohos/model/notificationListener.ts | 14 ++++------- .../ohos/view/component/appLstComponent.ets | 2 +- .../ohos/view/component/slotItemComponent.ets | 2 +- .../ohos/view/component/switchComponent.ets | 2 +- .../ohos/vm/noDisturbComponentViewModel.ts | 8 +++--- .../ohos/navigationservice/KeyCodeEvent.ts | 18 ++++--------- .../com/ohos/noticeItem/common/CommonUtil.ts | 2 +- .../model/NotificationDistributionManager.ts | 4 +-- .../noticeItem/model/NotificationManager.ts | 2 -- .../noticeItem/model/NotificationService.ts | 6 ++--- .../noticeItem/model/rule/RuleController.ts | 6 ++--- .../noticeItem/view/item/actionComponent.ets | 4 +-- .../view/item/bannerNotificationItem.ets | 4 +-- .../noticeItem/view/item/confirmDialog.ets | 1 - .../ohos/noticeItem/view/item/customItem.ets | 2 +- .../ohos/noticeItem/view/item/generalItem.ets | 2 +- .../ohos/noticeItem/view/item/groupItem.ets | 4 +-- .../view/item/iconListComponent.ets | 2 +- .../ohos/noticeItem/view/item/pictureItem.ets | 1 - 21 files changed, 45 insertions(+), 70 deletions(-) diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index 35fc367f..eebf2758 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -28,7 +28,6 @@ export default class BundleResourceModel { async getAllBundleInfos() { let userId =(await SwitchUserManager.getInstance().getCurrentUserInfo()).userId; - Log.showInfo(TAG, 'getAllBundleInfos entry, userId = :' + userId); Bundle.getAllBundleInfo(IS_INCLUDE_ABILITY_INFO, userId) .then((data) => { this.getIconItem(INDEX, data.length, data); @@ -41,7 +40,7 @@ export default class BundleResourceModel { let imageValue = ''; let label = ''; let that = this; - Log.showInfo(TAG, 'getIconItem data[index].name :' + data[index].name); + Log.showDebug(TAG, 'getIconItem data[index].name :' + data[index].name); try { let bundleContext = await AbilityManager.getContext().createBundleContext(data[index].name); let bundleResourceManager = await bundleContext.resourceManager; @@ -49,29 +48,26 @@ export default class BundleResourceModel { let appInfo = data[index].appInfo; if (appInfo.labelId > 0) { bundleResourceManager.getString(appInfo.labelId, (error, value) => { - Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager value.length:' + value.length); if (value != null) { - Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager getString() value:' + value); + Log.showDebug(TAG, 'getIconItem ResMgr.getResourceManager getString() value:' + value); label = value; } else { Log.showError(TAG, 'getIconItem ResMgr.getResourceManager getString() error:' + error); } }); } else { - Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager label:' + appInfo.label); label = appInfo.label; } - Log.showInfo(TAG, 'getIconItem ResMgr.getResourceManager finish label:' + label); + Log.showDebug(TAG, 'getIconItem ResMgr.getResourceManager finish label:' + label); if (appInfo.iconId <= 0) { this.nextIconItem(index, count, data, this.mBundleInfoList, that) return } bundleResourceManager.getMediaBase64(appInfo.iconId, (error, value) => { if (error === undefined) { - Log.showInfo(TAG, 'getIconItem ResMgr.getMediaBase64() value:' + value.length); + Log.showDebug(TAG, 'getIconItem ResMgr.getMediaBase64() value:' + value.length); if (value.length > 0) { imageValue = value; - Log.showInfo(TAG, 'getIconItem ResMgr.getMediaBase64() imageValue:' + imageValue); } this.mBundleInfoList.push({ appIcon: imageValue, @@ -92,16 +88,14 @@ export default class BundleResourceModel { } catch (error) { Log.showError(TAG, 'getIconItem catch error:' + error); } - Log.showInfo(TAG, 'getIconItem end'); } nextIconItem(index, count, data, bundleInfoList, that) { + Log.showInfo(TAG, 'nextIconItem index:' + index + ' | count:' + count); if (count - 1 > index) { - Log.showInfo(TAG, 'nextIconItem if index:' + index + ' | count:' + count); index = index + 1; that.getIconItem(index, count, data); } else { - Log.showInfo(TAG, 'nextIconItem else index:' + index + ' | count:' + count); AppStorage.SetOrCreate('appManagementList', bundleInfoList); } } @@ -110,20 +104,18 @@ export default class BundleResourceModel { let mBundleInfo: any = {}; let label = ''; - let userInfo = await SwitchUserManager.getInstance().getCurrentUserInfo() - Log.showInfo(TAG, `getBundleInfo UserID:${JSON.stringify(userInfo)}`); + let userInfo = await SwitchUserManager.getInstance().getCurrentUserInfo(); Bundle.getBundleInfo(bundleName, IS_INCLUDE_ABILITY_INFO, { userId: userInfo.userId }).then((data) => { Log.showInfo(TAG, `getBundleInfo bundleInfo:${JSON.stringify(data)}`); ResMgr.getResourceManager(AbilityManager.getContext(), data.name, (error, item) => { - Log.showInfo(TAG, `getBundleInfo getResourceManager getString() item:${JSON.stringify(item)}`); let appInfo = data.appInfo; if (appInfo.labelId > 0) { item.getString(appInfo.labelId, (error, value) => { if (value != null) { - Log.showInfo(TAG, `getBundleInfo getResourceManager getString() value: ` + value); + Log.showDebug(TAG, `getBundleInfo getResourceManager getString() value: ` + value); mBundleInfo.appTitle = value } else { Log.showError(TAG, `getBundleInfo getResourceManager getString() error:${JSON.stringify(error)}`); @@ -140,11 +132,10 @@ export default class BundleResourceModel { mBundleInfo.appUid = data.uid mBundleInfo.systemApp = appInfo.systemApp - Log.showInfo(TAG, 'getBundleInfo getResourceManager label:' + label); + Log.showDebug(TAG, 'getBundleInfo getResourceManager label:' + label); if (appInfo.iconId > 0) { item.getMediaBase64(appInfo.iconId, (error, imageValue) => { if (!!imageValue) { - Log.showInfo(TAG, 'getBundleInfo getResourceManager getMediaBase64 value:' + imageValue.length); mBundleInfo.appIcon = imageValue } callback(mBundleInfo); diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts index 87c694c9..fb2ff970 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts @@ -28,7 +28,7 @@ export default class NoDisturbingModel { if (error.code != 0) { Log.showError(TAG, 'getNoDisturbingDate error:' + JSON.stringify(error)); } else { - Log.showInfo(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); + Log.showDebug(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); let noDisturbingData = {} noDisturbingData['type'] = data.type if (data.type == DoNotDisturbType.TYPE_CLEARLY) { @@ -48,7 +48,7 @@ export default class NoDisturbingModel { targetDate['type'] = noDisturbingTime.type targetDate['begin'] = noDisturbingTime.begin targetDate['end'] = noDisturbingTime.end - Log.showInfo(TAG, `setDoNotDisturbDate targetDate['type'] : ` + JSON.stringify(targetDate['type']) + + Log.showDebug(TAG, `setDoNotDisturbDate targetDate['type'] : ` + JSON.stringify(targetDate['type']) + ` ['begin'] : ` + JSON.stringify(targetDate['begin']) + ` ['end'] : ` + JSON.stringify(targetDate['end'])); Notification.setDoNotDisturbDate(targetDate, callback) } diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts index bf358aa1..629a057e 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts @@ -46,10 +46,9 @@ export class NotificationListener { } handleEnabledNotificationChanged(data) { - Log.showInfo(TAG, `handleEnabledNotificationChanged data:${JSON.stringify(data)} `); + Log.showDebug(TAG, `handleEnabledNotificationChanged data:${JSON.stringify(data)} `); this.listeners.forEach((listener) => { if (!!listener && listener.bundle == data.bundle) { - Log.showInfo(TAG, `handleEnabledNotificationChanged call:${listener.bundle} ${data.enable}`); listener.onEnableChanged(data.enable); } else { Log.showError(TAG, `handleEnabledNotificationChanged error`); @@ -58,25 +57,22 @@ export class NotificationListener { } register(listener: EnableListener) { - Log.showInfo(TAG, `register listener:${JSON.stringify(listener)}`); this.listeners.add(listener); Log.showInfo(TAG, `register finished`); } unRegister(listener: EnableListener) { - Log.showInfo(TAG, `unRegister`); this.listeners.delete(listener); Log.showInfo(TAG, `unRegister finished`); } unRegisterAll() { - Log.showInfo(TAG, `unRegisterAll`); this.listeners.clear(); Log.showInfo(TAG, `unRegisterAll finished`); } isNotificationEnabled(bundleOption): Promise { - Log.showInfo(TAG, `isNotificationEnabled bundleOption:${JSON.stringify(bundleOption)} `) + Log.showDebug(TAG, `isNotificationEnabled bundleOption:${JSON.stringify(bundleOption)} `) return new Promise((resolve, reject) => { Notification.isNotificationEnabled(bundleOption, (err, data) => { Log.showInfo(TAG, `isNotificationEnabled callback data:${JSON.stringify(data)} err:${JSON.stringify(err)}`) @@ -90,7 +86,7 @@ export class NotificationListener { } enableNotification(bundleOption, data) { - Log.showInfo(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`) + Log.showDebug(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`) let enableValue: boolean = data ? true : false Notification.enableNotification(bundleOption, enableValue, (err, result) => { Log.showInfo(TAG, `enableNotification err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); @@ -98,7 +94,7 @@ export class NotificationListener { } notificationSlotSet(bundleOption, data) { - Log.showInfo(TAG, `notificationSlotSet bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); + Log.showDebug(TAG, `notificationSlotSet bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); Notification.setSlotByBundle(bundleOption, data, (err, result) => { Log.showInfo(TAG, `notificationSlotSet err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); }) @@ -118,7 +114,7 @@ export class NotificationListener { } enableDistributed(data) { - Log.showInfo(TAG, `enableDistributed data:${JSON.stringify(data)}`); + Log.showDebug(TAG, `enableDistributed data:${JSON.stringify(data)}`); let enableValue: boolean = data ? true : false Notification.enableDistributed(enableValue, (err, result) => { Log.showInfo(TAG, `enableDistributed err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets index 7fc47a79..a2349d64 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets @@ -26,7 +26,7 @@ export default struct AppLstComponent { @StorageLink('appManagementList') appList: any[]= []; aboutToAppear(): void{ - Log.showDebug(TAG, `aboutToAppear`); + Log.showInfo(TAG, `aboutToAppear`); ViewModel.ViewModelInit(); } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets index bbc476a4..a3769da2 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotItemComponent.ets @@ -78,6 +78,6 @@ export default struct SlotItemComponent { } aboutToAppear() { - Log.showDebug(TAG, `aboutToDisAppear`); + Log.showInfo(TAG, `aboutToDisAppear`); } } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index 36c86b82..eac29ceb 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -73,7 +73,7 @@ export default struct SwitchComponent { } aboutToAppear(): void{ - Log.showDebug(TAG, `aboutToAppear`); + Log.showInfo(TAG, `aboutToAppear`); if (this.register) { Log.showInfo(TAG, `aboutToAppear register listener`); this.register((stateValue: boolean) => { diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts index c29dd0e3..4899d611 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts @@ -40,11 +40,11 @@ export default class NoDisturbComponentViewModel { getNoDisturbingDate() { Log.showInfo(TAG, 'getNoDisturbingDate'); NoDisturbingModel.getNoDisturbingDate((data) => { - Log.showInfo(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); + Log.showDebug(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); this.repeatMode = data.type this.startTime = data.begin this.endTime = data.end - Log.showInfo(TAG, `getNoDisturbingDate repeatMode : ${this.repeatMode} startTime : ${this.startTime} endTime : ${this.endTime}`); + Log.showDebug(TAG, `getNoDisturbingDate repeatMode : ${this.repeatMode} startTime : ${this.startTime} endTime : ${this.endTime}`); this.repeatName = this.refreshRepeatName(this.repeatMode); this.setClues.bind(this)() }) @@ -54,7 +54,7 @@ export default class NoDisturbComponentViewModel { if (!this.isEffective) { this.repeatMode = DoNotDisturbType.TYPE_NONE } - Log.showInfo(TAG, `this.repeatMode is : ${this.repeatMode}`); + Log.showDebug(TAG, `this.repeatMode is : ${this.repeatMode}`); let noDisturbingTime = { type: this.repeatMode, begin: this.defaultStartTime, end: this.defaultEndTime } @@ -74,7 +74,7 @@ export default class NoDisturbComponentViewModel { } this.setCluesWithoutSetEffect(); - Log.showInfo(TAG, `this.prompt : ${this.prompt}`); + Log.showDebug(TAG, `this.prompt : ${this.prompt}`); } setCluesWithoutSetEffect() { Log.showInfo(TAG, `setCluesWithoutSetEffect start`); diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts index 5f36feab..c64f81b3 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts @@ -27,28 +27,25 @@ export class KeyCodeEvent { Log.showInfo(TAG, `sendKeyEvent keycode: ${keyCode} type: ${eventType}`); switch (keyCode) { case Constants.KEYCODE_BACK: - Log.showInfo(TAG, `sendKeyEvent case back type: ${eventType}`); if (eventType === Constants.KEY_DOWN) { - Log.showInfo(TAG, 'sendKeyEvent : KEY_DOWN'); + Log.showDebug(TAG, 'sendKeyEvent : KEY_DOWN'); this.sendBackKeyEventStart(); //down } else if (eventType === Constants.KEY_UP) { - Log.showInfo(TAG, `sendKeyEvent : KEY_UP`); + Log.showDebug(TAG, `sendKeyEvent : KEY_UP`); this.sentEvnt(); this.sendBackKeyEventEnd(); //up } break; case Constants.KEYCODE_HOME: - Log.showInfo(TAG, `sendKeyEvent case home type: ${eventType}`); if (eventType === Constants.KEY_UP) { - Log.showInfo(TAG, 'sendKeyEvent : KEY_UP'); + Log.showDebug(TAG, 'sendKeyEvent : KEY_UP'); this.sentEvnt(); this.sendHomeKeyEvent(); } break; case Constants.KEYCODE_RECENT: - Log.showInfo(TAG, `sendKeyEvent case recent type: ${eventType}`); if (eventType === Constants.KEY_UP) { - Log.showInfo(TAG, 'sendKeyEvent : KEY_UP'); + Log.showDebug(TAG, 'sendKeyEvent : KEY_UP'); this.sentEvnt(); this.sendRecentKeyEvent(); } @@ -74,7 +71,7 @@ export class KeyCodeEvent { res = Input.injectEvent({ KeyEvent: keyEvent }); - Log.showInfo(TAG, `injectEventHandler injectEventSync down res: ${res}`); + Log.showDebug(TAG, `injectEventHandler injectEventSync down res: ${res}`); } private sendBackKeyEventEnd() { @@ -94,9 +91,6 @@ export class KeyCodeEvent { } private sendHomeKeyEvent() { - Log.showInfo(TAG, 'sendHomeKeyEvent'); - Log.showInfo(TAG, 'home click and start ability launcher'); - Log.showInfo(TAG, `startAbility`); AbilityManager.startAbility({ bundleName: Constants.LAUNCHER_BUNDLE_NAME, abilityName: Constants.LAUNCHER_ABILITY_NAME @@ -104,12 +98,10 @@ export class KeyCodeEvent { } private sendRecentKeyEvent() { - Log.showInfo(TAG, 'sendRecentKeyEvent'); commonEvent.publish('CREATE_RECENT_WINDOW_EVENT', (err, data) => { Log.showInfo(TAG, `publish launcher err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); }); - Log.showInfo(TAG, `startAbility`); AbilityManager.startAbility({ bundleName: Constants.RECENT_BUNDLE_NAME, abilityName: Constants.RECENT_ABILITY_NAME diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts index 29953759..52ef6797 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -27,7 +27,7 @@ const DEFAULT_INFO = { export default class CommonUtil { static startWant(want, triggerInfo?: any) { let info = (triggerInfo) ? triggerInfo : DEFAULT_INFO; - Log.showInfo(TAG, `startWant ${JSON.stringify(want)}, info ${JSON.stringify(info)}`); + Log.showDebug(TAG, `startWant ${JSON.stringify(want)}, info ${JSON.stringify(info)}`); WantAgent.trigger(want, info, ((err, data) => { Log.showInfo(TAG, `wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); })); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts index cb20bb52..5759c4ec 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts @@ -43,7 +43,7 @@ export default class NotificationDistributionManager { Log.showInfo(TAG, `initDeviceManager`); DeviceManager.createDeviceManager("com.ohos.systemui", (err, data) => { if (err) { - Log.showInfo(TAG, "createDeviceManager err:" + JSON.stringify(err)); + Log.showError(TAG, "createDeviceManager err:" + JSON.stringify(err)); return; } Log.showInfo(TAG, "createDeviceManager success"); @@ -55,7 +55,7 @@ export default class NotificationDistributionManager { Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceId:${deviceId}`); let deviceName = ''; let deviceArr:any[] = this.getTrustedDeviceListSync(); - Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceArr:${JSON.stringify(deviceArr)}`); + Log.showDebug(TAG, `getTrustedDeviceDeviceName deviceArr:${JSON.stringify(deviceArr)}`); if (deviceArr && deviceArr.length > 0) { for (let item of deviceArr) { if (item.deviceId == deviceId) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index 394d00e7..128498f5 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -147,7 +147,6 @@ export default class NotificationManager { name: DEBUG_TEMPLATE_NAME, data: reqData }; - Log.showInfo(TAG, `requestDebugTemplate requestParam: ${JSON.stringify(requestParam)}`); NotificationManager.request(tag, requestParam, (err, data) => { Log.showInfo(TAG, `requestDebugTemplate finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); if (!!data) { @@ -158,7 +157,6 @@ export default class NotificationManager { } static isDebugMode(tag): boolean{ - Log.showInfo(TAG, `isDebugMode from: ${tag}`); let debug = Systemparameter.getSync(DEBUG_SETTING_KEY, "") Log.showInfo(TAG, `Systemparameter DEBUG_SETTING: ${debug}`); return!!debug; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index 5e0502fa..97eee040 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -89,7 +89,7 @@ export class NotificationService { } handleNotificationAddAndSortMap(data) { - Log.showInfo(TAG, 'handleNotificationAddAndSortMap, sortingMap' + JSON.stringify(data.sortingMap || {})); + Log.showDebug(TAG, 'handleNotificationAddAndSortMap, sortingMap' + JSON.stringify(data.sortingMap || {})); this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; this.handleNotificationAdd(data?.request); } @@ -110,7 +110,7 @@ export class NotificationService { } handleNotificationCancel(data) { - Log.showInfo(TAG, `handleNotificationCancel hashCode: ${JSON.stringify(data?.request?.hashCode)}`); + Log.showDebug(TAG, `handleNotificationCancel hashCode: ${JSON.stringify(data?.request?.hashCode)}`); this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; const hashCode = data?.request?.hashCode; if (!hashCode) { @@ -143,7 +143,7 @@ export class NotificationService { } enableNotification(bundleOption, data) { - Log.showInfo(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)} `); + Log.showDebug(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)} `); NotificationManager.enableNotification(TAG, bundleOption, data, (result) => { Log.showInfo(TAG, `enableNotification ==> result: ${JSON.stringify(result)}`); }); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts index 65fbf239..72232f64 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts @@ -39,9 +39,9 @@ export class RuleController { return; } this.getNotificationDataByApp(notificationItemData, (originalData) => { - Log.showInfo(TAG, `originalData = ${JSON.stringify(originalData)}`); + Log.showDebug(TAG, `originalData = ${JSON.stringify(originalData)}`); this.updateNotificationDataBySense(originalData, (finalData) => { - Log.showInfo(TAG, `finalData = ${JSON.stringify(finalData)}`); + Log.showDebug(TAG, `finalData = ${JSON.stringify(finalData)}`); callback(finalData); }); }); @@ -125,7 +125,7 @@ export class RuleController { } else { mNotificationItemData.ruleData.isAllowNotificationListShow = false; } - Log.showInfo(TAG, `mNotificationItemData.ruleData = ${JSON.stringify(mNotificationItemData.ruleData)}`); + Log.showDebug(TAG, `mNotificationItemData.ruleData = ${JSON.stringify(mNotificationItemData.ruleData)}`); callback(mNotificationItemData); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets index 632ad517..bfdf349d 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets @@ -29,13 +29,13 @@ export default struct ActionComponent { private itemData: any = undefined; aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`); + Log.showInfo(TAG, `aboutToAppear Start`); let actionData = AppStorage.Get(Constants.KEY_INPUT + this.itemData.id); this.inputActionData = (actionData instanceof InputActionButtonData) ? actionData : this.inputActionData; } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisAppear`); + Log.showInfo(TAG, `aboutToDisAppear`); } build() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index c3e00c18..d5c29b8c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -56,7 +56,7 @@ export default struct BannerNotificationItem { expandPaddingBottom: number = Layout.EXPAND_PADDING_BOTTOM; aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`); + Log.showInfo(TAG, `aboutToAppear Start`); setAppBgColor('#00000000'); this.mCloseEnableFlg = false; this.mDefaultBannerRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect'); @@ -67,7 +67,7 @@ export default struct BannerNotificationItem { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisAppear`); + Log.showInfo(TAG, `aboutToDisAppear`); } build() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets index 6e5d976a..1142f3d7 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -29,7 +29,6 @@ export default struct ConfirmDialog { public action: () => void build() { - Column() { Row() { Text(this.title) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets index af090e18..2b8dcb5e 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -31,7 +31,7 @@ export default struct CustomItem { private clickAction: () => void aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`); + Log.showInfo(TAG, `aboutToAppear Start`); this.template = ViewModel.getPluginTempLate(this.customItemData.template.name); this.templateData = this.customItemData.template.data; this.isDebugMode = NotificationManager.isDebugMode(TAG); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index b9c2e643..ebb4dce6 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -42,7 +42,7 @@ export default struct GeneralItem { } aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`); + Log.showInfo(TAG, `aboutToAppear Start`); if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { this.hasPicture = false; } else { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 29581b06..76655aad 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -33,11 +33,11 @@ export default struct GroupItem { @State @Watch('scrollEdge') mEdgeEnd: boolean = false; aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`); + Log.showInfo(TAG, `aboutToAppear`); } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisAppear`); + Log.showInfo(TAG, `aboutToDisAppear`); } expandChange() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets index 88d94fd7..08faebbc 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -82,7 +82,7 @@ export default struct IconListComponent { ] aboutToAppear() { - Log.showDebug(TAG, `iconConfigs: ${JSON.stringify(this.iconConfigs)}`); + Log.showInfo(TAG, `iconConfigs: ${JSON.stringify(this.iconConfigs)}`); iconSize = this.iconConfigs.length; } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets index 3c033812..68737b81 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/pictureItem.ets @@ -22,7 +22,6 @@ export default struct PictureItem { @Prop isExpand: boolean build() { - Column() { Text(this.isExpand ? this.itemData.expandedTitle : this.itemData.title) .maxLines(Constants.SINGLE_LINE) -- Gitee From deb90eb4d6aeb0246d93e3826a8e23c199603bb6 Mon Sep 17 00:00:00 2001 From: username <1037761763@qq.com> Date: Mon, 23 May 2022 18:01:13 +0800 Subject: [PATCH 107/373] =?UTF-8?q?featrues=E5=B1=82=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: username <1037761763@qq.com> --- .../ets/com/ohos/model/bundleResourceModel.ts | 2 +- .../noticeItem/model/NotificationService.ts | 2 +- .../ohos/noticeItem/viewmodel/ViewModel.ts | 4 +-- ...rolCenterSimpleToggleRingModeComponent.ets | 8 ++--- .../StatusBarIconItemRingModeComponent.ets | 4 +-- .../src/main/ets/default/common/constants.ts | 1 - .../src/main/ets/default/pages/signalIcon.ets | 4 +-- .../com/ohos/common/StatusBarConfiguration.ts | 3 +- .../ets/com/ohos/model/StatusBarService.ts | 14 ++++----- .../ets/com/ohos/pages/IconItemComponent.ets | 4 +-- .../com/ohos/pages/MetaIconItemComponent.ets | 4 +-- .../ets/com/ohos/pages/StatusBarComponent.ets | 29 +++++++++---------- .../ets/com/ohos/viewmodel/StatusBarVM.ts | 2 +- .../ets/default/pages/volumeComponent.ets | 3 +- .../com/ohos/common/VolumeWindowController.ts | 4 +-- .../ets/com/ohos/model/VolumePanelService.ts | 10 +++---- .../com/ohos/pages/VolumePanelComponent.ets | 4 +-- .../ets/com/ohos/viewmodel/VolumePanelVM.ts | 1 - .../src/main/ets/default/pages/wifiIcon.ets | 2 +- 19 files changed, 48 insertions(+), 57 deletions(-) diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index eebf2758..67c2dd7c 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -86,7 +86,7 @@ export default class BundleResourceModel { this.nextIconItem(index, count, data, this.mBundleInfoList, that) }); } catch (error) { - Log.showError(TAG, 'getIconItem catch error:' + error); + Log.showError(TAG, `getMediaBase64 err:${JSON.stringify(error)}`); } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index 97eee040..4aec12b0 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -106,7 +106,7 @@ export class NotificationService { } }) }); - }).catch(errorInfo => Log.showError(TAG, errorInfo)); + }).catch(errorInfo => Log.showError(TAG, `error: ${JSON.stringify(errorInfo)}`)); } handleNotificationCancel(data) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index 336cf1e2..f18952f5 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -50,7 +50,7 @@ export class ViewModel { SwitchUserManager.getInstance() .getCurrentUserInfo() .then((userInfo) => this.registerCallback(userInfo.userId)) - .catch((err) => Log.showError(TAG, `Can't get current user, err: ${err}`)); + .catch((err) => Log.showError(TAG, `Can't get current user, err: ${JSON.stringify(err)}`)); } registerCallback(userId) { @@ -356,7 +356,7 @@ export class ViewModel { this.audioPlayer.play(); Log.showInfo(TAG, `sound end `); } catch (e) { - Log.showError(TAG, `sound notificationItem id:${itemData.id} alert error: ${e.toString()}`); + Log.showError(TAG, `sound error: ${JSON.stringify(e)}`); } } } diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets index 0026be02..698a13ae 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets @@ -35,13 +35,13 @@ export default struct ControlCenterSimpleToggleRingModeComponent { @State style: any = StyleConfiguration.getControlCenterRingModeComponentStyle() aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); ViewModel.initViewModel() this.onRingModeUpdated('RingModeComponentMode') } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } onRingModeUpdated(propName: string): void { @@ -73,7 +73,7 @@ export default struct ControlCenterSimpleToggleRingModeComponent { } mClickEvent() { - Log.showInfo(TAG, `mClickEvent, RingModeComponentMode: ${JSON.stringify(this.RingModeComponentMode)}`); + Log.showInfo(TAG, `mClickEvent`); if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_SILENT) { ViewModel.setRingerMode(AudioRingMode.RINGER_MODE_NORMAL) } else if (this.RingModeComponentMode == AudioRingMode.RINGER_MODE_VIBRATE) { @@ -84,7 +84,7 @@ export default struct ControlCenterSimpleToggleRingModeComponent { } mLongClickEvent() { - Log.showInfo(TAG, `mLongClickEvent, RingModeComponentMode: ${JSON.stringify(this.RingModeComponentMode)}`); + Log.showInfo(TAG, `mLongClickEvent`); EventManager.publish(obtainStartAbility('com.ohos.settings', 'com.ohos.settings.MainAbility')) } } \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets index 0a2a6a8f..98f97dab 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets @@ -31,7 +31,7 @@ export default struct StatusBarIconItemRingModeComponent { private ringModeIcons: any aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); this.ringModeIcons = {}; this.ringModeIcons[AudioRingMode.RINGER_MODE_SILENT.toString()] = $r("app.media.ic_statusbar_ring_off_filled"); this.ringModeIcons[AudioRingMode.RINGER_MODE_VIBRATE.toString()] = $r("app.media.ic_statusbar_vibration_on"); @@ -39,7 +39,7 @@ export default struct StatusBarIconItemRingModeComponent { } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ts b/features/signalcomponent/src/main/ets/default/common/constants.ts index 59b0e4d9..e640ed70 100644 --- a/features/signalcomponent/src/main/ets/default/common/constants.ts +++ b/features/signalcomponent/src/main/ets/default/common/constants.ts @@ -14,7 +14,6 @@ */ export default class Constants { - static NETWORK_TYPE_UNKNOWN = 0; static NETWORK_TYPE_GSM = 1; static NETWORK_TYPE_CDMA = 2; diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 41a3e5b5..b348b532 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -35,7 +35,7 @@ struct SignalIcon { @State style: any = StyleConfiguration.getSignalComponentStyle() aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); if (!this.signalObserved) { mSignalModel.initSignalModel(); this.signalObserved = true; @@ -43,7 +43,7 @@ struct SignalIcon { } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index 53523b39..b2d8215f 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -51,14 +51,13 @@ class StatusBarConfiguration { while (displayData == null) { await display.getDefaultDisplay() .then((res) => { - Log.showInfo(TAG, `getDefaultDisplay dis ${JSON.stringify(res)}`); displayData = res; maxWidth = res.width; maxHeight = res.height; Log.showInfo(TAG, `getDefaultDisplay maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); }) .catch((err) => { - Log.showInfo(TAG, 'getDefaultDisplay err: ' + err); + Log.showError(TAG, `getDefaultDisplay err:${JSON.stringify(err)}`); }); await new Promise((resolve) => setTimeout(resolve, 2000)); } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts index 46827d74..1d571671 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -90,8 +90,6 @@ export class StatusBarService { SwitchUserManager.getInstance().registerListener(this); STATUSBAR_SOURCE_CONFIG.filterDatas = config.MetaSlots; this.mAdapter.initDataSource(STATUSBAR_SOURCE_CONFIG); - - Log.showInfo(TAG, `start StatusBarService finish.`); } stopService() { @@ -102,12 +100,10 @@ export class StatusBarService { this.mIsStart = false; this.mAdapter.clearAll(); - - Log.showInfo(TAG, `stop StatusBarService finish.`); } parseConfig(config) { - Log.showInfo(TAG, `parseConfig, config: ${JSON.stringify(config)}`); + Log.showInfo(TAG, `parseConfig`); this.mConfig = config; const groupIds = [Constants.GROUP_ID_LEFT, Constants.GROUP_ID_CENTER, Constants.GROUP_ID_RIGHT]; @@ -138,12 +134,12 @@ export class StatusBarService { } statusBarLayout.push(components); } - Log.showInfo(TAG, `calcStatusBarLayout, statusBarLayout: ${JSON.stringify(statusBarLayout)}`) + Log.showDebug(TAG, `calcStatusBarLayout, statusBarLayout: ${JSON.stringify(statusBarLayout)}`) this.mListener?.setStatusBarLayout(statusBarLayout); } userChange(userInfo) { - Log.showInfo(TAG, `userChange userInfo ` + userInfo); + Log.showInfo(TAG, `userChange`); this.mAdapter.loadData(userInfo.userId); } @@ -162,7 +158,7 @@ export class StatusBarService { } onItemAdd(itemData: ItemComponentData) { - Log.showInfo(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); + Log.showInfo(TAG, `onItemAdd`); let statusBarData: StatusBarComponentData = parseItemData(itemData); let id = itemData.id; this.mListener?.setItemData(id, statusBarData); @@ -174,7 +170,7 @@ export class StatusBarService { } onItemRemove(itemData: ItemComponentData) { - Log.showInfo(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); + Log.showInfo(TAG, `onItemRemove`); let id = itemData.id; if (this.mStatusBarAllLayout.indexOf(id) >= 0) { this.mStatusBarAllLayout.splice(this.mStatusBarAllLayout.indexOf(id), 1); diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index 9ff15ff9..d1b7bd06 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -37,7 +37,7 @@ export default struct IconItemComponent { @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start, keyId: ${this.keyId} `); + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId} `); this.linkItemData() if (this.mItemData.get()?.relationWindowId) { this.mClearCallback = EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => this.onWindowChange(args)) @@ -45,7 +45,7 @@ export default struct IconItemComponent { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`); + Log.showInfo(TAG, `aboutToDisappear`); this.mClearCallback && this.mClearCallback() this.mClearCallback = undefined } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets index 46bd6dc0..f1ab8a31 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets @@ -31,13 +31,13 @@ export default struct MetaIconItemComponent { @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); this.linkItemData() this.mTintContentInfo = ViewModel.getPluginTintContentInfo(this.keyId) } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`); + Log.showInfo(TAG, `aboutToDisappear`); } linkItemData() { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index f463c615..502b52aa 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -45,13 +45,12 @@ export default struct StatusBarComponent { @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`); + Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`); this.initViewModel(); - Log.showDebug(TAG, `aboutToAppear End`); } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`); + Log.showInfo(TAG, `aboutToDisappear`); } initViewModel() { @@ -115,11 +114,11 @@ struct StatusBarBackground { @State mBackgroundDatas: StatusBarBackgroundData[] = ViewModel.getBackgroundDatas() aboutToAppear() { - Log.showDebug(TAG_StatusBarBackground, `aboutToAppear`); + Log.showInfo(TAG_StatusBarBackground, `aboutToAppear`); } aboutToDisappear() { - Log.showDebug(TAG_StatusBarBackground, `aboutToDisAppear`); + Log.showInfo(TAG_StatusBarBackground, `aboutToDisAppear`); } build() { @@ -163,11 +162,11 @@ struct StatusBarGroup { @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() aboutToAppear() { - Log.showDebug(TAG_StatusBarGroup, `aboutToAppear, mLayoutWeight: ${this.mLayoutWeight} mAlignItems: ${this.mAlignItems} `); + Log.showInfo(TAG_StatusBarGroup, `aboutToAppear, mLayoutWeight: ${this.mLayoutWeight} mAlignItems: ${this.mAlignItems} `); } aboutToDisappear() { - Log.showDebug(TAG_StatusBarGroup, `aboutToDisAppear`); + Log.showInfo(TAG_StatusBarGroup, `aboutToDisAppear`); } build() { @@ -208,11 +207,11 @@ struct VerticalStatusBarItemLoadComponent { @State style: any = StyleConfiguration.getVerticalStatusBarItemLoadComponentStyle() aboutToAppear() { - Log.showDebug(TAG_VerticalStatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName}`); + Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName}`); } aboutToDisappear() { - Log.showDebug(TAG_VerticalStatusBarItemLoadComponent, `aboutToDisAppear, mComponentName: ${this.mComponentName}`); + Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `aboutToDisAppear, mComponentName: ${this.mComponentName}`); } build() { @@ -235,11 +234,11 @@ struct StatusBarItemLoadComponent { private mComponentName: string aboutToAppear() { - Log.showDebug(TAG_StatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName} `) + Log.showInfo(TAG_StatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName} `) } aboutToDisappear() { - Log.showDebug(TAG_StatusBarGroup, `aboutToDisAppear, mComponentName: ${this.mComponentName} `) + Log.showInfo(TAG_StatusBarGroup, `aboutToDisAppear, mComponentName: ${this.mComponentName} `) } build() { @@ -282,11 +281,11 @@ struct StatusBarEmptyIcon { @State mTintContentInfo: TintContentInfo = ViewModel.getEmptyTintContentInfo() aboutToAppear() { - Log.showDebug(TAG_StatusBarEmptyIcon, `aboutToAppear, mStatusBarEmptyWidth: ${this.mStatusBarEmptyWidth} `) + Log.showInfo(TAG_StatusBarEmptyIcon, `aboutToAppear, mStatusBarEmptyWidth: ${this.mStatusBarEmptyWidth} `) } aboutToDisappear() { - Log.showDebug(TAG_StatusBarEmptyIcon, `aboutToDisAppear`); + Log.showInfo(TAG_StatusBarEmptyIcon, `aboutToDisAppear`); } build() { @@ -303,11 +302,11 @@ struct StatusBarNotificationIcon { @State style: any = StyleConfiguration.getStatusBarNotificationIconStyle() aboutToAppear() { - Log.showDebug(TAG_StatusBarNotificationIcon, `aboutToAppear`); + Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToAppear`); } aboutToDisappear() { - Log.showDebug(TAG_StatusBarNotificationIcon, `aboutToDisAppear`); + Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToDisAppear`); } build() { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index 518572c1..a32c89de 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -287,7 +287,7 @@ export class StatusBarVM { } updateStatusBarData(data: StatusBarData): void{ - Log.showInfo(TAG, `updateStatusBarData, data: ${JSON.stringify(data)}`); + Log.showDebug(TAG, `updateStatusBarData, data: ${JSON.stringify(data)}`); for (let key in data) { this.mStatusBarData[key] = data[key]; } diff --git a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets index 3b2c7d6e..f49a9e51 100644 --- a/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets +++ b/features/volumecomponent/src/main/ets/default/pages/volumeComponent.ets @@ -30,7 +30,6 @@ export struct MyVol { }; aboutToAppear() { - Log.showDebug(TAG,'aboutToAppear Start init Volume!'); this.initVolume() Log.showInfo(TAG,'Finished init Volume!'); VolumeModel.init(); @@ -39,7 +38,7 @@ export struct MyVol { } aboutToDisappear () { - Log.showDebug(TAG,'aboutToDisappear'); + Log.showInfo(TAG,'aboutToDisappear'); } initVolume() { diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts index 23ecd60c..ed6d88cd 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts @@ -48,7 +48,7 @@ export default class VolumeWindowController { } updateVolumeInfo(volumeInfo: VolumeInfo) { - Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} `); + Log.showDebug(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} `); if (volumeInfo && !volumeInfo.updateUi && !this.mIsWindowShown) { return; } @@ -74,7 +74,7 @@ export default class VolumeWindowController { .then(() => { Log.showInfo(TAG, `updateShowStatus ${isShow}.`); }) - .catch((err) => Log.showError(TAG, `Can't set volueme window: ${err}.`)); + .catch((err) => Log.showError(TAG, `Can't set volueme window: ${JSON.stringify(err)}.`)); } } } \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts index 74c954fd..a599d894 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts @@ -67,7 +67,7 @@ export class VolumePanelService { } async onVolumeChange(data) { - Log.showInfo(TAG, `onVolumeChange, data: ${JSON.stringify(data)}`); + Log.showInfo(TAG, `onVolumeChange`); let volumeType = this.formatAudioVolumeTypeFromInterface(data.volumeType); this.isMute(volumeType, (volumeType2, data2) => { Log.showInfo(TAG, `onVolumeChange->isMute, volumeType2: ${volumeType2} data2: ${data2}`); @@ -100,9 +100,9 @@ export class VolumePanelService { getVolumeInfo(volumeType: AudioVolumeType, callback?: (volumeInfo: VolumeInfo) => void) { Log.showInfo(TAG, `getVolumeInfo, volumeType: ${volumeType}`); this.getVolume(volumeType, (volumeType, data) => { - Log.showInfo(TAG, `getVolumeInfo->getVolume, volumeType: ${volumeType} data: ${data}`); + Log.showInfo(TAG, `getVolumeInfo->getVolume`); this.isMute(volumeType, (volumeType2, data2) => { - Log.showInfo(TAG, `getVolumeInfo->isMute, volumeType2: ${volumeType2} data2: ${data2}`); + Log.showInfo(TAG, `getVolumeInfo->isMute`); let volumeInfo: VolumeInfo = { volumeType: volumeType, volume: data, @@ -173,7 +173,7 @@ export class VolumePanelService { Log.showInfo(TAG, `setVolumeAndMute, volumeType: ${volumeType} volume: ${volume} mute: ${mute}`); if (volume !== undefined && mute !== undefined) { this.setVolume(volumeType, volume, () => { - Log.showInfo(TAG, `setVolumeAndMute, setVolume callback volumeType: ${volumeType} volume: ${volume} mute: ${mute}`); + Log.showInfo(TAG, `setVolume`); this.setMute(volumeType, mute, callback); }); } else if (volume !== undefined) { @@ -255,7 +255,7 @@ export class VolumePanelService { params: any[], callbackFunction: Function }) { - Log.showInfo(TAG, `addInterfaceCallQueue, interfaceName: ${data.interfaceName} params: ${JSON.stringify(data.params)}`); + Log.showDebug(TAG, `addInterfaceCallQueue, interfaceName: ${data.interfaceName} params: ${JSON.stringify(data.params)}`); this.mInterfaceCallQueue.push(data); if (this.mInterfaceCallQueue.length == 1) { this.execInterfaceCallQueueFirst(); diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets index d85edaed..8c04181e 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets @@ -31,12 +31,12 @@ export default struct VolumePanelComponent { @State style: any = StyleConfiguration.getVolumePanelComponentStyle() aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); ViewModel.initViewModel() } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts index 2228c093..f8f28237 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts @@ -143,7 +143,6 @@ export class VolumePanelVM { } calcVolumeByDisplayVolume(displayVolume: number): number{ - Log.showInfo(TAG, `calcVolumeByDisplayVolume, displayVolume: ${displayVolume}`); let volume: number = displayVolume + this.mMinVolume.get(); Log.showInfo(TAG, `calcVolumeByDisplayVolume, volume: ${volume}`); return volume; diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index 612a1db3..f1299172 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -56,7 +56,7 @@ export default struct WifiIcon { } private getImage(wifiInfo: number) { - Log.showInfo(TAG, `getImage, wifiInfo: ${JSON.stringify(wifiInfo)}`); + Log.showInfo(TAG, `getImage`); let wifiImage; switch (wifiInfo) { case Constants.WIFI_SIGNAL_NO: -- Gitee From 099b839bf2b7f14df8af0266ebf160fd4db158b9 Mon Sep 17 00:00:00 2001 From: qp Date: Mon, 23 May 2022 18:47:27 +0800 Subject: [PATCH 108/373] =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=8F=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: qp --- .../main/ets/default/StyleConfiguration.ts | 4 +- .../main/resources/base/element/float.json | 12 ++ .../main/resources/phone/element/float.json | 12 ++ .../main/ets/default/pages/batteryIcon.ets | 14 +-- .../src/main/ets/default/pages/batterySoc.ets | 12 +- .../main/resources/base/element/float.json | 8 +- .../main/resources/phone/element/float.json | 8 +- .../src/main/ets/default/pages/clockIcon.ets | 6 +- .../main/resources/base/element/float.json | 4 + .../main/resources/phone/element/float.json | 8 ++ .../ets/com/ohos/view/component/statusBar.ets | 23 ++-- .../main/resources/base/element/float.json | 16 +++ .../main/resources/phone/element/float.json | 21 ++++ .../src/main/ets/default/pages/signalIcon.ets | 61 ++++----- .../main/resources/base/element/float.json | 4 + .../main/resources/phone/element/float.json | 4 + .../src/main/ets/default/pages/wifiIcon.ets | 12 +- .../main/resources/base/element/float.json | 3 +- .../main/resources/base/element/float.json | 117 +++++++++++++++++- .../main/resources/base/element/float.json | 116 +++++++++++++++++ 20 files changed, 374 insertions(+), 91 deletions(-) create mode 100644 common/src/main/resources/base/element/float.json create mode 100644 common/src/main/resources/phone/element/float.json create mode 100644 features/clockcomponent/src/main/resources/phone/element/float.json create mode 100644 features/screenlock/src/main/resources/phone/element/float.json diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts index 1d8f3e26..35e326d0 100644 --- a/common/src/main/ets/default/StyleConfiguration.ts +++ b/common/src/main/ets/default/StyleConfiguration.ts @@ -22,10 +22,10 @@ export default class StyleConfiguration { const key: string = TAG + "-Common"; return StyleManager.getStyle(key, () => { return { - statusBarFontSize: '16fp', + statusBarFontSize: $r("app.float.signal_fontSize"), statusBarIconWidth: '24vp', statusBarIconHeight: '24vp', - statusBarMarginLeftRight: '5vp', + statusBarMarginLeftRight: $r("app.float.signal_status_margin_Left_right"), }; }); } diff --git a/common/src/main/resources/base/element/float.json b/common/src/main/resources/base/element/float.json new file mode 100644 index 00000000..03bfc6ff --- /dev/null +++ b/common/src/main/resources/base/element/float.json @@ -0,0 +1,12 @@ +{ + "float": [ + { + "name": "signal_status_margin_Left_right", + "value": "5vp" + }, + { + "name": "signal_fontSize", + "value": "16fp" + } + ] +} \ No newline at end of file diff --git a/common/src/main/resources/phone/element/float.json b/common/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..ffc86e2b --- /dev/null +++ b/common/src/main/resources/phone/element/float.json @@ -0,0 +1,12 @@ +{ + "float": [ + { + "name": "signal_status_margin_Left_right", + "value": "0" + }, + { + "name": "signal_fontSize", + "value": "12fp" + } + ] +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index 2710a55b..83fb2e66 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -23,9 +23,7 @@ import StyleConfiguration from '../common/StyleConfiguration' import { StatusBarGroupComponentData } from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vM/StatusBarVM' -import deviceInfo from '@ohos.deviceInfo'; -const deviceTypeInfo = deviceInfo.deviceType const TAG = 'BatteryComponent-batteryIcon' @Component @@ -36,17 +34,11 @@ export default struct BatteryIcon { @State mStatusBarGroupComponentData: StatusBarGroupComponentData = new StatusBarGroupComponentData() @State style: any = StyleConfiguration.getBatteryComponentStyle() @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() - private isPhone: boolean= false aboutToAppear() { this.mStatusBarGroupComponentData = StatusBarVM.getStatusBarGroupComponentData(this.mGroupId) mBatteryModel.initBatteryModel(); Log.showInfo(TAG, 'aboutToAppear'); - if (deviceTypeInfo === "phone") { - this.isPhone = true - } else { - this.isPhone = false - } } aboutToDisappear() { @@ -55,11 +47,11 @@ export default struct BatteryIcon { build() { Row() { - Row().width(this.isPhone ? "2vp" : this.styleCommon.statusBarMarginLeftRight).height('100%') + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') BatterySoc({ mContentColor: this.mStatusBarGroupComponentData.contentColor }) - Row().width(this.isPhone ? "2vp" : this.style.componentGap).height('100%') + Row().width(this.style.componentGap).height('100%') BatteryPic({ mContentColor: this.mStatusBarGroupComponentData.contentColor }) - Row().width(this.isPhone ? 0 : this.styleCommon.statusBarMarginLeftRight).height('100%') + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } .height('100%') } diff --git a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets index 50be99f7..31e9d466 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -15,9 +15,7 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' -import deviceInfo from '@ohos.deviceInfo'; -const deviceTypeInfo = deviceInfo.deviceType const TAG = 'BatteryComponent-batterySoc' @Component @@ -25,15 +23,9 @@ export default struct BatterySoc { @StorageLink('batterySoc') batterySoc: number = 100 @Prop mContentColor: string @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() - private isPhone: boolean= false aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear Start'); - if (deviceTypeInfo === "phone") { - this.isPhone = true - } else { - this.isPhone = false - } } aboutToDisappear() { @@ -43,7 +35,7 @@ export default struct BatterySoc { build() { Text(this.batterySoc + '%') .fontColor(this.mContentColor) - .fontSize(this.isPhone ? '12fp' : this.styleCommon.statusBarFontSize) - .fontWeight(this.isPhone ? FontWeight.Medium : FontWeight.Normal) + .fontSize(this.styleCommon.statusBarFontSize) + .fontWeight(FontWeight.Medium) } } diff --git a/features/batterycomponent/src/main/resources/base/element/float.json b/features/batterycomponent/src/main/resources/base/element/float.json index 0bd8930e..7ea5c80b 100644 --- a/features/batterycomponent/src/main/resources/base/element/float.json +++ b/features/batterycomponent/src/main/resources/base/element/float.json @@ -1,9 +1,5 @@ { "float": [ - { - "name": "battery_component_gap", - "value": "8.5vp" - }, { "name": "battery_component_pic_gap", "value": "2vp" @@ -39,6 +35,10 @@ { "name": "battery_component_pic_head_height", "value": "10vp" + }, + { + "name": "battery_component_gap", + "value": "8.5vp" } ] } \ No newline at end of file diff --git a/features/batterycomponent/src/main/resources/phone/element/float.json b/features/batterycomponent/src/main/resources/phone/element/float.json index 099ec2ed..a22c7c25 100644 --- a/features/batterycomponent/src/main/resources/phone/element/float.json +++ b/features/batterycomponent/src/main/resources/phone/element/float.json @@ -1,9 +1,5 @@ { "float": [ - { - "name": "battery_component_gap", - "value": "0vp" - }, { "name": "battery_component_pic_gap", "value": "1.2vp" @@ -39,6 +35,10 @@ { "name": "battery_component_pic_head_height", "value": "5.75vp" + }, + { + "name": "battery_component_gap", + "value": "2vp" } ] } \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index b95ad4dd..02b69ee9 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -16,13 +16,13 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' import StyleConfiguration from '../common/styleconfiguration' import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' -import {StatusBarGroupComponentData} from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' +import { StatusBarGroupComponentData } from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vm/StatusBarVM' import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT, } from '../../../../../../../common/src/main/ets/default/TimeManager' -import EventManager, {unsubscribe} from '../../../../../../../common/src/main/ets/default/event/EventManager' +import EventManager, { unsubscribe } from '../../../../../../../common/src/main/ets/default/event/EventManager' const TAG = 'ClockComponent-clockIcon'; @@ -57,6 +57,8 @@ export default struct ClockIcon { .fontColor(this.mStatusBarGroupComponentData.contentColor) .fontSize(this.styleCommon.statusBarFontSize) .width(this.style.statusBarClockMaxWidth) + .fontWeight(FontWeight.Medium) + .margin({ left: $r("app.float.status_bar_clock_margin") }) Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } } diff --git a/features/clockcomponent/src/main/resources/base/element/float.json b/features/clockcomponent/src/main/resources/base/element/float.json index 4ee9f179..847e2779 100644 --- a/features/clockcomponent/src/main/resources/base/element/float.json +++ b/features/clockcomponent/src/main/resources/base/element/float.json @@ -3,6 +3,10 @@ { "name": "status_bar_clock_width", "value": "60vp" + }, + { + "name": "status_bar_clock_margin", + "value": "0" } ] } \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/phone/element/float.json b/features/clockcomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..155e7de8 --- /dev/null +++ b/features/clockcomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "status_bar_clock_margin", + "value": "2vp" + } + ] +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets index 31c0a07b..407d227f 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets @@ -27,14 +27,14 @@ const TAG = 'ScreenLock-StatusBar' @Component export default struct statusBar { - private isPhone: boolean= false + private isShow: boolean aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) if (deviceTypeInfo === "phone") { - this.isPhone = true + this.isShow = false } else { - this.isPhone = false + this.isShow = true } } @@ -47,19 +47,20 @@ export default struct statusBar { .height(Constants.FULL_CONTAINER_HEIGHT) Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - if (this.isPhone) { - BatteryIcon() - } else { - BatteryIcon() + BatteryIcon() + if (this.isShow) { ClockIcon() } }.width(Constants.HALF_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) } .width(Constants.FULL_CONTAINER_WIDTH) - .height(this.isPhone ? '24vp' : Constants.FULL_CONTAINER_HEIGHT) - .padding({ left: this.isPhone ? '24vp' : 0, right: this.isPhone ? '24vp' : 0 }) - .margin({ top: this.isPhone ? '4vp' : 0 }) - .opacity(this.isPhone ? 0.7 : 1) + .height($r("app.float.status_bar_height")) + .padding({ + left: $r("app.float.status_bar_padding_left_right"), + right: $r("app.float.status_bar_padding_left_right") + }) + .margin({ top: $r("app.float.status_bar_margin_top") }) + .opacity($r("app.float.status_bar_opacity")) } } \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/element/float.json b/features/screenlock/src/main/resources/base/element/float.json index 56eab30e..8ceafa08 100644 --- a/features/screenlock/src/main/resources/base/element/float.json +++ b/features/screenlock/src/main/resources/base/element/float.json @@ -179,6 +179,22 @@ { "name": "custompsd_key_area_margin_bottom", "value": "64" + }, + { + "name": "status_bar_height", + "value": "48vp" + }, + { + "name": "status_bar_padding_left_right", + "value": "0" + }, + { + "name": "status_bar_margin_top", + "value": "0" + }, + { + "name": "status_bar_opacity", + "value": "1" } ] } \ No newline at end of file diff --git a/features/screenlock/src/main/resources/phone/element/float.json b/features/screenlock/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..bc1ec8bd --- /dev/null +++ b/features/screenlock/src/main/resources/phone/element/float.json @@ -0,0 +1,21 @@ + +{ + "float": [ + { + "name": "status_bar_height", + "value": "24vp" + }, + { + "name": "status_bar_padding_left_right", + "value": "24vp" + }, + { + "name": "status_bar_margin_top", + "value": "4vp" + }, + { + "name": "status_bar_opacity", + "value": "0.7" + } + ] +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 9aecab7e..71f3415c 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -21,9 +21,7 @@ import StyleConfiguration from '../common/StyleConfiguration' import { StatusBarGroupComponentData } from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vm/StatusBarVM' -import deviceInfo from '@ohos.deviceInfo'; -const deviceTypeInfo = deviceInfo.deviceType const TAG = 'SignalComponent-SignalIcon' @Component @@ -36,7 +34,6 @@ export default struct SignalIcon { @State mStatusBarGroupComponentData: StatusBarGroupComponentData = new StatusBarGroupComponentData() @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() @State style: any = StyleConfiguration.getSignalComponentStyle() - private isPhone: boolean= false aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); @@ -45,11 +42,6 @@ export default struct SignalIcon { mSignalModel.initSignalModel(); this.signalObserved = true; } - if (deviceTypeInfo === "phone") { - this.isPhone = true - } else { - this.isPhone = false - } } aboutToDisappear() { @@ -58,17 +50,17 @@ export default struct SignalIcon { build() { Row() { - Row().width(this.isPhone ? 0 : this.styleCommon.statusBarMarginLeftRight).height('100%') + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') Text(this.updateNetworkState(this.networkState)) - .fontSize(this.isPhone ? '12fp' : this.styleCommon.statusBarFontSize) - .fontWeight(this.isPhone ? FontWeight.Medium : FontWeight.Normal) - .fontColor(this.isPhone ? "#FFFFFF" : this.mStatusBarGroupComponentData.contentColor) + .fontSize(this.styleCommon.statusBarFontSize) + .fontWeight(FontWeight.Medium) + .fontColor(this.mStatusBarGroupComponentData.contentColor) .textOverflow({ overflow: TextOverflow.Ellipsis }) .constraintSize({ maxWidth: this.style.signalTextMaxWeight }) .flexShrink(0) .maxLines(1) .textAlign(TextAlign.Center) - Row().width(this.isPhone ? 0 : this.styleCommon.statusBarMarginLeftRight).height('100%') + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') Stack({ alignContent: Alignment.TopStart }) { Text(this.updateCellularType(this.cellularType)) @@ -76,8 +68,8 @@ export default struct SignalIcon { .fontColor(this.mStatusBarGroupComponentData.contentColor) .width(this.style.netSignalTextMaxWidth) .fontWeight(FontWeight.Bold) - .textAlign(this.isPhone ? TextAlign.Start : TextAlign.Center) - .margin({ left: this.isPhone ? "3vp" : 0 }) + .textAlign(TextAlign.Start) + .margin({ left: $r("app.float.signal_margin") }) Image(this.updateCellularImage(this.cellularLevel)) .objectFit(ImageFit.Contain) .width(this.style.cellularImageWidth) @@ -85,17 +77,16 @@ export default struct SignalIcon { .fillColor(this.mStatusBarGroupComponentData.contentColor) }.flexShrink(1) - Row().width(this.isPhone ? 0 : this.styleCommon.statusBarMarginLeftRight).height('100%') + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } .height('100%') } - - /** - * Get the string of cellular type - * - * @param {number} type - number of cellular type - * @return {string} typeString type of cellular type - */ + /* + * Get the string of cellular type + * + * @param {number} type - number of cellular type + * @return {string} typeString type of cellular type + */ private updateCellularType(signalType): string { Log.showInfo(TAG, `updateCellularType, signalType: ${signalType}`); let typeString; @@ -122,12 +113,12 @@ export default struct SignalIcon { return typeString; } - /** - * Get the cellular signal image - * - * @param {number} level - signal level from signalModel - * @return {string} cellularImage image of cellular signal - */ + /* + * Get the cellular signal image + * + * @param {number} level - signal level from signalModel + * @return {string} cellularImage image of cellular signal + */ private updateCellularImage(level) { Log.showInfo(TAG, `updateCellularImage, level: ${level}`); let cellularImage; @@ -159,12 +150,12 @@ export default struct SignalIcon { return cellularImage; } - /** - * Get the NetworkState signal name - * - * @param {string} netWorkState - network state from signal model - * @return {string} vendor's name or signal state - */ + /* + * Get the NetworkState signal name + * + * @param {string} netWorkState - network state from signal model + * @return {string} vendor's name or signal state + */ private updateNetworkState(netWorkState) { Log.showInfo(TAG, `updateNetworkState, netWorkState: ${netWorkState}`); let networkStateName; diff --git a/features/signalcomponent/src/main/resources/base/element/float.json b/features/signalcomponent/src/main/resources/base/element/float.json index cca6ffd2..5174b895 100644 --- a/features/signalcomponent/src/main/resources/base/element/float.json +++ b/features/signalcomponent/src/main/resources/base/element/float.json @@ -23,6 +23,10 @@ { "name":"status_bar_signal_net_signal_text_max_width", "value":"18vp" + }, + { + "name": "signal_margin", + "value": "0" } ] } \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/element/float.json b/features/signalcomponent/src/main/resources/phone/element/float.json index 7961e28e..cf3542da 100644 --- a/features/signalcomponent/src/main/resources/phone/element/float.json +++ b/features/signalcomponent/src/main/resources/phone/element/float.json @@ -23,6 +23,10 @@ { "name": "status_bar_signal_net_signal_text_max_width", "value": "15vp" + }, + { + "name": "signal_margin", + "value": "3vp" } ] } \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index f517b5b1..f73bafd3 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -21,9 +21,7 @@ import StyleConfiguration from '../common/StyleConfiguration' import { StatusBarGroupComponentData } from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vM/StatusBarVM' -import deviceInfo from '@ohos.deviceInfo'; -const deviceTypeInfo = deviceInfo.deviceType const TAG = 'WifiComponent-WifiIcon' @Component @@ -34,17 +32,11 @@ export default struct WifiIcon { @State mStatusBarGroupComponentData: StatusBarGroupComponentData = new StatusBarGroupComponentData() @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() @State style: any = StyleConfiguration.getStartsBarWifiComponentStyle() - private isPhone: boolean= false aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) this.mStatusBarGroupComponentData = StatusBarVM.getStatusBarGroupComponentData(this.mGroupId) mWifiModel.initWifiModel() - if (deviceTypeInfo === "phone") { - this.isPhone = true - } else { - this.isPhone = false - } } aboutToDisappear() { @@ -54,13 +46,13 @@ export default struct WifiIcon { build() { Row() { if (this.wifiStatus) { - Row().width(this.isPhone ? 0 : this.styleCommon.statusBarMarginLeftRight).height('100%') + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') Image(this.getImage(this.wifiInfo)) .objectFit(ImageFit.Contain) .width(this.style.statusBarWifiWidth) .height(this.style.statusBarWifiHeight) .fillColor(this.mStatusBarGroupComponentData.contentColor) - Row().width(this.isPhone ? 0 : this.styleCommon.statusBarMarginLeftRight).height('100%') + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } } .height('100%') diff --git a/features/wificomponent/src/main/resources/base/element/float.json b/features/wificomponent/src/main/resources/base/element/float.json index 15f65e97..a99a0aff 100644 --- a/features/wificomponent/src/main/resources/base/element/float.json +++ b/features/wificomponent/src/main/resources/base/element/float.json @@ -3,7 +3,8 @@ { "name": "status_bar_wifi_width", "value": "24vp" - },{ + }, + { "name": "status_bar_wifi_height", "value": "24vp" } diff --git a/product/pc/src/main/resources/base/element/float.json b/product/pc/src/main/resources/base/element/float.json index aaf9b3a7..d7d54c64 100644 --- a/product/pc/src/main/resources/base/element/float.json +++ b/product/pc/src/main/resources/base/element/float.json @@ -1,6 +1,5 @@ { "float": [ - { "name": "lockicon_area_height", "value": "44" @@ -56,6 +55,122 @@ { "name": "status_bar_height", "value": "48vp" + }, + { + "name": "status_bar_padding_left_right", + "value": "0" + }, + { + "name": "status_bar_margin_top", + "value": "0" + }, + { + "name": "status_bar_opacity", + "value": "1" + }, + { + "name": "signal_status_margin_Left_right", + "value": "5vp" + }, + { + "name": "signal_fontSize", + "value": "16fp" + }, + { + "name": "signal_margin", + "value": "0" + }, + { + "name": "status_bar_signal_type_font_size", + "value": "10fp" + }, + { + "name": "status_bar_signal_unknown_font_size", + "value": "14fp" + }, + { + "name": "signal_component_icon_width", + "value": "32vp" + }, + { + "name": "signal_component_icon_height", + "value": "24vp" + }, + { + "name": "signal_text_max_width", + "value": "113vp" + }, + { + "name": "status_bar_signal_net_signal_text_max_width", + "value": "18vp" + }, + { + "name": "status_bar_wifi_width", + "value": "24vp" + }, + { + "name": "status_bar_wifi_height", + "value": "24vp" + }, + { + "name": "wifi_margin_left_right", + "value": "5vp" + }, + { + "name": "battery_margin_left_right_o", + "value": "5vp" + }, + { + "name": "battery_component_gap", + "value": "8.5vp" + }, + { + "name": "battery_margin_left_right_t", + "value": "5vp" + }, + { + "name": "battery_fontSize", + "value": "16fp" + }, + { + "name": "battery_component_pic_gap", + "value": "2vp" + }, + { + "name": "battery_component_pic_body_height", + "value": "19vp" + }, + { + "name": "battery_component_pic_body_width", + "value": "34.5vp" + }, + { + "name": "battery_component_pic_body_padding", + "value": "2vp" + }, + { + "name": "battery_component_pic_body_border_width", + "value": "1vp" + }, + { + "name": "battery_component_pic_border_radius", + "value": "2vp" + }, + { + "name": "battery_component_pic_head_radius", + "value": "2vp" + }, + { + "name": "battery_component_pic_head_width", + "value": "3vp" + }, + { + "name": "battery_component_pic_head_height", + "value": "10vp" + }, + { + "name": "status_bar_clock_margin", + "value": "0" } ] } \ No newline at end of file diff --git a/product/phone/src/main/resources/base/element/float.json b/product/phone/src/main/resources/base/element/float.json index 37ca3093..2b907c3d 100644 --- a/product/phone/src/main/resources/base/element/float.json +++ b/product/phone/src/main/resources/base/element/float.json @@ -3,6 +3,122 @@ { "name": "status_bar_height", "value": "24vp" + }, + { + "name": "status_bar_padding_left_right", + "value": "24vp" + }, + { + "name": "status_bar_margin_top", + "value": "4vp" + }, + { + "name": "status_bar_opacity", + "value": "0.7" + }, + { + "name": "signal_status_margin_Left_right", + "value": "0" + }, + { + "name": "signal_fontSize", + "value": "12fp" + }, + { + "name": "signal_margin", + "value": "3vp" + }, + { + "name": "status_bar_signal_type_font_size", + "value": "5.5fp" + }, + { + "name": "status_bar_signal_unknown_font_size", + "value": "7fp" + }, + { + "name": "signal_component_icon_width", + "value": "21.5vp" + }, + { + "name": "signal_component_icon_height", + "value": "15vp" + }, + { + "name": "signal_text_max_width", + "value": "113vp" + }, + { + "name": "status_bar_signal_net_signal_text_max_width", + "value": "15vp" + }, + { + "name": "status_bar_wifi_width", + "value": "15.75vp" + }, + { + "name": "status_bar_wifi_height", + "value": "15vp" + }, + { + "name": "wifi_margin_left_right", + "value": "0" + }, + { + "name": "battery_margin_left_right_o", + "value": "2vp" + }, + { + "name": "battery_component_gap", + "value": "2vp" + }, + { + "name": "battery_margin_left_right_t", + "value": "0" + }, + { + "name": "battery_fontSize", + "value": "12fp" + }, + { + "name": "battery_component_pic_gap", + "value": "1.2vp" + }, + { + "name": "battery_component_pic_body_height", + "value": "11vp" + }, + { + "name": "battery_component_pic_body_width", + "value": "18.5vp" + }, + { + "name": "battery_component_pic_body_padding", + "value": "1vp" + }, + { + "name": "battery_component_pic_body_border_width", + "value": "1vp" + }, + { + "name": "battery_component_pic_border_radius", + "value": "2.5vp" + }, + { + "name": "battery_component_pic_head_radius", + "value": "3vp" + }, + { + "name": "battery_component_pic_head_width", + "value": "1.5vp" + }, + { + "name": "battery_component_pic_head_height", + "value": "5.75vp" + }, + { + "name": "status_bar_clock_margin", + "value": "2vp" } ] } \ No newline at end of file -- Gitee From 43332b048c4ad77527de6eb8dfa20eb8d313e5c3 Mon Sep 17 00:00:00 2001 From: Mst Date: Mon, 23 May 2022 21:41:48 +0800 Subject: [PATCH 109/373] =?UTF-8?q?=E6=A8=AA=E7=AB=96=E5=B1=8F=E7=9A=84?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mst --- .../ets/com/ohos/view/component/customPSD.ets | 18 +++++++-------- .../com/ohos/view/component/digitalPSD.ets | 7 +++--- .../com/ohos/view/component/numkeyBoard.ets | 18 +++++++-------- .../main/resources/base/element/float.json | 21 ++++++++++++++++++ .../main/resources/phone/element/float.json | 22 ++++++++++++++++++- .../phone/src/main/ets/common/constants.ts | 2 +- 6 files changed, 63 insertions(+), 25 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index c662edf7..1b85e859 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -43,7 +43,7 @@ export default struct CustomPSD { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { Text(this.mViewModel.prompt) .fontSize($r('app.float.custompsd_prompt_fontsize')) - .fontWeight(deviceInfo.deviceType === 'tablet' ? FontWeight.Bold : 'Medium') + .fontWeight(FontWeight.Medium) .fontColor(Color.White) .margin({ bottom: $r('app.float.custompsd_prompt_margin_bottom') }) .textAlign(TextAlign.Center) @@ -53,23 +53,23 @@ export default struct CustomPSD { Stack({ alignContent: Alignment.Center }) { Text() - .width(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_WIDTH : 288) - .height(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_HEIGHT : 36) + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) .backgroundColor(Color.Gray) .borderRadius($r('app.float.custompsd_input_radius')) - .opacity(deviceInfo.deviceType === 'tablet' ? 1 : 0.2) + .opacity($r("app.float.custompsd_text_opacity")) List({ space: Constants.DIGITALPSD_IC_DIAMETER }) { ForEach(this.passwordArr, (item) => { ListItem() { Image($r("app.media.ic_solid_dot")) - .width(deviceInfo.deviceType === 'tablet' ? Constants.DIGITALPSD_IC_DIAMETER : 9) - .height(deviceInfo.deviceType === 'tablet' ? Constants.DIGITALPSD_IC_DIAMETER : 9) + .width($r("app.float.custompsd_digitalpsd_ic_diameter")) + .height($r("app.float.custompsd_digitalpsd_ic_diameter")) } }) } .listDirection(Axis.Horizontal) - .height(deviceInfo.deviceType === 'tablet' ? Constants.DIGITALPSD_IC_DIAMETER : 9) + .height($r("app.float.custompsd_digitalpsd_ic_diameter")) } .width($r('app.float.custompsd_input_width')) .height($r('app.float.custompsd_input_height')) @@ -79,7 +79,7 @@ export default struct CustomPSD { stateEffect: true }) .width($r('app.float.custompsd_input_width')) - .height(deviceInfo.deviceType === 'tablet' ? $r('app.float.custompsd_input_height') : 40) + .height($r("app.float.custompsd_button_height")) .enabled(this.passwordArr.length > 1) .opacity(deviceInfo.deviceType === 'tablet' ? 1 : (this.passwordArr.length > 1 ? 1 : 0.4)) .onClick(() => { @@ -88,7 +88,7 @@ export default struct CustomPSD { Log.showInfo(TAG, `onClick callback promptText:${JSON.stringify(this.mViewModel.prompt)}`) }); }) - .margin({ top: deviceInfo.deviceType === 'tablet' ? $r('sys.float.ohos_id_elements_margin_vertical_l') : 16 }) + .margin({ top: $r('sys.float.ohos_id_elements_margin_vertical_l')}) } .width(Constants.FULL_CONTAINER_WIDTH) .height($r('app.float.custompsd_input_area_height')) diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets index 64e32436..c26d20fb 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -17,7 +17,6 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard' import ViewModel from '../../vm/digitalPSDViewModel' -import deviceInfo from '@ohos.deviceInfo'; const TAG = 'ScreenLock-DigitalPSD' @@ -43,7 +42,7 @@ export default struct DigitalPSD { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { Text(this.mViewModel.prompt) .fontSize($r('app.float.digitalpsd_prompt_fontsize')) - .fontWeight(deviceInfo.deviceType === 'tablet' ? FontWeight.Bold : "Medium") + .fontWeight(FontWeight.Medium) .fontColor(Color.White) .margin({ bottom: $r('app.float.digitalpsd_prompt_margin_bottom') }) .textAlign(TextAlign.Center) @@ -55,8 +54,8 @@ export default struct DigitalPSD { ForEach(this.passwdMaskArr, (item) => { GridItem() { Image(item) - .width(deviceInfo.deviceType === 'tablet' ? Constants.DIGITALPSD_IC_DIAMETER : 12) - .height(deviceInfo.deviceType === 'tablet' ? Constants.DIGITALPSD_IC_DIAMETER : 12) + .width(Constants.DIGITALPSD_IC_DIAMETER) + .height(Constants.DIGITALPSD_IC_DIAMETER) } }) } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets index 509a498a..d76375b0 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets @@ -51,37 +51,35 @@ export default struct NumkeyBoard { item.value == Constants.DEL_PWD) { Text(item.row1) .fontSize($r('app.float.digitalpsd_prompt_fontsize')) - .fontWeight(deviceInfo.deviceType === 'tablet' ? FontWeight.Bold : 'Medium') + .fontWeight(FontWeight.Medium) .fontColor(Color.White) .textAlign(TextAlign.Center) .width(Constants.FULL_CONTAINER_WIDTH) - .lineHeight(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_HEIGHT : 21) .padding(0) .margin(0) } else { Text(item.row1) .fontSize($r('app.float.digitalpsd_row1_fontsize')) - .fontWeight(deviceInfo.deviceType === 'tablet' ? FontWeight.Bold : 'Medium') + .fontWeight(FontWeight.Medium) .fontColor(Color.White) .textAlign(TextAlign.Center) .width(Constants.FULL_CONTAINER_WIDTH) - .lineHeight(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_HEIGHT : 38) .padding(0) .margin(0) } if (!!item.row2) { Text(item.row2) .fontSize($r('app.float.digitalpsd_row2_fontsize')) - .fontWeight(deviceInfo.deviceType === 'tablet' ? FontWeight.Bold : 'Regular') + .fontWeight(FontWeight.Regular) .fontColor(Color.White) - .opacity(deviceInfo.deviceType === 'tablet' ? 1 : 0.6) + .opacity($r("app.float.numkeyBoard_text_opacity")) .textAlign(TextAlign.Center) .width(Constants.FULL_CONTAINER_WIDTH) .padding(0) .margin(0) } } - .width(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_WIDTH : 98.75) + .width(Constants.FULL_CONTAINER_WIDTH) .height($r('app.float.digitalpsd_row_height')) } @@ -116,9 +114,9 @@ export default struct NumkeyBoard { } .columnsTemplate('1fr 1fr 1fr') .rowsTemplate('1fr 1fr 1fr 1fr') - .rowsGap(deviceInfo.deviceType === 'tablet' ? 0 : 22) - .width(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_WIDTH : 312) - .height(deviceInfo.deviceType === 'tablet' ? Constants.FULL_CONTAINER_HEIGHT : 288) + .rowsGap($r("app.float.numkeyBoard_rowsGap")) + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) diff --git a/features/screenlock/src/main/resources/base/element/float.json b/features/screenlock/src/main/resources/base/element/float.json index 56eab30e..a604961b 100644 --- a/features/screenlock/src/main/resources/base/element/float.json +++ b/features/screenlock/src/main/resources/base/element/float.json @@ -179,6 +179,27 @@ { "name": "custompsd_key_area_margin_bottom", "value": "64" + }, + { + "name": "custompsd_text_opacity", + "value": "1" + }, + { + "name": "custompsd_digitalpsd_ic_diameter", + "value": "12vp" + }, + { + "name": "custompsd_button_height", + "value": "36vp" + }, + { + "name": "numkeyBoard_text_opacity", + "value": "1" + }, + { + "name": "numkeyBoard_rowsGap", + "value": "0" } + ] } \ No newline at end of file diff --git a/features/screenlock/src/main/resources/phone/element/float.json b/features/screenlock/src/main/resources/phone/element/float.json index 479daa25..a1ed56f5 100644 --- a/features/screenlock/src/main/resources/phone/element/float.json +++ b/features/screenlock/src/main/resources/phone/element/float.json @@ -90,7 +90,7 @@ }, { "name": "digitalpsd_row_height", - "value": "48vp" + "value": "52vp" }, { "name": "digitalpsd_key_area_height", @@ -179,6 +179,26 @@ { "name": "custompsd_key_area_margin_bottom", "value": "52vp" + }, + { + "name": "custompsd_text_opacity", + "value": "0.2" + }, + { + "name": "custompsd_digitalpsd_ic_diameter", + "value": "9vp" + }, + { + "name": "custompsd_button_height", + "value": "40vp" + }, + { + "name": "numkeyBoard_text_opacity", + "value": "0.6" + }, + { + "name": "numkeyBoard_rowsGap", + "value": "22vp" } ] } \ No newline at end of file diff --git a/product/phone/src/main/ets/common/constants.ts b/product/phone/src/main/ets/common/constants.ts index cf527346..43177b12 100644 --- a/product/phone/src/main/ets/common/constants.ts +++ b/product/phone/src/main/ets/common/constants.ts @@ -28,7 +28,7 @@ export default class Constants { static LOCKICON_AREA_WIDTH = '15%' static DATETIME_AREA_WIDTH = '20%' - static PASSWORD_AREA_WIDTH = '95%' + static PASSWORD_AREA_WIDTH = '312vp' static STATUS_ABOUT_TO_APPEAR = 1 static STATUS_ABOUT_TO_DISAPPEAR = 2 -- Gitee From 1ca4e6848bd4c285a90fdcf34ffbcbc22e499645 Mon Sep 17 00:00:00 2001 From: Mst Date: Tue, 24 May 2022 12:12:20 +0800 Subject: [PATCH 110/373] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mst --- features/screenlock/src/main/resources/base/element/float.json | 3 +-- .../screenlock/src/main/resources/phone/element/float.json | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/features/screenlock/src/main/resources/base/element/float.json b/features/screenlock/src/main/resources/base/element/float.json index 746bfa77..607ca042 100644 --- a/features/screenlock/src/main/resources/base/element/float.json +++ b/features/screenlock/src/main/resources/base/element/float.json @@ -200,7 +200,7 @@ "name": "numkeyBoard_rowsGap", "value": "0" }, - { + { "name": "status_bar_height", "value": "48vp" }, @@ -216,6 +216,5 @@ "name": "status_bar_opacity", "value": "1" } - ] } \ No newline at end of file diff --git a/features/screenlock/src/main/resources/phone/element/float.json b/features/screenlock/src/main/resources/phone/element/float.json index 145f19a4..36a268fa 100644 --- a/features/screenlock/src/main/resources/phone/element/float.json +++ b/features/screenlock/src/main/resources/phone/element/float.json @@ -200,7 +200,7 @@ "name": "numkeyBoard_rowsGap", "value": "22vp" }, - { + { "name": "status_bar_height", "value": "24vp" }, @@ -216,6 +216,5 @@ "name": "status_bar_opacity", "value": "0.7" } - ] } \ No newline at end of file -- Gitee From 18087297852ad8c4f80106c02515768344c2f327 Mon Sep 17 00:00:00 2001 From: r00498791 Date: Tue, 24 May 2022 12:25:18 +0800 Subject: [PATCH 111/373] log rectification of product entry and common module 2 Signed-off-by: r00498791 --- common/src/main/ets/default/SettingsUtil.ts | 6 +++--- common/src/main/ets/default/WindowManager.ts | 10 +++++----- .../ets/plugindatasource/PluginDataSourceAdapter.ts | 4 ++-- .../ets/plugindatasource/common/BundleParseUtil.ts | 2 +- common/src/main/ets/template/SimpleToggleBase.ets | 4 ++-- common/src/main/ets/template/iconComponent.ets | 4 ++-- common/src/main/ets/template/iconTitleBase.ets | 4 ++-- entry/pc/src/main/ets/Application/AbilityStage.ts | 2 +- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 4 ++-- entry/phone/src/main/ets/Application/AbilityStage.ts | 2 +- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 4 ++-- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 4 ++-- .../src/main/ets/common/NavBarConfiguration.ts | 4 ---- .../navigationBar/src/main/ets/pages/index.ets | 4 ++-- .../navigationBar/src/main/ets/pages/keyButton.ets | 4 ++-- .../navigationBar/src/main/ets/pages/oneLayout.ets | 4 ++-- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../src/main/ets/MainAbility/MainAbility.ts | 12 ++++++------ .../src/main/ets/pages/batchSetEnable.ets | 4 ++-- .../src/main/ets/pages/noDisturb.ets | 4 ++-- .../src/main/ets/pages/noDisturbPre.ets | 8 ++++---- .../src/main/ets/pages/setEnable.ets | 8 ++++---- .../src/main/ets/pages/slotSetting.ets | 4 ++-- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 4 ++-- .../default/volumepanel/src/main/ets/pages/index.ets | 4 ++-- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 4 ++-- .../pc/controlpanel/src/main/ets/pages/control.ets | 4 ++-- product/pc/controlpanel/src/main/ets/pages/index.ets | 4 ++-- .../src/main/ets/workers/PluginDataSourceWorker.js | 4 ++-- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 4 ++-- .../src/main/ets/pages/bannerNotification.ets | 4 ++-- .../notificationpanel/src/main/ets/pages/index.ets | 8 ++++---- .../src/main/ets/pages/notification.ets | 6 +++--- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 4 ++-- product/pc/statusbar/src/main/ets/pages/index.ets | 4 ++-- .../src/main/ets/workers/PluginDataSourceWorker.js | 4 ++-- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 4 ++-- .../src/main/ets/pages/bannerNotification.ets | 4 ++-- .../dropdownpanel/src/main/ets/pages/control.ets | 4 ++-- .../phone/dropdownpanel/src/main/ets/pages/index.ets | 6 +++--- .../src/main/ets/pages/notification.ets | 6 +++--- .../src/main/ets/workers/PluginDataSourceWorker.js | 4 ++-- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 4 ++-- product/phone/statusbar/src/main/ets/pages/index.ets | 6 +++--- .../src/main/ets/workers/PluginDataSourceWorker.js | 4 ++-- 52 files changed, 109 insertions(+), 113 deletions(-) diff --git a/common/src/main/ets/default/SettingsUtil.ts b/common/src/main/ets/default/SettingsUtil.ts index e6b4515c..21898914 100644 --- a/common/src/main/ets/default/SettingsUtil.ts +++ b/common/src/main/ets/default/SettingsUtil.ts @@ -31,7 +31,7 @@ export class SettingsUtil { try { this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), Constants.URI_VAR); } catch (e) { - Log.showError(TAG, `constructor, acquire helper error: ${e.toString()}`); + Log.showError(TAG, `constructor, acquire helper error: ${JSON.stringify(e)}`); } } @@ -41,7 +41,7 @@ export class SettingsUtil { try { value = settings.getValueSync(this.helper, name, defValue ? defValue : ""); } catch (e) { - Log.showError(TAG, `getValue e: ${e.toString()}`); + Log.showError(TAG, `getValue e: ${JSON.stringify(e)}`); } Log.showDebug(TAG, `getValue, value: ${value}`); return value; @@ -53,7 +53,7 @@ export class SettingsUtil { try { result = settings.setValueSync(this.helper, name, value); } catch (e) { - Log.showError(TAG, `setValue e: ${e.toString()}`); + Log.showError(TAG, `setValue e: ${JSON.stringify(e)}`); } Log.showDebug(TAG, `setValue, result: ${result}`); return result; diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index bd58c48c..9f3f23c7 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -60,13 +60,13 @@ class WindowManager { mWindowInfos: Map = new Map(); async createWindow(context: any, name: WindowType, rect: Rect, loadContent: string): Promise { - Log.showDebug(TAG, `createWindow name: ${name}, rect: ${JSON.stringify(rect)}, url: ${loadContent}`); + Log.showInfo(TAG, `createWindow name: ${name}, rect: ${JSON.stringify(rect)}, url: ${loadContent}`); let winHandle = await Window.create(context, name, SYSTEM_WINDOW_TYPE_MAP[name]); await winHandle.moveTo(rect.left, rect.top); await winHandle.resetSize(rect.width, rect.height); await winHandle.loadContent(loadContent); this.mWindowInfos.set(name, { visibility: false, rect }); - Log.showDebug(TAG, `create window[${name}] success.`); + Log.showInfo(TAG, `create window[${name}] success.`); return winHandle; } @@ -81,7 +81,7 @@ class WindowManager { rect, }) ); - Log.showDebug(TAG, `resize window[${name}] success, rect: ${JSON.stringify(rect)}.`); + Log.showInfo(TAG, `resize window[${name}] success, rect: ${JSON.stringify(rect)}.`); } async showWindow(name: WindowType): Promise { @@ -94,7 +94,7 @@ class WindowManager { isShow: true, }) ); - Log.showDebug(TAG, `show window[${name}] success.`); + Log.showInfo(TAG, `show window[${name}] success.`); } async hideWindow(name: WindowType): Promise { @@ -107,7 +107,7 @@ class WindowManager { isShow: false, }) ); - Log.showDebug(TAG, `hide window[${name}] success.`); + Log.showInfo(TAG, `hide window[${name}] success.`); } getWindowInfo(name: WindowType): WindowInfo | undefined { diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts index 09fd1fd3..5fff2075 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts @@ -117,7 +117,7 @@ export default class PluginDataSourceAdapter { } onMessageError(event: any) { - Log.showDebug(TAG, `mWorker.onmessageerror, event: ${event}`); + Log.showError(TAG, `mWorker.onmessageerror, event: ${event}`); } onExit(code: any) { @@ -125,6 +125,6 @@ export default class PluginDataSourceAdapter { } onError(err: any) { - Log.showDebug(TAG, `mWorker.onerror, err: ${JSON.stringify(err)}`); + Log.showError(TAG, `mWorker.onerror, err: ${JSON.stringify(err)}`); } } diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts index 60407a5c..34c7b4e1 100644 --- a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts +++ b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts @@ -140,7 +140,7 @@ export function registerBundleListener(listener: BundleListener, callback: (hand return; } commonEvent.subscribe(handle, (err, data) => { - Log.showDebug(TAG, `bundle change, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + Log.showInfo(TAG, `bundle change, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); if (err.code != 0) { Log.showError(TAG, `Can't handle bundle change, err: ${JSON.stringify(err)}`); return; diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/template/SimpleToggleBase.ets index dfde3076..d015853f 100644 --- a/common/src/main/ets/template/SimpleToggleBase.ets +++ b/common/src/main/ets/template/SimpleToggleBase.ets @@ -39,11 +39,11 @@ export default struct SimpleToggleBase { @State style: any = StyleConfiguration.getSimpleToggleBaseStyle() aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear, mToggleId: ${this.mToggleId}, mLabel: ${JSON.stringify(this.mLabel)}, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode} `) + Log.showInfo(TAG, `aboutToAppear, mToggleId: ${this.mToggleId}, mLabel: ${JSON.stringify(this.mLabel)}, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode} `) } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear') + Log.showInfo(TAG, 'aboutToDisappear') } build() { diff --git a/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/template/iconComponent.ets index 4dd93259..3e428cc5 100644 --- a/common/src/main/ets/template/iconComponent.ets +++ b/common/src/main/ets/template/iconComponent.ets @@ -34,11 +34,11 @@ struct iconComponent { @State style: any = StyleConfiguration.getIconComponentStyle() aboutToAppear() { - Log.showDebug(TAG,`aboutToAppear, ${this.changeSwitch} ${JSON.stringify(this.iconOff)} ${JSON.stringify(this.iconOn)} , useIconStr: ${this.useIconStr}`) + Log.showInfo(TAG,`aboutToAppear, ${this.changeSwitch} ${JSON.stringify(this.iconOff)} ${JSON.stringify(this.iconOn)} , useIconStr: ${this.useIconStr}`) } aboutToDisappear () { - Log.showDebug(TAG,'aboutToDisappear') + Log.showInfo(TAG,'aboutToDisappear') } build() { diff --git a/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/template/iconTitleBase.ets index 02d0de93..69385c69 100644 --- a/common/src/main/ets/template/iconTitleBase.ets +++ b/common/src/main/ets/template/iconTitleBase.ets @@ -40,11 +40,11 @@ struct iconBaseComponent { @State style: any = StyleConfiguration.getIconTitleBaseStyle() aboutToAppear() { - Log.showDebug(TAG,'aboutToAppear') + Log.showInfo(TAG,'aboutToAppear') } aboutToDisappear () { - Log.showDebug(TAG,'aboutToDisappear') + Log.showInfo(TAG,'aboutToDisappear') } build() { diff --git a/entry/pc/src/main/ets/Application/AbilityStage.ts b/entry/pc/src/main/ets/Application/AbilityStage.ts index ca7ef482..255cde1c 100644 --- a/entry/pc/src/main/ets/Application/AbilityStage.ts +++ b/entry/pc/src/main/ets/Application/AbilityStage.ts @@ -19,6 +19,6 @@ const TAG = "SystemUI_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showDebug(TAG, "onCreate") + Log.showInfo(TAG, "onCreate") } } \ No newline at end of file diff --git a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index fa2f2e6c..d7065518 100644 --- a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -46,7 +46,7 @@ var notificationPanelWant = { class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`) + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`) initSystemUi(this.context); AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) AbilityManager.startAbility(statusBarWant) @@ -57,7 +57,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showDebug(TAG, 'onDestroy') + Log.showInfo(TAG, 'onDestroy') } } diff --git a/entry/phone/src/main/ets/Application/AbilityStage.ts b/entry/phone/src/main/ets/Application/AbilityStage.ts index 3baec6f7..9a59509b 100644 --- a/entry/phone/src/main/ets/Application/AbilityStage.ts +++ b/entry/phone/src/main/ets/Application/AbilityStage.ts @@ -19,6 +19,6 @@ const TAG = "SystemUI_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showDebug(TAG, "onCreate") + Log.showInfo(TAG, "onCreate") } } \ No newline at end of file diff --git a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 29db7cb0..9437dcb6 100644 --- a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -41,7 +41,7 @@ var dropdownPanelWant = { class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`) + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`) initSystemUi(this.context) AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) AbilityManager.startAbility(statusBarWant) @@ -51,7 +51,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showDebug(TAG, 'onDestroy') + Log.showInfo(TAG, 'onDestroy') } } diff --git a/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts b/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts index 0c8497b3..7c1ded02 100644 --- a/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts +++ b/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "NavigationBar_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showDebug(TAG, "onCreate") + Log.showInfo(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 4ab98a0c..c1ddb533 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -23,7 +23,7 @@ const TAG = "NavigationBar_ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, this.context) let configInfo = await NavBarConfiguration.getConfiguration(); @@ -66,7 +66,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showDebug(TAG, 'onDestroy'); + Log.showInfo(TAG, 'onDestroy'); } } diff --git a/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts b/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts index 0766f6ad..ee374125 100644 --- a/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts +++ b/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts @@ -103,21 +103,17 @@ class NavBarConfiguration { if (navbarPosition == Position.TOP_POSITION || navbarPosition == Position.BOTTOM_POSITION) { showNavHorizontal = true; minHeight = parseInt(navShortSideLength); - Log.showDebug(TAG, 'TOP_POSITION = ' + 2); if (statusbarPosition == Position.LEFT_POSITION || statusbarPosition == Position.RIGHT_POSITION) { realWidth = parseInt(maxWidth) - parseInt(statusShortSideLength); } else { realWidth = maxWidth; } - Log.showDebug(TAG, 'TOP_POSITION = ' + 3); realHeight = parseInt(navShortSideLength); - Log.showDebug(TAG, 'TOP_POSITION = ' + 4); if (statusbarPosition == Position.LEFT_POSITION) { xCoordinate = parseInt(statusShortSideLength); } else { xCoordinate = 0; } - Log.showDebug(TAG, 'TOP_POSITION = ' + 5); if (navbarPosition == Position.BOTTOM_POSITION) { yCoordinate = parseInt(maxHeight) - parseInt(navShortSideLength); Log.showDebug(TAG, 'BOTTOM_POSITION = ' + yCoordinate); diff --git a/product/default/navigationBar/src/main/ets/pages/index.ets b/product/default/navigationBar/src/main/ets/pages/index.ets index 99ab46eb..9af0780c 100644 --- a/product/default/navigationBar/src/main/ets/pages/index.ets +++ b/product/default/navigationBar/src/main/ets/pages/index.ets @@ -40,7 +40,7 @@ struct Index { } aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config') AppStorage.SetAndLink("showNavHorizontal", configInfo.showNavHorizontal) mConfigManager.initConfig() @@ -59,7 +59,7 @@ struct Index { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`) NavigationBarViewModel.getInstance().uninstall() } diff --git a/product/default/navigationBar/src/main/ets/pages/keyButton.ets b/product/default/navigationBar/src/main/ets/pages/keyButton.ets index 23a255c7..d76b18de 100644 --- a/product/default/navigationBar/src/main/ets/pages/keyButton.ets +++ b/product/default/navigationBar/src/main/ets/pages/keyButton.ets @@ -34,11 +34,11 @@ export default struct keyButton { @State style: any = StyleConfiguration.getKeyButtonStyle() aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) } aboutToDisappear(){ - Log.showDebug(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`) } build() { diff --git a/product/default/navigationBar/src/main/ets/pages/oneLayout.ets b/product/default/navigationBar/src/main/ets/pages/oneLayout.ets index 725685fa..8bdf6d7c 100644 --- a/product/default/navigationBar/src/main/ets/pages/oneLayout.ets +++ b/product/default/navigationBar/src/main/ets/pages/oneLayout.ets @@ -29,11 +29,11 @@ export default struct oneLayout { @StorageLink('minNavHeight') minNavHeight:number = 32 aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) } aboutToDisappear(){ - Log.showDebug(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`) } build() { diff --git a/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts b/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts index 81e2110f..788ef5b3 100644 --- a/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts +++ b/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "NotificationManagement_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showDebug(TAG, "onCreate") + Log.showInfo(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts index 20e1f533..cab2e4d7 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts @@ -21,7 +21,7 @@ const TAG = "NotificationManagement-MainAbility" export default class MainAbility extends Ability { onCreate(want, launchParam) { - Log.showDebug(TAG, "MainAbility onCreate") + Log.showInfo(TAG, "MainAbility onCreate") globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = want; display.getDefaultDisplay().then((dis) => { AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_APP_LIST, "dis", { @@ -32,24 +32,24 @@ export default class MainAbility extends Ability { } onDestroy() { - Log.showDebug(TAG, "MainAbility onDestroy") + Log.showInfo(TAG, "MainAbility onDestroy") } onWindowStageCreate(windowStage) { - Log.showDebug(TAG, "MainAbility onWindowStageCreate") + Log.showInfo(TAG, "MainAbility onWindowStageCreate") AbilityManager.setContext(AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT, this.context) windowStage.setUIContent(this.context, "pages/notificationManagenment", null) } onWindowStageDestroy() { - Log.showDebug(TAG, "MainAbility onWindowStageDestroy") + Log.showInfo(TAG, "MainAbility onWindowStageDestroy") } onForeground() { - Log.showDebug(TAG, "MainAbility onForeground") + Log.showInfo(TAG, "MainAbility onForeground") } onBackground() { - Log.showDebug(TAG, "MainAbility onBackground") + Log.showInfo(TAG, "MainAbility onBackground") } }; diff --git a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets index 24234850..80d2b369 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets @@ -91,12 +91,12 @@ export default struct BatchSetEnable { } aboutToAppear(): void{ - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit(); } onBackPress() { - Log.showDebug(TAG, `onBackPress`) + Log.showInfo(TAG, `onBackPress`) Router.back(); } diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index e6c154de..ef9156e2 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -260,14 +260,14 @@ export default struct NoDisturb { aboutToAppear(): void{ - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() this.mRefreshCnt++; } onBackPress() { - Log.showDebug(TAG, `onBackPress`) + Log.showInfo(TAG, `onBackPress`) Router.back(); } } diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets index 704e873c..625fba8a 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets @@ -84,19 +84,19 @@ export default struct notificationManagenment { } aboutToAppear(): void{ - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) } aboutToDisappear(): void{ - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) } onPageShow(): void{ - Log.showDebug(TAG, `onPageShow`) + Log.showInfo(TAG, `onPageShow`) this.refreshRequest++; } onBackPress() { - Log.showDebug(TAG, `onBackPress`) + Log.showInfo(TAG, `onBackPress`) } } diff --git a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets index 6afdc949..4cbc80c4 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets @@ -95,20 +95,20 @@ export default struct SetEnable { } aboutToAppear(): void{ - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) appInfo = Router.getParams(); appInfo.slotSettingUrl = 'pages/slotSetting' Notification.subscribeEnableChanged(); - Log.showDebug(TAG, `aboutToAppear end`) + Log.showInfo(TAG, `aboutToAppear end`) } aboutToDisappear(): void{ - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) Notification.unsubscribeEnableChanged(); } onBackPress() { - Log.showDebug(TAG, `onBackPress`) + Log.showInfo(TAG, `onBackPress`) Router.back(); } diff --git a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets index 0ed49795..aa5f741b 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets @@ -153,14 +153,14 @@ export default struct SlotSetting { } aboutToAppear(): void{ - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) params = Router.getParams(); this.appInfo = params.appInfo; this.slotInfo = params.slotInfo } onBackPress() { - Log.showDebug(TAG, `onBackPress`) + Log.showInfo(TAG, `onBackPress`) Router.back(); } diff --git a/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts b/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts index cd6d7e5b..dde25d2f 100644 --- a/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts +++ b/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts @@ -20,6 +20,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "volume_AbilityStage" export default class MainAbilityStage extends AbilityStage { async onCreate() { - Log.showDebug(TAG, "onCreate") + Log.showInfo(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 0532ce4c..34c537f1 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -24,7 +24,7 @@ const TAG = "VolumePanel_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showDebug(TAG, "onCreate, want:" + want.abilityName); + Log.showInfo(TAG, "onCreate, want:" + want.abilityName); AbilityManager.setContext(AbilityManager.ABILITY_NAME_VOLUME_PANEL, this.context); display.getDefaultDisplay().then((dis) => { let volumeRect = { @@ -48,7 +48,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showDebug(TAG, "onDestroy"); + Log.showInfo(TAG, "onDestroy"); } } diff --git a/product/default/volumepanel/src/main/ets/pages/index.ets b/product/default/volumepanel/src/main/ets/pages/index.ets index cb9bb8b0..15c57f71 100644 --- a/product/default/volumepanel/src/main/ets/pages/index.ets +++ b/product/default/volumepanel/src/main/ets/pages/index.ets @@ -28,7 +28,7 @@ const TAG = 'VolumePanel-Index' @Component struct Index { aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis') let volumeRect; if (configInfo.width > configInfo.height) { // Pad、PC Mode @@ -62,7 +62,7 @@ struct Index { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`) } build() { diff --git a/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts b/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts index 468e3672..a32f8d75 100644 --- a/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "ControlPanel_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showDebug(TAG, "onCreate") + Log.showInfo(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 4ba04b5e..d653bebf 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -25,7 +25,7 @@ const TAG = "ControlPanel_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_CONTROL_PANEL, this.context); let dis = await display.getDefaultDisplay(); @@ -48,7 +48,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showDebug(TAG, "onDestroy"); + Log.showInfo(TAG, "onDestroy"); } } diff --git a/product/pc/controlpanel/src/main/ets/pages/control.ets b/product/pc/controlpanel/src/main/ets/pages/control.ets index c9048914..3418cfbc 100644 --- a/product/pc/controlpanel/src/main/ets/pages/control.ets +++ b/product/pc/controlpanel/src/main/ets/pages/control.ets @@ -24,11 +24,11 @@ export default struct Control { private modeChangeCallback: Function aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`) } build() { diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index 9fda6b4c..348a61f2 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -69,7 +69,7 @@ struct Index { mShowAnimReady: boolean = false; aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear, start`) + Log.showInfo(TAG, `aboutToAppear, start`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) @@ -94,7 +94,7 @@ struct Index { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) this.mClearCallbacks.forEach((unsubscribe) => unsubscribe()); this.mClearCallbacks.length = 0; } diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index 6f468ba6..6445873f 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -75,10 +75,10 @@ parentPort.onclose = function () { }; parentPort.onmessageerror = function () { - Log.showDebug(TAG, `onmessageerror`); + Log.showError(TAG, `onmessageerror`); }; parentPort.onerror = function (data) { - Log.showDebug(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + Log.showError(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts b/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts index 175c401b..38c5cf94 100644 --- a/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "NotificationPanel_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showDebug(TAG, "onCreate") + Log.showInfo(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index d23e52c4..44ba4ab0 100644 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -26,7 +26,7 @@ const TAG = "NotificationPanel_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, this.context); globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT] = want; @@ -64,7 +64,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showDebug(TAG, "onDestroy"); + Log.showInfo(TAG, "onDestroy"); } } diff --git a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets index 401c6fac..f2313b18 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets @@ -38,7 +38,7 @@ struct Index { mDefaultBannerRect: any; aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) setAppBgColor('#00000000') this.mClearCallbacks = [] this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeShow', () => this.onBannerNoticeShow())) @@ -47,7 +47,7 @@ struct Index { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`) this.mClearCallbacks.forEach((mClearCallback: Function) => { mClearCallback() mClearCallback = undefined diff --git a/product/pc/notificationpanel/src/main/ets/pages/index.ets b/product/pc/notificationpanel/src/main/ets/pages/index.ets index 72b9e133..692c4fa4 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/index.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/index.ets @@ -58,22 +58,22 @@ struct Index { mShowAnimReady: boolean = false; aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear, start`) + Log.showInfo(TAG, `aboutToAppear, start`) setAppBgColor('#00000000') this.initWindowPolicy(); } onPageShow() { - Log.showDebug(TAG, `onPageShow`) + Log.showInfo(TAG, `onPageShow`) this.startShowAnim(); } onPageHide() { - Log.showDebug(TAG, `onPageHide`) + Log.showInfo(TAG, `onPageHide`) } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) this.mClearCallbacks.forEach((unsubscribe) => unsubscribe()); this.mClearCallbacks.length = 0; } diff --git a/product/pc/notificationpanel/src/main/ets/pages/notification.ets b/product/pc/notificationpanel/src/main/ets/pages/notification.ets index ec89afc6..77bec309 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/notification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/notification.ets @@ -34,7 +34,7 @@ export default struct Notification { @StorageLink('notificationList') notificationList: any[] = [] aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) } build() { @@ -61,11 +61,11 @@ export default struct Notification { @Component struct CenterTitle { aboutToAppear() { - Log.showDebug(TAG, `CenterTitle, aboutToAppear`) + Log.showInfo(TAG, `CenterTitle, aboutToAppear`) } aboutToDisappear() { - Log.showDebug(TAG, `CenterTitle, aboutToDisappear`) + Log.showInfo(TAG, `CenterTitle, aboutToDisappear`) } build() { diff --git a/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts b/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts index 1fd2be01..4d550466 100644 --- a/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "StatusBar_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showDebug(TAG, "onCreate") + Log.showInfo(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index afd337ad..c39fab63 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -23,7 +23,7 @@ const TAG = "StatusBar_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context); let configInfo = await StatusBarConfiguration.getConfiguration(); @@ -55,7 +55,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showDebug(TAG, "onDestroy"); + Log.showInfo(TAG, "onDestroy"); } } diff --git a/product/pc/statusbar/src/main/ets/pages/index.ets b/product/pc/statusbar/src/main/ets/pages/index.ets index c0382536..4c581530 100644 --- a/product/pc/statusbar/src/main/ets/pages/index.ets +++ b/product/pc/statusbar/src/main/ets/pages/index.ets @@ -38,7 +38,7 @@ struct Index { } aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear, start`); + Log.showInfo(TAG, `aboutToAppear, start`); let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config') let statusBarData: StatusBarData = new StatusBarData(); @@ -72,7 +72,7 @@ struct Index { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`); + Log.showInfo(TAG, `aboutToDisappear`); } build() { diff --git a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 4b409798..3eae11f8 100644 --- a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -75,10 +75,10 @@ parentPort.onclose = function () { }; parentPort.onmessageerror = function () { - Log.showDebug(TAG, `onmessageerror`); + Log.showError(TAG, `onmessageerror`); }; parentPort.onerror = function (data) { - Log.showDebug(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + Log.showError(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts b/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts index 2325b1e3..20bb96f4 100644 --- a/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts +++ b/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/log' const TAG = "DropdownPanel_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showDebug(TAG, "onCreate") + Log.showInfo(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 8da7203f..4f3189cc 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -24,7 +24,7 @@ const TAG = "DropdownPanel_ServiceExtAbility"; class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, this.context); globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT] = want; @@ -57,7 +57,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showDebug(TAG, "onDestroy"); + Log.showInfo(TAG, "onDestroy"); } } diff --git a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets index 6bbc8bb1..ed4e4cfc 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets @@ -38,7 +38,7 @@ struct Index { mDefaultBannerRect: any; aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) setAppBgColor('#00000000') this.mClearCallbacks = [] this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeShow', () => this.onBannerNoticeShow())) @@ -47,7 +47,7 @@ struct Index { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`) this.mClearCallbacks.forEach((mClearCallback: Function) => { mClearCallback() mClearCallback = undefined diff --git a/product/phone/dropdownpanel/src/main/ets/pages/control.ets b/product/phone/dropdownpanel/src/main/ets/pages/control.ets index 3c6f6992..243f0278 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/control.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/control.ets @@ -37,11 +37,11 @@ export default struct Control { @State style: any = StyleConfiguration.getControlStyle() aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`) } build() { diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index 9e7acf56..5bbe7874 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -83,7 +83,7 @@ struct Index { } aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear, start`) + Log.showInfo(TAG, `aboutToAppear, start`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) @@ -134,7 +134,7 @@ struct Index { } onPageShow() { - Log.showDebug(TAG, `onPageShow, start`) + Log.showInfo(TAG, `onPageShow, start`) if (!this.showComponentName) { return } @@ -148,7 +148,7 @@ struct Index { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) this.mClearCallbacks.forEach((mClearCallback: Function) => { mClearCallback() mClearCallback = undefined diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index b5c9b525..0f056b6a 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -48,7 +48,7 @@ export default struct Notification { @StorageLink('notificationList') notificationList: any[] = [] aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) } build() { @@ -158,7 +158,7 @@ struct CenterTitle { unSubscriber?: unsubscribe; aboutToAppear() { - Log.showDebug(TAG, `CenterTitle, aboutToAppear`) + Log.showInfo(TAG, `CenterTitle, aboutToAppear`) this.unSubscriber = EventManager.subscribe(TIME_CHANGE_EVENT, (args: TimeEventArgs) => { this.updateTimeString(args.date) }); @@ -166,7 +166,7 @@ struct CenterTitle { } aboutToDisappear() { - Log.showDebug(TAG, 'CenterTitle aboutToDisappear'); + Log.showInfo(TAG, 'CenterTitle aboutToDisappear'); this.unSubscriber && this.unSubscriber(); this.unSubscriber = undefined; } diff --git a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js index 4b409798..3eae11f8 100644 --- a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -75,10 +75,10 @@ parentPort.onclose = function () { }; parentPort.onmessageerror = function () { - Log.showDebug(TAG, `onmessageerror`); + Log.showError(TAG, `onmessageerror`); }; parentPort.onerror = function (data) { - Log.showDebug(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + Log.showError(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts b/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts index ee06c984..9164e500 100644 --- a/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts +++ b/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts @@ -18,6 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' const TAG = "StatusBar_AbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showDebug(TAG, "onCreate") + Log.showInfo(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 62674ecd..b501440b 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -23,7 +23,7 @@ const TAG = "StatusBar_ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { async onCreate(want) { - Log.showDebug(TAG, `onCreate, want: ${JSON.stringify(want)}`); + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context) let configInfo = await StatusBarConfiguration.getConfiguration(); @@ -42,7 +42,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showDebug(TAG, 'onDestroy'); + Log.showInfo(TAG, 'onDestroy'); } } diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index 4d0f3938..9cdc196e 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -50,7 +50,7 @@ struct Index { } aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear, start`); + Log.showInfo(TAG, `aboutToAppear, start`); let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config') let statusBarData: StatusBarData = new StatusBarData(); @@ -83,11 +83,11 @@ struct Index { let signalObserved = AppStorage.SetAndLink("signalObserved", false); signalObserved.set(false); - Log.showDebug(TAG, `aboutToAppear, end`); + Log.showInfo(TAG, `aboutToAppear, end`); } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`); + Log.showInfo(TAG, `aboutToDisappear`); this.mClearCallback && this.mClearCallback() this.mClearCallback = undefined } diff --git a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 4b409798..3eae11f8 100644 --- a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -75,10 +75,10 @@ parentPort.onclose = function () { }; parentPort.onmessageerror = function () { - Log.showDebug(TAG, `onmessageerror`); + Log.showError(TAG, `onmessageerror`); }; parentPort.onerror = function (data) { - Log.showDebug(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + Log.showError(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file -- Gitee From 3fb91ab2948cb8b039374358a944350755e059ae Mon Sep 17 00:00:00 2001 From: panshunli Date: Tue, 24 May 2022 16:09:20 +0800 Subject: [PATCH 112/373] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83UX?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: panshunli --- .../noticeItem/view/item/confirmDialog.ets | 100 ++++++------ .../noticeItem/view/item/settingDialog.ets | 148 ++++++++++-------- .../main/resources/base/element/float.json | 4 + .../main/resources/phone/element/float.json | 6 +- 4 files changed, 143 insertions(+), 115 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets index 6803822f..e68de8df 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -15,6 +15,9 @@ import Constants from '../../common/constants'; import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import deviceInfo from '@ohos.deviceInfo'; + +const deviceTypeInfo = deviceInfo.deviceType; const TAG = 'NoticeItem-Confirm'; @@ -29,55 +32,62 @@ export default struct ConfirmDialog { public action: () => void build() { - Column() { - Row() { - Text(this.title) - .fontSize($r('app.float.confirm_title_fontsize')) - .fontWeight(FontWeight.Bold) - }.width($r('app.float.confirm_dialog_row_width')) - .margin({ top: $r('app.float.title_font_margin_t') }) - - Row() { - Text($r('app.string.confirm_message', this.bundleName)) - .fontSize($r('app.float.confirm_cont_fontsize')) - }.width($r('app.float.confirm_dialog_row_width')) - .margin({ top: $r('app.float.message_font_margin_t') }) + Column() { + Row() { + Text(this.title) + .fontSize($r('app.float.confirm_title_fontsize')) + .fontWeight(FontWeight.Bold) + }.width($r('app.float.confirm_dialog_row_width')) + .margin({ top: $r('app.float.title_font_margin_t') }) - Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}) { - Column() { - Text($r('app.string.cancel')) + Row() { + Text($r('app.string.confirm_message', this.bundleName)) .fontSize($r('app.float.confirm_cont_fontsize')) - .fontColor($r("app.color.button_text_color")) - }.onClick(() => { - this.controller.close(); - }) - .alignItems(HorizontalAlign.Center) - .width($r('app.float.confirm_dialog_button_width')) + }.width($r('app.float.confirm_dialog_row_width')) + .margin({ top: $r('app.float.message_font_margin_t') }) - Divider() - .vertical(true) - .color($r('app.color.confirm_divider_color')) - .strokeWidth(1) - .height($r('app.float.confirm_divider_height')) - Column() { - Text($r('app.string.close')) - .fontSize($r('app.float.confirm_cont_fontsize')) - .fontColor($r("app.color.button_text_color")) - }.onClick(() => { - Log.showInfo(TAG, `confirm button of TimeDialog on click`) - this.controller.close(); - this.action(); - }) - .alignItems(HorizontalAlign.Center) - .width($r('app.float.confirm_dialog_button_width')) + Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Column() { + Text($r('app.string.cancel')) + .fontSize($r('app.float.confirm_cont_fontsize')) + .fontColor($r("app.color.button_text_color")) + }.onClick(() => { + this.controller.close(); + }) + .alignItems(HorizontalAlign.Center) + .width($r('app.float.confirm_dialog_button_width')) + + Divider() + .vertical(true) + .color($r('app.color.confirm_divider_color')) + .strokeWidth(1) + .height($r('app.float.confirm_divider_height')) + Column() { + Text($r('app.string.close')) + .fontSize($r('app.float.confirm_cont_fontsize')) + .fontColor($r("app.color.button_text_color")) + }.onClick(() => { + Log.showInfo(TAG, `confirm button of TimeDialog on click`) + this.controller.close(); + this.action(); + }) + .alignItems(HorizontalAlign.Center) + .width($r('app.float.confirm_dialog_button_width')) + } + .width($r('app.float.confirm_dialog_width')) + .margin({ top: $r('app.float.confirm_button_margin_t') }) } - .width($r('app.float.confirm_dialog_width')) - .margin({ top: $r('app.float.confirm_button_margin_t') }) - }.height($r('app.float.confirm_dialog_height')) - .width($r('app.float.confirm_dialog_width')) - .backgroundColor('#FFFFFF') - .border({ width: $r('app.float.setting_border_width'), color: Color.White, - radius: $r('app.float.notification_border_radius') }) + .height($r('app.float.confirm_dialog_height')) + .width(deviceTypeInfo === 'phone' ? '100%' : $r('app.float.confirm_dialog_width')) + .backgroundColor('#FFFFFF') + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.notification_border_radius') }) + } + .margin({ + left: $r("app.float.confirm_dialog_margin"), + right: $r("app.float.confirm_dialog_margin") + }) + } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets index cad5ba6b..a5f0eb8b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -13,12 +13,15 @@ * limitations under the License. */ -import Constants, {NotificationItemData} from '../../common/constants'; +import Constants, { NotificationItemData } from '../../common/constants'; import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; import EventManager from "../../../../../../../../../../common/src/main/ets/default/event/EventManager" -import {obtainStartAbility} from "../../../../../../../../../../common/src/main/ets/default/event/EventUtil" +import { obtainStartAbility } from "../../../../../../../../../../common/src/main/ets/default/event/EventUtil" import Notification from '@ohos.notification'; +import deviceInfo from '@ohos.deviceInfo'; + +const deviceTypeInfo = deviceInfo.deviceType; const TAG = 'NoticeItem-Setting'; @@ -32,80 +35,87 @@ export default struct SettingDialog { public action: () => void build() { - Column({ space: 4 }) { - Row({ space: 4 }) { - if (!CheckEmptyUtils.isEmpty(this.itemData.smallIcon)) { - Image(this.itemData.smallIcon) - .objectFit(ImageFit.Contain) - .width($r('app.float.title_image_width')) - .height($r('app.float.title_image_height')) + Column() { + Column({ space: 4 }) { + Row({ space: 4 }) { + if (!CheckEmptyUtils.isEmpty(this.itemData.smallIcon)) { + Image(this.itemData.smallIcon) + .objectFit(ImageFit.Contain) + .width($r('app.float.title_image_width')) + .height($r('app.float.title_image_height')) + } + Text(this.itemData.appName) + .fontSize($r('app.float.setting_title_fontsize')) + .fontWeight(500) + }.width($r('app.float.setting_dialog_row_width')) + .margin({ top: $r('app.float.notification_appname_margin_top') }) + .height($r('app.float.title_font_height')) + + Row() { + Column() { + Text($r('app.string.closeNotification')) + .fontSize($r('app.float.setting_cont_fontsize')) + .fontColor($r('app.color.dialog_font_color')) + .height($r('app.float.setting_dialog_row_height')) + }.alignItems(HorizontalAlign.Center) + .width(Constants.SETTING_CONTENT_WITH) } - Text(this.itemData.appName) - .fontSize($r('app.float.setting_title_fontsize')) - .fontWeight(500) - }.width($r('app.float.setting_dialog_row_width')) - .margin({ top: $r('app.float.notification_appname_margin_top') }) - .height($r('app.float.title_font_height')) + .width($r('app.float.setting_dialog_row_width')) + .alignItems(VerticalAlign.Center) + .align(Alignment.Center) + .margin({ top: $r('app.float.close_notification_margin_top') }) + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.setting_border_radius') }) + .backgroundColor($r('app.color.dialog_font_back_color')) + .onClick(this.closeNotification.bind(this)) - Row() { - Column() { - Text($r('app.string.closeNotification')) - .fontSize($r('app.float.setting_cont_fontsize')) - .fontColor($r('app.color.dialog_font_color')) - .height($r('app.float.setting_dialog_row_height')) - }.alignItems(HorizontalAlign.Center) - .width(Constants.SETTING_CONTENT_WITH) - } - .width($r('app.float.setting_dialog_row_width')) - .alignItems(VerticalAlign.Center) - .align(Alignment.Center) - .margin({ top: $r('app.float.close_notification_margin_top') }) - .border({ width: $r('app.float.setting_border_width'), color: Color.White, - radius: $r('app.float.setting_border_radius') }) - .backgroundColor($r('app.color.dialog_font_back_color')) - .onClick(this.closeNotification.bind(this)) + Row() { + Column() { + Text($r('app.string.moreSettings')) + .fontSize($r('app.float.setting_cont_fontsize')) + .fontColor($r('app.color.button_text_color')) + .height($r('app.float.setting_dialog_row_height')) + }.alignItems(HorizontalAlign.Center) + .width(Constants.SETTING_CONTENT_WITH) + .align(Alignment.Center) + } + .width($r('app.float.setting_dialog_row_width')) + .alignItems(VerticalAlign.Center) + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.setting_border_radius') }) + .backgroundColor($r('app.color.action_button_click_color')) + .onClick(this.openAbility.bind(this)) - Row() { - Column() { - Text($r('app.string.moreSettings')) - .fontSize($r('app.float.setting_cont_fontsize')) - .fontColor($r('app.color.button_text_color')) - .height($r('app.float.setting_dialog_row_height')) - }.alignItems(HorizontalAlign.Center) - .width(Constants.SETTING_CONTENT_WITH) + Row() { + Column() { + Text($r('app.string.cancel')) + .maxLines(Constants.DEFAULT_MAX_LINES) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontSize($r('app.float.setting_cont_fontsize')) + .fontColor($r('app.color.button_text_color')) + }.alignItems(HorizontalAlign.Center) + .width(Constants.SETTING_CONTENT_WITH) + } + .width($r('app.float.setting_dialog_row_width')) + .margin({ top: $r('app.float.notification_cancle_margin_top') }) + .alignItems(VerticalAlign.Center) .align(Alignment.Center) + .border({ width: $r('app.float.setting_border_width'), color: Color.White, + radius: $r('app.float.setting_border_radius') }) + .backgroundColor($r('app.color.dialog_font_color')) + .onClick(this.closeAbility.bind(this)) } - .width($r('app.float.setting_dialog_row_width')) - .alignItems(VerticalAlign.Center) - .border({ width: $r('app.float.setting_border_width'), color: Color.White, - radius: $r('app.float.setting_border_radius') }) - .backgroundColor($r('app.color.action_button_click_color')) - .onClick(this.openAbility.bind(this)) - - Row() { - Column() { - Text($r('app.string.cancel')) - .maxLines(Constants.DEFAULT_MAX_LINES) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - .fontSize($r('app.float.setting_cont_fontsize')) - .fontColor($r('app.color.button_text_color')) - }.alignItems(HorizontalAlign.Center) - .width(Constants.SETTING_CONTENT_WITH) - } - .width($r('app.float.setting_dialog_row_width')) - .margin({ top: $r('app.float.notification_cancle_margin_top') }) - .alignItems(VerticalAlign.Center) - .align(Alignment.Center) + .height($r('app.float.setting_dialog_height')) + .width(deviceTypeInfo === 'phone' ? '100%' : $r('app.float.setting_dialog_width')) + .backgroundColor('#FFFFFF') + .margin({ left: 20, right: 20 }) .border({ width: $r('app.float.setting_border_width'), color: Color.White, - radius: $r('app.float.setting_border_radius') }) - .backgroundColor($r('app.color.dialog_font_color')) - .onClick(this.closeAbility.bind(this)) + radius: $r('app.float.notification_border_radius') }) } - .height($r('app.float.setting_dialog_height')) - .width($r('app.float.setting_dialog_width')) - .backgroundColor('#FFFFFF') - .border({ width: $r('app.float.setting_border_width'), color: Color.White, - radius: $r('app.float.notification_border_radius') }) + .margin({ + left: $r("app.float.confirm_dialog_margin"), + right: $r("app.float.confirm_dialog_margin") + }) } closeNotification() { diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index 21d57da6..06db5cb7 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -164,6 +164,10 @@ "name": "confirm_button_height", "value": "60" }, + { + "name": "confirm_dialog_margin", + "value": "0" + }, { "name": "confirm_button_margin_t", "value": "50vp" diff --git a/features/noticeitem/src/main/resources/phone/element/float.json b/features/noticeitem/src/main/resources/phone/element/float.json index 1c1b1d6a..ebf3f0f5 100644 --- a/features/noticeitem/src/main/resources/phone/element/float.json +++ b/features/noticeitem/src/main/resources/phone/element/float.json @@ -60,6 +60,10 @@ "name": "confirm_dialog_width", "value": "336vp" }, + { + "name": "confirm_dialog_margin", + "value": "12vp" + }, { "name": "confirm_dialog_row_width", "value": "288vp" @@ -110,7 +114,7 @@ }, { "name": "notice_image_boderRadius", - "value": "12" + "value": "12vp" }, { "name": "notice_divider", -- Gitee From 4a512a7622bdc1525e28b82ce87deecacd82729f Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Wed, 25 May 2022 09:03:49 +0800 Subject: [PATCH 113/373] log rectification Signed-off-by: xuchangzhou --- .../src/main/ets/com/ohos/model/AutoRotateService.ts | 2 +- .../src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts | 2 +- .../batterycomponent/src/main/ets/default/batteryModel.ts | 4 ++-- .../src/main/ets/default/viewmodel/BatteryVM.ts | 2 +- .../src/main/ets/com/ohos/model/BluetoothService.ts | 2 +- .../src/main/ets/com/ohos/viewmodel/BluetoothVM.ts | 4 ++-- .../src/main/ets/default/viewmodel/CapsuleViewModel.ts | 2 +- .../clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts | 2 +- .../src/main/ets/com/ohos/model/ControlCenterService.ts | 4 ++-- .../main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets | 2 +- .../src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts | 2 +- .../src/main/ets/com/ohos/viewmodel/LocationVM.ts | 2 +- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts index 111640b1..abd26635 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -65,7 +65,7 @@ export class AutoRotateService { } onOrientationChange(value: number): void{ - Log.showInfo(TAG, `onOrientationChange, value: ${value}`); + Log.showDebug(TAG, `onOrientationChange, value: ${value}`); this.getOrientation(); } diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts index 98e8c3d1..781b0efc 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts @@ -26,7 +26,7 @@ export class AutoRotateVM { }; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); this.mAutoRotateData = AppStorage.SetAndLink(TAG + '_AutoRotateData', this.mAutoRotateData).get(); AutoRotateService.registerListener(this); AutoRotateService.startService(); diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts index 132c5bcb..5775fc44 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -58,7 +58,7 @@ export class BatteryModel { () => this.updateBatteryStatus(), (isSubscribe: boolean) => isSubscribe && this.updateBatteryStatus() ); - Log.showInfo(TAG, "initBatteryModel"); + Log.showDebug(TAG, "initBatteryModel"); this.mBatterySoc = AppStorage.SetAndLink("batterySoc", 0); this.mBatteryCharging = AppStorage.SetAndLink("batteryCharging", false); this.mManager.subscriberCommonEvent(); @@ -66,7 +66,7 @@ export class BatteryModel { } unInitBatteryModel() { - Log.showInfo(TAG, "unInitBatteryModel"); + Log.showDebug(TAG, "unInitBatteryModel"); this.mManager?.release(); this.mManager = undefined; } diff --git a/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts b/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts index afafaada..ff87c012 100644 --- a/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts +++ b/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts @@ -24,7 +24,7 @@ export class BatteryVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.BATTERY); constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } getTintContentInfo(): TintContentInfo { diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts index 56d1e0a1..8a70727e 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -31,7 +31,7 @@ export class BluetoothService { mIsBluetoothOpen: boolean = false; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } startService() { diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts index b29b3463..72ba2f2c 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts @@ -30,14 +30,14 @@ export class BluetoothVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.BLUETOOTH); constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } initViewModel() { if (this.mIsStart) { return; } - Log.showInfo(TAG, `initViewModel `) + Log.showDebug(TAG, `initViewModel `) this.mIsStart = true; this.mBluetoothOpenStatus = AppStorage.SetAndLink(BluetoothOpenStatusKey, false); BluetoothService.startService(); diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts index b6df1f9f..954e9819 100644 --- a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts +++ b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts @@ -124,7 +124,7 @@ export default class CapsuleViewModel { this.mIsBackground = false; } Log.showDebug(TAG, `onClickEvent `); - Log.showInfo(TAG, `startAbility`); + Log.showDebug(TAG, `startAbility`); AbilityManager.startAbility({ bundleName: this.mWantBundleName, abilityName: this.mWantAbilityName diff --git a/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts b/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts index 63ccd124..963fb381 100644 --- a/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts +++ b/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts @@ -24,7 +24,7 @@ export class ClockVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.CLOCK); constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } getTintContentInfo(): TintContentInfo { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index 41112a1b..0f7808b2 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -64,7 +64,7 @@ export class ControlCenterService { mSimpleToggleLayout: string[]; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } startService(config): void { @@ -173,7 +173,7 @@ export class ControlCenterService { } initFinish() { - Log.showInfo(TAG, `initFinish`); + Log.showDebug(TAG, `initFinish`); SwitchUserManager.getInstance() .getCurrentUserInfo() .then((userInfo) => { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets index f13549a9..ad84be00 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleLoadComponent.ets @@ -27,7 +27,7 @@ export default struct ComplexToggleLoadComponent { @Prop keyId: string; aboutToAppear() { - LLog.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); } aboutToDisappear() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts index 59ca1c65..dd4db4c7 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts @@ -30,7 +30,7 @@ export class ControlCenterVM { mSimpleToggleLayout: any; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); this.mComplexToggleLayout = AppStorage.SetAndLink(ControlCenterComplexToggleLayoutKey, []); this.mSimpleToggleLayout = AppStorage.SetAndLink(ControlCenterSimpleToggleLayoutKey, []); ControlCenterService.registerListener(this); diff --git a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts index cc1902f3..9c8fce6e 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts @@ -30,7 +30,7 @@ export class LocationVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.LOCATION); constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } initViewModel() { -- Gitee From 685b39e62f40d0a9dec38b7fea231555a94269e9 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Wed, 25 May 2022 09:25:58 +0800 Subject: [PATCH 114/373] log rectification Signed-off-by: xuchangzhou --- .../src/main/ets/com/ohos/model/BluetoothService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts index 8a70727e..1e361276 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -73,9 +73,9 @@ export class BluetoothService { } enableBluetooth(): boolean{ - Log.showInfo(TAG, `enableBluetooth`) + Log.showInfo(TAG, `enableBluetooth`); let result = bluetooth.enableBluetooth(); - Log.showInfo(TAG, `enableBluetooth, result: ${result}`) + Log.showInfo(TAG, `enableBluetooth, result: ${result}`); return result; } -- Gitee From fa33ee7cc29ea65b6305d79ee816a0371908d120 Mon Sep 17 00:00:00 2001 From: YangPeng Date: Wed, 25 May 2022 10:26:18 +0800 Subject: [PATCH 115/373] change some log Signed-off-by: yangpeng85 --- .../src/main/ets/com/ohos/model/accountsModel.ts | 2 +- .../src/main/ets/com/ohos/model/screenLockModel.ts | 1 - .../src/main/ets/com/ohos/model/screenLockService.ts | 10 +++------- .../src/main/ets/com/ohos/view/component/accounts.ets | 4 ++-- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../phone/src/main/ets/vm/slideScreenLockViewModel.ts | 2 +- 6 files changed, 8 insertions(+), 13 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index e1b9b006..30056215 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -116,7 +116,7 @@ export default class AccountsModel { let accountMap = new Map(); list.sort(this.sortAccount.bind(this)); for (const user of list) { - Log.showDebug(TAG, "start get user" + JSON.stringify(user)) + Log.showDebug(TAG, `start get user, localId=${user.localId}, localName=${user.localName}`); if (user.isActived) { mCurrentUserId = user.localId } diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index 0ca48e59..dc59cc15 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -52,7 +52,6 @@ export default class ScreenLockModel { sendScreenLockEvent(typeName: string, typeNo: number, callback) { Log.showInfo(TAG, `sendScreenLockEvent: typeName ${typeName} typeNo ${typeNo} `); ScreenLockMar.sendScreenLockEvent(typeName, typeNo, (err, data) => { - Log.showDebug(TAG, `sendScreenLockEvent:callback err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); callback(err, data); }) } diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index aba08045..99305c87 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -74,7 +74,7 @@ export class ScreenLockService { screenLockModel: ScreenLockModel = new ScreenLockModel() init() { - Log.showInfo(TAG, 'screen lock service init'); + Log.showDebug(TAG, 'init'); this.accountModel.modelInit(); this.monitorEvents(); this.accountModel.updateAllUsers() @@ -148,7 +148,6 @@ export class ScreenLockService { Log.showInfo(TAG, `checkPinAuthProperty:AUTH_SUB_TYPE:${properties.authSubType}`); switch (properties.authSubType) { case AuthSubType.PIN_SIX: - Log.showDebug(TAG, "AuthSubType.PIN_SIX") AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Locking); mRouterPath = URI_DIGITALPASSWORD; this.checkFaceAuthProperty(() => { @@ -156,7 +155,6 @@ export class ScreenLockService { }) break; case AuthSubType.PIN_MIXED: - Log.showDebug(TAG, "AuthSubType.PIN_MIXED") AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Locking); mRouterPath = URI_MIXEDPASSWORD; this.checkFaceAuthProperty(() => { @@ -164,7 +162,6 @@ export class ScreenLockService { }) break; case AuthSubType.PIN_NUMBER: - Log.showDebug(TAG, "AuthSubType.PIN_NUMBER") AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Locking); mRouterPath = URI_CUSTOMPASSWORD; this.checkFaceAuthProperty(() => { @@ -172,7 +169,6 @@ export class ScreenLockService { }) break; default: - Log.showDebug(TAG, "lockStatus: unlocked") AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Unlock); mWillRecognizeFace = false } @@ -231,7 +227,7 @@ export class ScreenLockService { notifyScreenResult(result: UnlockResult) { Log.showInfo(TAG, `notifyScreenResult`); this.screenLockModel.sendScreenLockEvent(UNLOCK_SCREEN_RESULT, result, (error, data) => { - Log.showDebug(TAG, `notifyScreenResult: error:${JSON.stringify(error)} data:${JSON.stringify(data)}`); + Log.showInfo(TAG, `notifyScreenResult: error:${JSON.stringify(error)} data:${JSON.stringify(data)}`); }); } @@ -239,7 +235,7 @@ export class ScreenLockService { Log.showInfo(TAG, `notifyDrawDone`); //notify the base service that the screen is loaded this.screenLockModel.sendScreenLockEvent(SCREENLOCK_DRAW_DONE, 0, (error, result) => { - Log.showDebug(TAG, `notifyDrawDone: error:${JSON.stringify(error)} result:${JSON.stringify(result)}`); + Log.showInfo(TAG, `notifyDrawDone: error:${JSON.stringify(error)} result:${JSON.stringify(result)}`); }); } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets index 383b042d..8f2a7aa0 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets @@ -26,11 +26,11 @@ export default struct Accounts { private mViewModel: ViewModel = new ViewModel() aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) } build() { diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 28755f22..395a30f7 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -56,7 +56,7 @@ class ServiceExtAbility extends ServiceExtension { } Log.showInfo(TAG, `getDefaultDisplay, dis: ${JSON.stringify(dis)}`); let rect; - if (dis.width > dis.height) { // Pad��PC horizontalScreen Mode + if (dis.width > dis.height) { // Pad and PC horizontalScreen Mode rect = { left: 0, top: 0, diff --git a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts index 5fd65e7c..87d1cc91 100644 --- a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts @@ -55,7 +55,7 @@ export default class SlideScreenLockViewModel { } touchEvent(event: TouchEvent) { - Log.showDebug(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) + Log.showInfo(TAG, `Touch Event ${event.type} at Point ${event.touches[0].x}, ${event.touches[0].y}`) if (event.type == Constants.TOUCHTYPE_DOWN) { this.startX = event.touches[0].screenX this.startY = event.touches[0].screenY -- Gitee From 439bcc9051c7f36425ee7abe6dcde81a7270373d Mon Sep 17 00:00:00 2001 From: r00498791 Date: Wed, 25 May 2022 10:40:38 +0800 Subject: [PATCH 116/373] log rectification of product entry and common module 3 Signed-off-by: r00498791 --- .../src/main/ets/workers/PluginDataSourceWorker.js | 3 ++- .../statusbar/src/main/ets/workers/PluginDataSourceWorker.js | 3 ++- .../src/main/ets/workers/PluginDataSourceWorker.js | 3 ++- .../statusbar/src/main/ets/workers/PluginDataSourceWorker.js | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index 6445873f..6dae36c4 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -79,6 +79,7 @@ parentPort.onmessageerror = function () { }; parentPort.onerror = function (data) { - Log.showError(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + Log.showError(TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 3eae11f8..f8ef13db 100644 --- a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -79,6 +79,7 @@ parentPort.onmessageerror = function () { }; parentPort.onerror = function (data) { - Log.showError(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + Log.showError(TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js index 3eae11f8..f8ef13db 100644 --- a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -79,6 +79,7 @@ parentPort.onmessageerror = function () { }; parentPort.onerror = function (data) { - Log.showError(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + Log.showError(TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 3eae11f8..f8ef13db 100644 --- a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -79,6 +79,7 @@ parentPort.onmessageerror = function () { }; parentPort.onerror = function (data) { - Log.showError(TAG, `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + Log.showError(TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` ); }; \ No newline at end of file -- Gitee From 015f53209ac7134c522ca049550f243c06ef9624 Mon Sep 17 00:00:00 2001 From: username <1037761763@qq.com> Date: Wed, 25 May 2022 13:48:46 +0800 Subject: [PATCH 117/373] =?UTF-8?q?featrues=E5=B1=82=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: username <1037761763@qq.com> --- .../src/main/ets/com/ohos/view/component/appItemComponent.ets | 4 ++-- .../main/ets/com/ohos/view/component/noDisturbComponent.ets | 2 +- .../src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts | 2 -- features/signalcomponent/src/main/ets/default/signalModel.ts | 1 - 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets index 49c5ecf2..04c695da 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets @@ -198,7 +198,7 @@ export default struct AppItemComponent { } aboutToAppear(): void{ - Log.showDebug(TAG, `aboutToAppear`); + Log.showInfo(TAG, `aboutToAppear`); if (this.appSwitch === 1) { Notification.subscribeEnableChanged(); Notification.register({ bundle: this.appBundleName, @@ -219,7 +219,7 @@ export default struct AppItemComponent { } aboutToDisappear(): void{ - Log.showDebug(TAG, `aboutToDisappear`); + Log.showInfo(TAG, `aboutToDisappear`); if (this.appSwitch === 1) { Notification.unsubscribeEnableChanged(); } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets index 157ebf6c..1815e5b4 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets @@ -30,7 +30,7 @@ export default struct NoDisturbComponent { @State mRefreshCnt: number = 0; aboutToAppear(): void{ - Log.showDebug(TAG, `aboutToAppear`); + Log.showInfo(TAG, `aboutToAppear`); this.mViewModel.ViewModelInit(); this.mPrevGetCnt = 0; this.mRefreshCnt++; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index f18952f5..2146a7f6 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -117,7 +117,6 @@ export class ViewModel { for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].hashcode == hashCode) { let removeItemArr = this.mNotificationList.splice(i, 1); - Log.showInfo(TAG, `onNotificationCancel i = ${i} removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { this.updateFlowControlInfos(removeItemArr[0].bundleName, false) } @@ -214,7 +213,6 @@ export class ViewModel { for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].hashcode == itemData.hashcode) { let removeItemArr = this.mNotificationList.splice(i, 1); - Log.showInfo(TAG, `removeNotificationItem i = ${i} removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { this.updateFlowControlInfos(removeItemArr[0].bundleName, false) } diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ts b/features/signalcomponent/src/main/ets/default/signalModel.ts index d262db18..844f73a0 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ts +++ b/features/signalcomponent/src/main/ets/default/signalModel.ts @@ -55,7 +55,6 @@ export class SignalModel { checkCellularStatus() { let cellularStatus; let slotId = 0; - Log.showInfo(TAG, 'enter checkCellularStatus'); Sim.hasSimCard(slotId, (err, value) => { if (value === true) { -- Gitee From 944320b255605456fbd3bcd23ad9284905d68c09 Mon Sep 17 00:00:00 2001 From: YangPeng Date: Wed, 25 May 2022 15:00:17 +0800 Subject: [PATCH 118/373] change some log Signed-off-by: yangpeng85 --- .../src/main/ets/com/ohos/model/accountsModel.ts | 11 +++++------ .../src/main/ets/com/ohos/model/screenLockModel.ts | 4 +--- .../src/main/ets/com/ohos/model/screenlockStyle.ts | 2 +- .../main/ets/com/ohos/view/component/batterySoc.ets | 2 +- .../main/ets/com/ohos/view/component/customPSD.ets | 4 ++-- .../main/ets/com/ohos/view/component/digitalPSD.ets | 4 ++-- .../src/main/ets/com/ohos/view/component/lockIcon.ets | 2 +- .../src/main/ets/com/ohos/view/component/mixedPSD.ets | 4 ++-- .../main/ets/com/ohos/view/component/numkeyBoard.ets | 4 ++-- .../main/ets/com/ohos/view/component/statusBar.ets | 2 +- .../src/main/ets/com/ohos/vm/baseViewModel.ts | 3 +-- .../src/main/ets/com/ohos/vm/batterySocViewModel.ets | 2 +- .../src/main/ets/com/ohos/vm/customPSDViewModel.ts | 2 +- .../src/main/ets/com/ohos/vm/digitalPSDViewModel.ts | 2 +- .../src/main/ets/com/ohos/vm/lockIconViewModel.ts | 2 +- .../src/main/ets/com/ohos/vm/mixedPSDViewModel.ts | 2 +- .../src/main/ets/com/ohos/view/component/shortcut.ets | 6 +++--- .../src/main/ets/default/pages/signalIcon.ets | 4 ++-- .../src/main/ets/default/signalModel.ts | 8 ++++---- .../main/ets/com/ohos/view/component/wallpaper.ets | 2 +- .../src/main/ets/com/ohos/vm/wallpaperViewModel.ts | 2 +- .../src/main/ets/default/pages/wifiIcon.ets | 4 ++-- .../wificomponent/src/main/ets/default/wifiModel.ts | 6 ++---- product/pc/src/main/ets/Application/AbilityStage.ts | 2 +- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 8 ++++---- product/pc/src/main/ets/pages/customPassword.ets | 4 ++-- product/pc/src/main/ets/pages/customscreenlock.ets | 4 ++-- product/pc/src/main/ets/pages/digitalPassword.ets | 4 ++-- product/pc/src/main/ets/pages/index.ets | 8 ++++---- product/pc/src/main/ets/pages/journalscreenlock.ets | 4 ++-- product/pc/src/main/ets/pages/mixedPassword.ets | 4 ++-- product/pc/src/main/ets/pages/slidescreenlock.ets | 2 +- product/pc/src/main/ets/vm/indexViewModel.ts | 2 +- .../pc/src/main/ets/vm/slideScreenLockViewModel.ts | 2 +- product/phone/src/main/ets/AbilityStage.ts | 2 +- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 6 +++--- product/phone/src/main/ets/pages/customPassword.ets | 4 ++-- product/phone/src/main/ets/pages/customscreenlock.ets | 4 ++-- product/phone/src/main/ets/pages/digitalPassword.ets | 4 ++-- product/phone/src/main/ets/pages/index.ets | 8 ++++---- .../phone/src/main/ets/pages/journalscreenlock.ets | 4 ++-- product/phone/src/main/ets/pages/mixedPassword.ets | 4 ++-- product/phone/src/main/ets/pages/slidescreenlock.ets | 2 +- product/phone/src/main/ets/vm/indexViewModel.ts | 6 +++--- .../phone/src/main/ets/vm/slideScreenLockViewModel.ts | 2 +- 45 files changed, 84 insertions(+), 90 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index 30056215..0d837fbc 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -109,7 +109,7 @@ export default class AccountsModel { } private addAllUsers() { - Log.showInfo(TAG, "start getAllUsers") + Log.showDebug(TAG, "start getAllUsers") osAccount.getAccountManager().queryAllCreatedOsAccounts().then((list) => { Log.showDebug(TAG, "start sort") let accountList = []; @@ -151,9 +151,8 @@ export default class AccountsModel { onUserSwitch(userId: number) { Log.showDebug(TAG, "onUserSwitch:" + userId) osAccount.getAccountManager().activateOsAccount(userId).then(() => { - Log.showInfo(TAG, "activateOsAccount") + Log.showInfo(TAG, "activateOsAccount : " + userId); }) - Log.showDebug(TAG, "onUserSwitch:" + userId + "finish") } authUser(challenge, authType: AuthType, authLevel: number, callback) { @@ -204,17 +203,17 @@ export default class AccountsModel { inputData.onSetData(passType, uint8PW); } }) - Log.showInfo(TAG, `registerInputer result:${result} `); + Log.showInfo(TAG, `registerInputer result:${result}`); return result; } unregisterInputer() { - Log.showInfo(TAG, `unregisterInputer`); + Log.showDebug(TAG, `unregisterInputer`); this.pinAuthManager.unregisterInputer(); } modelFinish() { - Log.showInfo(TAG, "start modelFinish") + Log.showDebug(TAG, "start modelFinish") } isActivateAccount(callback: Callback) { diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index dc59cc15..441e23af 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -40,12 +40,10 @@ export default class ScreenLockModel { default: Log.showError(TAG, `eventListener:typeName ${typeName}`) } - - Log.showDebug(TAG, `eventListener:typeName ${typeName} finish`); } eventCancelListener(typeName: string) { - Log.showInfo(TAG, `eventCancleListener:typeName ${typeName}`); + Log.showDebug(TAG, `eventCancleListener:typeName ${typeName}`); // As off has some problem and there is no case to cancel, do nothing } diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts index 7632c4b2..874810d6 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts @@ -31,7 +31,7 @@ class ScreenlockStyle { private screenMode: LockStyleMode = LockStyleMode.SlideScreenLock setMode(mode: LockStyleMode): number { - Log.showInfo(TAG, `setMode:${mode}`); + Log.showDebug(TAG, `setMode:${mode}`); return this.screenMode = mode } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets index 05419675..6bfaec81 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets @@ -25,7 +25,7 @@ export default struct BatterySoc { @State batterySocText: string | Resource = '' aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) this.onBatterySocChanged(''); } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index dbe172c9..104f9e3d 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -26,14 +26,14 @@ export default struct CustomPSD { @StorageLink('passwordArr') passwordArr: any[] = this.mViewModel.passwordArr aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.checkFreezingTime(() => { Log.showInfo(TAG, `onClick callback is called`) }); } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) this.mViewModel.clearPassword() } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets index 30c5f503..3ad93895 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -26,14 +26,14 @@ export default struct DigitalPSD { @StorageLink('passwdMaskArr') passwdMaskArr: any[] = this.mViewModel.passwdMaskArr aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.checkFreezingTime(() => { Log.showInfo(TAG, `onClick callback is called`) }); } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) this.mViewModel.clearPassword() } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets index 23804f7a..69810271 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets @@ -26,7 +26,7 @@ export default struct LockIcon { @State mViewModel: ViewModel = new ViewModel() aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets index 0274c0e8..82bd579d 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets @@ -24,14 +24,14 @@ export default struct MixedPSD { @State mViewModel: ViewModel = new ViewModel() aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.checkFreezingTime(() => { Log.showInfo(TAG, `onClick callback is called`) }); } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) this.mViewModel.clearPassword() } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets index 30d58e68..d94dbd19 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets @@ -26,11 +26,11 @@ export default struct NumkeyBoard { @StorageLink('numKeyboard') numKeyboard: any[] = Constants.NUMKEY_BOARD; aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) } build() { diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets index d50791b7..b310ab31 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets @@ -42,7 +42,7 @@ export default struct statusBar { } aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) } } \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts index 721af283..46842f72 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts @@ -34,7 +34,7 @@ export default class BaseViewModel { } ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); + Log.showDebug(TAG, 'ViewModelInit'); this.prompt = $r('app.string.input'); } @@ -80,7 +80,6 @@ export default class BaseViewModel { this.updateStorage(callback) //notify the base service that the unlock is fail service.notifyScreenResult(UnlockResult.Fail); - Log.showDebug(TAG, `changePrompt end`) } getFreezingTimeNm(freezingMillisecond: number): string { diff --git a/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets b/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets index c844e00d..8c8ca34b 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets +++ b/features/screenlock/src/main/ets/com/ohos/vm/batterySocViewModel.ets @@ -22,7 +22,7 @@ export default class BatterySocViewModel { mbatterySocStr= AppStorage.SetAndLink('batterySoc', 0); ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); + Log.showDebug(TAG, 'ViewModelInit'); let batteryValue: number = this.mbatterySocStr.get(); if (batteryValue < 100) { this.batterySocStr = "" diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts index 9c6a0e8d..a6a30d40 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts @@ -29,7 +29,7 @@ export default class CustomPSDViewModel extends BaseViewModel { } ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); + Log.showDebug(TAG, 'ViewModelInit'); super.ViewModelInit(); } diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts index 175c3cc9..fe885c1c 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -32,7 +32,7 @@ export default class DigitalPSDViewModel extends BaseViewModel { } ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); + Log.showDebug(TAG, 'ViewModelInit'); this.passwdMaskArr = new Array(PW_LEN).fill($r('app.media.ic_hollow_dot')); super.ViewModelInit(); } diff --git a/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts index 26a798fd..4ac29aae 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/lockIconViewModel.ts @@ -24,7 +24,7 @@ export default class LockIconViewModel { iconPath: any= {} ViewModelInit(): void{ - Log.showInfo(TAG, `ViewModelInit`); + Log.showDebug(TAG, `ViewModelInit`); this.iconPath = $r('app.media.ic_public_lock_filled'); this.cutMessage = $r('app.string.lock_prompt') } diff --git a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts index 43e17b66..a959530a 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts @@ -27,7 +27,7 @@ export default class MixedPSDViewModel extends BaseViewModel { } ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); + Log.showDebug(TAG, 'ViewModelInit'); super.ViewModelInit(); } diff --git a/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets b/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets index 4b8d7e08..933da1e2 100644 --- a/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets +++ b/features/shortcutcomponent/src/main/ets/com/ohos/view/component/shortcut.ets @@ -29,7 +29,7 @@ export default struct Shortcut { private rebootLabel: Resource = $r("app.string.reboot") aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) } build() { @@ -60,11 +60,11 @@ struct ShortcutComponent { private mClickEvent: Function aboutToAppear() { - Log.showDebug(this.mTag, `aboutToAppear Start`) + Log.showInfo(this.mTag, `aboutToAppear Start`) } aboutToDisappear() { - Log.showDebug(this.mTag, `aboutToDisAppear`) + Log.showInfo(this.mTag, `aboutToDisAppear`) } build() { diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 4acf94a4..8ba8f517 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -36,7 +36,7 @@ struct SignalIcon { @State style: any = StyleConfiguration.getSignalComponentStyle() aboutToAppear() { - Log.showDebug(TAG, 'aboutToAppear'); + Log.signalIcon(TAG, 'aboutToAppear'); this.mStatusBarGroupComponentData = StatusBarVM.getStatusBarGroupComponentData(this.mGroupId) if (!this.signalObserved) { mSignalModel.initSignalModel(); @@ -45,7 +45,7 @@ struct SignalIcon { } aboutToDisappear() { - Log.showDebug(TAG, 'aboutToDisappear'); + Log.signalIcon(TAG, 'aboutToDisappear'); } build() { diff --git a/features/signalcomponent/src/main/ets/default/signalModel.ts b/features/signalcomponent/src/main/ets/default/signalModel.ts index 8740c259..b7440ced 100644 --- a/features/signalcomponent/src/main/ets/default/signalModel.ts +++ b/features/signalcomponent/src/main/ets/default/signalModel.ts @@ -37,7 +37,7 @@ var mStateLink; export class SignalModel { initSignalModel() { - Log.showInfo(TAG, 'initSignalModel'); + Log.showDebug(TAG, 'initSignalModel'); mLevelLink = AppStorage.SetAndLink("cellularLevel", Constants.CELLULAR_NO_SIM_CARD); mTypeLink = AppStorage.SetAndLink("cellularType", Constants.NETWORK_TYPE_UNKNOWN); mStateLink = AppStorage.SetAndLink("networkState", Constants.NET_NULL); @@ -45,7 +45,7 @@ export class SignalModel { } uninitSignalModel() { - Log.showInfo(TAG, 'uninitSignalModel'); + Log.showDebug(TAG, 'uninitSignalModel'); this.unInitObserver(); } @@ -120,7 +120,7 @@ export class SignalModel { * init the observer of the cellular and signal */ initObserver() { - Log.showInfo(TAG, 'initObserver'); + Log.showDebug(TAG, 'initObserver'); isInitObserver = true; Observer.on('signalInfoChange', (signalInfoChange) => { Log.showInfo(TAG, 'signalInfoChange'); @@ -140,7 +140,7 @@ export class SignalModel { * Uninit the observer of the cellular and signal */ unInitObserver() { - Log.showInfo(TAG, 'unInitObserver'); + Log.showDebug(TAG, 'unInitObserver'); Observer.off('signalInfoChange'); Observer.off('networkStateChange'); Observer.off('simStateChange'); diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets b/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets index 12717d8a..e6806c3b 100644 --- a/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets +++ b/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets @@ -24,7 +24,7 @@ export default struct Wallpaper { @State mViewModel: ViewModel = new ViewModel() aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() } diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts index 094e8dc6..b02590e3 100644 --- a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts +++ b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts @@ -22,7 +22,7 @@ export default class WallpaperViewModel { screenlockWallpaper: string = '' ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); + Log.showDebug(TAG, 'ViewModelInit'); this.getScreenLockWallpaper() } diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index 4b3728db..6b6712eb 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -34,13 +34,13 @@ export default struct WifiIcon { @State style: any = StyleConfiguration.getStartsBarWifiComponentStyle() aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) this.mStatusBarGroupComponentData = StatusBarVM.getStatusBarGroupComponentData(this.mGroupId) mWifiModel.initWifiModel() } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) } build() { diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ts b/features/wificomponent/src/main/ets/default/wifiModel.ts index 7be7604d..ef772eea 100644 --- a/features/wificomponent/src/main/ets/default/wifiModel.ts +++ b/features/wificomponent/src/main/ets/default/wifiModel.ts @@ -32,7 +32,7 @@ export class WifiModel { if (this.mIsStart) { return; } - Log.showInfo(TAG, `initWifiModel`) + Log.showDebug(TAG, `initWifiModel`) this.mIsStart = true; mWifiInfo = AppStorage.SetAndLink("wifiInfo", Constants.DEFAULT_WIFI_INFO); @@ -118,7 +118,7 @@ export class WifiModel { } getLinkedInfo() { - Log.showInfo(TAG, `getLinkedInfo`) + Log.showDebug(TAG, `getLinkedInfo`) wifi.getLinkedInfo((err, data) => { if (wifi.isConnected()) { mWifiStatus.set(true); @@ -140,13 +140,11 @@ export class WifiModel { } enableWifi() { - Log.showInfo(TAG, 'enableWifi'); let result = wifi.enableWifi(); Log.showInfo(TAG, `enableWifi, result: ${result}`); } disableWifi() { - Log.showInfo(TAG, 'disableWifi'); let result = wifi.disableWifi(); Log.showInfo(TAG, `disableWifi, result: ${result}`); } diff --git a/product/pc/src/main/ets/Application/AbilityStage.ts b/product/pc/src/main/ets/Application/AbilityStage.ts index e1e71b28..7df13e65 100644 --- a/product/pc/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/src/main/ets/Application/AbilityStage.ts @@ -20,6 +20,6 @@ const TAG = "ScreenLock-MainAbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showDebug(TAG, "onCreate") + Log.showInfo(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 395a30f7..a1bf0ecd 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -26,7 +26,7 @@ const TAG = "ScreenLock-ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showDebug(TAG, 'onCreate, want:' + want.abilityName); + Log.showInfo(TAG, 'onCreate, want:' + want.abilityName); AbilityManager.setContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK, this.context) sTimeManager.init(this.context) this.statusBarWindow() @@ -34,7 +34,7 @@ class ServiceExtAbility extends ServiceExtension { } private createWindow(name: string) { - Log.showInfo(TAG, `createWindow name:${name}`) + Log.showDebug(TAG, `createWindow name:${name}`) windowManager.create(this.context, name, 2110).then((win) => { Log.showInfo(TAG, "before begin " + name + " window show!") win.loadContent("pages/index").then(() => { @@ -48,7 +48,7 @@ class ServiceExtAbility extends ServiceExtension { } private async statusBarWindow() { - Log.showInfo(TAG, `statusBarWindow`); + Log.showDebug(TAG, `statusBarWindow`); let dis = await display.getDefaultDisplay(); while (dis === null) { await new Promise((resolve)=>{setTimeout(resolve, 1000)}); @@ -79,7 +79,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showDebug(TAG, 'api8New onDestroy'); + Log.showInfo(TAG, 'api8New onDestroy'); sTimeManager.release() } } diff --git a/product/pc/src/main/ets/pages/customPassword.ets b/product/pc/src/main/ets/pages/customPassword.ets index b3517833..961b8f92 100644 --- a/product/pc/src/main/ets/pages/customPassword.ets +++ b/product/pc/src/main/ets/pages/customPassword.ets @@ -29,7 +29,7 @@ export default struct CustomPassword { @State mHeightPx: number = 44 aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') @@ -38,7 +38,7 @@ export default struct CustomPassword { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) } build() { diff --git a/product/pc/src/main/ets/pages/customscreenlock.ets b/product/pc/src/main/ets/pages/customscreenlock.ets index 45af5e55..514cb35e 100644 --- a/product/pc/src/main/ets/pages/customscreenlock.ets +++ b/product/pc/src/main/ets/pages/customscreenlock.ets @@ -25,11 +25,11 @@ export default struct CustomScreenlock { } aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) } onDisappear() { - Log.showDebug(TAG, `onDisappear Start`) + Log.showInfo(TAG, `onDisappear Start`) } } \ No newline at end of file diff --git a/product/pc/src/main/ets/pages/digitalPassword.ets b/product/pc/src/main/ets/pages/digitalPassword.ets index 8760fa4f..97751fcc 100644 --- a/product/pc/src/main/ets/pages/digitalPassword.ets +++ b/product/pc/src/main/ets/pages/digitalPassword.ets @@ -29,7 +29,7 @@ export default struct DigitalPassword { @State mHeightPx: number = 44 aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') @@ -38,7 +38,7 @@ export default struct DigitalPassword { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) } build() { diff --git a/product/pc/src/main/ets/pages/index.ets b/product/pc/src/main/ets/pages/index.ets index 0cf9d8d8..88f12ab6 100644 --- a/product/pc/src/main/ets/pages/index.ets +++ b/product/pc/src/main/ets/pages/index.ets @@ -35,7 +35,7 @@ struct Index { @State mHeightPx: number = 0 aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) try { setAppBgColor('#00000000') } catch (error) { @@ -51,19 +51,19 @@ struct Index { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`) this.pageStatus = Constants.STATUS_ABOUT_TO_DISAPPEAR this.mViewModel.ViewModelDestroy() } onPageShow() { - Log.showDebug(TAG, `onPageShow`) + Log.showInfo(TAG, `onPageShow`) this.pageStatus = Constants.STATUS_ON_PAGE_SHOW this.mViewModel.onPageShow(); } onPageHide() { - Log.showDebugTAG, `onPageHide`) + Log.showInfo(TAG, `onPageHide`) this.pageStatus = Constants.STATUS_ON_PAGE_HIDE } diff --git a/product/pc/src/main/ets/pages/journalscreenlock.ets b/product/pc/src/main/ets/pages/journalscreenlock.ets index 371db3a2..e4359658 100644 --- a/product/pc/src/main/ets/pages/journalscreenlock.ets +++ b/product/pc/src/main/ets/pages/journalscreenlock.ets @@ -25,11 +25,11 @@ export default struct JournalScreenlock { } aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) } onDisappear() { - Log.showDebug(TAG, `onDisappear Start`) + Log.showInfo(TAG, `onDisappear Start`) } } \ No newline at end of file diff --git a/product/pc/src/main/ets/pages/mixedPassword.ets b/product/pc/src/main/ets/pages/mixedPassword.ets index 972c27c2..555eb022 100644 --- a/product/pc/src/main/ets/pages/mixedPassword.ets +++ b/product/pc/src/main/ets/pages/mixedPassword.ets @@ -29,7 +29,7 @@ export default struct MixedPassword { @State mHeightPx: number = 44 aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') @@ -38,7 +38,7 @@ export default struct MixedPassword { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) } build() { diff --git a/product/pc/src/main/ets/pages/slidescreenlock.ets b/product/pc/src/main/ets/pages/slidescreenlock.ets index 9563af3b..086df03e 100644 --- a/product/pc/src/main/ets/pages/slidescreenlock.ets +++ b/product/pc/src/main/ets/pages/slidescreenlock.ets @@ -36,7 +36,7 @@ export default struct SlideScreenlock { private mHeightPx : number = 44 aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() } diff --git a/product/pc/src/main/ets/vm/indexViewModel.ts b/product/pc/src/main/ets/vm/indexViewModel.ts index 26108969..9bc4ac23 100644 --- a/product/pc/src/main/ets/vm/indexViewModel.ts +++ b/product/pc/src/main/ets/vm/indexViewModel.ts @@ -38,7 +38,7 @@ export default class IndexViewModel { } onPageShow() { - Log.showDebug(TAG, `onPageShow`) + Log.showInfo(TAG, `onPageShow`) ScreenLockService.notifyDrawDone(); } diff --git a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts index 9786ea2d..57a2ebfc 100644 --- a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts @@ -38,7 +38,7 @@ export default class SlideScreenLockViewModel { toggleShow: boolean = false ViewModelInit(): void{ - Log.showInfo(TAG, `ViewModelInit`); + Log.showDebug(TAG, `ViewModelInit`); ScreenLockService.setUnlockAnimation((callback: Callback) => { this.elementAlpha = 0 this.elementScale = 0.85 diff --git a/product/phone/src/main/ets/AbilityStage.ts b/product/phone/src/main/ets/AbilityStage.ts index a7a7f4e2..f9b1f6e2 100644 --- a/product/phone/src/main/ets/AbilityStage.ts +++ b/product/phone/src/main/ets/AbilityStage.ts @@ -20,6 +20,6 @@ const TAG = "ScreenLock-MainAbilityStage" export default class MainAbilityStage extends AbilityStage { onCreate() { - Log.showDebug(TAG, "onCreate") + Log.showInfo(TAG, "onCreate") } } \ No newline at end of file diff --git a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 31b41a8a..5bec2b27 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -25,7 +25,7 @@ const TAG = "ScreenLock-ServiceExtAbility" class ServiceExtAbility extends ServiceExtension { onCreate(want) { - Log.showDebug(TAG, 'onCreate, want:' + want.abilityName); + Log.showInfo(TAG, 'onCreate, want:' + want.abilityName); AbilityManager.setContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK, this.context) sTimeManager.init(this.context) this.statusBarWindow() @@ -33,7 +33,7 @@ class ServiceExtAbility extends ServiceExtension { } private createWindow(name: string) { - Log.showInfo(TAG, `createWindow name:${name}`) + Log.showDebug(TAG, `createWindow name:${name}`) windowManager.create(this.context, name, 2110).then((win) => { win.loadContent("pages/index").then(() => { Log.showInfo(TAG, name + " window loadContent in then! ") @@ -74,7 +74,7 @@ class ServiceExtAbility extends ServiceExtension { } onDestroy() { - Log.showDebug(TAG, 'api8New onDestroy'); + Log.showInfo(TAG, 'api8New onDestroy'); sTimeManager.release() } diff --git a/product/phone/src/main/ets/pages/customPassword.ets b/product/phone/src/main/ets/pages/customPassword.ets index 13e9b4fe..2c95d621 100644 --- a/product/phone/src/main/ets/pages/customPassword.ets +++ b/product/phone/src/main/ets/pages/customPassword.ets @@ -29,7 +29,7 @@ export default struct CustomPassword { @State mHeightPx: number = 48 aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') @@ -39,7 +39,7 @@ export default struct CustomPassword { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) } build() { diff --git a/product/phone/src/main/ets/pages/customscreenlock.ets b/product/phone/src/main/ets/pages/customscreenlock.ets index 45af5e55..514cb35e 100644 --- a/product/phone/src/main/ets/pages/customscreenlock.ets +++ b/product/phone/src/main/ets/pages/customscreenlock.ets @@ -25,11 +25,11 @@ export default struct CustomScreenlock { } aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) } onDisappear() { - Log.showDebug(TAG, `onDisappear Start`) + Log.showInfo(TAG, `onDisappear Start`) } } \ No newline at end of file diff --git a/product/phone/src/main/ets/pages/digitalPassword.ets b/product/phone/src/main/ets/pages/digitalPassword.ets index f9d7ed1c..75d98b23 100644 --- a/product/phone/src/main/ets/pages/digitalPassword.ets +++ b/product/phone/src/main/ets/pages/digitalPassword.ets @@ -29,7 +29,7 @@ export default struct DigitalPassword { @State mHeightPx: number = 48 aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') @@ -39,7 +39,7 @@ export default struct DigitalPassword { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) } build() { diff --git a/product/phone/src/main/ets/pages/index.ets b/product/phone/src/main/ets/pages/index.ets index f676d6c3..95776b47 100644 --- a/product/phone/src/main/ets/pages/index.ets +++ b/product/phone/src/main/ets/pages/index.ets @@ -35,7 +35,7 @@ struct Index { @State mHeightPx: number = 48 aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() this.pageStatus = Constants.STATUS_ABOUT_TO_APPEAR try { @@ -52,19 +52,19 @@ struct Index { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisAppear`) + Log.showInfo(TAG, `aboutToDisAppear`) this.pageStatus = Constants.STATUS_ABOUT_TO_DISAPPEAR this.mViewModel.ViewModelDestroy() } onPageShow() { - Log.showDebug(TAG, `onPageShow`) + Log.showInfo(TAG, `onPageShow`) this.pageStatus = Constants.STATUS_ON_PAGE_SHOW this.mViewModel.onPageShow(); } onPageHide() { - Log.showDebug(TAG, `onPageHide`) + Log.showInfo(TAG, `onPageHide`) this.pageStatus = Constants.STATUS_ON_PAGE_HIDE } diff --git a/product/phone/src/main/ets/pages/journalscreenlock.ets b/product/phone/src/main/ets/pages/journalscreenlock.ets index 371db3a2..e4359658 100644 --- a/product/phone/src/main/ets/pages/journalscreenlock.ets +++ b/product/phone/src/main/ets/pages/journalscreenlock.ets @@ -25,11 +25,11 @@ export default struct JournalScreenlock { } aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`) } onDisappear() { - Log.showDebug(TAG, `onDisappear Start`) + Log.showInfo(TAG, `onDisappear Start`) } } \ No newline at end of file diff --git a/product/phone/src/main/ets/pages/mixedPassword.ets b/product/phone/src/main/ets/pages/mixedPassword.ets index 36d2ed1c..898931a5 100644 --- a/product/phone/src/main/ets/pages/mixedPassword.ets +++ b/product/phone/src/main/ets/pages/mixedPassword.ets @@ -29,7 +29,7 @@ export default struct MixedPassword { @State mHeightPx: number = 48 aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') @@ -39,7 +39,7 @@ export default struct MixedPassword { } aboutToDisappear() { - Log.showDebug(TAG, `aboutToDisappear`) + Log.showInfo(TAG, `aboutToDisappear`) } build() { diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets index cd64cb05..bcd1456d 100644 --- a/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -33,7 +33,7 @@ export default struct SlideScreenlock { @StorageLink('deviceStatus') @Watch('onDeviceStatusChange') deviceStatus: string = "" private mHeightPx : number = 48 aboutToAppear() { - Log.showDebug(TAG, `aboutToAppear`) + Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() } diff --git a/product/phone/src/main/ets/vm/indexViewModel.ts b/product/phone/src/main/ets/vm/indexViewModel.ts index 7dacd630..1c80d1ca 100644 --- a/product/phone/src/main/ets/vm/indexViewModel.ts +++ b/product/phone/src/main/ets/vm/indexViewModel.ts @@ -25,7 +25,7 @@ export default class IndexViewModel { ViewModelInit(): void{ this.serviceInit(); this.mode = this.getMode(); - Log.showInfo(TAG, `ViewModelInit this.mode=${this.mode}`); + Log.showDebug(TAG, `ViewModelInit this.mode=${this.mode}`); } serviceInit() { @@ -37,12 +37,12 @@ export default class IndexViewModel { } onPageShow() { - Log.showDebug(TAG, `onPageShow`) + Log.showInfo(TAG, `onPageShow`) ScreenLockService.notifyDrawDone(); } ViewModelDestroy() { - Log.showInfo(TAG, 'ViewModelDestroy'); + Log.showDebug(TAG, 'ViewModelDestroy'); ScreenLockService.destroy() } } \ No newline at end of file diff --git a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts index 87d1cc91..de8af03e 100644 --- a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts @@ -38,7 +38,7 @@ export default class SlideScreenLockViewModel { toggleShow: boolean = false ViewModelInit(): void{ - Log.showInfo(TAG, `ViewModelInit`); + Log.showDebug(TAG, `ViewModelInit`); ScreenLockService.setUnlockAnimation((callback: Callback) => { this.elementAlpha = 0 this.elementScale = 0.85 -- Gitee From ead5315f6ef74e7f1631b3cc26167ff2be987496 Mon Sep 17 00:00:00 2001 From: lvxiaoqiang Date: Wed, 25 May 2022 15:33:57 +0800 Subject: [PATCH 119/373] log format Signed-off-by: lvxiaoqiang --- common/src/main/ets/default/ReadConfigUtil.ts | 16 +-- .../src/main/ets/default/ScreenLockCommon.ts | 14 ++- .../main/ets/default/SingleInstanceHelper.ts | 2 +- common/src/main/ets/default/StyleManager.ts | 4 +- .../src/main/ets/default/SwitchUserManager.ts | 5 +- common/src/main/ets/default/TimeManager.ts | 6 +- common/src/main/ets/default/WindowManager.ts | 53 +++++++--- .../default/abilitymanager/abilityManager.ts | 12 +-- .../default/abilitymanager/bundleManager.ts | 4 +- .../abilitymanager/featureAbilityManager.ts | 9 +- .../default/commonEvent/CommonEventManager.ts | 6 +- .../src/main/ets/default/batteryModel.ts | 8 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../main/ets/default/pages/batteryIcon.ets | 2 +- .../src/main/ets/default/pages/batteryPic.ets | 2 +- .../src/main/ets/default/pages/clockIcon.ets | 2 +- .../main/ets/com/ohos/vm/dateTimeViewModel.ts | 16 +-- .../com/ohos/noticeItem/common/CommonUtil.ts | 4 +- .../noticeItem/common/ScrollbarManager.ts | 10 +- .../model/NotificationDistributionManager.ts | 19 ++-- .../noticeItem/model/NotificationManager.ts | 17 ++-- .../model/NotificationWindowManager.ts | 2 +- .../ohos/noticeItem/model/ParseDataUtil.ts | 21 ++-- .../noticeItem/model/rule/RuleController.ts | 24 ++--- .../view/item/bannerNotificationItem.ets | 15 ++- .../noticeItem/view/item/confirmDialog.ets | 2 +- .../ohos/noticeItem/view/item/customItem.ets | 8 +- .../noticeItem/view/item/devicesDialog.ets | 2 +- .../ohos/noticeItem/view/item/generalItem.ets | 2 +- .../ohos/noticeItem/view/item/groupItem.ets | 2 +- .../view/item/iconListComponent.ets | 8 +- .../noticeItem/view/item/notificationItem.ets | 6 +- .../noticeItem/view/item/settingDialog.ets | 4 +- .../ohos/noticeItem/viewmodel/ViewModel.ts | 98 +++++++++---------- .../common/{constants.ts => Constants.ts} | 0 .../ets/com/ohos/model/screenLockModel.ts | 2 +- .../ets/com/ohos/view/component/accounts.ets | 2 +- .../com/ohos/view/component/batterySoc.ets | 2 +- .../ets/com/ohos/view/component/customPSD.ets | 2 +- .../com/ohos/view/component/digitalPSD.ets | 2 +- .../ets/com/ohos/view/component/lockIcon.ets | 2 +- .../ets/com/ohos/view/component/mixedPSD.ets | 2 +- .../com/ohos/view/component/numkeyBoard.ets | 2 +- .../ets/com/ohos/view/component/statusBar.ets | 2 +- .../src/main/ets/com/ohos/vm/baseViewModel.ts | 2 +- .../ets/com/ohos/vm/customPSDViewModel.ts | 2 +- .../ets/com/ohos/vm/digitalPSDViewModel.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 2 +- 49 files changed, 232 insertions(+), 203 deletions(-) rename features/screenlock/src/main/ets/com/ohos/common/{constants.ts => Constants.ts} (100%) diff --git a/common/src/main/ets/default/ReadConfigUtil.ts b/common/src/main/ets/default/ReadConfigUtil.ts index c7eb8b90..c736e39a 100644 --- a/common/src/main/ets/default/ReadConfigUtil.ts +++ b/common/src/main/ets/default/ReadConfigUtil.ts @@ -23,8 +23,10 @@ const TAG = 'ReadConfigUtil'; export class ReadConfigUtil { ReadConfigFile(fileName) { Log.showInfo(TAG, `readConfigFile fileName:${fileName}`); + let stream; + let content : string = ""; try { - let stream = FileIo.createStreamSync(fileName, 'r'); + stream = FileIo.createStreamSync(fileName, 'r'); Log.showInfo(TAG, `readConfigFile stream:` + stream); let buf = new ArrayBuffer(DFAULT_SIZE); let len = stream.readSync(buf); @@ -34,13 +36,15 @@ export class ReadConfigUtil { for (let i = len;i < DFAULT_SIZE; i++) { arr[i] = charAt; } - let content = String.fromCharCode.apply(null, arr); - stream.closeSync(); - Log.showInfo(TAG, `readConfigFile content:` + JSON.stringify(content)); - return JSON.parse(content); + content = String.fromCharCode.apply(null, arr); + Log.showDebug(TAG, `readConfigFile content:` + JSON.stringify(content)); } catch (error) { - Log.showInfo(TAG, `readConfigFile error:` + JSON.stringify(error)); + Log.showError(TAG, `readConfigFile error:` + JSON.stringify(error)); + content = ""; + } finally{ + stream.closeSync(); } + return JSON.stringify(content); } } diff --git a/common/src/main/ets/default/ScreenLockCommon.ts b/common/src/main/ets/default/ScreenLockCommon.ts index 5fa38967..7e6345b7 100644 --- a/common/src/main/ets/default/ScreenLockCommon.ts +++ b/common/src/main/ets/default/ScreenLockCommon.ts @@ -28,6 +28,8 @@ export enum ScreenLockStatus { export function ReadConfigFile(fileName) { Log.showInfo(TAG, `readConfigFile fileName:${fileName}`); + let stream; + let content : string = ""; try { let stream = FileIo.createStreamSync(fileName, 'r'); Log.showInfo(TAG, `readConfigFile stream:` + stream); @@ -39,11 +41,13 @@ export function ReadConfigFile(fileName) { for (let i = len;i < DFAULT_SIZE; i++) { arr[i] = charAt; } - let content = String.fromCharCode.apply(null, arr); - stream.closeSync(); - Log.showInfo(TAG, `readConfigFile content:` + JSON.stringify(content)); - return JSON.parse(content); + content = String.fromCharCode.apply(null, arr); + Log.showDebug(TAG, `readConfigFile content:` + JSON.stringify(content)); } catch (error) { - Log.showInfo(TAG, `readConfigFile error:` + JSON.stringify(error)); + Log.showError(TAG, `readConfigFile error:` + JSON.stringify(error)); + content = ""; + } finally { + stream.closeSync(); } + return JSON.stringify(content); } \ No newline at end of file diff --git a/common/src/main/ets/default/SingleInstanceHelper.ts b/common/src/main/ets/default/SingleInstanceHelper.ts index b4ffcae7..00ab5d59 100644 --- a/common/src/main/ets/default/SingleInstanceHelper.ts +++ b/common/src/main/ets/default/SingleInstanceHelper.ts @@ -22,7 +22,7 @@ const AUDIO_MANAGER_KEY = 'MultiMediaAudioManager'; export default function createOrGet(objectClass: { new(): T }, storageKey: string): T { if (!globalThis[storageKey]) { globalThis[storageKey] = new objectClass(); - Log.showInfo(TAG, `Create key of ${storageKey}`); + Log.showDebug(TAG, `Create key of ${storageKey}`); } return globalThis[storageKey]; } diff --git a/common/src/main/ets/default/StyleManager.ts b/common/src/main/ets/default/StyleManager.ts index d9e49622..18fc5e6c 100644 --- a/common/src/main/ets/default/StyleManager.ts +++ b/common/src/main/ets/default/StyleManager.ts @@ -21,7 +21,7 @@ export class StyleManager { mAbilityPageName: string = ''; setAbilityPageName(name: string): void{ - Log.showInfo(TAG, `setAbilityPageName, name: ${name}`); + Log.showDebug(TAG, `setAbilityPageName, name: ${name}`); this.mAbilityPageName = name; } @@ -30,7 +30,7 @@ export class StyleManager { if (!AppStorage.Has(newKey)) { let defaultStyle = generateDefaultFunction(); AppStorage.SetOrCreate(newKey, defaultStyle); - Log.showInfo(TAG, `Create storageKey of ${newKey}`); + Log.showDebug(TAG, `Create storageKey of ${newKey}`); } return AppStorage.Get(newKey); } diff --git a/common/src/main/ets/default/SwitchUserManager.ts b/common/src/main/ets/default/SwitchUserManager.ts index d390d75e..43e14fa5 100644 --- a/common/src/main/ets/default/SwitchUserManager.ts +++ b/common/src/main/ets/default/SwitchUserManager.ts @@ -41,8 +41,9 @@ export class UserInfo { async function getCurrentAccountInfo(): Promise { let accountInfos = await AccountManager.getAccountManager().queryAllCreatedOsAccounts(); + Log.showInfo(TAG, `accountInfos size:${accountInfos.length}`); for (let accountInfo of accountInfos) { - Log.showInfo(TAG, `accountInfo: ${accountInfo.localId}, isActive: ${accountInfo.isActived}`); + Log.showDebug(TAG, `accountInfo: ${accountInfo.localId}, isActive: ${accountInfo.isActived}`); if (accountInfo.isActived) { return accountInfo; } @@ -68,7 +69,7 @@ export default class SwitchUserManager { } constructor() { - Log.showInfo(TAG, `SwitchUserManager constructor`); + Log.showDebug(TAG, `SwitchUserManager constructor`); AccountManager.getAccountManager().on(USER_CHANGE_EVENT, SUBSCRIBE_KEY, this.handleUserChange.bind(this)); } diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts index 264019a7..e17f4987 100644 --- a/common/src/main/ets/default/TimeManager.ts +++ b/common/src/main/ets/default/TimeManager.ts @@ -77,7 +77,7 @@ class TimeManager { } private initTimeFormat(context: any) { - Log.showInfo(TAG, "initTimeFormat"); + Log.showDebug(TAG, "initTimeFormat"); this.mSettingsHelper = featureAbility.acquireDataAbilityHelper(context, URI_VAR); try { @@ -94,7 +94,7 @@ class TimeManager { } private handleTimeFormatChange() { - Log.showInfo(TAG, "handleTimeFormatChange") + Log.showDebug(TAG, "handleTimeFormatChange") if (!this.mSettingsHelper) { Log.showError(TAG, `Can't get dataAbility helper.`); return; @@ -106,7 +106,7 @@ class TimeManager { }; private notifyTimeChange() { - Log.showInfo(TAG, "notifyTimeChange"); + Log.showDebug(TAG, "notifyTimeChange"); let args: TimeEventArgs = { date: new Date(), timeFormat: this.mUse24hFormat, diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index 9d6f0a90..13ac9261 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -61,19 +61,30 @@ class WindowManager { async createWindow(context: any, name: WindowType, rect: Rect, loadContent: string): Promise { Log.showInfo(TAG, `createWindow name: ${name}, rect: ${JSON.stringify(rect)}, url: ${loadContent}`); - let winHandle = await Window.create(context, name, SYSTEM_WINDOW_TYPE_MAP[name]); - await winHandle.moveTo(rect.left, rect.top); - await winHandle.resetSize(rect.width, rect.height); - await winHandle.loadContent(loadContent); - this.mWindowInfos.set(name, { visibility: false, rect }); - Log.showInfo(TAG, `create window[${name}] success.`); + let winHandle = null; + try{ + winHandle = await Window.create(context, name, SYSTEM_WINDOW_TYPE_MAP[name]); + await winHandle.moveTo(rect.left, rect.top); + await winHandle.resetSize(rect.width, rect.height); + await winHandle.loadContent(loadContent); + this.mWindowInfos.set(name, { visibility: false, rect }); + Log.showInfo(TAG, `create window[${name}] success.`); + } catch (err) { + Log.showError(TAG, `create window[${name}] failed. error:${JSON.stringify(err)}`); + } return winHandle; } async resetSizeWindow(name: WindowType, rect: Rect): Promise { - let window = await Window.find(name); - await window.moveTo(rect.left, rect.top); - await window.resetSize(rect.width, rect.height); + Log.showInfo(TAG, `resetSizeWindow name: ${name}, rect: ${JSON.stringify(rect)}`); + let window = null; + try { + window = await Window.find(name); + await window.moveTo(rect.left, rect.top); + await window.resetSize(rect.width, rect.height); + } catch(err) { + Log.showError(TAG, `resetSizeWindow failed. error:${JSON.stringify(err)}`); + } this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), rect }); EventManager.publish( obtainLocalEvent(WINDOW_RESIZE_EVENT, { @@ -81,12 +92,18 @@ class WindowManager { rect, }) ); - Log.showInfo(TAG, `resize window[${name}] success, rect: ${JSON.stringify(rect)}.`); + Log.showInfo(TAG, `resize window[${name}] success.`); } async showWindow(name: WindowType): Promise { - let window = await Window.find(name); - await window.show(); + Log.showInfo(TAG, `showWindow name: ${name}`); + let window = null; + try { + window = await Window.find(name); + await window.show(); + } catch (err) { + Log.showError(TAG, `showWindow failed. error:${JSON.stringify(err)}`); + } this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), visibility: true }); EventManager.publish( obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { @@ -98,8 +115,14 @@ class WindowManager { } async hideWindow(name: WindowType): Promise { - let window = await Window.find(name); - await window.hide(); + Log.showInfo(TAG, `hideWindow name: ${name}`); + let window = null; + try { + window = await Window.find(name); + await window.hide(); + } catch (err) { + Log.showError(TAG, `hideWindow failed. error:${JSON.stringify(err)}`); + } this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), visibility: false }); EventManager.publish( obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { @@ -116,7 +139,7 @@ class WindowManager { // function need remove setWindowInfo(configInfo) { - Log.showInfo(TAG, `setWindowInfo, configInfo ${JSON.stringify(configInfo)}`); + Log.showDebug(TAG, `setWindowInfo, configInfo ${JSON.stringify(configInfo)}`); let maxWidth = AppStorage.SetAndLink("maxWidth", configInfo.maxWidth); let maxHeight = AppStorage.SetAndLink("maxHeight", configInfo.maxHeight); let minHeight = AppStorage.SetAndLink("minHeight", configInfo.minHeight); diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/common/src/main/ets/default/abilitymanager/abilityManager.ts index 8178f346..b2441693 100644 --- a/common/src/main/ets/default/abilitymanager/abilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/abilityManager.ts @@ -30,12 +30,12 @@ export default class AbilityManager { static ABILITY_NAME_SCREEN_LOCK = 'SystemUi_ScreenLock'; static setContext(abilityName: string, context) { - Log.showInfo(TAG, `setContext, abilityName: ${abilityName}`); + Log.showDebug(TAG, `setContext, abilityName: ${abilityName}`); globalThis[abilityName + '_Context'] = context; } static getContext(abilityName?: string) { - Log.showInfo(TAG, `getContext, abilityName: ${abilityName}`); + Log.showDebug(TAG, `getContext, abilityName: ${abilityName}`); if (!abilityName) { abilityName = AbilityManager.ABILITY_NAME_ENTRY; } @@ -43,17 +43,17 @@ export default class AbilityManager { } static setAbilityData(abilityName, key, data) { - Log.showInfo(TAG, `setAbilityData, abilityName: ${abilityName} key: ${key} data: ${JSON.stringify(data)}`); + Log.showDebug(TAG, `setAbilityData, abilityName: ${abilityName} key: ${key} data: ${JSON.stringify(data)}`); globalThis[abilityName + '_data_' + key] = data; } static getAbilityData(abilityName, key) { - Log.showInfo(TAG, `getAbilityData, abilityName: ${abilityName} key: ${key} `); + Log.showDebug(TAG, `getAbilityData, abilityName: ${abilityName} key: ${key} `); return globalThis[abilityName + '_data_' + key]; } static startAbility(want, callback?: Function) { - Log.showInfo(TAG, `startAbility, want: ${JSON.stringify(want)}`); + Log.showDebug(TAG, `startAbility, want: ${JSON.stringify(want)}`); let context = AbilityManager.getContext(); context.startAbility(want).then(() => { Log.showInfo(TAG, `startAbility, then`); @@ -61,7 +61,7 @@ export default class AbilityManager { callback(null); } }).catch((error) => { - Log.showInfo(TAG, `startAbility, error: ${JSON.stringify(error)}`); + Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); callback(error); }) } diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ts b/common/src/main/ets/default/abilitymanager/bundleManager.ts index b38fdc5b..d4d55de0 100644 --- a/common/src/main/ets/default/abilitymanager/bundleManager.ts +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ts @@ -23,7 +23,7 @@ const TAG = "BRManager"; export default class BundleManager { static async getResourceManager(tag: string, context: Context, bundleName: string) { Log.showInfo(TAG, `getResourceManager from: ${tag}`); - let bundleContext = await context.createBundleContext(bundleName); + let bundleContext = await context.createBundleContext(bundleName) return await bundleContext.resourceManager; } @@ -32,7 +32,7 @@ export default class BundleManager { let userInfo = { userId: requestId ?? (await SwitchUserManager.getInstance().getCurrentUserInfo()).userId, }; - Log.showInfo(TAG, `getBundleInfo from: ${tag}, userId: ${userInfo.userId}`); + Log.showDebug(TAG, `getBundleInfo from: ${tag}, userId: ${userInfo.userId}`); return await BundleMgr.getBundleInfo(bundleName, getInfo, userInfo); } } \ No newline at end of file diff --git a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts index 876cd06f..90a33a51 100644 --- a/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/featureAbilityManager.ts @@ -21,18 +21,17 @@ const TAG = 'FeatureAbilityManager'; export default class FeatureAbilityManager { openAbility(tag, want) { - Log.showInfo(TAG, `openAbility from: ${tag}`)); + Log.showInfo(TAG, `openAbility from: ${tag}`); let result = FeatureAbility.startAbility(want) .then(data => Log.showInfo(TAG, `tag: ${tag} promise then: ${JSON.stringify(data)}`)) .catch(error => - Log.showError(TAG, `tag: ${tag} promise catch: ${JSON.stringify(error)}`)); - Log.showInfo(TAG, `tag: ${tag} openAbility result: ${result}`); + Log.showError(TAG, `tag: ${tag} promise catch: ${JSON.stringify(error)}, openAbility result: ${result}`)); } getAbilityWant(listener) { FeatureAbility.getWant((err, data) => { - Log.showInfo(TAG, `getAbilityWant callBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + Log.showDebug(TAG, `getAbilityWant callBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); if (err.code !== 0) { Log.showError(TAG, `failed to getAbilityWant because ${err.message}`); return; @@ -60,7 +59,7 @@ export default class FeatureAbilityManager { Log.showError(TAG, `failed to finishAbility because ${JSON.stringify(err)}`); return; } - Log.showInfo(TAG, ` finishAbility callback err: ${JSON.stringify(err)} data:${data}`); + Log.showInfo(TAG, ` finishAbility callback: data:${data}`); }); } } \ No newline at end of file diff --git a/common/src/main/ets/default/commonEvent/CommonEventManager.ts b/common/src/main/ets/default/commonEvent/CommonEventManager.ts index bdd974a7..1f9b048c 100644 --- a/common/src/main/ets/default/commonEvent/CommonEventManager.ts +++ b/common/src/main/ets/default/commonEvent/CommonEventManager.ts @@ -48,7 +48,7 @@ export function getCommonEventManager( let policyClearCb: Map | undefined = undefined; async function subscriberCommonEvent() { - Log.showInfo(TAG, "registerSubscriber start"); + Log.showDebug(TAG, "registerSubscriber start"); let subscriber = await commonEvent.createSubscriber(SUBSCRIBE_INFOS); commonEvent.subscribe(subscriber, (err, data) => { if (err.code != 0) { @@ -64,7 +64,7 @@ export function getCommonEventManager( } function unSubscriberCommonEvent() { - Log.showInfo(TAG, `UnSubcribers size: ${unSubcribers.length}`); + Log.showDebug(TAG, `UnSubcribers size: ${unSubcribers.length}`); unSubcribers.forEach((unsubscribe) => unsubscribe()); unSubcribers.length = 0; subscribeStateChange && subscribeStateChange(false); @@ -76,7 +76,7 @@ export function getCommonEventManager( policys.forEach((policy) => { if (policyClearCb) { !policyClearCb.has(policy) && policyClearCb.set(policy, policyMap[policy](innerManager)); - Log.showInfo(TAG, `apply policy: ${policy}`); + Log.showDebug(TAG, `apply policy: ${policy}`); } }); } diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts index 90a4642e..cdaa845c 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -32,7 +32,7 @@ const SUBSCRIBE_INFO = { }; function getChargingStatus(state: typeof BatteryInfo.BatteryChargeState): boolean { - Log.showInfo(TAG, `charging status update: ${state}`); + Log.showDebug(TAG, `charging status update: ${state}`); let batteryStatus = false; switch (state) { case BatteryInfo.BatteryChargeState.DISABLE: @@ -62,7 +62,7 @@ export class BatteryModel { () => this.updateBatteryStatus(), (isSubscribe: boolean) => isSubscribe && this.updateBatteryStatus() ); - Log.showInfo(TAG, "initBatteryModel"); + Log.showDebug(TAG, "initBatteryModel"); this.mBatterySoc = AppStorage.SetAndLink("batterySoc", 0); this.mBatteryCharging = AppStorage.SetAndLink("batteryCharging", false); this.mManager.subscriberCommonEvent(); @@ -70,7 +70,7 @@ export class BatteryModel { } unInitBatteryModel() { - Log.showInfo(TAG, "unInitBatteryModel"); + Log.showDebug(TAG, "unInitBatteryModel"); this.mManager?.release(); this.mManager = undefined; } @@ -79,7 +79,7 @@ export class BatteryModel { * Get battery status and remaining power */ private updateBatteryStatus() { - Log.showInfo(TAG, "updateBatteryStatus"); + Log.showDebug(TAG, "updateBatteryStatus"); let batterySoc = BatteryInfo.batterySOC ?? DEFAULT_PROGRESS; let batteryCharging = BatteryInfo.chargingStatus; if (batterySoc <= 0) { diff --git a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts index 23be8d20..1954fe05 100644 --- a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -14,7 +14,7 @@ */ import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; -import Constants from './Constants' +import Constants from './constants' const TAG = 'battery-StyleConfiguration'; diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index 83fb2e66..dcbc9d7d 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -22,7 +22,7 @@ import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/d import StyleConfiguration from '../common/StyleConfiguration' import { StatusBarGroupComponentData } from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' -import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vM/StatusBarVM' +import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vm/StatusBarVM' const TAG = 'BatteryComponent-batteryIcon' diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets index bd675b20..bbfba299 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -72,7 +72,7 @@ struct BatteryPic { } private getBatteryColor(val, charging) { - Log.showInfo(TAG, `getBatteryColor, val: ${ val } charging: ${ charging } `); + Log.showDebug(TAG, `getBatteryColor, val: ${ val } charging: ${ charging } `); if (charging) { return this.style.picChargingColor; } else if (val <= Constants.BATTERY_LEVEL_LOW) { diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index 02b69ee9..563133fa 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log' -import StyleConfiguration from '../common/styleconfiguration' +import StyleConfiguration from '../common/StyleConfiguration' import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' import { StatusBarGroupComponentData } from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vm/StatusBarVM' diff --git a/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts b/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts index f885a794..75e7d113 100644 --- a/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts +++ b/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts @@ -44,40 +44,40 @@ export default class DateTimeViewModel { unSubscriber?: unsubscribe; ViewModelInit(): void{ - Log.showInfo(TAG, 'ViewModelInit'); + Log.showDebug(TAG, 'ViewModelInit'); this.getAndSetDateTime.bind(this)() commonEvent.createSubscriber(mCommonEventSubscribeInfo, this.createSubscriberCallBack.bind(this)); this.unSubscriber = EventManager.subscribe(TIME_CHANGE_EVENT, (args: TimeEventArgs) => { this.setDateTime(args.date) }); - Log.showInfo(TAG, 'ViewModelInit end'); + Log.showDebug(TAG, 'ViewModelInit end'); } private getAndSetDateTime() { - Log.showInfo(TAG, `getAndSetDateTime`) + Log.showDebug(TAG, `getAndSetDateTime`) this.setDateTime(new Date()) } private setDateTime(date: Date) { - Log.showInfo(TAG, `setDateTime`) + Log.showDebug(TAG, `setDateTime`) this.timeVal = sTimeManager.formatTime(date) this.dateVal = DateTimeCommon.getSystemDate() this.weekVal = DateTimeCommon.getSystemWeek() } private createSubscriberCallBack(err, data) { - Log.showInfo(TAG, "start createSubscriberCallBack " + JSON.stringify(data)) + Log.showDebug(TAG, "start createSubscriberCallBack " + JSON.stringify(data)) mEventSubscriber = data commonEvent.subscribe(data, this.getAndSetDateTime.bind(this)); - Log.showInfo(TAG, "start createSubscriberCallBack finish") + Log.showDebug(TAG, "start createSubscriberCallBack finish") } stopPolling() { - Log.showInfo(TAG, `stopPolling start`) + Log.showDebug(TAG, `stopPolling start`) commonEvent.unsubscribe(mEventSubscriber); this.unSubscriber && this.unSubscriber(); this.unSubscriber = undefined; - Log.showInfo(TAG, `stopPolling end`) + Log.showDebug(TAG, `stopPolling end`) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts index 29953759..c14bf865 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -27,9 +27,9 @@ const DEFAULT_INFO = { export default class CommonUtil { static startWant(want, triggerInfo?: any) { let info = (triggerInfo) ? triggerInfo : DEFAULT_INFO; - Log.showInfo(TAG, `startWant ${JSON.stringify(want)}, info ${JSON.stringify(info)}`); + Log.showDebug(TAG, `startWant ${JSON.stringify(want)}, info ${JSON.stringify(info)}`); WantAgent.trigger(want, info, ((err, data) => { - Log.showInfo(TAG, `wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); + Log.showDebug(TAG, `wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); })); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts index a2eea8fd..eb2b491c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts @@ -20,23 +20,23 @@ export default class ScrollbarManager { static NotificationScrollBar = new Set(); static add(scroller) { - Log.showInfo(TAG, `add`); + Log.showDebug(TAG, `add`); let res = ScrollbarManager.NotificationScrollBar.add(scroller); - Log.showInfo(TAG, `add set's size:${res.size}`); + Log.showDebug(TAG, `add set's size:${res.size}`); } static delete(scroller) { - Log.showInfo(TAG, `delete`); + Log.showDebug(TAG, `delete`); ScrollbarManager.NotificationScrollBar.delete(scroller); } static clear() { - Log.showInfo(TAG, `clear`); + Log.showDebug(TAG, `clear`); ScrollbarManager.NotificationScrollBar.clear(); } static restoreOtherScroll(scroller) { - Log.showInfo(TAG, `restoreOtherScroll`); + Log.showDebug(TAG, `restoreOtherScroll`); if (scroller.currentOffset().xOffset > 0) { ScrollbarManager.NotificationScrollBar.forEach((item) => { if (item !== scroller && item.currentOffset().xOffset > 0) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts index f2c94c4f..174954e4 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts @@ -27,39 +27,38 @@ export default class NotificationDistributionManager { static getInstance() { Log.showInfo(TAG, `getInstance`); if (distributionManager == null) { - Log.showInfo(TAG, `getInstance distributionManager new`); + Log.showDebug(TAG, `getInstance distributionManager new`); distributionManager = new NotificationDistributionManager(); distributionManager.initDeviceManager(); return distributionManager; } - Log.showInfo(TAG, `getInstance return distributionManager`); + Log.showDebug(TAG, `getInstance return distributionManager`); return distributionManager; } constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); } initDeviceManager() { Log.showInfo(TAG, `initDeviceManager`); DeviceManager.createDeviceManager("com.ohos.systemui", (err, data) => { if (err) { - console.info("createDeviceManager err:" + JSON.stringify(err)); + Log.showError(TAG, `createDeviceManager err: ${JSON.stringify(err)}`); return; } - console.info("createDeviceManager success"); + Log.showInfo(TAG, "createDeviceManager success"); this.deviceManager = data; }); } getTrustedDeviceDeviceName(deviceId) { - Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceId:${deviceId}`); + Log.showDebug(TAG, `getTrustedDeviceDeviceName deviceId:${deviceId}`); let deviceName = ''; let deviceArr:any[] = this.getTrustedDeviceListSync(); - Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceArr:${JSON.stringify(deviceArr)}`); + Log.showDebug(TAG, `getTrustedDeviceDeviceName deviceArr:${deviceArr.length}`); if (deviceArr && deviceArr.length > 0) { for (let item of deviceArr) { - Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceArr item:${JSON.stringify(item)}`); if (item.deviceId == deviceId) { deviceName = item.deviceName; break; @@ -70,12 +69,12 @@ export default class NotificationDistributionManager { } getTrustedDeviceListSync(): Array{ - Log.showInfo(TAG, `getTrustedDeviceListSync`); + Log.showDebug(TAG, `getTrustedDeviceListSync`); return this.deviceManager.getTrustedDeviceListSync(); } getLocalDeviceInfoSync() { - Log.showInfo(TAG, `getLocalDeviceInfoSync`); + Log.showDebug(TAG, `getLocalDeviceInfoSync`); return this.deviceManager.getLocalDeviceInfoSync(); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index 8d77e847..21876f5d 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -117,14 +117,13 @@ export default class NotificationManager { jsonPath: templatePath }; - Log.showInfo(TAG, `requestTemplate requestParam: ${JSON.stringify(requestParam)}`) + Log.showDebug(TAG, `requestTemplate requestParam: ${JSON.stringify(requestParam)}`) NotificationManager.request(tag, requestParam, (err, data) => { - Log.showInfo(TAG, `request finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) - Log.showInfo(TAG, `request finished templateData: ${templateName} data: ${JSON.stringify(data.componentTemplate)}`) + Log.showDebug(TAG, `request finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) if (data !== null && data !== undefined) { - Log.showInfo(TAG, `request finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`) let templates = JSON.parse(data.componentTemplate.source); - Log.showInfo(TAG, `request templates: ${JSON.stringify(templates)}`) + Log.showDebug(TAG, `request data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`+ + `templates: ${JSON.stringify(templates)}`) for (let key in templates) { NotificationManager.NotificationTemplateMap.set(key, { "source": templates[key], "ability": "" @@ -146,18 +145,18 @@ export default class NotificationManager { name: DEBUG_TEMPLATE_NAME, data: reqData }; - Log.showInfo(TAG, `requestDebugTemplate requestParam: ${JSON.stringify(requestParam)}`); + Log.showDebug(TAG, `requestDebugTemplate requestParam: ${JSON.stringify(requestParam)}`); NotificationManager.request(tag, requestParam, (err, data) => { - Log.showInfo(TAG, `requestDebugTemplate finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) + Log.showDebug(TAG, `requestDebugTemplate finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`) if (!!data) { - Log.showInfo(TAG, `requestDebugTemplate finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`) + Log.showDebug(TAG, `requestDebugTemplate finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`) NotificationManager.NotificationTemplateMap.set(DEBUG_TEMPLATE_NAME, data.componentTemplate); } }); } static isDebugMode(tag): boolean{ - Log.showInfo(TAG, `isDebugMode from: ${tag}`); + Log.showDebug(TAG, `isDebugMode from: ${tag}`); let debug = Systemparameter.getSync(DEBUG_SETTING_KEY, "") Log.showInfo(TAG, `Systemparameter DEBUG_SETTING: ${debug}`); return!!debug; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts index 5c379faa..48b94f05 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts @@ -25,7 +25,7 @@ class NotificationWindowManager { } hideNotificationWindow() { - Log.showInfo(TAG, 'hide Notification window'); + Log.showDebug(TAG, 'hide Notification window'); EventManager.publish(obtainLocalEvent('hideNotificationWindowEvent', '')); } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index 499e2ca0..c827d913 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -39,8 +39,11 @@ type NotificationContent = { } async function getUserId(uid) { - let userId = await AccountManager.getAccountManager().getOsAccountLocalIdFromUid(uid); - Log.showInfo(TAG, `getOsAccountLocalIdFromUid uid = ${uid}, userId = ${userId}`); + let userId = await AccountManager.getAccountManager().getOsAccountLocalIdFromUid(uid) + .catch((err)=>{ + Log.showError(TAG, `getOsAccountLocalIdFromUid error error: ${JSON.stringify(err)}`); + }) + Log.showDebug(TAG, `getOsAccountLocalIdFromUid uid = ${uid}, userId = ${userId}`); return userId; } @@ -53,8 +56,8 @@ export default class ParseDataUtil { if (!request) { return Promise.reject('consumeCallback request is empty'); } - Log.showInfo(TAG, `parse data start, want = ${JSON.stringify(request.wantAgent)}`); - Log.showInfo(TAG, `actionButtons = ${JSON.stringify(request.actionButtons)}`); + Log.showDebug(TAG, `parse data start, want = ${JSON.stringify(request.wantAgent)}`+ + `actionButtons = ${JSON.stringify(request.actionButtons)}`); let userId = await getUserId(request.creatorUid); let appMessage = await ParseDataUtil.getAppData(request.creatorBundleName, userId); let notificationItem: NotificationItemData = { @@ -84,7 +87,7 @@ export default class ParseDataUtil { deviceId: request.deviceId, groupName: request.groupName??request.hashcode }; - Log.showInfo(TAG, `notificationItem construct over ====================`); + Log.showDebug(TAG, `notificationItem construct over`); notificationItem = { ...notificationItem, ...ParseDataUtil.getContentByType(request?.content?.contentType, request) } @@ -98,9 +101,9 @@ export default class ParseDataUtil { * @return {object} appData */ static async getAppData(bundleName, userId) { - Log.showInfo(TAG, `getAppName start by ${bundleName}`); + Log.showDebug(TAG, `getAppName start by ${bundleName}`); if (appDataMap.has(bundleName)) { - Log.showInfo(TAG, `getAppData success.`); + Log.showDebug(TAG, `getAppData success.`); return appDataMap.get(bundleName); } let data = await BundleManager.getBundleInfo(TAG, bundleName, 0, userId); @@ -167,10 +170,10 @@ export default class ParseDataUtil { ['expandedTitle', ''], ['picture', '']], request.content.picture) break; default: - Log.showInfo(TAG, 'no match content type'); + Log.showDebug(TAG, 'no match content type'); break; } - Log.showInfo(TAG, `notificationType = ${notificationType}, content = ${JSON.stringify(content)}`); + Log.showDebug(TAG, `notificationType = ${notificationType}, content = ${JSON.stringify(content)}`); return content } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts index 5a0902fa..6a517ff9 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts @@ -30,18 +30,18 @@ export class RuleController { * @param {callback} Data of the type to show the notification */ getNotificationData(notificationItemData: NotificationItemData, callback) { - Log.showInfo(TAG, "getNotificationData start") + Log.showDebug(TAG, "getNotificationData start") this.isAllowSendNotification(notificationItemData, (isSuccess) => { if (!isSuccess) { - Log.showInfo(TAG, "user is not allow this to send notification"); + Log.showDebug(TAG, "user is not allow this to send notification"); callback(undefined); return; } this.getNotificationDataByApp(notificationItemData, (originalData) => { - Log.showInfo(TAG, `originalData = ${JSON.stringify(originalData)}`); + Log.showDebug(TAG, `originalData = ${JSON.stringify(originalData)}`); this.updateNotificationDataBySense(originalData, (finalData) => { - Log.showInfo(TAG, `finalData = ${JSON.stringify(finalData)}`); + Log.showDebug(TAG, `finalData = ${JSON.stringify(finalData)}`); callback(finalData); }); }); @@ -55,7 +55,7 @@ export class RuleController { * @param {callback} The user allow the app send notification or not */ isAllowSendNotification(notificationItemData, callback) { - Log.showInfo(TAG, "isAllowSendNotification start"); + Log.showDebug(TAG, "isAllowSendNotification start"); Notification.isNotificationEnabled({ bundle: notificationItemData.bundleName, uid: notificationItemData.uid }) .then((flag) => { Log.showInfo(TAG, `Notification.isNotificationEnabled:` + flag) @@ -71,16 +71,16 @@ export class RuleController { */ SoundOrVibrate(notificationItemData, callback) { - Log.showInfo(TAG, "SoundOrVibrate start") + Log.showDebug(TAG, "SoundOrVibrate start") let sound = false; let vibrationValues = false; if (!CheckEmptyUtils.checkStrIsEmpty(notificationItemData.sound)) { sound = true; - Log.showInfo(TAG, `notificationItemData.sound is allowed = ${sound}`); + Log.showDebug(TAG, `notificationItemData.sound is allowed = ${sound}`); } if (!CheckEmptyUtils.isEmptyArr(notificationItemData.vibrationValues)) { vibrationValues = true; - Log.showInfo(TAG, `notificationItemData.vibrationValues is allowed = ${vibrationValues}`); + Log.showDebug(TAG, `notificationItemData.vibrationValues is allowed = ${vibrationValues}`); } callback(sound, vibrationValues); } @@ -93,7 +93,7 @@ export class RuleController { * @param {callback} The type to show notification */ getNotificationDataByApp(notificationItemData, callback) { - Log.showInfo(TAG, "getNotificationDataByApp start") + Log.showDebug(TAG, "getNotificationDataByApp start") let mNotificationItemData : NotificationItemData = notificationItemData; mNotificationItemData.ruleData = { isAllowBanner: false, @@ -102,7 +102,7 @@ export class RuleController { isAllowStatusBarShow : false, isAllowNotificationListShow : false }; - Log.showInfo(TAG, `notificationItemData.slotLevel = ${notificationItemData.slotLevel}`); + Log.showDebug(TAG, `notificationItemData.slotLevel = ${notificationItemData.slotLevel}`); if (notificationItemData.slotLevel === SlotLevel.LEVEL_HIGH) { mNotificationItemData.ruleData.isAllowBanner = true; this.SoundOrVibrate(notificationItemData, (sound, vibrationValues) => { @@ -125,7 +125,7 @@ export class RuleController { } else { mNotificationItemData.ruleData.isAllowNotificationListShow = false; } - Log.showInfo(TAG, `mNotificationItemData.ruleData = ${JSON.stringify(mNotificationItemData.ruleData)}`); + Log.showDebug(TAG, `mNotificationItemData.ruleData = ${JSON.stringify(mNotificationItemData.ruleData)}`); callback(mNotificationItemData); } @@ -138,7 +138,7 @@ export class RuleController { * @param {callback} The final notification data */ updateNotificationDataBySense(notificationItemData, callback) { - Log.showInfo(TAG, "updateNotificationDataBySense start") + Log.showDebug(TAG, "updateNotificationDataBySense start") let mNotificationItemData = notificationItemData; callback(mNotificationItemData); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index d205b9b4..274238c0 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -120,7 +120,7 @@ export default struct BannerNotificationItem { }) .onClick(this.showDevicesDialog.bind(this)) .onAreaChange((e, e2) => { - Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + Log.showDebug(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); let heightEx = parseInt(e['height']); let heightCur = parseInt(e2['height']); let heightWin = parseInt(this.mDefaultBannerRect['height']); @@ -154,12 +154,12 @@ export default struct BannerNotificationItem { } isCreateNewNotification(notificationCount:number):boolean{ - Log.showInfo(TAG, `isCreateNewNotification, notificationCount: ${notificationCount}`); + Log.showDebug(TAG, `isCreateNewNotification, notificationCount: ${notificationCount}`); return true; } hideWindowForTimeout() { - Log.showInfo(TAG, `check need hide window or not.`) + Log.showDebug(TAG, `check need hide window or not.`) if ((new Date()).getTime() - this.mLastActionTime >= this.mInterval) { if (this.mCloseEnableFlg) { this.mLastActionTime = (new Date()).getTime(); @@ -177,12 +177,12 @@ export default struct BannerNotificationItem { } clickCloseIcon() { - Log.showInfo(TAG, 'clickCloseIcon'); + Log.showDebug(TAG, 'clickCloseIcon'); this.onBannerNoticeHide(); } showDevicesDialog() { - Log.showInfo(TAG, `showDevicesDialog`) + Log.showDebug(TAG, `showDevicesDialog`) if (!this.want?.distributedOption?.isDistributed) { ViewModel.clickItem(this.want); this.onBannerNoticeHide(); @@ -203,7 +203,7 @@ export default struct BannerNotificationItem { } selectedDevice(deviceID) { - Log.showInfo(TAG, `selectedDevice deviceID:${deviceID}`) + Log.showDebug(TAG, `selectedDevice deviceID:${deviceID}`) this.nowWant.deviceId = deviceID; let triggerInfo = { code: 0, @@ -229,8 +229,7 @@ struct ContentComponent { itemData: any; aboutToAppear() { - Log.showInfo(TAG, `aboutToDisappear pict: ${this.itemData.picture}`); - Log.showInfo(TAG, `NotificationItemData: ${JSON.stringify(this.itemData)}`) + Log.showDebug(TAG, `NotificationItemData: ${JSON.stringify(this.itemData)}`) } build() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets index 3b64ac37..b52144d1 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -64,7 +64,7 @@ export default struct ConfirmDialog { .fontSize($r('app.float.confirm_cont_fontsize')) .fontColor(Color.Red) }.onClick(() => { - Log.showInfo(TAG, `confirm button of TimeDialog on click`) + Log.showDebug(TAG, `confirm button of TimeDialog on click`) this.controller.close(); this.action(); }) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets index 2f58674e..828684da 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -33,9 +33,9 @@ export default struct CustomItem { this.template = ViewModel.getPluginTempLate(this.customItemData.template.name); this.templateData = this.customItemData.template.data; this.isDebugMode = NotificationManager.isDebugMode(TAG); - Log.showInfo(TAG, `template = ${JSON.stringify(this.template)}`) - Log.showInfo(TAG, `templateData = ${JSON.stringify(this.templateData)}`) - Log.showInfo(TAG, `isDebugMode = ${this.isDebugMode}`) + Log.showInfo(TAG, `template = ${JSON.stringify(this.template)},`+ + `templateData = ${JSON.stringify(this.templateData)}` + + `isDebugMode = ${this.isDebugMode}`) } build() { @@ -47,7 +47,7 @@ export default struct CustomItem { }).onComplete(() => { Log.showInfo(TAG, `Complete`) }).onError(({errcode, msg}) => { - Log.showInfo(TAG, `Error code:${errcode} message:${msg}`) + Log.showError(TAG, `Error code:${errcode} message:${msg}`) }) .size({ width: 400, height: 130 }) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets index ef91bbef..00611e02 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/devicesDialog.ets @@ -86,6 +86,6 @@ export default struct DevicesDialog { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) this.deviceInfoList = DistributionManager.getInstance().getTrustedDeviceListSync(); - Log.showInfo(TAG, `aboutToAppear deviceInfoList:${JSON.stringify(this.deviceInfoList)}`) + Log.showDebug(TAG, `aboutToAppear deviceInfoList size: ${this.deviceInfoList.length}`) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index 2374770f..8f3d3554 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -102,7 +102,7 @@ struct ContentComponent { itemData: any; aboutToAppear() { - Log.showInfo(TAG, `aboutToDisappear pict: ${this.itemData.picture}`); + Log.showInfo(TAG, `aboutToDisappear`); } build() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 5e894951..f05f23c2 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -188,6 +188,6 @@ struct ContentList { remainderChange() { this.remainderNum = this.groupData.length - 2; - Log.showInfo(TAG, `aboutToAppear remainderNum:${this.remainderNum}`) + Log.showDebug(TAG, `aboutToAppear remainderNum:${this.remainderNum}`) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets index f4bf5289..179cf1ba 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -64,17 +64,17 @@ export default struct IconListComponent { { src: $r("app.media.ic_public_settings_filled"), callback: () => { - Log.showInfo(TAG, `click settings hashcode: ${this.itemData?.hashcode}`); + Log.showDebug(TAG, `click settings hashcode: ${this.itemData?.hashcode}`); this.settingDialogController.open() } }, { src: $r("app.media.ic_public_delete_filled"), callback: () => { if (!this.isGroup) { - Log.showInfo(TAG, `click delete hashcode: ${this.itemData?.hashcode}`); + Log.showDebug(TAG, `click delete hashcode: ${this.itemData?.hashcode}`); ViewModel.removeNotificationItem(this.itemData, true) } else { - Log.showInfo(TAG, `click delete groupName: ${this.itemData?.groupName}`); + Log.showDebug(TAG, `click delete groupName: ${this.itemData?.groupName}`); ViewModel.removeGroupNotification(this.itemData, true) } } @@ -82,7 +82,7 @@ export default struct IconListComponent { ] aboutToAppear() { - Log.showInfo(TAG, `iconConfigs: ${JSON.stringify(this.iconConfigs)}`) + Log.showInfo(TAG, `aboutToAppear iconConfigs: ${JSON.stringify(this.iconConfigs)}`) iconSize = this.iconConfigs.length; } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index e3ef3156..5c7c157f 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -93,7 +93,7 @@ struct FrontItem { } showDevicesDialog() { - Log.showInfo(TAG, `showDevicesDialog isDistributed: ${this.itemData?.distributedOption?.isDistributed}`) + Log.showDebug(TAG, `showDevicesDialog isDistributed: ${this.itemData?.distributedOption?.isDistributed}`) if (!this.itemData?.distributedOption?.isDistributed) { ViewModel.clickItem(this.itemData); return; @@ -102,7 +102,7 @@ struct FrontItem { if (!!wantAgent) { WantAgent.getWant(wantAgent).then((want) => { this.nowWant = want - Log.showInfo(TAG, `showDevicesDialog want: ${JSON.stringify(this.nowWant)}`) + Log.showDebug(TAG, `showDevicesDialog want: ${JSON.stringify(this.nowWant)}`) if (!want?.deviceId) { this.devicesDialogController.open() } else { @@ -115,7 +115,7 @@ struct FrontItem { } selectedDevice(deviceID) { - Log.showInfo(TAG, `selectedDevice deviceID:${deviceID}`) + Log.showDebug(TAG, `selectedDevice deviceID:${deviceID}`) this.nowWant.deviceId = deviceID; let triggerInfo = { code: 0, diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets index 82569697..563ede0c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -113,14 +113,14 @@ export default struct SettingDialog { } openAbility() { - Log.showInfo(TAG, ` openAbility:showNotificationManagement`) + Log.showDebug(TAG, ` openAbility:showNotificationManagement`) EventManager.publish(obtainStartAbility('com.ohos.systemui', 'com.ohos.systemui.notificationmanagement.MainAbility', { 'migrateUri': 'pages/setEnable', 'migrateBundle': this.itemData.bundleName })) this.closeAbility() } closeAbility() { - Log.showInfo(TAG, `closeAbility`) + Log.showDebug(TAG, `closeAbility`) this.controller.close() } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index 888d1695..c2ad0471 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -41,7 +41,7 @@ export class ViewModel { mNotificationCtrl: any = {}; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showDebug(TAG, `constructor`); this.mNotificationList = []; this.audioPlayer = media.createAudioPlayer(); // this.audioPlayer.src = 'file://system/etc/capture.ogg'; @@ -67,7 +67,7 @@ export class ViewModel { } userChange(userInfo) { - Log.showInfo(TAG, `UserChange, userInfo: ${JSON.stringify(userInfo)}`); + Log.showDebug(TAG, `UserChange, userInfo: ${JSON.stringify(userInfo)}`); this.unregisterCallback(); this.mNotificationList.length = 0; this.initFlowControlInfos(); @@ -83,11 +83,11 @@ export class ViewModel { */ onNotificationConsume(notificationItemData) { if (notificationItemData === undefined) { - Log.showInfo(TAG, `onNotificationConsume notificationItemData is undefined`); + Log.showDebug(TAG, `onNotificationConsume notificationItemData is undefined`); return; } this.onNotificationCancel(notificationItemData.hashcode) - Log.showInfo(TAG, `onNotificationConsume ${JSON.stringify(notificationItemData)}`); + Log.showDebug(TAG, `onNotificationConsume ${JSON.stringify(notificationItemData)}`); //Verify the notifications can be displayed if (!this.isCanShow(notificationItemData.bundleName)) { //can not displayed @@ -98,9 +98,9 @@ export class ViewModel { } if (notificationItemData.ruleData.isAllowNotificationListShow) { this.mNotificationList.unshift(notificationItemData); - Log.showInfo(TAG, `reminder start `); + Log.showDebug(TAG, `reminder start `); this.reminderWay(notificationItemData); - Log.showInfo(TAG, `reminder end `); + Log.showDebug(TAG, `reminder end `); this.updateFlowControlInfos(notificationItemData.bundleName, true) } this.updateNotification(); @@ -110,13 +110,12 @@ export class ViewModel { * notification CancelCallback */ onNotificationCancel(hashCode: string) { - Log.showInfo(TAG, `onNotificationCancel hashCode: ${JSON.stringify(hashCode)}`); + Log.showDebug(TAG, `onNotificationCancel hashCode: ${hashCode}`); // Common Notification Deletion Logic Processing for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].hashcode == hashCode) { - Log.showInfo(TAG, `removeNotificationItem i = ${i}`); let removeItemArr = this.mNotificationList.splice(i, 1); - Log.showInfo(TAG, `onNotificationCancel removeItemArr= ${JSON.stringify(removeItemArr)}`); + Log.showDebug(TAG, `onNotificationCancel removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { this.updateFlowControlInfos(removeItemArr[0].bundleName, false) } @@ -127,15 +126,14 @@ export class ViewModel { } updateNotification() { - Log.showInfo(TAG, `updateNotification list: ${JSON.stringify(this.mNotificationList)}`); - Log.showInfo(TAG, `updateNotification length: ${this.mNotificationList.length}`); + Log.showDebug(TAG, `updateNotification length: ${this.mNotificationList.length}`); this.sortNotification() let notificationList = this.groupByGroupName(); AppStorage.SetOrCreate('notificationList', notificationList); } groupByGroupName(): any[]{ - Log.showInfo(TAG, `groupByGroupName`); + Log.showDebug(TAG, `groupByGroupName`); if (!this.mNotificationList || this.mNotificationList.length < 1) { return []; } @@ -143,14 +141,14 @@ export class ViewModel { let groups = {}; this.mNotificationList.forEach((item) => { const groupName = `${item.bundleName}_${item.groupName}`; - Log.showInfo(TAG, `groupByGroupName groupName:${groupName}`); + Log.showDebug(TAG, `groupByGroupName groupName:${groupName}`); if (!groups[groupName] || groups[groupName].length < 1) { groups[groupName] = []; groupArr.push(groups[groupName]); } groups[groupName].push(item) }) - Log.showInfo(TAG, `groupByGroupName groupArr:${JSON.stringify(groupArr)}`); + Log.showDebug(TAG, `groupByGroupName groupArr:${JSON.stringify(groupArr)}`); return groupArr; } @@ -159,7 +157,7 @@ export class ViewModel { * Sort the notifications. */ sortNotification() { - Log.showInfo(TAG, `sortNotification`); + Log.showDebug(TAG, `sortNotification`); if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { return } @@ -184,24 +182,24 @@ export class ViewModel { * Remove all notifications. */ removeAllNotifications() { - Log.showInfo(TAG, `removeAllNotifications`); + Log.showDebug(TAG, `removeAllNotifications`); if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { this.mNotificationList = [] } else { let index = this.mNotificationList.length while (index--) { - Log.showInfo(TAG, `removeAllNotifications isRemoveAllowed: ${index} ${this.mNotificationList[index].isRemoveAllowed} `); - Log.showInfo(TAG, `removeAllNotifications isOngoing: ${index} ${this.mNotificationList[index].isOngoing} `); - Log.showInfo(TAG, `removeAllNotifications isUnremovable: ${index} ${this.mNotificationList[index].isUnremovable} `); + Log.showDebug(TAG, `removeAllNotifications isRemoveAllowed: ${index} ${this.mNotificationList[index].isRemoveAllowed} `); + Log.showDebug(TAG, `removeAllNotifications `); + Log.showDebug(TAG, `removeAllNotifications isUnremovable: ${index} ${this.mNotificationList[index].isUnremovable} `); //Except the Long term notifications if (this.mNotificationList[index].isRemoveAllowed && !this.mNotificationList[index].isOngoing && !this.mNotificationList[index].isUnremovable) { - Log.showInfo(TAG, `mNotificationList[${index}].hashcode: ${this.mNotificationList[index].hashcode}`); + Log.showDebug(TAG, `mNotificationList[${index}].hashcode: ${this.mNotificationList[index].hashcode}`); let hashCode = this.mNotificationList[index].hashcode this.removeSysNotificationItem(hashCode) let removeItemArr = this.mNotificationList.splice(index, 1) - Log.showInfo(TAG, `removeAllNotifications removeItemArr= ${JSON.stringify(removeItemArr)}`); + Log.showDebug(TAG, `removeAllNotifications removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { this.updateFlowControlInfos(removeItemArr[0].bundleName, false) } @@ -212,12 +210,12 @@ export class ViewModel { } removeNotificationItem(itemData, isDelSysConent) { - Log.showInfo(TAG, `removeNotificationItem, hashcode: ${itemData.hashcode}`); + Log.showDebug(TAG, `removeNotificationItem, hashcode: ${itemData.hashcode}`); for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].hashcode == itemData.hashcode) { - Log.showInfo(TAG, `removeNotificationItem i = ${i}`); + Log.showDebug(TAG, `removeNotificationItem i = ${i}`); let removeItemArr = this.mNotificationList.splice(i, 1); - Log.showInfo(TAG, `removeNotificationItem removeItemArr= ${JSON.stringify(removeItemArr)}`); + Log.showDebug(TAG, `removeNotificationItem removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { this.updateFlowControlInfos(removeItemArr[0].bundleName, false) } @@ -232,15 +230,15 @@ export class ViewModel { } removeGroupNotification(itemData, isDelSysConent) { - Log.showInfo(TAG, `removeGroupNotification, groupName: ${itemData.groupName}`); + Log.showDebug(TAG, `removeGroupNotification, groupName: ${itemData.groupName}`); let groupName = itemData.groupName for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].groupName == groupName) { - Log.showInfo(TAG, `removeGroupNotification i = ${i}`); + Log.showDebug(TAG, `removeGroupNotification i = ${i}`); let id = this.mNotificationList[i].id let hashcode = this.mNotificationList[i].hashcode let removeItemArr = this.mNotificationList.splice(i, 1); - Log.showInfo(TAG, `removeGroupNotification removeItemArr= ${JSON.stringify(removeItemArr)}`); + Log.showDebug(TAG, `removeGroupNotification removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { this.updateFlowControlInfos(removeItemArr[0].bundleName, false) } @@ -258,14 +256,14 @@ export class ViewModel { } clickItem(itemData, want?: any) { - Log.showInfo(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}`); + Log.showDebug(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}`); NotificationWindowManager.hideNotificationWindow(); CommonUtil.startWant((want) ? want : itemData.want); this.removeNotificationItem(itemData, true); } clickReply(inputKey, content, want) { - Log.showInfo(TAG, `clickReply inputKey: ${inputKey}, content: ${content}, want: ${JSON.stringify(want)}`); + Log.showDebug(TAG, `clickReply inputKey: ${inputKey}, content: ${content}, want: ${JSON.stringify(want)}`); let info = { code: 0, want: { key: inputKey, data: content }, @@ -276,11 +274,11 @@ export class ViewModel { } initFlowControlInfos() { - Log.showInfo(TAG, 'initFlowControlInfos enter'); + Log.showDebug(TAG, 'initFlowControlInfos enter'); let notificationConfig = NotificationConfig.readNotificationConfig('statusbar') - Log.showInfo(TAG, 'NotificationConfig: ' + JSON.stringify(notificationConfig)); + Log.showDebug(TAG, 'NotificationConfig: ' + JSON.stringify(notificationConfig)); if (CheckEmptyUtils.isEmpty(notificationConfig)) { - Log.showInfo(TAG, 'NotificationConfig is no definition'); + Log.showDebug(TAG, 'NotificationConfig is no definition'); return } this.mNotificationCtrl = { @@ -296,32 +294,32 @@ export class ViewModel { } this.mNotificationCtrl['app'].set(item.bundleName, tmp); } - Log.showInfo(TAG, 'initFlowControlInfos end, mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); + Log.showDebug(TAG, 'initFlowControlInfos end, mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); } isCanShow(bundleName: string): boolean { - Log.showInfo(TAG, 'isCanShow'); + Log.showDebug(TAG, 'isCanShow'); let result: boolean = true if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { let currentTotal = this.mNotificationCtrl['currentTotal'] let limitTotal = this.mNotificationCtrl['limitTotal'] - Log.showInfo(TAG, `isCanShow Total: currentTotal=${currentTotal},limitTotal=${limitTotal}`); + Log.showDebug(TAG, `isCanShow Total: currentTotal=${currentTotal},limitTotal=${limitTotal}`); if (currentTotal + 1 > limitTotal) { result = false } else if (this.mNotificationCtrl['app'].has(bundleName)) { let tmp = this.mNotificationCtrl['app'].get(bundleName) - Log.showInfo(TAG, `isCanShow appTotal: canShow=${tmp['canShow']},tmp['currentNum']=${tmp['currentNum']}`); + Log.showDebug(TAG, `isCanShow appTotal: canShow=${tmp['canShow']},tmp['currentNum']=${tmp['currentNum']}`); if (tmp['canShow'] === false || (tmp['currentNum'] + 1 > tmp['limit'])) { result = false } } } - Log.showInfo(TAG, `isCanShow :${result}`); + Log.showDebug(TAG, `isCanShow :${result}`); return result; } updateFlowControlInfos(bundleName: string, plusOrMinus: boolean): void { - Log.showInfo(TAG, `updateFlowControlInfos`); + Log.showDebug(TAG, `updateFlowControlInfos`); if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { if (this.mNotificationCtrl['app'].has(bundleName)) { let tmp = this.mNotificationCtrl['app'].get(bundleName) @@ -340,25 +338,25 @@ export class ViewModel { } } - Log.showInfo(TAG, `updateFlowControlInfos:${JSON.stringify(this.mNotificationCtrl)}`); + Log.showDebug(TAG, `updateFlowControlInfos:${JSON.stringify(this.mNotificationCtrl)}`); } reminderWay(itemData) { if (itemData.ruleData.isAllowBanner) { - Log.showInfo(TAG, `banner start `); + Log.showDebug(TAG, `banner start `); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'itemData', itemData); EventManager.publish(obtainLocalEvent('onBannerNoticeShow', { 'itemData': itemData })) - Log.showInfo(TAG, `banner end `); + Log.showDebug(TAG, `banner end `); } if (itemData.notificationFlags?.soundEnabled != Constants.NOTIFICATION_TYPE_CLOSE) { if (itemData.ruleData.isAllowSound) { try { this.audioPlayer.src = itemData.sound; - Log.showInfo(TAG, `sound start `); + Log.showDebug(TAG, `sound start `); this.audioPlayer.play(); - Log.showInfo(TAG, `sound end `); + Log.showDebug(TAG, `sound end `); } catch (e) { - Log.showInfo(TAG, `sound notificationItem id:${itemData.id} alert error: ${e.toString()}`); + Log.showError(TAG, `sound notificationItem id:${itemData.id} alert error: ${JSON.stringify(e)}`); } } } @@ -380,17 +378,17 @@ export class ViewModel { } getPluginTempLate(templateName) { - Log.showInfo(TAG, 'getPluginTempLate: ' + templateName); + Log.showDebug(TAG, 'getPluginTempLate: ' + templateName); return NotificationService.getPluginTempLate(templateName) } enableNotification(itemData, enable: boolean) { - Log.showInfo(TAG, `enableNotification, bundleName: ${itemData.bundleName} uid: ${itemData.uid}`); + Log.showDebug(TAG, `enableNotification, bundleName: ${itemData.bundleName} uid: ${itemData.uid}`); return NotificationService.enableNotification({ bundle: itemData.bundleName, uid: itemData.uid }, enable); } clickDistributionItem(itemData, triggerInfo) { - Log.showInfo(TAG, `clickDistributionItem wantAgen: ${JSON.stringify(itemData.want)}, triggerInfo: ${JSON.stringify(triggerInfo)}`); + Log.showDebug(TAG, `clickDistributionItem wantAgen: ${JSON.stringify(itemData.want)}, triggerInfo: ${JSON.stringify(triggerInfo)}`); NotificationWindowManager.hideNotificationWindow(); CommonUtil.startWant(itemData.want, triggerInfo); this.removeNotificationItem(itemData, true); @@ -398,9 +396,9 @@ export class ViewModel { //get distributed device name getDistributedDeviceName(itemData): Promise{ - Log.showInfo(TAG, `getDistributedDeviceName`); - Log.showInfo(TAG, `getDistributedDeviceName itemData want:${JSON.stringify(itemData.want)}`); - Log.showInfo(TAG, `getDistributedDeviceName itemData deviceId:${itemData.deviceId}`); + Log.showDebug(TAG, `getDistributedDeviceName`); + Log.showDebug(TAG, `getDistributedDeviceName itemData want:${JSON.stringify(itemData.want)}`); + Log.showDebug(TAG, `getDistributedDeviceName itemData deviceId:${itemData.deviceId}`); return new Promise((resolve) => { let deviceName: string = ''; diff --git a/features/screenlock/src/main/ets/com/ohos/common/constants.ts b/features/screenlock/src/main/ets/com/ohos/common/Constants.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/common/constants.ts rename to features/screenlock/src/main/ets/com/ohos/common/Constants.ts diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index a64f314c..18df5a8d 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -15,7 +15,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log' import ScreenLockMar from '@ohos.screenlock'; import windowManager from '@ohos.window' -import Constants from '../common/constants' +import Constants from '../common/Constants' import { Callback } from 'basic'; const TAG = 'ScreenLock-ScreenLockModel'; diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets index 8f2a7aa0..4f36dd44 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets @@ -15,7 +15,7 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import ViewModel from '../../vm/accountsViewModel' -import Constants from '../../common/constants' +import Constants from '../../common/Constants' import {UserData} from '../../data/userData' const TAG = 'ScreenLock-Accounts' diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets index 6bfaec81..b15fa356 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../../common/constants' +import Constants from '../../common/Constants' const TAG = 'ScreenLock-BatterySoc' diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index 1b85e859..5d53576e 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../../common/constants' +import Constants from '../../common/Constants' import NumkeyBoard from './numkeyBoard' import ViewModel from '../../vm/customPSDViewModel' import deviceInfo from '@ohos.deviceInfo'; diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets index c26d20fb..79e0f967 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../../common/constants' +import Constants from '../../common/Constants' import NumkeyBoard from './numkeyBoard' import ViewModel from '../../vm/digitalPSDViewModel' diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets index 3153527d..dc23d842 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets @@ -16,7 +16,7 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import {ScreenLockStatus} from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon' import ViewModel from '../../vm/lockIconViewModel' -import Constants from '../../common/constants' +import Constants from '../../common/Constants' const TAG = 'ScreenLock-LockIcon' diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets index 82bd579d..ebfa62bd 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../../common/constants' +import Constants from '../../common/Constants' import ViewModel from '../../vm/mixedPSDViewModel' const TAG = 'ScreenLock-MixedPSD' diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets index d76375b0..9c42aaf4 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../../common/constants' +import Constants from '../../common/Constants' import BaseViewModel from '../../vm/baseViewModel' import deviceInfo from '@ohos.deviceInfo'; diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets index 407d227f..bdc64c31 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets @@ -15,7 +15,7 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import ViewModel from '../../vm/StatusBarVM' -import Constants from '../../common/constants' +import Constants from '../../common/Constants' import BatteryIcon from '../../../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' import ClockIcon from '../../../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' import WifiIcon from '../../../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' diff --git a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts index 5cc35b7e..09cb4d18 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../common/constants' +import Constants from '../common/Constants' import service, {UnlockResult, AuthType, AuthSubType} from '../model/screenLockService' import {Callback} from 'basic'; diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts index 3ff02956..7429f7cf 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../common/constants' +import Constants from '../common/Constants' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' import {Callback} from 'basic'; diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts index e83bf679..167d9619 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../common/constants' +import Constants from '../common/Constants' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' import {Callback} from 'basic'; diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index d4ae9f53..eea464d8 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -18,7 +18,7 @@ import windowManager from '@ohos.window' import WindowManagers, { WindowType } from "../../../../../../common/src/main/ets/default/WindowManager"; import display from '@ohos.display' import Log from '../../../../../../common/src/main/ets/default/Log' -import Constants from '../../../../../../features/screenlock/src/main/ets/com/ohos/common/constants' +import Constants from '../../../../../../features/screenlock/src/main/ets/com/ohos/common/Constants' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import sTimeManager from '../../../../../../common/src/main/ets/default/TimeManager' diff --git a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 87e77c3c..609c3bad 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -17,7 +17,7 @@ import ServiceExtension from '@ohos.application.ServiceExtensionAbility' import windowManager from '@ohos.window' import display from '@ohos.display' import Log from '../../../../../../common/src/main/ets/default/Log' -import Constants from '../../../../../../features/screenlock/src/main/ets/com/ohos/common/constants' +import Constants from '../../../../../../features/screenlock/src/main/ets/com/ohos/common/Constants' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import sTimeManager from '../../../../../../common/src/main/ets/default/TimeManager' -- Gitee From db38ae5af970e897ace75589f97c156c9748470c Mon Sep 17 00:00:00 2001 From: match Date: Tue, 24 May 2022 14:28:10 +0800 Subject: [PATCH 120/373] =?UTF-8?q?systemui=20=E7=AB=96=E5=B1=8F=E9=80=82?= =?UTF-8?q?=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: match --- .../main/ets/default/StyleConfiguration.ts | 1 + .../main/ets/default/pages/batteryIcon.ets | 3 +- .../src/main/ets/default/pages/batteryPic.ets | 39 ++++---- .../main/resources/base/element/float.json | 8 ++ .../main/resources/phone/element/float.json | 60 ++++++++++++ .../StatusBarIconItemBluetoothComponent.ets | 1 + .../main/resources/base/element/float.json | 7 +- .../main/resources/phone/element/float.json | 16 ++++ .../main/ets/default/pages/CapsuleIcon.ets | 14 +-- .../src/main/ets/default/pages/clockIcon.ets | 22 +++-- .../main/resources/base/element/float.json | 8 ++ .../main/resources/phone/element/float.json | 16 ++++ .../StatusBarIconItemLocationComponent.ets | 1 + .../main/resources/base/element/float.json | 7 +- .../main/resources/phone/element/float.json | 16 ++++ .../StatusBarIconItemRingModeComponent.ets | 1 + .../main/resources/base/element/float.json | 4 + .../main/resources/phone/element/float.json | 16 ++++ .../src/main/ets/default/pages/signalIcon.ets | 6 +- .../main/resources/base/element/float.json | 34 ++++--- .../main/resources/phone/element/float.json | 36 +++++++ .../src/main/ets/default/pages/wifiIcon.ets | 1 + .../main/resources/base/element/float.json | 7 +- .../main/resources/phone/element/float.json | 16 ++++ .../main/resources/base/element/float.json | 48 +++++++--- .../src/main/ets/pages/control.ets | 8 +- .../src/main/ets/pages/notification.ets | 8 +- .../main/resources/base/element/color.json | 4 +- .../main/resources/base/element/float.json | 12 ++- .../main/resources/phone/element/color.json | 12 --- .../ServiceExtAbility/ServiceExtAbility.ts | 5 +- .../statusbar/src/main/ets/pages/index.ets | 3 +- .../main/resources/base/element/float.json | 94 ++++++++++++------- .../main/resources/base/element/string.json | 4 +- .../resources/base/media/ic_statusbar_gps.svg | 23 +++-- .../main/resources/en_US/element/string.json | 8 -- .../main/resources/zh_CN/element/string.json | 8 -- 37 files changed, 434 insertions(+), 143 deletions(-) create mode 100644 features/batterycomponent/src/main/resources/phone/element/float.json create mode 100644 features/bluetoothcomponent/src/main/resources/phone/element/float.json create mode 100644 features/clockcomponent/src/main/resources/phone/element/float.json create mode 100644 features/locationcomponent/src/main/resources/phone/element/float.json create mode 100644 features/ringmodecomponent/src/main/resources/phone/element/float.json create mode 100644 features/signalcomponent/src/main/resources/phone/element/float.json create mode 100644 features/wificomponent/src/main/resources/phone/element/float.json delete mode 100644 product/phone/dropdownpanel/src/main/resources/phone/element/color.json diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts index 4a23b516..29686e81 100644 --- a/common/src/main/ets/default/StyleConfiguration.ts +++ b/common/src/main/ets/default/StyleConfiguration.ts @@ -28,6 +28,7 @@ export default class StyleConfiguration { statusBarIconWidth: '24vp', statusBarIconHeight: '24vp', statusBarMarginLeftRight: deviceTypeInfo === 'phone' ? '0vp' : '5vp', + deviceTypeInfo : deviceTypeInfo }; }); } diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index 5e78570d..151e08f7 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -46,7 +46,6 @@ export default struct BatteryIcon { Row().width(this.style.componentGap).height('100%') BatteryPic() Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') - } - .height('100%') + }.height('100%').opacity($r("app.float.icon_component_opacity")) } } \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets index 0102321d..56f836f2 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -13,28 +13,27 @@ * limitations under the License. */ -import Constants from '../common/constants'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; -import StyleConfiguration from '../common/StyleConfiguration'; -import ViewModel from '../viewmodel/BatteryVM'; +import Constants from '../common/constants' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfiguration from '../common/StyleConfiguration' +import ViewModel from '../viewmodel/BatteryVM' const TAG = 'BatteryComponent-batteryPic'; @Component -export default -struct BatteryPic { - @StorageLink('batterySoc') batterySoc: number = 100; - @StorageLink('batteryCharging') batteryCharging : boolean = false; - @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); - @State style: any = StyleConfiguration.getBatteryPicStyle(); +export default struct BatteryPic { + @StorageLink('batterySoc') batterySoc: number = 100 + @StorageLink('batteryCharging') batteryCharging: boolean = false + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() + @State style: any = StyleConfiguration.getBatteryPicStyle() - aboutToAppear(){ - Log.showInfo(TAG,'aboutToAppear Start'); + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear Start'); } - aboutToDisappear(){ - Log.showInfo(TAG,'aboutToDisappear'); + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear'); } build() { @@ -45,7 +44,7 @@ struct BatteryPic { } .height('100%') - .width((this.batterySoc < 100 ? this.batterySoc: 100) + '%') + .width((this.batterySoc < 100 ? this.batterySoc : 100) + '%') .backgroundColor(this.getBatteryColor(this.batterySoc, this.batteryCharging)) } .width(this.style.picBodyWidth) @@ -71,10 +70,16 @@ struct BatteryPic { .backgroundColor(this.mTintContentInfo.contentColor) .borderRadius(this.style.picHeadBorderRadius) } + .margin({ + top: $r("app.float.battery_component_margin"), + bottom: $r("app.float.battery_component_margin"), + left: $r("app.float.battery_component_margin"), + right: $r("app.float.battery_component_margin") + }) } private getBatteryColor(val, charging) { - Log.showDebug(TAG, `getBatteryColor, val: ${ val } charging: ${ charging } `); + Log.showInfo(TAG, `getBatteryColor, val: ${val} charging: ${charging} `); if (charging) { return this.style.picChargingColor; } else if (val <= Constants.BATTERY_LEVEL_LOW) { diff --git a/features/batterycomponent/src/main/resources/base/element/float.json b/features/batterycomponent/src/main/resources/base/element/float.json index 0bd8930e..99fcd093 100644 --- a/features/batterycomponent/src/main/resources/base/element/float.json +++ b/features/batterycomponent/src/main/resources/base/element/float.json @@ -39,6 +39,14 @@ { "name": "battery_component_pic_head_height", "value": "10vp" + }, + { + "name": "icon_component_opacity", + "value": "1" + }, + { + "name": "battery_component_margin", + "value": "0vp" } ] } \ No newline at end of file diff --git a/features/batterycomponent/src/main/resources/phone/element/float.json b/features/batterycomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..ac0b50a0 --- /dev/null +++ b/features/batterycomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,60 @@ +{ + "float": [ + { + "name": "battery_component_gap", + "value": "0vp" + }, + { + "name": "battery_component_pic_gap", + "value": "1.2vp" + }, + { + "name": "battery_component_pic_body_height", + "value": "11vp" + }, + { + "name": "battery_component_pic_body_width", + "value": "18.5vp" + }, + { + "name": "battery_component_pic_body_padding", + "value": "1vp" + }, + { + "name": "battery_component_pic_body_border_width", + "value": "1vp" + }, + { + "name": "battery_component_pic_border_radius", + "value": "2.5vp" + }, + { + "name": "battery_component_pic_head_radius", + "value": "3vp" + }, + { + "name": "battery_component_pic_head_width", + "value": "1.5vp" + }, + { + "name": "battery_component_pic_head_height", + "value": "5.75vp" + }, + { + "name": "icon_component_opacity", + "value": "0.7" + }, + { + "name": "battery_component_margin", + "value": "2vp" + }, + { + "name": "mTime_text_margin_left", + "value": "2vp" + }, + { + "name": "signal_component_text_margin_left", + "value": "3vp" + } + ] +} \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets index 2f818cca..3ee6bda2 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets @@ -51,5 +51,6 @@ export default struct StatusBarIconItemBluetoothComponent { } } .height('100%') + .opacity($r("app.float.icon_component_opacity")) } } \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/resources/base/element/float.json b/features/bluetoothcomponent/src/main/resources/base/element/float.json index 7b4e2db7..07a182e0 100644 --- a/features/bluetoothcomponent/src/main/resources/base/element/float.json +++ b/features/bluetoothcomponent/src/main/resources/base/element/float.json @@ -3,9 +3,14 @@ { "name": "status_bar_bluetooth_width", "value": "18vp" - },{ + }, + { "name": "status_bar_bluetooth_height", "value": "24vp" + }, + { + "name": "icon_component_opacity", + "value": "1" } ] } \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/resources/phone/element/float.json b/features/bluetoothcomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..ab91856e --- /dev/null +++ b/features/bluetoothcomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,16 @@ +{ + "float": [ + { + "name": "status_bar_bluetooth_width", + "value": "11.5vp" + }, + { + "name": "status_bar_bluetooth_height", + "value": "15vp" + }, + { + "name": "icon_component_opacity", + "value": "0.7" + } + ] +} \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index 6ca48914..b2c7182f 100644 --- a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -13,11 +13,11 @@ * limitations under the License. */ -import Constants from '../common/constants'; -import CapsuleViewModel, {VIEW_MODEL_ID, CallState} from '../viewmodel/CapsuleViewModel'; -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration'; -import StyleConfiguration from '../common/StyleConfiguration'; +import Constants from '../common/constants' +import CapsuleViewModel, { VIEW_MODEL_ID, CallState } from '../viewmodel/CapsuleViewModel' +import Log from '../../../../../../../common/src/main/ets/default/Log' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' const TAG = "CapsuleIcon"; @@ -49,7 +49,7 @@ export default struct CapsuleIcon { .width(this.style.greenCapsulePhoneWidth) .height(this.style.greenCapsulePhoneHeight) .objectFit(ImageFit.Contain) - Row().width(this.style.greenCapsuleTextMarginLeftRight).height('100%') + Row().width($r("app.float.green_capsule_phone_text_left")).height('100%') Text(this.mCapsuleViewModel.mText) .fontSize(this.styleCommon.statusBarFontSize) .fontWeight(FontWeight.Regular) @@ -65,7 +65,7 @@ export default struct CapsuleIcon { .onTouch(this.touchEvent.bind(this)) Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') - } + }.margin({ left: $r("app.float.green_capsule_phone_margin_left") }) .visibility(this.mCapsuleViewModel.mIsBackground ? Visibility.Visible : Visibility.None) } diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index 3e0c8ff1..91d279a9 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -13,13 +13,16 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; -import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; -import StyleConfiguration from '../common/StyleConfiguration'; -import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration'; -import ViewModel from '../viewmodel/ClockVM'; -import TimeManager, {TimeEventArgs, TIME_CHANGE_EVENT} from '../../../../../../../common/src/main/ets/default/TimeManager'; -import EventManager, {unsubscribe} from '../../../../../../../common/src/main/ets/default/event/EventManager'; +import Log from '../../../../../../../common/src/main/ets/default/Log' +import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfiguration from '../common/StyleConfiguration' +import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import ViewModel from '../viewmodel/ClockVM' +import TimeManager, { + TimeEventArgs, + TIME_CHANGE_EVENT, +} from '../../../../../../../common/src/main/ets/default/TimeManager' +import EventManager, { unsubscribe } from '../../../../../../../common/src/main/ets/default/event/EventManager' const TAG = 'ClockComponent-clockIcon'; @@ -50,10 +53,11 @@ export default struct ClockIcon { Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') Text(this.mTime) .fontColor(this.mTintContentInfo.contentColor) - .fontSize(this.styleCommon.statusBarFontSize) + .fontSize($r("sys.float.ohos_id_text_size_body2")) .width(this.style.statusBarClockMaxWidth) .textAlign(TextAlign.Center) + .margin({ left: $r("app.float.mTime_text_margin_left") }) Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') - } + }.opacity($r("app.float.icon_component_opacity")) } } \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/base/element/float.json b/features/clockcomponent/src/main/resources/base/element/float.json index 4ee9f179..4deee4e9 100644 --- a/features/clockcomponent/src/main/resources/base/element/float.json +++ b/features/clockcomponent/src/main/resources/base/element/float.json @@ -3,6 +3,14 @@ { "name": "status_bar_clock_width", "value": "60vp" + }, + { + "name": "mTime_text_margin_left", + "value": "0vp" + }, + { + "name": "icon_component_opacity", + "value": "1" } ] } \ No newline at end of file diff --git a/features/clockcomponent/src/main/resources/phone/element/float.json b/features/clockcomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..ccdade49 --- /dev/null +++ b/features/clockcomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,16 @@ +{ + "float": [ + { + "name": "status_bar_clock_width", + "value": "37vp" + }, + { + "name": "mTime_text_margin_left", + "value": "2vp" + }, + { + "name": "icon_component_opacity", + "value": "0.7" + } + ] +} \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets index a0fc6f59..9063f0f8 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets @@ -51,5 +51,6 @@ export default struct StatusBarIconItemLocationComponent { } } .height('100%') + .opacity($r("app.float.icon_component_opacity")) } } \ No newline at end of file diff --git a/features/locationcomponent/src/main/resources/base/element/float.json b/features/locationcomponent/src/main/resources/base/element/float.json index 2e34baf3..6631daac 100644 --- a/features/locationcomponent/src/main/resources/base/element/float.json +++ b/features/locationcomponent/src/main/resources/base/element/float.json @@ -3,9 +3,14 @@ { "name": "status_bar_location_width", "value": "20vp" - },{ + }, + { "name": "status_bar_location_height", "value": "24vp" + }, + { + "name": "icon_component_opacity", + "value": "1" } ] } \ No newline at end of file diff --git a/features/locationcomponent/src/main/resources/phone/element/float.json b/features/locationcomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..385782a9 --- /dev/null +++ b/features/locationcomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,16 @@ +{ + "float": [ + { + "name": "status_bar_location_width", + "value": "13vp" + }, + { + "name": "status_bar_location_height", + "value": "15vp" + }, + { + "name": "icon_component_opacity", + "value": "0.7" + } + ] +} \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets index 98f97dab..f04d8c07 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets @@ -55,5 +55,6 @@ export default struct StatusBarIconItemRingModeComponent { } } .height('100%') + .opacity($r("app.float.icon_component_opacity")) } } \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/base/element/float.json b/features/ringmodecomponent/src/main/resources/base/element/float.json index b9db5349..39818bf8 100644 --- a/features/ringmodecomponent/src/main/resources/base/element/float.json +++ b/features/ringmodecomponent/src/main/resources/base/element/float.json @@ -7,6 +7,10 @@ { "name": "status_bar_ring_mode_height", "value": "24vp" + }, + { + "name": "icon_component_opacity", + "value": "1" } ] } \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/resources/phone/element/float.json b/features/ringmodecomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..bd03a7bb --- /dev/null +++ b/features/ringmodecomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,16 @@ +{ + "float": [ + { + "name": "status_bar_ring_mode_width", + "value": "17vp" + }, + { + "name": "status_bar_ring_mode_height", + "value": "15vp" + }, + { + "name": "icon_component_opacity", + "value": "0.7" + } + ] +} \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index b348b532..155b08be 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -53,7 +53,8 @@ struct SignalIcon { .fontSize(this.styleCommon.statusBarFontSize) .fontColor(this.mTintContentInfo.contentColor) .textOverflow({ overflow: TextOverflow.Ellipsis }) - .constraintSize({ maxWidth: this.style.signalTextMaxWeight}) + .constraintSize({ maxWidth: this.style.signalTextMaxWeight }) + .fontWeight(FontWeight.Medium) .flexShrink(0) .maxLines(1) .textAlign(TextAlign.Center) @@ -66,6 +67,8 @@ struct SignalIcon { .width(this.style.netSignalTextMaxWidth) .fontWeight(FontWeight.Bold) .textAlign(TextAlign.Center) + .textAlign(TextAlign.Start) + .margin({left:$r("app.float.signal_component_text_margin_left")}) Image(this.updateCellularImage(this.cellularLevel)) .objectFit(ImageFit.Contain) .width(this.style.cellularImageWidth) @@ -76,6 +79,7 @@ struct SignalIcon { Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } .height('100%') + .opacity($r("app.float.icon_component_opacity")) } /** diff --git a/features/signalcomponent/src/main/resources/base/element/float.json b/features/signalcomponent/src/main/resources/base/element/float.json index cca6ffd2..1b441239 100644 --- a/features/signalcomponent/src/main/resources/base/element/float.json +++ b/features/signalcomponent/src/main/resources/base/element/float.json @@ -1,28 +1,36 @@ { - "float":[ + "float": [ { - "name":"status_bar_signal_type_font_size", - "value":"10fp" + "name": "status_bar_signal_type_font_size", + "value": "10fp" }, { - "name":"status_bar_signal_unknown_font_size", - "value":"14fp" + "name": "status_bar_signal_unknown_font_size", + "value": "14fp" }, { - "name":"signal_component_icon_width", - "value":"32vp" + "name": "signal_component_icon_width", + "value": "32vp" }, { - "name":"signal_component_icon_height", - "value":"24vp" + "name": "signal_component_icon_height", + "value": "24vp" }, { - "name":"signal_text_max_width", - "value":"113vp" + "name": "signal_text_max_width", + "value": "113vp" }, { - "name":"status_bar_signal_net_signal_text_max_width", - "value":"18vp" + "name": "status_bar_signal_net_signal_text_max_width", + "value": "18vp" + }, + { + "name": "signal_component_text_margin_left", + "value": "0vp" + }, + { + "name": "icon_component_opacity", + "value": "1" } ] } \ No newline at end of file diff --git a/features/signalcomponent/src/main/resources/phone/element/float.json b/features/signalcomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..3cadae2e --- /dev/null +++ b/features/signalcomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,36 @@ +{ + "float": [ + { + "name": "status_bar_signal_type_font_size", + "value": "5.5fp" + }, + { + "name": "status_bar_signal_unknown_font_size", + "value": "7fp" + }, + { + "name": "signal_component_icon_width", + "value": "21.5vp" + }, + { + "name": "signal_component_icon_height", + "value": "15vp" + }, + { + "name": "signal_text_max_width", + "value": "113vp" + }, + { + "name": "status_bar_signal_net_signal_text_max_width", + "value": "15vp" + }, + { + "name": "signal_component_text_margin_left", + "value": "3vp" + }, + { + "name": "icon_component_opacity", + "value": "0.7" + } + ] +} \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index f1299172..39f5bea3 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -49,6 +49,7 @@ export default struct WifiIcon { .width(this.style.statusBarWifiWidth) .height(this.style.statusBarWifiHeight) .fillColor(this.mTintContentInfo.contentColor) + .opacity($r("app.float.icon_component_opacity")) Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } } diff --git a/features/wificomponent/src/main/resources/base/element/float.json b/features/wificomponent/src/main/resources/base/element/float.json index 15f65e97..2b0074f5 100644 --- a/features/wificomponent/src/main/resources/base/element/float.json +++ b/features/wificomponent/src/main/resources/base/element/float.json @@ -3,9 +3,14 @@ { "name": "status_bar_wifi_width", "value": "24vp" - },{ + }, + { "name": "status_bar_wifi_height", "value": "24vp" + }, + { + "name": "icon_component_opacity", + "value": "1" } ] } \ No newline at end of file diff --git a/features/wificomponent/src/main/resources/phone/element/float.json b/features/wificomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..67c35ad6 --- /dev/null +++ b/features/wificomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,16 @@ +{ + "float": [ + { + "name": "status_bar_wifi_width", + "value": "15.75vp" + }, + { + "name": "status_bar_wifi_height", + "value": "15vp" + }, + { + "name": "icon_component_opacity", + "value": "0.7" + } + ] +} \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/element/float.json b/product/pc/statusbar/src/main/resources/base/element/float.json index b1620ac3..588b0e33 100644 --- a/product/pc/statusbar/src/main/resources/base/element/float.json +++ b/product/pc/statusbar/src/main/resources/base/element/float.json @@ -65,24 +65,24 @@ "value": "24vp" }, { - "name":"signal_component_icon_width", - "value":"32vp" + "name": "signal_component_icon_width", + "value": "32vp" }, { - "name":"signal_component_icon_height", - "value":"24vp" + "name": "signal_component_icon_height", + "value": "24vp" }, { - "name":"status_bar_signal_unknown_font_size", - "value":"14fp" + "name": "status_bar_signal_unknown_font_size", + "value": "14fp" }, { - "name":"signal_text_max_width", - "value":"113vp" + "name": "signal_text_max_width", + "value": "113vp" }, { - "name":"status_bar_signal_net_signal_text_max_width", - "value":"18vp" + "name": "status_bar_signal_net_signal_text_max_width", + "value": "18vp" }, { "name": "status_bar_bluetooth_width", @@ -101,8 +101,8 @@ "value": "24vp" }, { - "name":"status_bar_signal_type_font_size", - "value":"10fp" + "name": "status_bar_signal_type_font_size", + "value": "10fp" }, { "name": "status_bar_wifi_width", @@ -112,6 +112,10 @@ "name": "status_bar_wifi_height", "value": "24vp" }, + { + "name": "icon_component_opacity", + "value": "1" + }, { "name": "status_bar_location_width", "value": "20vp" @@ -119,6 +123,26 @@ { "name": "status_bar_location_height", "value": "24vp" + }, + { + "name": "green_capsule_phone_text_left", + "value": "10vp" + }, + { + "name": "green_capsule_phone_margin_left", + "value": "2vp" + }, + { + "name": "battery_component_margin", + "value": "0vp" + }, + { + "name": "mTime_text_margin_left", + "value": "2vp" + }, + { + "name": "signal_component_text_margin_left", + "value": "3vp" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/pages/control.ets b/product/phone/dropdownpanel/src/main/ets/pages/control.ets index 243f0278..5e0261c3 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/control.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/control.ets @@ -51,12 +51,18 @@ export default struct Control { } .width('100%') .height(this.style.statusBarHeight) + .padding({ + top: $r("app.float.status_bar_padding_top_bottom"), + bottom: $r("app.float.status_bar_padding_top_bottom"), + left: $r("sys.float.ohos_id_max_padding_start"), + right: $r("sys.float.ohos_id_max_padding_end") + }) .layoutWeight(0) Scroll(new Scroller()) { Column() { ControlCenterComponent({ - touchMoveCallback: (data)=>this.controlCenterTouchMoveCallback(data), + touchMoveCallback: (data) => this.controlCenterTouchMoveCallback(data), mControlCenterComponentConfig: ControlCenterConfig, }) } diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 7597bea6..216959b8 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -151,8 +151,14 @@ struct statusBar { ClockIcon() } } - .height(24) + .height($r("app.float.status_bar_height")) .width('100%') + .padding({ + top: $r("app.float.status_bar_padding_top_bottom"), + bottom: $r("app.float.status_bar_padding_top_bottom"), + left: $r("app.float.status_bar_padding_left_right"), + right: $r("app.float.status_bar_padding_left_right") + }) } } diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/color.json b/product/phone/dropdownpanel/src/main/resources/base/element/color.json index ad111924..1601adf7 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/color.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/color.json @@ -2,7 +2,7 @@ "color": [ { "name": "default_background", - "value": "#4D999999" + "value": "#999999" }, { "name": "notification_delete_all_background", @@ -22,7 +22,7 @@ }, { "name": "statusbar_background_color", - "value": "#1a262626" + "value": "#00ffff00" }, { "name": "brightness_slider_block_color", diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/float.json b/product/phone/dropdownpanel/src/main/resources/base/element/float.json index fd8bb0cc..7978df0c 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/float.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/float.json @@ -1,8 +1,8 @@ - { +{ "float": [ { "name": "status_bar_height", - "value": "48vp" + "value": "30vp" }, { "name": "notification_delete_all", @@ -111,6 +111,14 @@ { "name": "status_bar_ring_mode_height", "value": "24vp" + }, + { + "name": "status_bar_padding_left_right", + "value": "12vp" + }, + { + "name": "status_bar_padding_top_bottom", + "value": "4vp" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/phone/element/color.json b/product/phone/dropdownpanel/src/main/resources/phone/element/color.json deleted file mode 100644 index 5de4e7cf..00000000 --- a/product/phone/dropdownpanel/src/main/resources/phone/element/color.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "color": [ - { - "name": "default_background", - "value": "#999999" - }, - { - "name": "notification_delete_all_background", - "value": "#4C000000" - } - ] -} \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index b501440b..ad515c5a 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -18,6 +18,7 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StatusBarConfiguration from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; +import CommonStyleConfiguration from '../../../../../../../common/src/main/ets/default/StyleConfiguration' const TAG = "StatusBar_ServiceExtAbility" @@ -30,11 +31,13 @@ class ServiceExtAbility extends ServiceExtension { AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo) Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`) + let style:any = CommonStyleConfiguration.getCommonStyle() + let deviceTypeInfo = style.deviceTypeInfo let statusBarRect = { left: configInfo.xCoordinate, top: configInfo.yCoordinate, width: configInfo.realWidth, - height: configInfo.realHeight + height: deviceTypeInfo == 'phone' ? configInfo.realHeight : configInfo.realHeight/3 } WindowManager.createWindow(this.context, WindowType.STATUS_BAR, statusBarRect, "pages/index").then(() => WindowManager.showWindow(WindowType.STATUS_BAR) diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index 9cdc196e..7e61a4ed 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -105,7 +105,8 @@ struct Index { } .width('100%') .height('100%') - .constraintSize({ minHeight: this.StatusMinH + 'px' }) + .constraintSize({ minHeight: this.StatusMinH }) + .padding({ left: $r('sys.float.ohos_id_max_padding_start'), right: $r('sys.float.ohos_id_max_padding_end') }) .onAreaChange((e, e2) => { Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); }) diff --git a/product/phone/statusbar/src/main/resources/base/element/float.json b/product/phone/statusbar/src/main/resources/base/element/float.json index b1620ac3..060e3453 100644 --- a/product/phone/statusbar/src/main/resources/base/element/float.json +++ b/product/phone/statusbar/src/main/resources/base/element/float.json @@ -2,27 +2,27 @@ "float": [ { "name": "status_bar_clock_width", - "value": "60vp" + "value": "37vp" }, { "name": "battery_component_gap", - "value": "8.5vp" + "value": "0vp" }, { "name": "battery_component_pic_gap", - "value": "2vp" + "value": "1.2vp" }, { "name": "battery_component_pic_body_height", - "value": "19vp" + "value": "11vp" }, { "name": "battery_component_pic_body_width", - "value": "34.5vp" + "value": "18.5vp" }, { "name": "battery_component_pic_body_padding", - "value": "2vp" + "value": "1vp" }, { "name": "battery_component_pic_body_border_width", @@ -30,95 +30,119 @@ }, { "name": "battery_component_pic_border_radius", - "value": "2vp" + "value": "2.5vp" }, { "name": "battery_component_pic_head_radius", - "value": "2vp" + "value": "3vp" }, { "name": "battery_component_pic_head_width", - "value": "3vp" + "value": "1.5vp" }, { "name": "battery_component_pic_head_height", - "value": "10vp" + "value": "5.75vp" }, { "name": "green_capsule_phone_width", - "value": "15vp" + "value": "14vp" }, { "name": "green_capsule_phone_height", - "value": "15vp" + "value": "14vp" }, { "name": "green_capsule_height", - "value": "48vp" + "value": "20vp" }, { "name": "green_capsule_text_left_right", - "value": "10vp" + "value": "6vp" }, { "name": "green_capsule_radius", - "value": "24vp" + "value": "10vp" }, { - "name":"signal_component_icon_width", - "value":"32vp" + "name": "signal_component_icon_width", + "value": "21.5vp" }, { - "name":"signal_component_icon_height", - "value":"24vp" + "name": "signal_component_icon_height", + "value": "15vp" }, { - "name":"status_bar_signal_unknown_font_size", - "value":"14fp" + "name": "status_bar_signal_unknown_font_size", + "value": "7fp" }, { - "name":"signal_text_max_width", - "value":"113vp" + "name": "signal_text_max_width", + "value": "113vp" }, { - "name":"status_bar_signal_net_signal_text_max_width", - "value":"18vp" + "name": "status_bar_signal_net_signal_text_max_width", + "value": "15vp" }, { "name": "status_bar_bluetooth_width", - "value": "18vp" + "value": "11.5vp" }, { "name": "status_bar_bluetooth_height", - "value": "24vp" + "value": "15vp" }, { "name": "status_bar_ring_mode_width", - "value": "27vp" + "value": "17vp" }, { "name": "status_bar_ring_mode_height", - "value": "24vp" + "value": "15vp" }, { - "name":"status_bar_signal_type_font_size", - "value":"10fp" + "name": "status_bar_signal_type_font_size", + "value": "5.5fp" }, { "name": "status_bar_wifi_width", - "value": "24vp" + "value": "15.75vp" }, { "name": "status_bar_wifi_height", - "value": "24vp" + "value": "15vp" }, { "name": "status_bar_location_width", - "value": "20vp" + "value": "13vp" }, { "name": "status_bar_location_height", - "value": "24vp" + "value": "15vp" + }, + { + "name": "icon_component_opacity", + "value": "0.7" + }, + { + "name": "mTime_text_margin_left", + "value": "2vp" + }, + { + "name": "signal_component_text_margin_left", + "value": "3vp" + }, + { + "name": "green_capsule_phone_text_left", + "value": "1vp" + }, + { + "name": "green_capsule_phone_margin_left", + "value": "2vp" + }, + { + "name": "battery_component_margin", + "value": "2vp" } ] } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/element/string.json b/product/phone/statusbar/src/main/resources/base/element/string.json index 59ebb9ee..8e42b46e 100644 --- a/product/phone/statusbar/src/main/resources/base/element/string.json +++ b/product/phone/statusbar/src/main/resources/base/element/string.json @@ -2,11 +2,11 @@ "string": [ { "name": "status_bar_size_portrait", - "value": "48" + "value": "90" }, { "name": "status_bar_size_landscape", - "value": "48" + "value": "90" }, { "name": "status_bar_position_landscape", diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg index 2d166cbe..9f51a6bd 100644 --- a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_gps.svg @@ -1,6 +1,17 @@ - - - - - - + + + ic_statusbar_gps + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/en_US/element/string.json b/product/phone/statusbar/src/main/resources/en_US/element/string.json index f3f51fab..8e0c98e1 100644 --- a/product/phone/statusbar/src/main/resources/en_US/element/string.json +++ b/product/phone/statusbar/src/main/resources/en_US/element/string.json @@ -1,13 +1,5 @@ { "string": [ - { - "name": "status_bar_size_portrait", - "value": "48" - }, - { - "name": "status_bar_size_landscape", - "value": "48" - }, { "name": "status_bar_position_landscape", "value": "2" diff --git a/product/phone/statusbar/src/main/resources/zh_CN/element/string.json b/product/phone/statusbar/src/main/resources/zh_CN/element/string.json index 59ebb9ee..e43da9dd 100644 --- a/product/phone/statusbar/src/main/resources/zh_CN/element/string.json +++ b/product/phone/statusbar/src/main/resources/zh_CN/element/string.json @@ -1,13 +1,5 @@ { "string": [ - { - "name": "status_bar_size_portrait", - "value": "48" - }, - { - "name": "status_bar_size_landscape", - "value": "48" - }, { "name": "status_bar_position_landscape", "value": "2" -- Gitee From f11c4a1996116fcfba691c28ed24f6619fdcf752 Mon Sep 17 00:00:00 2001 From: match Date: Wed, 25 May 2022 17:23:39 +0800 Subject: [PATCH 121/373] =?UTF-8?q?systemui=20=E7=8A=B6=E6=80=81=E6=A0=8F?= =?UTF-8?q?=E9=AB=98=E5=BA=A6=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: match --- .../com/ohos/common/StatusBarConfiguration.ts | 22 ++++++++++++++++--- .../main/resources/base/element/string.json | 8 +++++++ .../ServiceExtAbility/ServiceExtAbility.ts | 5 +---- .../main/resources/base/element/string.json | 10 ++++++++- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index b2d8215f..0ee2f2d5 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -16,6 +16,7 @@ import display from '@ohos.display' import Log from '../../../../../../../../common/src/main/ets/default/Log' import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil' +import CommonStyleConfiguration from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' const TAG = 'StatusBarConfiguration'; @@ -66,16 +67,31 @@ class StatusBarConfiguration { async getDirectionAndPosition() { Log.showInfo(TAG, 'getDirectionAndPosition'); directionStatus = await ResourceUtil.getConfiguration(); + Log.showInfo(TAG, 'getDirectionAndPosition' + 2); + let style: any = CommonStyleConfiguration.getCommonStyle() + let deviceTypeInfo = style.deviceTypeInfo if (directionStatus.direction == -1) { Log.showInfo(TAG, 'direction is -1'); statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) - shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); + if(deviceTypeInfo == 'phone'){ + shortSideLength = await ResourceUtil.getString($r("app.string.phone_status_bar_size_landscape")); + }else{ + shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); + } } else if (directionStatus.direction == 1) { statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) - shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); + if(deviceTypeInfo == 'phone'){ + shortSideLength = await ResourceUtil.getString($r("app.string.phone_status_bar_size_landscape")); + }else{ + shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); + } } else { statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_portrait")) - shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_portrait")); + if(deviceTypeInfo == 'phone'){ + shortSideLength = await ResourceUtil.getString($r("app.string.phone_status_bar_size_portrait")); + }else{ + shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_portrait")); + } } shortSideLength = parseInt(shortSideLength) + ''; Log.showInfo(TAG, 'directionStatus = ' + directionStatus.direction + 'statusbarPosition = ' + statusbarPosition + diff --git a/product/pc/statusbar/src/main/resources/base/element/string.json b/product/pc/statusbar/src/main/resources/base/element/string.json index 06f5d7fd..24a3e1dd 100644 --- a/product/pc/statusbar/src/main/resources/base/element/string.json +++ b/product/pc/statusbar/src/main/resources/base/element/string.json @@ -8,6 +8,14 @@ "name": "status_bar_size_landscape", "value": "44" }, + { + "name": "phone_status_bar_size_portrait", + "value": "90" + }, + { + "name": "phone_status_bar_size_landscape", + "value": "90" + }, { "name": "status_bar_position_portrait", "value": "1" diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index ad515c5a..b501440b 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -18,7 +18,6 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StatusBarConfiguration from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; -import CommonStyleConfiguration from '../../../../../../../common/src/main/ets/default/StyleConfiguration' const TAG = "StatusBar_ServiceExtAbility" @@ -31,13 +30,11 @@ class ServiceExtAbility extends ServiceExtension { AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo) Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`) - let style:any = CommonStyleConfiguration.getCommonStyle() - let deviceTypeInfo = style.deviceTypeInfo let statusBarRect = { left: configInfo.xCoordinate, top: configInfo.yCoordinate, width: configInfo.realWidth, - height: deviceTypeInfo == 'phone' ? configInfo.realHeight : configInfo.realHeight/3 + height: configInfo.realHeight } WindowManager.createWindow(this.context, WindowType.STATUS_BAR, statusBarRect, "pages/index").then(() => WindowManager.showWindow(WindowType.STATUS_BAR) diff --git a/product/phone/statusbar/src/main/resources/base/element/string.json b/product/phone/statusbar/src/main/resources/base/element/string.json index 8e42b46e..c42709b9 100644 --- a/product/phone/statusbar/src/main/resources/base/element/string.json +++ b/product/phone/statusbar/src/main/resources/base/element/string.json @@ -2,10 +2,18 @@ "string": [ { "name": "status_bar_size_portrait", - "value": "90" + "value": "30" }, { "name": "status_bar_size_landscape", + "value": "30" + }, + { + "name": "phone_status_bar_size_portrait", + "value": "90" + }, + { + "name": "phone_status_bar_size_landscape", "value": "90" }, { -- Gitee From 5be75fa69627dc1c59a4473af1c772548f7624d0 Mon Sep 17 00:00:00 2001 From: r00498791 Date: Wed, 25 May 2022 17:45:48 +0800 Subject: [PATCH 122/373] add trace Signed-off-by: r00498791 --- common/src/main/ets/default/Trace.ts | 76 +++++++++++++++++++ .../src/main/ets/pages/index.ets | 4 + .../statusbar/src/main/ets/pages/index.ets | 2 + 3 files changed, 82 insertions(+) create mode 100644 common/src/main/ets/default/Trace.ts diff --git a/common/src/main/ets/default/Trace.ts b/common/src/main/ets/default/Trace.ts new file mode 100644 index 00000000..17c7596a --- /dev/null +++ b/common/src/main/ets/default/Trace.ts @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2022 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 byTrace from '@ohos.bytrace'; +import Log from './Log'; + +/** + * Add method trace. Modify RECORD_TRACE before using. + */ +export default class Trace { + static readonly CORE_METHOD_START_DROPDOWNPANEL = 'startDropdownpanel'; + static readonly CORE_METHOD_START_TOUCHEVENT = 'startTouchEvent'; + + private static readonly TRACE_TAG = 'Systemui:Trace'; + private static readonly RECORD_TRACE = true; + private static readonly TRACE_LIMIT = 2000; + + private static readonly TRACE_BASE_INDEX = 10000; + + /** + * start trace method + * + * @param {string} methodName - methodName for tracing + */ + static start(methodName: string) { + if (!Trace.RECORD_TRACE) return; + if (typeof globalThis.taskIdMap === 'undefined' || typeof globalThis.traceIndex === 'undefined') { + Trace.init(); + } + let taskId = globalThis.taskIdMap.get(methodName); + if (taskId == undefined) { + taskId = globalThis.traceIndex; + globalThis.traceIndex++; + globalThis.taskIdMap.set(methodName, taskId); + } + Log.showInfo(this.TRACE_TAG, `start trace ${taskId}`); + byTrace.startTrace(this.TRACE_TAG + methodName, taskId, Trace.TRACE_LIMIT); + } + + private static init() { + Log.showInfo(this.TRACE_TAG, 'init trace parameters'); + globalThis.taskIdMap = new Map(); + globalThis.traceIndex = Trace.TRACE_BASE_INDEX; + } + + /** + * stop trace method + * + * @param {string} methodName - methodName for tracing + */ + static end(methodName: string) { + if (!Trace.RECORD_TRACE) return; + if (typeof globalThis.taskIdMap === 'undefined') { + return; + } + const taskId = globalThis.taskIdMap.get(methodName); + if (taskId == undefined) { + Log.showError(this.TRACE_TAG, `fail to end trace name ${methodName}`); + return; + } + Log.showInfo(this.TRACE_TAG, `end trace ${taskId}`); + byTrace.finishTrace(this.TRACE_TAG + methodName, taskId); + } +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index 5bbe7874..2dd968ef 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -16,6 +16,7 @@ import screenshot from "@ohos.screenshot" import image from "@ohos.multimedia.image" import Log from '../../../../../../../common/src/main/ets/default/Log' +import Trace from '../../../../../../../common/src/main/ets/default/Trace' import WindowManager, {WindowType, WINDOW_SHOW_HIDE_EVENT} from '../../../../../../../common/src/main/ets/default/WindowManager' import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager" @@ -145,6 +146,7 @@ struct Index { this.componentOptAreaTranslateY = '0px' this.backgroundOpacity = 1 }) + Trace.end(Trace.CORE_METHOD_START_DROPDOWNPANEL) } aboutToDisappear() { @@ -240,10 +242,12 @@ struct Index { } showSelf(showComponentName) { + Trace.end(Trace.CORE_METHOD_START_TOUCHEVENT) Log.showDebug(TAG, `showSelf, showComponentName: ${showComponentName}`) this.showComponentName = showComponentName this.updateBackground() WindowManager.showWindow(WindowType.DROPDOWN_PANEL) + Trace.start(Trace.CORE_METHOD_START_DROPDOWNPANEL) } hideSelf() { diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index 9cdc196e..b22a990f 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -14,6 +14,7 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log' +import Trace from '../../../../../../../common/src/main/ets/default/Trace' import WindowManager, {WindowType, WINDOW_SHOW_HIDE_EVENT } from '../../../../../../../common/src/main/ets/default/WindowManager' import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager" @@ -112,6 +113,7 @@ struct Index { } touchEvent(event: TouchEvent) { + Trace.start(Trace.CORE_METHOD_START_TOUCHEVENT) Log.showDebug(TAG, 'touchEvent================' + event.touches) if (event.type == Constants.TOUCHTYPE_DOWN) { //down this.startX = event.touches[0].screenX -- Gitee From be1284bcb16c11a4a1f20f83110bb8ea7895c95d Mon Sep 17 00:00:00 2001 From: lvxiaoqiang Date: Wed, 25 May 2022 18:29:02 +0800 Subject: [PATCH 123/373] fix import Signed-off-by: lvxiaoqiang --- common/src/main/ets/default/ReadConfigUtil.ts | 2 +- common/src/main/ets/default/ScreenLockCommon.ts | 2 +- .../src/main/ets/default/pages/batteryIcon.ets | 4 ++-- .../src/main/ets/default/pages/clockIcon.ets | 2 +- .../ets/com/ohos/common/{Constants.ts => constants.ts} | 0 .../src/main/ets/com/ohos/model/screenLockModel.ts | 2 +- .../src/main/ets/com/ohos/model/screenlockStyle.ts | 10 +++++----- .../src/main/ets/com/ohos/view/component/accounts.ets | 2 +- .../main/ets/com/ohos/view/component/batterySoc.ets | 2 +- .../src/main/ets/com/ohos/view/component/customPSD.ets | 2 +- .../main/ets/com/ohos/view/component/digitalPSD.ets | 2 +- .../src/main/ets/com/ohos/view/component/lockIcon.ets | 2 +- .../src/main/ets/com/ohos/view/component/mixedPSD.ets | 2 +- .../main/ets/com/ohos/view/component/numkeyBoard.ets | 2 +- .../src/main/ets/com/ohos/view/component/statusBar.ets | 2 +- .../screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts | 2 +- .../src/main/ets/com/ohos/vm/baseViewModel.ts | 2 +- .../src/main/ets/com/ohos/vm/customPSDViewModel.ts | 2 +- .../src/main/ets/com/ohos/vm/digitalPSDViewModel.ts | 2 +- .../src/main/ets/default/common/StyleConfiguration.ts | 2 +- .../src/main/ets/default/pages/signalIcon.ets | 8 ++++---- .../src/main/ets/default/common/StyleConfiguration.ts | 2 +- .../src/main/ets/default/pages/wifiIcon.ets | 8 ++++---- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- product/pc/src/main/ets/pages/mixedPassword.ets | 2 +- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 2 +- product/phone/src/main/ets/pages/mixedPassword.ets | 2 +- 27 files changed, 37 insertions(+), 37 deletions(-) rename features/screenlock/src/main/ets/com/ohos/common/{Constants.ts => constants.ts} (100%) diff --git a/common/src/main/ets/default/ReadConfigUtil.ts b/common/src/main/ets/default/ReadConfigUtil.ts index c736e39a..c00c6cd5 100644 --- a/common/src/main/ets/default/ReadConfigUtil.ts +++ b/common/src/main/ets/default/ReadConfigUtil.ts @@ -44,7 +44,7 @@ export class ReadConfigUtil { } finally{ stream.closeSync(); } - return JSON.stringify(content); + return JSON.parse(content); } } diff --git a/common/src/main/ets/default/ScreenLockCommon.ts b/common/src/main/ets/default/ScreenLockCommon.ts index 7e6345b7..8a491d9c 100644 --- a/common/src/main/ets/default/ScreenLockCommon.ts +++ b/common/src/main/ets/default/ScreenLockCommon.ts @@ -49,5 +49,5 @@ export function ReadConfigFile(fileName) { } finally { stream.closeSync(); } - return JSON.stringify(content); + return JSON.parse(content); } \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index dcbc9d7d..84a12e5a 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -20,8 +20,8 @@ import Constants from '../common/constants' import Log from '../../../../../../../common/src/main/ets/default/Log' import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' import StyleConfiguration from '../common/StyleConfiguration' -import { StatusBarGroupComponentData -} from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' +import {StatusBarGroupComponentData +} from '../../../../../../screenlock/src/main/ets/com/ohos/common/constants' import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vm/StatusBarVM' const TAG = 'BatteryComponent-batteryIcon' diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index 563133fa..be5fdd51 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -16,7 +16,7 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' import StyleConfiguration from '../common/StyleConfiguration' import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' -import { StatusBarGroupComponentData } from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' +import { StatusBarGroupComponentData } from '../../../../../../screenlock/src/main/ets/com/ohos/common/constants' import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vm/StatusBarVM' import TimeManager, { TimeEventArgs, diff --git a/features/screenlock/src/main/ets/com/ohos/common/Constants.ts b/features/screenlock/src/main/ets/com/ohos/common/constants.ts similarity index 100% rename from features/screenlock/src/main/ets/com/ohos/common/Constants.ts rename to features/screenlock/src/main/ets/com/ohos/common/constants.ts diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index 641647bb..441e23af 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -15,7 +15,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log' import ScreenLockMar from '@ohos.screenlock'; import windowManager from '@ohos.window' -import Constants from '../common/Constants' +import Constants from '../common/constants' import { Callback } from 'basic'; const TAG = 'ScreenLock-ScreenLockModel'; diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts index 202a3d58..82b84e05 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts @@ -42,12 +42,12 @@ class ScreenlockStyle { readMode(deviceType: string): number{ Log.showInfo(TAG, `readMode deviceType:${deviceType}`); try { - let modeJson = ReadConfigFile(FILE_URI.replace('{0}', deviceType)) - Log.showDebug(TAG, `ReadConfigFile content:` + JSON.stringify(modeJson)); - this.screenMode = modeJson.mode + let modeJson = ReadConfigFile(FILE_URI.replace('{0}', deviceType)); + Log.showInfo(TAG, `ReadConfigFile content:` + JSON.stringify(modeJson)); + this.screenMode = modeJson.mode; } catch(error) { - Log.showError(TAG, `ReadConfigFile content error: ${error}`); - this.screenMode = 1 + Log.showInfo(TAG, `ReadConfigFile content error: ${error}`); + this.screenMode = 1; } return this.screenMode } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets index 4f36dd44..8f2a7aa0 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/accounts.ets @@ -15,7 +15,7 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import ViewModel from '../../vm/accountsViewModel' -import Constants from '../../common/Constants' +import Constants from '../../common/constants' import {UserData} from '../../data/userData' const TAG = 'ScreenLock-Accounts' diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets index b15fa356..6bfaec81 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/batterySoc.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../../common/Constants' +import Constants from '../../common/constants' const TAG = 'ScreenLock-BatterySoc' diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index 5d53576e..1b85e859 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../../common/Constants' +import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard' import ViewModel from '../../vm/customPSDViewModel' import deviceInfo from '@ohos.deviceInfo'; diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets index 79e0f967..c26d20fb 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../../common/Constants' +import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard' import ViewModel from '../../vm/digitalPSDViewModel' diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets index 59031145..69810271 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets @@ -16,7 +16,7 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import {ScreenLockStatus} from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon' import ViewModel from '../../vm/lockIconViewModel' -import Constants from '../../common/Constants' +import Constants from '../../common/constants' const TAG = 'ScreenLock-LockIcon' diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets index ebfa62bd..82bd579d 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../../common/Constants' +import Constants from '../../common/constants' import ViewModel from '../../vm/mixedPSDViewModel' const TAG = 'ScreenLock-MixedPSD' diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets index 9c42aaf4..d76375b0 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/numkeyBoard.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../../common/Constants' +import Constants from '../../common/constants' import BaseViewModel from '../../vm/baseViewModel' import deviceInfo from '@ohos.deviceInfo'; diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets index bdc64c31..407d227f 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets @@ -15,7 +15,7 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import ViewModel from '../../vm/StatusBarVM' -import Constants from '../../common/Constants' +import Constants from '../../common/constants' import BatteryIcon from '../../../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets' import ClockIcon from '../../../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon.ets' import WifiIcon from '../../../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon.ets' diff --git a/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts b/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts index 4b7bdc16..4cc5cce5 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/StatusBarVM.ts @@ -15,7 +15,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import WindowManager, { WindowType } from '../../../../../../../../common/src/main/ets/default/WindowManager'; -import Constants, {StatusBarGroupComponentData} from '../common/Constants'; +import Constants, {StatusBarGroupComponentData} from '../common/constants'; const TAG = 'StatusBarVM'; diff --git a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts index 1f31f477..46842f72 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/baseViewModel.ts @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../common/Constants' +import Constants from '../common/constants' import service, {UnlockResult, AuthType, AuthSubType} from '../model/screenLockService' import {Callback} from 'basic'; diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts index 7df213df..a6a30d40 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../common/Constants' +import Constants from '../common/constants' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' import {Callback} from 'basic'; diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts index 23564b98..fe885c1c 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log' -import Constants from '../common/Constants' +import Constants from '../common/constants' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' import {Callback} from 'basic'; diff --git a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts index e11f03ce..8ca4fc21 100644 --- a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -14,7 +14,7 @@ */ import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; -import Constants from './Constants' +import Constants from './constants' const TAG = 'signal-StyleConfiguration'; diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 288e2317..6acc7e6c 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -14,12 +14,12 @@ */ import Constants from '../common/constants'; -import mSignalModel from '../SignalModel'; +import mSignalModel from '../signalModel'; import Log from '../../../../../../../common/src/main/ets/default/Log' import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' import StyleConfiguration from '../common/StyleConfiguration' import { StatusBarGroupComponentData -} from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' +} from '../../../../../../screenlock/src/main/ets/com/ohos/common/constants' import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vm/StatusBarVM' const TAG = 'SignalComponent-SignalIcon' @@ -36,7 +36,7 @@ export default struct SignalIcon { @State style: any = StyleConfiguration.getSignalComponentStyle() aboutToAppear() { - Log.signalIcon(TAG, 'aboutToAppear'); + Log.showInfo(TAG, 'aboutToAppear'); this.mStatusBarGroupComponentData = StatusBarVM.getStatusBarGroupComponentData(this.mGroupId) if (!this.signalObserved) { mSignalModel.initSignalModel(); @@ -45,7 +45,7 @@ export default struct SignalIcon { } aboutToDisappear() { - Log.signalIcon(TAG, 'aboutToDisappear'); + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts index 36077c61..d6e4f89b 100644 --- a/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -14,7 +14,7 @@ */ import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' -import Constants from './Constants' +import Constants from './constants' const TAG = 'wifi-StyleConfiguration'; diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index f73bafd3..f7e6e8eb 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -14,13 +14,13 @@ */ import Constants from '../common/constants' -import mWifiModel from '../WifiModel' +import mWifiModel from '../wifiModel' import Log from '../../../../../../../common/src/main/ets/default/Log' import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' import StyleConfiguration from '../common/StyleConfiguration' -import { StatusBarGroupComponentData -} from '../../../../../../screenlock/src/main/ets/com/ohos/common/Constants' -import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vM/StatusBarVM' +import {StatusBarGroupComponentData +} from '../../../../../../screenlock/src/main/ets/com/ohos/common/constants' +import StatusBarVM from '../../../../../../screenlock/src/main/ets/com/ohos/vm/StatusBarVM' const TAG = 'WifiComponent-WifiIcon' diff --git a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 02abf5ba..a1bf0ecd 100644 --- a/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -18,7 +18,7 @@ import windowManager from '@ohos.window' import WindowManagers, { WindowType } from "../../../../../../common/src/main/ets/default/WindowManager"; import display from '@ohos.display' import Log from '../../../../../../common/src/main/ets/default/Log' -import Constants from '../../../../../../features/screenlock/src/main/ets/com/ohos/common/Constants' +import Constants from '../../../../../../features/screenlock/src/main/ets/com/ohos/common/constants' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import sTimeManager from '../../../../../../common/src/main/ets/default/TimeManager' diff --git a/product/pc/src/main/ets/pages/mixedPassword.ets b/product/pc/src/main/ets/pages/mixedPassword.ets index 555eb022..52bbf6ba 100644 --- a/product/pc/src/main/ets/pages/mixedPassword.ets +++ b/product/pc/src/main/ets/pages/mixedPassword.ets @@ -17,7 +17,7 @@ import Log from '../../../../../../common/src/main/ets/default/Log' import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' -import MixedPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/MixedPSD' +import MixedPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' diff --git a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 0a53c074..5bec2b27 100644 --- a/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -17,7 +17,7 @@ import ServiceExtension from '@ohos.application.ServiceExtensionAbility' import windowManager from '@ohos.window' import display from '@ohos.display' import Log from '../../../../../../common/src/main/ets/default/Log' -import Constants from '../../../../../../features/screenlock/src/main/ets/com/ohos/common/Constants' +import Constants from '../../../../../../features/screenlock/src/main/ets/com/ohos/common/constants' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import sTimeManager from '../../../../../../common/src/main/ets/default/TimeManager' diff --git a/product/phone/src/main/ets/pages/mixedPassword.ets b/product/phone/src/main/ets/pages/mixedPassword.ets index 898931a5..96c9e7fc 100644 --- a/product/phone/src/main/ets/pages/mixedPassword.ets +++ b/product/phone/src/main/ets/pages/mixedPassword.ets @@ -17,7 +17,7 @@ import Log from '../../../../../../common/src/main/ets/default/Log' import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StatusBar from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/statusBar' -import MixedPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/MixedPSD' +import MixedPSD from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD' import Constants from '../common/constants' import StyleManager from '../common/StyleManager' -- Gitee From 4538f849646fdd2e13fb5a460653db562147f302 Mon Sep 17 00:00:00 2001 From: match Date: Thu, 26 May 2022 10:06:02 +0800 Subject: [PATCH 124/373] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: match --- .../com/ohos/common/StatusBarConfiguration.ts | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index 0ee2f2d5..dac12654 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -67,31 +67,21 @@ class StatusBarConfiguration { async getDirectionAndPosition() { Log.showInfo(TAG, 'getDirectionAndPosition'); directionStatus = await ResourceUtil.getConfiguration(); - Log.showInfo(TAG, 'getDirectionAndPosition' + 2); let style: any = CommonStyleConfiguration.getCommonStyle() let deviceTypeInfo = style.deviceTypeInfo if (directionStatus.direction == -1) { Log.showInfo(TAG, 'direction is -1'); statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) - if(deviceTypeInfo == 'phone'){ - shortSideLength = await ResourceUtil.getString($r("app.string.phone_status_bar_size_landscape")); - }else{ - shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); - } + shortSideLength = deviceTypeInfo == 'phone' ? await ResourceUtil.getString($r("app.string.phone_status_bar_size_landscape")) + : await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); } else if (directionStatus.direction == 1) { statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) - if(deviceTypeInfo == 'phone'){ - shortSideLength = await ResourceUtil.getString($r("app.string.phone_status_bar_size_landscape")); - }else{ - shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); - } + shortSideLength = deviceTypeInfo == 'phone' ? await ResourceUtil.getString($r("app.string.phone_status_bar_size_landscape")) + : await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); } else { statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_portrait")) - if(deviceTypeInfo == 'phone'){ - shortSideLength = await ResourceUtil.getString($r("app.string.phone_status_bar_size_portrait")); - }else{ - shortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_portrait")); - } + shortSideLength = deviceTypeInfo == 'phone' ? await ResourceUtil.getString($r("app.string.phone_status_bar_size_portrait")) + : await ResourceUtil.getString($r("app.string.status_bar_size_portrait")); } shortSideLength = parseInt(shortSideLength) + ''; Log.showInfo(TAG, 'directionStatus = ' + directionStatus.direction + 'statusbarPosition = ' + statusbarPosition + -- Gitee From f85b3c9e77b177fa274dfadd60cb10a58d4bd66f Mon Sep 17 00:00:00 2001 From: match Date: Thu, 26 May 2022 10:14:50 +0800 Subject: [PATCH 125/373] =?UTF-8?q?back.svg=E8=B5=84=E6=BA=90=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: match --- .../src/main/resources/base/media/ic_back.svg | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/features/managementcomponent/src/main/resources/base/media/ic_back.svg b/features/managementcomponent/src/main/resources/base/media/ic_back.svg index efbe194a..50e4ecd5 100644 --- a/features/managementcomponent/src/main/resources/base/media/ic_back.svg +++ b/features/managementcomponent/src/main/resources/base/media/ic_back.svg @@ -1,18 +1,13 @@ - - - - - + + + Public/ic_public_back + + + + + + + + + + \ No newline at end of file -- Gitee From 2b097a24e2ac31a93c47ae65c9654455e540689f Mon Sep 17 00:00:00 2001 From: match Date: Thu, 26 May 2022 10:22:21 +0800 Subject: [PATCH 126/373] =?UTF-8?q?back.svg=E8=B5=84=E6=BA=90=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: match --- .../src/main/resources/base/media/ic_back.svg | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/product/default/notificationmanagement/src/main/resources/base/media/ic_back.svg b/product/default/notificationmanagement/src/main/resources/base/media/ic_back.svg index efbe194a..50e4ecd5 100644 --- a/product/default/notificationmanagement/src/main/resources/base/media/ic_back.svg +++ b/product/default/notificationmanagement/src/main/resources/base/media/ic_back.svg @@ -1,18 +1,13 @@ - - - - - + + + Public/ic_public_back + + + + + + + + + + \ No newline at end of file -- Gitee From af02a0ef04b43e3debf48e374383e097b6b983b7 Mon Sep 17 00:00:00 2001 From: limengmeng Date: Thu, 26 May 2022 19:53:45 +0800 Subject: [PATCH 127/373] =?UTF-8?q?=E9=94=81=E5=B1=8F=E7=9A=84=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E6=B6=88=E6=81=AF=E5=92=8C=E6=B7=B7=E5=90=88=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: limengmeng --- common/src/main/ets/default/LunarCalendar.ts | 156 +++++++++++ .../ets/com/ohos/view/component/dateTime.ets | 44 ++- .../main/resources/base/element/float.json | 17 +- .../main/resources/phone/element/float.json | 40 +++ .../view/NotificationListComponent.ets | 2 +- .../noticeItem/view/item/confirmDialog.ets | 19 +- .../ohos/noticeItem/view/item/generalItem.ets | 1 + .../ohos/noticeItem/view/item/groupItem.ets | 4 +- .../noticeItem/view/item/notificationItem.ets | 5 +- .../noticeItem/view/item/settingDialog.ets | 25 +- .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/float.json | 40 +++ .../main/resources/phone/element/color.json | 64 +++++ .../main/resources/phone/element/float.json | 260 ++++++++++++++++++ .../src/main/ets/com/ohos/common/constants.ts | 3 + .../ets/com/ohos/view/component/lockIcon.ets | 1 + .../ets/com/ohos/view/component/mixedPSD.ets | 150 +++++++--- .../main/resources/base/element/float.json | 16 ++ .../main/resources/phone/element/float.json | 36 ++- .../phone/src/main/ets/common/constants.ts | 2 + .../src/main/ets/pages/mixedPassword.ets | 25 +- .../src/main/ets/pages/slidescreenlock.ets | 7 +- .../main/resources/base/element/float.json | 10 +- 23 files changed, 840 insertions(+), 95 deletions(-) create mode 100644 common/src/main/ets/default/LunarCalendar.ts create mode 100644 features/datetimecomponent/src/main/resources/phone/element/float.json create mode 100644 features/noticeitem/src/main/resources/phone/element/color.json create mode 100644 features/noticeitem/src/main/resources/phone/element/float.json diff --git a/common/src/main/ets/default/LunarCalendar.ts b/common/src/main/ets/default/LunarCalendar.ts new file mode 100644 index 00000000..e31d7aae --- /dev/null +++ b/common/src/main/ets/default/LunarCalendar.ts @@ -0,0 +1,156 @@ +export function ConvertLunarCalendar(gregorianCalendarYear, gregorianCalendarMonth, gregorianCalendarDay) { + let lunarIndex1 = 2, + lunarIndex2 = 9, + lunarIndex3 = 10, + lunarIndex4 = 11, + lunarDay1 = 20, + lunarDay2 = 21, + hour = 24, + minutes = 60, + multiple = 1000, + initialLunarTime = 1949 + + let lunarMonth = ['正', '二', '三', '四', '五', '六', '七', '八', '九', '十', '冬', '腊'], + lunarDay = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '初', '廿'], + heavenlyStemsAnd = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'], + earthlyBranches = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥']; + let lunarCalendar = [ + 0x0b557, + 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, + 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, + 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, + 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, + 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, + 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, + 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, + 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, + 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, + 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, + 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, + 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, + 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, + 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, + 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, + 0x0d520 + ] + + function ConvertLunarCalendar(gregorianCalendarYear, gregorianCalendarMonth, gregorianCalendarDay) { + gregorianCalendarMonth -= 1; + let daySpan = (Date.UTC(gregorianCalendarYear, gregorianCalendarMonth, gregorianCalendarDay) - Date.UTC(initialLunarTime, 0, leapFebruarySmallDay)) / (hour * minutes * minutes * multiple) + 1; + let outputLunarYear, outputLunarMonth, outputLunarDay; + for (let j = 0; j < lunarCalendar.length; j++) { + daySpan -= lunarYearDays(lunarCalendar[j]); + if (daySpan <= 0) { + outputLunarYear = initialLunarTime + j; + daySpan += lunarYearDays(lunarCalendar[j]); + break + } + } + for (let k = 0; k < lunarYearMonths(lunarCalendar[outputLunarYear - initialLunarTime]).length; k++) { + daySpan -= lunarYearMonths(lunarCalendar[outputLunarYear - initialLunarTime])[k]; + if (daySpan <= 0) { + if (hasLeapMonth(lunarCalendar[outputLunarYear - initialLunarTime]) > -1 && hasLeapMonth(lunarCalendar[outputLunarYear - initialLunarTime]) <= k) { + if (hasLeapMonth(lunarCalendar[outputLunarYear - initialLunarTime]) < k) { + outputLunarMonth = k; + } else if (hasLeapMonth(lunarCalendar[outputLunarYear - initialLunarTime]) === k) { + outputLunarMonth = '闰' + k; + } else { + outputLunarMonth = k + 1; + } + } else { + outputLunarMonth = k + 1; + } + daySpan += lunarYearMonths(lunarCalendar[outputLunarYear - initialLunarTime])[k]; + break + } + } + outputLunarDay = daySpan; + if (hasLeapMonth(lunarCalendar[outputLunarYear - initialLunarTime]) > -1 && (typeof (outputLunarMonth) === 'string' && outputLunarMonth.indexOf('闰') > -1)) { + let reg = /\d/.exec(outputLunarMonth) + outputLunarMonth = `闰${lunarMonth[Number(reg)- 1]}` + } else { + outputLunarMonth = lunarMonth[outputLunarMonth - 1]; + } + outputLunarYear = getHeavenlyStemsAnd(outputLunarYear) + getEarthlyBranches(outputLunarYear); + if (outputLunarDay < lunarIndex4) { + outputLunarDay = `${lunarDay[lunarIndex3]}${lunarDay[outputLunarDay-1]}` + } else if (outputLunarDay > lunarIndex3 && outputLunarDay < lunarDay1) { + outputLunarDay = `${lunarDay[lunarIndex2]}${lunarDay[outputLunarDay-lunarIndex4]}` + } else if (outputLunarDay === lunarDay1) { + outputLunarDay = `${lunarDay[1]}${lunarDay[lunarIndex2]}` + } else if (outputLunarDay > lunarDay1 && outputLunarDay < leapFebruaryBigDay) { + outputLunarDay = `${lunarDay[lunarIndex4]}${lunarDay[outputLunarDay-lunarDay2]}` + } else if (outputLunarDay === leapFebruaryBigDay) { + outputLunarDay = `${lunarDay[lunarIndex1]}${lunarDay[lunarIndex2]}` + } + return { + lunarYear: outputLunarYear, + lunarMonth: outputLunarMonth, + lunarDay: outputLunarDay, + } + } + + function hasLeapMonth(outputLunarYear) { + let lastHexadecimalDigit = 0xf + if (outputLunarYear & lastHexadecimalDigit) { + return outputLunarYear & lastHexadecimalDigit + } else { + return -1 + } + } + + let leapFebruarySmallDay = 29, + leapFebruaryBigDay = 30 + + function leapMonthDays(outputLunarYear) { + let hexadecimalFirstDigit = 0xf0000 + if (hasLeapMonth(outputLunarYear) > -1) { + return (outputLunarYear & hexadecimalFirstDigit) ? leapFebruaryBigDay : leapFebruarySmallDay + } else { + return 0 + } + } + + let convertToHexDigit = 0x8000, + convertToHex = 0x8 + + function lunarYearDays(outputLunarYear) { + let totalDays = 0; + for (let i = convertToHexDigit; i > convertToHex; i >>= 1) { + let monthDays = (outputLunarYear & i) ? leapFebruaryBigDay : leapFebruarySmallDay; + totalDays += monthDays; + } + if (hasLeapMonth(outputLunarYear) > -1) { + totalDays += leapMonthDays(outputLunarYear); + } + return totalDays + } + + function lunarYearMonths(outputLunarYear) { + let monthArr = []; + for (let i = convertToHexDigit; i > convertToHex; i >>= 1) { + monthArr.push((outputLunarYear & i) ? leapFebruaryBigDay : leapFebruarySmallDay); + } + if (hasLeapMonth(outputLunarYear)) { + monthArr.splice(hasLeapMonth(outputLunarYear), 0, leapMonthDays(outputLunarYear)); + } + return monthArr + } + + let Day3 = 3 + + function getHeavenlyStemsAnd(outputLunarYear) { + let heavenlyStemsAndKey = (outputLunarYear - Day3) % lunarIndex3; + if (heavenlyStemsAndKey === 0) heavenlyStemsAndKey = lunarIndex3; + return heavenlyStemsAnd[heavenlyStemsAndKey - 1] + } + + function getEarthlyBranches(outputLunarYear) { + let monthMultiple = 12 + let EarthlyBranchesKey = (outputLunarYear - Day3) % monthMultiple; + if (EarthlyBranchesKey === 0) EarthlyBranchesKey = monthMultiple; + return earthlyBranches[EarthlyBranchesKey - 1] + } + + return ConvertLunarCalendar(gregorianCalendarYear, gregorianCalendarMonth, gregorianCalendarDay) +} \ No newline at end of file diff --git a/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets b/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets index 9e93e93f..1eb9c5d8 100644 --- a/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets +++ b/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets @@ -16,18 +16,38 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import ViewModel from '../../vm/dateTimeViewModel' import Constants from '../../common/constants' -import {ScreenLockStatus} from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon' +import { ScreenLockStatus } from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon' +import { ConvertLunarCalendar } from '../../../../../../../../../common/src/main/ets/default/LunarCalendar' +import deviceInfo from '@ohos.deviceInfo'; +const DEVICETYPE = deviceInfo.deviceType; const TAG = 'ScreenLock-DateTime' + @Component export default struct DateTime { @State mViewModel: ViewModel = new ViewModel() @Prop isShowDate: boolean + @State year: string = '' + @State month: string = '' + @State day: string = '' + @State isPhone: boolean = false aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() + this.year = + ConvertLunarCalendar(this.mViewModel.dateVal.year, this.mViewModel.dateVal.month, this.mViewModel.dateVal.day) + .lunarYear + this.month = + ConvertLunarCalendar(this.mViewModel.dateVal.year, this.mViewModel.dateVal.month, this.mViewModel.dateVal.day) + .lunarMonth + this.day = + ConvertLunarCalendar(this.mViewModel.dateVal.year, this.mViewModel.dateVal.month, this.mViewModel.dateVal.day) + .lunarDay + if (DEVICETYPE == 'phone') { + this.isPhone = true + } } aboutToDisappear() { @@ -41,14 +61,30 @@ export default struct DateTime { .fontSize($r('app.float.time_fontsize')) .fontColor($r('app.color.date_time_color')) .margin({ top: $r('app.float.time_top_margin'), bottom: $r('app.float.time_bottom_margin') }) + .fontWeight(300) + .fontFamily("Digit") if (this.isShowDate) { Row() { - Text($r('app.string.yyyy_mm_dd', this.mViewModel.dateVal.year, this.mViewModel.dateVal.month, this.mViewModel.dateVal.day)) - .fontSize($r('app.float.date_fontsize')) - .fontColor($r('app.color.date_time_color')) + if (this.isPhone) { + Text(this.mViewModel.dateVal.month + "月" + this.mViewModel.dateVal.day + "日") + .fontSize($r('app.float.date_fontsize')) + .fontColor($r('app.color.date_time_color')) + } else { + Text($r('app.string.yyyy_mm_dd', this.mViewModel.dateVal.year, this.mViewModel.dateVal.month, this.mViewModel.dateVal.day)) + .fontSize($r('app.float.date_fontsize')) + .fontColor($r('app.color.date_time_color')) + } Text(this.mViewModel.weekVal).fontSize($r('app.float.date_fontsize')) .fontColor($r('app.color.date_time_color')) }.height($r('app.float.date_week_area_height')) + + Row() { + Text(this.year + '年' + this.month + '月' + this.day) + .height($r("app.float.date_lunar_calendar_height")) + .fontColor(Color.White) + .fontSize($r("app.float.date_lunar_calendar_fontSize")) + .margin({ top: 6 }) + } } } .width(Constants.FULL_CONTAINER_WIDTH) diff --git a/features/datetimecomponent/src/main/resources/base/element/float.json b/features/datetimecomponent/src/main/resources/base/element/float.json index 5c5ee149..5a9bb745 100644 --- a/features/datetimecomponent/src/main/resources/base/element/float.json +++ b/features/datetimecomponent/src/main/resources/base/element/float.json @@ -4,6 +4,10 @@ "name": "time_fontsize", "value": "148" }, + { + "name": "time_fontWeight", + "value": "400" + }, { "name": "time_top_margin", "value": "10" @@ -19,7 +23,18 @@ { "name": "date_week_area_height", "value": "48" + }, + { + "name": "date_lunar_calendar_height", + "value": "0" + }, + { + "name": "date_lunar_calendar_fontSize", + "value": "14fp" + }, + { + "name": "date_lunar_calendar_top_margin", + "value": "6vp" } - ] } \ No newline at end of file diff --git a/features/datetimecomponent/src/main/resources/phone/element/float.json b/features/datetimecomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..f40d0b48 --- /dev/null +++ b/features/datetimecomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,40 @@ +{ + "float": [ + { + "name": "time_fontsize", + "value": "72fp" + }, + { + "name": "time_fontWeight", + "value": "300" + }, + { + "name": "time_top_margin", + "value": "11vp" + }, + { + "name": "time_bottom_margin", + "value": "3vp" + }, + { + "name": "date_fontsize", + "value": "18fp" + }, + { + "name": "date_week_area_height", + "value": "24vp" + }, + { + "name": "date_lunar_calendar_height", + "value": "19vp" + }, + { + "name": "date_lunar_calendar_fontSize", + "value": "14fp" + }, + { + "name": "date_lunar_calendar_top_margin", + "value": "6vp" + } + ] +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index e48c7011..53f9cef2 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -57,6 +57,6 @@ export default struct NotificationListComponent { } }, (list: any) => JSON.stringify(list.map((item) => item.hashcode))) } - .width('100%') + .width($r("app.float.notificationList_width")) } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets index b52144d1..e145a9ca 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/confirmDialog.ets @@ -34,26 +34,27 @@ export default struct ConfirmDialog { Row() { Text(this.title) .fontSize($r('app.float.confirm_title_fontsize')) - .fontWeight(FontWeight.Bold) - }.width(Constants.SETTING_DIALOG_WITH) - .margin({top:$r('app.float.title_font_margin_t')}) + .fontWeight(FontWeight.Medium) + }.width($r("app.float.confirm_title_width")) + .margin({ top: $r('app.float.title_font_margin_t') }) Row() { Text($r('app.string.confirm_message', this.bundleName)) .fontSize($r('app.float.confirm_cont_fontsize')) - }.width(Constants.SETTING_DIALOG_WITH) - .margin({top:$r('app.float.message_font_margin_t')}) + }.width($r("app.float.confirm_title_width")) + .margin({ top: $r('app.float.message_font_margin_t') }) Row() { Column() { Text($r('app.string.cancel')) .fontSize($r('app.float.confirm_cont_fontsize')) - .fontColor(Color.Blue) + .fontColor($r("app.color.dialog_back_color")) }.onClick(() => { this.controller.close(); }) .alignItems(HorizontalAlign.Center) .width(Constants.CONFIRM_BUTTON_WITH) + Divider() .vertical(true) .color($r('app.color.confirm_divider_color')) @@ -62,7 +63,7 @@ export default struct ConfirmDialog { Column() { Text($r('app.string.close')) .fontSize($r('app.float.confirm_cont_fontsize')) - .fontColor(Color.Red) + .fontColor($r("app.color.confirm_text_color")) }.onClick(() => { Log.showDebug(TAG, `confirm button of TimeDialog on click`) this.controller.close(); @@ -72,9 +73,9 @@ export default struct ConfirmDialog { .width(Constants.CONFIRM_BUTTON_WITH) } .width(Constants.CONFIRM_DIALOG_WITH) - .margin({top:$r('app.float.confirm_button_margin_t')}) + .margin({ top: $r('app.float.confirm_button_margin_t') }) }.height(Constants.CONFIRM_DIALOG_HEIGHT) - .width(Constants.SETTING_DIALOG_WIDTH) + .width($r("app.float.setting_dialog_Width")) .backgroundColor('#FFFFFFFF') .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.notification_border_radius') }) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index 8f3d3554..5c0c40f9 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -138,6 +138,7 @@ struct ContentComponent { .objectFit(ImageFit.Contain) .width(Layout.NOTIFICATION_PIC_SIZE) .height(Layout.NOTIFICATION_PIC_SIZE) + .borderRadius($r("app.float.device_image_radius")) } }.margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index f05f23c2..a5ec656a 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -61,7 +61,9 @@ export default struct GroupItem { }) }.backgroundColor($r('app.color.notificationitem_background')) .width(Constants.FULL_CONTAINER_WIDTH) - + if (this.toExpand) { + Row() {}.height(1) + } Row() { ContentList({ groupData: this.groupData, toExpand: this.toExpand }) }.width(Constants.FULL_CONTAINER_WIDTH) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 5c7c157f..8d38bc82 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -56,9 +56,10 @@ export default struct NotificationItem { || (!this.mEdgeEnd && this.mScroller.currentOffset().xOffset > Layout.SCROLL_THRESHOLD) ScrollbarManager.restoreOtherScroll(this.mScroller); }) + .borderRadius(!this.isSubItem ? $r("sys.float.ohos_id_corner_radius_default_l") : 0) + .clip(!this.isSubItem) }.width(this.itemWidth) - .borderRadius(!this.isSubItem ? $r("sys.float.ohos_id_corner_radius_default_l") : 0) - .clip(!this.isSubItem) + } scrollEdge() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets index 563ede0c..6a8b1f1c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/settingDialog.ets @@ -39,12 +39,13 @@ export default struct SettingDialog { .objectFit(ImageFit.Contain) .width($r('app.float.title_image_width')) .height($r('app.float.title_image_height')) + .margin({ left: $r("app.float.title_image_left_margin"), right: $r("app.float.title_image_right_margin") }) } Text(this.itemData.appName) .fontSize($r('app.float.setting_title_fontsize')) .fontWeight(500) }.width(Constants.SETTING_DIALOG_WITH) - .margin( {top: $r('app.float.notification_appname_margin_top')} ) + .margin({ top: $r('app.float.notification_appname_margin_top') }) .height($r('app.float.title_font_height')) Row() { @@ -52,11 +53,11 @@ export default struct SettingDialog { Text($r('app.string.closeNotification')) .fontSize($r('app.float.setting_cont_fontsize')) .fontColor($r('app.color.dialog_font_color')) - .height(Constants.SETTING_CONT_HEIGHT) + .height($r("app.float.setting_cont_height")) }.alignItems(HorizontalAlign.Center) - .width(Constants.SETTING_CONTENT_WITH) + .width($r("app.float.setting_cont_width")) } - .width(Constants.SETTING_DIALOG_WITH) + .width($r("app.float.setting_dialog_width")) .alignItems(VerticalAlign.Center) .align(Alignment.Center) .margin({ top: $r('app.float.close_notification_margin_top') }) @@ -72,10 +73,10 @@ export default struct SettingDialog { .fontColor($r('app.color.dialog_font_back_color')) .height(Constants.SETTING_CONT_HEIGHT) }.alignItems(HorizontalAlign.Center) - .width(Constants.SETTING_CONTENT_WITH) + .width($r("app.float.setting_cont_width")) .align(Alignment.Center) } - .width(Constants.SETTING_DIALOG_WITH) + .width($r("app.float.setting_dialog_width")) .alignItems(VerticalAlign.Center) .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.setting_border_radius') }) @@ -90,10 +91,10 @@ export default struct SettingDialog { .fontSize($r('app.float.setting_cont_fontsize')) .fontColor($r('app.color.dialog_font_back_color')) }.alignItems(HorizontalAlign.Center) - .width(Constants.SETTING_CONTENT_WITH) + .width($r("app.float.setting_cont_width")) } - .width(Constants.SETTING_DIALOG_WITH) - .margin( {top: $r('app.float.notification_cancle_margin_top')} ) + .width($r("app.float.setting_dialog_width")) + .margin({ top: $r('app.float.notification_cancle_margin_top') }) .alignItems(VerticalAlign.Center) .align(Alignment.Center) .border({ width: $r('app.float.setting_border_width'), color: Color.White, @@ -101,9 +102,9 @@ export default struct SettingDialog { .backgroundColor($r('app.color.dialog_font_color')) .onClick(this.closeAbility.bind(this)) }.height(Constants.SETTING_DIALOG_HEIGHT) - .width(Constants.SETTING_DIALOG_WIDTH) - .backgroundColor('#FFFFFFFF') - .border({ width: $r('app.float.setting_border_width'), color: Color.White, + .width($r("app.float.setting_dialog_Width")) + .backgroundColor('#FFFFFFFF') + .border({ width: $r('app.float.setting_border_width'), color: Color.White, radius: $r('app.float.notification_border_radius') }) } diff --git a/features/noticeitem/src/main/resources/base/element/color.json b/features/noticeitem/src/main/resources/base/element/color.json index 8a700e4e..41bd2dd9 100644 --- a/features/noticeitem/src/main/resources/base/element/color.json +++ b/features/noticeitem/src/main/resources/base/element/color.json @@ -32,10 +32,18 @@ "name":"dialog_font_back_color", "value":"#0759f6" }, + { + "name":"dialog_back_color", + "value":"#FF0000FF" + }, { "name": "confirm_divider_color", "value": "#E3E3E3" }, + { + "name": "confirm_text_color", + "value": "#FFFF0000" + }, { "name":"action_button_click_color", "value":"#0D000000" diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index 4adf75a2..85d6e872 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -1,5 +1,9 @@ { "float": [ + { + "name": "notificationList_width", + "value": "834vp" + }, { "name": "notification_title_fontsize", "value": "20" @@ -92,6 +96,14 @@ "name": "title_image_height", "value": "30" }, + { + "name": "title_image_left_margin", + "value": "0" + }, + { + "name": "title_image_right_margin", + "value": "0" + }, { "name": "title_font_height", "value": "28vp" @@ -132,6 +144,14 @@ "name": "setting_cont_fontsize", "value": "32" }, + { + "name": "setting_cont_height", + "value": "40vp" + }, + { + "name": "setting_cont_width", + "value": "300vp" + }, { "name": "setting_border_width", "value": "1" @@ -160,6 +180,10 @@ "name": "confirm_title_fontsize", "value": "40" }, + { + "name": "confirm_title_width", + "value": "330vp" + }, { "name": "confirm_cont_fontsize", "value": "32" @@ -176,6 +200,10 @@ "name": "confirm_button_margin_t", "value": "23vp" }, + { + "name": "confirm_button_width", + "value": "140" + }, { "name": "icon_item_fontsize", "value": "18" @@ -184,6 +212,14 @@ "name": "setting_dialog_dy", "value": "200" }, + { + "name": "setting_dialog_width", + "value": "330vp" + }, + { + "name": "setting_dialog_Width", + "value": "362vp" + }, { "name": "confirm_dialog_dy", "value": "250" @@ -215,6 +251,10 @@ { "name": "device_border_radius", "value": "30" + }, + { + "name": "device_image_radius", + "value": "0" } ] } \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/phone/element/color.json b/features/noticeitem/src/main/resources/phone/element/color.json new file mode 100644 index 00000000..2954abd8 --- /dev/null +++ b/features/noticeitem/src/main/resources/phone/element/color.json @@ -0,0 +1,64 @@ +{ + "color": [ + { + "name": "notificationitem_background", + "value": "#F2F1F3F5" + }, + { + "name": "title_text_color", + "value": "#222D37" + }, + { + "name": "content_text_color", + "value": "#FF435563" + }, + { + "name": "name_text_color", + "value": "#435563" + }, + { + "name": "nonotification_text_color", + "value": "#ffffffff" + }, + { + "name": "dialog_font_color", + "value": "#ffffff" + }, + { + "name": "action_button_color", + "value": "#007DFF" + }, + { + "name": "dialog_font_back_color", + "value": "#007DFF" + }, + { + "name": "dialog_back_color", + "value": "#007DFF" + }, + { + "name": "confirm_divider_color", + "value": "#E3E3E3" + }, + { + "name": "confirm_text_color", + "value": "#007DFF" + }, + { + "name": "action_button_click_color", + "value": "#0D000000" + }, + { + "name": "transparent", + "value": "#00000000" + }, + { + "name": "button_background", + "value": "#4d000000" + }, + { + "name": "device_divider_color", + "value": "transparent" + } + ] +} \ No newline at end of file diff --git a/features/noticeitem/src/main/resources/phone/element/float.json b/features/noticeitem/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..f984f39a --- /dev/null +++ b/features/noticeitem/src/main/resources/phone/element/float.json @@ -0,0 +1,260 @@ +{ + "float": [ + { + "name": "notificationList_width", + "value": "336vp" + }, + { + "name": "notification_title_fontsize", + "value": "20" + }, + { + "name": "notification_expanded_text_maxheight", + "value": "295" + }, + { + "name": "notification_content_fontsize", + "value": "20" + }, + { + "name": "notification_content_lineheight", + "value": "20" + }, + { + "name": "notification_content_maxlines", + "value": "1" + }, + { + "name": "content_margin_top", + "value": "10" + }, + { + "name": "body_margin_top", + "value": "10" + }, + { + "name": "item_opicaty", + "value": "0.9" + }, + { + "name": "item_borderradius", + "value": "20" + }, + { + "name": "item_margintop", + "value": "10" + }, + { + "name": "item_marginleft", + "value": "10" + }, + { + "name": "item_marginright", + "value": "10" + }, + { + "name": "item_paddingleft", + "value": "20" + }, + { + "name": "item_paddingright", + "value": "20" + }, + { + "name": "item_paddingbottom", + "value": "20" + }, + { + "name": "item_setting_image_width", + "value": "30" + }, + { + "name": "item_setting_image_height", + "value": "30" + }, + { + "name": "item_delete_image_width", + "value": "30" + }, + { + "name": "item_delete_image_height", + "value": "30" + }, + { + "name": "titleitem_row_space", + "value": "10" + }, + { + "name": "titleitem_height", + "value": "50" + }, + { + "name": "title_image_width", + "value": "24vp" + }, + { + "name": "title_image_height", + "value": "24vp" + }, + { + "name": "title_image_left_margin", + "value": "24vp" + }, + { + "name": "title_image_right_margin", + "value": "8vp" + }, + { + "name": "title_font_height", + "value": "28vp" + }, + { + "name": "title_font_margin_t", + "value": "13vp" + }, + { + "name": "message_font_margin_t", + "value": "23vp" + }, + { + "name": "title_name_fontsize", + "value": "20" + }, + { + "name": "title_time_fontsize", + "value": "20" + }, + { + "name": "displayicon_width", + "value": "20" + }, + { + "name": "displayicon_height", + "value": "20" + }, + { + "name": "deleteall_image_opacity", + "value": "0.9" + }, + { + "name": "setting_title_fontsize", + "value": "20fp" + }, + { + "name": "setting_cont_fontsize", + "value": "16fp" + }, + { + "name": "setting_cont_height", + "value": "40vp" + }, + { + "name": "setting_cont_width", + "value": "288vp" + }, + { + "name": "setting_border_width", + "value": "1" + }, + { + "name": "setting_border_radius", + "value": "80" + }, + { + "name": "notification_border_radius", + "value": "24vp" + }, + { + "name": "action_button_height", + "value": "48" + }, + { + "name": "action_button_padding", + "value": "12" + }, + { + "name": "picture_default_height", + "value": "300" + }, + { + "name": "confirm_title_fontsize", + "value": "20fp" + }, + { + "name": "confirm_title_width", + "value": "288vp" + }, + { + "name": "confirm_cont_fontsize", + "value": "16fp" + }, + { + "name": "confirm_divider_height", + "value": "24vp" + }, + { + "name": "confirm_button_height", + "value": "60" + }, + { + "name": "confirm_button_margin_t", + "value": "23vp" + }, + { + "name": "confirm_button_width", + "value": "128fp" + }, + { + "name": "icon_item_fontsize", + "value": "18" + }, + { + "name": "setting_dialog_dy", + "value": "288vp" + }, + { + "name": "setting_dialog_width", + "value": "304vp" + }, + { + "name": "setting_dialog_Width", + "value": "336vp" + }, + { + "name": "confirm_dialog_dy", + "value": "310vp" + }, + { + "name": "close_notification_margin_top", + "value": "17vp" + }, + { + "name": "notification_appname_margin_top", + "value": "11vp" + }, + { + "name": "notification_cancle_margin_top", + "value": "9vp" + }, + { + "name": "device_divider_margin_l", + "value": "70" + }, + { + "name": "device_divider_margin_r", + "value": "30" + }, + { + "name": "device_border_width", + "value": "1" + }, + { + "name": "device_border_radius", + "value": "30" + }, + { + "name": "device_image_radius", + "value": "12vp" + } + ] +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/common/constants.ts b/features/screenlock/src/main/ets/com/ohos/common/constants.ts index 2d9e6876..50a95148 100644 --- a/features/screenlock/src/main/ets/com/ohos/common/constants.ts +++ b/features/screenlock/src/main/ets/com/ohos/common/constants.ts @@ -133,6 +133,9 @@ export default class Constants { }]; //max password length static PASSWORD_MAX_LEN = 32 + static PASSWORD_TEXT_WIDTH =290 + static PASSWORD_TEXT_HEIGHT =40 + static PASSWORD_TEXT_BORDER =20 static ACCOUNT_SPACE = 24 } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets index 69810271..a27bdd9d 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/lockIcon.ets @@ -40,6 +40,7 @@ export default struct LockIcon { .fillColor($r('app.color.lock_ic_color')) Text(this.mViewModel.cutMessage).fontSize($r('app.float.lock_prompt_fontsize')) .fontColor($r('app.color.lock_prompt_color')) + .margin({ top: $r("app.float.lock_Text_top_margin") }) } .width(Constants.FULL_CONTAINER_WIDTH) .gesture(GestureGroup(GestureMode.Exclusive, TapGesture({ count: 2 }) diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets index 82bd579d..c1767fe5 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets @@ -16,7 +16,9 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' import ViewModel from '../../vm/mixedPSDViewModel' +import deviceInfo from '@ohos.deviceInfo'; +const DEVICETYPE = deviceInfo.deviceType; const TAG = 'ScreenLock-MixedPSD' @Component @@ -37,61 +39,127 @@ export default struct MixedPSD { build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Text(this.mViewModel.prompt) - .fontSize($r('app.float.mixedpsd_prompt_fontsize')) - .fontWeight(FontWeight.Bold) - .fontColor(Color.White) - .margin({ bottom: $r('app.float.mixedpsd_prompt_margin_bottom') }) - .textAlign(TextAlign.Center) - .textOverflow({ overflow: TextOverflow.None }) - .width($r('app.float.mixedpsd_prompt_width')) - .height($r('app.float.mixedpsd_prompt_height')) - - TextInput({ placeholder: '', text: this.mViewModel.password }) - .type(InputType.Password) - .maxLength(Constants.PASSWORD_MAX_LEN) - .fontSize($r('app.float.mixedpsd_prompt_fontsize')) - .width($r('app.float.mixedpsd_input_width')) - .height($r('app.float.mixedpsd_input_height')) - .backgroundColor(Color.White) - .enterKeyType(EnterKeyType.Done) - .border({ width: 2, color: Color.Gray, radius: 15 }) - .enabled(!this.mViewModel.inhibitInput) - .onChange(this.mViewModel.onInputChange.bind(this.mViewModel)) - .onSubmit((entryKey) => { - this.mViewModel.onAuthPassword(() => { - Log.showInfo(TAG, `onSubmit callback prompt:${this.mViewModel.prompt} inhibitInput:${this.mViewModel.inhibitInput}`) - }) - }) - .margin({ bottom: $r('app.float.mixedpsd_input_margin_bottom') }) - - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { - Text($r('app.string.emergency_call')) + if (DEVICETYPE == 'phone') { + Column() { + Text(this.mViewModel.prompt) .fontSize($r('app.float.mixedpsd_prompt_fontsize')) - .fontWeight(FontWeight.Bold) + .fontWeight(FontWeight.Medium) .fontColor(Color.White) + .margin({ + bottom: $r('app.float.mixedpsd_prompt_margin_bottom'), + top: $r("app.float.mixedpsd_prompt_margin_top") + }) .textAlign(TextAlign.Center) .textOverflow({ overflow: TextOverflow.None }) - .onClick(this.mViewModel.onCallPhone.bind(this.mViewModel)); + .width($r('app.float.mixedpsd_prompt_width')) + .height($r('app.float.mixedpsd_prompt_height')) + + TextInput({ placeholder: '', text: this.mViewModel.password }) + // .textAlign(TextAlign.Center) + // .showPasswordIcon(false) + .type(InputType.Password) + .maxLength(Constants.PASSWORD_MAX_LEN) + .fontSize($r('app.float.mixedpsd_prompt_text_fontsize')) + .width($r('app.float.mixedpsd_input_width')) + .height($r('app.float.mixedpsd_input_height')) + .backgroundColor("rgba(255,255,255,0.2)") + .fontColor(Color.White) + .enterKeyType(EnterKeyType.Done) + .enabled(!this.mViewModel.inhibitInput) + .onChange(this.mViewModel.onInputChange.bind(this.mViewModel)) + .onSubmit((entryKey) => { + this.mViewModel.onAuthPassword(() => { + Log.showInfo(TAG, `onSubmit callback prompt:${this.mViewModel.prompt} inhibitInput:${this.mViewModel.inhibitInput}`) + }) + }) + .margin({ bottom: $r('app.float.mixedpsd_input_margin_bottom') }) + Column() { + Text('确认') + .fontSize($r('app.float.mixedpsd_prompt_fontsize')) + .width(Constants.PASSWORD_TEXT_WIDTH) + .height(Constants.PASSWORD_TEXT_HEIGHT) + .backgroundColor('#0a59f7') + .fontWeight(FontWeight.Medium) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .borderRadius(Constants.PASSWORD_TEXT_BORDER) + .onClick(() => { + Log.showInfo(TAG, `onClick`) + this.mViewModel.onAuthPassword(() => { + Log.showInfo(TAG, `onClick callback prompt:${this.mViewModel.prompt} inhibitInput:${this.mViewModel.inhibitInput}`) + }); + }) + Text($r('app.string.emergency_call')) + .fontSize($r('app.float.mixedpsd_prompt_fontsize')) + .fontWeight(FontWeight.Medium) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .margin({ top: Constants.ACCOUNT_SPACE }) + .onClick(this.mViewModel.onCallPhone.bind(this.mViewModel)); + } + .width(Constants.HALF_CONTAINER_WIDTH) + }.width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) - Text($r('app.string.done')) + + } else { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text(this.mViewModel.prompt) .fontSize($r('app.float.mixedpsd_prompt_fontsize')) .fontWeight(FontWeight.Bold) .fontColor(Color.White) + .margin({ bottom: $r('app.float.mixedpsd_prompt_margin_bottom') }) .textAlign(TextAlign.Center) .textOverflow({ overflow: TextOverflow.None }) - .onClick(() => { - Log.showInfo(TAG, `onClick`) + .width($r('app.float.mixedpsd_prompt_width')) + .height($r('app.float.mixedpsd_prompt_height')) + + TextInput({ placeholder: '', text: this.mViewModel.password }) + .type(InputType.Password) + .maxLength(Constants.PASSWORD_MAX_LEN) + .fontSize($r('app.float.mixedpsd_prompt_text_fontsize')) + .width($r('app.float.mixedpsd_input_width')) + .height($r('app.float.mixedpsd_input_height')) + .backgroundColor(Color.White) + .enterKeyType(EnterKeyType.Done) + .border({ width: 2, color: Color.Gray, radius: 15 }) + .enabled(!this.mViewModel.inhibitInput) + .onChange(this.mViewModel.onInputChange.bind(this.mViewModel)) + .onSubmit((entryKey) => { this.mViewModel.onAuthPassword(() => { - Log.showInfo(TAG, `onClick callback prompt:${this.mViewModel.prompt} inhibitInput:${this.mViewModel.inhibitInput}`) - }); + Log.showInfo(TAG, `onSubmit callback prompt:${this.mViewModel.prompt} inhibitInput:${this.mViewModel.inhibitInput}`) + }) }) + .margin({ bottom: $r('app.float.mixedpsd_input_margin_bottom') }) + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { + Text($r('app.string.emergency_call')) + .fontSize($r('app.float.mixedpsd_prompt_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .onClick(this.mViewModel.onCallPhone.bind(this.mViewModel)); + + Text($r('app.string.done')) + .fontSize($r('app.float.mixedpsd_prompt_fontsize')) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .textOverflow({ overflow: TextOverflow.None }) + .onClick(() => { + Log.showInfo(TAG, `onClick`) + this.mViewModel.onAuthPassword(() => { + Log.showInfo(TAG, `onClick callback prompt:${this.mViewModel.prompt} inhibitInput:${this.mViewModel.inhibitInput}`) + }); + }) + } + .width(Constants.HALF_CONTAINER_WIDTH) } - .width(Constants.HALF_CONTAINER_WIDTH) + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) } - .width(Constants.FULL_CONTAINER_WIDTH) - .height(Constants.FULL_CONTAINER_HEIGHT) } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) diff --git a/features/screenlock/src/main/resources/base/element/float.json b/features/screenlock/src/main/resources/base/element/float.json index 607ca042..e80e75b1 100644 --- a/features/screenlock/src/main/resources/base/element/float.json +++ b/features/screenlock/src/main/resources/base/element/float.json @@ -16,10 +16,18 @@ "name": "lockicon_bottom_margin", "value": "10" }, + { + "name": "lockicon_right_margin", + "value": "0" + }, { "name": "lock_prompt_fontsize", "value": "32" }, + { + "name": "lock_Text_top_margin", + "value": "0" + }, { "name": "deleteall_image_opacity", "value": "0.9" @@ -104,10 +112,18 @@ "name": "mixedpsd_prompt_fontsize", "value": "32" }, + { + "name": "mixedpsd_prompt_text_fontsize", + "value": "32" + }, { "name": "mixedpsd_prompt_margin_bottom", "value": "48" }, + { + "name": "mixedpsd_prompt_margin_top", + "value": "0" + }, { "name": "mixedpsd_prompt_width", "value": "800" diff --git a/features/screenlock/src/main/resources/phone/element/float.json b/features/screenlock/src/main/resources/phone/element/float.json index 36a268fa..a60070ad 100644 --- a/features/screenlock/src/main/resources/phone/element/float.json +++ b/features/screenlock/src/main/resources/phone/element/float.json @@ -2,23 +2,31 @@ "float": [ { "name": "lockicon_width", - "value": "40" + "value": "16vp" }, { "name": "lockicon_height", - "value": "45" + "value": "16vp" }, { "name": "lockicon_top_margin", - "value": "10" + "value": "60vp" }, { "name": "lockicon_bottom_margin", "value": "10" }, + { + "name": "lockicon_right_margin", + "value": "4vp" + }, { "name": "lock_prompt_fontsize", - "value": "32" + "value": "14vp" + }, + { + "name": "lock_Text_top_margin", + "value": "58vp" }, { "name": "deleteall_image_opacity", @@ -90,7 +98,7 @@ }, { "name": "digitalpsd_row_height", - "value": "52vp" + "value": "54vp" }, { "name": "digitalpsd_key_area_height", @@ -102,11 +110,19 @@ }, { "name": "mixedpsd_prompt_fontsize", - "value": "32" + "value": "16fp" + }, + { + "name": "mixedpsd_prompt_margin_top", + "value": "239vp" + }, + { + "name": "mixedpsd_prompt_text_fontsize", + "value": "20fp" }, { "name": "mixedpsd_prompt_margin_bottom", - "value": "48" + "value": "24vp" }, { "name": "mixedpsd_prompt_width", @@ -122,15 +138,15 @@ }, { "name": "mixedpsd_input_width", - "value": "600" + "value": "288vp" }, { "name": "mixedpsd_input_height", - "value": "72" + "value": "36vp" }, { "name": "mixedpsd_input_margin_bottom", - "value": "128" + "value": "16vp" }, { "name": "custompsd_prompt_fontsize", diff --git a/product/phone/src/main/ets/common/constants.ts b/product/phone/src/main/ets/common/constants.ts index 43177b12..f5561e71 100644 --- a/product/phone/src/main/ets/common/constants.ts +++ b/product/phone/src/main/ets/common/constants.ts @@ -26,7 +26,9 @@ export default class Constants { static NOTIFICATION_AREA_WIDTH = '96%' static NOTIFICATION_AREA_HEIGHT = '40%' static LOCKICON_AREA_WIDTH = '15%' + static P_LOCKICON_AREA_WIDTH = '77vp' static DATETIME_AREA_WIDTH = '20%' + static P_DATETIME_AREA_WIDTH = '123vp' static PASSWORD_AREA_WIDTH = '312vp' diff --git a/product/phone/src/main/ets/pages/mixedPassword.ets b/product/phone/src/main/ets/pages/mixedPassword.ets index 96c9e7fc..28e340cb 100644 --- a/product/phone/src/main/ets/pages/mixedPassword.ets +++ b/product/phone/src/main/ets/pages/mixedPassword.ets @@ -43,19 +43,24 @@ export default struct MixedPassword { } build() { - Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Column() { - StatusBar() - } - .height(this.mHeightPx + 'px' ) + Stack(){ + Image($r("app.media.bg")) + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Column() { + StatusBar() + } + .height(this.mHeightPx + 'px' ) - Column() { - MixedPSD() + Column() { + MixedPSD() + } + .width(Constants.PASSWORD_AREA_WIDTH) } - .width(Constants.PASSWORD_AREA_WIDTH) + .width(Constants.FULL_CONTAINER_WIDTH) + .height(Constants.FULL_CONTAINER_HEIGHT) } - .width(Constants.FULL_CONTAINER_WIDTH) - .height(Constants.FULL_CONTAINER_HEIGHT) .backgroundColor($r('app.color.page_background')) } } \ No newline at end of file diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets index bcd1456d..0a00c138 100644 --- a/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -69,15 +69,16 @@ export default struct SlideScreenlock { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { Column() { } - .height($r('app.float.status_bar_height')) + .height(0) Column() { LockIcon() - }.height(Constants.LOCKICON_AREA_WIDTH) + }.height(Constants.P_LOCKICON_AREA_WIDTH) Column() { DateTime({ isShowDate: true }) - }.height(Constants.DATETIME_AREA_WIDTH) + }.height(Constants.P_DATETIME_AREA_WIDTH) + .margin({ top: $r("app.float.DateTime_margin_top"), bottom: $r("app.float.DateTime_margin_bottom") }) Column() { NotificationListComponent() diff --git a/product/phone/src/main/resources/base/element/float.json b/product/phone/src/main/resources/base/element/float.json index 2b907c3d..44dbfabc 100644 --- a/product/phone/src/main/resources/base/element/float.json +++ b/product/phone/src/main/resources/base/element/float.json @@ -5,7 +5,15 @@ "value": "24vp" }, { - "name": "status_bar_padding_left_right", + "name": "DateTime_margin_top", + "value": "7vp" + }, + { + "name": "DateTime_margin_bottom", + "value": "52vp" + }, + + { "name": "status_bar_padding_left_right", "value": "24vp" }, { -- Gitee From 935718dda3efdbe4c8c5f90a6495314cdfd71ba9 Mon Sep 17 00:00:00 2001 From: match Date: Fri, 27 May 2022 14:33:31 +0800 Subject: [PATCH 128/373] =?UTF-8?q?systemui=E8=83=B6=E5=9B=8A=E5=9B=BE?= =?UTF-8?q?=E6=A0=87ux=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: match --- .../src/main/ets/default/pages/CapsuleIcon.ets | 5 ++++- .../pc/statusbar/src/main/resources/base/element/float.json | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index b2c7182f..4864c092 100644 --- a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -65,7 +65,10 @@ export default struct CapsuleIcon { .onTouch(this.touchEvent.bind(this)) Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') - }.margin({ left: $r("app.float.green_capsule_phone_margin_left") }) + }.margin({ + left: $r("app.float.green_capsule_phone_margin_left"), + right: $r("app.float.green_capsule_phone_margin_left") + }) .visibility(this.mCapsuleViewModel.mIsBackground ? Visibility.Visible : Visibility.None) } diff --git a/product/pc/statusbar/src/main/resources/base/element/float.json b/product/pc/statusbar/src/main/resources/base/element/float.json index 588b0e33..02c9560a 100644 --- a/product/pc/statusbar/src/main/resources/base/element/float.json +++ b/product/pc/statusbar/src/main/resources/base/element/float.json @@ -130,7 +130,7 @@ }, { "name": "green_capsule_phone_margin_left", - "value": "2vp" + "value": "0vp" }, { "name": "battery_component_margin", -- Gitee From 3ec39a9df0a62cc5d5472ad189582d9dd06f571e Mon Sep 17 00:00:00 2001 From: qp Date: Fri, 27 May 2022 14:42:28 +0800 Subject: [PATCH 129/373] =?UTF-8?q?statusBar=E7=BB=84=E4=BB=B6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=88=A4=E6=96=AD=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: qp --- .../src/main/ets/com/ohos/view/component/statusBar.ets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets index 407d227f..128bab7b 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/statusBar.ets @@ -31,7 +31,7 @@ export default struct statusBar { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - if (deviceTypeInfo === "phone") { + if (deviceTypeInfo === "phone" || deviceTypeInfo === "default") { this.isShow = false } else { this.isShow = true -- Gitee From 644b1ebef69b0bf8568e2c4eb9f147363292f839 Mon Sep 17 00:00:00 2001 From: username <1037761763@qq.com> Date: Sat, 28 May 2022 11:42:08 +0800 Subject: [PATCH 130/373] =?UTF-8?q?phone=E4=B8=8B=E6=8B=89=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E5=8E=BB=E9=99=A4=E5=AE=9E=E6=97=B6=E6=88=AA=E5=9B=BE?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: username <1037761763@qq.com> --- .../src/main/ets/pages/index.ets | 29 ++++--------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index 2dd968ef..8ce7cac5 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -13,7 +13,6 @@ * limitations under the License. */ -import screenshot from "@ohos.screenshot" import image from "@ohos.multimedia.image" import Log from '../../../../../../../common/src/main/ets/default/Log' import Trace from '../../../../../../../common/src/main/ets/default/Trace' @@ -62,7 +61,6 @@ struct Index { @State componentOptAreaHeightPX: number = 0 @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 @State controlCenterComponentConfig: any = {}; - @State mBackground: PixelMap | undefined = undefined; mCallback: any; mClearCallbacks: unsubscribe[] settingDataKey = 'settings.display.navigationbar_status'; @@ -245,7 +243,6 @@ struct Index { Trace.end(Trace.CORE_METHOD_START_TOUCHEVENT) Log.showDebug(TAG, `showSelf, showComponentName: ${showComponentName}`) this.showComponentName = showComponentName - this.updateBackground() WindowManager.showWindow(WindowType.DROPDOWN_PANEL) Trace.start(Trace.CORE_METHOD_START_DROPDOWNPANEL) } @@ -255,8 +252,6 @@ struct Index { this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { Log.showInfo(TAG, `hideSelf, hide anim finish.`); this.showComponentName = undefined - this.mBackground && this.mBackground.release(); - this.mBackground = undefined; WindowManager.hideWindow(WindowType.DROPDOWN_PANEL) } }, () => { this.componentOptAreaTranslateY = (-this.componentOptAreaHeightPX * 0.1) + 'px' @@ -264,16 +259,6 @@ struct Index { }) } - updateBackground() { - let rect = WindowManager.getWindowInfo(WindowType.DROPDOWN_PANEL)?.rect; - Log.showDebug(TAG, `start get snapShot, rect: ${JSON.stringify(rect)}`) - screenshot.save({ screenRect: rect }) - .then((snapImage) => { - Log.showInfo(TAG, `get snap: ${JSON.stringify(snapImage)}`) - this.mBackground = snapImage - }) - } - _animateTo(config, callback) { Log.showDebug(TAG, `_animateTo, config: ${JSON.stringify(config)}`) animateTo(config, callback) @@ -282,14 +267,12 @@ struct Index { build() { Stack({ alignContent: Alignment.Top }) { - if (this.mBackground) { - Image($r("app.media.dropdownpanel_bgc")) - .width('100%') - .height('100%') - .objectFit(ImageFit.Fill) - .blur(25) - .opacity(this.backgroundOpacity) - } + Image($r("app.media.dropdownpanel_bgc")) + .width('100%') + .height('100%') + .objectFit(ImageFit.Fill) + .blur(25) + .opacity(this.backgroundOpacity) Column() { if (this.showComponentName == 'Notification') { Column() { -- Gitee From ef3449638a638d7c0a47c56726b11f1d67a1d444 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Wed, 1 Jun 2022 20:23:56 +0800 Subject: [PATCH 131/373] Add field: process Signed-off-by: xuchangzhou --- entry/pc/src/main/module.json5 | 1 + entry/phone/src/main/module.json5 | 1 + product/default/navigationBar/src/main/module.json5 | 1 + product/default/notificationmanagement/src/main/module.json5 | 1 + product/default/volumepanel/src/main/module.json5 | 1 + product/pc/controlpanel/src/main/module.json5 | 1 + product/pc/notificationpanel/src/main/module.json5 | 1 + product/pc/statusbar/src/main/module.json5 | 1 + product/phone/dropdownpanel/src/main/module.json5 | 1 + product/phone/statusbar/src/main/module.json5 | 1 + 10 files changed, 10 insertions(+) diff --git a/entry/pc/src/main/module.json5 b/entry/pc/src/main/module.json5 index 7bb6c058..7d9b809c 100644 --- a/entry/pc/src/main/module.json5 +++ b/entry/pc/src/main/module.json5 @@ -5,6 +5,7 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:description_mainability", "mainElement": "com.ohos.systemui.ServiceExtAbility", + "process": "com.ohos.systemui:extension", "deviceTypes": [ "tablet" ], diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index ea40de6c..a1467da2 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -5,6 +5,7 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:description_mainability", "mainElement": "com.ohos.systemui.ServiceExtAbility", + "process": "com.ohos.systemui:extension", "deviceTypes": [ "phone" ], diff --git a/product/default/navigationBar/src/main/module.json5 b/product/default/navigationBar/src/main/module.json5 index 0636f23d..9b151062 100644 --- a/product/default/navigationBar/src/main/module.json5 +++ b/product/default/navigationBar/src/main/module.json5 @@ -5,6 +5,7 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.navigationbar.ServiceExtAbility", + "process": "com.ohos.systemui:extension", "deviceTypes": [ "phone", "tablet" ], diff --git a/product/default/notificationmanagement/src/main/module.json5 b/product/default/notificationmanagement/src/main/module.json5 index fc225cc8..ff92a4a3 100644 --- a/product/default/notificationmanagement/src/main/module.json5 +++ b/product/default/notificationmanagement/src/main/module.json5 @@ -5,6 +5,7 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.notificationmanagement.MainAbility", + "process": "com.ohos.systemui:extension", "deviceTypes": [ "phone", "tablet" ], diff --git a/product/default/volumepanel/src/main/module.json5 b/product/default/volumepanel/src/main/module.json5 index a570a5ac..3c6aa9a4 100644 --- a/product/default/volumepanel/src/main/module.json5 +++ b/product/default/volumepanel/src/main/module.json5 @@ -5,6 +5,7 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.volumepanel.ServiceExtAbility", + "process": "com.ohos.systemui:extension", "deviceTypes": [ "phone", "tablet" ], diff --git a/product/pc/controlpanel/src/main/module.json5 b/product/pc/controlpanel/src/main/module.json5 index 5d8c7c5c..6353f9e8 100644 --- a/product/pc/controlpanel/src/main/module.json5 +++ b/product/pc/controlpanel/src/main/module.json5 @@ -5,6 +5,7 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.controlpanel.ServiceExtAbility", + "process": "com.ohos.systemui:extension", "deviceTypes": [ "tablet" ], diff --git a/product/pc/notificationpanel/src/main/module.json5 b/product/pc/notificationpanel/src/main/module.json5 index 16d9a1ce..bdee9516 100644 --- a/product/pc/notificationpanel/src/main/module.json5 +++ b/product/pc/notificationpanel/src/main/module.json5 @@ -5,6 +5,7 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.notificationpanel.ServiceExtAbility", + "process": "com.ohos.systemui:extension", "deviceTypes": [ "tablet" ], diff --git a/product/pc/statusbar/src/main/module.json5 b/product/pc/statusbar/src/main/module.json5 index 9d39c446..26c1d7fb 100644 --- a/product/pc/statusbar/src/main/module.json5 +++ b/product/pc/statusbar/src/main/module.json5 @@ -5,6 +5,7 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.statusbar.ServiceExtAbility", + "process": "com.ohos.systemui:extension", "deviceTypes": [ "tablet" ], diff --git a/product/phone/dropdownpanel/src/main/module.json5 b/product/phone/dropdownpanel/src/main/module.json5 index 7af54b91..b592d05f 100644 --- a/product/phone/dropdownpanel/src/main/module.json5 +++ b/product/phone/dropdownpanel/src/main/module.json5 @@ -5,6 +5,7 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.dropdownpanel.ServiceExtAbility", + "process": "com.ohos.systemui:extension", "deviceTypes": [ "phone" ], diff --git a/product/phone/statusbar/src/main/module.json5 b/product/phone/statusbar/src/main/module.json5 index 5a1fc3f4..1673e7bf 100644 --- a/product/phone/statusbar/src/main/module.json5 +++ b/product/phone/statusbar/src/main/module.json5 @@ -5,6 +5,7 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.statusbar.ServiceExtAbility", + "process": "com.ohos.systemui:extension", "deviceTypes": [ "phone" ], -- Gitee From 52054b32b69d2bc6793d573acd2d67e075b974d0 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Wed, 1 Jun 2022 21:20:04 +0800 Subject: [PATCH 132/373] fix ux of list Signed-off-by: xuchangzhou --- .../src/main/ets/pages/batchSetEnable.ets | 2 +- .../src/main/ets/pages/notificationManagenment.ets | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets index 4d24c308..ed6687e9 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets @@ -63,7 +63,7 @@ export default struct BatchSetEnable { endMargin: $r('app.float.divider_margin_r') }) .width(ConfigData.WH_100_100) - .height(this.mViewModel.isPhone?$r('app.float.applist_hieght_bat_phone'):$r('app.float.applist_hieght_bat')) + .layoutWeight(1) .padding({ left: $r('app.float.itemComp_padding_l'), right: $r('app.float.itemComp_padding_r') }) .align(Alignment.Top) .backgroundColor(Color.White) diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index 27ac2611..cbf717bf 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -159,7 +159,7 @@ export default struct notificationManagenment { Column() { AppLstComponent() }.width(ConfigData.WH_100_100) - .height(this.mViewModel.isPhone ? $r('app.float.applist_hieght_phone') : $r('app.float.applist_hieght')) + .layoutWeight(1) .margin({ top: $r('app.float.applist_margin_t') }); } -- Gitee From 54170ef2be985578dae1fa3e58ed06f859411520 Mon Sep 17 00:00:00 2001 From: YangPeng Date: Thu, 2 Jun 2022 16:48:00 +0800 Subject: [PATCH 133/373] add bytrace log for ScrrenLock add English date Signed-off-by: yangpeng85 --- common/src/main/ets/default/Trace.ts | 74 +++++++++++++++++++ .../main/resources/en_US/element/string.json | 40 ++++++++++ .../main/resources/zh_CN/element/string.json | 40 ++++++++++ .../main/ets/com/ohos/model/accountsModel.ts | 3 + .../ets/com/ohos/model/screenLockModel.ts | 3 + .../ets/com/ohos/view/component/customPSD.ets | 2 + .../com/ohos/view/component/digitalPSD.ets | 2 + .../ets/com/ohos/view/component/mixedPSD.ets | 2 + .../ets/com/ohos/vm/customPSDViewModel.ts | 2 + .../ets/com/ohos/vm/digitalPSDViewModel.ts | 2 + .../main/ets/com/ohos/vm/mixedPSDViewModel.ts | 2 + 11 files changed, 172 insertions(+) create mode 100644 common/src/main/ets/default/Trace.ts create mode 100644 common/src/main/resources/en_US/element/string.json create mode 100644 common/src/main/resources/zh_CN/element/string.json diff --git a/common/src/main/ets/default/Trace.ts b/common/src/main/ets/default/Trace.ts new file mode 100644 index 00000000..55be59a6 --- /dev/null +++ b/common/src/main/ets/default/Trace.ts @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2022 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 byTrace from "@ohos.bytrace"; +import Log from "./Log"; + +export default class Trace { + static readonly CORE_METHOD_CALL_ACCOUNT_SYSTEM = "startToCallAccountSubsystem"; + static readonly CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT = "passingAccountSubsystemResult"; + static readonly CORE_METHOD_CALL_PAGE_HIDE = "startToHidePage"; + + private static readonly TRACE_TAG = 'ScreenLock:Trace'; + private static readonly RECORD_TRACE = true; + private static readonly TRACE_LIMIT = 2000; + + private static readonly TRACE_BASE_INDEX = 10020; + + private static init() { + Log.showInfo(this.TRACE_TAG, 'init trace parameters'); + globalThis.taskIdMap = new Map(); + globalThis.traceIndex = Trace.TRACE_BASE_INDEX; + } + + /** + * start trace method + * + * @param {string} methodName - methodName for tracing + */ + static start(methodName: string) { + if (!Trace.RECORD_TRACE) return; + if (typeof globalThis.taskIdMap === 'undefined' || typeof globalThis.traceIndex === 'undefined') { + Trace.init(); + } + let taskId = globalThis.taskIdMap.get(methodName); + if (taskId == undefined) { + taskId = globalThis.traceIndex; + globalThis.traceIndex++; + globalThis.taskIdMap.set(methodName, taskId); + } + Log.showInfo(this.TRACE_TAG, `start trace ${taskId} for ${methodName}`); + byTrace.startTrace(this.TRACE_TAG + methodName, taskId, Trace.TRACE_LIMIT); + } + + /** + * stop trace method + * + * @param {string} methodName - methodName for tracing + */ + static end(methodName: string) { + if (!Trace.RECORD_TRACE) return; + if (typeof globalThis.taskIdMap === 'undefined') { + return; + } + const taskId = globalThis.taskIdMap.get(methodName); + if (taskId == undefined) { + Log.showError(this.TRACE_TAG, `fail to end trace name ${methodName}`); + return; + } + Log.showInfo(this.TRACE_TAG, `end trace ${taskId} for ${methodName}`); + byTrace.finishTrace(this.TRACE_TAG + methodName, taskId); + } +} diff --git a/common/src/main/resources/en_US/element/string.json b/common/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..3a0f3b99 --- /dev/null +++ b/common/src/main/resources/en_US/element/string.json @@ -0,0 +1,40 @@ +{ + "string": [ + { + "name": "app_name", + "value": "ScreenLock" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "monday", + "value": "Monday" + }, + { + "name": "tuesday", + "value": "Tuesday" + }, + { + "name": "wednesday", + "value": "Wednesday" + }, + { + "name": "thursday", + "value": "Thursday" + }, + { + "name": "friday", + "value": "Friday" + }, + { + "name": "saturday", + "value": "Saturday" + }, + { + "name": "sunday", + "value": "Sunday" + } + ] +} \ No newline at end of file diff --git a/common/src/main/resources/zh_CN/element/string.json b/common/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..89e9e043 --- /dev/null +++ b/common/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,40 @@ +{ + "string": [ + { + "name": "app_name", + "value": "ScreenLock" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + }, + { + "name": "monday", + "value": "星期一" + }, + { + "name": "tuesday", + "value": "星期二" + }, + { + "name": "wednesday", + "value": "星期三" + }, + { + "name": "thursday", + "value": "星期四" + }, + { + "name": "friday", + "value": "星期五" + }, + { + "name": "saturday", + "value": "星期六" + }, + { + "name": "sunday", + "value": "星期日" + } + ] +} \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index 0d837fbc..6fc844f0 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -17,6 +17,7 @@ import osAccount from '@ohos.account.osAccount' import commonEvent from '@ohos.commonEvent'; import util from '@ohos.util'; import {Callback} from 'basic'; +import Trace from '../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../common/src/main/ets/default/Log' import {UserData} from '../data/userData' @@ -157,9 +158,11 @@ export default class AccountsModel { authUser(challenge, authType: AuthType, authLevel: number, callback) { Log.showDebug(TAG, `authUser param: userId ${mCurrentUserId} challenge ${challenge}`); + Trace.end(Trace.CORE_METHOD_CALL_ACCOUNT_SYSTEM); this.userAuthManager.authUser(mCurrentUserId, challenge, authType, authLevel, { onResult: (result, extraInfo) => { Log.showInfo(TAG, `authUser UserAuthManager.authUser onResult`); + Trace.start(Trace.CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT); callback(result, extraInfo); }, onAcquireInfo: (moduleId, acquire, extraInfo) => { diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index 441e23af..7cf9f111 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -12,6 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import Trace from '../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../common/src/main/ets/default/Log' import ScreenLockMar from '@ohos.screenlock'; import windowManager from '@ohos.window' @@ -64,7 +65,9 @@ export default class ScreenLockModel { } hiddenScreenLockWindow(callback: Callback) { + Trace.end(Trace.CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT); windowManager.find(Constants.WIN_NAME).then((win) => { + Trace.start(Trace.CORE_METHOD_CALL_PAGE_HIDE); win.hide().then(() => { Log.showInfo(TAG, `window hide`); callback(); diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index 1b85e859..6586a675 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard' @@ -35,6 +36,7 @@ export default struct CustomPSD { aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) + Trace.end(Trace.CORE_METHOD_CALL_PAGE_HIDE); this.mViewModel.clearPassword() } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets index c26d20fb..3862da2a 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard' @@ -34,6 +35,7 @@ export default struct DigitalPSD { aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) + Trace.end(Trace.CORE_METHOD_CALL_PAGE_HIDE); this.mViewModel.clearPassword() } diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets index c1767fe5..a06dcd49 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' import ViewModel from '../../vm/mixedPSDViewModel' @@ -34,6 +35,7 @@ export default struct MixedPSD { aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) + Trace.end(Trace.CORE_METHOD_CALL_PAGE_HIDE); this.mViewModel.clearPassword() } diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts index a6a30d40..917f462d 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../common/src/main/ets/default/Log' import Constants from '../common/constants' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' @@ -66,6 +67,7 @@ export default class CustomPSDViewModel extends BaseViewModel { this.updateStorage(callback); return; } + Trace.start(Trace.CORE_METHOD_CALL_ACCOUNT_SYSTEM); service.authUser(AuthSubType.PIN_MIXED, this.passwordArr, (result, extraInfo) => { this.clearPassword(); if (result == 0) { diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts index fe885c1c..27a39345 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -14,6 +14,7 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Trace from '../../../../../../../../common/src/main/ets/default/Trace' import Constants from '../common/constants' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' import {Callback} from 'basic'; @@ -49,6 +50,7 @@ export default class DigitalPSDViewModel extends BaseViewModel { this.updateStorage(callback); } if (this.password.length >= PW_LEN) { + Trace.start(Trace.CORE_METHOD_CALL_ACCOUNT_SYSTEM); service.authUser(AuthSubType.PIN_SIX, this.password, (result, extraInfo) => { this.clearPassword() if (result == 0) { diff --git a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts index a959530a..69edb024 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../common/src/main/ets/default/Log' import BaseViewModel, {service, AuthType, AuthSubType} from './baseViewModel' import {Callback} from 'basic'; @@ -46,6 +47,7 @@ export default class MixedPSDViewModel extends BaseViewModel { callback(); return; } + Trace.start(Trace.CORE_METHOD_CALL_ACCOUNT_SYSTEM); service.authUser(AuthSubType.PIN_MIXED, this.password, (result, extraInfo) => { this.clearPassword(); if (result == 0) { -- Gitee From 9891bb3b29a09a6190759e3fcf1e56c75e8a8d76 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Thu, 2 Jun 2022 17:02:55 +0800 Subject: [PATCH 134/373] Modify the status bar drop-down trigger threshold Signed-off-by: xuchangzhou --- product/phone/statusbar/src/main/ets/pages/index.ets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index 6f77f222..020883ee 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -30,7 +30,7 @@ import StatusbarConfig from './common/StatusbarConfig' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' const TAG = 'StatusBar-Index' -const SLIDING_STATUS_BAR_DISTANCE = 30 +const SLIDING_STATUS_BAR_DISTANCE = 18 let mHeightConfigUtils; -- Gitee From bd845e81b89178f44a785cd06ca62256e6316a03 Mon Sep 17 00:00:00 2001 From: r00498791 Date: Thu, 2 Jun 2022 18:18:52 +0800 Subject: [PATCH 135/373] fix notification panel date Signed-off-by: r00498791 --- product/phone/dropdownpanel/src/main/ets/pages/notification.ets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 216959b8..3b49cf7a 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -215,7 +215,7 @@ struct CenterTitle { async updateTimeString(date: Date) { this.mTime = TimeManager.formatTime(date); let timeString = (date.getMonth() + 1) + (await ResourceUtil.getString($r('app.string.month'))); - timeString += date.getDate() + (await ResourceUtil.getString($r('app.string.month'))); + timeString += date.getDate() + (await ResourceUtil.getString($r('app.string.day'))); timeString += await ResourceUtil.getString(Constants.WEEKDAY_LIST[date.getDay() - 1]); this.mTimeString = timeString; } -- Gitee From 0783a454b5baa9a15e402d0e35b1015b80920bfb Mon Sep 17 00:00:00 2001 From: lvxiaoqiang Date: Thu, 2 Jun 2022 19:10:58 +0800 Subject: [PATCH 136/373] CommonEvent Signed-off-by: lvxiaoqiang --- .../main/ets/com/ohos/model/accountsModel.ts | 19 ++++++++------ .../ets/com/ohos/model/screenLockService.ts | 26 ++++++++++++++----- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index 6fc844f0..f9c7eb1d 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -73,11 +73,11 @@ export enum ResultCode { FAIL = 1, } -let mCurrentUserId: number = 100 export default class AccountsModel { userAuthManager = new osAccount.UserAuth(); pinAuthManager = new osAccount.PINAuth(); + mCurrentUserId: number = 100 modelInit() { Log.showDebug(TAG, "start ModelInit") @@ -87,7 +87,7 @@ export default class AccountsModel { Log.showInfo(TAG, `eventListener:typeName ${typeName}`); osAccount.getAccountManager().on(typeName, name, (userId: number) => { Log.showInfo(TAG, `on ${typeName} callback userId = ${userId}`) - mCurrentUserId = userId + this.mCurrentUserId = userId callback() }) } @@ -119,7 +119,7 @@ export default class AccountsModel { for (const user of list) { Log.showDebug(TAG, `start get user, localId=${user.localId}, localName=${user.localName}`); if (user.isActived) { - mCurrentUserId = user.localId + this.mCurrentUserId = user.localId } let userData: UserData = { userId: user.localId, @@ -157,9 +157,9 @@ export default class AccountsModel { } authUser(challenge, authType: AuthType, authLevel: number, callback) { - Log.showDebug(TAG, `authUser param: userId ${mCurrentUserId} challenge ${challenge}`); + Log.showDebug(TAG, `authUser param: userId ${this.mCurrentUserId} challenge ${challenge}`); Trace.end(Trace.CORE_METHOD_CALL_ACCOUNT_SYSTEM); - this.userAuthManager.authUser(mCurrentUserId, challenge, authType, authLevel, { + this.userAuthManager.authUser(this.mCurrentUserId, challenge, authType, authLevel, { onResult: (result, extraInfo) => { Log.showInfo(TAG, `authUser UserAuthManager.authUser onResult`); Trace.start(Trace.CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT); @@ -220,10 +220,13 @@ export default class AccountsModel { } isActivateAccount(callback: Callback) { - Log.showDebug(TAG, `isActivateAccount userId:${mCurrentUserId}`) - osAccount.getAccountManager().isOsAccountActived(mCurrentUserId).then((isActivate) => { - Log.showInfo(TAG, `isActivateAccount userId:${mCurrentUserId} result: ${isActivate}`) + Log.showDebug(TAG, `isActivateAccount userId:${this.mCurrentUserId}`) + osAccount.getAccountManager().isOsAccountActived(this.mCurrentUserId).then((isActivate) => { + Log.showInfo(TAG, `isActivateAccount userId:${this.mCurrentUserId} result: ${isActivate}`) callback(isActivate) }) } + getCurrentUserId() { + return this.mCurrentUserId; + } } \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 99305c87..01e353ce 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -19,6 +19,7 @@ import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/defa import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper' import Router from '@system.router'; import commonEvent from '@ohos.commonEvent'; +import { CommonEventPublishData } from 'commonEvent/commonEventPublishData'; import {Callback} from 'basic'; const TAG = 'ScreenLock-ScreenLockService'; @@ -72,7 +73,7 @@ let mUnLockBeginAnimation: Callback> = (callback: Callback) export class ScreenLockService { accountModel: AccountModel = new AccountModel() screenLockModel: ScreenLockModel = new ScreenLockModel() - + currentLockStatus : ScreenLockStatus; init() { Log.showDebug(TAG, 'init'); this.accountModel.modelInit(); @@ -138,7 +139,13 @@ export class ScreenLockService { Log.showInfo(TAG, `showScreenLockWindow finish`); this.checkPinAuthProperty(() => { }); - this.publish("common.event.LOCK_SCREEN"); + Log.showInfo(TAG, `screenlock status:${this.currentLockStatus}, userId : ${this.accountModel.getCurrentUserId()}`); + if (this.currentLockStatus == ScreenLockStatus.Locking) { + Log.showInfo(TAG, `had locked, no need to publish lock_screen`); + } else { + this.publishByUser("common.event.LOCK_SCREEN", this.accountModel.getCurrentUserId()); + this.currentLockStatus = ScreenLockStatus.Locking; + } }); } @@ -215,12 +222,13 @@ export class ScreenLockService { Log.showInfo(TAG, `unlocking`); //set the lockStatus to 'Unlock' AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Unlock); + this.currentLockStatus = ScreenLockStatus.Unlock; //unlock the screen this.screenLockModel.hiddenScreenLockWindow(() => { Log.showInfo(TAG, `hiddenScreenLockWindow finish`); //notify the base service that the unlock is completed this.notifyScreenResult(UnlockResult.Success); - this.publish("common.event.UNLOCK_SCREEN"); + this.publishByUser("common.event.UNLOCK_SCREEN", this.accountModel.getCurrentUserId()); }); } @@ -272,6 +280,7 @@ export class ScreenLockService { this.unlockScreen() } else { AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.FaceNotRecognized); + this.currentLockStatus = ScreenLockStatus.FaceNotRecognized; } }) } @@ -306,9 +315,14 @@ export class ScreenLockService { }) } - private publish(eventName: string) { - Log.showInfo(TAG, `publish event name: ${eventName}`) - commonEvent.publish(eventName, (error, value) => { + private publishByUser(eventName: string, activeUserId: number) { + Log.showDebug(TAG, `publishByUser event name: ${eventName}, userId: ${activeUserId}`) + let publishData : CommonEventPublishData = { + parameters : { + userId : activeUserId + } + }; + commonEvent.publish(eventName, publishData, (error, value) => { if (error.code) { Log.showError(TAG, 'Operation failed. Cause: ' + JSON.stringify(error)); } else { -- Gitee From f31c6c23c1574768173d605a26fb628dc85bdc77 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Wed, 8 Jun 2022 09:05:04 +0800 Subject: [PATCH 137/373] modify the path of worker Signed-off-by: xuchangzhou --- .../main/ets/plugindatasource/PluginDataSourceAdapter.ts | 6 ++++-- .../src/main/ets/com/ohos/model/ControlCenterService.ts | 5 +++-- .../src/main/ets/com/ohos/pages/ControlCenterComponent.ets | 3 ++- .../src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts | 4 ++-- .../src/main/ets/com/ohos/model/StatusBarService.ts | 5 +++-- .../src/main/ets/com/ohos/pages/StatusBarComponent.ets | 7 ++++--- .../src/main/ets/com/ohos/viewmodel/StatusBarVM.ts | 4 ++-- product/pc/controlpanel/src/main/ets/pages/control.ets | 1 + product/pc/statusbar/src/main/ets/pages/index.ets | 1 + product/phone/dropdownpanel/src/main/ets/pages/control.ets | 1 + product/phone/statusbar/src/main/ets/pages/index.ets | 1 + 11 files changed, 24 insertions(+), 14 deletions(-) diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts index 5fff2075..5a6a0012 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts @@ -26,19 +26,21 @@ export type pluginWorkerListener = { }; const TAG = "PluginDataSourceAdapter"; -const WORKER_JS_URL = "workers/PluginDataSourceWorker.js"; export default class PluginDataSourceAdapter { mContext: Context; mWorker: any; mName: string; mListener: pluginWorkerListener; + mModuleName: string; - constructor(name: string, context: Context, listener: pluginWorkerListener) { + constructor(name: string, context: Context, listener: pluginWorkerListener, moduleName: string) { Log.showDebug(TAG, `constructor, name: ${name}`); this.mName = name; this.mContext = context; this.mListener = listener; + this.mModuleName = moduleName; + const WORKER_JS_URL = this.mModuleName + "/ets/workers/PluginDataSourceWorker.js"; this.mWorker = new worker.Worker(WORKER_JS_URL, { type: "classic", name: this.mName, diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index 0f7808b2..b2903f54 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -53,7 +53,7 @@ function parseData(itemData: ItemComponentData): ControlComponentData { export class ControlCenterService { mIsStart: boolean = false; - mAdapter: PluginDataSourceAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this); + mAdapter: PluginDataSourceAdapter; mListener: ControlCenterListener | undefined; mConfig: any; mComplexToggleLayoutTemplate: string[]; @@ -67,7 +67,7 @@ export class ControlCenterService { Log.showDebug(TAG, `constructor`); } - startService(config): void { + startService(config, moduleName): void { if (this.mIsStart) { return; } @@ -78,6 +78,7 @@ export class ControlCenterService { SwitchUserManager.getInstance().registerListener(this); CONTROLCENTER_SOURCE_CONFIG.filterDatas = config.MetaToggles; + this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); this.mAdapter.initDataSource(CONTROLCENTER_SOURCE_CONFIG); } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index 4808aae1..7bce69b5 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -42,10 +42,11 @@ export default struct ControlCenterComponent { private mHidingSimpleToggles: string[] = []; private mDefaultDisplaySimpleToggles: string[] = []; private titleDisplayInside: boolean = false; + private moduleName: string = '' aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, mControlCenterComponentConfig: ${JSON.stringify(this.mControlCenterComponentConfig)}`); - ViewModel.initViewModel(this.mControlCenterComponentConfig); + ViewModel.initViewModel(this.mControlCenterComponentConfig, this.moduleName) } aboutToDisappear() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts index dd4db4c7..4dab2f5f 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts @@ -36,14 +36,14 @@ export class ControlCenterVM { ControlCenterService.registerListener(this); } - initViewModel(config) { + initViewModel(config, moduleName) { if (this.mIsStart) { return; } Log.showInfo(TAG, `initViewModel, config: ${JSON.stringify(config)} `); this.mIsStart = true; - ControlCenterService.startService(config); + ControlCenterService.startService(config, moduleName); } setComplexToggleLayout(layout: string[]): void{ diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts index 1d571671..5f12c2fb 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -62,7 +62,7 @@ function parseItemData(itemData: ItemComponentData): StatusBarComponentData { export class StatusBarService { mIsStart: boolean = false; - mAdapter: PluginDataSourceAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this); + mAdapter: PluginDataSourceAdapter; mListener: StatusBarListener | undefined; mConfig: any; mStatusBarData: StatusBarData; @@ -78,7 +78,7 @@ export class StatusBarService { this.mStatusBarData = data; } - startService(config) { + startService(config, moduleName) { if (this.mIsStart) { return; } @@ -89,6 +89,7 @@ export class StatusBarService { SwitchUserManager.getInstance().registerListener(this); STATUSBAR_SOURCE_CONFIG.filterDatas = config.MetaSlots; + this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); this.mAdapter.initDataSource(STATUSBAR_SOURCE_CONFIG); } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index 502b52aa..d3b3f7d6 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -43,19 +43,20 @@ export default struct StatusBarComponent { private mStatusBarComponentConfig: any = {} @StorageLink('StatusBarLayout') mStatusBarLayout: any = [[], [], []] @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() + private moduleName: string = '' aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`); - this.initViewModel(); + this.initViewModel(this.moduleName); } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`); } - initViewModel() { + initViewModel(moduleName) { Log.showInfo(TAG, `initViewModel`); - ViewModel.initViewModel(this.mStatusBarComponentConfig); + ViewModel.initViewModel(this.mStatusBarComponentConfig, moduleName); } build() { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index a32c89de..3f62a5fa 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -82,7 +82,7 @@ export class StatusBarVM { } } - initViewModel(config) { + initViewModel(config, moduleName) { if (this.mIsStart) { return; } @@ -90,7 +90,7 @@ export class StatusBarVM { this.mIsStart = true; this.install(); - StatusBarService.startService(config); + StatusBarService.startService(config, moduleName); } setStatusBarLayout(layout: string[][]): void{ diff --git a/product/pc/controlpanel/src/main/ets/pages/control.ets b/product/pc/controlpanel/src/main/ets/pages/control.ets index 3418cfbc..a07a4b2f 100644 --- a/product/pc/controlpanel/src/main/ets/pages/control.ets +++ b/product/pc/controlpanel/src/main/ets/pages/control.ets @@ -38,6 +38,7 @@ export default struct Control { mSimpleToggleColumnCount: Constants.DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT, modeChangeCallback: (isEdit) => this.modeChangeCallback(isEdit), titleDisplayInside: true, + moduleName: 'pc_controlpanel', }) } .width('100%') diff --git a/product/pc/statusbar/src/main/ets/pages/index.ets b/product/pc/statusbar/src/main/ets/pages/index.ets index 4c581530..32ffc655 100644 --- a/product/pc/statusbar/src/main/ets/pages/index.ets +++ b/product/pc/statusbar/src/main/ets/pages/index.ets @@ -80,6 +80,7 @@ struct Index { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { StatusBarComponent({ mStatusBarComponentConfig: StatusbarConfig, + moduleName: 'pc_statusbar' }) } .width('100%') diff --git a/product/phone/dropdownpanel/src/main/ets/pages/control.ets b/product/phone/dropdownpanel/src/main/ets/pages/control.ets index 5e0261c3..932596c8 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/control.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/control.ets @@ -64,6 +64,7 @@ export default struct Control { ControlCenterComponent({ touchMoveCallback: (data) => this.controlCenterTouchMoveCallback(data), mControlCenterComponentConfig: ControlCenterConfig, + moduleName: 'phone_dropdownpanel', }) } .width('100%') diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index 020883ee..338f5c08 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -98,6 +98,7 @@ struct Index { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { StatusBarComponent({ mStatusBarComponentConfig: StatusbarConfig, + moduleName: 'phone_statusbar' }) } .width('100%') -- Gitee From 8ec82e677ed8e846a1d7f119cdc2546cb1285369 Mon Sep 17 00:00:00 2001 From: a1nc Date: Wed, 8 Jun 2022 11:26:08 +0800 Subject: [PATCH 138/373] add user accounts icon list Signed-off-by: yangpeng85 --- product/phone/src/main/ets/pages/slidescreenlock.ets | 10 ++++++++++ .../phone/src/main/resources/base/element/float.json | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets index 0a00c138..4e7c55f9 100644 --- a/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -71,6 +71,16 @@ export default struct SlideScreenlock { } .height(0) + Column() { + Row() { + Blank() + Accounts() + } + .width(Constants.NOTIFICATION_AREA_WIDTH) + .height($r("app.float.accounts_area_height")) + } + .margin({ top: $r("app.float.accounts_area_margin_top") }) + Column() { LockIcon() }.height(Constants.P_LOCKICON_AREA_WIDTH) diff --git a/product/phone/src/main/resources/base/element/float.json b/product/phone/src/main/resources/base/element/float.json index 44dbfabc..cc060f43 100644 --- a/product/phone/src/main/resources/base/element/float.json +++ b/product/phone/src/main/resources/base/element/float.json @@ -127,6 +127,14 @@ { "name": "status_bar_clock_margin", "value": "2vp" + }, + { + "name": "accounts_area_margin_top", + "value": "40vp" + }, + { + "name": "accounts_area_height", + "value": "80vp" } ] } \ No newline at end of file -- Gitee From f8212d0390c439b372b3412e99b81af5405b63d9 Mon Sep 17 00:00:00 2001 From: a1nc Date: Wed, 8 Jun 2022 15:25:22 +0800 Subject: [PATCH 139/373] support dynamic display user accounts list area Signed-off-by: yangpeng85 --- product/phone/src/main/ets/pages/slidescreenlock.ets | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets index 4e7c55f9..1aa5a14f 100644 --- a/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -15,6 +15,7 @@ import Log from '../../../../../../common/src/main/ets/default/Log' import Accounts from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts' +import {UserData} from '../../../../../../features/screenlock/src/main/ets/com/ohos/data/userData' import DateTime from '../../../../../../features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime' import LockIcon from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/lockIcon' import Wallpaper from '../../../../../../features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper' @@ -31,6 +32,7 @@ export default struct SlideScreenlock { @StorageLink('batteryCharging') @Watch('onCharging') batteryCharging: boolean = false @Prop @Watch("onStatusChange") pageStatus: number @StorageLink('deviceStatus') @Watch('onDeviceStatusChange') deviceStatus: string = "" + @StorageLink("userList") accountList: UserData[] = [] private mHeightPx : number = 48 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) @@ -80,6 +82,7 @@ export default struct SlideScreenlock { .height($r("app.float.accounts_area_height")) } .margin({ top: $r("app.float.accounts_area_margin_top") }) + .visibility(this.accountList.length > 1 ? Visibility.Visible : Visibility.None) Column() { LockIcon() @@ -95,7 +98,6 @@ export default struct SlideScreenlock { } .alignItems(HorizontalAlign.Center) .width(Constants.NOTIFICATION_AREA_WIDTH) - // .height(Constants.NOTIFICATION_AREA_HEIGHT) } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) -- Gitee From 7d0a8b933d07423f405bb41cac1e36e5f3b3fa42 Mon Sep 17 00:00:00 2001 From: a1nc Date: Wed, 8 Jun 2022 16:47:48 +0800 Subject: [PATCH 140/373] don't dispaly Chinese calendar under English mode Signed-off-by: yangpeng85 --- .../main/ets/com/ohos/view/component/dateTime.ets | 12 +++++++++--- .../src/main/resources/base/element/string.json | 4 ++++ .../src/main/resources/en_US/element/string.json | 4 ++++ .../src/main/resources/zh_CN/element/string.json | 4 ++++ .../src/main/resources/base/element/string.json | 4 ++++ .../src/main/resources/en_US/element/string.json | 4 ++++ .../src/main/resources/phone/element/string.json | 4 ++++ .../src/main/resources/zh_CN/element/string.json | 4 ++++ 8 files changed, 37 insertions(+), 3 deletions(-) diff --git a/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets b/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets index 1eb9c5d8..af4da448 100644 --- a/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets +++ b/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets @@ -19,9 +19,11 @@ import Constants from '../../common/constants' import { ScreenLockStatus } from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon' import { ConvertLunarCalendar } from '../../../../../../../../../common/src/main/ets/default/LunarCalendar' import deviceInfo from '@ohos.deviceInfo'; +import i18n from '@ohos.i18n'; const DEVICETYPE = deviceInfo.deviceType; -const TAG = 'ScreenLock-DateTime' +const DEFAULTLANG: string = "zh-Hans"; +const TAG = 'ScreenLock-DateTime'; @Component @@ -32,10 +34,12 @@ export default struct DateTime { @State month: string = '' @State day: string = '' @State isPhone: boolean = false + @State currentLanguage: string = DEFAULTLANG aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() + this.currentLanguage = i18n.getSystemLanguage() this.year = ConvertLunarCalendar(this.mViewModel.dateVal.year, this.mViewModel.dateVal.month, this.mViewModel.dateVal.day) .lunarYear @@ -66,11 +70,12 @@ export default struct DateTime { if (this.isShowDate) { Row() { if (this.isPhone) { - Text(this.mViewModel.dateVal.month + "月" + this.mViewModel.dateVal.day + "日") + Text($r("app.string.mm_dd", this.mViewModel.dateVal.month, this.mViewModel.dateVal.day)) .fontSize($r('app.float.date_fontsize')) .fontColor($r('app.color.date_time_color')) } else { - Text($r('app.string.yyyy_mm_dd', this.mViewModel.dateVal.year, this.mViewModel.dateVal.month, this.mViewModel.dateVal.day)) + Text($r('app.string.yyyy_mm_dd', this.mViewModel.dateVal.year, this.mViewModel.dateVal.month, + this.mViewModel.dateVal.day)) .fontSize($r('app.float.date_fontsize')) .fontColor($r('app.color.date_time_color')) } @@ -85,6 +90,7 @@ export default struct DateTime { .fontSize($r("app.float.date_lunar_calendar_fontSize")) .margin({ top: 6 }) } + .visibility(this.currentLanguage === DEFAULTLANG ? Visibility.Visible : Visibility.None) } } .width(Constants.FULL_CONTAINER_WIDTH) diff --git a/features/datetimecomponent/src/main/resources/base/element/string.json b/features/datetimecomponent/src/main/resources/base/element/string.json index 5fb11348..24195f54 100644 --- a/features/datetimecomponent/src/main/resources/base/element/string.json +++ b/features/datetimecomponent/src/main/resources/base/element/string.json @@ -3,6 +3,10 @@ { "name": "yyyy_mm_dd", "value": "%d/%d/%d" + }, + { + "name": "mm_dd", + "value": "%d/%d" } ] } \ No newline at end of file diff --git a/features/datetimecomponent/src/main/resources/en_US/element/string.json b/features/datetimecomponent/src/main/resources/en_US/element/string.json index 5fb11348..24195f54 100644 --- a/features/datetimecomponent/src/main/resources/en_US/element/string.json +++ b/features/datetimecomponent/src/main/resources/en_US/element/string.json @@ -3,6 +3,10 @@ { "name": "yyyy_mm_dd", "value": "%d/%d/%d" + }, + { + "name": "mm_dd", + "value": "%d/%d" } ] } \ No newline at end of file diff --git a/features/datetimecomponent/src/main/resources/zh_CN/element/string.json b/features/datetimecomponent/src/main/resources/zh_CN/element/string.json index 8d20be74..f66c6184 100644 --- a/features/datetimecomponent/src/main/resources/zh_CN/element/string.json +++ b/features/datetimecomponent/src/main/resources/zh_CN/element/string.json @@ -3,6 +3,10 @@ { "name": "yyyy_mm_dd", "value": "%d年%d月%d日" + }, + { + "name": "mm_dd", + "value": "%d月%d日" } ] } \ No newline at end of file diff --git a/features/screenlock/src/main/resources/base/element/string.json b/features/screenlock/src/main/resources/base/element/string.json index 02b8ab7a..d572e124 100644 --- a/features/screenlock/src/main/resources/base/element/string.json +++ b/features/screenlock/src/main/resources/base/element/string.json @@ -20,6 +20,10 @@ "name": "yyyy_mm_dd", "value": "%d/%d/%d" }, + { + "name": "mm_dd", + "value": "%d/%d" + }, { "name": "nonotification_text", "value": "无通知" diff --git a/features/screenlock/src/main/resources/en_US/element/string.json b/features/screenlock/src/main/resources/en_US/element/string.json index 15aa5158..3ff6cf72 100644 --- a/features/screenlock/src/main/resources/en_US/element/string.json +++ b/features/screenlock/src/main/resources/en_US/element/string.json @@ -20,6 +20,10 @@ "name": "yyyy_mm_dd", "value": "%d/%d/%d" }, + { + "name": "mm_dd", + "value": "%d/%d" + }, { "name": "nonotification_text", "value": "No Notification" diff --git a/features/screenlock/src/main/resources/phone/element/string.json b/features/screenlock/src/main/resources/phone/element/string.json index fcf0366a..8b48059c 100644 --- a/features/screenlock/src/main/resources/phone/element/string.json +++ b/features/screenlock/src/main/resources/phone/element/string.json @@ -20,6 +20,10 @@ "name": "yyyy_mm_dd", "value": "%d/%d/%d" }, + { + "name": "mm_dd", + "value": "%d/%d" + }, { "name": "nonotification_text", "value": "无通知" diff --git a/features/screenlock/src/main/resources/zh_CN/element/string.json b/features/screenlock/src/main/resources/zh_CN/element/string.json index 6a9f4564..112db8ad 100644 --- a/features/screenlock/src/main/resources/zh_CN/element/string.json +++ b/features/screenlock/src/main/resources/zh_CN/element/string.json @@ -20,6 +20,10 @@ "name": "yyyy_mm_dd", "value": "%d年%d月%d日" }, + { + "name": "mm_dd", + "value": "%d月%d日" + }, { "name": "nonotification_text", "value": "无通知" -- Gitee From 8c8398a8a2b997c5c2e45d33b9579fe6260eda1e Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Thu, 9 Jun 2022 11:08:48 +0800 Subject: [PATCH 141/373] Change window type numbers to enumerated values Signed-off-by: xuchangzhou --- common/src/main/ets/default/WindowManager.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index 9f3f23c7..d53cde53 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -40,13 +40,13 @@ export const WINDOW_RESIZE_EVENT = "WindowResizeEvent"; type WindowHandle = typeof Window.Window; const TAG = "WindowManager"; const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: number } = { - SystemUi_StatusBar: 2108, - SystemUi_NavigationBar: 2112, - SystemUi_DropdownPanel: 2109, - SystemUi_NotificationPanel: 2111, - SystemUi_ControlPanel: 2111, - SystemUi_VolumePanel: 2111, - SystemUi_BannerNotice: 2111, + SystemUi_StatusBar: Window.WindowType.TYPE_STATUS_BAR, + SystemUi_NavigationBar: Window.WindowType.TYPE_NAVIGATION_BAR, + SystemUi_DropdownPanel: Window.WindowType.TYPE_PANEL, + SystemUi_NotificationPanel: Window.WindowType.TYPE_VOLUME_OVERLAY, + SystemUi_ControlPanel: Window.WindowType.TYPE_VOLUME_OVERLAY, + SystemUi_VolumePanel: Window.WindowType.TYPE_VOLUME_OVERLAY, + SystemUi_BannerNotice: Window.WindowType.TYPE_VOLUME_OVERLAY, }; const DEFAULT_WINDOW_INFO: WindowInfo = { visibility: false, -- Gitee From 230e236aed4140b7251ead1aadcd54f8a6689214 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Thu, 9 Jun 2022 11:10:26 +0800 Subject: [PATCH 142/373] fix bug: jscrash caused by asynchrony Signed-off-by: xuchangzhou --- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 6 ------ .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 10 ++++++++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 9437dcb6..35294c4c 100644 --- a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -34,11 +34,6 @@ var volumePanelWant = { "abilityName": "com.ohos.systemui.volumepanel.ServiceExtAbility" } -var dropdownPanelWant = { - "bundleName": "com.ohos.systemui", - "abilityName": "com.ohos.systemui.dropdownpanel.ServiceExtAbility" -} - class ServiceExtAbility extends ServiceExtension { onCreate(want) { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`) @@ -47,7 +42,6 @@ class ServiceExtAbility extends ServiceExtension { AbilityManager.startAbility(statusBarWant) AbilityManager.startAbility(navigationBarWant) AbilityManager.startAbility(volumePanelWant) - AbilityManager.startAbility(dropdownPanelWant) } onDestroy() { diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index c1ddb533..41841b1e 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,6 +13,7 @@ * limitations under the License. */ +import deviceInfo from "@ohos.deviceInfo" import ServiceExtension from '@ohos.application.ServiceExtensionAbility' import Log from '../../../../../../../common/src/main/ets/default/Log' import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager' @@ -21,6 +22,11 @@ import NavBarConfiguration from '../common/navbarconfiguration' const TAG = "NavigationBar_ServiceExtAbility" +var dropdownPanelWant = { + "bundleName": "com.ohos.systemui", + "abilityName": "com.ohos.systemui.dropdownpanel.ServiceExtAbility" +} + class ServiceExtAbility extends ServiceExtension { async onCreate(want) { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); @@ -49,6 +55,10 @@ class ServiceExtAbility extends ServiceExtension { } } AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config', configInfo) + + if(deviceInfo.deviceType == "phone"){ + AbilityManager.startAbility(dropdownPanelWant) + } Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`) let navigationBarRect = { -- Gitee From 0c15bcb3e5821538fa09021e91bcc975c2018170 Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Thu, 9 Jun 2022 15:17:25 +0800 Subject: [PATCH 143/373] =?UTF-8?q?=E5=85=81=E8=AE=B8=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=8F=91=E9=80=81=E9=80=9A=E7=9F=A5=E3=80=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=BC=E8=88=AA=E6=A0=8F=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=A0=8F=E5=B8=83=E5=B1=80=E5=8F=AF=E9=85=8D=E7=BD=AE=E5=8C=96?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .gitignore | 3 ++- .../main/ets/com/ohos/view/component/appItemComponent.ets | 2 -- .../main/ets/com/ohos/view/component/appLstComponent.ets | 3 +-- .../main/ets/com/ohos/view/component/switchComponent.ets | 2 -- .../src/main/ets/com/ohos/pages/StatusBarComponent.ets | 1 + product/default/navigationBar/src/main/ets/pages/index.ets | 5 +++-- .../src/main/ets/pages/batchSetEnable.ets | 3 +-- .../src/main/ets/pages/notificationManagenment.ets | 3 +-- .../notificationmanagement/src/main/ets/pages/setEnable.ets | 3 +-- .../src/main/ets/pages/slotSetting.ets | 6 ++---- product/phone/statusbar/src/main/ets/pages/index.ets | 3 ++- 11 files changed, 14 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 1984fa82..cfb3a951 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ product/pc/controlpanel/node_modules product/pc/notificationpanel/node_modules product/pc/statusbar/node_modules product/phone/dropdownpanel/node_modules -product/phone/statusbar/node_modules \ No newline at end of file +product/phone/statusbar/node_modules +*/.preview/* \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets index 6c214f32..ba8c6a21 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets @@ -32,7 +32,6 @@ export default struct AppItemComponent { @Prop appSwitch: number; @Prop appBundleName: string; @Prop appUid: number; - @State isCanChange: boolean = true build() { Flex({ justifyContent: FlexAlign.SpaceBetween }) { @@ -209,7 +208,6 @@ export default struct AppItemComponent { .selectedColor($r("app.color.font_color_007DFF")) .width($r('app.float.toggle_comp_width')) .height($r('app.float.toggle_comp_height')) - .enabled(this.isCanChange) .onChange((flag) => { Log.showInfo(TAG, `Toggle onChange param: data:${flag} `); Notification.enableNotification({ bundle: this.appBundleName, uid: this.appUid }, flag); diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets index a2349d64..7af50866 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets @@ -57,8 +57,7 @@ export default struct AppLstComponent { appUri: item.appUri, appBundleName: item.appBundleName, appUid: item.appUid, - appSwitch: 0, - isCanChange:item.systemApp + appSwitch: 0 }) } .onClick(() => { diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index a951f375..8fc0f0ff 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -24,7 +24,6 @@ export default struct SwitchComponent { private initializationAction: (params?) => Promise private settingAction: (params?) => void private register?: (listener) => void - @State isCanChange: boolean = true @State initState: boolean= false build() { @@ -57,7 +56,6 @@ export default struct SwitchComponent { .selectedColor($r("app.color.font_color_007DFF")) .width($r('app.float.toggle_comp_width')) .height($r('app.float.toggle_comp_height')) - .enabled(this.isCanChange) .onChange((data) => { Log.showInfo(TAG, `Toggle onChange data:${data}`); this.initState = data ? true : false; diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index 502b52aa..e67d1dc4 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -192,6 +192,7 @@ struct StatusBarGroup { }) }, (componentName: string) => componentName) }.width('100%') + .alignItems(HorizontalAlign.Start) } .alignItems(this.mAlignItems) .width('100%') diff --git a/product/default/navigationBar/src/main/ets/pages/index.ets b/product/default/navigationBar/src/main/ets/pages/index.ets index 9af0780c..0e5dd270 100644 --- a/product/default/navigationBar/src/main/ets/pages/index.ets +++ b/product/default/navigationBar/src/main/ets/pages/index.ets @@ -26,6 +26,7 @@ const STORAGE_NAVIGATION_TYPE = 'navigationType' const TAG = 'NavigationBar-Index'; let mConfigManager = configManager + @Entry @Component struct Index { @@ -42,7 +43,7 @@ struct Index { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config') - AppStorage.SetAndLink("showNavHorizontal", configInfo.showNavHorizontal) + AppStorage.SetOrCreate("showNavHorizontal", configInfo.showNavHorizontal) mConfigManager.initConfig() setAppBgColor('#00000000') @@ -69,7 +70,7 @@ struct Index { } .width('100%') .height('100%') - .constraintSize({ minHeight: this.minNavHeight + 'px'}) + .constraintSize({ minHeight: this.minNavHeight + 'px' }) .backgroundColor(this.mNavigationBarComponentData.backgroundColor) .padding(this.showNavHorizontal ? { left: '18%', right: '18%' } : { top: '18%', bottom: '18%' }) } diff --git a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets index ed6687e9..ef17532f 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets @@ -49,8 +49,7 @@ export default struct BatchSetEnable { appUri: '', appBundleName:item.appBundleName, appUid:item.appUid, - appSwitch:1, - isCanChange: !item.systemApp + appSwitch:1 }); } .height($r('app.float.appitem_item_height')); diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index cbf717bf..5a5188ca 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -125,8 +125,7 @@ export default struct notificationManagenment { title: $allowDistribut, describe: this.allowDistributDescribe, initializationAction: () => this.switchComponentInit(), - settingAction: (params) => this.switchComponentSet(params), - isCanChange: true + settingAction: (params) => this.switchComponentSet(params) }) } }.margin({ bottom: $r('app.float.noDisturb_margin_lf') }) diff --git a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets index 4cbc80c4..bfa62306 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets @@ -63,8 +63,7 @@ export default struct SetEnable { title: $allowNotice, initializationAction: () => this.switchComponentInit(), settingAction: (params) => this.switchComponentSet(params), - register: (listener) => Notification.register({bundle:appInfo.appBundleName,onEnableChanged:listener}), - isCanChange: !appInfo.systemApp + register: (listener) => Notification.register({bundle:appInfo.appBundleName,onEnableChanged:listener}) }) } .margin({ top: $r('app.float.page_notice_title_margin_t')}) diff --git a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets index aa5f741b..c1743570 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets @@ -61,8 +61,7 @@ export default struct SlotSetting { appUri: this.appInfo.appUri, appBundleName: this.appInfo.appBundleName, appUid: this.appInfo.appUid, - appSwitch: 3, - isCanChange: !this.appInfo.systemApp + appSwitch: 3 }); } .margin({ top: $r('app.float.page_notice_part_margin_t') }) @@ -79,8 +78,7 @@ export default struct SlotSetting { register: (listener) => Notification.register({ bundle: this.appInfo.appBundleName, onEnableChanged: listener - }), - isCanChange: false //TODO: There is no service, so it cannot be modified + }) }) } .margin({ top: $r('app.float.page_notice_title_margin_t') }) diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index 020883ee..9a940cdd 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -107,7 +107,8 @@ struct Index { .width('100%') .height('100%') .constraintSize({ minHeight: this.StatusMinH }) - .padding({ left: $r('sys.float.ohos_id_max_padding_start'), right: $r('sys.float.ohos_id_max_padding_end') }) + .padding(this.mStatusBarData.showHorizontal ? + { left: $r('sys.float.ohos_id_max_padding_start'), right: $r('sys.float.ohos_id_max_padding_end') } : { left: '0'}) .onAreaChange((e, e2) => { Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); }) -- Gitee From dc116cb0eb729e5b49d38a407a30e2fb77e67caa Mon Sep 17 00:00:00 2001 From: a1nc Date: Thu, 9 Jun 2022 17:19:21 +0800 Subject: [PATCH 144/373] remove useless permissions Signed-off-by: yangpeng85 --- product/pc/src/main/module.json5 | 3 --- product/phone/src/main/module.json5 | 3 --- 2 files changed, 6 deletions(-) diff --git a/product/pc/src/main/module.json5 b/product/pc/src/main/module.json5 index f66362a8..eb83e1b7 100644 --- a/product/pc/src/main/module.json5 +++ b/product/pc/src/main/module.json5 @@ -34,9 +34,6 @@ { "name": "ohos.permission.GET_WALLPAPER" }, - { - "name": "ohos.permission.READ_MEDIA" - }, { "name": "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED" }, diff --git a/product/phone/src/main/module.json5 b/product/phone/src/main/module.json5 index f97d9d38..433daa81 100644 --- a/product/phone/src/main/module.json5 +++ b/product/phone/src/main/module.json5 @@ -34,9 +34,6 @@ { "name": "ohos.permission.GET_WALLPAPER" }, - { - "name": "ohos.permission.READ_MEDIA" - }, { "name": "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED" }, -- Gitee From a09915636070e1b064903f5effbd2139e9cce4de Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Fri, 10 Jun 2022 15:11:47 +0800 Subject: [PATCH 145/373] Change window type numbers to enumerated values Signed-off-by: xuchangzhou --- common/src/main/ets/default/Constants.ts | 17 ++++++++++++----- common/src/main/ets/default/TintStateManager.ts | 12 ++++++------ common/src/main/ets/default/WindowManager.ts | 2 +- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/common/src/main/ets/default/Constants.ts b/common/src/main/ets/default/Constants.ts index df5fbd9b..62585a29 100644 --- a/common/src/main/ets/default/Constants.ts +++ b/common/src/main/ets/default/Constants.ts @@ -12,11 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export const WindowNameMap = { - 2112: 'navigation', - 2108: 'status', - 2111: 'volume' -}; +import Window from "@ohos.window"; export interface Rect { left: number; @@ -27,6 +23,17 @@ export interface Rect { export type WindowType = 'status' | 'navigation' | 'volume'; +export function getWindowName(windowType): WindowType{ + switch (windowType) { + case Window.WindowType.TYPE_NAVIGATION_BAR: + return 'navigation'; + case Window.WindowType.TYPE_STATUS_BAR: + return 'status'; + case Window.WindowType.TYPE_VOLUME_OVERLAY: + return 'volume'; + } +} + export default class Constants { static URI_VAR: string = 'dataability:///com.ohos.settingsdata.DataAbility'; } diff --git a/common/src/main/ets/default/TintStateManager.ts b/common/src/main/ets/default/TintStateManager.ts index 7b27d91c..9c6130b4 100644 --- a/common/src/main/ets/default/TintStateManager.ts +++ b/common/src/main/ets/default/TintStateManager.ts @@ -16,7 +16,7 @@ import Window from "@ohos.window"; import display from "@ohos.display"; import Log from "./Log"; -import {WindowType, Rect, WindowNameMap} from "./Constants"; +import {WindowType, Rect, getWindowName} from "./Constants"; import getSingleInstance from "./SingleInstanceHelper"; const TAG = "TintStateManager"; @@ -82,9 +82,9 @@ export default class TintStateManager { return; } data.regionTint.forEach((regionTintData) => { - Log.showDebug(TAG, `onSystemBarTintChange, type: ${WindowNameMap[regionTintData["type"]]}`); - let windowType = WindowNameMap[regionTintData["type"]]; - if (!windowType) { + Log.showDebug(TAG, `onSystemBarTintChange, type: ${getWindowName(regionTintData["type"])}`); + let windowName = getWindowName(regionTintData["type"]); + if (!windowName) { return; } let tintState: TintState = { @@ -94,8 +94,8 @@ export default class TintStateManager { contentColor: regionTintData.contentColor, }; Log.showDebug(TAG, `tintState: ${JSON.stringify(tintState)}`); - this.mStates.set(windowType, tintState); - this.mListeners.get(windowType)?.onTintStateChange(tintState); + this.mStates.set(windowName, tintState); + this.mListeners.get(windowName)?.onTintStateChange(tintState); }); } } diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index d53cde53..67b7b8df 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -39,7 +39,7 @@ export const WINDOW_RESIZE_EVENT = "WindowResizeEvent"; type WindowHandle = typeof Window.Window; const TAG = "WindowManager"; -const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: number } = { +const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: Window.WindowType } = { SystemUi_StatusBar: Window.WindowType.TYPE_STATUS_BAR, SystemUi_NavigationBar: Window.WindowType.TYPE_NAVIGATION_BAR, SystemUi_DropdownPanel: Window.WindowType.TYPE_PANEL, -- Gitee From 5098f35fc28027882711856a8e57df41277590e6 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Fri, 10 Jun 2022 15:43:40 +0800 Subject: [PATCH 146/373] Delete display delay Signed-off-by: xuchangzhou --- .../com/ohos/common/StatusBarConfiguration.ts | 24 ++++++++---------- .../main/ets/common/NavBarConfiguration.ts | 25 ++++++++----------- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index dac12654..0f5dd46c 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -48,20 +48,16 @@ class StatusBarConfiguration { Log.showInfo(TAG, 'initWindowManager'); minHeight = 0; - let displayData = null; - while (displayData == null) { - await display.getDefaultDisplay() - .then((res) => { - displayData = res; - maxWidth = res.width; - maxHeight = res.height; - Log.showInfo(TAG, `getDefaultDisplay maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); - }) - .catch((err) => { - Log.showError(TAG, `getDefaultDisplay err:${JSON.stringify(err)}`); - }); - await new Promise((resolve) => setTimeout(resolve, 2000)); - } + await display.getDefaultDisplay() + .then(dis => { + Log.showInfo(TAG, `initWindowManager dis ${JSON.stringify(dis)}`); + maxWidth = dis.width; + maxHeight = dis.height; + Log.showInfo(TAG, `initWindowManager maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); + }) + .catch((err) => { + Log.showError(TAG, `getDefaultDisplay err:${JSON.stringify(err)}`); + }); } async getDirectionAndPosition() { diff --git a/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts b/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts index ee374125..749be300 100644 --- a/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts +++ b/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts @@ -48,21 +48,16 @@ class NavBarConfiguration { Log.showDebug(TAG, 'initNavBarConfiguration'); minHeight = 0; - let displayData = null; - while (displayData == null) { - await display.getDefaultDisplay() - .then((res) => { - Log.showInfo(TAG, `getDefaultDisplay dis ${JSON.stringify(res)}`); - displayData = res; - maxWidth = res.width; - maxHeight = res.height; - Log.showInfo(TAG, `getDefaultDisplay maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); - }) - .catch((err) => { - Log.showError(TAG, 'getDefaultDisplay err: ' + err); - }); - await new Promise((resolve) => setTimeout(resolve, 2000)); - } + await display.getDefaultDisplay() + .then(dis => { + Log.showInfo(TAG, `initNavBarConfiguration dis ${JSON.stringify(dis)}`); + maxWidth = dis.width; + maxHeight = dis.height; + Log.showInfo(TAG, `initNavBarConfiguration maxWidth ${maxWidth} maxHeight ${maxHeight} minHeight ${minHeight}`); + }) + .catch((err) => { + Log.showError(TAG, 'getDefaultDisplay err: ' + err); + }); } async getDirectionAndPosition() { -- Gitee From 2278543c8546d4a2e5621fb2b58cc8722ccd5b51 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Fri, 10 Jun 2022 17:14:33 +0800 Subject: [PATCH 147/373] fix bug: onBackPress Signed-off-by: xuchangzhou --- .../ets/com/ohos/view/component/headComponent.ets | 14 ++++++++++---- .../src/main/ets/pages/batchSetEnable.ets | 1 - .../src/main/ets/pages/noDisturb.ets | 1 - .../src/main/ets/pages/setEnable.ets | 1 - .../src/main/ets/pages/slotSetting.ets | 1 - 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets index 6614740a..16465871 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets @@ -36,10 +36,16 @@ struct HeadComponent { }) .backgroundColor(this.isTouch ? $r('app.color.background_color') : $r('app.color.background_transparent')) .visibility(this.icBackIsVisibility ? Visibility.Visible : Visibility.None) - .onTouch(() => { - this.isTouch = true; - Router.back(); - }) + .onClick(() => { + Router.back(); + }) + .onTouch((touchEvent: TouchEvent) => { + if (touchEvent.type === TouchType.Down){ + this.isTouch = true; + } else if (touchEvent.type === TouchType.Up){ + this.isTouch = false; + } + }) Text(this.headName) .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('app.float.page_phrases_tittle_font')) diff --git a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets index ef17532f..22bb1140 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets @@ -96,7 +96,6 @@ export default struct BatchSetEnable { onBackPress() { Log.showInfo(TAG, `onBackPress`) - Router.back(); } } diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index ef9156e2..0e731700 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -268,7 +268,6 @@ export default struct NoDisturb { onBackPress() { Log.showInfo(TAG, `onBackPress`) - Router.back(); } } diff --git a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets index bfa62306..b27cfecb 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets @@ -108,7 +108,6 @@ export default struct SetEnable { onBackPress() { Log.showInfo(TAG, `onBackPress`) - Router.back(); } switchComponentInit() { diff --git a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets index c1743570..106dc9e0 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets @@ -159,7 +159,6 @@ export default struct SlotSetting { onBackPress() { Log.showInfo(TAG, `onBackPress`) - Router.back(); } notificationEnableInit() { -- Gitee From 25e09c3276c4be136ff584ff8b798b2d25eaac20 Mon Sep 17 00:00:00 2001 From: supeng Date: Fri, 10 Jun 2022 21:35:34 +0800 Subject: [PATCH 148/373] update README Signed-off-by: supeng --- doc/Instructions.md | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/doc/Instructions.md b/doc/Instructions.md index 6a508e3e..9fcffe82 100644 --- a/doc/Instructions.md +++ b/doc/Instructions.md @@ -14,7 +14,7 @@ 3. 本机git bash 中执行: ``` git clone '复制的下载地址' - ``` + ``` ### 环境搭建 安装DevEco Studio @@ -25,7 +25,7 @@ - 导入指定模块 ``` JavaScript import bundle from '@ohos.bundle'; -``` +``` - 调用模块中的相应函数 ``` JavaScript bundle.getApplicationInfos().then(data => { @@ -97,9 +97,6 @@ this.title = this.$r('app.string.hello_world'); ![](../figures/signature_2.png) -配置完成后,对应的build.gradle文件中会出现如下内容 - -![](../figures/signature_3.png) ### 打包 DevEco Studio 支持 debug 与 release 两种打包类型。可以在 OhosBuild Variants 窗口中进行切换。 @@ -163,28 +160,14 @@ DevEco Studio 支持 debug 与 release 两种打包类型。可以在 OhosBuild ``` hdc target mount ``` -将签名好的 hap 包放入设备的 `/system/app` 目录下,并修改hap包的权限 +将签名好的 hap 包放入设备的 `/system/app/com.ohos.systemui` 目录下,并修改hap包的权限 ``` -hdc file send 本地路径 /system/app/hap包名称 -例如:hdc file send SystemUI-StatusBar.hap /system/app/SystemUI-StatusBar.hap +hdc file send 本地路径 /system/app/com.ohos.systemui/hap包名称 +例如:hdc file send SystemUI-StatusBar.hap /system/app/com.ohos.systemui/SystemUI-StatusBar.hap ``` -> 注意,如果设备不存在 `/system/app` 目录,则需要手动创建该目录并修改权限。 -> ``` -> hdc shell -> cd system -> mkdir app -> chmod 777 app -> ``` -> `/system/app` 目录放置系统应用,例如:Launcher,SystemUI,Settings 等。 -> -> 但hap包需要在该目录下手动设置权限 -> ``` -> chmod 666 hap包名 -> ``` -> 此目录应用不用手动安装,系统自动拉起。 ## 应用运行 -SystemUI属于系统应用,在将签名的 hap 包放入 `/system/app` 目录后,重启系统,应用会自动拉起。 +SystemUI属于系统应用,在将签名的 hap 包放入 `/system/app/com.ohos.systemui` 目录后,重启系统,应用会自动拉起。 ``` hdc shell reboot @@ -204,6 +187,7 @@ console.info("SystemUI log info"); ### log获取及过滤 - log获取 + 将log输出至文件 ``` hdc shell hilog > 输出文件名称 @@ -243,6 +227,7 @@ hilog │ grep Label ``` 3. 修改代码。 + > 将代码引入工程,以及编译工程等相关内容请参见 **3. 代码使用** 部分的相关内容。 4. 提交代码到 fork 仓库。 > 修改后的代码,首先执行 `git add` 命令,然后执行 `git commit` 命令与 `git push` 命令,将代码 push 到我们自己的 fork 仓中。 -- Gitee From 0ccd1acd0320f04e88b7d55b454fe15bb78d907f Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Mon, 13 Jun 2022 15:22:40 +0800 Subject: [PATCH 149/373] =?UTF-8?q?=E5=8C=B9=E9=85=8D=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=88=B7=E6=96=B0=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .../common/BundleParseUtil.ts | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts index 34c7b4e1..a808d8c5 100644 --- a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts +++ b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts @@ -18,6 +18,7 @@ import { ExtensionAbilityInfo } from "bundle/extensionAbilityInfo"; import commonEvent from "@ohos.commonEvent"; import { AbilityInfo } from "bundle/abilityInfo"; import Log from "../../default/Log"; +import switchUserManager from "../../default/SwitchUserManager" export type AbilityInfoWithId = AbilityInfo & { itemId: string }; export type BundleListener = { @@ -145,21 +146,30 @@ export function registerBundleListener(listener: BundleListener, callback: (hand Log.showError(TAG, `Can't handle bundle change, err: ${JSON.stringify(err)}`); return; } - let event = BundleEventType.UNKNOWN_EVENT; - switch (data.event) { - case commonEvent.Support.COMMON_EVENT_PACKAGE_ADDED: - event = BundleEventType.BUNDLE_ADD; - break; - case commonEvent.Support.COMMON_EVENT_PACKAGE_CHANGED: - event = BundleEventType.BUNDLE_CHANGE; - break; - case commonEvent.Support.COMMON_EVENT_PACKAGE_REMOVED: - event = BundleEventType.BUNDLE_REMOVE; - break; - default: - Log.showError(TAG, `unknow event: ${event}`); - } - listener.onBundleNotify(data.bundleName ?? "unkown", event); + + switchUserManager.getInstance() + .getCurrentUserInfo() + .then((userInfo) => { + if(data.parameters.userId != userInfo.userId) { + return; + } else { + let event = BundleEventType.UNKNOWN_EVENT; + switch (data.event) { + case commonEvent.Support.COMMON_EVENT_PACKAGE_ADDED: + event = BundleEventType.BUNDLE_ADD; + break; + case commonEvent.Support.COMMON_EVENT_PACKAGE_CHANGED: + event = BundleEventType.BUNDLE_CHANGE; + break; + case commonEvent.Support.COMMON_EVENT_PACKAGE_REMOVED: + event = BundleEventType.BUNDLE_REMOVE; + break; + default: + Log.showError(TAG, `unknow event: ${event}`); + } + listener.onBundleNotify(data.bundleName ?? "unkown", event); + } + }); }); callback({ unRegister: () => { -- Gitee From dc31e8849259d36c9fda4173c9a598dc20625923 Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Tue, 14 Jun 2022 14:23:45 +0800 Subject: [PATCH 150/373] =?UTF-8?q?=E6=B7=BB=E5=8A=A0context=20stagemode?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E6=97=A5=E5=BF=97=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .../src/main/ets/viewmodel/NavigationBarViewModel.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index 8ea52f49..15693039 100644 --- a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -46,9 +46,16 @@ export default class NavigationBarViewModel { } constructor() { + Log.showInfo(TAG, 'constructor'); this.mNavigationBarComponentData = AppStorage.SetAndLink(NavigationBarComponentDataKey, this.mNavigationBarComponentData).get() this.urivar = settings.getUriSync(this.settingDataKey); + if (AbilityManager.getContext() == null) { + Log.showError(TAG, `AbilityManager.getContext() is null`); + } else { + Log.showInfo(TAG, 'context: ' + AbilityManager.getContext() + + 'stageMode: ' + AbilityManager.getContext().stageMode); + } this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), CommonConstants.URI_VAR); this.initNavigationBarStatus(); } @@ -85,7 +92,8 @@ export default class NavigationBarViewModel { if (tintState.contentColor) { this.mNavigationBarComponentData.contentColor = tintState.contentColor; } - Log.showDebug(TAG, `onTintStateChange, backgroundColor ${this.mNavigationBarComponentData.backgroundColor}, contentColor ${this.mNavigationBarComponentData.contentColor}`); + Log.showDebug(TAG, `onTintStateChange, backgroundColor ${this.mNavigationBarComponentData.backgroundColor}, + contentColor ${this.mNavigationBarComponentData.contentColor}`); } setWindowEnable?(isEnable: boolean) { -- Gitee From d318ec9e65a19b565e0b84c099495329cb137a5f Mon Sep 17 00:00:00 2001 From: limengmeng Date: Tue, 14 Jun 2022 17:45:28 +0800 Subject: [PATCH 151/373] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E4=BF=AE=E6=94=B9=EF=BC=8C=E5=86=9C=E5=8E=86?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E4=B8=8D=E5=8F=98=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: limengmeng --- common/src/main/ets/default/DateTimeCommon.ts | 11 +++++++++++ .../main/ets/com/ohos/view/component/dateTime.ets | 14 +------------- .../src/main/ets/com/ohos/vm/dateTimeViewModel.ts | 2 ++ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/common/src/main/ets/default/DateTimeCommon.ts b/common/src/main/ets/default/DateTimeCommon.ts index 0d1ab716..adbb121b 100644 --- a/common/src/main/ets/default/DateTimeCommon.ts +++ b/common/src/main/ets/default/DateTimeCommon.ts @@ -12,6 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { ConvertLunarCalendar } from '../../../../../common/src/main/ets/default/LunarCalendar' export class DateTimeCommon { getSystemTime(isUsing24hFormat: boolean) { @@ -35,6 +36,16 @@ export class DateTimeCommon { return result } + getCalendarDate(): {} { + let dateTime = new Date(); + let res = { + 'calendarYear': ConvertLunarCalendar( dateTime.getFullYear(), dateTime.getMonth() + 1, dateTime.getDate()).lunarYear, + 'calendarMonth': ConvertLunarCalendar( dateTime.getFullYear(), dateTime.getMonth() + 1, dateTime.getDate()).lunarMonth, + 'calendarDay': ConvertLunarCalendar( dateTime.getFullYear(), dateTime.getMonth() + 1, dateTime.getDate()).lunarDay + } + return res + } + getSystemWeek() { let dateTime = new Date(); let days = dateTime.getDay(); diff --git a/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets b/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets index af4da448..13bb1d4f 100644 --- a/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets +++ b/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets @@ -30,9 +30,6 @@ const TAG = 'ScreenLock-DateTime'; export default struct DateTime { @State mViewModel: ViewModel = new ViewModel() @Prop isShowDate: boolean - @State year: string = '' - @State month: string = '' - @State day: string = '' @State isPhone: boolean = false @State currentLanguage: string = DEFAULTLANG @@ -40,15 +37,6 @@ export default struct DateTime { Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() this.currentLanguage = i18n.getSystemLanguage() - this.year = - ConvertLunarCalendar(this.mViewModel.dateVal.year, this.mViewModel.dateVal.month, this.mViewModel.dateVal.day) - .lunarYear - this.month = - ConvertLunarCalendar(this.mViewModel.dateVal.year, this.mViewModel.dateVal.month, this.mViewModel.dateVal.day) - .lunarMonth - this.day = - ConvertLunarCalendar(this.mViewModel.dateVal.year, this.mViewModel.dateVal.month, this.mViewModel.dateVal.day) - .lunarDay if (DEVICETYPE == 'phone') { this.isPhone = true } @@ -84,7 +72,7 @@ export default struct DateTime { }.height($r('app.float.date_week_area_height')) Row() { - Text(this.year + '年' + this.month + '月' + this.day) + Text(this.mViewModel.calendarVal.calendarYear + '年' + this.mViewModel.calendarVal.calendarMonth + '月' + this.mViewModel.calendarVal.calendarDay) .height($r("app.float.date_lunar_calendar_height")) .fontColor(Color.White) .fontSize($r("app.float.date_lunar_calendar_fontSize")) diff --git a/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts b/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts index 75e7d113..f48100ed 100644 --- a/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts +++ b/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts @@ -41,6 +41,7 @@ export default class DateTimeViewModel { timeVal: string = '' dateVal: any = {} weekVal: any = {} + calendarVal: any = {} unSubscriber?: unsubscribe; ViewModelInit(): void{ @@ -64,6 +65,7 @@ export default class DateTimeViewModel { this.timeVal = sTimeManager.formatTime(date) this.dateVal = DateTimeCommon.getSystemDate() this.weekVal = DateTimeCommon.getSystemWeek() + this.calendarVal = DateTimeCommon.getCalendarDate() } private createSubscriberCallBack(err, data) { -- Gitee From a872f8a601aad785ce22eace6fe7afeb1b618e8c Mon Sep 17 00:00:00 2001 From: limengmeng Date: Tue, 14 Jun 2022 17:48:02 +0800 Subject: [PATCH 152/373] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E4=BF=AE=E6=94=B9=EF=BC=8C=E5=86=9C=E5=8E=86?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E4=B8=8D=E5=8F=98=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: limengmeng --- .../src/main/ets/com/ohos/view/component/dateTime.ets | 1 - 1 file changed, 1 deletion(-) diff --git a/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets b/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets index 13bb1d4f..921afd95 100644 --- a/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets +++ b/features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime.ets @@ -17,7 +17,6 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log' import ViewModel from '../../vm/dateTimeViewModel' import Constants from '../../common/constants' import { ScreenLockStatus } from '../../../../../../../../../common/src/main/ets/default/ScreenLockCommon' -import { ConvertLunarCalendar } from '../../../../../../../../../common/src/main/ets/default/LunarCalendar' import deviceInfo from '@ohos.deviceInfo'; import i18n from '@ohos.i18n'; -- Gitee From 232adef7488d618dc3965220f1d0fc5ea944a201 Mon Sep 17 00:00:00 2001 From: a1nc Date: Thu, 16 Jun 2022 16:14:35 +0800 Subject: [PATCH 153/373] adapt screenlock-service libname and enum value changes Signed-off-by: yangpeng85 --- .../src/main/ets/com/ohos/vm/wallpaperViewModel.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts index b02590e3..54ca48b1 100644 --- a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts +++ b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import WallpaperMar from '@ohos.app.wallpaperability' +import WallpaperMar from '@ohos.wallpaper' import Log from '../../../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-WallpaperViewModel' @@ -28,7 +28,7 @@ export default class WallpaperViewModel { private getScreenLockWallpaper() { Log.showInfo(TAG, 'getScreenLockWallpaper'); - WallpaperMar.getPixelMap(WallpaperMar.WALLPAPER_LOCKSCREEN, (error, data) => { + WallpaperMar.getPixelMap(WallpaperMar.WallpaperType.WALLPAPER_LOCKSCREEN, (error, data) => { if (error != undefined && error != null) { Log.showError(TAG, 'getScreenLockWallpaper error:' + JSON.stringify(error)); } else { -- Gitee From b80f80ebda65729aa7a67d7b79f15ede3b9fbdd9 Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Thu, 16 Jun 2022 16:44:48 +0800 Subject: [PATCH 154/373] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=88=86=E7=BB=84?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=8D=E8=83=BD=E5=AE=8C=E5=85=A8=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .../src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index 2146a7f6..a4af5db9 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -228,8 +228,9 @@ export class ViewModel { removeGroupNotification(itemData, isDelSysConent) { Log.showInfo(TAG, `removeGroupNotification, groupName: ${itemData.groupName}`); - let groupName = itemData.groupName - for (let i = 0, len = this.mNotificationList.length; i < len; i++) { + let groupName = itemData.groupName; + let index = this.mNotificationList.length; + while (i--) { if (this.mNotificationList[i].groupName == groupName) { let id = this.mNotificationList[i].id let hashcode = this.mNotificationList[i].hashcode -- Gitee From 76592fc0483ddd8697740cbe86c0edccc49503ec Mon Sep 17 00:00:00 2001 From: r00498791 Date: Fri, 17 Jun 2022 15:32:02 +0800 Subject: [PATCH 155/373] fix date display Signed-off-by: r00498791 --- .../dropdownpanel/src/main/ets/pages/common/constants.ts | 4 ++-- .../phone/dropdownpanel/src/main/ets/pages/notification.ets | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts index 905eae19..30176d54 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts @@ -18,13 +18,13 @@ export default class Constants { static TOUCHTYPE_UP = 1; static TOUCHTYPE_MOVE = 2; static WEEKDAY_LIST = [ + $r('app.string.sunday'), $r('app.string.monday'), $r('app.string.tuesday'), $r('app.string.wednesday'), $r('app.string.thursday'), $r('app.string.friday'), - $r('app.string.saturday'), - $r('app.string.sunday') + $r('app.string.saturday') ] static DIGITS = 10; static MARK_MONTH = 0; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 3b49cf7a..a10a699b 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -214,9 +214,10 @@ struct CenterTitle { async updateTimeString(date: Date) { this.mTime = TimeManager.formatTime(date); + Log.showDebug(TAG, ` month is ${date.getMonth() + 1} , day is ${date.getDate()} , week is ${Constants.WEEKDAY_LIST[date.getDay() - 1]}`); let timeString = (date.getMonth() + 1) + (await ResourceUtil.getString($r('app.string.month'))); timeString += date.getDate() + (await ResourceUtil.getString($r('app.string.day'))); - timeString += await ResourceUtil.getString(Constants.WEEKDAY_LIST[date.getDay() - 1]); + timeString += await ResourceUtil.getString(Constants.WEEKDAY_LIST[date.getDay()]); this.mTimeString = timeString; } -- Gitee From 62f61c67c8f5068d1fd1fba2f770af10fd86a210 Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Fri, 17 Jun 2022 16:17:16 +0800 Subject: [PATCH 156/373] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=BE=AA=E7=8E=AF=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .../src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index a4af5db9..03706309 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -229,8 +229,7 @@ export class ViewModel { removeGroupNotification(itemData, isDelSysConent) { Log.showInfo(TAG, `removeGroupNotification, groupName: ${itemData.groupName}`); let groupName = itemData.groupName; - let index = this.mNotificationList.length; - while (i--) { + for (let i = this.mNotificationList.length - 1, i >= len; i--) { if (this.mNotificationList[i].groupName == groupName) { let id = this.mNotificationList[i].id let hashcode = this.mNotificationList[i].hashcode -- Gitee From 57fc649830321bad30f5882d51be859a035c27fb Mon Sep 17 00:00:00 2001 From: lijinfengde123 <1037761763@qq.com> Date: Fri, 17 Jun 2022 16:25:39 +0800 Subject: [PATCH 157/373] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=BE=AA=E7=8E=AF=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 <1037761763@qq.com> --- .../src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index 03706309..786fc6f3 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -229,12 +229,12 @@ export class ViewModel { removeGroupNotification(itemData, isDelSysConent) { Log.showInfo(TAG, `removeGroupNotification, groupName: ${itemData.groupName}`); let groupName = itemData.groupName; - for (let i = this.mNotificationList.length - 1, i >= len; i--) { + for (let i = this.mNotificationList.length - 1; i >= 0; i--) { if (this.mNotificationList[i].groupName == groupName) { let id = this.mNotificationList[i].id let hashcode = this.mNotificationList[i].hashcode let removeItemArr = this.mNotificationList.splice(i, 1); - Log.showInfo(TAG, `removeGroupNotification i = ${i} removeItemArr= ${JSON.stringify(removeItemArr)}`); + Log.showDebug(TAG, `removeGroupNotification i = ${i} removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { this.updateFlowControlInfos(removeItemArr[0].bundleName, false) } -- Gitee From ad5e641c5127fb928f4e5615e64803ab1b93977e Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Fri, 17 Jun 2022 17:07:56 +0800 Subject: [PATCH 158/373] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=BE=AA=E7=8E=AF=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index 786fc6f3..36cf0119 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -292,7 +292,7 @@ export class ViewModel { } this.mNotificationCtrl['app'].set(item.bundleName, tmp); } - Log.showInfo(TAG, 'initFlowControlInfos end, mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); + Log.showDebug(TAG, 'initFlowControlInfos end, mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); } isCanShow(bundleName: string): boolean { -- Gitee From d1e9b0d20df1ec8cb83c033de804f5ff195b6f6c Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 21 Jun 2022 09:04:20 +0800 Subject: [PATCH 159/373] Status bar distance left layout optimization Signed-off-by: lijinfengde123 --- .../src/main/ets/com/ohos/pages/StatusBarComponent.ets | 3 +++ product/phone/statusbar/src/main/ets/pages/index.ets | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index 0651ccb6..680d0380 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -69,6 +69,7 @@ export default struct StatusBarComponent { mLayoutWeight: 1, mAlignItems: HorizontalAlign.Start }) + StatusBarGroup({ mComponents: this.mStatusBarLayout[1], mLayoutWeight: 0, @@ -80,6 +81,8 @@ export default struct StatusBarComponent { mAlignItems: HorizontalAlign.End }) } + .padding(this.mStatusBarData.showHorizontal ? + { left: $r('sys.float.ohos_id_max_padding_start'), right: $r('sys.float.ohos_id_max_padding_end') } : { left: '0'}) .width('100%') .height('100%') } else { diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index 111a1ddb..f62d95e7 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -108,8 +108,6 @@ struct Index { .width('100%') .height('100%') .constraintSize({ minHeight: this.StatusMinH }) - .padding(this.mStatusBarData.showHorizontal ? - { left: $r('sys.float.ohos_id_max_padding_start'), right: $r('sys.float.ohos_id_max_padding_end') } : { left: '0'}) .onAreaChange((e, e2) => { Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); }) -- Gitee From 47c1237233fd33e86d0a5bd63fc6eb846482840b Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 21 Jun 2022 09:09:08 +0800 Subject: [PATCH 160/373] Status bar distance left layout optimization Signed-off-by: lijinfengde123 --- .../src/main/ets/com/ohos/pages/StatusBarComponent.ets | 3 +-- product/phone/statusbar/src/main/ets/pages/index.ets | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index 680d0380..e87e56fc 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -69,7 +69,6 @@ export default struct StatusBarComponent { mLayoutWeight: 1, mAlignItems: HorizontalAlign.Start }) - StatusBarGroup({ mComponents: this.mStatusBarLayout[1], mLayoutWeight: 0, @@ -353,4 +352,4 @@ struct StatusBarNotificationIcon { } .height('100%') } -} +} \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index f62d95e7..b58a2e3c 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -115,11 +115,11 @@ struct Index { touchEvent(event: TouchEvent) { Trace.start(Trace.CORE_METHOD_START_TOUCHEVENT) - Log.showDebug(TAG, 'touchEvent================' + event.touches) + Log.showDebug(TAG, 'touchEvent' + event.touches) if (event.type == Constants.TOUCHTYPE_DOWN) { //down this.startX = event.touches[0].screenX this.startY = event.touches[0].screenY - Log.showInfo(TAG, `touchStart=======startX: ${this.startX}, startY: ${this.startY}`) + Log.showInfo(TAG, `touchStart, startX: ${this.startX}, startY: ${this.startY}`) } else if (event.type == Constants.TOUCHTYPE_MOVE) { //move this.moveX = event.touches[0].screenX - this.startX this.moveY = event.touches[0].screenY - this.startY @@ -167,4 +167,4 @@ struct Index { } } } -} +} \ No newline at end of file -- Gitee From 9549aa50a5ac5752e6975ef7fb470605a3dc2793 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 21 Jun 2022 09:17:34 +0800 Subject: [PATCH 161/373] Status bar distance left layout optimization Signed-off-by: lijinfengde123 --- .../src/main/ets/com/ohos/pages/StatusBarComponent.ets | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index e87e56fc..fd615b24 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -80,8 +80,7 @@ export default struct StatusBarComponent { mAlignItems: HorizontalAlign.End }) } - .padding(this.mStatusBarData.showHorizontal ? - { left: $r('sys.float.ohos_id_max_padding_start'), right: $r('sys.float.ohos_id_max_padding_end') } : { left: '0'}) + .padding({ left: $r('sys.float.ohos_id_max_padding_start'), right: $r('sys.float.ohos_id_max_padding_end') }) .width('100%') .height('100%') } else { -- Gitee From b4a037aeace79cba1d2387317d4e8274dc9b074d Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 21 Jun 2022 09:55:36 +0800 Subject: [PATCH 162/373] Status bar layout distinguishes between phone and pc Signed-off-by: lijinfengde123 --- .../main/ets/com/ohos/pages/StatusBarComponent.ets | 2 +- .../src/main/resources/base/element/float.json | 8 ++++++++ .../src/main/resources/phone/element/float.json | 12 ++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 features/statusbarcomponent/src/main/resources/phone/element/float.json diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index fd615b24..247c72f6 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -80,7 +80,7 @@ export default struct StatusBarComponent { mAlignItems: HorizontalAlign.End }) } - .padding({ left: $r('sys.float.ohos_id_max_padding_start'), right: $r('sys.float.ohos_id_max_padding_end') }) + .padding({ left: $r('app.float.status_bar_padding_start'), right: $r('app.float.status_bar_padding_end') }) .width('100%') .height('100%') } else { diff --git a/features/statusbarcomponent/src/main/resources/base/element/float.json b/features/statusbarcomponent/src/main/resources/base/element/float.json index 998f5281..4fd08171 100644 --- a/features/statusbarcomponent/src/main/resources/base/element/float.json +++ b/features/statusbarcomponent/src/main/resources/base/element/float.json @@ -43,6 +43,14 @@ { "name": "status_bar_notification_icon_space", "value": "8vp" + }, + { + "name": "status_bar_padding_start", + "value": "0vp" + }, + { + "name": "status_bar_padding_end", + "value": "0vp" } ] } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/resources/phone/element/float.json b/features/statusbarcomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..2a9fcaef --- /dev/null +++ b/features/statusbarcomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,12 @@ +{ + "float": [ + { + "name": "status_bar_padding_start", + "value": "24vp" + }, + { + "name": "status_bar_padding_end", + "value": "24vp" + } + ] +} \ No newline at end of file -- Gitee From 2dc62400ce11c15f76092b0b378ed4ddfd24a02a Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Tue, 21 Jun 2022 15:07:12 +0800 Subject: [PATCH 163/373] delete field: process Signed-off-by: xuchangzhou --- entry/pc/src/main/module.json5 | 1 - entry/phone/src/main/module.json5 | 1 - product/default/navigationBar/src/main/module.json5 | 1 - product/default/notificationmanagement/src/main/module.json5 | 1 - product/default/volumepanel/src/main/module.json5 | 1 - product/pc/controlpanel/src/main/module.json5 | 1 - product/pc/notificationpanel/src/main/module.json5 | 1 - product/pc/statusbar/src/main/module.json5 | 1 - product/phone/dropdownpanel/src/main/module.json5 | 1 - product/phone/statusbar/src/main/module.json5 | 1 - 10 files changed, 10 deletions(-) diff --git a/entry/pc/src/main/module.json5 b/entry/pc/src/main/module.json5 index 7d9b809c..7bb6c058 100644 --- a/entry/pc/src/main/module.json5 +++ b/entry/pc/src/main/module.json5 @@ -5,7 +5,6 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:description_mainability", "mainElement": "com.ohos.systemui.ServiceExtAbility", - "process": "com.ohos.systemui:extension", "deviceTypes": [ "tablet" ], diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index a1467da2..ea40de6c 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -5,7 +5,6 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:description_mainability", "mainElement": "com.ohos.systemui.ServiceExtAbility", - "process": "com.ohos.systemui:extension", "deviceTypes": [ "phone" ], diff --git a/product/default/navigationBar/src/main/module.json5 b/product/default/navigationBar/src/main/module.json5 index 9b151062..0636f23d 100644 --- a/product/default/navigationBar/src/main/module.json5 +++ b/product/default/navigationBar/src/main/module.json5 @@ -5,7 +5,6 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.navigationbar.ServiceExtAbility", - "process": "com.ohos.systemui:extension", "deviceTypes": [ "phone", "tablet" ], diff --git a/product/default/notificationmanagement/src/main/module.json5 b/product/default/notificationmanagement/src/main/module.json5 index ff92a4a3..fc225cc8 100644 --- a/product/default/notificationmanagement/src/main/module.json5 +++ b/product/default/notificationmanagement/src/main/module.json5 @@ -5,7 +5,6 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.notificationmanagement.MainAbility", - "process": "com.ohos.systemui:extension", "deviceTypes": [ "phone", "tablet" ], diff --git a/product/default/volumepanel/src/main/module.json5 b/product/default/volumepanel/src/main/module.json5 index 3c6aa9a4..a570a5ac 100644 --- a/product/default/volumepanel/src/main/module.json5 +++ b/product/default/volumepanel/src/main/module.json5 @@ -5,7 +5,6 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.volumepanel.ServiceExtAbility", - "process": "com.ohos.systemui:extension", "deviceTypes": [ "phone", "tablet" ], diff --git a/product/pc/controlpanel/src/main/module.json5 b/product/pc/controlpanel/src/main/module.json5 index 6353f9e8..5d8c7c5c 100644 --- a/product/pc/controlpanel/src/main/module.json5 +++ b/product/pc/controlpanel/src/main/module.json5 @@ -5,7 +5,6 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.controlpanel.ServiceExtAbility", - "process": "com.ohos.systemui:extension", "deviceTypes": [ "tablet" ], diff --git a/product/pc/notificationpanel/src/main/module.json5 b/product/pc/notificationpanel/src/main/module.json5 index bdee9516..16d9a1ce 100644 --- a/product/pc/notificationpanel/src/main/module.json5 +++ b/product/pc/notificationpanel/src/main/module.json5 @@ -5,7 +5,6 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.notificationpanel.ServiceExtAbility", - "process": "com.ohos.systemui:extension", "deviceTypes": [ "tablet" ], diff --git a/product/pc/statusbar/src/main/module.json5 b/product/pc/statusbar/src/main/module.json5 index 26c1d7fb..9d39c446 100644 --- a/product/pc/statusbar/src/main/module.json5 +++ b/product/pc/statusbar/src/main/module.json5 @@ -5,7 +5,6 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.statusbar.ServiceExtAbility", - "process": "com.ohos.systemui:extension", "deviceTypes": [ "tablet" ], diff --git a/product/phone/dropdownpanel/src/main/module.json5 b/product/phone/dropdownpanel/src/main/module.json5 index b592d05f..7af54b91 100644 --- a/product/phone/dropdownpanel/src/main/module.json5 +++ b/product/phone/dropdownpanel/src/main/module.json5 @@ -5,7 +5,6 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.dropdownpanel.ServiceExtAbility", - "process": "com.ohos.systemui:extension", "deviceTypes": [ "phone" ], diff --git a/product/phone/statusbar/src/main/module.json5 b/product/phone/statusbar/src/main/module.json5 index 1673e7bf..5a1fc3f4 100644 --- a/product/phone/statusbar/src/main/module.json5 +++ b/product/phone/statusbar/src/main/module.json5 @@ -5,7 +5,6 @@ "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.statusbar.ServiceExtAbility", - "process": "com.ohos.systemui:extension", "deviceTypes": [ "phone" ], -- Gitee From 3291b483cd77e8ba474f69849711efb4c5ab6b91 Mon Sep 17 00:00:00 2001 From: r00498791 Date: Wed, 22 Jun 2022 16:51:35 +0800 Subject: [PATCH 164/373] match uppercase and lowercase Signed-off-by: r00498791 --- features/batterycomponent/src/main/ets/default/batteryModel.ts | 3 ++- .../src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts | 2 +- .../main/ets/com/ohos/noticeItem/model/NotificationManager.ts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts index 5775fc44..e1e5bce2 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,7 +14,7 @@ * limitations under the License. */ -import BatteryInfo from "@ohos.batteryInfo"; +import BatteryInfo from "@ohos.batteryinfo"; import commonEvent from "@ohos.commonEvent"; import createOrGet from "../../../../../../common/src/main/ets/default/SingleInstanceHelper"; import Constants from "./common/constants"; diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts index c64f81b3..60853983 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts @@ -15,7 +15,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import commonEvent from '@ohos.commonevent'; +import commonEvent from '@ohos.commonEvent'; import Constants from './common/constants'; import Input from '@ohos.multimodalInput.inputEventClient'; const TAG = 'KeyCodeEvent' diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index 128498f5..97e04822 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -15,7 +15,7 @@ //import { NotificationSubscriber } from './notification/notificationSubscriber'; import Notification from '@ohos.notification'; -import PluginComponentManager from '@ohos.plugincomponent'; +import PluginComponentManager from '@ohos.pluginComponent'; import Systemparameter from '@ohos.systemparameter'; import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -- Gitee From f8c5d45ee9db35880e5cf7e99e7a08187c0e65ba Mon Sep 17 00:00:00 2001 From: a1nc Date: Thu, 23 Jun 2022 15:42:14 +0800 Subject: [PATCH 165/373] update trace log Signed-off-by: yangpeng85 --- .../main/ets/com/ohos/view/component/customPSD.ets | 10 ++++++++-- .../main/ets/com/ohos/view/component/digitalPSD.ets | 10 ++++++++-- .../main/ets/com/ohos/view/component/mixedPSD.ets | 2 -- .../src/main/ets/com/ohos/vm/wallpaperViewModel.ts | 2 +- product/pc/src/main/ets/pages/customPassword.ets | 10 ++++++++++ product/pc/src/main/ets/pages/digitalPassword.ets | 10 ++++++++++ product/pc/src/main/ets/pages/mixedPassword.ets | 10 ++++++++++ product/pc/src/main/ets/pages/slidescreenlock.ets | 12 ++++++++++++ 8 files changed, 59 insertions(+), 7 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets index 6586a675..8c8a5b53 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/customPSD.ets @@ -13,7 +13,6 @@ * limitations under the License. */ -import Trace from '../../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard' @@ -36,10 +35,17 @@ export default struct CustomPSD { aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) - Trace.end(Trace.CORE_METHOD_CALL_PAGE_HIDE); this.mViewModel.clearPassword() } + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + } + + onPageHide() { + Log.showInfo(TAG, `onPageHide`) + } + build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets index 3862da2a..dfa3f8df 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/digitalPSD.ets @@ -13,7 +13,6 @@ * limitations under the License. */ -import Trace from '../../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' import NumkeyBoard from './numkeyBoard' @@ -35,10 +34,17 @@ export default struct DigitalPSD { aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) - Trace.end(Trace.CORE_METHOD_CALL_PAGE_HIDE); this.mViewModel.clearPassword() } + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + } + + onPageHide() { + Log.showInfo(TAG, `onPageHide`) + } + build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { diff --git a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets index a06dcd49..c1767fe5 100644 --- a/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets +++ b/features/screenlock/src/main/ets/com/ohos/view/component/mixedPSD.ets @@ -13,7 +13,6 @@ * limitations under the License. */ -import Trace from '../../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../../common/src/main/ets/default/Log' import Constants from '../../common/constants' import ViewModel from '../../vm/mixedPSDViewModel' @@ -35,7 +34,6 @@ export default struct MixedPSD { aboutToDisappear() { Log.showInfo(TAG, `aboutToDisappear`) - Trace.end(Trace.CORE_METHOD_CALL_PAGE_HIDE); this.mViewModel.clearPassword() } diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts index 54ca48b1..a9214ab8 100644 --- a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts +++ b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import WallpaperMar from '@ohos.wallpaper' +import WallpaperMar from '@ohos.app.wallpaperability' import Log from '../../../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-WallpaperViewModel' diff --git a/product/pc/src/main/ets/pages/customPassword.ets b/product/pc/src/main/ets/pages/customPassword.ets index 961b8f92..bfeee240 100644 --- a/product/pc/src/main/ets/pages/customPassword.ets +++ b/product/pc/src/main/ets/pages/customPassword.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log' import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' @@ -41,6 +42,15 @@ export default struct CustomPassword { Log.showInfo(TAG, `aboutToDisappear`) } + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + } + + onPageHide() { + Log.showInfo(TAG, `onPageHide`) + Trace.end(Trace.CORE_METHOD_CALL_PAGE_HIDE); + } + build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Column() { diff --git a/product/pc/src/main/ets/pages/digitalPassword.ets b/product/pc/src/main/ets/pages/digitalPassword.ets index 97751fcc..ca1a95c6 100644 --- a/product/pc/src/main/ets/pages/digitalPassword.ets +++ b/product/pc/src/main/ets/pages/digitalPassword.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log' import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' @@ -41,6 +42,15 @@ export default struct DigitalPassword { Log.showInfo(TAG, `aboutToDisappear`) } + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + } + + onPageHide() { + Log.showInfo(TAG, `onPageHide`) + Trace.end(Trace.CORE_METHOD_CALL_PAGE_HIDE); + } + build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Column() { diff --git a/product/pc/src/main/ets/pages/mixedPassword.ets b/product/pc/src/main/ets/pages/mixedPassword.ets index 52bbf6ba..25115aa4 100644 --- a/product/pc/src/main/ets/pages/mixedPassword.ets +++ b/product/pc/src/main/ets/pages/mixedPassword.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log' import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' @@ -41,6 +42,15 @@ export default struct MixedPassword { Log.showInfo(TAG, `aboutToDisappear`) } + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + } + + onPageHide() { + Log.showInfo(TAG, `onPageHide`) + Trace.end(Trace.CORE_METHOD_CALL_PAGE_HIDE); + } + build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Column() { diff --git a/product/pc/src/main/ets/pages/slidescreenlock.ets b/product/pc/src/main/ets/pages/slidescreenlock.ets index 086df03e..7b81de74 100644 --- a/product/pc/src/main/ets/pages/slidescreenlock.ets +++ b/product/pc/src/main/ets/pages/slidescreenlock.ets @@ -40,6 +40,18 @@ export default struct SlideScreenlock { this.mViewModel.ViewModelInit() } + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`) + } + + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + } + + onPageHide() { + Log.showInfo(TAG, `onPageHide`) + } + build() { Stack({ alignContent: Alignment.Bottom }) { Column() { -- Gitee From 4ca40f557931d2f5c5f865804a222c778a55bccb Mon Sep 17 00:00:00 2001 From: a1nc Date: Thu, 23 Jun 2022 15:51:02 +0800 Subject: [PATCH 166/373] remove wrong import of wallpaperViewModel.ets Signed-off-by: yangpeng85 --- .../src/main/ets/com/ohos/vm/wallpaperViewModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts index a9214ab8..54ca48b1 100644 --- a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts +++ b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import WallpaperMar from '@ohos.app.wallpaperability' +import WallpaperMar from '@ohos.wallpaper' import Log from '../../../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-WallpaperViewModel' -- Gitee From 4d61c29081c1e39fed87383c54f824718dd5ba2a Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Thu, 23 Jun 2022 15:55:05 +0800 Subject: [PATCH 167/373] Adaptation to version 901 of the IDE and version 3.2.2.5 of the SDK Signed-off-by: xuchangzhou --- common/build-profile.json5 | 3 - common/src/main/ets/default/Constants.ts | 1 + .../ets/default/MultimodalInputManager.ts | 28 +- common/src/main/ets/default/SettingsUtil.ts | 1 + common/src/main/ets/default/TimeManager.ts | 1 + common/src/main/ets/default/WindowManager.ts | 4 +- common/src/main/module.json5 | 2 +- entry/pc/build-profile.json5 | 3 - entry/phone/build-profile.json5 | 3 - entry/phone/src/main/module.json5 | 2 +- .../airplanecomponent/build-profile.json5 | 3 - .../autorotatecomponent/build-profile.json5 | 3 - features/batterycomponent/build-profile.json5 | 5 +- .../bluetoothcomponent/build-profile.json5 | 5 +- .../brightnesscomponent/build-profile.json5 | 5 +- .../src/main/ets/default/brightnessManager.ts | 1 + features/capsulecomponent/build-profile.json5 | 5 +- features/clockcomponent/build-profile.json5 | 5 +- .../build-profile.json5 | 5 +- .../locationcomponent/build-profile.json5 | 5 +- .../managementcomponent/build-profile.json5 | 5 +- .../ets/com/ohos/model/bundleResourceModel.ts | 10 +- .../ets/com/ohos/model/noDisturbingModel.ts | 8 +- .../navigationservice/build-profile.json5 | 5 +- features/noticeitem/build-profile.json5 | 5 +- .../com/ohos/noticeItem/common/CommonUtil.ts | 4 +- .../noticeItem/model/NotificationManager.ts | 4 +- .../noticeItem/model/NotificationService.ts | 1 - .../ohos/noticeItem/model/ParseDataUtil.ts | 4 +- .../noticeItem/model/rule/RuleController.ts | 9 +- .../ohos/noticeItem/viewmodel/ViewModel.ts | 10 +- .../ringmodecomponent/build-profile.json5 | 5 +- features/signalcomponent/build-profile.json5 | 5 +- .../statusbarcomponent/build-profile.json5 | 5 +- features/volumecomponent/build-profile.json5 | 5 +- .../volumepanelcomponent/build-profile.json5 | 5 +- features/wificomponent/build-profile.json5 | 5 +- package-lock.json | 3359 ++--------------- package.json | 23 +- .../default/navigationBar/build-profile.json5 | 5 +- .../ets/viewmodel/NavigationBarViewModel.ts | 1 + .../navigationBar/src/main/module.json5 | 3 +- .../build-profile.json5 | 5 +- .../src/main/ets/pages/slotSetting.ets | 16 +- .../src/main/module.json5 | 7 +- .../main/resources/base/element/color.json | 8 + .../default/volumepanel/build-profile.json5 | 5 +- .../default/volumepanel/src/main/module.json5 | 3 +- product/pc/controlpanel/build-profile.json5 | 5 +- product/pc/controlpanel/src/main/module.json5 | 3 +- .../resources/base/profile/form_config.json | 12 + .../pc/notificationpanel/build-profile.json5 | 5 +- .../notificationpanel/src/main/module.json5 | 3 +- .../resources/base/profile/form_config.json | 12 + product/pc/statusbar/build-profile.json5 | 5 +- .../phone/dropdownpanel/build-profile.json5 | 5 +- .../src/main/ets/pages/control.ets | 64 +- .../src/main/ets/pages/index.ets | 29 +- .../src/main/ets/pages/notification.ets | 62 +- .../phone/dropdownpanel/src/main/module.json5 | 2 +- product/phone/statusbar/build-profile.json5 | 5 +- product/phone/statusbar/src/main/module.json5 | 2 +- 62 files changed, 551 insertions(+), 3283 deletions(-) create mode 100644 product/default/notificationmanagement/src/main/resources/base/element/color.json create mode 100644 product/pc/controlpanel/src/main/resources/base/profile/form_config.json create mode 100644 product/pc/notificationpanel/src/main/resources/base/profile/form_config.json diff --git a/common/build-profile.json5 b/common/build-profile.json5 index 3f685bd2..7a7d48a2 100644 --- a/common/build-profile.json5 +++ b/common/build-profile.json5 @@ -1,8 +1,5 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, "targets": [ { "name": "default", diff --git a/common/src/main/ets/default/Constants.ts b/common/src/main/ets/default/Constants.ts index 62585a29..505cb8da 100644 --- a/common/src/main/ets/default/Constants.ts +++ b/common/src/main/ets/default/Constants.ts @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/common/src/main/ets/default/MultimodalInputManager.ts b/common/src/main/ets/default/MultimodalInputManager.ts index 014527ee..11a4b049 100644 --- a/common/src/main/ets/default/MultimodalInputManager.ts +++ b/common/src/main/ets/default/MultimodalInputManager.ts @@ -16,7 +16,7 @@ import inputConsumer from "@ohos.multimodalInput.inputConsumer"; import Log from "./Log"; import createOrGet from "./SingleInstanceHelper"; -export type MultiCallback = (keyOptions: typeof inputConsumer.KeyOptions) => void; +export type MultiCallback = (keyOptions: inputConsumer.KeyOptions) => void; export enum MultiKeyCode { WIN = 2076, N = 2030, @@ -52,41 +52,41 @@ class MultimodalInputManager { isFinalKeyDown: true, finalKeyDownDuration: 0, }; - inputConsumer.on("key", keyOptions, (err, options) => { - Log.showInfo(TAG, `on CombinationKey, options:${JSON.stringify(options)}, err: ${JSON.stringify(err)}`); + inputConsumer.on("key", keyOptions, (options) => { + Log.showInfo(TAG, `on CombinationKey, options:${JSON.stringify(options)}`); cb(options); }); Log.showInfo(TAG, `subscribe CombinationKey, keys:${JSON.stringify(keys)}`); return () => { - inputConsumer.off("key", keyOptions, (err, data) => {}); + inputConsumer.off("key", keyOptions, (data) => {}); }; } registerControlListener(callback) { Log.showDebug(TAG, `registerListener control`); - inputConsumer.on("key", this.controlKeyOptions, (err, data) => { - Log.showInfo(TAG, `controlRegisterCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - callback.onControlShowOrHide(err, data); + inputConsumer.on("key", this.controlKeyOptions, (data) => { + Log.showInfo(TAG, `controlRegisterCallBack data: ${JSON.stringify(data)}`); + callback.onControlShowOrHide(data); }); Log.showDebug(TAG, `registerListener end`); } registerNotificationListener(callback) { Log.showDebug(TAG, `registerListener notification`); - inputConsumer.on("key", this.notificationKeyOptions, (err, data) => { - Log.showInfo(TAG, `notificationRegisterCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); - callback.onNotificationShowOrHide(err, data); + inputConsumer.on("key", this.notificationKeyOptions, ( data) => { + Log.showInfo(TAG, `notificationRegisterCallBack data: ${JSON.stringify(data)}`); + callback.onNotificationShowOrHide(data); }); Log.showDebug(TAG, `registerListener end`); } unregisterListener() { Log.showDebug(TAG, `unregisterListener start`); - inputConsumer.off("key", this.notificationKeyOptions, (err, data) => { - Log.showInfo(TAG, `notificationUnregisterCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + inputConsumer.off("key", this.notificationKeyOptions, (data) => { + Log.showInfo(TAG, `notificationUnregisterCallBack data: ${JSON.stringify(data)}`); }); - inputConsumer.off("key", this.controlKeyOptions, (err, data) => { - Log.showInfo(TAG, `controlUnregisterCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); + inputConsumer.off("key", this.controlKeyOptions, (data) => { + Log.showInfo(TAG, `controlUnregisterCallBack data: ${JSON.stringify(data)}`); }); Log.showDebug(TAG, `unregisterListener end`); } diff --git a/common/src/main/ets/default/SettingsUtil.ts b/common/src/main/ets/default/SettingsUtil.ts index 21898914..233bf735 100644 --- a/common/src/main/ets/default/SettingsUtil.ts +++ b/common/src/main/ets/default/SettingsUtil.ts @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts index c459ceb2..c9cf24a4 100644 --- a/common/src/main/ets/default/TimeManager.ts +++ b/common/src/main/ets/default/TimeManager.ts @@ -1,3 +1,4 @@ +//@ts-nocheck /** * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index 67b7b8df..fb044c2d 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -37,7 +38,6 @@ export enum WindowType { export const WINDOW_SHOW_HIDE_EVENT = "WindowShowHideEvent"; export const WINDOW_RESIZE_EVENT = "WindowResizeEvent"; -type WindowHandle = typeof Window.Window; const TAG = "WindowManager"; const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: Window.WindowType } = { SystemUi_StatusBar: Window.WindowType.TYPE_STATUS_BAR, @@ -59,7 +59,7 @@ const DEFAULT_WINDOW_INFO: WindowInfo = { class WindowManager { mWindowInfos: Map = new Map(); - async createWindow(context: any, name: WindowType, rect: Rect, loadContent: string): Promise { + async createWindow(context: any, name: WindowType, rect: Rect, loadContent: string): Promise { Log.showInfo(TAG, `createWindow name: ${name}, rect: ${JSON.stringify(rect)}, url: ${loadContent}`); let winHandle = await Window.create(context, name, SYSTEM_WINDOW_TYPE_MAP[name]); await winHandle.moveTo(rect.left, rect.top); diff --git a/common/src/main/module.json5 b/common/src/main/module.json5 index 20c4d0b6..2a5a882a 100644 --- a/common/src/main/module.json5 +++ b/common/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "common", "type": "har", "deviceTypes": [ - "phone", + "default" ], "uiSyntax": "ets" } diff --git a/entry/pc/build-profile.json5 b/entry/pc/build-profile.json5 index 3f685bd2..7a7d48a2 100644 --- a/entry/pc/build-profile.json5 +++ b/entry/pc/build-profile.json5 @@ -1,8 +1,5 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, "targets": [ { "name": "default", diff --git a/entry/phone/build-profile.json5 b/entry/phone/build-profile.json5 index 3f685bd2..7a7d48a2 100644 --- a/entry/phone/build-profile.json5 +++ b/entry/phone/build-profile.json5 @@ -1,8 +1,5 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, "targets": [ { "name": "default", diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index ea40de6c..593e834d 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -6,7 +6,7 @@ "description": "$string:description_mainability", "mainElement": "com.ohos.systemui.ServiceExtAbility", "deviceTypes": [ - "phone" + "default" ], "deliveryWithInstall": true, "installationFree": false, diff --git a/features/airplanecomponent/build-profile.json5 b/features/airplanecomponent/build-profile.json5 index 3f685bd2..7a7d48a2 100644 --- a/features/airplanecomponent/build-profile.json5 +++ b/features/airplanecomponent/build-profile.json5 @@ -1,8 +1,5 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, "targets": [ { "name": "default", diff --git a/features/autorotatecomponent/build-profile.json5 b/features/autorotatecomponent/build-profile.json5 index 3f685bd2..7a7d48a2 100644 --- a/features/autorotatecomponent/build-profile.json5 +++ b/features/autorotatecomponent/build-profile.json5 @@ -1,8 +1,5 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, "targets": [ { "name": "default", diff --git a/features/batterycomponent/build-profile.json5 b/features/batterycomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/batterycomponent/build-profile.json5 +++ b/features/batterycomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/bluetoothcomponent/build-profile.json5 b/features/bluetoothcomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/bluetoothcomponent/build-profile.json5 +++ b/features/bluetoothcomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/brightnesscomponent/build-profile.json5 b/features/brightnesscomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/brightnesscomponent/build-profile.json5 +++ b/features/brightnesscomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index 4e807fbb..eaf7a615 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/capsulecomponent/build-profile.json5 b/features/capsulecomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/capsulecomponent/build-profile.json5 +++ b/features/capsulecomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/clockcomponent/build-profile.json5 b/features/clockcomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/clockcomponent/build-profile.json5 +++ b/features/clockcomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/controlcentercomponent/build-profile.json5 b/features/controlcentercomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/controlcentercomponent/build-profile.json5 +++ b/features/controlcentercomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/locationcomponent/build-profile.json5 b/features/locationcomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/locationcomponent/build-profile.json5 +++ b/features/locationcomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/managementcomponent/build-profile.json5 b/features/managementcomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/managementcomponent/build-profile.json5 +++ b/features/managementcomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index 67c2dd7c..88e2c26e 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -110,10 +110,10 @@ export default class BundleResourceModel { userId: userInfo.userId }).then((data) => { Log.showInfo(TAG, `getBundleInfo bundleInfo:${JSON.stringify(data)}`); - ResMgr.getResourceManager(AbilityManager.getContext(), data.name, (error, item) => { + ResMgr.getResourceManager(data.name, (error, item) => { let appInfo = data.appInfo; - if (appInfo.labelId > 0) { - item.getString(appInfo.labelId, (error, value) => { + if (parseInt(appInfo.labelId) > 0) { + item.getString(parseInt(appInfo.labelId), (error, value) => { if (value != null) { Log.showDebug(TAG, `getBundleInfo getResourceManager getString() value: ` + value); mBundleInfo.appTitle = value @@ -133,8 +133,8 @@ export default class BundleResourceModel { mBundleInfo.systemApp = appInfo.systemApp Log.showDebug(TAG, 'getBundleInfo getResourceManager label:' + label); - if (appInfo.iconId > 0) { - item.getMediaBase64(appInfo.iconId, (error, imageValue) => { + if (parseInt(appInfo.iconId) > 0) { + item.getMediaBase64(parseInt(appInfo.iconId), (error, imageValue) => { if (!!imageValue) { mBundleInfo.appIcon = imageValue } diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts index fb2ff970..eba16690 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts @@ -44,10 +44,10 @@ export default class NoDisturbingModel { } static setNoDisturbingDate(noDisturbingTime, callback) { - let targetDate = {} - targetDate['type'] = noDisturbingTime.type - targetDate['begin'] = noDisturbingTime.begin - targetDate['end'] = noDisturbingTime.end + let targetDate: Notification.DoNotDisturbDate = { + type: noDisturbingTime.type, + begin: noDisturbingTime.begin, + end: noDisturbingTime.end } Log.showDebug(TAG, `setDoNotDisturbDate targetDate['type'] : ` + JSON.stringify(targetDate['type']) + ` ['begin'] : ` + JSON.stringify(targetDate['begin']) + ` ['end'] : ` + JSON.stringify(targetDate['end'])); Notification.setDoNotDisturbDate(targetDate, callback) diff --git a/features/navigationservice/build-profile.json5 b/features/navigationservice/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/navigationservice/build-profile.json5 +++ b/features/navigationservice/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/noticeitem/build-profile.json5 b/features/noticeitem/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/noticeitem/build-profile.json5 +++ b/features/noticeitem/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts index 52ef6797..7da0954e 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -28,8 +28,8 @@ export default class CommonUtil { static startWant(want, triggerInfo?: any) { let info = (triggerInfo) ? triggerInfo : DEFAULT_INFO; Log.showDebug(TAG, `startWant ${JSON.stringify(want)}, info ${JSON.stringify(info)}`); - WantAgent.trigger(want, info, ((err, data) => { - Log.showInfo(TAG, `wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); + WantAgent.trigger(want, info, ((data) => { + Log.showInfo(TAG, `wantAgent trigger data ${JSON.stringify(data)}`); })); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index 97e04822..62350b57 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -89,14 +89,14 @@ export default class NotificationManager { static requestListener(tag, ownerWant, asyncCallback) { Log.showInfo(TAG, `requestListener from: ${tag}`); - PluginComponentManager.on(ownerWant, 'request', (source, name, data) => { + PluginComponentManager.on('request', (source, name, data) => { asyncCallback(source, name, data); }) } static pushListener(tag, ownerWant, asyncCallback) { Log.showInfo(TAG, `pushListener from: ${tag}`); - PluginComponentManager.on(ownerWant, 'push', (source, template, data, extraData) => { + PluginComponentManager.on('push', (source, template, data, extraData) => { asyncCallback(source, template, data, extraData); }); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index 4aec12b0..c3c1963b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -14,7 +14,6 @@ */ import notification from '@ohos.notification'; -import NotificationSubscriber from '@ohos.notificationSubscriber'; import Log from '../../../../../../../../../common/src/main/ets/default/Log'; import NotificationManager from './NotificationManager'; import ParseDataUtil from './ParseDataUtil'; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index de29d463..1f12014c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -107,8 +107,8 @@ export default class ParseDataUtil { let iconId = data?.appInfo?.iconId; let item = await BundleManager.getResourceManager(TAG, AbilityManager.getContext(), bundleName); let appMessage = { - appName: await item.getString(labelId), - icon: await item.getMediaBase64(iconId) + appName: await item.getString(parseInt(labelId)), + icon: await item.getMediaBase64(parseInt(iconId)) }; if (appMessage.icon != null && appMessage.appName) { appDataMap.set(bundleName, appMessage); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts index 72232f64..5a389231 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts @@ -15,7 +15,6 @@ import {NotificationItemData} from '../../common/constants'; import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; -import {SlotLevel} from '@ohos.notification'; import Notification from '@ohos.notification'; import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; import Bundle from '@ohos.bundle'; @@ -103,7 +102,7 @@ export class RuleController { isAllowNotificationListShow : false }; Log.showInfo(TAG, `notificationItemData.slotLevel = ${notificationItemData.slotLevel}`); - if (notificationItemData.slotLevel === SlotLevel.LEVEL_HIGH) { + if (notificationItemData.slotLevel === Notification.SlotLevel.LEVEL_HIGH) { mNotificationItemData.ruleData.isAllowBanner = true; this.SoundOrVibrate(notificationItemData, (sound, vibrationValues) => { mNotificationItemData.ruleData.isAllowSound = sound; @@ -112,15 +111,15 @@ export class RuleController { mNotificationItemData.ruleData.isAllowStatusBarShow = true; mNotificationItemData.ruleData.isAllowNotificationListShow = true; - } else if (notificationItemData.slotLevel === SlotLevel.LEVEL_DEFAULT) { + } else if (notificationItemData.slotLevel === Notification.SlotLevel.LEVEL_DEFAULT) { this.SoundOrVibrate(notificationItemData, (sound, vibrationValues) => { mNotificationItemData.ruleData.isAllowSound = sound; mNotificationItemData.ruleData.isAllowVibrationValues = vibrationValues; }); mNotificationItemData.ruleData.isAllowStatusBarShow = true; mNotificationItemData.ruleData.isAllowNotificationListShow = true; - } else if (notificationItemData.slotLevel === SlotLevel.LEVEL_LOW || - notificationItemData.slotLevel === SlotLevel.LEVEL_MIN) { + } else if (notificationItemData.slotLevel === Notification.SlotLevel.LEVEL_LOW || + notificationItemData.slotLevel === Notification.SlotLevel.LEVEL_MIN) { mNotificationItemData.ruleData.isAllowNotificationListShow = true; } else { mNotificationItemData.ruleData.isAllowNotificationListShow = false; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index 36cf0119..4f4b88bd 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -18,7 +18,7 @@ import SwitchUserManager from '../../../../../../../../../common/src/main/ets/de import media from '@ohos.multimedia.media'; import vibrator from '@ohos.vibrator'; import wantAgent from '@ohos.wantAgent'; -import SourceType from '@ohos.notification' +import Notification from '@ohos.notification' import NotificationService from '../model/NotificationService' import NotificationWindowManager from '../model/NotificationWindowManager'; import NotificationConfig from '../model/NotificationConfig'; @@ -164,15 +164,15 @@ export class ViewModel { } this.mNotificationList.sort((itemA, itemB) => { //long term notification come first - if (itemA.source == SourceType.TYPE_CONTINUOUS && itemB.source != SourceType.TYPE_CONTINUOUS) { + if (itemA.source == Notification.SourceType.TYPE_CONTINUOUS && itemB.source != Notification.SourceType.TYPE_CONTINUOUS) { return -1 } //long term notification come first - if (itemA.source != SourceType.TYPE_CONTINUOUS && itemB.source == SourceType.TYPE_CONTINUOUS) { + if (itemA.source != Notification.SourceType.TYPE_CONTINUOUS && itemB.source == Notification.SourceType.TYPE_CONTINUOUS) { return 1 } - if ((itemA.source == SourceType.TYPE_CONTINUOUS && itemB.source == SourceType.TYPE_CONTINUOUS) || - (itemA.source != SourceType.TYPE_CONTINUOUS && itemB.source != SourceType.TYPE_CONTINUOUS) + if ((itemA.source == Notification.SourceType.TYPE_CONTINUOUS && itemB.source == Notification.SourceType.TYPE_CONTINUOUS) || + (itemA.source != Notification.SourceType.TYPE_CONTINUOUS && itemB.source != Notification.SourceType.TYPE_CONTINUOUS) ) { return -1 * (itemA.timestamp - itemB.timestamp) } diff --git a/features/ringmodecomponent/build-profile.json5 b/features/ringmodecomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/ringmodecomponent/build-profile.json5 +++ b/features/ringmodecomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/signalcomponent/build-profile.json5 b/features/signalcomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/signalcomponent/build-profile.json5 +++ b/features/signalcomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/statusbarcomponent/build-profile.json5 b/features/statusbarcomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/statusbarcomponent/build-profile.json5 +++ b/features/statusbarcomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/volumecomponent/build-profile.json5 b/features/volumecomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/volumecomponent/build-profile.json5 +++ b/features/volumecomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/volumepanelcomponent/build-profile.json5 b/features/volumepanelcomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/volumepanelcomponent/build-profile.json5 +++ b/features/volumepanelcomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/features/wificomponent/build-profile.json5 b/features/wificomponent/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/features/wificomponent/build-profile.json5 +++ b/features/wificomponent/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/package-lock.json b/package-lock.json index 2997e9ae..fe2b0e89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,2359 +1,23 @@ { "name": "systemui", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "systemui", - "version": "1.0.0", - "dependencies": { - "@ohos/hvigor": "1.0.6", - "@ohos/hvigor-ohos-plugin": "1.0.6" - }, - "devDependencies": {} - }, - "node_modules/@ohos/hvigor": { - "version": "1.0.6", - "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.0.6.tgz", - "integrity": "sha512-jjp7vpvUOMW1Nf7TdyhOtonwWHoSyBJLUiZTQqIx/GJV4UJyIqsiURUOqFwncQ4L7PDdeHuWly4uEelknYeWhg==", - "dependencies": { - "@ohos/hvigor-base": "1.0.6", - "interpret": "1.4.0", - "liftoff": "4.0.0", - "mute-stdout": "1.0.0", - "pretty-hrtime": "1.0.0", - "v8flags": "3.2.0", - "yargs": "7.1.0" - } - }, - "node_modules/@ohos/hvigor-base": { - "version": "1.0.6", - "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.0.6.tgz", - "integrity": "sha512-cRDnWICTxmpNiFb9clIioqP5Oik1seLCICztXVhZqultrHuxwTheCRUZrHwlpyWdkSB2Al+FFBqmSwzIgZX4IQ==", - "dependencies": { - "json5": "2.2.0", - "log4js": "6.4.1", - "undertaker": "1.2.1" - } - }, - "node_modules/@ohos/hvigor-ohos-plugin": { - "version": "1.0.6", - "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.0.6.tgz", - "integrity": "sha512-MAAi8uJxMzODUoSSNfBr+fU4HQ20dfQtkje9I+X4asc7qY2kAplW/q9f5XS8IOvv8zhC8OcSgsAXOAJuLMstOQ==", - "dependencies": { - "@ohos/hvigor-base": "1.0.6", - "@ohos/sdkmanager-common": "1.1.3", - "ajv": "8.10.0", - "archiver": "5.3.0", - "execa": "5.1.1", - "fs-extra": "10.0.0", - "glob": "7.2.0", - "iconv-lite": "0.6.3", - "json5": "2.2.0", - "lodash": "4.17.21", - "pretty-hrtime": "1.0.3", - "resolve-package-path": "4.0.3" - } - }, - "node_modules/@ohos/hvigor-ohos-plugin/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@ohos/hvigor-ohos-plugin/node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@ohos/sdkmanager-common": { - "version": "1.1.3", - "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-1.1.3.tgz", - "integrity": "sha512-d2uhVauDDJZIUvyyaWWoavG4N/jLyfF5IH5kEXKV6R8HNf3606H1zDQzA+UZtOfwwJFXhD9djRjnVFNB8xc7aw==" - }, - "node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/archiver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", - "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.0", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "license": "MIT", - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "license": "MIT", - "dependencies": { - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "license": "MIT", - "dependencies": { - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "license": "MIT", - "dependencies": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "license": "MIT", - "dependencies": { - "is-number": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "license": "MIT" - }, - "node_modules/async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "license": "MIT", - "dependencies": { - "async-done": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "license": "MIT", - "dependencies": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "license": "MIT", - "dependencies": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/compress-commons": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/date-format": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.6.tgz", - "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "license": "MIT", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es5-ext": { - "version": "0.10.60", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz", - "integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "license": "ISC", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", - "license": "ISC", - "dependencies": { - "type": "^2.5.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", - "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==", - "license": "ISC" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "license": "MIT", - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", - "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", - "license": "MIT", - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.3", - "micromatch": "^4.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/fined": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", - "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^5.0.0", - "object.defaults": "^1.1.0", - "object.pick": "^1.3.0", - "parse-filepath": "^1.0.2" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/flagged-respawn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", - "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "license": "ISC" - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "license": "MIT", - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "license": "MIT" - }, - "node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "license": "ISC" - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "license": "MIT", - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "license": "MIT", - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "license": "MIT", - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "license": "MIT", - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "license": "MIT", - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "license": "MIT" - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "license": "MIT", - "dependencies": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "license": "MIT", - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/liftoff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", - "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", - "license": "MIT", - "dependencies": { - "extend": "^3.0.2", - "findup-sync": "^5.0.0", - "fined": "^2.0.0", - "flagged-respawn": "^2.0.0", - "is-plain-object": "^5.0.0", - "object.map": "^1.0.1", - "rechoir": "^0.8.0", - "resolve": "^1.20.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "license": "MIT" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "license": "MIT" - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", - "license": "MIT" - }, - "node_modules/log4js": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", - "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", - "license": "Apache-2.0", - "dependencies": { - "date-format": "^4.0.3", - "debug": "^4.3.3", - "flatted": "^3.2.4", - "rfdc": "^1.3.0", - "streamroller": "^3.0.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/mute-stdout": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", - "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "license": "ISC" - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "license": "MIT", - "dependencies": { - "once": "^1.3.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "license": "MIT", - "dependencies": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "license": "MIT", - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "license": "MIT", - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "license": "MIT", - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "license": "MIT", - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "license": "MIT", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "license": "MIT", - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "license": "MIT", - "dependencies": { - "path-root-regex": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "license": "MIT", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz", - "integrity": "sha1-9ualItPmBwRSK/Db5oVu0g515Nw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "license": "MIT", - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "license": "MIT", - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "license": "ISC" - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-package-path": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/resolve-package-path/-/resolve-package-path-4.0.3.tgz", - "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==", - "license": "MIT", - "dependencies": { - "path-root": "^0.1.1" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "license": "MIT" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "license": "CC0-1.0" - }, - "node_modules/stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "license": "MIT" - }, - "node_modules/streamroller": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.6.tgz", - "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", - "license": "MIT", - "dependencies": { - "date-format": "^4.0.6", - "debug": "^4.3.4", - "fs-extra": "^10.0.1" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "license": "MIT", - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "license": "ISC" - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "license": "MIT", - "dependencies": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "license": "MIT" - }, - "node_modules/v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "license": "ISC" - }, - "node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "license": "MIT", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { + "dependencies": { + "@ohos/hos-sdkmanager-common": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "license": "ISC" - }, - "node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "license": "MIT", - "dependencies": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "node_modules/yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", - "license": "ISC", - "dependencies": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" + "resolved": "https://repo.harmonyos.com/npm/@ohos/hos-sdkmanager-common/-/@ohos/hos-sdkmanager-common-1.0.2.tgz", + "integrity": "sha512-nai6RzsFd5tx1o5OwHxqaw+s0dTUjsdrXrwUi6b73EtHxTX6928C0xyEvd9TZ3dt3lSk2TPdSutUZWlDiW1s8A==", + "requires": { + "@ohos/sdkmanager-common": "^1.1.6" } }, - "node_modules/zip-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - } - }, - "dependencies": { "@ohos/hvigor": { - "version": "1.0.6", - "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.0.6.tgz", - "integrity": "sha512-jjp7vpvUOMW1Nf7TdyhOtonwWHoSyBJLUiZTQqIx/GJV4UJyIqsiURUOqFwncQ4L7PDdeHuWly4uEelknYeWhg==", + "version": "1.1.3", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.1.3.tgz", + "integrity": "sha512-ACVD5TE+cduiVO2BVP5+KI7BDIp9eWIZp4cxgtBR2NvIZw+/eF/e9tggf56b2WKXFOW+J/ZyN2SVlkbA6LlPhQ==", "requires": { - "@ohos/hvigor-base": "1.0.6", + "@ohos/hvigor-base": "1.1.3", "interpret": "1.4.0", "liftoff": "4.0.0", "mute-stdout": "1.0.0", @@ -2363,25 +27,28 @@ } }, "@ohos/hvigor-base": { - "version": "1.0.6", - "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.0.6.tgz", - "integrity": "sha512-cRDnWICTxmpNiFb9clIioqP5Oik1seLCICztXVhZqultrHuxwTheCRUZrHwlpyWdkSB2Al+FFBqmSwzIgZX4IQ==", + "version": "1.1.3", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.1.3.tgz", + "integrity": "sha512-ZD0T1l9s9jeJ3KopehURy8rhF1E8gZ5XgtayYUVJK087p87J2qk9Zjo782oM1xZi7BrLzpNWz+w3yhwxELV5KA==", "requires": { "json5": "2.2.0", "log4js": "6.4.1", - "undertaker": "1.2.1" + "once": "1.4.0", + "pretty-hrtime": "1.0.0" } }, "@ohos/hvigor-ohos-plugin": { - "version": "1.0.6", - "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.0.6.tgz", - "integrity": "sha512-MAAi8uJxMzODUoSSNfBr+fU4HQ20dfQtkje9I+X4asc7qY2kAplW/q9f5XS8IOvv8zhC8OcSgsAXOAJuLMstOQ==", + "version": "1.1.3", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.1.3.tgz", + "integrity": "sha512-Ft2VCBnvoJoeVjsYsNMNJpNcEOsbPSSZ9LlyWXXRbGieC5x8Pjgv6nyPfC/x+Bb9d8Yum24n4fIRRE6at0z5OA==", "requires": { - "@ohos/hvigor-base": "1.0.6", - "@ohos/sdkmanager-common": "1.1.3", + "@ohos/hos-sdkmanager-common": "1.0.2", + "@ohos/hvigor-base": "1.1.3", + "@ohos/sdkmanager-common": "1.1.6", + "adm-zip": "0.5.9", "ajv": "8.10.0", - "archiver": "5.3.0", "execa": "5.1.1", + "fast-xml-parser": "4.0.3", "fs-extra": "10.0.0", "glob": "7.2.0", "iconv-lite": "0.6.3", @@ -2393,7 +60,7 @@ "dependencies": { "fs-extra": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.0.0.tgz", "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "requires": { "graceful-fs": "^4.2.0", @@ -2403,19 +70,29 @@ }, "pretty-hrtime": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==" } } }, + "@ohos/hypium": { + "version": "1.0.0", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hypium/-/@ohos/hypium-1.0.0.tgz", + "integrity": "sha512-NhL78mNNQXhZPTt+wfRktVJldXQ76l1GkS3N/KiNSLOFY1OC/gWeO22gp9uPmYntwLVOJm5h+ei2fe51ofyHWw==" + }, "@ohos/sdkmanager-common": { - "version": "1.1.3", - "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-1.1.3.tgz", - "integrity": "sha512-d2uhVauDDJZIUvyyaWWoavG4N/jLyfF5IH5kEXKV6R8HNf3606H1zDQzA+UZtOfwwJFXhD9djRjnVFNB8xc7aw==" + "version": "1.1.6", + "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-1.1.6.tgz", + "integrity": "sha512-9f3cNMQYibL6nVvNtFYcCOYojTi1aYm/WcIU3IswY+QcxveDGLich7S4OP3N78WBQuGCdbx4zU/CyfqQIz71sw==" + }, + "adm-zip": { + "version": "0.5.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/adm-zip/-/adm-zip-0.5.9.tgz", + "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==" }, "ajv": { "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/ajv/-/ajv-8.10.0.tgz", "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "requires": { "fast-deep-equal": "^3.1.1", @@ -2426,167 +103,27 @@ }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "archiver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", - "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", - "requires": { - "archiver-utils": "^2.1.0", - "async": "^3.2.0", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - } - }, - "archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "requires": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } - } - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "requires": { - "make-iterator": "^1.0.0" - } + "resolved": "https://repo.huaweicloud.com/repository/npm/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" }, "array-each": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "requires": { - "is-number": "^4.0.0" - } + "resolved": "https://repo.huaweicloud.com/repository/npm/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==" }, "array-slice": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/array-slice/-/array-slice-1.1.0.tgz", "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" }, - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "requires": { - "async-done": "^1.2.2" - } - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, "balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", @@ -2595,29 +132,15 @@ }, "braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, "call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "requires": { "function-bind": "^1.1.1", @@ -2626,13 +149,13 @@ }, "camelcase": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + "resolved": "https://repo.huaweicloud.com/repository/npm/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==" }, "cliui": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "resolved": "https://repo.huaweicloud.com/repository/npm/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", @@ -2641,57 +164,17 @@ }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "compress-commons": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - } + "resolved": "https://repo.huaweicloud.com/repository/npm/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" - }, - "crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "requires": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - } + "resolved": "https://repo.huaweicloud.com/repository/npm/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "requires": { "path-key": "^3.1.0", @@ -2701,7 +184,7 @@ "dependencies": { "which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" @@ -2709,23 +192,14 @@ } } }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "date-format": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.6.tgz", - "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==" + "version": "4.0.11", + "resolved": "https://repo.huaweicloud.com/repository/npm/date-format/-/date-format-4.0.11.tgz", + "integrity": "sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw==" }, "debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" @@ -2733,86 +207,34 @@ }, "decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" + "resolved": "https://repo.huaweicloud.com/repository/npm/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "detect-file": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } + "resolved": "https://repo.huaweicloud.com/repository/npm/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==" }, "error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { "is-arrayish": "^0.2.1" } }, - "es5-ext": { - "version": "0.10.60", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz", - "integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==", - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, "execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "requires": { "cross-spawn": "^7.0.3", @@ -2828,40 +250,33 @@ }, "expand-tilde": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "resolved": "https://repo.huaweicloud.com/repository/npm/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "requires": { "homedir-polyfill": "^1.0.1" } }, - "ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", - "requires": { - "type": "^2.5.0" - }, - "dependencies": { - "type": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", - "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" - } - } - }, "extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-xml-parser": { + "version": "4.0.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/fast-xml-parser/-/fast-xml-parser-4.0.3.tgz", + "integrity": "sha512-xhQbg3a/EYNHwK0cxIG1nZmVkHX/0tWihamn5pU4Mhd9KEVE2ga8ZJiqEUgB2sApElvAATOdMTLjgqIpvYDUkQ==", + "requires": { + "strnum": "^1.0.5" + } + }, "fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" @@ -2869,8 +284,8 @@ }, "find-up": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "resolved": "https://repo.huaweicloud.com/repository/npm/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -2878,7 +293,7 @@ }, "findup-sync": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/findup-sync/-/findup-sync-5.0.0.tgz", "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", "requires": { "detect-file": "^1.0.0", @@ -2889,7 +304,7 @@ }, "fined": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/fined/-/fined-2.0.0.tgz", "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", "requires": { "expand-tilde": "^2.0.2", @@ -2901,36 +316,31 @@ }, "flagged-respawn": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/flagged-respawn/-/flagged-respawn-2.0.0.tgz", "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==" }, "flatted": { "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/flatted/-/flatted-3.2.5.tgz", "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" }, "for-in": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "resolved": "https://repo.huaweicloud.com/repository/npm/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==" }, "for-own": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "resolved": "https://repo.huaweicloud.com/repository/npm/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", "requires": { "for-in": "^1.0.1" } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "version": "10.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2939,37 +349,37 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "resolved": "https://repo.huaweicloud.com/repository/npm/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "function-bind": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "get-caller-file": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" } }, "get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "glob": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "requires": { "fs.realpath": "^1.0.0", @@ -2982,7 +392,7 @@ }, "global-modules": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "requires": { "global-prefix": "^1.0.1", @@ -2992,8 +402,8 @@ }, "global-prefix": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "resolved": "https://repo.huaweicloud.com/repository/npm/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "requires": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -3004,25 +414,33 @@ }, "graceful-fs": { "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "has": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { "function-bind": "^1.1.1" } }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "homedir-polyfill": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "requires": { "parse-passwd": "^1.0.0" @@ -3030,31 +448,26 @@ }, "hosted-git-info": { "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, "iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "resolved": "https://repo.huaweicloud.com/repository/npm/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -3062,27 +475,27 @@ }, "inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "interpret": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" }, "invert-kv": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + "resolved": "https://repo.huaweicloud.com/repository/npm/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==" }, "is-absolute": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "requires": { "is-relative": "^1.0.0", @@ -3091,51 +504,51 @@ }, "is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "resolved": "https://repo.huaweicloud.com/repository/npm/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.9.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "requires": { "has": "^1.0.3" } }, "is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "resolved": "https://repo.huaweicloud.com/repository/npm/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "requires": { "number-is-nan": "^1.0.0" } }, "is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + "version": "7.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-plain-object": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" }, "is-relative": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "requires": { "is-unc-path": "^1.0.0" @@ -3143,12 +556,12 @@ }, "is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-unc-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "requires": { "unc-path-regex": "^0.1.2" @@ -3156,37 +569,32 @@ }, "is-utf8": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + "resolved": "https://repo.huaweicloud.com/repository/npm/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" }, "is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "resolved": "https://repo.huaweicloud.com/repository/npm/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "resolved": "https://repo.huaweicloud.com/repository/npm/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" }, "json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "json5": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "requires": { "minimist": "^1.2.5" @@ -3194,7 +602,7 @@ }, "jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "requires": { "graceful-fs": "^4.1.6", @@ -3203,53 +611,20 @@ }, "kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "requires": { - "readable-stream": "^2.0.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } - } - }, "lcid": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "resolved": "https://repo.huaweicloud.com/repository/npm/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", "requires": { "invert-kv": "^1.0.0" } }, "liftoff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/liftoff/-/liftoff-4.0.0.tgz", "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", "requires": { "extend": "^3.0.2", @@ -3264,8 +639,8 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "resolved": "https://repo.huaweicloud.com/repository/npm/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -3276,37 +651,12 @@ }, "lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" - }, "log4js": { "version": "6.4.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/log4js/-/log4js-6.4.1.tgz", "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", "requires": { "date-format": "^4.0.3", @@ -3318,7 +668,7 @@ }, "make-iterator": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/make-iterator/-/make-iterator-1.0.1.tgz", "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "requires": { "kind-of": "^6.0.2" @@ -3326,17 +676,17 @@ }, "map-cache": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "resolved": "https://repo.huaweicloud.com/repository/npm/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" }, "merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "micromatch": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { "braces": "^3.0.2", @@ -3345,12 +695,12 @@ }, "mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" @@ -3358,27 +708,22 @@ }, "minimist": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "mute-stdout": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", - "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=" - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + "resolved": "https://repo.huaweicloud.com/repository/npm/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha512-MaSQenn0f9oxIjtCufclpV00MuYTiHaXPbdcfPIM+quMqoa8cXywjHHx4LhhIAZlXqPWMdcUpYviajfmHtHRJw==" }, "normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "requires": { "hosted-git-info": "^2.1.4", @@ -3387,22 +732,9 @@ "validate-npm-package-license": "^3.0.1" } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "requires": { - "once": "^1.3.2" - } - }, "npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "requires": { "path-key": "^3.0.0" @@ -3410,17 +742,17 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "resolved": "https://repo.huaweicloud.com/repository/npm/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" }, "object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "requires": { "call-bind": "^1.0.0", @@ -3431,8 +763,8 @@ }, "object.defaults": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", "requires": { "array-each": "^1.0.1", "array-slice": "^1.0.0", @@ -3442,8 +774,8 @@ }, "object.map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", "requires": { "for-own": "^1.0.0", "make-iterator": "^1.0.0" @@ -3451,32 +783,23 @@ }, "object.pick": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "resolved": "https://repo.huaweicloud.com/repository/npm/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "requires": { "isobject": "^3.0.1" } }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "resolved": "https://repo.huaweicloud.com/repository/npm/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } }, "onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "requires": { "mimic-fn": "^2.1.0" @@ -3484,16 +807,16 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "resolved": "https://repo.huaweicloud.com/repository/npm/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", "requires": { "lcid": "^1.0.0" } }, "parse-filepath": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "requires": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", @@ -3502,57 +825,57 @@ }, "parse-json": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "requires": { "error-ex": "^1.2.0" } }, "parse-passwd": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==" }, "path-exists": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "requires": { "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "resolved": "https://repo.huaweicloud.com/repository/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-root": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "requires": { "path-root-regex": "^0.1.0" } }, "path-root-regex": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + "resolved": "https://repo.huaweicloud.com/repository/npm/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==" }, "path-type": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -3561,46 +884,41 @@ }, "picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "resolved": "https://repo.huaweicloud.com/repository/npm/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" }, "pinkie": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" }, "pinkie-promise": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "requires": { "pinkie": "^2.0.0" } }, "pretty-hrtime": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz", - "integrity": "sha1-9ualItPmBwRSK/Db5oVu0g515Nw=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz", + "integrity": "sha512-CU2l5CYUAptUYq/671ajexQfXuxJFwwg0n243Kdkx8bTjeenedsWgu8TGHPm03vLfNtk3aTXgySKPp3Usykudw==" }, "punycode": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "read-pkg": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -3609,34 +927,16 @@ }, "read-pkg-up": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" } }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "requires": { - "minimatch": "^3.0.4" - } - }, "rechoir": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/rechoir/-/rechoir-0.8.0.tgz", "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "requires": { "resolve": "^1.20.0" @@ -3644,33 +944,33 @@ }, "require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "resolved": "https://repo.huaweicloud.com/repository/npm/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-main-filename": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "resolved": "https://repo.huaweicloud.com/repository/npm/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" }, "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "requires": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-dir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "requires": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" @@ -3678,7 +978,7 @@ }, "resolve-package-path": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/resolve-package-path/-/resolve-package-path-4.0.3.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-package-path/-/resolve-package-path-4.0.3.tgz", "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==", "requires": { "path-root": "^0.1.1" @@ -3686,32 +986,27 @@ }, "rfdc": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "resolved": "https://repo.huaweicloud.com/repository/npm/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "requires": { "shebang-regex": "^3.0.0" @@ -3719,17 +1014,17 @@ }, "shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "spdx-correct": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "^3.0.0", @@ -3738,12 +1033,12 @@ }, "spdx-exceptions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "^2.1.0", @@ -3752,36 +1047,23 @@ }, "spdx-license-ids": { "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" - }, "streamroller": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.6.tgz", - "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "version": "3.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/streamroller/-/streamroller-3.1.1.tgz", + "integrity": "sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ==", "requires": { - "date-format": "^4.0.6", + "date-format": "^4.0.10", "debug": "^4.3.4", - "fs-extra": "^10.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" + "fs-extra": "^10.1.0" } }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "resolved": "https://repo.huaweicloud.com/repository/npm/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3790,109 +1072,64 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "requires": { "ansi-regex": "^2.0.0" } }, "strip-bom": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "requires": { "is-utf8": "^0.2.0" } }, "strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" }, + "strnum": { + "version": "1.0.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, "supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, "to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { "is-number": "^7.0.0" - }, - "dependencies": { - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - } } }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, "unc-path-regex": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" + "resolved": "https://repo.huaweicloud.com/repository/npm/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==" }, "universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, "uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, "v8flags": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/v8flags/-/v8flags-3.2.0.tgz", "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "requires": { "homedir-polyfill": "^1.0.1" @@ -3900,7 +1137,7 @@ }, "validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "requires": { "spdx-correct": "^3.0.0", @@ -3909,7 +1146,7 @@ }, "which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" @@ -3917,13 +1154,13 @@ }, "which-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + "resolved": "https://repo.huaweicloud.com/repository/npm/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "resolved": "https://repo.huaweicloud.com/repository/npm/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -3931,18 +1168,18 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "resolved": "https://repo.huaweicloud.com/repository/npm/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "y18n": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/y18n/-/y18n-3.2.2.tgz", "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" }, "yargs": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "resolved": "https://repo.huaweicloud.com/repository/npm/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha512-JHLTJJ5uqdt0peYp5mHzmSNV4uHXWphgSlKk5jg3sY5XYPTBw0hzw0SDNnYISn7pAXeAv5pKT4CNY+EcCTptBg==", "requires": { "camelcase": "^3.0.0", "cliui": "^3.2.0", @@ -3961,22 +1198,12 @@ }, "yargs-parser": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "resolved": "https://repo.huaweicloud.com/repository/npm/yargs-parser/-/yargs-parser-5.0.1.tgz", "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", "requires": { "camelcase": "^3.0.0", "object.assign": "^4.1.0" } - }, - "zip-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "requires": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" - } } } } diff --git a/package.json b/package.json index 9b49e599..6342de62 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,15 @@ { - "devDependencies":{}, - "name":"systemui", - "ohos":{ - "org":"huawei", - "directoryLevel":"project", - "buildTool":"hvigor" + "devDependencies": {}, + "name": "systemui", + "ohos": { + "org": "huawei", + "directoryLevel": "project", + "buildTool": "hvigor" }, - "version":"1.0.0", - "dependencies":{ - "@ohos/hvigor-ohos-plugin":"1.0.6", - "@ohos/hvigor":"1.0.6" + "version": "1.0.0", + "dependencies": { + "@ohos/hvigor-ohos-plugin": "1.1.3", + "@ohos/hvigor": "1.1.3", + "@ohos/hypium": "1.0.0" } -} \ No newline at end of file +} diff --git a/product/default/navigationBar/build-profile.json5 b/product/default/navigationBar/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/product/default/navigationBar/build-profile.json5 +++ b/product/default/navigationBar/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index 15693039..18d1433a 100644 --- a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/product/default/navigationBar/src/main/module.json5 b/product/default/navigationBar/src/main/module.json5 index 0636f23d..eb49e1ec 100644 --- a/product/default/navigationBar/src/main/module.json5 +++ b/product/default/navigationBar/src/main/module.json5 @@ -6,7 +6,8 @@ "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.navigationbar.ServiceExtAbility", "deviceTypes": [ - "phone", "tablet" + "default", + "tablet" ], "deliveryWithInstall": true, "installationFree": false, diff --git a/product/default/notificationmanagement/build-profile.json5 b/product/default/notificationmanagement/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/product/default/notificationmanagement/build-profile.json5 +++ b/product/default/notificationmanagement/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets index 106dc9e0..22f8b31e 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets @@ -21,7 +21,7 @@ import ConfigData from '../common/constants'; import NotificationConfigData from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; import Router from '@system.router' import Notification from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationlistener'; -import {SlotLevel} from '@ohos.notification'; +import notification from '@ohos.notification'; const TAG = 'NotificationManagement-SlotSetting'; const DEFAULT_SOUND = 'file://system/etc/Light.ogg'; @@ -187,11 +187,11 @@ export default struct SlotSetting { Log.showDebug(TAG, `soundEnableSet params:${JSON.stringify(params)}`) if (params == 0) { this.slotInfo.sound = ''; - this.slotInfo.level = SlotLevel.LEVEL_LOW + this.slotInfo.level = notification.SlotLevel.LEVEL_LOW } else if (params == 1) { this.slotInfo.sound = DEFAULT_SOUND; - if (this.slotInfo.level < SlotLevel.LEVEL_DEFAULT) { - this.slotInfo.level = SlotLevel.LEVEL_DEFAULT + if (this.slotInfo.level < notification.SlotLevel.LEVEL_DEFAULT) { + this.slotInfo.level = notification.SlotLevel.LEVEL_DEFAULT } } this.notificationSlotSet(); @@ -201,7 +201,7 @@ export default struct SlotSetting { Log.showDebug(TAG, `bannerEnableInit`) return new Promise((resolve, reject) => { let result: boolean = false; - if (this.slotInfo.level == SlotLevel.LEVEL_HIGH) { + if (this.slotInfo.level == notification.SlotLevel.LEVEL_HIGH) { result = true; } Log.showInfo(TAG, `bannerEnableInit state:${result}`) @@ -213,12 +213,12 @@ export default struct SlotSetting { Log.showDebug(TAG, `bannerEnableSet params:${JSON.stringify(params)}`) if (params == 0) { if (this.slotInfo.sound) { - this.slotInfo.level = SlotLevel.LEVEL_DEFAULT; + this.slotInfo.level = notification.SlotLevel.LEVEL_DEFAULT; } else { - this.slotInfo.level = SlotLevel.LEVEL_LOW; + this.slotInfo.level = notification.SlotLevel.LEVEL_LOW; } } else if (params == 1) { - this.slotInfo.level = SlotLevel.LEVEL_HIGH; + this.slotInfo.level = notification.SlotLevel.LEVEL_HIGH; } this.notificationSlotSet(); } diff --git a/product/default/notificationmanagement/src/main/module.json5 b/product/default/notificationmanagement/src/main/module.json5 index fc225cc8..88ce23dc 100644 --- a/product/default/notificationmanagement/src/main/module.json5 +++ b/product/default/notificationmanagement/src/main/module.json5 @@ -6,7 +6,8 @@ "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.notificationmanagement.MainAbility", "deviceTypes": [ - "phone", "tablet" + "default", + "tablet" ], "deliveryWithInstall": true, "installationFree": false, @@ -20,7 +21,9 @@ "icon": "$media:icon", "description": "$string:mainability_description", "label": "$string:app_name", - "launchType": "singleton" + "launchType": "singleton", + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:color_1" } ] } diff --git a/product/default/notificationmanagement/src/main/resources/base/element/color.json b/product/default/notificationmanagement/src/main/resources/base/element/color.json new file mode 100644 index 00000000..9d23136d --- /dev/null +++ b/product/default/notificationmanagement/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "color_1", + "value": "#ff0000" + } + ] +} \ No newline at end of file diff --git a/product/default/volumepanel/build-profile.json5 b/product/default/volumepanel/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/product/default/volumepanel/build-profile.json5 +++ b/product/default/volumepanel/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/product/default/volumepanel/src/main/module.json5 b/product/default/volumepanel/src/main/module.json5 index a570a5ac..e7375c1c 100644 --- a/product/default/volumepanel/src/main/module.json5 +++ b/product/default/volumepanel/src/main/module.json5 @@ -6,7 +6,8 @@ "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.volumepanel.ServiceExtAbility", "deviceTypes": [ - "phone", "tablet" + "default", + "tablet" ], "deliveryWithInstall": true, "installationFree": false, diff --git a/product/pc/controlpanel/build-profile.json5 b/product/pc/controlpanel/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/product/pc/controlpanel/build-profile.json5 +++ b/product/pc/controlpanel/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/product/pc/controlpanel/src/main/module.json5 b/product/pc/controlpanel/src/main/module.json5 index 5d8c7c5c..17c442a0 100644 --- a/product/pc/controlpanel/src/main/module.json5 +++ b/product/pc/controlpanel/src/main/module.json5 @@ -31,7 +31,8 @@ "metadata": [ { "name": "com.ohos.systemui.action.BAR_ICON", - "value": "\"pluginType\":\"1\",\"clickAction\":\"local=showControlCenter\",\"selectedClickAction\":\"local=hideControlCenter\",\"relationWindowId\":\"SystemUi_ControlPanel\"" + "value": "\"pluginType\":\"1\",\"clickAction\":\"local=showControlCenter\",\"selectedClickAction\":\"local=hideControlCenter\",\"relationWindowId\":\"SystemUi_ControlPanel\"", + "resource": "$profile:form_config" } ] } diff --git a/product/pc/controlpanel/src/main/resources/base/profile/form_config.json b/product/pc/controlpanel/src/main/resources/base/profile/form_config.json new file mode 100644 index 00000000..9246a817 --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/profile/form_config.json @@ -0,0 +1,12 @@ +{ + "forms": [ + { + "name": "Form_Js", + "isDefault": true, + "defaultDimension": "2*2", + "supportDimensions": [ + "2*2" + ] + } + ] +} \ No newline at end of file diff --git a/product/pc/notificationpanel/build-profile.json5 b/product/pc/notificationpanel/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/product/pc/notificationpanel/build-profile.json5 +++ b/product/pc/notificationpanel/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/product/pc/notificationpanel/src/main/module.json5 b/product/pc/notificationpanel/src/main/module.json5 index 16d9a1ce..0dfd18fd 100644 --- a/product/pc/notificationpanel/src/main/module.json5 +++ b/product/pc/notificationpanel/src/main/module.json5 @@ -31,7 +31,8 @@ "metadata": [ { "name": "com.ohos.systemui.action.BAR_ICON", - "value": "\"pluginType\":\"1\",\"clickAction\":\"local=showNotificationPanel\",\"selectedClickAction\":\"local=hideNotificationPanel\",\"relationWindowId\":\"SystemUi_NotificationPanel\"" + "value": "\"pluginType\":\"1\",\"clickAction\":\"local=showNotificationPanel\",\"selectedClickAction\":\"local=hideNotificationPanel\",\"relationWindowId\":\"SystemUi_NotificationPanel\"", + "resource": "$profile:form_config" } ] } diff --git a/product/pc/notificationpanel/src/main/resources/base/profile/form_config.json b/product/pc/notificationpanel/src/main/resources/base/profile/form_config.json new file mode 100644 index 00000000..9246a817 --- /dev/null +++ b/product/pc/notificationpanel/src/main/resources/base/profile/form_config.json @@ -0,0 +1,12 @@ +{ + "forms": [ + { + "name": "Form_Js", + "isDefault": true, + "defaultDimension": "2*2", + "supportDimensions": [ + "2*2" + ] + } + ] +} \ No newline at end of file diff --git a/product/pc/statusbar/build-profile.json5 b/product/pc/statusbar/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/product/pc/statusbar/build-profile.json5 +++ b/product/pc/statusbar/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/product/phone/dropdownpanel/build-profile.json5 b/product/phone/dropdownpanel/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/product/phone/dropdownpanel/build-profile.json5 +++ b/product/phone/dropdownpanel/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/product/phone/dropdownpanel/src/main/ets/pages/control.ets b/product/phone/dropdownpanel/src/main/ets/pages/control.ets index 932596c8..d252ccfa 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/control.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/control.ets @@ -47,7 +47,7 @@ export default struct Control { build() { Column() { Column() { - statusBar() + statusBar({ touchMoveCallback: (data) => this.touchMoveCallback(data) }) } .width('100%') .height(this.style.statusBarHeight) @@ -109,23 +109,61 @@ export default struct Control { @Component struct statusBar { @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + private touchMoveCallback: Function + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - SignalIcon() - WifiIcon() + Column(){ + Stack(){ + + Row(){ + Row(){}.width('50%').height('100%').onTouch((touchEvent) => {this.touchEvent(touchEvent, 'left')}) + Row(){}.width('50%').height('100%').onTouch((touchEvent) => {this.touchEvent(touchEvent, 'right')}) + }.width('100%').height('100%') + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + SignalIcon() + WifiIcon() + } + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + LocationIcon() + BluetoothIcon() + RingModeIcon() + BatteryIcon() + ClockIcon() + } + } + .width('100%') + .height('100%') } + } + } - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - LocationIcon() - BluetoothIcon() - RingModeIcon() - BatteryIcon() - ClockIcon() + touchEvent(event: TouchEvent, touchLocation: string) { + if (event.type == Constants.TOUCHTYPE_DOWN) { + this.startX = event.touches[0].screenX + this.startY = event.touches[0].screenY + Log.showInfo(TAG, `statusBar startX: ${this.startX}, startY: ${this.startY}`) + } else if (event.type == Constants.TOUCHTYPE_MOVE) { + this.moveX = event.touches[0].screenX - this.startX + this.moveY = event.touches[0].screenY - this.startY + } else if (event.type == Constants.TOUCHTYPE_UP) { + Log.showInfo(TAG, `statusBar, moveX: ${this.moveX}, moveY: ${this.moveY}`) + if (this.moveY > 15) { + if (this.touchMoveCallback) { + if(touchLocation == 'left'){ + this.touchMoveCallback({ 'direction': 'drop_left', 'touchComponent': 'control' }) + }else if(touchLocation == 'right'){ + this.touchMoveCallback({ 'direction': 'drop_right', 'touchComponent': 'notification' }) + } + + } } } - .width('100%') - .height('100%') } } diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index 8ce7cac5..4de66cfb 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,6 +14,14 @@ * limitations under the License. */ +import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon' +import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon' +import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiIcon' +import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent' +import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon' +import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' +import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' + import image from "@ohos.multimedia.image" import Log from '../../../../../../../common/src/main/ets/default/Log' import Trace from '../../../../../../../common/src/main/ets/default/Trace' @@ -123,8 +132,8 @@ struct Index { this.mCallback = { "onStateChange": (data) => this.onStateChange(data), - "onNotificationShowOrHide": (err, data) => this.onNotificationShowOrHide(err, data), - "onControlShowOrHide": (err, data) => this.onControlShowOrHide(err, data) + "onNotificationShowOrHide": (data) => this.onNotificationShowOrHide(data), + "onControlShowOrHide": (data) => this.onControlShowOrHide(data) } NavigationEvent.registerCallback(this.mCallback); MultimodalInputManager.registerControlListener(this.mCallback); @@ -138,12 +147,8 @@ struct Index { return } StatusBarVM.setUseInWindowName(WindowType.DROPDOWN_PANEL) - this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { - Log.showInfo(TAG, `onPageShow, show anim finish.`); - } }, () => { - this.componentOptAreaTranslateY = '0px' - this.backgroundOpacity = 1 - }) + this.componentOptAreaTranslateY = '0px' + this.backgroundOpacity = 1 Trace.end(Trace.CORE_METHOD_START_DROPDOWNPANEL) } @@ -165,7 +170,7 @@ struct Index { WindowManager.resetSizeWindow(WindowType.DROPDOWN_PANEL, { ...dropdownRect, height: this.componentOptAreaHeightPX }) } - onNotificationShowOrHide(err, data) { + onNotificationShowOrHide(data) { Log.showDebug(TAG, `mNotificationAsyncCallback preKeys: ${data.preKeys}, finalKey: ${data.finalKey}`); Log.showDebug(TAG, `this.showComponentName: ${this.showComponentName}`); if (this.showComponentName == 'Notification') { @@ -176,7 +181,7 @@ struct Index { Log.showDebug(TAG, `mNotificationAsyncCallback end`); } - onControlShowOrHide(err, data) { + onControlShowOrHide(data) { Log.showDebug(TAG, `mControlAsyncCallback preKeys: ${data.preKeys}, finalKey: ${data.finalKey}`); Log.showDebug(TAG, `this.showComponentName: ${this.showComponentName}`); if (this.showComponentName == 'ControlCenter') { @@ -218,6 +223,10 @@ struct Index { this.switchNotificationOrControlCenter('ControlCenter') } else if (data.direction == 'right' && data.touchComponent == 'control') { this.switchNotificationOrControlCenter('Notification') + } else if (data.direction == 'drop_left' && data.touchComponent == 'control') { + this.showComponentName = 'Notification' + } else if (data.direction == 'drop_right' && data.touchComponent == 'notification') { + this.showComponentName = 'ControlCenter' } } diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index a10a699b..668ffa16 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -65,7 +65,7 @@ export default struct Notification { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { - statusBar() + statusBar({ touchMoveCallback: (data) => this.touchMoveCallback(data) }) CenterTitle({ touchMoveCallback: (data) => this.CenterTitleTouchMoveCallback(data) }) @@ -135,20 +135,35 @@ export default struct Notification { @Component struct statusBar { @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 + private touchMoveCallback: Function + startX: number = 0 + startY: number = 0 + @State moveX: number = 0 + @State moveY: number = 0 build() { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { - SignalIcon() - WifiIcon() - } + Column(){ + Stack(){ + + Row(){ + Row(){}.width('50%').height('100%').onTouch((touchEvent) => {this.touchEvent(touchEvent, 'left')}) + Row(){}.width('50%').height('100%').onTouch((touchEvent) => {this.touchEvent(touchEvent, 'right')}) + }.width('100%').height('100%') - Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { - LocationIcon() - BluetoothIcon() - RingModeIcon() - BatteryIcon() - ClockIcon() + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + SignalIcon() + WifiIcon() + } + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) { + LocationIcon() + BluetoothIcon() + RingModeIcon() + BatteryIcon() + ClockIcon() + } + } } } .height($r("app.float.status_bar_height")) @@ -160,6 +175,29 @@ struct statusBar { right: $r("app.float.status_bar_padding_left_right") }) } + + touchEvent(event: TouchEvent, touchLocation: string) { + if (event.type == Constants.TOUCHTYPE_DOWN) { + this.startX = event.touches[0].screenX + this.startY = event.touches[0].screenY + Log.showInfo(TAG, `statusBar startX: ${this.startX}, startY: ${this.startY}`) + } else if (event.type == Constants.TOUCHTYPE_MOVE) { + this.moveX = event.touches[0].screenX - this.startX + this.moveY = event.touches[0].screenY - this.startY + } else if (event.type == Constants.TOUCHTYPE_UP) { + Log.showInfo(TAG, `statusBar, moveX: ${this.moveX}, moveY: ${this.moveY}`) + if (this.moveY > 15) { + if (this.touchMoveCallback) { + if(touchLocation === 'left'){ + this.touchMoveCallback({ 'direction': 'drop_left', 'touchComponent': 'control' }) + }else if(touchLocation === 'right'){ + this.touchMoveCallback({ 'direction': 'drop_right', 'touchComponent': 'notification' }) + } + + } + } + } + } } @Component diff --git a/product/phone/dropdownpanel/src/main/module.json5 b/product/phone/dropdownpanel/src/main/module.json5 index 7af54b91..32b2ca1b 100644 --- a/product/phone/dropdownpanel/src/main/module.json5 +++ b/product/phone/dropdownpanel/src/main/module.json5 @@ -6,7 +6,7 @@ "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.dropdownpanel.ServiceExtAbility", "deviceTypes": [ - "phone" + "default" ], "deliveryWithInstall": true, "installationFree": false, diff --git a/product/phone/statusbar/build-profile.json5 b/product/phone/statusbar/build-profile.json5 index 3f685bd2..55d2b110 100644 --- a/product/phone/statusbar/build-profile.json5 +++ b/product/phone/statusbar/build-profile.json5 @@ -1,9 +1,6 @@ { "apiType": 'stageMode', - "buildOption": { - "arkEnable": true - }, - "targets": [ + "targets": [ { "name": "default", } diff --git a/product/phone/statusbar/src/main/module.json5 b/product/phone/statusbar/src/main/module.json5 index 5a1fc3f4..adbb2868 100644 --- a/product/phone/statusbar/src/main/module.json5 +++ b/product/phone/statusbar/src/main/module.json5 @@ -6,7 +6,7 @@ "description": "$string:mainability_description", "mainElement": "com.ohos.systemui.statusbar.ServiceExtAbility", "deviceTypes": [ - "phone" + "default" ], "deliveryWithInstall": true, "installationFree": false, -- Gitee From 333d23fda00061bbd4f63dd4cc63951e052ebe05 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Thu, 23 Jun 2022 17:02:50 +0800 Subject: [PATCH 168/373] support PluginComponent Signed-off-by: lijinfengde123 --- .../PluginDataSourceAdapter.ts | 28 +++++ .../PluginDataSourceManager.ts | 12 ++ .../ets/plugindatasource/common/Constants.ts | 10 +- .../common/PluginComponentManagerUtil.ts | 93 +++++++++++++++ .../sourceloader/PluginSourceLoader.ts | 106 ++++++++++++++++-- .../sourceloader/PluginSourceLoaderPatch.ts | 85 ++++++++++++++ .../sourceloader/SourceLoader.ts | 5 + .../src/main/ets/com/ohos/common/Constants.ts | 2 + .../ets/com/ohos/common/StyleConfiguration.ts | 9 ++ .../ets/com/ohos/model/StatusBarService.ts | 5 + .../ets/com/ohos/pages/IconItemComponent.ets | 21 ++-- .../com/ohos/pages/MetaIconItemComponent.ets | 8 ++ .../ohos/pages/PluginIconItemComponent.ets | 86 ++++++++++++++ .../ets/com/ohos/viewmodel/StatusBarVM.ts | 50 ++++++++- .../ets/workers/PluginDataSourceWorker.js | 14 ++- .../ServiceExtAbility/ServiceExtAbility.ts | 3 +- .../ets/workers/PluginDataSourceWorker.js | 12 ++ .../ets/workers/PluginDataSourceWorker.js | 12 ++ .../ServiceExtAbility/ServiceExtAbility.ts | 2 + .../main/ets/pages/common/StatusbarConfig.ts | 14 ++- .../ets/workers/PluginDataSourceWorker.js | 12 ++ 21 files changed, 558 insertions(+), 31 deletions(-) create mode 100644 common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts create mode 100644 common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts create mode 100644 features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts index 5a6a0012..d1c01c98 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts @@ -16,8 +16,10 @@ import worker from "@ohos.worker"; import Log from "../default/Log"; import BundleManager from "../default/abilitymanager/bundleManager"; +import { Want } from 'ability/want'; import Constants, { ItemComponentData, obtainMsg, RootConfigInfo } from "./common/Constants"; import Context from "application/ServiceExtensionContext"; +import PluginSourceLoaderPatch from './sourceloader/PluginSourceLoaderPatch' export type pluginWorkerListener = { initFinish: () => void; @@ -32,6 +34,8 @@ export default class PluginDataSourceAdapter { mWorker: any; mName: string; mListener: pluginWorkerListener; + mWant: Want; + mPluginSourceLoaderPatch: PluginSourceLoaderPatch; mModuleName: string; constructor(name: string, context: Context, listener: pluginWorkerListener, moduleName: string) { @@ -52,9 +56,16 @@ export default class PluginDataSourceAdapter { this.mWorker.onerror = this.onError.bind(this); } + setWant(want: Want): void{ + this.mWant = want; + } + initDataSource(configs: RootConfigInfo) { Log.showDebug(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`); this.mWorker.postMessage(obtainMsg(Constants.INIT_CONFIG, configs)); + if (configs.loaderConfig.PluginSourceLoader) { + this.mPluginSourceLoaderPatch = new PluginSourceLoaderPatch(this.mWant, this); + } } loadData(userId: number) { @@ -65,6 +76,7 @@ export default class PluginDataSourceAdapter { clearAll() { Log.showDebug(TAG, `clearAll`); this.mWorker.postMessage(obtainMsg(Constants.CLEAR_ALL, {})); + this.mPluginSourceLoaderPatch?.clearAll(); } onMessage(msg: { data: any }) { @@ -80,6 +92,11 @@ export default class PluginDataSourceAdapter { case Constants.REMOVE_ITEM: this.onItemRemove(data.data); break; + case Constants.LOAD_PLUGIN_COMPONENT_DATA: + this.onLoadPluginComponentData(data.data).then(() => { + }).catch(err => { + }); + break; default: Log.showError(TAG, `unknown type: ${JSON.stringify(msg)}`); } @@ -118,6 +135,17 @@ export default class PluginDataSourceAdapter { this.mListener.onItemRemove(itemData); } + async onLoadPluginComponentData(itemData: ItemComponentData): Promise { + Log.showDebug(TAG, `name: ${this.mName}, onLoadPluginComponentData, itemData: ${JSON.stringify(itemData)}`); + let ret = await this.mPluginSourceLoaderPatch?.requestPluginComponentData(itemData); + this.mWorker.postMessage(obtainMsg(Constants.UPDATE_PLUGIN_COMPONENT_DATA, ret)); + } + + async onUpdatePluginComponentData(pluginComponentData: ItemComponentData): Promise { + Log.showDebug(TAG, `name: ${this.mName}, onUpdatePluginComponentData, pluginComponentData: ${JSON.stringify(pluginComponentData)}`); + this.mWorker.postMessage(obtainMsg(Constants.UPDATE_PLUGIN_COMPONENT_DATA, pluginComponentData)); + } + onMessageError(event: any) { Log.showError(TAG, `mWorker.onmessageerror, event: ${event}`); } diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts index c05bec12..0b7bb7c1 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts @@ -16,6 +16,7 @@ import Log from "../default/Log"; import SourceLoaderFactory from "./sourceloader/SourceLoaderFactory"; import SourceLoader from "./sourceloader/SourceLoader"; +import PluginSourceLoader from './sourceloader/PluginSourceLoader'; import { FilterData, ItemComponentData, RootConfigInfo } from "./common/Constants"; import { AbilityInfoWithId, @@ -30,6 +31,7 @@ import { ExtensionAbilityInfo } from "bundle/extensionAbilityInfo"; export type PluginListener = { onItemAdd: (itemData: ItemComponentData) => void; onItemRemove: (itemData: ItemComponentData) => void; + onLoadPluginComponentData: (itemData: ItemComponentData) => void; }; const TAG = "PluginDataSourceManager"; @@ -47,6 +49,7 @@ export default class PluginDataSourceManager { this.mFactory = new SourceLoaderFactory({ add: listener.onItemAdd, remove: listener.onItemRemove, + onLoadPluginComponentData: listener.onLoadPluginComponentData, }); } @@ -119,4 +122,13 @@ export default class PluginDataSourceManager { this.mListenerHandle?.unRegister(); this.mListenerHandle = undefined; } + + async updatePluginComponentData(pluginComponentData: ItemComponentData): Promise { + Log.showInfo(TAG, 'updatePluginComponentData'); + this.mLoaders.forEach((loader) => { + if (loader instanceof PluginSourceLoader) { + (loader as PluginSourceLoader).onUpdatePluginComponentData(pluginComponentData); + } + }); + } } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/common/Constants.ts b/common/src/main/ets/plugindatasource/common/Constants.ts index 323c9617..c9f1e8c9 100644 --- a/common/src/main/ets/plugindatasource/common/Constants.ts +++ b/common/src/main/ets/plugindatasource/common/Constants.ts @@ -23,10 +23,13 @@ export default class Constants { static REMOVE_ITEM = "removeItem"; static LOCAL_DEVICE = "local"; static LOAD_DATA = "loadData"; + static readonly LOAD_PLUGIN_COMPONENT_DATA = 'loadPluginComponentData'; + static readonly UPDATE_PLUGIN_COMPONENT_DATA = 'updatePluginComponentData'; } export type FilterData = { id: string; + bundleName: string; abilityName: string; }; @@ -71,6 +74,11 @@ export class ActionData { clickAction?: Event; longClickAction?: Event; launchType?: number; - pluginData?: any; + pluginData?: PluginComponentData; extra?: any; +} + +export class PluginComponentData { + template; + data; } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts b/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts new file mode 100644 index 00000000..6c3c448b --- /dev/null +++ b/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2021-2022 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 pluginComponentManager from '@ohos.pluginComponent'; +import { Want } from 'ability/want'; +import Log from '../../default/Log'; + +const TAG = 'PluginComponentManagerUtil'; + +export class PluginComponentInfo { + bundleName: string; + abilityName: string; + template: string; + componentTemplate; + data; +} + +export interface PushListener { + onPushPluginComponentData(pluginComponentInfo: PluginComponentInfo): Promise; +} + +export interface ListenerHandle { + unRegister(): void; +} + +export async function requestFunction(owner: Want, want: Want, name: string): Promise { + Log.showDebug(TAG, `requestFunction, owner: ${JSON.stringify(owner)}`); + Log.showDebug(TAG, `requestFunction, want: ${JSON.stringify(want)}`); + Log.showDebug(TAG, `requestFunction, name: ${JSON.stringify(name)}`); + let param = { + owner: owner, + want: want, + name: name, + data: {} + }; + let ret = await pluginComponentManager.request(param); + Log.showDebug(TAG, `requestFunction, callback ret: ${JSON.stringify(ret)}`); + if (!ret) { + throw new Error(); + } + let info = new PluginComponentInfo(); + info.bundleName = want.bundleName; + info.abilityName = want.abilityName; + info.template = name; + info.componentTemplate = ret.componentTemplate; + info.data = ret.data; + return info; +} + +export function registerPushListener(owner: Want, listener: PushListener, callback: (handle: ListenerHandle) => void): void { + Log.showDebug(TAG, `registerPushListener start, owner: ${JSON.stringify(owner)}`); + pluginComponentManager.on(owner, 'push', (source, template, data, extraData) => { + Log.showDebug(TAG, `onPush, source: ${JSON.stringify(source)}`); + Log.showDebug(TAG, `onPush, template: ${JSON.stringify(template)}`); + Log.showDebug(TAG, `onPush, data: ${JSON.stringify(data)}`); + Log.showDebug(TAG, `onPush, extraData: ${JSON.stringify(extraData)}`); + let info = new PluginComponentInfo(); + info.bundleName = source.bundleName; + info.abilityName = source.abilityName; + info.template = template.source; + info.componentTemplate = template; + info.data = data; + Log.showDebug(TAG, `onPush, info: ${JSON.stringify(info)}`); + listener.onPushPluginComponentData(info).then(() => { + }).catch((err) => { + }); + Log.showDebug(TAG, 'onPush end'); + }); + Log.showDebug(TAG, 'registerPushListener end'); + + callback({ + unRegister: () => { + Log.showDebug(TAG, 'unRegisterPushListener start'); + pluginComponentManager.off(owner, (err) => { + Log.showDebug(TAG, `unRegisterPushListener callback err: ${JSON.stringify(err)}`); + }); + Log.showDebug(TAG, 'unRegisterPushListener end'); + }, + }); + Log.showDebug(TAG, 'registerPushListener callback end'); +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts index 797806dd..ad75c348 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts @@ -13,21 +13,103 @@ * limitations under the License. */ -import Log from "../../default/Log"; -import { AbilityInfoWithId } from "../common/BundleParseUtil"; -import { LoaderConfigInfo } from "../common/Constants"; -import SourceLoader from "./SourceLoader"; +import Log from '../../default/Log'; +import SourceLoader from './SourceLoader'; +import Constants, { PluginType, ItemComponentData, LoaderConfigInfo, PluginComponentData } from '../common/Constants'; +import { AbilityInfoWithId, filterAbilityInfo, PluginData } from '../common/BundleParseUtil'; -const TAG = "PluginSourceLoader"; +const TAG = 'PluginSourceLoader'; export default class PluginSourceLoader extends SourceLoader { - constructor(config: LoaderConfigInfo) { - super(config); - Log.showInfo(TAG, `constructor`); + mPluginFilter = ''; + mPermission = ''; + mItemDatas: ItemComponentData[] = []; + + constructor(config: LoaderConfigInfo) { + super(config); + this.mPluginFilter = config.action; + this.mPermission = config.permission; + Log.showDebug(TAG, `init loader, mPluginFilter: ${this.mPluginFilter}, mPermission: ${this.mPermission}`); + } + + onAbilityAdd(abilityInfo: AbilityInfoWithId): void { + Log.showDebug(TAG, `onAbilityAdd, abilityInfo: ${JSON.stringify(abilityInfo)}`); + let pluginData: PluginData | undefined = filterAbilityInfo(abilityInfo, this.mPluginFilter); + Log.showDebug(TAG, `onAbilityAdd, pluginData: ${JSON.stringify(pluginData)}`); + if (pluginData) { + let itemData = parseData(abilityInfo, pluginData); + Log.showDebug(TAG, `onAbilityAdd, itemData: ${JSON.stringify(itemData)}`); + if (!itemData) { + return; + } + this.mItemDatas.push(itemData); + this.getChannel().onLoadPluginComponentData(itemData); + Log.showDebug(TAG, `item[${itemData.id}] add success, name: ${abilityInfo.name}`); + return; + } + Log.showDebug(TAG, `Can't filter ${abilityInfo.name}.`); + } + + onUpdatePluginComponentData(data: ItemComponentData): void{ + Log.showDebug(TAG, `onUpdatePluginComponentData, data: ${JSON.stringify(data)}`); + for (let itemData of this.mItemDatas) { + if (data.bundleName == itemData.bundleName + && data.abilityName == itemData.abilityName + && data.template == itemData.template) { + Log.showDebug(TAG, `onUpdatePluginComponentData, update id: ${itemData.id} `); + itemData.actionData.pluginData = data.actionData.pluginData; + if (itemData.actionData.pluginData) { + this.addItem(itemData); + } else { + this.removeItem(itemData); + } + break; + } } + } + + onBundleRemove(bundleName: string): void { + for (let i = this.mItemDatas.length - 1; i >= 0; i--) { + if (bundleName == this.mItemDatas[i].bundleName) { + Log.showDebug(TAG, `remove item index: ${i}, abilityname: ${this.mItemDatas[i].abilityName}`); + this.removeItem(this.mItemDatas[i]); + this.mItemDatas.splice(i, 1); + } + } + } + + clearData(): void { + Log.showDebug(TAG, `clear all, size: ${this.mItemDatas.length}`); + this.mItemDatas.forEach((data) => this.removeItem(data)); + this.mItemDatas.length = 0; + } + + reloadData(userId: number): void { + Log.showDebug(TAG, `reloadData userId: ${userId}`); + } +} - clearData(): void {} - reloadData(userId: number): void {} - onAbilityAdd(abilityInfo: AbilityInfoWithId): void {} - onBundleRemove(bundleName: string): void {} +function parseData(info: AbilityInfoWithId, data: PluginData): ItemComponentData | undefined { + let { label, pluginType, icon, template, launchType, ...extra } = data; + if (pluginType.toString() != PluginType.PLUGIN_COMPONENT.toString()) { + return undefined; + } + let itemData: ItemComponentData = { + id: info.itemId, + pluginType: PluginType.PLUGIN_COMPONENT, + deviceId: Constants.LOCAL_DEVICE, + bundleName: info.bundleName, + abilityName: info.name, + abilityLabelId: info.labelId, + abilityIconId: info.iconId, + label: label, + iconUrl: icon, + template: template, + actionData: { + pluginData: null, + launchType: launchType, + extra: extra, + }, + }; + return itemData; } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts new file mode 100644 index 00000000..dd8e1480 --- /dev/null +++ b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2021-2022 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 { Want } from 'ability/want'; +import Log from '../../default/Log'; +import { ItemComponentData } from '../common/Constants'; +import { ListenerHandle, registerPushListener, requestFunction, PluginComponentInfo +} from '../common/PluginComponentManagerUtil'; + +const TAG = 'PluginSourceLoaderPatch'; + +export interface UpdatePluginComponentDataListener { + onUpdatePluginComponentData(pluginComponentData: ItemComponentData): Promise; +} + +export default class PluginSourceLoaderPatch { + mOwnerWant: Want; + mListener: UpdatePluginComponentDataListener; + mListenerHandle: ListenerHandle; + + constructor(ownerWant: Want, listener: UpdatePluginComponentDataListener) { + Log.showInfo(TAG, `constructor, ownerWant: ${JSON.stringify(ownerWant)}`); + this.mOwnerWant = ownerWant; + this.mListener = listener; + registerPushListener(ownerWant, this, (handle) => { + this.mListenerHandle = handle; + }); + } + + async onPushPluginComponentData(pluginComponentInfo: PluginComponentInfo): Promise { + Log.showInfo(TAG, `onPushPluginComponentData, pluginComponentInfo: ${JSON.stringify(pluginComponentInfo)}`); + let pluginComponentData = this.pluginComponentInfoToItemComponentData(pluginComponentInfo); + this.mListener.onUpdatePluginComponentData(pluginComponentData).then(() => { + }).catch(err => { + }); + } + + async requestPluginComponentData(itemData: ItemComponentData): Promise { + Log.showInfo(TAG, `requestPluginComponentData, itemData: ${JSON.stringify(itemData)}`); + let pluginWant = { + bundleName: itemData.bundleName, abilityName: itemData.abilityName + }; + let pluginName = itemData.template; + let ret = await requestFunction(this.mOwnerWant, pluginWant, pluginName); + return this.pluginComponentInfoToItemComponentData(ret); + } + + pluginComponentInfoToItemComponentData(pluginComponentInfo: PluginComponentInfo): ItemComponentData{ + let pluginComponentData: ItemComponentData = { + id: null, + pluginType: 3, + deviceId: null, + bundleName: pluginComponentInfo.bundleName, + abilityName: pluginComponentInfo.abilityName, + abilityLabelId: null, + abilityIconId: null, + template: pluginComponentInfo.template, + actionData: { + pluginData: { + template: pluginComponentInfo.componentTemplate, + data: pluginComponentInfo.data + } + } + }; + return pluginComponentData; + } + + clearAll(): void { + Log.showInfo(TAG, 'clearAll'); + this.mListenerHandle?.unRegister(); + this.mListenerHandle = undefined; + } +} \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts index 99188008..b521b75e 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts @@ -22,6 +22,7 @@ const TAG = "SourceLoader"; export type LoaderChannel = { add: (item: ItemComponentData) => void; remove: (item: ItemComponentData) => void; + onLoadPluginComponentData: (item: ItemComponentData) => void; }; export default abstract class SourceLoader { @@ -35,6 +36,10 @@ export default abstract class SourceLoader { this.mChannel = channel; } + protected getChannel(): LoaderChannel { + return this.mChannel; + } + protected addItem(itemData: ItemComponentData) { this.mChannel?.add(itemData); } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts index 77a8d351..178f7dd5 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -25,6 +25,8 @@ export default class Constants { static GROUP_ID_CENTER = 2; static GROUP_ID_RIGHT = 3; static VERTICAL_COMPONENT_HEIGHT_VP = 58; + static readonly PLUGIN_COMPONENT_ICON_WIDTH = 32; + static readonly PLUGIN_COMPONENT_OWNER_WANT_KEY = 'StatusBar_PluginComponentOwnerWant'; } export type StatusBarComponentData = ItemComponentData & { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 8d6cede3..160e8df4 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -56,4 +56,13 @@ export default class StyleConfiguration { }; }); } + + static getPluginIconItemComponentStyle() { + const key: string = TAG + '-PluginIconItemComponent'; + return StyleManager.getStyle(key, () => { + return { + iconWidth : vp2px(Constants.PLUGIN_COMPONENT_ICON_WIDTH), + }; + }); + } } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts index 5f12c2fb..8b217e4f 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -39,6 +39,10 @@ const STATUSBAR_SOURCE_CONFIG = { action: "com.ohos.systemui.action.BAR_ICON", permission: null, }, + PluginSourceLoader: { + action: 'com.ohos.systemui.action.BAR_ICON', + permission: null, + }, }, }; @@ -90,6 +94,7 @@ export class StatusBarService { SwitchUserManager.getInstance().registerListener(this); STATUSBAR_SOURCE_CONFIG.filterDatas = config.MetaSlots; this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); + this.mAdapter.setWant(globalThis[Constants.PLUGIN_COMPONENT_OWNER_WANT_KEY]); this.mAdapter.initDataSource(STATUSBAR_SOURCE_CONFIG); } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index d1b7bd06..fc138521 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -22,6 +22,7 @@ import ViewModel from '../viewmodel/StatusBarVM' import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' import StyleConfiguration from '../common/StyleConfiguration' import MetaIconItemComponent from './MetaIconItemComponent' +import PluginIconItemComponent from './PluginIconItemComponent' const TAG = 'IconItemComponent' @@ -35,6 +36,7 @@ export default struct IconItemComponent { mClearCallback: unsubscribe | undefined @State style: any = StyleConfiguration.getIconItemComponentStyle() @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @State mHasMarginLR: boolean = false aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId} `); @@ -60,10 +62,10 @@ export default struct IconItemComponent { build() { Row() { - Row().width(this.style.marginLeft).height('100%') + if (this.mHasMarginLR) { + Row().width(this.style.marginLeft).height('100%') + } Row() { - Row().width(this.style.stackPadding).height('100%') - if (this.mItemData.get().pluginType == PluginType.META) { MetaIconItemComponent({ keyId: this.keyId @@ -71,10 +73,10 @@ export default struct IconItemComponent { } else if (this.mItemData.get().pluginType == PluginType.DATA_ABILITY) { // TODO: } else if (this.mItemData.get().pluginType == PluginType.PLUGIN_COMPONENT) { - // TODO: + PluginIconItemComponent({ + keyId: this.keyId + }) } - - Row().width(this.style.stackPadding).height('100%') } .height(this.style.stackHeight) .borderRadius(this.style.stackBorderRadius) @@ -82,8 +84,13 @@ export default struct IconItemComponent { .onClick(this.onIconItemClick.bind(this)) .gesture(LongPressGesture({ repeat: false }).onAction(this.onIconItemLongPressGesture.bind(this))) .onTouch(this.onIconItemTouch.bind(this)) + .onAreaChange((e, e2) => { + this.mHasMarginLR = e2.width > 0 + }) - Row().width(this.style.marginRight).height('100%') + if (this.mHasMarginLR) { + Row().width(this.style.marginRight).height('100%') + } }.height('100%') } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets index f1ab8a31..5b4551f8 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets @@ -49,6 +49,10 @@ export default struct MetaIconItemComponent { build() { Row() { + if ((this.mItemData.get().isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.get().label)) + || (this.mItemData.get().isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.get().iconUrl))) { + Row().width(this.style.stackPadding).height('100%') + } if (this.mItemData.get().isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.get().label)) { Text(this.mItemData.get() .label) @@ -70,6 +74,10 @@ export default struct MetaIconItemComponent { .fillColor(this.mTintContentInfo.contentColor) .objectFit(ImageFit.Contain) } + if ((this.mItemData.get().isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.get().label)) + || (this.mItemData.get().isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.get().iconUrl))) { + Row().width(this.style.stackPadding).height('100%') + } }.height('100%') } } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets new file mode 100644 index 00000000..d57cb58d --- /dev/null +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log' +import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager' +import { PluginComponentData } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" +import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration from '../common/StyleConfiguration' +import ViewModel from '../viewmodel/StatusBarVM' + +const TAG = 'PluginIconItemComponent' + +@Component +export default struct PluginIconItemComponent { + private keyId: string + @State @Watch('onPluginDataChange') mPluginData: PluginComponentData = new PluginComponentData() + @State @Watch('onTintContentChange') mTintContentInfo: TintContentInfo = new TintContentInfo() + @State style: any = StyleConfiguration.getPluginIconItemComponentStyle() + @State @Watch('onCommonStyleChange') styleCommon: any = StyleConfigurationCommon.getCommonStyle() + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) + this.linkItemData() + this.mTintContentInfo = ViewModel.getPluginTintContentInfo(this.keyId) + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`) + } + + linkItemData() { + Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`) + this.mPluginData = ViewModel.getPluginData(this.keyId) + } + + onPluginDataChange(propName: string): void { + Log.showInfo(TAG, `onPluginDataChange, propName: ${propName} template: ${JSON.stringify(this.mPluginData.template)} data: ${JSON.stringify(this.mPluginData.data)}`) + } + + onTintContentChange(propName: string): void { + Log.showInfo(TAG, `onTintContentChange, propName: ${propName} value: ${this.mTintContentInfo.contentColor}`) + this.setStyle() + } + + onCommonStyleChange(propName: string): void { + Log.showInfo(TAG, `onCommonStyleChange, propName: ${propName} value: ${this.styleCommon.statusBarFontSize}`) + this.setStyle() + } + + setStyle(): void{ + Log.showInfo(TAG, `setStyle`) + if (this.mPluginData.data && Object.keys(this.mPluginData.data).length > 0) { + this.mPluginData.data['fontSize'] = this.styleCommon.statusBarFontSize + this.mPluginData.data['fontColor'] = this.mTintContentInfo.contentColor + Log.showInfo(TAG, `setStyle, data: ${JSON.stringify(this.mPluginData.data)}`) + } + } + + build() { + Row() { + if (this.mPluginData.template && this.mPluginData.data && Object.keys(this.mPluginData.data).length > 0) { + PluginComponent({ + template: this.mPluginData.template, + data: this.mPluginData.data + }).onComplete(() => { + Log.showInfo(TAG, `PluginComponent.Complete`) + }).onError(({errcode, msg}) => { + Log.showInfo(TAG, `PluginComponent.Error code:${errcode} message:${msg}`) + }) + .size({ width: px2vp(this.style.iconWidth), height: '100%' }) + } + }.height('100%') + } +} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index 3f62a5fa..9316fb39 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -19,6 +19,9 @@ import WindowManager, {WindowType} from '../../../../../../../../common/src/main import TintStateManager, {TintState, TintContentInfo, getOrCreateTintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager'; import {FASlotName, Rect} from '../../../../../../../../common/src/main/ets/default/Constants'; +import { PluginType, PluginComponentData +} from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; +import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; import Constants, {StatusBarData, StatusBarBackgroundData, StatusBarComponentGroupContentData, StatusBarComponentData } from '../common/Constants'; import StatusBarService from '../model/StatusBarService'; @@ -116,6 +119,47 @@ export class StatusBarVM { let deleteRs: boolean = AppStorage.Delete(storageKey); Log.showInfo(TAG, `setItemData, AppStorage.Delete rs: ${deleteRs} `); } + this.setPluginData(id, itemData); + } + + setPluginData(id: string, itemData: StatusBarComponentData): void{ + Log.showInfo(TAG, `setPluginData, itemData: ${JSON.stringify(itemData)}`); + if (itemData && itemData.pluginType == PluginType.PLUGIN_COMPONENT) { + let data = undefined; + if (itemData.actionData.pluginData && itemData.actionData.pluginData.data) { + data = JSON.parse(JSON.stringify(itemData.actionData.pluginData.data)); + if (Object.keys(data).length > 0) { + if (!data['fontSize']) { + data['fontSize'] = (StyleConfigurationCommon.getCommonStyle() as any).statusBarFontSize; + } + if (!data['fontColor']) { + if (!this.mComponentAreaMap.get(id)) { + this.changeComponentContent(id, { left: 0, top: 0, width: 0, height: 0 }); + } + data['fontColor'] = this.getPluginTintContentInfo(id).contentColor; + } + } + } + let pluginData = this.getPluginData(id); + pluginData.template = itemData.actionData.pluginData.template; + pluginData.data = data; + Log.showInfo(TAG, `setPluginData, pluginData: ${JSON.stringify(pluginData)} `); + } else { + let storageKey = 'StatusBar_PluginIcon_' + id; + if (AppStorage.Has(storageKey)) { + let deleteRs: boolean = AppStorage.Delete(storageKey); + Log.showInfo(TAG, `setPluginData, AppStorage.Delete rs: ${String(deleteRs)} `); + } + } + } + + getPluginData(id: string): PluginComponentData { + Log.showInfo(TAG, `getPluginData, id: ${id}`); + let storageKey = 'StatusBar_PluginIcon_' + id; + if (!AppStorage.Has(storageKey)) { + AppStorage.SetOrCreate(storageKey, new PluginComponentData()); + } + return AppStorage.Get(storageKey); } onTintStateChange(tintState: TintState) { @@ -230,10 +274,6 @@ export class StatusBarVM { this.setComponentContent(id, '#FFFFFFFF'); return; } - if ((this.mStatusBarData.showHorizontal && area.width == 0) || (!this.mStatusBarData.showHorizontal && area.height == 0)) { - this.setComponentContent(id, '#FFFFFFFF'); - return; - } let startPos = this.mStatusBarData.showHorizontal ? this.mStatusBarData.left : this.mStatusBarData.top; for (let group of this.mComponentGroupContentDatas) { if (group.width == 0) { @@ -249,7 +289,7 @@ export class StatusBarVM { componentStartPos = area.top; componentEndPos = area.top + area.height; } - if (!(componentEndPos <= startPos) && !(componentStartPos >= endPos)) { + if (!(componentEndPos < startPos || componentStartPos > endPos)) { this.setComponentContent(id, group.contentColor); break; } diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index 6dae36c4..a0802f4c 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -26,7 +26,7 @@ Log.showInfo(TAG, `Start.`); var sManager; parentPort.onmessage = (msg) => { - Log.showDebug(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); + Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); let data = msg.data; switch (data.action) { case Constants.INIT_CONFIG: @@ -38,6 +38,9 @@ parentPort.onmessage = (msg) => { case Constants.LOAD_DATA: loadData(data.data); break; + case Constants.UPDATE_PLUGIN_COMPONENT_DATA: + updatePluginComponentData(data.data); + break; default: Log.showError(TAG, `onMessage, unknown action type.`); } @@ -55,6 +58,10 @@ function initConfig(config) { Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); }, + onLoadPluginComponentData: (itemData) => { + Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); + }, }); sManager.initDataSource(config); parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); @@ -70,6 +77,11 @@ function loadData(userId) { sManager?.loadData(userId); } +function updatePluginComponentData(pluginComponentData) { + Log.showDebug(TAG, 'updatePluginComponentData '); + sManager?.updatePluginComponentData(pluginComponentData); +} + parentPort.onclose = function () { Log.showDebug(TAG, `onclose`); }; diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index c39fab63..74ca01e2 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -18,6 +18,7 @@ import Log from "../../../../../../../common/src/main/ets/default/Log"; import WindowManager, { WindowType } from "../../../../../../../common/src/main/ets/default/WindowManager"; import AbilityManager from "../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager"; import StatusBarConfiguration from "../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration"; +import StatusBarConstants from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; const TAG = "StatusBar_ServiceExtAbility"; @@ -25,7 +26,7 @@ class ServiceExtAbility extends ServiceExtension { async onCreate(want) { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context); - + globalThis[StatusBarConstants.PLUGIN_COMPONENT_OWNER_WANT_KEY] = want; let configInfo = await StatusBarConfiguration.getConfiguration(); if (configInfo.showHorizontal) { configInfo.realHeight = (configInfo.realHeight * configInfo.maxWidth) / 1280; diff --git a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index f8ef13db..a0802f4c 100644 --- a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -38,6 +38,9 @@ parentPort.onmessage = (msg) => { case Constants.LOAD_DATA: loadData(data.data); break; + case Constants.UPDATE_PLUGIN_COMPONENT_DATA: + updatePluginComponentData(data.data); + break; default: Log.showError(TAG, `onMessage, unknown action type.`); } @@ -55,6 +58,10 @@ function initConfig(config) { Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); }, + onLoadPluginComponentData: (itemData) => { + Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); + }, }); sManager.initDataSource(config); parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); @@ -70,6 +77,11 @@ function loadData(userId) { sManager?.loadData(userId); } +function updatePluginComponentData(pluginComponentData) { + Log.showDebug(TAG, 'updatePluginComponentData '); + sManager?.updatePluginComponentData(pluginComponentData); +} + parentPort.onclose = function () { Log.showDebug(TAG, `onclose`); }; diff --git a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js index f8ef13db..a0802f4c 100644 --- a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -38,6 +38,9 @@ parentPort.onmessage = (msg) => { case Constants.LOAD_DATA: loadData(data.data); break; + case Constants.UPDATE_PLUGIN_COMPONENT_DATA: + updatePluginComponentData(data.data); + break; default: Log.showError(TAG, `onMessage, unknown action type.`); } @@ -55,6 +58,10 @@ function initConfig(config) { Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); }, + onLoadPluginComponentData: (itemData) => { + Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); + }, }); sManager.initDataSource(config); parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); @@ -70,6 +77,11 @@ function loadData(userId) { sManager?.loadData(userId); } +function updatePluginComponentData(pluginComponentData) { + Log.showDebug(TAG, 'updatePluginComponentData '); + sManager?.updatePluginComponentData(pluginComponentData); +} + parentPort.onclose = function () { Log.showDebug(TAG, `onclose`); }; diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index b501440b..4571b62c 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -18,6 +18,7 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StatusBarConfiguration from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; +import StatusBarConstants from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; const TAG = "StatusBar_ServiceExtAbility" @@ -25,6 +26,7 @@ class ServiceExtAbility extends ServiceExtension { async onCreate(want) { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context) + globalThis[StatusBarConstants.PLUGIN_COMPONENT_OWNER_WANT_KEY] = want; let configInfo = await StatusBarConfiguration.getConfiguration(); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo) diff --git a/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts b/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts index a4b7dc91..e38a3b60 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts @@ -52,6 +52,7 @@ const StatusbarConfig: Config = { FASlotName.WIFI, FASlotName.CAPSULE, FASlotName.NOTIFICATION, + 'demosystemuisbrmeta', ], }, { @@ -61,7 +62,7 @@ const StatusbarConfig: Config = { { id: 3, Components: [ - "testid", + 'demosystemuisbrplugin', FASlotName.LOCATION, FASlotName.BLUETOOTH, FASlotName.RING_MODE, @@ -83,9 +84,14 @@ const StatusbarConfig: Config = { ], MetaSlots: [ { - id: "testid", - bundleName: "com.example.test_app_id", - abilityName: "com.example.test_app_id.MainAbility", + id: 'demosystemuisbrmeta', + bundleName: 'com.ohos.demosystemuisbrmeta', + abilityName: 'com.ohos.demosystemuisbrmeta.MainAbility', + }, + { + id: 'demosystemuisbrplugin', + bundleName: 'com.ohos.demosystemuisbrplugin', + abilityName: 'com.ohos.demosystemuisbrplugin.ServiceExtAbility', }, ], emptyPosition: { diff --git a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index f8ef13db..a0802f4c 100644 --- a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -38,6 +38,9 @@ parentPort.onmessage = (msg) => { case Constants.LOAD_DATA: loadData(data.data); break; + case Constants.UPDATE_PLUGIN_COMPONENT_DATA: + updatePluginComponentData(data.data); + break; default: Log.showError(TAG, `onMessage, unknown action type.`); } @@ -55,6 +58,10 @@ function initConfig(config) { Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); }, + onLoadPluginComponentData: (itemData) => { + Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); + }, }); sManager.initDataSource(config); parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); @@ -70,6 +77,11 @@ function loadData(userId) { sManager?.loadData(userId); } +function updatePluginComponentData(pluginComponentData) { + Log.showDebug(TAG, 'updatePluginComponentData '); + sManager?.updatePluginComponentData(pluginComponentData); +} + parentPort.onclose = function () { Log.showDebug(TAG, `onclose`); }; -- Gitee From bf7598d329c60401973090f538cf846ecae77f22 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Thu, 23 Jun 2022 19:10:25 +0800 Subject: [PATCH 169/373] Get the brightness maximum value through the system interface Signed-off-by: xuchangzhou --- .../src/main/ets/default/batteryModel.ts | 3 +-- .../src/main/ets/default/brightnessManager.ts | 15 ++++++++++++++- .../ets/default/pages/brightnessComponent.ets | 6 +++--- .../com/ohos/view/component/appLstComponent.ets | 1 - 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts index e1e5bce2..7f0feda7 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -1,4 +1,3 @@ -//@ts-nocheck /* * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -28,7 +27,7 @@ const SUBSCRIBE_INFO = { events: [commonEvent.Support.COMMON_EVENT_BATTERY_CHANGED], }; -function getChargingStatus(state: typeof BatteryInfo.BatteryChargeState): boolean { +function getChargingStatus(state: BatteryInfo.BatteryChargeState): boolean { Log.showDebug(TAG, `charging status update: ${state}`); let batteryStatus = false; switch (state) { diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index eaf7a615..31d15886 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -18,13 +18,14 @@ import Log from '../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import commonEvent from '@ohos.commonEvent'; import settings from '@ohos.settings'; +import systemParameter from '@ohos.systemparameter' import featureAbility from '@ohos.ability.featureAbility'; import Brightness from '@ohos.brightness'; import CommonConstants from "../../../../../../common/src/main/ets/default/Constants"; const SYSTEMUI_BRIGHTNESS = settings.display.SCREEN_BRIGHTNESS_STATUS;; const TAG = 'Control-brightnessManager'; -var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 100); +var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', '100'); export class brightnessManager { helper: any; @@ -71,6 +72,18 @@ export class brightnessManager { Log.showInfo(TAG, `settings setValue ${callback.value} end`); } } + + getMin(){ + return parseInt(systemParameter.getSync('const.display.brightness.min')) + } + + getMax(){ + return parseInt(systemParameter.getSync('const.display.brightness.max')) + } + + getDefault(){ + return parseInt(systemParameter.getSync('const.display.brightness.default')) + } } diff --git a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets index 276c0522..2fbbbdb7 100644 --- a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets +++ b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets @@ -25,9 +25,9 @@ export default struct MyBrightness { @StorageLink('BrightnessValue') brightnessValue: number = 0; @State style: any = StyleConfiguration.getBrightnessComponentStyle(); @State brightnessItem: any = { - min: 4, - max: 100, - value: 0 + min: mBrightnessManager.getMin(), + max: mBrightnessManager.getMax(), + value: mBrightnessManager.getDefault() }; aboutToAppear() { diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets index 7af50866..1563adca 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets @@ -1,4 +1,3 @@ -// @ts-nocheck /** * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); -- Gitee From cabbf0f6de45cc249ae010898696292f27be19de Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Thu, 23 Jun 2022 19:22:28 +0800 Subject: [PATCH 170/373] Get the brightness maximum value through the system interface Signed-off-by: xuchangzhou --- .../src/main/ets/default/brightnessManager.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index 31d15886..52710acd 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -25,7 +25,7 @@ import CommonConstants from "../../../../../../common/src/main/ets/default/Const const SYSTEMUI_BRIGHTNESS = settings.display.SCREEN_BRIGHTNESS_STATUS;; const TAG = 'Control-brightnessManager'; -var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', '100'); +var mBrightnessValue = AppStorage.SetAndLink('BrightnessValue', 100); export class brightnessManager { helper: any; @@ -42,7 +42,7 @@ export class brightnessManager { registerBrightness() { this.helper.on("dataChange", this.uri, (err) => { - let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '100'); + let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, JSON.stringify(this.getDefault())); Log.showInfo(TAG, `after brightness datachange settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); }) @@ -56,7 +56,7 @@ export class brightnessManager { getValue() { Log.showInfo(TAG, 'getValue'); - let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, '100'); + let data = settings.getValueSync(this.helper, SYSTEMUI_BRIGHTNESS, JSON.stringify(this.getDefault())); Log.showInfo(TAG, `settings getValue ${parseInt(data)}`); mBrightnessValue.set(parseInt(data)); } -- Gitee From da4efde3785c6accebfc87f3454b68cf34dce52f Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 25 Jun 2022 17:09:55 +0800 Subject: [PATCH 171/373] Notification management startup to get screen parameters error report Signed-off-by: lijinfengde123 --- .../src/main/ets/MainAbility/MainAbility.ts | 6 ------ .../src/main/ets/vm/notificationManagenmentViewModel.ts | 6 +++--- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts index cab2e4d7..90366d08 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts @@ -23,12 +23,6 @@ export default class MainAbility extends Ability { onCreate(want, launchParam) { Log.showInfo(TAG, "MainAbility onCreate") globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = want; - display.getDefaultDisplay().then((dis) => { - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_APP_LIST, "dis", { - width: dis.width, - height: dis.height, - }); - }); } onDestroy() { diff --git a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts index 57a9c642..1cb6cb78 100644 --- a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts @@ -13,10 +13,10 @@ * limitations under the License. */ -import ConfigData from '../common/constants'; import Log from '../../../../../../../common/src/main/ets/default/log'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' import BundleResourceModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/bundleresourcemodel'; +import display from '@ohos.display'; import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/nodisturbcomponentviewmodel' import Router from '@system.router'; @@ -59,9 +59,9 @@ export default class NotificationManagenmentViewModel extends NoDisturbComponent globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = null; } - judgeDeviceType(){ + async judgeDeviceType(){ Log.showDebug(TAG, "judgeDeviceType"); - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_APP_LIST, 'dis'); + let configInfo = await display.getDefaultDisplay(); Log.showDebug(TAG, `judgeDeviceType, configInfo: ${configInfo} `); if (configInfo.width < configInfo.height) { this.isPhone = true; -- Gitee From 764e2c920ffd9116753f7ffedbb5d344ad5d4270 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 25 Jun 2022 17:45:18 +0800 Subject: [PATCH 172/373] Notification management startup to get screen parameters error report Signed-off-by: lijinfengde123 --- .../dropdownpanel/src/main/ets/pages/notification.ets | 5 ++--- .../src/main/resources/base/element/float.json | 8 ++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 668ffa16..bc1e8b75 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -33,7 +33,6 @@ import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT const TAG = 'DropdownPanel-notification' const GRID_SIZE = 6; const IMAGE_SIZE_L = 24; -const IMAGE_SIZE_S = 20; const BGC_SIZE_L = 40; const NO_NOTIFICATION_TOP_MARGIN = 40; const TIME_TEXT_MARGIN = 4; @@ -240,8 +239,8 @@ struct CenterTitle { .flexGrow(1) Image($r("app.media.ic_public_settings")) .objectFit(ImageFit.Contain) - .width(IMAGE_SIZE_S) - .height(IMAGE_SIZE_S) + .width($r('app.float.notification_title_setting_icon_width')) + .height($r('app.float.notification_title_setting_icon_height')) .fillColor("#FFFFFF") .margin({ right: CENTER_MARGIN, bottom: TIME_BOTTOM_OFFSET }) .onClick(this.settingClick.bind(this)) diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/float.json b/product/phone/dropdownpanel/src/main/resources/base/element/float.json index 7978df0c..3831c43c 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/float.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/float.json @@ -119,6 +119,14 @@ { "name": "status_bar_padding_top_bottom", "value": "4vp" + }, + { + "name": "notification_title_setting_icon_width", + "value": "48vp" + }, + { + "name": "notification_title_setting_icon_height", + "value": "48vp" } ] } \ No newline at end of file -- Gitee From 7ebe60f5e2fe087a0a2f18d76751b5491e04016d Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 25 Jun 2022 17:47:50 +0800 Subject: [PATCH 173/373] Notification management startup to get screen parameters error report Signed-off-by: lijinfengde123 --- .../phone/dropdownpanel/src/main/ets/pages/notification.ets | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index bc1e8b75..668ffa16 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -33,6 +33,7 @@ import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT const TAG = 'DropdownPanel-notification' const GRID_SIZE = 6; const IMAGE_SIZE_L = 24; +const IMAGE_SIZE_S = 20; const BGC_SIZE_L = 40; const NO_NOTIFICATION_TOP_MARGIN = 40; const TIME_TEXT_MARGIN = 4; @@ -239,8 +240,8 @@ struct CenterTitle { .flexGrow(1) Image($r("app.media.ic_public_settings")) .objectFit(ImageFit.Contain) - .width($r('app.float.notification_title_setting_icon_width')) - .height($r('app.float.notification_title_setting_icon_height')) + .width(IMAGE_SIZE_S) + .height(IMAGE_SIZE_S) .fillColor("#FFFFFF") .margin({ right: CENTER_MARGIN, bottom: TIME_BOTTOM_OFFSET }) .onClick(this.settingClick.bind(this)) -- Gitee From f5ea9b5ba57ac2e32a3141ae0c809cf2875298a4 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Mon, 27 Jun 2022 10:06:18 +0800 Subject: [PATCH 174/373] Notification management startup to get screen parameters error report Signed-off-by: lijinfengde123 --- .../dropdownpanel/src/main/ets/pages/notification.ets | 10 +++------- .../src/main/resources/base/element/float.json | 4 ++-- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 668ffa16..e491b9be 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -31,9 +31,7 @@ import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT } from '../../../../../../../common/src/main/ets/default/timemanager' const TAG = 'DropdownPanel-notification' -const GRID_SIZE = 6; const IMAGE_SIZE_L = 24; -const IMAGE_SIZE_S = 20; const BGC_SIZE_L = 40; const NO_NOTIFICATION_TOP_MARGIN = 40; const TIME_TEXT_MARGIN = 4; @@ -144,7 +142,6 @@ struct statusBar { build() { Column(){ Stack(){ - Row(){ Row(){}.width('50%').height('100%').onTouch((touchEvent) => {this.touchEvent(touchEvent, 'left')}) Row(){}.width('50%').height('100%').onTouch((touchEvent) => {this.touchEvent(touchEvent, 'right')}) @@ -193,7 +190,6 @@ struct statusBar { }else if(touchLocation === 'right'){ this.touchMoveCallback({ 'direction': 'drop_right', 'touchComponent': 'notification' }) } - } } } @@ -240,8 +236,8 @@ struct CenterTitle { .flexGrow(1) Image($r("app.media.ic_public_settings")) .objectFit(ImageFit.Contain) - .width(IMAGE_SIZE_S) - .height(IMAGE_SIZE_S) + .width($r("app.float.notification_title_setting_icon_width")) + .height($r("app.float.notification_title_setting_icon_height")) .fillColor("#FFFFFF") .margin({ right: CENTER_MARGIN, bottom: TIME_BOTTOM_OFFSET }) .onClick(this.settingClick.bind(this)) @@ -285,4 +281,4 @@ struct CenterTitle { } } } -} +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/float.json b/product/phone/dropdownpanel/src/main/resources/base/element/float.json index 3831c43c..9b88ba6b 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/float.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/float.json @@ -122,11 +122,11 @@ }, { "name": "notification_title_setting_icon_width", - "value": "48vp" + "value": "48px" }, { "name": "notification_title_setting_icon_height", - "value": "48vp" + "value": "48px" } ] } \ No newline at end of file -- Gitee From f705ad491443d835a594ee5f49eb6a47b6bc5c4e Mon Sep 17 00:00:00 2001 From: lvxiaoqiang Date: Mon, 27 Jun 2022 11:34:15 +0800 Subject: [PATCH 175/373] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=9B=B4=E6=96=B0=E5=BC=82=E5=B8=B8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lvxiaoqiang --- .../main/ets/com/ohos/model/accountsModel.ts | 39 +++++++++++++++++-- .../ets/com/ohos/model/screenLockService.ts | 8 +++- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index f9c7eb1d..f0717783 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -19,6 +19,7 @@ import util from '@ohos.util'; import {Callback} from 'basic'; import Trace from '../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../common/src/main/ets/default/Log' +import { CommonEventManager, getCommonEventManager } from "../../../../../../../../common/src/main/ets/default/commonEvent/CommonEventManager"; import {UserData} from '../data/userData' const TAG = "ScreenLock-AccountsModel" @@ -72,13 +73,17 @@ export enum ResultCode { //fails FAIL = 1, } - +const USER_SUBSCRIBE_INFO = { + events: [ + commonEvent.Support.COMMON_EVENT_USER_REMOVED, + ], +}; export default class AccountsModel { userAuthManager = new osAccount.UserAuth(); pinAuthManager = new osAccount.PINAuth(); mCurrentUserId: number = 100 - + private mManager?: CommonEventManager; modelInit() { Log.showDebug(TAG, "start ModelInit") } @@ -92,6 +97,34 @@ export default class AccountsModel { }) } + commonEventListener(callback: Callback) { + this.mManager = getCommonEventManager( + TAG, + USER_SUBSCRIBE_INFO, + (data) => { + Log.showInfo(TAG, `USER_REMOVED. ${JSON.stringify(data)}`); + callback(); + }, + ); + this.mManager.subscriberCommonEvent(); + + Log.showInfo(TAG, `commonEventListener eventListener`); + let subscribeInfo = {events: ['usual.event.USER_REMOVED']}; + commonEvent.createSubscriber(subscribeInfo, (error, subscriber) => { + Log.showInfo(TAG, `createSubscriber success. ${JSON.stringify(subscriber)}`); + commonEvent.subscribe(subscriber, (err, commonEventData) => { + Log.showInfo(TAG, `USER_REMOVED subscribe. ${JSON.stringify(commonEventData)}`); + callback(); + }); + }); + } + + commonEventCancelListener() { + Log.showInfo(TAG, "cancel commonEvent"); + this.mManager?.release(); + this.mManager = undefined; + } + eventCancelListener(typeName: "activate" | "activating", name: string) { Log.showInfo(TAG, `eventCancleListener:typeName ${typeName}`); osAccount.getAccountManager().off(typeName, name) @@ -110,7 +143,7 @@ export default class AccountsModel { } private addAllUsers() { - Log.showDebug(TAG, "start getAllUsers") + Log.showDebug(TAG, "start getAllUsers"); osAccount.getAccountManager().queryAllCreatedOsAccounts().then((list) => { Log.showDebug(TAG, "start sort") let accountList = []; diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 01e353ce..17158283 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -117,6 +117,11 @@ export class ScreenLockService { }) }) + this.accountModel.commonEventListener(()=>{ + Log.showInfo(TAG, `commonEventListener event`); + this.accountModel.updateAllUsers(); + }) + //unlock request was received this.screenLockModel.eventListener(EVENT_UNLOCK_SCREEN, () => { Log.showInfo(TAG, `EVENT_UNLOCK_SCREEN event`); @@ -152,7 +157,7 @@ export class ScreenLockService { private checkPinAuthProperty(callback: Callback) { Log.showDebug(TAG, "checkPinAuthProperty") this.accountModel.getAuthProperty(AuthType.PIN, (properties) => { - Log.showInfo(TAG, `checkPinAuthProperty:AUTH_SUB_TYPE:${properties.authSubType}`); + Log.showInfo(TAG, `checkPinAuthProperty: AUTH_SUB_TYPE:${properties.authSubType}`); switch (properties.authSubType) { case AuthSubType.PIN_SIX: AppStorage.SetOrCreate('lockStatus', ScreenLockStatus.Locking); @@ -301,6 +306,7 @@ export class ScreenLockService { this.screenLockModel.eventCancelListener(EVENT_UNLOCK_SCREEN); this.accountModel.eventCancelListener(ACTIVATING_TYPE, ACTIVATING_EVENT); this.accountModel.eventCancelListener(ACTIVATE_TYPE, ACTIVATE_EVENT) + this.accountModel.commonEventCancelListener(); this.accountModel.modelFinish() } -- Gitee From 097dc4c52e881633a6aa843adfac2075035e6570 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Mon, 27 Jun 2022 20:03:51 +0800 Subject: [PATCH 176/373] update eslint Signed-off-by: lijinfengde123 --- common/src/main/ets/default/Constants.ts | 16 +- common/src/main/ets/default/Decorators.ts | 42 +- common/src/main/ets/default/InitSystemUi.ts | 18 +- common/src/main/ets/default/ReadConfigUtil.ts | 12 +- .../src/main/ets/default/ScreenLockManager.ts | 32 +- common/src/main/ets/default/SettingsUtil.ts | 74 +-- .../main/ets/default/SingleInstanceHelper.ts | 4 +- .../main/ets/default/StyleConfiguration.ts | 26 +- common/src/main/ets/default/StyleManager.ts | 28 +- .../src/main/ets/default/TintStateManager.ts | 131 ++-- common/src/main/ets/default/WindowManager.ts | 62 +- .../default/abilitymanager/abilityManager.ts | 50 +- .../abilitymanager/notificationManager.ts | 38 +- .../PluginDataSourceAdapter.ts | 266 ++++---- .../PluginDataSourceManager.ts | 196 +++--- .../common/BundleParseUtil.ts | 131 ++-- .../ets/plugindatasource/common/Constants.ts | 89 +-- .../sourceloader/DataAbilitySourceLoader.ts | 33 +- .../sourceloader/MetaSourceLoader.ts | 134 ++-- .../sourceloader/PluginSourceLoader.ts | 6 +- .../sourceloader/SourceLoader.ts | 54 +- .../sourceloader/SourceLoaderFactory.ts | 48 +- .../main/ets/template/SimpleToggleBase.ets | 4 +- .../ets/template/common/StyleConfiguration.ts | 134 ++-- .../src/main/ets/template/iconComponent.ets | 18 +- .../src/main/ets/template/iconTitleBase.ets | 24 +- .../src/main/ets/Application/AbilityStage.ts | 12 +- .../ServiceExtAbility/ServiceExtAbility.ts | 69 +- .../src/main/ets/Application/AbilityStage.ts | 12 +- .../ServiceExtAbility/ServiceExtAbility.ts | 53 +- .../src/main/ets/com/ohos/common/Constants.ts | 2 +- .../ets/com/ohos/model/AutoRotateService.ts | 46 +- .../ets/com/ohos/viewmodel/AutoRotateVM.ts | 12 +- .../ets/default/common/StyleConfiguration.ts | 57 +- .../src/main/ets/default/common/constants.ts | 4 +- .../main/ets/default/pages/batteryIcon.ets | 9 +- .../src/main/ets/default/pages/batteryPic.ets | 4 +- .../src/main/ets/default/pages/batterySoc.ets | 19 +- .../main/ets/default/viewmodel/BatteryVM.ts | 9 +- .../ets/com/ohos/common/StyleConfiguration.ts | 15 +- .../ets/com/ohos/model/BluetoothService.ts | 36 +- .../StatusBarIconItemBluetoothComponent.ets | 11 +- .../ets/com/ohos/viewmodel/BluetoothVM.ts | 24 +- .../ets/default/common/StyleConfiguration.ts | 42 +- .../ets/default/pages/brightnessComponent.ets | 6 +- .../ets/default/common/StyleConfiguration.ts | 29 +- .../src/main/ets/default/common/constants.ts | 10 +- .../main/ets/default/pages/CapsuleIcon.ets | 9 +- .../ets/default/common/StyleConfiguration.ts | 12 +- .../src/main/ets/default/pages/clockIcon.ets | 9 +- .../src/main/ets/default/viewmodel/ClockVM.ts | 9 +- .../src/main/ets/com/ohos/common/Constants.ts | 43 +- .../ets/com/ohos/common/StyleConfiguration.ts | 332 +++++----- .../com/ohos/model/ControlCenterService.ts | 474 ++++++------- .../com/ohos/pages/ComplexToggleComponent.ets | 1 - .../com/ohos/pages/ControlCenterComponent.ets | 13 +- .../pages/SimpleToggleLayoutEditComponent.ets | 11 +- .../SimpleToggleLayoutEditDialogComponent.ets | 6 +- .../ohos/pages/SimpleToggleLayoutEditGrid.ets | 4 +- .../src/main/ets/com/ohos/pages/UpTitle.ets | 6 +- .../ets/com/ohos/viewmodel/ControlCenterVM.ts | 30 +- .../main/resources/base/element/float.json | 16 - .../src/main/ets/com/ohos/common/Constants.ts | 3 +- .../ets/com/ohos/common/StyleConfiguration.ts | 15 +- .../ets/com/ohos/model/LocationService.ts | 49 +- .../StatusBarIconItemLocationComponent.ets | 11 +- .../main/ets/com/ohos/viewmodel/LocationVM.ts | 31 +- .../src/main/ets/com/ohos/common/constants.ts | 30 +- .../ets/com/ohos/model/bundleResourceModel.ts | 118 ++-- .../ets/com/ohos/model/noDisturbingModel.ts | 43 +- .../com/ohos/model/notificationListener.ts | 81 +-- .../ohos/view/component/appLstComponent.ets | 2 +- .../view/component/noDisturbComponent.ets | 4 +- .../com/ohos/vm/appLstComponentViewModel.ts | 12 +- .../ohos/vm/noDisturbComponentViewModel.ts | 95 +-- .../com/ohos/noticeItem/common/CommonUtil.ts | 4 +- .../noticeItem/common/ScrollbarManager.ts | 30 +- .../com/ohos/noticeItem/common/constants.ts | 102 +-- .../noticeItem/model/NotificationConfig.ts | 24 +- .../model/NotificationDistributionManager.ts | 42 +- .../noticeItem/model/NotificationManager.ts | 69 +- .../noticeItem/model/NotificationService.ts | 53 +- .../model/NotificationWindowManager.ts | 12 +- .../ohos/noticeItem/model/ParseDataUtil.ts | 66 +- .../noticeItem/model/rule/RuleController.ts | 26 +- .../ohos/noticeItem/viewmodel/ViewModel.ts | 168 ++--- .../ets/com/ohos/common/StyleConfiguration.ts | 29 +- .../ets/com/ohos/model/RingModeService.ts | 40 +- ...rolCenterSimpleToggleRingModeComponent.ets | 8 +- .../StatusBarIconItemRingModeComponent.ets | 13 +- .../main/ets/com/ohos/viewmodel/RingModeVM.ts | 27 +- .../ets/default/common/StyleConfiguration.ts | 29 +- .../src/main/ets/default/common/constants.ts | 30 +- .../src/main/ets/default/pages/signalIcon.ets | 66 +- .../main/ets/default/viewmodel/SignalVM.ts | 9 +- .../src/main/ets/com/ohos/common/Constants.ts | 54 +- .../ets/com/ohos/common/StyleConfiguration.ts | 94 +-- .../ets/com/ohos/model/StatusBarService.ts | 627 +++++++++--------- .../ets/com/ohos/pages/IconItemComponent.ets | 15 +- .../com/ohos/pages/MetaIconItemComponent.ets | 11 +- .../ohos/pages/PluginIconItemComponent.ets | 9 +- .../ets/com/ohos/pages/StatusBarComponent.ets | 24 +- .../ets/com/ohos/viewmodel/StatusBarVM.ts | 68 +- .../src/main/ets/com/ohos/common/Constants.ts | 16 +- .../ets/com/ohos/common/StyleConfiguration.ts | 53 +- .../com/ohos/common/VolumeWindowController.ts | 24 +- .../ets/com/ohos/model/VolumePanelService.ts | 139 ++-- .../com/ohos/pages/VolumePanelComponent.ets | 4 +- .../ets/com/ohos/viewmodel/VolumePanelVM.ts | 62 +- .../main/resources/base/element/float.json | 4 - .../main/resources/phone/element/float.json | 4 - .../ets/default/common/StyleConfiguration.ts | 17 +- .../src/main/ets/default/common/constants.ts | 20 +- .../src/main/ets/default/pages/wifiIcon.ets | 11 +- .../src/main/ets/default/viewmodel/WifiVM.ts | 9 +- .../src/main/ets/default/wifiModel.ts | 60 +- .../src/main/ets/Application/AbilityStage.ts | 13 +- .../ServiceExtAbility/ServiceExtAbility.ts | 117 ++-- .../src/main/ets/common/StyleConfiguration.ts | 28 +- .../src/main/ets/common/StyleManager.ts | 92 +-- .../src/main/ets/common/constants.ts | 27 +- .../src/main/ets/pages/keyButton.ets | 21 +- .../ets/viewmodel/NavigationBarViewModel.ts | 86 +-- .../src/main/ets/Application/AbilityStage.ts | 12 +- .../src/main/ets/MainAbility/MainAbility.ts | 46 +- .../src/main/ets/common/constants.ts | 10 +- .../src/main/ets/pages/batchSetEnable.ets | 2 +- .../src/main/ets/pages/noDisturb.ets | 2 +- .../ets/pages/notificationManagenment.ets | 4 +- .../src/main/ets/vm/noDisturbViewModel.ts | 66 +- .../vm/notificationManagenmentViewModel.ts | 32 +- .../src/main/ets/Application/AbilityStage.ts | 13 +- .../ServiceExtAbility/ServiceExtAbility.ts | 67 +- .../src/main/ets/common/StyleConfiguration.ts | 17 +- .../src/main/ets/common/StyleManager.ts | 90 ++- .../src/main/ets/Application/AbilityStage.ts | 13 +- .../ServiceExtAbility/ServiceExtAbility.ts | 31 +- .../ets/pages/common/ControlCenterConfig.ts | 31 +- .../ets/pages/common/StyleConfiguration.ts | 24 +- .../src/main/ets/pages/common/StyleManager.ts | 497 +++++++------- .../src/main/ets/pages/common/constants.ts | 2 +- .../controlpanel/src/main/ets/pages/index.ets | 8 +- .../ets/workers/PluginDataSourceWorker.js | 106 +-- .../src/main/ets/Application/AbilityStage.ts | 13 +- .../ServiceExtAbility/ServiceExtAbility.ts | 38 +- .../ets/pages/common/StyleConfiguration.ts | 18 +- .../src/main/ets/pages/common/StyleManager.ts | 46 +- .../src/main/ets/pages/common/constants.ts | 8 +- .../src/main/ets/Application/AbilityStage.ts | 13 +- .../ServiceExtAbility/ServiceExtAbility.ts | 81 +-- .../main/ets/pages/common/StatusbarConfig.ts | 40 +- .../ets/pages/common/StyleConfiguration.ts | 15 +- .../src/main/ets/pages/common/StyleManager.ts | 320 ++++----- .../ets/workers/PluginDataSourceWorker.js | 106 +-- .../src/main/ets/Application/AbilityStage.ts | 13 +- .../ServiceExtAbility/ServiceExtAbility.ts | 83 +-- .../ets/pages/common/ControlCenterConfig.ts | 36 +- .../ets/pages/common/StyleConfiguration.ts | 106 +-- .../src/main/ets/pages/common/StyleManager.ts | 482 +++++++------- .../src/main/ets/pages/common/constants.ts | 18 +- .../main/ets/pages/common/navigationEvent.ts | 8 +- .../src/main/ets/pages/control.ets | 4 +- .../src/main/ets/pages/index.ets | 9 +- .../src/main/ets/pages/notification.ets | 10 +- .../ets/workers/PluginDataSourceWorker.js | 106 +-- .../main/resources/base/element/float.json | 8 - .../src/main/ets/Application/AbilityStage.ts | 13 +- .../ServiceExtAbility/ServiceExtAbility.ts | 62 +- .../main/ets/pages/common/StatusbarConfig.ts | 37 +- .../ets/pages/common/StyleConfiguration.ts | 15 +- .../src/main/ets/pages/common/StyleManager.ts | 43 +- .../src/main/ets/pages/common/constants.ts | 6 +- .../statusbar/src/main/ets/pages/index.ets | 2 +- .../ets/workers/PluginDataSourceWorker.js | 106 +-- 174 files changed, 4690 insertions(+), 4424 deletions(-) diff --git a/common/src/main/ets/default/Constants.ts b/common/src/main/ets/default/Constants.ts index 505cb8da..0981db9d 100644 --- a/common/src/main/ets/default/Constants.ts +++ b/common/src/main/ets/default/Constants.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Window from "@ohos.window"; +import Window from '@ohos.window'; export interface Rect { left: number; @@ -24,7 +24,7 @@ export interface Rect { export type WindowType = 'status' | 'navigation' | 'volume'; -export function getWindowName(windowType): WindowType{ +export function getWindowName(windowType): WindowType { switch (windowType) { case Window.WindowType.TYPE_NAVIGATION_BAR: return 'navigation'; @@ -36,20 +36,20 @@ export function getWindowName(windowType): WindowType{ } export default class Constants { - static URI_VAR: string = 'dataability:///com.ohos.settingsdata.DataAbility'; + static readonly URI_VAR = 'dataability:///com.ohos.settingsdata.DataAbility'; } export enum FASlotName { - AUTO_ROTATE = "auto_rotate", - AIR_PLANE = "air_plane", + AUTO_ROTATE = 'auto_rotate', + AIR_PLANE = 'air_plane', BATTERY = 'battery', - BLUETOOTH = 'bluetooth', + BLUETOOTH = 'bluetooth', CAPSULE = 'capsule', CLOCK = 'clock', - EMPTY = 'empty', + EMPTY = 'empty', LOCATION = 'location', NOTIFICATION = 'notification', RING_MODE = 'ring_mode', SIGNAL = 'signal', - WIFI = 'wifi', + WIFI = 'wifi', } diff --git a/common/src/main/ets/default/Decorators.ts b/common/src/main/ets/default/Decorators.ts index 85cf5c58..66b5ffee 100644 --- a/common/src/main/ets/default/Decorators.ts +++ b/common/src/main/ets/default/Decorators.ts @@ -13,33 +13,33 @@ * limitations under the License. */ -import Log from "./Log"; +import Log from './Log'; -const TAG = "Decorators"; +const TAG = 'Decorators'; export function debounce(timeout: number) { - return function inner(target: any, propKey: string, descriptor: PropertyDescriptor) { - let curFunc: number = 0; - const original = descriptor.value; - descriptor.value = function (...args: string[]) { - Log.showInfo(TAG, `debounce invoke ${propKey} curFunc: ${curFunc}`); - curFunc && clearTimeout(curFunc); - curFunc = setTimeout(() => original.call(this, ...args), timeout); - }; + return function inner(target: any, propKey: string, descriptor: PropertyDescriptor) { + let curFunc = 0; + const original = descriptor.value; + descriptor.value = function (...args: string[]) { + Log.showInfo(TAG, `debounce invoke ${propKey} curFunc: ${curFunc}`); + curFunc && clearTimeout(curFunc); + curFunc = setTimeout(() => original.call(this, ...args), timeout); }; + }; } export function throttle(waitTime: number) { - return function inner(target: any, propKey: string, descriptor: PropertyDescriptor) { - let lastTime: number = 0; - const original = descriptor.value; - descriptor.value = function (...args: string[]) { - let curTime = Date.now(); - Log.showInfo(TAG, `throttle invoke ${propKey} timeInterval: ${curTime - lastTime}`); - if (curTime - lastTime >= waitTime) { - original.call(this, ...args); - lastTime = curTime; - } - }; + return function inner(target: any, propKey: string, descriptor: PropertyDescriptor) { + let lastTime = 0; + const original = descriptor.value; + descriptor.value = function (...args: string[]) { + let curTime = Date.now(); + Log.showInfo(TAG, `throttle invoke ${propKey} timeInterval: ${curTime - lastTime}`); + if (curTime - lastTime >= waitTime) { + original.call(this, ...args); + lastTime = curTime; + } }; + }; } diff --git a/common/src/main/ets/default/InitSystemUi.ts b/common/src/main/ets/default/InitSystemUi.ts index bf023152..10b9cfa7 100644 --- a/common/src/main/ets/default/InitSystemUi.ts +++ b/common/src/main/ets/default/InitSystemUi.ts @@ -13,17 +13,19 @@ * limitations under the License. */ -import EventManager from "./event/EventManager"; -import Log from "./Log"; -import ScreenLockManager from "./ScreenLockManager"; -import ServiceExtensionContext from "application/ServiceExtensionContext"; -import TimeManager from "./TimeManager"; +import EventManager from './event/EventManager'; +import Log from './Log'; +import ScreenLockManager from './ScreenLockManager'; +import ServiceExtensionContext from 'application/ServiceExtensionContext'; +import TimeManager from './TimeManager'; -const TAG = "initSystemui"; +const TAG = 'initSystemui'; -export default function initSystemUi(context: ServiceExtensionContext) { +export default function initSystemUi(context: ServiceExtensionContext): void { EventManager.setContext(context); - ScreenLockManager.init(); + ScreenLockManager.init().then(() => { + }).catch(err => { + }); TimeManager.init(context); Log.showDebug(TAG, `init done, ctx: ${context}`); } diff --git a/common/src/main/ets/default/ReadConfigUtil.ts b/common/src/main/ets/default/ReadConfigUtil.ts index b347a1ed..25c4b87e 100644 --- a/common/src/main/ets/default/ReadConfigUtil.ts +++ b/common/src/main/ets/default/ReadConfigUtil.ts @@ -21,14 +21,14 @@ const CHAR_CODE_AT_INDEX = 0; const TAG = 'ReadConfigUtil'; export class ReadConfigUtil { - ReadConfigFile(fileName) { + readConfigFile(fileName: string): any { Log.showDebug(TAG, `readConfigFile fileName:${fileName}`); try { let stream = FileIo.createStreamSync(fileName, 'r'); - Log.showDebug(TAG, `readConfigFile stream:` + stream); + Log.showDebug(TAG, `readConfigFile stream:${JSON.stringify(stream)}`); let buf = new ArrayBuffer(DFAULT_SIZE); let len = stream.readSync(buf); - Log.showDebug(TAG, `readConfigFile len:` + len); + Log.showDebug(TAG, `readConfigFile len:${len}`); let arr = new Uint8Array(buf); let charAt = ' '.charCodeAt(CHAR_CODE_AT_INDEX); for (let i = len;i < DFAULT_SIZE; i++) { @@ -36,14 +36,14 @@ export class ReadConfigUtil { } let content = String.fromCharCode.apply(null, arr); stream.closeSync(); - Log.showDebug(TAG, `readConfigFile content:` + JSON.stringify(content)); + Log.showDebug(TAG, `readConfigFile content:${JSON.stringify(content)}`); return JSON.parse(content); } catch (error) { - Log.showError(TAG, `readConfigFile error:` + JSON.stringify(error)); + Log.showError(TAG, `readConfigFile error:${JSON.stringify(error)}`); } } } let readConfigUtil = new ReadConfigUtil(); -export default readConfigUtil as ReadConfigUtil +export default readConfigUtil; diff --git a/common/src/main/ets/default/ScreenLockManager.ts b/common/src/main/ets/default/ScreenLockManager.ts index d38431d5..beb3115c 100644 --- a/common/src/main/ets/default/ScreenLockManager.ts +++ b/common/src/main/ets/default/ScreenLockManager.ts @@ -13,16 +13,17 @@ * limitations under the License. */ -import commonEvent from "@ohos.commonEvent"; -import { CommonEventSubscriber } from "commonEvent/commonEventSubscriber"; -import createOrGet from "./SingleInstanceHelper"; -import EventManager from "./event/EventManager"; -import Log from "./Log"; -import { obtainLocalEvent } from "./event/EventUtil"; -import { debounce } from "./Decorators"; -export const SCREEN_CHANGE_EVENT = "screenChangeEvent"; - -const TAG = "ScreenLockManager"; +import commonEvent from '@ohos.commonEvent'; +import { CommonEventSubscriber } from 'commonEvent/commonEventSubscriber'; +import createOrGet from './SingleInstanceHelper'; +import EventManager from './event/EventManager'; +import Log from './Log'; +import { obtainLocalEvent } from './event/EventUtil'; +import { debounce } from './Decorators'; + +export const SCREEN_CHANGE_EVENT = 'screenChangeEvent'; + +const TAG = 'ScreenLockManager'; const SCREEN_COMMON_EVENT_INFO = { events: [commonEvent.Support.COMMON_EVENT_SCREEN_OFF, commonEvent.Support.COMMON_EVENT_SCREEN_ON], }; @@ -31,7 +32,7 @@ const debounceTimeout = 500; class ScreenLockManager { mSubscriber: CommonEventSubscriber | undefined; - async init() { + async init(): Promise { this.mSubscriber = await commonEvent.createSubscriber(SCREEN_COMMON_EVENT_INFO); commonEvent.subscribe(this.mSubscriber, (err, data) => { if (err.code != 0) { @@ -47,17 +48,18 @@ class ScreenLockManager { this.notifyScreenEvent(true); break; default: - Log.showError(TAG, `unknow event`); + Log.showError(TAG, 'unknow event'); } }); } @debounce(debounceTimeout) - notifyScreenEvent(isScreenOn: boolean) { + notifyScreenEvent(isScreenOn: boolean): void { EventManager.publish(obtainLocalEvent(SCREEN_CHANGE_EVENT, isScreenOn)); - Log.showDebug(TAG, `publish ${SCREEN_CHANGE_EVENT} screenState: ${isScreenOn}`); + Log.showDebug(TAG, `publish ${SCREEN_CHANGE_EVENT} screenState: ${isScreenOn ? 'true' : 'false'}`); } } let sScreenLockManager = createOrGet(ScreenLockManager, TAG); -export default sScreenLockManager as ScreenLockManager; \ No newline at end of file + +export default sScreenLockManager; \ No newline at end of file diff --git a/common/src/main/ets/default/SettingsUtil.ts b/common/src/main/ets/default/SettingsUtil.ts index 233bf735..a09c67db 100644 --- a/common/src/main/ets/default/SettingsUtil.ts +++ b/common/src/main/ets/default/SettingsUtil.ts @@ -14,53 +14,53 @@ * limitations under the License. */ -import settings from "@ohos.settings"; -import {DataAbilityHelper} from "ability/dataAbilityHelper"; -import featureAbility from "@ohos.ability.featureAbility"; -import Log from "./Log"; -import Constants from "./Constants"; -import createOrGet from "./SingleInstanceHelper"; -import AbilityManager from "./abilitymanager/abilityManager"; +import settings from '@ohos.settings'; +import { DataAbilityHelper } from 'ability/dataAbilityHelper'; +import featureAbility from '@ohos.ability.featureAbility'; +import Log from './Log'; +import Constants from './Constants'; +import createOrGet from './SingleInstanceHelper'; +import AbilityManager from './abilitymanager/abilityManager'; -const TAG = "SettingsUtil"; +const TAG = 'SettingsUtil'; export class SettingsUtil { - helper: DataAbilityHelper; + helper: DataAbilityHelper; - constructor() { - Log.showDebug(TAG, `constructor`); - try { - this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), Constants.URI_VAR); - } catch (e) { - Log.showError(TAG, `constructor, acquire helper error: ${JSON.stringify(e)}`); - } + constructor() { + Log.showDebug(TAG, 'constructor'); + try { + this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), Constants.URI_VAR); + } catch (e) { + Log.showError(TAG, `constructor, acquire helper error: ${JSON.stringify(e)}`); } + } - getValue(name: string, defValue?: string): string { - Log.showDebug(TAG, `getValue, name: ${name} defValue: ${defValue}`); - let value: string = null; - try { - value = settings.getValueSync(this.helper, name, defValue ? defValue : ""); - } catch (e) { - Log.showError(TAG, `getValue e: ${JSON.stringify(e)}`); - } - Log.showDebug(TAG, `getValue, value: ${value}`); - return value; + getValue(name: string, defValue?: string): string { + Log.showDebug(TAG, `getValue, name: ${name} defValue: ${defValue}`); + let value: string = null; + try { + value = settings.getValueSync(this.helper, name, defValue ? defValue : ''); + } catch (e) { + Log.showError(TAG, `getValue e: ${JSON.stringify(e)}`); } + Log.showDebug(TAG, `getValue, value: ${value}`); + return value; + } - setValue(name: string, value: string): boolean { - Log.showDebug(TAG, `setValue, name: ${name} value: ${value}`); - let result = false; - try { - result = settings.setValueSync(this.helper, name, value); - } catch (e) { - Log.showError(TAG, `setValue e: ${JSON.stringify(e)}`); - } - Log.showDebug(TAG, `setValue, result: ${result}`); - return result; + setValue(name: string, value: string): boolean { + Log.showDebug(TAG, `setValue, name: ${name} value: ${value}`); + let result = false; + try { + result = settings.setValueSync(this.helper, name, value); + } catch (e) { + Log.showError(TAG, `setValue e: ${JSON.stringify(e)}`); } + Log.showDebug(TAG, `setValue, result: ${result}`); + return result; + } } let sSettingsUtil = createOrGet(SettingsUtil, TAG); -export default sSettingsUtil as SettingsUtil; \ No newline at end of file +export default sSettingsUtil; \ No newline at end of file diff --git a/common/src/main/ets/default/SingleInstanceHelper.ts b/common/src/main/ets/default/SingleInstanceHelper.ts index b4ffcae7..b7cda798 100644 --- a/common/src/main/ets/default/SingleInstanceHelper.ts +++ b/common/src/main/ets/default/SingleInstanceHelper.ts @@ -16,7 +16,7 @@ import Log from './Log'; import audio from '@ohos.multimedia.audio'; -const TAG = "SingleInstanceHelper"; +const TAG = 'SingleInstanceHelper'; const AUDIO_MANAGER_KEY = 'MultiMediaAudioManager'; export default function createOrGet(objectClass: { new(): T }, storageKey: string): T { @@ -30,7 +30,7 @@ export default function createOrGet(objectClass: { new(): T }, storageKey: st export function getAudioManager() { if (!globalThis[AUDIO_MANAGER_KEY]) { globalThis[AUDIO_MANAGER_KEY] = audio.getAudioManager(); - Log.showInfo(TAG, `Create Audio Manager.`); + Log.showInfo(TAG, 'Create Audio Manager.'); } return globalThis[AUDIO_MANAGER_KEY]; } diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts index 29686e81..7bd6ad9a 100644 --- a/common/src/main/ets/default/StyleConfiguration.ts +++ b/common/src/main/ets/default/StyleConfiguration.ts @@ -17,19 +17,19 @@ import StyleManager from './StyleManager'; import deviceInfo from '@ohos.deviceInfo'; const TAG = 'Common-StyleConfiguration'; -const deviceTypeInfo = deviceInfo.deviceType +const deviceTypeInfo = deviceInfo.deviceType; + +export class CommonStyle { + statusBarFontSize: Length = deviceTypeInfo === 'phone' ? '12fp' : '16fp'; + statusBarIconWidth: Length = '24vp'; + statusBarIconHeight: Length = '24vp'; + statusBarMarginLeftRight: Length = deviceTypeInfo === 'phone' ? '0vp' : '5vp'; + deviceTypeInfo = deviceTypeInfo; +} export default class StyleConfiguration { - static getCommonStyle() { - const key: string = TAG + "-Common"; - return StyleManager.getStyle(key, () => { - return { - statusBarFontSize: deviceTypeInfo === 'phone' ? '12fp' : '16fp', - statusBarIconWidth: '24vp', - statusBarIconHeight: '24vp', - statusBarMarginLeftRight: deviceTypeInfo === 'phone' ? '0vp' : '5vp', - deviceTypeInfo : deviceTypeInfo - }; - }); - } + static getCommonStyle(): CommonStyle { + const key: string = TAG + '-Common'; + return StyleManager.getStyle(key, () => new CommonStyle()); + } } \ No newline at end of file diff --git a/common/src/main/ets/default/StyleManager.ts b/common/src/main/ets/default/StyleManager.ts index d9e49622..644f8ac5 100644 --- a/common/src/main/ets/default/StyleManager.ts +++ b/common/src/main/ets/default/StyleManager.ts @@ -18,24 +18,24 @@ import Log from './Log'; const TAG = 'Common-StyleManager'; export class StyleManager { - mAbilityPageName: string = ''; + mAbilityPageName = ''; - setAbilityPageName(name: string): void{ - Log.showInfo(TAG, `setAbilityPageName, name: ${name}`); - this.mAbilityPageName = name; - } + setAbilityPageName(name: string): void{ + Log.showInfo(TAG, `setAbilityPageName, name: ${name}`); + this.mAbilityPageName = name; + } - getStyle(key: string, generateDefaultFunction: Function) { - let newKey = this.mAbilityPageName + '-' + key; - if (!AppStorage.Has(newKey)) { - let defaultStyle = generateDefaultFunction(); - AppStorage.SetOrCreate(newKey, defaultStyle); - Log.showInfo(TAG, `Create storageKey of ${newKey}`); - } - return AppStorage.Get(newKey); + getStyle(key: string, generateDefaultFunction: () => T): T { + let newKey = this.mAbilityPageName + '-' + key; + if (!AppStorage.Has(newKey)) { + let defaultStyle = generateDefaultFunction(); + AppStorage.SetOrCreate(newKey, defaultStyle); + Log.showInfo(TAG, `Create storageKey of ${newKey}`); } + return AppStorage.Get(newKey) as T; + } } let styleManager = new StyleManager(); -export default styleManager as StyleManager; \ No newline at end of file +export default styleManager; \ No newline at end of file diff --git a/common/src/main/ets/default/TintStateManager.ts b/common/src/main/ets/default/TintStateManager.ts index 9c6130b4..fe462018 100644 --- a/common/src/main/ets/default/TintStateManager.ts +++ b/common/src/main/ets/default/TintStateManager.ts @@ -13,89 +13,88 @@ * limitations under the License. */ -import Window from "@ohos.window"; -import display from "@ohos.display"; -import Log from "./Log"; -import {WindowType, Rect, getWindowName} from "./Constants"; -import getSingleInstance from "./SingleInstanceHelper"; +import Window from '@ohos.window'; +import display from '@ohos.display'; +import Log from './Log'; +import { WindowType, Rect, getWindowName } from './Constants'; +import getSingleInstance from './SingleInstanceHelper'; -const TAG = "TintStateManager"; -const LISTENER_SYSTEM_BAR_TINT_CHANGE = "systemBarTintChange"; +const TAG = 'TintStateManager'; +const LISTENER_SYSTEM_BAR_TINT_CHANGE = 'systemBarTintChange'; -export type TintStateListener = { onTintStateChange: (state: TintState) => void } -; +export interface TintStateListener { onTintStateChange(state: TintState): void } export interface TintState { - isEnable?: boolean; - region?: Rect; - backgroundColor?: string; - contentColor?: string; + isEnable?: boolean; + region?: Rect; + backgroundColor?: string; + contentColor?: string; } export class TintContentInfo { - contentColor: string = "#FFFFFFFF"; + contentColor = '#FFFFFFFF'; } export function getOrCreateTintContentInfo(key: string): TintContentInfo { - let storageKey = 'SystemUI_TintContentInfo_' + key; - if (!AppStorage.Has(storageKey)) { - AppStorage.SetOrCreate(storageKey, new TintContentInfo()); - Log.showInfo(TAG, `getOrCreateTintContentInfo, Create storageKey of ${storageKey}`); - } - return AppStorage.Get(storageKey); + let storageKey = 'SystemUI_TintContentInfo_' + key; + if (!AppStorage.Has(storageKey)) { + AppStorage.SetOrCreate(storageKey, new TintContentInfo()); + Log.showInfo(TAG, `getOrCreateTintContentInfo, Create storageKey of ${storageKey}`); + } + return AppStorage.Get(storageKey); } export default class TintStateManager { - mListeners: Map = new Map(); - mStates: Map = new Map(); + mListeners: Map = new Map(); + mStates: Map = new Map(); - static getInstance(): TintStateManager { - return getSingleInstance(TintStateManager, TAG); - } + static getInstance(): TintStateManager { + return getSingleInstance(TintStateManager, TAG); + } - constructor() { - Log.showDebug(TAG, `init TintStateManager. ${LISTENER_SYSTEM_BAR_TINT_CHANGE}`); - Window.on(LISTENER_SYSTEM_BAR_TINT_CHANGE, this.onSystemBarTintChange.bind(this)); - } + constructor() { + Log.showDebug(TAG, `init TintStateManager. ${LISTENER_SYSTEM_BAR_TINT_CHANGE}`); + Window.on(LISTENER_SYSTEM_BAR_TINT_CHANGE, this.onSystemBarTintChange.bind(this)); + } - registerListener(windowType: WindowType, listener: TintStateListener) { - let tintState = this.mStates.get(windowType); - tintState && listener.onTintStateChange(tintState); - let res = this.mListeners.set(windowType, listener); - Log.showDebug(TAG, `registser listenerSize: ${res.size}`); - } + registerListener(windowType: WindowType, listener: TintStateListener): void { + let tintState = this.mStates.get(windowType); + tintState && listener.onTintStateChange(tintState); + let res = this.mListeners.set(windowType, listener); + Log.showDebug(TAG, `registser listenerSize: ${res.size}`); + } - unregisterListener(windowType: WindowType) { - let res = this.mListeners.delete(windowType); - Log.showDebug(TAG, `unregistser ${windowType}, res: ${res}`); - } + unregisterListener(windowType: WindowType): void { + let res = this.mListeners.delete(windowType); + Log.showDebug(TAG, `unregistser ${windowType}, res: ${res}`); + } - async onSystemBarTintChange(data) { - Log.showDebug(TAG, `onSystemBarTintChange, data: ${JSON.stringify(data)}`); - if (!Array.isArray(data.regionTint)) { - Log.showDebug(TAG, `regionTint is not array.`); - return; - } - let dis = await display.getDefaultDisplay(); - if (dis.id != data.displayId) { - Log.showDebug(TAG, `Needn't change, displayId: ${data.displayId}`); - return; - } - data.regionTint.forEach((regionTintData) => { - Log.showDebug(TAG, `onSystemBarTintChange, type: ${getWindowName(regionTintData["type"])}`); - let windowName = getWindowName(regionTintData["type"]); - if (!windowName) { - return; - } - let tintState: TintState = { - isEnable: regionTintData.isEnable, - region: regionTintData.region, - backgroundColor: regionTintData.backgroundColor, - contentColor: regionTintData.contentColor, - }; - Log.showDebug(TAG, `tintState: ${JSON.stringify(tintState)}`); - this.mStates.set(windowName, tintState); - this.mListeners.get(windowName)?.onTintStateChange(tintState); - }); + async onSystemBarTintChange(data): Promise { + Log.showDebug(TAG, `onSystemBarTintChange, data: ${JSON.stringify(data)}`); + if (!Array.isArray(data.regionTint)) { + Log.showDebug(TAG, 'regionTint is not array.'); + return; + } + let dis = await display.getDefaultDisplay(); + if (dis.id != data.displayId) { + Log.showDebug(TAG, `Needn't change, displayId: ${data.displayId}`); + return; } + data.regionTint.forEach((regionTintData) => { + Log.showDebug(TAG, `onSystemBarTintChange, type: ${getWindowName(regionTintData['type'])}`); + let windowName = getWindowName(regionTintData['type']); + if (!windowName) { + return; + } + let tintState: TintState = { + isEnable: regionTintData.isEnable, + region: regionTintData.region, + backgroundColor: regionTintData.backgroundColor, + contentColor: regionTintData.contentColor, + }; + Log.showDebug(TAG, `tintState: ${JSON.stringify(tintState)}`); + this.mStates.set(windowName, tintState); + this.mListeners.get(windowName)?.onTintStateChange(tintState); + }); + } } diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index fb044c2d..d1b73e0a 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -14,31 +14,35 @@ * limitations under the License. */ -import Window from "@ohos.window"; -import Log from "./Log"; -import EventManager from "./event/EventManager"; -import { obtainLocalEvent } from "./event/EventUtil"; -import { Rect } from "./Constants"; -import createOrGet from "./SingleInstanceHelper"; +import Window from '@ohos.window'; +import ServiceExtensionContext from 'application/ServiceExtensionContext'; +import Log from './Log'; +import EventManager from './event/EventManager'; +import { obtainLocalEvent } from './event/EventUtil'; +import { Rect } from './Constants'; +import createOrGet from './SingleInstanceHelper'; export type WindowInfo = { visibility: boolean; rect: Rect; }; + export enum WindowType { - STATUS_BAR = "SystemUi_StatusBar", - NAVIGATION_BAR = "SystemUi_NavigationBar", - DROPDOWN_PANEL = "SystemUi_DropdownPanel", - NOTIFICATION_PANEL = "SystemUi_NotificationPanel", - CONTROL_PANEL = "SystemUi_ControlPanel", - VOLUME_PANEL = "SystemUi_VolumePanel", + STATUS_BAR = 'SystemUi_StatusBar', + NAVIGATION_BAR = 'SystemUi_NavigationBar', + DROPDOWN_PANEL = 'SystemUi_DropdownPanel', + NOTIFICATION_PANEL = 'SystemUi_NotificationPanel', + CONTROL_PANEL = 'SystemUi_ControlPanel', + VOLUME_PANEL = 'SystemUi_VolumePanel', BANNER_NOTICE = 'SystemUi_BannerNotice' } -export const WINDOW_SHOW_HIDE_EVENT = "WindowShowHideEvent"; -export const WINDOW_RESIZE_EVENT = "WindowResizeEvent"; +export const WINDOW_SHOW_HIDE_EVENT = 'WindowShowHideEvent'; + +export const WINDOW_RESIZE_EVENT = 'WindowResizeEvent'; const TAG = "WindowManager"; + const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: Window.WindowType } = { SystemUi_StatusBar: Window.WindowType.TYPE_STATUS_BAR, SystemUi_NavigationBar: Window.WindowType.TYPE_NAVIGATION_BAR, @@ -48,6 +52,7 @@ const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: Window.WindowType } = { SystemUi_VolumePanel: Window.WindowType.TYPE_VOLUME_OVERLAY, SystemUi_BannerNotice: Window.WindowType.TYPE_VOLUME_OVERLAY, }; + const DEFAULT_WINDOW_INFO: WindowInfo = { visibility: false, rect: { left: 0, top: 0, width: 0, height: 0 }, @@ -59,7 +64,7 @@ const DEFAULT_WINDOW_INFO: WindowInfo = { class WindowManager { mWindowInfos: Map = new Map(); - async createWindow(context: any, name: WindowType, rect: Rect, loadContent: string): Promise { + async createWindow(context: ServiceExtensionContext, name: WindowType, rect: Rect, loadContent: string): Promise { Log.showInfo(TAG, `createWindow name: ${name}, rect: ${JSON.stringify(rect)}, url: ${loadContent}`); let winHandle = await Window.create(context, name, SYSTEM_WINDOW_TYPE_MAP[name]); await winHandle.moveTo(rect.left, rect.top); @@ -76,10 +81,10 @@ class WindowManager { await window.resetSize(rect.width, rect.height); this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), rect }); EventManager.publish( - obtainLocalEvent(WINDOW_RESIZE_EVENT, { - windowName: name, - rect, - }) + obtainLocalEvent(WINDOW_RESIZE_EVENT, { + windowName: name, + rect, + }) ); Log.showInfo(TAG, `resize window[${name}] success, rect: ${JSON.stringify(rect)}.`); } @@ -89,10 +94,10 @@ class WindowManager { await window.show(); this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), visibility: true }); EventManager.publish( - obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { - windowName: name, - isShow: true, - }) + obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { + windowName: name, + isShow: true, + }) ); Log.showInfo(TAG, `show window[${name}] success.`); } @@ -102,10 +107,10 @@ class WindowManager { await window.hide(); this.mWindowInfos.set(name, { ...(this.mWindowInfos.get(name) ?? DEFAULT_WINDOW_INFO), visibility: false }); EventManager.publish( - obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { - windowName: name, - isShow: false, - }) + obtainLocalEvent(WINDOW_SHOW_HIDE_EVENT, { + windowName: name, + isShow: false, + }) ); Log.showInfo(TAG, `hide window[${name}] success.`); } @@ -116,4 +121,5 @@ class WindowManager { } let sWindowManager = createOrGet(WindowManager, TAG); -export default sWindowManager as WindowManager; + +export default sWindowManager; diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/common/src/main/ets/default/abilitymanager/abilityManager.ts index ce891fdc..64b31c0e 100644 --- a/common/src/main/ets/default/abilitymanager/abilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/abilityManager.ts @@ -13,30 +13,32 @@ * limitations under the License. */ +import { BusinessError } from 'basic'; +import ServiceExtensionContext from 'application/ServiceExtensionContext'; +import Want from '@ohos.application.Want'; import Log from '../Log'; const TAG = 'AbilityManager'; export default class AbilityManager { - static ABILITY_NAME_ENTRY = 'SystemUi_Entry'; - static ABILITY_NAME_STATUS_BAR = 'SystemUi_StatusBar'; - static ABILITY_NAME_NAVIGATION_BAR = 'SystemUi_NavigationBar'; - static ABILITY_NAME_VOLUME_PANEL = 'SystemUi_VolumePanel'; - static ABILITY_NAME_NOTIFICATION_MANAGEMENT = 'SystemUi_NotificationManagement'; - static ABILITY_NAME_DROPDOWN_PANEL = 'SystemUi_DropdownPanel'; - static ABILITY_NAME_NOTIFICATION_PANEL = 'SystemUi_NotificationPanel'; - static ABILITY_NAME_CONTROL_PANEL = 'SystemUi_ControlPanel'; - static ABILITY_NAME_BANNER_NOTICE = 'SystemUi_BannerNotice'; - static ABILITY_NAME_APP_LIST = 'SystemUi_AppList'; + static readonly ABILITY_NAME_ENTRY = 'SystemUi_Entry'; + static readonly ABILITY_NAME_STATUS_BAR = 'SystemUi_StatusBar'; + static readonly ABILITY_NAME_NAVIGATION_BAR = 'SystemUi_NavigationBar'; + static readonly ABILITY_NAME_VOLUME_PANEL = 'SystemUi_VolumePanel'; + static readonly ABILITY_NAME_NOTIFICATION_MANAGEMENT = 'SystemUi_NotificationManagement'; + static readonly ABILITY_NAME_DROPDOWN_PANEL = 'SystemUi_DropdownPanel'; + static readonly ABILITY_NAME_NOTIFICATION_PANEL = 'SystemUi_NotificationPanel'; + static readonly ABILITY_NAME_CONTROL_PANEL = 'SystemUi_ControlPanel'; + static readonly ABILITY_NAME_BANNER_NOTICE = 'SystemUi_BannerNotice'; + static readonly ABILITY_NAME_APP_LIST = 'SystemUi_AppList'; + static readonly ABILITY_NAME_OWNER_WANT = 'Owner_Want'; - static ABILITY_NAME_OWNER_WANT = 'Owner_Want'; - - static setContext(abilityName: string, context) { + static setContext(abilityName: string, context: ServiceExtensionContext): void { Log.showDebug(TAG, `setContext, abilityName: ${abilityName}`); globalThis[abilityName + '_Context'] = context; } - static getContext(abilityName?: string) { + static getContext(abilityName?: string): ServiceExtensionContext { Log.showDebug(TAG, `getContext, abilityName: ${abilityName}`); if (!abilityName) { abilityName = AbilityManager.ABILITY_NAME_ENTRY; @@ -44,27 +46,29 @@ export default class AbilityManager { return globalThis[abilityName + '_Context']; } - static setAbilityData(abilityName, key, data) { + static setAbilityData(abilityName: string, key: string, data: any): void { Log.showDebug(TAG, `setAbilityData, abilityName: ${abilityName} key: ${key} data: ${JSON.stringify(data)}`); globalThis[abilityName + '_data_' + key] = data; } - static getAbilityData(abilityName, key) { + static getAbilityData(abilityName: string, key: string): any { Log.showDebug(TAG, `getAbilityData, abilityName: ${abilityName} key: ${key} `); return globalThis[abilityName + '_data_' + key]; } - static startAbility(want, callback?: Function) { + static startAbility(want: Want, callback?: (error?: BusinessError) => void): void { Log.showDebug(TAG, `startAbility, want: ${JSON.stringify(want)}`); - let context = AbilityManager.getContext(); + let context: ServiceExtensionContext = AbilityManager.getContext(); context.startAbility(want).then(() => { - Log.showInfo(TAG, `startAbility, then`); + Log.showInfo(TAG, 'startAbility, then'); if (callback) { - callback(null); + callback(); } - }).catch((error) => { + }).catch((error: BusinessError) => { Log.showError(TAG, `startAbility, error: ${JSON.stringify(error)}`); - callback(error); - }) + if (callback) { + callback(error); + } + }); } } diff --git a/common/src/main/ets/default/abilitymanager/notificationManager.ts b/common/src/main/ets/default/abilitymanager/notificationManager.ts index 4c8d6624..a07f8ca7 100644 --- a/common/src/main/ets/default/abilitymanager/notificationManager.ts +++ b/common/src/main/ets/default/abilitymanager/notificationManager.ts @@ -13,42 +13,44 @@ * limitations under the License. */ -//import { NotificationSubscriber } from './notification/notificationSubscriber'; import Notification from '@ohos.notification'; +import { AsyncCallback } from 'basic'; +import { NotificationSubscriber } from 'notification/notificationSubscriber'; +import { NotificationRequest } from 'notification/notificationRequest'; import Log from '../Log'; const TAG = 'NotificationManager'; export default class NotificationManager { + static readonly TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; + static readonly TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; + static readonly TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; - static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; - static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; - static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; - - static subscribeNotification(tag, subscriber, asyncCallback) { - Log.showDebug(TAG, `subscribeNotification from: ${tag}`)); + static subscribeNotification(tag: string, subscriber: NotificationSubscriber, asyncCallback: AsyncCallback): void { + Log.showDebug(TAG, `subscribeNotification from: ${tag}`); Notification.subscribe(subscriber, asyncCallback); } - static unsubscribeNotification(tag, subscriber) { - Log.showDebug(TAG, `subscribeNotification from: ${tag}`)); - Notification.unsubscribe(subscriber); + static unsubscribeNotification(tag: string, subscriber: NotificationSubscriber): void { + Log.showDebug(TAG, `subscribeNotification from: ${tag}`); + Notification.unsubscribe(subscriber).then(() => { + }).catch(err => { + }); } - static removeAll(tag, callback) { - Log.showDebug(TAG, `removeAll from: ${tag}`)); + static removeAll(tag: string, callback: AsyncCallback): void { + Log.showDebug(TAG, `removeAll from: ${tag}`); Notification.removeAll(callback); } - static remove(tag, hashCode, callback) { - Log.showDebug(TAG, `remove from: ${tag}`)); - Notification.remove(hashCode, callback) + static remove(tag: string, hashCode: string, callback: AsyncCallback): void { + Log.showDebug(TAG, `remove from: ${tag}`); + Notification.remove(hashCode, callback); } - static getAllActiveNotifications(tag, callback) { - Log.showDebug(TAG, `getAllActiveNotifications from: ${tag}`)); + static getAllActiveNotifications(tag: string, callback: AsyncCallback): void { + Log.showDebug(TAG, `getAllActiveNotifications from: ${tag}`); Notification.getAllActiveNotifications(callback); } - } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts index d1c01c98..34137068 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts @@ -13,148 +13,148 @@ * limitations under the License. */ -import worker from "@ohos.worker"; -import Log from "../default/Log"; -import BundleManager from "../default/abilitymanager/bundleManager"; +import worker from '@ohos.worker'; +import Log from '../default/Log'; +import BundleManager from '../default/abilitymanager/bundleManager'; import { Want } from 'ability/want'; -import Constants, { ItemComponentData, obtainMsg, RootConfigInfo } from "./common/Constants"; -import Context from "application/ServiceExtensionContext"; +import Constants, { ItemComponentData, obtainMsg, RootConfigInfo } from './common/Constants'; +import ServiceExtensionContext from 'application/ServiceExtensionContext'; import PluginSourceLoaderPatch from './sourceloader/PluginSourceLoaderPatch' -export type pluginWorkerListener = { - initFinish: () => void; - onItemAdd: (data: ItemComponentData) => void; - onItemRemove: (data: ItemComponentData) => void; +export interface PluginWorkerListener { + initFinish(): void; + onItemAdd(data: ItemComponentData): void; + onItemRemove(data: ItemComponentData): void; }; -const TAG = "PluginDataSourceAdapter"; +const TAG = 'PluginDataSourceAdapter'; export default class PluginDataSourceAdapter { - mContext: Context; - mWorker: any; - mName: string; - mListener: pluginWorkerListener; - mWant: Want; - mPluginSourceLoaderPatch: PluginSourceLoaderPatch; - mModuleName: string; - - constructor(name: string, context: Context, listener: pluginWorkerListener, moduleName: string) { - Log.showDebug(TAG, `constructor, name: ${name}`); - this.mName = name; - this.mContext = context; - this.mListener = listener; - this.mModuleName = moduleName; - const WORKER_JS_URL = this.mModuleName + "/ets/workers/PluginDataSourceWorker.js"; - this.mWorker = new worker.Worker(WORKER_JS_URL, { - type: "classic", - name: this.mName, - }); - - this.mWorker.onmessage = this.onMessage.bind(this); - this.mWorker.onmessageerror = this.onMessageError.bind(this); - this.mWorker.onexit = this.onExit.bind(this); - this.mWorker.onerror = this.onError.bind(this); - } - - setWant(want: Want): void{ - this.mWant = want; - } - - initDataSource(configs: RootConfigInfo) { - Log.showDebug(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`); - this.mWorker.postMessage(obtainMsg(Constants.INIT_CONFIG, configs)); - if (configs.loaderConfig.PluginSourceLoader) { - this.mPluginSourceLoaderPatch = new PluginSourceLoaderPatch(this.mWant, this); - } - } - - loadData(userId: number) { - Log.showDebug(TAG, `loadData`); - this.mWorker.postMessage(obtainMsg(Constants.LOAD_DATA, userId)); - } - - clearAll() { - Log.showDebug(TAG, `clearAll`); - this.mWorker.postMessage(obtainMsg(Constants.CLEAR_ALL, {})); - this.mPluginSourceLoaderPatch?.clearAll(); - } - - onMessage(msg: { data: any }) { - Log.showDebug(TAG, `onMessage, msg: ${JSON.stringify(msg)}`); - let data = msg.data; - switch (data.action) { - case Constants.INIT_FINISH: - this.onInitFinish(); - break; - case Constants.ADD_ITEM: - this.onItemAdd(data.data); - break; - case Constants.REMOVE_ITEM: - this.onItemRemove(data.data); - break; - case Constants.LOAD_PLUGIN_COMPONENT_DATA: - this.onLoadPluginComponentData(data.data).then(() => { - }).catch(err => { - }); - break; - default: - Log.showError(TAG, `unknown type: ${JSON.stringify(msg)}`); - } - } - - onInitFinish() { - Log.showDebug(TAG, `onInitFinish`); - this.mListener.initFinish(); - } - - async onItemAdd(itemData: ItemComponentData) { - Log.showDebug(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); - itemData.label && (itemData.label = decodeURIComponent(itemData.label)); - if (itemData.label && itemData.iconUrl) { - this.mListener.onItemAdd(itemData); - return; - } - let manager = await BundleManager.getResourceManager(TAG, this.mContext, itemData.bundleName); - Log.showDebug(TAG, `${itemData.id} Can't find label or icon, fetch data from ${manager}`); - if (manager) { - Promise.all([ - itemData.iconUrl ?? manager.getMediaBase64(itemData.abilityIconId), - itemData.label ?? manager.getString(itemData.abilityLabelId), - ]) - .then(([iconValue, labelValue]) => { - iconValue && (itemData.iconUrl = iconValue); - labelValue && (itemData.label = labelValue); - this.mListener.onItemAdd(itemData); - }) - .catch((err) => Log.showError(TAG, `Can't get bundle info, err: ${JSON.stringify(err)}`)); - } - } - - onItemRemove(itemData: ItemComponentData) { - Log.showDebug(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); - this.mListener.onItemRemove(itemData); - } - - async onLoadPluginComponentData(itemData: ItemComponentData): Promise { - Log.showDebug(TAG, `name: ${this.mName}, onLoadPluginComponentData, itemData: ${JSON.stringify(itemData)}`); - let ret = await this.mPluginSourceLoaderPatch?.requestPluginComponentData(itemData); - this.mWorker.postMessage(obtainMsg(Constants.UPDATE_PLUGIN_COMPONENT_DATA, ret)); + mContext: ServiceExtensionContext; + mWorker; + mName: string; + mListener: PluginWorkerListener; + mWant: Want; + mPluginSourceLoaderPatch: PluginSourceLoaderPatch; + mModuleName: string; + + constructor(name: string, context: ServiceExtensionContext, listener: PluginWorkerListener, moduleName: string) { + Log.showDebug(TAG, `constructor, name: ${name}`); + this.mName = name; + this.mContext = context; + this.mListener = listener; + this.mModuleName = moduleName; + const WORKER_JS_URL = this.mModuleName + '/ets/workers/PluginDataSourceWorker.js'; + this.mWorker = new worker.Worker(WORKER_JS_URL, { + type: 'classic', + name: this.mName, + }); + + this.mWorker.onmessage = this.onMessage.bind(this); + this.mWorker.onmessageerror = this.onMessageError.bind(this); + this.mWorker.onexit = this.onExit.bind(this); + this.mWorker.onerror = this.onError.bind(this); + } + + setWant(want: Want): void{ + this.mWant = want; + } + + initDataSource(configs: RootConfigInfo): void { + Log.showDebug(TAG, `name: ${this.mName}, initDataSource, configs: ${JSON.stringify(configs)}`); + this.mWorker.postMessage(obtainMsg(Constants.INIT_CONFIG, configs)); + if (configs.loaderConfig.PluginSourceLoader) { + this.mPluginSourceLoaderPatch = new PluginSourceLoaderPatch(this.mWant, this); } - - async onUpdatePluginComponentData(pluginComponentData: ItemComponentData): Promise { - Log.showDebug(TAG, `name: ${this.mName}, onUpdatePluginComponentData, pluginComponentData: ${JSON.stringify(pluginComponentData)}`); - this.mWorker.postMessage(obtainMsg(Constants.UPDATE_PLUGIN_COMPONENT_DATA, pluginComponentData)); - } - - onMessageError(event: any) { - Log.showError(TAG, `mWorker.onmessageerror, event: ${event}`); + } + + loadData(userId: number): void { + Log.showDebug(TAG, `name: ${this.mName}, loadData`); + this.mWorker.postMessage(obtainMsg(Constants.LOAD_DATA, userId)); + } + + clearAll(): void { + Log.showDebug(TAG, `name: ${this.mName}, clearAll`); + this.mWorker.postMessage(obtainMsg(Constants.CLEAR_ALL, {})); + this.mPluginSourceLoaderPatch?.clearAll(); + } + + onMessage(msg: { data }): void { + Log.showDebug(TAG, `name: ${this.mName}, onMessage, msg: ${JSON.stringify(msg)}`); + let data = msg.data; + switch (data.action) { + case Constants.INIT_FINISH: + this.onInitFinish(); + break; + case Constants.ADD_ITEM: + this.onItemAdd(data.data); + break; + case Constants.REMOVE_ITEM: + this.onItemRemove(data.data); + break; + case Constants.LOAD_PLUGIN_COMPONENT_DATA: + this.onLoadPluginComponentData(data.data).then(() => { + }).catch(err => { + }); + break; + default: + Log.showError(TAG, `name: ${this.mName}, unknown type: ${JSON.stringify(msg)}`); } - - onExit(code: any) { - Log.showDebug(TAG, `mWorker.onexit, code: ${code}`); + } + + onInitFinish(): void { + Log.showDebug(TAG, `name: ${this.mName}, onInitFinish`); + this.mListener.initFinish(); + } + + async onItemAdd(itemData: ItemComponentData): Promise { + Log.showDebug(TAG, `name: ${this.mName}, onItemAdd, itemData: ${JSON.stringify(itemData)}`); + itemData.label && (itemData.label = decodeURIComponent(itemData.label)); + if (itemData.label && itemData.iconUrl) { + this.mListener.onItemAdd(itemData); + return; } - - onError(err: any) { - Log.showError(TAG, `mWorker.onerror, err: ${JSON.stringify(err)}`); + let manager = await BundleManager.getResourceManager(TAG, this.mContext, itemData.bundleName); + Log.showDebug(TAG, `name: ${this.mName}, ${itemData.id} Can't find label or icon, fetch data from ${manager}`); + if (manager) { + Promise.all([ + itemData.iconUrl ?? manager.getMediaBase64(itemData.abilityIconId), + itemData.label ?? manager.getString(itemData.abilityLabelId), + ]) + .then(([iconValue, labelValue]) => { + iconValue && (itemData.iconUrl = iconValue); + labelValue && (itemData.label = labelValue); + this.mListener.onItemAdd(itemData); + }) + .catch((err) => Log.showError(TAG, `name: ${this.mName}, Can't get bundle info, err: ${JSON.stringify(err)}`)); } + } + + onItemRemove(itemData: ItemComponentData): void { + Log.showDebug(TAG, `name: ${this.mName}, onItemRemove, itemData: ${JSON.stringify(itemData)}`); + this.mListener.onItemRemove(itemData); + } + + async onLoadPluginComponentData(itemData: ItemComponentData): Promise { + Log.showDebug(TAG, `name: ${this.mName}, onLoadPluginComponentData, itemData: ${JSON.stringify(itemData)}`); + let ret = await this.mPluginSourceLoaderPatch?.requestPluginComponentData(itemData); + this.mWorker.postMessage(obtainMsg(Constants.UPDATE_PLUGIN_COMPONENT_DATA, ret)); + } + + async onUpdatePluginComponentData(pluginComponentData: ItemComponentData): Promise { + Log.showDebug(TAG, `name: ${this.mName}, onUpdatePluginComponentData, pluginComponentData: ${JSON.stringify(pluginComponentData)}`); + this.mWorker.postMessage(obtainMsg(Constants.UPDATE_PLUGIN_COMPONENT_DATA, pluginComponentData)); + } + + onMessageError(event): void { + Log.showDebug(TAG, `name: ${this.mName}, mWorker.onmessageerror, event: ${JSON.stringify(event)}`); + } + + onExit(code: number): void { + Log.showDebug(TAG, `name: ${this.mName}, mWorker.onexit, code: ${code}`); + } + + onError(err): void { + Log.showDebug(TAG, `name: ${this.mName}, mWorker.onerror, err: ${JSON.stringify(err)}`); + } } diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts index 0b7bb7c1..be49c587 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceManager.ts @@ -13,122 +13,124 @@ * limitations under the License. */ -import Log from "../default/Log"; -import SourceLoaderFactory from "./sourceloader/SourceLoaderFactory"; -import SourceLoader from "./sourceloader/SourceLoader"; +import Log from '../default/Log'; +import SourceLoaderFactory from './sourceloader/SourceLoaderFactory'; +import SourceLoader from './sourceloader/SourceLoader'; import PluginSourceLoader from './sourceloader/PluginSourceLoader'; -import { FilterData, ItemComponentData, RootConfigInfo } from "./common/Constants"; +import { FilterData, ItemComponentData, RootConfigInfo } from './common/Constants'; import { - AbilityInfoWithId, - BundleEventType, - ListenerHandle, - queryAbility, - registerBundleListener, -} from "./common/BundleParseUtil"; -import { AbilityInfo } from "bundle/abilityInfo"; -import { ExtensionAbilityInfo } from "bundle/extensionAbilityInfo"; + AbilityInfoWithId, + BundleEventType, + ListenerHandle, + queryAbility, + registerBundleListener, +} from './common/BundleParseUtil'; +import { AbilityInfo } from 'bundle/abilityInfo'; +import { ExtensionAbilityInfo } from 'bundle/extensionAbilityInfo'; export type PluginListener = { - onItemAdd: (itemData: ItemComponentData) => void; - onItemRemove: (itemData: ItemComponentData) => void; - onLoadPluginComponentData: (itemData: ItemComponentData) => void; + onItemAdd: (itemData: ItemComponentData) => void; + onItemRemove: (itemData: ItemComponentData) => void; + onLoadPluginComponentData: (itemData: ItemComponentData) => void; }; -const TAG = "PluginDataSourceManager"; +const TAG = 'PluginDataSourceManager'; const INVALID_USERID = -1; export default class PluginDataSourceManager { - mAction: string = ""; - mUserId: number = INVALID_USERID; - mListenerHandle: ListenerHandle | undefined = undefined; - mFilterDatas: Map = new Map(); - mLoaders: Map = new Map(); - mFactory: SourceLoaderFactory; + mAction = ''; + mUserId: number = INVALID_USERID; + mListenerHandle: ListenerHandle | undefined = undefined; + mFilterDatas: Map = new Map(); + mLoaders: Map = new Map(); + mFactory: SourceLoaderFactory; - constructor(listener: PluginListener) { - this.mFactory = new SourceLoaderFactory({ - add: listener.onItemAdd, - remove: listener.onItemRemove, - onLoadPluginComponentData: listener.onLoadPluginComponentData, - }); - } + constructor(listener: PluginListener) { + this.mFactory = new SourceLoaderFactory({ + add: listener.onItemAdd, + remove: listener.onItemRemove, + onLoadPluginComponentData: listener.onLoadPluginComponentData, + }); + } - initDataSource(configs: RootConfigInfo) { - Log.showDebug(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`); - this.mAction = configs.action; - configs.filterDatas.forEach((data: FilterData) => this.mFilterDatas.set(data.abilityName, data.id)); - for (let pluginType in configs.loaderConfig) { - const sourceLoader = this.mFactory.getSourceLoader(pluginType, configs.loaderConfig[pluginType]); - if (sourceLoader instanceof SourceLoader) { - this.mLoaders.set(pluginType, sourceLoader); - Log.showInfo(TAG, `getSourceLoader plugin: ${pluginType}, loader${this.mLoaders.get(pluginType)}`); - } - } - Log.showDebug(TAG, `action:${this.mAction}, filterData: ${JSON.stringify(this.mFilterDatas)}`); - registerBundleListener(this, (handle) => { - this.mListenerHandle = handle; - }); + initDataSource(configs: RootConfigInfo): void { + Log.showDebug(TAG, `initDataSource, configs: ${JSON.stringify(configs)}`); + this.mAction = configs.action; + configs.filterDatas.forEach((data: FilterData) => this.mFilterDatas.set(data.abilityName, data.id)); + for (let pluginType in configs.loaderConfig) { + const sourceLoader = this.mFactory.getSourceLoader(pluginType, configs.loaderConfig[pluginType]); + if (sourceLoader instanceof SourceLoader) { + this.mLoaders.set(pluginType, sourceLoader); + Log.showInfo(TAG, `getSourceLoader plugin: ${pluginType}, loader${this.mLoaders.get(pluginType)}`); + } } + Log.showDebug(TAG, `action:${this.mAction}, filterData: ${JSON.stringify(this.mFilterDatas)}`); + registerBundleListener(this, (handle) => { + this.mListenerHandle = handle; + }); + } - async onBundleNotify(bundleName: string, event: BundleEventType) { - Log.showDebug(TAG, `onBundleNotify, bundleName: ${bundleName}, event: ${event}`); - if (event == BundleEventType.BUNDLE_CHANGE || event == BundleEventType.BUNDLE_REMOVE) { - this.mLoaders.forEach((loader) => loader.onBundleRemove(bundleName)); - } - if (event == BundleEventType.BUNDLE_CHANGE || event == BundleEventType.BUNDLE_ADD) { - let abilityInfos = await queryAbility(this.mAction, this.mUserId, bundleName); - Log.showInfo(TAG, `abilityInfos: ${JSON.stringify(abilityInfos)}`); - abilityInfos.forEach((info) => this.notifyAbilityAdd(info)); - } + async onBundleNotify(bundleName: string, event: BundleEventType): Promise { + Log.showDebug(TAG, `onBundleNotify, bundleName: ${bundleName}, event: ${event}`); + if (event == BundleEventType.BUNDLE_CHANGE || event == BundleEventType.BUNDLE_REMOVE) { + this.mLoaders.forEach((loader) => loader.onBundleRemove(bundleName)); } - - clearAll() { - Log.showDebug(TAG, `clearAll`); - this.unregisterListener(); - this.mLoaders.forEach((sourceLoader) => sourceLoader.clearData()); + if (event == BundleEventType.BUNDLE_CHANGE || event == BundleEventType.BUNDLE_ADD) { + let abilityInfos = await queryAbility(this.mAction, this.mUserId, bundleName); + Log.showInfo(TAG, `abilityInfos: ${JSON.stringify(abilityInfos)}`); + abilityInfos.forEach((info) => this.notifyAbilityAdd(info)); } + } - async loadData(userId: number) { - Log.showDebug(TAG, `loadData, userId: ${userId}, this.mUserId: ${this.mUserId}`); - if (this.mUserId != userId) { - this.mUserId = userId; - this.mLoaders.forEach((sourceLoader) => sourceLoader.clearData()); - let abilityInfos = await queryAbility(this.mAction, this.mUserId); - Log.showDebug(TAG, `loadData, abilityInfos: ${JSON.stringify(abilityInfos)}`); - abilityInfos.forEach((info) => this.notifyAbilityAdd(info)); - } - this.mLoaders.forEach((sourceLoader) => sourceLoader.reloadData(this.mUserId)); - } + clearAll(): void { + Log.showDebug(TAG, 'clearAll'); + this.unregisterListener(); + this.mLoaders.forEach((sourceLoader) => sourceLoader.clearData()); + } - private notifyAbilityAdd(info: AbilityInfo | ExtensionAbilityInfo) { - Log.showDebug(TAG, `notifyAbilityAdd, info: ${JSON.stringify(info)}`); - let itemId = this.mFilterDatas.get(info.name); - if (!itemId) { - Log.showError(TAG, `notifyAbilityAdd, can't find itemId, ability:${info.name}`); - return; - } - let abilityInfo: AbilityInfoWithId = { - ...info, - itemId: itemId, - }; - if ((!abilityInfo.metaData || !abilityInfo.metaData.length) && (!abilityInfo.metadata || !abilityInfo.metadata.length) ) { - Log.showError(TAG, `Can't find metadata, abilityId: ${abilityInfo.name}`); - return; - } - this.mLoaders.forEach((loader) => loader.onAbilityAdd(abilityInfo)); + async loadData(userId: number): Promise { + Log.showDebug(TAG, `loadData, userId: ${userId}, this.mUserId: ${this.mUserId}`); + if (this.mUserId != userId) { + Log.showDebug(TAG, `loadData, queryAbility`); + this.mUserId = userId; + this.mLoaders.forEach((sourceLoader) => sourceLoader.clearData()); + let abilityInfos = await queryAbility(this.mAction, this.mUserId); + Log.showDebug(TAG, `loadData, abilityInfos: ${JSON.stringify(abilityInfos)}`); + abilityInfos.forEach((info) => this.notifyAbilityAdd(info)); } + this.mLoaders.forEach((sourceLoader) => sourceLoader.reloadData(this.mUserId)); + Log.showDebug(TAG, `loadData, end`); + } - private unregisterListener() { - this.mListenerHandle?.unRegister(); - this.mListenerHandle = undefined; + private notifyAbilityAdd(info: AbilityInfo | ExtensionAbilityInfo): void { + Log.showDebug(TAG, `notifyAbilityAdd, info: ${JSON.stringify(info)}`); + let itemId = this.mFilterDatas.get(info.name); + if (!itemId) { + Log.showError(TAG, `notifyAbilityAdd, can't find itemId, ability:${info.name}`); + return; } - - async updatePluginComponentData(pluginComponentData: ItemComponentData): Promise { - Log.showInfo(TAG, 'updatePluginComponentData'); - this.mLoaders.forEach((loader) => { - if (loader instanceof PluginSourceLoader) { - (loader as PluginSourceLoader).onUpdatePluginComponentData(pluginComponentData); - } - }); + let abilityInfo: AbilityInfoWithId = { + ...info, + itemId: itemId, + }; + if ((!abilityInfo.metaData || !abilityInfo.metaData.length) && (!abilityInfo.metadata || !abilityInfo.metadata.length)) { + Log.showError(TAG, `Can't find metadata, abilityId: ${abilityInfo.name}`); + return; } + this.mLoaders.forEach((loader) => loader.onAbilityAdd(abilityInfo)); + } + + private unregisterListener(): void { + this.mListenerHandle?.unRegister(); + this.mListenerHandle = undefined; + } + + async updatePluginComponentData(pluginComponentData: ItemComponentData): Promise { + Log.showInfo(TAG, 'updatePluginComponentData'); + this.mLoaders.forEach((loader) => { + if (loader instanceof PluginSourceLoader) { + (loader as PluginSourceLoader).onUpdatePluginComponentData(pluginComponentData); + } + }); + } } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts index a808d8c5..5f513f02 100644 --- a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts +++ b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts @@ -13,14 +13,16 @@ * limitations under the License. */ -import bundleManager from "@ohos.bundle"; -import { ExtensionAbilityInfo } from "bundle/extensionAbilityInfo"; -import commonEvent from "@ohos.commonEvent"; -import { AbilityInfo } from "bundle/abilityInfo"; -import Log from "../../default/Log"; -import switchUserManager from "../../default/SwitchUserManager" +import bundleManager from '@ohos.bundle'; +import commonEvent from '@ohos.commonEvent'; +import { AbilityInfo } from 'bundle/abilityInfo'; +import { ExtensionAbilityInfo } from 'bundle/extensionAbilityInfo'; +import { CustomizeData } from 'bundle/customizeData'; +import { Metadata } from 'bundle/metadata'; +import Log from '../../default/Log'; +import switchUserManager from '../../default/SwitchUserManager'; -export type AbilityInfoWithId = AbilityInfo & { itemId: string }; +export type AbilityInfoWithId = (AbilityInfo | ExtensionAbilityInfo) & { itemId: string }; export type BundleListener = { onBundleNotify: (bundleName: string, event: BundleEventType) => void; }; @@ -38,7 +40,7 @@ export enum BundleEventType { UNKNOWN_EVENT, } -const TAG = "SourceLoader-BundleParseUtil"; +const TAG = 'SourceLoader-BundleParseUtil'; const DEFAULT_BUNDLE_FLAG = bundleManager.BundleFlag.GET_ABILITY_INFO_WITH_METADATA | bundleManager.BundleFlag.GET_ABILITY_INFO_WITH_PERMISSION; const EXTENSIONTYPE = 20; @@ -51,67 +53,78 @@ const BUNDLE_SUBSCRIBE_INFO = { ], }; -export async function queryAbility(action: string, userId: number, bundleName?: string): Promise> { +export async function queryAbility(action: string, userId: number, bundleName?: string): Promise<(AbilityInfo | ExtensionAbilityInfo)[]> { Log.showDebug(TAG, `queryAbility, action: ${action} , userId: ${userId}`); if (bundleName) { Log.showDebug(TAG, `queryAbility, bundleName: ${bundleName}`); - let abilitys = []; - try { - abilitys = await bundleManager.queryAbilityByWant( - { - action: action, - bundleName: bundleName, - }, - DEFAULT_BUNDLE_FLAG, - userId - ); - } catch (error) { - Log.showError(TAG, `queryAbility, queryAbilityByWant error: ${JSON.stringify(error)}`); - } - let extensionAbilitys = []; - try { - extensionAbilitys = await bundleManager.queryExtensionAbilityInfos( - { - action: action, - bundleName: bundleName, - }, - EXTENSIONTYPE, - DEFAULT_BUNDLE_FLAG, - userId - ); - } catch (error) { - Log.showError(TAG, `queryAbility, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); - } - Log.showDebug(TAG, `queryAbility, end`); - let rets = [...abilitys, ...extensionAbilitys]; - Log.showDebug(TAG, `queryAbility, rets: ${JSON.stringify(rets)}`); - return rets; + return await queryAbilityWithBundleName(action, userId, bundleName); } - let abilitys = []; + return await queryAbilityWithoutBundleName(action, userId); +} + +async function queryAbilityWithBundleName(action: string, userId: number, bundleName: string): Promise<(AbilityInfo | ExtensionAbilityInfo)[]> { + Log.showInfo(TAG, `queryAbilityWithBundleName, action: ${action} bundleName: ${bundleName}`); + let abilitys: AbilityInfo[] = []; try { - abilitys = await bundleManager.queryAbilityByWant({ action: action }, DEFAULT_BUNDLE_FLAG, userId); + abilitys = await bundleManager.queryAbilityByWant( + { + action: action, + bundleName: bundleName, + }, + DEFAULT_BUNDLE_FLAG, + userId + ); } catch (error) { - Log.showError(TAG, `queryAbility, queryAbilityByWant error: ${JSON.stringify(error)}`); + Log.showError(TAG, `queryAbilityWithBundleName, queryAbilityByWant error: ${JSON.stringify(error)}`); } - let extensionAbilitys = []; + let extensionAbilitys: ExtensionAbilityInfo[] = []; try { - extensionAbilitys = await bundleManager.queryExtensionAbilityInfos({ action: action }, EXTENSIONTYPE, DEFAULT_BUNDLE_FLAG, userId); + extensionAbilitys = await bundleManager.queryExtensionAbilityInfos( + { + action: action, + bundleName: bundleName, + }, + EXTENSIONTYPE, + DEFAULT_BUNDLE_FLAG, + userId + ); } catch (error) { - Log.showError(TAG, `queryAbility, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); + Log.showError(TAG, `queryAbilityWithBundleName, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); } - Log.showDebug(TAG, `queryAbility, end`); + Log.showDebug(TAG, 'queryAbilityWithBundleName, end'); let rets = [...abilitys, ...extensionAbilitys]; - Log.showDebug(TAG, `queryAbility, rets: ${JSON.stringify(rets)}`); + Log.showDebug(TAG, `queryAbilityWithBundleName, rets: ${JSON.stringify(rets)}`); return rets; } +async function queryAbilityWithoutBundleName(action: string, userId: number): Promise<(AbilityInfo | ExtensionAbilityInfo)[]> { + Log.showInfo(TAG, `queryAbilityWithoutBundleName, action: ${action}`); + let abilitys: AbilityInfo[] = []; + try { + abilitys = await bundleManager.queryAbilityByWant({ action: action }, DEFAULT_BUNDLE_FLAG, userId); + } catch (error) { + Log.showError(TAG, `queryAbilityWithoutBundleName, queryAbilityByWant error: ${JSON.stringify(error)}`); + } + let extensionAbilitys: ExtensionAbilityInfo[] = []; + try { + extensionAbilitys = await bundleManager.queryExtensionAbilityInfos({ + action: action + }, EXTENSIONTYPE, DEFAULT_BUNDLE_FLAG, userId); + } catch (error) { + Log.showError(TAG, `queryAbilityWithoutBundleName, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); + } + Log.showDebug(TAG, 'queryAbilityWithoutBundleName, end'); + let rets = [...abilitys, ...extensionAbilitys]; + Log.showDebug(TAG, `queryAbilityWithoutBundleName, rets: ${JSON.stringify(rets)}`); + return rets; +} export function filterAbilityInfo(info: AbilityInfoWithId, filterKey: string): PluginData | undefined { Log.showInfo(TAG, `filterAbilityInfo, info: ${JSON.stringify(info)} filterKey: ${filterKey}`); - let pluginDatas = []; - if(info.metaData && info.metaData.length){ + let pluginDatas: (CustomizeData | Metadata)[] = []; + if (info.metaData && info.metaData.length) { pluginDatas = info.metaData.filter((data) => data.name == filterKey); - } else if(info.metadata && info.metadata.length){ + } else if (info.metadata && info.metadata.length) { pluginDatas = info.metadata.filter((data) => data.name == filterKey); } Log.showInfo(TAG, `filterAbilityInfo, pluginDatas: ${JSON.stringify(pluginDatas)}`); @@ -119,11 +132,11 @@ export function filterAbilityInfo(info: AbilityInfoWithId, filterKey: string): P Log.showDebug(TAG, `filterKey: ${filterKey}, metadata: ${JSON.stringify(info.metadata.values)}`); return undefined; } - let pluginData; - if(pluginDatas[0].value && pluginDatas[0].value.length > 0){ - pluginData = JSON.parse("{" + pluginDatas[0].value + "}"); - } else if(pluginDatas[0].extra && pluginDatas[0].extra.length > 0){ - pluginData = JSON.parse("{" + pluginDatas[0].extra + "}"); + let pluginData: PluginData; + if (pluginDatas[0].value && pluginDatas[0].value.length > 0) { + pluginData = JSON.parse('{' + pluginDatas[0].value + '}') as PluginData; + } else if (pluginDatas[0].extra && pluginDatas[0].extra.length > 0) { + pluginData = JSON.parse('{' + pluginDatas[0].extra + '}') as PluginData; } if (!pluginData) { Log.showError(TAG, `Can't parse pluginData: ${pluginDatas[0]}, filterKey: ${filterKey}`); @@ -133,7 +146,7 @@ export function filterAbilityInfo(info: AbilityInfoWithId, filterKey: string): P return pluginData; } -export function registerBundleListener(listener: BundleListener, callback: (handle: ListenerHandle) => void) { +export function registerBundleListener(listener: BundleListener, callback: (handle: ListenerHandle) => void): void { commonEvent.createSubscriber(BUNDLE_SUBSCRIBE_INFO, (err, handle) => { Log.showDebug(TAG, `registerBundleListener, err: ${JSON.stringify(err)}, handle: ${handle}`); if (err.code != 0) { @@ -150,7 +163,7 @@ export function registerBundleListener(listener: BundleListener, callback: (hand switchUserManager.getInstance() .getCurrentUserInfo() .then((userInfo) => { - if(data.parameters.userId != userInfo.userId) { + if (data.parameters.userId != userInfo.userId) { return; } else { let event = BundleEventType.UNKNOWN_EVENT; @@ -167,7 +180,7 @@ export function registerBundleListener(listener: BundleListener, callback: (hand default: Log.showError(TAG, `unknow event: ${event}`); } - listener.onBundleNotify(data.bundleName ?? "unkown", event); + listener.onBundleNotify(data.bundleName ?? 'unkown', event); } }); }); diff --git a/common/src/main/ets/plugindatasource/common/Constants.ts b/common/src/main/ets/plugindatasource/common/Constants.ts index c9f1e8c9..543b6693 100644 --- a/common/src/main/ets/plugindatasource/common/Constants.ts +++ b/common/src/main/ets/plugindatasource/common/Constants.ts @@ -13,72 +13,75 @@ * limitations under the License. */ -import { Event } from "../../default/Event/EventUtil"; +import { Event } from '../../default/event/EventUtil'; export default class Constants { - static INIT_CONFIG = "initConfig"; - static INIT_FINISH = "initFinish"; - static CLEAR_ALL = "clearAll"; - static ADD_ITEM = "addItem"; - static REMOVE_ITEM = "removeItem"; - static LOCAL_DEVICE = "local"; - static LOAD_DATA = "loadData"; - static readonly LOAD_PLUGIN_COMPONENT_DATA = 'loadPluginComponentData'; - static readonly UPDATE_PLUGIN_COMPONENT_DATA = 'updatePluginComponentData'; + static readonly INIT_CONFIG = 'initConfig'; + static readonly INIT_FINISH = 'initFinish'; + static readonly CLEAR_ALL = 'clearAll'; + static readonly ADD_ITEM = 'addItem'; + static readonly REMOVE_ITEM = 'removeItem'; + static readonly LOCAL_DEVICE = 'local'; + static readonly LOAD_DATA = 'loadData'; + static readonly LOAD_PLUGIN_COMPONENT_DATA = 'loadPluginComponentData'; + static readonly UPDATE_PLUGIN_COMPONENT_DATA = 'updatePluginComponentData'; } export type FilterData = { - id: string; - bundleName: string; - abilityName: string; + id: string; + bundleName: string; + abilityName: string; }; export type RootConfigInfo = { - action: string; - filterDatas: FilterData[]; - loaderConfig: { - [key in any]: LoaderConfigInfo; - }; + action: string; + filterDatas: FilterData[]; + loaderConfig: { + [key in any]: LoaderConfigInfo; + }; }; export type LoaderConfigInfo = { - [key: string]: any; + [key: string]: any; }; export enum PluginType { - META = 1, - DATA_ABILITY = 2, - PLUGIN_COMPONENT = 3, + META = 1, + DATA_ABILITY = 2, + PLUGIN_COMPONENT = 3, } -export function obtainMsg(action: string, data: any) { - return { action: action, data: data }; +export function obtainMsg(action: string, data: any): { + action: string, + data: any +} { + return { action: action, data: data }; } export type ItemComponentData = { - id: string; - pluginType: number; - deviceId: string; - bundleName: string; - abilityName: string; - abilityLabelId: number; - abilityIconId: number; - label?: string; - iconUrl?: Resource | string; - template?: string; - state?: any; - actionData?: ActionData; + id: string; + pluginType: number; + deviceId: string; + bundleName: string; + abilityName: string; + abilityLabelId: number; + abilityIconId: number; + label?: string; + iconUrl?: Resource | string; + template?: string; + state?: any; + actionData?: ActionData; } export class ActionData { - clickAction?: Event; - longClickAction?: Event; - launchType?: number; - pluginData?: PluginComponentData; - extra?: any; + clickAction?: Event; + longClickAction?: Event; + launchType?: number; + pluginData?: PluginComponentData; + extra?: any; } export class PluginComponentData { - template; - data; + template; + data; } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts index 504d43c7..09c82640 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/DataAbilitySourceLoader.ts @@ -13,21 +13,28 @@ * limitations under the License. */ -import Log from "../../default/Log"; -import { AbilityInfoWithId } from "../common/BundleParseUtil"; -import { LoaderConfigInfo } from "../common/Constants"; -import SourceLoader from "./SourceLoader"; +import Log from '../../default/Log'; +import { AbilityInfoWithId } from '../common/BundleParseUtil'; +import { LoaderConfigInfo } from '../common/Constants'; +import SourceLoader from './SourceLoader'; -const TAG = "DataAbilitySourceLoader"; +const TAG = 'DataAbilitySourceLoader'; export default class DataAbilitySourceLoader extends SourceLoader { - constructor(config: LoaderConfigInfo) { - super(config); - Log.showDebug(TAG, `constructor`); - } + constructor(config: LoaderConfigInfo) { + super(config); + Log.showDebug(TAG, 'constructor'); + } - clearData(): void {} - reloadData(userId: number): void {} - onAbilityAdd(abilityInfo: AbilityInfoWithId): void {} - onBundleRemove(bundleName: string): void {} + clearData(): void { + } + + reloadData(userId: number): void { + } + + onAbilityAdd(abilityInfo: AbilityInfoWithId): void { + } + + onBundleRemove(bundleName: string): void { + } } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts index 3ec5f2fe..c230dcc7 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts @@ -13,84 +13,84 @@ * limitations under the License. */ -import Log from "../../default/Log"; -import SourceLoader from "./SourceLoader"; -import Constants, { PluginType, ItemComponentData, LoaderConfigInfo } from "../common/Constants"; -import { AbilityInfoWithId, filterAbilityInfo, PluginData } from "../common/BundleParseUtil"; -import { parseEventString } from "../../default/Event/EventUtil"; +import Log from '../../default/Log'; +import SourceLoader from './SourceLoader'; +import Constants, { PluginType, ItemComponentData, LoaderConfigInfo } from '../common/Constants'; +import { AbilityInfoWithId, filterAbilityInfo, PluginData } from '../common/BundleParseUtil'; +import { parseEventString } from '../../default/event/EventUtil'; -const TAG = "MetaSourceLoader"; +const TAG = 'MetaSourceLoader'; export default class MetaSourceLoader extends SourceLoader { - mPluginFilter: string = ""; - mPermission: string = ""; - mItemDatas: ItemComponentData[] = []; + mPluginFilter = ''; + mPermission = ''; + mItemDatas: ItemComponentData[] = []; - constructor(config: LoaderConfigInfo) { - super(config); - this.mPluginFilter = config.action; - this.mPermission = config.permission; - Log.showDebug(TAG, `init loader, mPluginFilter: ${this.mPluginFilter}, mPermission: ${this.mPermission}`); - } + constructor(config: LoaderConfigInfo) { + super(config); + this.mPluginFilter = config.action as string; + this.mPermission = config.permission as string; + Log.showDebug(TAG, `init loader, mPluginFilter: ${this.mPluginFilter}, mPermission: ${this.mPermission}`); + } - onAbilityAdd(abilityInfo: AbilityInfoWithId): void { - let pluginData: PluginData | undefined = filterAbilityInfo(abilityInfo, this.mPluginFilter); - if (pluginData) { - let itemData = parseData(abilityInfo, pluginData); - if (!itemData) { - return; - } - this.mItemDatas.push(itemData); - this.addItem(itemData); - Log.showDebug(TAG, `item[${itemData.id}] add success, name: ${abilityInfo.name}`); - return; - } - Log.showDebug(TAG, `Can't filter ${abilityInfo.name}.`); + onAbilityAdd(abilityInfo: AbilityInfoWithId): void { + let pluginData: PluginData | undefined = filterAbilityInfo(abilityInfo, this.mPluginFilter); + if (pluginData) { + let itemData = parseData(abilityInfo, pluginData); + if (!itemData) { + return; + } + this.mItemDatas.push(itemData); + this.addItem(itemData); + Log.showDebug(TAG, `item[${itemData.id}] add success, name: ${abilityInfo.name}`); + return; } + Log.showDebug(TAG, `Can't filter ${abilityInfo.name}.`); + } - onBundleRemove(bundleName: string): void { - for (let i = this.mItemDatas.length - 1; i >= 0; i--) { - if (bundleName == this.mItemDatas[i].bundleName) { - Log.showDebug(TAG, `remove item index: ${i}, abilityname: ${this.mItemDatas[i].abilityName}`); - this.removeItem(this.mItemDatas[i]); - this.mItemDatas.splice(i, 1); - } - } + onBundleRemove(bundleName: string): void { + for (let i = this.mItemDatas.length - 1; i >= 0; i--) { + if (bundleName == this.mItemDatas[i].bundleName) { + Log.showDebug(TAG, `remove item index: ${i}, abilityname: ${this.mItemDatas[i].abilityName}`); + this.removeItem(this.mItemDatas[i]); + this.mItemDatas.splice(i, 1); + } } + } - clearData(): void { - Log.showDebug(TAG, `clear all, size: ${this.mItemDatas.length}`); - this.mItemDatas.forEach((data) => this.removeItem(data)); - this.mItemDatas.length = 0; - } + clearData(): void { + Log.showDebug(TAG, `clear all, size: ${this.mItemDatas.length}`); + this.mItemDatas.forEach((data) => this.removeItem(data)); + this.mItemDatas.length = 0; + } - reloadData(userId: number): void { - Log.showDebug(TAG, `reloadData userId: ${userId}`); - } + reloadData(userId: number): void { + Log.showDebug(TAG, `reloadData userId: ${userId}`); + } } function parseData(info: AbilityInfoWithId, data: PluginData): ItemComponentData { - let { label, pluginType, icon, template, clickAction, longClickAction, launchType, ...extra } = data; - if (pluginType.toString() != PluginType.META.toString()) { - return undefined; - } - let itemData: ItemComponentData = { - id: info.itemId, - pluginType: PluginType.META, - deviceId: Constants.LOCAL_DEVICE, - bundleName: info.bundleName, - abilityName: info.name, - abilityLabelId: info.labelId, - abilityIconId: info.iconId, - label: label, - iconUrl: icon, - template: template, - actionData: { - clickAction: parseEventString(clickAction), - longClickAction: parseEventString(longClickAction), - launchType: launchType, - extra: extra, - }, - }; - return itemData; + let { label, pluginType, icon, template, clickAction, longClickAction, launchType, ...extra } = data; + if (pluginType == undefined || pluginType == null || pluginType.toString() != PluginType.META.toString()) { + return undefined; + } + let itemData: ItemComponentData = { + id: info.itemId, + pluginType: PluginType.META, + deviceId: Constants.LOCAL_DEVICE, + bundleName: info.bundleName, + abilityName: info.name, + abilityLabelId: info.labelId, + abilityIconId: info.iconId, + label: label, + iconUrl: icon, + template: template, + actionData: { + clickAction: parseEventString(clickAction), + longClickAction: parseEventString(longClickAction), + launchType: launchType, + extra: extra, + }, + }; + return itemData; } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts index ad75c348..55fce986 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts @@ -27,8 +27,8 @@ export default class PluginSourceLoader extends SourceLoader { constructor(config: LoaderConfigInfo) { super(config); - this.mPluginFilter = config.action; - this.mPermission = config.permission; + this.mPluginFilter = config.action as string; + this.mPermission = config.permission as string; Log.showDebug(TAG, `init loader, mPluginFilter: ${this.mPluginFilter}, mPermission: ${this.mPermission}`); } @@ -91,7 +91,7 @@ export default class PluginSourceLoader extends SourceLoader { function parseData(info: AbilityInfoWithId, data: PluginData): ItemComponentData | undefined { let { label, pluginType, icon, template, launchType, ...extra } = data; - if (pluginType.toString() != PluginType.PLUGIN_COMPONENT.toString()) { + if (pluginType == undefined || pluginType == null || pluginType.toString() != PluginType.PLUGIN_COMPONENT.toString()) { return undefined; } let itemData: ItemComponentData = { diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts index b521b75e..4e9ba347 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoader.ts @@ -13,46 +13,46 @@ * limitations under the License. */ -import Log from "../../default/Log"; -import { ItemComponentData, LoaderConfigInfo } from "../common/Constants"; -import { AbilityInfoWithId } from "../common/BundleParseUtil"; +import Log from '../../default/Log'; +import { ItemComponentData, LoaderConfigInfo } from '../common/Constants'; +import { AbilityInfoWithId } from '../common/BundleParseUtil'; -const TAG = "SourceLoader"; +const TAG = 'SourceLoader'; export type LoaderChannel = { - add: (item: ItemComponentData) => void; - remove: (item: ItemComponentData) => void; - onLoadPluginComponentData: (item: ItemComponentData) => void; + add: (item: ItemComponentData) => void; + remove: (item: ItemComponentData) => void; + onLoadPluginComponentData: (item: ItemComponentData) => void; }; export default abstract class SourceLoader { - mChannel: LoaderChannel | undefined; + mChannel: LoaderChannel | undefined; - constructor(config: LoaderConfigInfo) { - Log.showDebug(TAG, `constructor`); - } + constructor(config: LoaderConfigInfo) { + Log.showDebug(TAG, 'constructor'); + } - public setChannel(channel: LoaderChannel) { - this.mChannel = channel; - } + setChannel(channel: LoaderChannel): void { + this.mChannel = channel; + } - protected getChannel(): LoaderChannel { - return this.mChannel; - } + protected getChannel(): LoaderChannel | undefined { + return this.mChannel; + } - protected addItem(itemData: ItemComponentData) { - this.mChannel?.add(itemData); - } + protected addItem(itemData: ItemComponentData): void { + this.mChannel?.add(itemData); + } - protected removeItem(itemData: ItemComponentData) { - this.mChannel?.remove(itemData); - } + protected removeItem(itemData: ItemComponentData): void { + this.mChannel?.remove(itemData); + } - abstract clearData(): void; + abstract clearData(): void; - abstract onBundleRemove(bundleName: string): void; + abstract onBundleRemove(bundleName: string): void; - abstract reloadData(userId: number): void; + abstract reloadData(userId: number): void; - abstract onAbilityAdd(abilityInfo: AbilityInfoWithId): void; + abstract onAbilityAdd(abilityInfo: AbilityInfoWithId): void; } \ No newline at end of file diff --git a/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts b/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts index e0e5c577..8ff5b9d6 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/SourceLoaderFactory.ts @@ -13,37 +13,37 @@ * limitations under the License. */ -import Log from "../../default/Log"; -import SourceLoader, { LoaderChannel } from "./SourceLoader"; -import DataAbilitySourceLoader from "./DataAbilitySourceLoader"; -import MetaSourceLoader from "./MetaSourceLoader"; -import PluginSourceLoader from "./PluginSourceLoader"; -import { LoaderConfigInfo } from "../common/Constants"; +import Log from '../../default/Log'; +import SourceLoader, { LoaderChannel } from './SourceLoader'; +import DataAbilitySourceLoader from './DataAbilitySourceLoader'; +import MetaSourceLoader from './MetaSourceLoader'; +import PluginSourceLoader from './PluginSourceLoader'; +import { LoaderConfigInfo } from '../common/Constants'; -const TAG = "SourceLoaderFactory"; +const TAG = 'SourceLoaderFactory'; const classMap: { [key: string]: any } = { - MetaSource: MetaSourceLoader, - PluginSourceLoader: PluginSourceLoader, - DataAbilitySourceLoader: DataAbilitySourceLoader, + MetaSource: MetaSourceLoader, + PluginSourceLoader: PluginSourceLoader, + DataAbilitySourceLoader: DataAbilitySourceLoader, }; export default class SourceLoaderFactory { - mChannel: LoaderChannel; + mChannel: LoaderChannel; - constructor(channel: LoaderChannel) { - Log.showDebug(TAG, `constructor, channel: ${channel}`); - this.mChannel = channel; - } + constructor(channel: LoaderChannel) { + Log.showDebug(TAG, `constructor, channel: ${channel}`); + this.mChannel = channel; + } - getSourceLoader(pluginType: string, config: LoaderConfigInfo): null | SourceLoader { - let clz = classMap[pluginType]; - if (!clz) { - Log.showError(TAG, `Can't find pluginType: ${pluginType}`); - return null; - } - let loader: SourceLoader = new clz(config); - loader.setChannel(this.mChannel); - return loader; + getSourceLoader(pluginType: string, config: LoaderConfigInfo): null | SourceLoader { + let clz = classMap[pluginType]; + if (!clz) { + Log.showError(TAG, `Can't find pluginType: ${pluginType}`); + return null; } + let loader: SourceLoader = new clz(config); + loader.setChannel(this.mChannel); + return loader; + } } \ No newline at end of file diff --git a/common/src/main/ets/template/SimpleToggleBase.ets b/common/src/main/ets/template/SimpleToggleBase.ets index d015853f..fb34efea 100644 --- a/common/src/main/ets/template/SimpleToggleBase.ets +++ b/common/src/main/ets/template/SimpleToggleBase.ets @@ -14,7 +14,7 @@ */ import Log from '../default/Log' -import StyleConfiguration from './common/StyleConfiguration' +import StyleConfiguration, { SimpleToggleBaseStyle } from './common/StyleConfiguration' const TAG = 'SimpleToggleBase' @@ -36,7 +36,7 @@ export default struct SimpleToggleBase { private mLongClickEvent: Function @State mIconIsHover: boolean = false @State mTextIsHover: boolean = false - @State style: any = StyleConfiguration.getSimpleToggleBaseStyle() + @State style: SimpleToggleBaseStyle = StyleConfiguration.getSimpleToggleBaseStyle() aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, mToggleId: ${this.mToggleId}, mLabel: ${JSON.stringify(this.mLabel)}, mEditMode: ${this.mEditMode} mDragMode: ${this.mDragMode} `) diff --git a/common/src/main/ets/template/common/StyleConfiguration.ts b/common/src/main/ets/template/common/StyleConfiguration.ts index 180b8c50..58eb7b58 100644 --- a/common/src/main/ets/template/common/StyleConfiguration.ts +++ b/common/src/main/ets/template/common/StyleConfiguration.ts @@ -17,71 +17,77 @@ import StyleManager from '../../default/StyleManager'; const TAG = 'CommonTemplate-StyleConfiguration'; +export class IconTitleBaseStyle { + marginLeft: Length = '24vp'; + marginRight: Length = '16vp'; + componentGap: Length = '8vp'; + titleSize: Length = '24vp'; + titleColor: ResourceColor = $r('sys.color.ohos_id_color_text_secondary'); + borderRadius: Length= '48vp'; + backgroundColor: ResourceColor= '#ffffff'; + textMargin: Length = '8vp'; + textHoverHeight: Length = '52vp'; + textHoverWidth: Length = '136vp'; + textHoverRadius: Length = '8vp'; + hoverColor: ResourceColor = 'rgba(0, 0, 0, 0.05)'; + transparentColor: ResourceColor = 'rgba(255, 255, 255, 0)'; +} + +export class IconComponentStyle { + circleWidth: number | string = '96vp'; + circleHeight: number | string = '96vp'; + iconWidth: Length = '48vp'; + iconHeight: Length = '48vp'; + iconOffBG: ResourceColor = '#1A000000'; + iconOnBG: ResourceColor = '#FF007DFF'; + iconOnColor: ResourceColor = '#FFFFFFFF'; + iconOffColor: ResourceColor = $r('sys.color.ohos_id_color_secondary'); + hoverColor: ResourceColor = 'rgba(0, 0, 0, 0.05)'; + transparentColor: ResourceColor = 'rgba(255, 255, 255, 0)'; +} + +export class SimpleToggleBaseStyle { + circleWidth: number | string = '96vp'; + circleHeight: number | string = '96vp'; + iconWidth: Length = '48vp'; + iconHeight: Length = '48vp'; + dragCircleWidth: number | string = '120vp'; + dragCircleHeight: number | string = '120vp'; + dragIconWidth: Length = '72vp'; + dragIconHeight: Length = '72vp'; + iconOffBG: ResourceColor = '#1A000000'; + iconOnBG: ResourceColor = '#FF007DFF'; + iconOnColor: ResourceColor = '#FFFFFFFF'; + iconOffColor: ResourceColor = $r('sys.color.ohos_id_color_secondary'); + componentGap: Length = '10vp'; + titleSize: Length = '24fp'; + titleColor: ResourceColor = $r('sys.color.ohos_id_color_text_secondary'); + textHoverWidth: number | string = '136vp'; + textHoverHeight: number | string = '36vp'; + textHoverRadius: number | string = '8vp'; + hoverColor: ResourceColor = 'rgba(0, 0, 0, 0.05)'; + transparentColor: ResourceColor = 'rgba(255, 255, 255, 0)'; +} + export default class StyleConfiguration { - static getIconTitleBaseStyle() { - const key: string = TAG + "-IconTitleBase"; - return StyleManager.getStyle(key, () => { - return { - marginLeft: '24vp', - marginRight: '16vp', - componentGap: '8vp', - titleSize: '24vp', - titleColor:$r("sys.color.ohos_id_color_text_secondary"), - borderRadius: '48vp', - backgroundColor: '#ffffff', - textMargin: '8vp', - textHoverHeight: '52vp', - textHoverWidth: '136vp', - textHoverRadius: '8vp', - hoverColor: 'rgba(0, 0, 0, 0.05)', - transparentColor: 'rgba(255, 255, 255, 0)', - }; - }); - } + static getIconTitleBaseStyle(): IconTitleBaseStyle { + const key: string = TAG + '-IconTitleBase'; + return StyleManager.getStyle(key, () => { + return new IconTitleBaseStyle(); + }); + } - static getIconComponentStyle() { - const key: string = TAG + "-IconComponent"; - return StyleManager.getStyle(key, () => { - return { - circleWidth: '96vp', - circleHeight: '96vp', - iconWidth: '48vp', - iconHeight: '48vp', - iconOffBG: '#1A000000', - iconOnBG: '#FF007DFF', - iconOnColor: '#FFFFFFFF', - iconOffColor: $r("sys.color.ohos_id_color_secondary"), - hoverColor: 'rgba(0, 0, 0, 0.05)', - transparentColor: 'rgba(255, 255, 255, 0)', - }; - }); - } + static getIconComponentStyle(): IconComponentStyle { + const key: string = TAG + '-IconComponent'; + return StyleManager.getStyle(key, () => { + return new IconComponentStyle(); + }); + } - static getSimpleToggleBaseStyle() { - const key: string = TAG + "-SimpleToggleBase"; - return StyleManager.getStyle(key, () => { - return { - circleWidth: '96vp', - circleHeight: '96vp', - iconWidth: '48vp', - iconHeight: '48vp', - dragCircleWidth: '120vp', - dragCircleHeight: '120vp', - dragIconWidth: '72vp', - dragIconHeight: '72vp', - iconOffBG: '#1A000000', - iconOnBG: '#FF007DFF', - iconOnColor: '#FFFFFFFF', - iconOffColor: $r("sys.color.ohos_id_color_secondary"), - componentGap: '10vp', - titleSize: '24fp', - titleColor: $r("sys.color.ohos_id_color_text_secondary"), - textHoverWidth: '136vp', - textHoverHeight: '36vp', - textHoverRadius: '8vp', - hoverColor: 'rgba(0, 0, 0, 0.05)', - transparentColor: 'rgba(255, 255, 255, 0)', - }; - }); - } + static getSimpleToggleBaseStyle(): SimpleToggleBaseStyle { + const key: string = TAG + '-SimpleToggleBase'; + return StyleManager.getStyle(key, () => { + return new SimpleToggleBaseStyle(); + }); + } } \ No newline at end of file diff --git a/common/src/main/ets/template/iconComponent.ets b/common/src/main/ets/template/iconComponent.ets index 3e428cc5..d586ca28 100644 --- a/common/src/main/ets/template/iconComponent.ets +++ b/common/src/main/ets/template/iconComponent.ets @@ -14,43 +14,39 @@ */ import Log from '../default/Log'; -import StyleConfiguration from './common/StyleConfiguration' +import StyleConfiguration, { IconComponentStyle } from './common/StyleConfiguration' const TAG = 'iconComponent' @Component -export default -struct iconComponent { - +export default struct iconComponent { @State iconOff: any = "" @State iconOn: any = "" @Prop iconOffStr: string @Prop iconOnStr: string private useIconStr = false - @State mIconIsHover: boolean = false - @Link changeSwitch: boolean - @State style: any = StyleConfiguration.getIconComponentStyle() + @State style: IconComponentStyle = StyleConfiguration.getIconComponentStyle() aboutToAppear() { Log.showInfo(TAG,`aboutToAppear, ${this.changeSwitch} ${JSON.stringify(this.iconOff)} ${JSON.stringify(this.iconOn)} , useIconStr: ${this.useIconStr}`) } - aboutToDisappear () { - Log.showInfo(TAG,'aboutToDisappear') + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') } build() { Column() { Stack() { Flex() - .backgroundColor(this.changeSwitch? this.style.iconOnBG: this.style.iconOffBG) + .backgroundColor(this.changeSwitch ? this.style.iconOnBG : this.style.iconOffBG) .clip(new Circle({ width: this.style.circleWidth, height: this.style.circleHeight })) .width(this.style.circleWidth) .height(this.style.circleHeight) Flex() - .backgroundColor(this.mIconIsHover? this.style.hoverColor: this.style.transparentColor) + .backgroundColor(this.mIconIsHover ? this.style.hoverColor : this.style.transparentColor) .clip(new Circle({ width: this.style.circleWidth, height: this.style.circleHeight })) .width(this.style.circleWidth) .height(this.style.circleHeight) diff --git a/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/template/iconTitleBase.ets index 69385c69..53556587 100644 --- a/common/src/main/ets/template/iconTitleBase.ets +++ b/common/src/main/ets/template/iconTitleBase.ets @@ -14,15 +14,13 @@ */ import Log from '../default/Log'; -import StyleConfiguration from './common/StyleConfiguration' +import StyleConfiguration, { IconTitleBaseStyle } from './common/StyleConfiguration' import iconComponent from './iconComponent' -const TAG= 'iconTitleBase' +const TAG = 'iconTitleBase' @Component -export default -struct iconBaseComponent { - +export default struct iconBaseComponent { private iconOn: any private iconOff: any @State iconOffStr: string = "" @@ -33,18 +31,16 @@ struct iconBaseComponent { private useTitleStr = false private mClickEvent: Function private mLongClickEvent: Function - @State mTextIsHover: boolean = false - @Link changeSwitch: boolean - @State style: any = StyleConfiguration.getIconTitleBaseStyle() + @State style: IconTitleBaseStyle = StyleConfiguration.getIconTitleBaseStyle() aboutToAppear() { - Log.showInfo(TAG,'aboutToAppear') + Log.showInfo(TAG, 'aboutToAppear') } - aboutToDisappear () { - Log.showInfo(TAG,'aboutToDisappear') + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear') } build() { @@ -71,8 +67,9 @@ struct iconBaseComponent { } .height('100%') .layoutWeight(0) + Column().width(this.style.componentGap).height('100%').layoutWeight(0) - Row(){ + Row() { Row() { Column().width(this.style.textMargin).height('100%').layoutWeight(0) Text(this.useTitleStr ? this.mTitleStr : this.mTitle) @@ -89,11 +86,12 @@ struct iconBaseComponent { .width('100%') .height(this.style.textHoverHeight) .width(this.style.textHoverWidth) - .backgroundColor(this.mTextIsHover? this.style.hoverColor: this.style.transparentColor) + .backgroundColor(this.mTextIsHover ? this.style.hoverColor : this.style.transparentColor) .borderRadius(this.style.textHoverRadius) .clip(true) }.height('100%') .layoutWeight(1) + Column().width(this.style.marginRight).height('100%').layoutWeight(0) } .borderRadius(this.style.borderRadius) diff --git a/entry/pc/src/main/ets/Application/AbilityStage.ts b/entry/pc/src/main/ets/Application/AbilityStage.ts index 255cde1c..5c2c0ae7 100644 --- a/entry/pc/src/main/ets/Application/AbilityStage.ts +++ b/entry/pc/src/main/ets/Application/AbilityStage.ts @@ -12,13 +12,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../common/src/main/ets/default/log' +import AbilityStage from '@ohos.application.AbilityStage'; +import Log from '../../../../../../common/src/main/ets/default/Log'; -const TAG = "SystemUI_AbilityStage" +const TAG = 'SystemUI_AbilityStage'; export default class MainAbilityStage extends AbilityStage { - onCreate() { - Log.showInfo(TAG, "onCreate") - } + onCreate(): void { + Log.showInfo(TAG, 'onCreate'); + } } \ No newline at end of file diff --git a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index d7065518..dee3b6d1 100644 --- a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -12,53 +12,54 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility' -import Log from '../../../../../../common/src/main/ets/default/Log' -import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import initSystemUi from '../../../../../../common/src/main/ets/default/InitSystemUi' +import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import Want from '@ohos.application.Want'; +import Log from '../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import initSystemUi from '../../../../../../common/src/main/ets/default/InitSystemUi'; -const TAG = "SystemUI_ServiceExtAbility" +const TAG = 'SystemUI_ServiceExtAbility'; var statusBarWant = { - "bundleName": "com.ohos.systemui", - "abilityName": "com.ohos.systemui.statusbar.ServiceExtAbility" -} + 'bundleName': 'com.ohos.systemui', + 'abilityName': 'com.ohos.systemui.statusbar.ServiceExtAbility' +}; var navigationBarWant = { - "bundleName": "com.ohos.systemui", - "abilityName": "com.ohos.systemui.navigationbar.ServiceExtAbility" -} + 'bundleName': 'com.ohos.systemui', + 'abilityName': 'com.ohos.systemui.navigationbar.ServiceExtAbility' +}; var volumePanelWant = { - "bundleName": "com.ohos.systemui", - "abilityName": "com.ohos.systemui.volumepanel.ServiceExtAbility" -} + 'bundleName': 'com.ohos.systemui', + 'abilityName': 'com.ohos.systemui.volumepanel.ServiceExtAbility' +}; var controlPanelWant = { - "bundleName": "com.ohos.systemui", - "abilityName": "com.ohos.systemui.controlpanel.ServiceExtAbility" -} + 'bundleName': 'com.ohos.systemui', + 'abilityName': 'com.ohos.systemui.controlpanel.ServiceExtAbility' +}; var notificationPanelWant = { - "bundleName": "com.ohos.systemui", - "abilityName": "com.ohos.systemui.notificationpanel.ServiceExtAbility" -} + 'bundleName': 'com.ohos.systemui', + 'abilityName': 'com.ohos.systemui.notificationpanel.ServiceExtAbility' +}; class ServiceExtAbility extends ServiceExtension { - onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`) - initSystemUi(this.context); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) - AbilityManager.startAbility(statusBarWant) - AbilityManager.startAbility(navigationBarWant) - AbilityManager.startAbility(volumePanelWant) - AbilityManager.startAbility(controlPanelWant) - AbilityManager.startAbility(notificationPanelWant) - } + onCreate(want: Want): void { + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); + initSystemUi(this.context); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context); + AbilityManager.startAbility(statusBarWant); + AbilityManager.startAbility(navigationBarWant); + AbilityManager.startAbility(volumePanelWant); + AbilityManager.startAbility(controlPanelWant); + AbilityManager.startAbility(notificationPanelWant); + } - onDestroy() { - Log.showInfo(TAG, 'onDestroy') - } + onDestroy(): void { + Log.showInfo(TAG, 'onDestroy'); + } } -export default ServiceExtAbility \ No newline at end of file +export default ServiceExtAbility; \ No newline at end of file diff --git a/entry/phone/src/main/ets/Application/AbilityStage.ts b/entry/phone/src/main/ets/Application/AbilityStage.ts index 9a59509b..5c2c0ae7 100644 --- a/entry/phone/src/main/ets/Application/AbilityStage.ts +++ b/entry/phone/src/main/ets/Application/AbilityStage.ts @@ -12,13 +12,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../common/src/main/ets/default/Log' +import AbilityStage from '@ohos.application.AbilityStage'; +import Log from '../../../../../../common/src/main/ets/default/Log'; -const TAG = "SystemUI_AbilityStage" +const TAG = 'SystemUI_AbilityStage'; export default class MainAbilityStage extends AbilityStage { - onCreate() { - Log.showInfo(TAG, "onCreate") - } + onCreate(): void { + Log.showInfo(TAG, 'onCreate'); + } } \ No newline at end of file diff --git a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 35294c4c..324bbdb0 100644 --- a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -12,41 +12,42 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility' -import Log from '../../../../../../common/src/main/ets/default/Log' -import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import initSystemUi from '../../../../../../common/src/main/ets/default/InitSystemUi' +import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import Want from '@ohos.application.Want'; +import Log from '../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import initSystemUi from '../../../../../../common/src/main/ets/default/InitSystemUi'; -const TAG = "SystemUI_ServiceExtAbility" +const TAG = 'SystemUI_ServiceExtAbility'; var statusBarWant = { - "bundleName": "com.ohos.systemui", - "abilityName": "com.ohos.systemui.statusbar.ServiceExtAbility" -} + 'bundleName': 'com.ohos.systemui', + 'abilityName': 'com.ohos.systemui.statusbar.ServiceExtAbility' +}; var navigationBarWant = { - "bundleName": "com.ohos.systemui", - "abilityName": "com.ohos.systemui.navigationbar.ServiceExtAbility" -} + 'bundleName': 'com.ohos.systemui', + 'abilityName': 'com.ohos.systemui.navigationbar.ServiceExtAbility' +}; var volumePanelWant = { - "bundleName": "com.ohos.systemui", - "abilityName": "com.ohos.systemui.volumepanel.ServiceExtAbility" -} + 'bundleName': 'com.ohos.systemui', + 'abilityName': 'com.ohos.systemui.volumepanel.ServiceExtAbility' +}; class ServiceExtAbility extends ServiceExtension { - onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`) - initSystemUi(this.context) - AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context) - AbilityManager.startAbility(statusBarWant) - AbilityManager.startAbility(navigationBarWant) - AbilityManager.startAbility(volumePanelWant) - } + onCreate(want: Want): void { + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); + initSystemUi(this.context); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context); + AbilityManager.startAbility(statusBarWant); + AbilityManager.startAbility(navigationBarWant); + AbilityManager.startAbility(volumePanelWant); + } - onDestroy() { - Log.showInfo(TAG, 'onDestroy') - } + onDestroy(): void { + Log.showInfo(TAG, 'onDestroy'); + } } -export default ServiceExtAbility \ No newline at end of file +export default ServiceExtAbility; \ No newline at end of file diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts b/features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts index ebd11a25..e22faff4 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/common/Constants.ts @@ -17,5 +17,5 @@ export default class Constants { } export class AutoRotateData { - switchStatus: boolean = false; + switchStatus = false; } \ No newline at end of file diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts index abd26635..dbd0230b 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/model/AutoRotateService.ts @@ -19,46 +19,54 @@ import createOrGet from '../../../../../../../../common/src/main/ets/default/Sin const TAG = 'AutoRotateModel'; +export interface AutoRotateSwitchStatusListener { + updateAutoRotateSwitchStatus(status: boolean): void; +} + export class AutoRotateService { - mIsStart: boolean = false; - mListener: any; + mIsStart = false; + mListener: AutoRotateSwitchStatusListener; constructor() { } - registerListener(listener: { - 'updateAutoRotateSwitchStatus': Function, - }) { + registerListener(listener: AutoRotateSwitchStatusListener): void { Log.showInfo(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; } - startService() { + startService(): void { if (this.mIsStart) { return; } - Log.showInfo(TAG, `startService`); + Log.showInfo(TAG, 'startService'); this.mIsStart = true; - this.asyncStartService(); + this.asyncStartService().then(() => { + }).catch((err) => { + }); } async asyncStartService(): Promise { - Log.showInfo(TAG, `asyncStartService`); - this.getOrientation(); + Log.showInfo(TAG, 'asyncStartService'); + this.getOrientation().then(() => { + }).catch((err) => { + }); screen.on('change', this.onOrientationChange.bind(this)); } - stopService() { + stopService(): void { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `stopService`); + Log.showInfo(TAG, 'stopService'); this.mIsStart = false; - this.asyncStopService(); + this.asyncStopService().then(() => { + }).catch((err) => { + }); } async asyncStopService(): Promise { - Log.showInfo(TAG, `asyncStopService`); + Log.showInfo(TAG, 'asyncStopService'); screen.off('change', (value: number) => { Log.showInfo(TAG, `asyncStopService, off change value: ${value}`); }); @@ -66,11 +74,13 @@ export class AutoRotateService { onOrientationChange(value: number): void{ Log.showDebug(TAG, `onOrientationChange, value: ${value}`); - this.getOrientation(); + this.getOrientation().then(() => { + }).catch((err) => { + }); } async getOrientation(): Promise { - Log.showDebug(TAG, `getOrientation`); + Log.showDebug(TAG, 'getOrientation'); let mScreen = await this.getScreen(); this.updateAutoRotateSwitchStatus(mScreen.orientation); } @@ -93,7 +103,7 @@ export class AutoRotateService { } async getScreen(): Promise { - Log.showDebug(TAG, `getScreen`); + Log.showDebug(TAG, 'getScreen'); let screens = await screen.getAllScreen(); return screens[0]; } @@ -102,4 +112,4 @@ export class AutoRotateService { let sAutoRotateService = createOrGet(AutoRotateService, TAG); -export default sAutoRotateService as AutoRotateService; +export default sAutoRotateService; diff --git a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts index 781b0efc..7b11781c 100644 --- a/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts +++ b/features/autorotatecomponent/src/main/ets/com/ohos/viewmodel/AutoRotateVM.ts @@ -16,7 +16,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; import AutoRotateService from '../model/AutoRotateService'; -import {AutoRotateData} from '../common/Constants'; +import { AutoRotateData } from '../common/Constants'; const TAG = 'AutoRotateVM'; @@ -26,14 +26,14 @@ export class AutoRotateVM { }; constructor() { - Log.showDebug(TAG, `constructor`); + Log.showDebug(TAG, 'constructor'); this.mAutoRotateData = AppStorage.SetAndLink(TAG + '_AutoRotateData', this.mAutoRotateData).get(); AutoRotateService.registerListener(this); AutoRotateService.startService(); } getAutoRotateData(): AutoRotateData { - Log.showDebug(TAG, `getAutoRotateData`); + Log.showDebug(TAG, 'getAutoRotateData'); return this.mAutoRotateData; } @@ -44,10 +44,12 @@ export class AutoRotateVM { processAutoRotateSwitchStatusChange(status: boolean): void{ Log.showDebug(TAG, `processAutoRotateSwitchStatusChange, status: ${status}`); - AutoRotateService.changeSwitch(status); + AutoRotateService.changeSwitch(status).then(() => { + }).catch((err) => { + }); } } let sAutoRotateVM = createOrGet(AutoRotateVM, TAG); -export default sAutoRotateVM as AutoRotateVM; \ No newline at end of file +export default sAutoRotateVM; \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts index 1ea881d4..d47b0072 100644 --- a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -14,36 +14,39 @@ */ import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; -import Constants from './Constants'; const TAG = 'battery-StyleConfiguration'; +export class BatteryComponentStyle { + componentGap: Length = $r('app.float.battery_component_gap'); +} + +export class BatteryPicStyle { + picGap: Length = $r('app.float.battery_component_pic_gap'); + picBodyWidth: Length = $r('app.float.battery_component_pic_body_width'); + picBodyHeight: Length = $r('app.float.battery_component_pic_body_height'); + picBodyPadding: Length = $r('app.float.battery_component_pic_body_padding'); + picBodyBorderWidth: Length = $r('app.float.battery_component_pic_body_border_width'); + picBorderRadius: Length = $r('app.float.battery_component_pic_border_radius'); + picHeadBorderRadius: Length = $r('app.float.battery_component_pic_head_radius'); + picChargingColor: ResourceColor = $r('app.color.battery_component_pic_charging_color'); + picLevelLowColor: ResourceColor = $r('app.color.battery_component_pic_level_low_color'); + picHeadWidth: Length = $r('app.float.battery_component_pic_head_width'); + picHeadHeight: Length = $r('app.float.battery_component_pic_head_height'); +} + export default class StyleConfiguration { - static getBatteryComponentStyle() { - const key: string = TAG + "-BatteryComponent"; - return StyleManager.getStyle(key, () => { - return { - componentGap: $r('app.float.battery_component_gap') - }; - }); - } + static getBatteryComponentStyle(): BatteryComponentStyle { + const key: string = TAG + '-BatteryComponent'; + return StyleManager.getStyle(key, () => { + return new BatteryComponentStyle(); + }); + } - static getBatteryPicStyle() { - const key: string = TAG + "-BatteryPicComponent"; - return StyleManager.getStyle(key, () => { - return { - picGap: $r('app.float.battery_component_pic_gap'), - picBodyWidth: $r('app.float.battery_component_pic_body_width'), - picBodyHeight: $r('app.float.battery_component_pic_body_height'), - picBodyPadding: $r('app.float.battery_component_pic_body_padding'), - picBodyBorderWidth: $r('app.float.battery_component_pic_body_border_width'), - picBorderRadius: $r('app.float.battery_component_pic_border_radius'), - picHeadBorderRadius: $r('app.float.battery_component_pic_head_radius'), - picChargingColor: $r('app.color.battery_component_pic_charging_color'), - picLevelLowColor: $r('app.color.battery_component_pic_level_low_color'), - picHeadWidth: $r('app.float.battery_component_pic_head_width'), - picHeadHeight: $r('app.float.battery_component_pic_head_height'), - }; - }); - } + static getBatteryPicStyle(): BatteryPicStyle { + const key: string = TAG + '-BatteryPicComponent'; + return StyleManager.getStyle(key, () => { + return new BatteryPicStyle(); + }); + } } \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/common/constants.ts b/features/batterycomponent/src/main/ets/default/common/constants.ts index 0cd35442..74bbfdd0 100644 --- a/features/batterycomponent/src/main/ets/default/common/constants.ts +++ b/features/batterycomponent/src/main/ets/default/common/constants.ts @@ -14,6 +14,6 @@ */ export default class Constants { - static BATTERY_LEVEL_LOW = 20; - static PERCENT_NUMBER = 100; + static readonly BATTERY_LEVEL_LOW = 20; + static readonly PERCENT_NUMBER = 100; } \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets index 151e08f7..865b256b 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryIcon.ets @@ -18,8 +18,9 @@ import BatteryPic from './batteryPic'; import BatterySoc from './batterySoc'; import Constants from '../common/constants'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration'; -import StyleConfiguration from '../common/StyleConfiguration'; +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration, { BatteryComponentStyle } from '../common/StyleConfiguration' const TAG = 'BatteryComponent-batteryIcon'; @@ -27,8 +28,8 @@ const TAG = 'BatteryComponent-batteryIcon'; export default struct BatteryIcon { @StorageLink('batterySoc') batterySoc: number = 100; @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0; - @State style: any = StyleConfiguration.getBatteryComponentStyle(); - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); + @State style: BatteryComponentStyle = StyleConfiguration.getBatteryComponentStyle(); + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle(); aboutToAppear() { mBatteryModel.initBatteryModel(); diff --git a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets index 56f836f2..5f78a3ca 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batteryPic.ets @@ -16,7 +16,7 @@ import Constants from '../common/constants' import Log from '../../../../../../../common/src/main/ets/default/Log' import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager' -import StyleConfiguration from '../common/StyleConfiguration' +import StyleConfiguration, { BatteryPicStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/BatteryVM' const TAG = 'BatteryComponent-batteryPic'; @@ -26,7 +26,7 @@ export default struct BatteryPic { @StorageLink('batterySoc') batterySoc: number = 100 @StorageLink('batteryCharging') batteryCharging: boolean = false @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() - @State style: any = StyleConfiguration.getBatteryPicStyle() + @State style: BatteryPicStyle = StyleConfiguration.getBatteryPicStyle() aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear Start'); diff --git a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets index 3bcc7c37..1d085a99 100644 --- a/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets +++ b/features/batterycomponent/src/main/ets/default/pages/batterySoc.ets @@ -14,24 +14,25 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log'; -import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration'; -import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager'; import ViewModel from '../viewmodel/BatteryVM'; const TAG = 'BatteryComponent-batterySoc'; + @Component -export default -struct BatterySoc { +export default struct BatterySoc { @StorageLink('batterySoc') batterySoc: number = 100; @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle(); - aboutToAppear(){ - Log.showInfo(TAG,'aboutToAppear Start'); + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear Start'); } - aboutToDisappear(){ - Log.showInfo(TAG,'aboutToDisappear'); + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear'); } build() { diff --git a/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts b/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts index ff87c012..9e84a660 100644 --- a/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts +++ b/features/batterycomponent/src/main/ets/default/viewmodel/BatteryVM.ts @@ -14,8 +14,9 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log'; -import {FASlotName} from '../../../../../../../common/src/main/ets/default/Constants'; -import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import { FASlotName } from '../../../../../../../common/src/main/ets/default/Constants'; +import { TintContentInfo, getOrCreateTintContentInfo +} from '../../../../../../../common/src/main/ets/default/TintStateManager'; import createOrGet from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'BatteryVM'; @@ -24,7 +25,7 @@ export class BatteryVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.BATTERY); constructor() { - Log.showDebug(TAG, `constructor`); + Log.showDebug(TAG, 'constructor'); } getTintContentInfo(): TintContentInfo { @@ -34,4 +35,4 @@ export class BatteryVM { let sBatteryVM = createOrGet(BatteryVM, TAG); -export default sBatteryVM as BatteryVM; \ No newline at end of file +export default sBatteryVM; \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 27bf18b9..ab340b5e 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -14,18 +14,19 @@ */ import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; -import Constants from './Constants'; const TAG = 'bluetooth-StyleConfiguration'; +export class StatusBarBluetoothComponentStyle { + staticBarBluetoothWidth: Length = $r('app.float.status_bar_bluetooth_width'); + staticBarBluetoothHeight: Length = $r('app.float.status_bar_bluetooth_height'); +} + export default class StyleConfiguration { - static getStatusBarBluetoothComponentStyle() { - const key: string = TAG + "-StatusBarBluetoothComponent"; + static getStatusBarBluetoothComponentStyle(): StatusBarBluetoothComponentStyle { + const key: string = TAG + '-StatusBarBluetoothComponent'; return StyleManager.getStyle(key, () => { - return { - staticBarBluetoothWidth: $r('app.float.status_bar_bluetooth_width'), - staticBarBluetoothHeight: $r('app.float.status_bar_bluetooth_height') - }; + return new StatusBarBluetoothComponentStyle(); }); } } \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts index 1e361276..d130da34 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -19,31 +19,35 @@ import createOrGet from '../../../../../../../../common/src/main/ets/default/Sin const TAG = 'BluetoothModel'; -function isBluetoothOpen(state) { +export interface BlueupdateStateListener { + updateState(state: boolean): void; +} + +function isBluetoothOpen(state: number): boolean { Log.showInfo(TAG, `BluetoothState is: ${state}`); return state == bluetooth.BluetoothState.STATE_ON || state == bluetooth.BluetoothState.STATE_BLE_ON || state == bluetooth.BluetoothState.STATE_TURNING_ON || state == bluetooth.BluetoothState.STATE_BLE_TURNING_ON; } export class BluetoothService { - mIsStart: boolean = false; - mListener: any; - mIsBluetoothOpen: boolean = false; + mIsStart = false; + mListener: BlueupdateStateListener; + mIsBluetoothOpen = false; constructor() { - Log.showDebug(TAG, `constructor`); + Log.showDebug(TAG, 'constructor'); } - startService() { + startService(): void { if (this.mIsStart) { return; } this.mIsStart = true; this.mIsBluetoothOpen = isBluetoothOpen(bluetooth.getState()); - bluetooth.on('stateChange', (state) => { - let isOpen = isBluetoothOpen(state) + bluetooth.on('stateChange', (state): void => { + let isOpen = isBluetoothOpen(state); if (this.mIsBluetoothOpen != isOpen) { - Log.showInfo(TAG, `state change: ${isOpen}`) + Log.showInfo(TAG, `state change: ${isOpen}`); this.mIsBluetoothOpen = isOpen; this.mListener?.updateState(this.mIsBluetoothOpen); } @@ -51,18 +55,16 @@ export class BluetoothService { Log.showInfo(TAG, `startService, mIsBluetoothOpen: ${this.mIsBluetoothOpen}`); } - stopService() { + stopService(): void { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `stopService`); + Log.showInfo(TAG, 'stopService'); this.mIsStart = false; bluetooth.off('stateChange'); } - registerListener(listener: { - 'updateState': Function - }) { + registerListener(listener: BlueupdateStateListener): void { Log.showInfo(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; this.mListener.updateState(this.mIsBluetoothOpen); @@ -73,14 +75,14 @@ export class BluetoothService { } enableBluetooth(): boolean{ - Log.showInfo(TAG, `enableBluetooth`); + Log.showInfo(TAG, 'enableBluetooth'); let result = bluetooth.enableBluetooth(); Log.showInfo(TAG, `enableBluetooth, result: ${result}`); return result; } disableBluetooth(): boolean{ - Log.showInfo(TAG, `disableBluetooth`); + Log.showInfo(TAG, 'disableBluetooth'); let result = bluetooth.disableBluetooth(); Log.showInfo(TAG, `disableBluetooth, result: ${result}`); return result; @@ -89,4 +91,4 @@ export class BluetoothService { let sBluetoothService = createOrGet(BluetoothService, TAG); -export default sBluetoothService as BluetoothService; \ No newline at end of file +export default sBluetoothService; \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets index 3ee6bda2..7f79c984 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemBluetoothComponent.ets @@ -14,9 +14,10 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; -import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; -import StyleConfiguration from '../common/StyleConfiguration'; +import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import StyleConfiguration, { StatusBarBluetoothComponentStyle } from '../common/StyleConfiguration'; import Constants from '../common/Constants'; import ViewModel from '../viewmodel/BluetoothVM'; @@ -26,8 +27,8 @@ const TAG = 'bluetooth-StatusBarIconItemBluetoothComponent'; export default struct StatusBarIconItemBluetoothComponent { @StorageLink('BluetoothOpenStatus') BluetoothOpenStatus: boolean = false; @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); - @State style: any = StyleConfiguration.getStatusBarBluetoothComponentStyle(); + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle(); + @State style: StatusBarBluetoothComponentStyle = StyleConfiguration.getStatusBarBluetoothComponentStyle(); aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts index 72ba2f2c..964d1195 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/viewmodel/BluetoothVM.ts @@ -13,38 +13,38 @@ * limitations under the License. */ -import bluetooth from '@ohos.bluetooth'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; -import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; +import { TintContentInfo, getOrCreateTintContentInfo +} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; import BluetoothService from '../model/BluetoothService'; -export const BluetoothOpenStatusKey = "BluetoothOpenStatus"; +export const BLUETOOTH_OPEN_STATUS_KEY = 'BluetoothOpenStatus'; const TAG = 'BluetoothVM'; export class BluetoothVM { - mIsStart: boolean = false; - mBluetoothOpenStatus: any; + mIsStart = false; + mBluetoothOpenStatus: SubscribedAbstractProperty; mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.BLUETOOTH); constructor() { - Log.showDebug(TAG, `constructor`); + Log.showDebug(TAG, 'constructor'); } - initViewModel() { + initViewModel(): void { if (this.mIsStart) { return; } - Log.showDebug(TAG, `initViewModel `) + Log.showDebug(TAG, 'initViewModel '); this.mIsStart = true; - this.mBluetoothOpenStatus = AppStorage.SetAndLink(BluetoothOpenStatusKey, false); + this.mBluetoothOpenStatus = AppStorage.SetAndLink(BLUETOOTH_OPEN_STATUS_KEY, false); BluetoothService.startService(); BluetoothService.registerListener(this); } - updateState(state: boolean) { + updateState(state: boolean): void { Log.showInfo(TAG, `updateState, state: ${state} this.mBluetoothOpenStatus ${this.mBluetoothOpenStatus}`); this.mBluetoothOpenStatus.set(state); } @@ -64,4 +64,4 @@ export class BluetoothVM { let sBluetoothVM = createOrGet(BluetoothVM, TAG); -export default sBluetoothVM as BluetoothVM; \ No newline at end of file +export default sBluetoothVM; \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts index 58123b84..6a5efe8a 100644 --- a/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -17,25 +17,27 @@ import StyleManager from '../../../../../../../common/src/main/ets/default/Style const TAG = 'brightness-StyleConfiguration'; +export class BrightnessComponentStyle { + marginLeft: Length = $r('app.float.brightness_margin_left'); + marginRight: Length = $r('app.float.brightness_margin_right'); + componentGap: Length = $r('app.float.brightness_component_gap'); + brightnessIconColor: ResourceColor = $r('sys.color.ohos_id_color_secondary'); + brightnessReduceWidth: Length = $r('app.float.brightness_reduce_width'); + brightnessReduceHeight: Length = $r('app.float.brightness_reduce_height'); + brightnessPlusWidth: Length = $r('app.float.brightness_plus_width'); + brightnessPlusHeight: Length = $r('app.float.brightness_plus_height'); + brightnessHeight: Length = $r('app.float.brightness_height'); + sliderHeight: Length = $r('app.float.brightness_slider_height'); + sliderBlockColor: ResourceColor = $r('app.color.brightness_slider_block_color'); + sliderTrackColor: ResourceColor = $r('app.color.brightness_slider_track_color'); + sliderSelectedColor: ResourceColor = $r('app.color.brightness_slider_selected_color'); +} + export default class StyleConfiguration { - static getBrightnessComponentStyle() { - const key: string = TAG + "-BrightnessComponent"; - return StyleManager.getStyle(key, () => { - return { - marginLeft: $r('app.float.brightness_margin_left'), - marginRight: $r('app.float.brightness_margin_right'), - componentGap: $r('app.float.brightness_component_gap'), - brightnessIconColor: $r("sys.color.ohos_id_color_secondary"), - brightnessReduceWidth: $r('app.float.brightness_reduce_width'), - brightnessReduceHeight: $r('app.float.brightness_reduce_height'), - brightnessPlusWidth: $r('app.float.brightness_plus_width'), - brightnessPlusHeight: $r('app.float.brightness_plus_height'), - brightnessHeight: $r('app.float.brightness_height'), - sliderHeight: $r('app.float.brightness_slider_height'), - sliderBlockColor: $r('app.color.brightness_slider_block_color'), - sliderTrackColor: $r('app.color.brightness_slider_track_color'), - sliderSelectedColor: $r('app.color.brightness_slider_selected_color') - }; - }); - } + static getBrightnessComponentStyle(): BrightnessComponentStyle { + const key: string = TAG + '-BrightnessComponent'; + return StyleManager.getStyle(key, () => { + return new BrightnessComponentStyle(); + }); + } } \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets index 2fbbbdb7..be8062e5 100644 --- a/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets +++ b/features/brightnesscomponent/src/main/ets/default/pages/brightnessComponent.ets @@ -15,7 +15,7 @@ import brightness from '@ohos.brightness'; import mBrightnessManager from '../brightnessManager'; -import StyleConfiguration from '../common/StyleConfiguration'; +import StyleConfiguration, { BrightnessComponentStyle } from '../common/StyleConfiguration'; import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'Control-brightnessComponent'; @@ -23,7 +23,7 @@ const TAG = 'Control-brightnessComponent'; @Component export default struct MyBrightness { @StorageLink('BrightnessValue') brightnessValue: number = 0; - @State style: any = StyleConfiguration.getBrightnessComponentStyle(); + @State style: BrightnessComponentStyle = StyleConfiguration.getBrightnessComponentStyle(); @State brightnessItem: any = { min: mBrightnessManager.getMin(), max: mBrightnessManager.getMax(), @@ -41,7 +41,7 @@ export default struct MyBrightness { mBrightnessManager.unRegisterBrightness(); } - setBrightness(value, sliderChangeMode:number) { + setBrightness(value, sliderChangeMode: number) { Log.showInfo(TAG, `setBrightness = ${value}`); mBrightnessManager.setValue(value, sliderChangeMode); } diff --git a/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts index cb040e4b..e3135c1a 100644 --- a/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -14,25 +14,26 @@ */ import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; -import Constants from './Constants'; +import Constants from './constants'; const TAG = 'capsule-StyleConfiguration'; +export class CapsuleComponentStyle { + greenCapsulePhoneWidth: Length = $r('app.float.green_capsule_phone_width'); + greenCapsulePhoneHeight: Length = $r('app.float.green_capsule_phone_height'); + greenCapsuleHeight: Length = $r('app.float.green_capsule_height'); + greenCapsuleTextColor: Length = $r('app.color.green_capsule_text_color'); + greenCapsuleTextMarginLeftRight: Length = $r('app.float.green_capsule_text_left_right'); + greenCapsuleRadius: Length = $r('app.float.green_capsule_radius'); + greenCapsuleBackgroundColor: ResourceStr = $r('app.color.capsule_background_color'); + maxLines: number = Constants.DEFAULT_MAX_LINES; +} + export default class StyleConfiguration { - static getCapsuleComponentStyle() { - const key: string = TAG + "-CapsuleComponent"; + static getCapsuleComponentStyle(): CapsuleComponentStyle { + const key: string = TAG + '-CapsuleComponent'; return StyleManager.getStyle(key, () => { - return { - greenCapsulePhoneWidth: $r('app.float.green_capsule_phone_width'), - greenCapsulePhoneHeight: $r('app.float.green_capsule_phone_height'), - greenCapsuleHeight: $r('app.float.green_capsule_height'), - greenCapsuleTextColor: $r('app.color.green_capsule_text_color'), - greenCapsuleTextMarginLeftRight: $r('app.float.green_capsule_text_left_right'), - greenCapsuleRadius: $r('app.float.green_capsule_radius'), - greenCapsuleBackgroundColor: $r('app.color.capsule_background_color'), - maxLines:Constants.DEFAULT_MAX_LINES - }; + return new CapsuleComponentStyle(); }); } - } \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/common/constants.ts b/features/capsulecomponent/src/main/ets/default/common/constants.ts index a6ae69b2..2ab1fa2e 100644 --- a/features/capsulecomponent/src/main/ets/default/common/constants.ts +++ b/features/capsulecomponent/src/main/ets/default/common/constants.ts @@ -14,9 +14,9 @@ */ export default class Constants { - static TOUCH_TYPE_DOWN: number = 0; - static TOUCH_TYPE_UP: number = 1; - static TOUCH_TYPE_MOVE: number = 2; - static DEFAULT_MAX_LINES: number= 1; - static CAPSULE_HEIGHT_MULTIPLE = 2; + static readonly TOUCH_TYPE_DOWN = 0; + static readonly TOUCH_TYPE_UP = 1; + static readonly TOUCH_TYPE_MOVE = 2; + static readonly DEFAULT_MAX_LINES= 1; + static readonly CAPSULE_HEIGHT_MULTIPLE = 2; } diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index 4864c092..137265c5 100644 --- a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -16,8 +16,9 @@ import Constants from '../common/constants' import CapsuleViewModel, { VIEW_MODEL_ID, CallState } from '../viewmodel/CapsuleViewModel' import Log from '../../../../../../../common/src/main/ets/default/Log' -import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' -import StyleConfiguration from '../common/StyleConfiguration' +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration, { CapsuleComponentStyle } from '../common/StyleConfiguration' const TAG = "CapsuleIcon"; @@ -28,8 +29,8 @@ export default struct CapsuleIcon { startY: number = 0; moveX: number = 0; moveY: number = 0; - @State style: any = StyleConfiguration.getCapsuleComponentStyle(); - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); + @State style: CapsuleComponentStyle = StyleConfiguration.getCapsuleComponentStyle(); + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle(); aboutToAppear() { this.mCapsuleViewModel.initViewModel(); diff --git a/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts index 0d70e4e5..41aeb279 100644 --- a/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -17,13 +17,15 @@ import StyleManager from '../../../../../../../common/src/main/ets/default/Style const TAG = 'clock-StyleConfiguration'; +export class ClockComponentStyle { + statusBarClockMaxWidth: Length = $r('app.float.status_bar_clock_width'); +} + export default class StyleConfiguration { - static getClockComponentStyle() { - const key: string = TAG + "-ClockComponent"; + static getClockComponentStyle(): ClockComponentStyle { + const key: string = TAG + '-ClockComponent'; return StyleManager.getStyle(key, () => { - return { - statusBarClockMaxWidth: $r('app.float.status_bar_clock_width') - }; + return new ClockComponentStyle(); }); } } \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets index 91d279a9..6762c12c 100644 --- a/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets +++ b/features/clockcomponent/src/main/ets/default/pages/clockIcon.ets @@ -15,8 +15,9 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager' -import StyleConfiguration from '../common/StyleConfiguration' -import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration, { ClockComponentStyle } from '../common/StyleConfiguration' +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../common/src/main/ets/default/StyleConfiguration' import ViewModel from '../viewmodel/ClockVM' import TimeManager, { TimeEventArgs, @@ -30,8 +31,8 @@ const TAG = 'ClockComponent-clockIcon'; export default struct ClockIcon { @State mTime: string = '16:01'; @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); - @State style: any = StyleConfiguration.getClockComponentStyle(); - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); + @State style: ClockComponentStyle = StyleConfiguration.getClockComponentStyle(); + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle(); unSubscriber?: unsubscribe; aboutToAppear() { diff --git a/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts b/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts index 963fb381..a6842fe1 100644 --- a/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts +++ b/features/clockcomponent/src/main/ets/default/viewmodel/ClockVM.ts @@ -14,8 +14,9 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log'; -import {FASlotName} from '../../../../../../../common/src/main/ets/default/Constants'; -import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import { FASlotName } from '../../../../../../../common/src/main/ets/default/Constants'; +import { TintContentInfo, getOrCreateTintContentInfo +} from '../../../../../../../common/src/main/ets/default/TintStateManager'; import createOrGet from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'ClockVM'; @@ -24,7 +25,7 @@ export class ClockVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.CLOCK); constructor() { - Log.showDebug(TAG, `constructor`); + Log.showDebug(TAG, 'constructor'); } getTintContentInfo(): TintContentInfo { @@ -34,4 +35,4 @@ export class ClockVM { let sClockVM = createOrGet(ClockVM, TAG); -export default sClockVM as ClockVM; \ No newline at end of file +export default sClockVM; \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts b/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts index afa53a08..22cdce7c 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts @@ -13,23 +13,38 @@ * limitations under the License. */ -import {ItemComponentData} from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; +import { ItemComponentData, FilterData +} from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; export default class Constants { - static TOUCHTYPE_DOWN = 0; - static TOUCHTYPE_UP = 1; - static TOUCHTYPE_MOVE = 2; - static TOGGLE_TYPE_COMPLEX = "complex"; - static TOGGLE_TYPE_SIMPLE = "simple"; - static COMPLEX_TOGGLE_GRID_ROW_HEIGHT = vp2px(132); - static COMPLEX_TOGGLE_GRID_ROW_GAP = vp2px(24); - static SIMPLE_TOGGLE_GRID_ROW_HEIGHT = vp2px(162); - static SIMPLE_TOGGLE_GRID_ROW_GAP = vp2px(0); - static DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT = 4; - static SIMPLE_TOGGLE_LAYOUT_MAX_TOGGLE_COUNT = 12; - static SIMPLE_TOGGLE_LAYOUT_MIN_TOGGLE_COUNT = 1; + static readonly TOUCHTYPE_DOWN = 0; + static readonly TOUCHTYPE_UP = 1; + static readonly TOUCHTYPE_MOVE = 2; + static readonly TOGGLE_TYPE_COMPLEX = 'complex'; + static readonly TOGGLE_TYPE_SIMPLE = 'simple'; + static readonly COMPLEX_TOGGLE_GRID_ROW_HEIGHT = vp2px(132); + static readonly COMPLEX_TOGGLE_GRID_ROW_GAP = vp2px(24); + static readonly SIMPLE_TOGGLE_GRID_ROW_HEIGHT = vp2px(162); + static readonly SIMPLE_TOGGLE_GRID_ROW_GAP = vp2px(0); + static readonly DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT = 4; + static readonly SIMPLE_TOGGLE_LAYOUT_MAX_TOGGLE_COUNT = 12; + static readonly SIMPLE_TOGGLE_LAYOUT_MIN_TOGGLE_COUNT = 1; + static readonly CONTROL_CENTER_TITLE_ICON_HOVER_WIDTH = '64vp'; + static readonly CONTROL_CENTER_TITLE_ICON_HOVER_HEIGHT = '64vp'; + static readonly CONTROL_CENTER_TITLE_ICON_HOVER_RADIUS = '16vp'; + static readonly SIMPLE_TOGGLE_EDIT_DIALOG_DIVIDER_WIDTH = '1vp'; } export type ControlComponentData = ItemComponentData & { toggleType: string; -} \ No newline at end of file +} + +export interface ControlCenterConfig { + ComplexToggleLayout: string[]; + DefaultSimpleToggleLayout: string[]; + LocalToggles: { + ComplexToggles: string[]; + SimpleToggles: string[]; + }; + MetaToggles: FilterData[]; +} diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index dd48fafe..074909e6 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -18,162 +18,180 @@ import Constants from './Constants'; const TAG = 'ControlCenter-StyleConfiguration'; +export class ControlCenterComponentStyle { + marginLeft: Length = $r('app.float.control_center_margin_left'); + marginRight: Length = $r('app.float.control_center_margin_right'); + marginTop: Length = $r('app.float.control_center_margin_top'); + titleMarginBottom: Length = $r('app.float.control_center_title_margin_bottom'); + upTitleHeight: Length = $r('app.float.control_center_title_height'); + toggleAreaGap: Length = $r('app.float.control_center_toggle_area_gap'); + simpleToggleLayoutMarginTop: Length = $r('app.float.control_center_simple_toggle_layout_margin_top'); + simpleToggleLayoutMarginBottom: Length = $r('app.float.control_center_simple_toggle_layout_margin_bottom'); + brightnessMarginBottom: Length = $r('app.float.control_center_brightness_margin_bottom'); + componentBorderRadius: Length = $r('app.float.control_center_component_border_radius'); + componentBackgroundColor: ResourceColor = $r('app.color.control_center_component_background'); +} + +export class ControlCenterUpTitleStyle { + marginLeft: Length = $r('app.float.control_center_title_margin_left'); + marginRight: Length = $r('app.float.control_center_title_margin_right'); + fontSize: Length = $r('app.float.control_center_title_font_size'); + fontColor: ResourceColor = $r('app.color.control_center_title_font_color'); + titleImageColor: ResourceColor = $r('app.color.control_center_title_image_color'); + imageWidth: Length = $r('app.float.control_center_title_icon_width'); + imageHeight: Length = $r('app.float.control_center_title_icon_height'); + imageHoverWidth: number | string = Constants.CONTROL_CENTER_TITLE_ICON_HOVER_WIDTH; + imageHoverHeight: number | string = Constants.CONTROL_CENTER_TITLE_ICON_HOVER_HEIGHT; + imageHoverRadius: number | string = Constants.CONTROL_CENTER_TITLE_ICON_HOVER_RADIUS; + imageHoverColor: ResourceColor = $r('app.color.control_center_title_icon_hover_color'); + imageTransparentColor: ResourceColor = $r('app.color.control_center_title_icon_transparent_color'); + upTitleSpace: Length = $r('app.float.control_center_title_space'); +} + +export class ControlCenterComplexToggleLayoutStyle { + columnGap: Length = $r('app.float.control_center_complex_toggle_column_gap'); + rowGap: Length = Constants.COMPLEX_TOGGLE_GRID_ROW_GAP; + rowHeight: Length = Constants.COMPLEX_TOGGLE_GRID_ROW_HEIGHT; +} + +export class ControlCenterSimpleToggleLayoutStyle { + marginLeft: Length = $r('app.float.control_center_simple_toggle_layout_margin_left'); + marginRight: Length = $r('app.float.control_center_simple_toggle_layout_margin_right'); + columnGap: Length = $r('app.float.control_center_simple_toggle_column_gap'); + rowGap: Length = Constants.SIMPLE_TOGGLE_GRID_ROW_GAP; + rowHeight: Length = Constants.SIMPLE_TOGGLE_GRID_ROW_HEIGHT; +} + +export class SimpleToggleLayoutEditComponentStyle { + marginLeft: Length = $r('app.float.simple_toggle_edit_margin_left'); + marginRight: Length = $r('app.float.simple_toggle_edit_margin_right'); + marginTop: Length = $r('app.float.simple_toggle_edit_margin_top'); + titleHeight: Length = $r('app.float.simple_toggle_edit_title_height'); + titleMarginBottom: Length = $r('app.float.simple_toggle_edit_title_margin_bottom'); + upGridMarginTop: Length = $r('app.float.simple_toggle_edit_up_grid_margin_top'); + upGridMarginBottom: Length = $r('app.float.simple_toggle_edit_up_grid_margin_bottom'); + gridMarginLeft: Length = $r('app.float.simple_toggle_edit_grid_margin_left'); + gridMarginRight: Length = $r('app.float.simple_toggle_edit_grid_margin_right'); + msgMarginTop: Length = $r('app.float.simple_toggle_edit_msg_margin_top'); + msgMarginBottom: Length = $r('app.float.simple_toggle_edit_msg_margin_bottom'); + btnMarginTop: Length = $r('app.float.simple_toggle_edit_btn_margin_top'); + btnMarginBottom: Length = $r('app.float.simple_toggle_edit_btn_margin_bottom'); + borderRadius: Length = $r('app.float.simple_toggle_edit_border_radius'); + upAreaBgColor: ResourceColor = $r('app.color.center_edit_up_area_bg_color'); + downAreaBgColor: ResourceColor = $r('app.color.center_edit_down_area_bg_color'); + editBtnFontColor: ResourceColor = $r('app.color.simple_toggle_edit_btn_font_color'); + editBtnFontSize: Length = $r('sys.float.ohos_id_text_size_button1'); + editBtnBgColor: ResourceColor = $r('app.color.simple_toggle_edit_btn_bg_color'); + editBtnMarginLeft: Length = $r('app.float.simple_toggle_edit_btn_margin_left'); + editBtnMarginRight: Length = $r('app.float.simple_toggle_edit_btn_margin_right'); + editBtnHeight: Length = $r('app.float.simple_toggle_edit_btn_height'); + editBtnSpace: Length = $r('app.float.simple_toggle_edit_btn_space'); +} + +export class SimpleToggleLayoutEditUpTitleStyle { + marginLeft: Length = $r('app.float.simple_toggle_edit_title_margin_left'); + imageWidth: Length = $r('app.float.simple_toggle_edit_title_icon_width'); + imageHeight: Length = $r('app.float.simple_toggle_edit_title_icon_height'); + fontColor: ResourceColor = $r('app.color.simple_toggle_edit_title_font_color'); + editTitleSpace: Length = $r('app.float.simple_toggle_edit_icon_width'); + titleFontSize: Length = $r('app.float.simple_toggle_edit_title_font_size'); +} + +export class SimpleToggleLayoutEditOptMsgStyle { + fontSize: Length = $r('app.float.simple_toggle_edit_opt_msg_font_size'); + fontColor: ResourceColor = $r('sys.color.ohos_id_color_text_secondary'); + height: Length = $r('app.float.simple_toggle_edit_opt_msg_height'); + marginLeftRight: Length = $r('app.float.simple_toggle_edit_opt_msg_margin_left_right'); +} + +export class SimpleToggleLayoutEditGridStyle { + columnGap: Length = $r('app.float.simple_toggle_edit_grid_column_gap'); + rowGap: number = Constants.SIMPLE_TOGGLE_GRID_ROW_GAP; + rowHeight: number = Constants.SIMPLE_TOGGLE_GRID_ROW_HEIGHT; + dragBgSize: Length = $r('app.float.simple_toggle_edit_grid_drag_bg_size'); +} + +export class ControlEditDialogStyle { + editDialogHeight: Length = $r('app.float.simple_toggle_edit_dialog_height'); + editDialogWidth: Length = $r('app.float.simple_toggle_edit_dialog_width'); + editDialogFontSize: Length = $r('app.float.simple_toggle_edit_dialog_font_size'); + editDialogBtnMarginLF: Length = $r('app.float.simple_toggle_edit_dialog_btn_margin_lf'); + editDialogFontHeight: Length = $r('app.float.simple_toggle_edit_dialog_font_height'); + editDialogBtnMarginTop: Length = $r('app.float.simple_toggle_edit_dialog_btn_margin_top'); + editDialogButtonSize: Length = $r('app.float.simple_toggle_edit_dialog_btn_font_size'); + editDialogDividerHeight: Length = $r('app.float.simple_toggle_edit_dialog_divider_height'); + editDialogButtonHeight: Length = $r('app.float.simple_toggle_edit_dialog_btn_height'); + editDialogRadius: Length = $r('app.float.simple_toggle_edit_dialog_radius'); + editDialogBtnWidth: Length = $r('app.float.simple_toggle_edit_dialog_btn_width'); + editDialogColor: ResourceColor = $r('app.color.center_edit_dialog_color'); + editDialogBtnFontColor: ResourceStr = $r('app.color.center_edit_dialog_btn_font_color'); + editDialogBtnBgColor: ResourceColor = $r('app.color.center_edit_dialog_btn_bg_color'); + editDialogDividerColor: ResourceColor = $r('sys.color.ohos_id_color_secondary'); + editDialogFontMarginTop: Length = $r('app.float.simple_toggle_edit_dialog_font_margin_top'); + editDialogDividerWidth: number | string = Constants.SIMPLE_TOGGLE_EDIT_DIALOG_DIVIDER_WIDTH; +} + export default class StyleConfiguration { - static getControlCenterComponentStyle() { - const key: string = TAG + "-ControlCenterComponent"; - return StyleManager.getStyle(key, () => { - return { - marginLeft: $r('app.float.control_center_margin_left'), - marginRight: $r('app.float.control_center_margin_right'), - marginTop: $r('app.float.control_center_margin_top'), - titleMarginBottom: $r('app.float.control_center_title_margin_bottom'), - upTitleHeight: $r('app.float.control_center_title_height'), - toggleAreaGap: $r('app.float.control_center_toggle_area_gap'), - simpleToggleLayoutMarginTop: $r('app.float.control_center_simple_toggle_layout_margin_top'), - simpleToggleLayoutMarginBottom: $r('app.float.control_center_simple_toggle_layout_margin_bottom'), - brightnessMarginBottom: $r('app.float.control_center_brightness_margin_bottom'), - componentBorderRadius: $r('app.float.control_center_component_border_radius'), - componentBackgroundColor: $r('app.color.control_center_component_background') - }; - }); - } - - static getControlCenterUpTitleStyle() { - const key: string = TAG + "-ControlCenterUpTitle"; - return StyleManager.getStyle(key, () => { - return { - marginLeft: $r('app.float.control_center_title_margin_left'), - marginRight: $r('app.float.control_center_title_margin_right'), - fontSize: $r('app.float.control_center_title_font_size'), - fontColor: $r("app.color.control_center_title_font_color"), - titleImageColor: $r("app.color.control_center_title_image_color"), - imageWidth: $r('app.float.control_center_title_icon_width'), - imageHeight: $r('app.float.control_center_title_icon_height'), - imageHoverWidth: $r('app.float.control_center_title_icon_hover_width'), - imageHoverHeight: $r('app.float.control_center_title_icon_hover_height'), - imageHoverRadius: $r('app.float.control_center_title_icon_hover_radius'), - imageHoverColor: $r('app.color.control_center_title_icon_hover_color'), - imageTransparentColor: $r('app.color.control_center_title_icon_transparent_color'), - upTitleSpace: $r("app.float.control_center_title_space"), - }; - }); - } - - static getControlCenterComplexToggleLayoutStyle() { - const key: string = TAG + "-ControlCenterComplexToggleLayout"; - return StyleManager.getStyle(key, () => { - return { - columnGap: $r("app.float.control_center_complex_toggle_column_gap"), - rowGap: Constants.COMPLEX_TOGGLE_GRID_ROW_GAP, - rowHeight: Constants.COMPLEX_TOGGLE_GRID_ROW_HEIGHT - }; - }); - } - - static getControlCenterSimpleToggleLayoutStyle() { - const key: string = TAG + "-ControlCenterSimpleToggleLayout"; - return StyleManager.getStyle(key, () => { - return { - marginLeft: $r("app.float.control_center_simple_toggle_layout_margin_left"), - marginRight: $r("app.float.control_center_simple_toggle_layout_margin_right"), - columnGap: $r("app.float.control_center_simple_toggle_column_gap"), - rowGap: Constants.SIMPLE_TOGGLE_GRID_ROW_GAP, - rowHeight: Constants.SIMPLE_TOGGLE_GRID_ROW_HEIGHT - }; - }); - } - - static getSimpleToggleLayoutEditComponentStyle() { - const key: string = TAG + "-SimpleToggleLayoutEditComponent"; - return StyleManager.getStyle(key, () => { - return { - marginLeft: $r('app.float.simple_toggle_edit_margin_left'), - marginRight: $r('app.float.simple_toggle_edit_margin_right'), - marginTop: $r("app.float.simple_toggle_edit_margin_top"), - titleHeight: $r("app.float.simple_toggle_edit_title_height"), - titleMarginBottom: $r("app.float.simple_toggle_edit_title_margin_bottom"), - upGridMarginTop: $r('app.float.simple_toggle_edit_up_grid_margin_top'), - upGridMarginBottom: $r('app.float.simple_toggle_edit_up_grid_margin_bottom'), - gridMarginLeft: $r("app.float.simple_toggle_edit_grid_margin_left"), - gridMarginRight: $r("app.float.simple_toggle_edit_grid_margin_right"), - msgMarginTop: $r('app.float.simple_toggle_edit_msg_margin_top'), - msgMarginBottom: $r('app.float.simple_toggle_edit_msg_margin_bottom'), - btnMarginTop: $r('app.float.simple_toggle_edit_btn_margin_top'), - btnMarginBottom: $r('app.float.simple_toggle_edit_btn_margin_bottom'), - borderRadius: $r('app.float.simple_toggle_edit_border_radius'), - upAreaBgColor: $r("app.color.center_edit_up_area_bg_color"), - downAreaBgColor: $r("app.color.center_edit_down_area_bg_color"), - editBtnFontColor: $r("app.color.simple_toggle_edit_btn_font_color"), - editBtnFontSize: $r("sys.float.ohos_id_text_size_button1"), - editBtnBgColor: $r("app.color.simple_toggle_edit_btn_bg_color"), - editBtnMarginLeft: $r('app.float.simple_toggle_edit_btn_margin_left'), - editBtnMarginRight: $r('app.float.simple_toggle_edit_btn_margin_right'), - editBtnHeight: $r('app.float.simple_toggle_edit_btn_height'), - editBtnSpace: $r('app.float.simple_toggle_edit_btn_space') - }; - }); - } - - static getSimpleToggleLayoutEditUpTitleStyle() { - const key: string = TAG + "-SimpleToggleLayoutEditUpTitle"; - return StyleManager.getStyle(key, () => { - return { - marginLeft: $r('app.float.simple_toggle_edit_title_margin_left'), - imageWidth: $r('app.float.simple_toggle_edit_title_icon_width'), - imageHeight: $r('app.float.simple_toggle_edit_title_icon_height'), - fontColor: $r('app.color.simple_toggle_edit_title_font_color'), - editTitleSpace: $r('app.float.simple_toggle_edit_icon_width'), - titleFontSize: $r('app.float.simple_toggle_edit_title_font_size') - }; - }); - } - - static getSimpleToggleLayoutEditOptMsgStyle() { - const key: string = TAG + "-SimpleToggleLayoutEditOptMsg"; - return StyleManager.getStyle(key, () => { - return { - fontSize: $r('app.float.simple_toggle_edit_opt_msg_font_size'), - fontColor: $r('sys.color.ohos_id_color_text_secondary'), - height: $r('app.float.simple_toggle_edit_opt_msg_height'), - marginLeftRight: $r('app.float.simple_toggle_edit_opt_msg_margin_left_right'), - }; - }); - } - - static getSimpleToggleLayoutEditGridStyle() { - const key: string = TAG + "-SimpleToggleLayoutEditGrid"; - return StyleManager.getStyle(key, () => { - return { - columnGap: $r("app.float.simple_toggle_edit_grid_column_gap"), - rowGap: Constants.SIMPLE_TOGGLE_GRID_ROW_GAP, - rowHeight: Constants.SIMPLE_TOGGLE_GRID_ROW_HEIGHT, - dragBgSize: $r("app.float.simple_toggle_edit_grid_drag_bg_size") - }; - }); - } - - static getControlEditDialogStyle() { - const key: string = TAG + "-ControlEditDialog"; - return StyleManager.getStyle(key, () => { - return { - editDialogHeight: $r("app.float.simple_toggle_edit_dialog_height"), - editDialogWidth: $r("app.float.simple_toggle_edit_dialog_width"), - editDialogFontSize: $r("app.float.simple_toggle_edit_dialog_font_size"), - editDialogBtnMarginLF: $r("app.float.simple_toggle_edit_dialog_btn_margin_lf"), - editDialogFontHeight: $r("app.float.simple_toggle_edit_dialog_font_height"), - editDialogBtnMarginTop: $r("app.float.simple_toggle_edit_dialog_btn_margin_top"), - editDialogButtonSize: $r("app.float.simple_toggle_edit_dialog_btn_font_size"), - editDialogDividerHeight: $r("app.float.simple_toggle_edit_dialog_divider_height"), - editDialogButtonHeight: $r("app.float.simple_toggle_edit_dialog_btn_height"), - editDialogRadius: $r("app.float.simple_toggle_edit_dialog_radius"), - editDialogBtnWidth: $r("app.float.simple_toggle_edit_dialog_btn_width"), - editDialogColor: $r("app.color.center_edit_dialog_color"), - editDialogBtnFontColor: $r("app.color.center_edit_dialog_btn_font_color"), - editDialogBtnBgColor: $r("app.color.center_edit_dialog_btn_bg_color"), - editDialogDividerColor: $r("sys.color.ohos_id_color_secondary"), - editDialogFontMarginTop: $r("app.float.simple_toggle_edit_dialog_font_margin_top"), - editDialogDividerWidth: $r("app.float.simple_toggle_edit_dialog_divider_width") - }; - }); - } + static getControlCenterComponentStyle(): ControlCenterComponentStyle { + const key: string = TAG + '-ControlCenterComponent'; + return StyleManager.getStyle(key, () => { + return new ControlCenterComponentStyle(); + }); + } + + static getControlCenterUpTitleStyle(): ControlCenterUpTitleStyle { + const key: string = TAG + '-ControlCenterUpTitle'; + return StyleManager.getStyle(key, () => { + return new ControlCenterUpTitleStyle(); + }); + } + + static getControlCenterComplexToggleLayoutStyle(): ControlCenterComplexToggleLayoutStyle { + const key: string = TAG + '-ControlCenterComplexToggleLayout'; + return StyleManager.getStyle(key, () => { + return new ControlCenterComplexToggleLayoutStyle(); + }); + } + + static getControlCenterSimpleToggleLayoutStyle(): ControlCenterSimpleToggleLayoutStyle { + const key: string = TAG + '-ControlCenterSimpleToggleLayout'; + return StyleManager.getStyle(key, () => { + return new ControlCenterSimpleToggleLayoutStyle(); + }); + } + + static getSimpleToggleLayoutEditComponentStyle(): SimpleToggleLayoutEditComponentStyle { + const key: string = TAG + '-SimpleToggleLayoutEditComponent'; + return StyleManager.getStyle(key, () => { + return new SimpleToggleLayoutEditComponentStyle(); + }); + } + + static getSimpleToggleLayoutEditUpTitleStyle(): SimpleToggleLayoutEditUpTitleStyle { + const key: string = TAG + '-SimpleToggleLayoutEditUpTitle'; + return StyleManager.getStyle(key, () => { + return new SimpleToggleLayoutEditUpTitleStyle(); + }); + } + + static getSimpleToggleLayoutEditOptMsgStyle(): SimpleToggleLayoutEditOptMsgStyle { + const key: string = TAG + '-SimpleToggleLayoutEditOptMsg'; + return StyleManager.getStyle(key, () => { + return new SimpleToggleLayoutEditOptMsgStyle(); + }); + } + + static getSimpleToggleLayoutEditGridStyle(): SimpleToggleLayoutEditGridStyle { + const key: string = TAG + '-SimpleToggleLayoutEditGrid'; + return StyleManager.getStyle(key, () => { + return new SimpleToggleLayoutEditGridStyle(); + }); + } + + static getControlEditDialogStyle(): ControlEditDialogStyle { + const key: string = TAG + '-ControlEditDialog'; + return StyleManager.getStyle(key, () => { + return new ControlEditDialogStyle(); + }); + } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index b2903f54..b0dd6ec5 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -13,263 +13,267 @@ * limitations under the License. */ -import Log from "../../../../../../../../common/src/main/ets/default/Log"; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import SwitchUserManager from "../../../../../../../../common/src/main/ets/default/SwitchUserManager"; -import CheckEmptyUtils from "../../../../../../../../common/src/main/ets/default/CheckEmptyUtils"; -import SettingsUtil from "../../../../../../../../common/src/main/ets/default/SettingsUtil"; -import AbilityManager from "../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager"; -import PluginDataSourceAdapter from "../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter"; -import {ItemComponentData} from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; -import Constants, {ControlComponentData} from "../common/Constants"; - -export type ControlCenterListener = { - setComplexToggleLayout: (layout: string[]) => void; - setSimpleToggleLayout: (layout: string[]) => void; - setItemData: (id: string, itemData: ControlComponentData) => void; -}; +import SwitchUserManager, { UserInfo } from '../../../../../../../../common/src/main/ets/default/SwitchUserManager'; +import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; +import SettingsUtil from '../../../../../../../../common/src/main/ets/default/SettingsUtil'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import PluginDataSourceAdapter from '../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter'; +import { ItemComponentData, FilterData +} from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; +import Constants, { ControlComponentData, ControlCenterConfig } from '../common/Constants'; + +export interface ControlCenterListener { + setComplexToggleLayout(layout: string[]): void; + + setSimpleToggleLayout(layout: string[]): void; + + setItemData(id: string, itemData: ControlComponentData): void; +} -const TAG = "ControlCenterModel"; -const SETTINGS_CONTROL_SIMPLE_TOGGLE_LAYOUT = "settings.control.simpleToggleLayout"; +const TAG = 'ControlCenterModel'; +const SETTINGS_CONTROL_SIMPLE_TOGGLE_LAYOUT = 'settings.control.simpleToggleLayout'; const CONTROLCENTER_SOURCE_CONFIG = { - action: "com.ohos.systemui.action.TOGGLE", - filterDatas: [], - loaderConfig: { - MetaSource: { - action: "com.ohos.systemui.action.TOGGLE", - permission: null, - }, + action: 'com.ohos.systemui.action.TOGGLE', + filterDatas: new Array(), + loaderConfig: { + MetaSource: { + action: 'com.ohos.systemui.action.TOGGLE', + permission: null, }, + }, }; function parseData(itemData: ItemComponentData): ControlComponentData { - let { toggleType, ...other } = itemData.actionData?.extra; - return { - ...itemData, - toggleType: toggleType ?? Constants.TOGGLE_TYPE_SIMPLE, - actionData: { ...itemData.actionData, extra: undefined }, - }; + let { toggleType, ...other } = itemData.actionData?.extra; + return { + ...itemData, + toggleType: toggleType ?? Constants.TOGGLE_TYPE_SIMPLE, + actionData: { ...itemData.actionData, extra: undefined }, + }; } export class ControlCenterService { - mIsStart: boolean = false; - mAdapter: PluginDataSourceAdapter; - mListener: ControlCenterListener | undefined; - mConfig: any; - mComplexToggleLayoutTemplate: string[]; - mSimpleToggleLayoutTemplate: string[]; - mAllComplexToggles: string[] = []; - mAllSimpleToggles: string[] = []; - mComplexToggleLayout: string[]; - mSimpleToggleLayout: string[]; - - constructor() { - Log.showDebug(TAG, `constructor`); + mIsStart = false; + mAdapter: PluginDataSourceAdapter; + mListener: ControlCenterListener | undefined; + mConfig: ControlCenterConfig; + mComplexToggleLayoutTemplate: string[]; + mSimpleToggleLayoutTemplate: string[]; + mAllComplexToggles: string[] = []; + mAllSimpleToggles: string[] = []; + mComplexToggleLayout: string[]; + mSimpleToggleLayout: string[]; + + constructor() { + Log.showDebug(TAG, 'constructor'); + } + + startService(config: ControlCenterConfig, moduleName: string): void { + if (this.mIsStart) { + return; } + Log.showInfo(TAG, 'start ControlCenterService.'); + this.mIsStart = true; - startService(config, moduleName): void { - if (this.mIsStart) { - return; - } - Log.showInfo(TAG, `start ControlCenterService.`); - this.mIsStart = true; + this.parseConfig(config); - this.parseConfig(config); + SwitchUserManager.getInstance().registerListener(this); + CONTROLCENTER_SOURCE_CONFIG.filterDatas = config.MetaToggles; + this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); + this.mAdapter.initDataSource(CONTROLCENTER_SOURCE_CONFIG); + } - SwitchUserManager.getInstance().registerListener(this); - CONTROLCENTER_SOURCE_CONFIG.filterDatas = config.MetaToggles; - this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); - this.mAdapter.initDataSource(CONTROLCENTER_SOURCE_CONFIG); + stopService(): void { + if (!this.mIsStart) { + return; } - - stopService(): void { - if (!this.mIsStart) { - return; - } - Log.showInfo(TAG, `stop ControlCenterService.`); - this.mIsStart = false; - this.mAdapter.clearAll(); + Log.showInfo(TAG, 'stop ControlCenterService.'); + this.mIsStart = false; + this.mAdapter.clearAll(); + } + + parseConfig(config: ControlCenterConfig): void { + Log.showDebug(TAG, `parseConfig, config: ${JSON.stringify(config)}`); + this.mConfig = config; + + this.mComplexToggleLayoutTemplate = []; + config.ComplexToggleLayout.forEach((name: string) => { + this.mComplexToggleLayoutTemplate.push(name); + }); + this.loadSimpleToggleLayoutTemplate(); + Log.showDebug(TAG, + `parseConfig, ComplexToggleLayoutTemplate: ${JSON.stringify(this.mComplexToggleLayoutTemplate)}`); + Log.showDebug(TAG, + `parseConfig, SimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); + + config.LocalToggles.ComplexToggles.forEach((name: string) => { + this.mAllComplexToggles.push(name); + }); + Log.showDebug(TAG, `parseConfig, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); + this.calcComplexToggleLayout(); + config.LocalToggles.SimpleToggles.forEach((name: string) => { + this.mAllSimpleToggles.push(name); + }); + Log.showDebug(TAG, `parseConfig, allSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); + this.calcSimpleToggleLayout(); + } + + loadSimpleToggleLayoutTemplate(): void{ + Log.showDebug(TAG, 'loadSimpleToggleLayoutTemplate'); + this.mSimpleToggleLayoutTemplate = []; + let simpleToggleLayout = this.getSimpleToggleLayoutFromSettings(); + Log.showDebug(TAG, `simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); + if (simpleToggleLayout) { + this.mSimpleToggleLayoutTemplate = simpleToggleLayout; + } else { + this.mConfig.DefaultSimpleToggleLayout.forEach((name: string) => { + this.mSimpleToggleLayoutTemplate.push(name); + }); + this.setSimpleToggleLayoutToSettings(this.mSimpleToggleLayoutTemplate); } - - parseConfig(config): void { - Log.showDebug(TAG, `parseConfig, config: ${JSON.stringify(config)}`); - this.mConfig = config; - - this.mComplexToggleLayoutTemplate = []; - config.ComplexToggleLayout.forEach((name) => { - this.mComplexToggleLayoutTemplate.push(name); - }); - this.loadSimpleToggleLayoutTemplate(); - Log.showDebug(TAG, - `parseConfig, ComplexToggleLayoutTemplate: ${JSON.stringify(this.mComplexToggleLayoutTemplate)}`); - Log.showDebug(TAG, - `parseConfig, SimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); - - config.LocalToggles.ComplexToggles.forEach((name) => { - this.mAllComplexToggles.push(name); - }); - Log.showDebug(TAG, `parseConfig, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); + Log.showDebug(TAG, `loadSimpleToggleLayoutTemplate, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); + } + + calcComplexToggleLayout(): void { + Log.showDebug(TAG, 'calcComplexToggleLayout'); + + let complexToggleLayout: string[] = []; + this.mComplexToggleLayoutTemplate.forEach((name) => { + if (this.mAllComplexToggles.indexOf(name) >= 0) { + complexToggleLayout.push(name); + } + }); + + Log.showDebug(TAG, `calcComplexToggleLayout, complexToggleLayout: ${JSON.stringify(complexToggleLayout)}`); + this.mComplexToggleLayout = complexToggleLayout; + this.mListener?.setComplexToggleLayout(complexToggleLayout); + } + + calcSimpleToggleLayout(): void { + Log.showDebug(TAG, 'calcSimpleToggleLayout'); + + let simpleToggleLayout: string[] = []; + this.mSimpleToggleLayoutTemplate.forEach((name) => { + if (this.mAllSimpleToggles.indexOf(name) >= 0) { + simpleToggleLayout.push(name); + } + }); + + Log.showDebug(TAG, `calcSimpleToggleLayout, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); + this.mSimpleToggleLayout = simpleToggleLayout; + this.mListener?.setSimpleToggleLayout(simpleToggleLayout); + } + + userChange(userInfo: UserInfo): void { + Log.showInfo(TAG, `userChange userInfo ${userInfo}`); + this.mAdapter.loadData(userInfo.userId); + } + + registerListener(listener: ControlCenterListener): void { + Log.showInfo(TAG, `registerListener, listener: ${listener}`); + this.mListener = listener; + } + + initFinish(): void { + Log.showDebug(TAG, 'initFinish'); + SwitchUserManager.getInstance() + .getCurrentUserInfo() + .then((userInfo) => { + this.mAdapter.loadData(userInfo.userId); + }).catch((err) => { + }); + } + + onItemAdd(itemData: ItemComponentData): void { + Log.showDebug(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); + let controlData: ControlComponentData = parseData(itemData); + let id: string = controlData.id; + this.mListener?.setItemData(id, controlData); + if (controlData.toggleType == Constants.TOGGLE_TYPE_COMPLEX) { + if (this.mAllComplexToggles.indexOf(id) < 0) { + this.mAllComplexToggles.push(id); + Log.showDebug(TAG, `onItemAdd, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); this.calcComplexToggleLayout(); - config.LocalToggles.SimpleToggles.forEach((name) => { - this.mAllSimpleToggles.push(name); - }); - Log.showDebug(TAG, `parseConfig, allSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); + } + } else { + if (this.mAllSimpleToggles.indexOf(id) < 0) { + this.mAllSimpleToggles.push(id); + Log.showDebug(TAG, `onItemAdd, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); this.calcSimpleToggleLayout(); + } } - - loadSimpleToggleLayoutTemplate(): void{ - Log.showDebug(TAG, `loadSimpleToggleLayoutTemplate`); - this.mSimpleToggleLayoutTemplate = []; - let simpleToggleLayout = this.getSimpleToggleLayoutFromSettings(); - Log.showDebug(TAG, `simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); - if (simpleToggleLayout) { - this.mSimpleToggleLayoutTemplate = simpleToggleLayout; - } else { - this.mConfig.DefaultSimpleToggleLayout.forEach((name) => { - this.mSimpleToggleLayoutTemplate.push(name); - }); - this.setSimpleToggleLayoutToSettings(this.mSimpleToggleLayoutTemplate); - } - Log.showDebug(TAG, `loadSimpleToggleLayoutTemplate, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); - } - - calcComplexToggleLayout(): void { - Log.showDebug(TAG, `calcComplexToggleLayout`); - - let complexToggleLayout: string[] = []; - this.mComplexToggleLayoutTemplate.forEach((name) => { - if (this.mAllComplexToggles.indexOf(name) >= 0) { - complexToggleLayout.push(name); - } - }); - - Log.showDebug(TAG, `calcComplexToggleLayout, complexToggleLayout: ${JSON.stringify(complexToggleLayout)}`); - this.mComplexToggleLayout = complexToggleLayout; - this.mListener?.setComplexToggleLayout(complexToggleLayout); - } - - calcSimpleToggleLayout(): void { - Log.showDebug(TAG, `calcSimpleToggleLayout`); - - let simpleToggleLayout: string[] = []; - this.mSimpleToggleLayoutTemplate.forEach((name) => { - if (this.mAllSimpleToggles.indexOf(name) >= 0) { - simpleToggleLayout.push(name); - } - }); - - Log.showDebug(TAG, `calcSimpleToggleLayout, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); - this.mSimpleToggleLayout = simpleToggleLayout; - this.mListener?.setSimpleToggleLayout(simpleToggleLayout); - } - - userChange(userInfo) { - Log.showInfo(TAG, `userChange userInfo ` + userInfo); - this.mAdapter.loadData(userInfo.userId); - } - - registerListener(listener: ControlCenterListener) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`); - this.mListener = listener; - } - - initFinish() { - Log.showDebug(TAG, `initFinish`); - SwitchUserManager.getInstance() - .getCurrentUserInfo() - .then((userInfo) => { - this.mAdapter.loadData(userInfo.userId); - }); - } - - onItemAdd(itemData: ItemComponentData): void { - Log.showDebug(TAG, `onItemAdd, itemData: ${JSON.stringify(itemData)}`); - let controlData: ControlComponentData = parseData(itemData); - let id: string = controlData.id; - this.mListener?.setItemData(id, controlData); - if (controlData.toggleType == Constants.TOGGLE_TYPE_COMPLEX) { - if (this.mAllComplexToggles.indexOf(id) < 0) { - this.mAllComplexToggles.push(id); - Log.showDebug(TAG, `onItemAdd, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); - this.calcComplexToggleLayout(); - } - } else { - if (this.mAllSimpleToggles.indexOf(id) < 0) { - this.mAllSimpleToggles.push(id); - Log.showDebug(TAG, `onItemAdd, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); - this.calcSimpleToggleLayout(); - } - } + } + + onItemRemove(itemData: ItemComponentData): void { + Log.showDebug(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); + let id: string = itemData.id; + if (this.mAllComplexToggles.indexOf(id) >= 0) { + this.mAllComplexToggles.splice(this.mAllComplexToggles.indexOf(id), 1); + Log.showDebug(TAG, `onItemRemove, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); + this.calcComplexToggleLayout(); + } else if (this.mAllSimpleToggles.indexOf(id) >= 0) { + this.mAllSimpleToggles.splice(this.mAllSimpleToggles.indexOf(id), 1); + Log.showDebug(TAG, `onItemRemove, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); + this.calcSimpleToggleLayout(); } - - onItemRemove(itemData: ItemComponentData): void { - Log.showDebug(TAG, `onItemRemove, itemData: ${JSON.stringify(itemData)}`); - let id: string = itemData.id; - if (this.mAllComplexToggles.indexOf(id) >= 0) { - this.mAllComplexToggles.splice(this.mAllComplexToggles.indexOf(id), 1); - Log.showDebug(TAG, `onItemRemove, mAllComplexToggles: ${JSON.stringify(this.mAllComplexToggles)}`); - this.calcComplexToggleLayout(); - } else if (this.mAllSimpleToggles.indexOf(id) >= 0) { - this.mAllSimpleToggles.splice(this.mAllSimpleToggles.indexOf(id), 1); - Log.showDebug(TAG, `onItemRemove, mAllSimpleToggles: ${JSON.stringify(this.mAllSimpleToggles)}`); - this.calcSimpleToggleLayout(); - } - this.mListener?.setItemData(id, undefined); - } - - getSimpleToggleLayoutFromSettings(): string[] { - Log.showDebug(TAG, `getSimpleToggleLayoutFromSettings`); - let value = SettingsUtil.getValue(SETTINGS_CONTROL_SIMPLE_TOGGLE_LAYOUT); - let simpleToggleLayout: string[] = null; - if (!CheckEmptyUtils.isEmpty(value)) { - simpleToggleLayout = JSON.parse(value); - } - Log.showDebug(TAG, `getSimpleToggleLayoutFromSettings, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); - return simpleToggleLayout; - } - - setSimpleToggleLayoutToSettings(simpleToggleLayout: string[]): void { - Log.showDebug(TAG, `setSimpleToggleLayoutToSettings, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); - let value: string = JSON.stringify(simpleToggleLayout); - SettingsUtil.setValue(SETTINGS_CONTROL_SIMPLE_TOGGLE_LAYOUT, value); - } - - getHidingSimpleToggles(): string[] { - Log.showDebug(TAG, `getHidingSimpleToggles`); - let hidingSimpleToggles: string[] = []; - this.mAllSimpleToggles.forEach((toggleName) => { - if (this.mSimpleToggleLayout.indexOf(toggleName) < 0) { - hidingSimpleToggles.push(toggleName); - } - }); - Log.showDebug(TAG, `getHidingSimpleToggles, hidingSimpleToggles: ${JSON.stringify(hidingSimpleToggles)}`); - return hidingSimpleToggles; - } - - getDefaultSimpleToggleLayout(): string[] { - Log.showDebug(TAG, `getDefaultSimpleToggleLayout`); - let defaultToggles: string[] = []; - this.mConfig.DefaultSimpleToggleLayout.forEach((toggleName) => { - if (this.mAllSimpleToggles.indexOf(toggleName) >= 0) { - defaultToggles.push(toggleName); - } - }); - Log.showDebug(TAG, `getDefaultSimpleToggleLayout, defaultToggles: ${JSON.stringify(defaultToggles)}`); - return defaultToggles; - } - - saveSimpleToggleLayout(layout: string[]): void{ - Log.showDebug(TAG, `saveSimpleToggleLayout, layout: ${JSON.stringify(layout)}`); - this.setSimpleToggleLayoutToSettings(layout); - this.mSimpleToggleLayoutTemplate = []; - layout.forEach((name) => { - this.mSimpleToggleLayoutTemplate.push(name); - }); - Log.showDebug(TAG, `saveSimpleToggleLayout, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); - this.calcSimpleToggleLayout(); + this.mListener?.setItemData(id, undefined); + } + + getSimpleToggleLayoutFromSettings(): string[] { + Log.showDebug(TAG, 'getSimpleToggleLayoutFromSettings'); + let value = SettingsUtil.getValue(SETTINGS_CONTROL_SIMPLE_TOGGLE_LAYOUT); + let simpleToggleLayout: string[] = null; + if (!CheckEmptyUtils.isEmpty(value)) { + simpleToggleLayout = JSON.parse(value) as string[]; } + Log.showDebug(TAG, `getSimpleToggleLayoutFromSettings, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); + return simpleToggleLayout; + } + + setSimpleToggleLayoutToSettings(simpleToggleLayout: string[]): void { + Log.showDebug(TAG, `setSimpleToggleLayoutToSettings, simpleToggleLayout: ${JSON.stringify(simpleToggleLayout)}`); + let value: string = JSON.stringify(simpleToggleLayout); + SettingsUtil.setValue(SETTINGS_CONTROL_SIMPLE_TOGGLE_LAYOUT, value); + } + + getHidingSimpleToggles(): string[] { + Log.showDebug(TAG, 'getHidingSimpleToggles'); + let hidingSimpleToggles: string[] = []; + this.mAllSimpleToggles.forEach((toggleName) => { + if (this.mSimpleToggleLayout.indexOf(toggleName) < 0) { + hidingSimpleToggles.push(toggleName); + } + }); + Log.showDebug(TAG, `getHidingSimpleToggles, hidingSimpleToggles: ${JSON.stringify(hidingSimpleToggles)}`); + return hidingSimpleToggles; + } + + getDefaultSimpleToggleLayout(): string[] { + Log.showDebug(TAG, 'getDefaultSimpleToggleLayout'); + let defaultToggles: string[] = []; + this.mConfig.DefaultSimpleToggleLayout.forEach((toggleName: string) => { + if (this.mAllSimpleToggles.indexOf(toggleName) >= 0) { + defaultToggles.push(toggleName); + } + }); + Log.showDebug(TAG, `getDefaultSimpleToggleLayout, defaultToggles: ${JSON.stringify(defaultToggles)}`); + return defaultToggles; + } + + saveSimpleToggleLayout(layout: string[]): void{ + Log.showDebug(TAG, `saveSimpleToggleLayout, layout: ${JSON.stringify(layout)}`); + this.setSimpleToggleLayoutToSettings(layout); + this.mSimpleToggleLayoutTemplate = []; + layout.forEach((name) => { + this.mSimpleToggleLayoutTemplate.push(name); + }); + Log.showDebug(TAG, `saveSimpleToggleLayout, mSimpleToggleLayoutTemplate: ${JSON.stringify(this.mSimpleToggleLayoutTemplate)}`); + this.calcSimpleToggleLayout(); + } } let sControlCenterService = createOrGet(ControlCenterService, TAG); -export default sControlCenterService as ControlCenterService; \ No newline at end of file +export default sControlCenterService; \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets index dcfa0094..7502a170 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ComplexToggleComponent.ets @@ -16,7 +16,6 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager'; import iconTitleBase from '../../../../../../../../common/src/main/ets/template/iconTitleBase'; -import Constants from '../common/Constants'; const TAG = 'ComplexToggleComponent'; diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets index 7bce69b5..c73e6430 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent.ets @@ -16,8 +16,9 @@ import UpTitle from './UpTitle'; import MyBrightness from '../../../../../../../brightnesscomponent/src/main/ets/default/pages/brightnessComponent'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import Constants from '../common/Constants'; -import StyleConfiguration from '../common/StyleConfiguration'; +import Constants, { ControlCenterConfig } from '../common/Constants'; +import StyleConfiguration, { ControlCenterComponentStyle, ControlCenterComplexToggleLayoutStyle, + ControlCenterSimpleToggleLayoutStyle } from '../common/StyleConfiguration'; import ViewModel from '../viewmodel/ControlCenterVM'; import ComplexToggleLoadComponent from './ComplexToggleLoadComponent'; import SimpleToggleLoadComponent from './SimpleToggleLoadComponent'; @@ -34,9 +35,9 @@ export default struct ControlCenterComponent { private touchMoveCallback: Function; private modeChangeCallback: Function; @State mSimpleToggleColumnCount: number = Constants.DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT; - private mControlCenterComponentConfig: any = {}; + private mControlCenterComponentConfig: ControlCenterConfig; @State mIsEditSimpleToggleLayout: boolean = false; - @State style: any = StyleConfiguration.getControlCenterComponentStyle(); + @State style: ControlCenterComponentStyle = StyleConfiguration.getControlCenterComponentStyle(); private mWidthPx: number = 0; private mDisplayingSimpleToggles: string[] = []; private mHidingSimpleToggles: string[] = []; @@ -172,7 +173,7 @@ export default struct ControlCenterComponent { @Component struct ControlCenterComplexToggleLayout { @StorageLink('ControlCenterComplexToggleLayout') mComplexToggleLayout: string[] = []; - @State style: any = StyleConfiguration.getControlCenterComplexToggleLayoutStyle(); + @State style: ControlCenterComplexToggleLayoutStyle = StyleConfiguration.getControlCenterComplexToggleLayoutStyle(); aboutToAppear() { Log.showInfo(TAG_ControlCenterComplexToggleLayout, `aboutToAppear, mComplexToggleLayout: ${this.mComplexToggleLayout} `) @@ -227,7 +228,7 @@ struct ControlCenterComplexToggleLayout { struct ControlCenterSimpleToggleLayout { @Prop mColumnCount: number; @StorageLink('ControlCenterSimpleToggleLayout') mSimpleToggleLayout: string[] = []; - @State style: any = StyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); + @State style: ControlCenterSimpleToggleLayoutStyle = StyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); aboutToAppear() { Log.showInfo(TAG_ControlCenterSimpleToggleLayout, `aboutToAppear, mSimpleToggleLayout: ${this.mSimpleToggleLayout} `); diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets index 0b1f7dd7..1f65cdd2 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditComponent.ets @@ -15,7 +15,8 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import Constants from '../common/Constants'; -import StyleConfiguration from '../common/StyleConfiguration'; +import StyleConfiguration, { SimpleToggleLayoutEditComponentStyle, SimpleToggleLayoutEditUpTitleStyle, + SimpleToggleLayoutEditOptMsgStyle } from '../common/StyleConfiguration'; import SimpleToggleLayoutEditGrid from './SimpleToggleLayoutEditGrid'; import SimpleToggleLayoutEditDialogComponent from './SimpleToggleLayoutEditDialogComponent'; @@ -33,7 +34,7 @@ export default struct SimpleToggleLayoutEditComponent { private onSaveDisplayingToggles: (toggles: string[]) => void; @State mNewDisplayingToggles: string[] = []; @State mNewHidingToggles: string[] = []; - @State style: any = StyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); + @State style: SimpleToggleLayoutEditComponentStyle = StyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); @State mOptMsg: Resource = $r('app.string.control_center_simple_toggle_layout_edit_opt_desc'); private mDisplayingTogglesMaxCount: number = Constants.SIMPLE_TOGGLE_LAYOUT_MAX_TOGGLE_COUNT; private mDisplayingTogglesMinCount: number = Constants.SIMPLE_TOGGLE_LAYOUT_MIN_TOGGLE_COUNT; @@ -364,8 +365,8 @@ export default struct SimpleToggleLayoutEditComponent { @Component struct SimpleToggleLayoutEditUpTitle { - private simpleToggleLayoutEditEndCallback: Function - @State style: any = StyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle() + private simpleToggleLayoutEditEndCallback: Function; + @State style: SimpleToggleLayoutEditUpTitleStyle = StyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle(); aboutToAppear() { Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToAppear'); @@ -406,7 +407,7 @@ struct SimpleToggleLayoutEditUpTitle { @Component struct SimpleToggleLayoutEditOptMsg { @Link mOptMsg: Resource; - @State style: any = StyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); + @State style: SimpleToggleLayoutEditOptMsgStyle = StyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); aboutToAppear() { Log.showInfo(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToAppear'); diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets index b26a73ae..b005bdeb 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditDialogComponent.ets @@ -14,7 +14,7 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import StyleConfiguration from '../common/StyleConfiguration'; +import StyleConfiguration, { ControlEditDialogStyle } from '../common/StyleConfiguration'; const TAG = 'Control-SimpleToggleLayoutEditDialogComponent'; @@ -26,7 +26,7 @@ export default struct SimpleToggleLayoutEditDialogComponent { private controller: CustomDialogController; private leftAction: () => void; private rightAction: () => void; - @State style: any = StyleConfiguration.getControlEditDialogStyle(); + @State style: ControlEditDialogStyle = StyleConfiguration.getControlEditDialogStyle(); aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); @@ -72,7 +72,7 @@ export default struct SimpleToggleLayoutEditDialogComponent { Divider() .vertical(true) - .color(this.style.editDialogDividerColor) + .backgroundColor(this.style.editDialogDividerColor) .strokeWidth(this.style.editDialogDividerWidth) .height(this.style.editDialogDividerHeight) diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets index 16b5352c..ee0cf5a0 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLayoutEditGrid.ets @@ -15,7 +15,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import SimpleToggleLoadComponent from './SimpleToggleLoadComponent'; -import StyleConfiguration from '../common/StyleConfiguration'; +import StyleConfiguration, { SimpleToggleLayoutEditGridStyle } from '../common/StyleConfiguration'; const TAG = 'Control-SimpleToggleLayoutEditGrid'; @@ -30,7 +30,7 @@ export default struct SimpleToggleLayoutEditGrid { private logTag: string = ''; private onItemDragStart: (toggleName: string) => void; private onItemDrop: (status: string) => void; - @State style: any = StyleConfiguration.getSimpleToggleLayoutEditGridStyle(); + @State style: SimpleToggleLayoutEditGridStyle = StyleConfiguration.getSimpleToggleLayoutEditGridStyle(); private mCurrentDragToggleName: string = ''; @Builder DragComponent() { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets index a9d28390..688d4db7 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/UpTitle.ets @@ -15,9 +15,9 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager"; -import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import { obtainStartAbility } from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; import Constants from '../common/Constants'; -import StyleConfiguration from '../common/StyleConfiguration'; +import StyleConfiguration, { ControlCenterUpTitleStyle } from '../common/StyleConfiguration'; const TAG = 'Control-UpTitle'; @@ -31,7 +31,7 @@ export default struct UpTitle { @State moveY: number = 0; @State mSettingIsHover: boolean = false; @State mEditIsHover: boolean = false; - @State style: any = StyleConfiguration.getControlCenterUpTitleStyle(); + @State style: ControlCenterUpTitleStyle = StyleConfiguration.getControlCenterUpTitleStyle(); aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts index 4dab2f5f..8c46a5d4 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts @@ -15,28 +15,28 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import {ControlComponentData} from '../common/Constants'; +import { ControlComponentData, ControlCenterConfig } from '../common/Constants'; import ControlCenterService from '../model/ControlCenterService'; -export const ControlCenterComplexToggleLayoutKey = "ControlCenterComplexToggleLayout"; +export const CONTROL_CENTER_COMPLEX_TOGGLE_LAYOUT_KEY = 'ControlCenterComplexToggleLayout'; -export const ControlCenterSimpleToggleLayoutKey = "ControlCenterSimpleToggleLayout"; +export const CONTROL_CENTER_SIMPLE_TOGGLE_LAYOUT_KEY = 'ControlCenterSimpleToggleLayout'; const TAG = 'ControlCenterVM'; export class ControlCenterVM { - mIsStart: boolean = false; - mComplexToggleLayout: any; - mSimpleToggleLayout: any; + mIsStart = false; + mComplexToggleLayout: SubscribedAbstractProperty; + mSimpleToggleLayout: SubscribedAbstractProperty; constructor() { - Log.showDebug(TAG, `constructor`); - this.mComplexToggleLayout = AppStorage.SetAndLink(ControlCenterComplexToggleLayoutKey, []); - this.mSimpleToggleLayout = AppStorage.SetAndLink(ControlCenterSimpleToggleLayoutKey, []); + Log.showDebug(TAG, 'constructor'); + this.mComplexToggleLayout = AppStorage.SetAndLink(CONTROL_CENTER_COMPLEX_TOGGLE_LAYOUT_KEY, new Array()); + this.mSimpleToggleLayout = AppStorage.SetAndLink(CONTROL_CENTER_SIMPLE_TOGGLE_LAYOUT_KEY, new Array()); ControlCenterService.registerListener(this); } - initViewModel(config, moduleName) { + initViewModel(config: ControlCenterConfig, moduleName: string): void { if (this.mIsStart) { return; } @@ -68,7 +68,7 @@ export class ControlCenterVM { if (itemData) { AppStorage.SetOrCreate(storageKey, itemData); } else { - let deleteRs: boolean = AppStorage.Delete(storageKey); + let deleteRs = AppStorage.Delete(storageKey); Log.showDebug(TAG, `setItemData, AppStorage.Delete rs: ${deleteRs} `); } } @@ -80,12 +80,12 @@ export class ControlCenterVM { } getHidingSimpleToggles(): string[] { - Log.showDebug(TAG, `getHidingSimpleToggles`); + Log.showDebug(TAG, 'getHidingSimpleToggles'); return ControlCenterService.getHidingSimpleToggles(); } - getDefaultSimpleToggleLayout() { - Log.showDebug(TAG, `getDefaultSimpleToggleLayout`); + getDefaultSimpleToggleLayout(): string[] { + Log.showDebug(TAG, 'getDefaultSimpleToggleLayout'); return ControlCenterService.getDefaultSimpleToggleLayout(); } @@ -97,4 +97,4 @@ export class ControlCenterVM { let sControlCenterVM = createOrGet(ControlCenterVM, TAG); -export default sControlCenterVM as ControlCenterVM; \ No newline at end of file +export default sControlCenterVM; \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/resources/base/element/float.json b/features/controlcentercomponent/src/main/resources/base/element/float.json index 1b9223b5..613a32a9 100644 --- a/features/controlcentercomponent/src/main/resources/base/element/float.json +++ b/features/controlcentercomponent/src/main/resources/base/element/float.json @@ -72,18 +72,6 @@ "name": "control_center_title_icon_height", "value": "48vp" }, - { - "name": "control_center_title_icon_hover_width", - "value": "64vp" - }, - { - "name": "control_center_title_icon_hover_height", - "value": "64vp" - }, - { - "name": "control_center_title_icon_hover_radius", - "value": "16vp" - }, { "name": "control_center_title_margin_left", "value": "72vp" @@ -232,10 +220,6 @@ "name": "simple_toggle_edit_dialog_divider_height", "value": "36vp" }, - { - "name": "simple_toggle_edit_dialog_divider_width", - "value": "1vp" - }, { "name": "simple_toggle_edit_dialog_btn_margin_lf", "value": "24vp" diff --git a/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts b/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts index 12803342..8c993d32 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -14,9 +14,8 @@ */ export default class Constants { - } export class LocationData { - isEnabled: boolean; + isEnabled = false; } \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index fd836f66..7dcd9954 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -14,18 +14,19 @@ */ import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; -import Constants from './Constants'; const TAG = 'location-StyleConfiguration'; +export class StartsBarLocationComponentStyle { + statusBarLocationWidth: Length = $r('app.float.status_bar_location_width'); + statusBarLocationHeight: Length = $r('app.float.status_bar_location_height'); +} + export default class StyleConfiguration { - static getStartsBarLocationComponentStyle() { - const key: string = TAG + "-startsBarLocation"; + static getStartsBarLocationComponentStyle(): StartsBarLocationComponentStyle { + const key: string = TAG + '-startsBarLocation'; return StyleManager.getStyle(key, () => { - return { - statusBarLocationWidth:$r('app.float.status_bar_location_width'), - statusBarLocationHeight: $r('app.float.status_bar_location_height'), - }; + return new StartsBarLocationComponentStyle(); }); } } \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts index 40429d13..ea8479ad 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/model/LocationService.ts @@ -19,62 +19,71 @@ import createOrGet from '../../../../../../../../common/src/main/ets/default/Sin const TAG = 'LocationModel'; +export interface LocationStatrListener { + updateServiceState(status: boolean): void; +} + export class LocationService { - mIsStart: boolean = false; - mListener: any; + mIsStart = false; + mListener: LocationStatrListener; - startService() { + startService(): void { if (this.mIsStart) { return; } - Log.showInfo(TAG, `startService`); + Log.showInfo(TAG, 'startService'); this.mIsStart = true; this.getServiceState(); - geolocation.on('locationServiceState', (state) => { + geolocation.on('locationServiceState', (state: boolean) => { Log.showInfo(TAG, `startService locationChange, state: ${JSON.stringify(state)}`); this.getServiceState(); }); } - stopService() { + stopService(): void { if (!this.mIsStart) { return; }; - Log.showInfo(TAG, `stopService`); + Log.showInfo(TAG, 'stopService'); this.mIsStart = false; - geolocation.off('locationServiceState', (state) => { + geolocation.off('locationServiceState', (state: boolean) => { Log.showInfo(TAG, `stopService locationChange, state: ${JSON.stringify(state)}`) }); } - registerListener(listener: { - 'updateServiceState': Function, - }) { + registerListener(listener: LocationStatrListener): void { Log.showInfo(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; } - getServiceState() { - Log.showDebug(TAG, `getServiceState`); + getServiceState(): void { + Log.showDebug(TAG, 'getServiceState'); geolocation.isLocationEnabled().then((data) => { Log.showInfo(TAG, `getServiceState isLocationEnabled, data: ${JSON.stringify(data)}`); this.mListener?.updateServiceState(data); + }).then(() => { + }).catch((err) => { }); } - enableLocation() { - Log.showInfo(TAG, `enableLocation`); + enableLocation(): void { + Log.showInfo(TAG, 'enableLocation'); geolocation.enableLocation() - .then((res) => Log.showInfo(TAG, `enableLocation, result: ${JSON.stringify(res)}`)); + .then((res) => Log.showInfo(TAG, `enableLocation, result: ${JSON.stringify(res)}`)) + .then(() => { + }).catch((err) => { + }); } - disableLocation() { - Log.showInfo(TAG, `disableLocation`); + disableLocation(): void { + Log.showInfo(TAG, 'disableLocation'); geolocation.disableLocation() - .then((res) => Log.showInfo(TAG, `disableLocation, result: ${JSON.stringify(res)}`)); + .then((res) => Log.showInfo(TAG, `disableLocation, result: ${JSON.stringify(res)}`)).then(() => { + }).catch((err) => { + }); } } let sLocationService = createOrGet(LocationService, TAG); -export default sLocationService as LocationService; \ No newline at end of file +export default sLocationService; \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets index 9063f0f8..8639b3ed 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets +++ b/features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent.ets @@ -14,9 +14,10 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; -import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; -import StyleConfiguration from '../common/StyleConfiguration'; +import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import StyleConfiguration, { StartsBarLocationComponentStyle } from '../common/StyleConfiguration'; import Constants from '../common/Constants'; import ViewModel from '../viewmodel/LocationVM'; @@ -26,8 +27,8 @@ const TAG = 'location-StatusBarIconItemLocationComponent'; export default struct StatusBarIconItemLocationComponent { @StorageLink('LocationServiceUseStatus') LocationServiceUseStatus: boolean = false; @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); - @State style: any = StyleConfiguration.getStartsBarLocationComponentStyle(); - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle(); + @State style: StartsBarLocationComponentStyle = StyleConfiguration.getStartsBarLocationComponentStyle(); + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle(); aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); diff --git a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts index 9c8fce6e..1ed90cf0 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/viewmodel/LocationVM.ts @@ -14,30 +14,31 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; -import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; +import { TintContentInfo, getOrCreateTintContentInfo +} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import {LocationData} from '../common/Constants'; +import { LocationData } from '../common/Constants'; import LocationService from '../model/LocationService'; const TAG = 'LocationVM'; export class LocationVM { - mIsStart: boolean = false; + mIsStart = false; mLocationData: LocationData = { ...new LocationData() - } + }; mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.LOCATION); constructor() { - Log.showDebug(TAG, `constructor`); + Log.showDebug(TAG, 'constructor'); } - initViewModel() { + initViewModel(): void { if (this.mIsStart) { return; }; - Log.showInfo(TAG, `initViewModel `); + Log.showInfo(TAG, 'initViewModel '); this.mIsStart = true; this.mLocationData = AppStorage.SetAndLink(TAG + '_LocationData', this.mLocationData).get(); LocationService.registerListener(this); @@ -45,22 +46,22 @@ export class LocationVM { } getLocationData(): LocationData { - Log.showDebug(TAG, `getLocationData`); + Log.showDebug(TAG, 'getLocationData'); return this.mLocationData; } - updateServiceState(state) { + updateServiceState(state: boolean): void { Log.showInfo(TAG, `updateServiceState, state: ${state} `); this.mLocationData.isEnabled = state; } - enableLocation() { - Log.showInfo(TAG, `enableLocation`); + enableLocation(): void { + Log.showInfo(TAG, 'enableLocation'); LocationService.enableLocation(); } - disableLocation() { - Log.showInfo(TAG, `disableLocation`); + disableLocation(): void { + Log.showInfo(TAG, 'disableLocation'); LocationService.disableLocation(); } @@ -71,4 +72,4 @@ export class LocationVM { let sLocationVM = createOrGet(LocationVM, TAG); -export default sLocationVM as LocationVM; \ No newline at end of file +export default sLocationVM; \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts b/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts index a03a9775..045bfd93 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/common/constants.ts @@ -14,21 +14,21 @@ */ export default class Constants { - static WH_45_100 = '45%'; - static WH_50_100 = '50%'; - static WH_60_100 = '60%'; - static WH_70_100 = '70%'; - static WH_90_100 = '90%'; - static WH_100_100 = '100%'; - static MAX_LINES_1 = 1; - static MAX_LINES_2 = 2; - static MAX_LINES_3 = 3; - static TIME_EMPTY = '00:00'; - static DATE_YEAR_IDX = 0; - static DATE_MONTH_IDX = 1; - static DATE_DAY_IDX = 2; - static DATE_HOUR_IDX = 3; - static DATE_MINUTE_IDX = 4; + static readonly WH_45_100 = '45%'; + static readonly WH_50_100 = '50%'; + static readonly WH_60_100 = '60%'; + static readonly WH_70_100 = '70%'; + static readonly WH_90_100 = '90%'; + static readonly WH_100_100 = '100%'; + static readonly MAX_LINES_1 = 1; + static readonly MAX_LINES_2 = 2; + static readonly MAX_LINES_3 = 3; + static readonly TIME_EMPTY = '00:00'; + static readonly DATE_YEAR_IDX = 0; + static readonly DATE_MONTH_IDX = 1; + static readonly DATE_DAY_IDX = 2; + static readonly DATE_HOUR_IDX = 3; + static readonly DATE_MINUTE_IDX = 4; } /** diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index 88e2c26e..ff5e9c7e 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -12,65 +12,70 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' -import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import Bundle from '@ohos.bundle'; +import { BundleInfo } from 'bundle/bundleInfo'; import ResMgr from '@ohos.resourceManager'; -import SwitchUserManager from '../../../../../../../../common/src/main/ets/default/SwitchUserManager' +import {BusinessError} from 'basic'; +import SwitchUserManager from '../../../../../../../../common/src/main/ets/default/SwitchUserManager'; const INDEX = 0; const IS_INCLUDE_ABILITY_INFO = 0; const TAG = 'NotificationManagenment-BundleResourceModel'; +export interface BundleItemData { + appIcon?: string; + appTitle?: string; + appValue?: string; + appArrow?: string|Resource; + appSummary?: string; + appBundleName?: string; + appIconId?: string; + appUri?: string; + appUid?: number; + systemApp?: boolean; +} + export default class BundleResourceModel { - private mBundleInfoList: any[]= []; + private readonly mBundleInfoList: BundleItemData[] = []; - async getAllBundleInfos() { + async getAllBundleInfos(): Promise { let userId =(await SwitchUserManager.getInstance().getCurrentUserInfo()).userId; - Bundle.getAllBundleInfo(IS_INCLUDE_ABILITY_INFO, userId) - .then((data) => { - this.getIconItem(INDEX, data.length, data); - }); + await Bundle.getAllBundleInfo(IS_INCLUDE_ABILITY_INFO, userId).then((data: BundleInfo[]) => { + void this.getIconItem(INDEX, data.length, data); + }); Log.showInfo(TAG, 'getAllBundleInfos end'); } - async getIconItem(index, count, data) { - Log.showInfo(TAG, 'getIconItem data.length' + data.length); - let imageValue = ''; + async getIconItem(index: number, count: number, data: BundleInfo[]): Promise { + Log.showInfo(TAG, `getIconItem data.length ${data.length}`); let label = ''; let that = this; - Log.showDebug(TAG, 'getIconItem data[index].name :' + data[index].name); try { let bundleContext = await AbilityManager.getContext().createBundleContext(data[index].name); let bundleResourceManager = await bundleContext.resourceManager; - let appInfo = data[index].appInfo; - if (appInfo.labelId > 0) { - bundleResourceManager.getString(appInfo.labelId, (error, value) => { - if (value != null) { - Log.showDebug(TAG, 'getIconItem ResMgr.getResourceManager getString() value:' + value); + if (parseInt(appInfo.labelId) > 0) { + bundleResourceManager.getString(parseInt(appInfo.labelId), (error: BusinessError, value: string) => { + if (value) { label = value; - } else { - Log.showError(TAG, 'getIconItem ResMgr.getResourceManager getString() error:' + error); } }); } else { label = appInfo.label; } Log.showDebug(TAG, 'getIconItem ResMgr.getResourceManager finish label:' + label); - if (appInfo.iconId <= 0) { - this.nextIconItem(index, count, data, this.mBundleInfoList, that) - return + if (parseInt(appInfo.iconId) <= 0) { + this.nextIconItem(index, count, data, this.mBundleInfoList, that); + return; } - bundleResourceManager.getMediaBase64(appInfo.iconId, (error, value) => { - if (error === undefined) { - Log.showDebug(TAG, 'getIconItem ResMgr.getMediaBase64() value:' + value.length); - if (value.length > 0) { - imageValue = value; - } - this.mBundleInfoList.push({ - appIcon: imageValue, + bundleResourceManager.getMediaBase64(parseInt(appInfo.iconId), (error: BusinessError, value: string) => { + if (value) { + Log.showInfo(TAG, `getIconItem ResMgr.getMediaBase64() imageValue:${value}` ); + let bundleItemData: BundleItemData = { + appIcon: value, appTitle: label, appValue: '', appArrow: $r('app.media.ic_settings_arrow'), @@ -80,70 +85,67 @@ export default class BundleResourceModel { appUri: 'pages/setEnable', appUid: data[index].uid, systemApp: appInfo.systemApp - }); + }; + this.mBundleInfoList.push(bundleItemData); } - Log.showInfo(TAG, 'getIconItem ResMgr.getMediaBase64() end'); - this.nextIconItem(index, count, data, this.mBundleInfoList, that) + this.nextIconItem(index, count, data, this.mBundleInfoList, that); }); } catch (error) { - Log.showError(TAG, `getMediaBase64 err:${JSON.stringify(error)}`); + Log.showError(TAG, `getIconItem catch error: ${JSON.stringify(error)}`); } } - nextIconItem(index, count, data, bundleInfoList, that) { + nextIconItem(index: number, count: number, data: BundleInfo[], bundleInfoList: BundleItemData[], that: BundleResourceModel): void { Log.showInfo(TAG, 'nextIconItem index:' + index + ' | count:' + count); if (count - 1 > index) { index = index + 1; - that.getIconItem(index, count, data); + void that.getIconItem(index, count, data); } else { AppStorage.SetOrCreate('appManagementList', bundleInfoList); } } - async getBundleInfo(bundleName, callback) { - let mBundleInfo: any = {}; + async getBundleInfo(bundleName: string, callback: {(data: BundleItemData): void}): Promise { + let mBundleInfo: BundleItemData = {}; let label = ''; - let userInfo = await SwitchUserManager.getInstance().getCurrentUserInfo(); - Bundle.getBundleInfo(bundleName, IS_INCLUDE_ABILITY_INFO, { + await Bundle.getBundleInfo(bundleName, IS_INCLUDE_ABILITY_INFO, { userId: userInfo.userId }).then((data) => { Log.showInfo(TAG, `getBundleInfo bundleInfo:${JSON.stringify(data)}`); - ResMgr.getResourceManager(data.name, (error, item) => { + ResMgr.getResourceManager(data.name, (error: Error, item) => { let appInfo = data.appInfo; if (parseInt(appInfo.labelId) > 0) { - item.getString(parseInt(appInfo.labelId), (error, value) => { - if (value != null) { - Log.showDebug(TAG, `getBundleInfo getResourceManager getString() value: ` + value); - mBundleInfo.appTitle = value + item.getString(parseInt(appInfo.labelId), (error: Error, value: string) => { + if (value) { + Log.showDebug(TAG, `getBundleInfo getResourceManager getString() value:${JSON.stringify(value)}`); + mBundleInfo.appTitle = value; } else { Log.showError(TAG, `getBundleInfo getResourceManager getString() error:${JSON.stringify(error)}`); } }); } mBundleInfo.appTitle = appInfo.label; - mBundleInfo.appValue = '' - mBundleInfo.appArrow = $r('app.media.ic_settings_arrow') - mBundleInfo.appSummary = data.versionName - mBundleInfo.appBundleName = data.name - mBundleInfo.appIconId = appInfo.iconId - mBundleInfo.appUri = '' - mBundleInfo.appUid = data.uid - mBundleInfo.systemApp = appInfo.systemApp - + mBundleInfo.appValue = ''; + mBundleInfo.appArrow = $r('app.media.ic_settings_arrow'); + mBundleInfo.appSummary = data.versionName; + mBundleInfo.appBundleName = data.name; + mBundleInfo.appIconId = appInfo.iconId; + mBundleInfo.appUri = ''; + mBundleInfo.appUid = data.uid; + mBundleInfo.systemApp = appInfo.systemApp; Log.showDebug(TAG, 'getBundleInfo getResourceManager label:' + label); if (parseInt(appInfo.iconId) > 0) { - item.getMediaBase64(parseInt(appInfo.iconId), (error, imageValue) => { + item.getMediaBase64(parseInt(appInfo.iconId), (error: Error, imageValue: string) => { if (!!imageValue) { - mBundleInfo.appIcon = imageValue + mBundleInfo.appIcon = imageValue; } callback(mBundleInfo); }); } else { callback(mBundleInfo); } - }); }); Log.showInfo(TAG, 'getBundleInfo end'); diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts index eba16690..2cb61f97 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/noDisturbingModel.ts @@ -12,9 +12,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; import Notification from '@ohos.notification'; -import ConfigData, {DoNotDisturbType} from '../common/constants' +import {DoNotDisturbType} from '../common/constants'; import TimeManager from '../../../../../../../../common/src/main/ets/default/TimeManager'; const TAG = 'NotificationManagenment-NoDisturbingModel'; @@ -22,15 +22,27 @@ const MK_DATE_SPLIT = '-'; const MK_NUM_FILL = '0'; const VALUE_NUM_FILL = 10; +export interface DoNotDisturbDateStr { + type?: number; + begin?: string; + end?: string; +} + +export interface DoNotDisturbDate { + type: number; + begin: Date; + end: Date; +} + export default class NoDisturbingModel { - static getNoDisturbingDate(callback) { + static getNoDisturbingDate(callback: { (data: DoNotDisturbDateStr): void;}): void { Notification.getDoNotDisturbDate((error, data) => { if (error.code != 0) { Log.showError(TAG, 'getNoDisturbingDate error:' + JSON.stringify(error)); } else { Log.showDebug(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); - let noDisturbingData = {} - noDisturbingData['type'] = data.type + let noDisturbingData: DoNotDisturbDateStr= { }; + noDisturbingData['type'] = data.type; if (data.type == DoNotDisturbType.TYPE_CLEARLY) { noDisturbingData['begin'] = this.formatDateTime(data.begin) ; noDisturbingData['end'] = this.formatDateTime(data.end) ; @@ -38,22 +50,19 @@ export default class NoDisturbingModel { noDisturbingData['begin'] = this.formatTime(data.begin) ; noDisturbingData['end'] = this.formatTime(data.end) ; } - callback(noDisturbingData) + callback(noDisturbingData); } - }) + }); } - static setNoDisturbingDate(noDisturbingTime, callback) { - let targetDate: Notification.DoNotDisturbDate = { - type: noDisturbingTime.type, - begin: noDisturbingTime.begin, - end: noDisturbingTime.end } - Log.showDebug(TAG, `setDoNotDisturbDate targetDate['type'] : ` + JSON.stringify(targetDate['type']) + - ` ['begin'] : ` + JSON.stringify(targetDate['begin']) + ` ['end'] : ` + JSON.stringify(targetDate['end'])); - Notification.setDoNotDisturbDate(targetDate, callback) + static setNoDisturbingDate(noDisturbingTime: DoNotDisturbDate, callback: {(): void}): void { + let targetDate = noDisturbingTime; + Log.showDebug(TAG, `Notification.setDoNotDisturbDate targetDate['type'] : ${JSON.stringify(targetDate)}`); + Notification.setDoNotDisturbDate(targetDate, callback); } + static formatDate (data: Date): string { - let result = data.getFullYear() + MK_DATE_SPLIT; + let result = data.getFullYear().toString() + MK_DATE_SPLIT; let numTmp = data.getMonth() + 1; if (numTmp < VALUE_NUM_FILL) { result += MK_NUM_FILL; @@ -75,5 +84,5 @@ export default class NoDisturbingModel { static formatTime (data: Date): string { return TimeManager.formatTime(data); } - } +} diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts index 629a057e..c0f4d242 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts @@ -12,117 +12,124 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/Log' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; import Notification from '@ohos.notification'; +import {EnabledNotificationCallbackData} from 'notification/notificationSubscriber'; +import { NotificationSlot } from 'notification/notificationSlot'; const TAG = 'NotificationManagenment-NotificationListener'; interface EnableListener { bundle: string; - onEnableChanged: Function; + onEnableChanged: {(value: boolean): void}; +} + +export interface BundleOption { + bundle: string; + uid?: number; } export class NotificationListener { - private listeners= new Set(); + private readonly listeners= new Set(); - subscribeEnableChanged() { - Log.showInfo(TAG, `subscribeEnableChanged`); + subscribeEnableChanged(): void { + Log.showInfo(TAG, 'subscribeEnableChanged'); Notification.subscribe({ onEnabledNotificationChanged: this.handleEnabledNotificationChanged.bind(this) }, () => { - Log.showInfo(TAG, `subscribeEnableChanged finished`); + Log.showInfo(TAG, 'subscribeEnableChanged finished'); }); } - unsubscribeEnableChanged() { - Log.showInfo(TAG, `unsubscribeEnableChanged`); + unsubscribeEnableChanged(): void { + Log.showInfo(TAG, 'unsubscribeEnableChanged'); this.unRegisterAll(); Notification.unsubscribe({ onEnabledNotificationChanged: this.handleEnabledNotificationChanged.bind(this) }, () => { - Log.showInfo(TAG, `unsubscribeEnableChanged finished`); + Log.showInfo(TAG, 'unsubscribeEnableChanged finished'); }); } - handleEnabledNotificationChanged(data) { + handleEnabledNotificationChanged(data: EnabledNotificationCallbackData): void { Log.showDebug(TAG, `handleEnabledNotificationChanged data:${JSON.stringify(data)} `); this.listeners.forEach((listener) => { - if (!!listener && listener.bundle == data.bundle) { + if (listener.bundle == data.bundle) { listener.onEnableChanged(data.enable); } else { Log.showError(TAG, `handleEnabledNotificationChanged error`); } - }) + }); } - register(listener: EnableListener) { + register(listener: EnableListener): void { this.listeners.add(listener); - Log.showInfo(TAG, `register finished`); + Log.showInfo(TAG, 'register finished'); } - unRegister(listener: EnableListener) { + unRegister(listener: EnableListener): void { this.listeners.delete(listener); - Log.showInfo(TAG, `unRegister finished`); + Log.showInfo(TAG, 'unRegister finished'); } - unRegisterAll() { + unRegisterAll(): void { this.listeners.clear(); - Log.showInfo(TAG, `unRegisterAll finished`); + Log.showInfo(TAG, 'unRegisterAll finished'); } - isNotificationEnabled(bundleOption): Promise { - Log.showDebug(TAG, `isNotificationEnabled bundleOption:${JSON.stringify(bundleOption)} `) + async isNotificationEnabled(bundleOption: BundleOption): Promise { + Log.showDebug(TAG, `isNotificationEnabled bundleOption:${JSON.stringify(bundleOption)} `); return new Promise((resolve, reject) => { Notification.isNotificationEnabled(bundleOption, (err, data) => { - Log.showInfo(TAG, `isNotificationEnabled callback data:${JSON.stringify(data)} err:${JSON.stringify(err)}`) + Log.showInfo(TAG, `isNotificationEnabled callback data:${JSON.stringify(data)} err:${JSON.stringify(err)}`); if (!!data) { resolve(data); } else { reject(err); } - }) + }); }); } - enableNotification(bundleOption, data) { - Log.showDebug(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`) - let enableValue: boolean = data ? true : false + enableNotification(bundleOption: BundleOption, data: boolean): void { + Log.showDebug(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); + let enableValue: boolean = data ? true : false; Notification.enableNotification(bundleOption, enableValue, (err, result) => { Log.showInfo(TAG, `enableNotification err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); - }) + }); } - notificationSlotSet(bundleOption, data) { + notificationSlotSet(bundleOption: BundleOption, data: NotificationSlot): void { Log.showDebug(TAG, `notificationSlotSet bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); Notification.setSlotByBundle(bundleOption, data, (err, result) => { Log.showInfo(TAG, `notificationSlotSet err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); - }) + }); } - isDistributedEnabled(): Promise { - Log.showInfo(TAG, `isDistributedEnabled`); + async isDistributedEnabled(): Promise { + Log.showInfo(TAG, 'isDistributedEnabled'); return new Promise((resolve, reject) => { Notification.isDistributedEnabled().then((data) => { - Log.showInfo(TAG, `isDistributedEnabled data:${data}`); + Log.showInfo(TAG, `isDistributedEnabled data:${data?'true':'false'}`); resolve(data); }).catch((err) => { Log.showError(TAG, `isDistributedEnabled err:${JSON.stringify(err)}`); reject(err); - }) + }); }); } - enableDistributed(data) { + enableDistributed(data: boolean): void { Log.showDebug(TAG, `enableDistributed data:${JSON.stringify(data)}`); - let enableValue: boolean = data ? true : false + let enableValue: boolean = data ? true : false; Notification.enableDistributed(enableValue, (err, result) => { Log.showInfo(TAG, `enableDistributed err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); - }) + }); } } -let notificationListener = new NotificationListener() +let notificationListener = new NotificationListener(); -export default notificationListener as NotificationListener +export default notificationListener ; diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets index 1563adca..708aad89 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appLstComponent.ets @@ -26,7 +26,7 @@ export default struct AppLstComponent { aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear`); - ViewModel.ViewModelInit(); + ViewModel.viewModelInit(); } aboutToDisappear(): void{ diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets index 04e22b7b..d83628e5 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/noDisturbComponent.ets @@ -31,14 +31,14 @@ export default struct NoDisturbComponent { aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear`); - this.mViewModel.ViewModelInit(); + this.mViewModel.viewModelInit(); this.mPrevGetCnt = 0; this.mRefreshCnt++; } onRefresh(propName: string): void { Log.showInfo(TAG, `onRefresh`); - this.mViewModel.ViewModelInit(); + this.mViewModel.viewModelInit(); this.mPrevGetCnt = 0; this.mRefreshCnt++; } diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts b/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts index 258836cd..ce5fdb05 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/appLstComponentViewModel.ts @@ -17,18 +17,18 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import BundleResourceModel from '../model/bundleResourceModel'; -const TAG = 'ManagementComponent-AppLstComponentViewModel' +const TAG = 'ManagementComponent-AppLstComponentViewModel'; export class AppLstComponentViewModel { - bundleInfoList: any[]= []; + bundleInfoList = []; - ViewModelInit(): void{ + viewModelInit(): void{ Log.showInfo(TAG, 'ViewModelInit'); - let dataModel:BundleResourceModel = new BundleResourceModel() - dataModel.getAllBundleInfos() + let dataModel: BundleResourceModel = new BundleResourceModel(); + void dataModel.getAllBundleInfos(); } } let appLstComponentViewModel = new AppLstComponentViewModel(); -export default appLstComponentViewModel as AppLstComponentViewModel; \ No newline at end of file +export default appLstComponentViewModel ; \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts index 4899d611..6152d1e4 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts @@ -14,57 +14,57 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil' +import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil'; import NoDisturbingModel from '../model/noDisturbingModel'; -import ConfigData, {DoNotDisturbType} from '../common/constants' +import ConfigData, {DoNotDisturbType} from '../common/constants'; -const TAG = 'ManagementComponent-NoDisturbComponentViewModel' +const TAG = 'ManagementComponent-NoDisturbComponentViewModel'; export default class NoDisturbComponentViewModel { - defaultStartTime: Date= new Date() - defaultEndTime: Date= new Date() - startTime: string = '' - endTime: string = '' - repeatMode: number = 0 - repeatName: any = '' - prompt: string - isEffective: boolean - nextDayLabel: string = '' + defaultStartTime: Date= new Date(); + defaultEndTime: Date= new Date(); + startTime = ''; + endTime = ''; + repeatMode = 0; + repeatName: any = ''; + prompt = ''; + isEffective = true; + nextDayLabel = ''; - ViewModelInit(): void{ + viewModelInit(): void{ Log.showInfo(TAG, 'ViewModelInit'); - this.getNextDayLabel(); - this.getNoDisturbingDate.bind(this)() + void this.getNextDayLabel(); + this.getNoDisturbingDate.bind(this)(); } - getNoDisturbingDate() { + getNoDisturbingDate(): void { Log.showInfo(TAG, 'getNoDisturbingDate'); NoDisturbingModel.getNoDisturbingDate((data) => { Log.showDebug(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); - this.repeatMode = data.type - this.startTime = data.begin - this.endTime = data.end + this.repeatMode = data.type??0; + this.startTime = data.begin??''; + this.endTime = data.end??''; Log.showDebug(TAG, `getNoDisturbingDate repeatMode : ${this.repeatMode} startTime : ${this.startTime} endTime : ${this.endTime}`); this.repeatName = this.refreshRepeatName(this.repeatMode); - this.setClues.bind(this)() - }) + this.setClues.bind(this)(); + }); } - setNoDisturbingDate() { + setNoDisturbingDate(): void { if (!this.isEffective) { - this.repeatMode = DoNotDisturbType.TYPE_NONE + this.repeatMode = DoNotDisturbType.TYPE_NONE; } Log.showDebug(TAG, `this.repeatMode is : ${this.repeatMode}`); let noDisturbingTime = { type: this.repeatMode, begin: this.defaultStartTime, end: this.defaultEndTime - } + }; NoDisturbingModel.setNoDisturbingDate(noDisturbingTime, () => { Log.showInfo(TAG, 'setNoDisturbingDate is success'); - }) + }); } - setClues() { - Log.showInfo(TAG, `setClues`); + setClues(): void { + Log.showInfo(TAG, 'setClues'); if (this.repeatMode == DoNotDisturbType.TYPE_DAILY || this.repeatMode == DoNotDisturbType.TYPE_ONCE || this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { @@ -76,8 +76,8 @@ export default class NoDisturbComponentViewModel { this.setCluesWithoutSetEffect(); Log.showDebug(TAG, `this.prompt : ${this.prompt}`); } - setCluesWithoutSetEffect() { - Log.showInfo(TAG, `setCluesWithoutSetEffect start`); + setCluesWithoutSetEffect(): void { + Log.showInfo(TAG, 'setCluesWithoutSetEffect start'); if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { this.prompt = this.getDateTimeLabel(this.startTime) + ' - ' + this.getDateTimeLabel(this.endTime); this.defaultStartTime = this.getDateByDateTime(this.startTime); @@ -91,13 +91,13 @@ export default class NoDisturbComponentViewModel { this.defaultStartTime = this.getDateByHHMI(this.startTime); this.defaultEndTime = this.getDateByHHMI(this.endTime); } else { - this.prompt = '' + this.prompt = ''; this.defaultStartTime = this.getDateByHHMI(this.startTime); this.defaultEndTime = this.getDateByHHMI(this.endTime); } - Log.showInfo(TAG, `setCluesWithoutSetEffect end`); + Log.showInfo(TAG, 'setCluesWithoutSetEffect end'); } - refreshDate(repeatMode: number, inputStartTime: Date, inputEndTime: Date) { + refreshDate(repeatMode: number, inputStartTime: Date, inputEndTime: Date): void { this.defaultStartTime = inputStartTime; this.defaultEndTime = inputEndTime; if (repeatMode == DoNotDisturbType.TYPE_CLEARLY) { @@ -108,8 +108,9 @@ export default class NoDisturbComponentViewModel { this.endTime = NoDisturbingModel.formatTime(this.defaultEndTime) ; } } - refreshRepeatName(inputRepeatMode: number): any { - let result = null; + + refreshRepeatName(inputRepeatMode: number): string | Resource { + let result: string | Resource = ''; if (inputRepeatMode == DoNotDisturbType.TYPE_ONCE) { result = $r('app.string.noDisturb_once'); } else if (inputRepeatMode == DoNotDisturbType.TYPE_DAILY) { @@ -123,25 +124,25 @@ export default class NoDisturbComponentViewModel { } getDateByHHMI(selectDate: string): Date{ - Log.showInfo(TAG, `getDateByHHMI selectDate:` + selectDate); - let tempDate: Date = new Date() - let HHmiArr = selectDate.split(':') - let hour = parseInt(HHmiArr[0]) - let minute = parseInt(HHmiArr[1]) + Log.showInfo(TAG, 'getDateByHHMI selectDate:' + selectDate); + let tempDate: Date = new Date(); + let hhmiArr = selectDate.split(':'); + let hour = parseInt(hhmiArr[0]); + let minute = parseInt(hhmiArr[1]); tempDate = new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate(), hour, minute); return tempDate; } getDateByDateTime(selectDate: string): Date{ - Log.showInfo(TAG, `getDateByDateTime selectDate:` + selectDate); + Log.showInfo(TAG, 'getDateByDateTime selectDate:' + selectDate); let arrayValue = this.getValuesFromDate(selectDate); - let tempDate: Date = new Date() + let tempDate: Date = new Date(); tempDate = new Date(arrayValue[ConfigData.DATE_YEAR_IDX], arrayValue[ConfigData.DATE_MONTH_IDX] - 1, arrayValue[ConfigData.DATE_DAY_IDX], arrayValue[ConfigData.DATE_HOUR_IDX], arrayValue[ConfigData.DATE_MINUTE_IDX]); return tempDate; } - getValuesFromDate(selectDate: string) { + getValuesFromDate(selectDate: string): number[] { let arrayValue = []; let idxStart = 0; let chrFlg = false; @@ -149,7 +150,7 @@ export default class NoDisturbComponentViewModel { for (let idx = 0;idx < selectDate.length + 1;idx++) { if (isNaN(parseInt(selectDate.substring(idx, idx + 1)))) { arrayValue.push(parseInt(selectDate.substring(idxStart, idx))); - chrFlg = true + chrFlg = true; } else if (chrFlg) { idxStart = idx; chrFlg = false; @@ -158,7 +159,7 @@ export default class NoDisturbComponentViewModel { } return arrayValue; } - getDateLabel(selectDate: string) : string{ + getDateLabel(selectDate: string): string{ let result = ''; if (selectDate) { let arrayValue = this.getValuesFromDate(selectDate); @@ -170,7 +171,7 @@ export default class NoDisturbComponentViewModel { } return result; } - getDateTimeLabel(selectDate: string) : string{ + getDateTimeLabel(selectDate: string): string{ let result = ''; if (selectDate) { result += this.getDateLabel(selectDate); @@ -178,8 +179,8 @@ export default class NoDisturbComponentViewModel { } return result; } - async getNextDayLabel() { - this.nextDayLabel = await ResourceUtil.getString($r("app.string.noDisturb_nextDay")); + async getNextDayLabel(): Promise { + this.nextDayLabel = await ResourceUtil.getString($r('app.string.noDisturb_nextDay')); } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts index 7da0954e..63fe217d 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -25,7 +25,7 @@ const DEFAULT_INFO = { }; export default class CommonUtil { - static startWant(want, triggerInfo?: any) { + static startWant(want, triggerInfo?: any): void { let info = (triggerInfo) ? triggerInfo : DEFAULT_INFO; Log.showDebug(TAG, `startWant ${JSON.stringify(want)}, info ${JSON.stringify(info)}`); WantAgent.trigger(want, info, ((data) => { @@ -34,7 +34,7 @@ export default class CommonUtil { } static checkVisibilityByUser(notificationUser: number, currentUser: number): boolean{ - return (0 <= notificationUser && notificationUser < 100) || notificationUser == currentUser + return (0 <= notificationUser && notificationUser < 100) || notificationUser == currentUser; } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts index f3fe8080..bc4b9e4c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/ScrollbarManager.ts @@ -17,33 +17,33 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log'; const TAG = 'ScrollbarManager'; export default class ScrollbarManager { - static NotificationScrollBar = new Set(); + static notificationScrollBar = new Set(); - static add(scroller) { - let res = ScrollbarManager.NotificationScrollBar.add(scroller); + static add(scroller: Scroller): void { + let res = ScrollbarManager.notificationScrollBar.add(scroller); Log.showInfo(TAG, `add set's size:${res.size}`); } - static delete(scroller) { - Log.showInfo(TAG, `delete`); - ScrollbarManager.NotificationScrollBar.delete(scroller); + static delete(scroller: Scroller): void { + Log.showInfo(TAG, 'delete'); + ScrollbarManager.notificationScrollBar.delete(scroller); } - static clear() { - Log.showInfo(TAG, `clear`); - ScrollbarManager.NotificationScrollBar.clear(); + static clear(): void { + Log.showInfo(TAG, 'clear'); + ScrollbarManager.notificationScrollBar.clear(); } - static restoreOtherScroll(scroller) { - Log.showInfo(TAG, `restoreOtherScroll`); + static restoreOtherScroll(scroller: Scroller): void { + Log.showInfo(TAG, 'restoreOtherScroll'); if (scroller.currentOffset().xOffset > 0) { - ScrollbarManager.NotificationScrollBar.forEach((item) => { + ScrollbarManager.notificationScrollBar.forEach((item) => { if (item !== scroller && item.currentOffset().xOffset > 0) { - item.scrollEdge(Edge.Start) + item.scrollEdge(Edge.Start); } - }) + }); ScrollbarManager.clear(); - ScrollbarManager.NotificationScrollBar.add(scroller); + ScrollbarManager.notificationScrollBar.add(scroller); } } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts index fde0c197..4a1cfc01 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/constants.ts @@ -14,63 +14,63 @@ */ export default class Constants { - static NOTIFICATION_TYPE_BASIC: string = '0'; - static NOTIFICATION_TYPE_LONG: string = '1'; - static NOTIFICATION_TYPE_PICTURE: string = '2'; - static NOTIFICATION_TYPE_MULTILINE: string = '4'; - static NOTIFICATION_TYPE_SOCIAL: string = '3'; - static NOTIFICATION_TYPE_MEDIA: string = '5'; - static NOTIFICATION_TYPE_NONE: number = 0; - static NOTIFICATION_TYPE_OPEN: number = 1; - static NOTIFICATION_TYPE_CLOSE: number = 2; - static TEXT_MAX_LENGTH: number = 21; - static TEXT_EXPANDED_MAX_LENGTH: number = 13; - static TOUCH_TYPE_DOWN: number = 0; - static TOUCH_TYPE_UP: number = 1; - static TOUCH_TYPE_MOVE: number = 2; - static HIDDEN_TRANSLATE_X: number = 150; - static DISPLAY_TRANSLATE_X: number = -150; - static REMOVE_TRANSLATE_X: number = 150; - static DEFAULT_MAX_LINES: number= 1; - static SINGLE_LINE: number= 1; - static EXPENDED_MAX_LINES: number= 8; - static CONTENT_LINE_HEIGHT: number = 20; - static SETTING_CONT_HEIGHT = '40vp'; - static SETTING_DIALOG_WITH = '330vp'; - static SETTING_CONTENT_WITH = '100%' - static SETTING_DIALOG_HEIGHT = '192vp'; - static SETTING_DIALOG_WIDTH = '362vp'; - static CONFIRM_DIALOG_HEIGHT = '146vp'; - static CONFIRM_DIALOG_WITH = '280'; - static CONFIRM_BUTTON_WITH = '140'; - static QUICKLY_SETTING_H = 83; - static ERROR_CALLBACK: number = 0; - static SUCCESS_CALLBACK: number = 1; - static KEY_INPUT: string = 'inputAction'; - static FULL_CONTAINER_WIDTH = '100%' + static readonly NOTIFICATION_TYPE_BASIC = '0'; + static readonly NOTIFICATION_TYPE_LONG = '1'; + static readonly NOTIFICATION_TYPE_PICTURE = '2'; + static readonly NOTIFICATION_TYPE_MULTILINE = '4'; + static readonly NOTIFICATION_TYPE_SOCIAL = '3'; + static readonly NOTIFICATION_TYPE_MEDIA = '5'; + static readonly NOTIFICATION_TYPE_NONE = 0; + static readonly NOTIFICATION_TYPE_OPEN = 1; + static readonly NOTIFICATION_TYPE_CLOSE = 2; + static readonly TEXT_MAX_LENGTH = 21; + static readonly TEXT_EXPANDED_MAX_LENGTH = 13; + static readonly TOUCH_TYPE_DOWN = 0; + static readonly TOUCH_TYPE_UP = 1; + static readonly TOUCH_TYPE_MOVE = 2; + static readonly HIDDEN_TRANSLATE_X = 150; + static readonly DISPLAY_TRANSLATE_X = -150; + static readonly REMOVE_TRANSLATE_X = 150; + static readonly DEFAULT_MAX_LINES= 1; + static readonly SINGLE_LINE= 1; + static readonly EXPENDED_MAX_LINES= 8; + static readonly CONTENT_LINE_HEIGHT = 20; + static readonly SETTING_CONT_HEIGHT = '40vp'; + static readonly SETTING_DIALOG_WITH = '330vp'; + static readonly SETTING_CONTENT_WITH = '100%'; + static readonly SETTING_DIALOG_HEIGHT = '192vp'; + static readonly SETTING_DIALOG_WIDTH = '362vp'; + static readonly CONFIRM_DIALOG_HEIGHT = '146vp'; + static readonly CONFIRM_DIALOG_WITH = '280'; + static readonly CONFIRM_BUTTON_WITH = '140'; + static readonly QUICKLY_SETTING_H = 83; + static readonly ERROR_CALLBACK = 0; + static readonly SUCCESS_CALLBACK = 1; + static readonly KEY_INPUT = 'inputAction'; + static readonly FULL_CONTAINER_WIDTH = '100%'; } export class NotificationLayout { - static ACTION_HEIGHT = 48; - static ACTION_MARGIN = 12; - static INPUT_IMAGE_SIZE = 24; - static INPUT_TEXT_HEIGHT = 40; - static INPUT_LAYOUT_HEIGHT = 82; - static NOTIFICATION_PIC_SIZE = 40; - static ICON_SIZE = 24; - static TEXT_LINE_HEIGHT = 20; - static BUTTON_SIZE = 40; - static ICON_MARGIN = 12; - static SCROLL_THRESHOLD = 10; - static TITLE_IMAGE_SIZE = 16; - static TITLE_HEIGHT = 40; - static ITEM_MARGIN = 12; - static EXPAND_PADDING_BOTTOM = 20; + static readonly ACTION_HEIGHT = 48; + static readonly ACTION_MARGIN = 12; + static readonly INPUT_IMAGE_SIZE = 24; + static readonly INPUT_TEXT_HEIGHT = 40; + static readonly INPUT_LAYOUT_HEIGHT = 82; + static readonly NOTIFICATION_PIC_SIZE = 40; + static readonly ICON_SIZE = 24; + static readonly TEXT_LINE_HEIGHT = 20; + static readonly BUTTON_SIZE = 40; + static readonly ICON_MARGIN = 12; + static readonly SCROLL_THRESHOLD = 10; + static readonly TITLE_IMAGE_SIZE = 16; + static readonly TITLE_HEIGHT = 40; + static readonly ITEM_MARGIN = 12; + static readonly EXPAND_PADDING_BOTTOM = 20; } export class InputActionButtonData { - isSending: boolean = false; - content: string = ''; + isSending = false; + content = ''; } interface RuleData { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts index 6fc417c3..0f231691 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationConfig.ts @@ -16,7 +16,7 @@ import ReadConfigUtil from '../../../../../../../../../common/src/main/ets/default/ReadConfigUtil'; import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -const TAG = 'NotificationConfig' +const TAG = 'NotificationConfig'; /** * Notification Flow Config: * limitTotal:Total number of notifications that can be displayed.Beyond the range will not be displayed. @@ -27,23 +27,23 @@ const TAG = 'NotificationConfig' * --limit:Specifies the total number of notifications that the application can display. * Beyond the range will not be displayed. */ -const Config = { - "limitTotal": 10000, - "app": +const conFig = { + 'limitTotal': 10000, + 'app': [ - { "bundleName": "com.ohos.publishnotifications", "canShow": true, "limit": 100 }, - { "bundleName": "com.ohos.app2", "canShow": true, "limit": 100 } + { 'bundleName': 'com.ohos.publishnotifications', 'canShow': true, 'limit': 100 }, + { 'bundleName': 'com.ohos.app2', 'canShow': true, 'limit': 100 } ] -} +}; export class NotificationConfig { - static USE_NOTIFICATION_ICON = true; + static readonly USE_NOTIFICATION_ICON = true; - readNotificationConfig(deviceType?: string): any{ - return Config - } + readNotificationConfig(deviceType?: string): { limitTotal: number; app: { bundleName: string; canShow: boolean; limit: number; }[]; } { + return conFig; + } } let notificationConfig = new NotificationConfig(); -export default notificationConfig as NotificationConfig; \ No newline at end of file +export default notificationConfig ; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts index 5759c4ec..d17a06f7 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationDistributionManager.ts @@ -17,46 +17,44 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log'; import DeviceManager from '@ohos.distributedHardware.deviceManager'; import DeviceInfo from '@ohos.deviceInfo'; -const TAG = `NotificationDistributionManager`; +const TAG = 'NotificationDistributionManager'; let distributionManager = null; export default class NotificationDistributionManager { - deviceManager = null + deviceManager = null; - static getInstance() { + static getInstance(): any { if (distributionManager == null) { - Log.showInfo(TAG, `getInstance distributionManager new`); + Log.showInfo(TAG, 'getInstance distributionManager new'); distributionManager = new NotificationDistributionManager(); distributionManager.initDeviceManager(); return distributionManager; } - Log.showInfo(TAG, `getInstance return distributionManager`); + Log.showInfo(TAG, 'getInstance return distributionManager'); return distributionManager; } constructor() { - Log.showInfo(TAG, `constructor`); + Log.showInfo(TAG, 'constructor'); } - initDeviceManager() { - Log.showInfo(TAG, `initDeviceManager`); - DeviceManager.createDeviceManager("com.ohos.systemui", (err, data) => { - if (err) { - Log.showError(TAG, "createDeviceManager err:" + JSON.stringify(err)); - return; + initDeviceManager(): void { + Log.showInfo(TAG, 'initDeviceManager'); + DeviceManager.createDeviceManager('com.ohos.systemui', (err, data) => { + Log.showInfo(TAG, `initDeviceManager createDeviceManager err:${JSON.stringify(err)} data:${JSON.stringify(data)}`); + if (data) { + this.deviceManager = data; } - Log.showInfo(TAG, "createDeviceManager success"); - this.deviceManager = data; }); } - getTrustedDeviceDeviceName(deviceId) { + getTrustedDeviceDeviceName(deviceId: string): string { Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceId:${deviceId}`); let deviceName = ''; - let deviceArr:any[] = this.getTrustedDeviceListSync(); + let deviceArr: any[] = this.getTrustedDeviceListSync(); Log.showDebug(TAG, `getTrustedDeviceDeviceName deviceArr:${JSON.stringify(deviceArr)}`); - if (deviceArr && deviceArr.length > 0) { + if (deviceArr.length > 0) { for (let item of deviceArr) { if (item.deviceId == deviceId) { deviceName = item.deviceName; @@ -67,17 +65,17 @@ export default class NotificationDistributionManager { return deviceName; } - getTrustedDeviceListSync(): Array{ - Log.showInfo(TAG, `getTrustedDeviceListSync`); + getTrustedDeviceListSync(): any[] { + Log.showInfo(TAG, 'getTrustedDeviceListSync'); return this.deviceManager.getTrustedDeviceListSync(); } - getLocalDeviceInfoSync() { - Log.showInfo(TAG, `getLocalDeviceInfoSync`); + getLocalDeviceInfoSync(): any { + Log.showInfo(TAG, 'getLocalDeviceInfoSync'); return this.deviceManager.getLocalDeviceInfoSync(); } - release() { + release(): void { this.deviceManager.release(); } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts index 62350b57..54dd02d2 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationManager.ts @@ -18,97 +18,98 @@ import Notification from '@ohos.notification'; import PluginComponentManager from '@ohos.pluginComponent'; import Systemparameter from '@ohos.systemparameter'; import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import {AsyncCallback} from 'basic'; const TAG = 'NotificationManager'; // Temporary path -const EXTERNAL_JSON_PATH = '/system/etc/notification_template/external.json' +const EXTERNAL_JSON_PATH = '/system/etc/notification_template/external.json'; const DEBUG_SETTING_KEY = 'debug.systemui.notificationtemplate'; -const DEBUG_BUNDLE_NAME = 'com.ohos.example.notificationtemplate' -const DEBUG_ABILITY_NAME = 'com.ohos.example.notificationtemplate.MainAbility' -const DEBUG_TEMPLATE_NAME = 'NotificationTemplate' +const DEBUG_BUNDLE_NAME = 'com.ohos.example.notificationtemplate'; +const DEBUG_ABILITY_NAME = 'com.ohos.example.notificationtemplate.MainAbility'; +const DEBUG_TEMPLATE_NAME = 'NotificationTemplate'; export default class NotificationManager { - static TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; - static TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; - static TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; - static TYPE_PICTURE: number = Notification.ContentType.NOTIFICATION_CONTENT_PICTURE; - static NotificationTemplateMap = new Map(); + static readonly TYPE_BASIC: number = Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; + static readonly TYPE_LONG: number = Notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT; + static readonly TYPE_MULTI: number = Notification.ContentType.NOTIFICATION_CONTENT_MULTILINE; + static readonly TYPE_PICTURE: number = Notification.ContentType.NOTIFICATION_CONTENT_PICTURE; + static notificationTemplateMap = new Map(); - static subscribeNotification(tag, subscriber, asyncCallback) { + static subscribeNotification(tag: string, subscriber, asyncCallback): void { Log.showInfo(TAG, `subscribeNotification from: ${tag}`); Notification.subscribe(subscriber, asyncCallback); } - static unsubscribeNotification(tag, subscriber) { + static unsubscribeNotification(tag: string, subscriber): void { Log.showInfo(TAG, `subscribeNotification from: ${tag}`); Notification.unsubscribe(subscriber); } - static removeAll(tag, callback) { + static removeAll(tag: string, callback): void { Log.showInfo(TAG, `removeAll from: ${tag}`); Notification.removeAll(callback); } - static remove(tag, hashCode, callback) { + static remove(tag: string, hashCode, callback): void { Log.showInfo(TAG, `remove from: ${tag}`); - Notification.remove(hashCode, callback) + Notification.remove(hashCode, callback); } - static getAllActiveNotifications(tag, callback) { + static getAllActiveNotifications(tag: string, callback): void { Log.showInfo(TAG, `getAllActiveNotifications from: ${tag}`); Notification.getAllActiveNotifications(callback); } - static enableNotification(tag, bundleOption, data, callback) { + static enableNotification(tag: string, bundleOption, data, callback): void { Log.showInfo(TAG, `enableNotification from: ${tag}`); Notification.enableNotification(bundleOption, data, callback); } - static initNotificationTemplateMap(tag,ownerWant) { + static initNotificationTemplateMap(tag: string, ownerWant): void { Log.showInfo(TAG, `initNotificationTemplateMap from: ${tag}`); if (NotificationManager.isDebugMode(tag)) { - NotificationManager.requestDebugTemplate(tag,ownerWant); + NotificationManager.requestDebugTemplate(tag, ownerWant); } else { NotificationManager.requestTemplate(tag, ownerWant, '', EXTERNAL_JSON_PATH); } } - static request(tag, param, asyncCallback) { + static request(tag: string, param, asyncCallback): void { Log.showInfo(TAG, `request from: ${tag}`); PluginComponentManager.request(param, (err, data) => { asyncCallback(err, data); }); } - static push(tag, param, asyncCallback) { + static push(tag: string, param, asyncCallback): void { Log.showInfo(TAG, `push from: ${tag}`); PluginComponentManager.push(param, () => { asyncCallback(); }); } - static requestListener(tag, ownerWant, asyncCallback) { + static requestListener(tag: string, ownerWant, asyncCallback): void { Log.showInfo(TAG, `requestListener from: ${tag}`); PluginComponentManager.on('request', (source, name, data) => { asyncCallback(source, name, data); - }) + }); } - static pushListener(tag, ownerWant, asyncCallback) { + static pushListener(tag: string, ownerWant, asyncCallback): void { Log.showInfo(TAG, `pushListener from: ${tag}`); PluginComponentManager.on('push', (source, template, data, extraData) => { asyncCallback(source, template, data, extraData); }); } - static requestTemplate(tag, ownerWant, templateName, templatePath) { - Log.showInfo(TAG, `requestTemplate from: ${tag}`); + static requestTemplate(tag: string, ownerWant, templateName, templatePath): void { + Log.showInfo(TAG, `requestTemplate from: ${tag} ownerWant:${JSON.stringify(ownerWant)}`); let reqWant = { bundleName: '', abilityName: '' }; - let reqData = {} + let reqData = {}; let requestParam = { owner: ownerWant, @@ -126,21 +127,21 @@ export default class NotificationManager { let templates = JSON.parse(data.componentTemplate.source); Log.showInfo(TAG, `request templates: ${JSON.stringify(templates)}`); for (let key in templates) { - NotificationManager.NotificationTemplateMap.set(key, { - "source": templates[key], "ability": "" + NotificationManager.notificationTemplateMap.set(key, { + 'source': templates[key], 'ability': '' }); } } }); } - static requestDebugTemplate(tag, ownerWant) { - Log.showInfo(TAG, `requestDebugTemplate from: ${tag}`); + static requestDebugTemplate(tag: string, ownerWant): void { + Log.showInfo(TAG, `requestDebugTemplate from: ${tag} ownerWant:${JSON.stringify(ownerWant)}`); let reqWant = { bundleName: DEBUG_BUNDLE_NAME, abilityName: DEBUG_ABILITY_NAME }; - let reqData = {} + let reqData = {}; let requestParam = { owner: ownerWant, want: reqWant, @@ -151,13 +152,13 @@ export default class NotificationManager { Log.showInfo(TAG, `requestDebugTemplate finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); if (!!data) { Log.showInfo(TAG, `requestDebugTemplate finished data.componentTemplate.source:${JSON.stringify(data.componentTemplate.source)}`); - NotificationManager.NotificationTemplateMap.set(DEBUG_TEMPLATE_NAME, data.componentTemplate); + NotificationManager.notificationTemplateMap.set(DEBUG_TEMPLATE_NAME, data.componentTemplate); } }); } - static isDebugMode(tag): boolean{ - let debug = Systemparameter.getSync(DEBUG_SETTING_KEY, "") + static isDebugMode(tag: string): boolean{ + let debug = Systemparameter.getSync(DEBUG_SETTING_KEY, ''); Log.showInfo(TAG, `Systemparameter DEBUG_SETTING: ${debug}`); return!!debug; } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index c3c1963b..c0ab244b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -13,13 +13,12 @@ * limitations under the License. */ -import notification from '@ohos.notification'; import Log from '../../../../../../../../../common/src/main/ets/default/Log'; import NotificationManager from './NotificationManager'; import ParseDataUtil from './ParseDataUtil'; import RuleController from './rule/RuleController'; import CommonUtil from '../common/CommonUtil'; -import createOrGet from "../../../../../../../../../common/src/main/ets/default/SingleInstanceHelper"; +import createOrGet from '../../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; import DistributionManager from './NotificationDistributionManager'; import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; @@ -28,7 +27,7 @@ const TAG = 'NotificationService'; interface NotificationListener { userId: number; onNotificationConsume: Function; - onNotificationCancel: (hashcode: number) => void; + onNotificationCancel(hashcode: number): void; } /** @@ -41,32 +40,32 @@ export class NotificationService { constructor() { this.subscribeNotification(this.getSubscriber()); - this.loadNotificationTemplate() + this.loadNotificationTemplate(); } - public register(listener: NotificationListener) { + register(listener: NotificationListener): void { let res = this.mListeners.add(listener); Log.showInfo(TAG, `register, listener size: ${res.size}`); } - public unRegister(listener: NotificationListener) { + unRegister(listener: NotificationListener): void { let res = this.mListeners.delete(listener); Log.showInfo(TAG, `unRegister, res: ${res}`); } - public removeAll() { + removeAll(): void { NotificationManager.removeAll(TAG, (data) => { Log.showInfo(TAG, `removeAll => data: ${JSON.stringify(data)}`); }); } - public remove(code: string) { + remove(code: string): void { NotificationManager.remove(TAG, code, (data) => { Log.showInfo(TAG, `removeNotificationItem ==> data: ${JSON.stringify(data)}`); - }) + }); } - public loadAllNotifications() { + loadAllNotifications(): void { NotificationManager.getAllActiveNotifications(TAG, (err, requestsArr) => { Log.showInfo(TAG, `getAllActiveNotifications error:${err}}, requestsArr: ${JSON.stringify(requestsArr)}`); if (Array.isArray(requestsArr)) { @@ -74,26 +73,26 @@ export class NotificationService { this.handleNotificationAdd(requestsArr[i]); } } - }) + }); } - getSubscriber() { + getSubscriber(): any { if (!this.mSubscriber) { this.mSubscriber = { onConsume: this.handleNotificationAddAndSortMap.bind(this), onCancel: this.handleNotificationCancel.bind(this), - } + }; } return this.mSubscriber; } - handleNotificationAddAndSortMap(data) { + handleNotificationAddAndSortMap(data): void { Log.showDebug(TAG, 'handleNotificationAddAndSortMap, sortingMap' + JSON.stringify(data.sortingMap || {})); this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; this.handleNotificationAdd(data?.request); } - handleNotificationAdd(request) { + handleNotificationAdd(request): void { ParseDataUtil.parseData(request, this.mSortingMap).then((intermediateData) => { Log.showInfo(TAG, `parseData after = ${JSON.stringify(intermediateData)}`); RuleController.getNotificationData(intermediateData, (finalItemData) => { @@ -103,12 +102,12 @@ export class NotificationService { if (CommonUtil.checkVisibilityByUser(finalItemData.userId, listener.userId)) { listener.onNotificationConsume(finalItemData); } - }) + }); }); }).catch(errorInfo => Log.showError(TAG, `error: ${JSON.stringify(errorInfo)}`)); } - handleNotificationCancel(data) { + handleNotificationCancel(data): void { Log.showDebug(TAG, `handleNotificationCancel hashCode: ${JSON.stringify(data?.request?.hashCode)}`); this.mSortingMap = { ...this.mSortingMap, ...data?.sortingMap }; const hashCode = data?.request?.hashCode; @@ -119,36 +118,36 @@ export class NotificationService { this.mListeners.forEach((listener) => listener.onNotificationCancel(hashCode)); } - subscribeNotification(subscriber) { + subscribeNotification(subscriber): void { let callback = (err, data) => { Log.showInfo(TAG, `subscribeCallback finished err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); }; NotificationManager.subscribeNotification(TAG, subscriber, callback); } - loadNotificationTemplate() { + loadNotificationTemplate(): void { Log.showInfo(TAG, 'loadNotificationTemplate start'); NotificationManager.initNotificationTemplateMap(TAG, globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT]); } - getPluginTempLate(templateName) { + getPluginTempLate(templateName: string): any { Log.showInfo(TAG, `getPluginTempLate param:${templateName}`); let pluginTempLate = null; - if (NotificationManager.NotificationTemplateMap !== null) { - pluginTempLate = NotificationManager.NotificationTemplateMap.get(templateName); + if (NotificationManager.notificationTemplateMap !== null) { + pluginTempLate = NotificationManager.notificationTemplateMap.get(templateName); } Log.showInfo(TAG, `getPluginTempLate pluginTempLate:${JSON.stringify(pluginTempLate)}`); return pluginTempLate; } - enableNotification(bundleOption, data) { + enableNotification(bundleOption, data: boolean): void { Log.showDebug(TAG, `enableNotification bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)} `); - NotificationManager.enableNotification(TAG, bundleOption, data, (result) => { - Log.showInfo(TAG, `enableNotification ==> result: ${JSON.stringify(result)}`); + NotificationManager.enableNotification(TAG, bundleOption, data, () => { + Log.showInfo(TAG, 'enableNotification succeed'); }); } - getTrustedDeviceDeviceName(deviceId) { + getTrustedDeviceDeviceName(deviceId: string): string { Log.showInfo(TAG, `getTrustedDeviceDeviceName deviceId:${JSON.stringify(deviceId)} `); return DistributionManager.getInstance().getTrustedDeviceDeviceName(deviceId); } @@ -156,4 +155,4 @@ export class NotificationService { let notificationService = createOrGet(NotificationService, TAG); -export default notificationService as NotificationService; \ No newline at end of file +export default notificationService ; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts index 0980f6c0..4436b023 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationWindowManager.ts @@ -14,18 +14,18 @@ */ import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -import EventManager from "../../../../../../../../../common/src/main/ets/default/event/EventManager"; -import {obtainLocalEvent} from "../../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import EventManager from '../../../../../../../../../common/src/main/ets/default/event/EventManager'; +import {obtainLocalEvent} from '../../../../../../../../../common/src/main/ets/default/event/EventUtil'; -const TAG = `NotificationWindowManager`; +const TAG = 'NotificationWindowManager'; class NotificationWindowManager { - showNotificationWindow() { + showNotificationWindow(): void { // todo show Notification window } - hideNotificationWindow() { + hideNotificationWindow(): void { Log.showInfo(TAG, 'hide Notification window'); EventManager.publish(obtainLocalEvent('hideNotificationWindowEvent', '')); } @@ -33,4 +33,4 @@ class NotificationWindowManager { let sNotificationWindowManager = new NotificationWindowManager(); -export default sNotificationWindowManager as NotificationWindowManager; \ No newline at end of file +export default sNotificationWindowManager ; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index 1f12014c..4067a80e 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -38,7 +38,7 @@ type NotificationContent = { picture?: any } -async function getUserId(uid) { +async function getUserId(uid): Promise { let userId = await AccountManager.getAccountManager().getOsAccountLocalIdFromUid(uid); Log.showInfo(TAG, `getOsAccountLocalIdFromUid uid = ${uid}, userId = ${userId}`); return userId; @@ -48,7 +48,7 @@ async function getUserId(uid) { * parse data util class. */ export default class ParseDataUtil { - static async parseData(request, sortingMap?) { + static async parseData(request, sortingMap?): Promise { if (!request) { return Promise.reject('consumeCallback request is empty'); } @@ -60,7 +60,7 @@ export default class ParseDataUtil { userId: userId, uid: request.creatorUid, hashcode: request.hashCode, - contentType: request?.content?.contentType + '', + contentType: `${request?.content?.contentType}`, timestamp: request.deliveryTime, time: ParseDataUtil.getStandardTime(request.deliveryTime), appName: appMessage.appName, @@ -86,7 +86,7 @@ export default class ParseDataUtil { Log.showInfo(TAG, `notificationItem construct over`); notificationItem = { ...notificationItem, ...ParseDataUtil.getContentByType(request?.content?.contentType, request) - } + }; return notificationItem; } @@ -96,10 +96,10 @@ export default class ParseDataUtil { * @param {string} bundleName - BundleName of the target app. * @return {object} appData */ - static async getAppData(bundleName, userId) { + static async getAppData(bundleName, userId): Promise { Log.showInfo(TAG, `getAppName start by ${bundleName}`); if (appDataMap.has(bundleName)) { - Log.showInfo(TAG, `getAppData success.`); + Log.showInfo(TAG, 'getAppData success.'); return appDataMap.get(bundleName); } let data = await BundleManager.getBundleInfo(TAG, bundleName, 0, userId); @@ -122,52 +122,52 @@ export default class ParseDataUtil { * * @param {number} timestamp - Target timestamp. */ - static getStandardTime(timestamp) { + static getStandardTime(timestamp): string { if (timestamp == 0 || timestamp == undefined || timestamp == null) { return ''; } mDate.setTime(timestamp); let hoursNumber = mDate.getHours(); let minutesNumber = mDate.getMinutes(); - let hours = hoursNumber < 10 ? '0' + hoursNumber : hoursNumber; - let minutes = minutesNumber < 10 ? '0' + minutesNumber : minutesNumber; - return hours + ':' + minutes; + let hours = hoursNumber < 10 ? `0${hoursNumber}` : hoursNumber; + let minutes = minutesNumber < 10 ? `0${minutesNumber}` : minutesNumber; + return `${hours}:${minutes}`; } static getContentByType(notificationType, request): NotificationContent { let content = { title: '', text: '', additionalText: '' - } + }; - function getContentByKey(keysAndDefault, source) { + function getContentByKey(keysAndDefault, source): void { if (source) { keysAndDefault.forEach(([key, defualt]) => { - content[key] = source[key] ?? defualt - }) + content[key] = source[key] ?? defualt; + }); } } switch (notificationType) { - case NotificationManager.TYPE_BASIC: - getContentByKey([['title', ''], ['text', ''], ['additionalText', '']], request.content.normal) - break; - case NotificationManager.TYPE_LONG: - getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], - ['expandedTitle', ''], ['longText', '']], request.content.longText) - break; - case NotificationManager.TYPE_MULTI: - getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], - ['longTitle', ''], ['lines', []]], request.content.multiLine) - break; - case NotificationManager.TYPE_PICTURE: - getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], - ['expandedTitle', ''], ['picture', '']], request.content.picture) - break; - default: - Log.showInfo(TAG, 'no match content type'); - break; + case NotificationManager.TYPE_BASIC: + getContentByKey([['title', ''], ['text', ''], ['additionalText', '']], request.content.normal); + break; + case NotificationManager.TYPE_LONG: + getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], + ['expandedTitle', ''], ['longText', '']], request.content.longText); + break; + case NotificationManager.TYPE_MULTI: + getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], + ['longTitle', ''], ['lines', []]], request.content.multiLine); + break; + case NotificationManager.TYPE_PICTURE: + getContentByKey([['title', ''], ['text', ''], ['additionalText', []], ['briefText', ''], + ['expandedTitle', ''], ['picture', '']], request.content.picture); + break; + default: + Log.showInfo(TAG, 'no match content type'); + break; } Log.showInfo(TAG, `notificationType = ${notificationType}, content = ${JSON.stringify(content)}`); - return content + return content; } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts index 5a389231..9d2e932c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts @@ -28,12 +28,12 @@ export class RuleController { * @param {notificationItemData} Data of the notification * @param {callback} Data of the type to show the notification */ - getNotificationData(notificationItemData: NotificationItemData, callback) { - Log.showInfo(TAG, "getNotificationData start"); + getNotificationData(notificationItemData: NotificationItemData, callback): void { + Log.showInfo(TAG, 'getNotificationData start'); this.isAllowSendNotification(notificationItemData, (isSuccess) => { if (!isSuccess) { - Log.showInfo(TAG, "user is not allow this to send notification"); + Log.showInfo(TAG, 'user is not allow this to send notification'); callback(undefined); return; } @@ -53,11 +53,11 @@ export class RuleController { * @param {notificationItemData} The origin notification data * @param {callback} The user allow the app send notification or not */ - isAllowSendNotification(notificationItemData, callback) { - Log.showInfo(TAG, "isAllowSendNotification start"); + isAllowSendNotification(notificationItemData, callback): void { + Log.showInfo(TAG, 'isAllowSendNotification start'); Notification.isNotificationEnabled({ bundle: notificationItemData.bundleName, uid: notificationItemData.uid }) .then((flag) => { - Log.showInfo(TAG, `Notification.isNotificationEnabled:` + flag) + Log.showInfo(TAG, `Notification.isNotificationEnabled: ${flag}`); callback(flag); }); } @@ -69,8 +69,8 @@ export class RuleController { * @param {callback} whether sound or vibration is allowed */ - SoundOrVibrate(notificationItemData, callback) { - Log.showInfo(TAG, "SoundOrVibrate start") + SoundOrVibrate(notificationItemData, callback): void { + Log.showInfo(TAG, 'SoundOrVibrate start'); let sound = false; let vibrationValues = false; if (!CheckEmptyUtils.checkStrIsEmpty(notificationItemData.sound)) { @@ -91,8 +91,8 @@ export class RuleController { * @param {notificationItemData} The origin notification data * @param {callback} The type to show notification */ - getNotificationDataByApp(notificationItemData, callback) { - Log.showInfo(TAG, "getNotificationDataByApp start"); + getNotificationDataByApp(notificationItemData, callback): void { + Log.showInfo(TAG, 'getNotificationDataByApp start'); let mNotificationItemData : NotificationItemData = notificationItemData; mNotificationItemData.ruleData = { isAllowBanner: false, @@ -136,8 +136,8 @@ export class RuleController { * @param {notificationItemData} The origin notification data * @param {callback} The final notification data */ - updateNotificationDataBySense(notificationItemData, callback) { - Log.showInfo(TAG, "updateNotificationDataBySense start"); + updateNotificationDataBySense(notificationItemData, callback): void { + Log.showInfo(TAG, 'updateNotificationDataBySense start'); let mNotificationItemData = notificationItemData; // TODO Scenario Management callback(mNotificationItemData); @@ -147,4 +147,4 @@ export class RuleController { let ruleController = new RuleController(); -export default ruleController as RuleController; \ No newline at end of file +export default ruleController ; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index 4f4b88bd..3bf4ed4f 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -23,11 +23,11 @@ import NotificationService from '../model/NotificationService' import NotificationWindowManager from '../model/NotificationWindowManager'; import NotificationConfig from '../model/NotificationConfig'; import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; -import AbilityManager from "../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager" -import EventManager from "../../../../../../../../../common/src/main/ets/default/event/EventManager" -import {obtainLocalEvent} from "../../../../../../../../../common/src/main/ets/default/event/EventUtil" +import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import EventManager from '../../../../../../../../../common/src/main/ets/default/event/EventManager'; +import {obtainLocalEvent} from '../../../../../../../../../common/src/main/ets/default/event/EventUtil'; import CommonUtil from '../common/CommonUtil'; -import Constants from '../common/constants'; +import Constants,{NotificationItemData} from '../common/constants'; const TAG = 'NotificationViewModel'; @@ -36,12 +36,12 @@ const TAG = 'NotificationViewModel'; */ export class ViewModel { audioPlayer: any; - mNotificationList: any[]; + mNotificationList: NotificationItemData[]; mCallback: any; mNotificationCtrl: any = {}; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showInfo(TAG, 'constructor'); this.mNotificationList = []; this.audioPlayer = media.createAudioPlayer(); // this.audioPlayer.src = 'file://system/etc/capture.ogg'; @@ -53,20 +53,20 @@ export class ViewModel { .catch((err) => Log.showError(TAG, `Can't get current user, err: ${JSON.stringify(err)}`)); } - registerCallback(userId) { + registerCallback(userId): void { this.mCallback = { userId: userId, onNotificationConsume: this.onNotificationConsume.bind(this), onNotificationCancel: this.onNotificationCancel.bind(this) - } + }; NotificationService.register(this.mCallback); } - unregisterCallback() { + unregisterCallback(): void { NotificationService.unRegister(this.mCallback); } - userChange(userInfo) { + userChange(userInfo): void { Log.showInfo(TAG, `UserChange, userInfo: ${JSON.stringify(userInfo)}`); this.unregisterCallback(); this.mNotificationList.length = 0; @@ -81,12 +81,12 @@ export class ViewModel { * * @param {Object} data - return notificationItemData. */ - onNotificationConsume(notificationItemData) { + onNotificationConsume(notificationItemData: NotificationItemData): void { if (notificationItemData === undefined) { - Log.showError(TAG, `onNotificationConsume notificationItemData is undefined`); + Log.showError(TAG, 'onNotificationConsume notificationItemData is undefined'); return; } - this.onNotificationCancel(notificationItemData.hashcode) + this.onNotificationCancel(notificationItemData.hashcode); Log.showInfo(TAG, `onNotificationConsume ${JSON.stringify(notificationItemData)}`); //Verify the notifications can be displayed if (!this.isCanShow(notificationItemData.bundleName)) { @@ -99,10 +99,10 @@ export class ViewModel { } if (notificationItemData.ruleData.isAllowNotificationListShow) { this.mNotificationList.unshift(notificationItemData); - Log.showInfo(TAG, `reminder start `); + Log.showInfo(TAG, 'reminder start '); this.reminderWay(notificationItemData); - Log.showInfo(TAG, `reminder end `); - this.updateFlowControlInfos(notificationItemData.bundleName, true) + Log.showInfo(TAG, 'reminder end '); + this.updateFlowControlInfos(notificationItemData.bundleName, true); } this.updateNotification(); } @@ -110,7 +110,7 @@ export class ViewModel { /** * notification CancelCallback */ - onNotificationCancel(hashCode: string) { + onNotificationCancel(hashCode: string): void { Log.showInfo(TAG, `onNotificationCancel hashCode: ` + hashCode); // Common Notification Deletion Logic Processing @@ -118,7 +118,7 @@ export class ViewModel { if (this.mNotificationList[i].hashcode == hashCode) { let removeItemArr = this.mNotificationList.splice(i, 1); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { - this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + this.updateFlowControlInfos(removeItemArr[0].bundleName, false); } this.updateNotification(); break; @@ -126,15 +126,15 @@ export class ViewModel { } } - updateNotification() { + updateNotification(): void { Log.showInfo(TAG, `updateNotification length: ${this.mNotificationList.length} list: ${JSON.stringify(this.mNotificationList)}`); - this.sortNotification() + this.sortNotification(); let notificationList = this.groupByGroupName(); AppStorage.SetOrCreate('notificationList', notificationList); } groupByGroupName(): any[]{ - Log.showInfo(TAG, `groupByGroupName`); + Log.showInfo(TAG, 'groupByGroupName'); if (!this.mNotificationList || this.mNotificationList.length < 1) { return []; } @@ -147,8 +147,8 @@ export class ViewModel { groups[groupName] = []; groupArr.push(groups[groupName]); } - groups[groupName].push(item) - }) + groups[groupName].push(item); + }); Log.showInfo(TAG, `groupByGroupName groupArr:${JSON.stringify(groupArr)}`); return groupArr; } @@ -157,37 +157,37 @@ export class ViewModel { /** * Sort the notifications. */ - sortNotification() { - Log.showInfo(TAG, `sortNotification`); + sortNotification(): void { + Log.showInfo(TAG, 'sortNotification'); if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { - return + return; } this.mNotificationList.sort((itemA, itemB) => { //long term notification come first if (itemA.source == Notification.SourceType.TYPE_CONTINUOUS && itemB.source != Notification.SourceType.TYPE_CONTINUOUS) { - return -1 + return -1; } //long term notification come first if (itemA.source != Notification.SourceType.TYPE_CONTINUOUS && itemB.source == Notification.SourceType.TYPE_CONTINUOUS) { - return 1 + return 1; } if ((itemA.source == Notification.SourceType.TYPE_CONTINUOUS && itemB.source == Notification.SourceType.TYPE_CONTINUOUS) || (itemA.source != Notification.SourceType.TYPE_CONTINUOUS && itemB.source != Notification.SourceType.TYPE_CONTINUOUS) ) { - return -1 * (itemA.timestamp - itemB.timestamp) + return -1 * (itemA.timestamp - itemB.timestamp); } - }) + }); } /** * Remove all notifications. */ - removeAllNotifications() { - Log.showInfo(TAG, `removeAllNotifications`); - if (this.mNotificationList == undefined || this.mNotificationList == null || this.mNotificationList.length < 1) { - this.mNotificationList = [] + removeAllNotifications(): void { + Log.showInfo(TAG, 'removeAllNotifications'); + if (this.mNotificationList.length < 1) { + this.mNotificationList = []; } else { - let index = this.mNotificationList.length + let index = this.mNotificationList.length; while (index--) { Log.showInfo(TAG, `removeAllNotifications isRemoveAllowed: ${index} ${this.mNotificationList[index].isRemoveAllowed} isOngoing: ${this.mNotificationList[index].isOngoing} isUnremovable: ${this.mNotificationList[index].isUnremovable}`); @@ -195,26 +195,26 @@ export class ViewModel { //Except the Long term notifications if (this.mNotificationList[index].isRemoveAllowed && !this.mNotificationList[index].isOngoing && !this.mNotificationList[index].isUnremovable) { - let hashCode = this.mNotificationList[index].hashcode - this.removeSysNotificationItem(hashCode) - let removeItemArr = this.mNotificationList.splice(index, 1) + let hashCode = this.mNotificationList[index].hashcode; + this.removeSysNotificationItem(hashCode); + let removeItemArr = this.mNotificationList.splice(index, 1); Log.showInfo(TAG, `removeAllNotifications hashCode = ${hashCode}, removeItemArr = ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { - this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + this.updateFlowControlInfos(removeItemArr[0].bundleName, false); } } } } - this.updateNotification() + this.updateNotification(); } - removeNotificationItem(itemData, isDelSysConent) { + removeNotificationItem(itemData: NotificationItemData, isDelSysConent: boolean): void { Log.showInfo(TAG, `removeNotificationItem, hashcode: ${itemData.hashcode}`); for (let i = 0, len = this.mNotificationList.length; i < len; i++) { if (this.mNotificationList[i].hashcode == itemData.hashcode) { let removeItemArr = this.mNotificationList.splice(i, 1); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { - this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + this.updateFlowControlInfos(removeItemArr[0].bundleName, false); } break; } @@ -226,17 +226,17 @@ export class ViewModel { AppStorage.Delete(Constants.KEY_INPUT + itemData.id); } - removeGroupNotification(itemData, isDelSysConent) { - Log.showInfo(TAG, `removeGroupNotification, groupName: ${itemData.groupName}`); + removeGroupNotification(itemData: NotificationItemData, isDelSysConent: boolean): void { + Log.showInfo(TAG, `removeGroupNotification, groupName: ${itemData.groupName??''}`); let groupName = itemData.groupName; for (let i = this.mNotificationList.length - 1; i >= 0; i--) { if (this.mNotificationList[i].groupName == groupName) { - let id = this.mNotificationList[i].id - let hashcode = this.mNotificationList[i].hashcode + let id = this.mNotificationList[i].id; + let hashcode = this.mNotificationList[i].hashcode; let removeItemArr = this.mNotificationList.splice(i, 1); Log.showDebug(TAG, `removeGroupNotification i = ${i} removeItemArr= ${JSON.stringify(removeItemArr)}`); if (!CheckEmptyUtils.isEmpty(removeItemArr)) { - this.updateFlowControlInfos(removeItemArr[0].bundleName, false) + this.updateFlowControlInfos(removeItemArr[0].bundleName, false); } if (isDelSysConent) { this.removeSysNotificationItem(hashcode); @@ -247,11 +247,11 @@ export class ViewModel { this.updateNotification(); } - removeSysNotificationItem(hashcode) { + removeSysNotificationItem(hashcode: string): void { NotificationService.remove(hashcode); } - clickItem(itemData, want?: any) { + clickItem(itemData: NotificationItemData, want?: any): void { Log.showInfo(TAG, `clickItem itemId: ${itemData.id}, want: ${JSON.stringify(want)}, tapDismissed: ${itemData.tapDismissed}`); NotificationWindowManager.hideNotificationWindow(); CommonUtil.startWant((want) ? want : itemData.want); @@ -260,36 +260,36 @@ export class ViewModel { } } - clickReply(inputKey, content, want) { + clickReply(inputKey, content, want): void { Log.showInfo(TAG, `clickReply inputKey: ${inputKey}, content: ${content}, want: ${JSON.stringify(want)}`); let info = { code: 0, want: { key: inputKey, data: content }, permission: '', extraInfo: {} - } + }; CommonUtil.startWant(want, info); } - initFlowControlInfos() { + initFlowControlInfos(): void { Log.showInfo(TAG, 'initFlowControlInfos enter'); - let notificationConfig = NotificationConfig.readNotificationConfig('statusbar') + let notificationConfig = NotificationConfig.readNotificationConfig('statusbar'); Log.showInfo(TAG, 'NotificationConfig: ' + JSON.stringify(notificationConfig)); if (CheckEmptyUtils.isEmpty(notificationConfig)) { Log.showInfo(TAG, 'NotificationConfig is no definition'); - return + return; } this.mNotificationCtrl = { currentTotal: 0, limitTotal: notificationConfig.limitTotal, app: new Map() - } + }; for (let item of notificationConfig.app) { let tmp = { 'canShow': item.canShow, 'currentNum': 0, 'limit': item.limit - } + }; this.mNotificationCtrl['app'].set(item.bundleName, tmp); } Log.showDebug(TAG, 'initFlowControlInfos end, mNotificationCtrl: ' + JSON.stringify(this.mNotificationCtrl)); @@ -297,62 +297,62 @@ export class ViewModel { isCanShow(bundleName: string): boolean { Log.showInfo(TAG, 'isCanShow'); - let result: boolean = true + let result = true; if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { - let currentTotal = this.mNotificationCtrl['currentTotal'] - let limitTotal = this.mNotificationCtrl['limitTotal'] + let currentTotal: number = this.mNotificationCtrl['currentTotal']; + let limitTotal = this.mNotificationCtrl['limitTotal']; Log.showInfo(TAG, `isCanShow Total: currentTotal=${currentTotal},limitTotal=${limitTotal}`); if (currentTotal + 1 > limitTotal) { - result = false + result = false; } else if (this.mNotificationCtrl['app'].has(bundleName)) { - let tmp = this.mNotificationCtrl['app'].get(bundleName) + let tmp = this.mNotificationCtrl['app'].get(bundleName); Log.showInfo(TAG, `isCanShow appTotal: canShow=${tmp['canShow']},tmp['currentNum']=${tmp['currentNum']}`); if (tmp['canShow'] === false || (tmp['currentNum'] + 1 > tmp['limit'])) { - result = false + result = false; } } } - Log.showInfo(TAG, `isCanShow :${result}`); + Log.showInfo(TAG, `isCanShow :${result?'true':'false'}`); return result; } updateFlowControlInfos(bundleName: string, plusOrMinus: boolean): void { - Log.showInfo(TAG, `updateFlowControlInfos`); + Log.showInfo(TAG, 'updateFlowControlInfos'); if (!CheckEmptyUtils.isEmpty(this.mNotificationCtrl)) { if (this.mNotificationCtrl['app'].has(bundleName)) { - let tmp = this.mNotificationCtrl['app'].get(bundleName) + let tmp = this.mNotificationCtrl['app'].get(bundleName); if (plusOrMinus) { - tmp['currentNum'] += 1 + tmp['currentNum'] += 1; } else if (tmp['currentNum'] > 0) { - tmp['currentNum'] -= 1 + tmp['currentNum'] -= 1; } - this.mNotificationCtrl['app'].set(bundleName, tmp) + this.mNotificationCtrl['app'].set(bundleName, tmp); } if (plusOrMinus) { - this.mNotificationCtrl['currentTotal'] += 1 + this.mNotificationCtrl['currentTotal'] += 1; } else if (this.mNotificationCtrl['currentTotal'] > 0) { - this.mNotificationCtrl['currentTotal'] -= 1 + this.mNotificationCtrl['currentTotal'] -= 1; } } Log.showInfo(TAG, `updateFlowControlInfos:${JSON.stringify(this.mNotificationCtrl)}`); } - reminderWay(itemData) { + reminderWay(itemData: NotificationItemData): void { if (itemData.ruleData.isAllowBanner) { - Log.showInfo(TAG, `banner start `); + Log.showInfo(TAG, 'banner start '); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'itemData', itemData); - EventManager.publish(obtainLocalEvent('onBannerNoticeShow', { 'itemData': itemData })) - Log.showInfo(TAG, `banner end `); + EventManager.publish(obtainLocalEvent('onBannerNoticeShow', { 'itemData': itemData })); + Log.showInfo(TAG, 'banner end '); } if (itemData.notificationFlags?.soundEnabled != Constants.NOTIFICATION_TYPE_CLOSE) { if (itemData.ruleData.isAllowSound) { try { this.audioPlayer.src = itemData.sound; - Log.showInfo(TAG, `sound start `); + Log.showInfo(TAG, 'sound start '); this.audioPlayer.play(); - Log.showInfo(TAG, `sound end `); + Log.showInfo(TAG, 'sound end '); } catch (e) { Log.showError(TAG, `sound error: ${JSON.stringify(e)}`); } @@ -375,17 +375,17 @@ export class ViewModel { } } - getPluginTempLate(templateName) { - Log.showInfo(TAG, 'getPluginTempLate: ' + templateName); - return NotificationService.getPluginTempLate(templateName) + getPluginTempLate(templateName: string): any { + Log.showInfo(TAG, `getPluginTempLate: ${templateName}`); + return NotificationService.getPluginTempLate(templateName); } - enableNotification(itemData, enable: boolean) { + enableNotification(itemData: NotificationItemData, enable: boolean): void { Log.showInfo(TAG, `enableNotification, bundleName: ${itemData.bundleName} uid: ${itemData.uid}`); return NotificationService.enableNotification({ bundle: itemData.bundleName, uid: itemData.uid }, enable); } - clickDistributionItem(itemData, triggerInfo) { + clickDistributionItem(itemData: NotificationItemData, triggerInfo): void { Log.showInfo(TAG, `clickDistributionItem wantAgen: ${JSON.stringify(itemData.want)}, triggerInfo: ${JSON.stringify(triggerInfo)}`); NotificationWindowManager.hideNotificationWindow(); CommonUtil.startWant(itemData.want, triggerInfo); @@ -393,11 +393,11 @@ export class ViewModel { } //get distributed device name - getDistributedDeviceName(itemData): Promise{ + async getDistributedDeviceName(itemData: NotificationItemData): Promise{ Log.showInfo(TAG, `getDistributedDeviceName itemData want:${JSON.stringify(itemData.want)} deviceId:${itemData.deviceId}`); return new Promise((resolve) => { - let deviceName: string = ''; + let deviceName = ''; if (itemData.distributedOption?.isDistributed && !!itemData.deviceId) { deviceName = NotificationService.getTrustedDeviceDeviceName(itemData.deviceId); resolve(deviceName); @@ -410,4 +410,4 @@ export class ViewModel { let viewModel = new ViewModel(); -export default viewModel as ViewModel; \ No newline at end of file +export default viewModel ; \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 1faf59c2..ad5921d0 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,28 +13,31 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager' -import Constants from './Constants' +import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; const TAG = 'capsule-StyleConfiguration'; +export class StatusRingModeComponentStyle { + statusBarRingModeWidth: Length = $r('app.float.status_bar_ring_mode_width'); + statusBarRingModeHeight: Length = $r('app.float.status_bar_ring_mode_height'); +} + +export class ControlCenterRingModeComponentStyle { + onBgColor: ResourceStr = $r('app.color.control_center_complex_toggle_ring_mode_on_bg_color'); +} + export default class StyleConfiguration { - static getStatusRingModeComponentStyle() { - const key: string = TAG + "-StatusRingMode"; + static getStatusRingModeComponentStyle(): StatusRingModeComponentStyle { + const key: string = TAG + '-StatusRingMode'; return StyleManager.getStyle(key, () => { - return { - statusBarRingModeWidth: $r('app.float.status_bar_ring_mode_width'), - statusBarRingModeHeight: $r('app.float.status_bar_ring_mode_height') - }; + return new StatusRingModeComponentStyle(); }); } - static getControlCenterRingModeComponentStyle() { - const key: string = TAG + "-ControlCenterRingMode"; + static getControlCenterRingModeComponentStyle(): ControlCenterRingModeComponentStyle { + const key: string = TAG + '-ControlCenterRingMode'; return StyleManager.getStyle(key, () => { - return { - onBgColor: $r('app.color.control_center_complex_toggle_ring_mode_on_bg_color') - }; + return new ControlCenterRingModeComponentStyle(); }); } } \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts index cb63a641..d5e80586 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts @@ -14,53 +14,57 @@ */ import audio from '@ohos.multimedia.audio'; +import { BusinessError } from 'basic'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import {getAudioManager} from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import { getAudioManager } from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import { AudioRingMode } from '../common/Constants'; const TAG = 'RingModeModel'; +export interface RingModeStatusListener { + updateRingerMode(status: AudioRingMode): void; +} + export class RingModeService { - mIsStart: boolean = false; - mListener: any; + mIsStart = false; + mListener: RingModeStatusListener; mAudioManager: any; - startService() { + startService(): void { if (this.mIsStart) { return; } - Log.showInfo(TAG, `startService`); + Log.showInfo(TAG, 'startService'); this.mIsStart = true; this.mAudioManager = getAudioManager(); this.getRingerMode(); - this.mAudioManager.on('ringerModeChange', (data) => { + this.mAudioManager.on('ringerModeChange', (data: AudioRingMode) => { Log.showInfo(TAG, `startService->ringerModeChange, data: ${JSON.stringify(data)}`); this.mListener?.updateRingerMode(data); }); } - stopService() { + stopService(): void { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `stopService`); + Log.showInfo(TAG, 'stopService'); this.mIsStart = false; this.mAudioManager = null; } - registerListener(listener: { - 'updateRingerMode': Function - }) { + registerListener(listener: RingModeStatusListener): void { Log.showInfo(TAG, `registerListener, listener: ${listener}`); this.mListener = listener; } - getRingerMode() { - this.mAudioManager.getRingerMode((error, action) => { + getRingerMode(): void { + this.mAudioManager.getRingerMode((error: BusinessError, action: AudioRingMode) => { Log.showInfo(TAG, `getRingerMode, error: ${JSON.stringify(error)} action: ${JSON.stringify(action)}`); if (error) { return; @@ -69,14 +73,14 @@ export class RingModeService { }); } - setRingerMode(mode) { + setRingerMode(mode: AudioRingMode): void { Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)}`); - this.mAudioManager.setRingerMode(mode, (err, data) => { - Log.showInfo(TAG, `mAudioManager.setRingerMode`); - }) + this.mAudioManager.setRingerMode(mode, (err: BusinessError) => { + Log.showInfo(TAG, 'mAudioManager.setRingerMode'); + }); } } let sRingModeService = createOrGet(RingModeService, TAG); -export default sRingModeService as RingModeService; \ No newline at end of file +export default sRingModeService; \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets index 698a13ae..7027c74e 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent.ets @@ -15,11 +15,11 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log' import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager" -import {obtainStartAbility} from "../../../../../../../../common/src/main/ets/default/event/EventUtil" -import {AudioRingMode} from '../common/Constants' +import { obtainStartAbility } from "../../../../../../../../common/src/main/ets/default/event/EventUtil" +import { AudioRingMode } from '../common/Constants' import ViewModel from '../viewmodel/RingModeVM' import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase' -import StyleConfiguration from '../common/StyleConfiguration' +import StyleConfiguration, { ControlCenterRingModeComponentStyle } from '../common/StyleConfiguration' const TAG = 'ringmode-ControlCenterSimpleToggleRingModeComponent' @@ -32,7 +32,7 @@ export default struct ControlCenterSimpleToggleRingModeComponent { @State mLabel: Resource = $r("app.string.control_center_complex_toggle_ring_mode_title_on") @State mDefaultChangeSwitch: boolean = true @StorageLink('RingModeComponentMode') @Watch('onRingModeUpdated') RingModeComponentMode: AudioRingMode = AudioRingMode.RINGER_MODE_NORMAL - @State style: any = StyleConfiguration.getControlCenterRingModeComponentStyle() + @State style: ControlCenterRingModeComponentStyle = StyleConfiguration.getControlCenterRingModeComponentStyle() aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets index f04d8c07..31a37f86 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets +++ b/features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent.ets @@ -14,10 +14,11 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log' -import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager' -import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' -import StyleConfiguration from '../common/StyleConfiguration' -import Constants, {AudioRingMode} from '../common/Constants' +import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration, { StatusRingModeComponentStyle } from '../common/StyleConfiguration' +import Constants, { AudioRingMode } from '../common/Constants' import ViewModel from '../viewmodel/RingModeVM' const TAG = 'ringmode-StatusBarIconItemRingModeComponent' @@ -26,8 +27,8 @@ const TAG = 'ringmode-StatusBarIconItemRingModeComponent' export default struct StatusBarIconItemRingModeComponent { @StorageLink('RingModeComponentMode') RingModeComponentMode: AudioRingMode = AudioRingMode.RINGER_MODE_NORMAL @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() - @State style: any = StyleConfiguration.getStatusRingModeComponentStyle() + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle() + @State style: StatusRingModeComponentStyle = StyleConfiguration.getStatusRingModeComponentStyle() private ringModeIcons: any aboutToAppear() { diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts b/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts index 9d9e641b..6f637328 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts @@ -14,33 +14,34 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; -import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; +import { TintContentInfo, getOrCreateTintContentInfo +} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import {AudioRingMode} from '../common/Constants' +import { AudioRingMode } from '../common/Constants'; import RingModeService from '../model/RingModeService'; -export const RingModeComponentModeKey = "RingModeComponentMode"; +export const RING_MODE_COMPONENT_MODE_KEY = 'RingModeComponentMode'; const TAG = 'RingModeVM'; export class RingModeVM { - mIsStart: boolean = false; - mRingModeComponentMode: any; + mIsStart = false; + mRingModeComponentMode: SubscribedAbstractProperty; mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.RING_MODE); constructor() { - Log.showInfo(TAG, `constructor`); + Log.showInfo(TAG, 'constructor'); } - initViewModel() { + initViewModel(): void { if (this.mIsStart) { return; } - Log.showInfo(TAG, `initViewModel `); + Log.showInfo(TAG, 'initViewModel '); this.mIsStart = true; - this.mRingModeComponentMode = AppStorage.SetAndLink(RingModeComponentModeKey, AudioRingMode.RINGER_MODE_NORMAL); + this.mRingModeComponentMode = AppStorage.SetAndLink(RING_MODE_COMPONENT_MODE_KEY, AudioRingMode.RINGER_MODE_NORMAL); RingModeService.registerListener({ 'updateRingerMode': this.updateRingerMode.bind(this) @@ -48,12 +49,12 @@ export class RingModeVM { RingModeService.startService(); } - updateRingerMode(mode) { + updateRingerMode(mode: AudioRingMode): void { Log.showInfo(TAG, `updateRingerMode, mode: ${JSON.stringify(mode)} `); this.mRingModeComponentMode.set(mode); } - setRingerMode(mode) { + setRingerMode(mode: AudioRingMode): void { Log.showInfo(TAG, `setRingerMode, mode: ${JSON.stringify(mode)} `); RingModeService.setRingerMode(mode); } @@ -65,4 +66,4 @@ export class RingModeVM { let sRingModeVM = createOrGet(RingModeVM, TAG); -export default sRingModeVM as RingModeVM; \ No newline at end of file +export default sRingModeVM; \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts index e11f03ce..fadcc029 100644 --- a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -14,22 +14,23 @@ */ import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; -import Constants from './Constants' const TAG = 'signal-StyleConfiguration'; +export class SignalComponentStyle { + cellularImageWidth: Length = $r('app.float.signal_component_icon_width'); + cellularImageHeight: Length = $r('app.float.signal_component_icon_height'); + statusBarSignalTypeFontSize: Length = $r('app.float.status_bar_signal_type_font_size'); + statusBarSignalUnknownFontSize: Length = $r('app.float.status_bar_signal_unknown_font_size'); + signalTextMaxWeight: Length = $r('app.float.signal_text_max_width'); + netSignalTextMaxWidth: Length = $r('app.float.status_bar_signal_net_signal_text_max_width'); +} + export default class StyleConfiguration { - static getSignalComponentStyle() { - const key: string = TAG + "-SignalComponent"; - return StyleManager.getStyle(key, () => { - return { - cellularImageWidth: $r('app.float.signal_component_icon_width'), - cellularImageHeight: $r('app.float.signal_component_icon_height'), - statusBarSignalTypeFontSize: $r('app.float.status_bar_signal_type_font_size'), - statusBarSignalUnknownFontSize: $r('app.float.status_bar_signal_unknown_font_size'), - signalTextMaxWeight: $r('app.float.signal_text_max_width'), - netSignalTextMaxWidth: $r('app.float.status_bar_signal_net_signal_text_max_width'), - }; - }); - } + static getSignalComponentStyle(): SignalComponentStyle { + const key: string = TAG + '-SignalComponent'; + return StyleManager.getStyle(key, () => { + return new SignalComponentStyle(); + }); + } } \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/common/constants.ts b/features/signalcomponent/src/main/ets/default/common/constants.ts index e640ed70..c7200cbe 100644 --- a/features/signalcomponent/src/main/ets/default/common/constants.ts +++ b/features/signalcomponent/src/main/ets/default/common/constants.ts @@ -14,21 +14,21 @@ */ export default class Constants { - static NETWORK_TYPE_UNKNOWN = 0; - static NETWORK_TYPE_GSM = 1; - static NETWORK_TYPE_CDMA = 2; - static NETWORK_TYPE_W_CDMA = 3; - static NETWORK_TYPE_TDS_CDMA = 4; - static NETWORK_TYPE_LTE = 5; - static NETWORK_TYPE_NR = 6; + static readonly NETWORK_TYPE_UNKNOWN = 0; + static readonly NETWORK_TYPE_GSM = 1; + static readonly NETWORK_TYPE_CDMA = 2; + static readonly NETWORK_TYPE_W_CDMA = 3; + static readonly NETWORK_TYPE_TDS_CDMA = 4; + static readonly NETWORK_TYPE_LTE = 5; + static readonly NETWORK_TYPE_NR = 6; - static CELLULAR_SIGNAL_NO = 0; - static CELLULAR_SIGNAL_MIN = 1; - static CELLULAR_SIGNAL_LOW = 2; - static CELLULAR_SIGNAL_HALF = 3; - static CELLULAR_SIGNAL_HIGH = 4; - static CELLULAR_SIGNAL_FULL = 5; - static CELLULAR_NO_SIM_CARD = -1; + static readonly CELLULAR_SIGNAL_NO = 0; + static readonly CELLULAR_SIGNAL_MIN = 1; + static readonly CELLULAR_SIGNAL_LOW = 2; + static readonly CELLULAR_SIGNAL_HALF = 3; + static readonly CELLULAR_SIGNAL_HIGH = 4; + static readonly CELLULAR_SIGNAL_FULL = 5; + static readonly CELLULAR_NO_SIM_CARD = -1; - static NET_NULL = 'NULL'; + static readonly NET_NULL = 'NULL'; } diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 155b08be..2442e4cd 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -16,23 +16,23 @@ import Constants from '../common/constants'; import mSignalModel from '../SignalModel'; import Log from '../../../../../../../common/src/main/ets/default/Log' -import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager' -import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' -import StyleConfiguration from '../common/StyleConfiguration' +import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration, { SignalComponentStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/SignalVM' const TAG = 'SignalComponent-SignalIcon' @Component -export default -struct SignalIcon { - @StorageLink('cellularLevel') cellularLevel : number = Constants.CELLULAR_NO_SIM_CARD - @StorageLink('cellularType') cellularType : number = Constants.NETWORK_TYPE_UNKNOWN - @StorageLink('networkState') networkState : string = Constants.NET_NULL - @StorageLink('signalObserved') signalObserved:boolean = false +export default struct SignalIcon { + @StorageLink('cellularLevel') cellularLevel: number = Constants.CELLULAR_NO_SIM_CARD + @StorageLink('cellularType') cellularType: number = Constants.NETWORK_TYPE_UNKNOWN + @StorageLink('networkState') networkState: string = Constants.NET_NULL + @StorageLink('signalObserved') signalObserved: boolean = false @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() - @State style: any = StyleConfiguration.getSignalComponentStyle() + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle() + @State style: SignalComponentStyle = StyleConfiguration.getSignalComponentStyle() aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); @@ -82,14 +82,14 @@ struct SignalIcon { .opacity($r("app.float.icon_component_opacity")) } -/** - * Get the string of cellular type - * - * @param {number} type - number of cellular type - * @return {string} typeString type of cellular type - */ - private updateCellularType(signalType) : string { - Log.showInfo(TAG, `updateCellularType, signalType: ${ signalType }`); + /** + * Get the string of cellular type + * + * @param {number} type - number of cellular type + * @return {string} typeString type of cellular type + */ + private updateCellularType(signalType): string { + Log.showInfo(TAG, `updateCellularType, signalType: ${signalType}`); let typeString; switch (signalType) { case Constants.NETWORK_TYPE_UNKNOWN: @@ -114,12 +114,12 @@ struct SignalIcon { return typeString; } -/** - * Get the cellular signal image - * - * @param {number} level - signal level from signalModel - * @return {string} cellularImage image of cellular signal - */ + /** + * Get the cellular signal image + * + * @param {number} level - signal level from signalModel + * @return {string} cellularImage image of cellular signal + */ private updateCellularImage(level) { Log.showInfo(TAG, `updateCellularImage, level: ${level}`); let cellularImage; @@ -151,18 +151,18 @@ struct SignalIcon { return cellularImage; } -/** - * Get the NetworkState signal name - * - * @param {string} netWorkState - network state from signal model - * @return {string} vendor's name or signal state - */ + /** + * Get the NetworkState signal name + * + * @param {string} netWorkState - network state from signal model + * @return {string} vendor's name or signal state + */ private updateNetworkState(netWorkState) { Log.showInfo(TAG, `updateNetworkState, netWorkState: ${netWorkState}`); let networkStateName; - if(netWorkState == Constants.NET_NULL){ + if (netWorkState == Constants.NET_NULL) { networkStateName = $r('app.string.net_null'); - }else { + } else { networkStateName = netWorkState; } return networkStateName; diff --git a/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts b/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts index 58313fe6..a56ca9da 100644 --- a/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts +++ b/features/signalcomponent/src/main/ets/default/viewmodel/SignalVM.ts @@ -14,8 +14,9 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log'; -import {FASlotName} from '../../../../../../../common/src/main/ets/default/Constants'; -import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import { FASlotName } from '../../../../../../../common/src/main/ets/default/Constants'; +import { TintContentInfo, getOrCreateTintContentInfo +} from '../../../../../../../common/src/main/ets/default/TintStateManager'; import createOrGet from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'SignalVM'; @@ -24,7 +25,7 @@ export class SignalVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.SIGNAL); constructor() { - Log.showInfo(TAG, `constructor`); + Log.showInfo(TAG, 'constructor'); } getTintContentInfo(): TintContentInfo { @@ -34,4 +35,4 @@ export class SignalVM { let sSignalVM = createOrGet(SignalVM, TAG); -export default sSignalVM as SignalVM; \ No newline at end of file +export default sSignalVM; \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts index 178f7dd5..f968e8ec 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -13,18 +13,18 @@ * limitations under the License. */ -import {Event} from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; -import {ItemComponentData, ActionData} -from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; +import { Event } from '../../../../../../../../common/src/main/ets/default/event/EventUtil'; +import { ItemComponentData, ActionData, FilterData +} from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; export default class Constants { - static EMPTY_AREA_POSITION_LEFT = 'left'; - static EMPTY_AREA_POSITION_CENTER = 'center'; - static EMPTY_AREA_POSITION_RIGHT = 'right'; - static GROUP_ID_LEFT = 1; - static GROUP_ID_CENTER = 2; - static GROUP_ID_RIGHT = 3; - static VERTICAL_COMPONENT_HEIGHT_VP = 58; + static readonly EMPTY_AREA_POSITION_LEFT = 'left'; + static readonly EMPTY_AREA_POSITION_CENTER = 'center'; + static readonly EMPTY_AREA_POSITION_RIGHT = 'right'; + static readonly GROUP_ID_LEFT = 1; + static readonly GROUP_ID_CENTER = 2; + static readonly GROUP_ID_RIGHT = 3; + static readonly VERTICAL_COMPONENT_HEIGHT_VP = 58; static readonly PLUGIN_COMPONENT_ICON_WIDTH = 32; static readonly PLUGIN_COMPONENT_OWNER_WANT_KEY = 'StatusBar_PluginComponentOwnerWant'; } @@ -51,11 +51,37 @@ export class StatusBarData { } export class StatusBarBackgroundData { - backgroundColor: string = "#FFFF0000"; - width: number = 0; + backgroundColor = '#FFFF0000'; + width = 0; } export class StatusBarComponentGroupContentData { - contentColor: string = "#FFFFFFFF"; - width: number = 0; + contentColor = '#FFFFFFFF'; + width = 0; } + +export interface LayoutGroup { + id: number; + Components: string[]; +} + +export interface DropdownRange { + startPosition: number; + endPosition: number; +} + +export interface StatusBarConfig { + LayoutGroups: LayoutGroup[]; + LocalSlots: string[]; + MetaSlots: FilterData[]; + emptyPosition: { + x1: number; + x2: number; + y1: number; + y2: number + }; + dropdownRanges?: { + notification: DropdownRange; + control: DropdownRange + } +} \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 160e8df4..e92b2eaa 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -18,51 +18,59 @@ import Constants from './Constants'; const TAG = 'statusBar-StyleConfiguration'; +export class VerticalStatusBarItemLoadComponentStyle { + statusBarVerticalComponentHeight: number = vp2px(Constants.VERTICAL_COMPONENT_HEIGHT_VP); +} + +export class StatusBarNotificationIconStyle { + iconWidth: Length = $r('app.float.status_bar_notification_icon_width'); + iconHeight: Length = $r('app.float.status_bar_notification_icon_height'); + iconSpace: Length = $r('app.float.status_bar_notification_icon_space'); +} + +export class IconItemComponentStyle { + stackHeight: Length = $r('app.float.status_bar_icon_item_stack_height'); + stackPadding: Length = $r('app.float.status_bar_icon_item_stack_padding'); + stackBorderRadius: Length = $r('app.float.status_bar_icon_item_stack_border_radius'); + stackBgColorSelected: ResourceColor = $r('app.color.status_bar_icon_item_stack_bg_color_selected'); + stackBgColorUnSelected: ResourceColor = $r('app.color.status_bar_icon_item_stack_bg_color_un_selected'); + componentSpace: Length = $r('app.float.status_bar_icon_item_component_space'); + iconWidth: Length = $r('app.float.status_bar_icon_item_icon_width'); + iconHeight: Length = $r('app.float.status_bar_icon_item_icon_height'); + marginLeft: Length = $r('app.float.status_bar_icon_item_margin_left'); + marginRight: Length = $r('app.float.status_bar_icon_item_margin_right'); +} + +export class PluginIconItemComponentStyle { + iconWidth: number = vp2px(Constants.PLUGIN_COMPONENT_ICON_WIDTH); +} + export default class StyleConfiguration { - static getVerticalStatusBarItemLoadComponentStyle() { - const key: string = TAG + "-VerticalStatusBarItemLoadComponent"; - return StyleManager.getStyle(key, () => { - return { - statusBarVerticalComponentHeight: vp2px(Constants.VERTICAL_COMPONENT_HEIGHT_VP), - }; - }); - } + static getVerticalStatusBarItemLoadComponentStyle(): VerticalStatusBarItemLoadComponentStyle { + const key: string = TAG + '-VerticalStatusBarItemLoadComponent'; + return StyleManager.getStyle(key, () => { + return new VerticalStatusBarItemLoadComponentStyle(); + }); + } - static getStatusBarNotificationIconStyle() { - const key: string = TAG + "-StatusBarNotificationIcon"; - return StyleManager.getStyle(key, () => { - return { - iconWidth: $r('app.float.status_bar_notification_icon_width'), - iconHeight: $r('app.float.status_bar_notification_icon_height'), - iconSpace: $r('app.float.status_bar_notification_icon_space'), - }; - }); - } + static getStatusBarNotificationIconStyle(): StatusBarNotificationIconStyle { + const key: string = TAG + '-StatusBarNotificationIcon'; + return StyleManager.getStyle(key, () => { + return new StatusBarNotificationIconStyle(); + }); + } - static getIconItemComponentStyle() { - const key: string = TAG + "-IconItemComponent"; - return StyleManager.getStyle(key, () => { - return { - stackHeight: $r('app.float.status_bar_icon_item_stack_height'), - stackPadding: $r('app.float.status_bar_icon_item_stack_padding'), - stackBorderRadius: $r('app.float.status_bar_icon_item_stack_border_radius'), - stackBgColorSelected: $r('app.color.status_bar_icon_item_stack_bg_color_selected'), - stackBgColorUnSelected: $r('app.color.status_bar_icon_item_stack_bg_color_un_selected'), - componentSpace: $r('app.float.status_bar_icon_item_component_space'), - iconWidth: $r('app.float.status_bar_icon_item_icon_width'), - iconHeight: $r('app.float.status_bar_icon_item_icon_height'), - marginLeft: $r('app.float.status_bar_icon_item_margin_left'), - marginRight: $r('app.float.status_bar_icon_item_margin_right'), - }; - }); - } + static getIconItemComponentStyle(): IconItemComponentStyle { + const key: string = TAG + '-IconItemComponent'; + return StyleManager.getStyle(key, () => { + return new IconItemComponentStyle(); + }); + } - static getPluginIconItemComponentStyle() { - const key: string = TAG + '-PluginIconItemComponent'; - return StyleManager.getStyle(key, () => { - return { - iconWidth : vp2px(Constants.PLUGIN_COMPONENT_ICON_WIDTH), - }; - }); - } + static getPluginIconItemComponentStyle(): PluginIconItemComponentStyle { + const key: string = TAG + '-PluginIconItemComponent'; + return StyleManager.getStyle(key, () => { + return new PluginIconItemComponentStyle(); + }); + } } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts index 8b217e4f..0eae3d1d 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -13,336 +13,367 @@ * limitations under the License. */ -import Log from "../../../../../../../../common/src/main/ets/default/Log"; -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import SwitchUserManager from "../../../../../../../../common/src/main/ets/default/SwitchUserManager"; -import {ItemComponentData, ActionData, PluginType -} from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; -import PluginDataSourceAdapter from "../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter"; -import AbilityManager from "../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager"; -import Constants, {StatusBarData, StatusBarComponentData} from "../common/Constants"; -import {parseEventString} from "../../../../../../../../common/src/main/ets/default/Event/EventUtil"; - -export type StatusBarListener = { - setStatusBarLayout: (layout: string[][]) => void; - setStatusBarEmptyWidth: (width: number) => void; - setItemData: (id: string, itemData: StatusBarComponentData) => void; -}; +import SwitchUserManager, { UserInfo } from '../../../../../../../../common/src/main/ets/default/SwitchUserManager'; +import { ItemComponentData, PluginComponentData, FilterData +} from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; +import PluginDataSourceAdapter from '../../../../../../../../common/src/main/ets/plugindatasource/PluginDataSourceAdapter'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import Constants, { StatusBarData, StatusBarComponentData, LayoutGroup, StatusBarConfig } from '../common/Constants'; +import { parseEventString } from '../../../../../../../../common/src/main/ets/default/Event/EventUtil'; + +export interface StatusBarListener { + setStatusBarLayout(layout: string[][]): void; + + setStatusBarEmptyWidth(width: number): void; -const TAG = "StatusBarModel"; + setItemData(id: string, itemData: StatusBarComponentData): void; +} + +const TAG = 'StatusBarModel'; const STATUSBAR_SOURCE_CONFIG = { - action: "com.ohos.systemui.action.BAR_ICON", - filterDatas: [], - loaderConfig: { - MetaSource: { - action: "com.ohos.systemui.action.BAR_ICON", - permission: null, - }, - PluginSourceLoader: { - action: 'com.ohos.systemui.action.BAR_ICON', - permission: null, - }, + action: 'com.ohos.systemui.action.BAR_ICON', + filterDatas: new Array(), + loaderConfig: { + MetaSource: { + action: 'com.ohos.systemui.action.BAR_ICON', + permission: null, + }, + PluginSourceLoader: { + action: 'com.ohos.systemui.action.BAR_ICON', + permission: null, }, + }, }; function parseItemData(itemData: ItemComponentData): StatusBarComponentData { - let { isShowLabel, isShowIcon, selectedClickAction, relationWindowId, ...other } = itemData.actionData?.extra; - let selectAction = parseEventString(selectedClickAction); - let statusBarItemData: StatusBarComponentData = { - ...itemData, - isShowLabel: isShowLabel ? isShowLabel !== false : false, - isShowIcon: isShowIcon ? isShowIcon !== false : true, - canSelect: selectAction ? true : false, - relationWindowId: relationWindowId, - actionData: { - ...itemData.actionData, - selectedClickAction: selectAction, - extra: undefined, - }, - }; - return statusBarItemData; + let { isShowLabel, isShowIcon, selectedClickAction, relationWindowId, ...other } = itemData.actionData?.extra; + let selectAction = parseEventString(selectedClickAction); + let statusBarItemData: StatusBarComponentData = { + ...itemData, + isShowLabel: isShowLabel ? isShowLabel !== false : false, + isShowIcon: isShowIcon ? isShowIcon !== false : true, + canSelect: selectAction ? true : false, + relationWindowId: relationWindowId, + actionData: { + ...itemData.actionData, + selectedClickAction: selectAction, + extra: undefined, + }, + }; + return statusBarItemData; } export class StatusBarService { - mIsStart: boolean = false; - mAdapter: PluginDataSourceAdapter; - mListener: StatusBarListener | undefined; - mConfig: any; - mStatusBarData: StatusBarData; - mStatusBarLayoutGroupTemplate: string[][] = []; - mStatusBarAllLayout: string[] ; - - constructor() { - Log.showInfo(TAG, `constructor`); + mIsStart = false; + mAdapter: PluginDataSourceAdapter; + mListener: StatusBarListener | undefined; + mConfig: StatusBarConfig; + mStatusBarData: StatusBarData; + mStatusBarLayoutGroupTemplate: string[][] = []; + mStatusBarAllLayout: string[]; + + constructor() { + Log.showInfo(TAG, 'constructor'); + } + + setStatusBarData(data: StatusBarData): void{ + Log.showInfo(TAG, 'setStatusBarData'); + this.mStatusBarData = data; + } + + startService(config: StatusBarConfig, moduleName: string): void { + if (this.mIsStart) { + return; } + Log.showInfo(TAG, 'start StatusBarService.'); + this.mIsStart = true; - setStatusBarData(data: StatusBarData): void{ - Log.showInfo(TAG, `setStatusBarData`); - this.mStatusBarData = data; - } + this.parseConfig(config); - startService(config, moduleName) { - if (this.mIsStart) { - return; - } - Log.showInfo(TAG, `start StatusBarService.`); - this.mIsStart = true; + SwitchUserManager.getInstance().registerListener(this); + STATUSBAR_SOURCE_CONFIG.filterDatas = config.MetaSlots; + this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); + this.mAdapter.setWant(globalThis[Constants.PLUGIN_COMPONENT_OWNER_WANT_KEY]); + this.mAdapter.initDataSource(STATUSBAR_SOURCE_CONFIG); + } - this.parseConfig(config); - - SwitchUserManager.getInstance().registerListener(this); - STATUSBAR_SOURCE_CONFIG.filterDatas = config.MetaSlots; - this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); - this.mAdapter.setWant(globalThis[Constants.PLUGIN_COMPONENT_OWNER_WANT_KEY]); - this.mAdapter.initDataSource(STATUSBAR_SOURCE_CONFIG); + stopService(): void { + if (!this.mIsStart) { + return; } - - stopService() { - if (!this.mIsStart) { - return; + Log.showInfo(TAG, 'stop StatusBarService.'); + this.mIsStart = false; + + this.mAdapter.clearAll(); + } + + parseConfig(config: StatusBarConfig): void { + Log.showInfo(TAG, `parseConfig, config: ${JSON.stringify(config)}`); + this.mConfig = config; + + const groupIds = [Constants.GROUP_ID_LEFT, Constants.GROUP_ID_CENTER, Constants.GROUP_ID_RIGHT]; + groupIds.forEach((groupId) => { + for (const groupInfo of config.LayoutGroups) { + if (groupId == groupInfo.id) { + this.mStatusBarLayoutGroupTemplate.push([...groupInfo.Components]); + break; } - Log.showInfo(TAG, `stop StatusBarService.`); - this.mIsStart = false; - - this.mAdapter.clearAll(); - } - - parseConfig(config) { - Log.showInfo(TAG, `parseConfig`); - this.mConfig = config; - - const groupIds = [Constants.GROUP_ID_LEFT, Constants.GROUP_ID_CENTER, Constants.GROUP_ID_RIGHT]; - groupIds.forEach((groupId) => { - for (const groupInfo of config.LayoutGroups) { - if (groupId == groupInfo.id) { - this.mStatusBarLayoutGroupTemplate.push([...groupInfo.Components]); - break; - } - } - }); - Log.showInfo(TAG, `parseConfig, statusBarLayoutGroupTemplate: ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`) - - this.mStatusBarAllLayout = [...config.LocalSlots]; - this.onDisplayRotate(0); - } - - calcStatusBarLayout() { - Log.showInfo(TAG, `calcStatusBarLayout`); - let statusBarLayout = []; - for (let i = 0;i < this.mStatusBarLayoutGroupTemplate.length; i++) { - let componentsTemplate = this.mStatusBarLayoutGroupTemplate[i]; - let components: string [] = []; - for (let componentTemplate of componentsTemplate) { - if (this.mStatusBarAllLayout.indexOf(componentTemplate) >= 0) { - components.push(componentTemplate); - } - } - statusBarLayout.push(components); + } + }); + Log.showInfo(TAG, `parseConfig, statusBarLayoutGroupTemplate: ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`); + + this.mStatusBarAllLayout = [...config.LocalSlots]; + this.onDisplayRotate(0); + } + + calcStatusBarLayout(): void { + Log.showInfo(TAG, 'calcStatusBarLayout'); + let statusBarLayout: string[][] = []; + this.mStatusBarLayoutGroupTemplate.forEach(componentsTemplate => { + let components: string [] = []; + for (let componentTemplate of componentsTemplate) { + if (this.mStatusBarAllLayout.indexOf(componentTemplate) >= 0) { + components.push(componentTemplate); } - Log.showDebug(TAG, `calcStatusBarLayout, statusBarLayout: ${JSON.stringify(statusBarLayout)}`) - this.mListener?.setStatusBarLayout(statusBarLayout); - } - - userChange(userInfo) { - Log.showInfo(TAG, `userChange`); + } + statusBarLayout.push(components); + }); + Log.showDebug(TAG, `calcStatusBarLayout, statusBarLayout: ${JSON.stringify(statusBarLayout)}`); + this.mListener?.setStatusBarLayout(statusBarLayout); + } + + userChange(userInfo: UserInfo): void { + Log.showInfo(TAG, 'userChange'); + this.mAdapter.loadData(userInfo.userId); + } + + initFinish(): void { + Log.showInfo(TAG, 'initFinish'); + SwitchUserManager.getInstance() + .getCurrentUserInfo() + .then((userInfo) => { this.mAdapter.loadData(userInfo.userId); + }).catch((err) => { + }); + } + + registerListener(listener: StatusBarListener | undefined): void { + Log.showInfo(TAG, `registerListener, listener: ${listener}`); + this.mListener = listener; + } + + onItemAdd(itemData: ItemComponentData): void { + Log.showInfo(TAG, 'onItemAdd'); + let statusBarData: StatusBarComponentData = parseItemData(itemData); + let id = itemData.id; + this.mListener?.setItemData(id, statusBarData); + if (this.mStatusBarAllLayout.indexOf(id) < 0) { + this.mStatusBarAllLayout.push(id); + Log.showInfo(TAG, `onItemAdd, mStatusBarAllLayout: ${JSON.stringify(this.mStatusBarAllLayout)}`); + this.calcStatusBarLayout(); } - - initFinish() { - Log.showInfo(TAG, `initFinish`); - SwitchUserManager.getInstance() - .getCurrentUserInfo() - .then((userInfo) => { - this.mAdapter.loadData(userInfo.userId); - }); + } + + onItemRemove(itemData: ItemComponentData): void { + Log.showInfo(TAG, 'onItemRemove'); + let id = itemData.id; + if (this.mStatusBarAllLayout.indexOf(id) >= 0) { + this.mStatusBarAllLayout.splice(this.mStatusBarAllLayout.indexOf(id), 1); + Log.showInfo(TAG, `onItemRemove, mStatusBarAllLayout: ${JSON.stringify(this.mStatusBarAllLayout)}`); + this.calcStatusBarLayout(); } - - registerListener(listener: StatusBarListener | undefined) { - Log.showInfo(TAG, `registerListener, listener: ${listener}`); - this.mListener = listener; + this.mListener?.setItemData(id, undefined); + } + + onDisplayRotate(rotation: number): void { + Log.showInfo(TAG, `onDisplayRotate, rotation: ${rotation}`); + let position: string = this.calcEmptyAreaPosition(rotation); + this.onEmptyAreaChange(position, rotation); + } + + calcEmptyAreaPosition(rotation: number): string { + Log.showInfo(TAG, `calcEmptyAreaPosition, rotation: ${rotation}`); + let configEmptyPosition = this.mConfig.emptyPosition; + if (!configEmptyPosition || configEmptyPosition.x1 == configEmptyPosition.x2 || configEmptyPosition.y1 == configEmptyPosition.y2) { + return null; } - onItemAdd(itemData: ItemComponentData) { - Log.showInfo(TAG, `onItemAdd`); - let statusBarData: StatusBarComponentData = parseItemData(itemData); - let id = itemData.id; - this.mListener?.setItemData(id, statusBarData); - if (this.mStatusBarAllLayout.indexOf(id) < 0) { - this.mStatusBarAllLayout.push(id); - Log.showInfo(TAG, `onItemAdd, mStatusBarAllLayout: ${JSON.stringify(this.mStatusBarAllLayout)}`) - this.calcStatusBarLayout(); - } + let leftRightArea = this.calcStatusBarLeftRightArea(); + let statusBarLeft = leftRightArea.left; + let statusBarRight = leftRightArea.right; + + let emptyPosition; + if (rotation == 0) { + emptyPosition = { ...configEmptyPosition }; + } else if (rotation == 90) { + emptyPosition = { + x1: this.mStatusBarData.displayWidth - configEmptyPosition.y2, + y1: configEmptyPosition.x1, + x2: this.mStatusBarData.displayWidth - configEmptyPosition.y1, + y2: configEmptyPosition.x2 + }; + } else if (rotation == 180) { + emptyPosition = { + x1: this.mStatusBarData.displayWidth - configEmptyPosition.x2, + y1: this.mStatusBarData.displayHeight - configEmptyPosition.y2, + x2: this.mStatusBarData.displayWidth - configEmptyPosition.x1, + y2: this.mStatusBarData.displayHeight - configEmptyPosition.y1, + }; + } else { + emptyPosition = { + x1: configEmptyPosition.y1, + y1: this.mStatusBarData.displayHeight - configEmptyPosition.x2, + x2: configEmptyPosition.y2, + y2: this.mStatusBarData.displayHeight - configEmptyPosition.x1 + }; } - onItemRemove(itemData: ItemComponentData) { - Log.showInfo(TAG, `onItemRemove`); - let id = itemData.id; - if (this.mStatusBarAllLayout.indexOf(id) >= 0) { - this.mStatusBarAllLayout.splice(this.mStatusBarAllLayout.indexOf(id), 1); - Log.showInfo(TAG, `onItemRemove, mStatusBarAllLayout: ${JSON.stringify(this.mStatusBarAllLayout)}`) - this.calcStatusBarLayout(); - } - this.mListener?.setItemData(id, undefined); + let isGlandLeft = this.isEmptyAreaGlandStatusBar(emptyPosition, statusBarLeft); + let isGlandRight = this.isEmptyAreaGlandStatusBar(emptyPosition, statusBarRight); + Log.showInfo(TAG, `calcEmptyAreaPosition, gland: ${isGlandLeft} ${isGlandRight}`); + if (isGlandLeft && isGlandRight) { + return Constants.EMPTY_AREA_POSITION_CENTER; + } else if (isGlandLeft) { + return Constants.EMPTY_AREA_POSITION_LEFT; + } else if (isGlandRight) { + return Constants.EMPTY_AREA_POSITION_RIGHT; + } else { + return null; } - - onDisplayRotate(rotation: number) { - Log.showInfo(TAG, `onDisplayRotate, rotation: ${rotation}`); - let position: string = this.calcEmptyAreaPosition(rotation); - this.onEmptyAreaChange(position, rotation); + } + + calcStatusBarLeftRightArea(): { + left: { + x1: number; + y1: number; + x2: number; + y2: number; + }, + right: { + x1: number; + y1: number; + x2: number; + y2: number; } - - calcEmptyAreaPosition(rotation: number): string { - Log.showInfo(TAG, `calcEmptyAreaPosition, rotation: ${rotation}`); - let configEmptyPosition = this.mConfig.emptyPosition; - if (!configEmptyPosition || configEmptyPosition.x1 == configEmptyPosition.x2 || configEmptyPosition.y1 == configEmptyPosition.y2) { - return null; - } - - let statusBarLeft; - let statusBarRight; - if (this.mStatusBarData.showHorizontal) { - statusBarLeft = { - x1: this.mStatusBarData.left, - y1: this.mStatusBarData.top, - x2: this.mStatusBarData.left + this.mStatusBarData.realWidth / 2, - y2: this.mStatusBarData.top + this.mStatusBarData.realHeight - }; - statusBarRight = { - x1: statusBarLeft.x2, - y1: statusBarLeft.y1, - x2: this.mStatusBarData.left + this.mStatusBarData.realWidth, - y2: statusBarLeft.y2 - }; - } else { - statusBarLeft = { - x1: this.mStatusBarData.left, - y1: this.mStatusBarData.top, - x2: this.mStatusBarData.left + this.mStatusBarData.realWidth, - y2: this.mStatusBarData.top + this.mStatusBarData.realHeight / 2 - }; - statusBarRight = { - x1: statusBarLeft.x1, - y1: statusBarLeft.y2, - x2: statusBarLeft.x2, - y2: this.mStatusBarData.top + this.mStatusBarData.realHeight - }; - } - Log.showInfo(TAG, `calcEmptyAreaPosition, statusBarLeft: ${JSON.stringify(statusBarLeft)} statusBarRight: ${JSON.stringify(statusBarRight)}`); - - let emptyPosition; - if (rotation == 0) { - emptyPosition = { ...configEmptyPosition }; - } else if (rotation == 90) { - emptyPosition = { - x1: this.mStatusBarData.displayWidth - configEmptyPosition.y2, - y1: configEmptyPosition.x1, - x2: this.mStatusBarData.displayWidth - configEmptyPosition.y1, - y2: configEmptyPosition.x2 - } - } else if (rotation == 180) { - emptyPosition = { - x1: this.mStatusBarData.displayWidth - configEmptyPosition.x2, - y1: this.mStatusBarData.displayHeight - configEmptyPosition.y2, - x2: this.mStatusBarData.displayWidth - configEmptyPosition.x1, - y2: this.mStatusBarData.displayHeight - configEmptyPosition.y1, - } - } else { - emptyPosition = { - x1: configEmptyPosition.y1, - y1: this.mStatusBarData.displayHeight - configEmptyPosition.x2, - x2: configEmptyPosition.y2, - y2: this.mStatusBarData.displayHeight - configEmptyPosition.x1 - } - } - - let isGlandLeft = this.isEmptyAreaGlandStatusBar(emptyPosition, statusBarLeft); - let isGlandRight = this.isEmptyAreaGlandStatusBar(emptyPosition, statusBarRight); - Log.showInfo(TAG, `calcEmptyAreaPosition, gland: ${isGlandLeft} ${isGlandRight}`); - if (isGlandLeft && isGlandRight) { - return Constants.EMPTY_AREA_POSITION_CENTER; - } else if (isGlandLeft) { - return Constants.EMPTY_AREA_POSITION_LEFT; - } else if (isGlandRight) { - return Constants.EMPTY_AREA_POSITION_RIGHT; - } else { - return null; - } + }{ + let statusBarLeft; + let statusBarRight; + if (this.mStatusBarData.showHorizontal) { + statusBarLeft = { + x1: this.mStatusBarData.left, + y1: this.mStatusBarData.top, + x2: this.mStatusBarData.left + this.mStatusBarData.realWidth / 2, + y2: this.mStatusBarData.top + this.mStatusBarData.realHeight + }; + statusBarRight = { + x1: statusBarLeft.x2, + y1: statusBarLeft.y1, + x2: this.mStatusBarData.left + this.mStatusBarData.realWidth, + y2: statusBarLeft.y2 + }; + } else { + statusBarLeft = { + x1: this.mStatusBarData.left, + y1: this.mStatusBarData.top, + x2: this.mStatusBarData.left + this.mStatusBarData.realWidth, + y2: this.mStatusBarData.top + this.mStatusBarData.realHeight / 2 + }; + statusBarRight = { + x1: statusBarLeft.x1, + y1: statusBarLeft.y2, + x2: statusBarLeft.x2, + y2: this.mStatusBarData.top + this.mStatusBarData.realHeight + }; } - - isEmptyAreaGlandStatusBar(emptyPosition, statusBarArea): boolean { - Log.showInfo(TAG, `isEmptyAreaGlandStatusBar, emptyPosition: ${JSON.stringify(emptyPosition)} statusBarArea: ${JSON.stringify(statusBarArea)}`); - let ex1 = emptyPosition.x1; - let ey1 = emptyPosition.y1; - let ex2 = emptyPosition.x2; - let ey2 = emptyPosition.y2; - let x1 = statusBarArea.x1; - let y1 = statusBarArea.y1; - let x2 = statusBarArea.x2; - let y2 = statusBarArea.y2; - - if (ex1 >= x1 && ex1 <= x2 && ey1 >= y1 && ey1 <= y2) { - return true; - } else if (ex2 >= x1 && ex2 <= x2 && ey1 >= y1 && ey1 <= y2) { - return true; - } else if (ex1 >= x1 && ex1 <= x2 && ey2 >= y1 && ey2 <= y2) { - return true; - } else if (ex2 >= x1 && ex2 <= x2 && ey2 >= y1 && ey2 <= y2) { - return true; - } - return false; + Log.showInfo(TAG, `calcEmptyAreaPosition, statusBarLeft: ${JSON.stringify(statusBarLeft)} statusBarRight: ${JSON.stringify(statusBarRight)}`); + return { left: statusBarLeft, right: statusBarRight }; + } + + isEmptyAreaGlandStatusBar(emptyPosition: { + x1: number; + y1: number; + x2: number; + y2: number; + }, statusBarArea: { + x1: number; + y1: number; + x2: number; + y2: number; + }): boolean { + Log.showInfo(TAG, `isEmptyAreaGlandStatusBar, emptyPosition: ${JSON.stringify(emptyPosition)} statusBarArea: ${JSON.stringify(statusBarArea)}`); + let ex1 = emptyPosition.x1; + let ey1 = emptyPosition.y1; + let ex2 = emptyPosition.x2; + let ey2 = emptyPosition.y2; + let x1 = statusBarArea.x1; + let y1 = statusBarArea.y1; + let x2 = statusBarArea.x2; + let y2 = statusBarArea.y2; + + if (ex1 >= x1 && ex1 <= x2 && ey1 >= y1 && ey1 <= y2) { + return true; + } else if (ex2 >= x1 && ex2 <= x2 && ey1 >= y1 && ey1 <= y2) { + return true; + } else if (ex1 >= x1 && ex1 <= x2 && ey2 >= y1 && ey2 <= y2) { + return true; + } else if (ex2 >= x1 && ex2 <= x2 && ey2 >= y1 && ey2 <= y2) { + return true; } - - onEmptyAreaChange(position: string, rotation: number) { - Log.showInfo(TAG, `onEmptyAreaChange, position: ${position} rotation: ${rotation}`); - this.calcEmptyWidth(rotation); - this.setEmptyAreaToLayoutTemplate(position); - let id = FASlotName.EMPTY; - if (this.mStatusBarAllLayout.indexOf(id) >= 0) { - this.mStatusBarAllLayout.splice(this.mStatusBarAllLayout.indexOf(id), 1); - } - if (position) { - this.mStatusBarAllLayout.push(id); - } - Log.showInfo(TAG, `onEmptyAreaChange, mStatusBarAllLayout: ${JSON.stringify(this.mStatusBarAllLayout)}`); - this.calcStatusBarLayout(); + return false; + } + + onEmptyAreaChange(position: string, rotation: number): void { + Log.showInfo(TAG, `onEmptyAreaChange, position: ${position} rotation: ${rotation}`); + this.calcEmptyWidth(rotation); + this.setEmptyAreaToLayoutTemplate(position); + let id = FASlotName.EMPTY; + if (this.mStatusBarAllLayout.indexOf(id) >= 0) { + this.mStatusBarAllLayout.splice(this.mStatusBarAllLayout.indexOf(id), 1); } - - setEmptyAreaToLayoutTemplate(position: string) { - Log.showInfo(TAG, `setEmptyAreaToLayoutTemplate, position: ${position}`); - for (let i = 0;i < this.mStatusBarLayoutGroupTemplate.length; i++) { - let componentsTemplate = this.mStatusBarLayoutGroupTemplate[i]; - let index = componentsTemplate.indexOf(FASlotName.EMPTY); - if (index >= 0) { - componentsTemplate.splice(index, 1); - break; - } - } - if (position == Constants.EMPTY_AREA_POSITION_LEFT) { - this.mStatusBarLayoutGroupTemplate[0].splice(0, 0, FASlotName.EMPTY); - } else if (position == Constants.EMPTY_AREA_POSITION_CENTER) { - this.mStatusBarLayoutGroupTemplate[1].splice(0, 0, FASlotName.EMPTY); - } else if (position == Constants.EMPTY_AREA_POSITION_RIGHT) { - this.mStatusBarLayoutGroupTemplate[2].push(FASlotName.EMPTY); - } - Log.showInfo(TAG, `setEmptyAreaToLayoutTemplate, template: ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`); + if (position) { + this.mStatusBarAllLayout.push(id); } - - calcEmptyWidth(rotation: number) { - Log.showInfo(TAG, `calcEmptyWidth, rotation: ${rotation}`); - let width: number = 0; - if (this.mConfig.emptyPosition) { - if (rotation == 0 || rotation == 180) { - width = this.mConfig.emptyPosition.x2 - this.mConfig.emptyPosition.x1; - } else { - width = this.mConfig.emptyPosition.y2 - this.mConfig.emptyPosition.y1; - } - } - Log.showInfo(TAG, `calcEmptyWidth, width: ${width}`); - this.mListener?.setStatusBarEmptyWidth(width); + Log.showInfo(TAG, `onEmptyAreaChange, mStatusBarAllLayout: ${JSON.stringify(this.mStatusBarAllLayout)}`); + this.calcStatusBarLayout(); + } + + setEmptyAreaToLayoutTemplate(position: string): void { + Log.showInfo(TAG, `setEmptyAreaToLayoutTemplate, position: ${position}`); + for (let componentsTemplate of this.mStatusBarLayoutGroupTemplate) { + let index = componentsTemplate.indexOf(FASlotName.EMPTY); + if (index >= 0) { + componentsTemplate.splice(index, 1); + break; + } + } + if (position == Constants.EMPTY_AREA_POSITION_LEFT) { + this.mStatusBarLayoutGroupTemplate[0].splice(0, 0, FASlotName.EMPTY); + } else if (position == Constants.EMPTY_AREA_POSITION_CENTER) { + this.mStatusBarLayoutGroupTemplate[1].splice(0, 0, FASlotName.EMPTY); + } else if (position == Constants.EMPTY_AREA_POSITION_RIGHT) { + this.mStatusBarLayoutGroupTemplate[2].push(FASlotName.EMPTY); + } + Log.showInfo(TAG, `setEmptyAreaToLayoutTemplate, template: ${JSON.stringify(this.mStatusBarLayoutGroupTemplate)}`); + } + + calcEmptyWidth(rotation: number): void { + Log.showInfo(TAG, `calcEmptyWidth, rotation: ${rotation}`); + let width = 0; + if (this.mConfig.emptyPosition) { + if (rotation == 0 || rotation == 180) { + width = this.mConfig.emptyPosition.x2 - this.mConfig.emptyPosition.x1; + } else { + width = this.mConfig.emptyPosition.y2 - this.mConfig.emptyPosition.y1; + } } + Log.showInfo(TAG, `calcEmptyWidth, width: ${width}`); + this.mListener?.setStatusBarEmptyWidth(width); + } } let sStatusBarService = createOrGet(StatusBarService, TAG); -export default sStatusBarService as StatusBarService; \ No newline at end of file +export default sStatusBarService; \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets index fc138521..56d761e9 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/IconItemComponent.ets @@ -14,13 +14,14 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log' -import EventManager, {unsubscribe} from '../../../../../../../../common/src/main/ets/default/event/EventManager' +import EventManager, { unsubscribe } from '../../../../../../../../common/src/main/ets/default/event/EventManager' import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils' -import {WINDOW_SHOW_HIDE_EVENT} from '../../../../../../../../common/src/main/ets/default/WindowManager' -import {PluginType} from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" +import { WINDOW_SHOW_HIDE_EVENT } from '../../../../../../../../common/src/main/ets/default/WindowManager' +import { PluginType } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" import ViewModel from '../viewmodel/StatusBarVM' -import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' -import StyleConfiguration from '../common/StyleConfiguration' +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration, { IconItemComponentStyle } from '../common/StyleConfiguration' import MetaIconItemComponent from './MetaIconItemComponent' import PluginIconItemComponent from './PluginIconItemComponent' @@ -34,8 +35,8 @@ export default struct IconItemComponent { selected: false } mClearCallback: unsubscribe | undefined - @State style: any = StyleConfiguration.getIconItemComponentStyle() - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @State style: IconItemComponentStyle = StyleConfiguration.getIconItemComponentStyle() + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle() @State mHasMarginLR: boolean = false aboutToAppear() { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets index 5b4551f8..91c6a688 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets @@ -14,11 +14,12 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log' -import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager' +import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager' import CheckEmptyUtils from '../../../../../../../../common/src/main/ets/default/CheckEmptyUtils' import ViewModel from '../viewmodel/StatusBarVM' -import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' -import StyleConfiguration from '../common/StyleConfiguration' +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration, { IconItemComponentStyle } from '../common/StyleConfiguration' const TAG = 'MetaIconItemComponent' @@ -27,8 +28,8 @@ export default struct MetaIconItemComponent { private keyId: string @State mItemData: any = {} @State mTintContentInfo: TintContentInfo = new TintContentInfo() - @State style: any = StyleConfiguration.getIconItemComponentStyle() - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @State style: IconItemComponentStyle = StyleConfiguration.getIconItemComponentStyle() + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets index d57cb58d..efd45d6c 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -16,8 +16,9 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log' import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager' import { PluginComponentData } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" -import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' -import StyleConfiguration from '../common/StyleConfiguration' +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration, { PluginIconItemComponentStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/StatusBarVM' const TAG = 'PluginIconItemComponent' @@ -27,8 +28,8 @@ export default struct PluginIconItemComponent { private keyId: string @State @Watch('onPluginDataChange') mPluginData: PluginComponentData = new PluginComponentData() @State @Watch('onTintContentChange') mTintContentInfo: TintContentInfo = new TintContentInfo() - @State style: any = StyleConfiguration.getPluginIconItemComponentStyle() - @State @Watch('onCommonStyleChange') styleCommon: any = StyleConfigurationCommon.getCommonStyle() + @State style: PluginIconItemComponentStyle = StyleConfiguration.getPluginIconItemComponentStyle() + @State @Watch('onCommonStyleChange') styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle() aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index 247c72f6..ad15dd96 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -14,11 +14,13 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log' -import {StatusBarData, StatusBarBackgroundData} from '../common/Constants' -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants' -import {TintContentInfo} from '../../../../../../../../common/src/main/ets/default/TintStateManager' -import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' -import StyleConfiguration from '../common/StyleConfiguration' +import { StatusBarData, StatusBarBackgroundData, StatusBarConfig } from '../common/Constants' +import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants' +import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration, { StatusBarNotificationIconStyle, VerticalStatusBarItemLoadComponentStyle +} from '../common/StyleConfiguration' import ViewModel from '../viewmodel/StatusBarVM' import IconItemComponent from './IconItemComponent' import BatteryIcon from '../../../../../../../batterycomponent/src/main/ets/default/pages/batteryIcon' @@ -40,7 +42,7 @@ const TAG_StatusBarBackground = 'StatusBarBackground' @Component export default struct StatusBarComponent { - private mStatusBarComponentConfig: any = {} + private mStatusBarComponentConfig: StatusBarConfig @StorageLink('StatusBarLayout') mStatusBarLayout: any = [[], [], []] @State mStatusBarData: StatusBarData = ViewModel.getStatusBarData() private moduleName: string = '' @@ -54,7 +56,7 @@ export default struct StatusBarComponent { Log.showInfo(TAG, `aboutToDisappear`); } - initViewModel(moduleName) { + initViewModel(moduleName: string) { Log.showInfo(TAG, `initViewModel`); ViewModel.initViewModel(this.mStatusBarComponentConfig, moduleName); } @@ -207,7 +209,7 @@ struct StatusBarGroup { struct VerticalStatusBarItemLoadComponent { private mComponentName: string @State mComponentHeight: number = 0 - @State style: any = StyleConfiguration.getVerticalStatusBarItemLoadComponentStyle() + @State style: VerticalStatusBarItemLoadComponentStyle = StyleConfiguration.getVerticalStatusBarItemLoadComponentStyle() aboutToAppear() { Log.showInfo(TAG_VerticalStatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName}`); @@ -301,8 +303,8 @@ struct StatusBarNotificationIcon { @StorageLink('notificationList') notificationList: any = [] @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 @State mTintContentInfo: TintContentInfo = ViewModel.getNotificationTintContentInfo() - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() - @State style: any = StyleConfiguration.getStatusBarNotificationIconStyle() + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle() + @State style: StatusBarNotificationIconStyle = StyleConfiguration.getStatusBarNotificationIconStyle() aboutToAppear() { Log.showInfo(TAG_StatusBarNotificationIcon, `aboutToAppear`); @@ -351,4 +353,4 @@ struct StatusBarNotificationIcon { } .height('100%') } -} \ No newline at end of file +} diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index 9316fb39..b7c60dca 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -15,31 +15,31 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import WindowManager, {WindowType} from '../../../../../../../../common/src/main/ets/default/WindowManager'; -import TintStateManager, {TintState, TintContentInfo, getOrCreateTintContentInfo +import WindowManager, { WindowType } from '../../../../../../../../common/src/main/ets/default/WindowManager'; +import TintStateManager, { TintState, TintContentInfo, getOrCreateTintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager'; -import {FASlotName, Rect} from '../../../../../../../../common/src/main/ets/default/Constants'; +import { FASlotName, Rect } from '../../../../../../../../common/src/main/ets/default/Constants'; import { PluginType, PluginComponentData } from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; import StyleConfigurationCommon from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; -import Constants, {StatusBarData, StatusBarBackgroundData, StatusBarComponentGroupContentData, StatusBarComponentData -} from '../common/Constants'; +import { StatusBarData, StatusBarBackgroundData, StatusBarComponentGroupContentData, StatusBarComponentData, + StatusBarConfig } from '../common/Constants'; import StatusBarService from '../model/StatusBarService'; -export const StatusBarLayoutKey = "StatusBarLayout"; +export const STATUS_BAR_LAYOUT_KEY = 'StatusBarLayout'; -export const StatusBarEmptyWidthKey = "StatusBarEmptyWidth"; +export const STATUS_BAR_EMPTY_WIDTH_KEY = 'StatusBarEmptyWidth'; const TAG = 'StatusBarVM'; export class StatusBarVM { - mIsStart: boolean = false; + mIsStart = false; mStatusBarLayout: string[][] = [[], [], []]; - mStatusBarEmptyWidth: any; + mStatusBarEmptyWidth; mUseCount = 0; - mStatusBarEnable: boolean = true; + mStatusBarEnable = true; mBackgroundDatas: StatusBarBackgroundData[]; - mStatusBarData: StatusBarData = { ...new StatusBarData() } + mStatusBarData: StatusBarData = { ...new StatusBarData() }; mComponentAreaMap: Map = new Map(); mComponentGroupContentDatas: StatusBarComponentGroupContentData[] = [ new StatusBarComponentGroupContentData(), new StatusBarComponentGroupContentData(), new StatusBarComponentGroupContentData()]; @@ -48,12 +48,12 @@ export class StatusBarVM { mUseInWindowName: WindowType = WindowType.STATUS_BAR; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showInfo(TAG, 'constructor'); this.mStatusBarData = AppStorage.SetAndLink(TAG + '_StatusBarData', this.mStatusBarData).get(); StatusBarService.setStatusBarData(this.mStatusBarData); - this.mStatusBarLayout = AppStorage.SetAndLink(StatusBarLayoutKey, this.mStatusBarLayout).get(); - this.mStatusBarEmptyWidth = AppStorage.SetAndLink(StatusBarEmptyWidthKey, 0); + this.mStatusBarLayout = AppStorage.SetAndLink(STATUS_BAR_LAYOUT_KEY, this.mStatusBarLayout).get(); + this.mStatusBarEmptyWidth = AppStorage.SetAndLink(STATUS_BAR_EMPTY_WIDTH_KEY, 0); let defaultBackgroundDatas: StatusBarBackgroundData[] = []; defaultBackgroundDatas.push(new StatusBarBackgroundData()); @@ -69,7 +69,7 @@ export class StatusBarVM { StatusBarService.registerListener(this); } - install() { + install(): void { Log.showInfo(TAG, `install, useCount: ${this.mUseCount}`); if (!this.mUseCount) { TintStateManager.getInstance().registerListener('status', this); @@ -77,7 +77,7 @@ export class StatusBarVM { this.mUseCount++; } - uninstall() { + uninstall(): void { Log.showInfo(TAG, `uninstall, useCount: ${this.mUseCount}`); this.mUseCount--; if (this.mUseCount) { @@ -85,7 +85,7 @@ export class StatusBarVM { } } - initViewModel(config, moduleName) { + initViewModel(config: StatusBarConfig, moduleName: string): void { if (this.mIsStart) { return; } @@ -129,15 +129,7 @@ export class StatusBarVM { if (itemData.actionData.pluginData && itemData.actionData.pluginData.data) { data = JSON.parse(JSON.stringify(itemData.actionData.pluginData.data)); if (Object.keys(data).length > 0) { - if (!data['fontSize']) { - data['fontSize'] = (StyleConfigurationCommon.getCommonStyle() as any).statusBarFontSize; - } - if (!data['fontColor']) { - if (!this.mComponentAreaMap.get(id)) { - this.changeComponentContent(id, { left: 0, top: 0, width: 0, height: 0 }); - } - data['fontColor'] = this.getPluginTintContentInfo(id).contentColor; - } + this.setPluginDataFontColorSize(id, data); } } let pluginData = this.getPluginData(id); @@ -162,7 +154,19 @@ export class StatusBarVM { return AppStorage.Get(storageKey); } - onTintStateChange(tintState: TintState) { + setPluginDataFontColorSize(id: string, data): void { + if (!data['fontSize']) { + data['fontSize'] = StyleConfigurationCommon.getCommonStyle().statusBarFontSize; + } + if (!data['fontColor']) { + if (!this.mComponentAreaMap.get(id)) { + this.changeComponentContent(id, { left: 0, top: 0, width: 0, height: 0 }); + } + data['fontColor'] = this.getPluginTintContentInfo(id).contentColor; + } + } + + onTintStateChange(tintState: TintState): void { Log.showInfo(TAG, `onTintStateChange, tintState: ${JSON.stringify(tintState)}`); if (typeof (tintState.isEnable) == 'boolean') { this.setStatusBarEnable(tintState.isEnable); @@ -175,13 +179,17 @@ export class StatusBarVM { } } - setStatusBarEnable(isEnable: boolean) { + setStatusBarEnable(isEnable: boolean): void { Log.showInfo(TAG, `setStatusBarEnable, isEnable ${isEnable}`); if (this.mStatusBarEnable == isEnable) { return; } this.mStatusBarEnable = isEnable; - this.mStatusBarEnable ? WindowManager.showWindow(WindowType.STATUS_BAR) : WindowManager.hideWindow(WindowType.STATUS_BAR); + this.mStatusBarEnable ? WindowManager.showWindow(WindowType.STATUS_BAR).then(() => { + }).catch((err) => { + }) : WindowManager.hideWindow(WindowType.STATUS_BAR).then(() => { + }).catch((err) => { + }); } changeBackground(tintState: TintState): void{ @@ -352,4 +360,4 @@ export class StatusBarVM { let sStatusBarVM = createOrGet(StatusBarVM, TAG); -export default sStatusBarVM as StatusBarVM; \ No newline at end of file +export default sStatusBarVM; \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts index 227a40b8..b0e38dc5 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/Constants.ts @@ -14,19 +14,21 @@ */ export default class Constants { - static DEFAULT_MAX_VOLUME = 15; - static DEFAULT_MIN_VOLUME = 0; - static DEFAULT_MUTE_STATUS = false; - static DEFAULT_SHOW_STATUS = true; - static HOLD_SHOW = false; - static HOLD_TIME = 2000; + static readonly DEFAULT_MAX_VOLUME = 15; + static readonly DEFAULT_MIN_VOLUME = 0; + static readonly DEFAULT_MUTE_STATUS = false; + static readonly DEFAULT_SHOW_STATUS = true; + static readonly HOLD_SHOW = false; + static readonly HOLD_TIME = 2000; + static readonly VOLUME_PANEL_DIVIDER_HEIGHT = 1; } export enum AudioVolumeType { VOICE_CALL = 0, RINGTONE = 2, MEDIA = 3, - VOICE_ASSISTANT = 9 + VOICE_ASSISTANT = 9, + ALL = 100, } export interface VolumeInfo { diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 161e531d..66a202ec 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -14,37 +14,38 @@ */ import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; -import Constants from './Constants' +import Constants from './Constants'; const TAG = 'volumepanel-StyleConfiguration'; +export class VolumePanelComponentStyle { + volumePanelSliderMarginTop: Length = $r('app.float.volume_panel_component_slider_margin_top'); + volumePanSliderWidth: Length = $r('app.float.volume_panel_component_slider_width'); + volumePanSliderHeight: Length = $r('app.float.volume_panel_component_slider_height'); + volumePanelSliderMarginBottom: Length = $r('app.float.volume_panel_component_slider_margin_bottom'); + volumePanelMutBtnIconSize: Length = $r('app.float.volume_panel_component_mute_btn_icon_size'); + volumePanelMutBtnIconMarginBottom: Length = $r('app.float.volume_panel_component_mute_btn_icon_margin_bottom'); + volumePanelMuteBtnHeight: Length = $r('app.float.volume_panel_component_mute_btn_height'); + volumePanelSettingIconSize: Length = $r('app.float.volume_panel_component_setting_icon_size'); + volumePanelBackground: ResourceColor = $r('app.color.panel_background'); + volumePanelSliderBlockColor: ResourceColor = $r('app.color.volume_slider_block_color'); + volumePanelDividerHeight: number | string = Constants.VOLUME_PANEL_DIVIDER_HEIGHT; + volumePanelBorderRadius: Length = $r('app.float.volume_panel_border_radius'); + volumeDividerWidth: Length = $r('app.float.volume_divider_width'); + volumeSliderTrackColor: ResourceColor = $r('app.color.volume_slider_track_color'); + volumeSelectedColor: ResourceColor = $r('app.color.volume_slider_selected_color'); + volumeButtonBackgroundColor: ResourceColor = $r('app.color.volume_button_background_color'); + volumePanelRingModeColor: ResourceColor = $r('app.color.volume_ring_mode_color'); + volumePanelDividerColor: ResourceColor = $r('app.color.volume_divider_color'); + volumePanelSettingColor: ResourceColor = $r('sys.color.ohos_id_color_secondary'); + volumePanelSettingButtonSize: Length = $r('app.float.volume_panel_component_setting_btn_icon_size'); +} + export default class StyleConfiguration { - static getVolumePanelComponentStyle() { - const key: string = TAG + "-VolumePanelComponent"; + static getVolumePanelComponentStyle(): VolumePanelComponentStyle { + const key: string = TAG + '-VolumePanelComponent'; return StyleManager.getStyle(key, () => { - return { - volumePanelSliderMarginTop: $r('app.float.volume_panel_component_slider_margin_top'), - volumePanSliderWidth: $r('app.float.volume_panel_component_slider_width'), - volumePanSliderHeight: $r('app.float.volume_panel_component_slider_height'), - volumePanelSliderMarginBottom: $r('app.float.volume_panel_component_slider_margin_bottom'), - volumePanelMutBtnIconSize: $r('app.float.volume_panel_component_mute_btn_icon_size'), - volumePanelMutBtnIconMarginBottom: $r('app.float.volume_panel_component_mute_btn_icon_margin_bottom'), - volumePanelMuteBtnHeight: $r('app.float.volume_panel_component_mute_btn_height'), - volumePanelSettingIconSize: $r('app.float.volume_panel_component_setting_icon_size'), - volumePanelBackground: $r('app.color.panel_background'), - volumePanelSliderBlockColor: $r('app.color.volume_slider_block_color'), - volumePanelDividerHeight: $r('app.float.volume_panel_divider_height'), - volumePanelBorderRadius: $r('app.float.volume_panel_border_radius'), - volumeDividerWidth: $r('app.float.volume_divider_width'), - volumeSliderTrackColor: $r('app.color.volume_slider_track_color'), - volumeSelectedColor: $r('app.color.volume_slider_selected_color'), - volumeButtonBackgroundColor: $r('app.color.volume_button_background_color'), - volumePanelRingModeColor: $r('app.color.volume_ring_mode_color'), - volumePanelDividerColor:$r('app.color.volume_divider_color'), - volumePanelSettingColor: $r('sys.color.ohos_id_color_secondary'), - volumePanelSettingButtonSize: $r('app.float.volume_panel_component_setting_btn_icon_size') - - }; + return new VolumePanelComponentStyle(); }); } } \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts index ed6d88cd..4e7ddc06 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController.ts @@ -16,11 +16,11 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import getSingleInstance from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; import VolumePanelService from '../model/VolumePanelService'; -import {VolumeInfo} from '../common/Constants'; +import { VolumeInfo } from '../common/Constants'; -const TAG = 'VolumeWindowController' -const SINGLE_STANCE_KEY = 'VolumeWindowController' -const INTERVAL = 3 * 1000 +const TAG = 'VolumeWindowController'; +const SINGLE_STANCE_KEY = 'VolumeWindowController'; +const INTERVAL = 3 * 1000; export default class VolumeWindowController { mWindowHandle: any; @@ -29,25 +29,25 @@ export default class VolumeWindowController { mIsWindowShown: boolean; static getInstance(): VolumeWindowController{ - return getSingleInstance(VolumeWindowController, SINGLE_STANCE_KEY) + return getSingleInstance(VolumeWindowController, SINGLE_STANCE_KEY); } constructor() { VolumePanelService.startService(); VolumePanelService.registerListener(this); - Log.showInfo(TAG, `constructor done.`); + Log.showInfo(TAG, 'constructor done.'); } - setInterval(interval) { + setInterval(interval: number): void { this.mInterval = interval; } - setWindowHandle(windowHandle) { - Log.showInfo(TAG, `setWindowHandle windowHandle:${windowHandle}`); + setWindowHandle(windowHandle): void { + Log.showInfo(TAG, `setWindowHandle windowHandle:${windowHandle}`); this.mWindowHandle = windowHandle; } - updateVolumeInfo(volumeInfo: VolumeInfo) { + updateVolumeInfo(volumeInfo: VolumeInfo): void { Log.showDebug(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} `); if (volumeInfo && !volumeInfo.updateUi && !this.mIsWindowShown) { return; @@ -55,14 +55,14 @@ export default class VolumeWindowController { this.setWindowState(true); this.mLastActionTime = (new Date()).getTime(); setTimeout(() => { - Log.showInfo(TAG, `check need hide window or not.`); + Log.showInfo(TAG, 'check need hide window or not.'); if ((new Date()).getTime() - this.mLastActionTime >= this.mInterval) { this.setWindowState(false); } }, this.mInterval); } - setWindowState(isShow: boolean) { + setWindowState(isShow: boolean): void { Log.showInfo(TAG, `setWindowState ${isShow}.`); if (this.mIsWindowShown == isShow) { Log.showInfo(TAG, `Neen't set volueme window state.`); diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts index a599d894..5e7abb9a 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/model/VolumePanelService.ts @@ -14,13 +14,24 @@ */ import audio from '@ohos.multimedia.audio'; +import { BusinessError } from 'basic'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import getSingleInstance, {getAudioManager} -from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; -import {AudioVolumeType, VolumeInfo} from '../common/Constants'; +import getSingleInstance, { getAudioManager +} from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import { AudioVolumeType, VolumeInfo } from '../common/Constants'; const TAG = 'VolumePanelModel'; -type VolumeListener = { updateVolumeInfo: Function } + +export interface VolumeListener { + updateVolumeInfo(status: VolumeInfo): void; +} + +export interface VolumeCallQueueItemData { + interfaceName: InterfaceName, + params: boolean | number[], + + callbackFunction(err: BusinessError, data?: boolean | number): void; +} enum InterfaceName { isMute, @@ -30,47 +41,47 @@ enum InterfaceName { } export class VolumePanelService { - mIsStart: boolean = false; + mIsStart = false; mListeners = new Set(); mAudioManager = getAudioManager(); - mInterfaceCallQueue = []; + mInterfaceCallQueue: VolumeCallQueueItemData[] = [] ; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showInfo(TAG, 'constructor'); } - startService() { + startService(): void { if (this.mIsStart) { return; } this.mIsStart = true; - Log.showInfo(TAG, `startService`); + Log.showInfo(TAG, 'startService'); this.mAudioManager.on('volumeChange', this.onVolumeChange.bind(this)); } - stopService() { + stopService(): void { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `stopService`); + Log.showInfo(TAG, 'stopService'); this.mIsStart = false; } - registerListener(listener: VolumeListener) { + registerListener(listener: VolumeListener): void { let res = this.mListeners.add(listener); Log.showInfo(TAG, `registser VolumeListener ${res}`); } - unregisterListener(listener: VolumeListener) { + unregisterListener(listener: VolumeListener): void { let res = this.mListeners.delete(listener); Log.showInfo(TAG, `unregistser VolumeListener ${res}`); } - async onVolumeChange(data) { - Log.showInfo(TAG, `onVolumeChange`); + async onVolumeChange(data): Promise { + Log.showInfo(TAG, 'onVolumeChange'); let volumeType = this.formatAudioVolumeTypeFromInterface(data.volumeType); - this.isMute(volumeType, (volumeType2, data2) => { - Log.showInfo(TAG, `onVolumeChange->isMute, volumeType2: ${volumeType2} data2: ${data2}`); + this.isMute(volumeType, (volumeType2: AudioVolumeType, data2: boolean) => { + Log.showInfo(TAG, `onVolumeChange->isMute, volumeType2: ${volumeType2} data2: ${String(data2)}`); let volumeInfo: VolumeInfo = { volumeType: volumeType, volume: data.volume, @@ -81,13 +92,13 @@ export class VolumePanelService { }); } - isMute(volumeType: AudioVolumeType, callback: Function) { + isMute(volumeType: AudioVolumeType, callback: (volumeType: AudioVolumeType, data: boolean) => void): void { Log.showInfo(TAG, `isMute, volumeType: ${volumeType}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); this.addInterfaceCallQueue({ interfaceName: InterfaceName.isMute, params: [interfaceVolumeType], - callbackFunction: (err, data) => { + callbackFunction: (err, data: boolean) => { Log.showInfo(TAG, `isMute, err: ${err} data: ${JSON.stringify(data)}`); if (err) { return; @@ -97,11 +108,11 @@ export class VolumePanelService { }); } - getVolumeInfo(volumeType: AudioVolumeType, callback?: (volumeInfo: VolumeInfo) => void) { + getVolumeInfo(volumeType: AudioVolumeType, callback?: (volumeInfo: VolumeInfo) => void): void { Log.showInfo(TAG, `getVolumeInfo, volumeType: ${volumeType}`); - this.getVolume(volumeType, (volumeType, data) => { + this.getVolume(volumeType, (volumeType: AudioVolumeType, data: number) => { Log.showInfo(TAG, `getVolumeInfo->getVolume`); - this.isMute(volumeType, (volumeType2, data2) => { + this.isMute(volumeType, (volumeType2: AudioVolumeType, data2: boolean) => { Log.showInfo(TAG, `getVolumeInfo->isMute`); let volumeInfo: VolumeInfo = { volumeType: volumeType, @@ -117,10 +128,10 @@ export class VolumePanelService { }); } - isActive(volumeType: AudioVolumeType, callback: Function) { + isActive(volumeType: AudioVolumeType, callback: (volumeType: AudioVolumeType, data: boolean) => void): void { Log.showInfo(TAG, `isActive, volumeType: ${volumeType}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); - this.mAudioManager.isActive(interfaceVolumeType, (err, data) => { + this.mAudioManager.isActive(interfaceVolumeType, (err: BusinessError, data: boolean) => { Log.showInfo(TAG, `isActive, err: ${err} data: ${JSON.stringify(data)}`); if (err) { return; @@ -129,14 +140,14 @@ export class VolumePanelService { }); } - getVolume(volumeType: AudioVolumeType, callback: Function) { + getVolume(volumeType: AudioVolumeType, callback: (volumeType: AudioVolumeType, data: number) => void): void { Log.showInfo(TAG, `getVolume, volumeType: ${volumeType}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); this.addInterfaceCallQueue({ interfaceName: InterfaceName.getVolume, params: [interfaceVolumeType], - callbackFunction: (err, data) => { - Log.showInfo(TAG, `getVolume, err: ${err} data: ${JSON.stringify(data)}`); + callbackFunction: (err: BusinessError, data: number) => { + Log.showInfo(TAG, `getVolume, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); if (err) { return; } @@ -145,11 +156,11 @@ export class VolumePanelService { }); } - getMaxVolume(volumeType: AudioVolumeType, callback: Function) { + getMaxVolume(volumeType: AudioVolumeType, callback: (volumeType: AudioVolumeType, data: number) => void): void { Log.showInfo(TAG, `getMaxVolume, volumeType: ${volumeType}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); - this.mAudioManager.getMaxVolume(interfaceVolumeType, (err, data) => { - Log.showInfo(TAG, `getMaxVolume, err: ${err} data: ${JSON.stringify(data)}`); + this.mAudioManager.getMaxVolume(interfaceVolumeType, (err: BusinessError, data: number) => { + Log.showInfo(TAG, `getMaxVolume, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); if (err) { return; } @@ -157,11 +168,11 @@ export class VolumePanelService { }); } - getMinVolume(volumeType: AudioVolumeType, callback: Function) { + getMinVolume(volumeType: AudioVolumeType, callback: (volumeType: AudioVolumeType, data: number) => void): void { Log.showInfo(TAG, `getMinVolume, volumeType: ${volumeType}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); - this.mAudioManager.getMinVolume(interfaceVolumeType, (err, data) => { - Log.showInfo(TAG, `getMinVolume, err: ${err} data: ${JSON.stringify(data)}`); + this.mAudioManager.getMinVolume(interfaceVolumeType, (err: BusinessError, data: number) => { + Log.showInfo(TAG, `getMinVolume, err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); if (err) { return; } @@ -169,7 +180,7 @@ export class VolumePanelService { }); } - setVolumeAndMute(volumeType: AudioVolumeType, volume: number, mute: boolean, callback?: () => void) { + setVolumeAndMute(volumeType: AudioVolumeType, volume: number, mute: boolean, callback?: () => void): void { Log.showInfo(TAG, `setVolumeAndMute, volumeType: ${volumeType} volume: ${volume} mute: ${mute}`); if (volume !== undefined && mute !== undefined) { this.setVolume(volumeType, volume, () => { @@ -183,13 +194,13 @@ export class VolumePanelService { } } - setVolume(volumeType: AudioVolumeType, volume: number, callback?: () => void) { + setVolume(volumeType: AudioVolumeType, volume: number, callback?: () => void): void { Log.showInfo(TAG, `setVolume, volumeType: ${volumeType} volume: ${volume}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); this.addInterfaceCallQueue({ interfaceName: InterfaceName.setVolume, params: [interfaceVolumeType, volume], - callbackFunction: (err) => { + callbackFunction: (err: BusinessError) => { Log.showInfo(TAG, `setVolume, callback err: ${err} `); if (err) { return; @@ -201,14 +212,14 @@ export class VolumePanelService { }); } - setMute(volumeType: AudioVolumeType, mute: boolean, callback?: () => void) { + setMute(volumeType: AudioVolumeType, mute: boolean, callback?: () => void): void { Log.showInfo(TAG, `setMute, volumeType: ${volumeType} mute: ${mute}`); let interfaceVolumeType = this.formatAudioVolumeTypeToInterface(volumeType); this.addInterfaceCallQueue({ interfaceName: InterfaceName.mute, params: [interfaceVolumeType, mute], - callbackFunction: (err) => { - Log.showInfo(TAG, `setMute, err: ${err}`); + callbackFunction: (err: BusinessError) => { + Log.showInfo(TAG, `setMute, err: ${JSON.stringify(err)}`); if (err) { return; } @@ -222,8 +233,8 @@ export class VolumePanelService { }); } - formatAudioVolumeTypeFromInterface(audioVolumeType) { - let formatValue; + formatAudioVolumeTypeFromInterface(audioVolumeType): AudioVolumeType { + let formatValue: AudioVolumeType; if (audioVolumeType == audio.AudioVolumeType.VOICE_CALL) { formatValue = AudioVolumeType.VOICE_CALL; } else if (audioVolumeType == audio.AudioVolumeType.RINGTONE) { @@ -236,7 +247,7 @@ export class VolumePanelService { return formatValue; } - formatAudioVolumeTypeToInterface(audioVolumeType) { + formatAudioVolumeTypeToInterface(audioVolumeType: AudioVolumeType) { let formatValue; if (audioVolumeType == AudioVolumeType.VOICE_CALL) { formatValue = audio.AudioVolumeType.VOICE_CALL; @@ -250,11 +261,7 @@ export class VolumePanelService { return formatValue; } - addInterfaceCallQueue(data: { - interfaceName: InterfaceName, - params: any[], - callbackFunction: Function - }) { + addInterfaceCallQueue(data: VolumeCallQueueItemData): void { Log.showDebug(TAG, `addInterfaceCallQueue, interfaceName: ${data.interfaceName} params: ${JSON.stringify(data.params)}`); this.mInterfaceCallQueue.push(data); if (this.mInterfaceCallQueue.length == 1) { @@ -262,37 +269,45 @@ export class VolumePanelService { } } - execInterfaceCallQueueFirst() { + execInterfaceCallQueueFirst(): void { Log.showInfo(TAG, `execInterfaceCallQueueFirst, ${this.mInterfaceCallQueue.length}`); let queueData = this.mInterfaceCallQueue[0]; if (queueData.interfaceName == InterfaceName.isMute) { - this.mAudioManager.isMute(queueData.params[0], (err, data) => { - Log.showInfo(TAG, `execInterfaceCallQueueFirst, isMute callback`); - this.execInterfaceCallQueueNext(); + this.mAudioManager.isMute(queueData.params[0], (err: BusinessError, data: boolean) => { + Log.showInfo(TAG, 'execInterfaceCallQueueFirst, isMute callback'); + this.execInterfaceCallQueueNext().then(() => { + }).catch((e) => { + }); queueData.callbackFunction(err, data); }); } else if (queueData.interfaceName == InterfaceName.mute) { - this.mAudioManager.mute(queueData.params[0], queueData.params[1], (err) => { - Log.showInfo(TAG, `execInterfaceCallQueueFirst, mute callback`); - this.execInterfaceCallQueueNext(); + this.mAudioManager.mute(queueData.params[0], queueData.params[1], (err: BusinessError) => { + Log.showInfo(TAG, 'execInterfaceCallQueueFirst, mute callback'); + this.execInterfaceCallQueueNext().then(() => { + }).catch((e) => { + }); queueData.callbackFunction(err); }); } else if (queueData.interfaceName == InterfaceName.getVolume) { - this.mAudioManager.getVolume(queueData.params[0], (err, data) => { - Log.showInfo(TAG, `execInterfaceCallQueueFirst, getVolume callback`); - this.execInterfaceCallQueueNext(); + this.mAudioManager.getVolume(queueData.params[0], (err: BusinessError, data: number) => { + Log.showInfo(TAG, 'execInterfaceCallQueueFirst, getVolume callback'); + this.execInterfaceCallQueueNext().then(() => { + }).catch((e) => { + }); queueData.callbackFunction(err, data); }); } else if (queueData.interfaceName == InterfaceName.setVolume) { - this.mAudioManager.setVolume(queueData.params[0], queueData.params[1], (err) => { - Log.showInfo(TAG, `execInterfaceCallQueueFirst, setVolume callback`); - this.execInterfaceCallQueueNext(); + this.mAudioManager.setVolume(queueData.params[0], queueData.params[1], (err: BusinessError) => { + Log.showInfo(TAG, 'execInterfaceCallQueueFirst, setVolume callback'); + this.execInterfaceCallQueueNext().then(() => { + }).catch((e) => { + }); queueData.callbackFunction(err); }); } } - async execInterfaceCallQueueNext() { + async execInterfaceCallQueueNext(): Promise { Log.showInfo(TAG, `execInterfaceCallQueueNext, ${this.mInterfaceCallQueue.length}`); this.mInterfaceCallQueue.splice(0, 1); if (this.mInterfaceCallQueue.length > 0) { @@ -303,4 +318,4 @@ export class VolumePanelService { let volumePanelService = getSingleInstance(VolumePanelService, TAG); -export default volumePanelService as VolumePanelService; \ No newline at end of file +export default volumePanelService; \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets index 8c04181e..9eff89fe 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets @@ -15,7 +15,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log' import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import StyleConfiguration from '../common/StyleConfiguration' +import StyleConfiguration, { VolumePanelComponentStyle } from '../common/StyleConfiguration' import Constants from '../common/Constants' import ViewModel from '../viewmodel/VolumePanelVM' import VolumeWindowController from '../common/VolumeWindowController' @@ -28,7 +28,7 @@ export default struct VolumePanelComponent { @StorageLink('VolumePanelMinVolume') VolumePanelMinVolume: number = Constants.DEFAULT_MIN_VOLUME @StorageLink('VolumePanelVolumeValue') VolumePanelVolumeValue: number = Constants.DEFAULT_MIN_VOLUME @StorageLink('VolumePanelIsMute') VolumePanelIsMute: boolean = Constants.DEFAULT_MUTE_STATUS - @State style: any = StyleConfiguration.getVolumePanelComponentStyle() + @State style: VolumePanelComponentStyle = StyleConfiguration.getVolumePanelComponentStyle() aboutToAppear() { Log.showInfo(TAG, 'aboutToAppear'); diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts index f8f28237..46548b64 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts @@ -14,27 +14,27 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; -import Constants from '../common/Constants' +import Constants from '../common/Constants'; import { AudioVolumeType, VolumeInfo } from '../common/Constants'; import VolumePanelService from '../model/VolumePanelService'; import VolumeWindowController from '../common/VolumeWindowController'; -export const VolumePanelMaxVolumeKey = "VolumePanelMaxVolume"; +export const VOLUME_PANEL_MAX_VOLUME_KEY = 'VolumePanelMaxVolume'; -export const VolumePanelMinVolumeKey = "VolumePanelMinVolume"; +export const VOLUME_PANEL_MIN_VOLUME_KEY = 'VolumePanelMinVolume'; -export const VolumePanelVolumeValueKey = "VolumePanelVolumeValue"; +export const VOLUME_PANEL_VOLUME_VALUE_KEY = 'VolumePanelVolumeValue'; -export const VolumePanelIsMuteKey = "VolumePanelIsMute"; +export const VOLUME_PANEL_IS_MUTE_KEY = 'VolumePanelIsMute'; const TAG = 'VolumePanelVM'; export class VolumePanelVM { - mIsStart: boolean = false; - mMaxVolume: any; - mMinVolume: any; - mVolumeValue: any; - mIsMute: any; + mIsStart = false; + mMaxVolume: SubscribedAbstractProperty; + mMinVolume: SubscribedAbstractProperty; + mVolumeValue: SubscribedAbstractProperty; + mIsMute: SubscribedAbstractProperty; mAllVolumeTypes = [AudioVolumeType.VOICE_CALL, AudioVolumeType.RINGTONE, AudioVolumeType.MEDIA, AudioVolumeType.VOICE_ASSISTANT]; mVolumeBaseMap = {}; mCurrentAudioVolumeType: number = AudioVolumeType.MEDIA; @@ -43,20 +43,20 @@ export class VolumePanelVM { mVolumeBeforeMute: number; constructor() { - Log.showInfo(TAG, `constructor`); + Log.showInfo(TAG, 'constructor'); } - initViewModel() { + initViewModel(): void { if (this.mIsStart) { return; } - Log.showInfo(TAG, `initViewModel `); + Log.showInfo(TAG, 'initViewModel '); this.mIsStart = true; - this.mMaxVolume = AppStorage.SetAndLink(VolumePanelMaxVolumeKey, Constants.DEFAULT_MAX_VOLUME); - this.mMinVolume = AppStorage.SetAndLink(VolumePanelMinVolumeKey, Constants.DEFAULT_MIN_VOLUME); - this.mVolumeValue = AppStorage.SetAndLink(VolumePanelVolumeValueKey, Constants.DEFAULT_MIN_VOLUME); - this.mIsMute = AppStorage.SetAndLink(VolumePanelIsMuteKey, Constants.DEFAULT_MUTE_STATUS); + this.mMaxVolume = AppStorage.SetAndLink(VOLUME_PANEL_MAX_VOLUME_KEY, Constants.DEFAULT_MAX_VOLUME); + this.mMinVolume = AppStorage.SetAndLink(VOLUME_PANEL_MIN_VOLUME_KEY, Constants.DEFAULT_MIN_VOLUME); + this.mVolumeValue = AppStorage.SetAndLink(VOLUME_PANEL_VOLUME_VALUE_KEY, Constants.DEFAULT_MIN_VOLUME); + this.mIsMute = AppStorage.SetAndLink(VOLUME_PANEL_IS_MUTE_KEY, Constants.DEFAULT_MUTE_STATUS); this.mAllVolumeTypes.forEach((volumeType: AudioVolumeType) => { this.mVolumeBaseMap[volumeType] = { maxVolume: Constants.DEFAULT_MAX_VOLUME, @@ -66,13 +66,13 @@ export class VolumePanelVM { VolumePanelService.startService(); VolumePanelService.registerListener(this); this.mAllVolumeTypes.forEach((volumeType: AudioVolumeType) => { - VolumePanelService.getMaxVolume(volumeType, (volumeType, value) => this.updateMaxVolume(volumeType, value)); - VolumePanelService.getMinVolume(volumeType, (volumeType, value) => this.updateMinVolume(volumeType, value)); + VolumePanelService.getMaxVolume(volumeType, (volumeType: AudioVolumeType, value: number) => this.updateMaxVolume(volumeType, value)); + VolumePanelService.getMinVolume(volumeType, (volumeType: AudioVolumeType, value: number) => this.updateMinVolume(volumeType, value)); }); this.getInitVolumeInfo(); } - getInitVolumeInfo() { + getInitVolumeInfo(): void { this.getActiveVolumeType(JSON.parse(JSON.stringify(this.mAllVolumeTypes)), (activeVolumeType: AudioVolumeType) => { Log.showInfo(TAG, `getInitVolumeInfo, activeVolumeType: ${activeVolumeType}`); if (activeVolumeType == undefined) { @@ -83,7 +83,7 @@ export class VolumePanelVM { }); } - getActiveVolumeType(volumeTypes: number[], callback: Function) { + getActiveVolumeType(volumeTypes: number[], callback: (volumeType: AudioVolumeType) => void): void { Log.showInfo(TAG, `getActiveVolumeType, volumeTypes: ${JSON.stringify(volumeTypes)}`); if (volumeTypes.length == 0) { callback(undefined); @@ -100,26 +100,26 @@ export class VolumePanelVM { }); } - updateMaxVolume(volumeType: AudioVolumeType, value: number) { + updateMaxVolume(volumeType: AudioVolumeType, value: number): void { Log.showInfo(TAG, `updateMaxVolume, volumeType: ${volumeType} value: ${value}`); this.mVolumeBaseMap[volumeType].maxVolume = value; Log.showInfo(TAG, `updateMaxVolume, mVolumeBaseMap: ${JSON.stringify(this.mVolumeBaseMap)}`); } - updateMinVolume(volumeType: AudioVolumeType, value: number) { + updateMinVolume(volumeType: AudioVolumeType, value: number): void { Log.showInfo(TAG, `updateMinVolume, volumeType: ${volumeType} value: ${value}`); this.mVolumeBaseMap[volumeType].minVolume = value; Log.showInfo(TAG, `updateMinVolume, mVolumeBaseMap: ${JSON.stringify(this.mVolumeBaseMap)}`); } - updateVolumeInfo(volumeInfo: VolumeInfo) { + updateVolumeInfo(volumeInfo: VolumeInfo): void { Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} , mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType}`); if (!volumeInfo.updateUi && volumeInfo.volumeType != this.mCurrentAudioVolumeType) { return; } let volumeType = volumeInfo.volumeType; - let maxVolume = this.mVolumeBaseMap[volumeType].maxVolume; - let minVolume = this.mVolumeBaseMap[volumeType].minVolume; + let maxVolume: number = this.mVolumeBaseMap[volumeType].maxVolume; + let minVolume: number = this.mVolumeBaseMap[volumeType].minVolume; this.mMaxVolume.set(maxVolume); this.mMinVolume.set(minVolume); Log.showInfo(TAG, `updateVolumeInfo, mMaxVolume: ${this.mMaxVolume.get()} , mMinVolume: ${this.mMinVolume.get()}`); @@ -148,7 +148,7 @@ export class VolumePanelVM { return volume; } - setVolume(displayVolume: number) { + setVolume(displayVolume: number): void { Log.showInfo(TAG, `setVolume, displayVolume: ${displayVolume} `); let volume: number = this.calcVolumeByDisplayVolume(displayVolume); if (this.mUpdatingAudioVolume != undefined && volume == this.mUpdatingAudioVolume) { @@ -163,10 +163,10 @@ export class VolumePanelVM { VolumeWindowController.getInstance().updateVolumeInfo(null); } - mute() { + mute(): void { Log.showInfo(TAG, `mute, isMute: ${this.mIsMute.get()} mCurrentAudioVolume: ${this.mCurrentAudioVolume}`); this.mUpdatingAudioVolume = undefined; - let isMute = this.mIsMute.get(); + let isMute: boolean = this.mIsMute.get(); isMute = !isMute; let maxVolume: number = this.mMaxVolume.get(); let minVolume: number = this.mMinVolume.get(); @@ -174,7 +174,7 @@ export class VolumePanelVM { let currentAudioVolume = this.mCurrentAudioVolume; let volumeType = this.mCurrentAudioVolumeType; VolumePanelService.setVolumeAndMute(volumeType, volume, isMute, () => { - Log.showInfo(TAG, `mute, setVolumeAndMute callback`); + Log.showInfo(TAG, 'mute, setVolumeAndMute callback'); if (volumeType == this.mCurrentAudioVolumeType && this.mIsMute.get()) { this.mVolumeBeforeMute = currentAudioVolume; } @@ -185,4 +185,4 @@ export class VolumePanelVM { let volumePanelVM = new VolumePanelVM(); -export default volumePanelVM as VolumePanelVM; \ No newline at end of file +export default volumePanelVM; \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/resources/base/element/float.json b/features/volumepanelcomponent/src/main/resources/base/element/float.json index 08acc113..bc1d1d06 100644 --- a/features/volumepanelcomponent/src/main/resources/base/element/float.json +++ b/features/volumepanelcomponent/src/main/resources/base/element/float.json @@ -36,10 +36,6 @@ "name": "volume_panel_component_setting_icon_size", "value": "48vp" }, - { - "name": "volume_panel_divider_height", - "value": "1vp" - }, { "name": "volume_divider_width", "value": "68vp" diff --git a/features/volumepanelcomponent/src/main/resources/phone/element/float.json b/features/volumepanelcomponent/src/main/resources/phone/element/float.json index cf9eafcc..55d89148 100644 --- a/features/volumepanelcomponent/src/main/resources/phone/element/float.json +++ b/features/volumepanelcomponent/src/main/resources/phone/element/float.json @@ -39,10 +39,6 @@ "name": "volume_panel_component_setting_icon_size", "value": "24vp" }, - { - "name": "volume_panel_divider_height", - "value": "1vp" - }, { "name": "volume_divider_width", "value": "32vp" diff --git a/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts index 36077c61..42935dc8 100644 --- a/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,19 +13,20 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' -import Constants from './Constants' +import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; const TAG = 'wifi-StyleConfiguration'; +export class StartsBarWifiComponentStyle { + statusBarWifiWidth: Length = $r('app.float.status_bar_wifi_width'); + statusBarWifiHeight: Length = $r('app.float.status_bar_wifi_height'); +} + export default class StyleConfiguration { - static getStartsBarWifiComponentStyle() { - const key: string = TAG + "-startsBarWifi"; + static getStartsBarWifiComponentStyle(): StartsBarWifiComponentStyle { + const key: string = TAG + '-startsBarWifi'; return StyleManager.getStyle(key, () => { - return { - statusBarWifiWidth: $r('app.float.status_bar_wifi_width'), - statusBarWifiHeight: $r('app.float.status_bar_wifi_height') - }; + return new StartsBarWifiComponentStyle(); }); } } \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/common/constants.ts b/features/wificomponent/src/main/ets/default/common/constants.ts index 4a3bc786..902c0eb8 100644 --- a/features/wificomponent/src/main/ets/default/common/constants.ts +++ b/features/wificomponent/src/main/ets/default/common/constants.ts @@ -13,16 +13,16 @@ * limitations under the License. */ -export default class constants { - static DEFAULT_WIFI_OPEN_STATUS: boolean = false; - static DEFAULT_WIFI_NAME: string = 'WLAN'; - static DEFAULT_WIFI_INFO: number = 0; - static DEFAULT_WIFI_STATUS: boolean = false; - static WIFI_SIGNAL_NO: number = 0; - static WIFI_SIGNAL_LOW: number = 1; - static WIFI_SIGNAL_MID: number = 2; - static WIFI_SIGNAL_HIGH: number = 3; - static WIFI_SIGNAL_FULL: number = 4; +export default class Constants { + static readonly DEFAULT_WIFI_OPEN_STATUS: boolean = false; + static readonly DEFAULT_WIFI_NAME: string = 'WLAN'; + static readonly DEFAULT_WIFI_INFO: number = 0; + static readonly DEFAULT_WIFI_STATUS: boolean = false; + static readonly WIFI_SIGNAL_NO: number = 0; + static readonly WIFI_SIGNAL_LOW: number = 1; + static readonly WIFI_SIGNAL_MID: number = 2; + static readonly WIFI_SIGNAL_HIGH: number = 3; + static readonly WIFI_SIGNAL_FULL: number = 4; } export enum WifiState { diff --git a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets index 39f5bea3..d69e79e7 100644 --- a/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets +++ b/features/wificomponent/src/main/ets/default/pages/wifiIcon.ets @@ -16,9 +16,10 @@ import Constants from '../common/constants' import mWifiModel from '../WifiModel' import Log from '../../../../../../../common/src/main/ets/default/Log' -import {TintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager' -import StyleConfigurationCommon from '../../../../../../../common/src/main/ets/default/StyleConfiguration' -import StyleConfiguration from '../common/StyleConfiguration' +import { TintContentInfo } from '../../../../../../../common/src/main/ets/default/TintStateManager' +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../common/src/main/ets/default/StyleConfiguration' +import StyleConfiguration, { StartsBarWifiComponentStyle } from '../common/StyleConfiguration' import ViewModel from '../viewmodel/WifiVM' const TAG = 'WifiComponent-WifiIcon' @@ -28,8 +29,8 @@ export default struct WifiIcon { @StorageLink('wifiInfo') wifiInfo: number = Constants.DEFAULT_WIFI_INFO @StorageLink('wifiStatus') wifiStatus: boolean = Constants.DEFAULT_WIFI_STATUS @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo() - @State styleCommon: any = StyleConfigurationCommon.getCommonStyle() - @State style: any = StyleConfiguration.getStartsBarWifiComponentStyle() + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle() + @State style: StartsBarWifiComponentStyle = StyleConfiguration.getStartsBarWifiComponentStyle() aboutToAppear() { Log.showDebug(TAG, `aboutToAppear`); diff --git a/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts b/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts index a066eb52..afd4c372 100644 --- a/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts +++ b/features/wificomponent/src/main/ets/default/viewmodel/WifiVM.ts @@ -14,8 +14,9 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log'; -import {FASlotName} from '../../../../../../../common/src/main/ets/default/Constants'; -import {TintContentInfo, getOrCreateTintContentInfo} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import { FASlotName } from '../../../../../../../common/src/main/ets/default/Constants'; +import { TintContentInfo, getOrCreateTintContentInfo +} from '../../../../../../../common/src/main/ets/default/TintStateManager'; import createOrGet from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; const TAG = 'WifiVM'; @@ -24,7 +25,7 @@ export class WifiVM { mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.WIFI); constructor() { - Log.showInfo(TAG, `constructor`); + Log.showInfo(TAG, 'constructor'); } getTintContentInfo(): TintContentInfo { @@ -34,4 +35,4 @@ export class WifiVM { let sWifiVM = createOrGet(WifiVM, TAG); -export default sWifiVM as WifiVM; \ No newline at end of file +export default sWifiVM; \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/wifiModel.ts b/features/wificomponent/src/main/ets/default/wifiModel.ts index 30918b3c..310fd6e9 100644 --- a/features/wificomponent/src/main/ets/default/wifiModel.ts +++ b/features/wificomponent/src/main/ets/default/wifiModel.ts @@ -14,31 +14,31 @@ */ import wifi from '@ohos.wifi'; -import Constants, {WifiState, WifiConnectionState} from './common/constants' -import Log from "../../../../../../common/src/main/ets/default/Log"; +import Constants, { WifiState, WifiConnectionState } from './common/constants'; +import Log from '../../../../../../common/src/main/ets/default/Log'; const TAG = 'WifiComponent-WifiModel'; -var mWifiInfo; -var mWifiStatus; -var mWifiOpenStatus; -var mWifiName; +let mWifiInfo: SubscribedAbstractProperty; +let mWifiStatus: SubscribedAbstractProperty; +let mWifiOpenStatus: SubscribedAbstractProperty; +let mWifiName: SubscribedAbstractProperty; export class WifiModel { - mIsStart: boolean = false; + mIsStart = false; mListener= null; - initWifiModel() { + initWifiModel(): void { if (this.mIsStart) { return; } - Log.showInfo(TAG, `initWifiModel`); + Log.showInfo(TAG, 'initWifiModel'); this.mIsStart = true; - mWifiInfo = AppStorage.SetAndLink("wifiInfo", Constants.DEFAULT_WIFI_INFO); - mWifiStatus = AppStorage.SetAndLink("wifiStatus", Constants.DEFAULT_WIFI_STATUS); - mWifiName = AppStorage.SetAndLink("wifiName", Constants.DEFAULT_WIFI_NAME) - mWifiOpenStatus = AppStorage.SetAndLink("wifiOpenStatus", Constants.DEFAULT_WIFI_OPEN_STATUS); + mWifiInfo = AppStorage.SetAndLink('wifiInfo', Constants.DEFAULT_WIFI_INFO); + mWifiStatus = AppStorage.SetAndLink('wifiStatus', Constants.DEFAULT_WIFI_STATUS); + mWifiName = AppStorage.SetAndLink('wifiName', Constants.DEFAULT_WIFI_NAME); + mWifiOpenStatus = AppStorage.SetAndLink('wifiOpenStatus', Constants.DEFAULT_WIFI_OPEN_STATUS); this.getWifiInfo(); @@ -47,20 +47,20 @@ export class WifiModel { wifi.on('wifiRssiChange', this.onWifiRssiChange.bind(this)); } - uninitWifiModel() { + uninitWifiModel(): void { if (!this.mIsStart) { return; } - Log.showInfo(TAG, `uninitWifiModel`); + Log.showInfo(TAG, 'uninitWifiModel'); this.mIsStart = false; - this.mListener.off('wifiRssiChange', (data) => { + this.mListener.off('wifiRssiChange', (data: number) => { Log.showInfo(TAG, `uninitWifiModel->wifiRssiChange, data: ${JSON.stringify(data)}`); }); - this.mListener.off('wifiConnectionChange', (data) => { + this.mListener.off('wifiConnectionChange', (data: number) => { Log.showInfo(TAG, `uninitWifiModel->wifiConnectionChange, data: ${JSON.stringify(data)}`); }); - this.mListener.off('wifiStateChange', (data) => { + this.mListener.off('wifiStateChange', (data: number) => { Log.showInfo(TAG, `uninitWifiModel->wifiStateChange, data: ${JSON.stringify(data)}`); }); this.mListener = null; @@ -68,7 +68,7 @@ export class WifiModel { this.setDisconnectedStatus(); } - onWifiStateChange(data) { + onWifiStateChange(data: WifiState): void { Log.showInfo(TAG, `onWifiStateChange, data: ${JSON.stringify(data)}`); let isWifiInactive = data == WifiState.STATE_OFF; @@ -80,7 +80,7 @@ export class WifiModel { } } - onWifiConnectionChange(data) { + onWifiConnectionChange(data: WifiConnectionState): void { Log.showInfo(TAG, `onWifiConnectionChange, data: ${JSON.stringify(data)}`); if (data == WifiConnectionState.CONNECTED) { @@ -90,12 +90,12 @@ export class WifiModel { } } - onWifiRssiChange(data) { + onWifiRssiChange(data: number): void { Log.showInfo(TAG, `onWifiRssiChange, data: ${JSON.stringify(data)}`); this.getLinkedInfo(); } - getWifiInfo() { + getWifiInfo(): void { let isWifiActive = wifi.isWifiActive(); Log.showInfo(TAG, `getWifiInfo, isWifiActive: ${isWifiActive}`); mWifiOpenStatus.set(isWifiActive); @@ -106,7 +106,7 @@ export class WifiModel { } } - getWifiConnectInfo() { + getWifiConnectInfo(): void { let isConnected = wifi.isConnected(); Log.showInfo(TAG, `getWifiConnectInfo, isConnected: ${isConnected}`); if (isConnected) { @@ -117,8 +117,8 @@ export class WifiModel { } } - getLinkedInfo() { - Log.showInfo(TAG, `getLinkedInfo`); + getLinkedInfo(): void { + Log.showInfo(TAG, 'getLinkedInfo'); wifi.getLinkedInfo((err, data) => { if (wifi.isConnected()) { mWifiStatus.set(true); @@ -132,19 +132,19 @@ export class WifiModel { }); } - setDisconnectedStatus() { - Log.showInfo(TAG, `setDisconnectedStatus`); + setDisconnectedStatus(): void { + Log.showInfo(TAG, 'setDisconnectedStatus'); mWifiStatus.set(Constants.DEFAULT_WIFI_STATUS); mWifiInfo.set(Constants.DEFAULT_WIFI_INFO); mWifiName.set(Constants.DEFAULT_WIFI_NAME); } - enableWifi() { + enableWifi(): void { let result = wifi.enableWifi(); Log.showInfo(TAG, `enableWifi, result: ${result}`); } - disableWifi() { + disableWifi(): void { let result = wifi.disableWifi(); Log.showInfo(TAG, `disableWifi, result: ${result}`); } @@ -152,4 +152,4 @@ export class WifiModel { let mWifiModel = new WifiModel(); -export default mWifiModel as WifiModel; \ No newline at end of file +export default mWifiModel; \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts b/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts index 7c1ded02..6171bf49 100644 --- a/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts +++ b/product/default/navigationBar/src/main/ets/Application/AbilityStage.ts @@ -12,12 +12,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../../common/src/main/ets/default/log' +import AbilityStage from '@ohos.application.AbilityStage'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'NavigationBar_AbilityStage'; -const TAG = "NavigationBar_AbilityStage" export default class MainAbilityStage extends AbilityStage { - onCreate() { - Log.showInfo(TAG, "onCreate") - } + onCreate(): void { + Log.showInfo(TAG, 'onCreate'); + } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 41841b1e..627ada0a 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,71 +13,74 @@ * limitations under the License. */ -import deviceInfo from "@ohos.deviceInfo" -import ServiceExtension from '@ohos.application.ServiceExtensionAbility' -import Log from '../../../../../../../common/src/main/ets/default/Log' -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import NavBarConfiguration from '../common/navbarconfiguration' +import deviceInfo from '@ohos.deviceInfo'; +import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import NavBarConfiguration from '../common/NavBarConfiguration'; +import { Want } from 'ability/want'; -const TAG = "NavigationBar_ServiceExtAbility" +const TAG = 'NavigationBar_ServiceExtAbility'; var dropdownPanelWant = { - "bundleName": "com.ohos.systemui", - "abilityName": "com.ohos.systemui.dropdownpanel.ServiceExtAbility" -} + 'bundleName': 'com.ohos.systemui', + 'abilityName': 'com.ohos.systemui.dropdownpanel.ServiceExtAbility' +}; class ServiceExtAbility extends ServiceExtension { - async onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, this.context) - - let configInfo = await NavBarConfiguration.getConfiguration(); - if (configInfo.showNavHorizontal) { - if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode - configInfo.realHeight = 44 * configInfo.maxWidth / 1280 - } else { // Phone Mode - configInfo.realHeight = 36 * configInfo.maxWidth / 360 - } - configInfo.minHeight = configInfo.realHeight - if (configInfo.yCoordinate > 0) { - configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight - } - } else { - if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode - configInfo.realWidth = 44 * configInfo.maxWidth / 1280 - } else { // Phone Mode - configInfo.realWidth = 36 * configInfo.maxWidth / 360 - } - configInfo.minHeight = configInfo.realWidth - if (configInfo.xCoordinate > 0) { - configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth - } - } - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config', configInfo) - - if(deviceInfo.deviceType == "phone"){ - AbilityManager.startAbility(dropdownPanelWant) - } - Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`) + async onCreate(want: Want): Promise { + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, this.context); - let navigationBarRect = { - left: configInfo.xCoordinate, - top: configInfo.yCoordinate, - width: configInfo.realWidth, - height: configInfo.realHeight - } - WindowManager.createWindow(this.context, WindowType.NAVIGATION_BAR, navigationBarRect, "pages/index") - .then(() => { - Log.showInfo(TAG, `onCreate, createWindow success.`); - WindowManager.showWindow(WindowType.NAVIGATION_BAR); - }) - .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); + let configInfo = await NavBarConfiguration.getConfiguration(); + if (configInfo.showNavHorizontal) { + if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode + configInfo.realHeight = 44 * configInfo.maxWidth / 1280; + } else { // Phone Mode + configInfo.realHeight = 36 * configInfo.maxWidth / 360; + } + configInfo.minHeight = configInfo.realHeight; + if (configInfo.yCoordinate > 0) { + configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; + } + } else { + if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode + configInfo.realWidth = 44 * configInfo.maxWidth / 1280; + } else { // Phone Mode + configInfo.realWidth = 36 * configInfo.maxWidth / 360; + } + configInfo.minHeight = configInfo.realWidth; + if (configInfo.xCoordinate > 0) { + configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth; + } } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config', configInfo); - onDestroy() { - Log.showInfo(TAG, 'onDestroy'); + if (deviceInfo.deviceType == 'phone') { + AbilityManager.startAbility(dropdownPanelWant); } + Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); + + let navigationBarRect = { + left: configInfo.xCoordinate, + top: configInfo.yCoordinate, + width: configInfo.realWidth, + height: configInfo.realHeight + }; + WindowManager.createWindow(this.context, WindowType.NAVIGATION_BAR, navigationBarRect, 'pages/index') + .then(() => { + Log.showInfo(TAG, 'onCreate, createWindow success.'); + WindowManager.showWindow(WindowType.NAVIGATION_BAR).then(() => { + }).catch(e => { + }); + }) + .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); + } + + onDestroy(): void { + Log.showInfo(TAG, 'onDestroy'); + } } -export default ServiceExtAbility \ No newline at end of file +export default ServiceExtAbility; \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts b/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts index 30dc0c38..b33f4f96 100644 --- a/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts +++ b/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts @@ -13,21 +13,23 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/stylemanager'; +import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; const TAG = 'NavigationBar-StyleConfiguration'; +export class KeyButtonStyle { + buttonWidth: Length = $r('app.float.navigation_bar_button_width'); + buttonHeight: Length = $r('app.float.navigation_bar_button_height'); + buttonBorderRadius: Length = $r('app.float.navigation_bar_button_radius'); + buttonIconWidth: Length = $r('app.float.navigation_bar_button_icon_width'); + buttonIconHeight: Length = $r('app.float.navigation_bar_button_icon_height'); +} + export default class StyleConfiguration { - static getKeyButtonStyle() { - const key: string = TAG + "-KeyButton"; - return StyleManager.getStyle(key, () => { - return { - buttonWidth: $r('app.float.navigation_bar_button_width'), - buttonHeight: $r('app.float.navigation_bar_button_height'), - buttonBorderRadius: $r('app.float.navigation_bar_button_radius'), - buttonIconWidth: $r('app.float.navigation_bar_button_icon_width'), - buttonIconHeight: $r('app.float.navigation_bar_button_icon_height'), - }; - }); - } + static getKeyButtonStyle(): KeyButtonStyle { + const key: string = TAG + '-KeyButton'; + return StyleManager.getStyle(key, () => { + return new KeyButtonStyle(); + }); + } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/common/StyleManager.ts b/product/default/navigationBar/src/main/ets/common/StyleManager.ts index f4f6c52a..10f4fdb1 100644 --- a/product/default/navigationBar/src/main/ets/common/StyleManager.ts +++ b/product/default/navigationBar/src/main/ets/common/StyleManager.ts @@ -13,65 +13,65 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/log'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; -import StyleConfiguration from './styleconfiguration' +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import StyleConfiguration from './StyleConfiguration'; const TAG = 'StatusBar-StyleManager'; export default class StyleManager { - static PAD_STANDARD_DISPLAY_WIDTH: number = 1280; - static PAD_STANDARD_DISPLAY_HEIGHT: number = 800; - static PHONE_STANDARD_DISPLAY_WIDTH: number = 720; - static PHONE_STANDARD_DISPLAY_HEIGHT: number = 1280; - static maxWidth: number = StyleManager.PAD_STANDARD_DISPLAY_WIDTH; - static rumMode: string = 'pad'; + static readonly PAD_STANDARD_DISPLAY_WIDTH = 1280; + static readonly PAD_STANDARD_DISPLAY_HEIGHT = 800; + static readonly PHONE_STANDARD_DISPLAY_WIDTH = 720; + static readonly PHONE_STANDARD_DISPLAY_HEIGHT = 1280; + static maxWidth: number = StyleManager.PAD_STANDARD_DISPLAY_WIDTH; + static rumMode = 'pad'; - static setPadStyle() { - Log.showDebug(TAG, `setPadStyle`) + static setPadStyle(): void { + Log.showDebug(TAG, 'setPadStyle'); - let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); - StyleManager.maxWidth = config.maxWidth; - StyleManager.rumMode = 'pad' + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); + StyleManager.maxWidth = config.maxWidth; + StyleManager.rumMode = 'pad'; - // keyButton - { - let style: any = StyleConfiguration.getKeyButtonStyle(); - style.buttonWidth = StyleManager.calcScaleSizePx(88); - style.buttonHeight = StyleManager.calcScaleSizePx(44); - style.buttonBorderRadius = StyleManager.calcScaleSizePx(22); - style.buttonIconWidth = StyleManager.calcScaleSizePx(15); - style.buttonIconHeight = StyleManager.calcScaleSizePx(15); - } + // keyButton + { + let style = StyleConfiguration.getKeyButtonStyle(); + style.buttonWidth = StyleManager.calcScaleSizePx(88); + style.buttonHeight = StyleManager.calcScaleSizePx(44); + style.buttonBorderRadius = StyleManager.calcScaleSizePx(22); + style.buttonIconWidth = StyleManager.calcScaleSizePx(15); + style.buttonIconHeight = StyleManager.calcScaleSizePx(15); } + } - static setPhoneStyle() { - Log.showDebug(TAG, `setPhoneStyle`) + static setPhoneStyle(): void { + Log.showDebug(TAG, 'setPhoneStyle'); - let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); - StyleManager.maxWidth = config.maxWidth; - StyleManager.rumMode = 'phone' + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); + StyleManager.maxWidth = config.maxWidth; + StyleManager.rumMode = 'phone'; - // keyButton - { - let style: any = StyleConfiguration.getKeyButtonStyle(); - style.buttonWidth = StyleManager.calcScaleSizePx(144); - style.buttonHeight = StyleManager.calcScaleSizePx(72); - style.buttonBorderRadius = StyleManager.calcScaleSizePx(36); - style.buttonIconWidth = StyleManager.calcScaleSizePx(24); - style.buttonIconHeight = StyleManager.calcScaleSizePx(24); - } + // keyButton + { + let style = StyleConfiguration.getKeyButtonStyle(); + style.buttonWidth = StyleManager.calcScaleSizePx(144); + style.buttonHeight = StyleManager.calcScaleSizePx(72); + style.buttonBorderRadius = StyleManager.calcScaleSizePx(36); + style.buttonIconWidth = StyleManager.calcScaleSizePx(24); + style.buttonIconHeight = StyleManager.calcScaleSizePx(24); } + } - static number2px(n: number): string { - return n.toString() + 'px'; - } + static number2px(n: number): string { + return n.toString() + 'px'; + } - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / (StyleManager.rumMode == 'pad' ? StyleManager.PAD_STANDARD_DISPLAY_WIDTH : StyleManager.PHONE_STANDARD_DISPLAY_WIDTH); - } + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / (StyleManager.rumMode == 'pad' ? StyleManager.PAD_STANDARD_DISPLAY_WIDTH : StyleManager.PHONE_STANDARD_DISPLAY_WIDTH); + } - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/common/constants.ts b/product/default/navigationBar/src/main/ets/common/constants.ts index 833cea42..fa509d52 100644 --- a/product/default/navigationBar/src/main/ets/common/constants.ts +++ b/product/default/navigationBar/src/main/ets/common/constants.ts @@ -13,21 +13,20 @@ * limitations under the License. */ -export default -class Constants{ - static KEY_DOWN: number = 0; - static KEY_UP: number = 1; - static KEYCODE_BACK: number = 1; - static KEYCODE_HOME: number = 2; - static KEYCODE_RECENT: number = 3; - static ONE_TEMPLATE: string = '1fr'; - static THREE_TEMPLATE: string = '1fr 1fr 1fr'; - static ONE_ICON_LAYOUT: number = 1; - static THREE_ICON_LAYOUT: number = 3; +export default class Constants { + static readonly KEY_DOWN: number = 0; + static readonly KEY_UP: number = 1; + static readonly KEYCODE_BACK: number = 1; + static readonly KEYCODE_HOME: number = 2; + static readonly KEYCODE_RECENT: number = 3; + static readonly ONE_TEMPLATE: string = '1fr'; + static readonly THREE_TEMPLATE: string = '1fr 1fr 1fr'; + static readonly ONE_ICON_LAYOUT: number = 1; + static readonly THREE_ICON_LAYOUT: number = 3; } export class NavigationBarComponentData { - isEnable: boolean = true; - backgroundColor: string = "#00000000"; - contentColor: string = "#FFFFFFFF"; + isEnable = true; + backgroundColor = '#00000000'; + contentColor = '#FFFFFFFF'; } diff --git a/product/default/navigationBar/src/main/ets/pages/keyButton.ets b/product/default/navigationBar/src/main/ets/pages/keyButton.ets index d76b18de..427ce134 100644 --- a/product/default/navigationBar/src/main/ets/pages/keyButton.ets +++ b/product/default/navigationBar/src/main/ets/pages/keyButton.ets @@ -15,39 +15,40 @@ import keyCodeEvent from '../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent'; import Log from '../../../../../../../common/src/main/ets/default/Log'; -import Constants from '../common/constants' -import StyleConfiguration from '../common/StyleConfiguration' +import Constants from '../common/constants'; +import StyleConfiguration, { KeyButtonStyle } from '../common/StyleConfiguration'; import NavigationBarViewModel from '../viewmodel/NavigationBarViewModel'; -import {NavigationBarComponentData} from '../common/constants' +import { NavigationBarComponentData } from '../common/constants'; const TAG = 'NavigationBar-KeyButton'; @Component export default struct keyButton { - private uri: any; @Prop keyCode: number; @State backGroundColor: any = $r('app.color.button_default_background'); @StorageLink("showNavHorizontal") showNavHorizontal: boolean = AppStorage.SetAndLink("showNavHorizontal", true).get(); @State mNavigationBarComponentData: NavigationBarComponentData = NavigationBarViewModel.getInstance() .getNavigationBarComponentData() - @State style: any = StyleConfiguration.getKeyButtonStyle() + @State style: KeyButtonStyle = StyleConfiguration.getKeyButtonStyle() aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) } - aboutToDisappear(){ + aboutToDisappear() { Log.showInfo(TAG, `aboutToDisAppear`) } build() { Stack({ alignContent: Alignment.Center }) { - Flex() {} + Flex() { + } .borderRadius(this.style.buttonBorderRadius) .width('100%') .height('100%') .backgroundColor(this.backGroundColor) + Image(this.uri) .objectFit(ImageFit.Contain) .size({ @@ -61,12 +62,12 @@ export default struct keyButton { .height(this.showNavHorizontal ? this.style.buttonHeight : this.style.buttonWidth) } - private onKeyTouch(event:TouchEvent) { + private onKeyTouch(event: TouchEvent) { Log.showDebug(TAG, `onKeyTouch event: ${ event }`) let eventType = event.type; - switch(eventType) { + switch (eventType) { case Constants.KEY_DOWN: - this.backGroundColor =$r('app.color.button_click_background') + this.backGroundColor = $r('app.color.button_click_background') break; case Constants.KEY_UP: this.backGroundColor = $r('app.color.button_default_background') diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index 18d1433a..d4f67582 100644 --- a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -14,33 +14,34 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/log'; -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager'; -import getSingleInstance from '../../../../../../../common/src/main/ets/default/singleinstancehelper'; -import TintStateManager, {TintState, TintStateListener -} from '../../../../../../../common/src/main/ets/default/tintstatemanager'; -import {NavigationBarComponentData} from '../common/constants'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; +import getSingleInstance from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import TintStateManager, { TintState, TintStateListener +} from '../../../../../../../common/src/main/ets/default/TintStateManager'; +import { NavigationBarComponentData } from '../common/constants'; import featureAbility from '@ohos.ability.featureAbility'; +import { DataAbilityHelper } from 'ability/dataAbilityHelper'; import settings from '@ohos.settings'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; -import CommonConstants from "../../../../../../../common/src/main/ets/default/constants"; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import CommonConstants from '../../../../../../../common/src/main/ets/default/Constants'; const TAG = 'NavigationBarViewModel'; const NAVIGATION_BAE_VIEW_MODEL_KEY = 'AppStorage_NavigationBarViewModel'; -const NavigationBarComponentDataKey = 'AppStorage_NavigationBarComponentData'; +const NAVIGATION_BAR_COMPONENT_DATA_KEY = 'AppStorage_NavigationBarComponentData'; export default class NavigationBarViewModel { - private settingDataKey = 'settings.display.navigationbar_status'; - private urivar: string = null; - private helper: any = null; - private navigationBarStatusDefaultValue: string = '1'; + private readonly settingDataKey = 'settings.display.navigationbar_status'; + private readonly urivar: string; + private readonly helper: DataAbilityHelper; + private readonly navigationBarStatusDefaultValue = '1'; private isDisplay = true; - mNavigationBarComponentData?: NavigationBarComponentData = { + mNavigationBarComponentData: NavigationBarComponentData = { ...new NavigationBarComponentData() }; - mUseCount?: number = 0; + mUseCount = 0; static getInstance(): NavigationBarViewModel { return getSingleInstance(NavigationBarViewModel, NAVIGATION_BAE_VIEW_MODEL_KEY); @@ -49,19 +50,18 @@ export default class NavigationBarViewModel { constructor() { Log.showInfo(TAG, 'constructor'); this.mNavigationBarComponentData = - AppStorage.SetAndLink(NavigationBarComponentDataKey, this.mNavigationBarComponentData).get() + AppStorage.SetAndLink(NAVIGATION_BAR_COMPONENT_DATA_KEY, this.mNavigationBarComponentData).get() this.urivar = settings.getUriSync(this.settingDataKey); if (AbilityManager.getContext() == null) { - Log.showError(TAG, `AbilityManager.getContext() is null`); + Log.showError(TAG, 'AbilityManager.getContext() is null'); } else { - Log.showInfo(TAG, 'context: ' + AbilityManager.getContext() + - 'stageMode: ' + AbilityManager.getContext().stageMode); + Log.showInfo(TAG, 'context: ' + AbilityManager.getContext()); } this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), CommonConstants.URI_VAR); this.initNavigationBarStatus(); } - install?() { + install(): void { Log.showDebug(TAG, `install, useCount: ${this.mUseCount}`); if (!this.mUseCount) { TintStateManager.getInstance().registerListener('navigation', this as TintStateListener); @@ -69,7 +69,7 @@ export default class NavigationBarViewModel { this.mUseCount++; } - uninstall?() { + uninstall(): void { Log.showDebug(TAG, `uninstall, useCount: ${this.mUseCount}`); this.mUseCount--; if (this.mUseCount) { @@ -77,13 +77,13 @@ export default class NavigationBarViewModel { } } - getNavigationBarComponentData?(): NavigationBarComponentData { - Log.showDebug(TAG, `getNavigationBarComponentData`) + getNavigationBarComponentData(): NavigationBarComponentData { + Log.showDebug(TAG, 'getNavigationBarComponentData'); return this.mNavigationBarComponentData; } - onTintStateChange?(tintState: TintState) { - Log.showDebug(TAG, `onTintStateChange, tintState: ${JSON.stringify(tintState)}`) + onTintStateChange(tintState: TintState): void { + Log.showDebug(TAG, `onTintStateChange, tintState: ${JSON.stringify(tintState)}`); if (typeof (tintState.isEnable) == 'boolean') { this.setWindowEnable(tintState.isEnable); } @@ -97,39 +97,43 @@ export default class NavigationBarViewModel { contentColor ${this.mNavigationBarComponentData.contentColor}`); } - setWindowEnable?(isEnable: boolean) { - Log.showDebug(TAG, `setWindowEnable, isEnable ${isEnable}`); + setWindowEnable(isEnable: boolean): void { + Log.showDebug(TAG, `setWindowEnable, isEnable ${String(isEnable)}`); if (this.mNavigationBarComponentData.isEnable == isEnable) { return; } this.mNavigationBarComponentData.isEnable = isEnable; if (isEnable && this.isDisplay) { - WindowManager.showWindow(WindowType.NAVIGATION_BAR); + WindowManager.showWindow(WindowType.NAVIGATION_BAR).then(() => { + }).catch((err) => { + }); } else { - WindowManager.hideWindow(WindowType.NAVIGATION_BAR); + WindowManager.hideWindow(WindowType.NAVIGATION_BAR).then(() => { + }).catch((err) => { + }); } } - private setValue(value: string) { + private setValue(value: string): void { settings.setValueSync(this.helper, this.settingDataKey, value); } - private getValue(defaultValue?: string) { + private getValue(defaultValue?: string): string { return settings.getValueSync( this.helper, this.settingDataKey, defaultValue ? defaultValue : this.navigationBarStatusDefaultValue ); } - private registerListenForDataChanges(callback) { - this.helper.on("dataChange", this.urivar, (data) => { + private registerListenForDataChanges(callback: (data) => void): void { + this.helper.on('dataChange', this.urivar, (data) => { callback(data); - }) + }); } /** * Initialize the NavigationBar status. */ - public initNavigationBarStatus() { + initNavigationBarStatus(): void { try { let initValue = this.getValue(); Log.showInfo(TAG, `initNavigationBarStatus initValue ${initValue}`); @@ -144,7 +148,7 @@ export default class NavigationBarViewModel { * Get NavigationBar status data. * @return */ - public dataChangesCallback(data: any) { + dataChangesCallback(data): void { if (data.code !== 0) { Log.showError(TAG, `dataChangesCallback failed, because ${data.message}`); return; @@ -155,12 +159,16 @@ export default class NavigationBarViewModel { } } - private windowSwitches(navigationBarStatusValue) { + private windowSwitches(navigationBarStatusValue: string): void { this.isDisplay = navigationBarStatusValue == '1' ? true : false; if (!this.isDisplay) { - WindowManager.hideWindow(WindowType.NAVIGATION_BAR); + WindowManager.hideWindow(WindowType.NAVIGATION_BAR).then(() => { + }).catch((err) => { + }); } else { - WindowManager.showWindow(WindowType.NAVIGATION_BAR); + WindowManager.showWindow(WindowType.NAVIGATION_BAR).then(() => { + }).catch((err) => { + }); } } } \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts b/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts index 788ef5b3..88995fdd 100644 --- a/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts +++ b/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts @@ -12,12 +12,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../../common/src/main/ets/default/log' +import AbilityStage from '@ohos.application.AbilityStage'; +import Log from '../../../../../../../common/src/main/ets/default/log'; -const TAG = "NotificationManagement_AbilityStage" +const TAG = 'NotificationManagement_AbilityStage'; export default class MainAbilityStage extends AbilityStage { - onCreate() { - Log.showInfo(TAG, "onCreate") - } + onCreate(): void { + Log.showInfo(TAG, 'onCreate'); + } } \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts index 90366d08..31fb9646 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts @@ -12,38 +12,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Ability from '@ohos.application.Ability' -import Log from '../../../../../../../common/src/main/ets/default/Log' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import display from "@ohos.display"; +import Ability from '@ohos.application.Ability'; +import Want from '@ohos.application.Want'; +import AbilityConstant from "@ohos.application.AbilityConstant"; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import display from '@ohos.display'; -const TAG = "NotificationManagement-MainAbility" +const TAG = 'NotificationManagement-MainAbility'; export default class MainAbility extends Ability { - onCreate(want, launchParam) { - Log.showInfo(TAG, "MainAbility onCreate") + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + Log.showInfo(TAG, 'MainAbility onCreate'); globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = want; + display.getDefaultDisplay().then((dis) => { + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_APP_LIST, 'dis', { + width: dis.width, + height: dis.height, + }); + }).catch(err => { + }); } - onDestroy() { - Log.showInfo(TAG, "MainAbility onDestroy") + onDestroy(): void { + Log.showInfo(TAG, 'MainAbility onDestroy'); } - onWindowStageCreate(windowStage) { - Log.showInfo(TAG, "MainAbility onWindowStageCreate") - AbilityManager.setContext(AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT, this.context) - windowStage.setUIContent(this.context, "pages/notificationManagenment", null) + onWindowStageCreate(windowStage): void { + Log.showInfo(TAG, 'MainAbility onWindowStageCreate'); + windowStage.setUIContent(this.context, 'pages/notificationManagenment', null); } - onWindowStageDestroy() { - Log.showInfo(TAG, "MainAbility onWindowStageDestroy") + onWindowStageDestroy(): void { + Log.showInfo(TAG, 'MainAbility onWindowStageDestroy'); } - onForeground() { - Log.showInfo(TAG, "MainAbility onForeground") + onForeground(): void { + Log.showInfo(TAG, 'MainAbility onForeground'); } - onBackground() { - Log.showInfo(TAG, "MainAbility onBackground") + onBackground(): void { + Log.showInfo(TAG, 'MainAbility onBackground'); } }; diff --git a/product/default/notificationmanagement/src/main/ets/common/constants.ts b/product/default/notificationmanagement/src/main/ets/common/constants.ts index 04932856..93e5e03e 100644 --- a/product/default/notificationmanagement/src/main/ets/common/constants.ts +++ b/product/default/notificationmanagement/src/main/ets/common/constants.ts @@ -14,9 +14,9 @@ */ export default class Constants { - static WH_50_100 = '50%'; - static WH_70_100 = '70%'; - static WH_90_100 = '90%'; - static WH_100_100 = '100%'; - static TOPMOST_INDEX = 999 + static readonly WH_50_100 = '50%'; + static readonly WH_70_100 = '70%'; + static readonly WH_90_100 = '90%'; + static readonly WH_100_100 = '100%'; + static readonly TOPMOST_INDEX = 999; } \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets index 22bb1140..9d357e25 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets @@ -91,7 +91,7 @@ export default struct BatchSetEnable { aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear`) - this.mViewModel.ViewModelInit(); + this.mViewModel.viewModelInit(); } onBackPress() { diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index 0e731700..26d48469 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -261,7 +261,7 @@ export default struct NoDisturb { aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear`) - this.mViewModel.ViewModelInit() + this.mViewModel.viewModelInit() this.mRefreshCnt++; } diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index 5a5188ca..252b4966 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -187,7 +187,7 @@ export default struct notificationManagenment { aboutToAppear(): void{ Log.showDebug(TAG, `aboutToAppear`) - this.mViewModel.ViewModelInit(); + this.mViewModel.viewModelInit(); } aboutToDisappear(): void{ @@ -196,7 +196,7 @@ export default struct notificationManagenment { onPageShow(): void{ Log.showDebug(TAG, `onPageShow`) - this.mViewModel.RefreshNoDisturbState(); + this.mViewModel.refreshNoDisturbState(); } onBackPress() { diff --git a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts index 688c3bfb..de011a6f 100644 --- a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts @@ -19,35 +19,35 @@ import NoDisturbingModel from '../../../../../../../features/managementcomponent import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/nodisturbcomponentviewmodel'; import FeaturesConfigData, {DoNotDisturbType} from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; -const TAG = 'NotificationManagement-NoDisturbViewModel' -const CONST_DAY_LENGTH = 24*3600*1000 +const TAG = 'NotificationManagement-NoDisturbViewModel'; +const CONST_DAY_LENGTH = 24*3600*1000; export default class NoDisturbViewModel extends NoDisturbComponentViewModel { - startDateClue: string = '' - startTimeClue: string = '' - endDateClue: string = '' - endTimeClue: string = '' + startDateClue = ''; + startTimeClue = ''; + endDateClue = ''; + endTimeClue = ''; - ViewModelInit(): void{ + viewModelInit(): void{ Log.showDebug(TAG, 'ViewModelInit'); - this.getNextDayLabel(); - this.getNoDisturbingDate.bind(this)() + void this.getNextDayLabel(); + this.getNoDisturbingDate.bind(this)(); } - getNoDisturbingDate() { + getNoDisturbingDate(): void { Log.showDebug(TAG, 'getNoDisturbingDate'); NoDisturbingModel.getNoDisturbingDate((data) => { Log.showInfo(TAG, 'getNoDisturbingDate data:' + JSON.stringify(data)); - this.repeatMode = data.type - this.startTime = data.begin - this.endTime = data.end + this.repeatMode = data.type??0; + this.startTime = data.begin??''; + this.endTime = data.end??''; Log.showInfo(TAG, `getNoDisturbingDate this.repeatMode : ${this.repeatMode}, this.startTime : ${this.startTime}, this.endTime : ${this.endTime}`) - this.setClues.bind(this)() - }) + this.setClues.bind(this)(); + }); } - setClues() { - Log.showDebug(TAG, `setClues`) + setClues(): void { + Log.showDebug(TAG, 'setClues'); if (this.repeatMode == DoNotDisturbType.TYPE_DAILY || this.repeatMode == DoNotDisturbType.TYPE_ONCE || this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { @@ -81,35 +81,35 @@ export default class NoDisturbViewModel extends NoDisturbComponentViewModel { this.repeatName = this.refreshRepeatName(this.repeatMode); } - onStartTimeAccept(data) { - Log.showDebug(TAG, `onStartTimeAccept`) - this.startTime = data + onStartTimeAccept(data: string): void { + Log.showDebug(TAG, 'onStartTimeAccept'); + this.startTime = data; if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { let tmpDateTime = this.getDateByDateTime(this.startTime); if (this.defaultEndTime.getTime() < tmpDateTime.getTime()) { - this.startTime = this.endTime + this.startTime = this.endTime; } } this.setClues(); - this.setNoDisturbingDate() + this.setNoDisturbingDate(); } - onEndTimeAccept(data) { - Log.showDebug(TAG, `onEndTimeAccept`) - this.endTime = data + onEndTimeAccept(data: string): void { + Log.showDebug(TAG, 'onEndTimeAccept'); + this.endTime = data; if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { let tmpDateTime = this.getDateByDateTime(this.endTime); if (tmpDateTime.getTime() < this.defaultStartTime.getTime()) { - this.endTime = this.startTime + this.endTime = this.startTime; } } this.setClues(); - this.setNoDisturbingDate() + this.setNoDisturbingDate(); } - onRepeatModeAccect(data) { - Log.showDebug(TAG, `onRepeatModeAccect`) + onRepeatModeAccect(data: number): void { + Log.showDebug(TAG, 'onRepeatModeAccect'); this.repeatMode = data; if (this.repeatMode == DoNotDisturbType.TYPE_CLEARLY) { let dateSource = new Date(); @@ -123,17 +123,17 @@ export default class NoDisturbViewModel extends NoDisturbComponentViewModel { this.setNoDisturbingDate(); } - setDateIntoDateTime(dateSource: Date, inputData:string): string { + setDateIntoDateTime(dateSource: Date, inputData: string): string { let result = inputData + ' ' + NoDisturbingModel.formatTime(dateSource); return result; } - setTimeIntoDateTime(dateSource: Date, inputData:string): string { + setTimeIntoDateTime(dateSource: Date, inputData: string): string { let result = NoDisturbingModel.formatDate(dateSource) + ' ' + inputData; return result; } - onCancel() { - Log.showDebug(TAG, `onCancel`) + onCancel(): void { + Log.showDebug(TAG, 'onCancel'); } } \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts index 1cb6cb78..a9df14d6 100644 --- a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts @@ -16,39 +16,38 @@ import Log from '../../../../../../../common/src/main/ets/default/log'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' import BundleResourceModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/bundleresourcemodel'; -import display from '@ohos.display'; -import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/nodisturbcomponentviewmodel' +import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/nodisturbcomponentviewmodel'; import Router from '@system.router'; -const TAG = 'NotificationManagement-NotificationManagenmentViewModel' +const TAG = 'NotificationManagement-NotificationManagenmentViewModel'; export default class NotificationManagenmentViewModel extends NoDisturbComponentViewModel { isPhone = false; - ViewModelInit(): void{ + viewModelInit(): void{ Log.showDebug(TAG, 'ViewModelInit'); - super.ViewModelInit(); - this.MigrateTo(); + super.viewModelInit(); + this.migrateTo(); this.judgeDeviceType(); } - RefreshNoDisturbState() { - super.ViewModelInit(); + refreshNoDisturbState(): void { + super.viewModelInit(); } - MigrateTo() { + migrateTo(): void { Log.showDebug(TAG, 'MigrateTo'); //get the want let want = globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want']; - Log.showDebug(TAG, `aboutToAppear want:${JSON.stringify(want)}`) + Log.showDebug(TAG, `aboutToAppear want:${JSON.stringify(want)}`); if (!want || !want.parameters.migrateUri || !want.parameters.migrateBundle) { return; } let migrateUri = want.parameters.migrateUri; let bundleName = want.parameters.migrateBundle; - Log.showDebug(TAG, `aboutToAppear migrateUri:${migrateUri} migrateBundle:${JSON.stringify(bundleName)}`) + Log.showDebug(TAG, `aboutToAppear migrateUri:${migrateUri} migrateBundle:${JSON.stringify(bundleName)}`); - let dataModel: BundleResourceModel = new BundleResourceModel() - dataModel.getBundleInfo(bundleName, (bundleInfo) => { + let dataModel: BundleResourceModel = new BundleResourceModel(); + void dataModel.getBundleInfo(bundleName, (bundleInfo) => { Log.showInfo(TAG, `MigrateTo bundleInfo:${JSON.stringify(bundleInfo)}`); //to next page Router.push({ @@ -59,12 +58,13 @@ export default class NotificationManagenmentViewModel extends NoDisturbComponent globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = null; } - async judgeDeviceType(){ + judgeDeviceType(){ Log.showDebug(TAG, "judgeDeviceType"); - let configInfo = await display.getDefaultDisplay(); + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_APP_LIST, 'dis'); Log.showDebug(TAG, `judgeDeviceType, configInfo: ${configInfo} `); if (configInfo.width < configInfo.height) { this.isPhone = true; } } -} \ No newline at end of file + +} diff --git a/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts b/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts index dde25d2f..82e9de89 100644 --- a/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts +++ b/product/default/volumepanel/src/main/ets/Application/AbilityStage.ts @@ -12,14 +12,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../../common/src/main/ets/default/log' +import AbilityStage from '@ohos.application.AbilityStage'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; //import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' //import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' -const TAG = "volume_AbilityStage" +const TAG = 'volume_AbilityStage'; + export default class MainAbilityStage extends AbilityStage { - async onCreate() { - Log.showInfo(TAG, "onCreate") - } + async onCreate(): Promise { + Log.showInfo(TAG, 'onCreate'); + } } \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 34c537f1..4c58eadc 100644 --- a/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/volumepanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,43 +13,46 @@ * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility' -import display from "@ohos.display"; -import Log from "../../../../../../../common/src/main/ets/default/Log"; -import WindowManager, { WindowType } from "../../../../../../../common/src/main/ets/default/WindowManager"; -import AbilityManager from "../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager"; -import VolumeWindowController from "../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController"; +import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import Want from '@ohos.application.Want'; +import display from '@ohos.display'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import VolumeWindowController from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/VolumeWindowController'; -const TAG = "VolumePanel_ServiceExtAbility"; +const TAG = 'VolumePanel_ServiceExtAbility'; class ServiceExtAbility extends ServiceExtension { - onCreate(want) { - Log.showInfo(TAG, "onCreate, want:" + want.abilityName); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_VOLUME_PANEL, this.context); - display.getDefaultDisplay().then((dis) => { - let volumeRect = { - left: 0, - top: 0, - width: dis.width, - height: dis.height, - }; + onCreate(want: Want): void { + Log.showInfo(TAG, `onCreate, want:${want.abilityName}`); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_VOLUME_PANEL, this.context); + display.getDefaultDisplay().then((dis) => { + let volumeRect = { + left: 0, + top: 0, + width: dis.width, + height: dis.height, + }; - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, "dis", { - width: dis.width, - height: dis.height, - }); - WindowManager.createWindow(this.context, WindowType.VOLUME_PANEL, volumeRect, "pages/index") - .then((win) => { - Log.showInfo(TAG, `onCreate, createWindow callback`); - VolumeWindowController.getInstance().setWindowHandle(win); - }) - .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); - }); - } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis', { + width: dis.width, + height: dis.height, + }); + WindowManager.createWindow(this.context, WindowType.VOLUME_PANEL, volumeRect, 'pages/index') + .then((win) => { + Log.showInfo(TAG, 'onCreate, createWindow callback'); + VolumeWindowController.getInstance().setWindowHandle(win); + }) + .catch((err) => Log.showError(TAG, `Can't create window, err:${JSON.stringify(err)}`)); + }).then(() => { + }).catch((err) => { + }); + } - onDestroy() { - Log.showInfo(TAG, "onDestroy"); - } + onDestroy(): void { + Log.showInfo(TAG, 'onDestroy'); + } } export default ServiceExtAbility; diff --git a/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts b/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts index 591ba062..d7146b90 100644 --- a/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts +++ b/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts @@ -13,15 +13,18 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/stylemanager'; +import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; const TAG = 'VolumePanel-StyleConfiguration'; +export class IndexStyle { +} + export default class StyleConfiguration { - static getIndexStyle() { - const key: string = TAG + "-Index"; - return StyleManager.getStyle(key, () => { - return {}; - }); - } + static getIndexStyle(): IndexStyle { + const key: string = TAG + '-Index'; + return StyleManager.getStyle(key, () => { + return new IndexStyle(); + }); + } } \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/common/StyleManager.ts b/product/default/volumepanel/src/main/ets/common/StyleManager.ts index d01b8454..16224562 100644 --- a/product/default/volumepanel/src/main/ets/common/StyleManager.ts +++ b/product/default/volumepanel/src/main/ets/common/StyleManager.ts @@ -13,61 +13,59 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/log'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; -import StyleConfiguration from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/styleconfiguration' +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import StyleConfiguration from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration'; const TAG = 'VolumePanel-StyleManager'; export default class StyleManager { - static STANDARD_DISPLAY_WIDTH: number = 2560; - static STANDARD_DISPLAY_HEIGHT: number = 1600; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + static readonly STANDARD_DISPLAY_WIDTH: number = 2560; + static readonly STANDARD_DISPLAY_HEIGHT: number = 1600; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - static setStyle() { - Log.showDebug(TAG, `setStyle`) + static setStyle(): void { + Log.showDebug(TAG, 'setStyle'); - let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis'); - StyleManager.maxWidth = config.width; - - // Pad、PC Mode - { - let style: any = StyleConfiguration.getVolumePanelComponentStyle(); - style.volumePanelSliderMarginTop = StyleManager.calcScaleSizePx(40); - style.volumePanSliderWidth = px2vp(StyleManager.calcScaleSize(8)) + 'vp'; - style.volumePanSliderHeight = StyleManager.calcScaleSizePx(320); - style.volumePanelSliderMarginBottom = StyleManager.calcScaleSizePx(40); - style.volumePanelMutBtnIconSize = StyleManager.calcScaleSizePx(48); - style.volumePanelMutBtnIconMarginBottom = StyleManager.calcScaleSizePx(24); - style.volumePanelMuteBtnHeight = StyleManager.calcScaleSizePx(72); - style.volumePanelSettingIconSize = StyleManager.calcScaleSizePx(48); - style.volumePanelSettingButtonSize = StyleManager.calcScaleSizePx(96); - style.volumePanelBackground = '#99FFFFFF' - style.volumePanelSliderBlockColor = '#FFFFFFFF' - style.volumePanelDividerHeight = StyleManager.calcScaleSizePx(1); - style.volumePanelDefaultMin = StyleManager.calcScaleSizePx(0); - style.volumePanelBorderRadius = StyleManager.calcScaleSizePx(48); - style.volumeDividerWidth = StyleManager.calcScaleSizePx(60); - style.volumeSliderTrackColor = '#FFAEE6E6'; - style.volumeSelectedColor = '#FF007DFF'; - style.volumeButtonBackgroundColor = '#00000000'; - style.volumePanelRingModeColor = '#FF007DFF'; - style.volumePanelDividerColor = '#FF9BCECE' - style.volumePanelSettingColor = '#FF4D6666' - - } + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis'); + StyleManager.maxWidth = config.width; + // Pad、PC Mode + { + let style = StyleConfiguration.getVolumePanelComponentStyle(); + style.volumePanelSliderMarginTop = StyleManager.calcScaleSizePx(40); + style.volumePanSliderWidth = px2vp(StyleManager.calcScaleSize(8)).toString() + 'vp'; + style.volumePanSliderHeight = StyleManager.calcScaleSizePx(320); + style.volumePanelSliderMarginBottom = StyleManager.calcScaleSizePx(40); + style.volumePanelMutBtnIconSize = StyleManager.calcScaleSizePx(48); + style.volumePanelMutBtnIconMarginBottom = StyleManager.calcScaleSizePx(24); + style.volumePanelMuteBtnHeight = StyleManager.calcScaleSizePx(72); + style.volumePanelSettingIconSize = StyleManager.calcScaleSizePx(48); + style.volumePanelSettingButtonSize = StyleManager.calcScaleSizePx(96); + style.volumePanelBackground = '#99FFFFFF'; + style.volumePanelSliderBlockColor = '#FFFFFFFF'; + style.volumePanelDividerHeight = StyleManager.calcScaleSizePx(1); + style.volumePanelBorderRadius = StyleManager.calcScaleSizePx(48); + style.volumeDividerWidth = StyleManager.calcScaleSizePx(60); + style.volumeSliderTrackColor = '#FFAEE6E6'; + style.volumeSelectedColor = '#FF007DFF'; + style.volumeButtonBackgroundColor = '#00000000'; + style.volumePanelRingModeColor = '#FF007DFF'; + style.volumePanelDividerColor = '#FF9BCECE'; + style.volumePanelSettingColor = '#FF4D6666'; } - static number2px(n: number): string { - return n.toString() + 'px'; - } + } - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } + static number2px(n: number): string { + return n.toString() + 'px'; + } - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts b/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts index a32f8d75..c1896825 100644 --- a/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/controlpanel/src/main/ets/Application/AbilityStage.ts @@ -12,12 +12,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../../common/src/main/ets/default/log' +import AbilityStage from '@ohos.application.AbilityStage'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'ControlPanel_AbilityStage'; -const TAG = "ControlPanel_AbilityStage" export default class MainAbilityStage extends AbilityStage { - onCreate() { - Log.showInfo(TAG, "onCreate") - } + onCreate(): void { + Log.showInfo(TAG, 'onCreate'); + } } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index d653bebf..dac5fc95 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,18 +13,17 @@ * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility' -import display from "@ohos.display"; -import Log from "../../../../../../../common/src/main/ets/default/Log"; -import WindowManager, { - WindowType -} from "../../../../../../../common/src/main/ets/default/WindowManager"; -import AbilityManager from "../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager"; +import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import display from '@ohos.display'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import { Want } from 'ability/want'; -const TAG = "ControlPanel_ServiceExtAbility"; +const TAG = 'ControlPanel_ServiceExtAbility'; class ServiceExtAbility extends ServiceExtension { - async onCreate(want) { + async onCreate(want: Want): Promise { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_CONTROL_PANEL, this.context); @@ -37,18 +36,20 @@ class ServiceExtAbility extends ServiceExtension { height: (310 * dis.width) / 1280, }; - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, "rect", rect); - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, "dis", { + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'rect', rect); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'dis', { width: dis.width, height: dis.height, }); - WindowManager.createWindow(this.context, WindowType.CONTROL_PANEL, rect, "pages/index").then(() => { - Log.showDebug(TAG, `createWindow success.`); + WindowManager.createWindow(this.context, WindowType.CONTROL_PANEL, rect, 'pages/index').then(() => { + Log.showDebug(TAG, 'createWindow success.'); + }).then(() => { + }).catch((err) => { }); } - onDestroy() { - Log.showInfo(TAG, "onDestroy"); + onDestroy(): void { + Log.showInfo(TAG, 'onDestroy'); } } diff --git a/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts index b7600690..4caa99df 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/ControlCenterConfig.ts @@ -12,37 +12,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; +import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; +import { ControlCenterConfig +} from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/Constants'; -type pluginIconData = { - id: string; - bundleName: string; - abilityName: string; -}; -type Config = { - ComplexToggleLayout: Array; - DefaultSimpleToggleLayout: Array; - LocalToggles: { - ComplexToggles: Array; - SimpleToggles: Array; - }; - MetaToggles: Array; -}; - -const ControlCenterConfig: Config = { +const controlCenterConfig: ControlCenterConfig = { ComplexToggleLayout: [FASlotName.WIFI, FASlotName.BLUETOOTH], - DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION], + DefaultSimpleToggleLayout: ['screenshot', FASlotName.RING_MODE, FASlotName.LOCATION], LocalToggles: { ComplexToggles: [FASlotName.AIR_PLANE, FASlotName.BLUETOOTH, FASlotName.WIFI], SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE], }, MetaToggles: [ { - id: "screenshot", - bundleName: "com.ohos.screenshot", - abilityName: "com.ohos.screenshot.ServiceExtAbility", + id: 'screenshot', + bundleName: 'com.ohos.screenshot', + abilityName: 'com.ohos.screenshot.ServiceExtAbility', }, ], }; -export default ControlCenterConfig; +export default controlCenterConfig; diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts index e76a15e3..90148ebd 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -17,13 +17,19 @@ import StyleManager from '../../../../../../../../common/src/main/ets/default/st const TAG = 'ControlPanel-StyleConfiguration'; +export class IndexStyle { + borderRadius: Length = $r('app.float.default_border_radius'); +} + export default class StyleConfiguration { - static getIndexStyle() { - const key: string = TAG + "-Index"; - return StyleManager.getStyle(key, () => { - return { - borderRadius: $r('app.float.default_border_radius') - }; - }); - } -} \ No newline at end of file + static getIndexStyle(): IndexStyle { + const key: string = TAG + '-Index'; + return StyleManager.getStyle(key, () => { + return new IndexStyle(); + }); + } +} + + + + diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts index 80f395ae..2c231a28 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts @@ -16,255 +16,270 @@ import Log from '../../../../../../../../common/src/main/ets/default/log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/styleconfiguration'; -import ControlCenterStyleConfiguration from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/styleconfiguration' -import BrightnessStyleConfiguration from '../../../../../../../../features/brightnesscomponent/src/main/ets/default/common/styleconfiguration' -import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/styleconfiguration' -import IndexStyleConfiguration from './styleconfiguration' +import ControlCenterStyleConfiguration from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/styleconfiguration'; +import BrightnessStyleConfiguration from '../../../../../../../../features/brightnesscomponent/src/main/ets/default/common/styleconfiguration'; +import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/styleconfiguration'; +import IndexStyleConfiguration from './styleconfiguration'; const TAG = 'ControlPanel-StyleManager'; export default class StyleManager { - static STANDARD_DISPLAY_WIDTH: number = 1280; - static STANDARD_DISPLAY_HEIGHT: number = 800; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + static readonly STANDARD_DISPLAY_WIDTH = 1280; + static readonly STANDARD_DISPLAY_HEIGHT = 800; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - static setStyle() { - Log.showDebug(TAG, `setStyle`) + static setStyle(): void{ + Log.showDebug(TAG, 'setStyle'); - let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'dis'); - StyleManager.maxWidth = dis.width; + let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'dis'); + StyleManager.maxWidth = dis.width; - // Index - { - let style: any = IndexStyleConfiguration.getIndexStyle(); - style.borderRadius = StyleManager.calcScaleSizePx(24); - } + // Index + StyleManager.setIndexStyle(); + // ControlCenter + StyleManager.setControlCenterComponentStyle(); + // ControlCenter-Title + StyleManager.setControlCenterUpTitleStyle(); + // ControlCenter-ComplexToggleLayout + StyleManager.setControlCenterComplexToggleLayoutStyle(); + // ControlCenter-SimpleToggleLayout + StyleManager.setControlCenterSimpleToggleLayoutStyle(); + // CommonTemplate-iconTitleBase + StyleManager.setIconTitleBaseStyle(); + // CommonTemplate-iconComponent + StyleManager.setIconComponentStyle(); + // CommonTemplate-simpleToggleBase + StyleManager.setSimpleToggleBaseStyle(); + // Brightness + StyleManager.setBrightnessComponentStyle(); + // RingMode + StyleManager.setControlCenterRingModeComponentStyle(); + // SimpleToggleLayoutEdit + StyleManager.setSimpleToggleLayoutEditComponentStyle(); + // SimpleToggleLayoutEdit-title + StyleManager.setSimpleToggleLayoutEditUpTitleStyle(); + // SimpleToggleLayoutEdit-msg + StyleManager.setSimpleToggleLayoutEditOptMsgStyle(); + // SimpleToggleLayoutEdit-grid + StyleManager.setSimpleToggleLayoutEditGridStyle(); + // EditDialog + StyleManager.setControlEditDialogStyle(); + } + // Index + private static setIndexStyle(): void { + let style = IndexStyleConfiguration.getIndexStyle(); + style.borderRadius = StyleManager.calcScaleSizePx(24); + } + // ControlCenter + private static setControlCenterComponentStyle(): void { + let style = ControlCenterStyleConfiguration.getControlCenterComponentStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(20); + style.marginRight = StyleManager.calcScaleSizePx(20); + style.marginTop = StyleManager.calcScaleSizePx(0); + style.upTitleHeight = StyleManager.calcScaleSizePx(56); + style.titleMarginBottom = StyleManager.calcScaleSizePx(0); + style.toggleAreaGap = StyleManager.calcScaleSizePx(12); + style.simpleToggleLayoutMarginTop = StyleManager.calcScaleSizePx(23); + style.simpleToggleLayoutMarginBottom = StyleManager.calcScaleSizePx(0); + style.brightnessMarginBottom = StyleManager.calcScaleSizePx(12); + style.componentBorderRadius = StyleManager.calcScaleSizePx(24); + style.componentBackgroundColor = '#99FFFFFF'; + } + // ControlCenter-Title + private static setControlCenterUpTitleStyle(): void{ + let style = ControlCenterStyleConfiguration.getControlCenterUpTitleStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(24); + style.marginRight = StyleManager.calcScaleSizePx(21); + style.fontSize = StyleManager.calcScaleSizePx(20); + style.fontColor = '#000000'; + style.imageWidth = StyleManager.calcScaleSizePx(24); + style.imageHeight = StyleManager.calcScaleSizePx(24); + style.imageHoverWidth = StyleManager.calcScaleSizePx(32); + style.imageHoverHeight = StyleManager.calcScaleSizePx(32); + style.imageHoverRadius = StyleManager.calcScaleSizePx(8); + style.imageHoverColor = 'rgba(0, 0, 0, 0.05)'; + style.imageTransparentColor = 'rgba(255, 255, 255, 0)'; + style.upTitleSpace = StyleManager.calcScaleSizePx(24); + style.titleImageColor = '#ff182431'; + } + // ControlCenter-ComplexToggleLayout + private static setControlCenterComplexToggleLayoutStyle(): void { + let style = ControlCenterStyleConfiguration.getControlCenterComplexToggleLayoutStyle(); + style.columnGap = StyleManager.calcScaleSizePx(12); + style.rowGap = StyleManager.calcScaleSize(12); + style.rowHeight = StyleManager.calcScaleSize(66); + } + // ControlCenter-SimpleToggleLayout + private static setControlCenterSimpleToggleLayoutStyle(): void{ + let style = ControlCenterStyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(11); + style.marginRight = StyleManager.calcScaleSizePx(11); + style.columnGap = StyleManager.calcScaleSizePx(0); + style.rowGap = StyleManager.calcScaleSize(0); + style.rowHeight = StyleManager.calcScaleSize(81); + } + // CommonTemplate-iconTitleBase + private static setIconTitleBaseStyle(): void{ + let style = CommonTemplateStyleConfiguration.getIconTitleBaseStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(8); + style.marginRight = StyleManager.calcScaleSizePx(4); + style.componentGap = StyleManager.calcScaleSizePx(8); + style.titleSize = StyleManager.calcScaleSizePx(12); + style.titleColor = $r('sys.color.ohos_id_color_text_secondary'), + style.borderRadius = StyleManager.calcScaleSizePx(24); + style.backgroundColor = '#99FFFFFF'; + style.textMargin = StyleManager.calcScaleSizePx(8); + style.textHoverHeight = StyleManager.calcScaleSizePx(26); + style.textHoverWidth = StyleManager.calcScaleSizePx(68); + style.textHoverRadius = StyleManager.calcScaleSizePx(4); + style.hoverColor = 'rgba(0, 0, 0, 0.05)'; + style.transparentColor = 'rgba(255, 255, 255, 0)'; + } + // CommonTemplate-iconComponent + private static setIconComponentStyle(): void { + let style = CommonTemplateStyleConfiguration.getIconComponentStyle(); + style.circleWidth = StyleManager.calcScaleSizePx(48); + style.circleHeight = StyleManager.calcScaleSizePx(48); + style.iconWidth = StyleManager.calcScaleSizePx(24); + style.iconHeight = StyleManager.calcScaleSizePx(24); + style.iconOffBG = '#1A000000'; + style.iconOnBG = '#FF007DFF'; + style.iconOnColor = '#FFFFFFFF'; + style.iconOffColor = $r('sys.color.ohos_id_color_secondary'); + style.hoverColor = 'rgba(0, 0, 0, 0.05)'; + style.transparentColor = 'rgba(255, 255, 255, 0)'; + } + // CommonTemplate-simpleToggleBase + private static setSimpleToggleBaseStyle(): void { + let style = CommonTemplateStyleConfiguration.getSimpleToggleBaseStyle(); + style.circleWidth = StyleManager.calcScaleSizePx(48); + style.circleHeight = StyleManager.calcScaleSizePx(48); + style.iconWidth = StyleManager.calcScaleSizePx(24); + style.iconHeight = StyleManager.calcScaleSizePx(24); + style.dragCircleWidth = StyleManager.calcScaleSizePx(60); + style.dragCircleHeight = StyleManager.calcScaleSizePx(60); + style.dragIconWidth = StyleManager.calcScaleSizePx(36); + style.dragIconHeight = StyleManager.calcScaleSizePx(36); + style.iconOffBG = '#1A000000'; + style.iconOnBG = '#FF007DFF'; + style.iconOnColor = '#FFFFFFFF'; + style.iconOffColor = $r('sys.color.ohos_id_color_secondary'); + style.componentGap = StyleManager.calcScaleSizePx(4); + style.titleSize = StyleManager.calcScaleSizePx(12); + style.titleColor = $r('sys.color.ohos_id_color_text_secondary'); + style.textHoverWidth = StyleManager.calcScaleSizePx(68); + style.textHoverHeight = StyleManager.calcScaleSizePx(18); + style.textHoverRadius = StyleManager.calcScaleSizePx(4); + style.hoverColor = 'rgba(0, 0, 0, 0.05)'; + style.transparentColor = 'rgba(255, 255, 255, 0)'; + } + // Brightness + private static setBrightnessComponentStyle(): void{ + let style = BrightnessStyleConfiguration.getBrightnessComponentStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(12.5); + style.marginRight = StyleManager.calcScaleSizePx(12.5); + style.componentGap = StyleManager.calcScaleSizePx(8.5); + style.brightnessIconColor = $r('sys.color.ohos_id_color_secondary'); + style.brightnessReduceWidth = StyleManager.calcScaleSizePx(22); + style.brightnessReduceHeight = StyleManager.calcScaleSizePx(22); + style.brightnessPlusWidth = StyleManager.calcScaleSizePx(22); + style.brightnessPlusHeight = StyleManager.calcScaleSizePx(22); + style.brightnessHeight = StyleManager.calcScaleSizePx(40); + style.sliderHeight = px2vp(StyleManager.calcScaleSize(20)).toString() + 'vp'; + style.sliderBlockColor = '#FFFFFFFF'; + style.sliderTrackColor = '#0D000000'; + style.sliderSelectedColor = '#FF007DFF'; + } + // RingMode + private static setControlCenterRingModeComponentStyle(): void{ + let style = RingModeStyleConfiguration.getControlCenterRingModeComponentStyle(); + style.onBgColor = '#FFFF9800'; + } + // SimpleToggleLayoutEdit + private static setSimpleToggleLayoutEditComponentStyle(): void{ + let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(0); + style.marginRight = StyleManager.calcScaleSizePx(0); + style.marginTop = StyleManager.calcScaleSizePx(0); + style.titleHeight = StyleManager.calcScaleSizePx(56); + style.titleMarginBottom = StyleManager.calcScaleSizePx(0); + style.upGridMarginTop = StyleManager.calcScaleSizePx(4); + style.upGridMarginBottom = StyleManager.calcScaleSizePx(20); + style.gridMarginLeft = StyleManager.calcScaleSizePx(21); + style.gridMarginRight = StyleManager.calcScaleSizePx(21); + style.msgMarginTop = StyleManager.calcScaleSizePx(0); + style.msgMarginBottom = StyleManager.calcScaleSizePx(4); + style.btnMarginTop = StyleManager.calcScaleSizePx(4); + style.btnMarginBottom = StyleManager.calcScaleSizePx(16); + style.borderRadius = StyleManager.calcScaleSizePx(24); + style.upAreaBgColor = '#00FFFFFF'; + style.downAreaBgColor = '#4DFFFFFF'; + style.editBtnFontColor = '#FF007DFF'; + style.editBtnFontSize = $r('sys.float.ohos_id_text_size_button1'); + style.editBtnBgColor = '#0D000000'; + style.editBtnMarginLeft = StyleManager.calcScaleSizePx(16); + style.editBtnMarginRight = StyleManager.calcScaleSizePx(16); + style.editBtnHeight = StyleManager.calcScaleSizePx(40); + style.editBtnSpace = StyleManager.calcScaleSizePx(16); + } + // SimpleToggleLayoutEdit + private static setSimpleToggleLayoutEditUpTitleStyle(): void{ + let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(24); + style.imageWidth = StyleManager.calcScaleSizePx(20); + style.imageHeight = StyleManager.calcScaleSizePx(20); + style.fontColor = '#FF000000'; + style.editTitleSpace = StyleManager.calcScaleSizePx(18); + style.titleFontSize = StyleManager.calcScaleSizePx(20); + } + // SimpleToggleLayoutEdit + private static setSimpleToggleLayoutEditOptMsgStyle(): void{ + let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); + style.fontSize = StyleManager.calcScaleSizePx(12); + style.fontColor = $r('sys.color.ohos_id_color_text_secondary'); + style.height = StyleManager.calcScaleSizePx(41); + style.marginLeftRight = StyleManager.calcScaleSizePx(30); + } + // SimpleToggleLayoutEdit-grid + private static setSimpleToggleLayoutEditGridStyle(): void{ + let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditGridStyle(); + style.columnGap = StyleManager.calcScaleSizePx(0); + style.rowGap = StyleManager.calcScaleSize(0); + style.rowHeight = StyleManager.calcScaleSize(80); + style.dragBgSize = StyleManager.calcScaleSizePx(60); + } + // EditDialog + private static setControlEditDialogStyle(): void{ + let style = ControlCenterStyleConfiguration.getControlEditDialogStyle(); + style.editDialogHeight = StyleManager.calcScaleSizePx(121); + style.editDialogWidth = StyleManager.calcScaleSizePx(374); + style.editDialogFontSize = StyleManager.calcScaleSizePx(18); + style.editDialogBtnMarginLF = StyleManager.calcScaleSizePx(13); + style.editDialogFontHeight = StyleManager.calcScaleSizePx(20); + style.editDialogBtnMarginTop = StyleManager.calcScaleSizePx(20); + style.editDialogButtonSize = StyleManager.calcScaleSizePx(18); + style.editDialogDividerHeight = StyleManager.calcScaleSizePx(20); + style.editDialogButtonHeight = StyleManager.calcScaleSizePx(30); + style.editDialogRadius = StyleManager.calcScaleSizePx(20); + style.editDialogBtnWidth = StyleManager.calcScaleSizePx(173); + style.editDialogFontMarginTop = StyleManager.calcScaleSizePx(29); + style.editDialogColor = '#FFFFFFFF'; + style.editDialogBtnFontColor = '#FF0000FF'; + style.editDialogBtnBgColor = '#00FFFFFF'; + style.editDialogDividerColor = $r('sys.color.ohos_id_color_secondary'); + style.editDialogDividerWidth = StyleManager.calcScaleSizePx(1); + Log.showDebug(TAG, 'getControlEditDialogStyle'); + } - // ControlCenter - { - let style: any = ControlCenterStyleConfiguration.getControlCenterComponentStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(20); - style.marginRight = StyleManager.calcScaleSizePx(20); - style.marginTop = StyleManager.calcScaleSizePx(0); - style.upTitleHeight = StyleManager.calcScaleSizePx(56); - style.titleMarginBottom = StyleManager.calcScaleSizePx(0); - style.toggleAreaGap = StyleManager.calcScaleSizePx(12); - style.simpleToggleLayoutMarginTop = StyleManager.calcScaleSizePx(23); - style.simpleToggleLayoutMarginBottom = StyleManager.calcScaleSizePx(0); - style.brightnessMarginBottom = StyleManager.calcScaleSizePx(12); - style.componentBorderRadius = StyleManager.calcScaleSizePx(24); - style.componentBackgroundColor = '#99FFFFFF'; - } + static number2px(n: number): string { + return n.toString() + 'px'; + } - // ControlCenter-Title - { - let style: any = ControlCenterStyleConfiguration.getControlCenterUpTitleStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(24); - style.marginRight = StyleManager.calcScaleSizePx(21); - style.fontSize = StyleManager.calcScaleSizePx(20); - style.fontColor = '#000000'; - style.imageWidth = StyleManager.calcScaleSizePx(24); - style.imageHeight = StyleManager.calcScaleSizePx(24); - style.imageHoverWidth = StyleManager.calcScaleSizePx(32); - style.imageHoverHeight = StyleManager.calcScaleSizePx(32); - style.imageHoverRadius = StyleManager.calcScaleSizePx(8); - style.imageHoverColor = 'rgba(0, 0, 0, 0.05)'; - style.imageTransparentColor = 'rgba(255, 255, 255, 0)'; - style.upTitleSpace = StyleManager.calcScaleSizePx(24); - style.titleImageColor = '#ff182431'; - } + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } - // ControlCenter-ComplexToggleLayout - { - let style: any = ControlCenterStyleConfiguration.getControlCenterComplexToggleLayoutStyle(); - style.columnGap = StyleManager.calcScaleSizePx(12); - style.rowGap = StyleManager.calcScaleSize(12); - style.rowHeight = StyleManager.calcScaleSize(66); - } - - // ControlCenter-SimpleToggleLayout - { - let style: any = ControlCenterStyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(11); - style.marginRight = StyleManager.calcScaleSizePx(11); - style.columnGap = StyleManager.calcScaleSizePx(0); - style.rowGap = StyleManager.calcScaleSize(0); - style.rowHeight = StyleManager.calcScaleSize(81); - } - - // CommonTemplate-iconTitleBase - { - let style: any = CommonTemplateStyleConfiguration.getIconTitleBaseStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(8); - style.marginRight = StyleManager.calcScaleSizePx(4); - style.componentGap = StyleManager.calcScaleSizePx(8); - style.titleSize = StyleManager.calcScaleSizePx(12); - style.titleColor = $r("sys.color.ohos_id_color_text_secondary"), - style.borderRadius = StyleManager.calcScaleSizePx(24); - style.backgroundColor = '#99FFFFFF'; - style.textMargin = StyleManager.calcScaleSizePx(8); - style.textHoverHeight = StyleManager.calcScaleSizePx(26); - style.textHoverWidth = StyleManager.calcScaleSizePx(68); - style.textHoverRadius = StyleManager.calcScaleSizePx(4); - style.hoverColor = 'rgba(0, 0, 0, 0.05)'; - style.transparentColor = 'rgba(255, 255, 255, 0)'; - } - - // CommonTemplate-iconComponent - { - let style: any = CommonTemplateStyleConfiguration.getIconComponentStyle(); - style.circleWidth = StyleManager.calcScaleSizePx(48); - style.circleHeight = StyleManager.calcScaleSizePx(48); - style.iconWidth = StyleManager.calcScaleSizePx(24); - style.iconHeight = StyleManager.calcScaleSizePx(24); - style.iconOffBG = '#1A000000'; - style.iconOnBG = '#FF007DFF'; - style.iconOnColor = '#FFFFFFFF'; - style.iconOffColor = $r("sys.color.ohos_id_color_secondary"); - style.hoverColor = 'rgba(0, 0, 0, 0.05)'; - style.transparentColor = 'rgba(255, 255, 255, 0)'; - } - - // CommonTemplate-simpleToggleBase - { - let style: any = CommonTemplateStyleConfiguration.getSimpleToggleBaseStyle(); - style.circleWidth = StyleManager.calcScaleSizePx(48); - style.circleHeight = StyleManager.calcScaleSizePx(48); - style.iconWidth = StyleManager.calcScaleSizePx(24); - style.iconHeight = StyleManager.calcScaleSizePx(24); - style.dragCircleWidth = StyleManager.calcScaleSizePx(60); - style.dragCircleHeight = StyleManager.calcScaleSizePx(60); - style.dragIconWidth = StyleManager.calcScaleSizePx(36); - style.dragIconHeight = StyleManager.calcScaleSizePx(36); - style.iconOffBG = '#1A000000'; - style.iconOnBG = '#FF007DFF'; - style.iconOnColor = '#FFFFFFFF'; - style.iconOffColor = $r("sys.color.ohos_id_color_secondary"); - style.componentGap = StyleManager.calcScaleSizePx(4); - style.titleSize = StyleManager.calcScaleSizePx(12); - style.titleColor = $r("sys.color.ohos_id_color_text_secondary"); - style.textHoverWidth = StyleManager.calcScaleSizePx(68); - style.textHoverHeight = StyleManager.calcScaleSizePx(18); - style.textHoverRadius = StyleManager.calcScaleSizePx(4); - style.hoverColor = 'rgba(0, 0, 0, 0.05)'; - style.transparentColor = 'rgba(255, 255, 255, 0)'; - } - - // Brightness - { - let style: any = BrightnessStyleConfiguration.getBrightnessComponentStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(12.5); - style.marginRight = StyleManager.calcScaleSizePx(12.5); - style.componentGap = StyleManager.calcScaleSizePx(8.5); - style.brightnessIconColor = $r("sys.color.ohos_id_color_secondary"); - style.brightnessReduceWidth = StyleManager.calcScaleSizePx(22); - style.brightnessReduceHeight = StyleManager.calcScaleSizePx(22); - style.brightnessPlusWidth = StyleManager.calcScaleSizePx(22); - style.brightnessPlusHeight = StyleManager.calcScaleSizePx(22); - style.brightnessHeight = StyleManager.calcScaleSizePx(40); - style.sliderHeight = px2vp(StyleManager.calcScaleSize(20)) + 'vp'; - style.sliderBlockColor = '#FFFFFFFF'; - style.sliderTrackColor = '#0D000000'; - style.sliderSelectedColor = '#FF007DFF'; - } - - // RingMode - { - let style: any = RingModeStyleConfiguration.getControlCenterRingModeComponentStyle(); - style.brightnessIconColor = '#FFFF9800'; - } - - // SimpleToggleLayoutEdit - { - let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(0); - style.marginRight = StyleManager.calcScaleSizePx(0); - style.marginTop = StyleManager.calcScaleSizePx(0); - style.titleHeight = StyleManager.calcScaleSizePx(56); - style.titleMarginBottom = StyleManager.calcScaleSizePx(0); - style.upGridMarginTop = StyleManager.calcScaleSizePx(4); - style.upGridMarginBottom = StyleManager.calcScaleSizePx(20); - style.gridMarginLeft = StyleManager.calcScaleSizePx(21); - style.gridMarginRight = StyleManager.calcScaleSizePx(21); - style.msgMarginTop = StyleManager.calcScaleSizePx(0); - style.msgMarginBottom = StyleManager.calcScaleSizePx(4); - style.btnMarginTop = StyleManager.calcScaleSizePx(4); - style.btnMarginBottom = StyleManager.calcScaleSizePx(16); - style.borderRadius = StyleManager.calcScaleSizePx(24); - style.upAreaBgColor = '#00FFFFFF'; - style.downAreaBgColor = '#4DFFFFFF'; - style.editBtnFontColor = '#FF007DFF'; - style.editBtnFontSize = $r("sys.float.ohos_id_text_size_button1"); - style.editBtnBgColor = '#0D000000'; - style.editBtnMarginLeft = StyleManager.calcScaleSizePx(16); - style.editBtnMarginRight = StyleManager.calcScaleSizePx(16); - style.editBtnHeight = StyleManager.calcScaleSizePx(40); - style.editBtnSpace = StyleManager.calcScaleSizePx(16); - } - - // SimpleToggleLayoutEdit-title - { - let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(24); - style.imageWidth = StyleManager.calcScaleSizePx(20); - style.imageHeight = StyleManager.calcScaleSizePx(20); - style.fontColor = '#FF000000'; - style.editTitleSpace = StyleManager.calcScaleSizePx(18); - style.titleFontSize = StyleManager.calcScaleSizePx(20); - } - - // SimpleToggleLayoutEdit-msg - { - let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); - style.fontSize = StyleManager.calcScaleSizePx(12); - style.fontColor = $r('sys.color.ohos_id_color_text_secondary'); - style.height = StyleManager.calcScaleSizePx(41); - style.marginLeftRight = StyleManager.calcScaleSizePx(30); - } - - // SimpleToggleLayoutEdit-grid - { - let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditGridStyle(); - style.columnGap = StyleManager.calcScaleSizePx(0); - style.rowGap = StyleManager.calcScaleSize(0); - style.rowHeight = StyleManager.calcScaleSize(80); - style.dragBgSize = StyleManager.calcScaleSizePx(60); - } - - // EditDialog - { - let style: any = ControlCenterStyleConfiguration.getControlEditDialogStyle(); - style.editDialogHeight = StyleManager.calcScaleSizePx(121); - style.editDialogWidth = StyleManager.calcScaleSizePx(374); - style.editDialogFontSize = StyleManager.calcScaleSizePx(18); - style.editDialogBtnMarginLF = StyleManager.calcScaleSizePx(13); - style.editDialogFontHeight = StyleManager.calcScaleSizePx(20); - style.editDialogBtnMarginTop = StyleManager.calcScaleSizePx(20); - style.editDialogButtonSize = StyleManager.calcScaleSizePx(18); - style.editDialogDividerHeight = StyleManager.calcScaleSizePx(20); - style.editDialogButtonHeight = StyleManager.calcScaleSizePx(30); - style.editDialogRadius = StyleManager.calcScaleSizePx(20); - style.editDialogBtnWidth = StyleManager.calcScaleSizePx(173); - style.editDialogFontMarginTop = StyleManager.calcScaleSizePx(29); - style.editDialogColor = '#FFFFFFFF'; - style.editDialogBtnFontColor = '#FF0000FF'; - style.editDialogBtnBgColor = '#00FFFFFF'; - style.editDialogDividerColor = $r("sys.color.ohos_id_color_secondary"); - style.editDialogDividerWidth = StyleManager.calcScaleSizePx(1); - Log.showDebug(TAG, `getControlEditDialogStyle`) - } - - } - - static number2px(n: number): string { - return n.toString() + 'px'; - } - - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } - - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/pages/common/constants.ts b/product/pc/controlpanel/src/main/ets/pages/common/constants.ts index b3ed15d1..a06d8110 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/constants.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/constants.ts @@ -14,5 +14,5 @@ */ export default class Constants { - static DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT = 5; + static readonly DEFAULT_SIMPLE_TOGGLE_COLUMN_COUNT = 5; } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index 348a61f2..0c374bd1 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -18,15 +18,15 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/AbilityManager' -import StyleConfiguration from './common/StyleConfiguration' +import StyleConfiguration, { IndexStyle } from './common/StyleConfiguration' import StyleManager from './common/StyleManager' import ControlCenterComponent from './control' import WindowManager, { WindowType, WINDOW_SHOW_HIDE_EVENT, } from "../../../../../../../common/src/main/ets/default/WindowManager"; -import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager"; -import {START_ABILITY_EVENT} from "../../../../../../../common/src/main/ets/default/event/EventUtil"; +import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/EventManager"; +import { START_ABILITY_EVENT } from "../../../../../../../common/src/main/ets/default/event/EventUtil"; import MultimodalInputManager, { MultiKeyCode, } from "../../../../../../../common/src/main/ets/default/MultimodalInputManager"; @@ -58,7 +58,7 @@ let mHeightConfigUtils @Component struct Index { @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 - @State style: any = {} + @State style: IndexStyle = new IndexStyle() @State mBackground: PixelMap | undefined = undefined; @State mBlur: number = 0; @State mOpacity: number = 0.0; diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index a0802f4c..7a1a7040 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -13,85 +13,85 @@ * limitations under the License. */ -import worker from "@ohos.worker"; -import Log from "../../../../../../../common/src/main/ets/default/log"; -import PluginDataSourceManager -from "../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager"; -import Constants, { obtainMsg } from "../../../../../../../common/src/main/ets/plugindatasource/common/constants"; +import worker from '@ohos.worker'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; +import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; -Log.showInfo(TAG, `Start.`); +Log.showInfo(TAG, 'Start.'); var sManager; parentPort.onmessage = (msg) => { - Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); - let data = msg.data; - switch (data.action) { - case Constants.INIT_CONFIG: - initConfig(data.data); - break; - case Constants.CLEAR_ALL: - clearAll(); - break; - case Constants.LOAD_DATA: - loadData(data.data); - break; - case Constants.UPDATE_PLUGIN_COMPONENT_DATA: - updatePluginComponentData(data.data); - break; - default: - Log.showError(TAG, `onMessage, unknown action type.`); - } + Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); + let data = msg.data; + switch (data.action) { + case Constants.INIT_CONFIG: + initConfig(data.data); + break; + case Constants.CLEAR_ALL: + clearAll(); + break; + case Constants.LOAD_DATA: + loadData(data.data); + break; + case Constants.UPDATE_PLUGIN_COMPONENT_DATA: + updatePluginComponentData(data.data); + break; + default: + Log.showError(TAG, 'onMessage, unknown action type.'); + } }; function initConfig(config) { - Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); - sManager = new PluginDataSourceManager({ - onItemAdd: (itemData) => { - Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); - itemData.label && (itemData.label = encodeURIComponent(itemData.label)); - parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); - }, - onItemRemove: (itemData) => { - Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); - parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); - }, - onLoadPluginComponentData: (itemData) => { - Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); - parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); - }, - }); - sManager.initDataSource(config); - parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); + Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); + sManager = new PluginDataSourceManager({ + onItemAdd: (itemData) => { + Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); + itemData.label && (itemData.label = encodeURIComponent(itemData.label)); + parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); + }, + onItemRemove: (itemData) => { + Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); + }, + onLoadPluginComponentData: (itemData) => { + Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); + }, + }); + sManager.initDataSource(config); + parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); } function clearAll() { - Log.showDebug(TAG, `clearAll `); - sManager?.clearAll(); + Log.showDebug(TAG, 'clearAll '); + sManager?.clearAll(); } function loadData(userId) { - Log.showDebug(TAG, `loadData `); - sManager?.loadData(userId); + Log.showDebug(TAG, 'loadData '); + sManager?.loadData(userId); } function updatePluginComponentData(pluginComponentData) { - Log.showDebug(TAG, 'updatePluginComponentData '); - sManager?.updatePluginComponentData(pluginComponentData); + Log.showDebug(TAG, 'updatePluginComponentData '); + sManager?.updatePluginComponentData(pluginComponentData); } parentPort.onclose = function () { - Log.showDebug(TAG, `onclose`); + Log.showDebug(TAG, 'onclose'); }; parentPort.onmessageerror = function () { - Log.showError(TAG, `onmessageerror`); + Log.showError(TAG, 'onmessageerror'); }; parentPort.onerror = function (data) { - Log.showError(TAG, - `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` - ); + Log.showError( + TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + ); }; \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts b/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts index 38c5cf94..85c3869b 100644 --- a/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/notificationpanel/src/main/ets/Application/AbilityStage.ts @@ -12,12 +12,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../../common/src/main/ets/default/log' +import AbilityStage from '@ohos.application.AbilityStage'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'NotificationPanel_AbilityStage'; -const TAG = "NotificationPanel_AbilityStage" export default class MainAbilityStage extends AbilityStage { - onCreate() { - Log.showInfo(TAG, "onCreate") - } + onCreate(): void { + Log.showInfo(TAG, 'onCreate'); + } } \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 44ba4ab0..dd91590d 100644 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,19 +13,17 @@ * limitations under the License. */ -import ServiceExtension from "@ohos.application.ServiceExtensionAbility"; -import display from "@ohos.display"; -import Log from "../../../../../../../common/src/main/ets/default/Log"; -import WindowManager, { - WindowType -} from "../../../../../../../common/src/main/ets/default/WindowManager"; -import AbilityManager from "../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager"; +import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import Want from '@ohos.application.Want'; +import display from '@ohos.display'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -const TAG = "NotificationPanel_ServiceExtAbility"; +const TAG = 'NotificationPanel_ServiceExtAbility'; class ServiceExtAbility extends ServiceExtension { - - async onCreate(want) { + async onCreate(want: Want): Promise { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, this.context); globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT] = want; @@ -38,14 +36,16 @@ class ServiceExtAbility extends ServiceExtension { width: (402 * dis.width) / 1280, height: (381 * dis.width) / 1280, }; - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, "rect", rect); - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, "dis", { + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'rect', rect); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'dis', { width: dis.width, height: dis.height, }); - WindowManager.createWindow(this.context, WindowType.NOTIFICATION_PANEL, rect, "pages/index").then(() => { - Log.showInfo(TAG, `onCreate, createWindow callback`); + WindowManager.createWindow(this.context, WindowType.NOTIFICATION_PANEL, rect, 'pages/index').then(() => { + Log.showInfo(TAG, 'onCreate, createWindow callback'); + }).catch(err => { + Log.showError(TAG, `Can't create window, err:${JSON.stringify(err)}`); }); AbilityManager.setContext(AbilityManager.ABILITY_NAME_BANNER_NOTICE, this.context); @@ -54,17 +54,17 @@ class ServiceExtAbility extends ServiceExtension { top: 44 * dis.width / 1280, width: 402 * dis.width / 1280, height: 100 * dis.width / 1280 - } + }; AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); WindowManager.createWindow(this.context, WindowType.BANNER_NOTICE, bannerRect, 'pages/bannerNotification') .then((win) => { - Log.showInfo(TAG, `onCreate, createWindow callback`); + Log.showInfo(TAG, 'onCreate, createWindow callback'); }) - .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); + .catch((err) => Log.showError(TAG, `Can't create window, err:${JSON.stringify(err)}`)); } - onDestroy() { - Log.showInfo(TAG, "onDestroy"); + onDestroy(): void { + Log.showInfo(TAG, 'onDestroy'); } } diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts index ad56a49e..8bd91be7 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -17,13 +17,15 @@ import StyleManager from '../../../../../../../../common/src/main/ets/default/st const TAG = 'NotificationPanel-StyleConfiguration'; +export class IndexStyle { + borderRadius: Length = $r('app.float.default_border_radius'); +} + export default class StyleConfiguration { - static getIndexStyle() { - const key: string = TAG + "-Index"; - return StyleManager.getStyle(key, () => { - return { - borderRadius: $r('app.float.default_border_radius') - }; - }); - } + static getIndexStyle(): IndexStyle { + const key: string = TAG + '-Index'; + return StyleManager.getStyle(key, () => { + return new IndexStyle(); + }); + } } \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts b/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts index ba6ca818..ce129810 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts @@ -15,38 +15,38 @@ import Log from '../../../../../../../../common/src/main/ets/default/log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; -import IndexStyleConfiguration from './styleconfiguration' +import IndexStyleConfiguration from './styleconfiguration'; const TAG = 'NotificationPanel-StyleManager'; export default class StyleManager { - static STANDARD_DISPLAY_WIDTH: number = 1280; - static STANDARD_DISPLAY_HEIGHT: number = 800; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + static readonly STANDARD_DISPLAY_WIDTH = 1280; + static readonly STANDARD_DISPLAY_HEIGHT = 800; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - static setStyle() { - Log.showDebug(TAG, `setStyle`) + static setStyle(): void { + Log.showDebug(TAG, 'setStyle'); - let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'dis'); - StyleManager.maxWidth = dis.width; - - // Index - { - let style: any = IndexStyleConfiguration.getIndexStyle(); - style.borderRadius = StyleManager.calcScaleSizePx(24); - } + let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'dis'); + StyleManager.maxWidth = dis.width; + // Index + { + let style = IndexStyleConfiguration.getIndexStyle(); + style.borderRadius = StyleManager.calcScaleSizePx(24); } - static number2px(n: number): string { - return n.toString() + 'px'; - } + } - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } + static number2px(n: number): string { + return n.toString() + 'px'; + } - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } } \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/constants.ts b/product/pc/notificationpanel/src/main/ets/pages/common/constants.ts index 80a45419..96d4cab4 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/common/constants.ts +++ b/product/pc/notificationpanel/src/main/ets/pages/common/constants.ts @@ -14,8 +14,8 @@ */ export default class Constants { - static DIGITS = 10; - static MARK_MONTH = 0; - static MARK_DAY = 1; - static QUICKLY_SETTING_H = 83; + static readonly DIGITS = 10; + static readonly MARK_MONTH = 0; + static readonly MARK_DAY = 1; + static readonly QUICKLY_SETTING_H = 83; } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts b/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts index 4d550466..ff108a0c 100644 --- a/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts +++ b/product/pc/statusbar/src/main/ets/Application/AbilityStage.ts @@ -12,12 +12,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../../common/src/main/ets/default/log' +import AbilityStage from '@ohos.application.AbilityStage'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'StatusBar_AbilityStage'; -const TAG = "StatusBar_AbilityStage" export default class MainAbilityStage extends AbilityStage { - onCreate() { - Log.showInfo(TAG, "onCreate") - } + onCreate(): void { + Log.showInfo(TAG, 'onCreate'); + } } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 74ca01e2..91504baa 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,51 +13,54 @@ * limitations under the License. */ -import ServiceExtension from "@ohos.application.ServiceExtensionAbility"; -import Log from "../../../../../../../common/src/main/ets/default/Log"; -import WindowManager, { WindowType } from "../../../../../../../common/src/main/ets/default/WindowManager"; -import AbilityManager from "../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager"; -import StatusBarConfiguration from "../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration"; +import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import StatusBarConfiguration from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; import StatusBarConstants from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; +import { Want } from 'ability/want'; -const TAG = "StatusBar_ServiceExtAbility"; +const TAG = 'StatusBar_ServiceExtAbility'; class ServiceExtAbility extends ServiceExtension { - async onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context); - globalThis[StatusBarConstants.PLUGIN_COMPONENT_OWNER_WANT_KEY] = want; - let configInfo = await StatusBarConfiguration.getConfiguration(); - if (configInfo.showHorizontal) { - configInfo.realHeight = (configInfo.realHeight * configInfo.maxWidth) / 1280; - configInfo.minHeight = configInfo.realHeight; - if (configInfo.yCoordinate > 0) { - configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; - } - } else { - configInfo.realWidth = (configInfo.realWidth * configInfo.maxWidth) / 1280; - configInfo.minHeight = configInfo.realWidth; - if (configInfo.xCoordinate > 0) { - configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth; - } - } - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, "config", configInfo); - Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); - - let statusBarRect = { - left: configInfo.xCoordinate, - top: configInfo.yCoordinate, - width: configInfo.realWidth, - height: configInfo.realHeight, - }; - WindowManager.createWindow(this.context, WindowType.STATUS_BAR, statusBarRect, "pages/index").then(() => - WindowManager.showWindow(WindowType.STATUS_BAR) - ); + async onCreate(want: Want): Promise { + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context); + globalThis[StatusBarConstants.PLUGIN_COMPONENT_OWNER_WANT_KEY] = want; + let configInfo = await StatusBarConfiguration.getConfiguration(); + if (configInfo.showHorizontal) { + configInfo.realHeight = (configInfo.realHeight * configInfo.maxWidth) / 1280; + configInfo.minHeight = configInfo.realHeight; + if (configInfo.yCoordinate > 0) { + configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; + } + } else { + configInfo.realWidth = (configInfo.realWidth * configInfo.maxWidth) / 1280; + configInfo.minHeight = configInfo.realWidth; + if (configInfo.xCoordinate > 0) { + configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth; + } } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo); + Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); - onDestroy() { - Log.showInfo(TAG, "onDestroy"); - } + let statusBarRect = { + left: configInfo.xCoordinate, + top: configInfo.yCoordinate, + width: configInfo.realWidth, + height: configInfo.realHeight, + }; + WindowManager.createWindow(this.context, WindowType.STATUS_BAR, statusBarRect, 'pages/index').then(async () => + WindowManager.showWindow(WindowType.STATUS_BAR) + ).then(() => { + }).catch((err) => { + }); + } + + onDestroy(): void { + Log.showInfo(TAG, 'onDestroy'); + } } export default ServiceExtAbility; diff --git a/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts b/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts index 208fd147..2baf10c4 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StatusbarConfig.ts @@ -12,25 +12,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/constants'; +import { FASlotName } from '../../../../../../../../common/src/main/ets/default/constants'; +import { StatusBarConfig +} from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; -type LayoutGroup = { - id: number; - Components: Array; -}; -type pluginIconData = { - id: string; - bundleName: string; - abilityName: string; -}; -type Config = { - LayoutGroups: Array; - LocalSlots: Array; - MetaSlots: Array; - emptyPosition: { x1: number; x2: number; y1: number; y2: number }; -}; - -const StatusbarConfig: Config = { +const statusbarConfig: StatusBarConfig = { LayoutGroups: [ { id: 1, @@ -53,8 +39,8 @@ const StatusbarConfig: Config = { FASlotName.RING_MODE, FASlotName.BATTERY, FASlotName.CLOCK, - "systemui_notificationpanel", - "systemui_controlpanel", + 'systemui_notificationpanel', + 'systemui_controlpanel', ], }, ], @@ -71,14 +57,14 @@ const StatusbarConfig: Config = { ], MetaSlots: [ { - id: "systemui_notificationpanel", - bundleName: "com.ohos.systemui", - abilityName: "com.ohos.systemui.notificationpanel.ServiceExtAbility", + id: 'systemui_notificationpanel', + bundleName: 'com.ohos.systemui', + abilityName: 'com.ohos.systemui.notificationpanel.ServiceExtAbility', }, { - id: "systemui_controlpanel", - bundleName: "com.ohos.systemui", - abilityName: "com.ohos.systemui.controlpanel.ServiceExtAbility", + id: 'systemui_controlpanel', + bundleName: 'com.ohos.systemui', + abilityName: 'com.ohos.systemui.controlpanel.ServiceExtAbility', }, ], emptyPosition: { @@ -89,4 +75,4 @@ const StatusbarConfig: Config = { }, }; -export default StatusbarConfig; \ No newline at end of file +export default statusbarConfig; \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts index 176b293b..9d7a6ec5 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts @@ -17,11 +17,14 @@ import StyleManager from '../../../../../../../../common/src/main/ets/default/st const TAG = 'StatusBar-StyleConfiguration'; +export class IndexStyle { +} + export default class StyleConfiguration { - static getIndexStyle() { - const key: string = TAG + "-Index"; - return StyleManager.getStyle(key, () => { - return {}; - }); - } + static getIndexStyle(): IndexStyle { + const key: string = TAG + '-Index'; + return StyleManager.getStyle(key, () => { + return new IndexStyle(); + }); + } } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts index 79c61e9a..e071e068 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -16,159 +16,177 @@ import Log from '../../../../../../../../common/src/main/ets/default/log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import CommonStyleConfiguration from '../../../../../../../../common/src/main/ets/default/styleconfiguration'; -import StatusBarStyleConfiguration from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/styleconfiguration' -import BatteryStyleConfiguration from '../../../../../../../../features/batterycomponent/src/main/ets/default/common/styleconfiguration' -import ClockStyleConfiguration from '../../../../../../../../features/clockcomponent/src/main/ets/default/common/styleconfiguration' -import WifiStyleConfiguration from '../../../../../../../../features/wificomponent/src/main/ets/default/common/styleconfiguration' -import BluetoothStyleConfiguration from '../../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/common/styleconfiguration' -import SignalStyleConfiguration from '../../../../../../../../features/signalcomponent/src/main/ets/default/common/styleconfiguration' -import CapsuleStyleConfiguration from '../../../../../../../../features/capsulecomponent/src/main/ets/default/common/styleconfiguration' -import LocationStyleConfiguration from '../../../../../../../../features/locationcomponent/src/main/ets/com/ohos/common/styleconfiguration' -import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/styleconfiguration' -import IndexStyleConfiguration from './styleconfiguration' +import StatusBarStyleConfiguration from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/styleconfiguration'; +import BatteryStyleConfiguration from '../../../../../../../../features/batterycomponent/src/main/ets/default/common/styleconfiguration'; +import ClockStyleConfiguration from '../../../../../../../../features/clockcomponent/src/main/ets/default/common/styleconfiguration'; +import WifiStyleConfiguration from '../../../../../../../../features/wificomponent/src/main/ets/default/common/styleconfiguration'; +import BluetoothStyleConfiguration from '../../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/common/styleconfiguration'; +import SignalStyleConfiguration from '../../../../../../../../features/signalcomponent/src/main/ets/default/common/styleconfiguration'; +import CapsuleStyleConfiguration from '../../../../../../../../features/capsulecomponent/src/main/ets/default/common/styleconfiguration'; +import LocationStyleConfiguration from '../../../../../../../../features/locationcomponent/src/main/ets/com/ohos/common/styleconfiguration'; +import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/styleconfiguration'; const TAG = './styleconfigurationer'; export default class StyleManager { - static STANDARD_DISPLAY_WIDTH: number = 1280; - static STANDARD_DISPLAY_HEIGHT: number = 800; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - - static setStyle() { - Log.showDebug(TAG, `setStyle`) - - let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); - StyleManager.maxWidth = config.maxWidth; - - // Common - { - let style: any = CommonStyleConfiguration.getCommonStyle(); - style.statusBarFontSize = StyleManager.calcScaleSizePx(14); - style.statusBarIconWidth = StyleManager.calcScaleSizePx(20); - style.statusBarIconHeight = StyleManager.calcScaleSizePx(20); - style.statusBarMarginLeftRight = StyleManager.calcScaleSizePx(10); - } - - // StatusBar-VerticalStatusBarItemLoadComponent - { - let style: any = StatusBarStyleConfiguration.getVerticalStatusBarItemLoadComponentStyle(); - style.statusBarVerticalComponentHeight = StyleManager.calcScaleSize(64); - } - - // StatusBar-NotificationIcon - { - let style: any = StatusBarStyleConfiguration.getStatusBarNotificationIconStyle(); - style.iconWidth = StyleManager.calcScaleSizePx(16); - style.iconHeight = StyleManager.calcScaleSizePx(16); - style.iconSpace = StyleManager.calcScaleSizePx(6); - } - - // StatusBar-IconComponent - { - let style: any = StatusBarStyleConfiguration.getIconItemComponentStyle(); - style.stackHeight = StyleManager.calcScaleSizePx(8 * 2 + 18); - style.stackPadding = StyleManager.calcScaleSizePx(8); - style.stackBorderRadius = StyleManager.calcScaleSizePx(8); - style.stackBgColorSelected = '#33000000'; - style.stackBgColorUnSelected = '#00000000'; - style.componentSpace = StyleManager.calcScaleSizePx(8); - style.iconWidth = StyleManager.calcScaleSizePx(18); - style.iconHeight = StyleManager.calcScaleSizePx(18); - style.marginLeft = StyleManager.calcScaleSizePx(4); - style.marginRight = StyleManager.calcScaleSizePx(4); - } - - // Clock - { - let style: any = ClockStyleConfiguration.getClockComponentStyle(); - style.statusBarClockMaxWidth = StyleManager.calcScaleSizePx(37); - } - - // Battery-Icon - { - let style: any = BatteryStyleConfiguration.getBatteryComponentStyle(); - style.componentGap = StyleManager.calcScaleSizePx(6); - } - - // Battery-Pic - { - let style: any = BatteryStyleConfiguration.getBatteryPicStyle(); - style.picGap = StyleManager.calcScaleSizePx(1); - style.picBodyWidth = StyleManager.calcScaleSizePx(18.75); - style.picBodyHeight = StyleManager.calcScaleSizePx(10.83); - style.picBodyPadding = StyleManager.calcScaleSizePx(1); - style.picBodyBorderWidth = StyleManager.calcScaleSizePx(1); - style.picBorderRadius = StyleManager.calcScaleSizePx(2); - style.picHeadBorderRadius = StyleManager.calcScaleSizePx(1); - style.picChargingColor = '#00ff21'; - style.picLevelLowColor = '#ff0000'; - style.picHeadWidth = StyleManager.calcScaleSizePx(1.5); - style.picHeadHeight = StyleManager.calcScaleSizePx(5); - } - - // Signal-Icon - { - let style: any = SignalStyleConfiguration.getSignalComponentStyle(); - style.cellularImageWidth = StyleManager.calcScaleSizePx(25); - style.cellularImageHeight = StyleManager.calcScaleSizePx(20); - style.statusBarSignalTypeFontSize = StyleManager.calcScaleSizePx(7); - style.statusBarSignalUnknownFontSize = StyleManager.calcScaleSizePx(12); - style.signalTextMaxWeight = StyleManager.calcScaleSizePx(100); - style.netSignalTextMaxWidth = StyleManager.calcScaleSizePx(18); - } - - // Bluetooth -Icon - { - let style: any = BluetoothStyleConfiguration.getStatusBarBluetoothComponentStyle(); - style.staticBarBluetoothWidth = StyleManager.calcScaleSizePx(18); - style.staticBarBluetoothHeight = StyleManager.calcScaleSizePx(20); - } - - // Location-Icon - { - let style: any = LocationStyleConfiguration.getStartsBarLocationComponentStyle(); - style.statusBarLocationWidth = StyleManager.calcScaleSizePx(18); - style.statusBarLocationHeight = StyleManager.calcScaleSizePx(20); - } - - // RingMode-Icon - { - let style: any = RingModeStyleConfiguration.getStatusRingModeComponentStyle(); - style.statusBarRingModeWidth = StyleManager.calcScaleSizePx(20); - style.statusBarRingModeHeight = StyleManager.calcScaleSizePx(20); - } - - // Wifi-Icon - { - let style: any = WifiStyleConfiguration.getStartsBarWifiComponentStyle(); - style.statusBarWifiWidth = StyleManager.calcScaleSizePx(20); - style.statusBarWifiHeight = StyleManager.calcScaleSizePx(20); - } - - // Capsule-Icon - { - let style: any = CapsuleStyleConfiguration.getCapsuleComponentStyle(); - style.greenCapsulePhoneWidth = StyleManager.calcScaleSizePx(15); - style.greenCapsulePhoneHeight = StyleManager.calcScaleSizePx(15); - style.greenCapsuleHeight = StyleManager.calcScaleSizePx(30); - style.greenCapsuleTextColor = '#CCFFFFFF'; - style.greenCapsuleTextMarginLeftRight = StyleManager.calcScaleSizePx(10); - style.greenCapsuleRadius = StyleManager.calcScaleSizePx(24); - style.greenCapsuleBackgroundColor = '#64BB5C'; - style.maxLines = 1; - } - - } - - static number2px(n: number): string { - return n.toString() + 'px'; - } - - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } - - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } + static readonly STANDARD_DISPLAY_WIDTH = 1280; + static readonly STANDARD_DISPLAY_HEIGHT = 800; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + + static setStyle(): void { + Log.showDebug(TAG, 'setStyle'); + + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); + StyleManager.maxWidth = config.maxWidth; + + StyleManager.setCommonStyle(); + StyleManager.setVerticalStatusBarItemLoadComponentStyle(); + StyleManager.setStatusBarNotificationIconStyle(); + StyleManager.setIconItemComponentStyle(); + StyleManager.setPluginIconItemComponentStyle(); + StyleManager.setClockComponentStyle(); + StyleManager.setBatteryComponentStyle(); + StyleManager.setBatteryPicStyle(); + StyleManager.setSignalComponentStyle(); + StyleManager.setStatusBarBluetoothComponentStyle(); + StyleManager.setStartsBarLocationComponentStyle(); + StyleManager.setStatusRingModeComponentStyle(); + StyleManager.setStartsBarWifiComponentStyle(); + StyleManager.setCapsuleComponentStyle(); + } + // Common + private static setCommonStyle(): void { + let style = CommonStyleConfiguration.getCommonStyle(); + style.statusBarFontSize = StyleManager.calcScaleSizePx(14); + style.statusBarIconWidth = StyleManager.calcScaleSizePx(20); + style.statusBarIconHeight = StyleManager.calcScaleSizePx(20); + style.statusBarMarginLeftRight = StyleManager.calcScaleSizePx(10); + } + + // StatusBar-VerticalStatusBarItemLoadComponent + private static setVerticalStatusBarItemLoadComponentStyle(): void { + let style = StatusBarStyleConfiguration.getVerticalStatusBarItemLoadComponentStyle(); + style.statusBarVerticalComponentHeight = StyleManager.calcScaleSize(64); + } + + // StatusBar-NotificationIcon + private static setStatusBarNotificationIconStyle(): void { + let style = StatusBarStyleConfiguration.getStatusBarNotificationIconStyle(); + style.iconWidth = StyleManager.calcScaleSizePx(16); + style.iconHeight = StyleManager.calcScaleSizePx(16); + style.iconSpace = StyleManager.calcScaleSizePx(6); + } + + // StatusBar-IconComponent + private static setIconItemComponentStyle(): void { + let style = StatusBarStyleConfiguration.getIconItemComponentStyle(); + style.stackHeight = StyleManager.calcScaleSizePx(8 * 2 + 18); + style.stackPadding = StyleManager.calcScaleSizePx(8); + style.stackBorderRadius = StyleManager.calcScaleSizePx(8); + style.stackBgColorSelected = '#33000000'; + style.stackBgColorUnSelected = '#00000000'; + style.componentSpace = StyleManager.calcScaleSizePx(8); + style.iconWidth = StyleManager.calcScaleSizePx(18); + style.iconHeight = StyleManager.calcScaleSizePx(18); + style.marginLeft = StyleManager.calcScaleSizePx(4); + style.marginRight = StyleManager.calcScaleSizePx(4); + } + + // StatusBar-PluginIconItemComponent + private static setPluginIconItemComponentStyle(): void { + let style = StatusBarStyleConfiguration.getPluginIconItemComponentStyle(); + style.iconWidth = StyleManager.calcScaleSize(32); + } + + // Clock + private static setClockComponentStyle(): void { + let style = ClockStyleConfiguration.getClockComponentStyle(); + style.statusBarClockMaxWidth = StyleManager.calcScaleSizePx(37); + } + + // Battery-Icon + private static setBatteryComponentStyle(): void { + let style = BatteryStyleConfiguration.getBatteryComponentStyle(); + style.componentGap = StyleManager.calcScaleSizePx(6); + } + + // Battery-Pic + private static setBatteryPicStyle(): void { + let style = BatteryStyleConfiguration.getBatteryPicStyle(); + style.picGap = StyleManager.calcScaleSizePx(1); + style.picBodyWidth = StyleManager.calcScaleSizePx(18.75); + style.picBodyHeight = StyleManager.calcScaleSizePx(10.83); + style.picBodyPadding = StyleManager.calcScaleSizePx(1); + style.picBodyBorderWidth = StyleManager.calcScaleSizePx(1); + style.picBorderRadius = StyleManager.calcScaleSizePx(2); + style.picHeadBorderRadius = StyleManager.calcScaleSizePx(1); + style.picChargingColor = '#00ff21'; + style.picLevelLowColor = '#ff0000'; + style.picHeadWidth = StyleManager.calcScaleSizePx(1.5); + style.picHeadHeight = StyleManager.calcScaleSizePx(5); + } + + // Signal-Icon + private static setSignalComponentStyle(): void { + let style = SignalStyleConfiguration.getSignalComponentStyle(); + style.cellularImageWidth = StyleManager.calcScaleSizePx(25); + style.cellularImageHeight = StyleManager.calcScaleSizePx(20); + style.statusBarSignalTypeFontSize = StyleManager.calcScaleSizePx(7); + style.statusBarSignalUnknownFontSize = StyleManager.calcScaleSizePx(12); + style.signalTextMaxWeight = StyleManager.calcScaleSizePx(100); + style.netSignalTextMaxWidth = StyleManager.calcScaleSizePx(18); + } + + // Bluetooth -Icon + private static setStatusBarBluetoothComponentStyle(): void { + let style = BluetoothStyleConfiguration.getStatusBarBluetoothComponentStyle(); + style.staticBarBluetoothWidth = StyleManager.calcScaleSizePx(18); + style.staticBarBluetoothHeight = StyleManager.calcScaleSizePx(20); + } + + // Location-Icon + private static setStartsBarLocationComponentStyle(): void { + let style = LocationStyleConfiguration.getStartsBarLocationComponentStyle(); + style.statusBarLocationWidth = StyleManager.calcScaleSizePx(18); + style.statusBarLocationHeight = StyleManager.calcScaleSizePx(20); + } + + // RingMode-Icon + private static setStatusRingModeComponentStyle(): void { + let style = RingModeStyleConfiguration.getStatusRingModeComponentStyle(); + style.statusBarRingModeWidth = StyleManager.calcScaleSizePx(20); + style.statusBarRingModeHeight = StyleManager.calcScaleSizePx(20); + } + + // Wifi-Icon + private static setStartsBarWifiComponentStyle(): void { + let style = WifiStyleConfiguration.getStartsBarWifiComponentStyle(); + style.statusBarWifiWidth = StyleManager.calcScaleSizePx(20); + style.statusBarWifiHeight = StyleManager.calcScaleSizePx(20); + } + + // Capsule-Icon + private static setCapsuleComponentStyle(): void { + let style = CapsuleStyleConfiguration.getCapsuleComponentStyle(); + style.greenCapsulePhoneWidth = StyleManager.calcScaleSizePx(15); + style.greenCapsulePhoneHeight = StyleManager.calcScaleSizePx(15); + style.greenCapsuleHeight = StyleManager.calcScaleSizePx(30); + style.greenCapsuleTextColor = '#CCFFFFFF'; + style.greenCapsuleTextMarginLeftRight = StyleManager.calcScaleSizePx(10); + style.greenCapsuleRadius = StyleManager.calcScaleSizePx(24); + style.greenCapsuleBackgroundColor = '#64BB5C'; + style.maxLines = 1; + } + + static number2px(n: number): string { + return n.toString() + 'px'; + } + + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index a0802f4c..7a1a7040 100644 --- a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -13,85 +13,85 @@ * limitations under the License. */ -import worker from "@ohos.worker"; -import Log from "../../../../../../../common/src/main/ets/default/log"; -import PluginDataSourceManager -from "../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager"; -import Constants, { obtainMsg } from "../../../../../../../common/src/main/ets/plugindatasource/common/constants"; +import worker from '@ohos.worker'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; +import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; -Log.showInfo(TAG, `Start.`); +Log.showInfo(TAG, 'Start.'); var sManager; parentPort.onmessage = (msg) => { - Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); - let data = msg.data; - switch (data.action) { - case Constants.INIT_CONFIG: - initConfig(data.data); - break; - case Constants.CLEAR_ALL: - clearAll(); - break; - case Constants.LOAD_DATA: - loadData(data.data); - break; - case Constants.UPDATE_PLUGIN_COMPONENT_DATA: - updatePluginComponentData(data.data); - break; - default: - Log.showError(TAG, `onMessage, unknown action type.`); - } + Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); + let data = msg.data; + switch (data.action) { + case Constants.INIT_CONFIG: + initConfig(data.data); + break; + case Constants.CLEAR_ALL: + clearAll(); + break; + case Constants.LOAD_DATA: + loadData(data.data); + break; + case Constants.UPDATE_PLUGIN_COMPONENT_DATA: + updatePluginComponentData(data.data); + break; + default: + Log.showError(TAG, 'onMessage, unknown action type.'); + } }; function initConfig(config) { - Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); - sManager = new PluginDataSourceManager({ - onItemAdd: (itemData) => { - Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); - itemData.label && (itemData.label = encodeURIComponent(itemData.label)); - parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); - }, - onItemRemove: (itemData) => { - Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); - parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); - }, - onLoadPluginComponentData: (itemData) => { - Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); - parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); - }, - }); - sManager.initDataSource(config); - parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); + Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); + sManager = new PluginDataSourceManager({ + onItemAdd: (itemData) => { + Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); + itemData.label && (itemData.label = encodeURIComponent(itemData.label)); + parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); + }, + onItemRemove: (itemData) => { + Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); + }, + onLoadPluginComponentData: (itemData) => { + Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); + }, + }); + sManager.initDataSource(config); + parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); } function clearAll() { - Log.showDebug(TAG, `clearAll `); - sManager?.clearAll(); + Log.showDebug(TAG, 'clearAll '); + sManager?.clearAll(); } function loadData(userId) { - Log.showDebug(TAG, `loadData `); - sManager?.loadData(userId); + Log.showDebug(TAG, 'loadData '); + sManager?.loadData(userId); } function updatePluginComponentData(pluginComponentData) { - Log.showDebug(TAG, 'updatePluginComponentData '); - sManager?.updatePluginComponentData(pluginComponentData); + Log.showDebug(TAG, 'updatePluginComponentData '); + sManager?.updatePluginComponentData(pluginComponentData); } parentPort.onclose = function () { - Log.showDebug(TAG, `onclose`); + Log.showDebug(TAG, 'onclose'); }; parentPort.onmessageerror = function () { - Log.showError(TAG, `onmessageerror`); + Log.showError(TAG, 'onmessageerror'); }; parentPort.onerror = function (data) { - Log.showError(TAG, - `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` - ); + Log.showError( + TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + ); }; \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts b/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts index 20bb96f4..8820fd7f 100644 --- a/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts +++ b/product/phone/dropdownpanel/src/main/ets/Application/AbilityStage.ts @@ -12,12 +12,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../../common/src/main/ets/default/log' +import AbilityStage from '@ohos.application.AbilityStage'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'DropdownPanel_AbilityStage'; -const TAG = "DropdownPanel_AbilityStage" export default class MainAbilityStage extends AbilityStage { - onCreate() { - Log.showInfo(TAG, "onCreate") - } + onCreate(): void { + Log.showInfo(TAG, 'onCreate'); + } } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 4f3189cc..2d8e3476 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,52 +13,57 @@ * limitations under the License. */ -import ServiceExtension from "@ohos.application.ServiceExtensionAbility"; -import display from "@ohos.display"; -import Log from "../../../../../../../common/src/main/ets/default/Log"; -import WindowManager, { WindowType } from "../../../../../../../common/src/main/ets/default/WindowManager"; -import AbilityManager from "../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager"; +import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import display from '@ohos.display'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import { Want } from 'ability/want'; -const TAG = "DropdownPanel_ServiceExtAbility"; +const TAG = 'DropdownPanel_ServiceExtAbility'; class ServiceExtAbility extends ServiceExtension { - async onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, this.context); - globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT] = want; + async onCreate(want: Want): Promise { + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, this.context); + globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT] = want; - display.getDefaultDisplay().then((dis) => { - let rect = { - left: 0, - top: 0, - width: dis.width, - height: dis.height, - }; - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, "rect", rect); - WindowManager.createWindow(this.context, WindowType.DROPDOWN_PANEL, rect, "pages/index").then(() => - Log.showInfo(TAG, `onCreate, createWindow callback`) - ); + display.getDefaultDisplay().then((dis) => { + let rect = { + left: 0, + top: 0, + width: dis.width, + height: dis.height, + }; + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect', rect); + WindowManager.createWindow(this.context, WindowType.DROPDOWN_PANEL, rect, 'pages/index').then(() => + Log.showInfo(TAG, 'onCreate, createWindow callback') + ).then(() => { + }).catch((err) => { + }); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_BANNER_NOTICE, this.context); - let bannerRect = { - left: 0, - top: dis.height / 5, - width: dis.width, - height: dis.height / 20 - } - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); - WindowManager.createWindow(this.context, WindowType.BANNER_NOTICE, bannerRect, 'pages/bannerNotification') - .then((win) => { - Log.showInfo(TAG, `onCreate, createWindow callback`); - }) - .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); - }); - } + AbilityManager.setContext(AbilityManager.ABILITY_NAME_BANNER_NOTICE, this.context); + let bannerRect = { + left: 0, + top: dis.height / 5, + width: dis.width, + height: dis.height / 20 + }; + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'bannerRect', bannerRect); + WindowManager.createWindow(this.context, WindowType.BANNER_NOTICE, bannerRect, 'pages/bannerNotification') + .then((win) => { + Log.showInfo(TAG, 'onCreate, createWindow callback'); + }) + .catch((err) => Log.showError(TAG, `Can't create window, err:${JSON.stringify(err)}`)); + }).then(() => { + }).catch((err) => { + }); + } - onDestroy() { - Log.showInfo(TAG, "onDestroy"); - } + onDestroy(): void { + Log.showInfo(TAG, 'onDestroy'); + } } export default ServiceExtAbility; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts index b7600690..7d711c7b 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts @@ -12,37 +12,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; +import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; +import { ControlCenterConfig +} from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/Constants'; -type pluginIconData = { - id: string; - bundleName: string; - abilityName: string; -}; -type Config = { - ComplexToggleLayout: Array; - DefaultSimpleToggleLayout: Array; - LocalToggles: { - ComplexToggles: Array; - SimpleToggles: Array; - }; - MetaToggles: Array; -}; - -const ControlCenterConfig: Config = { +const controlCenterConfig: ControlCenterConfig = { ComplexToggleLayout: [FASlotName.WIFI, FASlotName.BLUETOOTH], - DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION], + DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION, 'demosystemuicplmeta'], LocalToggles: { ComplexToggles: [FASlotName.AIR_PLANE, FASlotName.BLUETOOTH, FASlotName.WIFI], SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE], }, MetaToggles: [ { - id: "screenshot", - bundleName: "com.ohos.screenshot", - abilityName: "com.ohos.screenshot.ServiceExtAbility", + id: 'screenshot', + bundleName: 'com.ohos.screenshot', + abilityName: 'com.ohos.screenshot.ServiceExtAbility', + }, + { + id: 'demosystemuicplmeta', + bundleName: 'com.ohos.demosystemuicplmeta', + abilityName: 'com.ohos.demosystemuicplmeta.MainAbility', }, ], }; -export default ControlCenterConfig; +export default controlCenterConfig; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts index 82adcad5..a5f57a5d 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -14,60 +14,68 @@ */ import StyleManager from '../../../../../../../../common/src/main/ets/default/stylemanager'; -import Constants from './constants' +import Constants from './constants'; const TAG = 'DropdownPanel-StyleConfiguration'; +export class ControlStyle { + statusBarHeight: Length = $r('app.float.status_bar_height'); +} + +export class NotificationStyle { + statusBarHeight: Length = $r('app.float.status_bar_height'); + deleteAllImageWidth: Length = $r('app.float.delete_all_image_width'); + deleteAllImageHeight: Length = $r('app.float.delete_all_image_height'); + deleteAllImageBorderRadius: Length = $r('app.float.delete_all_image_border_radius'); + deleteAllImageOpacity: Length = $r('app.float.delete_all_image_opacity'); +} + +export class QuicklySettingStyle { + quicklySetTimeFontSize: Length = $r('app.float.quickly_setting_time_font_size'); + quicklySetTimeFontColor: ResourceColor = $r('app.color.quickly_setting_time_font_color'); + quicklyDateFontColor: ResourceColor = $r('app.color.quickly_setting_date_font_color'); + quicklyDateFontSize: Length = $r('app.float.quickly_setting_date_font_size'); + quicklySetTextFlexMarginLeft: Length = $r('app.float.quickly_setting_text_flex_margin_left'); + quicklySetImageWidth: Length = $r('app.float.quickly_setting_image_width'); + quicklySttImageHeight: Length = $r('app.float.quickly_setting_image_height'); + quicklySetImageMarginRight: Length = $r('app.float.quickly_setting_image_margin_right'); + quickLySettingBorderRadius: Length = $r('app.float.quickly_setting_border_radius'); + quickLySettingMarginLeft: Length = $r('app.float.quickly_setting_margin_left'); + quickLySettingMarginRight: Length = $r('app.float.quickly_setting_margin_right'); + quickSettingH: Length = Constants.QUICKLY_SETTING_H; +} + +export class DateItemStyle { + quicklySetDateItemFontSize: Length = $r('app.float.quickly_setting_date_font_size'); + quicklySetDateItemFontColor: ResourceColor = $r('app.color.quickly_setting_date_font_color'); +} + export default class StyleConfiguration { - static getControlStyle() { - const key: string = TAG + "-Control"; - return StyleManager.getStyle(key, () => { - return { - statusBarHeight: $r("app.float.status_bar_height") - }; - }); - } + static getControlStyle(): ControlStyle { + const key: string = TAG + '-Control'; + return StyleManager.getStyle(key, () => { + return new ControlStyle(); + }); + } - static getNotificationStyle() { - const key: string = TAG + "-Notification"; - return StyleManager.getStyle(key, () => { - return { - statusBarHeight: $r("app.float.status_bar_height"), - deleteAllImageWidth: $r("app.float.delete_all_image_width"), - deleteAllImageHeight: $r("app.float.delete_all_image_height"), - deleteAllImageBorderRadius: $r("app.float.delete_all_image_border_radius"), - deleteAllImageOpacity: $r("app.float.delete_all_image_opacity"), - }; - }); - } + static getNotificationStyle(): NotificationStyle { + const key: string = TAG + '-Notification'; + return StyleManager.getStyle(key, () => { + return new NotificationStyle(); + }); + } - static getQuicklySettingStyle() { - const key: string = TAG + "-QuicklySetting"; - return StyleManager.getStyle(key, () => { - return { - quicklySetTimeFontSize: $r("app.float.quickly_setting_time_font_size"), - quicklySetTimeFontColor: $r('app.color.quickly_setting_time_font_color'), - quicklyDateFontColor: $r('app.color.quickly_setting_date_font_color'), - quicklyDateFontSize: $r("app.float.quickly_setting_date_font_size"), - quicklySetTextFlexMarginLeft: $r("app.float.quickly_setting_text_flex_margin_left"), - quicklySetImageWidth: $r("app.float.quickly_setting_image_width"), - quicklySttImageHeight: $r("app.float.quickly_setting_image_height"), - quicklySetImageMarginRight: $r("app.float.quickly_setting_image_margin_right"), - quickLySettingBorderRadius: $r("app.float.quickly_setting_border_radius"), - quickLySettingMarginLeft: $r("app.float.quickly_setting_margin_left"), - quickLySettingMarginRight: $r("app.float.quickly_setting_margin_right"), - quickSettingH: Constants.QUICKLY_SETTING_H, - }; - }); - } + static getQuicklySettingStyle(): QuicklySettingStyle { + const key: string = TAG + '-QuicklySetting'; + return StyleManager.getStyle(key, () => { + return new QuicklySettingStyle(); + }); + } - static getDateItemStyle() { - const key: string = TAG + "-DateItem"; - return StyleManager.getStyle(key, () => { - return { - quicklySetDateItemFontSize: $r("app.float.quickly_setting_date_font_size"), - quicklySetDateItemFontColor: $r('app.color.quickly_setting_date_font_color'), - }; - }); - } + static getDateItemStyle(): DateItemStyle { + const key: string = TAG + '-DateItem'; + return StyleManager.getStyle(key, () => { + return new DateItemStyle(); + }); + } } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts index ebc7c4a5..a880107d 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts @@ -17,251 +17,261 @@ import Log from '../../../../../../../../common/src/main/ets/default/log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/styleconfiguration'; import ControlCenterStyleConfiguration from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/styleconfiguration'; -import DropdownPanelStyleConfiguration from './styleconfiguration' import BrightnessStyleConfiguration from '../../../../../../../../features/brightnesscomponent/src/main/ets/default/common/styleconfiguration'; -import ClockStyleConfiguration from '../../../../../../../../features/clockcomponent/src/main/ets/default/common/styleconfiguration'; -import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/styleconfiguration' -import IndexStyleConfiguration from './styleconfiguration' +import RingModeStyleConfiguration from '../../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/common/styleconfiguration'; const TAG = 'DropdownPanel-StyleManager'; export default class StyleManager { - static STANDARD_DISPLAY_WIDTH: number = 720; - static STANDARD_DISPLAY_HEIGHT: number = 1280; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + static readonly STANDARD_DISPLAY_WIDTH: number = 720; + static readonly STANDARD_DISPLAY_HEIGHT: number = 1280; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - static setStyle() { - Log.showDebug(TAG, `setStyle`) + static setStyle(): void { + Log.showDebug(TAG, 'setStyle'); - let rect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect'); - StyleManager.maxWidth = rect.width; + let rect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect'); + StyleManager.maxWidth = rect.width; + // ControlCenter + StyleManager.setControlCenterComponentStyle(); + // ControlCenter-Title + StyleManager.setControlCenterUpTitleStyle(); + // ControlCenter-ComplexToggleLayout + StyleManager.setControlCenterComplexToggleLayoutStyle(); + // ControlCenter-SimpleToggleLayout + StyleManager.setControlCenterSimpleToggleLayoutStyle(); + // CommonTemplate-iconTitleBase + StyleManager.setIconTitleBaseStyle(); + // CommonTemplate-iconComponent + StyleManager.setIconComponentStyle(); + // CommonTemplate-simpleToggleBase + StyleManager.setSimpleToggleBaseStyle(); + // Brightness + StyleManager.setBrightnessComponentStyle(); + // RingMode + StyleManager.setControlCenterRingModeComponentStyle(); + // SimpleToggleLayoutEdit + StyleManager.setSimpleToggleLayoutEditComponentStyle(); + // SimpleToggleLayoutEdit-title + StyleManager.setSimpleToggleLayoutEditUpTitleStyle(); + // SimpleToggleLayoutEdit-msg + StyleManager.setSimpleToggleLayoutEditOptMsgStyle(); + // SimpleToggleLayoutEdit-grid + StyleManager.setSimpleToggleLayoutEditGridStyle(); + // EditDialog + StyleManager.setControlEditDialogStyle(); + } + // ControlCenter + private static setControlCenterComponentStyle(): void{ + let style = ControlCenterStyleConfiguration.getControlCenterComponentStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(48); + style.marginRight = StyleManager.calcScaleSizePx(48); + style.marginTop = StyleManager.calcScaleSizePx(36); + style.upTitleHeight = StyleManager.calcScaleSizePx(127); + style.titleMarginBottom = StyleManager.calcScaleSizePx(0); + style.toggleAreaGap = StyleManager.calcScaleSizePx(24); + style.simpleToggleLayoutMarginTop = StyleManager.calcScaleSizePx(48); + style.simpleToggleLayoutMarginBottom = StyleManager.calcScaleSizePx(20); + style.brightnessMarginBottom = StyleManager.calcScaleSizePx(44); + style.componentBorderRadius = StyleManager.calcScaleSizePx(48); + style.componentBackgroundColor = '#99FFFFFF'; + } + // ControlCenter-Title + private static setControlCenterUpTitleStyle(): void{ + let style = ControlCenterStyleConfiguration.getControlCenterUpTitleStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(72); + style.marginRight = StyleManager.calcScaleSizePx(72); + style.fontSize = StyleManager.calcScaleSizePx(40); + style.fontColor = '#FFFFFFFF'; + style.imageWidth = StyleManager.calcScaleSizePx(48); + style.imageHeight = StyleManager.calcScaleSizePx(48); + style.imageHoverWidth = StyleManager.calcScaleSizePx(64); + style.imageHoverHeight = StyleManager.calcScaleSizePx(64); + style.imageHoverRadius = StyleManager.calcScaleSizePx(16); + style.imageHoverColor = 'rgba(0, 0, 0, 0.05)'; + style.imageTransparentColor = 'rgba(255, 255, 255, 0)'; + style.upTitleSpace = StyleManager.calcScaleSizePx(36); + style.titleImageColor = '#FFFFFFFF'; + } + // ControlCenter-ComplexToggleLayout + private static setControlCenterComplexToggleLayoutStyle(): void{ + let style = ControlCenterStyleConfiguration.getControlCenterComplexToggleLayoutStyle(); + style.columnGap = StyleManager.calcScaleSizePx(24); + style.rowGap = StyleManager.calcScaleSize(24); + style.rowHeight = StyleManager.calcScaleSize(132); + } + // ControlCenter-SimpleToggleLayout + private static setControlCenterSimpleToggleLayoutStyle(): void{ + let style = ControlCenterStyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(22); + style.marginRight = StyleManager.calcScaleSizePx(22); + style.columnGap = StyleManager.calcScaleSizePx(0); + style.rowGap = StyleManager.calcScaleSize(0); + style.rowHeight = StyleManager.calcScaleSize(162); + } + // CommonTemplate-iconTitleBase + private static setIconTitleBaseStyle(): void { + let style = CommonTemplateStyleConfiguration.getIconTitleBaseStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(24); + style.marginRight = StyleManager.calcScaleSizePx(16); + style.componentGap = StyleManager.calcScaleSizePx(8); + style.titleSize = StyleManager.calcScaleSizePx(24); + style.titleColor = $r('sys.color.ohos_id_color_text_primary'); + style.borderRadius = StyleManager.calcScaleSizePx(48); + style.backgroundColor = '#99FFFFFF'; + style.textMargin = StyleManager.calcScaleSizePx(8); + style.textHoverHeight = StyleManager.calcScaleSizePx(52); + style.textHoverWidth = StyleManager.calcScaleSizePx(136); + style.textHoverRadius = StyleManager.calcScaleSizePx(8); + style.hoverColor = 'rgba(0, 0, 0, 0.05)'; + style.transparentColor = 'rgba(255, 255, 255, 0)'; + } + // CommonTemplate-iconComponent + private static setIconComponentStyle(): void { + let style = CommonTemplateStyleConfiguration.getIconComponentStyle(); + style.circleWidth = StyleManager.calcScaleSizePx(96); + style.circleHeight = StyleManager.calcScaleSizePx(96); + style.iconWidth = StyleManager.calcScaleSizePx(48); + style.iconHeight = StyleManager.calcScaleSizePx(48); + style.iconOffBG = '#1A182431'; + style.iconOnBG = '#FF007DFF'; + style.iconOnColor = '#FFFFFFFF'; + style.iconOffColor = $r('sys.color.ohos_id_color_secondary'); + style.hoverColor = 'rgba(0, 0, 0, 0.05)'; + style.transparentColor = 'rgba(255, 255, 255, 0)'; + } + // CommonTemplate-simpleToggleBase + private static setSimpleToggleBaseStyle(): void{ + let style = CommonTemplateStyleConfiguration.getSimpleToggleBaseStyle(); + style.circleWidth = StyleManager.calcScaleSizePx(96); + style.circleHeight = StyleManager.calcScaleSizePx(96); + style.iconWidth = StyleManager.calcScaleSizePx(48); + style.iconHeight = StyleManager.calcScaleSizePx(48); + style.dragCircleWidth = StyleManager.calcScaleSizePx(120); + style.dragCircleHeight = StyleManager.calcScaleSizePx(120); + style.dragIconWidth = StyleManager.calcScaleSizePx(72); + style.dragIconHeight = StyleManager.calcScaleSizePx(72); + style.iconOffBG = '#1A182431'; + style.iconOnBG = '#FF007DFF'; + style.iconOnColor = '#FFFFFFFF'; + style.iconOffColor = $r('sys.color.ohos_id_color_secondary'); + style.componentGap = StyleManager.calcScaleSizePx(10); + style.titleSize = StyleManager.calcScaleSizePx(24); + style.titleColor = $r('sys.color.ohos_id_color_text_primary'); + style.textHoverWidth = StyleManager.calcScaleSizePx(136); + style.textHoverHeight = StyleManager.calcScaleSizePx(36); + style.textHoverRadius = StyleManager.calcScaleSizePx(8); + style.hoverColor = 'rgba(0, 0, 0, 0.05)'; + style.transparentColor = 'rgba(255, 255, 255, 0)'; + } + // Brightness + private static setBrightnessComponentStyle(): void{ + let style = BrightnessStyleConfiguration.getBrightnessComponentStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(26); + style.marginRight = StyleManager.calcScaleSizePx(26); + style.componentGap = StyleManager.calcScaleSizePx(26); + style.brightnessIconColor = $r('sys.color.ohos_id_color_secondary'); + style.brightnessReduceWidth = StyleManager.calcScaleSizePx(44); + style.brightnessReduceHeight = StyleManager.calcScaleSizePx(44); + style.brightnessPlusWidth = StyleManager.calcScaleSizePx(44); + style.brightnessPlusHeight = StyleManager.calcScaleSizePx(44); + style.brightnessHeight = StyleManager.calcScaleSizePx(44); + style.sliderHeight = StyleManager.calcScaleSizePx(40); + style.sliderBlockColor = '#FFFFFFFF'; + style.sliderTrackColor = '#1A182431'; + style.sliderSelectedColor = '#FF007DFF'; + } + // RingMode + private static setControlCenterRingModeComponentStyle(): void{ + let style = RingModeStyleConfiguration.getControlCenterRingModeComponentStyle(); + style.onBgColor = '#FFFF9800'; + } + // SimpleToggleLayoutEdit + private static setSimpleToggleLayoutEditComponentStyle(): void{ + let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(48); + style.marginRight = StyleManager.calcScaleSizePx(48); + style.marginTop = StyleManager.calcScaleSizePx(33); + style.titleHeight = StyleManager.calcScaleSizePx(127); + style.titleMarginBottom = StyleManager.calcScaleSizePx(0); + style.upGridMarginTop = StyleManager.calcScaleSizePx(48); + style.upGridMarginBottom = StyleManager.calcScaleSizePx(24); + style.gridMarginLeft = StyleManager.calcScaleSizePx(18.24); + style.gridMarginRight = StyleManager.calcScaleSizePx(18.24); + style.msgMarginTop = StyleManager.calcScaleSizePx(0); + style.msgMarginBottom = StyleManager.calcScaleSizePx(0); + style.btnMarginTop = StyleManager.calcScaleSizePx(24); + style.btnMarginBottom = StyleManager.calcScaleSizePx(32); + style.borderRadius = StyleManager.calcScaleSizePx(48); + style.upAreaBgColor = '#99FFFFFF'; + style.downAreaBgColor = '#4DFFFFFF'; + style.editBtnFontColor = '#FF007DFF'; + style.editBtnFontSize = StyleManager.calcScaleSizePx(32); + style.editBtnBgColor = '#0D000000'; + style.editBtnMarginLeft = StyleManager.calcScaleSizePx(32); + style.editBtnMarginRight = StyleManager.calcScaleSizePx(32); + style.editBtnHeight = StyleManager.calcScaleSizePx(80); + style.editBtnSpace = StyleManager.calcScaleSizePx(32); + } + // SimpleToggleLayoutEdit-title + private static setSimpleToggleLayoutEditUpTitleStyle(): void{ + let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle(); + style.marginLeft = StyleManager.calcScaleSizePx(72); + style.imageWidth = StyleManager.calcScaleSizePx(40); + style.imageHeight = StyleManager.calcScaleSizePx(40); + style.fontColor = '#FFFFFFFF'; + style.editTitleSpace = StyleManager.calcScaleSizePx(36); + style.titleFontSize = StyleManager.calcScaleSizePx(40); + } + // SimpleToggleLayoutEdit-msg + private static setSimpleToggleLayoutEditOptMsgStyle(): void{ + let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); + style.fontSize = StyleManager.calcScaleSizePx(24); + style.fontColor = $r('sys.color.ohos_id_color_text_secondary'); + style.height = StyleManager.calcScaleSizePx(98); + style.marginLeftRight = StyleManager.calcScaleSizePx(44); + } + // SimpleToggleLayoutEdit-grid + private static setSimpleToggleLayoutEditGridStyle(): void{ + let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditGridStyle(); + style.columnGap = StyleManager.calcScaleSizePx(0); + style.rowGap = StyleManager.calcScaleSize(0); + style.rowHeight = StyleManager.calcScaleSize(162); + style.dragBgSize = StyleManager.calcScaleSizePx(120); + } + // EditDialog + private static setControlEditDialogStyle(): void { + let style = ControlCenterStyleConfiguration.getControlEditDialogStyle(); + style.editDialogHeight = StyleManager.calcScaleSizePx(217); + style.editDialogWidth = StyleManager.calcScaleSizePx(670); + style.editDialogFontSize = StyleManager.calcScaleSizePx(30); + style.editDialogBtnMarginLF = StyleManager.calcScaleSizePx(24); + style.editDialogFontHeight = StyleManager.calcScaleSizePx(36); + style.editDialogBtnMarginTop = StyleManager.calcScaleSizePx(36); + style.editDialogButtonSize = StyleManager.calcScaleSizePx(30); + style.editDialogDividerHeight = StyleManager.calcScaleSizePx(36); + style.editDialogButtonHeight = StyleManager.calcScaleSizePx(54); + style.editDialogRadius = StyleManager.calcScaleSizePx(36); + style.editDialogBtnWidth = StyleManager.calcScaleSizePx(311); + style.editDialogFontMarginTop = StyleManager.calcScaleSizePx(52); + style.editDialogColor = '#FFFFFFFF'; + style.editDialogBtnFontColor = '#FF0000FF'; + style.editDialogBtnBgColor = '#00FFFFFF'; + style.editDialogDividerColor = $r('sys.color.ohos_id_color_secondary'); + style.editDialogDividerWidth = StyleManager.calcScaleSizePx(1); + Log.showDebug(TAG, 'getControlEditDialogStyle'); + } - // ControlCenter - { - let style: any = ControlCenterStyleConfiguration.getControlCenterComponentStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(48); - style.marginRight = StyleManager.calcScaleSizePx(48); - style.marginTop = StyleManager.calcScaleSizePx(36); - style.upTitleHeight = StyleManager.calcScaleSizePx(127); - style.titleMarginBottom = StyleManager.calcScaleSizePx(0); - style.toggleAreaGap = StyleManager.calcScaleSizePx(24); - style.simpleToggleLayoutMarginTop = StyleManager.calcScaleSizePx(48); - style.simpleToggleLayoutMarginBottom = StyleManager.calcScaleSizePx(20); - style.brightnessMarginBottom = StyleManager.calcScaleSizePx(44); - style.componentBorderRadius = StyleManager.calcScaleSizePx(48); - style.componentBackgroundColor = '#99FFFFFF'; - } + static number2px(n: number): string { + return n.toString() + 'px'; + } - // ControlCenter-Title - { - let style: any = ControlCenterStyleConfiguration.getControlCenterUpTitleStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(72); - style.marginRight = StyleManager.calcScaleSizePx(72); - style.fontSize = StyleManager.calcScaleSizePx(40); - style.fontColor = "#FFFFFFFF"; - style.imageWidth = StyleManager.calcScaleSizePx(48); - style.imageHeight = StyleManager.calcScaleSizePx(48); - style.imageHoverWidth = StyleManager.calcScaleSizePx(64); - style.imageHoverHeight = StyleManager.calcScaleSizePx(64); - style.imageHoverRadius = StyleManager.calcScaleSizePx(16); - style.imageHoverColor = 'rgba(0, 0, 0, 0.05)'; - style.imageTransparentColor = 'rgba(255, 255, 255, 0)'; - style.upTitleSpace = StyleManager.calcScaleSizePx(36); - style.titleImageColor = "#FFFFFFFF"; - } + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } - // ControlCenter-ComplexToggleLayout - { - let style: any = ControlCenterStyleConfiguration.getControlCenterComplexToggleLayoutStyle(); - style.columnGap = StyleManager.calcScaleSizePx(24); - style.rowGap = StyleManager.calcScaleSize(24); - style.rowHeight = StyleManager.calcScaleSize(132); - } - - // ControlCenter-SimpleToggleLayout - { - let style: any = ControlCenterStyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(22); - style.marginRight = StyleManager.calcScaleSizePx(22); - style.columnGap = StyleManager.calcScaleSizePx(0); - style.rowGap = StyleManager.calcScaleSize(0); - style.rowHeight = StyleManager.calcScaleSize(162); - } - - // CommonTemplate-iconTitleBase - { - let style: any = CommonTemplateStyleConfiguration.getIconTitleBaseStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(24); - style.marginRight = StyleManager.calcScaleSizePx(16); - style.componentGap = StyleManager.calcScaleSizePx(8); - style.titleSize = StyleManager.calcScaleSizePx(24); - style.titleColor = $r("sys.color.ohos_id_color_text_primary"); - style.borderRadius = StyleManager.calcScaleSizePx(48); - style.backgroundColor = '#99FFFFFF'; - style.textMargin = StyleManager.calcScaleSizePx(8); - style.textHoverHeight = StyleManager.calcScaleSizePx(52); - style.textHoverWidth = StyleManager.calcScaleSizePx(136); - style.textHoverRadius = StyleManager.calcScaleSizePx(8); - style.hoverColor = 'rgba(0, 0, 0, 0.05)'; - style.transparentColor = 'rgba(255, 255, 255, 0)'; - } - - // CommonTemplate-iconComponent - { - let style: any = CommonTemplateStyleConfiguration.getIconComponentStyle(); - style.circleWidth = StyleManager.calcScaleSizePx(96); - style.circleHeight = StyleManager.calcScaleSizePx(96); - style.iconWidth = StyleManager.calcScaleSizePx(48); - style.iconHeight = StyleManager.calcScaleSizePx(48); - style.iconOffBG = '#1A182431'; - style.iconOnBG = '#FF007DFF'; - style.iconOnColor = '#FFFFFFFF'; - style.iconOffColor = $r("sys.color.ohos_id_color_secondary"); - style.hoverColor = 'rgba(0, 0, 0, 0.05)'; - style.transparentColor = 'rgba(255, 255, 255, 0)'; - } - - // CommonTemplate-simpleToggleBase - { - let style: any = CommonTemplateStyleConfiguration.getSimpleToggleBaseStyle(); - style.circleWidth = StyleManager.calcScaleSizePx(96); - style.circleHeight = StyleManager.calcScaleSizePx(96); - style.iconWidth = StyleManager.calcScaleSizePx(48); - style.iconHeight = StyleManager.calcScaleSizePx(48); - style.dragCircleWidth = StyleManager.calcScaleSizePx(120); - style.dragCircleHeight = StyleManager.calcScaleSizePx(120); - style.dragIconWidth = StyleManager.calcScaleSizePx(72); - style.dragIconHeight = StyleManager.calcScaleSizePx(72); - style.iconOffBG = '#1A182431'; - style.iconOnBG = '#FF007DFF'; - style.iconOnColor = '#FFFFFFFF'; - style.iconOffColor = $r("sys.color.ohos_id_color_secondary"); - style.componentGap = StyleManager.calcScaleSizePx(10); - style.titleSize = StyleManager.calcScaleSizePx(24); - style.titleColor = $r("sys.color.ohos_id_color_text_primary"); - style.textHoverWidth = StyleManager.calcScaleSizePx(136); - style.textHoverHeight = StyleManager.calcScaleSizePx(36); - style.textHoverRadius = StyleManager.calcScaleSizePx(8); - style.hoverColor = 'rgba(0, 0, 0, 0.05)'; - style.transparentColor = 'rgba(255, 255, 255, 0)'; - } - - // Brightness - { - let style: any = BrightnessStyleConfiguration.getBrightnessComponentStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(26); - style.marginRight = StyleManager.calcScaleSizePx(26); - style.componentGap = StyleManager.calcScaleSizePx(26); - style.brightnessIconColor = $r("sys.color.ohos_id_color_secondary"); - style.brightnessReduceWidth = StyleManager.calcScaleSizePx(44); - style.brightnessReduceHeight = StyleManager.calcScaleSizePx(44); - style.brightnessPlusWidth = StyleManager.calcScaleSizePx(44); - style.brightnessPlusHeight = StyleManager.calcScaleSizePx(44); - style.brightnessHeight = StyleManager.calcScaleSizePx(44); - style.sliderHeight = StyleManager.calcScaleSizePx(40); - style.sliderBlockColor = '#FFFFFFFF'; - style.sliderTrackColor = '#1A182431'; - style.selectedColor = '#FF007DFF'; - } - - // RingMode - { - let style: any = RingModeStyleConfiguration.getControlCenterRingModeComponentStyle(); - style.brightnessIconColor = '#FFFF9800'; - } - - // SimpleToggleLayoutEdit - { - let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(48); - style.marginRight = StyleManager.calcScaleSizePx(48); - style.marginTop = StyleManager.calcScaleSizePx(33); - style.titleHeight = StyleManager.calcScaleSizePx(127); - style.titleMarginBottom = StyleManager.calcScaleSizePx(0); - style.upGridMarginTop = StyleManager.calcScaleSizePx(48); - style.upGridMarginBottom = StyleManager.calcScaleSizePx(24); - style.gridMarginLeft = StyleManager.calcScaleSizePx(18.24); - style.gridMarginRight = StyleManager.calcScaleSizePx(18.24); - style.msgMarginTop = StyleManager.calcScaleSizePx(0); - style.msgMarginBottom = StyleManager.calcScaleSizePx(0); - style.btnMarginTop = StyleManager.calcScaleSizePx(24); - style.btnMarginBottom = StyleManager.calcScaleSizePx(32); - style.borderRadius = StyleManager.calcScaleSizePx(48); - style.upAreaBgColor = '#99FFFFFF'; - style.downAreaBgColor = '#4DFFFFFF'; - style.editBtnFontColor = '#FF007DFF'; - style.editBtnFontSize = StyleManager.calcScaleSizePx(32); - style.editBtnBgColor = '#0D000000'; - style.editBtnMarginLeft = StyleManager.calcScaleSizePx(32); - style.editBtnMarginRight = StyleManager.calcScaleSizePx(32); - style.editBtnHeight = StyleManager.calcScaleSizePx(80); - style.editBtnSpace = StyleManager.calcScaleSizePx(32); - } - - // SimpleToggleLayoutEdit-title - { - let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(72); - style.imageWidth = StyleManager.calcScaleSizePx(40); - style.imageHeight = StyleManager.calcScaleSizePx(40); - style.fontColor = "#FFFFFFFF"; - style.editTitleSpace = StyleManager.calcScaleSizePx(36); - style.titleFontSize = StyleManager.calcScaleSizePx(40); - } - - // SimpleToggleLayoutEdit-msg - { - let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); - style.fontSize = StyleManager.calcScaleSizePx(24); - style.fontColor = $r('sys.color.ohos_id_color_text_secondary'); - style.height = StyleManager.calcScaleSizePx(98); - style.marginLeftRight = StyleManager.calcScaleSizePx(44); - } - - // SimpleToggleLayoutEdit-grid - { - let style: any = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditGridStyle(); - style.columnGap = StyleManager.calcScaleSizePx(0); - style.rowGap = StyleManager.calcScaleSize(0); - style.rowHeight = StyleManager.calcScaleSize(162); - style.dragBgSize = StyleManager.calcScaleSizePx(120); - } - - // EditDialog - { - let style: any = ControlCenterStyleConfiguration.getControlEditDialogStyle(); - style.editDialogHeight = StyleManager.calcScaleSizePx(217); - style.editDialogWidth = StyleManager.calcScaleSizePx(670); - style.editDialogFontSize = StyleManager.calcScaleSizePx(30); - style.editDialogBtnMarginLF = StyleManager.calcScaleSizePx(24); - style.editDialogFontHeight = StyleManager.calcScaleSizePx(36); - style.editDialogBtnMarginTop = StyleManager.calcScaleSizePx(36); - style.editDialogButtonSize = StyleManager.calcScaleSizePx(30); - style.editDialogDividerHeight = StyleManager.calcScaleSizePx(36); - style.editDialogButtonHeight = StyleManager.calcScaleSizePx(54); - style.editDialogRadius = StyleManager.calcScaleSizePx(36); - style.editDialogBtnWidth = StyleManager.calcScaleSizePx(311); - style.editDialogFontMarginTop = StyleManager.calcScaleSizePx(52); - style.editDialogColor = '#FFFFFFFF'; - style.editDialogBtnFontColor = '#FF0000FF'; - style.editDialogBtnBgColor = '#00FFFFFF'; - style.editDialogDividerColor = $r("sys.color.ohos_id_color_secondary"); - style.editDialogDividerWidth = StyleManager.calcScaleSizePx(1); - Log.showDebug(TAG, `getControlEditDialogStyle`) - } - - } - - static number2px(n: number): string { - return n.toString() + 'px'; - } - - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } - - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts index 30176d54..60ba5d57 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/constants.ts @@ -14,10 +14,10 @@ */ export default class Constants { - static TOUCHTYPE_DOWN = 0; - static TOUCHTYPE_UP = 1; - static TOUCHTYPE_MOVE = 2; - static WEEKDAY_LIST = [ + static readonly TOUCHTYPE_DOWN = 0; + static readonly TOUCHTYPE_UP = 1; + static readonly TOUCHTYPE_MOVE = 2; + static readonly WEEKDAY_LIST = [ $r('app.string.sunday'), $r('app.string.monday'), $r('app.string.tuesday'), @@ -25,9 +25,9 @@ export default class Constants { $r('app.string.thursday'), $r('app.string.friday'), $r('app.string.saturday') - ] - static DIGITS = 10; - static MARK_MONTH = 0; - static MARK_DAY = 1; - static QUICKLY_SETTING_H = 83; + ]; + static readonly DIGITS = 10; + static readonly MARK_MONTH = 0; + static readonly MARK_DAY = 1; + static readonly QUICKLY_SETTING_H = 83; } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts index 7d50b704..980a0a8a 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts @@ -14,7 +14,7 @@ */ import commonEvent from '@ohos.commonEvent'; -import Log from '../../../../../../../../common/src/main/ets/default/log' +import Log from '../../../../../../../../common/src/main/ets/default/log'; const TAG = 'navigationEvent'; @@ -27,7 +27,7 @@ let commonEventSubscriber = null; export class navigationEvent { mCallback: any; - registerCallback(callback) { + registerCallback(callback): void { Log.showDebug(TAG, 'registerCallback'); this.mCallback = callback; if (commonEventSubscriber == null) { @@ -38,7 +38,7 @@ export class navigationEvent { } } - createCapsuleSubscriberCallBack(err, data) { + createCapsuleSubscriberCallBack(err, data): void { Log.showDebug(TAG, `createCapsuleSubscriberCallBack err: ${JSON.stringify(err)} data: ${JSON.stringify(data)}`); commonEventSubscriber = data; commonEvent.subscribe(data, (err, data) => { @@ -55,7 +55,7 @@ export class navigationEvent { }); } - unregisterCallback() { + unregisterCallback(): void { if (commonEventSubscriber != null) { commonEvent.unsubscribe(commonEventSubscriber, () => { Log.showInfo(TAG, 'Subscriberregister unregister Capsule Status Listener ==============='); diff --git a/product/phone/dropdownpanel/src/main/ets/pages/control.ets b/product/phone/dropdownpanel/src/main/ets/pages/control.ets index d252ccfa..1d5a9603 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/control.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/control.ets @@ -22,7 +22,7 @@ import LocationIcon from '../../../../../../../features/locationcomponent/src/ma import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' import Log from '../../../../../../../common/src/main/ets/default/Log' import Constants from './common/constants' -import StyleConfiguration from './common/StyleConfiguration' +import StyleConfiguration, { ControlStyle } from './common/StyleConfiguration' import ControlCenterConfig from './common/ControlCenterConfig'; const TAG = 'DropdownPanel-Control'; @@ -34,7 +34,7 @@ export default struct Control { startY: number = 0 @State moveX: number = 0 @State moveY: number = 0 - @State style: any = StyleConfiguration.getControlStyle() + @State style: ControlStyle = StyleConfiguration.getControlStyle() aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index 4de66cfb..d5f88b52 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -25,10 +25,10 @@ import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/ma import image from "@ohos.multimedia.image" import Log from '../../../../../../../common/src/main/ets/default/Log' import Trace from '../../../../../../../common/src/main/ets/default/Trace' -import WindowManager, -{WindowType, WINDOW_SHOW_HIDE_EVENT} from '../../../../../../../common/src/main/ets/default/WindowManager' -import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager" -import {START_ABILITY_EVENT} from "../../../../../../../common/src/main/ets/default/event/EventUtil" +import WindowManager, { WindowType, WINDOW_SHOW_HIDE_EVENT +} from '../../../../../../../common/src/main/ets/default/WindowManager' +import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/EventManager" +import { START_ABILITY_EVENT } from "../../../../../../../common/src/main/ets/default/event/EventUtil" import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' import MultimodalInputManager from '../../../../../../../common/src/main/ets/default/MultimodalInputManager' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' @@ -69,7 +69,6 @@ struct Index { @State showComponentName: string = undefined @State componentOptAreaHeightPX: number = 0 @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 - @State controlCenterComponentConfig: any = {}; mCallback: any; mClearCallbacks: unsubscribe[] settingDataKey = 'settings.display.navigationbar_status'; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index e491b9be..668ffa16 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -31,7 +31,9 @@ import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT } from '../../../../../../../common/src/main/ets/default/timemanager' const TAG = 'DropdownPanel-notification' +const GRID_SIZE = 6; const IMAGE_SIZE_L = 24; +const IMAGE_SIZE_S = 20; const BGC_SIZE_L = 40; const NO_NOTIFICATION_TOP_MARGIN = 40; const TIME_TEXT_MARGIN = 4; @@ -142,6 +144,7 @@ struct statusBar { build() { Column(){ Stack(){ + Row(){ Row(){}.width('50%').height('100%').onTouch((touchEvent) => {this.touchEvent(touchEvent, 'left')}) Row(){}.width('50%').height('100%').onTouch((touchEvent) => {this.touchEvent(touchEvent, 'right')}) @@ -190,6 +193,7 @@ struct statusBar { }else if(touchLocation === 'right'){ this.touchMoveCallback({ 'direction': 'drop_right', 'touchComponent': 'notification' }) } + } } } @@ -236,8 +240,8 @@ struct CenterTitle { .flexGrow(1) Image($r("app.media.ic_public_settings")) .objectFit(ImageFit.Contain) - .width($r("app.float.notification_title_setting_icon_width")) - .height($r("app.float.notification_title_setting_icon_height")) + .width(IMAGE_SIZE_S) + .height(IMAGE_SIZE_S) .fillColor("#FFFFFF") .margin({ right: CENTER_MARGIN, bottom: TIME_BOTTOM_OFFSET }) .onClick(this.settingClick.bind(this)) @@ -281,4 +285,4 @@ struct CenterTitle { } } } -} \ No newline at end of file +} diff --git a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js index a0802f4c..7a1a7040 100644 --- a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -13,85 +13,85 @@ * limitations under the License. */ -import worker from "@ohos.worker"; -import Log from "../../../../../../../common/src/main/ets/default/log"; -import PluginDataSourceManager -from "../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager"; -import Constants, { obtainMsg } from "../../../../../../../common/src/main/ets/plugindatasource/common/constants"; +import worker from '@ohos.worker'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; +import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; -Log.showInfo(TAG, `Start.`); +Log.showInfo(TAG, 'Start.'); var sManager; parentPort.onmessage = (msg) => { - Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); - let data = msg.data; - switch (data.action) { - case Constants.INIT_CONFIG: - initConfig(data.data); - break; - case Constants.CLEAR_ALL: - clearAll(); - break; - case Constants.LOAD_DATA: - loadData(data.data); - break; - case Constants.UPDATE_PLUGIN_COMPONENT_DATA: - updatePluginComponentData(data.data); - break; - default: - Log.showError(TAG, `onMessage, unknown action type.`); - } + Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); + let data = msg.data; + switch (data.action) { + case Constants.INIT_CONFIG: + initConfig(data.data); + break; + case Constants.CLEAR_ALL: + clearAll(); + break; + case Constants.LOAD_DATA: + loadData(data.data); + break; + case Constants.UPDATE_PLUGIN_COMPONENT_DATA: + updatePluginComponentData(data.data); + break; + default: + Log.showError(TAG, 'onMessage, unknown action type.'); + } }; function initConfig(config) { - Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); - sManager = new PluginDataSourceManager({ - onItemAdd: (itemData) => { - Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); - itemData.label && (itemData.label = encodeURIComponent(itemData.label)); - parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); - }, - onItemRemove: (itemData) => { - Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); - parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); - }, - onLoadPluginComponentData: (itemData) => { - Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); - parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); - }, - }); - sManager.initDataSource(config); - parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); + Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); + sManager = new PluginDataSourceManager({ + onItemAdd: (itemData) => { + Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); + itemData.label && (itemData.label = encodeURIComponent(itemData.label)); + parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); + }, + onItemRemove: (itemData) => { + Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); + }, + onLoadPluginComponentData: (itemData) => { + Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); + }, + }); + sManager.initDataSource(config); + parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); } function clearAll() { - Log.showDebug(TAG, `clearAll `); - sManager?.clearAll(); + Log.showDebug(TAG, 'clearAll '); + sManager?.clearAll(); } function loadData(userId) { - Log.showDebug(TAG, `loadData `); - sManager?.loadData(userId); + Log.showDebug(TAG, 'loadData '); + sManager?.loadData(userId); } function updatePluginComponentData(pluginComponentData) { - Log.showDebug(TAG, 'updatePluginComponentData '); - sManager?.updatePluginComponentData(pluginComponentData); + Log.showDebug(TAG, 'updatePluginComponentData '); + sManager?.updatePluginComponentData(pluginComponentData); } parentPort.onclose = function () { - Log.showDebug(TAG, `onclose`); + Log.showDebug(TAG, 'onclose'); }; parentPort.onmessageerror = function () { - Log.showError(TAG, `onmessageerror`); + Log.showError(TAG, 'onmessageerror'); }; parentPort.onerror = function (data) { - Log.showError(TAG, - `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` - ); + Log.showError( + TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + ); }; \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/float.json b/product/phone/dropdownpanel/src/main/resources/base/element/float.json index 9b88ba6b..7978df0c 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/float.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/float.json @@ -119,14 +119,6 @@ { "name": "status_bar_padding_top_bottom", "value": "4vp" - }, - { - "name": "notification_title_setting_icon_width", - "value": "48px" - }, - { - "name": "notification_title_setting_icon_height", - "value": "48px" } ] } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts b/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts index 9164e500..ff108a0c 100644 --- a/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts +++ b/product/phone/statusbar/src/main/ets/Application/AbilityStage.ts @@ -12,12 +12,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" -import Log from '../../../../../../../common/src/main/ets/default/Log' +import AbilityStage from '@ohos.application.AbilityStage'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; + +const TAG = 'StatusBar_AbilityStage'; -const TAG = "StatusBar_AbilityStage" export default class MainAbilityStage extends AbilityStage { - onCreate() { - Log.showInfo(TAG, "onCreate") - } + onCreate(): void { + Log.showInfo(TAG, 'onCreate'); + } } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 4571b62c..22d3d2a0 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,39 +13,43 @@ * limitations under the License. */ -import ServiceExtension from '@ohos.application.ServiceExtensionAbility' -import Log from '../../../../../../../common/src/main/ets/default/Log' -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import StatusBarConfiguration from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; import StatusBarConstants from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; +import { Want } from 'ability/want'; -const TAG = "StatusBar_ServiceExtAbility" + +const TAG = 'StatusBar_ServiceExtAbility'; class ServiceExtAbility extends ServiceExtension { - async onCreate(want) { - Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context) - globalThis[StatusBarConstants.PLUGIN_COMPONENT_OWNER_WANT_KEY] = want; - - let configInfo = await StatusBarConfiguration.getConfiguration(); - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo) - Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`) - - let statusBarRect = { - left: configInfo.xCoordinate, - top: configInfo.yCoordinate, - width: configInfo.realWidth, - height: configInfo.realHeight - } - WindowManager.createWindow(this.context, WindowType.STATUS_BAR, statusBarRect, "pages/index").then(() => - WindowManager.showWindow(WindowType.STATUS_BAR) - ); - } - - onDestroy() { - Log.showInfo(TAG, 'onDestroy'); - } + async onCreate(want: Want): Promise { + Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); + AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context); + globalThis[StatusBarConstants.PLUGIN_COMPONENT_OWNER_WANT_KEY] = want; + + let configInfo = await StatusBarConfiguration.getConfiguration(); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo); + Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); + + let statusBarRect = { + left: configInfo.xCoordinate, + top: configInfo.yCoordinate, + width: configInfo.realWidth, + height: configInfo.realHeight + }; + WindowManager.createWindow(this.context, WindowType.STATUS_BAR, statusBarRect, 'pages/index').then(async () => + WindowManager.showWindow(WindowType.STATUS_BAR) + ).then(() => { + }).catch((err) => { + }); + } + + onDestroy(): void { + Log.showInfo(TAG, 'onDestroy'); + } } -export default ServiceExtAbility \ No newline at end of file +export default ServiceExtAbility; \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts b/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts index e38a3b60..ef681e62 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts @@ -12,38 +12,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {FASlotName} from '../../../../../../../../common/src/main/ets/default/constants'; +import { FASlotName } from '../../../../../../../../common/src/main/ets/default/constants'; +import { StatusBarConfig +} from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; -type LayoutGroup = { - id: number; - Components: Array; -}; -type pluginIconData = { - id: string; - bundleName: string; - abilityName: string; -}; -type DropdownRange = { - startPosition: number; - endPosition: number; -}; -type Config = { - LayoutGroups: Array; - LocalSlots: Array; - MetaSlots: Array; - emptyPosition: { - x1: number; - x2: number; - y1: number; - y2: number - }; - dropdownRanges: { - notification: DropdownRange; - control: DropdownRange - } -}; - -const StatusbarConfig: Config = { +const statusbarConfig: StatusBarConfig = { LayoutGroups: [ { id: 1, @@ -112,4 +85,4 @@ const StatusbarConfig: Config = { } }; -export default StatusbarConfig; \ No newline at end of file +export default statusbarConfig; \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts index 176b293b..9d7a6ec5 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts @@ -17,11 +17,14 @@ import StyleManager from '../../../../../../../../common/src/main/ets/default/st const TAG = 'StatusBar-StyleConfiguration'; +export class IndexStyle { +} + export default class StyleConfiguration { - static getIndexStyle() { - const key: string = TAG + "-Index"; - return StyleManager.getStyle(key, () => { - return {}; - }); - } + static getIndexStyle(): IndexStyle { + const key: string = TAG + '-Index'; + return StyleManager.getStyle(key, () => { + return new IndexStyle(); + }); + } } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts index e6eda3e6..393491ba 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -15,37 +15,36 @@ import Log from '../../../../../../../../common/src/main/ets/default/log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; -import IndexStyleConfiguration from './styleconfiguration' +import IndexStyleConfiguration from './styleconfiguration'; const TAG = 'StatusBar-StyleManager'; export default class StyleManager { - static STANDARD_DISPLAY_WIDTH: number = 720; - static STANDARD_DISPLAY_HEIGHT: number = 1280; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; + static readonly STANDARD_DISPLAY_WIDTH = 720; + static readonly STANDARD_DISPLAY_HEIGHT = 1280; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - static setStyle() { - Log.showDebug(TAG, `setStyle`) + static setStyle(): void { + Log.showDebug(TAG, 'setStyle'); - let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); - StyleManager.maxWidth = config.maxWidth; - - // xxx - { - - } + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); + StyleManager.maxWidth = config.maxWidth; + // xxx + { } - static number2px(n: number): string { - return n.toString() + 'px'; - } + } - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } + static number2px(n: number): string { + return n.toString() + 'px'; + } - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/common/constants.ts b/product/phone/statusbar/src/main/ets/pages/common/constants.ts index 16e20ce9..53f97c35 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/constants.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/constants.ts @@ -14,7 +14,7 @@ */ export default class Constants { - static TOUCHTYPE_DOWN = 0; - static TOUCHTYPE_UP = 1; - static TOUCHTYPE_MOVE = 2; + static readonly TOUCHTYPE_DOWN = 0; + static readonly TOUCHTYPE_UP = 1; + static readonly TOUCHTYPE_MOVE = 2; } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index b58a2e3c..ecba1643 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -167,4 +167,4 @@ struct Index { } } } -} \ No newline at end of file +} diff --git a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index a0802f4c..7a1a7040 100644 --- a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -13,85 +13,85 @@ * limitations under the License. */ -import worker from "@ohos.worker"; -import Log from "../../../../../../../common/src/main/ets/default/log"; -import PluginDataSourceManager -from "../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager"; -import Constants, { obtainMsg } from "../../../../../../../common/src/main/ets/plugindatasource/common/constants"; +import worker from '@ohos.worker'; +import Log from '../../../../../../../common/src/main/ets/default/log'; +import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; +import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; const parentPort = worker.parentPort; const TAG = `${parentPort.name} Worker`; -Log.showInfo(TAG, `Start.`); +Log.showInfo(TAG, 'Start.'); var sManager; parentPort.onmessage = (msg) => { - Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); - let data = msg.data; - switch (data.action) { - case Constants.INIT_CONFIG: - initConfig(data.data); - break; - case Constants.CLEAR_ALL: - clearAll(); - break; - case Constants.LOAD_DATA: - loadData(data.data); - break; - case Constants.UPDATE_PLUGIN_COMPONENT_DATA: - updatePluginComponentData(data.data); - break; - default: - Log.showError(TAG, `onMessage, unknown action type.`); - } + Log.showInfo(TAG, `onMessage, msg = ${JSON.stringify(msg)}`); + let data = msg.data; + switch (data.action) { + case Constants.INIT_CONFIG: + initConfig(data.data); + break; + case Constants.CLEAR_ALL: + clearAll(); + break; + case Constants.LOAD_DATA: + loadData(data.data); + break; + case Constants.UPDATE_PLUGIN_COMPONENT_DATA: + updatePluginComponentData(data.data); + break; + default: + Log.showError(TAG, 'onMessage, unknown action type.'); + } }; function initConfig(config) { - Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); - sManager = new PluginDataSourceManager({ - onItemAdd: (itemData) => { - Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); - itemData.label && (itemData.label = encodeURIComponent(itemData.label)); - parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); - }, - onItemRemove: (itemData) => { - Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); - parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); - }, - onLoadPluginComponentData: (itemData) => { - Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); - parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); - }, - }); - sManager.initDataSource(config); - parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); + Log.showDebug(TAG, `initConfig, config = ${JSON.stringify(config)}`); + sManager = new PluginDataSourceManager({ + onItemAdd: (itemData) => { + Log.showInfo(TAG, `sManager.onItemAdd, itemData = ${JSON.stringify(itemData)}`); + itemData.label && (itemData.label = encodeURIComponent(itemData.label)); + parentPort.postMessage(obtainMsg(Constants.ADD_ITEM, itemData)); + }, + onItemRemove: (itemData) => { + Log.showInfo(TAG, `sManager.onItemRemove, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.REMOVE_ITEM, itemData)); + }, + onLoadPluginComponentData: (itemData) => { + Log.showInfo(TAG, `sManager.onLoadPluginComponentData, itemData = ${JSON.stringify(itemData)}`); + parentPort.postMessage(obtainMsg(Constants.LOAD_PLUGIN_COMPONENT_DATA, itemData)); + }, + }); + sManager.initDataSource(config); + parentPort.postMessage(obtainMsg(Constants.INIT_FINISH, {})); } function clearAll() { - Log.showDebug(TAG, `clearAll `); - sManager?.clearAll(); + Log.showDebug(TAG, 'clearAll '); + sManager?.clearAll(); } function loadData(userId) { - Log.showDebug(TAG, `loadData `); - sManager?.loadData(userId); + Log.showDebug(TAG, 'loadData '); + sManager?.loadData(userId); } function updatePluginComponentData(pluginComponentData) { - Log.showDebug(TAG, 'updatePluginComponentData '); - sManager?.updatePluginComponentData(pluginComponentData); + Log.showDebug(TAG, 'updatePluginComponentData '); + sManager?.updatePluginComponentData(pluginComponentData); } parentPort.onclose = function () { - Log.showDebug(TAG, `onclose`); + Log.showDebug(TAG, 'onclose'); }; parentPort.onmessageerror = function () { - Log.showError(TAG, `onmessageerror`); + Log.showError(TAG, 'onmessageerror'); }; parentPort.onerror = function (data) { - Log.showError(TAG, - `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` - ); + Log.showError( + TAG, + `onerror, lineno = ${data.lineno}, msg = ${data.message}, filename = ${data.filename}, col = ${data.colno}` + ); }; \ No newline at end of file -- Gitee From 5d8d3c6ed996b76d90ce1bf86b64e5d388a11192 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Mon, 27 Jun 2022 20:44:14 +0800 Subject: [PATCH 177/373] update eslint Signed-off-by: lijinfengde123 --- .../src/main/ets/MainAbility/MainAbility.ts | 7 ------- .../main/ets/vm/notificationManagenmentViewModel.ts | 7 ++++--- .../dropdownpanel/src/main/ets/pages/notification.ets | 10 +++------- .../src/main/resources/base/element/float.json | 8 ++++++++ 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts index 31fb9646..ba7fb6d9 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts @@ -25,13 +25,6 @@ export default class MainAbility extends Ability { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { Log.showInfo(TAG, 'MainAbility onCreate'); globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = want; - display.getDefaultDisplay().then((dis) => { - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_APP_LIST, 'dis', { - width: dis.width, - height: dis.height, - }); - }).catch(err => { - }); } onDestroy(): void { diff --git a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts index a9df14d6..5d30bb20 100644 --- a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts @@ -14,8 +14,9 @@ */ import Log from '../../../../../../../common/src/main/ets/default/log'; -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import BundleResourceModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/bundleresourcemodel'; +import display from '@ohos.display'; import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/nodisturbcomponentviewmodel'; import Router from '@system.router'; @@ -58,9 +59,9 @@ export default class NotificationManagenmentViewModel extends NoDisturbComponent globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = null; } - judgeDeviceType(){ + async judgeDeviceType(){ Log.showDebug(TAG, "judgeDeviceType"); - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_APP_LIST, 'dis'); + let configInfo = await display.getDefaultDisplay(); Log.showDebug(TAG, `judgeDeviceType, configInfo: ${configInfo} `); if (configInfo.width < configInfo.height) { this.isPhone = true; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 668ffa16..e491b9be 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -31,9 +31,7 @@ import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT } from '../../../../../../../common/src/main/ets/default/timemanager' const TAG = 'DropdownPanel-notification' -const GRID_SIZE = 6; const IMAGE_SIZE_L = 24; -const IMAGE_SIZE_S = 20; const BGC_SIZE_L = 40; const NO_NOTIFICATION_TOP_MARGIN = 40; const TIME_TEXT_MARGIN = 4; @@ -144,7 +142,6 @@ struct statusBar { build() { Column(){ Stack(){ - Row(){ Row(){}.width('50%').height('100%').onTouch((touchEvent) => {this.touchEvent(touchEvent, 'left')}) Row(){}.width('50%').height('100%').onTouch((touchEvent) => {this.touchEvent(touchEvent, 'right')}) @@ -193,7 +190,6 @@ struct statusBar { }else if(touchLocation === 'right'){ this.touchMoveCallback({ 'direction': 'drop_right', 'touchComponent': 'notification' }) } - } } } @@ -240,8 +236,8 @@ struct CenterTitle { .flexGrow(1) Image($r("app.media.ic_public_settings")) .objectFit(ImageFit.Contain) - .width(IMAGE_SIZE_S) - .height(IMAGE_SIZE_S) + .width($r("app.float.notification_title_setting_icon_width")) + .height($r("app.float.notification_title_setting_icon_height")) .fillColor("#FFFFFF") .margin({ right: CENTER_MARGIN, bottom: TIME_BOTTOM_OFFSET }) .onClick(this.settingClick.bind(this)) @@ -285,4 +281,4 @@ struct CenterTitle { } } } -} +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/float.json b/product/phone/dropdownpanel/src/main/resources/base/element/float.json index 7978df0c..9b88ba6b 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/float.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/float.json @@ -119,6 +119,14 @@ { "name": "status_bar_padding_top_bottom", "value": "4vp" + }, + { + "name": "notification_title_setting_icon_width", + "value": "48px" + }, + { + "name": "notification_title_setting_icon_height", + "value": "48px" } ] } \ No newline at end of file -- Gitee From ee451c0ab0721052737fef9e8ea34954b9f2f1d1 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Tue, 28 Jun 2022 12:37:02 +0800 Subject: [PATCH 178/373] =?UTF-8?q?Modify=20fields:=20startWindowIcon?= =?UTF-8?q?=E3=80=81startWindowBackground?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuchangzhou --- .../notificationmanagement/src/main/module.json5 | 4 ++-- .../src/main/resources/base/element/color.json | 4 ++-- .../main/resources/base/media/startWindowIcon.png | Bin 0 -> 152 bytes 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 product/default/notificationmanagement/src/main/resources/base/media/startWindowIcon.png diff --git a/product/default/notificationmanagement/src/main/module.json5 b/product/default/notificationmanagement/src/main/module.json5 index 88ce23dc..15a4fcb7 100644 --- a/product/default/notificationmanagement/src/main/module.json5 +++ b/product/default/notificationmanagement/src/main/module.json5 @@ -22,8 +22,8 @@ "description": "$string:mainability_description", "label": "$string:app_name", "launchType": "singleton", - "startWindowIcon": "$media:icon", - "startWindowBackground": "$color:color_1" + "startWindowIcon": "$media:startWindowIcon", + "startWindowBackground": "$color:startWindowBackground" } ] } diff --git a/product/default/notificationmanagement/src/main/resources/base/element/color.json b/product/default/notificationmanagement/src/main/resources/base/element/color.json index 9d23136d..bb3c02e7 100644 --- a/product/default/notificationmanagement/src/main/resources/base/element/color.json +++ b/product/default/notificationmanagement/src/main/resources/base/element/color.json @@ -1,8 +1,8 @@ { "color": [ { - "name": "color_1", - "value": "#ff0000" + "name": "startWindowBackground", + "value": "#ffffff" } ] } \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/resources/base/media/startWindowIcon.png b/product/default/notificationmanagement/src/main/resources/base/media/startWindowIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..87c16c5009bfbcd6242cfd641e62e190772edbe1 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^4}qA2gAGXX|CnI_q!^2X+?^QKos)S9a~60+7BevL9R^{> Date: Tue, 28 Jun 2022 14:55:04 +0800 Subject: [PATCH 179/373] update trace log and add systemReady event listener Signed-off-by: yangpeng85 --- common/src/main/ets/default/Trace.ts | 3 ++- .../main/ets/com/ohos/model/screenLockModel.ts | 10 +++++++++- .../main/ets/com/ohos/model/screenLockService.ts | 8 ++++++++ .../main/ets/com/ohos/vm/customPSDViewModel.ts | 1 + .../main/ets/com/ohos/vm/digitalPSDViewModel.ts | 1 + .../src/main/ets/com/ohos/vm/mixedPSDViewModel.ts | 1 + product/pc/src/main/ets/pages/customPassword.ets | 3 ++- product/pc/src/main/ets/pages/digitalPassword.ets | 3 ++- product/pc/src/main/ets/pages/mixedPassword.ets | 3 ++- product/pc/src/main/ets/pages/slidescreenlock.ets | 1 + .../src/main/ets/vm/slideScreenLockViewModel.ts | 1 + .../phone/src/main/ets/pages/customPassword.ets | 11 +++++++++++ .../phone/src/main/ets/pages/digitalPassword.ets | 11 +++++++++++ .../phone/src/main/ets/pages/mixedPassword.ets | 11 +++++++++++ .../phone/src/main/ets/pages/slidescreenlock.ets | 15 +++++++++++++-- .../src/main/ets/vm/slideScreenLockViewModel.ts | 1 + 16 files changed, 77 insertions(+), 7 deletions(-) diff --git a/common/src/main/ets/default/Trace.ts b/common/src/main/ets/default/Trace.ts index 55be59a6..117fc164 100644 --- a/common/src/main/ets/default/Trace.ts +++ b/common/src/main/ets/default/Trace.ts @@ -17,9 +17,10 @@ import byTrace from "@ohos.bytrace"; import Log from "./Log"; export default class Trace { + static readonly CORE_METHOD_UNLOCK_SCREEN = "startUnlockScreen" static readonly CORE_METHOD_CALL_ACCOUNT_SYSTEM = "startToCallAccountSubsystem"; static readonly CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT = "passingAccountSubsystemResult"; - static readonly CORE_METHOD_CALL_PAGE_HIDE = "startToHidePage"; + static readonly CORE_METHOD_HIDE_PSD_PAGE = "startToHidePsdPage"; private static readonly TRACE_TAG = 'ScreenLock:Trace'; private static readonly RECORD_TRACE = true; diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index 7cf9f111..83eb39c2 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -38,6 +39,13 @@ export default class ScreenLockModel { callback(); }) break; + case "systemReady": + ScreenLockMar.on(typeName, (err, data) => { + Log.showInfo(TAG, `eventListener:callback err: ${JSON.stringify(err)}, + data:${JSON.stringify(data)}`); + callback(); + }) + break; default: Log.showError(TAG, `eventListener:typeName ${typeName}`) } @@ -67,7 +75,7 @@ export default class ScreenLockModel { hiddenScreenLockWindow(callback: Callback) { Trace.end(Trace.CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT); windowManager.find(Constants.WIN_NAME).then((win) => { - Trace.start(Trace.CORE_METHOD_CALL_PAGE_HIDE); + Trace.start(Trace.CORE_METHOD_HIDE_PSD_PAGE); win.hide().then(() => { Log.showInfo(TAG, `window hide`); callback(); diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 17158283..10bfc6f2 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -41,6 +41,7 @@ const EVENT_BEGIN_SLEEP: string = 'beginSleep' const EVENT_END_SLEEP: string = 'endSleep' const EVENT_CHANGE_USER: string = 'changeUser' const EVENT_SCREENLOCK_ENABLE: string = 'screenlockEnabled' +const EVENT_SYSTEM_READY: string = 'systemReady' const UNLOCK_SCREEN_RESULT: string = 'unlockScreenResult' const SCREENLOCK_DRAW_DONE: string = 'screenDrawDone' @@ -88,6 +89,12 @@ export class ScreenLockService { monitorEvents() { Log.showDebug(TAG, 'registered events start'); + // System ready on device boot + this.screenLockModel.eventListener(EVENT_SYSTEM_READY, () => { + Log.showInfo(TAG, `EVENT_SYSTEM_READY event`); + this.lockScreen(); + }) + //Bright screen this.screenLockModel.eventListener(EVENT_END_SCREEN_ON, () => { Log.showInfo(TAG, `EVENT_END_SCREEN_ON event`); @@ -301,6 +308,7 @@ export class ScreenLockService { } destroy() { + this.screenLockModel.eventCancelListener(EVENT_SYSTEM_READY); this.screenLockModel.eventCancelListener(EVENT_END_SCREEN_ON); this.screenLockModel.eventCancelListener(EVENT_BEGIN_SLEEP); this.screenLockModel.eventCancelListener(EVENT_UNLOCK_SCREEN); diff --git a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts index 917f462d..74de8828 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/customPSDViewModel.ts @@ -67,6 +67,7 @@ export default class CustomPSDViewModel extends BaseViewModel { this.updateStorage(callback); return; } + Trace.start(Trace.CORE_METHOD_UNLOCK_SCREEN); Trace.start(Trace.CORE_METHOD_CALL_ACCOUNT_SYSTEM); service.authUser(AuthSubType.PIN_MIXED, this.passwordArr, (result, extraInfo) => { this.clearPassword(); diff --git a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts index 27a39345..23911607 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/digitalPSDViewModel.ts @@ -50,6 +50,7 @@ export default class DigitalPSDViewModel extends BaseViewModel { this.updateStorage(callback); } if (this.password.length >= PW_LEN) { + Trace.start(Trace.CORE_METHOD_UNLOCK_SCREEN); Trace.start(Trace.CORE_METHOD_CALL_ACCOUNT_SYSTEM); service.authUser(AuthSubType.PIN_SIX, this.password, (result, extraInfo) => { this.clearPassword() diff --git a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts index 69edb024..d9acd643 100644 --- a/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/vm/mixedPSDViewModel.ts @@ -47,6 +47,7 @@ export default class MixedPSDViewModel extends BaseViewModel { callback(); return; } + Trace.start(Trace.CORE_METHOD_UNLOCK_SCREEN); Trace.start(Trace.CORE_METHOD_CALL_ACCOUNT_SYSTEM); service.authUser(AuthSubType.PIN_MIXED, this.password, (result, extraInfo) => { this.clearPassword(); diff --git a/product/pc/src/main/ets/pages/customPassword.ets b/product/pc/src/main/ets/pages/customPassword.ets index bfeee240..d0efe1ac 100644 --- a/product/pc/src/main/ets/pages/customPassword.ets +++ b/product/pc/src/main/ets/pages/customPassword.ets @@ -47,8 +47,9 @@ export default struct CustomPassword { } onPageHide() { + Trace.end(Trace.CORE_METHOD_HIDE_PSD_PAGE); + Trace.end(Trace.CORE_METHOD_UNLOCK_SCREEN); Log.showInfo(TAG, `onPageHide`) - Trace.end(Trace.CORE_METHOD_CALL_PAGE_HIDE); } build() { diff --git a/product/pc/src/main/ets/pages/digitalPassword.ets b/product/pc/src/main/ets/pages/digitalPassword.ets index ca1a95c6..84b7337a 100644 --- a/product/pc/src/main/ets/pages/digitalPassword.ets +++ b/product/pc/src/main/ets/pages/digitalPassword.ets @@ -47,8 +47,9 @@ export default struct DigitalPassword { } onPageHide() { + Trace.end(Trace.CORE_METHOD_HIDE_PSD_PAGE); + Trace.end(Trace.CORE_METHOD_UNLOCK_SCREEN); Log.showInfo(TAG, `onPageHide`) - Trace.end(Trace.CORE_METHOD_CALL_PAGE_HIDE); } build() { diff --git a/product/pc/src/main/ets/pages/mixedPassword.ets b/product/pc/src/main/ets/pages/mixedPassword.ets index 25115aa4..3bc243ec 100644 --- a/product/pc/src/main/ets/pages/mixedPassword.ets +++ b/product/pc/src/main/ets/pages/mixedPassword.ets @@ -47,8 +47,9 @@ export default struct MixedPassword { } onPageHide() { + Trace.end(Trace.CORE_METHOD_HIDE_PSD_PAGE); + Trace.end(Trace.CORE_METHOD_UNLOCK_SCREEN); Log.showInfo(TAG, `onPageHide`) - Trace.end(Trace.CORE_METHOD_CALL_PAGE_HIDE); } build() { diff --git a/product/pc/src/main/ets/pages/slidescreenlock.ets b/product/pc/src/main/ets/pages/slidescreenlock.ets index 7b81de74..44e688b8 100644 --- a/product/pc/src/main/ets/pages/slidescreenlock.ets +++ b/product/pc/src/main/ets/pages/slidescreenlock.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log' import Accounts from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts' import DateTime from '../../../../../../features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime' diff --git a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts index 57a2ebfc..30cee0dd 100644 --- a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log'; import {ReadConfigFile} from '../../../../../../common/src/main/ets/default/ScreenLockCommon' import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' diff --git a/product/phone/src/main/ets/pages/customPassword.ets b/product/phone/src/main/ets/pages/customPassword.ets index 9e764a69..cce137f3 100644 --- a/product/phone/src/main/ets/pages/customPassword.ets +++ b/product/phone/src/main/ets/pages/customPassword.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log' import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' @@ -42,6 +43,16 @@ export default struct CustomPassword { Log.showInfo(TAG, `aboutToDisappear`) } + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + } + + onPageHide() { + Trace.end(Trace.CORE_METHOD_HIDE_PSD_PAGE); + Trace.end(Trace.CORE_METHOD_UNLOCK_SCREEN); + Log.showInfo(TAG, `onPageHide`) + } + build() { Stack() { Image($r('app.media.bg')).width(Constants.FULL_CONTAINER_WIDTH) diff --git a/product/phone/src/main/ets/pages/digitalPassword.ets b/product/phone/src/main/ets/pages/digitalPassword.ets index f425a7b8..47099d4f 100644 --- a/product/phone/src/main/ets/pages/digitalPassword.ets +++ b/product/phone/src/main/ets/pages/digitalPassword.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log' import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' @@ -42,6 +43,16 @@ export default struct DigitalPassword { Log.showInfo(TAG, `aboutToDisappear`) } + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + } + + onPageHide() { + Trace.end(Trace.CORE_METHOD_HIDE_PSD_PAGE); + Trace.end(Trace.CORE_METHOD_UNLOCK_SCREEN); + Log.showInfo(TAG, `onPageHide`) + } + build() { Stack() { Image($r('app.media.bg')).width(Constants.FULL_CONTAINER_WIDTH) diff --git a/product/phone/src/main/ets/pages/mixedPassword.ets b/product/phone/src/main/ets/pages/mixedPassword.ets index 28e340cb..b3a24ba6 100644 --- a/product/phone/src/main/ets/pages/mixedPassword.ets +++ b/product/phone/src/main/ets/pages/mixedPassword.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log' import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' @@ -42,6 +43,16 @@ export default struct MixedPassword { Log.showInfo(TAG, `aboutToDisappear`) } + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + } + + onPageHide() { + Trace.end(Trace.CORE_METHOD_HIDE_PSD_PAGE); + Trace.end(Trace.CORE_METHOD_UNLOCK_SCREEN); + Log.showInfo(TAG, `onPageHide`) + } + build() { Stack(){ Image($r("app.media.bg")) diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets index 1aa5a14f..521ea731 100644 --- a/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log' import Accounts from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts' import {UserData} from '../../../../../../features/screenlock/src/main/ets/com/ohos/data/userData' @@ -32,13 +33,24 @@ export default struct SlideScreenlock { @StorageLink('batteryCharging') @Watch('onCharging') batteryCharging: boolean = false @Prop @Watch("onStatusChange") pageStatus: number @StorageLink('deviceStatus') @Watch('onDeviceStatusChange') deviceStatus: string = "" - @StorageLink("userList") accountList: UserData[] = [] private mHeightPx : number = 48 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) this.mViewModel.ViewModelInit() } + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisAppear`) + } + + onPageShow() { + Log.showInfo(TAG, `onPageShow`) + } + + onPageHide() { + Log.showInfo(TAG, `onPageHide`) + } + build() { Stack({ alignContent: Alignment.Bottom }) { Column() { @@ -82,7 +94,6 @@ export default struct SlideScreenlock { .height($r("app.float.accounts_area_height")) } .margin({ top: $r("app.float.accounts_area_margin_top") }) - .visibility(this.accountList.length > 1 ? Visibility.Visible : Visibility.None) Column() { LockIcon() diff --git a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts index de8af03e..a60c22df 100644 --- a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts @@ -13,6 +13,7 @@ * limitations under the License. */ +import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log'; import {ReadConfigFile} from '../../../../../../common/src/main/ets/default/ScreenLockCommon' import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' -- Gitee From aa9ec7623eb8eb288fc889a8cac0cb76142df75a Mon Sep 17 00:00:00 2001 From: a1nc Date: Tue, 28 Jun 2022 15:18:35 +0800 Subject: [PATCH 180/373] remove useless imports Signed-off-by: yangpeng85 --- product/pc/src/main/ets/vm/slideScreenLockViewModel.ts | 1 - product/phone/src/main/ets/pages/slidescreenlock.ets | 1 - product/phone/src/main/ets/vm/slideScreenLockViewModel.ts | 1 - 3 files changed, 3 deletions(-) diff --git a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts index 30cee0dd..57a2ebfc 100644 --- a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts @@ -13,7 +13,6 @@ * limitations under the License. */ -import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log'; import {ReadConfigFile} from '../../../../../../common/src/main/ets/default/ScreenLockCommon' import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets index 521ea731..274dbc0f 100644 --- a/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -13,7 +13,6 @@ * limitations under the License. */ -import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log' import Accounts from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts' import {UserData} from '../../../../../../features/screenlock/src/main/ets/com/ohos/data/userData' diff --git a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts index a60c22df..de8af03e 100644 --- a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts @@ -13,7 +13,6 @@ * limitations under the License. */ -import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log'; import {ReadConfigFile} from '../../../../../../common/src/main/ets/default/ScreenLockCommon' import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' -- Gitee From b3d9f36bf25a537e406ff857ef7f86bb4065e5e3 Mon Sep 17 00:00:00 2001 From: r00498791 Date: Thu, 30 Jun 2022 15:25:11 +0800 Subject: [PATCH 181/373] modify instructions.md Signed-off-by: r00498791 --- doc/Instructions.md | 52 +++++++++------------------------------- figures/signature_1.png | Bin 20463 -> 21932 bytes figures/signature_2.png | Bin 37697 -> 46451 bytes 3 files changed, 11 insertions(+), 41 deletions(-) diff --git a/doc/Instructions.md b/doc/Instructions.md index 9fcffe82..2a6e2292 100644 --- a/doc/Instructions.md +++ b/doc/Instructions.md @@ -1,23 +1,22 @@ # SystemUI 使用说明 ## 代码使用 ### 代码下载 -#### 配置码云ssh -1. 打开本地git bash窗口 -2. 进入到.ssh 目录:cd ~/.ssh -3. 找到id_rsa.pub文件:ls -4. 查看公钥:cat id_rsa.pub -5. 在码云个人设置-安全设置-ssh公钥中配置公钥 +#### 配置码云ssh +1. 安装Git +2. 生成公钥,[参考链接](https://gitee.com/help/articles/4181#article-header0) +3. 在码云个人设置-安全设置-ssh公钥中配置公钥 #### 下载代码 - 1. 打开码云SystemUI地址([下载地址](https://gitee.com/openharmony/applications_systemui))。 - 2. 选择克隆/下载 - ssh方式 -复制下载地址 + 1. 打开码云SystemUI地址,[下载地址](https://gitee.com/openharmony/applications_systemui) + 2. 选择克隆/下载 - https方式 -复制下载地址 3. 本机git bash 中执行: ``` git clone '复制的下载地址' ``` ### 环境搭建 -安装DevEco Studio +1. 安装DevEco Studio +2. 按照操作指引安装OpenHarmony SDK ## 基础开发说明 ### 系统接口调用 @@ -86,46 +85,17 @@ this.title = this.$r('app.string.hello_world'); ## 签名打包 ### 签名 #### 签名文件的获取 -1. 拷贝OpenHarmony标准版 工程的 prebuilts\signcenter 目录到操作目录 +1. 拷贝OpenHarmony标准版 工程的 OpenHarmony\signcenter_tool 目录到操作目录 2. 拷贝SystemUI 工程的 signature\systemui.p7b 到该目录下 #### 签名文件的配置 打开项目工程,选择 File → Project Structure ![](../figures/signature_1.png) -选择 Modules → Signing Configs,将对应的签名文件配置如下,完成后点击Apply,再点击OK。 +选择 Project → Signing Configs,将对应的签名文件配置如下,完成后点击Apply,再点击OK。 ![](../figures/signature_2.png) -### 打包 -DevEco Studio 支持 debug 与 release 两种打包类型。可以在 OhosBuild Variants 窗口中进行切换。 - - ![](../figures/ds_ohosbuild_variants.png) - -#### debug打包 -1. 代码准备完成后,在 OhosBuild Variants 窗口的 Selected Variant 中选择 debug。 - - ![](../figures/ds_ohosbuild_variants_debug.png) - -2. 选择Build → Build Haps(s)/APP(s) → Build Hap(s) - - ![](../figures/ds_build_haps.png) - -3. 编译完成后,hap包会生成在工程目录下的 `\build\outputs\hap\debug\phone\`路径下(如果没有配置签名,则只会生成未签名的hap包) - - ![](../figures/ds_ohosbuild_output_dir_debug.png) -#### release打包 -1. 代码准备完成后,在 OhosBuild Variants 窗口的 Selected Variant 中选择 release - - ![](../figures/ds_ohosbuild_variants_release.png) - -2. 选择Build → Build Haps(s)/APP(s) → Build Hap(s) - - ![](../figures/ds_build_haps.png) - -3. 编译完成后,hap包会生成在工程目录下的 `\build\outputs\hap\release\phone\`路径下(配置好签名后,生成的hap包会显示signed) - - ![](../figures/ds_ohosbuild_output_dir_release.png) ## 安装、运行、调试 ## 应用安装 配置 hdc: @@ -219,7 +189,7 @@ hilog │ grep Label 3. Fork 成功之后,会在自己的账号下看见 fork 的代码仓库。 ### 提交代码 -1. 访问我们自己在码云账号上 fork 的代码仓库,点击“克隆/下载”按钮,选择 SSH,点击“复制”按钮。 +1. 访问我们自己在码云账号上 fork 的代码仓库,点击“克隆/下载”按钮,选择 SSH/HTTPS,点击“复制”按钮。 2. 在本地新建 SystemUI 目录,在 SystemUI 目录中执行如下命令 ``` diff --git a/figures/signature_1.png b/figures/signature_1.png index 42aeb4501069525d9d25636b70ce23389ce0d9ef..2e8ecf312f18fe4fbc84eb2984a8d8e0d54fd681 100644 GIT binary patch literal 21932 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 diff --git a/figures/signature_2.png b/figures/signature_2.png index 941a90d87ef88bd30a953175610eb416a5441bdf..ff39d7a493824c2e3000d73983d99951ec2c0d61 100644 GIT binary patch literal 46451 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 W-Dzi9Gkn+-CCDenoB3Gn)&BvStV)6a -- Gitee From 91e550d3986fc5ae9d8b37e6e8135883926382ec Mon Sep 17 00:00:00 2001 From: a1nc Date: Sat, 2 Jul 2022 11:14:38 +0800 Subject: [PATCH 182/373] fix no date and time and other UI component on ScreenLock page as the UI component's opacity is 0 Signed-off-by: yangpeng85 --- product/pc/src/main/ets/vm/slideScreenLockViewModel.ts | 3 +++ product/phone/src/main/ets/vm/slideScreenLockViewModel.ts | 3 +++ 2 files changed, 6 insertions(+) diff --git a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts index 57a2ebfc..bf6183c0 100644 --- a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts @@ -45,6 +45,9 @@ export default class SlideScreenLockViewModel { this.backgroundScale = 1 setTimeout(() => { callback() + this.elementAlpha = 1 + this.elementScale = 1 + this.backgroundScale = 1.1 }, 250); }) this.slidingLength = SLIDING_LENGTH diff --git a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts index de8af03e..dde05aa8 100644 --- a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts @@ -45,6 +45,9 @@ export default class SlideScreenLockViewModel { this.backgroundScale = 1 setTimeout(() => { callback() + this.elementAlpha = 1 + this.elementScale = 1 + this.backgroundScale = 1.1 }, 250); }) this.slidingLength = SLIDING_LENGTH -- Gitee From 3334cff54ee103cbdda4cd23b84480f27ed5ce47 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 2 Jul 2022 17:54:33 +0800 Subject: [PATCH 183/373] Increase distributed permissions Signed-off-by: lijinfengde123 --- entry/pc/src/main/module.json5 | 3 +++ entry/phone/src/main/module.json5 | 3 +++ 2 files changed, 6 insertions(+) diff --git a/entry/pc/src/main/module.json5 b/entry/pc/src/main/module.json5 index 7bb6c058..e6bee67e 100644 --- a/entry/pc/src/main/module.json5 +++ b/entry/pc/src/main/module.json5 @@ -68,6 +68,9 @@ }, { "name": "ohos.permission.MODIFY_AUDIO_SETTINGS" + }, + { + "name": "ohos.permission.DISTRIBUTED_DATASYNC" } ] } diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index 593e834d..373a8522 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -68,6 +68,9 @@ }, { "name": "ohos.permission.MODIFY_AUDIO_SETTINGS" + }, + { + "name": "ohos.permission.DISTRIBUTED_DATASYNC" } ] } -- Gitee From 7bf6aaf5afcca722b286ada9970539f2a99719af Mon Sep 17 00:00:00 2001 From: lizhi Date: Sat, 2 Jul 2022 18:17:18 +0800 Subject: [PATCH 184/373] add ring mode Signed-off-by: lizhi --- .../view/NotificationListComponent.ets | 2 +- .../ohos/noticeItem/view/item/groupItem.ets | 15 ++++++---- .../ets/com/ohos/model/RingModeService.ts | 15 ++++++---- .../main/ets/com/ohos/viewmodel/RingModeVM.ts | 4 +-- .../com/ohos/pages/VolumePanelComponent.ets | 2 +- .../ets/com/ohos/viewmodel/VolumePanelVM.ts | 28 +++++++++++++++++-- .../src/main/ets/pages/notification.ets | 7 +++-- 7 files changed, 52 insertions(+), 21 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index c9d5b94b..45b2f48a 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -57,7 +57,7 @@ export default struct NotificationListComponent { } }, (list: any) => JSON.stringify(list.map((item) => item.hashcode))) } + .align(Alignment.Top) .width('100%') - .flexShrink(1) } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index e86cec27..819350ce 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -59,15 +59,19 @@ export default struct GroupItem { distributedDeviceName: this.distributedDeviceName, clickTitleAction: () => null }) - }.backgroundColor($r('app.color.notificationitem_background')) + } + .flexShrink(0) + .backgroundColor($r('app.color.notificationitem_background')) .width(Constants.FULL_CONTAINER_WIDTH) if (this.toExpand) { - Row().height($r("app.float.notice_divider")).width('100%') + Row().height($r("app.float.notice_divider")).width('100%').flexShrink(0) } - Row() { + Column() { ContentList({ groupData: this.groupData, toExpand: this.toExpand }) - }.width(Constants.FULL_CONTAINER_WIDTH) + } + .flexShrink(1) + .width(Constants.FULL_CONTAINER_WIDTH) .enabled(!this.mEdgeEnd) } .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) @@ -101,7 +105,6 @@ export default struct GroupItem { } } - @Component struct ContentList { @State @Watch('remainderChange') groupData: any[] = [] @@ -182,7 +185,7 @@ struct ContentList { strokeWidth: 1, color: $r('app.color.device_divider_color') }) - .flexShrink(1) + .align(Alignment.Top) } } .alignItems(HorizontalAlign.Start) diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts index d5e80586..3f1242d0 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/model/RingModeService.ts @@ -28,7 +28,7 @@ export interface RingModeStatusListener { export class RingModeService { mIsStart = false; - mListener: RingModeStatusListener; + mListeners = new Set(); mAudioManager: any; startService(): void { @@ -44,7 +44,7 @@ export class RingModeService { this.mAudioManager.on('ringerModeChange', (data: AudioRingMode) => { Log.showInfo(TAG, `startService->ringerModeChange, data: ${JSON.stringify(data)}`); - this.mListener?.updateRingerMode(data); + this.mListeners.forEach(listener => listener.updateRingerMode(data)); }); } @@ -59,8 +59,13 @@ export class RingModeService { } registerListener(listener: RingModeStatusListener): void { - Log.showInfo(TAG, `registerListener, listener: ${listener}`); - this.mListener = listener; + let res = this.mListeners.add(listener); + Log.showInfo(TAG, `registser ringMode Listener ${res}`); + } + + unregisterListener(listener: RingModeStatusListener): void { + let res = this.mListeners.delete(listener); + Log.showInfo(TAG, `unregistser ringMode Listener ${res}`); } getRingerMode(): void { @@ -69,7 +74,7 @@ export class RingModeService { if (error) { return; } - this.mListener?.updateRingerMode(action); + this.mListeners.forEach(listener => listener.updateRingerMode(action)); }); } diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts b/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts index 6f637328..3195c09d 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/viewmodel/RingModeVM.ts @@ -43,9 +43,7 @@ export class RingModeVM { this.mRingModeComponentMode = AppStorage.SetAndLink(RING_MODE_COMPONENT_MODE_KEY, AudioRingMode.RINGER_MODE_NORMAL); - RingModeService.registerListener({ - 'updateRingerMode': this.updateRingerMode.bind(this) - }); + RingModeService.registerListener(this); RingModeService.startService(); } diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets index 9eff89fe..ae4cdcd5 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets @@ -149,7 +149,7 @@ export default struct VolumePanelComponent { onMuteBtnClick(event: ClickEvent) { Log.showInfo(TAG, `onMuteBtnClick`); - ViewModel.mute() + ViewModel.mute(true); } onSettingsBtnClick(event: ClickEvent) { diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts index 46548b64..93dffa7a 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts @@ -17,6 +17,8 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import Constants from '../common/Constants'; import { AudioVolumeType, VolumeInfo } from '../common/Constants'; import VolumePanelService from '../model/VolumePanelService'; +import RingModeService from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/model/RingModeService'; +import { AudioRingMode } from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/common/Constants'; import VolumeWindowController from '../common/VolumeWindowController'; export const VOLUME_PANEL_MAX_VOLUME_KEY = 'VolumePanelMaxVolume'; @@ -65,6 +67,8 @@ export class VolumePanelVM { }); VolumePanelService.startService(); VolumePanelService.registerListener(this); + RingModeService.startService(); + RingModeService.registerListener(this); this.mAllVolumeTypes.forEach((volumeType: AudioVolumeType) => { VolumePanelService.getMaxVolume(volumeType, (volumeType: AudioVolumeType, value: number) => this.updateMaxVolume(volumeType, value)); VolumePanelService.getMinVolume(volumeType, (volumeType: AudioVolumeType, value: number) => this.updateMinVolume(volumeType, value)); @@ -129,12 +133,25 @@ export class VolumePanelVM { Log.showInfo(TAG, `updateVolumeInfo, mCurrentAudioVolume: ${this.mCurrentAudioVolume} , mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType}`); this.mVolumeBeforeMute = minVolume; - this.mIsMute.set(volumeInfo.isMute); + if (volumeInfo.isMute != this.mIsMute.get()) { + this.mIsMute.set(volumeInfo.isMute); + RingModeService.setRingerMode(volumeInfo.isMute ? AudioRingMode.RINGER_MODE_SILENT : AudioRingMode.RINGER_MODE_NORMAL); + } Log.showInfo(TAG, `updateVolumeInfo, mIsMute: ${this.mIsMute.get()} `); this.updateDisplayVolume(volumeInfo.isMute ? minVolume : volumeInfo.volume, maxVolume, minVolume); } + updateRingerMode(mode: AudioRingMode): void { + Log.showInfo(TAG, `updateRingerMode, mode: ${JSON.stringify(mode)} `); + let needMute = mode == AudioRingMode.RINGER_MODE_SILENT; + if (needMute == this.mIsMute.get()) { + Log.showInfo(TAG, `mute is: ${needMute}, No need change`); + return; + } + this.mute(false); + } + updateDisplayVolume(volume: number, maxVolume: number, minVolume: number): void{ Log.showInfo(TAG, `updateDisplayVolume, volume: ${volume} maxVolume: ${maxVolume} minVolume: ${minVolume}`); let displayVolume: number = volume + minVolume; @@ -163,11 +180,14 @@ export class VolumePanelVM { VolumeWindowController.getInstance().updateVolumeInfo(null); } - mute(): void { + mute(needSetRingMode: boolean): void { Log.showInfo(TAG, `mute, isMute: ${this.mIsMute.get()} mCurrentAudioVolume: ${this.mCurrentAudioVolume}`); this.mUpdatingAudioVolume = undefined; let isMute: boolean = this.mIsMute.get(); isMute = !isMute; + if (needSetRingMode) { + RingModeService.setRingerMode(isMute ? AudioRingMode.RINGER_MODE_SILENT : AudioRingMode.RINGER_MODE_NORMAL); + } let maxVolume: number = this.mMaxVolume.get(); let minVolume: number = this.mMinVolume.get(); let volume = isMute ? minVolume : (minVolume == this.mVolumeBeforeMute ? (minVolume + 1) : this.mVolumeBeforeMute); @@ -179,7 +199,9 @@ export class VolumePanelVM { this.mVolumeBeforeMute = currentAudioVolume; } }); - VolumeWindowController.getInstance().updateVolumeInfo(null); + if (needSetRingMode) { + VolumeWindowController.getInstance().updateVolumeInfo(null); + } } } diff --git a/product/pc/notificationpanel/src/main/ets/pages/notification.ets b/product/pc/notificationpanel/src/main/ets/pages/notification.ets index 77bec309..60c526da 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/notification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/notification.ets @@ -39,7 +39,10 @@ export default struct Notification { build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { - CenterTitle() + Column() { + CenterTitle() + } + .flexShrink(0) if (this.notificationList.length == 0) { Text($r("app.string.no_notification")) .fontColor($r("sys.color.ohos_id_color_text_primary")) @@ -51,7 +54,7 @@ export default struct Notification { Column() { NotificationListComponent({ config: { itemMargin: NOTIFICATION_ITEM_MARGIN } }) } - .flexGrow(1) + .flexShrink(1) } }.padding({ left: NOTIFICATION_TOTAL_MARGIN, right: NOTIFICATION_TOTAL_MARGIN }) .width('100%') -- Gitee From 8a44e5d3eed473603d500d4c99097c5ed57e2a26 Mon Sep 17 00:00:00 2001 From: lvxiaoqiang Date: Mon, 4 Jul 2022 14:20:30 +0800 Subject: [PATCH 185/373] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=88=B6=E5=BC=8F=E4=B8=8D=E8=81=94=E5=8A=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lvxiaoqiang --- common/src/main/ets/default/TimeManager.ts | 4 ++-- .../src/main/ets/com/ohos/vm/dateTimeViewModel.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts index e17f4987..aa43ff02 100644 --- a/common/src/main/ets/default/TimeManager.ts +++ b/common/src/main/ets/default/TimeManager.ts @@ -32,7 +32,7 @@ export type TimeEventArgs = { const TAG = "TimeManager"; const URI_VAR = "dataability:///com.ohos.settingsdata.DataAbility"; -const TIME_FORMAT_KEY = "settings.time.format"; +const TIME_FORMAT_KEY = settings.date.TIME_FORMAT; const TIME_SUBSCRIBE_INFO = { events: [ commonEvent.Support.COMMON_EVENT_TIME_CHANGED, @@ -86,11 +86,11 @@ class TimeManager { Log.showError(TAG, `failed to getAbilityWant, code: ${err.code}.`); return; } + this.handleTimeFormatChange(); }); } catch (e) { Log.showError(TAG, `Can't listen timeformate change.`); } - this.handleTimeFormatChange(); } private handleTimeFormatChange() { diff --git a/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts b/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts index f48100ed..e013bc86 100644 --- a/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts +++ b/features/datetimecomponent/src/main/ets/com/ohos/vm/dateTimeViewModel.ts @@ -15,7 +15,6 @@ import featureAbility from '@ohos.ability.featureAbility' import commonEvent from '@ohos.commonEvent'; -import settings from '@ohos.settingsnapi'; import Log from '../../../../../../../../common/src/main/ets/default/Log' import DateTimeCommon from '../../../../../../../../common/src/main/ets/default/DateTimeCommon' import sTimeManager, {TimeEventArgs, TIME_CHANGE_EVENT, -- Gitee From 164f1429b3ed64c23372b623cbea282e7b892ebf Mon Sep 17 00:00:00 2001 From: a1nc Date: Tue, 5 Jul 2022 14:08:38 +0800 Subject: [PATCH 186/373] =?UTF-8?q?=E4=BF=AE=E5=A4=8DScreenLock=E6=94=B6?= =?UTF-8?q?=E5=88=B0=E6=B6=88=E6=81=AF=E9=80=9A=E7=9F=A5=E5=90=8E=E8=BF=87?= =?UTF-8?q?=E4=BA=8E=E9=A2=91=E7=B9=81=E5=88=B7=E6=96=B0UI=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yangpeng85 --- .../ets/com/ohos/noticeItem/view/item/groupItem.ets | 10 ++++++++-- .../com/ohos/noticeItem/view/item/notificationItem.ets | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index a5ec656a..35e95115 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -82,8 +82,14 @@ export default struct GroupItem { .scrollable(ScrollDirection.Horizontal) .scrollBar(BarState.On) .onScroll(() => { - this.mIconAlpha += 0.1; - this.mIconAlpha = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize(); + let accuracy = 0.1 + let newOpacity = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize() + let diffs = Math.abs(this.mIconAlpha - newOpacity) + if (diffs >= accuracy) { + let finalAlpha = newOpacity < accuracy ? 0 : newOpacity + finalAlpha = finalAlpha > (1 - accuracy) ? 1 : finalAlpha + this.mIconAlpha = finalAlpha + } }) .onScrollEnd(() => { this.mEdgeEnd = (this.mEdgeEnd && diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 8d38bc82..bd61783f 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -47,8 +47,14 @@ export default struct NotificationItem { .scrollable(ScrollDirection.Horizontal) .scrollBar(BarState.On) .onScroll(() => { - this.mIconAlpha += 0.1; - this.mIconAlpha = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize(); + let accuracy = 0.1 + let newOpacity = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize() + let diffs = Math.abs(this.mIconAlpha - newOpacity) + if (diffs >= accuracy) { + let finalAlpha = newOpacity < accuracy ? 0 : newOpacity + finalAlpha = finalAlpha > (1 - accuracy) ? 1 : finalAlpha + this.mIconAlpha = finalAlpha + } }) .onScrollEnd(() => { this.mEdgeEnd = (this.mEdgeEnd && -- Gitee From 0884b1dfb99c0ace9f76f8a96d40183ddb97bb26 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Tue, 5 Jul 2022 14:44:19 +0800 Subject: [PATCH 187/373] Fix Bug: Repeat Refresh Signed-off-by: xuchangzhou --- .../ets/com/ohos/noticeItem/view/item/groupItem.ets | 10 ++++++++-- .../com/ohos/noticeItem/view/item/notificationItem.ets | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 819350ce..225fbb02 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -87,8 +87,14 @@ export default struct GroupItem { .scrollable(ScrollDirection.Horizontal) .scrollBar(BarState.On) .onScroll(() => { - this.mIconAlpha += 0.1; - this.mIconAlpha = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize(); + let accuracy = 0.1 + let newOpacity = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize() + let diffs = Math.abs(this.mIconAlpha - newOpacity) + if (diffs >= accuracy) { + let finalAlpha = newOpacity < accuracy ? 0 : newOpacity + finalAlpha = finalAlpha > (1 - accuracy) ? 1 : finalAlpha + this.mIconAlpha = finalAlpha + } }) .onScrollEnd(() => { this.mEdgeEnd = (this.mEdgeEnd && diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index d332f678..78ab283c 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -47,8 +47,14 @@ export default struct NotificationItem { .scrollable(ScrollDirection.Horizontal) .scrollBar(BarState.On) .onScroll(() => { - this.mIconAlpha += 0.1; - this.mIconAlpha = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize(); + let accuracy = 0.1 + let newOpacity = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize() + let diffs = Math.abs(this.mIconAlpha - newOpacity) + if (diffs >= accuracy) { + let finalAlpha = newOpacity < accuracy ? 0 : newOpacity + finalAlpha = finalAlpha > (1 - accuracy) ? 1 : finalAlpha + this.mIconAlpha = finalAlpha + } }) .onScrollEnd(() => { this.mEdgeEnd = (this.mEdgeEnd && -- Gitee From 03bced854d863e22aa62f1420c0f5b48f544b421 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Tue, 5 Jul 2022 14:45:13 +0800 Subject: [PATCH 188/373] PluginComponent for the ControlPanel Signed-off-by: xuchangzhou --- .../src/main/ets/com/ohos/common/Constants.ts | 1 + .../com/ohos/model/ControlCenterService.ts | 5 ++ .../ohos/pages/PluginIconItemComponent.ets | 66 +++++++++++++++++++ .../com/ohos/pages/SimpleToggleComponent.ets | 44 ++++++++----- .../ets/com/ohos/viewmodel/ControlCenterVM.ts | 35 +++++++++- .../ServiceExtAbility/ServiceExtAbility.ts | 2 + 6 files changed, 137 insertions(+), 16 deletions(-) create mode 100644 features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts b/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts index 22cdce7c..2f4732d7 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/common/Constants.ts @@ -33,6 +33,7 @@ export default class Constants { static readonly CONTROL_CENTER_TITLE_ICON_HOVER_HEIGHT = '64vp'; static readonly CONTROL_CENTER_TITLE_ICON_HOVER_RADIUS = '16vp'; static readonly SIMPLE_TOGGLE_EDIT_DIALOG_DIVIDER_WIDTH = '1vp'; + static readonly PLUGIN_COMPONENT_OWNER_WANT_KEY = 'ControlCenter_PluginComponentOwnerWant'; } export type ControlComponentData = ItemComponentData & { diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index b0dd6ec5..0b9cb5c8 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -42,6 +42,10 @@ const CONTROLCENTER_SOURCE_CONFIG = { action: 'com.ohos.systemui.action.TOGGLE', permission: null, }, + PluginSourceLoader: { + action: 'com.ohos.systemui.action.TOGGLE', + permission: null, + }, }, }; @@ -82,6 +86,7 @@ export class ControlCenterService { SwitchUserManager.getInstance().registerListener(this); CONTROLCENTER_SOURCE_CONFIG.filterDatas = config.MetaToggles; this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); + this.mAdapter.setWant(globalThis[Constants.PLUGIN_COMPONENT_OWNER_WANT_KEY]);//xuchanghzou this.mAdapter.initDataSource(CONTROLCENTER_SOURCE_CONFIG); } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets new file mode 100644 index 00000000..54a657a0 --- /dev/null +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -0,0 +1,66 @@ +//@ts-nocheck +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import { PluginComponentData } from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants"; +import ViewModel from '../viewmodel/ControlCenterVM'; +import StyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/StyleConfiguration'; + +const TAG = 'PluginIconItemComponent'; + +@Component +export default struct PluginIconItemComponent { + private keyId: string; + private mEditMode: boolean = false; + private mDragMode: boolean = false; + @State @Watch('onPluginDataChange') mPluginData: PluginComponentData = new PluginComponentData(); + + aboutToAppear() { + Log.showInfo(TAG, `aboutToAppear Start, keyId: ${this.keyId}`); + this.linkItemData(); + + } + + aboutToDisappear() { + Log.showInfo(TAG, `aboutToDisappear`); + } + + linkItemData() { + Log.showInfo(TAG, `linkItemData, keyId: ${this.keyId}`); + this.mPluginData = ViewModel.getPluginData(this.keyId); + } + + onPluginDataChange(propName: string): void { + Log.showInfo(TAG, `onPluginDataChange, propName: ${propName} template: ${JSON.stringify(this.mPluginData.template)} data: ${JSON.stringify(this.mPluginData.data)}`); + } + + build() { + Row() { + if (this.mPluginData.template && this.mPluginData.data && Object.keys(this.mPluginData.data).length > 0) { + PluginComponent({ + template: this.mPluginData.template, + data: this.mPluginData.data + }).onComplete(() => { + Log.showInfo(TAG, `PluginComponent.Complete`) + }).onError(({errcode, msg}) => { + Log.showInfo(TAG, `PluginComponent.Error code:${errcode} message:${msg}`) + }) + .size({ width: '100%', height: '100%' }) + } + }.height('100%') + } +} \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets index b78c392c..922b77c6 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleComponent.ets @@ -16,6 +16,8 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager'; import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase'; +import PluginIconItemComponent from './PluginIconItemComponent'; +import {PluginType} from "../../../../../../../../common/src/main/ets/plugindatasource/common/Constants" const TAG = 'SimpleToggleComponent'; @@ -46,21 +48,33 @@ export default struct SimpleToggleComponent { build() { Column() { - SimpleToggleBase({ - mToggleId: this.keyId, - mIcon: $mDefaultIcon, - mIconStr: this.mItemData.get().iconUrl, - mUseIconStr: true, - mChangeSwitch: this.mDefaultChangeSwitch, - mLabel: $mDefaultLabel, - mLabelStr: this.mItemData.get().label, - mUseLabelStr: true, - mEditMode: this.mEditMode, - mDragMode: this.mDragMode, - mClickEvent: () => this.onIconItemClick(), - mLongClickEvent: () => this.onIconItemLongPressGesture() - }) - }.width('100%') + if (this.mItemData.get().pluginType == PluginType.META) { + SimpleToggleBase({ + mToggleId: this.keyId, + mIcon: $mDefaultIcon, + mIconStr: this.mItemData.get().iconUrl, + mUseIconStr: true, + mChangeSwitch: this.mDefaultChangeSwitch, + mLabel: $mDefaultLabel, + mLabelStr: this.mItemData.get().label, + mUseLabelStr: true, + mEditMode: this.mEditMode, + mDragMode: this.mDragMode, + mClickEvent: () => this.onIconItemClick(), + mLongClickEvent: () => this.onIconItemLongPressGesture() + }) + } else if (this.mItemData.get().pluginType == PluginType.DATA_ABILITY) { + // TODO: + } else if (this.mItemData.get().pluginType == PluginType.PLUGIN_COMPONENT) { + PluginIconItemComponent({ + keyId: this.keyId, + mEditMode: this.mEditMode, + mDragMode: this.mDragMode + }) + } + + } + .width('100%') .height('100%') } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts index 8c46a5d4..f7b81776 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/viewmodel/ControlCenterVM.ts @@ -17,6 +17,8 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; import { ControlComponentData, ControlCenterConfig } from '../common/Constants'; import ControlCenterService from '../model/ControlCenterService'; +import { PluginType, PluginComponentData +} from '../../../../../../../../common/src/main/ets/plugindatasource/common/Constants'; export const CONTROL_CENTER_COMPLEX_TOGGLE_LAYOUT_KEY = 'ControlCenterComplexToggleLayout'; @@ -68,9 +70,40 @@ export class ControlCenterVM { if (itemData) { AppStorage.SetOrCreate(storageKey, itemData); } else { - let deleteRs = AppStorage.Delete(storageKey); + let deleteRs: boolean = AppStorage.Delete(storageKey); Log.showDebug(TAG, `setItemData, AppStorage.Delete rs: ${deleteRs} `); } + this.setPluginData(id, itemData); + } + + + setPluginData(id: string, itemData: ControlComponentData): void{ + Log.showInfo(TAG, `setPluginData, itemData: ${JSON.stringify(itemData)}`); + if (itemData && itemData.pluginType == PluginType.PLUGIN_COMPONENT) { + let data = undefined; + if (itemData.actionData.pluginData && itemData.actionData.pluginData.data) { + data = JSON.parse(JSON.stringify(itemData.actionData.pluginData.data)); + } + let pluginData = this.getPluginData(id); + pluginData.template = itemData.actionData.pluginData.template; + pluginData.data = data; + Log.showInfo(TAG, `setPluginData, pluginData: ${JSON.stringify(pluginData)} `); + } else { + let storageKey = 'ControlCenter_PluginIcon_' + id; + if (AppStorage.Has(storageKey)) { + let deleteRs: boolean = AppStorage.Delete(storageKey); + Log.showInfo(TAG, `setPluginData, AppStorage.Delete rs: ${String(deleteRs)} `); + } + } + } + + getPluginData(id: string): PluginComponentData { + Log.showInfo(TAG, `getPluginData, id: ${id}`); + let storageKey = 'ControlCenter_PluginIcon_' + id; + if (!AppStorage.Has(storageKey)) { + AppStorage.SetOrCreate(storageKey, new PluginComponentData()); + } + return AppStorage.Get(storageKey); } getDisplayingSimpleToggles(): string[]{ diff --git a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index dac5fc95..ad2eb451 100644 --- a/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/controlpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -19,6 +19,7 @@ import Log from '../../../../../../../common/src/main/ets/default/Log'; import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import { Want } from 'ability/want'; +import ControlCenterConstants from '../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/Constants'; const TAG = 'ControlPanel_ServiceExtAbility'; @@ -26,6 +27,7 @@ class ServiceExtAbility extends ServiceExtension { async onCreate(want: Want): Promise { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_CONTROL_PANEL, this.context); + globalThis[ControlCenterConstants.PLUGIN_COMPONENT_OWNER_WANT_KEY] = want; let dis = await display.getDefaultDisplay(); Log.showDebug(TAG, `onCreate, dis: ${JSON.stringify(dis)}`); -- Gitee From 68ff090cf8ea6670ed408ea662f621c3612dc9bf Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Tue, 5 Jul 2022 14:49:24 +0800 Subject: [PATCH 189/373] PluginComponent for the ControlPanel Signed-off-by: xuchangzhou --- .../src/main/ets/com/ohos/pages/PluginIconItemComponent.ets | 1 - 1 file changed, 1 deletion(-) diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets index 54a657a0..f4f8f544 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -1,4 +1,3 @@ -//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); -- Gitee From e99a0f0641c0490570c6422477e91712a8af27f8 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Tue, 5 Jul 2022 15:35:56 +0800 Subject: [PATCH 190/373] update UI Signed-off-by: xuchangzhou --- .../main/resources/base/element/float.json | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/features/noticeitem/src/main/resources/base/element/float.json b/features/noticeitem/src/main/resources/base/element/float.json index 06db5cb7..ce356e3f 100644 --- a/features/noticeitem/src/main/resources/base/element/float.json +++ b/features/noticeitem/src/main/resources/base/element/float.json @@ -46,23 +46,23 @@ }, { "name": "title_image_width", - "value": "48vp" + "value": "28vp" }, { "name": "title_image_height", - "value": "48vp" + "value": "28vp" }, { "name": "title_font_height", - "value": "56vp" + "value": "26vp" }, { "name": "title_font_margin_t", - "value": "20vp" + "value": "10vp" }, { "name": "message_font_margin_t", - "value": "35vp" + "value": "8vp" }, { "name": "title_name_fontsize", @@ -86,11 +86,11 @@ }, { "name": "setting_title_fontsize", - "value": "40fp" + "value": "20fp" }, { "name": "setting_cont_fontsize", - "value": "32fp" + "value": "16fp" }, { "name": "setting_border_width", @@ -102,35 +102,35 @@ }, { "name": "setting_dialog_height", - "value": "384vp" + "value": "184vp" }, { "name": "setting_dialog_width", - "value": "672vp" + "value": "272vp" }, { "name": "setting_dialog_row_width", - "value": "608vp" + "value": "208vp" }, { "name": "setting_dialog_row_height", - "value": "80vp" + "value": "40vp" }, { "name": "confirm_dialog_height", - "value": "284vp" + "value": "124vp" }, { "name": "confirm_dialog_width", - "value": "672vp" + "value": "272vp" }, { "name": "confirm_dialog_row_width", - "value": "576vp" + "value": "176vp" }, { "name": "confirm_dialog_button_width", - "value": "362vp" + "value": "262vp" }, { "name": "notification_border_radius", @@ -170,7 +170,7 @@ }, { "name": "confirm_button_margin_t", - "value": "50vp" + "value": "20vp" }, { "name": "icon_item_fontsize", @@ -178,23 +178,23 @@ }, { "name": "setting_dialog_dy", - "value": "200" + "value": "20" }, { "name": "confirm_dialog_dy", - "value": "250" + "value": "20" }, { "name": "close_notification_margin_top", - "value": "34vp" + "value": "10vp" }, { "name": "notification_appname_margin_top", - "value": "22vp" + "value": "16vp" }, { "name": "notification_cancle_margin_top", - "value": "22vp" + "value": "6vp" }, { "name": "device_divider_margin_l", -- Gitee From a190f541ae9dc26ca172cc41fcca88dba5e518e7 Mon Sep 17 00:00:00 2001 From: lizhi Date: Tue, 5 Jul 2022 17:32:40 +0800 Subject: [PATCH 191/373] =?UTF-8?q?[systemui]=E4=BC=98=E5=8C=96=E5=B8=83?= =?UTF-8?q?=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../main/ets/default/pages/CapsuleIcon.ets | 55 ++++++++++--------- .../ohos/view/component/appItemComponent.ets | 28 +++++----- .../com/ohos/view/component/headComponent.ets | 43 ++++++++------- .../view/NotificationListComponent.ets | 5 -- .../view/item/bannerNotificationItem.ets | 18 +++--- .../ohos/noticeItem/view/item/customItem.ets | 1 - .../ohos/noticeItem/view/item/generalItem.ets | 19 ++----- .../ohos/noticeItem/view/item/groupItem.ets | 9 +-- .../noticeItem/view/item/notificationItem.ets | 4 +- .../ohos/noticeItem/view/item/titleItem.ets | 15 ++--- 10 files changed, 86 insertions(+), 111 deletions(-) diff --git a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets index 137265c5..14f39569 100644 --- a/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets +++ b/features/capsulecomponent/src/main/ets/default/pages/CapsuleIcon.ets @@ -42,35 +42,36 @@ export default struct CapsuleIcon { } build() { - Row() { - Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + if (this.mCapsuleViewModel.mIsBackground) { Row() { - Row().width(this.style.greenCapsuleTextMarginLeftRight).height('100%') - Image($r("app.media.ic_statusbar_phone")) - .width(this.style.greenCapsulePhoneWidth) - .height(this.style.greenCapsulePhoneHeight) - .objectFit(ImageFit.Contain) - Row().width($r("app.float.green_capsule_phone_text_left")).height('100%') - Text(this.mCapsuleViewModel.mText) - .fontSize(this.styleCommon.statusBarFontSize) - .fontWeight(FontWeight.Regular) - .fontColor(this.style.greenCapsuleTextColor) - .maxLines(this.style.maxLines) - .textOverflow({ overflow: TextOverflow.Ellipsis }) - Row().width(this.style.greenCapsuleTextMarginLeftRight).height('100%') - } - .alignItems(VerticalAlign.Center) - .height(this.style.greenCapsuleHeight) - .backgroundColor(this.style.greenCapsuleBackgroundColor) - .borderRadius(this.style.greenCapsuleRadius) - .onTouch(this.touchEvent.bind(this)) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + Row() { + Row().width(this.style.greenCapsuleTextMarginLeftRight).height('100%') + Image($r("app.media.ic_statusbar_phone")) + .width(this.style.greenCapsulePhoneWidth) + .height(this.style.greenCapsulePhoneHeight) + .objectFit(ImageFit.Contain) + Row().width($r("app.float.green_capsule_phone_text_left")).height('100%') + Text(this.mCapsuleViewModel.mText) + .fontSize(this.styleCommon.statusBarFontSize) + .fontWeight(FontWeight.Regular) + .fontColor(this.style.greenCapsuleTextColor) + .maxLines(this.style.maxLines) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + Row().width(this.style.greenCapsuleTextMarginLeftRight).height('100%') + } + .alignItems(VerticalAlign.Center) + .height(this.style.greenCapsuleHeight) + .backgroundColor(this.style.greenCapsuleBackgroundColor) + .borderRadius(this.style.greenCapsuleRadius) + .onTouch(this.touchEvent.bind(this)) - Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') - }.margin({ - left: $r("app.float.green_capsule_phone_margin_left"), - right: $r("app.float.green_capsule_phone_margin_left") - }) - .visibility(this.mCapsuleViewModel.mIsBackground ? Visibility.Visible : Visibility.None) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + }.margin({ + left: $r("app.float.green_capsule_phone_margin_left"), + right: $r("app.float.green_capsule_phone_margin_left") + }) + } } touchEvent(event: TouchEvent) { diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets index ba8c6a21..657c991b 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets @@ -36,20 +36,20 @@ export default struct AppItemComponent { build() { Flex({ justifyContent: FlexAlign.SpaceBetween }) { Row() { - if (this.appSwitch === 2 || this.appSwitch === 3) { - Image(this.appIcon) - .width($r('app.float.appitem_notice_info_icon_width_l')) - .height($r('app.float.appitem_notice_info_icon_height_l')) - .margin({ right: $r('app.float.appitem_icon_info_margin_r') }) - .visibility('' === this.appIcon ? Visibility.None : Visibility.Visible) - .objectFit(ImageFit.Contain); - } else { - Image(this.appIcon) - .width($r('app.float.appitem_notice_info_icon_width')) - .height($r('app.float.appitem_notice_info_icon_height')) - .margin({ right: $r('app.float.appitem_icon_info_list_margin_r') }) - .visibility('' === this.appIcon ? Visibility.None : Visibility.Visible) - .objectFit(ImageFit.Contain); + if ('' !== this.appIcon) { + if (this.appSwitch === 2 || this.appSwitch === 3) { + Image(this.appIcon) + .width($r('app.float.appitem_notice_info_icon_width_l')) + .height($r('app.float.appitem_notice_info_icon_height_l')) + .margin({ right: $r('app.float.appitem_icon_info_margin_r') }) + .objectFit(ImageFit.Contain); + } else { + Image(this.appIcon) + .width($r('app.float.appitem_notice_info_icon_width')) + .height($r('app.float.appitem_notice_info_icon_height')) + .margin({ right: $r('app.float.appitem_icon_info_list_margin_r') }) + .objectFit(ImageFit.Contain); + } } Column() { Text(this.appTitle) diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets index 16465871..a55ccac7 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/headComponent.ets @@ -25,27 +25,28 @@ struct HeadComponent { build() { Row() { - Image($r('app.media.ic_back')) - .width($r('app.float.appitem_header_icon_width')) - .height($r('app.float.appitem_header_icon_height')) - .borderRadius($r('app.float.image_border_radius')) - .margin({ - left: $r('app.float.page_header_icon_margin_l'), - top: $r('app.float.page_margin_t'), - bottom: $r('app.float.page_margin_b') - }) - .backgroundColor(this.isTouch ? $r('app.color.background_color') : $r('app.color.background_transparent')) - .visibility(this.icBackIsVisibility ? Visibility.Visible : Visibility.None) - .onClick(() => { - Router.back(); - }) - .onTouch((touchEvent: TouchEvent) => { - if (touchEvent.type === TouchType.Down){ - this.isTouch = true; - } else if (touchEvent.type === TouchType.Up){ - this.isTouch = false; - } - }) + if (this.icBackIsVisibility) { + Image($r('app.media.ic_back')) + .width($r('app.float.appitem_header_icon_width')) + .height($r('app.float.appitem_header_icon_height')) + .borderRadius($r('app.float.image_border_radius')) + .margin({ + left: $r('app.float.page_header_icon_margin_l'), + top: $r('app.float.page_margin_t'), + bottom: $r('app.float.page_margin_b') + }) + .backgroundColor(this.isTouch ? $r('app.color.background_color') : $r('app.color.background_transparent')) + .onClick(() => { + Router.back(); + }) + .onTouch((touchEvent: TouchEvent) => { + if (touchEvent.type === TouchType.Down){ + this.isTouch = true; + } else if (touchEvent.type === TouchType.Up){ + this.isTouch = false; + } + }) + } Text(this.headName) .fontColor($r('sys.color.ohos_id_color_text_primary')) .fontSize($r('app.float.page_phrases_tittle_font')) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index 45b2f48a..1cdd7f21 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -27,7 +27,6 @@ type NotificationLayoutConfig = { @Component export default struct NotificationListComponent { - @Provide('notificationUpdate') update: number = 0; @StorageLink('notificationList') notificationList: any[] = [] private config: NotificationLayoutConfig = { itemMargin: Layout.ITEM_MARGIN @@ -43,10 +42,6 @@ export default struct NotificationListComponent { build() { List({ space: this.config.itemMargin }) { - if (this.update && false) { - ListItem() { - } - } ForEach(this.notificationList, (item: any) => { ListItem() { if (item.length > 1) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index d5c29b8c..20b28125 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -90,14 +90,16 @@ export default struct BannerNotificationItem { clickTitleAction: () => this.refreshLastActionTime() }) } - Row() { - Image($r('app.media.ic_close')) - .objectFit(ImageFit.Contain) - .width(Layout.TITLE_IMAGE_SIZE) - .height(Layout.TITLE_IMAGE_SIZE) - .margin({ left: Layout.ICON_MARGIN }) - .visibility(this.mCloseEnableFlg ? Visibility.Visible : Visibility.None) - .onClick(this.clickCloseIcon.bind(this)) + + if (this.mCloseEnableFlg) { + Row() { + Image($r('app.media.ic_close')) + .objectFit(ImageFit.Contain) + .width(Layout.TITLE_IMAGE_SIZE) + .height(Layout.TITLE_IMAGE_SIZE) + .margin({ left: Layout.ICON_MARGIN }) + .onClick(this.clickCloseIcon.bind(this)) + } } } .margin({ left: 12, right: 12 }) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets index 2b8dcb5e..54a575c1 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -65,7 +65,6 @@ export default struct CustomItem { .opacity(0.5) }.margin(10) } - } .borderRadius(!this.isSubItem ? $r('app.float.item_borderradius') : 0) .clip(true) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index 78d97610..a0138575 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -28,19 +28,14 @@ const TAG = 'NoticeItem-GeneralItem'; @Component export default struct GeneralItem { - @Consume('notificationUpdate') updateFlag: number; @State hasPicture: boolean = false - @State @Watch('expandChange') isExpand: boolean = false + @State isExpand: boolean = false @State needExpand: boolean = true @State distributedDeviceName: string = '' private itemData: any = {} private clickAction: () => void private isSubItem: boolean= false; - expandChange() { - this.updateFlag++; - } - aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`); if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { @@ -87,8 +82,7 @@ export default struct GeneralItem { if (this.isExpand && this.itemData.actionButtons.length) { ActionComponent({ itemData: this.itemData }) } else { - Blank() - .height(Layout.ITEM_MARGIN) + Blank().height(Layout.ITEM_MARGIN) } }.onClick(() => { this.clickAction(); @@ -112,20 +106,17 @@ struct ContentComponent { basicItem({ itemData: this.itemData }); - } - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { + } else if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_LONG) { longItem({ itemData: this.itemData, isExpand: this.isExpand }); - } - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { + } else if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_MULTILINE) { multiItem({ itemData: this.itemData, isExpand: this.isExpand }); - } - if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_PICTURE) { + } else if (this.itemData.contentType === Constants.NOTIFICATION_TYPE_PICTURE) { pictureItem({ itemData: this.itemData, isExpand: this.isExpand diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 225fbb02..658ef09d 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -24,9 +24,8 @@ const TAG = 'NoticeItem-GroupItem'; @Component export default struct GroupItem { - @Consume('notificationUpdate') updateFlag: number; @State distributedDeviceName: string = '' - @State @Watch('expandChange') toExpand: boolean = false; + @State toExpand: boolean = false; private groupData: any[] = [] private mScroller: Scroller = new Scroller(); @State mIconAlpha: number = 0; @@ -40,10 +39,6 @@ export default struct GroupItem { Log.showInfo(TAG, `aboutToDisAppear`); } - expandChange() { - this.updateFlag++; - } - build() { Stack({ alignContent: Alignment.TopEnd }) { Scroll(this.mScroller) { @@ -65,7 +60,7 @@ export default struct GroupItem { .width(Constants.FULL_CONTAINER_WIDTH) if (this.toExpand) { - Row().height($r("app.float.notice_divider")).width('100%').flexShrink(0) + Divider().strokeWidth($r("app.float.notice_divider")).width('100%').flexShrink(0) } Column() { ContentList({ groupData: this.groupData, toExpand: this.toExpand }) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 78ab283c..5d9e60e1 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -36,12 +36,10 @@ export default struct NotificationItem { build() { Stack() { - IconListComponent({ iconAlpha: this.mIconAlpha, itemData: this.itemData }) - Scroll(this.mScroller) { Row() { FrontItem({ itemData: this.itemData, isSubItem: this.isSubItem }) - IconListComponent({ iconAlpha: 0, itemData: this.itemData }) + IconListComponent({ iconAlpha: this.mIconAlpha, itemData: this.itemData }) } } .scrollable(ScrollDirection.Horizontal) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets index a1dc9f35..c5104d82 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/titleItem.ets @@ -74,17 +74,10 @@ export default struct TitleItem { Blank() if (this.needExpand) { - if (this.isExpand) { - Image($r('app.media.ic_notification_up')) - .objectFit(ImageFit.Contain) - .width(Layout.TITLE_IMAGE_SIZE) - .height(Layout.TITLE_IMAGE_SIZE) - } else { - Image($r('app.media.ic_notification_down')) - .objectFit(ImageFit.Contain) - .width(Layout.TITLE_IMAGE_SIZE) - .height(Layout.TITLE_IMAGE_SIZE) - } + Image(this.isExpand ? $r('app.media.ic_notification_up') : $r('app.media.ic_notification_down')) + .objectFit(ImageFit.Contain) + .width(Layout.TITLE_IMAGE_SIZE) + .height(Layout.TITLE_IMAGE_SIZE) } } .margin({ left: 12, right: 12 }) -- Gitee From a6b33e50f91f34e5959e532c8851c71230560cb4 Mon Sep 17 00:00:00 2001 From: lizhi Date: Wed, 6 Jul 2022 16:52:01 +0800 Subject: [PATCH 192/373] [systemui]revert ringmode Signed-off-by: lizhi --- .../ohos/noticeItem/view/item/groupItem.ets | 13 ++++------ .../com/ohos/pages/VolumePanelComponent.ets | 2 +- .../ets/com/ohos/viewmodel/VolumePanelVM.ts | 24 ++----------------- 3 files changed, 8 insertions(+), 31 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 658ef09d..0ba958de 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -60,7 +60,7 @@ export default struct GroupItem { .width(Constants.FULL_CONTAINER_WIDTH) if (this.toExpand) { - Divider().strokeWidth($r("app.float.notice_divider")).width('100%').flexShrink(0) + Row().height($r("app.float.notice_divider")).width('100%').flexShrink(0) } Column() { ContentList({ groupData: this.groupData, toExpand: this.toExpand }) @@ -71,14 +71,9 @@ export default struct GroupItem { } .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) .clip(true) - - Row() { - IconListComponent({ iconAlpha: this.mIconAlpha, itemData: this.groupData[0], isGroup: true }) - }.width(getIconListSize()) - }.alignItems(VerticalAlign.Top) + IconListComponent({ iconAlpha: this.mIconAlpha, itemData: this.groupData[0], isGroup: true }) + } } - .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) - .clip(true) .scrollable(ScrollDirection.Horizontal) .scrollBar(BarState.On) .onScroll(() => { @@ -99,6 +94,8 @@ export default struct GroupItem { }) } .width(Constants.FULL_CONTAINER_WIDTH) + .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) + .clip(true) } scrollEdge() { diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets index ae4cdcd5..4578ba6a 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent.ets @@ -149,7 +149,7 @@ export default struct VolumePanelComponent { onMuteBtnClick(event: ClickEvent) { Log.showInfo(TAG, `onMuteBtnClick`); - ViewModel.mute(true); + ViewModel.mute(); } onSettingsBtnClick(event: ClickEvent) { diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts index 93dffa7a..58a911b0 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/viewmodel/VolumePanelVM.ts @@ -17,8 +17,6 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import Constants from '../common/Constants'; import { AudioVolumeType, VolumeInfo } from '../common/Constants'; import VolumePanelService from '../model/VolumePanelService'; -import RingModeService from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/model/RingModeService'; -import { AudioRingMode } from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/common/Constants'; import VolumeWindowController from '../common/VolumeWindowController'; export const VOLUME_PANEL_MAX_VOLUME_KEY = 'VolumePanelMaxVolume'; @@ -67,8 +65,6 @@ export class VolumePanelVM { }); VolumePanelService.startService(); VolumePanelService.registerListener(this); - RingModeService.startService(); - RingModeService.registerListener(this); this.mAllVolumeTypes.forEach((volumeType: AudioVolumeType) => { VolumePanelService.getMaxVolume(volumeType, (volumeType: AudioVolumeType, value: number) => this.updateMaxVolume(volumeType, value)); VolumePanelService.getMinVolume(volumeType, (volumeType: AudioVolumeType, value: number) => this.updateMinVolume(volumeType, value)); @@ -135,23 +131,12 @@ export class VolumePanelVM { this.mVolumeBeforeMute = minVolume; if (volumeInfo.isMute != this.mIsMute.get()) { this.mIsMute.set(volumeInfo.isMute); - RingModeService.setRingerMode(volumeInfo.isMute ? AudioRingMode.RINGER_MODE_SILENT : AudioRingMode.RINGER_MODE_NORMAL); } Log.showInfo(TAG, `updateVolumeInfo, mIsMute: ${this.mIsMute.get()} `); this.updateDisplayVolume(volumeInfo.isMute ? minVolume : volumeInfo.volume, maxVolume, minVolume); } - updateRingerMode(mode: AudioRingMode): void { - Log.showInfo(TAG, `updateRingerMode, mode: ${JSON.stringify(mode)} `); - let needMute = mode == AudioRingMode.RINGER_MODE_SILENT; - if (needMute == this.mIsMute.get()) { - Log.showInfo(TAG, `mute is: ${needMute}, No need change`); - return; - } - this.mute(false); - } - updateDisplayVolume(volume: number, maxVolume: number, minVolume: number): void{ Log.showInfo(TAG, `updateDisplayVolume, volume: ${volume} maxVolume: ${maxVolume} minVolume: ${minVolume}`); let displayVolume: number = volume + minVolume; @@ -180,14 +165,11 @@ export class VolumePanelVM { VolumeWindowController.getInstance().updateVolumeInfo(null); } - mute(needSetRingMode: boolean): void { + mute(): void { Log.showInfo(TAG, `mute, isMute: ${this.mIsMute.get()} mCurrentAudioVolume: ${this.mCurrentAudioVolume}`); this.mUpdatingAudioVolume = undefined; let isMute: boolean = this.mIsMute.get(); isMute = !isMute; - if (needSetRingMode) { - RingModeService.setRingerMode(isMute ? AudioRingMode.RINGER_MODE_SILENT : AudioRingMode.RINGER_MODE_NORMAL); - } let maxVolume: number = this.mMaxVolume.get(); let minVolume: number = this.mMinVolume.get(); let volume = isMute ? minVolume : (minVolume == this.mVolumeBeforeMute ? (minVolume + 1) : this.mVolumeBeforeMute); @@ -199,9 +181,7 @@ export class VolumePanelVM { this.mVolumeBeforeMute = currentAudioVolume; } }); - if (needSetRingMode) { - VolumeWindowController.getInstance().updateVolumeInfo(null); - } + VolumeWindowController.getInstance().updateVolumeInfo(null); } } -- Gitee From 51e3bf765323c92eed58c70362694d54e16806da Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 9 Jul 2022 17:26:05 +0800 Subject: [PATCH 193/373] Window hide failure problem Signed-off-by: lijinfengde123 --- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 8 ++++++-- .../main/ets/ServiceExtAbility/ServiceExtAbility.ts | 12 ++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 627ada0a..9a4fc924 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -35,7 +35,9 @@ class ServiceExtAbility extends ServiceExtension { let configInfo = await NavBarConfiguration.getConfiguration(); if (configInfo.showNavHorizontal) { - if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode + if (configInfo.realHeight == 0) { + Log.showInfo(TAG, `hide navbar`); + } else if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode configInfo.realHeight = 44 * configInfo.maxWidth / 1280; } else { // Phone Mode configInfo.realHeight = 36 * configInfo.maxWidth / 360; @@ -45,7 +47,9 @@ class ServiceExtAbility extends ServiceExtension { configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; } } else { - if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode + if (configInfo.realWidth == 0) { + Log.showInfo(TAG, `hide navbar`); + } else if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode configInfo.realWidth = 44 * configInfo.maxWidth / 1280; } else { // Phone Mode configInfo.realWidth = 36 * configInfo.maxWidth / 360; diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 91504baa..2b666fe0 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -30,13 +30,21 @@ class ServiceExtAbility extends ServiceExtension { globalThis[StatusBarConstants.PLUGIN_COMPONENT_OWNER_WANT_KEY] = want; let configInfo = await StatusBarConfiguration.getConfiguration(); if (configInfo.showHorizontal) { - configInfo.realHeight = (configInfo.realHeight * configInfo.maxWidth) / 1280; + if (configInfo.realHeight == 0) { + Log.showInfo(TAG, `hide statusbar`); + } else { + configInfo.realHeight = (configInfo.realHeight * configInfo.maxWidth) / 1280; + } configInfo.minHeight = configInfo.realHeight; if (configInfo.yCoordinate > 0) { configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; } } else { - configInfo.realWidth = (configInfo.realWidth * configInfo.maxWidth) / 1280; + if (configInfo.realWidth == 0) { + Log.showInfo(TAG, `hide statusbar`); + } else { + configInfo.realWidth = (configInfo.realWidth * configInfo.maxWidth) / 1280; + } configInfo.minHeight = configInfo.realWidth; if (configInfo.xCoordinate > 0) { configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth; -- Gitee From 3ca7e34d3616532739503c618f643a892fa2e2be Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 12 Jul 2022 10:06:58 +0800 Subject: [PATCH 194/373] Modify ExtensionAbilityType ^Cfault value Signed-off-by: lijinfengde123 --- build-profile.json5 | 14 ++++++++++++++ .../ets/plugindatasource/common/BundleParseUtil.ts | 5 ++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/build-profile.json5 b/build-profile.json5 index c64def10..109077d1 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -7,6 +7,20 @@ "name": "default", "signingConfig": "release" } + ], + "signingConfigs": [ + { + "name": "release", + "material": { + "certpath": "C:/Users/l30020847/AppData/Local/OpenHarmony/OpenHarmonyApplication.cer", + "storePassword": "00000016036EB3378786B56E40B1E72DB6C3A3E51B5B9CF84C2AC4DBDDFE9353328F1931D3C7", + "keyAlias": "OpenHarmony Application Release", + "keyPassword": "000000166F5BD42431F0299C6B1EBE0D49853526182EB177773C0D0D93F5B98BE56E60EE6542", + "profile": "C:/Users/l30020847/AppData/Local/OpenHarmony/systemui.p7b", + "signAlg": "SHA256withECDSA", + "storeFile": "C:/Users/l30020847/AppData/Local/OpenHarmony/OpenHarmony.p12" + } + } ] }, "modules": [ diff --git a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts index 5f513f02..7697cc06 100644 --- a/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts +++ b/common/src/main/ets/plugindatasource/common/BundleParseUtil.ts @@ -43,7 +43,6 @@ export enum BundleEventType { const TAG = 'SourceLoader-BundleParseUtil'; const DEFAULT_BUNDLE_FLAG = bundleManager.BundleFlag.GET_ABILITY_INFO_WITH_METADATA | bundleManager.BundleFlag.GET_ABILITY_INFO_WITH_PERMISSION; -const EXTENSIONTYPE = 20; const BUNDLE_SUBSCRIBE_INFO = { events: [ @@ -84,7 +83,7 @@ async function queryAbilityWithBundleName(action: string, userId: number, bundle action: action, bundleName: bundleName, }, - EXTENSIONTYPE, + bundleManager.ExtensionAbilityType.UNSPECIFIED, DEFAULT_BUNDLE_FLAG, userId ); @@ -109,7 +108,7 @@ async function queryAbilityWithoutBundleName(action: string, userId: number): Pr try { extensionAbilitys = await bundleManager.queryExtensionAbilityInfos({ action: action - }, EXTENSIONTYPE, DEFAULT_BUNDLE_FLAG, userId); + }, bundleManager.ExtensionAbilityType.UNSPECIFIED, DEFAULT_BUNDLE_FLAG, userId); } catch (error) { Log.showError(TAG, `queryAbilityWithoutBundleName, queryExtensionAbilityInfos error: ${JSON.stringify(error)}`); } -- Gitee From a3a27f2f396f0a388c9e0014c10007de07175a26 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 12 Jul 2022 10:10:46 +0800 Subject: [PATCH 195/373] Modify ExtensionAbilityType default value Signed-off-by: lijinfengde123 --- build-profile.json5 | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/build-profile.json5 b/build-profile.json5 index 109077d1..c64def10 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -7,20 +7,6 @@ "name": "default", "signingConfig": "release" } - ], - "signingConfigs": [ - { - "name": "release", - "material": { - "certpath": "C:/Users/l30020847/AppData/Local/OpenHarmony/OpenHarmonyApplication.cer", - "storePassword": "00000016036EB3378786B56E40B1E72DB6C3A3E51B5B9CF84C2AC4DBDDFE9353328F1931D3C7", - "keyAlias": "OpenHarmony Application Release", - "keyPassword": "000000166F5BD42431F0299C6B1EBE0D49853526182EB177773C0D0D93F5B98BE56E60EE6542", - "profile": "C:/Users/l30020847/AppData/Local/OpenHarmony/systemui.p7b", - "signAlg": "SHA256withECDSA", - "storeFile": "C:/Users/l30020847/AppData/Local/OpenHarmony/OpenHarmony.p12" - } - } ] }, "modules": [ -- Gitee From 9cda2ae0b1c3c5ae32a529dcdcac0c8fc5c7de3d Mon Sep 17 00:00:00 2001 From: lizhi Date: Thu, 14 Jul 2022 21:07:09 +0800 Subject: [PATCH 196/373] =?UTF-8?q?[systemui]=E4=BF=AE=E6=94=B9=E9=95=BF?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E5=B1=95=E5=BC=80=E5=90=8E=E9=81=AE=E6=8C=A1?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../com/ohos/noticeItem/view/NotificationListComponent.ets | 6 ++++++ .../main/ets/com/ohos/noticeItem/view/item/generalItem.ets | 7 ++++++- .../main/ets/com/ohos/noticeItem/view/item/groupItem.ets | 7 ++++++- .../src/main/ets/common/utils/configReader.ts | 2 +- .../default/navigationBar/src/main/ets/pages/oneLayout.ets | 2 +- .../navigationBar/src/main/ets/pages/threeLayout.ets | 2 +- .../src/main/ets/Application/AbilityStage.ts | 2 +- .../src/main/ets/pages/batchSetEnable.ets | 2 +- .../src/main/ets/pages/noDisturb.ets | 2 +- .../src/main/ets/pages/noDisturbPre.ets | 2 +- .../src/main/ets/pages/notificationManagenment.ets | 2 +- .../src/main/ets/pages/setEnable.ets | 2 +- .../src/main/ets/pages/slotSetting.ets | 2 +- .../src/main/ets/vm/noDisturbViewModel.ts | 2 +- .../src/main/ets/vm/notificationManagenmentViewModel.ts | 2 +- .../controlpanel/src/main/ets/pages/common/StyleManager.ts | 2 +- .../src/main/ets/workers/PluginDataSourceWorker.js | 2 +- .../src/main/ets/pages/bannerNotification.ets | 2 +- .../src/main/ets/pages/common/StyleManager.ts | 2 +- .../notificationpanel/src/main/ets/pages/notification.ets | 2 +- .../pc/statusbar/src/main/ets/pages/common/StyleManager.ts | 2 +- .../src/main/ets/workers/PluginDataSourceWorker.js | 2 +- .../src/main/ets/pages/bannerNotification.ets | 2 +- .../src/main/ets/pages/common/StyleManager.ts | 2 +- .../src/main/ets/pages/common/navigationEvent.ts | 2 +- .../dropdownpanel/src/main/ets/pages/notification.ets | 4 ++-- .../src/main/ets/workers/PluginDataSourceWorker.js | 2 +- .../statusbar/src/main/ets/pages/common/StyleManager.ts | 2 +- .../src/main/ets/workers/PluginDataSourceWorker.js | 2 +- 29 files changed, 45 insertions(+), 29 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index 1cdd7f21..e940ef22 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -27,6 +27,8 @@ type NotificationLayoutConfig = { @Component export default struct NotificationListComponent { + // ֪ͨϢչʱˢitem֣չ߶ + @Provide('notificationUpdate') update: number = 0; @StorageLink('notificationList') notificationList: any[] = [] private config: NotificationLayoutConfig = { itemMargin: Layout.ITEM_MARGIN @@ -42,6 +44,10 @@ export default struct NotificationListComponent { build() { List({ space: this.config.itemMargin }) { + if (this.update && false) { + ListItem() { + } + } ForEach(this.notificationList, (item: any) => { ListItem() { if (item.length > 1) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index a0138575..c42af851 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -28,14 +28,19 @@ const TAG = 'NoticeItem-GeneralItem'; @Component export default struct GeneralItem { + @Consume('notificationUpdate') updateFlag: number; @State hasPicture: boolean = false - @State isExpand: boolean = false + @State @Watch('expandChange') isExpand: boolean = false @State needExpand: boolean = true @State distributedDeviceName: string = '' private itemData: any = {} private clickAction: () => void private isSubItem: boolean= false; + expandChange() { + this.updateFlag++; + } + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`); if (CheckEmptyUtils.isEmpty(this.itemData.largeIcon)) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 0ba958de..1ad847a5 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -24,13 +24,18 @@ const TAG = 'NoticeItem-GroupItem'; @Component export default struct GroupItem { + @Consume('notificationUpdate') updateFlag: number; @State distributedDeviceName: string = '' - @State toExpand: boolean = false; + @State @Watch('expandChange') toExpand: boolean = false; private groupData: any[] = [] private mScroller: Scroller = new Scroller(); @State mIconAlpha: number = 0; @State @Watch('scrollEdge') mEdgeEnd: boolean = false; + expandChange() { + this.updateFlag++; + } + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`); } diff --git a/product/default/navigationBar/src/main/ets/common/utils/configReader.ts b/product/default/navigationBar/src/main/ets/common/utils/configReader.ts index 6e4b1d3b..c9be2c1a 100644 --- a/product/default/navigationBar/src/main/ets/common/utils/configReader.ts +++ b/product/default/navigationBar/src/main/ets/common/utils/configReader.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import Fileio from '@ohos.fileio'; -import Log from '../../../../../../../../common/src/main/ets/default/log' +import Log from '../../../../../../../../common/src/main/ets/default/Log' const DEFAULT_LAYOUT_INFO_FILE_PATH = "/data/accounts/account_0/applications/com.ohos.systemui/" + "com.ohos.systemui.navigationbar/assets/default_navigationBar/resources/rawfile/navigationBarLayoutConfig.json"; diff --git a/product/default/navigationBar/src/main/ets/pages/oneLayout.ets b/product/default/navigationBar/src/main/ets/pages/oneLayout.ets index 8bdf6d7c..89aab1ab 100644 --- a/product/default/navigationBar/src/main/ets/pages/oneLayout.ets +++ b/product/default/navigationBar/src/main/ets/pages/oneLayout.ets @@ -15,7 +15,7 @@ import keyButton from './keybutton'; import Constants from '../common/constants' -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NavigationBar-OneLayout'; let KeyCodeArr: any[] = [ diff --git a/product/default/navigationBar/src/main/ets/pages/threeLayout.ets b/product/default/navigationBar/src/main/ets/pages/threeLayout.ets index 68dca13e..b529d17d 100644 --- a/product/default/navigationBar/src/main/ets/pages/threeLayout.ets +++ b/product/default/navigationBar/src/main/ets/pages/threeLayout.ets @@ -15,7 +15,7 @@ import keyButton from './keybutton'; import Constants from '../common/constants' -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NavigationBar-ThreeLayout'; let KeyCodeArr: any[] = [ diff --git a/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts b/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts index 88995fdd..21b09845 100644 --- a/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts +++ b/product/default/notificationmanagement/src/main/ets/Application/AbilityStage.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import AbilityStage from '@ohos.application.AbilityStage'; -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; const TAG = 'NotificationManagement_AbilityStage'; export default class MainAbilityStage extends AbilityStage { diff --git a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets index 9d357e25..4feae616 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/batchSetEnable.ets @@ -14,7 +14,7 @@ */ //import Window from '@ohos.window'; -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appitemcomponent'; import ConfigData from '../common/constants'; diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets index 26d48469..8c204076 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturb.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; import ConfigData from '../common/constants'; import Router from '@system.router' diff --git a/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets b/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets index 45d00650..f0566865 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/noDisturbPre.ets @@ -15,7 +15,7 @@ //import Window from '@ohos.window'; -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; import NoDisturbComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/nodisturbcomponent'; import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemcomponent'; diff --git a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets index 252b4966..e46d75af 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/notificationManagenment.ets @@ -15,7 +15,7 @@ //import Window from '@ohos.window'; -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; import NoDisturbComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/nodisturbcomponent'; import ItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/itemcomponent'; diff --git a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets index b27cfecb..9d628cd6 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets @@ -14,7 +14,7 @@ */ //import Window from '@ohos.window'; -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appitemcomponent'; import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchcomponent'; diff --git a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets index 22f8b31e..7a9c54e5 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appitemcomponent'; import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchcomponent'; diff --git a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts index de011a6f..2c3dff8d 100644 --- a/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/noDisturbViewModel.ts @@ -14,7 +14,7 @@ */ import ConfigData from '../common/constants'; -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import NoDisturbingModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/nodisturbingmodel'; import NoDisturbComponentViewModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/vm/nodisturbcomponentviewmodel'; import FeaturesConfigData, {DoNotDisturbType} from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; diff --git a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts index 5d30bb20..41887368 100644 --- a/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts +++ b/product/default/notificationmanagement/src/main/ets/vm/notificationManagenmentViewModel.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import BundleResourceModel from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/bundleresourcemodel'; import display from '@ohos.display'; diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts index 2c231a28..b27b59c3 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/styleconfiguration'; import ControlCenterStyleConfiguration from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/styleconfiguration'; diff --git a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js index 7a1a7040..9cb540a3 100644 --- a/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/controlpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -14,7 +14,7 @@ */ import worker from '@ohos.worker'; -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; diff --git a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets index f2313b18..72199098 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/log' +import Log from '../../../../../../../common/src/main/ets/default/Log' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager" diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts b/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts index ce129810..7ccba6b4 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import IndexStyleConfiguration from './styleconfiguration'; diff --git a/product/pc/notificationpanel/src/main/ets/pages/notification.ets b/product/pc/notificationpanel/src/main/ets/pages/notification.ets index 60c526da..924dc3f7 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/notification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/notification.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/log' +import Log from '../../../../../../../common/src/main/ets/default/Log' import EventManager from "../../../../../../../common/src/main/ets/default/event/eventmanager" import {obtainStartAbility} from "../../../../../../../common/src/main/ets/default/event/eventutil" import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/notificationlistcomponent' diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts index e071e068..4ca625ee 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import CommonStyleConfiguration from '../../../../../../../../common/src/main/ets/default/styleconfiguration'; import StatusBarStyleConfiguration from '../../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/styleconfiguration'; diff --git a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 7a1a7040..9cb540a3 100644 --- a/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/pc/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -14,7 +14,7 @@ */ import worker from '@ohos.worker'; -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets index ed4e4cfc..fb656302 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/log' +import Log from '../../../../../../../common/src/main/ets/default/Log' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager" diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts index a880107d..b81cc44a 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/styleconfiguration'; import ControlCenterStyleConfiguration from '../../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/common/styleconfiguration'; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts index 980a0a8a..6b8dadb5 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/navigationEvent.ts @@ -14,7 +14,7 @@ */ import commonEvent from '@ohos.commonEvent'; -import Log from '../../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; const TAG = 'navigationEvent'; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index e491b9be..f81423e5 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/log' +import Log from '../../../../../../../common/src/main/ets/default/Log' import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/eventmanager" import { obtainStartAbility } from "../../../../../../../common/src/main/ets/default/event/eventutil" import Constants from './common/constants' @@ -26,7 +26,7 @@ import LocationIcon from '../../../../../../../features/locationcomponent/src/ma import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/statusbariconitemringmodecomponent' import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/notificationlistcomponent' import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/viewmodel' -import ResourceUtil from '../../../../../../../common/src/main/ets/default/resourceutil' +import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil' import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT } from '../../../../../../../common/src/main/ets/default/timemanager' diff --git a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js index 7a1a7040..9cb540a3 100644 --- a/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/dropdownpanel/src/main/ets/workers/PluginDataSourceWorker.js @@ -14,7 +14,7 @@ */ import worker from '@ohos.worker'; -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; diff --git a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts index 393491ba..40167bd2 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import IndexStyleConfiguration from './styleconfiguration'; diff --git a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js index 7a1a7040..9cb540a3 100644 --- a/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js +++ b/product/phone/statusbar/src/main/ets/workers/PluginDataSourceWorker.js @@ -14,7 +14,7 @@ */ import worker from '@ohos.worker'; -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import PluginDataSourceManager from '../../../../../../../common/src/main/ets/plugindatasource/plugindatasourcemanager'; import Constants, { obtainMsg } from '../../../../../../../common/src/main/ets/plugindatasource/common/constants'; -- Gitee From e3e8fc6ef9e21bd88adf378a322eb4b13a6d8969 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Fri, 15 Jul 2022 16:13:12 +0800 Subject: [PATCH 197/373] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=BC=80=E5=85=B3=E5=92=8C=E7=8A=B6=E6=80=81=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .gitignore | 22 +++++---- .../com/ohos/model/notificationListener.ts | 36 ++++++++++++-- .../ohos/view/component/appItemComponent.ets | 16 +++---- .../ohos/view/component/slotLstComponent.ets | 10 +--- .../ohos/view/component/switchComponent.ets | 7 --- .../src/main/ets/pages/setEnable.ets | 43 ++++++++++++----- .../src/main/ets/pages/slotSetting.ets | 48 +++++++++++-------- 7 files changed, 112 insertions(+), 70 deletions(-) diff --git a/.gitignore b/.gitignore index cfb3a951..11cdd71a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,12 +4,16 @@ build node_modules/ local.properties signature/systemui_provision_verified.json -product/default/volumepanel/node_modules -product/default/notificationmanagement/node_modules -product/default/navigationBar/node_modules -product/pc/controlpanel/node_modules -product/pc/notificationpanel/node_modules -product/pc/statusbar/node_modules -product/phone/dropdownpanel/node_modules -product/phone/statusbar/node_modules -*/.preview/* \ No newline at end of file +/product/default/volumepanel/node_modules +/product/default/notificationmanagement/node_modules +/product/default/navigationBar/node_modules +/product/pc/controlpanel/node_modules +/product/pc/notificationpanel/node_modules +/product/pc/statusbar/node_modules +/product/phone/dropdownpanel/node_modules +/product/phone/statusbar/node_modules +/product/default/volumepanel/.preview/ +/product/pc/notificationpanel/.preview/ +/product/phone/statusbar/.preview/ +/product/default/notificationmanagement/.preview/ +/.hvigor/outputs/logs/details/details.json diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts index c0f4d242..07cba800 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/notificationListener.ts @@ -19,7 +19,6 @@ import { NotificationSlot } from 'notification/notificationSlot'; const TAG = 'NotificationManagenment-NotificationListener'; - interface EnableListener { bundle: string; onEnableChanged: {(value: boolean): void}; @@ -31,7 +30,7 @@ export interface BundleOption { } export class NotificationListener { - private readonly listeners= new Set(); + private readonly listeners = new Set(); subscribeEnableChanged(): void { Log.showInfo(TAG, 'subscribeEnableChanged'); @@ -78,12 +77,15 @@ export class NotificationListener { Log.showInfo(TAG, 'unRegisterAll finished'); } - async isNotificationEnabled(bundleOption: BundleOption): Promise { + async isNotificationEnabled(bundleOption: BundleOption, callback?: (data) => void): Promise { Log.showDebug(TAG, `isNotificationEnabled bundleOption:${JSON.stringify(bundleOption)} `); return new Promise((resolve, reject) => { Notification.isNotificationEnabled(bundleOption, (err, data) => { Log.showInfo(TAG, `isNotificationEnabled callback data:${JSON.stringify(data)} err:${JSON.stringify(err)}`); if (!!data) { + if (callback) { + callback(data); + } resolve(data); } else { reject(err); @@ -100,6 +102,31 @@ export class NotificationListener { }); } + async isNotificationSlotEnabled(bundleOption: BundleOption, slotType: Notification.SlotType, callback?: (data) => void): Promise { + Log.showDebug(TAG, `isNotificationSlotEnabled bundleOption:${JSON.stringify(bundleOption)} `); + return new Promise((resolve, reject) => { + Notification.isNotificationSlotEnabled(bundleOption, slotType, (err, data) => { + Log.showInfo(TAG, `isNotificationSlotEnabled callback data:${JSON.stringify(data)} err:${JSON.stringify(err)}`); + if (!!data) { + if (callback) { + callback(data); + } + resolve(data); + } else { + reject(err); + } + }); + }); + } + + enableNotificationSlot(bundleOption: BundleOption, slotType: Notification.SlotType, data: boolean): void { + Log.showDebug(TAG, `enableNotificationSlot bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); + let enableValue: boolean = data ? true : false; + Notification.enableNotificationSlot(bundleOption, slotType, enableValue, (err, result) => { + Log.showInfo(TAG, `enableNotificationSlot err:${JSON.stringify(err)} result:${JSON.stringify(result)}`); + }); + } + notificationSlotSet(bundleOption: BundleOption, data: NotificationSlot): void { Log.showDebug(TAG, `notificationSlotSet bundleOption:${JSON.stringify(bundleOption)} data:${JSON.stringify(data)}`); Notification.setSlotByBundle(bundleOption, data, (err, result) => { @@ -131,5 +158,4 @@ export class NotificationListener { let notificationListener = new NotificationListener(); -export default notificationListener ; - +export default notificationListener ; \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets index 657c991b..f95b8da5 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/appItemComponent.ets @@ -14,7 +14,7 @@ */ import ConfigData from '../../common/constants'; import Log from '../../../../../../../../../common/src/main/ets/default/Log'; -import Notification from '../../model/notificationListener'; +import NotificationListener from '../../model/notificationListener'; import Router from '@system.router' const TAG = 'ManagementComponent-AppItemComponent'; @@ -210,7 +210,7 @@ export default struct AppItemComponent { .height($r('app.float.toggle_comp_height')) .onChange((flag) => { Log.showInfo(TAG, `Toggle onChange param: data:${flag} `); - Notification.enableNotification({ bundle: this.appBundleName, uid: this.appUid }, flag); + NotificationListener.enableNotification({ bundle: this.appBundleName, uid: this.appUid }, flag); }) } } @@ -225,20 +225,20 @@ export default struct AppItemComponent { aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear`); if (this.appSwitch === 1) { - Notification.subscribeEnableChanged(); - Notification.register({ bundle: this.appBundleName, + NotificationListener.subscribeEnableChanged(); + NotificationListener.register({ bundle: this.appBundleName, onEnableChanged: (stateValue: boolean) => { Log.showDebug(TAG, `aboutToAppear listener call`); this.canNotice = stateValue; } }); - Notification.isNotificationEnabled({ bundle: this.appBundleName, uid: this.appUid }) + NotificationListener.isNotificationEnabled({ bundle: this.appBundleName, uid: this.appUid }) .then((stateValue) => { - Log.showInfo(TAG, `Notification.isNotificationEnabled data:${JSON.stringify(stateValue)}`); + Log.showInfo(TAG, `NotificationListener.isNotificationEnabled data:${JSON.stringify(stateValue)}`); this.canNotice = stateValue; }) .catch((error) => { - Log.showError(TAG, `Notification.isNotificationEnabled error:${JSON.stringify(error)}`); + Log.showError(TAG, `NotificationListener.isNotificationEnabled error:${JSON.stringify(error)}`); }); } } @@ -246,7 +246,7 @@ export default struct AppItemComponent { aboutToDisappear(): void{ Log.showInfo(TAG, `aboutToDisappear`); if (this.appSwitch === 1) { - Notification.unsubscribeEnableChanged(); + NotificationListener.unsubscribeEnableChanged(); } } diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets index 7f2428c5..f5633512 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/slotLstComponent.ets @@ -20,11 +20,10 @@ import Router from '@system.router' const TAG = 'ManagementComponent-SlotLstComponent'; - @Component export default struct SlotLstComponent { private appInfo: any= null; - @State slotLst: any[] = []; + @Link slotLst: any[]; build() { Flex({ justifyContent: FlexAlign.SpaceBetween }) { @@ -75,13 +74,6 @@ export default struct SlotLstComponent { aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear Notification.getSlotsByBundle bundle:` + 'bundle:' + this.appInfo.appBundleName + 'uid' + this.appInfo.appUid); - Notification.getSlotsByBundle({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }, (err, data) => { - Log.showInfo(TAG, `aboutToAppear Notification.getSlotsByBundle data:` + JSON.stringify(data)); - data.forEach((val, idx, array) => { - Log.showInfo(TAG, `aboutToAppear Notification.getSlotsByBundle data.forEach:` + JSON.stringify(val)); - this.slotLst.push(val); - }) - }) } onBackPress() { diff --git a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets index 8fc0f0ff..574a9c9a 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets +++ b/features/managementcomponent/src/main/ets/com/ohos/view/component/switchComponent.ets @@ -74,13 +74,6 @@ export default struct SwitchComponent { aboutToAppear(): void{ Log.showInfo(TAG, `aboutToAppear`); - if (this.register) { - Log.showInfo(TAG, `aboutToAppear register listener`); - this.register((stateValue: boolean) => { - Log.showInfo(TAG, `aboutToAppear listener call`); - this.initState = stateValue; - }); - } this.initializationAction().then((data) => { Log.showInfo(TAG, `initializationAction:${data}`); this.initState = data; diff --git a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets index 9d628cd6..436f6f36 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets @@ -21,7 +21,8 @@ import SwitchComponent from '../../../../../../../features/managementcomponent/s import SlotLstComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/slotlstcomponent'; import ConfigData from '../common/constants'; import Router from '@system.router' -import Notification from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationlistener'; +import notificationListener from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationlistener'; +import Notification from '@ohos.notification'; const TAG = 'NotificationManagement-SetEnable'; @@ -30,9 +31,11 @@ let appInfo; @Entry @Component export default struct SetEnable { - private listeners: any[] = [] - @State headName:Resource = $r('app.string.notificationManagement') - @State allowNotice:Resource = $r('app.string.allowNotification') + private listeners: any[] = []; + @State headName:Resource = $r('app.string.notificationManagement'); + @State allowNotice:Resource = $r('app.string.allowNotification'); + @State slotLst: any[] = []; + @State initState: boolean = false; build() { Flex({ justifyContent: FlexAlign.SpaceBetween }) { Column() { @@ -63,7 +66,7 @@ export default struct SetEnable { title: $allowNotice, initializationAction: () => this.switchComponentInit(), settingAction: (params) => this.switchComponentSet(params), - register: (listener) => Notification.register({bundle:appInfo.appBundleName,onEnableChanged:listener}) + register: (listener) => notificationListener.register({bundle:appInfo.appBundleName,onEnableChanged:listener}) }) } .margin({ top: $r('app.float.page_notice_title_margin_t')}) @@ -71,9 +74,10 @@ export default struct SetEnable { .height($r('app.float.notice_row_height')) Row() { - SlotLstComponent({ appInfo: appInfo }) + SlotLstComponent({ appInfo: appInfo ,slotLst: $slotLst}) } .align(Alignment.Start) + .visibility(this.initState ? Visibility.Visible : Visibility.Hidden); } .width(ConfigData.WH_100_100) .height(ConfigData.WH_100_100) @@ -97,13 +101,24 @@ export default struct SetEnable { Log.showInfo(TAG, `aboutToAppear`) appInfo = Router.getParams(); appInfo.slotSettingUrl = 'pages/slotSetting' - Notification.subscribeEnableChanged(); - Log.showInfo(TAG, `aboutToAppear end`) + notificationListener.subscribeEnableChanged(); + Log.showInfo(TAG, `aboutToAppear end`); + } + + onPageShow (): void{ + Log.showInfo(TAG, `onPageShow`); + Notification.getSlotsByBundle({ bundle: appInfo.appBundleName, uid: appInfo.appUid }, (err, data) => { + this.slotLst = []; + data.forEach((val, idx, array) => { + this.slotLst.push(val); + }) + }) } aboutToDisappear(): void{ Log.showInfo(TAG, `aboutToDisappear`) - Notification.unsubscribeEnableChanged(); + this.slotLst = []; + notificationListener.unsubscribeEnableChanged(); } onBackPress() { @@ -112,11 +127,15 @@ export default struct SetEnable { switchComponentInit() { Log.showDebug(TAG, `switchComponentInit`) - return Notification.isNotificationEnabled({ bundle: appInfo.appBundleName, uid: appInfo.appUid }) + return notificationListener.isNotificationEnabled({ bundle: appInfo.appBundleName, uid: appInfo.appUid }, (data) => { + Log.showDebug(TAG, 'switchComponentInit callback' + data); + this.initState = data; + }); } switchComponentSet(params) { Log.showDebug(TAG, `switchComponentSet`) - Notification.enableNotification({ bundle: appInfo.appBundleName, uid: appInfo.appUid }, params); + this.initState = params; + notificationListener.enableNotification({ bundle: appInfo.appBundleName, uid: appInfo.appUid }, params); } -} +} \ No newline at end of file diff --git a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets index 7a9c54e5..ac69d650 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets @@ -13,20 +13,20 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log'; +import Log from '../../../../../../../common/src/main/ets/default/log'; import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appitemcomponent'; import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchcomponent'; import ConfigData from '../common/constants'; import NotificationConfigData from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; import Router from '@system.router' -import Notification from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationlistener'; +import NotificationListener from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationlistener'; import notification from '@ohos.notification'; const TAG = 'NotificationManagement-SlotSetting'; const DEFAULT_SOUND = 'file://system/etc/Light.ogg'; -let params; +let slotParams; @Entry @Component @@ -37,6 +37,7 @@ export default struct SlotSetting { @State allowNotice: Resource = $r('app.string.allowNotification') @State noticeStyleBanner: Resource = $r('app.string.notificationStyle_banner') @State noticeSound: Resource = $r('app.string.notificationSound') + @State initState: boolean = false; build() { Flex({ justifyContent: FlexAlign.SpaceBetween }) { @@ -73,12 +74,8 @@ export default struct SlotSetting { Row() { SwitchComponent({ title: $allowNotice, - initializationAction: () => this.notificationEnableInit(), - settingAction: (params) => this.notificationEnableSet(params), - register: (listener) => Notification.register({ - bundle: this.appInfo.appBundleName, - onEnableChanged: listener - }) + initializationAction: () => this.notificationSlotEnableInit(), + settingAction: (params) => this.notificationSlotEnableSet(params) }) } .margin({ top: $r('app.float.page_notice_title_margin_t') }) @@ -102,7 +99,8 @@ export default struct SlotSetting { right: $r('sys.float.ohos_id_max_padding_end') }) .margin({ top: $r('app.float.page_notice_part_margin_t')}) - .align(Alignment.Start); + .align(Alignment.Start) + .visibility(this.initState ? Visibility.Visible : Visibility.Hidden); Row() { SwitchComponent({ @@ -117,6 +115,7 @@ export default struct SlotSetting { }) .margin({ top: $r('app.float.page_notice_title_margin_t')}) .height($r('app.float.notice_row_height')) + .visibility(this.initState ? Visibility.Visible : Visibility.Hidden); Row() { SwitchComponent({ @@ -131,6 +130,7 @@ export default struct SlotSetting { }) .margin({ top: $r('app.float.page_notice_row_margin_t') }) .height($r('app.float.notice_row_height')) + .visibility(this.initState ? Visibility.Visible : Visibility.Hidden); } .width(ConfigData.WH_100_100) .height(ConfigData.WH_100_100) @@ -151,24 +151,32 @@ export default struct SlotSetting { } aboutToAppear(): void{ - Log.showInfo(TAG, `aboutToAppear`) - params = Router.getParams(); - this.appInfo = params.appInfo; - this.slotInfo = params.slotInfo + slotParams = Router.getParams(); + this.appInfo = slotParams.appInfo; + this.slotInfo = slotParams.slotInfo + Log.showDebug(TAG, `aboutToAppear ${JSON.stringify(this.slotInfo)}`) } onBackPress() { Log.showInfo(TAG, `onBackPress`) } - notificationEnableInit() { - Log.showDebug(TAG, `notificationEnableInit`) - return Notification.isNotificationEnabled({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }) + notificationSlotEnableInit() { + Log.showDebug(TAG, `notificationSlotEnableInit`) + return NotificationListener.isNotificationSlotEnabled({ + bundle: this.appInfo.appBundleName, + uid: this.appInfo.appUid + }, this.slotInfo.type, + (data) => { + Log.showInfo(TAG, 'notificationSlotEnableInit callback' + data); + this.initState = data; + }); } - notificationEnableSet(data) { + notificationSlotEnableSet(data) { Log.showDebug(TAG, `notificationEnableSet data:${JSON.stringify(data)}`) - Notification.enableNotification({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }, data); + this.initState = data; + NotificationListener.enableNotificationSlot({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }, this.slotInfo.type, data); } soundEnableInit() { @@ -225,6 +233,6 @@ export default struct SlotSetting { notificationSlotSet() { Log.showDebug(TAG, `notificationSlotSet slotInfo:${JSON.stringify(this.slotInfo)}`) - Notification.notificationSlotSet({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }, this.slotInfo); + NotificationListener.notificationSlotSet({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }, this.slotInfo); } } -- Gitee From 495668db261f7aa7a6902a039adadb52623a1d3a Mon Sep 17 00:00:00 2001 From: lizhi Date: Sat, 16 Jul 2022 17:45:59 +0800 Subject: [PATCH 198/373] =?UTF-8?q?[systemui]=E4=BC=98=E5=8C=96=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E9=97=B4=E5=BC=BA=E4=BE=9D=E8=B5=96=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../ServiceExtAbility/ServiceExtAbility.ts | 30 -------------- .../ServiceExtAbility/ServiceExtAbility.ts | 18 --------- .../common/NavBarConfiguration.ts | 38 ++++++++++++++++-- .../view/NotificationListComponent.ets | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 40 ++----------------- .../src/main/ets/pages/slotSetting.ets | 2 +- .../ServiceExtAbility/ServiceExtAbility.ts | 5 +++ .../main/resources/base/element/string.json | 32 +++++++++++++++ .../main/resources/en_US/element/string.json | 32 +++++++++++++++ .../main/resources/zh_CN/element/string.json | 32 +++++++++++++++ 10 files changed, 141 insertions(+), 90 deletions(-) rename {product/default/navigationBar/src/main/ets => features/navigationservice/src/main/ets/com/ohos/navigationservice}/common/NavBarConfiguration.ts (80%) diff --git a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index dee3b6d1..60980ca1 100644 --- a/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/pc/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -20,41 +20,11 @@ import initSystemUi from '../../../../../../common/src/main/ets/default/InitSyst const TAG = 'SystemUI_ServiceExtAbility'; -var statusBarWant = { - 'bundleName': 'com.ohos.systemui', - 'abilityName': 'com.ohos.systemui.statusbar.ServiceExtAbility' -}; - -var navigationBarWant = { - 'bundleName': 'com.ohos.systemui', - 'abilityName': 'com.ohos.systemui.navigationbar.ServiceExtAbility' -}; - -var volumePanelWant = { - 'bundleName': 'com.ohos.systemui', - 'abilityName': 'com.ohos.systemui.volumepanel.ServiceExtAbility' -}; - -var controlPanelWant = { - 'bundleName': 'com.ohos.systemui', - 'abilityName': 'com.ohos.systemui.controlpanel.ServiceExtAbility' -}; - -var notificationPanelWant = { - 'bundleName': 'com.ohos.systemui', - 'abilityName': 'com.ohos.systemui.notificationpanel.ServiceExtAbility' -}; - class ServiceExtAbility extends ServiceExtension { onCreate(want: Want): void { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); initSystemUi(this.context); AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context); - AbilityManager.startAbility(statusBarWant); - AbilityManager.startAbility(navigationBarWant); - AbilityManager.startAbility(volumePanelWant); - AbilityManager.startAbility(controlPanelWant); - AbilityManager.startAbility(notificationPanelWant); } onDestroy(): void { diff --git a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 324bbdb0..60980ca1 100644 --- a/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/entry/phone/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -20,29 +20,11 @@ import initSystemUi from '../../../../../../common/src/main/ets/default/InitSyst const TAG = 'SystemUI_ServiceExtAbility'; -var statusBarWant = { - 'bundleName': 'com.ohos.systemui', - 'abilityName': 'com.ohos.systemui.statusbar.ServiceExtAbility' -}; - -var navigationBarWant = { - 'bundleName': 'com.ohos.systemui', - 'abilityName': 'com.ohos.systemui.navigationbar.ServiceExtAbility' -}; - -var volumePanelWant = { - 'bundleName': 'com.ohos.systemui', - 'abilityName': 'com.ohos.systemui.volumepanel.ServiceExtAbility' -}; - class ServiceExtAbility extends ServiceExtension { onCreate(want: Want): void { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); initSystemUi(this.context); AbilityManager.setContext(AbilityManager.ABILITY_NAME_ENTRY, this.context); - AbilityManager.startAbility(statusBarWant); - AbilityManager.startAbility(navigationBarWant); - AbilityManager.startAbility(volumePanelWant); } onDestroy(): void { diff --git a/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts similarity index 80% rename from product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts rename to features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts index 749be300..421824f4 100644 --- a/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts @@ -14,8 +14,8 @@ */ import display from '@ohos.display'; -import Log from '../../../../../../../common/src/main/ets/default/log'; -import ResourceUtil from '../../../../../../../common/src/main/ets/default/resourceutil'; +import Log from '../../../../../../../../../common/src/main/ets/default/Log'; +import ResourceUtil from '../../../../../../../../../common/src/main/ets/default/ResourceUtil'; const TAG = 'NavBarConfiguration'; var directionNav; @@ -86,7 +86,7 @@ class NavBarConfiguration { Log.showDebug(TAG, 'statusShortSideLength = ' + statusShortSideLength + 'navShortSideLength = ' + navShortSideLength + 'directionnav = ' + directionNav.direction + 'statusbarPosition = ' + statusbarPosition + 'NavbarPosition = ' + navbarPosition); } -/** + /** * Get nav bar configuration */ public async getConfiguration() { @@ -147,6 +147,38 @@ class NavBarConfiguration { } return configuration; } + + /** + * set nav bar custom configuration + */ + public setCustomConfiguration(configInfo) { + if (configInfo.showNavHorizontal) { + if (configInfo.realHeight == 0) { + Log.showInfo(TAG, `hide navbar`); + } else if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode + configInfo.realHeight = 44 * configInfo.maxWidth / 1280; + } else { // Phone Mode + configInfo.realHeight = 36 * configInfo.maxWidth / 360; + } + configInfo.minHeight = configInfo.realHeight; + if (configInfo.yCoordinate > 0) { + configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; + } + } else { + if (configInfo.realWidth == 0) { + Log.showInfo(TAG, `hide navbar`); + } else if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode + configInfo.realWidth = 44 * configInfo.maxWidth / 1280; + } else { // Phone Mode + configInfo.realWidth = 36 * configInfo.maxWidth / 360; + } + configInfo.minHeight = configInfo.realWidth; + if (configInfo.xCoordinate > 0) { + configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth; + } + } + return configInfo; + } } let navBarConfiguration = new NavBarConfiguration(); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index e940ef22..edad3e9e 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -27,7 +27,7 @@ type NotificationLayoutConfig = { @Component export default struct NotificationListComponent { - // ֪ͨϢչʱˢitem֣չ߶ + // 当长通知消息展开时,这里用于重新刷新item布局,扩展高度 @Provide('notificationUpdate') update: number = 0; @StorageLink('notificationList') notificationList: any[] = [] private config: NotificationLayoutConfig = { diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 9a4fc924..aee46124 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -18,54 +18,20 @@ import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import NavBarConfiguration from '../common/NavBarConfiguration'; +import NavBarConfiguration from '../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration'; import { Want } from 'ability/want'; const TAG = 'NavigationBar_ServiceExtAbility'; -var dropdownPanelWant = { - 'bundleName': 'com.ohos.systemui', - 'abilityName': 'com.ohos.systemui.dropdownpanel.ServiceExtAbility' -}; - class ServiceExtAbility extends ServiceExtension { async onCreate(want: Want): Promise { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, this.context); - let configInfo = await NavBarConfiguration.getConfiguration(); - if (configInfo.showNavHorizontal) { - if (configInfo.realHeight == 0) { - Log.showInfo(TAG, `hide navbar`); - } else if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode - configInfo.realHeight = 44 * configInfo.maxWidth / 1280; - } else { // Phone Mode - configInfo.realHeight = 36 * configInfo.maxWidth / 360; - } - configInfo.minHeight = configInfo.realHeight; - if (configInfo.yCoordinate > 0) { - configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; - } - } else { - if (configInfo.realWidth == 0) { - Log.showInfo(TAG, `hide navbar`); - } else if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode - configInfo.realWidth = 44 * configInfo.maxWidth / 1280; - } else { // Phone Mode - configInfo.realWidth = 36 * configInfo.maxWidth / 360; - } - configInfo.minHeight = configInfo.realWidth; - if (configInfo.xCoordinate > 0) { - configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth; - } - } + let defaultConfigInfo = await NavBarConfiguration.getConfiguration(); + let configInfo = NavBarConfiguration.setCustomConfiguration(defaultConfigInfo); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config', configInfo); - - if (deviceInfo.deviceType == 'phone') { - AbilityManager.startAbility(dropdownPanelWant); - } Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); - let navigationBarRect = { left: configInfo.xCoordinate, top: configInfo.yCoordinate, diff --git a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets index ac69d650..87d04d55 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appitemcomponent'; import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchcomponent'; diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 2d8e3476..d3608994 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -18,6 +18,7 @@ import display from '@ohos.display'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import NavBarConfiguration from '../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration'; import { Want } from 'ability/want'; @@ -27,6 +28,10 @@ class ServiceExtAbility extends ServiceExtension { async onCreate(want: Want): Promise { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, this.context); + let defaultConfigInfo = await NavBarConfiguration.getConfiguration(); + let configInfo = NavBarConfiguration.setCustomConfiguration(defaultConfigInfo); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config', configInfo); + Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); globalThis[AbilityManager.ABILITY_NAME_OWNER_WANT] = want; display.getDefaultDisplay().then((dis) => { diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/string.json b/product/phone/dropdownpanel/src/main/resources/base/element/string.json index f9d8b148..5e7a9e0e 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/string.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/string.json @@ -71,6 +71,38 @@ { "name": "control_center_complex_toggle_ring_mode_title_vibration", "value": "振动" + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, + { + "name": "nav_bar_position_landscape", + "value": "4" + }, + { + "name": "status_bar_size_landscape", + "value": "48" + }, + { + "name": "nav_bar_size_landscape", + "value": "72" + }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, + { + "name": "nav_bar_position_portrait", + "value": "4" + }, + { + "name": "status_bar_size_portrait", + "value": "48" + }, + { + "name": "nav_bar_size_portrait", + "value": "72" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json b/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json index 9a826cab..a088da13 100644 --- a/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json +++ b/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json @@ -71,6 +71,38 @@ { "name": "control_center_complex_toggle_ring_mode_title_vibration", "value": "Vibration" + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, + { + "name": "nav_bar_position_landscape", + "value": "4" + }, + { + "name": "status_bar_size_landscape", + "value": "48" + }, + { + "name": "nav_bar_size_landscape", + "value": "72" + }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, + { + "name": "nav_bar_position_portrait", + "value": "1" + }, + { + "name": "status_bar_size_portrait", + "value": "48" + }, + { + "name": "nav_bar_size_portrait", + "value": "72" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json b/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json index f9d8b148..1f5d3ed3 100644 --- a/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json +++ b/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json @@ -71,6 +71,38 @@ { "name": "control_center_complex_toggle_ring_mode_title_vibration", "value": "振动" + }, + { + "name": "status_bar_position_landscape", + "value": "2" + }, + { + "name": "nav_bar_position_landscape", + "value": "4" + }, + { + "name": "status_bar_size_landscape", + "value": "48" + }, + { + "name": "nav_bar_size_landscape", + "value": "72" + }, + { + "name": "status_bar_position_portrait", + "value": "1" + }, + { + "name": "nav_bar_position_portrait", + "value": "1" + }, + { + "name": "status_bar_size_portrait", + "value": "48" + }, + { + "name": "nav_bar_size_portrait", + "value": "72" } ] } \ No newline at end of file -- Gitee From 0d0c9386159d7276b7688f48896d31cfcb9b8b81 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Sun, 17 Jul 2022 18:05:39 +0800 Subject: [PATCH 199/373] set bundleContext to null Signed-off-by: xuchangzhou --- .../src/main/ets/com/ohos/model/bundleResourceModel.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index ff5e9c7e..d833ce65 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -90,6 +90,8 @@ export default class BundleResourceModel { } this.nextIconItem(index, count, data, this.mBundleInfoList, that); }); + + bundleContext = null; } catch (error) { Log.showError(TAG, `getIconItem catch error: ${JSON.stringify(error)}`); } -- Gitee From b3e7cd418e25d97422da9edd0b554300221609e9 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Mon, 18 Jul 2022 11:13:23 +0800 Subject: [PATCH 200/373] =?UTF-8?q?=E6=A8=AA=E5=B9=85=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=BC=80=E5=90=AF=E7=8A=B6=E6=80=81=E6=97=B6=EF=BC=8C=E5=93=8D?= =?UTF-8?q?=E9=93=83=E5=85=B3=E9=97=AD=E4=B8=8D=E5=BD=B1=E5=93=8Dlevel?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../src/main/ets/pages/slotSetting.ets | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets index ac69d650..9548e10d 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/slotSetting.ets @@ -13,13 +13,13 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/log'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; import HeadComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/headcomponent'; import AppItemComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/appitemcomponent'; import SwitchComponent from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/view/component/switchcomponent'; import ConfigData from '../common/constants'; import NotificationConfigData from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/common/constants'; -import Router from '@system.router' +import Router from '@system.router'; import NotificationListener from '../../../../../../../features/managementcomponent/src/main/ets/com/ohos/model/notificationlistener'; import notification from '@ohos.notification'; @@ -195,7 +195,9 @@ export default struct SlotSetting { Log.showDebug(TAG, `soundEnableSet params:${JSON.stringify(params)}`) if (params == 0) { this.slotInfo.sound = ''; - this.slotInfo.level = notification.SlotLevel.LEVEL_LOW + if (this.slotInfo.level != notification.SlotLevel.LEVEL_HIGH) { + this.slotInfo.level = notification.SlotLevel.LEVEL_LOW; + } } else if (params == 1) { this.slotInfo.sound = DEFAULT_SOUND; if (this.slotInfo.level < notification.SlotLevel.LEVEL_DEFAULT) { @@ -235,4 +237,4 @@ export default struct SlotSetting { Log.showDebug(TAG, `notificationSlotSet slotInfo:${JSON.stringify(this.slotInfo)}`) NotificationListener.notificationSlotSet({ bundle: this.appInfo.appBundleName, uid: this.appInfo.appUid }, this.slotInfo); } -} +} \ No newline at end of file -- Gitee From 9a8547e5f0637f074a5c34df437aa2b10ac3ad55 Mon Sep 17 00:00:00 2001 From: lvxiaoqiang Date: Tue, 19 Jul 2022 16:06:20 +0800 Subject: [PATCH 201/373] =?UTF-8?q?=E6=B2=99=E7=AE=B1=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lvxiaoqiang --- common/src/main/ets/default/ReadConfigUtil.ts | 39 ++++++----------- .../src/main/ets/default/ScreenLockCommon.ts | 43 +++++++------------ .../ets/com/ohos/model/screenlockStyle.ts | 20 ++++----- product/pc/src/main/ets/vm/indexViewModel.ts | 2 +- .../main/ets/vm/slideScreenLockViewModel.ts | 3 +- .../phone/src/main/ets/vm/indexViewModel.ts | 2 +- .../main/ets/vm/slideScreenLockViewModel.ts | 3 +- 7 files changed, 43 insertions(+), 69 deletions(-) diff --git a/common/src/main/ets/default/ReadConfigUtil.ts b/common/src/main/ets/default/ReadConfigUtil.ts index c00c6cd5..7332fdf9 100644 --- a/common/src/main/ets/default/ReadConfigUtil.ts +++ b/common/src/main/ets/default/ReadConfigUtil.ts @@ -14,37 +14,24 @@ */ import Log from './Log'; -import FileIo from '@ohos.fileio'; +import AbilityManager from '../default/abilitymanager/abilityManager' -const DFAULT_SIZE = 4096; -const CHAR_CODE_AT_INDEX = 0; const TAG = 'ReadConfigUtil'; export class ReadConfigUtil { - ReadConfigFile(fileName) { + ReadConfigFile(fileName, callBack:(data)=>void) { Log.showInfo(TAG, `readConfigFile fileName:${fileName}`); - let stream; - let content : string = ""; - try { - stream = FileIo.createStreamSync(fileName, 'r'); - Log.showInfo(TAG, `readConfigFile stream:` + stream); - let buf = new ArrayBuffer(DFAULT_SIZE); - let len = stream.readSync(buf); - Log.showInfo(TAG, `readConfigFile len:` + len); - let arr = new Uint8Array(buf); - let charAt = ' '.charCodeAt(CHAR_CODE_AT_INDEX); - for (let i = len;i < DFAULT_SIZE; i++) { - arr[i] = charAt; - } - content = String.fromCharCode.apply(null, arr); - Log.showDebug(TAG, `readConfigFile content:` + JSON.stringify(content)); - } catch (error) { - Log.showError(TAG, `readConfigFile error:` + JSON.stringify(error)); - content = ""; - } finally{ - stream.closeSync(); - } - return JSON.parse(content); + let jsonCfg : string = ""; + let resManager = AbilityManager.getContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK)?.resourceManager; + resManager.getRawFile(fileName).then((data)=>{ + let content : string = String.fromCharCode.apply(null, data); + Log.showInfo(TAG, `readDefaultFile content length: ${content.length}`); + jsonCfg = JSON.parse(content); + callBack(jsonCfg); + }) + .catch((error)=>{ + Log.showError(TAG, `readDefaultFile filed: ${JSON.stringify(error)}`); + }); } } diff --git a/common/src/main/ets/default/ScreenLockCommon.ts b/common/src/main/ets/default/ScreenLockCommon.ts index 8a491d9c..126c9d56 100644 --- a/common/src/main/ets/default/ScreenLockCommon.ts +++ b/common/src/main/ets/default/ScreenLockCommon.ts @@ -13,12 +13,9 @@ * limitations under the License. */ import Log from './Log'; -import FileIo from '@ohos.fileio'; +import AbilityManager from '../default/abilitymanager/abilityManager' const TAG = 'ScreenLock-ScreenLockCommon'; -const DFAULT_SIZE = 4096; -const CHAR_CODE_AT_INDEX = 0; - export enum ScreenLockStatus { Locking = 1, Unlock = 2, @@ -26,28 +23,20 @@ export enum ScreenLockStatus { FaceNotRecognized = 4 } -export function ReadConfigFile(fileName) { +export function ReadConfigFile(fileName, callBack:(data)=>void) { Log.showInfo(TAG, `readConfigFile fileName:${fileName}`); - let stream; - let content : string = ""; - try { - let stream = FileIo.createStreamSync(fileName, 'r'); - Log.showInfo(TAG, `readConfigFile stream:` + stream); - let buf = new ArrayBuffer(DFAULT_SIZE); - let len = stream.readSync(buf); - Log.showInfo(TAG, `readConfigFile len:` + len); - let arr = new Uint8Array(buf); - let charAt = ' '.charCodeAt(CHAR_CODE_AT_INDEX); - for (let i = len;i < DFAULT_SIZE; i++) { - arr[i] = charAt; - } - content = String.fromCharCode.apply(null, arr); - Log.showDebug(TAG, `readConfigFile content:` + JSON.stringify(content)); - } catch (error) { - Log.showError(TAG, `readConfigFile error:` + JSON.stringify(error)); - content = ""; - } finally { - stream.closeSync(); - } - return JSON.parse(content); + let jsonCfg : string = ""; + let context = AbilityManager.getContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK); + Log.showInfo(TAG, `readConfigFile context:${context}`); + let resManager = context.resourceManager; + Log.showInfo(TAG, `readConfigFile resManager:${resManager}`); + resManager.getRawFile(fileName).then((data)=>{ + let content : string = String.fromCharCode.apply(null, data); + Log.showInfo(TAG, `readDefaultFile content length: ${content.length}`); + jsonCfg = JSON.parse(content); + callBack(jsonCfg); + }) + .catch((error)=>{ + Log.showError(TAG, `readDefaultFile filed: ${JSON.stringify(error)}`); + }); } \ No newline at end of file diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts index 82b84e05..4c8c1da3 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenlockStyle.ts @@ -15,9 +15,7 @@ import Log from '../../../../../../../../common/src/main/ets/default/Log' import {ReadConfigFile} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon' - -const FILE_URI = '/data/accounts/account_0/applications/com.ohos.screenlock' -+ '/com.ohos.screenlock/assets/{0}/resources/rawfile/screenlock.json' +const SCREENLOCK_MODE_FILE_NAME = "screenlock.json"; const TAG = 'ScreenLock-ScreenlockStyle'; @@ -39,17 +37,19 @@ class ScreenlockStyle { return this.screenMode } - readMode(deviceType: string): number{ - Log.showInfo(TAG, `readMode deviceType:${deviceType}`); + readMode(): number{ + Log.showInfo(TAG, `readMode`); + let that = this; try { - let modeJson = ReadConfigFile(FILE_URI.replace('{0}', deviceType)); - Log.showInfo(TAG, `ReadConfigFile content:` + JSON.stringify(modeJson)); - this.screenMode = modeJson.mode; + ReadConfigFile(SCREENLOCK_MODE_FILE_NAME, (modeJson)=>{ + Log.showInfo(TAG, `ReadConfigFile content:` + JSON.stringify(modeJson)); + that.screenMode = modeJson.mode; + }); } catch(error) { Log.showInfo(TAG, `ReadConfigFile content error: ${error}`); - this.screenMode = 1; + this.screenMode = LockStyleMode.SlideScreenLock; } - return this.screenMode + return this.screenMode; } } diff --git a/product/pc/src/main/ets/vm/indexViewModel.ts b/product/pc/src/main/ets/vm/indexViewModel.ts index 9bc4ac23..bd4aaf6f 100644 --- a/product/pc/src/main/ets/vm/indexViewModel.ts +++ b/product/pc/src/main/ets/vm/indexViewModel.ts @@ -34,7 +34,7 @@ export default class IndexViewModel { } getMode(): number { - return ScreenlockStyle.readMode("pc") + return ScreenlockStyle.readMode() } onPageShow() { diff --git a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts index bf6183c0..20c05ef8 100644 --- a/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/pc/src/main/ets/vm/slideScreenLockViewModel.ts @@ -14,7 +14,6 @@ */ import Log from '../../../../../../common/src/main/ets/default/Log'; -import {ReadConfigFile} from '../../../../../../common/src/main/ets/default/ScreenLockCommon' import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' import Constants from '../common/constants' import {Callback} from 'basic'; @@ -66,7 +65,7 @@ export default class SlideScreenLockViewModel { this.moveX = event.touches[0].screenX - this.startX this.moveY = event.touches[0].screenY - this.startY } else if (event.type == Constants.TOUCHTYPE_UP) { - Log.showInfo(TAG, `Touch Event slidingLength:${this.slidingLength}`) + Log.showInfo(TAG, `Touch Event slidingLength: ${this.slidingLength}`) if (Math.abs(this.moveY) > this.slidingLength) { this.unlockScreen() } diff --git a/product/phone/src/main/ets/vm/indexViewModel.ts b/product/phone/src/main/ets/vm/indexViewModel.ts index 1c80d1ca..7eb22188 100644 --- a/product/phone/src/main/ets/vm/indexViewModel.ts +++ b/product/phone/src/main/ets/vm/indexViewModel.ts @@ -33,7 +33,7 @@ export default class IndexViewModel { } getMode(): number { - return ScreenlockStyle.readMode("phone") + return ScreenlockStyle.readMode() } onPageShow() { diff --git a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts index dde05aa8..139da31f 100644 --- a/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts +++ b/product/phone/src/main/ets/vm/slideScreenLockViewModel.ts @@ -14,7 +14,6 @@ */ import Log from '../../../../../../common/src/main/ets/default/Log'; -import {ReadConfigFile} from '../../../../../../common/src/main/ets/default/ScreenLockCommon' import ScreenLockService from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenLockService' import Constants from '../common/constants' import {Callback} from 'basic'; @@ -66,7 +65,7 @@ export default class SlideScreenLockViewModel { this.moveX = event.touches[0].screenX - this.startX this.moveY = event.touches[0].screenY - this.startY } else if (event.type == Constants.TOUCHTYPE_UP) { - Log.showInfo(TAG, `Touch Event slidingLength:${this.slidingLength}`) + Log.showInfo(TAG, `Touch Event slidingLength: ${this.slidingLength}`) if (Math.abs(this.moveY) > this.slidingLength) { this.unlockScreen() } -- Gitee From 77528670321430e9f35507fd0e1e92d6c9902a08 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 19 Jul 2022 21:08:51 +0800 Subject: [PATCH 202/373] =?UTF-8?q?systemui=E5=90=84=E4=B8=AA=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E4=B9=8B=E9=97=B4context=E8=A7=A3=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- common/src/main/ets/default/ResourceUtil.ts | 12 ++++++--- common/src/main/ets/default/SettingsUtil.ts | 2 +- .../default/abilitymanager/abilityManager.ts | 27 +++++++++++++++++++ .../common/PluginComponentManagerUtil.ts | 1 + .../src/main/ets/default/brightnessManager.ts | 3 ++- .../ets/default/viewmodel/CapsuleViewModel.ts | 1 + .../com/ohos/model/ControlCenterService.ts | 5 ++-- .../ets/com/ohos/model/bundleResourceModel.ts | 2 +- .../ohos/vm/noDisturbComponentViewModel.ts | 2 ++ .../ohos/noticeItem/model/ParseDataUtil.ts | 3 ++- .../com/ohos/common/StatusBarConfiguration.ts | 2 ++ .../ets/com/ohos/model/StatusBarService.ts | 2 +- .../main/ets/common/NavBarConfiguration.ts | 2 ++ .../ets/viewmodel/NavigationBarViewModel.ts | 6 ++--- .../src/main/ets/MainAbility/MainAbility.ts | 1 + .../src/main/ets/pages/control.ets | 3 +++ .../ServiceExtAbility/ServiceExtAbility.ts | 1 - .../src/main/ets/pages/bannerNotification.ets | 3 ++- .../src/main/ets/pages/notification.ets | 4 ++- .../ServiceExtAbility/ServiceExtAbility.ts | 1 - .../src/main/ets/pages/bannerNotification.ets | 3 ++- .../src/main/ets/pages/control.ets | 3 +++ .../src/main/ets/pages/index.ets | 4 ++- .../src/main/ets/pages/notification.ets | 5 +++- 24 files changed, 77 insertions(+), 21 deletions(-) diff --git a/common/src/main/ets/default/ResourceUtil.ts b/common/src/main/ets/default/ResourceUtil.ts index b01b922a..9f57e18c 100644 --- a/common/src/main/ets/default/ResourceUtil.ts +++ b/common/src/main/ets/default/ResourceUtil.ts @@ -23,9 +23,15 @@ export class ResourceUtil { /** * Initialize ResourceManager */ - async initResourceManager(): Promise { + async initResourceManager(abilityName?: string): Promise { if (!this.resMgr) { - let context = AbilityManager.getContext(); + + let context; + if(abilityName === AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT) { + context = AbilityManager.getAbilityContext(abilityName); + } else { + context = AbilityManager.getContext(abilityName); + } this.resMgr = await context.resourceManager; } return this.resMgr; @@ -37,7 +43,6 @@ export class ResourceUtil { * @param resource - NormalResource instance */ async getString(resource): Promise { - await this.initResourceManager(); return await this.resMgr.getString(resource.id); } @@ -47,7 +52,6 @@ export class ResourceUtil { * @param resource - NormalResource instance */ async getConfiguration(): Promise { - await this.initResourceManager(); return await this.resMgr.getConfiguration(); } } diff --git a/common/src/main/ets/default/SettingsUtil.ts b/common/src/main/ets/default/SettingsUtil.ts index a09c67db..b5100ea7 100644 --- a/common/src/main/ets/default/SettingsUtil.ts +++ b/common/src/main/ets/default/SettingsUtil.ts @@ -30,7 +30,7 @@ export class SettingsUtil { constructor() { Log.showDebug(TAG, 'constructor'); try { - this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), Constants.URI_VAR); + this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(this.context), Constants.URI_VAR); } catch (e) { Log.showError(TAG, `constructor, acquire helper error: ${JSON.stringify(e)}`); } diff --git a/common/src/main/ets/default/abilitymanager/abilityManager.ts b/common/src/main/ets/default/abilitymanager/abilityManager.ts index 64b31c0e..36bb9909 100644 --- a/common/src/main/ets/default/abilitymanager/abilityManager.ts +++ b/common/src/main/ets/default/abilitymanager/abilityManager.ts @@ -14,6 +14,7 @@ */ import { BusinessError } from 'basic'; +import AbilityContext from 'application/AbilityContext'; import ServiceExtensionContext from 'application/ServiceExtensionContext'; import Want from '@ohos.application.Want'; import Log from '../Log'; @@ -46,6 +47,19 @@ export default class AbilityManager { return globalThis[abilityName + '_Context']; } + static setAbilityContext(abilityName: string, context: AbilityContext): void { + Log.showDebug(TAG, `setContext, abilityName: ${abilityName}`); + globalThis[abilityName + '_Context'] = context; + } + + static getAbilityContext(abilityName?: string): AbilityContext { + Log.showDebug(TAG, `getContext, abilityName: ${abilityName}`); + if (!abilityName) { + abilityName = AbilityManager.ABILITY_NAME_ENTRY; + } + return globalThis[abilityName + '_Context']; + } + static setAbilityData(abilityName: string, key: string, data: any): void { Log.showDebug(TAG, `setAbilityData, abilityName: ${abilityName} key: ${key} data: ${JSON.stringify(data)}`); globalThis[abilityName + '_data_' + key] = data; @@ -56,6 +70,19 @@ export default class AbilityManager { return globalThis[abilityName + '_data_' + key]; } + static setContextName(abilityName: string, contextName: string): void { + Log.showDebug(TAG, `setContextName, abilityName: ${abilityName}`); + globalThis[abilityName + '_ContextName'] = contextName; + } + + static getContextName(abilityName?: string): string { + Log.showDebug(TAG, `setContextName, abilityName: ${abilityName}`); + if (!abilityName) { + abilityName = AbilityManager.ABILITY_NAME_ENTRY; + } + return globalThis[abilityName + '_ContextName']; + } + static startAbility(want: Want, callback?: (error?: BusinessError) => void): void { Log.showDebug(TAG, `startAbility, want: ${JSON.stringify(want)}`); let context: ServiceExtensionContext = AbilityManager.getContext(); diff --git a/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts b/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts index 6c3c448b..63bd5d30 100644 --- a/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts +++ b/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts index 52710acd..8c2489c2 100644 --- a/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts +++ b/features/brightnesscomponent/src/main/ets/default/brightnessManager.ts @@ -36,7 +36,8 @@ export class brightnessManager { Log.showInfo(TAG, 'init'); this.uri = settings.getUriSync(SYSTEMUI_BRIGHTNESS); Log.showInfo(TAG, 'settings geturi of brightness is ' + this.uri); - this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), CommonConstants.URI_VAR); + let contextName = AbilityManager.getContextName(AbilityManager.ABILITY_NAME_CONTROL_PANEL); + this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(contextName), CommonConstants.URI_VAR); this.getValue(); } diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts index 954e9819..5d5a00bd 100644 --- a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts +++ b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts @@ -68,6 +68,7 @@ export default class CapsuleViewModel { this.mIsBackground = data.isBackground; this.mWantBundleName = data.wantBundleName; this.mWantAbilityName = data.wantAbilityName; + await ResourceUtil.initResourceManager(AbilityManager.ABILITY_NAME_STATUS_BAR); if (data.callState == CallState.CALL_INCOMING || data.callState == CallState.CALL_WAITING) { this.mStartTime = 0; this.mText =await ResourceUtil.getString($r("app.string.incoming_call")); diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts index 0b9cb5c8..db502da9 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/model/ControlCenterService.ts @@ -85,8 +85,9 @@ export class ControlCenterService { SwitchUserManager.getInstance().registerListener(this); CONTROLCENTER_SOURCE_CONFIG.filterDatas = config.MetaToggles; - this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); - this.mAdapter.setWant(globalThis[Constants.PLUGIN_COMPONENT_OWNER_WANT_KEY]);//xuchanghzou + let contextName = AbilityManager.getContextName(AbilityManager.ABILITY_NAME_CONTROL_PANEL); + this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(contextName), this, moduleName); + this.mAdapter.setWant(globalThis[Constants.PLUGIN_COMPONENT_OWNER_WANT_KEY]); this.mAdapter.initDataSource(CONTROLCENTER_SOURCE_CONFIG); } diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index ff5e9c7e..d6deffc2 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -54,7 +54,7 @@ export default class BundleResourceModel { let label = ''; let that = this; try { - let bundleContext = await AbilityManager.getContext().createBundleContext(data[index].name); + let bundleContext = await AbilityManager.getAbilityContext(AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT).createBundleContext(data[index].name); let bundleResourceManager = await bundleContext.resourceManager; let appInfo = data[index].appInfo; if (parseInt(appInfo.labelId) > 0) { diff --git a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts index 6152d1e4..089c1419 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/vm/noDisturbComponentViewModel.ts @@ -13,6 +13,7 @@ * limitations under the License. */ +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil'; import NoDisturbingModel from '../model/noDisturbingModel'; @@ -180,6 +181,7 @@ export default class NoDisturbComponentViewModel { return result; } async getNextDayLabel(): Promise { + await ResourceUtil.initResourceManager(AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT); this.nextDayLabel = await ResourceUtil.getString($r('app.string.noDisturb_nextDay')); } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index 4067a80e..b3c62052 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -105,7 +105,8 @@ export default class ParseDataUtil { let data = await BundleManager.getBundleInfo(TAG, bundleName, 0, userId); let labelId = data?.appInfo?.labelId; let iconId = data?.appInfo?.iconId; - let item = await BundleManager.getResourceManager(TAG, AbilityManager.getContext(), bundleName); + let contextName = AbilityManager.getContextName(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL); + let item = await BundleManager.getResourceManager(TAG, AbilityManager.getContext(contextName), bundleName); let appMessage = { appName: await item.getString(parseInt(labelId)), icon: await item.getMediaBase64(parseInt(iconId)) diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index 0f5dd46c..26ea39ea 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -13,6 +13,7 @@ * limitations under the License. */ +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import display from '@ohos.display' import Log from '../../../../../../../../common/src/main/ets/default/Log' import ResourceUtil from '../../../../../../../../common/src/main/ets/default/ResourceUtil' @@ -62,6 +63,7 @@ class StatusBarConfiguration { async getDirectionAndPosition() { Log.showInfo(TAG, 'getDirectionAndPosition'); + await ResourceUtil.initResourceManager(AbilityManager.ABILITY_NAME_STATUS_BAR); directionStatus = await ResourceUtil.getConfiguration(); let style: any = CommonStyleConfiguration.getCommonStyle() let deviceTypeInfo = style.deviceTypeInfo diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts index 0eae3d1d..41c404bf 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/model/StatusBarService.ts @@ -95,7 +95,7 @@ export class StatusBarService { SwitchUserManager.getInstance().registerListener(this); STATUSBAR_SOURCE_CONFIG.filterDatas = config.MetaSlots; - this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(), this, moduleName); + this.mAdapter = new PluginDataSourceAdapter(TAG, AbilityManager.getContext(AbilityManager.ABILITY_NAME_STATUS_BAR), this, moduleName); this.mAdapter.setWant(globalThis[Constants.PLUGIN_COMPONENT_OWNER_WANT_KEY]); this.mAdapter.initDataSource(STATUSBAR_SOURCE_CONFIG); } diff --git a/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts b/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts index 749be300..d3474323 100644 --- a/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts +++ b/product/default/navigationBar/src/main/ets/common/NavBarConfiguration.ts @@ -13,6 +13,7 @@ * limitations under the License. */ +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import display from '@ohos.display'; import Log from '../../../../../../../common/src/main/ets/default/log'; import ResourceUtil from '../../../../../../../common/src/main/ets/default/resourceutil'; @@ -61,6 +62,7 @@ class NavBarConfiguration { } async getDirectionAndPosition() { + await ResourceUtil.initResourceManager(AbilityManager.ABILITY_NAME_NAVIGATION_BAR); directionNav = await ResourceUtil.getConfiguration(); if (directionNav.direction == -1) { statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index d4f67582..b3c1b537 100644 --- a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -52,12 +52,12 @@ export default class NavigationBarViewModel { this.mNavigationBarComponentData = AppStorage.SetAndLink(NAVIGATION_BAR_COMPONENT_DATA_KEY, this.mNavigationBarComponentData).get() this.urivar = settings.getUriSync(this.settingDataKey); - if (AbilityManager.getContext() == null) { + if (AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR) == null) { Log.showError(TAG, 'AbilityManager.getContext() is null'); } else { - Log.showInfo(TAG, 'context: ' + AbilityManager.getContext()); + Log.showInfo(TAG, 'context: ' + AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR)); } - this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), CommonConstants.URI_VAR); + this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR), CommonConstants.URI_VAR); this.initNavigationBarStatus(); } diff --git a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts index ba7fb6d9..a8412aa6 100644 --- a/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts +++ b/product/default/notificationmanagement/src/main/ets/MainAbility/MainAbility.ts @@ -24,6 +24,7 @@ const TAG = 'NotificationManagement-MainAbility'; export default class MainAbility extends Ability { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { Log.showInfo(TAG, 'MainAbility onCreate'); + AbilityManager.setAbilityContext(AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT, this.context); globalThis[AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT + '_want'] = want; } diff --git a/product/pc/controlpanel/src/main/ets/pages/control.ets b/product/pc/controlpanel/src/main/ets/pages/control.ets index a07a4b2f..14354243 100644 --- a/product/pc/controlpanel/src/main/ets/pages/control.ets +++ b/product/pc/controlpanel/src/main/ets/pages/control.ets @@ -12,6 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import ControlCenterComponent from '../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent' import Log from '../../../../../../../common/src/main/ets/default/Log' import Constants from './common/constants' @@ -25,6 +27,7 @@ export default struct Control { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) + AbilityManager.setContextName(AbilityManager.ABILITY_NAME_CONTROL_PANEL,AbilityManager.ABILITY_NAME_CONTROL_PANEL); } aboutToDisappear() { diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index dd91590d..46d41405 100644 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -48,7 +48,6 @@ class ServiceExtAbility extends ServiceExtension { Log.showError(TAG, `Can't create window, err:${JSON.stringify(err)}`); }); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_BANNER_NOTICE, this.context); let bannerRect = { left: 872 * dis.width / 1280, top: 44 * dis.width / 1280, diff --git a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets index 72199098..ddae1413 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets @@ -38,7 +38,8 @@ struct Index { mDefaultBannerRect: any; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`); + AbilityManager.setContextName(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL,AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL); setAppBgColor('#00000000') this.mClearCallbacks = [] this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeShow', () => this.onBannerNoticeShow())) diff --git a/product/pc/notificationpanel/src/main/ets/pages/notification.ets b/product/pc/notificationpanel/src/main/ets/pages/notification.ets index 924dc3f7..0da4fd1d 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/notification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/notification.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import Log from '../../../../../../../common/src/main/ets/default/Log' import EventManager from "../../../../../../../common/src/main/ets/default/event/eventmanager" import {obtainStartAbility} from "../../../../../../../common/src/main/ets/default/event/eventutil" @@ -34,7 +35,8 @@ export default struct Notification { @StorageLink('notificationList') notificationList: any[] = [] aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`); + AbilityManager.setContextName(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL,AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL); } build() { diff --git a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 2d8e3476..004380b8 100644 --- a/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/dropdownpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -43,7 +43,6 @@ class ServiceExtAbility extends ServiceExtension { }).catch((err) => { }); - AbilityManager.setContext(AbilityManager.ABILITY_NAME_BANNER_NOTICE, this.context); let bannerRect = { left: 0, top: dis.height / 5, diff --git a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets index fb656302..aa7c7c58 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets @@ -38,7 +38,8 @@ struct Index { mDefaultBannerRect: any; aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`); + AbilityManager.setContextName(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL,AbilityManager.ABILITY_NAME_DROPDOWN_PANEL); setAppBgColor('#00000000') this.mClearCallbacks = [] this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeShow', () => this.onBannerNoticeShow())) diff --git a/product/phone/dropdownpanel/src/main/ets/pages/control.ets b/product/phone/dropdownpanel/src/main/ets/pages/control.ets index 1d5a9603..f475b887 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/control.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/control.ets @@ -12,6 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import ControlCenterComponent from '../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent' import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon' import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockIcon' @@ -38,6 +40,7 @@ export default struct Control { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`) + AbilityManager.setContextName(AbilityManager.ABILITY_NAME_CONTROL_PANEL,AbilityManager.ABILITY_NAME_DROPDOWN_PANEL); } aboutToDisappear() { diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index d5f88b52..06a84ca4 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -22,6 +22,7 @@ import SignalIcon from '../../../../../../../features/signalcomponent/src/main/e import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import image from "@ohos.multimedia.image" import Log from '../../../../../../../common/src/main/ets/default/Log' import Trace from '../../../../../../../common/src/main/ets/default/Trace' @@ -42,6 +43,7 @@ import featureAbility from '@ohos.ability.featureAbility'; import settings from '@ohos.settings'; import CommonConstants from "../../../../../../../common/src/main/ets/default/Constants"; + const TAG = 'DropdownPanel-Index' let mHeightConfigUtils @@ -99,7 +101,7 @@ struct Index { let dropdownRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect') let navigationBarRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config') this.urivar = settings.getUriSync(this.settingDataKey); - this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(), CommonConstants.URI_VAR); + this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL), CommonConstants.URI_VAR); this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); Log.showDebug(TAG, `getValueSync componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`) this.helper.on("dataChange", this.urivar, (data) => { diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index f81423e5..511c3515 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import Log from '../../../../../../../common/src/main/ets/default/Log' import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/eventmanager" import { obtainStartAbility } from "../../../../../../../common/src/main/ets/default/event/eventutil" @@ -49,7 +50,8 @@ export default struct Notification { @StorageLink('notificationList') notificationList: any[] = [] aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) + Log.showInfo(TAG, `aboutToAppear Start`); + AbilityManager.setContextName(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL,AbilityManager.ABILITY_NAME_DROPDOWN_PANEL); } build() { @@ -249,6 +251,7 @@ struct CenterTitle { async updateTimeString(date: Date) { this.mTime = TimeManager.formatTime(date); Log.showDebug(TAG, ` month is ${date.getMonth() + 1} , day is ${date.getDate()} , week is ${Constants.WEEKDAY_LIST[date.getDay() - 1]}`); + await ResourceUtil.initResourceManager(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL); let timeString = (date.getMonth() + 1) + (await ResourceUtil.getString($r('app.string.month'))); timeString += date.getDate() + (await ResourceUtil.getString($r('app.string.day'))); timeString += await ResourceUtil.getString(Constants.WEEKDAY_LIST[date.getDay()]); -- Gitee From be862928b98d25ea0272c22670f9c5a4e3ed004c Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 19 Jul 2022 21:31:06 +0800 Subject: [PATCH 203/373] =?UTF-8?q?systemui=E5=90=84=E4=B8=AA=E6=A8=A1?= =?UTF-8?q?=E5=9D=97context=E8=A7=A3=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- common/src/main/ets/default/SettingsUtil.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/src/main/ets/default/SettingsUtil.ts b/common/src/main/ets/default/SettingsUtil.ts index b5100ea7..f189e1a6 100644 --- a/common/src/main/ets/default/SettingsUtil.ts +++ b/common/src/main/ets/default/SettingsUtil.ts @@ -30,7 +30,8 @@ export class SettingsUtil { constructor() { Log.showDebug(TAG, 'constructor'); try { - this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(this.context), Constants.URI_VAR); + let contextName = AbilityManager.getContextName(AbilityManager.ABILITY_NAME_CONTROL_PANEL); + this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(contextName), Constants.URI_VAR); } catch (e) { Log.showError(TAG, `constructor, acquire helper error: ${JSON.stringify(e)}`); } -- Gitee From 2f6d33e2532c07fd10f0125b3516263135e9ce14 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 19 Jul 2022 21:36:15 +0800 Subject: [PATCH 204/373] =?UTF-8?q?systemui=E5=90=84=E4=B8=AA=E6=A8=A1?= =?UTF-8?q?=E5=9D=97context=E8=A7=A3=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- product/phone/dropdownpanel/src/main/ets/pages/index.ets | 1 - 1 file changed, 1 deletion(-) diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index 06a84ca4..f9b3d804 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -43,7 +43,6 @@ import featureAbility from '@ohos.ability.featureAbility'; import settings from '@ohos.settings'; import CommonConstants from "../../../../../../../common/src/main/ets/default/Constants"; - const TAG = 'DropdownPanel-Index' let mHeightConfigUtils -- Gitee From 4a2aa4d9eb7fae91888d9e0820f52125c8f1a95d Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 19 Jul 2022 21:49:09 +0800 Subject: [PATCH 205/373] =?UTF-8?q?systemui=E5=90=84=E4=B8=AA=E6=A8=A1?= =?UTF-8?q?=E5=9D=97context=E8=A7=A3=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../com/ohos/navigationservice/common/NavBarConfiguration.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts index 8247450a..d852bae2 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import display from '@ohos.display'; import Log from '../../../../../../../../../common/src/main/ets/default/Log'; import ResourceUtil from '../../../../../../../../../common/src/main/ets/default/ResourceUtil'; -- Gitee From 84d35414526a9a69dadcb7a0d365c69d87618842 Mon Sep 17 00:00:00 2001 From: yangpeng85 Date: Wed, 20 Jul 2022 10:58:26 +0800 Subject: [PATCH 206/373] fix get time format failed after reboot Signed-off-by: yangpeng85 --- common/src/main/ets/default/TimeManager.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts index aa43ff02..d7d187b5 100644 --- a/common/src/main/ets/default/TimeManager.ts +++ b/common/src/main/ets/default/TimeManager.ts @@ -88,6 +88,7 @@ class TimeManager { } this.handleTimeFormatChange(); }); + this.handleTimeFormatChange(); } catch (e) { Log.showError(TAG, `Can't listen timeformate change.`); } -- Gitee From 3f376a3e8010901a41b3f0bc9d8930eaa7c80a90 Mon Sep 17 00:00:00 2001 From: lvxiaoqiang Date: Sat, 23 Jul 2022 14:58:59 +0800 Subject: [PATCH 207/373] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=86=9C=E5=8E=86?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lvxiaoqiang --- common/src/main/ets/default/LunarCalendar.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/common/src/main/ets/default/LunarCalendar.ts b/common/src/main/ets/default/LunarCalendar.ts index e31d7aae..38672147 100644 --- a/common/src/main/ets/default/LunarCalendar.ts +++ b/common/src/main/ets/default/LunarCalendar.ts @@ -14,6 +14,10 @@ export function ConvertLunarCalendar(gregorianCalendarYear, gregorianCalendarMon lunarDay = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '初', '廿'], heavenlyStemsAnd = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'], earthlyBranches = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥']; + + let LUNAR_MON_START_INDEX = 0 + let LUNAR_MON_END_INDEX = 11 + let lunarCalendar = [ 0x0b557, 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, @@ -46,7 +50,8 @@ export function ConvertLunarCalendar(gregorianCalendarYear, gregorianCalendarMon break } } - for (let k = 0; k < lunarYearMonths(lunarCalendar[outputLunarYear - initialLunarTime]).length; k++) { + let k = 0 + for (; k < lunarYearMonths(lunarCalendar[outputLunarYear - initialLunarTime]).length; k++) { daySpan -= lunarYearMonths(lunarCalendar[outputLunarYear - initialLunarTime])[k]; if (daySpan <= 0) { if (hasLeapMonth(lunarCalendar[outputLunarYear - initialLunarTime]) > -1 && hasLeapMonth(lunarCalendar[outputLunarYear - initialLunarTime]) <= k) { @@ -64,6 +69,14 @@ export function ConvertLunarCalendar(gregorianCalendarYear, gregorianCalendarMon break } } + if (outputLunarMonth == undefined) { + outputLunarMonth = (k > LUNAR_MON_END_INDEX) ? LUNAR_MON_END_INDEX + 1 : k; + outputLunarMonth = (k == LUNAR_MON_START_INDEX) ? LUNAR_MON_START_INDEX + 1 : k; + } else { + outputLunarMonth = (outputLunarMonth > LUNAR_MON_END_INDEX) ? LUNAR_MON_END_INDEX + 1 : outputLunarMonth; + outputLunarMonth = (outputLunarMonth == LUNAR_MON_START_INDEX) ? LUNAR_MON_START_INDEX + 1 : outputLunarMonth; + } + outputLunarDay = daySpan; if (hasLeapMonth(lunarCalendar[outputLunarYear - initialLunarTime]) > -1 && (typeof (outputLunarMonth) === 'string' && outputLunarMonth.indexOf('闰') > -1)) { let reg = /\d/.exec(outputLunarMonth) -- Gitee From b9c98ae68f7faff20b3261758d8c62430f62d30d Mon Sep 17 00:00:00 2001 From: lizhi Date: Mon, 25 Jul 2022 11:24:20 +0800 Subject: [PATCH 208/373] =?UTF-8?q?[systemui]=E4=BC=98=E5=8C=96style?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../src/main/ets/default/BaseStyleManager.ts | 69 ++++ ...{StyleManager.ts => CommonStyleManager.ts} | 29 +- .../main/ets/default/StyleConfiguration.ts | 4 +- .../ets/template/common/StyleConfiguration.ts | 14 +- .../ets/default/common/StyleConfiguration.ts | 10 +- .../ets/com/ohos/common/StyleConfiguration.ts | 6 +- .../ets/default/common/StyleConfiguration.ts | 6 +- .../ets/default/common/StyleConfiguration.ts | 6 +- .../ets/default/common/StyleConfiguration.ts | 6 +- .../ets/com/ohos/common/StyleConfiguration.ts | 38 +-- .../ets/com/ohos/common/StyleConfiguration.ts | 6 +- .../com/ohos/noticeItem/common/CommonUtil.ts | 3 - .../ets/com/ohos/common/StyleConfiguration.ts | 10 +- .../ets/default/common/StyleConfiguration.ts | 6 +- .../ets/com/ohos/common/StyleConfiguration.ts | 18 +- .../ets/com/ohos/common/StyleConfiguration.ts | 6 +- .../ets/default/common/StyleConfiguration.ts | 6 +- .../src/main/ets/common/StyleConfiguration.ts | 6 +- .../src/main/ets/common/StyleManager.ts | 61 ++-- .../src/main/ets/pages/index.ets | 18 +- .../src/main/ets/common/StyleConfiguration.ts | 6 +- .../src/main/ets/common/StyleManager.ts | 56 ++-- .../volumepanel/src/main/ets/pages/index.ets | 19 +- .../ets/pages/common/StyleConfiguration.ts | 6 +- .../src/main/ets/pages/common/StyleManager.ts | 303 +++++++++--------- .../controlpanel/src/main/ets/pages/index.ets | 5 - .../ets/pages/common/StyleConfiguration.ts | 6 +- .../src/main/ets/pages/common/StyleManager.ts | 34 +- .../src/main/ets/pages/index.ets | 5 - .../ets/pages/common/StyleConfiguration.ts | 6 +- .../src/main/ets/pages/common/StyleManager.ts | 184 ++++++----- .../pc/statusbar/src/main/ets/pages/index.ets | 6 +- .../ets/pages/common/StyleConfiguration.ts | 18 +- .../src/main/ets/pages/common/StyleManager.ts | 300 +++++++++-------- .../src/main/ets/pages/index.ets | 28 +- .../ets/pages/common/StyleConfiguration.ts | 6 +- .../src/main/ets/pages/common/StyleManager.ts | 34 +- .../statusbar/src/main/ets/pages/index.ets | 12 +- 38 files changed, 638 insertions(+), 724 deletions(-) create mode 100644 common/src/main/ets/default/BaseStyleManager.ts rename common/src/main/ets/default/{StyleManager.ts => CommonStyleManager.ts} (47%) diff --git a/common/src/main/ets/default/BaseStyleManager.ts b/common/src/main/ets/default/BaseStyleManager.ts new file mode 100644 index 00000000..138a91c6 --- /dev/null +++ b/common/src/main/ets/default/BaseStyleManager.ts @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2021-2022 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 Log from "./Log"; + +const TAG = "Base-StyleManager"; + +export default class BaseStyleManager { + // standard display width + static readonly STANDARD_DISPLAY_WIDTH_LARGE: number = 2560; + static readonly STANDARD_DISPLAY_WIDTH_NORMAL: number = 1280; + static readonly STANDARD_DISPLAY_WIDTH_SMALL: number = 720; + + mAbilityPageName = ""; + maxWidth: number = BaseStyleManager.STANDARD_DISPLAY_WIDTH_NORMAL; + standardWidth: number = BaseStyleManager.STANDARD_DISPLAY_WIDTH_NORMAL; + + constructor(name: string) { + Log.showInfo(TAG, `constructor, name: ${name}`); + this.mAbilityPageName = name; + } + + setAbilityPageName(name: string): void { + Log.showInfo(TAG, `setAbilityPageName, name: ${name}`); + this.mAbilityPageName = name; + } + + setMaxWidth(width: number): void { + Log.showInfo(TAG, `setMaxWidth, width: ${width}`); + this.maxWidth = width; + } + + setStandardWidth(width: number): void { + Log.showInfo(TAG, `setStandardWidth, width: ${width}`); + this.standardWidth = width; + } + + getStyle(key: string, defaultStyle: T): T { + let newKey = this.mAbilityPageName + "-" + key; + if (!AppStorage.Has(newKey)) { + AppStorage.SetOrCreate(newKey, defaultStyle); + Log.showInfo(TAG, `Create storageKey of ${newKey}`); + } + return AppStorage.Get(newKey) as T; + } + + number2px(n: number): string { + return n.toString() + "px"; + } + + calcScaleSize(n: number): number { + return n * this.maxWidth / this.standardWidth; + } + + calcScaleSizePx(n: number): string { + return this.number2px(this.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/common/src/main/ets/default/StyleManager.ts b/common/src/main/ets/default/CommonStyleManager.ts similarity index 47% rename from common/src/main/ets/default/StyleManager.ts rename to common/src/main/ets/default/CommonStyleManager.ts index 644f8ac5..b131315e 100644 --- a/common/src/main/ets/default/StyleManager.ts +++ b/common/src/main/ets/default/CommonStyleManager.ts @@ -12,30 +12,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import BaseStyleManager from "./BaseStyleManager"; +import Log from "./Log"; -import Log from './Log'; +const TAG = "Common-StyleManager"; -const TAG = 'Common-StyleManager'; +export class CommonStyleManager extends BaseStyleManager { + static readonly ABILITY_PAGE_NAME_COMMON = "Common-Index"; -export class StyleManager { - mAbilityPageName = ''; - - setAbilityPageName(name: string): void{ - Log.showInfo(TAG, `setAbilityPageName, name: ${name}`); - this.mAbilityPageName = name; - } - - getStyle(key: string, generateDefaultFunction: () => T): T { - let newKey = this.mAbilityPageName + '-' + key; - if (!AppStorage.Has(newKey)) { - let defaultStyle = generateDefaultFunction(); - AppStorage.SetOrCreate(newKey, defaultStyle); - Log.showInfo(TAG, `Create storageKey of ${newKey}`); + constructor() { + super(CommonStyleManager.ABILITY_PAGE_NAME_COMMON); } - return AppStorage.Get(newKey) as T; - } } -let styleManager = new StyleManager(); +let commonStyleManager = new CommonStyleManager(); -export default styleManager; \ No newline at end of file +export default commonStyleManager; \ No newline at end of file diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts index 7bd6ad9a..30b11807 100644 --- a/common/src/main/ets/default/StyleConfiguration.ts +++ b/common/src/main/ets/default/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from './StyleManager'; +import StyleManager from './CommonStyleManager'; import deviceInfo from '@ohos.deviceInfo'; const TAG = 'Common-StyleConfiguration'; @@ -30,6 +30,6 @@ export class CommonStyle { export default class StyleConfiguration { static getCommonStyle(): CommonStyle { const key: string = TAG + '-Common'; - return StyleManager.getStyle(key, () => new CommonStyle()); + return StyleManager.getStyle(key, new CommonStyle()); } } \ No newline at end of file diff --git a/common/src/main/ets/template/common/StyleConfiguration.ts b/common/src/main/ets/template/common/StyleConfiguration.ts index 58eb7b58..011060e8 100644 --- a/common/src/main/ets/template/common/StyleConfiguration.ts +++ b/common/src/main/ets/template/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../default/StyleManager'; +import StyleManager from '../../default/CommonStyleManager'; const TAG = 'CommonTemplate-StyleConfiguration'; @@ -72,22 +72,16 @@ export class SimpleToggleBaseStyle { export default class StyleConfiguration { static getIconTitleBaseStyle(): IconTitleBaseStyle { const key: string = TAG + '-IconTitleBase'; - return StyleManager.getStyle(key, () => { - return new IconTitleBaseStyle(); - }); + return StyleManager.getStyle(key, new IconTitleBaseStyle()); } static getIconComponentStyle(): IconComponentStyle { const key: string = TAG + '-IconComponent'; - return StyleManager.getStyle(key, () => { - return new IconComponentStyle(); - }); + return StyleManager.getStyle(key, new IconComponentStyle()); } static getSimpleToggleBaseStyle(): SimpleToggleBaseStyle { const key: string = TAG + '-SimpleToggleBase'; - return StyleManager.getStyle(key, () => { - return new SimpleToggleBaseStyle(); - }); + return StyleManager.getStyle(key, new SimpleToggleBaseStyle()); } } \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts index d47b0072..4fbdfea0 100644 --- a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'battery-StyleConfiguration'; @@ -38,15 +38,11 @@ export class BatteryPicStyle { export default class StyleConfiguration { static getBatteryComponentStyle(): BatteryComponentStyle { const key: string = TAG + '-BatteryComponent'; - return StyleManager.getStyle(key, () => { - return new BatteryComponentStyle(); - }); + return StyleManager.getStyle(key, new BatteryComponentStyle()); } static getBatteryPicStyle(): BatteryPicStyle { const key: string = TAG + '-BatteryPicComponent'; - return StyleManager.getStyle(key, () => { - return new BatteryPicStyle(); - }); + return StyleManager.getStyle(key, new BatteryPicStyle()); } } \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index ab340b5e..68dc4acf 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'bluetooth-StyleConfiguration'; @@ -25,8 +25,6 @@ export class StatusBarBluetoothComponentStyle { export default class StyleConfiguration { static getStatusBarBluetoothComponentStyle(): StatusBarBluetoothComponentStyle { const key: string = TAG + '-StatusBarBluetoothComponent'; - return StyleManager.getStyle(key, () => { - return new StatusBarBluetoothComponentStyle(); - }); + return StyleManager.getStyle(key, new StatusBarBluetoothComponentStyle()); } } \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts index 6a5efe8a..440fa72f 100644 --- a/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'brightness-StyleConfiguration'; @@ -36,8 +36,6 @@ export class BrightnessComponentStyle { export default class StyleConfiguration { static getBrightnessComponentStyle(): BrightnessComponentStyle { const key: string = TAG + '-BrightnessComponent'; - return StyleManager.getStyle(key, () => { - return new BrightnessComponentStyle(); - }); + return StyleManager.getStyle(key, new BrightnessComponentStyle()); } } \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts index e3135c1a..17e2aa7a 100644 --- a/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; import Constants from './constants'; const TAG = 'capsule-StyleConfiguration'; @@ -32,8 +32,6 @@ export class CapsuleComponentStyle { export default class StyleConfiguration { static getCapsuleComponentStyle(): CapsuleComponentStyle { const key: string = TAG + '-CapsuleComponent'; - return StyleManager.getStyle(key, () => { - return new CapsuleComponentStyle(); - }); + return StyleManager.getStyle(key, new CapsuleComponentStyle()); } } \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts index 41aeb279..e0586a53 100644 --- a/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'clock-StyleConfiguration'; @@ -24,8 +24,6 @@ export class ClockComponentStyle { export default class StyleConfiguration { static getClockComponentStyle(): ClockComponentStyle { const key: string = TAG + '-ClockComponent'; - return StyleManager.getStyle(key, () => { - return new ClockComponentStyle(); - }); + return StyleManager.getStyle(key, new ClockComponentStyle()); } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 074909e6..11e816ec 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; import Constants from './Constants'; const TAG = 'ControlCenter-StyleConfiguration'; @@ -134,64 +134,46 @@ export class ControlEditDialogStyle { export default class StyleConfiguration { static getControlCenterComponentStyle(): ControlCenterComponentStyle { const key: string = TAG + '-ControlCenterComponent'; - return StyleManager.getStyle(key, () => { - return new ControlCenterComponentStyle(); - }); + return StyleManager.getStyle(key, new ControlCenterComponentStyle()); } static getControlCenterUpTitleStyle(): ControlCenterUpTitleStyle { const key: string = TAG + '-ControlCenterUpTitle'; - return StyleManager.getStyle(key, () => { - return new ControlCenterUpTitleStyle(); - }); + return StyleManager.getStyle(key, new ControlCenterUpTitleStyle()); } static getControlCenterComplexToggleLayoutStyle(): ControlCenterComplexToggleLayoutStyle { const key: string = TAG + '-ControlCenterComplexToggleLayout'; - return StyleManager.getStyle(key, () => { - return new ControlCenterComplexToggleLayoutStyle(); - }); + return StyleManager.getStyle(key, new ControlCenterComplexToggleLayoutStyle()); } static getControlCenterSimpleToggleLayoutStyle(): ControlCenterSimpleToggleLayoutStyle { const key: string = TAG + '-ControlCenterSimpleToggleLayout'; - return StyleManager.getStyle(key, () => { - return new ControlCenterSimpleToggleLayoutStyle(); - }); + return StyleManager.getStyle(key, new ControlCenterSimpleToggleLayoutStyle()); } static getSimpleToggleLayoutEditComponentStyle(): SimpleToggleLayoutEditComponentStyle { const key: string = TAG + '-SimpleToggleLayoutEditComponent'; - return StyleManager.getStyle(key, () => { - return new SimpleToggleLayoutEditComponentStyle(); - }); + return StyleManager.getStyle(key, new SimpleToggleLayoutEditComponentStyle()); } static getSimpleToggleLayoutEditUpTitleStyle(): SimpleToggleLayoutEditUpTitleStyle { const key: string = TAG + '-SimpleToggleLayoutEditUpTitle'; - return StyleManager.getStyle(key, () => { - return new SimpleToggleLayoutEditUpTitleStyle(); - }); + return StyleManager.getStyle(key, new SimpleToggleLayoutEditUpTitleStyle()); } static getSimpleToggleLayoutEditOptMsgStyle(): SimpleToggleLayoutEditOptMsgStyle { const key: string = TAG + '-SimpleToggleLayoutEditOptMsg'; - return StyleManager.getStyle(key, () => { - return new SimpleToggleLayoutEditOptMsgStyle(); - }); + return StyleManager.getStyle(key, new SimpleToggleLayoutEditOptMsgStyle()); } static getSimpleToggleLayoutEditGridStyle(): SimpleToggleLayoutEditGridStyle { const key: string = TAG + '-SimpleToggleLayoutEditGrid'; - return StyleManager.getStyle(key, () => { - return new SimpleToggleLayoutEditGridStyle(); - }); + return StyleManager.getStyle(key, new SimpleToggleLayoutEditGridStyle()); } static getControlEditDialogStyle(): ControlEditDialogStyle { const key: string = TAG + '-ControlEditDialog'; - return StyleManager.getStyle(key, () => { - return new ControlEditDialogStyle(); - }); + return StyleManager.getStyle(key, new ControlEditDialogStyle()); } } \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 7dcd9954..3ae54fc6 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'location-StyleConfiguration'; @@ -25,8 +25,6 @@ export class StartsBarLocationComponentStyle { export default class StyleConfiguration { static getStartsBarLocationComponentStyle(): StartsBarLocationComponentStyle { const key: string = TAG + '-startsBarLocation'; - return StyleManager.getStyle(key, () => { - return new StartsBarLocationComponentStyle(); - }); + return StyleManager.getStyle(key, new StartsBarLocationComponentStyle()); } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts index 63fe217d..84e89d17 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -37,6 +37,3 @@ export default class CommonUtil { return (0 <= notificationUser && notificationUser < 100) || notificationUser == currentUser; } } - - - diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index ad5921d0..3e4997e7 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'capsule-StyleConfiguration'; @@ -29,15 +29,11 @@ export class ControlCenterRingModeComponentStyle { export default class StyleConfiguration { static getStatusRingModeComponentStyle(): StatusRingModeComponentStyle { const key: string = TAG + '-StatusRingMode'; - return StyleManager.getStyle(key, () => { - return new StatusRingModeComponentStyle(); - }); + return StyleManager.getStyle(key, new StatusRingModeComponentStyle()); } static getControlCenterRingModeComponentStyle(): ControlCenterRingModeComponentStyle { const key: string = TAG + '-ControlCenterRingMode'; - return StyleManager.getStyle(key, () => { - return new ControlCenterRingModeComponentStyle(); - }); + return StyleManager.getStyle(key, new ControlCenterRingModeComponentStyle()); } } \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts index fadcc029..86238486 100644 --- a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'signal-StyleConfiguration'; @@ -29,8 +29,6 @@ export class SignalComponentStyle { export default class StyleConfiguration { static getSignalComponentStyle(): SignalComponentStyle { const key: string = TAG + '-SignalComponent'; - return StyleManager.getStyle(key, () => { - return new SignalComponentStyle(); - }); + return StyleManager.getStyle(key, new SignalComponentStyle()); } } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index e92b2eaa..9b7939f2 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; import Constants from './Constants'; const TAG = 'statusBar-StyleConfiguration'; @@ -48,29 +48,21 @@ export class PluginIconItemComponentStyle { export default class StyleConfiguration { static getVerticalStatusBarItemLoadComponentStyle(): VerticalStatusBarItemLoadComponentStyle { const key: string = TAG + '-VerticalStatusBarItemLoadComponent'; - return StyleManager.getStyle(key, () => { - return new VerticalStatusBarItemLoadComponentStyle(); - }); + return StyleManager.getStyle(key, new VerticalStatusBarItemLoadComponentStyle()); } static getStatusBarNotificationIconStyle(): StatusBarNotificationIconStyle { const key: string = TAG + '-StatusBarNotificationIcon'; - return StyleManager.getStyle(key, () => { - return new StatusBarNotificationIconStyle(); - }); + return StyleManager.getStyle(key, new StatusBarNotificationIconStyle()); } static getIconItemComponentStyle(): IconItemComponentStyle { const key: string = TAG + '-IconItemComponent'; - return StyleManager.getStyle(key, () => { - return new IconItemComponentStyle(); - }); + return StyleManager.getStyle(key, new IconItemComponentStyle()); } static getPluginIconItemComponentStyle(): PluginIconItemComponentStyle { const key: string = TAG + '-PluginIconItemComponent'; - return StyleManager.getStyle(key, () => { - return new PluginIconItemComponentStyle(); - }); + return StyleManager.getStyle(key, new PluginIconItemComponentStyle()); } } \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 66a202ec..f57bdd94 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; import Constants from './Constants'; const TAG = 'volumepanel-StyleConfiguration'; @@ -44,8 +44,6 @@ export class VolumePanelComponentStyle { export default class StyleConfiguration { static getVolumePanelComponentStyle(): VolumePanelComponentStyle { const key: string = TAG + '-VolumePanelComponent'; - return StyleManager.getStyle(key, () => { - return new VolumePanelComponentStyle(); - }); + return StyleManager.getStyle(key, new VolumePanelComponentStyle()); } } \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts index 42935dc8..6c67499b 100644 --- a/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'wifi-StyleConfiguration'; @@ -25,8 +25,6 @@ export class StartsBarWifiComponentStyle { export default class StyleConfiguration { static getStartsBarWifiComponentStyle(): StartsBarWifiComponentStyle { const key: string = TAG + '-startsBarWifi'; - return StyleManager.getStyle(key, () => { - return new StartsBarWifiComponentStyle(); - }); + return StyleManager.getStyle(key, new StartsBarWifiComponentStyle()); } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts b/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts index b33f4f96..eb021b17 100644 --- a/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts +++ b/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from './StyleManager'; const TAG = 'NavigationBar-StyleConfiguration'; @@ -28,8 +28,6 @@ export class KeyButtonStyle { export default class StyleConfiguration { static getKeyButtonStyle(): KeyButtonStyle { const key: string = TAG + '-KeyButton'; - return StyleManager.getStyle(key, () => { - return new KeyButtonStyle(); - }); + return StyleManager.getStyle(key, new KeyButtonStyle()); } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/common/StyleManager.ts b/product/default/navigationBar/src/main/ets/common/StyleManager.ts index 10f4fdb1..9c425818 100644 --- a/product/default/navigationBar/src/main/ets/common/StyleManager.ts +++ b/product/default/navigationBar/src/main/ets/common/StyleManager.ts @@ -12,66 +12,57 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import Log from '../../../../../../../common/src/main/ets/default/Log'; +import BaseStyleManager from '../../../../../../../common/src/main/ets/default/BaseStyleManager'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import StyleConfiguration from './StyleConfiguration'; const TAG = 'StatusBar-StyleManager'; -export default class StyleManager { - static readonly PAD_STANDARD_DISPLAY_WIDTH = 1280; - static readonly PAD_STANDARD_DISPLAY_HEIGHT = 800; - static readonly PHONE_STANDARD_DISPLAY_WIDTH = 720; - static readonly PHONE_STANDARD_DISPLAY_HEIGHT = 1280; - static maxWidth: number = StyleManager.PAD_STANDARD_DISPLAY_WIDTH; - static rumMode = 'pad'; +export class StyleManager extends BaseStyleManager { + static readonly ABILITY_PAGE_NAME_NAVIGATION_BAR = "NavigationBar-Index"; + + constructor() { + super(StyleManager.ABILITY_PAGE_NAME_NAVIGATION_BAR); + } - static setPadStyle(): void { + setPadStyle(): void { Log.showDebug(TAG, 'setPadStyle'); let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); - StyleManager.maxWidth = config.maxWidth; - StyleManager.rumMode = 'pad'; + this.setMaxWidth(config.maxWidth); + this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_NORMAL); // keyButton { let style = StyleConfiguration.getKeyButtonStyle(); - style.buttonWidth = StyleManager.calcScaleSizePx(88); - style.buttonHeight = StyleManager.calcScaleSizePx(44); - style.buttonBorderRadius = StyleManager.calcScaleSizePx(22); - style.buttonIconWidth = StyleManager.calcScaleSizePx(15); - style.buttonIconHeight = StyleManager.calcScaleSizePx(15); + style.buttonWidth = this.calcScaleSizePx(88); + style.buttonHeight = this.calcScaleSizePx(44); + style.buttonBorderRadius = this.calcScaleSizePx(22); + style.buttonIconWidth = this.calcScaleSizePx(15); + style.buttonIconHeight = this.calcScaleSizePx(15); } } - static setPhoneStyle(): void { + setPhoneStyle(): void { Log.showDebug(TAG, 'setPhoneStyle'); let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); - StyleManager.maxWidth = config.maxWidth; - StyleManager.rumMode = 'phone'; + this.setMaxWidth(config.maxWidth); + this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_SMALL); // keyButton { let style = StyleConfiguration.getKeyButtonStyle(); - style.buttonWidth = StyleManager.calcScaleSizePx(144); - style.buttonHeight = StyleManager.calcScaleSizePx(72); - style.buttonBorderRadius = StyleManager.calcScaleSizePx(36); - style.buttonIconWidth = StyleManager.calcScaleSizePx(24); - style.buttonIconHeight = StyleManager.calcScaleSizePx(24); + style.buttonWidth = this.calcScaleSizePx(144); + style.buttonHeight = this.calcScaleSizePx(72); + style.buttonBorderRadius = this.calcScaleSizePx(36); + style.buttonIconWidth = this.calcScaleSizePx(24); + style.buttonIconHeight = this.calcScaleSizePx(24); } } +} - static number2px(n: number): string { - return n.toString() + 'px'; - } +let styleManager = new StyleManager(); - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / (StyleManager.rumMode == 'pad' ? StyleManager.PAD_STANDARD_DISPLAY_WIDTH : StyleManager.PHONE_STANDARD_DISPLAY_WIDTH); - } - - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } -} \ No newline at end of file +export default styleManager; \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/pages/index.ets b/product/default/navigationBar/src/main/ets/pages/index.ets index 0e5dd270..a1fbebf4 100644 --- a/product/default/navigationBar/src/main/ets/pages/index.ets +++ b/product/default/navigationBar/src/main/ets/pages/index.ets @@ -16,14 +16,11 @@ import Three from './threeLayout' import Log from '../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' import NavigationBarViewModel from '../viewmodel/NavigationBarViewModel'; import {NavigationBarComponentData} from '../common/constants' import StyleManager from '../common/StyleManager' import configManager from '../../../../../../../features/navigationservice/src/main/ets/com/ohos/navigationservice/ConfigManager' -const STORAGE_NAVIGATION_TYPE = 'navigationType' - const TAG = 'NavigationBar-Index'; let mConfigManager = configManager @@ -41,17 +38,16 @@ struct Index { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config') - AppStorage.SetOrCreate("showNavHorizontal", configInfo.showNavHorizontal) - mConfigManager.initConfig() + Log.showInfo(TAG, `aboutToAppear Start`); + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); + AppStorage.SetOrCreate("showNavHorizontal", configInfo.showNavHorizontal); + mConfigManager.initConfig(); - setAppBgColor('#00000000') - CommonStyleManager.setAbilityPageName(TAG) + setAppBgColor('#00000000'); if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode - StyleManager.setPadStyle() + StyleManager.setPadStyle(); } else { // Phone Mode - StyleManager.setPhoneStyle() + StyleManager.setPhoneStyle(); } let navigationBarViewModelInstance = NavigationBarViewModel.getInstance(); diff --git a/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts b/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts index d7146b90..0ffaec26 100644 --- a/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts +++ b/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/StyleManager'; +import StyleManager from './StyleManager'; const TAG = 'VolumePanel-StyleConfiguration'; @@ -23,8 +23,6 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, () => { - return new IndexStyle(); - }); + return StyleManager.getStyle(key, new IndexStyle()); } } \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/common/StyleManager.ts b/product/default/volumepanel/src/main/ets/common/StyleManager.ts index 16224562..2cc737bc 100644 --- a/product/default/volumepanel/src/main/ets/common/StyleManager.ts +++ b/product/default/volumepanel/src/main/ets/common/StyleManager.ts @@ -12,41 +12,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +import BaseStyleManager from '../../../../../../../common/src/main/ets/default/BaseStyleManager'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import StyleConfiguration from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration'; const TAG = 'VolumePanel-StyleManager'; -export default class StyleManager { - static readonly STANDARD_DISPLAY_WIDTH: number = 2560; - static readonly STANDARD_DISPLAY_HEIGHT: number = 1600; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; +export class StyleManager extends BaseStyleManager { + static readonly ABILITY_PAGE_NAME_VOLUMEPANEL = "VolumePanel-Index"; + + constructor() { + super(StyleManager.ABILITY_PAGE_NAME_VOLUMEPANEL); + } - static setStyle(): void { + setStyle(): void { Log.showDebug(TAG, 'setStyle'); + this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_LARGE); let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis'); - StyleManager.maxWidth = config.width; + this.setMaxWidth(config.width); // Pad、PC Mode { let style = StyleConfiguration.getVolumePanelComponentStyle(); - style.volumePanelSliderMarginTop = StyleManager.calcScaleSizePx(40); - style.volumePanSliderWidth = px2vp(StyleManager.calcScaleSize(8)).toString() + 'vp'; - style.volumePanSliderHeight = StyleManager.calcScaleSizePx(320); - style.volumePanelSliderMarginBottom = StyleManager.calcScaleSizePx(40); - style.volumePanelMutBtnIconSize = StyleManager.calcScaleSizePx(48); - style.volumePanelMutBtnIconMarginBottom = StyleManager.calcScaleSizePx(24); - style.volumePanelMuteBtnHeight = StyleManager.calcScaleSizePx(72); - style.volumePanelSettingIconSize = StyleManager.calcScaleSizePx(48); - style.volumePanelSettingButtonSize = StyleManager.calcScaleSizePx(96); + style.volumePanelSliderMarginTop = this.calcScaleSizePx(40); + style.volumePanSliderWidth = px2vp(this.calcScaleSize(8)).toString() + 'vp'; + style.volumePanSliderHeight = this.calcScaleSizePx(320); + style.volumePanelSliderMarginBottom = this.calcScaleSizePx(40); + style.volumePanelMutBtnIconSize = this.calcScaleSizePx(48); + style.volumePanelMutBtnIconMarginBottom = this.calcScaleSizePx(24); + style.volumePanelMuteBtnHeight = this.calcScaleSizePx(72); + style.volumePanelSettingIconSize = this.calcScaleSizePx(48); + style.volumePanelSettingButtonSize = this.calcScaleSizePx(96); style.volumePanelBackground = '#99FFFFFF'; style.volumePanelSliderBlockColor = '#FFFFFFFF'; - style.volumePanelDividerHeight = StyleManager.calcScaleSizePx(1); - style.volumePanelBorderRadius = StyleManager.calcScaleSizePx(48); - style.volumeDividerWidth = StyleManager.calcScaleSizePx(60); + style.volumePanelDividerHeight = this.calcScaleSizePx(1); + style.volumePanelBorderRadius = this.calcScaleSizePx(48); + style.volumeDividerWidth = this.calcScaleSizePx(60); style.volumeSliderTrackColor = '#FFAEE6E6'; style.volumeSelectedColor = '#FF007DFF'; style.volumeButtonBackgroundColor = '#00000000'; @@ -54,18 +57,9 @@ export default class StyleManager { style.volumePanelDividerColor = '#FF9BCECE'; style.volumePanelSettingColor = '#FF4D6666'; } - } +} - static number2px(n: number): string { - return n.toString() + 'px'; - } - - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } +let styleManager = new StyleManager(); - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } -} \ No newline at end of file +export default styleManager; \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/pages/index.ets b/product/default/volumepanel/src/main/ets/pages/index.ets index 15c57f71..65b77736 100644 --- a/product/default/volumepanel/src/main/ets/pages/index.ets +++ b/product/default/volumepanel/src/main/ets/pages/index.ets @@ -12,24 +12,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import Constants from '../common/constants' import Log from '../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' import VolumePanelComponent from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StyleManager from '../common/StyleManager' import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' - const TAG = 'VolumePanel-Index' @Entry @Component struct Index { aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear Start`) - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis') + Log.showInfo(TAG, `aboutToAppear Start`); + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis'); let volumeRect; if (configInfo.width > configInfo.height) { // Pad、PC Mode const realWidth = 48; @@ -39,7 +35,7 @@ struct Index { top: (configInfo.height - vp2px(realHeight) ) / 2, width: vp2px(realWidth) , height: vp2px(realHeight) - } + }; } else { // Phone Mode const realWidth = 48; const realHeight = 284; @@ -48,16 +44,15 @@ struct Index { top: configInfo.height * 0.1, width: vp2px(realWidth) , height: vp2px(realHeight) - } + }; } - AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'rect', volumeRect) + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'rect', volumeRect); WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); - setAppBgColor('#00000000') - CommonStyleManager.setAbilityPageName(TAG) + setAppBgColor('#00000000'); Log.showDebug(TAG, `configInfo Start, configInfo ${JSON.stringify(configInfo)}`); if (configInfo.width > configInfo.height) { // Pad、PC Mode - StyleManager.setStyle() + StyleManager.setStyle(); } } diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts index 90148ebd..b0d23190 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/stylemanager'; +import StyleManager from './StyleManager'; const TAG = 'ControlPanel-StyleConfiguration'; @@ -24,9 +24,7 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, () => { - return new IndexStyle(); - }); + return StyleManager.getStyle(key, new IndexStyle()); } } diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts index b27b59c3..70422b98 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +import BaseStyleManager from '../../../../../../../../common/src/main/ets/default/BaseStyleManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/styleconfiguration'; @@ -23,125 +23,128 @@ import IndexStyleConfiguration from './styleconfiguration'; const TAG = 'ControlPanel-StyleManager'; -export default class StyleManager { - static readonly STANDARD_DISPLAY_WIDTH = 1280; - static readonly STANDARD_DISPLAY_HEIGHT = 800; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; +export class StyleManager extends BaseStyleManager { + static readonly ABILITY_PAGE_NAME_CONTROLPANEL = "ControlPanel-Index"; + + constructor() { + super(StyleManager.ABILITY_PAGE_NAME_CONTROLPANEL); + } - static setStyle(): void{ + setStyle(): void{ Log.showDebug(TAG, 'setStyle'); + this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_NORMAL); let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'dis'); - StyleManager.maxWidth = dis.width; + this.setMaxWidth(dis.width); // Index - StyleManager.setIndexStyle(); + this.setIndexStyle(); // ControlCenter - StyleManager.setControlCenterComponentStyle(); + this.setControlCenterComponentStyle(); // ControlCenter-Title - StyleManager.setControlCenterUpTitleStyle(); + this.setControlCenterUpTitleStyle(); // ControlCenter-ComplexToggleLayout - StyleManager.setControlCenterComplexToggleLayoutStyle(); + this.setControlCenterComplexToggleLayoutStyle(); // ControlCenter-SimpleToggleLayout - StyleManager.setControlCenterSimpleToggleLayoutStyle(); + this.setControlCenterSimpleToggleLayoutStyle(); // CommonTemplate-iconTitleBase - StyleManager.setIconTitleBaseStyle(); + this.setIconTitleBaseStyle(); // CommonTemplate-iconComponent - StyleManager.setIconComponentStyle(); + this.setIconComponentStyle(); // CommonTemplate-simpleToggleBase - StyleManager.setSimpleToggleBaseStyle(); + this.setSimpleToggleBaseStyle(); // Brightness - StyleManager.setBrightnessComponentStyle(); + this.setBrightnessComponentStyle(); // RingMode - StyleManager.setControlCenterRingModeComponentStyle(); + this.setControlCenterRingModeComponentStyle(); // SimpleToggleLayoutEdit - StyleManager.setSimpleToggleLayoutEditComponentStyle(); + this.setSimpleToggleLayoutEditComponentStyle(); // SimpleToggleLayoutEdit-title - StyleManager.setSimpleToggleLayoutEditUpTitleStyle(); + this.setSimpleToggleLayoutEditUpTitleStyle(); // SimpleToggleLayoutEdit-msg - StyleManager.setSimpleToggleLayoutEditOptMsgStyle(); + this.setSimpleToggleLayoutEditOptMsgStyle(); // SimpleToggleLayoutEdit-grid - StyleManager.setSimpleToggleLayoutEditGridStyle(); + this.setSimpleToggleLayoutEditGridStyle(); // EditDialog - StyleManager.setControlEditDialogStyle(); + this.setControlEditDialogStyle(); } // Index - private static setIndexStyle(): void { + private setIndexStyle(): void { let style = IndexStyleConfiguration.getIndexStyle(); - style.borderRadius = StyleManager.calcScaleSizePx(24); + style.borderRadius = this.calcScaleSizePx(24); } // ControlCenter - private static setControlCenterComponentStyle(): void { + private setControlCenterComponentStyle(): void { let style = ControlCenterStyleConfiguration.getControlCenterComponentStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(20); - style.marginRight = StyleManager.calcScaleSizePx(20); - style.marginTop = StyleManager.calcScaleSizePx(0); - style.upTitleHeight = StyleManager.calcScaleSizePx(56); - style.titleMarginBottom = StyleManager.calcScaleSizePx(0); - style.toggleAreaGap = StyleManager.calcScaleSizePx(12); - style.simpleToggleLayoutMarginTop = StyleManager.calcScaleSizePx(23); - style.simpleToggleLayoutMarginBottom = StyleManager.calcScaleSizePx(0); - style.brightnessMarginBottom = StyleManager.calcScaleSizePx(12); - style.componentBorderRadius = StyleManager.calcScaleSizePx(24); + style.marginLeft = this.calcScaleSizePx(20); + style.marginRight = this.calcScaleSizePx(20); + style.marginTop = this.calcScaleSizePx(0); + style.upTitleHeight = this.calcScaleSizePx(56); + style.titleMarginBottom = this.calcScaleSizePx(0); + style.toggleAreaGap = this.calcScaleSizePx(12); + style.simpleToggleLayoutMarginTop = this.calcScaleSizePx(23); + style.simpleToggleLayoutMarginBottom = this.calcScaleSizePx(0); + style.brightnessMarginBottom = this.calcScaleSizePx(12); + style.componentBorderRadius = this.calcScaleSizePx(24); style.componentBackgroundColor = '#99FFFFFF'; } // ControlCenter-Title - private static setControlCenterUpTitleStyle(): void{ + private setControlCenterUpTitleStyle(): void{ let style = ControlCenterStyleConfiguration.getControlCenterUpTitleStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(24); - style.marginRight = StyleManager.calcScaleSizePx(21); - style.fontSize = StyleManager.calcScaleSizePx(20); + style.marginLeft = this.calcScaleSizePx(24); + style.marginRight = this.calcScaleSizePx(21); + style.fontSize = this.calcScaleSizePx(20); style.fontColor = '#000000'; - style.imageWidth = StyleManager.calcScaleSizePx(24); - style.imageHeight = StyleManager.calcScaleSizePx(24); - style.imageHoverWidth = StyleManager.calcScaleSizePx(32); - style.imageHoverHeight = StyleManager.calcScaleSizePx(32); - style.imageHoverRadius = StyleManager.calcScaleSizePx(8); + style.imageWidth = this.calcScaleSizePx(24); + style.imageHeight = this.calcScaleSizePx(24); + style.imageHoverWidth = this.calcScaleSizePx(32); + style.imageHoverHeight = this.calcScaleSizePx(32); + style.imageHoverRadius = this.calcScaleSizePx(8); style.imageHoverColor = 'rgba(0, 0, 0, 0.05)'; style.imageTransparentColor = 'rgba(255, 255, 255, 0)'; - style.upTitleSpace = StyleManager.calcScaleSizePx(24); + style.upTitleSpace = this.calcScaleSizePx(24); style.titleImageColor = '#ff182431'; } // ControlCenter-ComplexToggleLayout - private static setControlCenterComplexToggleLayoutStyle(): void { + private setControlCenterComplexToggleLayoutStyle(): void { let style = ControlCenterStyleConfiguration.getControlCenterComplexToggleLayoutStyle(); - style.columnGap = StyleManager.calcScaleSizePx(12); - style.rowGap = StyleManager.calcScaleSize(12); - style.rowHeight = StyleManager.calcScaleSize(66); + style.columnGap = this.calcScaleSizePx(12); + style.rowGap = this.calcScaleSize(12); + style.rowHeight = this.calcScaleSize(66); } // ControlCenter-SimpleToggleLayout - private static setControlCenterSimpleToggleLayoutStyle(): void{ + private setControlCenterSimpleToggleLayoutStyle(): void{ let style = ControlCenterStyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(11); - style.marginRight = StyleManager.calcScaleSizePx(11); - style.columnGap = StyleManager.calcScaleSizePx(0); - style.rowGap = StyleManager.calcScaleSize(0); - style.rowHeight = StyleManager.calcScaleSize(81); + style.marginLeft = this.calcScaleSizePx(11); + style.marginRight = this.calcScaleSizePx(11); + style.columnGap = this.calcScaleSizePx(0); + style.rowGap = this.calcScaleSize(0); + style.rowHeight = this.calcScaleSize(81); } // CommonTemplate-iconTitleBase - private static setIconTitleBaseStyle(): void{ + private setIconTitleBaseStyle(): void{ let style = CommonTemplateStyleConfiguration.getIconTitleBaseStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(8); - style.marginRight = StyleManager.calcScaleSizePx(4); - style.componentGap = StyleManager.calcScaleSizePx(8); - style.titleSize = StyleManager.calcScaleSizePx(12); + style.marginLeft = this.calcScaleSizePx(8); + style.marginRight = this.calcScaleSizePx(4); + style.componentGap = this.calcScaleSizePx(8); + style.titleSize = this.calcScaleSizePx(12); style.titleColor = $r('sys.color.ohos_id_color_text_secondary'), - style.borderRadius = StyleManager.calcScaleSizePx(24); + style.borderRadius = this.calcScaleSizePx(24); style.backgroundColor = '#99FFFFFF'; - style.textMargin = StyleManager.calcScaleSizePx(8); - style.textHoverHeight = StyleManager.calcScaleSizePx(26); - style.textHoverWidth = StyleManager.calcScaleSizePx(68); - style.textHoverRadius = StyleManager.calcScaleSizePx(4); + style.textMargin = this.calcScaleSizePx(8); + style.textHoverHeight = this.calcScaleSizePx(26); + style.textHoverWidth = this.calcScaleSizePx(68); + style.textHoverRadius = this.calcScaleSizePx(4); style.hoverColor = 'rgba(0, 0, 0, 0.05)'; style.transparentColor = 'rgba(255, 255, 255, 0)'; } // CommonTemplate-iconComponent - private static setIconComponentStyle(): void { + private setIconComponentStyle(): void { let style = CommonTemplateStyleConfiguration.getIconComponentStyle(); - style.circleWidth = StyleManager.calcScaleSizePx(48); - style.circleHeight = StyleManager.calcScaleSizePx(48); - style.iconWidth = StyleManager.calcScaleSizePx(24); - style.iconHeight = StyleManager.calcScaleSizePx(24); + style.circleWidth = this.calcScaleSizePx(48); + style.circleHeight = this.calcScaleSizePx(48); + style.iconWidth = this.calcScaleSizePx(24); + style.iconHeight = this.calcScaleSizePx(24); style.iconOffBG = '#1A000000'; style.iconOnBG = '#FF007DFF'; style.iconOnColor = '#FFFFFFFF'; @@ -150,136 +153,128 @@ export default class StyleManager { style.transparentColor = 'rgba(255, 255, 255, 0)'; } // CommonTemplate-simpleToggleBase - private static setSimpleToggleBaseStyle(): void { + private setSimpleToggleBaseStyle(): void { let style = CommonTemplateStyleConfiguration.getSimpleToggleBaseStyle(); - style.circleWidth = StyleManager.calcScaleSizePx(48); - style.circleHeight = StyleManager.calcScaleSizePx(48); - style.iconWidth = StyleManager.calcScaleSizePx(24); - style.iconHeight = StyleManager.calcScaleSizePx(24); - style.dragCircleWidth = StyleManager.calcScaleSizePx(60); - style.dragCircleHeight = StyleManager.calcScaleSizePx(60); - style.dragIconWidth = StyleManager.calcScaleSizePx(36); - style.dragIconHeight = StyleManager.calcScaleSizePx(36); + style.circleWidth = this.calcScaleSizePx(48); + style.circleHeight = this.calcScaleSizePx(48); + style.iconWidth = this.calcScaleSizePx(24); + style.iconHeight = this.calcScaleSizePx(24); + style.dragCircleWidth = this.calcScaleSizePx(60); + style.dragCircleHeight = this.calcScaleSizePx(60); + style.dragIconWidth = this.calcScaleSizePx(36); + style.dragIconHeight = this.calcScaleSizePx(36); style.iconOffBG = '#1A000000'; style.iconOnBG = '#FF007DFF'; style.iconOnColor = '#FFFFFFFF'; style.iconOffColor = $r('sys.color.ohos_id_color_secondary'); - style.componentGap = StyleManager.calcScaleSizePx(4); - style.titleSize = StyleManager.calcScaleSizePx(12); + style.componentGap = this.calcScaleSizePx(4); + style.titleSize = this.calcScaleSizePx(12); style.titleColor = $r('sys.color.ohos_id_color_text_secondary'); - style.textHoverWidth = StyleManager.calcScaleSizePx(68); - style.textHoverHeight = StyleManager.calcScaleSizePx(18); - style.textHoverRadius = StyleManager.calcScaleSizePx(4); + style.textHoverWidth = this.calcScaleSizePx(68); + style.textHoverHeight = this.calcScaleSizePx(18); + style.textHoverRadius = this.calcScaleSizePx(4); style.hoverColor = 'rgba(0, 0, 0, 0.05)'; style.transparentColor = 'rgba(255, 255, 255, 0)'; } // Brightness - private static setBrightnessComponentStyle(): void{ + private setBrightnessComponentStyle(): void { let style = BrightnessStyleConfiguration.getBrightnessComponentStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(12.5); - style.marginRight = StyleManager.calcScaleSizePx(12.5); - style.componentGap = StyleManager.calcScaleSizePx(8.5); + style.marginLeft = this.calcScaleSizePx(12.5); + style.marginRight = this.calcScaleSizePx(12.5); + style.componentGap = this.calcScaleSizePx(8.5); style.brightnessIconColor = $r('sys.color.ohos_id_color_secondary'); - style.brightnessReduceWidth = StyleManager.calcScaleSizePx(22); - style.brightnessReduceHeight = StyleManager.calcScaleSizePx(22); - style.brightnessPlusWidth = StyleManager.calcScaleSizePx(22); - style.brightnessPlusHeight = StyleManager.calcScaleSizePx(22); - style.brightnessHeight = StyleManager.calcScaleSizePx(40); - style.sliderHeight = px2vp(StyleManager.calcScaleSize(20)).toString() + 'vp'; + style.brightnessReduceWidth = this.calcScaleSizePx(22); + style.brightnessReduceHeight = this.calcScaleSizePx(22); + style.brightnessPlusWidth = this.calcScaleSizePx(22); + style.brightnessPlusHeight = this.calcScaleSizePx(22); + style.brightnessHeight = this.calcScaleSizePx(40); + style.sliderHeight = px2vp(this.calcScaleSize(20)).toString() + 'vp'; style.sliderBlockColor = '#FFFFFFFF'; style.sliderTrackColor = '#0D000000'; style.sliderSelectedColor = '#FF007DFF'; } // RingMode - private static setControlCenterRingModeComponentStyle(): void{ + private setControlCenterRingModeComponentStyle(): void { let style = RingModeStyleConfiguration.getControlCenterRingModeComponentStyle(); style.onBgColor = '#FFFF9800'; } // SimpleToggleLayoutEdit - private static setSimpleToggleLayoutEditComponentStyle(): void{ + private setSimpleToggleLayoutEditComponentStyle(): void { let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(0); - style.marginRight = StyleManager.calcScaleSizePx(0); - style.marginTop = StyleManager.calcScaleSizePx(0); - style.titleHeight = StyleManager.calcScaleSizePx(56); - style.titleMarginBottom = StyleManager.calcScaleSizePx(0); - style.upGridMarginTop = StyleManager.calcScaleSizePx(4); - style.upGridMarginBottom = StyleManager.calcScaleSizePx(20); - style.gridMarginLeft = StyleManager.calcScaleSizePx(21); - style.gridMarginRight = StyleManager.calcScaleSizePx(21); - style.msgMarginTop = StyleManager.calcScaleSizePx(0); - style.msgMarginBottom = StyleManager.calcScaleSizePx(4); - style.btnMarginTop = StyleManager.calcScaleSizePx(4); - style.btnMarginBottom = StyleManager.calcScaleSizePx(16); - style.borderRadius = StyleManager.calcScaleSizePx(24); + style.marginLeft = this.calcScaleSizePx(0); + style.marginRight = this.calcScaleSizePx(0); + style.marginTop = this.calcScaleSizePx(0); + style.titleHeight = this.calcScaleSizePx(56); + style.titleMarginBottom = this.calcScaleSizePx(0); + style.upGridMarginTop = this.calcScaleSizePx(4); + style.upGridMarginBottom = this.calcScaleSizePx(20); + style.gridMarginLeft = this.calcScaleSizePx(21); + style.gridMarginRight = this.calcScaleSizePx(21); + style.msgMarginTop = this.calcScaleSizePx(0); + style.msgMarginBottom = this.calcScaleSizePx(4); + style.btnMarginTop = this.calcScaleSizePx(4); + style.btnMarginBottom = this.calcScaleSizePx(16); + style.borderRadius = this.calcScaleSizePx(24); style.upAreaBgColor = '#00FFFFFF'; style.downAreaBgColor = '#4DFFFFFF'; style.editBtnFontColor = '#FF007DFF'; style.editBtnFontSize = $r('sys.float.ohos_id_text_size_button1'); style.editBtnBgColor = '#0D000000'; - style.editBtnMarginLeft = StyleManager.calcScaleSizePx(16); - style.editBtnMarginRight = StyleManager.calcScaleSizePx(16); - style.editBtnHeight = StyleManager.calcScaleSizePx(40); - style.editBtnSpace = StyleManager.calcScaleSizePx(16); + style.editBtnMarginLeft = this.calcScaleSizePx(16); + style.editBtnMarginRight = this.calcScaleSizePx(16); + style.editBtnHeight = this.calcScaleSizePx(40); + style.editBtnSpace = this.calcScaleSizePx(16); } // SimpleToggleLayoutEdit - private static setSimpleToggleLayoutEditUpTitleStyle(): void{ + private setSimpleToggleLayoutEditUpTitleStyle(): void { let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(24); - style.imageWidth = StyleManager.calcScaleSizePx(20); - style.imageHeight = StyleManager.calcScaleSizePx(20); + style.marginLeft = this.calcScaleSizePx(24); + style.imageWidth = this.calcScaleSizePx(20); + style.imageHeight = this.calcScaleSizePx(20); style.fontColor = '#FF000000'; - style.editTitleSpace = StyleManager.calcScaleSizePx(18); - style.titleFontSize = StyleManager.calcScaleSizePx(20); + style.editTitleSpace = this.calcScaleSizePx(18); + style.titleFontSize = this.calcScaleSizePx(20); } // SimpleToggleLayoutEdit - private static setSimpleToggleLayoutEditOptMsgStyle(): void{ + private setSimpleToggleLayoutEditOptMsgStyle(): void { let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); - style.fontSize = StyleManager.calcScaleSizePx(12); + style.fontSize = this.calcScaleSizePx(12); style.fontColor = $r('sys.color.ohos_id_color_text_secondary'); - style.height = StyleManager.calcScaleSizePx(41); - style.marginLeftRight = StyleManager.calcScaleSizePx(30); + style.height = this.calcScaleSizePx(41); + style.marginLeftRight = this.calcScaleSizePx(30); } // SimpleToggleLayoutEdit-grid - private static setSimpleToggleLayoutEditGridStyle(): void{ + private setSimpleToggleLayoutEditGridStyle(): void { let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditGridStyle(); - style.columnGap = StyleManager.calcScaleSizePx(0); - style.rowGap = StyleManager.calcScaleSize(0); - style.rowHeight = StyleManager.calcScaleSize(80); - style.dragBgSize = StyleManager.calcScaleSizePx(60); + style.columnGap = this.calcScaleSizePx(0); + style.rowGap = this.calcScaleSize(0); + style.rowHeight = this.calcScaleSize(80); + style.dragBgSize = this.calcScaleSizePx(60); } // EditDialog - private static setControlEditDialogStyle(): void{ + private setControlEditDialogStyle(): void { let style = ControlCenterStyleConfiguration.getControlEditDialogStyle(); - style.editDialogHeight = StyleManager.calcScaleSizePx(121); - style.editDialogWidth = StyleManager.calcScaleSizePx(374); - style.editDialogFontSize = StyleManager.calcScaleSizePx(18); - style.editDialogBtnMarginLF = StyleManager.calcScaleSizePx(13); - style.editDialogFontHeight = StyleManager.calcScaleSizePx(20); - style.editDialogBtnMarginTop = StyleManager.calcScaleSizePx(20); - style.editDialogButtonSize = StyleManager.calcScaleSizePx(18); - style.editDialogDividerHeight = StyleManager.calcScaleSizePx(20); - style.editDialogButtonHeight = StyleManager.calcScaleSizePx(30); - style.editDialogRadius = StyleManager.calcScaleSizePx(20); - style.editDialogBtnWidth = StyleManager.calcScaleSizePx(173); - style.editDialogFontMarginTop = StyleManager.calcScaleSizePx(29); + style.editDialogHeight = this.calcScaleSizePx(121); + style.editDialogWidth = this.calcScaleSizePx(374); + style.editDialogFontSize = this.calcScaleSizePx(18); + style.editDialogBtnMarginLF = this.calcScaleSizePx(13); + style.editDialogFontHeight = this.calcScaleSizePx(20); + style.editDialogBtnMarginTop = this.calcScaleSizePx(20); + style.editDialogButtonSize = this.calcScaleSizePx(18); + style.editDialogDividerHeight = this.calcScaleSizePx(20); + style.editDialogButtonHeight = this.calcScaleSizePx(30); + style.editDialogRadius = this.calcScaleSizePx(20); + style.editDialogBtnWidth = this.calcScaleSizePx(173); + style.editDialogFontMarginTop = this.calcScaleSizePx(29); style.editDialogColor = '#FFFFFFFF'; style.editDialogBtnFontColor = '#FF0000FF'; style.editDialogBtnBgColor = '#00FFFFFF'; style.editDialogDividerColor = $r('sys.color.ohos_id_color_secondary'); - style.editDialogDividerWidth = StyleManager.calcScaleSizePx(1); + style.editDialogDividerWidth = this.calcScaleSizePx(1); Log.showDebug(TAG, 'getControlEditDialogStyle'); } +} - static number2px(n: number): string { - return n.toString() + 'px'; - } +let styleManager = new StyleManager(); - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } - - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } -} \ No newline at end of file +export default styleManager; \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index 0c374bd1..9695c79b 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -12,10 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import image from "@ohos.multimedia.image" import Log from '../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/AbilityManager' import StyleConfiguration, { IndexStyle } from './common/StyleConfiguration' @@ -31,7 +28,6 @@ import MultimodalInputManager, { MultiKeyCode, } from "../../../../../../../common/src/main/ets/default/MultimodalInputManager"; - const TAG = 'ControlPanel-Index' const SHOW_EVENT = "showControlCenter"; const HIDE_EVENT = "hideControlCenter"; @@ -72,7 +68,6 @@ struct Index { Log.showInfo(TAG, `aboutToAppear, start`) setAppBgColor('#00000000') - CommonStyleManager.setAbilityPageName(TAG) this.style = StyleConfiguration.getIndexStyle() StyleManager.setStyle() diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts index 8bd91be7..9d06e77c 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/stylemanager'; +import StyleManager from './StyleManager'; const TAG = 'NotificationPanel-StyleConfiguration'; @@ -24,8 +24,6 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, () => { - return new IndexStyle(); - }); + return StyleManager.getStyle(key, new IndexStyle()); } } \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts b/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts index 7ccba6b4..a6f79ce5 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts @@ -12,41 +12,35 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +import BaseStyleManager from '../../../../../../../../common/src/main/ets/default/BaseStyleManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import IndexStyleConfiguration from './styleconfiguration'; const TAG = 'NotificationPanel-StyleManager'; -export default class StyleManager { - static readonly STANDARD_DISPLAY_WIDTH = 1280; - static readonly STANDARD_DISPLAY_HEIGHT = 800; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; +export class StyleManager extends BaseStyleManager { + static readonly ABILITY_PAGE_NAME_NOTIFICATIONPANEL = "NotificationPanel-Index"; + + constructor() { + super(StyleManager.ABILITY_PAGE_NAME_NOTIFICATIONPANEL); + } - static setStyle(): void { + setStyle(): void { Log.showDebug(TAG, 'setStyle'); + this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_NORMAL); let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'dis'); - StyleManager.maxWidth = dis.width; + this.setMaxWidth(dis.width); // Index { let style = IndexStyleConfiguration.getIndexStyle(); - style.borderRadius = StyleManager.calcScaleSizePx(24); + style.borderRadius = this.calcScaleSizePx(24); } - } +} - static number2px(n: number): string { - return n.toString() + 'px'; - } - - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } +let styleManager = new StyleManager(); - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } -} \ No newline at end of file +export default styleManager; \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/pages/index.ets b/product/pc/notificationpanel/src/main/ets/pages/index.ets index 692c4fa4..9f0cf80f 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/index.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/index.ets @@ -49,7 +49,6 @@ const HIDE_ANIM_CONFIG = { @Entry @Component struct Index { - @State mBlur: number = 0; @State mOpacity: number = 0.0; @State mWidthSize: number = 0.2 @State mHeightSize: number = 0.2 @@ -141,9 +140,7 @@ struct Index { this.mShowAnimReady = false; this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { Log.showInfo(TAG, `show anim finish.`); - this.mBlur = 20; } }, () => { - this.mBlur = 20 this.mOpacity = 1.0 this.mWidthSize = 1.0 this.mHeightSize = 1.0 @@ -154,12 +151,10 @@ struct Index { Log.showDebug(TAG, `hide anim start`); this._animateTo({ ...HIDE_ANIM_CONFIG, onFinish: () => { Log.showInfo(TAG, `anim finish, hide Notification window, view: ${JSON.stringify(this)}`); - this.mBlur = 0 WindowManager.hideWindow(WindowType.NOTIFICATION_PANEL); } }, () => { Log.showInfo(TAG, `do hide anim.`); - this.mBlur = 0 this.mOpacity = 0.0 this.mWidthSize = 0.2 this.mHeightSize = 0.2 diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts index 9d7a6ec5..84677220 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/stylemanager'; +import StyleManager from './StyleManager'; const TAG = 'StatusBar-StyleConfiguration'; @@ -23,8 +23,6 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, () => { - return new IndexStyle(); - }); + return StyleManager.getStyle(key, new IndexStyle()); } } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts index 4ca625ee..a7477033 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +import BaseStyleManager from '../../../../../../../../common/src/main/ets/default/BaseStyleManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import CommonStyleConfiguration from '../../../../../../../../common/src/main/ets/default/styleconfiguration'; @@ -28,165 +28,161 @@ import RingModeStyleConfiguration from '../../../../../../../../features/ringmod const TAG = './styleconfigurationer'; -export default class StyleManager { - static readonly STANDARD_DISPLAY_WIDTH = 1280; - static readonly STANDARD_DISPLAY_HEIGHT = 800; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; +export class StyleManager extends BaseStyleManager { + static readonly ABILITY_PAGE_NAME_STATUSBAR = "StatusBar-Index"; + + constructor() { + super(StyleManager.ABILITY_PAGE_NAME_STATUSBAR); + } - static setStyle(): void { + setStyle(): void { Log.showDebug(TAG, 'setStyle'); + this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_NORMAL); + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); - StyleManager.maxWidth = config.maxWidth; - - StyleManager.setCommonStyle(); - StyleManager.setVerticalStatusBarItemLoadComponentStyle(); - StyleManager.setStatusBarNotificationIconStyle(); - StyleManager.setIconItemComponentStyle(); - StyleManager.setPluginIconItemComponentStyle(); - StyleManager.setClockComponentStyle(); - StyleManager.setBatteryComponentStyle(); - StyleManager.setBatteryPicStyle(); - StyleManager.setSignalComponentStyle(); - StyleManager.setStatusBarBluetoothComponentStyle(); - StyleManager.setStartsBarLocationComponentStyle(); - StyleManager.setStatusRingModeComponentStyle(); - StyleManager.setStartsBarWifiComponentStyle(); - StyleManager.setCapsuleComponentStyle(); + this.setMaxWidth(config.maxWidth); + + this.setCommonStyle(); + this.setVerticalStatusBarItemLoadComponentStyle(); + this.setStatusBarNotificationIconStyle(); + this.setIconItemComponentStyle(); + this.setPluginIconItemComponentStyle(); + this.setClockComponentStyle(); + this.setBatteryComponentStyle(); + this.setBatteryPicStyle(); + this.setSignalComponentStyle(); + this.setStatusBarBluetoothComponentStyle(); + this.setStartsBarLocationComponentStyle(); + this.setStatusRingModeComponentStyle(); + this.setStartsBarWifiComponentStyle(); + this.setCapsuleComponentStyle(); } // Common - private static setCommonStyle(): void { + private setCommonStyle(): void { let style = CommonStyleConfiguration.getCommonStyle(); - style.statusBarFontSize = StyleManager.calcScaleSizePx(14); - style.statusBarIconWidth = StyleManager.calcScaleSizePx(20); - style.statusBarIconHeight = StyleManager.calcScaleSizePx(20); - style.statusBarMarginLeftRight = StyleManager.calcScaleSizePx(10); + style.statusBarFontSize = this.calcScaleSizePx(14); + style.statusBarIconWidth = this.calcScaleSizePx(20); + style.statusBarIconHeight = this.calcScaleSizePx(20); + style.statusBarMarginLeftRight = this.calcScaleSizePx(10); } // StatusBar-VerticalStatusBarItemLoadComponent - private static setVerticalStatusBarItemLoadComponentStyle(): void { + private setVerticalStatusBarItemLoadComponentStyle(): void { let style = StatusBarStyleConfiguration.getVerticalStatusBarItemLoadComponentStyle(); - style.statusBarVerticalComponentHeight = StyleManager.calcScaleSize(64); + style.statusBarVerticalComponentHeight = this.calcScaleSize(64); } // StatusBar-NotificationIcon - private static setStatusBarNotificationIconStyle(): void { + private setStatusBarNotificationIconStyle(): void { let style = StatusBarStyleConfiguration.getStatusBarNotificationIconStyle(); - style.iconWidth = StyleManager.calcScaleSizePx(16); - style.iconHeight = StyleManager.calcScaleSizePx(16); - style.iconSpace = StyleManager.calcScaleSizePx(6); + style.iconWidth = this.calcScaleSizePx(16); + style.iconHeight = this.calcScaleSizePx(16); + style.iconSpace = this.calcScaleSizePx(6); } // StatusBar-IconComponent - private static setIconItemComponentStyle(): void { + private setIconItemComponentStyle(): void { let style = StatusBarStyleConfiguration.getIconItemComponentStyle(); - style.stackHeight = StyleManager.calcScaleSizePx(8 * 2 + 18); - style.stackPadding = StyleManager.calcScaleSizePx(8); - style.stackBorderRadius = StyleManager.calcScaleSizePx(8); + style.stackHeight = this.calcScaleSizePx(8 * 2 + 18); + style.stackPadding = this.calcScaleSizePx(8); + style.stackBorderRadius = this.calcScaleSizePx(8); style.stackBgColorSelected = '#33000000'; style.stackBgColorUnSelected = '#00000000'; - style.componentSpace = StyleManager.calcScaleSizePx(8); - style.iconWidth = StyleManager.calcScaleSizePx(18); - style.iconHeight = StyleManager.calcScaleSizePx(18); - style.marginLeft = StyleManager.calcScaleSizePx(4); - style.marginRight = StyleManager.calcScaleSizePx(4); + style.componentSpace = this.calcScaleSizePx(8); + style.iconWidth = this.calcScaleSizePx(18); + style.iconHeight = this.calcScaleSizePx(18); + style.marginLeft = this.calcScaleSizePx(4); + style.marginRight = this.calcScaleSizePx(4); } // StatusBar-PluginIconItemComponent - private static setPluginIconItemComponentStyle(): void { + private setPluginIconItemComponentStyle(): void { let style = StatusBarStyleConfiguration.getPluginIconItemComponentStyle(); - style.iconWidth = StyleManager.calcScaleSize(32); + style.iconWidth = this.calcScaleSize(32); } // Clock - private static setClockComponentStyle(): void { + private setClockComponentStyle(): void { let style = ClockStyleConfiguration.getClockComponentStyle(); - style.statusBarClockMaxWidth = StyleManager.calcScaleSizePx(37); + style.statusBarClockMaxWidth = this.calcScaleSizePx(37); } // Battery-Icon - private static setBatteryComponentStyle(): void { + private setBatteryComponentStyle(): void { let style = BatteryStyleConfiguration.getBatteryComponentStyle(); - style.componentGap = StyleManager.calcScaleSizePx(6); + style.componentGap = this.calcScaleSizePx(6); } // Battery-Pic - private static setBatteryPicStyle(): void { + private setBatteryPicStyle(): void { let style = BatteryStyleConfiguration.getBatteryPicStyle(); - style.picGap = StyleManager.calcScaleSizePx(1); - style.picBodyWidth = StyleManager.calcScaleSizePx(18.75); - style.picBodyHeight = StyleManager.calcScaleSizePx(10.83); - style.picBodyPadding = StyleManager.calcScaleSizePx(1); - style.picBodyBorderWidth = StyleManager.calcScaleSizePx(1); - style.picBorderRadius = StyleManager.calcScaleSizePx(2); - style.picHeadBorderRadius = StyleManager.calcScaleSizePx(1); + style.picGap = this.calcScaleSizePx(1); + style.picBodyWidth = this.calcScaleSizePx(18.75); + style.picBodyHeight = this.calcScaleSizePx(10.83); + style.picBodyPadding = this.calcScaleSizePx(1); + style.picBodyBorderWidth = this.calcScaleSizePx(1); + style.picBorderRadius = this.calcScaleSizePx(2); + style.picHeadBorderRadius = this.calcScaleSizePx(1); style.picChargingColor = '#00ff21'; style.picLevelLowColor = '#ff0000'; - style.picHeadWidth = StyleManager.calcScaleSizePx(1.5); - style.picHeadHeight = StyleManager.calcScaleSizePx(5); + style.picHeadWidth = this.calcScaleSizePx(1.5); + style.picHeadHeight = this.calcScaleSizePx(5); } // Signal-Icon - private static setSignalComponentStyle(): void { + private setSignalComponentStyle(): void { let style = SignalStyleConfiguration.getSignalComponentStyle(); - style.cellularImageWidth = StyleManager.calcScaleSizePx(25); - style.cellularImageHeight = StyleManager.calcScaleSizePx(20); - style.statusBarSignalTypeFontSize = StyleManager.calcScaleSizePx(7); - style.statusBarSignalUnknownFontSize = StyleManager.calcScaleSizePx(12); - style.signalTextMaxWeight = StyleManager.calcScaleSizePx(100); - style.netSignalTextMaxWidth = StyleManager.calcScaleSizePx(18); + style.cellularImageWidth = this.calcScaleSizePx(25); + style.cellularImageHeight = this.calcScaleSizePx(20); + style.statusBarSignalTypeFontSize = this.calcScaleSizePx(7); + style.statusBarSignalUnknownFontSize = this.calcScaleSizePx(12); + style.signalTextMaxWeight = this.calcScaleSizePx(100); + style.netSignalTextMaxWidth = this.calcScaleSizePx(18); } // Bluetooth -Icon - private static setStatusBarBluetoothComponentStyle(): void { + private setStatusBarBluetoothComponentStyle(): void { let style = BluetoothStyleConfiguration.getStatusBarBluetoothComponentStyle(); - style.staticBarBluetoothWidth = StyleManager.calcScaleSizePx(18); - style.staticBarBluetoothHeight = StyleManager.calcScaleSizePx(20); + style.staticBarBluetoothWidth = this.calcScaleSizePx(18); + style.staticBarBluetoothHeight = this.calcScaleSizePx(20); } // Location-Icon - private static setStartsBarLocationComponentStyle(): void { + private setStartsBarLocationComponentStyle(): void { let style = LocationStyleConfiguration.getStartsBarLocationComponentStyle(); - style.statusBarLocationWidth = StyleManager.calcScaleSizePx(18); - style.statusBarLocationHeight = StyleManager.calcScaleSizePx(20); + style.statusBarLocationWidth = this.calcScaleSizePx(18); + style.statusBarLocationHeight = this.calcScaleSizePx(20); } // RingMode-Icon - private static setStatusRingModeComponentStyle(): void { + private setStatusRingModeComponentStyle(): void { let style = RingModeStyleConfiguration.getStatusRingModeComponentStyle(); - style.statusBarRingModeWidth = StyleManager.calcScaleSizePx(20); - style.statusBarRingModeHeight = StyleManager.calcScaleSizePx(20); + style.statusBarRingModeWidth = this.calcScaleSizePx(20); + style.statusBarRingModeHeight = this.calcScaleSizePx(20); } // Wifi-Icon - private static setStartsBarWifiComponentStyle(): void { + private setStartsBarWifiComponentStyle(): void { let style = WifiStyleConfiguration.getStartsBarWifiComponentStyle(); - style.statusBarWifiWidth = StyleManager.calcScaleSizePx(20); - style.statusBarWifiHeight = StyleManager.calcScaleSizePx(20); + style.statusBarWifiWidth = this.calcScaleSizePx(20); + style.statusBarWifiHeight = this.calcScaleSizePx(20); } // Capsule-Icon - private static setCapsuleComponentStyle(): void { + private setCapsuleComponentStyle(): void { let style = CapsuleStyleConfiguration.getCapsuleComponentStyle(); - style.greenCapsulePhoneWidth = StyleManager.calcScaleSizePx(15); - style.greenCapsulePhoneHeight = StyleManager.calcScaleSizePx(15); - style.greenCapsuleHeight = StyleManager.calcScaleSizePx(30); + style.greenCapsulePhoneWidth = this.calcScaleSizePx(15); + style.greenCapsulePhoneHeight = this.calcScaleSizePx(15); + style.greenCapsuleHeight = this.calcScaleSizePx(30); style.greenCapsuleTextColor = '#CCFFFFFF'; - style.greenCapsuleTextMarginLeftRight = StyleManager.calcScaleSizePx(10); - style.greenCapsuleRadius = StyleManager.calcScaleSizePx(24); + style.greenCapsuleTextMarginLeftRight = this.calcScaleSizePx(10); + style.greenCapsuleRadius = this.calcScaleSizePx(24); style.greenCapsuleBackgroundColor = '#64BB5C'; style.maxLines = 1; } +} - static number2px(n: number): string { - return n.toString() + 'px'; - } - - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } +let styleManager = new StyleManager(); - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } -} \ No newline at end of file +export default styleManager; \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/pages/index.ets b/product/pc/statusbar/src/main/ets/pages/index.ets index 32ffc655..347159b0 100644 --- a/product/pc/statusbar/src/main/ets/pages/index.ets +++ b/product/pc/statusbar/src/main/ets/pages/index.ets @@ -14,7 +14,6 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log' -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' import StatusBarComponent from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' import StyleManager from './common/StyleManager' @@ -52,9 +51,8 @@ struct Index { statusBarData.top = configInfo.yCoordinate; StatusBarVM.updateStatusBarData(statusBarData); - setAppBgColor('#00000000') - CommonStyleManager.setAbilityPageName(TAG) - StyleManager.setStyle() + setAppBgColor('#00000000'); + StyleManager.setStyle(); mHeightConfigUtils = new HeightConfigUtils(); let StatusMinH; diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts index a5f57a5d..83420454 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/stylemanager'; +import StyleManager from './StyleManager'; import Constants from './constants'; const TAG = 'DropdownPanel-StyleConfiguration'; @@ -53,29 +53,21 @@ export class DateItemStyle { export default class StyleConfiguration { static getControlStyle(): ControlStyle { const key: string = TAG + '-Control'; - return StyleManager.getStyle(key, () => { - return new ControlStyle(); - }); + return StyleManager.getStyle(key, new ControlStyle()); } static getNotificationStyle(): NotificationStyle { const key: string = TAG + '-Notification'; - return StyleManager.getStyle(key, () => { - return new NotificationStyle(); - }); + return StyleManager.getStyle(key, new NotificationStyle()); } static getQuicklySettingStyle(): QuicklySettingStyle { const key: string = TAG + '-QuicklySetting'; - return StyleManager.getStyle(key, () => { - return new QuicklySettingStyle(); - }); + return StyleManager.getStyle(key, new QuicklySettingStyle()); } static getDateItemStyle(): DateItemStyle { const key: string = TAG + '-DateItem'; - return StyleManager.getStyle(key, () => { - return new DateItemStyle(); - }); + return StyleManager.getStyle(key, new DateItemStyle()); } } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts index b81cc44a..e1c1889b 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +import BaseStyleManager from '../../../../../../../../common/src/main/ets/default/BaseStyleManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/styleconfiguration'; @@ -22,118 +22,122 @@ import RingModeStyleConfiguration from '../../../../../../../../features/ringmod const TAG = 'DropdownPanel-StyleManager'; -export default class StyleManager { - static readonly STANDARD_DISPLAY_WIDTH: number = 720; - static readonly STANDARD_DISPLAY_HEIGHT: number = 1280; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; +export class StyleManager extends BaseStyleManager { + static readonly ABILITY_PAGE_NAME_DROPDOWNPANEL = "DropdownPanel-Index"; + + constructor() { + super(StyleManager.ABILITY_PAGE_NAME_DROPDOWNPANEL); + } - static setStyle(): void { + setStyle(): void { Log.showDebug(TAG, 'setStyle'); + this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_SMALL); + let rect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect'); - StyleManager.maxWidth = rect.width; + this.setMaxWidth(rect.width); // ControlCenter - StyleManager.setControlCenterComponentStyle(); + this.setControlCenterComponentStyle(); // ControlCenter-Title - StyleManager.setControlCenterUpTitleStyle(); + this.setControlCenterUpTitleStyle(); // ControlCenter-ComplexToggleLayout - StyleManager.setControlCenterComplexToggleLayoutStyle(); + this.setControlCenterComplexToggleLayoutStyle(); // ControlCenter-SimpleToggleLayout - StyleManager.setControlCenterSimpleToggleLayoutStyle(); + this.setControlCenterSimpleToggleLayoutStyle(); // CommonTemplate-iconTitleBase - StyleManager.setIconTitleBaseStyle(); + this.setIconTitleBaseStyle(); // CommonTemplate-iconComponent - StyleManager.setIconComponentStyle(); + this.setIconComponentStyle(); // CommonTemplate-simpleToggleBase - StyleManager.setSimpleToggleBaseStyle(); + this.setSimpleToggleBaseStyle(); // Brightness - StyleManager.setBrightnessComponentStyle(); + this.setBrightnessComponentStyle(); // RingMode - StyleManager.setControlCenterRingModeComponentStyle(); + this.setControlCenterRingModeComponentStyle(); // SimpleToggleLayoutEdit - StyleManager.setSimpleToggleLayoutEditComponentStyle(); + this.setSimpleToggleLayoutEditComponentStyle(); // SimpleToggleLayoutEdit-title - StyleManager.setSimpleToggleLayoutEditUpTitleStyle(); + this.setSimpleToggleLayoutEditUpTitleStyle(); // SimpleToggleLayoutEdit-msg - StyleManager.setSimpleToggleLayoutEditOptMsgStyle(); + this.setSimpleToggleLayoutEditOptMsgStyle(); // SimpleToggleLayoutEdit-grid - StyleManager.setSimpleToggleLayoutEditGridStyle(); + this.setSimpleToggleLayoutEditGridStyle(); // EditDialog - StyleManager.setControlEditDialogStyle(); + this.setControlEditDialogStyle(); } // ControlCenter - private static setControlCenterComponentStyle(): void{ + private setControlCenterComponentStyle(): void{ let style = ControlCenterStyleConfiguration.getControlCenterComponentStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(48); - style.marginRight = StyleManager.calcScaleSizePx(48); - style.marginTop = StyleManager.calcScaleSizePx(36); - style.upTitleHeight = StyleManager.calcScaleSizePx(127); - style.titleMarginBottom = StyleManager.calcScaleSizePx(0); - style.toggleAreaGap = StyleManager.calcScaleSizePx(24); - style.simpleToggleLayoutMarginTop = StyleManager.calcScaleSizePx(48); - style.simpleToggleLayoutMarginBottom = StyleManager.calcScaleSizePx(20); - style.brightnessMarginBottom = StyleManager.calcScaleSizePx(44); - style.componentBorderRadius = StyleManager.calcScaleSizePx(48); + style.marginLeft = this.calcScaleSizePx(48); + style.marginRight = this.calcScaleSizePx(48); + style.marginTop = this.calcScaleSizePx(36); + style.upTitleHeight = this.calcScaleSizePx(127); + style.titleMarginBottom = this.calcScaleSizePx(0); + style.toggleAreaGap = this.calcScaleSizePx(24); + style.simpleToggleLayoutMarginTop = this.calcScaleSizePx(48); + style.simpleToggleLayoutMarginBottom = this.calcScaleSizePx(20); + style.brightnessMarginBottom = this.calcScaleSizePx(44); + style.componentBorderRadius = this.calcScaleSizePx(48); style.componentBackgroundColor = '#99FFFFFF'; } // ControlCenter-Title - private static setControlCenterUpTitleStyle(): void{ + private setControlCenterUpTitleStyle(): void{ let style = ControlCenterStyleConfiguration.getControlCenterUpTitleStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(72); - style.marginRight = StyleManager.calcScaleSizePx(72); - style.fontSize = StyleManager.calcScaleSizePx(40); + style.marginLeft = this.calcScaleSizePx(72); + style.marginRight = this.calcScaleSizePx(72); + style.fontSize = this.calcScaleSizePx(40); style.fontColor = '#FFFFFFFF'; - style.imageWidth = StyleManager.calcScaleSizePx(48); - style.imageHeight = StyleManager.calcScaleSizePx(48); - style.imageHoverWidth = StyleManager.calcScaleSizePx(64); - style.imageHoverHeight = StyleManager.calcScaleSizePx(64); - style.imageHoverRadius = StyleManager.calcScaleSizePx(16); + style.imageWidth = this.calcScaleSizePx(48); + style.imageHeight = this.calcScaleSizePx(48); + style.imageHoverWidth = this.calcScaleSizePx(64); + style.imageHoverHeight = this.calcScaleSizePx(64); + style.imageHoverRadius = this.calcScaleSizePx(16); style.imageHoverColor = 'rgba(0, 0, 0, 0.05)'; style.imageTransparentColor = 'rgba(255, 255, 255, 0)'; - style.upTitleSpace = StyleManager.calcScaleSizePx(36); + style.upTitleSpace = this.calcScaleSizePx(36); style.titleImageColor = '#FFFFFFFF'; } // ControlCenter-ComplexToggleLayout - private static setControlCenterComplexToggleLayoutStyle(): void{ + private setControlCenterComplexToggleLayoutStyle(): void{ let style = ControlCenterStyleConfiguration.getControlCenterComplexToggleLayoutStyle(); - style.columnGap = StyleManager.calcScaleSizePx(24); - style.rowGap = StyleManager.calcScaleSize(24); - style.rowHeight = StyleManager.calcScaleSize(132); + style.columnGap = this.calcScaleSizePx(24); + style.rowGap = this.calcScaleSize(24); + style.rowHeight = this.calcScaleSize(132); } // ControlCenter-SimpleToggleLayout - private static setControlCenterSimpleToggleLayoutStyle(): void{ + private setControlCenterSimpleToggleLayoutStyle(): void{ let style = ControlCenterStyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(22); - style.marginRight = StyleManager.calcScaleSizePx(22); - style.columnGap = StyleManager.calcScaleSizePx(0); - style.rowGap = StyleManager.calcScaleSize(0); - style.rowHeight = StyleManager.calcScaleSize(162); + style.marginLeft = this.calcScaleSizePx(22); + style.marginRight = this.calcScaleSizePx(22); + style.columnGap = this.calcScaleSizePx(0); + style.rowGap = this.calcScaleSize(0); + style.rowHeight = this.calcScaleSize(162); } // CommonTemplate-iconTitleBase - private static setIconTitleBaseStyle(): void { + private setIconTitleBaseStyle(): void { let style = CommonTemplateStyleConfiguration.getIconTitleBaseStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(24); - style.marginRight = StyleManager.calcScaleSizePx(16); - style.componentGap = StyleManager.calcScaleSizePx(8); - style.titleSize = StyleManager.calcScaleSizePx(24); + style.marginLeft = this.calcScaleSizePx(24); + style.marginRight = this.calcScaleSizePx(16); + style.componentGap = this.calcScaleSizePx(8); + style.titleSize = this.calcScaleSizePx(24); style.titleColor = $r('sys.color.ohos_id_color_text_primary'); - style.borderRadius = StyleManager.calcScaleSizePx(48); + style.borderRadius = this.calcScaleSizePx(48); style.backgroundColor = '#99FFFFFF'; - style.textMargin = StyleManager.calcScaleSizePx(8); - style.textHoverHeight = StyleManager.calcScaleSizePx(52); - style.textHoverWidth = StyleManager.calcScaleSizePx(136); - style.textHoverRadius = StyleManager.calcScaleSizePx(8); + style.textMargin = this.calcScaleSizePx(8); + style.textHoverHeight = this.calcScaleSizePx(52); + style.textHoverWidth = this.calcScaleSizePx(136); + style.textHoverRadius = this.calcScaleSizePx(8); style.hoverColor = 'rgba(0, 0, 0, 0.05)'; style.transparentColor = 'rgba(255, 255, 255, 0)'; } // CommonTemplate-iconComponent - private static setIconComponentStyle(): void { + private setIconComponentStyle(): void { let style = CommonTemplateStyleConfiguration.getIconComponentStyle(); - style.circleWidth = StyleManager.calcScaleSizePx(96); - style.circleHeight = StyleManager.calcScaleSizePx(96); - style.iconWidth = StyleManager.calcScaleSizePx(48); - style.iconHeight = StyleManager.calcScaleSizePx(48); + style.circleWidth = this.calcScaleSizePx(96); + style.circleHeight = this.calcScaleSizePx(96); + style.iconWidth = this.calcScaleSizePx(48); + style.iconHeight = this.calcScaleSizePx(48); style.iconOffBG = '#1A182431'; style.iconOnBG = '#FF007DFF'; style.iconOnColor = '#FFFFFFFF'; @@ -142,136 +146,128 @@ export default class StyleManager { style.transparentColor = 'rgba(255, 255, 255, 0)'; } // CommonTemplate-simpleToggleBase - private static setSimpleToggleBaseStyle(): void{ + private setSimpleToggleBaseStyle(): void{ let style = CommonTemplateStyleConfiguration.getSimpleToggleBaseStyle(); - style.circleWidth = StyleManager.calcScaleSizePx(96); - style.circleHeight = StyleManager.calcScaleSizePx(96); - style.iconWidth = StyleManager.calcScaleSizePx(48); - style.iconHeight = StyleManager.calcScaleSizePx(48); - style.dragCircleWidth = StyleManager.calcScaleSizePx(120); - style.dragCircleHeight = StyleManager.calcScaleSizePx(120); - style.dragIconWidth = StyleManager.calcScaleSizePx(72); - style.dragIconHeight = StyleManager.calcScaleSizePx(72); + style.circleWidth = this.calcScaleSizePx(96); + style.circleHeight = this.calcScaleSizePx(96); + style.iconWidth = this.calcScaleSizePx(48); + style.iconHeight = this.calcScaleSizePx(48); + style.dragCircleWidth = this.calcScaleSizePx(120); + style.dragCircleHeight = this.calcScaleSizePx(120); + style.dragIconWidth = this.calcScaleSizePx(72); + style.dragIconHeight = this.calcScaleSizePx(72); style.iconOffBG = '#1A182431'; style.iconOnBG = '#FF007DFF'; style.iconOnColor = '#FFFFFFFF'; style.iconOffColor = $r('sys.color.ohos_id_color_secondary'); - style.componentGap = StyleManager.calcScaleSizePx(10); - style.titleSize = StyleManager.calcScaleSizePx(24); + style.componentGap = this.calcScaleSizePx(10); + style.titleSize = this.calcScaleSizePx(24); style.titleColor = $r('sys.color.ohos_id_color_text_primary'); - style.textHoverWidth = StyleManager.calcScaleSizePx(136); - style.textHoverHeight = StyleManager.calcScaleSizePx(36); - style.textHoverRadius = StyleManager.calcScaleSizePx(8); + style.textHoverWidth = this.calcScaleSizePx(136); + style.textHoverHeight = this.calcScaleSizePx(36); + style.textHoverRadius = this.calcScaleSizePx(8); style.hoverColor = 'rgba(0, 0, 0, 0.05)'; style.transparentColor = 'rgba(255, 255, 255, 0)'; } // Brightness - private static setBrightnessComponentStyle(): void{ + private setBrightnessComponentStyle(): void{ let style = BrightnessStyleConfiguration.getBrightnessComponentStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(26); - style.marginRight = StyleManager.calcScaleSizePx(26); - style.componentGap = StyleManager.calcScaleSizePx(26); + style.marginLeft = this.calcScaleSizePx(26); + style.marginRight = this.calcScaleSizePx(26); + style.componentGap = this.calcScaleSizePx(26); style.brightnessIconColor = $r('sys.color.ohos_id_color_secondary'); - style.brightnessReduceWidth = StyleManager.calcScaleSizePx(44); - style.brightnessReduceHeight = StyleManager.calcScaleSizePx(44); - style.brightnessPlusWidth = StyleManager.calcScaleSizePx(44); - style.brightnessPlusHeight = StyleManager.calcScaleSizePx(44); - style.brightnessHeight = StyleManager.calcScaleSizePx(44); - style.sliderHeight = StyleManager.calcScaleSizePx(40); + style.brightnessReduceWidth = this.calcScaleSizePx(44); + style.brightnessReduceHeight = this.calcScaleSizePx(44); + style.brightnessPlusWidth = this.calcScaleSizePx(44); + style.brightnessPlusHeight = this.calcScaleSizePx(44); + style.brightnessHeight = this.calcScaleSizePx(44); + style.sliderHeight = this.calcScaleSizePx(40); style.sliderBlockColor = '#FFFFFFFF'; style.sliderTrackColor = '#1A182431'; style.sliderSelectedColor = '#FF007DFF'; } // RingMode - private static setControlCenterRingModeComponentStyle(): void{ + private setControlCenterRingModeComponentStyle(): void{ let style = RingModeStyleConfiguration.getControlCenterRingModeComponentStyle(); style.onBgColor = '#FFFF9800'; } // SimpleToggleLayoutEdit - private static setSimpleToggleLayoutEditComponentStyle(): void{ + private setSimpleToggleLayoutEditComponentStyle(): void{ let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(48); - style.marginRight = StyleManager.calcScaleSizePx(48); - style.marginTop = StyleManager.calcScaleSizePx(33); - style.titleHeight = StyleManager.calcScaleSizePx(127); - style.titleMarginBottom = StyleManager.calcScaleSizePx(0); - style.upGridMarginTop = StyleManager.calcScaleSizePx(48); - style.upGridMarginBottom = StyleManager.calcScaleSizePx(24); - style.gridMarginLeft = StyleManager.calcScaleSizePx(18.24); - style.gridMarginRight = StyleManager.calcScaleSizePx(18.24); - style.msgMarginTop = StyleManager.calcScaleSizePx(0); - style.msgMarginBottom = StyleManager.calcScaleSizePx(0); - style.btnMarginTop = StyleManager.calcScaleSizePx(24); - style.btnMarginBottom = StyleManager.calcScaleSizePx(32); - style.borderRadius = StyleManager.calcScaleSizePx(48); + style.marginLeft = this.calcScaleSizePx(48); + style.marginRight = this.calcScaleSizePx(48); + style.marginTop = this.calcScaleSizePx(33); + style.titleHeight = this.calcScaleSizePx(127); + style.titleMarginBottom = this.calcScaleSizePx(0); + style.upGridMarginTop = this.calcScaleSizePx(48); + style.upGridMarginBottom = this.calcScaleSizePx(24); + style.gridMarginLeft = this.calcScaleSizePx(18.24); + style.gridMarginRight = this.calcScaleSizePx(18.24); + style.msgMarginTop = this.calcScaleSizePx(0); + style.msgMarginBottom = this.calcScaleSizePx(0); + style.btnMarginTop = this.calcScaleSizePx(24); + style.btnMarginBottom = this.calcScaleSizePx(32); + style.borderRadius = this.calcScaleSizePx(48); style.upAreaBgColor = '#99FFFFFF'; style.downAreaBgColor = '#4DFFFFFF'; style.editBtnFontColor = '#FF007DFF'; - style.editBtnFontSize = StyleManager.calcScaleSizePx(32); + style.editBtnFontSize = this.calcScaleSizePx(32); style.editBtnBgColor = '#0D000000'; - style.editBtnMarginLeft = StyleManager.calcScaleSizePx(32); - style.editBtnMarginRight = StyleManager.calcScaleSizePx(32); - style.editBtnHeight = StyleManager.calcScaleSizePx(80); - style.editBtnSpace = StyleManager.calcScaleSizePx(32); + style.editBtnMarginLeft = this.calcScaleSizePx(32); + style.editBtnMarginRight = this.calcScaleSizePx(32); + style.editBtnHeight = this.calcScaleSizePx(80); + style.editBtnSpace = this.calcScaleSizePx(32); } // SimpleToggleLayoutEdit-title - private static setSimpleToggleLayoutEditUpTitleStyle(): void{ + private setSimpleToggleLayoutEditUpTitleStyle(): void{ let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle(); - style.marginLeft = StyleManager.calcScaleSizePx(72); - style.imageWidth = StyleManager.calcScaleSizePx(40); - style.imageHeight = StyleManager.calcScaleSizePx(40); + style.marginLeft = this.calcScaleSizePx(72); + style.imageWidth = this.calcScaleSizePx(40); + style.imageHeight = this.calcScaleSizePx(40); style.fontColor = '#FFFFFFFF'; - style.editTitleSpace = StyleManager.calcScaleSizePx(36); - style.titleFontSize = StyleManager.calcScaleSizePx(40); + style.editTitleSpace = this.calcScaleSizePx(36); + style.titleFontSize = this.calcScaleSizePx(40); } // SimpleToggleLayoutEdit-msg - private static setSimpleToggleLayoutEditOptMsgStyle(): void{ + private setSimpleToggleLayoutEditOptMsgStyle(): void{ let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); - style.fontSize = StyleManager.calcScaleSizePx(24); + style.fontSize = this.calcScaleSizePx(24); style.fontColor = $r('sys.color.ohos_id_color_text_secondary'); - style.height = StyleManager.calcScaleSizePx(98); - style.marginLeftRight = StyleManager.calcScaleSizePx(44); + style.height = this.calcScaleSizePx(98); + style.marginLeftRight = this.calcScaleSizePx(44); } // SimpleToggleLayoutEdit-grid - private static setSimpleToggleLayoutEditGridStyle(): void{ + private setSimpleToggleLayoutEditGridStyle(): void{ let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditGridStyle(); - style.columnGap = StyleManager.calcScaleSizePx(0); - style.rowGap = StyleManager.calcScaleSize(0); - style.rowHeight = StyleManager.calcScaleSize(162); - style.dragBgSize = StyleManager.calcScaleSizePx(120); + style.columnGap = this.calcScaleSizePx(0); + style.rowGap = this.calcScaleSize(0); + style.rowHeight = this.calcScaleSize(162); + style.dragBgSize = this.calcScaleSizePx(120); } // EditDialog - private static setControlEditDialogStyle(): void { + private setControlEditDialogStyle(): void { let style = ControlCenterStyleConfiguration.getControlEditDialogStyle(); - style.editDialogHeight = StyleManager.calcScaleSizePx(217); - style.editDialogWidth = StyleManager.calcScaleSizePx(670); - style.editDialogFontSize = StyleManager.calcScaleSizePx(30); - style.editDialogBtnMarginLF = StyleManager.calcScaleSizePx(24); - style.editDialogFontHeight = StyleManager.calcScaleSizePx(36); - style.editDialogBtnMarginTop = StyleManager.calcScaleSizePx(36); - style.editDialogButtonSize = StyleManager.calcScaleSizePx(30); - style.editDialogDividerHeight = StyleManager.calcScaleSizePx(36); - style.editDialogButtonHeight = StyleManager.calcScaleSizePx(54); - style.editDialogRadius = StyleManager.calcScaleSizePx(36); - style.editDialogBtnWidth = StyleManager.calcScaleSizePx(311); - style.editDialogFontMarginTop = StyleManager.calcScaleSizePx(52); + style.editDialogHeight = this.calcScaleSizePx(217); + style.editDialogWidth = this.calcScaleSizePx(670); + style.editDialogFontSize = this.calcScaleSizePx(30); + style.editDialogBtnMarginLF = this.calcScaleSizePx(24); + style.editDialogFontHeight = this.calcScaleSizePx(36); + style.editDialogBtnMarginTop = this.calcScaleSizePx(36); + style.editDialogButtonSize = this.calcScaleSizePx(30); + style.editDialogDividerHeight = this.calcScaleSizePx(36); + style.editDialogButtonHeight = this.calcScaleSizePx(54); + style.editDialogRadius = this.calcScaleSizePx(36); + style.editDialogBtnWidth = this.calcScaleSizePx(311); + style.editDialogFontMarginTop = this.calcScaleSizePx(52); style.editDialogColor = '#FFFFFFFF'; style.editDialogBtnFontColor = '#FF0000FF'; style.editDialogBtnBgColor = '#00FFFFFF'; style.editDialogDividerColor = $r('sys.color.ohos_id_color_secondary'); - style.editDialogDividerWidth = StyleManager.calcScaleSizePx(1); + style.editDialogDividerWidth = this.calcScaleSizePx(1); Log.showDebug(TAG, 'getControlEditDialogStyle'); } +} - static number2px(n: number): string { - return n.toString() + 'px'; - } - - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } +let styleManager = new StyleManager(); - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } -} \ No newline at end of file +export default styleManager; \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index f9b3d804..c9dbe9f4 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -30,7 +30,6 @@ import WindowManager, { WindowType, WINDOW_SHOW_HIDE_EVENT } from '../../../../../../../common/src/main/ets/default/WindowManager' import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/EventManager" import { START_ABILITY_EVENT } from "../../../../../../../common/src/main/ets/default/event/EventUtil" -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' import MultimodalInputManager from '../../../../../../../common/src/main/ets/default/MultimodalInputManager' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' @@ -91,35 +90,34 @@ struct Index { } aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear, start`) + Log.showInfo(TAG, `aboutToAppear, start`); - setAppBgColor('#00000000') - CommonStyleManager.setAbilityPageName(TAG) - StyleManager.setStyle() + setAppBgColor('#00000000'); + StyleManager.setStyle(); - let dropdownRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect') - let navigationBarRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config') + let dropdownRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect'); + let navigationBarRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); this.urivar = settings.getUriSync(this.settingDataKey); this.helper = featureAbility.acquireDataAbilityHelper(AbilityManager.getContext(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL), CommonConstants.URI_VAR); this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); - Log.showDebug(TAG, `getValueSync componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`) + Log.showDebug(TAG, `getValueSync componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`); this.helper.on("dataChange", this.urivar, (data) => { if (data.code !== 0) { Log.showError(TAG, `dataChangesCallback failed, because ${data.message}`); return; } else { this.resizeDropdownPanelAndNavigationBar(dropdownRect, navigationBarRect); - Log.showInfo(TAG, `NavigationBar status change, componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`) + Log.showInfo(TAG, `NavigationBar status change, componentOptAreaHeightPX: ${this.componentOptAreaHeightPX}`); } - }) + }); - this.componentOptAreaTranslateY = (-this.componentOptAreaHeightPX * 0.1) + 'px' + this.componentOptAreaTranslateY = (-this.componentOptAreaHeightPX * 0.1) + 'px'; - this.mClearCallbacks = [] + this.mClearCallbacks = []; this.mClearCallbacks.push( EventManager.subscribe('DropdownEvent', (args) => this.onDropdownEvent(args)), EventManager.subscribe(START_ABILITY_EVENT, (args) => this.onStartAbility(args)), - EventManager.subscribe('hideNotificationWindowEvent', (args) => this.onHideNotificationWindowEvent(args))) + EventManager.subscribe('hideNotificationWindowEvent', (args) => this.onHideNotificationWindowEvent(args))); mHeightConfigUtils = new HeightConfigUtils(); let StatusCoefficient; @@ -134,11 +132,11 @@ struct Index { "onStateChange": (data) => this.onStateChange(data), "onNotificationShowOrHide": (data) => this.onNotificationShowOrHide(data), "onControlShowOrHide": (data) => this.onControlShowOrHide(data) - } + }; NavigationEvent.registerCallback(this.mCallback); MultimodalInputManager.registerControlListener(this.mCallback); MultimodalInputManager.registerNotificationListener(this.mCallback); - Log.showDebug(TAG, `aboutToAppear, end`) + Log.showDebug(TAG, `aboutToAppear, end`); } onPageShow() { diff --git a/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts index 9d7a6ec5..84677220 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/stylemanager'; +import StyleManager from './StyleManager'; const TAG = 'StatusBar-StyleConfiguration'; @@ -23,8 +23,6 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, () => { - return new IndexStyle(); - }); + return StyleManager.getStyle(key, new IndexStyle()); } } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts index 40167bd2..3ea08d35 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -12,39 +12,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +import BaseStyleManager from '../../../../../../../../common/src/main/ets/default/BaseStyleManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; -import IndexStyleConfiguration from './styleconfiguration'; const TAG = 'StatusBar-StyleManager'; -export default class StyleManager { - static readonly STANDARD_DISPLAY_WIDTH = 720; - static readonly STANDARD_DISPLAY_HEIGHT = 1280; - static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; +export class StyleManager extends BaseStyleManager { + static readonly ABILITY_PAGE_NAME_STATUSBAR = "StatusBar-Index"; + + constructor() { + super(StyleManager.ABILITY_PAGE_NAME_STATUSBAR); + } - static setStyle(): void { + setStyle(): void { Log.showDebug(TAG, 'setStyle'); + this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_SMALL); + let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); - StyleManager.maxWidth = config.maxWidth; + this.setMaxWidth(config.maxWidth); // xxx { } - } +} - static number2px(n: number): string { - return n.toString() + 'px'; - } - - static calcScaleSize(n: number): number { - return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; - } +let styleManager = new StyleManager(); - static calcScaleSizePx(n: number): string { - return StyleManager.number2px(StyleManager.calcScaleSize(n)); - } -} \ No newline at end of file +export default styleManager; \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index ecba1643..5d6ff36f 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -19,7 +19,6 @@ import WindowManager, {WindowType, WINDOW_SHOW_HIDE_EVENT } from '../../../../../../../common/src/main/ets/default/WindowManager' import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager" import {obtainLocalEvent} from "../../../../../../../common/src/main/ets/default/event/EventUtil" -import CommonStyleManager from '../../../../../../../common/src/main/ets/default/StyleManager' import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' import StatusBarComponent from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' import StatusBarVM from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' @@ -53,7 +52,7 @@ struct Index { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, start`); - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config') + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); let statusBarData: StatusBarData = new StatusBarData(); statusBarData.displayWidth = configInfo.maxWidth; statusBarData.displayHeight = configInfo.maxHeight; @@ -64,13 +63,12 @@ struct Index { statusBarData.left = configInfo.xCoordinate; statusBarData.top = configInfo.yCoordinate; StatusBarVM.updateStatusBarData(statusBarData); - this.mStatusBarData = StatusBarVM.getStatusBarData() + this.mStatusBarData = StatusBarVM.getStatusBarData(); - setAppBgColor('#00000000') - CommonStyleManager.setAbilityPageName(TAG) - StyleManager.setStyle() + setAppBgColor('#00000000'); + StyleManager.setStyle(); - this.mClearCallback = EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => this.onWindowShowHideEvent(args)) + this.mClearCallback = EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => this.onWindowShowHideEvent(args)); mHeightConfigUtils = new HeightConfigUtils(); let StatusMinH; -- Gitee From 32278b16e069931f34ffb2c090ba8346edd3fa56 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Mon, 25 Jul 2022 19:21:43 +0800 Subject: [PATCH 209/373] Using singleton in the getStyle method Signed-off-by: xuchangzhou --- .../src/main/ets/default/BaseStyleManager.ts | 4 ++-- .../src/main/ets/default/StyleConfiguration.ts | 2 +- .../ets/template/common/StyleConfiguration.ts | 6 +++--- .../ets/default/common/StyleConfiguration.ts | 4 ++-- .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../ets/com/ohos/common/StyleConfiguration.ts | 18 +++++++++--------- .../com/ohos/pages/PluginIconItemComponent.ets | 1 + .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../ets/com/ohos/common/StyleConfiguration.ts | 4 ++-- .../ets/default/common/StyleConfiguration.ts | 2 +- .../ets/com/ohos/common/StyleConfiguration.ts | 8 ++++---- .../com/ohos/pages/PluginIconItemComponent.ets | 1 + .../ets/com/ohos/common/StyleConfiguration.ts | 2 +- .../ets/default/common/StyleConfiguration.ts | 2 +- .../src/main/ets/common/StyleConfiguration.ts | 2 +- .../src/main/ets/common/StyleConfiguration.ts | 2 +- .../ets/pages/common/StyleConfiguration.ts | 2 +- .../ets/pages/common/StyleConfiguration.ts | 2 +- .../ets/pages/common/StyleConfiguration.ts | 2 +- .../ets/pages/common/StyleConfiguration.ts | 8 ++++---- .../ets/pages/common/StyleConfiguration.ts | 2 +- 24 files changed, 43 insertions(+), 41 deletions(-) diff --git a/common/src/main/ets/default/BaseStyleManager.ts b/common/src/main/ets/default/BaseStyleManager.ts index 138a91c6..e617ebad 100644 --- a/common/src/main/ets/default/BaseStyleManager.ts +++ b/common/src/main/ets/default/BaseStyleManager.ts @@ -46,10 +46,10 @@ export default class BaseStyleManager { this.standardWidth = width; } - getStyle(key: string, defaultStyle: T): T { + getStyle(key: string, defaultStyle: { new(): T }): T { let newKey = this.mAbilityPageName + "-" + key; if (!AppStorage.Has(newKey)) { - AppStorage.SetOrCreate(newKey, defaultStyle); + AppStorage.SetOrCreate(newKey, new defaultStyle()); Log.showInfo(TAG, `Create storageKey of ${newKey}`); } return AppStorage.Get(newKey) as T; diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts index 30b11807..878ffb68 100644 --- a/common/src/main/ets/default/StyleConfiguration.ts +++ b/common/src/main/ets/default/StyleConfiguration.ts @@ -30,6 +30,6 @@ export class CommonStyle { export default class StyleConfiguration { static getCommonStyle(): CommonStyle { const key: string = TAG + '-Common'; - return StyleManager.getStyle(key, new CommonStyle()); + return StyleManager.getStyle(key, CommonStyle); } } \ No newline at end of file diff --git a/common/src/main/ets/template/common/StyleConfiguration.ts b/common/src/main/ets/template/common/StyleConfiguration.ts index 011060e8..1dcebe2f 100644 --- a/common/src/main/ets/template/common/StyleConfiguration.ts +++ b/common/src/main/ets/template/common/StyleConfiguration.ts @@ -72,16 +72,16 @@ export class SimpleToggleBaseStyle { export default class StyleConfiguration { static getIconTitleBaseStyle(): IconTitleBaseStyle { const key: string = TAG + '-IconTitleBase'; - return StyleManager.getStyle(key, new IconTitleBaseStyle()); + return StyleManager.getStyle(key, IconTitleBaseStyle); } static getIconComponentStyle(): IconComponentStyle { const key: string = TAG + '-IconComponent'; - return StyleManager.getStyle(key, new IconComponentStyle()); + return StyleManager.getStyle(key, IconComponentStyle); } static getSimpleToggleBaseStyle(): SimpleToggleBaseStyle { const key: string = TAG + '-SimpleToggleBase'; - return StyleManager.getStyle(key, new SimpleToggleBaseStyle()); + return StyleManager.getStyle(key, SimpleToggleBaseStyle); } } \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts index 4fbdfea0..cf4b7264 100644 --- a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -38,11 +38,11 @@ export class BatteryPicStyle { export default class StyleConfiguration { static getBatteryComponentStyle(): BatteryComponentStyle { const key: string = TAG + '-BatteryComponent'; - return StyleManager.getStyle(key, new BatteryComponentStyle()); + return StyleManager.getStyle(key, BatteryComponentStyle); } static getBatteryPicStyle(): BatteryPicStyle { const key: string = TAG + '-BatteryPicComponent'; - return StyleManager.getStyle(key, new BatteryPicStyle()); + return StyleManager.getStyle(key, BatteryPicStyle); } } \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 68dc4acf..e6b9aa58 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -25,6 +25,6 @@ export class StatusBarBluetoothComponentStyle { export default class StyleConfiguration { static getStatusBarBluetoothComponentStyle(): StatusBarBluetoothComponentStyle { const key: string = TAG + '-StatusBarBluetoothComponent'; - return StyleManager.getStyle(key, new StatusBarBluetoothComponentStyle()); + return StyleManager.getStyle(key, StatusBarBluetoothComponentStyle); } } \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts index 440fa72f..015525a8 100644 --- a/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -36,6 +36,6 @@ export class BrightnessComponentStyle { export default class StyleConfiguration { static getBrightnessComponentStyle(): BrightnessComponentStyle { const key: string = TAG + '-BrightnessComponent'; - return StyleManager.getStyle(key, new BrightnessComponentStyle()); + return StyleManager.getStyle(key, BrightnessComponentStyle); } } \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts index 17e2aa7a..b8e58624 100644 --- a/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -32,6 +32,6 @@ export class CapsuleComponentStyle { export default class StyleConfiguration { static getCapsuleComponentStyle(): CapsuleComponentStyle { const key: string = TAG + '-CapsuleComponent'; - return StyleManager.getStyle(key, new CapsuleComponentStyle()); + return StyleManager.getStyle(key, CapsuleComponentStyle); } } \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts index e0586a53..902821b5 100644 --- a/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -24,6 +24,6 @@ export class ClockComponentStyle { export default class StyleConfiguration { static getClockComponentStyle(): ClockComponentStyle { const key: string = TAG + '-ClockComponent'; - return StyleManager.getStyle(key, new ClockComponentStyle()); + return StyleManager.getStyle(key, ClockComponentStyle); } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 11e816ec..3aca71ae 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -134,46 +134,46 @@ export class ControlEditDialogStyle { export default class StyleConfiguration { static getControlCenterComponentStyle(): ControlCenterComponentStyle { const key: string = TAG + '-ControlCenterComponent'; - return StyleManager.getStyle(key, new ControlCenterComponentStyle()); + return StyleManager.getStyle(key, ControlCenterComponentStyle); } static getControlCenterUpTitleStyle(): ControlCenterUpTitleStyle { const key: string = TAG + '-ControlCenterUpTitle'; - return StyleManager.getStyle(key, new ControlCenterUpTitleStyle()); + return StyleManager.getStyle(key, ControlCenterUpTitleStyle); } static getControlCenterComplexToggleLayoutStyle(): ControlCenterComplexToggleLayoutStyle { const key: string = TAG + '-ControlCenterComplexToggleLayout'; - return StyleManager.getStyle(key, new ControlCenterComplexToggleLayoutStyle()); + return StyleManager.getStyle(key, ControlCenterComplexToggleLayoutStyle); } static getControlCenterSimpleToggleLayoutStyle(): ControlCenterSimpleToggleLayoutStyle { const key: string = TAG + '-ControlCenterSimpleToggleLayout'; - return StyleManager.getStyle(key, new ControlCenterSimpleToggleLayoutStyle()); + return StyleManager.getStyle(key, ControlCenterSimpleToggleLayoutStyle); } static getSimpleToggleLayoutEditComponentStyle(): SimpleToggleLayoutEditComponentStyle { const key: string = TAG + '-SimpleToggleLayoutEditComponent'; - return StyleManager.getStyle(key, new SimpleToggleLayoutEditComponentStyle()); + return StyleManager.getStyle(key, SimpleToggleLayoutEditComponentStyle); } static getSimpleToggleLayoutEditUpTitleStyle(): SimpleToggleLayoutEditUpTitleStyle { const key: string = TAG + '-SimpleToggleLayoutEditUpTitle'; - return StyleManager.getStyle(key, new SimpleToggleLayoutEditUpTitleStyle()); + return StyleManager.getStyle(key, SimpleToggleLayoutEditUpTitleStyle); } static getSimpleToggleLayoutEditOptMsgStyle(): SimpleToggleLayoutEditOptMsgStyle { const key: string = TAG + '-SimpleToggleLayoutEditOptMsg'; - return StyleManager.getStyle(key, new SimpleToggleLayoutEditOptMsgStyle()); + return StyleManager.getStyle(key, SimpleToggleLayoutEditOptMsgStyle); } static getSimpleToggleLayoutEditGridStyle(): SimpleToggleLayoutEditGridStyle { const key: string = TAG + '-SimpleToggleLayoutEditGrid'; - return StyleManager.getStyle(key, new SimpleToggleLayoutEditGridStyle()); + return StyleManager.getStyle(key, SimpleToggleLayoutEditGridStyle); } static getControlEditDialogStyle(): ControlEditDialogStyle { const key: string = TAG + '-ControlEditDialog'; - return StyleManager.getStyle(key, new ControlEditDialogStyle()); + return StyleManager.getStyle(key, ControlEditDialogStyle); } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets index f4f8f544..54a657a0 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 3ae54fc6..e2a12703 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -25,6 +25,6 @@ export class StartsBarLocationComponentStyle { export default class StyleConfiguration { static getStartsBarLocationComponentStyle(): StartsBarLocationComponentStyle { const key: string = TAG + '-startsBarLocation'; - return StyleManager.getStyle(key, new StartsBarLocationComponentStyle()); + return StyleManager.getStyle(key, StartsBarLocationComponentStyle); } } \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 3e4997e7..dadf7ae1 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -29,11 +29,11 @@ export class ControlCenterRingModeComponentStyle { export default class StyleConfiguration { static getStatusRingModeComponentStyle(): StatusRingModeComponentStyle { const key: string = TAG + '-StatusRingMode'; - return StyleManager.getStyle(key, new StatusRingModeComponentStyle()); + return StyleManager.getStyle(key, StatusRingModeComponentStyle); } static getControlCenterRingModeComponentStyle(): ControlCenterRingModeComponentStyle { const key: string = TAG + '-ControlCenterRingMode'; - return StyleManager.getStyle(key, new ControlCenterRingModeComponentStyle()); + return StyleManager.getStyle(key, ControlCenterRingModeComponentStyle); } } \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts index 86238486..138d94d4 100644 --- a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -29,6 +29,6 @@ export class SignalComponentStyle { export default class StyleConfiguration { static getSignalComponentStyle(): SignalComponentStyle { const key: string = TAG + '-SignalComponent'; - return StyleManager.getStyle(key, new SignalComponentStyle()); + return StyleManager.getStyle(key, SignalComponentStyle); } } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 9b7939f2..2913883f 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -48,21 +48,21 @@ export class PluginIconItemComponentStyle { export default class StyleConfiguration { static getVerticalStatusBarItemLoadComponentStyle(): VerticalStatusBarItemLoadComponentStyle { const key: string = TAG + '-VerticalStatusBarItemLoadComponent'; - return StyleManager.getStyle(key, new VerticalStatusBarItemLoadComponentStyle()); + return StyleManager.getStyle(key, VerticalStatusBarItemLoadComponentStyle); } static getStatusBarNotificationIconStyle(): StatusBarNotificationIconStyle { const key: string = TAG + '-StatusBarNotificationIcon'; - return StyleManager.getStyle(key, new StatusBarNotificationIconStyle()); + return StyleManager.getStyle(key, StatusBarNotificationIconStyle); } static getIconItemComponentStyle(): IconItemComponentStyle { const key: string = TAG + '-IconItemComponent'; - return StyleManager.getStyle(key, new IconItemComponentStyle()); + return StyleManager.getStyle(key, IconItemComponentStyle); } static getPluginIconItemComponentStyle(): PluginIconItemComponentStyle { const key: string = TAG + '-PluginIconItemComponent'; - return StyleManager.getStyle(key, new PluginIconItemComponentStyle()); + return StyleManager.getStyle(key, PluginIconItemComponentStyle); } } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets index efd45d6c..95f53834 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index f57bdd94..181da825 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -44,6 +44,6 @@ export class VolumePanelComponentStyle { export default class StyleConfiguration { static getVolumePanelComponentStyle(): VolumePanelComponentStyle { const key: string = TAG + '-VolumePanelComponent'; - return StyleManager.getStyle(key, new VolumePanelComponentStyle()); + return StyleManager.getStyle(key, VolumePanelComponentStyle); } } \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts index 6c67499b..b1582bd9 100644 --- a/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -25,6 +25,6 @@ export class StartsBarWifiComponentStyle { export default class StyleConfiguration { static getStartsBarWifiComponentStyle(): StartsBarWifiComponentStyle { const key: string = TAG + '-startsBarWifi'; - return StyleManager.getStyle(key, new StartsBarWifiComponentStyle()); + return StyleManager.getStyle(key, StartsBarWifiComponentStyle); } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts b/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts index eb021b17..6ba79572 100644 --- a/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts +++ b/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts @@ -28,6 +28,6 @@ export class KeyButtonStyle { export default class StyleConfiguration { static getKeyButtonStyle(): KeyButtonStyle { const key: string = TAG + '-KeyButton'; - return StyleManager.getStyle(key, new KeyButtonStyle()); + return StyleManager.getStyle(key, KeyButtonStyle); } } \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts b/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts index 0ffaec26..ee6d0a7e 100644 --- a/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts +++ b/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts @@ -23,6 +23,6 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, new IndexStyle()); + return StyleManager.getStyle(key, IndexStyle); } } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts index b0d23190..4d959548 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -24,7 +24,7 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, new IndexStyle()); + return StyleManager.getStyle(key, IndexStyle); } } diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts index 9d06e77c..cab3acf8 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -24,6 +24,6 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, new IndexStyle()); + return StyleManager.getStyle(key, IndexStyle); } } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts index 84677220..542d0d24 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts @@ -23,6 +23,6 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, new IndexStyle()); + return StyleManager.getStyle(key, IndexStyle); } } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts index 83420454..45ff70b8 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -53,21 +53,21 @@ export class DateItemStyle { export default class StyleConfiguration { static getControlStyle(): ControlStyle { const key: string = TAG + '-Control'; - return StyleManager.getStyle(key, new ControlStyle()); + return StyleManager.getStyle(key, ControlStyle); } static getNotificationStyle(): NotificationStyle { const key: string = TAG + '-Notification'; - return StyleManager.getStyle(key, new NotificationStyle()); + return StyleManager.getStyle(key, NotificationStyle); } static getQuicklySettingStyle(): QuicklySettingStyle { const key: string = TAG + '-QuicklySetting'; - return StyleManager.getStyle(key, new QuicklySettingStyle()); + return StyleManager.getStyle(key, QuicklySettingStyle); } static getDateItemStyle(): DateItemStyle { const key: string = TAG + '-DateItem'; - return StyleManager.getStyle(key, new DateItemStyle()); + return StyleManager.getStyle(key, DateItemStyle); } } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts index 84677220..542d0d24 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts @@ -23,6 +23,6 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, new IndexStyle()); + return StyleManager.getStyle(key, IndexStyle); } } \ No newline at end of file -- Gitee From 3ec0d17c0b617c1265326ff26e950d0cd05ac391 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Tue, 26 Jul 2022 08:56:04 +0800 Subject: [PATCH 210/373] Withdrawal of irrelevant modifications Signed-off-by: xuchangzhou --- .../src/main/ets/com/ohos/pages/PluginIconItemComponent.ets | 1 - .../src/main/ets/com/ohos/pages/PluginIconItemComponent.ets | 1 - 2 files changed, 2 deletions(-) diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets index 54a657a0..f4f8f544 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -1,4 +1,3 @@ -//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets index 95f53834..efd45d6c 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -1,4 +1,3 @@ -//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); -- Gitee From b3b509c9278efc0edbe79fbb1c0dddfafa1793f8 Mon Sep 17 00:00:00 2001 From: lizhi Date: Thu, 28 Jul 2022 09:34:37 +0800 Subject: [PATCH 211/373] =?UTF-8?q?[systemui]=E5=8E=BB=E6=8E=89=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E5=8A=A8=E7=94=BB=EF=BC=8C=E8=A7=84=E9=81=BF=E5=86=85?= =?UTF-8?q?=E5=AD=98=E6=B3=84=E9=9C=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../controlpanel/src/main/ets/pages/index.ets | 29 +++++-------------- .../src/main/ets/pages/index.ets | 27 ++++++----------- 2 files changed, 16 insertions(+), 40 deletions(-) diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index 9695c79b..8ef95271 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -56,7 +56,6 @@ struct Index { @StorageLink('StatusCoefficient') StatusCoefficient: number = 1.0 @State style: IndexStyle = new IndexStyle() @State mBackground: PixelMap | undefined = undefined; - @State mBlur: number = 0; @State mOpacity: number = 0.0; @State mWidthSize: number = 0.2 @State mHeightSize: number = 0.2 @@ -168,30 +167,16 @@ struct Index { return; } this.mShowAnimReady = false; - this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { - Log.showInfo(TAG, `show anim finish.`); - this.mBlur = 20; - } }, () => { - this.mBlur = 20 - this.mOpacity = 1.0 - this.mWidthSize = 1.0 - this.mHeightSize = 1.0 - }) + this.mOpacity = 1.0; + this.mWidthSize = 1.0; + this.mHeightSize = 1.0; } hideWindow() { - Log.showDebug(TAG, `hide anim start: ${JSON.stringify(this)}`); - this._animateTo({ ...HIDE_ANIM_CONFIG, onFinish: () => { - Log.showInfo(TAG, `anim finish, hide Notification window.`); - this.mBlur = 0 - WindowManager.hideWindow(WindowType.CONTROL_PANEL); - } - }, () => { - this.mBlur = 0 - this.mOpacity = 0.0 - this.mWidthSize = 0.2 - this.mHeightSize = 0.2 - }) + WindowManager.hideWindow(WindowType.CONTROL_PANEL); + this.mOpacity = 0.0; + this.mWidthSize = 0.2; + this.mHeightSize = 0.2; } onModeChange(isEdit) { diff --git a/product/pc/notificationpanel/src/main/ets/pages/index.ets b/product/pc/notificationpanel/src/main/ets/pages/index.ets index 9f0cf80f..c84477ea 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/index.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/index.ets @@ -134,30 +134,21 @@ struct Index { } async startShowAnim() { + Log.showInfo(TAG, `do show window. mShowAnimReady=${this.mShowAnimReady}`); if (!this.mShowAnimReady) { return; } this.mShowAnimReady = false; - this._animateTo({ ...SHOW_ANIM_CONFIG, onFinish: () => { - Log.showInfo(TAG, `show anim finish.`); - } }, () => { - this.mOpacity = 1.0 - this.mWidthSize = 1.0 - this.mHeightSize = 1.0 - }) + this.mOpacity = 1.0; + this.mWidthSize = 1.0; + this.mHeightSize = 1.0; } hideWindow() { - Log.showDebug(TAG, `hide anim start`); - this._animateTo({ ...HIDE_ANIM_CONFIG, onFinish: () => { - Log.showInfo(TAG, `anim finish, hide Notification window, view: ${JSON.stringify(this)}`); - WindowManager.hideWindow(WindowType.NOTIFICATION_PANEL); - } - }, () => { - Log.showInfo(TAG, `do hide anim.`); - this.mOpacity = 0.0 - this.mWidthSize = 0.2 - this.mHeightSize = 0.2 - }) + Log.showInfo(TAG, `do hide window.`); + WindowManager.hideWindow(WindowType.NOTIFICATION_PANEL); + this.mOpacity = 0.0; + this.mWidthSize = 0.2; + this.mHeightSize = 0.2; } } -- Gitee From 86e6bc7a1eeab975ad389df6b00879dd008a1891 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Thu, 28 Jul 2022 09:46:22 +0800 Subject: [PATCH 212/373] publish commonEvent to notify launcher that it can start moving down the dock bar Signed-off-by: xuchangzhou --- .../navigationBar/src/main/ets/common/constants.ts | 2 ++ .../main/ets/viewmodel/NavigationBarViewModel.ts | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/product/default/navigationBar/src/main/ets/common/constants.ts b/product/default/navigationBar/src/main/ets/common/constants.ts index fa509d52..4ab3d178 100644 --- a/product/default/navigationBar/src/main/ets/common/constants.ts +++ b/product/default/navigationBar/src/main/ets/common/constants.ts @@ -25,6 +25,8 @@ export default class Constants { static readonly THREE_ICON_LAYOUT: number = 3; } +export const NAVIGATIONBAR_HIDE_EVENT = 'systemui.event.NAVIGATIONBAR_HIDE'; + export class NavigationBarComponentData { isEnable = true; backgroundColor = '#00000000'; diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index b3c1b537..261cc5e8 100644 --- a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -19,10 +19,11 @@ import WindowManager, { WindowType } from '../../../../../../../common/src/main/ import getSingleInstance from '../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; import TintStateManager, { TintState, TintStateListener } from '../../../../../../../common/src/main/ets/default/TintStateManager'; -import { NavigationBarComponentData } from '../common/constants'; +import { NavigationBarComponentData, NAVIGATIONBAR_HIDE_EVENT } from '../common/constants'; import featureAbility from '@ohos.ability.featureAbility'; import { DataAbilityHelper } from 'ability/dataAbilityHelper'; import settings from '@ohos.settings'; +import commonEvent from '@ohos.commonEvent'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import CommonConstants from '../../../../../../../common/src/main/ets/default/Constants'; @@ -162,8 +163,18 @@ export default class NavigationBarViewModel { private windowSwitches(navigationBarStatusValue: string): void { this.isDisplay = navigationBarStatusValue == '1' ? true : false; if (!this.isDisplay) { + //For gesture navigation scenarios + //Systemui hides the navigation bar,and then notifies the launcher that it can start moving down the dock bar. WindowManager.hideWindow(WindowType.NAVIGATION_BAR).then(() => { + commonEvent.publish(NAVIGATIONBAR_HIDE_EVENT, (err) => { + if (err.code) { + Log.showError(TAG, `systemui.event.NAVIGATIONBAR_HIDE PublishCallBack err: ${JSON.stringify(err)}`); + } else { + Log.showInfo(TAG, "systemui.event.NAVIGATIONBAR_HIDE Publish sucess"); + } + }) }).catch((err) => { + Log.showError(TAG, `systemui.event.NAVIGATIONBAR_HIDE Publish catch err: ${JSON.stringify(err)}`); }); } else { WindowManager.showWindow(WindowType.NAVIGATION_BAR).then(() => { -- Gitee From 6ab51fb6a18f25c4648ea0fbb0d0c0ac997f8955 Mon Sep 17 00:00:00 2001 From: yangpeng85 Date: Thu, 28 Jul 2022 11:52:08 +0800 Subject: [PATCH 213/373] support log system fault and update trace log Signed-off-by: yangpeng85 --- common/src/main/ets/default/SysFaultLogger.ts | 59 +++++++++++++++++++ common/src/main/ets/default/Trace.ts | 8 ++- .../main/ets/com/ohos/model/accountsModel.ts | 6 ++ .../ets/com/ohos/model/screenLockModel.ts | 3 + .../ets/com/ohos/model/screenLockService.ts | 28 +++++++++ product/pc/src/main/ets/pages/index.ets | 3 + product/phone/src/main/ets/pages/index.ets | 3 + 7 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 common/src/main/ets/default/SysFaultLogger.ts diff --git a/common/src/main/ets/default/SysFaultLogger.ts b/common/src/main/ets/default/SysFaultLogger.ts new file mode 100644 index 00000000..ad46d3c2 --- /dev/null +++ b/common/src/main/ets/default/SysFaultLogger.ts @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2021-2022 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 Log from "./Log"; +import hiSysEvent from '@ohos.hiSysEvent' + +const TAG = 'SystemFaultLogger'; +const APP_DOMAIN: string = "CoreApp"; +const APP_LOG_NAME: string = "ScreenLockFault"; + +interface LogParam { + FAULT_ID: string, + MSG: string +} + +export enum FaultID { + MEMORY = "MEMORY_MONITOR", + SCREEN_LOCK_MANAGER = "CONNECT_SCREENLOCKMANAGERSERVICE_ABNORMAL", + ACCOUNT_SYSTEM = "ACCOUNTSYSTEM_CALL_ABNORMAL" +} + +export function WriteFaultLog(logParam: LogParam) { + const sysEventInfo = { + domain: APP_DOMAIN, + name: APP_LOG_NAME, + eventType: hiSysEvent.EventType.FAULT, + params: logParam + } + hiSysEvent.write(sysEventInfo, (err, val) => { + Log.showInfo(TAG, "fault log params is : " + JSON.stringify(sysEventInfo)) + Log.showInfo(TAG, `write fault log result: ${val}`) + }) +} + +export function SysFaultLogger(logParam: LogParam) { + return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + const originalFunc = descriptor.value; + descriptor.value = function(...args) { + try { + originalFunc.apply(this, args); + } catch (err: any) { + Log.showInfo(TAG, "catch error in execute: " + propertyKey); + WriteFaultLog(logParam); + } + }; + }; +} \ No newline at end of file diff --git a/common/src/main/ets/default/Trace.ts b/common/src/main/ets/default/Trace.ts index 117fc164..ee7102ad 100644 --- a/common/src/main/ets/default/Trace.ts +++ b/common/src/main/ets/default/Trace.ts @@ -17,10 +17,12 @@ import byTrace from "@ohos.bytrace"; import Log from "./Log"; export default class Trace { - static readonly CORE_METHOD_UNLOCK_SCREEN = "startUnlockScreen" - static readonly CORE_METHOD_CALL_ACCOUNT_SYSTEM = "startToCallAccountSubsystem"; + static readonly CORE_METHOD_UNLOCK_SCREEN = "unlockScreen" + static readonly CORE_METHOD_CALL_ACCOUNT_SYSTEM = "callAccountSubsystem"; static readonly CORE_METHOD_PASS_ACCOUNT_SYSTEM_RESULT = "passingAccountSubsystemResult"; - static readonly CORE_METHOD_HIDE_PSD_PAGE = "startToHidePsdPage"; + static readonly CORE_METHOD_HIDE_PSD_PAGE = "hidePsdPage"; + static readonly CORE_METHOD_SHOW_LOCK_SCREEN = "showLockScreen"; + static readonly CORE_METHOD_SLEEP_TO_LOCK_SCREEN = "sleepToLockScreen" private static readonly TRACE_TAG = 'ScreenLock:Trace'; private static readonly RECORD_TRACE = true; diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index f0717783..a464aa60 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -18,6 +18,7 @@ import commonEvent from '@ohos.commonEvent'; import util from '@ohos.util'; import {Callback} from 'basic'; import Trace from '../../../../../../../../common/src/main/ets/default/Trace' +import {SysFaultLogger, FaultID} from '../../../../../../../../common/src/main/ets/default/SysFaultLogger' import Log from '../../../../../../../../common/src/main/ets/default/Log' import { CommonEventManager, getCommonEventManager } from "../../../../../../../../common/src/main/ets/default/commonEvent/CommonEventManager"; import {UserData} from '../data/userData' @@ -88,6 +89,7 @@ export default class AccountsModel { Log.showDebug(TAG, "start ModelInit") } + @SysFaultLogger({FAULT_ID: FaultID.ACCOUNT_SYSTEM, MSG: "call func on failed"}) eventListener(typeName: "activate" | "activating", name: string, callback: Callback) { Log.showInfo(TAG, `eventListener:typeName ${typeName}`); osAccount.getAccountManager().on(typeName, name, (userId: number) => { @@ -125,6 +127,7 @@ export default class AccountsModel { this.mManager = undefined; } + @SysFaultLogger({FAULT_ID: FaultID.ACCOUNT_SYSTEM, MSG: "call func off failed"}) eventCancelListener(typeName: "activate" | "activating", name: string) { Log.showInfo(TAG, `eventCancleListener:typeName ${typeName}`); osAccount.getAccountManager().off(typeName, name) @@ -142,6 +145,7 @@ export default class AccountsModel { AppStorage.SetOrCreate('userList', []); } + @SysFaultLogger({FAULT_ID: FaultID.ACCOUNT_SYSTEM, MSG: "call func queryAllCreatedOsAccounts failed"}) private addAllUsers() { Log.showDebug(TAG, "start getAllUsers"); osAccount.getAccountManager().queryAllCreatedOsAccounts().then((list) => { @@ -182,6 +186,7 @@ export default class AccountsModel { } } + @SysFaultLogger({FAULT_ID: FaultID.ACCOUNT_SYSTEM, MSG: "call func activateOsAccount failed"}) onUserSwitch(userId: number) { Log.showDebug(TAG, "onUserSwitch:" + userId) osAccount.getAccountManager().activateOsAccount(userId).then(() => { @@ -252,6 +257,7 @@ export default class AccountsModel { Log.showDebug(TAG, "start modelFinish") } + @SysFaultLogger({FAULT_ID: FaultID.ACCOUNT_SYSTEM, MSG: "call func isOsAccountActived failed"}) isActivateAccount(callback: Callback) { Log.showDebug(TAG, `isActivateAccount userId:${this.mCurrentUserId}`) osAccount.getAccountManager().isOsAccountActived(this.mCurrentUserId).then((isActivate) => { diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index 83eb39c2..d383ff92 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -15,6 +15,7 @@ */ import Trace from '../../../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../../../common/src/main/ets/default/Log' +import {SysFaultLogger, FaultID} from '../../../../../../../../common/src/main/ets/default/SysFaultLogger' import ScreenLockMar from '@ohos.screenlock'; import windowManager from '@ohos.window' import Constants from '../common/constants' @@ -23,6 +24,7 @@ import { Callback } from 'basic'; const TAG = 'ScreenLock-ScreenLockModel'; export default class ScreenLockModel { + @SysFaultLogger({FAULT_ID: FaultID.SCREEN_LOCK_MANAGER, MSG: "call func on failed"}) eventListener(typeName: string, callback: Callback) { Log.showDebug(TAG, `eventListener:typeName ${typeName}`); switch (typeName) { @@ -56,6 +58,7 @@ export default class ScreenLockModel { // As off has some problem and there is no case to cancel, do nothing } + @SysFaultLogger({FAULT_ID: FaultID.SCREEN_LOCK_MANAGER, MSG: "call func sendScreenLockEvent failed"}) sendScreenLockEvent(typeName: string, typeNo: number, callback) { Log.showInfo(TAG, `sendScreenLockEvent: typeName ${typeName} typeNo ${typeNo} `); ScreenLockMar.sendScreenLockEvent(typeName, typeNo, (err, data) => { diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index 10bfc6f2..d72e94ae 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -13,12 +13,15 @@ * limitations under the License. */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import Trace from '../../../../../../../../common/src/main/ets/default/Trace' +import {WriteFaultLog, FaultID} from '../../../../../../../../common/src/main/ets/default/SysFaultLogger' import ScreenLockModel from './screenLockModel'; import AccountModel, {AuthType, AuthSubType, AuthTurstLevel} from './accountsModel' import {ScreenLockStatus} from '../../../../../../../../common/src/main/ets/default/ScreenLockCommon'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper' import Router from '@system.router'; import commonEvent from '@ohos.commonEvent'; +import hiDebug from '@ohos.hiDebug'; import { CommonEventPublishData } from 'commonEvent/commonEventPublishData'; import {Callback} from 'basic'; @@ -55,6 +58,9 @@ const CHALLENGE_INT = 0 const MAIN_USER = 100 +const MEMORY_MONITOR_PERIOD_MS = 600000 +const MEMORY_MONITOR_LIMIT_KB = 120 * 1024 + export {AuthType, AuthSubType}; export enum UnlockResult { @@ -75,8 +81,10 @@ export class ScreenLockService { accountModel: AccountModel = new AccountModel() screenLockModel: ScreenLockModel = new ScreenLockModel() currentLockStatus : ScreenLockStatus; + memoryMonitor: number = -1; init() { Log.showDebug(TAG, 'init'); + this.startMonitorMemory(); this.accountModel.modelInit(); this.monitorEvents(); this.accountModel.updateAllUsers() @@ -104,6 +112,7 @@ export class ScreenLockService { //The device is going to sleep this.screenLockModel.eventListener(EVENT_BEGIN_SLEEP, () => { + Trace.start(Trace.CORE_METHOD_SLEEP_TO_LOCK_SCREEN); Log.showInfo(TAG, `EVENT_BEGIN_SLEEP event`); this.lockScreen(); this.accountModel.updateAllUsers() @@ -139,6 +148,7 @@ export class ScreenLockService { } lockScreen() { + Trace.start(Trace.CORE_METHOD_SHOW_LOCK_SCREEN); Log.showDebug(TAG, `lockScreen`); let length = Router.getLength() Log.showDebug(TAG, `Router.getLength: ${length}`) @@ -316,6 +326,7 @@ export class ScreenLockService { this.accountModel.eventCancelListener(ACTIVATE_TYPE, ACTIVATE_EVENT) this.accountModel.commonEventCancelListener(); this.accountModel.modelFinish() + this.stopMonitorMemory() } setUnlockAnimation(beginAnimation: Callback>) { @@ -344,6 +355,23 @@ export class ScreenLockService { } }); } + + private startMonitorMemory() { + this.memoryMonitor = setInterval(() => { + const pss = hiDebug.getPss(); + Log.showInfo(TAG, `app pss info is: ${pss}`); + if (pss > MEMORY_MONITOR_LIMIT_KB) { + WriteFaultLog({FAULT_ID: FaultID.MEMORY, MSG: "pss over limit"}) + } + }, MEMORY_MONITOR_PERIOD_MS) + } + + private stopMonitorMemory() { + if (this.memoryMonitor !== -1) { + clearInterval(this.memoryMonitor); + this.memoryMonitor = -1; + } + } } let screenLockService = createOrGet(ScreenLockService, TAG); diff --git a/product/pc/src/main/ets/pages/index.ets b/product/pc/src/main/ets/pages/index.ets index 88f12ab6..4caa4ade 100644 --- a/product/pc/src/main/ets/pages/index.ets +++ b/product/pc/src/main/ets/pages/index.ets @@ -14,6 +14,7 @@ */ import Log from '../../../../../../common/src/main/ets/default/Log' +import Trace from '../../../../../../common/src/main/ets/default/Trace' import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import {LockStyleMode} from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' @@ -57,6 +58,8 @@ struct Index { } onPageShow() { + Trace.end(Trace.CORE_METHOD_SLEEP_TO_LOCK_SCREEN); + Trace.end(Trace.CORE_METHOD_SHOW_LOCK_SCREEN); Log.showInfo(TAG, `onPageShow`) this.pageStatus = Constants.STATUS_ON_PAGE_SHOW this.mViewModel.onPageShow(); diff --git a/product/phone/src/main/ets/pages/index.ets b/product/phone/src/main/ets/pages/index.ets index 95776b47..4d008d4a 100644 --- a/product/phone/src/main/ets/pages/index.ets +++ b/product/phone/src/main/ets/pages/index.ets @@ -14,6 +14,7 @@ */ import Log from '../../../../../../common/src/main/ets/default/Log' +import Trace from '../../../../../../common/src/main/ets/default/Trace' import CommonStyleManager from '../../../../../../common/src/main/ets/default/StyleManager' import AbilityManager from '../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import {LockStyleMode} from '../../../../../../features/screenlock/src/main/ets/com/ohos/model/screenlockStyle' @@ -58,6 +59,8 @@ struct Index { } onPageShow() { + Trace.end(Trace.CORE_METHOD_SLEEP_TO_LOCK_SCREEN); + Trace.end(Trace.CORE_METHOD_SHOW_LOCK_SCREEN); Log.showInfo(TAG, `onPageShow`) this.pageStatus = Constants.STATUS_ON_PAGE_SHOW this.mViewModel.onPageShow(); -- Gitee From 2694842e4967cf6e01de0ab37c76d50218771420 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Fri, 29 Jul 2022 14:40:21 +0800 Subject: [PATCH 214/373] Modify the relevant interface for obtaining application resources: createBundleContext, getString, getMediaBase64 Signed-off-by: xuchangzhou --- .../default/abilitymanager/bundleManager.ts | 50 ++++++++++-- .../PluginDataSourceAdapter.ts | 24 +++--- .../ets/plugindatasource/common/Constants.ts | 1 + .../common/PluginComponentManagerUtil.ts | 20 +++-- .../sourceloader/MetaSourceLoader.ts | 1 + .../sourceloader/PluginSourceLoader.ts | 1 + .../sourceloader/PluginSourceLoaderPatch.ts | 7 +- .../ets/com/ohos/model/bundleResourceModel.ts | 80 +++++++++---------- .../ohos/noticeItem/model/ParseDataUtil.ts | 10 +-- .../ets/viewmodel/NavigationBarViewModel.ts | 6 +- 10 files changed, 115 insertions(+), 85 deletions(-) diff --git a/common/src/main/ets/default/abilitymanager/bundleManager.ts b/common/src/main/ets/default/abilitymanager/bundleManager.ts index 09dc39c7..f62b829f 100644 --- a/common/src/main/ets/default/abilitymanager/bundleManager.ts +++ b/common/src/main/ets/default/abilitymanager/bundleManager.ts @@ -14,21 +14,57 @@ */ import BundleMgr from "@ohos.bundle"; -import Context from "application/ServiceExtensionContext"; import Log from "../Log"; import SwitchUserManager from "../SwitchUserManager"; +import AbilityManager from "./abilityManager"; const TAG = "BRManager"; +interface Resource { + bundleName: string; + moduleName: string; + id: number; +} + export default class BundleManager { - static async getResourceManager(tag: string, context: Context, bundleName: string) { - Log.showDebug(TAG, `getResourceManager from: ${tag}`); - let bundleContext = await context.createBundleContext(bundleName); - return await bundleContext.resourceManager; + static readonly RESOURCE_MANAGER = 'SystemUi_Resource_Manager'; + + static getResourceManager() { + if(!globalThis[BundleManager.RESOURCE_MANAGER]){ + Log.showInfo(TAG, 'init resourceManager'); + globalThis[BundleManager.RESOURCE_MANAGER] = AbilityManager.getContext().resourceManager; + } + return globalThis[BundleManager.RESOURCE_MANAGER]; + } + + static getString(resource: Resource, callback?: Function){ + Log.showDebug(TAG, `getString, resource: ${JSON.stringify(resource)}`); + if(callback){ + BundleManager.getResourceManager().getString(resource).then((value) => { + Log.showDebug(TAG, `getString, callback excute`); + callback(value) ; + }) + return; + } else { + return BundleManager.getResourceManager().getString(resource); + } + } + + static getMediaBase64(resource: Resource, callback?: Function){ + Log.showDebug(TAG, `getMediaBase64, resource: ${JSON.stringify(resource)}`); + if(callback){ + BundleManager.getResourceManager().getMediaBase64(resource).then((value) => { + Log.showDebug(TAG, `getMediaBase64, callback excute`); + callback(value) ; + }) + return; + } else { + return BundleManager.getResourceManager().getMediaBase64(resource); + } } - static async getBundleInfo(tag: string, bundleName: string, getInfo: - any, requestId?: number) { + static async getBundleInfo(tag: string, bundleName: string, getInfo?: any, requestId?: number) { + getInfo = getInfo ?? BundleMgr.BundleFlag.GET_BUNDLE_DEFAULT; let userInfo = { userId: requestId ?? (await SwitchUserManager.getInstance().getCurrentUserInfo()).userId, }; diff --git a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts index 34137068..d8e08cde 100644 --- a/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts +++ b/common/src/main/ets/plugindatasource/PluginDataSourceAdapter.ts @@ -114,20 +114,16 @@ export default class PluginDataSourceAdapter { this.mListener.onItemAdd(itemData); return; } - let manager = await BundleManager.getResourceManager(TAG, this.mContext, itemData.bundleName); - Log.showDebug(TAG, `name: ${this.mName}, ${itemData.id} Can't find label or icon, fetch data from ${manager}`); - if (manager) { - Promise.all([ - itemData.iconUrl ?? manager.getMediaBase64(itemData.abilityIconId), - itemData.label ?? manager.getString(itemData.abilityLabelId), - ]) - .then(([iconValue, labelValue]) => { - iconValue && (itemData.iconUrl = iconValue); - labelValue && (itemData.label = labelValue); - this.mListener.onItemAdd(itemData); - }) - .catch((err) => Log.showError(TAG, `name: ${this.mName}, Can't get bundle info, err: ${JSON.stringify(err)}`)); - } + Promise.all([ + itemData.iconUrl ?? BundleManager.getMediaBase64({bundleName: itemData.bundleName, moduleName: itemData.moduleName, id: itemData.abilityIconId}), + itemData.label ?? BundleManager.getString({bundleName: itemData.bundleName, moduleName: itemData.moduleName, id: itemData.abilityLabelId}), + ]) + .then(([iconValue, labelValue]) => { + iconValue && (itemData.iconUrl = iconValue); + labelValue && (itemData.label = labelValue); + this.mListener.onItemAdd(itemData); + }) + .catch((err) => Log.showError(TAG, `name: ${this.mName}, Can't get bundle info, err: ${JSON.stringify(err)}`)); } onItemRemove(itemData: ItemComponentData): void { diff --git a/common/src/main/ets/plugindatasource/common/Constants.ts b/common/src/main/ets/plugindatasource/common/Constants.ts index 543b6693..fe393767 100644 --- a/common/src/main/ets/plugindatasource/common/Constants.ts +++ b/common/src/main/ets/plugindatasource/common/Constants.ts @@ -63,6 +63,7 @@ export type ItemComponentData = { pluginType: number; deviceId: string; bundleName: string; + moduleName: string, abilityName: string; abilityLabelId: number; abilityIconId: number; diff --git a/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts b/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts index 63bd5d30..d265c25a 100644 --- a/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts +++ b/common/src/main/ets/plugindatasource/common/PluginComponentManagerUtil.ts @@ -16,12 +16,14 @@ import pluginComponentManager from '@ohos.pluginComponent'; import { Want } from 'ability/want'; +import { ItemComponentData } from './Constants'; import Log from '../../default/Log'; const TAG = 'PluginComponentManagerUtil'; export class PluginComponentInfo { bundleName: string; + moduleName: string; abilityName: string; template: string; componentTemplate; @@ -36,14 +38,15 @@ export interface ListenerHandle { unRegister(): void; } -export async function requestFunction(owner: Want, want: Want, name: string): Promise { +export async function requestFunction(owner: Want, itemData: ItemComponentData): Promise { Log.showDebug(TAG, `requestFunction, owner: ${JSON.stringify(owner)}`); - Log.showDebug(TAG, `requestFunction, want: ${JSON.stringify(want)}`); - Log.showDebug(TAG, `requestFunction, name: ${JSON.stringify(name)}`); + Log.showDebug(TAG, `requestFunction, itemData: ${JSON.stringify(itemData)}`); let param = { owner: owner, - want: want, - name: name, + want: { + bundleName: itemData.bundleName, abilityName: itemData.abilityName + }, + name: itemData.template, data: {} }; let ret = await pluginComponentManager.request(param); @@ -52,9 +55,10 @@ export async function requestFunction(owner: Want, want: Want, name: string): Pr throw new Error(); } let info = new PluginComponentInfo(); - info.bundleName = want.bundleName; - info.abilityName = want.abilityName; - info.template = name; + info.bundleName = itemData.bundleName; + info.moduleName = itemData.moduleName; + info.abilityName = itemData.abilityName; + info.template = itemData.template; info.componentTemplate = ret.componentTemplate; info.data = ret.data; return info; diff --git a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts index c230dcc7..a95d7541 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/MetaSourceLoader.ts @@ -79,6 +79,7 @@ function parseData(info: AbilityInfoWithId, data: PluginData): ItemComponentData pluginType: PluginType.META, deviceId: Constants.LOCAL_DEVICE, bundleName: info.bundleName, + moduleName: info.moduleName, abilityName: info.name, abilityLabelId: info.labelId, abilityIconId: info.iconId, diff --git a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts index 55fce986..1aaf92dc 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoader.ts @@ -99,6 +99,7 @@ function parseData(info: AbilityInfoWithId, data: PluginData): ItemComponentData pluginType: PluginType.PLUGIN_COMPONENT, deviceId: Constants.LOCAL_DEVICE, bundleName: info.bundleName, + moduleName: info.moduleName, abilityName: info.name, abilityLabelId: info.labelId, abilityIconId: info.iconId, diff --git a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts index dd8e1480..94a51910 100644 --- a/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts +++ b/common/src/main/ets/plugindatasource/sourceloader/PluginSourceLoaderPatch.ts @@ -49,11 +49,7 @@ export default class PluginSourceLoaderPatch { async requestPluginComponentData(itemData: ItemComponentData): Promise { Log.showInfo(TAG, `requestPluginComponentData, itemData: ${JSON.stringify(itemData)}`); - let pluginWant = { - bundleName: itemData.bundleName, abilityName: itemData.abilityName - }; - let pluginName = itemData.template; - let ret = await requestFunction(this.mOwnerWant, pluginWant, pluginName); + let ret = await requestFunction(this.mOwnerWant, itemData); return this.pluginComponentInfoToItemComponentData(ret); } @@ -63,6 +59,7 @@ export default class PluginSourceLoaderPatch { pluginType: 3, deviceId: null, bundleName: pluginComponentInfo.bundleName, + moduleName: pluginComponentInfo.moduleName, abilityName: pluginComponentInfo.abilityName, abilityLabelId: null, abilityIconId: null, diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index 385d7a47..874964aa 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -14,6 +14,7 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import BundleManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager'; import Bundle from '@ohos.bundle'; import { BundleInfo } from 'bundle/bundleInfo'; import ResMgr from '@ohos.resourceManager'; @@ -54,26 +55,26 @@ export default class BundleResourceModel { let label = ''; let that = this; try { - let bundleContext = await AbilityManager.getAbilityContext(AbilityManager.ABILITY_NAME_NOTIFICATION_MANAGEMENT).createBundleContext(data[index].name); - let bundleResourceManager = await bundleContext.resourceManager; let appInfo = data[index].appInfo; - if (parseInt(appInfo.labelId) > 0) { - bundleResourceManager.getString(parseInt(appInfo.labelId), (error: BusinessError, value: string) => { - if (value) { - label = value; + if (parseInt(appInfo.labelResource.id) > 0) { + BundleManager.getString(appInfo.labelResource, (value) => { + { + if (value) { + label = value; + } } - }); + }) } else { label = appInfo.label; } - Log.showDebug(TAG, 'getIconItem ResMgr.getResourceManager finish label:' + label); - if (parseInt(appInfo.iconId) <= 0) { + Log.showDebug(TAG, 'getIconItem BundleManager.getString finish label:' + label); + if (appInfo.iconResource.id <= 0) { this.nextIconItem(index, count, data, this.mBundleInfoList, that); return; } - bundleResourceManager.getMediaBase64(parseInt(appInfo.iconId), (error: BusinessError, value: string) => { + BundleManager.getMediaBase64(appInfo.iconResource, (value) => { if (value) { - Log.showInfo(TAG, `getIconItem ResMgr.getMediaBase64() imageValue:${value}` ); + Log.showInfo(TAG, `getIconItem BundleManager.getMediaBase64() imageValue:${value}`); let bundleItemData: BundleItemData = { appIcon: value, appTitle: label, @@ -90,8 +91,6 @@ export default class BundleResourceModel { } this.nextIconItem(index, count, data, this.mBundleInfoList, that); }); - - bundleContext = null; } catch (error) { Log.showError(TAG, `getIconItem catch error: ${JSON.stringify(error)}`); } @@ -116,39 +115,36 @@ export default class BundleResourceModel { userId: userInfo.userId }).then((data) => { Log.showInfo(TAG, `getBundleInfo bundleInfo:${JSON.stringify(data)}`); - ResMgr.getResourceManager(data.name, (error: Error, item) => { - let appInfo = data.appInfo; - if (parseInt(appInfo.labelId) > 0) { - item.getString(parseInt(appInfo.labelId), (error: Error, value: string) => { + let appInfo = data.appInfo; + if (parseInt(appInfo.labelResource.id) > 0) { + BundleManager.getString(appInfo.labelResource, (value) => { + { if (value) { - Log.showDebug(TAG, `getBundleInfo getResourceManager getString() value:${JSON.stringify(value)}`); mBundleInfo.appTitle = value; - } else { - Log.showError(TAG, `getBundleInfo getResourceManager getString() error:${JSON.stringify(error)}`); } - }); - } - mBundleInfo.appTitle = appInfo.label; - mBundleInfo.appValue = ''; - mBundleInfo.appArrow = $r('app.media.ic_settings_arrow'); - mBundleInfo.appSummary = data.versionName; - mBundleInfo.appBundleName = data.name; - mBundleInfo.appIconId = appInfo.iconId; - mBundleInfo.appUri = ''; - mBundleInfo.appUid = data.uid; - mBundleInfo.systemApp = appInfo.systemApp; - Log.showDebug(TAG, 'getBundleInfo getResourceManager label:' + label); - if (parseInt(appInfo.iconId) > 0) { - item.getMediaBase64(parseInt(appInfo.iconId), (error: Error, imageValue: string) => { - if (!!imageValue) { - mBundleInfo.appIcon = imageValue; - } - callback(mBundleInfo); - }); - } else { + } + }) + } + mBundleInfo.appTitle = appInfo.label; + mBundleInfo.appValue = ''; + mBundleInfo.appArrow = $r('app.media.ic_settings_arrow'); + mBundleInfo.appSummary = data.versionName; + mBundleInfo.appBundleName = data.name; + mBundleInfo.appIconId = appInfo.iconId; + mBundleInfo.appUri = ''; + mBundleInfo.appUid = data.uid; + mBundleInfo.systemApp = appInfo.systemApp; + Log.showDebug(TAG, 'getBundleInfo getResourceManager label:' + label); + if (parseInt(appInfo.iconResource.id) > 0) { + BundleManager.getMediaBase64(appInfo.iconResource, (imageValue) => { + if (!!imageValue) { + mBundleInfo.appIcon = imageValue; + } callback(mBundleInfo); - } - }); + }); + } else { + callback(mBundleInfo); + } }); Log.showInfo(TAG, 'getBundleInfo end'); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index b3c62052..f000d55a 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -103,13 +103,11 @@ export default class ParseDataUtil { return appDataMap.get(bundleName); } let data = await BundleManager.getBundleInfo(TAG, bundleName, 0, userId); - let labelId = data?.appInfo?.labelId; - let iconId = data?.appInfo?.iconId; - let contextName = AbilityManager.getContextName(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL); - let item = await BundleManager.getResourceManager(TAG, AbilityManager.getContext(contextName), bundleName); + let labelResource = data?.appInfo?.labelResource; + let iconResource = data?.appInfo?.iconResource; let appMessage = { - appName: await item.getString(parseInt(labelId)), - icon: await item.getMediaBase64(parseInt(iconId)) + appName: await BundleManager.getString(labelResource), + icon: await BundleManager.getMediaBase64(iconResource) }; if (appMessage.icon != null && appMessage.appName) { appDataMap.set(bundleName, appMessage); diff --git a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts index 261cc5e8..79962bf0 100644 --- a/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts +++ b/product/default/navigationBar/src/main/ets/viewmodel/NavigationBarViewModel.ts @@ -168,13 +168,13 @@ export default class NavigationBarViewModel { WindowManager.hideWindow(WindowType.NAVIGATION_BAR).then(() => { commonEvent.publish(NAVIGATIONBAR_HIDE_EVENT, (err) => { if (err.code) { - Log.showError(TAG, `systemui.event.NAVIGATIONBAR_HIDE PublishCallBack err: ${JSON.stringify(err)}`); + Log.showError(TAG, `${NAVIGATIONBAR_HIDE_EVENT} PublishCallBack err: ${JSON.stringify(err)}`); } else { - Log.showInfo(TAG, "systemui.event.NAVIGATIONBAR_HIDE Publish sucess"); + Log.showInfo(TAG, `${NAVIGATIONBAR_HIDE_EVENT} Publish sucess`); } }) }).catch((err) => { - Log.showError(TAG, `systemui.event.NAVIGATIONBAR_HIDE Publish catch err: ${JSON.stringify(err)}`); + Log.showError(TAG, `${NAVIGATIONBAR_HIDE_EVENT} Publish catch err: ${JSON.stringify(err)}`); }); } else { WindowManager.showWindow(WindowType.NAVIGATION_BAR).then(() => { -- Gitee From d36f0c49c64f38b8a05dcffd85e3a9257463a6e1 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 30 Jul 2022 09:01:39 +0800 Subject: [PATCH 215/373] =?UTF-8?q?Systemui=E9=80=82=E9=85=8D=E7=AB=96?= =?UTF-8?q?=E5=B1=8F=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../common/NavBarConfiguration.ts | 40 ++++++++--- .../com/ohos/common/StatusBarConfiguration.ts | 17 +++-- .../ets/com/ohos/viewmodel/StatusBarVM.ts | 42 ++++++++++- .../ServiceExtAbility/ServiceExtAbility.ts | 52 +++++++++++--- .../main/resources/base/element/string.json | 6 +- .../main/resources/en_US/element/string.json | 8 +-- .../main/resources/zh_CN/element/string.json | 8 +-- .../controlpanel/src/main/ets/pages/index.ets | 15 ++++ .../ServiceExtAbility/ServiceExtAbility.ts | 26 +++++-- .../src/main/ets/pages/index.ets | 19 +++++ .../ServiceExtAbility/ServiceExtAbility.ts | 48 +++++++++++-- .../main/resources/base/element/string.json | 6 +- .../main/resources/en_US/element/string.json | 2 +- .../main/resources/zh_CN/element/string.json | 2 +- .../ets/pages/common/StyleConfiguration.ts | 5 +- .../src/main/ets/pages/notification.ets | 4 +- .../main/resources/base/element/float.json | 6 +- .../main/resources/base/element/string.json | 6 +- .../main/resources/en_US/element/string.json | 8 +-- .../main/resources/zh_CN/element/string.json | 8 +-- .../ServiceExtAbility/ServiceExtAbility.ts | 72 +++++++++++++++++-- .../statusbar/src/main/ets/pages/index.ets | 16 ++++- .../main/resources/base/element/string.json | 10 +-- .../main/resources/en_US/element/string.json | 2 +- .../main/resources/zh_CN/element/string.json | 2 +- 25 files changed, 347 insertions(+), 83 deletions(-) diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts index d852bae2..93cb23c3 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/common/NavBarConfiguration.ts @@ -17,6 +17,7 @@ import AbilityManager from '../../../../../../../../../common/src/main/ets/defau import display from '@ohos.display'; import Log from '../../../../../../../../../common/src/main/ets/default/Log'; import ResourceUtil from '../../../../../../../../../common/src/main/ets/default/ResourceUtil'; +import deviceInfo from '@ohos.deviceInfo'; const TAG = 'NavBarConfiguration'; var directionNav; @@ -32,6 +33,7 @@ var realWidth; var realHeight; var xCoordinate = 0; var yCoordinate = 0; +var direction = -1; enum Position { NOT_CONFIGURED, @@ -63,20 +65,28 @@ class NavBarConfiguration { async getDirectionAndPosition() { await ResourceUtil.initResourceManager(AbilityManager.ABILITY_NAME_NAVIGATION_BAR); - directionNav = await ResourceUtil.getConfiguration(); - if (directionNav.direction == -1) { + if (maxWidth > maxHeight) { + direction = 1; + } else { + direction = 2; + } + + if (direction == -1) { + Log.showInfo(TAG, 'direction is -1'); statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) navbarPosition = await ResourceUtil.getString($r("app.string.nav_bar_position_landscape")) statusShortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); navShortSideLength = await ResourceUtil.getString($r("app.string.nav_bar_size_landscape")); - } else if (directionNav.direction == 1) { + } else if (direction == 1) { + Log.showInfo(TAG, 'direction is 1'); statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) navbarPosition = await ResourceUtil.getString($r("app.string.nav_bar_position_landscape")) statusShortSideLength = await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); navShortSideLength = await ResourceUtil.getString($r("app.string.nav_bar_size_landscape")); } else { + Log.showInfo(TAG, 'direction is 2'); statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_portrait")) navbarPosition = await ResourceUtil.getString($r("app.string.nav_bar_position_portrait")) @@ -85,7 +95,7 @@ class NavBarConfiguration { } statusShortSideLength = parseInt(statusShortSideLength) + ''; navShortSideLength = parseInt(navShortSideLength) + ''; - Log.showDebug(TAG, 'statusShortSideLength = ' + statusShortSideLength + 'navShortSideLength = ' + navShortSideLength + 'directionnav = ' + directionNav.direction + 'statusbarPosition = ' + statusbarPosition + 'NavbarPosition = ' + navbarPosition); + Log.showDebug(TAG, 'statusShortSideLength = ' + statusShortSideLength + 'navShortSideLength = ' + navShortSideLength + 'direction = ' + direction + 'statusbarPosition = ' + statusbarPosition + 'NavbarPosition = ' + navbarPosition); } /** @@ -142,6 +152,7 @@ class NavBarConfiguration { maxHeight: maxHeight, minHeight: minHeight, showNavHorizontal: showNavHorizontal, + direction: direction, realWidth: realWidth, realHeight: realHeight, xCoordinate: xCoordinate, @@ -154,13 +165,22 @@ class NavBarConfiguration { * set nav bar custom configuration */ public setCustomConfiguration(configInfo) { + Log.showInfo(TAG, `deviceInfo.deviceType` + deviceInfo.deviceType); + + let screenFactor; + if (deviceInfo.deviceType === 'tablet') { + screenFactor = configInfo.direction === 1 ? 1280 : 800; + } else { + screenFactor = 360; + } + //导航栏水平布局 if (configInfo.showNavHorizontal) { if (configInfo.realHeight == 0) { Log.showInfo(TAG, `hide navbar`); - } else if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode - configInfo.realHeight = 44 * configInfo.maxWidth / 1280; + } else if (deviceInfo.deviceType === 'tablet') { // Pad、PC Mode + configInfo.realHeight = 44 * configInfo.maxWidth / screenFactor; } else { // Phone Mode - configInfo.realHeight = 36 * configInfo.maxWidth / 360; + configInfo.realHeight = (configInfo.realHeight * (configInfo.maxHeight > configInfo.maxWidth ? configInfo.maxWidth : configInfo.maxHeight)) / screenFactor; } configInfo.minHeight = configInfo.realHeight; if (configInfo.yCoordinate > 0) { @@ -169,10 +189,10 @@ class NavBarConfiguration { } else { if (configInfo.realWidth == 0) { Log.showInfo(TAG, `hide navbar`); - } else if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode - configInfo.realWidth = 44 * configInfo.maxWidth / 1280; + } else if (deviceInfo.deviceType === 'tablet') { // Pad、PC Mode + configInfo.realWidth = 44 * configInfo.maxWidth / screenFactor; } else { // Phone Mode - configInfo.realWidth = 36 * configInfo.maxWidth / 360; + configInfo.realWidth = (configInfo.realWidth * (configInfo.maxHeight > configInfo.maxWidth ? configInfo.maxWidth : configInfo.maxHeight)) / screenFactor; } configInfo.minHeight = configInfo.realWidth; if (configInfo.xCoordinate > 0) { diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts index 26ea39ea..f10b993d 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts @@ -22,8 +22,8 @@ import CommonStyleConfiguration from '../../../../../../../../common/src/main/et const TAG = 'StatusBarConfiguration'; var statusbarPosition; -var directionStatus; var shortSideLength = '0'; +var direction = -1; var maxWidth; var maxHeight; @@ -64,25 +64,31 @@ class StatusBarConfiguration { async getDirectionAndPosition() { Log.showInfo(TAG, 'getDirectionAndPosition'); await ResourceUtil.initResourceManager(AbilityManager.ABILITY_NAME_STATUS_BAR); - directionStatus = await ResourceUtil.getConfiguration(); + if (maxWidth > maxHeight) { + direction = 1; + } else { + direction = 2; + } let style: any = CommonStyleConfiguration.getCommonStyle() let deviceTypeInfo = style.deviceTypeInfo - if (directionStatus.direction == -1) { + if (direction == -1) { Log.showInfo(TAG, 'direction is -1'); statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) shortSideLength = deviceTypeInfo == 'phone' ? await ResourceUtil.getString($r("app.string.phone_status_bar_size_landscape")) : await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); - } else if (directionStatus.direction == 1) { + } else if (direction == 1) { + Log.showInfo(TAG, 'direction is 1'); statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_landscape")) shortSideLength = deviceTypeInfo == 'phone' ? await ResourceUtil.getString($r("app.string.phone_status_bar_size_landscape")) : await ResourceUtil.getString($r("app.string.status_bar_size_landscape")); } else { + Log.showInfo(TAG, 'direction is 2'); statusbarPosition = await ResourceUtil.getString($r("app.string.status_bar_position_portrait")) shortSideLength = deviceTypeInfo == 'phone' ? await ResourceUtil.getString($r("app.string.phone_status_bar_size_portrait")) : await ResourceUtil.getString($r("app.string.status_bar_size_portrait")); } shortSideLength = parseInt(shortSideLength) + ''; - Log.showInfo(TAG, 'directionStatus = ' + directionStatus.direction + 'statusbarPosition = ' + statusbarPosition + + Log.showInfo(TAG, 'direction = ' + direction + 'statusbarPosition = ' + statusbarPosition + 'shortSideLength = ' + shortSideLength); } @@ -125,6 +131,7 @@ class StatusBarConfiguration { minHeight: minHeight, showHorizontal: showHorizontal, ableToMaximize: ableToMaximize, + direction:direction, realWidth: realWidth, realHeight: realHeight, xCoordinate: xCoordinate, diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index b7c60dca..4a91fe4b 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -14,6 +14,9 @@ */ import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import EventManager from '../../../../../../../../common/src/main/ets/default/event/EventManager'; +import { obtainLocalEvent } from '../../../../../../../../common/src/main/ets/default/event/EventUtil'; +import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; import WindowManager, { WindowType } from '../../../../../../../../common/src/main/ets/default/WindowManager'; import TintStateManager, { TintState, TintContentInfo, getOrCreateTintContentInfo @@ -25,7 +28,7 @@ import StyleConfigurationCommon from '../../../../../../../../common/src/main/et import { StatusBarData, StatusBarBackgroundData, StatusBarComponentGroupContentData, StatusBarComponentData, StatusBarConfig } from '../common/Constants'; import StatusBarService from '../model/StatusBarService'; - +import display from '@ohos.display'; export const STATUS_BAR_LAYOUT_KEY = 'StatusBarLayout'; export const STATUS_BAR_EMPTY_WIDTH_KEY = 'StatusBarEmptyWidth'; @@ -298,6 +301,9 @@ export class StatusBarVM { componentEndPos = area.top + area.height; } if (!(componentEndPos < startPos || componentStartPos > endPos)) { + if (id === 'systemui_controlpanel' || id === 'systemui_notificationpanel') { + this.resetWindow(id, area); + } this.setComponentContent(id, group.contentColor); break; } @@ -305,6 +311,40 @@ export class StatusBarVM { } } + async resetWindow(id: string, area: Rect): Promise{ + Log.showInfo(TAG, `setComponentContent, id ${id} contentColor: ${JSON.stringify(area)}`); + let panelWidth; + let panelHeight; + let resetEventName; + let windowName; + if (id === 'systemui_notificationpanel') { + panelWidth = 804; + panelHeight = 762; + resetEventName = 'NotificationWindowResizeEvent'; + windowName = WindowType.NOTIFICATION_PANEL; + } else if (id === 'systemui_controlpanel') { + panelWidth = 804; + panelHeight = 620; + resetEventName = 'ControlWindowResizeEvent'; + windowName = WindowType.CONTROL_PANEL; + } else { + return; + } + let dis = await display.getDefaultDisplay(); + let rect = { + left: area.left + area.width - panelWidth, + top: area.height, + width: panelWidth, + height: panelHeight, + }; + EventManager.publish( + obtainLocalEvent(resetEventName, { + windowName: windowName, + rect + }) + ); + } + setComponentContent(id: string, contentColor: string): void{ Log.showInfo(TAG, `setComponentContent, id ${id} contentColor: ${contentColor}`); getOrCreateTintContentInfo(id).contentColor = contentColor; diff --git a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index aee46124..fa7b6b2f 100644 --- a/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/default/navigationBar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import deviceInfo from '@ohos.deviceInfo'; +import display from '@ohos.display'; import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; @@ -24,12 +24,41 @@ import { Want } from 'ability/want'; const TAG = 'NavigationBar_ServiceExtAbility'; class ServiceExtAbility extends ServiceExtension { + private direction :number; + async onCreate(want: Want): Promise { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, this.context); + display.on("change", (id) => { + Log.showInfo(TAG, "display change, data: " + JSON.stringify(id)) + display.getAllDisplay().then((arrayDisplay) => { + Log.showInfo(TAG, "getAllDisplay : " + JSON.stringify(arrayDisplay)) + for (let display of arrayDisplay) { + Log.showInfo(TAG, "getAllDisplay start : " + JSON.stringify(arrayDisplay)); + if (id == display.id) { + let nowDirection = -1; + if (display.width > display.height) { + nowDirection = 1; + } else { + nowDirection = 2; + } + if (nowDirection != this.direction) { + this.createNewWindow(false); + } + } + } + }) + }) + this.createNewWindow(true); + + + } + + async createNewWindow (isNewWindow : boolean) { let defaultConfigInfo = await NavBarConfiguration.getConfiguration(); let configInfo = NavBarConfiguration.setCustomConfiguration(defaultConfigInfo); + this.direction = configInfo.direction; AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config', configInfo); Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); let navigationBarRect = { @@ -38,14 +67,19 @@ class ServiceExtAbility extends ServiceExtension { width: configInfo.realWidth, height: configInfo.realHeight }; - WindowManager.createWindow(this.context, WindowType.NAVIGATION_BAR, navigationBarRect, 'pages/index') - .then(() => { - Log.showInfo(TAG, 'onCreate, createWindow success.'); - WindowManager.showWindow(WindowType.NAVIGATION_BAR).then(() => { - }).catch(e => { - }); - }) - .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); + + if (isNewWindow) { + WindowManager.createWindow(this.context, WindowType.NAVIGATION_BAR, navigationBarRect, 'pages/index') + .then(() => { + Log.showInfo(TAG, 'onCreate, createWindow success.'); + WindowManager.showWindow(WindowType.NAVIGATION_BAR).then(() => { + }).catch(e => { + }); + }) + .catch((err) => Log.showError(TAG, `Can't create window, err:${err}`)); + } else { + WindowManager.resetSizeWindow(WindowType.NAVIGATION_BAR, navigationBarRect); + } } onDestroy(): void { diff --git a/product/default/navigationBar/src/main/resources/base/element/string.json b/product/default/navigationBar/src/main/resources/base/element/string.json index 72d2bf3e..ee6513e8 100644 --- a/product/default/navigationBar/src/main/resources/base/element/string.json +++ b/product/default/navigationBar/src/main/resources/base/element/string.json @@ -2,11 +2,11 @@ "string": [ { "name": "nav_bar_size_portrait", - "value": "72" + "value": "36" }, { "name": "nav_bar_size_landscape", - "value": "72" + "value": "36" }, { "name": "nav_bar_position_portrait", @@ -30,7 +30,7 @@ }, { "name": "status_bar_position_portrait", - "value": "1" + "value": "2" }, { "name": "status_bar_position_landscape", diff --git a/product/default/navigationBar/src/main/resources/en_US/element/string.json b/product/default/navigationBar/src/main/resources/en_US/element/string.json index 2abf9254..ee6513e8 100644 --- a/product/default/navigationBar/src/main/resources/en_US/element/string.json +++ b/product/default/navigationBar/src/main/resources/en_US/element/string.json @@ -2,15 +2,15 @@ "string": [ { "name": "nav_bar_size_portrait", - "value": "72" + "value": "36" }, { "name": "nav_bar_size_landscape", - "value": "72" + "value": "36" }, { "name": "nav_bar_position_portrait", - "value": "1" + "value": "4" }, { "name": "nav_bar_position_landscape", @@ -30,7 +30,7 @@ }, { "name": "status_bar_position_portrait", - "value": "1" + "value": "2" }, { "name": "status_bar_position_landscape", diff --git a/product/default/navigationBar/src/main/resources/zh_CN/element/string.json b/product/default/navigationBar/src/main/resources/zh_CN/element/string.json index 2abf9254..ee6513e8 100644 --- a/product/default/navigationBar/src/main/resources/zh_CN/element/string.json +++ b/product/default/navigationBar/src/main/resources/zh_CN/element/string.json @@ -2,15 +2,15 @@ "string": [ { "name": "nav_bar_size_portrait", - "value": "72" + "value": "36" }, { "name": "nav_bar_size_landscape", - "value": "72" + "value": "36" }, { "name": "nav_bar_position_portrait", - "value": "1" + "value": "4" }, { "name": "nav_bar_position_landscape", @@ -30,7 +30,7 @@ }, { "name": "status_bar_position_portrait", - "value": "1" + "value": "2" }, { "name": "status_bar_position_landscape", diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index 9695c79b..0e24bebd 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -27,6 +27,7 @@ import { START_ABILITY_EVENT } from "../../../../../../../common/src/main/ets/de import MultimodalInputManager, { MultiKeyCode, } from "../../../../../../../common/src/main/ets/default/MultimodalInputManager"; +import display from "@ohos.display" const TAG = 'ControlPanel-Index' const SHOW_EVENT = "showControlCenter"; @@ -146,6 +147,20 @@ struct Index { windowName == WindowType.NOTIFICATION_PANEL && isShow && this.hideWindow(); windowName == WindowType.CONTROL_PANEL && isShow && (this.mShowAnimReady = true); }), + EventManager.subscribe('ControlWindowResizeEvent',async (args) => { + let { windowName, rect } = args; + let dis = await display.getDefaultDisplay(); + Log.showInfo(TAG, `ControlWindowResizeEvent: ${windowName}, isShow: ${rect}`); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'rect', rect); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'dis', { + width: dis.width, + height: dis.height, + }); + WindowManager.resetSizeWindow(windowName, rect).then( + ).then(() => { + }).catch((err) => { + }); + }), MultimodalInputManager.subscribeCombinationKey([MultiKeyCode.WIN, MultiKeyCode.I], (data) => { let windowInfo = WindowManager.getWindowInfo(WindowType.CONTROL_PANEL); Log.showInfo(TAG, `on CombinationKeyEvent: data: ${data}, windowInfo: ${windowInfo?.visibility}`); diff --git a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 46d41405..7695abba 100644 --- a/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/notificationpanel/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -23,6 +23,7 @@ import AbilityManager from '../../../../../../../common/src/main/ets/default/abi const TAG = 'NotificationPanel_ServiceExtAbility'; class ServiceExtAbility extends ServiceExtension { + private direction :number; async onCreate(want: Want): Promise { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, this.context); @@ -30,12 +31,25 @@ class ServiceExtAbility extends ServiceExtension { let dis = await display.getDefaultDisplay(); Log.showDebug(TAG, `onCreate, dis: ${JSON.stringify(dis)}`); - let rect = { - left: (834 * dis.width) / 1280, - top: (44 * dis.width) / 1280, - width: (402 * dis.width) / 1280, - height: (381 * dis.width) / 1280, - }; + let rect; + if (dis.width > dis.height) { // Pad、PC Mode + this.direction = 1; + rect = { + left: (834 * dis.width) / 1280, + top: (44 * dis.width) / 1280, + width: (402 * dis.width) / 1280, + height: (381 * dis.width) / 1280, + }; + } else if (dis.width < dis.height) { // Phone Mode + this.direction = 2; + rect = { + left: (390 * dis.width) / 1280, + top: (44 * dis.width) / 1280, + width: (402 * 2 * dis.width) / 1280, + height: (381 * 2* dis.width) / 1280, + }; + } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'rect', rect); AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'dis', { width: dis.width, diff --git a/product/pc/notificationpanel/src/main/ets/pages/index.ets b/product/pc/notificationpanel/src/main/ets/pages/index.ets index 9f0cf80f..93d0ffc2 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/index.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/index.ets @@ -15,6 +15,7 @@ import image from "@ohos.multimedia.image" import Log from '../../../../../../../common/src/main/ets/default/Log' +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import Notification from './notification' import WindowManager, { WindowType, @@ -25,6 +26,7 @@ import {START_ABILITY_EVENT} from "../../../../../../../common/src/main/ets/defa import MultimodalInputManager, { MultiKeyCode, } from "../../../../../../../common/src/main/ets/default/MultimodalInputManager"; +import display from "@ohos.display" const TAG = 'NotificationPanel-Index' const SHOW_EVENT = "showNotificationPanel"; @@ -116,6 +118,23 @@ struct Index { windowName == WindowType.CONTROL_PANEL && isShow && this.hideWindow(); windowName == WindowType.NOTIFICATION_PANEL && isShow && (this.mShowAnimReady = true); }), + + EventManager.subscribe('NotificationWindowResizeEvent',async (args) => { + let { windowName, rect } = args; + let dis = await display.getDefaultDisplay(); + Log.showInfo(TAG, `NotificationWindowResizeEvent: ${windowName}, isShow: ${rect}`); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'rect', rect); + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'dis', { + width: dis.width, + height: dis.height, + }); + WindowManager.resetSizeWindow(windowName, rect).then( + ).then(() => { + }).catch((err) => { + }); + }) + + , MultimodalInputManager.subscribeCombinationKey([MultiKeyCode.WIN, MultiKeyCode.N], (data) => { let windowInfo = WindowManager.getWindowInfo(WindowType.NOTIFICATION_PANEL); Log.showInfo(TAG, `on CombinationKeyEvent: data: ${data}, windowInfo: ${windowInfo?.visibility}`); diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 2b666fe0..dcd0dcbb 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -20,20 +20,49 @@ import AbilityManager from '../../../../../../../common/src/main/ets/default/abi import StatusBarConfiguration from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; import StatusBarConstants from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; import { Want } from 'ability/want'; +import display from '@ohos.display'; const TAG = 'StatusBar_ServiceExtAbility'; class ServiceExtAbility extends ServiceExtension { + private direction :number; + async onCreate(want: Want): Promise { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context); globalThis[StatusBarConstants.PLUGIN_COMPONENT_OWNER_WANT_KEY] = want; + display.on("change", (id) => { + Log.showInfo(TAG, "display change, data: " + JSON.stringify(id)) + display.getAllDisplay().then((arrayDisplay) => { + Log.showInfo(TAG, "getAllDisplay : " + JSON.stringify(arrayDisplay)) + for (let display of arrayDisplay) { + Log.showInfo(TAG, "getAllDisplay start : " + JSON.stringify(arrayDisplay)); + if (id == display.id) { + let nowDirection = -1; + if (display.width > display.height) { + nowDirection = 1; + } else { + nowDirection = 2; + } + if (nowDirection != this.direction) { + this.createNewWindow(false); + } + } + } + }) + }) + this.createNewWindow(true); + } + + async createNewWindow (isNewWindow : boolean) { let configInfo = await StatusBarConfiguration.getConfiguration(); + this.direction = configInfo.direction; + let screenFactor = this.direction === 1 ? 1280 : 800; if (configInfo.showHorizontal) { if (configInfo.realHeight == 0) { Log.showInfo(TAG, `hide statusbar`); } else { - configInfo.realHeight = (configInfo.realHeight * configInfo.maxWidth) / 1280; + configInfo.realHeight = (configInfo.realHeight * configInfo.maxWidth) / screenFactor; } configInfo.minHeight = configInfo.realHeight; if (configInfo.yCoordinate > 0) { @@ -43,7 +72,7 @@ class ServiceExtAbility extends ServiceExtension { if (configInfo.realWidth == 0) { Log.showInfo(TAG, `hide statusbar`); } else { - configInfo.realWidth = (configInfo.realWidth * configInfo.maxWidth) / 1280; + configInfo.realWidth = (configInfo.realWidth * configInfo.maxWidth) / screenFactor; } configInfo.minHeight = configInfo.realWidth; if (configInfo.xCoordinate > 0) { @@ -59,11 +88,16 @@ class ServiceExtAbility extends ServiceExtension { width: configInfo.realWidth, height: configInfo.realHeight, }; - WindowManager.createWindow(this.context, WindowType.STATUS_BAR, statusBarRect, 'pages/index').then(async () => - WindowManager.showWindow(WindowType.STATUS_BAR) - ).then(() => { - }).catch((err) => { - }); + + if (isNewWindow) { + WindowManager.createWindow(this.context, WindowType.STATUS_BAR, statusBarRect, 'pages/index').then(async () => + WindowManager.showWindow(WindowType.STATUS_BAR) + ).then(() => { + }).catch((err) => { + }); + } else { + WindowManager.resetSizeWindow(WindowType.STATUS_BAR, statusBarRect); + } } onDestroy(): void { diff --git a/product/pc/statusbar/src/main/resources/base/element/string.json b/product/pc/statusbar/src/main/resources/base/element/string.json index 24a3e1dd..c02ef3a6 100644 --- a/product/pc/statusbar/src/main/resources/base/element/string.json +++ b/product/pc/statusbar/src/main/resources/base/element/string.json @@ -10,15 +10,15 @@ }, { "name": "phone_status_bar_size_portrait", - "value": "90" + "value": "54" }, { "name": "phone_status_bar_size_landscape", - "value": "90" + "value": "54" }, { "name": "status_bar_position_portrait", - "value": "1" + "value": "2" }, { "name": "status_bar_position_landscape", diff --git a/product/pc/statusbar/src/main/resources/en_US/element/string.json b/product/pc/statusbar/src/main/resources/en_US/element/string.json index 3cca72ae..d32ab2bf 100644 --- a/product/pc/statusbar/src/main/resources/en_US/element/string.json +++ b/product/pc/statusbar/src/main/resources/en_US/element/string.json @@ -10,7 +10,7 @@ }, { "name": "status_bar_position_portrait", - "value": "1" + "value": "2" }, { "name": "status_bar_position_landscape", diff --git a/product/pc/statusbar/src/main/resources/zh_CN/element/string.json b/product/pc/statusbar/src/main/resources/zh_CN/element/string.json index 06f5d7fd..a958d64f 100644 --- a/product/pc/statusbar/src/main/resources/zh_CN/element/string.json +++ b/product/pc/statusbar/src/main/resources/zh_CN/element/string.json @@ -10,7 +10,7 @@ }, { "name": "status_bar_position_portrait", - "value": "1" + "value": "2" }, { "name": "status_bar_position_landscape", diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts index 83420454..91036813 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -15,15 +15,16 @@ import StyleManager from './StyleManager'; import Constants from './constants'; +import deviceInfo from '@ohos.deviceInfo'; const TAG = 'DropdownPanel-StyleConfiguration'; export class ControlStyle { - statusBarHeight: Length = $r('app.float.status_bar_height'); + statusBarHeight: Length = deviceInfo.deviceType === 'phone' ? $r("app.float.phone_status_bar_height") : $r('app.float.status_bar_height'); } export class NotificationStyle { - statusBarHeight: Length = $r('app.float.status_bar_height'); + statusBarHeight: Length = deviceInfo.deviceType === 'phone' ? $r("app.float.phone_status_bar_height") : $r('app.float.status_bar_height'); deleteAllImageWidth: Length = $r('app.float.delete_all_image_width'); deleteAllImageHeight: Length = $r('app.float.delete_all_image_height'); deleteAllImageBorderRadius: Length = $r('app.float.delete_all_image_border_radius'); diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 511c3515..386eee69 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -30,6 +30,7 @@ import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil' import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT } from '../../../../../../../common/src/main/ets/default/timemanager' +import deviceInfo from '@ohos.deviceInfo'; const TAG = 'DropdownPanel-notification' const IMAGE_SIZE_L = 24; @@ -39,6 +40,7 @@ const TIME_TEXT_MARGIN = 4; const CENTER_TITLE_MARGIN_TOP = 12; const TIME_BOTTOM_OFFSET = 7; const CENTER_MARGIN = 12; +const deviceTypeInfo = deviceInfo.deviceType; @Component export default struct Notification { @@ -165,7 +167,7 @@ struct statusBar { } } } - .height($r("app.float.status_bar_height")) + .height(deviceTypeInfo === 'phone' ? $r("app.float.phone_status_bar_height") : $r("app.float.status_bar_height")) .width('100%') .padding({ top: $r("app.float.status_bar_padding_top_bottom"), diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/float.json b/product/phone/dropdownpanel/src/main/resources/base/element/float.json index 9b88ba6b..9f7acd89 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/float.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/float.json @@ -2,7 +2,11 @@ "float": [ { "name": "status_bar_height", - "value": "30vp" + "value": "46vp" + }, + { + "name": "phone_status_bar_height", + "value": "39vp" }, { "name": "notification_delete_all", diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/string.json b/product/phone/dropdownpanel/src/main/resources/base/element/string.json index 5e7a9e0e..f09fabbf 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/string.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/string.json @@ -86,11 +86,11 @@ }, { "name": "nav_bar_size_landscape", - "value": "72" + "value": "36" }, { "name": "status_bar_position_portrait", - "value": "1" + "value": "2" }, { "name": "nav_bar_position_portrait", @@ -102,7 +102,7 @@ }, { "name": "nav_bar_size_portrait", - "value": "72" + "value": "36" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json b/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json index a088da13..a23b5c57 100644 --- a/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json +++ b/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json @@ -86,15 +86,15 @@ }, { "name": "nav_bar_size_landscape", - "value": "72" + "value": "36" }, { "name": "status_bar_position_portrait", - "value": "1" + "value": "2" }, { "name": "nav_bar_position_portrait", - "value": "1" + "value": "4" }, { "name": "status_bar_size_portrait", @@ -102,7 +102,7 @@ }, { "name": "nav_bar_size_portrait", - "value": "72" + "value": "36" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json b/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json index 1f5d3ed3..f09fabbf 100644 --- a/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json +++ b/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json @@ -86,15 +86,15 @@ }, { "name": "nav_bar_size_landscape", - "value": "72" + "value": "36" }, { "name": "status_bar_position_portrait", - "value": "1" + "value": "2" }, { "name": "nav_bar_position_portrait", - "value": "1" + "value": "4" }, { "name": "status_bar_size_portrait", @@ -102,7 +102,7 @@ }, { "name": "nav_bar_size_portrait", - "value": "72" + "value": "36" } ] } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index 22d3d2a0..7f6a7fcb 100644 --- a/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/phone/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -13,6 +13,7 @@ * limitations under the License. */ +import display from '@ohos.display'; import ServiceExtension from '@ohos.application.ServiceExtensionAbility'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/WindowManager'; @@ -20,17 +21,72 @@ import AbilityManager from '../../../../../../../common/src/main/ets/default/abi import StatusBarConfiguration from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration'; import StatusBarConstants from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/common/Constants'; import { Want } from 'ability/want'; - +import deviceInfo from '@ohos.deviceInfo'; const TAG = 'StatusBar_ServiceExtAbility'; +const deviceTypeInfo = deviceInfo.deviceType; class ServiceExtAbility extends ServiceExtension { + private direction :number; + async onCreate(want: Want): Promise { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); AbilityManager.setContext(AbilityManager.ABILITY_NAME_STATUS_BAR, this.context); globalThis[StatusBarConstants.PLUGIN_COMPONENT_OWNER_WANT_KEY] = want; + display.on("change", (id) => { + Log.showInfo(TAG, "display change, data: " + JSON.stringify(id)) + display.getAllDisplay().then((arrayDisplay) => { + Log.showInfo(TAG, "getAllDisplay : " + JSON.stringify(arrayDisplay)) + for (let display of arrayDisplay) { + Log.showInfo(TAG, "getAllDisplay start : " + JSON.stringify(arrayDisplay)); + if (id == display.id) { + let nowDirection = -1; + if (display.width > display.height) { + nowDirection = 1; + } else { + nowDirection = 2; + } + if (nowDirection != this.direction) { + this.createNewWindow(false); + } + } + } + }) + }) + this.createNewWindow(true); + } + async createNewWindow (isNewWindow : boolean) { let configInfo = await StatusBarConfiguration.getConfiguration(); + this.direction = configInfo.direction; + let screenFactor; + if (deviceTypeInfo === 'phone') { + screenFactor = this.direction === 1 ? 1188 : 540; + } else { + screenFactor = this.direction === 1 ? 640 : 360; + } + if (configInfo.showHorizontal) { + if (configInfo.realHeight == 0) { + Log.showInfo(TAG, `hide statusbar`); + } else { + configInfo.realHeight = (configInfo.realHeight * configInfo.maxWidth) / screenFactor; + } + configInfo.minHeight = configInfo.realHeight; + if (configInfo.yCoordinate > 0) { + configInfo.yCoordinate = configInfo.maxHeight - configInfo.realHeight; + } + } else { + if (configInfo.realWidth == 0) { + Log.showInfo(TAG, `hide statusbar`); + } else { + configInfo.realWidth = (configInfo.realWidth * configInfo.maxWidth) / screenFactor; + } + configInfo.minHeight = configInfo.realWidth; + if (configInfo.xCoordinate > 0) { + configInfo.xCoordinate = configInfo.maxWidth - configInfo.realWidth; + } + } + AbilityManager.setAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config', configInfo); Log.showDebug(TAG, `onCreate, configInfo: ${JSON.stringify(configInfo)}`); @@ -40,11 +96,15 @@ class ServiceExtAbility extends ServiceExtension { width: configInfo.realWidth, height: configInfo.realHeight }; - WindowManager.createWindow(this.context, WindowType.STATUS_BAR, statusBarRect, 'pages/index').then(async () => - WindowManager.showWindow(WindowType.STATUS_BAR) - ).then(() => { - }).catch((err) => { - }); + if (isNewWindow) { + WindowManager.createWindow(this.context, WindowType.STATUS_BAR, statusBarRect, 'pages/index').then(async () => + WindowManager.showWindow(WindowType.STATUS_BAR) + ).then(() => { + }).catch((err) => { + }); + } else { + WindowManager.resetSizeWindow(WindowType.STATUS_BAR, statusBarRect); + } } onDestroy(): void { diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index 5d6ff36f..96d84f5f 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -108,6 +108,18 @@ struct Index { .constraintSize({ minHeight: this.StatusMinH }) .onAreaChange((e, e2) => { Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); + let statusBarData: StatusBarData = new StatusBarData(); + statusBarData.displayWidth = configInfo.maxWidth; + statusBarData.displayHeight = configInfo.maxHeight; + statusBarData.showHorizontal = configInfo.showHorizontal; + statusBarData.ableToMaximize = configInfo.ableToMaximize; + statusBarData.realWidth = configInfo.realWidth; + statusBarData.realHeight = configInfo.realHeight; + statusBarData.left = configInfo.xCoordinate; + statusBarData.top = configInfo.yCoordinate; + StatusBarVM.updateStatusBarData(statusBarData); + this.mStatusBarData = StatusBarVM.getStatusBarData(); }) } @@ -131,7 +143,9 @@ struct Index { } onDropdown() { - Log.showDebug(TAG, `onDropdown`) + Log.showDebug(TAG, `this.mStatusBarData ` + JSON.stringify(this.mStatusBarData) ) + Log.showDebug(TAG, `this.mStatusBarData.showHorizontal` + this.mStatusBarData.showHorizontal) + Log.showDebug(TAG, `this.mStatusBarData.ableToMaximize` + this.mStatusBarData.ableToMaximize) if (!this.mStatusBarData.showHorizontal || !this.mStatusBarData.ableToMaximize) { return } diff --git a/product/phone/statusbar/src/main/resources/base/element/string.json b/product/phone/statusbar/src/main/resources/base/element/string.json index c42709b9..f2eb8806 100644 --- a/product/phone/statusbar/src/main/resources/base/element/string.json +++ b/product/phone/statusbar/src/main/resources/base/element/string.json @@ -2,19 +2,19 @@ "string": [ { "name": "status_bar_size_portrait", - "value": "30" + "value": "36" }, { "name": "status_bar_size_landscape", - "value": "30" + "value": "36" }, { "name": "phone_status_bar_size_portrait", - "value": "90" + "value": "54" }, { "name": "phone_status_bar_size_landscape", - "value": "90" + "value": "54" }, { "name": "status_bar_position_landscape", @@ -22,7 +22,7 @@ }, { "name": "status_bar_position_portrait", - "value": "1" + "value": "2" }, { "name": "app_name", diff --git a/product/phone/statusbar/src/main/resources/en_US/element/string.json b/product/phone/statusbar/src/main/resources/en_US/element/string.json index 8e0c98e1..04c679a9 100644 --- a/product/phone/statusbar/src/main/resources/en_US/element/string.json +++ b/product/phone/statusbar/src/main/resources/en_US/element/string.json @@ -6,7 +6,7 @@ }, { "name": "status_bar_position_portrait", - "value": "1" + "value": "2" }, { "name": "app_name", diff --git a/product/phone/statusbar/src/main/resources/zh_CN/element/string.json b/product/phone/statusbar/src/main/resources/zh_CN/element/string.json index e43da9dd..fd677cbb 100644 --- a/product/phone/statusbar/src/main/resources/zh_CN/element/string.json +++ b/product/phone/statusbar/src/main/resources/zh_CN/element/string.json @@ -6,7 +6,7 @@ }, { "name": "status_bar_position_portrait", - "value": "1" + "value": "2" }, { "name": "app_name", -- Gitee From 5a8616d22ed2a7c676d35ffb8cac809ef2b28407 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Sat, 30 Jul 2022 09:37:41 +0800 Subject: [PATCH 216/373] =?UTF-8?q?SystemUI=E6=94=AF=E6=8C=81=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=97=8B=E8=BD=AC=E5=B1=8F=E5=B9=95=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E9=80=82=E9=85=8D=E7=AB=96=E5=B1=8FUI=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../view/NotificationListComponent.ets | 1 - .../noticeItem/view/item/actionComponent.ets | 6 +-- .../view/item/bannerNotificationItem.ets | 16 ++++---- .../ohos/noticeItem/view/item/customItem.ets | 4 +- .../ohos/noticeItem/view/item/generalItem.ets | 4 +- .../view/item/iconListComponent.ets | 8 ++-- .../noticeItem/view/item/notificationItem.ets | 10 ++--- ...{ViewModel.ts => NotificationViewModel.ts} | 10 ++--- .../src/main/ets/pages/bannerNotification.ets | 16 ++++---- .../src/main/ets/pages/index.ets | 5 +-- .../src/main/ets/pages/notification.ets | 4 +- .../ServiceExtAbility/ServiceExtAbility.ts | 2 +- .../src/main/ets/pages/bannerNotification.ets | 4 +- .../src/main/ets/pages/notification.ets | 34 +++++++-------- .../statusbar/src/main/ets/pages/index.ets | 41 ++++++++----------- 15 files changed, 77 insertions(+), 88 deletions(-) rename features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/{ViewModel.ts => NotificationViewModel.ts} (98%) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index edad3e9e..e7e61b07 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -17,7 +17,6 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log'; import Constants, {NotificationLayout as Layout} from '../common/constants'; import NotificationItem from './item/notificationItem' import GroupNotificationItem from './item/groupItem' -import ViewModel from '../viewmodel/ViewModel' const TAG = 'NoticeItem-NotificationListComponent'; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets index bfdf349d..ef1ce1f5 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets @@ -15,7 +15,7 @@ import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; -import ViewModel from '../../viewmodel/ViewModel'; +import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import Constants, {InputActionButtonData, NotificationLayout as Layout} from '../../common/constants'; const TAG = 'NoticeItem-ActionComponent'; @@ -46,7 +46,7 @@ export default struct ActionComponent { content: item.title, clickEvent: () => { if (CheckEmptyUtils.isEmpty(item.userInput)) { - ViewModel.clickItem(this.itemData, item.wantAgent); + NotificationViewModel.clickItem(this.itemData, item.wantAgent); } else { this.inputData = { inputKey: item.userInput.inputKey, wantAgent: item.wantAgent }; } @@ -67,7 +67,7 @@ export default struct ActionComponent { .width(Layout.INPUT_IMAGE_SIZE) .height(Layout.INPUT_IMAGE_SIZE) .onClick(() => { - ViewModel.clickReply(this.inputData.inputKey, this.placeholder, this.inputData.wantAgent); + NotificationViewModel.clickReply(this.inputData.inputKey, this.placeholder, this.inputData.wantAgent); this.inputActionData = { isSending: true, content: this.placeholder diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets index 20b28125..516d37e4 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/bannerNotificationItem.ets @@ -14,10 +14,10 @@ */ import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; -import AbilityManager from '../../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' -import WindowManager, { WindowType } from '../../../../../../../../../../common/src/main/ets/default/WindowManager' +import AbilityManager from '../../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; +import WindowManager, { WindowType } from '../../../../../../../../../../common/src/main/ets/default/WindowManager'; import Constants, {NotificationLayout as Layout} from '../../common/constants'; -import ViewModel from '../../viewmodel/ViewModel'; +import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import CustomItem from './customItem'; import titleItem from './titleItem'; import basicItem from './basicItem'; @@ -28,8 +28,8 @@ import ActionComponent from './actionComponent'; import DevicesDialog from './devicesDialog'; import WantAgent from '@ohos.wantAgent'; -const TAG = 'NoticeItem-BannerNotificationItem' -const INTERVAL = 5 * 1000 +const TAG = 'NoticeItem-BannerNotificationItem'; +const INTERVAL = 5 * 1000; @Component @@ -186,7 +186,7 @@ export default struct BannerNotificationItem { showDevicesDialog() { Log.showInfo(TAG, `showDevicesDialog`); if (!this.want?.distributedOption?.isDistributed) { - ViewModel.clickItem(this.want); + NotificationViewModel.clickItem(this.want); this.onBannerNoticeHide(); return; } @@ -197,7 +197,7 @@ export default struct BannerNotificationItem { if (!wantData?.deviceId) { this.devicesDialogController.open(); } else{ - ViewModel.clickItem(this.want); + NotificationViewModel.clickItem(this.want); } this.onBannerNoticeHide(); }) @@ -213,7 +213,7 @@ export default struct BannerNotificationItem { permission: '', extraInfo: {} }; - ViewModel.clickDistributionItem(this.want, triggerInfo) + NotificationViewModel.clickDistributionItem(this.want, triggerInfo) } refreshLastActionTime() { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets index 54a575c1..3ab63fdb 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -15,7 +15,7 @@ import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; -import ViewModel from '../../viewmodel/ViewModel'; +import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import NotificationManager from '../../model/NotificationManager'; import {NotificationLayout as Layout} from '../../common/constants'; @@ -32,7 +32,7 @@ export default struct CustomItem { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`); - this.template = ViewModel.getPluginTempLate(this.customItemData.template.name); + this.template = NotificationViewModel.getPluginTempLate(this.customItemData.template.name); this.templateData = this.customItemData.template.data; this.isDebugMode = NotificationManager.isDebugMode(TAG); Log.showInfo(TAG, `template = ${JSON.stringify(this.template)} templateData = ${JSON.stringify(this.templateData)} isDebugMode = ${this.isDebugMode}`); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index c42af851..e3954cf9 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -21,7 +21,7 @@ import pictureItem from './pictureItem'; import titleItem from './titleItem'; import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; import CheckEmptyUtils from '../../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; -import ViewModel from '../../viewmodel/ViewModel'; +import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import ActionComponent from './actionComponent'; const TAG = 'NoticeItem-GeneralItem'; @@ -49,7 +49,7 @@ export default struct GeneralItem { this.hasPicture = true; } this.needExpand = this.checkItemNeedExpand(); - ViewModel.getDistributedDeviceName(this.itemData).then((deviceName) => { + NotificationViewModel.getDistributedDeviceName(this.itemData).then((deviceName) => { this.distributedDeviceName = deviceName; }) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets index 83d5f7b9..e53e5f25 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -17,7 +17,7 @@ import Constants, { NotificationLayout as Layout } from '../../common/constants' import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; import SettingDialog from './settingDialog'; import ConfirmDialog from './confirmDialog' -import ViewModel from '../../viewmodel/ViewModel'; +import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import deviceInfo from '@ohos.deviceInfo'; const deviceTypeInfo = deviceInfo.deviceType; @@ -57,7 +57,7 @@ export default struct IconListComponent { builder: ConfirmDialog({ title: $r('app.string.closeNovice'), bundleName: this.itemData.name, - action: () => ViewModel.enableNotification(this.itemData, false) + action: () => NotificationViewModel.enableNotification(this.itemData, false) }), autoCancel: false, alignment: deviceTypeInfo === 'phone' ? DialogAlignment.Bottom : DialogAlignment.Default, @@ -76,10 +76,10 @@ export default struct IconListComponent { callback: () => { if (!this.isGroup) { Log.showInfo(TAG, `click delete hashcode: ${this.itemData?.hashcode}`); - ViewModel.removeNotificationItem(this.itemData, true) + NotificationViewModel.removeNotificationItem(this.itemData, true) } else { Log.showInfo(TAG, `click delete groupName: ${this.itemData?.groupName}`); - ViewModel.removeGroupNotification(this.itemData, true) + NotificationViewModel.removeGroupNotification(this.itemData, true) } } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 5d9e60e1..cbf2ce66 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -17,7 +17,7 @@ import Constants, {NotificationLayout as Layout} from '../../common/constants'; import GeneralItem from './generalItem'; import CustomItem from './customItem'; import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; -import ViewModel from '../../viewmodel/ViewModel'; +import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import DevicesDialog from './devicesDialog'; import WantAgent from '@ohos.wantAgent'; import IconListComponent, {getIconListSize} from './iconListComponent'; @@ -99,7 +99,7 @@ struct FrontItem { showDevicesDialog() { Log.showInfo(TAG, `showDevicesDialog isDistributed: ${this.itemData?.distributedOption?.isDistributed}`); if (!this.itemData?.distributedOption?.isDistributed) { - ViewModel.clickItem(this.itemData); + NotificationViewModel.clickItem(this.itemData); return; } let wantAgent = this.itemData?.want; @@ -110,11 +110,11 @@ struct FrontItem { if (!want?.deviceId) { this.devicesDialogController.open() } else { - ViewModel.clickItem(this.itemData); + NotificationViewModel.clickItem(this.itemData); } }) } else { - ViewModel.clickItem(this.itemData); + NotificationViewModel.clickItem(this.itemData); } } @@ -127,7 +127,7 @@ struct FrontItem { permission: '', extraInfo: {} }; - ViewModel.clickDistributionItem(this.itemData, triggerInfo) + NotificationViewModel.clickDistributionItem(this.itemData, triggerInfo) } } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts similarity index 98% rename from features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts rename to features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts index 3bf4ed4f..0ae3ecba 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/NotificationViewModel.ts @@ -18,8 +18,8 @@ import SwitchUserManager from '../../../../../../../../../common/src/main/ets/de import media from '@ohos.multimedia.media'; import vibrator from '@ohos.vibrator'; import wantAgent from '@ohos.wantAgent'; -import Notification from '@ohos.notification' -import NotificationService from '../model/NotificationService' +import Notification from '@ohos.notification'; +import NotificationService from '../model/NotificationService'; import NotificationWindowManager from '../model/NotificationWindowManager'; import NotificationConfig from '../model/NotificationConfig'; import CheckEmptyUtils from '../../../../../../../../../common/src/main/ets/default/CheckEmptyUtils'; @@ -34,7 +34,7 @@ const TAG = 'NotificationViewModel'; /** * Notification ViewModel class. */ -export class ViewModel { +export class NotificationViewModel { audioPlayer: any; mNotificationList: NotificationItemData[]; mCallback: any; @@ -408,6 +408,6 @@ export class ViewModel { } } -let viewModel = new ViewModel(); +let notificationViewModel = new NotificationViewModel(); -export default viewModel ; \ No newline at end of file +export default notificationViewModel ; \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets index ddae1413..fd9a1c05 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets @@ -13,15 +13,15 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' -import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager" -import BannerNotification from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/item/bannernotificationitem' -import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/viewmodel'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager'; +import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager"; +import BannerNotification from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/item/bannernotificationitem'; +import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/NotificationViewModel'; import NotificationConstants, { ScreenLockStatus } from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/common/constants'; -const TAG = 'NotificationPanel-BannerNotification' +const TAG = 'NotificationPanel-BannerNotification'; @Entry @@ -101,7 +101,7 @@ struct Index { return; } this.pageData = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'itemData'); - ViewModel.getDistributedDeviceName(this.pageData).then((deviceName) => { + NotificationViewModel.getDistributedDeviceName(this.pageData).then((deviceName) => { this.distributedDeviceName = deviceName; }) this.needExpand = this.checkItemNeedExpand() diff --git a/product/pc/notificationpanel/src/main/ets/pages/index.ets b/product/pc/notificationpanel/src/main/ets/pages/index.ets index 93d0ffc2..f0ca0881 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/index.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/index.ets @@ -118,7 +118,6 @@ struct Index { windowName == WindowType.CONTROL_PANEL && isShow && this.hideWindow(); windowName == WindowType.NOTIFICATION_PANEL && isShow && (this.mShowAnimReady = true); }), - EventManager.subscribe('NotificationWindowResizeEvent',async (args) => { let { windowName, rect } = args; let dis = await display.getDefaultDisplay(); @@ -132,9 +131,7 @@ struct Index { ).then(() => { }).catch((err) => { }); - }) - - , + }), MultimodalInputManager.subscribeCombinationKey([MultiKeyCode.WIN, MultiKeyCode.N], (data) => { let windowInfo = WindowManager.getWindowInfo(WindowType.NOTIFICATION_PANEL); Log.showInfo(TAG, `on CombinationKeyEvent: data: ${data}, windowInfo: ${windowInfo?.visibility}`); diff --git a/product/pc/notificationpanel/src/main/ets/pages/notification.ets b/product/pc/notificationpanel/src/main/ets/pages/notification.ets index 0da4fd1d..6d2f62d2 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/notification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/notification.ets @@ -18,7 +18,7 @@ import Log from '../../../../../../../common/src/main/ets/default/Log' import EventManager from "../../../../../../../common/src/main/ets/default/event/eventmanager" import {obtainStartAbility} from "../../../../../../../common/src/main/ets/default/event/eventutil" import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/notificationlistcomponent' -import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/viewmodel' +import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/NotificationViewModel' const TAG = 'NotificationPanel-notification' const NO_NOTIFICATION_TOP_MARGIN = 40; @@ -95,7 +95,7 @@ struct CenterTitle { .height(NOTIFICATION_ICON_SIZE) .margin({ right: NOTIFICATION_TITLE_MARGIN }) .onClick(() => { - ViewModel.removeAllNotifications(); + NotificationViewModel.removeAllNotifications(); }) } .height(NOTIFICATION_TITLE_HEIGHT) diff --git a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts index dcd0dcbb..96ec00f9 100644 --- a/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts +++ b/product/pc/statusbar/src/main/ets/ServiceExtAbility/ServiceExtAbility.ts @@ -25,7 +25,7 @@ import display from '@ohos.display'; const TAG = 'StatusBar_ServiceExtAbility'; class ServiceExtAbility extends ServiceExtension { - private direction :number; + private direction : number; async onCreate(want: Want): Promise { Log.showInfo(TAG, `onCreate, want: ${JSON.stringify(want)}`); diff --git a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets index aa7c7c58..17eba5bc 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets @@ -18,7 +18,7 @@ import AbilityManager from '../../../../../../../common/src/main/ets/default/abi import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager" import BannerNotification from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/item/bannernotificationitem' -import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/viewmodel'; +import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/NotificationViewModel'; import NotificationConstants, { ScreenLockStatus } from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/common/constants'; const TAG = 'DropdownPanel-BannerNotification' @@ -100,7 +100,7 @@ struct Index { return; } this.pageData = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_BANNER_NOTICE, 'itemData'); - ViewModel.getDistributedDeviceName(this.pageData).then((deviceName) => { + NotificationViewModel.getDistributedDeviceName(this.pageData).then((deviceName) => { this.distributedDeviceName = deviceName; }) this.needExpand = this.checkItemNeedExpand() diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 386eee69..431b7aa9 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -14,25 +14,25 @@ */ import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import Log from '../../../../../../../common/src/main/ets/default/Log' -import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/eventmanager" -import { obtainStartAbility } from "../../../../../../../common/src/main/ets/default/event/eventutil" -import Constants from './common/constants' -import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryicon' -import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockicon' -import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiicon' -import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/statusbariconitembluetoothcomponent' -import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalicon' -import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/statusbariconitemlocationcomponent' -import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/statusbariconitemringmodecomponent' -import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/notificationlistcomponent' -import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/viewmodel' -import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil' +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/eventmanager"; +import { obtainStartAbility } from "../../../../../../../common/src/main/ets/default/event/eventutil"; +import Constants from './common/constants'; +import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryicon'; +import ClockIcon from '../../../../../../../features/clockcomponent/src/main/ets/default/pages/clockicon'; +import WifiIcon from '../../../../../../../features/wificomponent/src/main/ets/default/pages/wifiicon'; +import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/main/ets/com/ohos/pages/statusbariconitembluetoothcomponent'; +import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalicon'; +import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/statusbariconitemlocationcomponent'; +import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/statusbariconitemringmodecomponent'; +import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/notificationlistcomponent'; +import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/NotificationViewModel'; +import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil'; import TimeManager, { TimeEventArgs, TIME_CHANGE_EVENT -} from '../../../../../../../common/src/main/ets/default/timemanager' +} from '../../../../../../../common/src/main/ets/default/timemanager'; import deviceInfo from '@ohos.deviceInfo'; -const TAG = 'DropdownPanel-notification' +const TAG = 'DropdownPanel-notification'; const IMAGE_SIZE_L = 24; const BGC_SIZE_L = 40; const NO_NOTIFICATION_TOP_MARGIN = 40; @@ -101,7 +101,7 @@ export default struct Notification { .borderRadius(BGC_SIZE_L) .backgroundColor($r('app.color.notification_delete_all_background')) .onClick(() => { - ViewModel.removeAllNotifications(); + NotificationViewModel.removeAllNotifications(); }) } }.onTouch(this.touchEvent.bind(this)) diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index 96d84f5f..902417f0 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -52,18 +52,7 @@ struct Index { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear, start`); - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); - let statusBarData: StatusBarData = new StatusBarData(); - statusBarData.displayWidth = configInfo.maxWidth; - statusBarData.displayHeight = configInfo.maxHeight; - statusBarData.showHorizontal = configInfo.showHorizontal; - statusBarData.ableToMaximize = configInfo.ableToMaximize; - statusBarData.realWidth = configInfo.realWidth; - statusBarData.realHeight = configInfo.realHeight; - statusBarData.left = configInfo.xCoordinate; - statusBarData.top = configInfo.yCoordinate; - StatusBarVM.updateStatusBarData(statusBarData); - this.mStatusBarData = StatusBarVM.getStatusBarData(); + this.updateStatusBarData(); setAppBgColor('#00000000'); StyleManager.setStyle(); @@ -108,21 +97,25 @@ struct Index { .constraintSize({ minHeight: this.StatusMinH }) .onAreaChange((e, e2) => { Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); - let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); - let statusBarData: StatusBarData = new StatusBarData(); - statusBarData.displayWidth = configInfo.maxWidth; - statusBarData.displayHeight = configInfo.maxHeight; - statusBarData.showHorizontal = configInfo.showHorizontal; - statusBarData.ableToMaximize = configInfo.ableToMaximize; - statusBarData.realWidth = configInfo.realWidth; - statusBarData.realHeight = configInfo.realHeight; - statusBarData.left = configInfo.xCoordinate; - statusBarData.top = configInfo.yCoordinate; - StatusBarVM.updateStatusBarData(statusBarData); - this.mStatusBarData = StatusBarVM.getStatusBarData(); + this.updateStatusBarData(); }) } + updateStatusBarData() { + let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); + let statusBarData: StatusBarData = new StatusBarData(); + statusBarData.displayWidth = configInfo.maxWidth; + statusBarData.displayHeight = configInfo.maxHeight; + statusBarData.showHorizontal = configInfo.showHorizontal; + statusBarData.ableToMaximize = configInfo.ableToMaximize; + statusBarData.realWidth = configInfo.realWidth; + statusBarData.realHeight = configInfo.realHeight; + statusBarData.left = configInfo.xCoordinate; + statusBarData.top = configInfo.yCoordinate; + StatusBarVM.updateStatusBarData(statusBarData); + this.mStatusBarData = StatusBarVM.getStatusBarData(); + } + touchEvent(event: TouchEvent) { Trace.start(Trace.CORE_METHOD_START_TOUCHEVENT) Log.showDebug(TAG, 'touchEvent' + event.touches) -- Gitee From b34b7c47dc535ca00af1b5f228728a851019951c Mon Sep 17 00:00:00 2001 From: yangpeng85 Date: Sat, 30 Jul 2022 16:40:42 +0800 Subject: [PATCH 217/373] support show/hide Wallpaper component when window show/hide Signed-off-by: yangpeng85 --- .../ets/com/ohos/model/screenLockModel.ts | 2 ++ .../ets/com/ohos/view/component/wallpaper.ets | 9 ++++-- .../ets/com/ohos/vm/wallpaperViewModel.ts | 30 ++++++++++++++++--- .../pc/src/main/ets/pages/slidescreenlock.ets | 6 ++-- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts index d383ff92..53d1a9da 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockModel.ts @@ -67,6 +67,7 @@ export default class ScreenLockModel { } showScreenLockWindow(callback: Callback) { + AppStorage.SetOrCreate('isWallpaperShow', true); windowManager.find(Constants.WIN_NAME).then((win) => { win.show().then(() => { Log.showInfo(TAG, `window show`); @@ -82,6 +83,7 @@ export default class ScreenLockModel { win.hide().then(() => { Log.showInfo(TAG, `window hide`); callback(); + AppStorage.SetOrCreate('isWallpaperShow', false); }) }) } diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets b/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets index e6806c3b..9d52c981 100644 --- a/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets +++ b/features/wallpapercomponent/src/main/ets/com/ohos/view/component/wallpaper.ets @@ -24,12 +24,17 @@ export default struct Wallpaper { @State mViewModel: ViewModel = new ViewModel() aboutToAppear() { - Log.showInfo(TAG, `aboutToAppear`) + Log.showInfo(TAG, "aboutToAppear") this.mViewModel.ViewModelInit() } + aboutToDisappear() { + Log.showInfo(TAG, "aboutToDisappear") + this.mViewModel.ViewModelDestroy() + } + build() { - Image(this.mViewModel.screenlockWallpaper) + Image(this.mViewModel.getWallpaperData()) .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) .objectFit(ImageFit.Cover) diff --git a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts index 54ca48b1..ee410b20 100644 --- a/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts +++ b/features/wallpapercomponent/src/main/ets/com/ohos/vm/wallpaperViewModel.ts @@ -13,19 +13,29 @@ * limitations under the License. */ +import image from '@ohos.multimedia.image'; import WallpaperMar from '@ohos.wallpaper' import Log from '../../../../../../../../common/src/main/ets/default/Log' const TAG = 'ScreenLock-WallpaperViewModel' export default class WallpaperViewModel { - screenlockWallpaper: string = '' + private wallpaperData: image.PixelMap = undefined - ViewModelInit(): void{ - Log.showDebug(TAG, 'ViewModelInit'); + ViewModelInit(): void { + Log.showDebug(TAG, "ViewModelInit"); this.getScreenLockWallpaper() } + ViewModelDestroy(): void { + Log.showDebug(TAG, "ViewModelDestroy"); + this.freeScreenLockWallpaper(); + } + + getWallpaperData() { + return this.wallpaperData; + } + private getScreenLockWallpaper() { Log.showInfo(TAG, 'getScreenLockWallpaper'); WallpaperMar.getPixelMap(WallpaperMar.WallpaperType.WALLPAPER_LOCKSCREEN, (error, data) => { @@ -33,8 +43,20 @@ export default class WallpaperViewModel { Log.showError(TAG, 'getScreenLockWallpaper error:' + JSON.stringify(error)); } else { Log.showDebug(TAG, 'getScreenLockWallpaper data:' + JSON.stringify(data)); - this.screenlockWallpaper = data + this.wallpaperData = data } }) } + + private freeScreenLockWallpaper() { + Log.showInfo(TAG, 'free ScreenLockWallpaper'); + if (typeof this.wallpaperData === 'undefined' || this.wallpaperData == null) { + return; + } + this.wallpaperData.release().then(() => { + Log.showDebug(TAG, 'release succeed'); + }).catch((err) => { + Log.showDebug(TAG, `release failed ${err}`); + }) + } } diff --git a/product/pc/src/main/ets/pages/slidescreenlock.ets b/product/pc/src/main/ets/pages/slidescreenlock.ets index 44e688b8..879ceeb2 100644 --- a/product/pc/src/main/ets/pages/slidescreenlock.ets +++ b/product/pc/src/main/ets/pages/slidescreenlock.ets @@ -13,7 +13,6 @@ * limitations under the License. */ -import Trace from '../../../../../../common/src/main/ets/default/Trace' import Log from '../../../../../../common/src/main/ets/default/Log' import Accounts from '../../../../../../features/screenlock/src/main/ets/com/ohos/view/component/accounts' import DateTime from '../../../../../../features/datetimecomponent/src/main/ets/com/ohos/view/component/dateTime' @@ -34,6 +33,7 @@ export default struct SlideScreenlock { @StorageLink('batteryCharging') @Watch('onCharging') batteryCharging: boolean = false @Prop @Watch("onStatusChange") pageStatus: number @StorageLink('deviceStatus') @Watch('onDeviceStatusChange') deviceStatus: string = "" + @StorageLink('isWallpaperShow') isWallpaperShow: boolean = true private mHeightPx : number = 44 aboutToAppear() { @@ -56,7 +56,9 @@ export default struct SlideScreenlock { build() { Stack({ alignContent: Alignment.Bottom }) { Column() { - Wallpaper() + if (this.isWallpaperShow === true) { + Wallpaper() + } } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) -- Gitee From 432b3d45eb708f8f2a0c6bcb748360d7ef2d46f6 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Mon, 1 Aug 2022 10:55:46 +0800 Subject: [PATCH 218/373] =?UTF-8?q?=E8=BF=9B=E5=BA=A6=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=B9=E6=8D=AEhashcode=E5=92=8C=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=88=B3=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts | 2 +- .../ets/com/ohos/noticeItem/view/NotificationListComponent.ets | 2 +- .../src/main/ets/com/ohos/noticeItem/view/item/customItem.ets | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index b3c62052..48ace44d 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -67,7 +67,6 @@ export default class ParseDataUtil { want: request.wantAgent, bundleName: request.creatorBundleName, actionButtons: request.actionButtons, - smallIcon: NotificationConfig.USE_NOTIFICATION_ICON ? (request?.smallIcon ?? appMessage.icon) : appMessage.icon, largeIcon: request.largeIcon, slotLevel: sortingMap?.sortings[request?.hashCode]?.slot?.level, source: request.source, @@ -81,6 +80,7 @@ export default class ParseDataUtil { distributedOption: request.distributedOption, deviceId: request.deviceId, groupName: request.groupName??request.hashcode, + smallIcon: NotificationConfig.USE_NOTIFICATION_ICON ? (request?.smallIcon ?? appMessage.icon) : appMessage.icon, tapDismissed: request.tapDismissed }; Log.showInfo(TAG, `notificationItem construct over`); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index edad3e9e..a7ed701b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -56,7 +56,7 @@ export default struct NotificationListComponent { NotificationItem({ itemData: item[0] }) } } - }, (list: any) => JSON.stringify(list.map((item) => item.hashcode))) + }, (list: any) => JSON.stringify(list.map((item) => `${item.hashcode}_${item.timestamp}`))) } .align(Alignment.Top) .width('100%') diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets index 54a575c1..95bd4553 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/customItem.ets @@ -49,7 +49,7 @@ export default struct CustomItem { }).onError(({errcode, msg}) => { Log.showInfo(TAG, `Error code:${errcode} message:${msg}`); }) - .size({ width: 200, height: 110 }) + .size({ width: '100%', height: 110 }) } .margin({ left: Layout.ITEM_MARGIN, right: Layout.ITEM_MARGIN }) .onClick(() => { -- Gitee From e04c25356ac91a985dfaf6dd5717ce687977ff5e Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Tue, 2 Aug 2022 14:33:21 +0800 Subject: [PATCH 219/373] nfc function Signed-off-by: xuchangzhou --- common/src/main/ets/default/Constants.ts | 10 ++ .../ohos/pages/SimpleToggleLoadComponent.ets | 8 ++ features/nfccomponent/build-profile.json5 | 8 ++ features/nfccomponent/hvigorfile.js | 17 ++++ features/nfccomponent/package.json | 12 +++ .../src/main/ets/com/ohos/common/Constants.ts | 25 +++++ .../ets/com/ohos/common/StyleConfiguration.ts | 39 ++++++++ .../main/ets/com/ohos/model/NFCModeService.ts | 95 +++++++++++++++++++ .../ControlCenterSimpleToggleNFComponent.ets | 75 +++++++++++++++ .../pages/StatusBarIconItemNFComponent.ets | 60 ++++++++++++ .../main/ets/com/ohos/viewmodel/NFCModeVM.ts | 72 ++++++++++++++ features/nfccomponent/src/main/module.json5 | 10 ++ .../main/resources/base/element/color.json | 8 ++ .../main/resources/base/element/float.json | 16 ++++ .../main/resources/base/element/string.json | 8 ++ .../base/media/ic_notification_nfc.svg | 13 +++ .../base/media/ic_notification_nfc_filled.svg | 3 + .../resources/base/media/ic_statusbar_nfc.svg | 3 + .../main/resources/en_US/element/string.json | 8 ++ .../main/resources/phone/element/float.json | 16 ++++ .../phone/media/ic_notification_nfc.svg | 13 +++ .../media/ic_notification_nfc_filled.svg | 3 + .../phone/media/ic_statusbar_nfc.svg | 3 + .../media/ic_statusbar_ring_off_filled.svg | 17 ++++ .../phone/media/ic_statusbar_vibration_on.svg | 11 +++ .../main/resources/zh_CN/element/string.json | 8 ++ .../ets/com/ohos/pages/StatusBarComponent.ets | 4 + .../resources/base/media/ic_statusbar_nfc.svg | 3 + .../main/resources/base/element/string.json | 4 + .../base/media/ic_notification_nfc.svg | 13 +++ .../base/media/ic_notification_nfc_filled.svg | 3 + .../main/resources/en_US/element/string.json | 4 + .../main/resources/zh_CN/element/string.json | 4 + .../resources/base/media/ic_statusbar_nfc.svg | 3 + .../ets/pages/common/ControlCenterConfig.ts | 4 +- .../src/main/ets/pages/control.ets | 5 + .../src/main/ets/pages/notification.ets | 5 + .../main/resources/base/element/string.json | 4 + .../base/media/ic_notification_nfc.svg | 13 +++ .../base/media/ic_notification_nfc_filled.svg | 3 + .../main/resources/en_US/element/string.json | 4 + .../main/resources/zh_CN/element/string.json | 4 + .../main/ets/pages/common/StatusbarConfig.ts | 2 + .../resources/base/media/ic_statusbar_nfc.svg | 3 + .../phone/media/ic_statusbar_nfc.svg | 3 + 45 files changed, 647 insertions(+), 2 deletions(-) create mode 100644 features/nfccomponent/build-profile.json5 create mode 100644 features/nfccomponent/hvigorfile.js create mode 100644 features/nfccomponent/package.json create mode 100644 features/nfccomponent/src/main/ets/com/ohos/common/Constants.ts create mode 100644 features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts create mode 100644 features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts create mode 100644 features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets create mode 100644 features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets create mode 100644 features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts create mode 100644 features/nfccomponent/src/main/module.json5 create mode 100644 features/nfccomponent/src/main/resources/base/element/color.json create mode 100644 features/nfccomponent/src/main/resources/base/element/float.json create mode 100644 features/nfccomponent/src/main/resources/base/element/string.json create mode 100644 features/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg create mode 100644 features/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg create mode 100644 features/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg create mode 100644 features/nfccomponent/src/main/resources/en_US/element/string.json create mode 100644 features/nfccomponent/src/main/resources/phone/element/float.json create mode 100644 features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg create mode 100644 features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg create mode 100644 features/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg create mode 100644 features/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg create mode 100644 features/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg create mode 100644 features/nfccomponent/src/main/resources/zh_CN/element/string.json create mode 100644 features/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc.svg create mode 100644 product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg create mode 100644 product/pc/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg create mode 100644 product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg create mode 100644 product/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg create mode 100644 product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg diff --git a/common/src/main/ets/default/Constants.ts b/common/src/main/ets/default/Constants.ts index 0981db9d..148d9949 100644 --- a/common/src/main/ets/default/Constants.ts +++ b/common/src/main/ets/default/Constants.ts @@ -14,6 +14,7 @@ * limitations under the License. */ import Window from '@ohos.window'; +import parameter from '@ohos.systemparameter'; export interface Rect { left: number; @@ -52,4 +53,13 @@ export enum FASlotName { RING_MODE = 'ring_mode', SIGNAL = 'signal', WIFI = 'wifi', + NFC = 'nfc', } + +export function isNfcAvailable(){ + if (parameter.getSync("const.SystemCapability.Communication.NFC.Core", "false") == "false"){ + return false + } else { + return true + } + } diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets index 1469ac34..0261a985 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets @@ -13,10 +13,12 @@ * limitations under the License. */ +import {isNfcAvailable} from '../../../../../../../../common/src/main/ets/default/Constants'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import {FASlotName} from '../../../../../../../../common/src/main/ets/default/Constants'; import LocationComponent from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleLocationComponent'; import RingModeComponent from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleRingModeComponent'; +import NFCComponent from '../../../../../../../nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent'; import SimpleToggleComponent from './SimpleToggleComponent'; const TAG = 'SimpleToggleLoadComponent'; @@ -49,6 +51,12 @@ export default struct SimpleToggleLoadComponent { mEditMode: this.mEditMode, mDragMode: this.mDragMode, }) + } else if (this.keyId == FASlotName.NFC && isNfcAvailable()) { + NFCComponent({ + keyId: this.keyId, + mEditMode: this.mEditMode, + mDragMode: this.mDragMode, + }) } else { SimpleToggleComponent({ keyId: this.keyId, diff --git a/features/nfccomponent/build-profile.json5 b/features/nfccomponent/build-profile.json5 new file mode 100644 index 00000000..55d2b110 --- /dev/null +++ b/features/nfccomponent/build-profile.json5 @@ -0,0 +1,8 @@ +{ + "apiType": 'stageMode', + "targets": [ + { + "name": "default", + } + ] +} \ No newline at end of file diff --git a/features/nfccomponent/hvigorfile.js b/features/nfccomponent/hvigorfile.js new file mode 100644 index 00000000..fdb4fcea --- /dev/null +++ b/features/nfccomponent/hvigorfile.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2022 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. + */ + +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/features/nfccomponent/package.json b/features/nfccomponent/package.json new file mode 100644 index 00000000..134ac526 --- /dev/null +++ b/features/nfccomponent/package.json @@ -0,0 +1,12 @@ +{ + "name": "@ohos/nfccomponent", + "version": "1.0.0", + "description": "a npm package which contains nfccomponent function", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "module" + }, + "dependencies": { + } +} diff --git a/features/nfccomponent/src/main/ets/com/ohos/common/Constants.ts b/features/nfccomponent/src/main/ets/com/ohos/common/Constants.ts new file mode 100644 index 00000000..422dc35e --- /dev/null +++ b/features/nfccomponent/src/main/ets/com/ohos/common/Constants.ts @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2021-2022 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 nfcController from '@ohos.nfc.controller'; + +export default class Constants { +} +export enum NFCMode { + NFC_MODE_OFF = 1, + NFC_MODE_TURNING_ON = 2, + NFC_MODE_ON = 3, + NFC_MODE_TURNING_OFF = 4 +} \ No newline at end of file diff --git a/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts new file mode 100644 index 00000000..dadf7ae1 --- /dev/null +++ b/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021-2022 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 StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; + +const TAG = 'capsule-StyleConfiguration'; + +export class StatusRingModeComponentStyle { + statusBarRingModeWidth: Length = $r('app.float.status_bar_ring_mode_width'); + statusBarRingModeHeight: Length = $r('app.float.status_bar_ring_mode_height'); +} + +export class ControlCenterRingModeComponentStyle { + onBgColor: ResourceStr = $r('app.color.control_center_complex_toggle_ring_mode_on_bg_color'); +} + +export default class StyleConfiguration { + static getStatusRingModeComponentStyle(): StatusRingModeComponentStyle { + const key: string = TAG + '-StatusRingMode'; + return StyleManager.getStyle(key, StatusRingModeComponentStyle); + } + + static getControlCenterRingModeComponentStyle(): ControlCenterRingModeComponentStyle { + const key: string = TAG + '-ControlCenterRingMode'; + return StyleManager.getStyle(key, ControlCenterRingModeComponentStyle); + } +} \ No newline at end of file diff --git a/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts b/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts new file mode 100644 index 00000000..72ffc464 --- /dev/null +++ b/features/nfccomponent/src/main/ets/com/ohos/model/NFCModeService.ts @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2021-2022 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 nfcController from '@ohos.nfc.controller'; +import { BusinessError } from 'basic'; +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import { NFCMode } from '../common/Constants'; + +const TAG = 'NFCModel'; + +export interface NFCModeStatusListener { + updateNFCMode(status: NFCMode): void; +} + +export class NFCModeService { + mIsStart = false; + mListeners = new Set(); + mNFCManager: any; + + startService(): void { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, 'startService'); + this.mIsStart = true; + + this.mNFCManager = nfcController + + this.getNFCMode(); + + this.mNFCManager.on('nfcStateChange', (data: NFCMode) => { + Log.showInfo(TAG, `startService->nfcStateChange, data: ${JSON.stringify(data)}`); + this.mListeners.forEach(listener => listener.updateNFCMode(data)); + }); + } + + stopService(): void { + if (!this.mIsStart) { + return; + } + Log.showInfo(TAG, 'stopService'); + this.mIsStart = false; + + this.mNFCManager = null; + } + + registerListener(listener: NFCModeStatusListener): void { + let res = this.mListeners.add(listener); + Log.showInfo(TAG, `registser nfcMode Listener ${res}`); + } + + unregisterListener(listener: NFCModeStatusListener): void { + let res = this.mListeners.delete(listener); + Log.showInfo(TAG, `unregistser nfcMode Listener ${res}`); + } + + getNFCMode(): void { + let action = this.mNFCManager.getNfcState(); + Log.showInfo(TAG, `getNFCMode${action}`); + this.mListeners.forEach(listener => listener.updateNFCMode(action)); + } + + setNFCMode(mode: NFCMode): void { + Log.showInfo(TAG, `setNFCMode, mode: ${JSON.stringify(mode)}`); + switch (mode) { + case NFCMode.NFC_MODE_OFF: + this.mNFCManager.openNfc(); + Log.showInfo(TAG, `openNFC`); + break; + case NFCMode.NFC_MODE_ON: + this.mNFCManager.closeNfc(); + Log.showInfo(TAG, `closeNFC`); + break; + default: + break; + } + } +} + +let sNFCModeService = createOrGet(NFCModeService, TAG); + +export default sNFCModeService; \ No newline at end of file diff --git a/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets b/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets new file mode 100644 index 00000000..a9ff1ba0 --- /dev/null +++ b/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import EventManager from "../../../../../../../../common/src/main/ets/default/event/EventManager"; +import { obtainStartAbility } from "../../../../../../../../common/src/main/ets/default/event/EventUtil"; +import { NFCMode } from '../common/Constants'; +import ViewModel from '../viewmodel/NFCModeVM'; +import SimpleToggleBase from '../../../../../../../../common/src/main/ets/template/SimpleToggleBase'; + +const TAG = 'nfcmode-ControlCenterSimpleToggleNFComponent'; + +@Component +export default struct ControlCenterSimpleToggleNFComponent { + private keyId: string; + private mEditMode: boolean = false; + private mDragMode: boolean = false; + @State mIcon: Resource = $r("app.media.ic_notification_nfc"); + @State mLabel: Resource = $r("app.string.control_center_complex_toggle_nfc_mode_title"); + @State mDefaultChangeSwitch: boolean = false; + @StorageLink('NFCModeComponentMode') @Watch('onNFCModeUpdated') NFCModeComponentMode: NFCMode = NFCMode.NFC_MODE_OFF; + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear'); + ViewModel.initViewModel(); + this.onNFCModeUpdated('NFCModeComponentMode'); + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear'); + } + + onNFCModeUpdated(propName: string): void { + Log.showInfo(TAG, `onNFCModeUpdated, propName: ${propName} NFCModeComponentMode: ${JSON.stringify(this.NFCModeComponentMode)}`); + if (this.NFCModeComponentMode == NFCMode.NFC_MODE_OFF) { + this.mIcon = $r("app.media.ic_notification_nfc"); + this.mDefaultChangeSwitch = false; + } else if (this.NFCModeComponentMode == NFCMode.NFC_MODE_ON) { + this.mIcon = $r("app.media.ic_notification_nfc_filled"); + this.mDefaultChangeSwitch = true; + } + } + + build() { + SimpleToggleBase({ + mToggleId: this.keyId, + mIcon: $mIcon, + mChangeSwitch: this.mDefaultChangeSwitch, + mLabel: $mLabel, + mEditMode: this.mEditMode, + mDragMode: this.mDragMode, + mClickEvent: () => this.mClickEvent() + }) + } + + mClickEvent() { + Log.showInfo(TAG, `mClickEvent---${this.NFCModeComponentMode}`); + if (this.NFCModeComponentMode == NFCMode.NFC_MODE_OFF) { + ViewModel.setNFCMode(NFCMode.NFC_MODE_OFF) + } else if (this.NFCModeComponentMode == NFCMode.NFC_MODE_ON) { + ViewModel.setNFCMode(NFCMode.NFC_MODE_ON) + } + } +} \ No newline at end of file diff --git a/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets b/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets new file mode 100644 index 00000000..6e9f7c2d --- /dev/null +++ b/features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent.ets @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { TintContentInfo } from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import StyleConfigurationCommon, { CommonStyle +} from '../../../../../../../../common/src/main/ets/default/StyleConfiguration'; +import StyleConfiguration, { StatusRingModeComponentStyle } from '../common/StyleConfiguration'; +import Constants, { NFCMode } from '../common/Constants'; +import ViewModel from '../viewmodel/NFCModeVM'; + +const TAG = 'nfcmode-StatusBarIconItemNFCModeComponent'; + +@Component +export default struct StatusBarIconItemNFCModeComponent { + @StorageLink('NFCModeComponentMode') NFCModeComponentMode: NFCMode = NFCMode.NFC_MODE_OFF; + @State mTintContentInfo: TintContentInfo = ViewModel.getTintContentInfo(); + @State styleCommon: CommonStyle = StyleConfigurationCommon.getCommonStyle(); + @State style: StatusRingModeComponentStyle = StyleConfiguration.getStatusRingModeComponentStyle(); + private ringModeIcons: any; + + aboutToAppear() { + Log.showInfo(TAG, 'aboutToAppear'); + this.ringModeIcons = {}; + this.ringModeIcons['0'] = $r("app.media.ic_statusbar_nfc"); + ViewModel.initViewModel(); + } + + aboutToDisappear() { + Log.showInfo(TAG, 'aboutToDisappear'); + } + + build() { + Row() { + if (this.NFCModeComponentMode != NFCMode.NFC_MODE_OFF) { + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + Image(this.ringModeIcons['0']) + .objectFit(ImageFit.Contain) + .width(this.style.statusBarRingModeWidth) + .height(this.style.statusBarRingModeHeight) + .fillColor(this.mTintContentInfo.contentColor) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') + } + } + .height('100%') + .opacity($r("app.float.icon_component_opacity")) + } +} \ No newline at end of file diff --git a/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts b/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts new file mode 100644 index 00000000..08af953f --- /dev/null +++ b/features/nfccomponent/src/main/ets/com/ohos/viewmodel/NFCModeVM.ts @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2021-2022 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 parameter from '@ohos.systemparameter' +import Log from '../../../../../../../../common/src/main/ets/default/Log'; +import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants'; +import { TintContentInfo, getOrCreateTintContentInfo +} from '../../../../../../../../common/src/main/ets/default/TintStateManager'; +import createOrGet from '../../../../../../../../common/src/main/ets/default/SingleInstanceHelper'; +import { NFCMode } from '../common/Constants'; +import NFCModeService from '../model/NFCModeService'; + +export const NFC_MODE_COMPONENT_MODE_KEY = 'NFCModeComponentMode'; + +const TAG = 'NFCModeVM'; + +export class NFCModeVM { + mIsStart = false; + mNFCModeComponentMode: SubscribedAbstractProperty; + mTintContentInfo: TintContentInfo = getOrCreateTintContentInfo(FASlotName.NFC); + + constructor() { + Log.showInfo(TAG, 'constructor'); + } + + initViewModel(): void { + if (this.mIsStart) { + return; + } + Log.showInfo(TAG, 'initViewModel '); + this.mIsStart = true; + + this.mNFCModeComponentMode = AppStorage.SetAndLink(NFC_MODE_COMPONENT_MODE_KEY, NFCMode.NFC_MODE_OFF); + + NFCModeService.registerListener(this); + NFCModeService.startService(); + } + + updateNFCMode(mode: NFCMode): void { + Log.showInfo(TAG, `updateNFCMode, mode: ${JSON.stringify(mode)} `); + this.mNFCModeComponentMode.set(mode); + } + + setNFCMode(mode: NFCMode): void { + Log.showInfo(TAG, `setNFCMode, mode: ${JSON.stringify(mode)} `); + NFCModeService.setNFCMode(mode); + } + + getTintContentInfo(): TintContentInfo { + return this.mTintContentInfo; + } + + isSupported(): string { + return parameter.getSync("const.SystemCapability.Communication.NFC.Core", "false") + } +} + +let sNFCModeVM = createOrGet(NFCModeVM, TAG); + +export default sNFCModeVM; \ No newline at end of file diff --git a/features/nfccomponent/src/main/module.json5 b/features/nfccomponent/src/main/module.json5 new file mode 100644 index 00000000..86635985 --- /dev/null +++ b/features/nfccomponent/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "nfccomponent", + "type": "har", + "deviceTypes": [ + "phone", + ], + "uiSyntax": "ets" + } +} \ No newline at end of file diff --git a/features/nfccomponent/src/main/resources/base/element/color.json b/features/nfccomponent/src/main/resources/base/element/color.json new file mode 100644 index 00000000..216cdb7a --- /dev/null +++ b/features/nfccomponent/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "control_center_complex_toggle_ring_mode_on_bg_color", + "value": "#FF007DFF" + } + ] +} \ No newline at end of file diff --git a/features/nfccomponent/src/main/resources/base/element/float.json b/features/nfccomponent/src/main/resources/base/element/float.json new file mode 100644 index 00000000..39818bf8 --- /dev/null +++ b/features/nfccomponent/src/main/resources/base/element/float.json @@ -0,0 +1,16 @@ +{ + "float": [ + { + "name": "status_bar_ring_mode_width", + "value": "27vp" + }, + { + "name": "status_bar_ring_mode_height", + "value": "24vp" + }, + { + "name": "icon_component_opacity", + "value": "1" + } + ] +} \ No newline at end of file diff --git a/features/nfccomponent/src/main/resources/base/element/string.json b/features/nfccomponent/src/main/resources/base/element/string.json new file mode 100644 index 00000000..31bfd23d --- /dev/null +++ b/features/nfccomponent/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "control_center_complex_toggle_nfc_mode_title", + "value": "NFC" + } + ] +} diff --git a/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg b/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg new file mode 100644 index 00000000..4ca3b48a --- /dev/null +++ b/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg b/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg new file mode 100644 index 00000000..4f1cbd22 --- /dev/null +++ b/features/nfccomponent/src/main/resources/base/media/ic_notification_nfc_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/features/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg b/features/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg new file mode 100644 index 00000000..6e8d735a --- /dev/null +++ b/features/nfccomponent/src/main/resources/base/media/ic_statusbar_nfc.svg @@ -0,0 +1,3 @@ + + + diff --git a/features/nfccomponent/src/main/resources/en_US/element/string.json b/features/nfccomponent/src/main/resources/en_US/element/string.json new file mode 100644 index 00000000..31bfd23d --- /dev/null +++ b/features/nfccomponent/src/main/resources/en_US/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "control_center_complex_toggle_nfc_mode_title", + "value": "NFC" + } + ] +} diff --git a/features/nfccomponent/src/main/resources/phone/element/float.json b/features/nfccomponent/src/main/resources/phone/element/float.json new file mode 100644 index 00000000..bd03a7bb --- /dev/null +++ b/features/nfccomponent/src/main/resources/phone/element/float.json @@ -0,0 +1,16 @@ +{ + "float": [ + { + "name": "status_bar_ring_mode_width", + "value": "17vp" + }, + { + "name": "status_bar_ring_mode_height", + "value": "15vp" + }, + { + "name": "icon_component_opacity", + "value": "0.7" + } + ] +} \ No newline at end of file diff --git a/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg b/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg new file mode 100644 index 00000000..4ca3b48a --- /dev/null +++ b/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg b/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg new file mode 100644 index 00000000..4f1cbd22 --- /dev/null +++ b/features/nfccomponent/src/main/resources/phone/media/ic_notification_nfc_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg b/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg new file mode 100644 index 00000000..6e8d735a --- /dev/null +++ b/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_nfc.svg @@ -0,0 +1,3 @@ + + + diff --git a/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg b/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg new file mode 100644 index 00000000..3ca44fb7 --- /dev/null +++ b/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_ring_off_filled.svg @@ -0,0 +1,17 @@ + + + ic_statusbar_mute + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg b/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg new file mode 100644 index 00000000..8a7f6951 --- /dev/null +++ b/features/nfccomponent/src/main/resources/phone/media/ic_statusbar_vibration_on.svg @@ -0,0 +1,11 @@ + + + ic_statusbar_vibration_on + + + + + + + + \ No newline at end of file diff --git a/features/nfccomponent/src/main/resources/zh_CN/element/string.json b/features/nfccomponent/src/main/resources/zh_CN/element/string.json new file mode 100644 index 00000000..31bfd23d --- /dev/null +++ b/features/nfccomponent/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "control_center_complex_toggle_nfc_mode_title", + "value": "NFC" + } + ] +} diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index ad15dd96..ef9184f4 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import {isNfcAvailable} from '../../../../../../../../common/src/main/ets/default/Constants'; import Log from '../../../../../../../../common/src/main/ets/default/Log' import { StatusBarData, StatusBarBackgroundData, StatusBarConfig } from '../common/Constants' import { FASlotName } from '../../../../../../../../common/src/main/ets/default/Constants' @@ -31,6 +32,7 @@ import SignalIcon from '../../../../../../../signalcomponent/src/main/ets/defaul import CapsuleIcon from '../../../../../../../capsulecomponent/src/main/ets/default/pages/CapsuleIcon' import LocationIcon from '../../../../../../../locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' import RingModeIcon from '../../../../../../../ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' +import NfcIcon from '../../../../../../../nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent' const TAG = 'StatusBarComponent' const TAG_StatusBarGroup = 'StatusBarGroup' @@ -268,6 +270,8 @@ struct StatusBarItemLoadComponent { LocationIcon() } else if (this.mComponentName == FASlotName.RING_MODE) { RingModeIcon() + } else if (this.mComponentName == FASlotName.NFC && isNfcAvailable()) { + NfcIcon() } else { IconItemComponent({ keyId: this.mComponentName diff --git a/features/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg b/features/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg new file mode 100644 index 00000000..6e8d735a --- /dev/null +++ b/features/statusbarcomponent/src/main/resources/base/media/ic_statusbar_nfc.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/pc/controlpanel/src/main/resources/base/element/string.json b/product/pc/controlpanel/src/main/resources/base/element/string.json index db3fc9a5..7e049b2e 100644 --- a/product/pc/controlpanel/src/main/resources/base/element/string.json +++ b/product/pc/controlpanel/src/main/resources/base/element/string.json @@ -31,6 +31,10 @@ { "name": "control_center_complex_toggle_ring_mode_title_vibration", "value": "振动" + }, + { + "name": "control_center_complex_toggle_nfc_mode_title", + "value": "NFC" } ] } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc.svg b/product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc.svg new file mode 100644 index 00000000..4ca3b48a --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg b/product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg new file mode 100644 index 00000000..4f1cbd22 --- /dev/null +++ b/product/pc/controlpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/pc/controlpanel/src/main/resources/en_US/element/string.json b/product/pc/controlpanel/src/main/resources/en_US/element/string.json index 149ca86b..715b6070 100644 --- a/product/pc/controlpanel/src/main/resources/en_US/element/string.json +++ b/product/pc/controlpanel/src/main/resources/en_US/element/string.json @@ -31,6 +31,10 @@ { "name": "control_center_complex_toggle_ring_mode_title_vibration", "value": "Vibration" + }, + { + "name": "control_center_complex_toggle_nfc_mode_title", + "value": "NFC" } ] } \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/resources/zh_CN/element/string.json b/product/pc/controlpanel/src/main/resources/zh_CN/element/string.json index db3fc9a5..7e049b2e 100644 --- a/product/pc/controlpanel/src/main/resources/zh_CN/element/string.json +++ b/product/pc/controlpanel/src/main/resources/zh_CN/element/string.json @@ -31,6 +31,10 @@ { "name": "control_center_complex_toggle_ring_mode_title_vibration", "value": "振动" + }, + { + "name": "control_center_complex_toggle_nfc_mode_title", + "value": "NFC" } ] } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg new file mode 100644 index 00000000..6e8d735a --- /dev/null +++ b/product/pc/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts index 7d711c7b..2acd106d 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/ControlCenterConfig.ts @@ -18,10 +18,10 @@ import { ControlCenterConfig const controlCenterConfig: ControlCenterConfig = { ComplexToggleLayout: [FASlotName.WIFI, FASlotName.BLUETOOTH], - DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION, 'demosystemuicplmeta'], + DefaultSimpleToggleLayout: ["screenshot", FASlotName.RING_MODE, FASlotName.LOCATION, 'demosystemuicplmeta', FASlotName.NFC], LocalToggles: { ComplexToggles: [FASlotName.AIR_PLANE, FASlotName.BLUETOOTH, FASlotName.WIFI], - SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE], + SimpleToggles: [FASlotName.LOCATION, FASlotName.RING_MODE, FASlotName.NFC], }, MetaToggles: [ { diff --git a/product/phone/dropdownpanel/src/main/ets/pages/control.ets b/product/phone/dropdownpanel/src/main/ets/pages/control.ets index f475b887..cf997991 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/control.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/control.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import {isNfcAvailable} from '../../../../../../../common/src/main/ets/default/Constants'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import ControlCenterComponent from '../../../../../../../features/controlcentercomponent/src/main/ets/com/ohos/pages/ControlCenterComponent' import BatteryIcon from '../../../../../../../features/batterycomponent/src/main/ets/default/pages/batteryIcon' @@ -22,6 +23,7 @@ import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/ import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalIcon' import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/StatusBarIconItemLocationComponent' import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/StatusBarIconItemRingModeComponent' +import NfcIcon from '../../../../../../../features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent' import Log from '../../../../../../../common/src/main/ets/default/Log' import Constants from './common/constants' import StyleConfiguration, { ControlStyle } from './common/StyleConfiguration' @@ -137,6 +139,9 @@ struct statusBar { LocationIcon() BluetoothIcon() RingModeIcon() + if( isNfcAvailable() ){ + NfcIcon() + } BatteryIcon() ClockIcon() } diff --git a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets index 431b7aa9..febb0489 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/notification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/notification.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import {isNfcAvailable} from '../../../../../../../common/src/main/ets/default/Constants'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/eventmanager"; @@ -25,6 +26,7 @@ import BluetoothIcon from '../../../../../../../features/bluetoothcomponent/src/ import SignalIcon from '../../../../../../../features/signalcomponent/src/main/ets/default/pages/signalicon'; import LocationIcon from '../../../../../../../features/locationcomponent/src/main/ets/com/ohos/pages/statusbariconitemlocationcomponent'; import RingModeIcon from '../../../../../../../features/ringmodecomponent/src/main/ets/com/ohos/pages/statusbariconitemringmodecomponent'; +import NfcIcon from '../../../../../../../features/nfccomponent/src/main/ets/com/ohos/pages/StatusBarIconItemNFComponent'; import NotificationListComponent from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/notificationlistcomponent'; import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/NotificationViewModel'; import ResourceUtil from '../../../../../../../common/src/main/ets/default/ResourceUtil'; @@ -161,6 +163,9 @@ struct statusBar { LocationIcon() BluetoothIcon() RingModeIcon() + if(isNfcAvailable()){ + NfcIcon() + } BatteryIcon() ClockIcon() } diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/string.json b/product/phone/dropdownpanel/src/main/resources/base/element/string.json index f09fabbf..17e54cbe 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/string.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/string.json @@ -103,6 +103,10 @@ { "name": "nav_bar_size_portrait", "value": "36" + }, + { + "name": "control_center_complex_toggle_nfc_mode_title", + "value": "NFC" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg new file mode 100644 index 00000000..4ca3b48a --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg b/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg new file mode 100644 index 00000000..4f1cbd22 --- /dev/null +++ b/product/phone/dropdownpanel/src/main/resources/base/media/ic_notification_nfc_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json b/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json index a23b5c57..1e720c97 100644 --- a/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json +++ b/product/phone/dropdownpanel/src/main/resources/en_US/element/string.json @@ -103,6 +103,10 @@ { "name": "nav_bar_size_portrait", "value": "36" + }, + { + "name": "control_center_complex_toggle_nfc_mode_title", + "value": "NFC" } ] } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json b/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json index f09fabbf..17e54cbe 100644 --- a/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json +++ b/product/phone/dropdownpanel/src/main/resources/zh_CN/element/string.json @@ -103,6 +103,10 @@ { "name": "nav_bar_size_portrait", "value": "36" + }, + { + "name": "control_center_complex_toggle_nfc_mode_title", + "value": "NFC" } ] } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts b/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts index ef681e62..8c025785 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StatusbarConfig.ts @@ -39,6 +39,7 @@ const statusbarConfig: StatusBarConfig = { FASlotName.LOCATION, FASlotName.BLUETOOTH, FASlotName.RING_MODE, + FASlotName.NFC, FASlotName.BATTERY, FASlotName.CLOCK, ], @@ -52,6 +53,7 @@ const statusbarConfig: StatusBarConfig = { FASlotName.LOCATION, FASlotName.NOTIFICATION, FASlotName.RING_MODE, + FASlotName.NFC, FASlotName.SIGNAL, FASlotName.WIFI, ], diff --git a/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg new file mode 100644 index 00000000..6e8d735a --- /dev/null +++ b/product/phone/statusbar/src/main/resources/base/media/ic_statusbar_nfc.svg @@ -0,0 +1,3 @@ + + + diff --git a/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg new file mode 100644 index 00000000..6e8d735a --- /dev/null +++ b/product/phone/statusbar/src/main/resources/phone/media/ic_statusbar_nfc.svg @@ -0,0 +1,3 @@ + + + -- Gitee From 409058131b47350952730244c9c7b4031e873269 Mon Sep 17 00:00:00 2001 From: yangpeng85 Date: Tue, 2 Aug 2022 15:06:36 +0800 Subject: [PATCH 220/373] support show/hide Wallpaper component when window show/hide for Phone Signed-off-by: yangpeng85 --- product/phone/src/main/ets/pages/slidescreenlock.ets | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets index 274dbc0f..808b76e2 100644 --- a/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -32,6 +32,7 @@ export default struct SlideScreenlock { @StorageLink('batteryCharging') @Watch('onCharging') batteryCharging: boolean = false @Prop @Watch("onStatusChange") pageStatus: number @StorageLink('deviceStatus') @Watch('onDeviceStatusChange') deviceStatus: string = "" + @StorageLink('isWallpaperShow') isWallpaperShow: boolean = true private mHeightPx : number = 48 aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) @@ -53,7 +54,9 @@ export default struct SlideScreenlock { build() { Stack({ alignContent: Alignment.Bottom }) { Column() { - Wallpaper() + if (this.isWallpaperShow === true) { + Wallpaper() + } } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) -- Gitee From 480c185026eedd462f3f42c3379eab6d248534d8 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Tue, 2 Aug 2022 22:05:59 +0800 Subject: [PATCH 221/373] =?UTF-8?q?NFC=E5=9B=BE=E6=A0=87=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- .../com/ohos/pages/SimpleToggleLoadComponent.ets | 14 ++++++++------ .../main/ets/com/ohos/pages/StatusBarComponent.ets | 6 ++++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets index 0261a985..4f0f8335 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets +++ b/features/controlcentercomponent/src/main/ets/com/ohos/pages/SimpleToggleLoadComponent.ets @@ -51,12 +51,14 @@ export default struct SimpleToggleLoadComponent { mEditMode: this.mEditMode, mDragMode: this.mDragMode, }) - } else if (this.keyId == FASlotName.NFC && isNfcAvailable()) { - NFCComponent({ - keyId: this.keyId, - mEditMode: this.mEditMode, - mDragMode: this.mDragMode, - }) + } else if (this.keyId == FASlotName.NFC) { + if (isNfcAvailable()) { + NFCComponent({ + keyId: this.keyId, + mEditMode: this.mEditMode, + mDragMode: this.mDragMode, + }) + } } else { SimpleToggleComponent({ keyId: this.keyId, diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index ef9184f4..fa543d1e 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -270,8 +270,10 @@ struct StatusBarItemLoadComponent { LocationIcon() } else if (this.mComponentName == FASlotName.RING_MODE) { RingModeIcon() - } else if (this.mComponentName == FASlotName.NFC && isNfcAvailable()) { - NfcIcon() + } else if (this.mComponentName == FASlotName.NFC) { + if (isNfcAvailable()) { + NfcIcon() + } } else { IconItemComponent({ keyId: this.mComponentName -- Gitee From 2a134e7dd7975ea4a4993791452af2b222ba8305 Mon Sep 17 00:00:00 2001 From: lizhi Date: Wed, 3 Aug 2022 10:52:15 +0800 Subject: [PATCH 222/373] =?UTF-8?q?[systemui]=E6=B7=BB=E5=8A=A0=E6=82=AC?= =?UTF-8?q?=E6=B5=AE=E9=80=9A=E7=9F=A5=E5=8A=A8=E7=94=BB=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=93=9D=E7=89=99=E6=89=AB=E6=8F=8F=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../ets/com/ohos/model/BluetoothService.ts | 1 + .../src/main/ets/pages/bannerNotification.ets | 80 +++++++++++++++++-- 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts index d130da34..f48f9a71 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/model/BluetoothService.ts @@ -49,6 +49,7 @@ export class BluetoothService { if (this.mIsBluetoothOpen != isOpen) { Log.showInfo(TAG, `state change: ${isOpen}`); this.mIsBluetoothOpen = isOpen; + bluetooth.setBluetoothScanMode(bluetooth.ScanMode.SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, 0); this.mListener?.updateState(this.mIsBluetoothOpen); } }); diff --git a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets index fd9a1c05..624ef0c8 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/bannerNotification.ets @@ -22,7 +22,31 @@ import NotificationViewModel from '../../../../../../../features/noticeitem/src/ import NotificationConstants, { ScreenLockStatus } from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/common/constants'; const TAG = 'NotificationPanel-BannerNotification'; - +const TRANSLATE_SIZE = '382vp'; +const ANIM_CONFIG = { + duration: 250, + tempo: 1.0, + curve: Curve.Friction, + delay: 0, + iterations: 1, + playMode: PlayMode.Normal, +} +const OPACITY_SHOW_ANIM_CONFIG = { + duration: 200, + tempo: 1.0, + curve: Curve.Friction, + delay: 0, + iterations: 1, + playMode: PlayMode.Normal, +} +const OPACITY_HIDE_ANIM_CONFIG = { + duration: 200, + tempo: 1.0, + curve: Curve.Friction, + delay: 50, + iterations: 1, + playMode: PlayMode.Normal, +} @Entry @Component @@ -33,13 +57,16 @@ struct Index { @State needExpand: boolean = true @State isExpand: boolean = false; @State pageData: any = {}; + @State mOpacity: number = 0.0; + @State mWidthSize: number = 0.8; + @State mTranslate: string = TRANSLATE_SIZE; mClearCallbacks: unsubscribe[] mDefaultBannerRect: any; aboutToAppear() { Log.showInfo(TAG, `aboutToAppear Start`); - AbilityManager.setContextName(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL,AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL); + AbilityManager.setContextName(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL); setAppBgColor('#00000000') this.mClearCallbacks = [] this.mClearCallbacks.push(EventManager.subscribe('onBannerNoticeShow', () => this.onBannerNoticeShow())) @@ -77,6 +104,12 @@ struct Index { .width('100%') .height('100%') .clip(true) + .opacity(this.mOpacity) + .scale({ + x: this.mWidthSize, + centerX: '100%' + }) + .translate({x: this.mTranslate}) } onBannerNoticeShow() { @@ -114,12 +147,11 @@ struct Index { WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); WindowManager.showWindow(WindowType.BANNER_NOTICE); Log.showDebug(TAG, `onBannerNoticeShow end`); + this.showWindowAnim(); } onBannerNoticeHide() { - this.mBannerNoticeCnt = 0; - WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); - WindowManager.hideWindow(WindowType.BANNER_NOTICE); + this.hideWindowAnim(); } checkItemNeedExpand() { @@ -131,4 +163,42 @@ struct Index { } } + _animateTo(config, callback) { + animateTo(config, callback); + setTimeout(config.onFinish, config.duration + config.delay); + } + + showWindowAnim() { + Log.showDebug(TAG, `show anim start`); + this._animateTo({ ...ANIM_CONFIG, onFinish: () => { + Log.showInfo(TAG, `show anim finish`); + } }, () => { + Log.showInfo(TAG, `do show anim`); + this.mWidthSize = 1.0; + this.mTranslate = '0vp'; + }); + this._animateTo({ ...OPACITY_SHOW_ANIM_CONFIG, onFinish: () => { + } }, () => { + this.mOpacity = 1.0; + }); + } + + hideWindowAnim() { + Log.showDebug(TAG, `hide anim start`); + this._animateTo({ ...ANIM_CONFIG, onFinish: () => { + Log.showInfo(TAG, `hide anim finish`); + this.mBannerNoticeCnt = 0; + WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); + WindowManager.hideWindow(WindowType.BANNER_NOTICE); + } + }, () => { + Log.showInfo(TAG, `do hide anim`); + this.mWidthSize = 0.8; + this.mTranslate = TRANSLATE_SIZE; + }); + this._animateTo({ ...OPACITY_HIDE_ANIM_CONFIG, onFinish: () => {} + }, () => { + this.mOpacity = 0.0; + }); + } } -- Gitee From 4e7d2bd780652d5322f394a4adf2b49088c47f79 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Wed, 3 Aug 2022 11:15:16 +0800 Subject: [PATCH 223/373] Opening and closing animations for secondary pages Signed-off-by: xuchangzhou --- .../ControlCenterSimpleToggleNFComponent.ets | 4 +- .../controlpanel/src/main/ets/pages/index.ets | 118 +++++++++++------- .../src/main/ets/pages/index.ets | 97 +++++++++----- 3 files changed, 142 insertions(+), 77 deletions(-) diff --git a/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets b/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets index a9ff1ba0..f54e31d2 100644 --- a/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets +++ b/features/nfccomponent/src/main/ets/com/ohos/pages/ControlCenterSimpleToggleNFComponent.ets @@ -27,7 +27,7 @@ export default struct ControlCenterSimpleToggleNFComponent { private keyId: string; private mEditMode: boolean = false; private mDragMode: boolean = false; - @State mIcon: Resource = $r("app.media.ic_notification_nfc"); + @State mIcon: Resource = $r("app.media.ic_notification_nfc_filled"); @State mLabel: Resource = $r("app.string.control_center_complex_toggle_nfc_mode_title"); @State mDefaultChangeSwitch: boolean = false; @StorageLink('NFCModeComponentMode') @Watch('onNFCModeUpdated') NFCModeComponentMode: NFCMode = NFCMode.NFC_MODE_OFF; @@ -44,10 +44,8 @@ export default struct ControlCenterSimpleToggleNFComponent { onNFCModeUpdated(propName: string): void { Log.showInfo(TAG, `onNFCModeUpdated, propName: ${propName} NFCModeComponentMode: ${JSON.stringify(this.NFCModeComponentMode)}`); if (this.NFCModeComponentMode == NFCMode.NFC_MODE_OFF) { - this.mIcon = $r("app.media.ic_notification_nfc"); this.mDefaultChangeSwitch = false; } else if (this.NFCModeComponentMode == NFCMode.NFC_MODE_ON) { - this.mIcon = $r("app.media.ic_notification_nfc_filled"); this.mDefaultChangeSwitch = true; } } diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index 26262ee3..51c0ae27 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -85,7 +85,7 @@ struct Index { } onPageShow() { - this.startShowAnim(); + this.showAnimation(); } aboutToDisappear() { @@ -95,43 +95,48 @@ struct Index { } build() { - Stack({ alignContent: Alignment.Top }) { - Image(this.mBackground) - .width('100%') - .height('100%') - .objectFit(ImageFit.Fill) - Column() { - Scroll(new Scroller()) { - Column() { - ControlCenterComponent({ - modeChangeCallback: (isEdit) => this.onModeChange(isEdit) + Column(){ + Stack({ alignContent: Alignment.Top }) { + Image(this.mBackground) + .width('100%') + .height('100%') + .objectFit(ImageFit.Fill) + Column() { + Scroll(new Scroller()) { + Column() { + ControlCenterComponent({ + modeChangeCallback: (isEdit) => this.onModeChange(isEdit) + }) + } + .width('100%') + .onAreaChange((e, e2) => { + Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); }) } + .scrollBarColor(Color.Gray) + .scrollBarWidth(10) .width('100%') - .onAreaChange((e, e2) => { - Log.showInfo(TAG, `onAreaChange, e: ${JSON.stringify(e)} e2: ${JSON.stringify(e2)}`); - }) } - .scrollBarColor(Color.Gray) - .scrollBarWidth(10) + .backgroundColor($r('app.color.default_background')) .width('100%') + .height('100%') } - .backgroundColor($r('app.color.default_background')) - .width('100%') - .height('100%') + .scale({ + x: this.mWidthSize, + y: this.mHeightSize, + z: 1, + centerX: '100%', + centerY: '0%' + }) + .opacity(this.mOpacity) + .clip(true) + .borderRadius(this.style.borderRadius) + .width('97%') + .height(0.97 * this.mHeightPx + 'px') } - .scale({ - x: this.mWidthSize, - y: this.mHeightSize, - z: 1, - centerX: '100%', - centerY: '0%' - }) - .opacity(this.mOpacity) - .clip(true) - .borderRadius(this.style.borderRadius) .width('100%') - .height(this.mHeightPx + 'px') + .height('100%') + .alignItems(HorizontalAlign.End) } initWindowPolicy() { @@ -177,21 +182,50 @@ struct Index { setTimeout(config.onFinish, config.duration + config.delay) } - async startShowAnim() { - if (!this.mShowAnimReady) { - return; - } - this.mShowAnimReady = false; - this.mOpacity = 1.0; - this.mWidthSize = 1.0; - this.mHeightSize = 1.0; + showAnimation(){ + + //init page state + this.mOpacity = 0; + this.mWidthSize = 0.7; + this.mHeightSize = 0.7; + + //show animation + animateTo({ + duration: 200, + curve: Curve.Friction, + onFinish: () => { + animateTo({ + duration:100, + curve: Curve.Friction + }, () =>{ + this.mWidthSize = 1; + this.mHeightSize = 1; + }) + }, + }, () => { + this.mOpacity = 1; + this.mWidthSize = 1.03; + this.mHeightSize = 1.03; + }) + } + + hideAnimation(){ + //hide animation + animateTo({ + duration: 100, + curve: Curve.Friction, + onFinish: () => { + WindowManager.hideWindow(WindowType.CONTROL_PANEL); + } + }, () => { + this.mWidthSize = 0.7; + this.mHeightSize = 0.7; + this.mOpacity = 0; + }) } hideWindow() { - WindowManager.hideWindow(WindowType.CONTROL_PANEL); - this.mOpacity = 0.0; - this.mWidthSize = 0.2; - this.mHeightSize = 0.2; + this.hideAnimation(); } onModeChange(isEdit) { diff --git a/product/pc/notificationpanel/src/main/ets/pages/index.ets b/product/pc/notificationpanel/src/main/ets/pages/index.ets index 22ca0f1f..3017b60c 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/index.ets +++ b/product/pc/notificationpanel/src/main/ets/pages/index.ets @@ -66,7 +66,7 @@ struct Index { onPageShow() { Log.showInfo(TAG, `onPageShow`) - this.startShowAnim(); + this.showAnimation(); } onPageHide() { @@ -80,30 +80,35 @@ struct Index { } build() { - Stack() { - Image(this.mBackground) + Column(){ + Stack() { + Image(this.mBackground) + .width('100%') + .height('100%') + .objectFit(ImageFit.Fill) + Column() { + Notification() + } + .backgroundColor($r('app.color.default_background')) .width('100%') .height('100%') - .objectFit(ImageFit.Fill) - Column() { - Notification() } - .backgroundColor($r('app.color.default_background')) - .width('100%') - .height('100%') + .width('97%') + .height('97%') + .clip(true) + .opacity(this.mOpacity) + .borderRadius($r('app.float.default_border_radius')) + .scale({ + x: this.mWidthSize, + y: this.mHeightSize, + z: 1, + centerX: '100%', + centerY: '0%' + }) } .width('100%') .height('100%') - .clip(true) - .opacity(this.mOpacity) - .borderRadius($r('app.float.default_border_radius')) - .scale({ - x: this.mWidthSize, - y: this.mHeightSize, - z: 1, - centerX: '100%', - centerY: '0%' - }) + .alignItems(HorizontalAlign.End) } initWindowPolicy() { @@ -149,22 +154,50 @@ struct Index { setTimeout(config.onFinish, config.duration + config.delay) } - async startShowAnim() { - Log.showInfo(TAG, `do show window. mShowAnimReady=${this.mShowAnimReady}`); - if (!this.mShowAnimReady) { - return; - } - this.mShowAnimReady = false; - this.mOpacity = 1.0; - this.mWidthSize = 1.0; - this.mHeightSize = 1.0; + showAnimation(){ + + //init page state + this.mOpacity = 0; + this.mWidthSize = 0.7; + this.mHeightSize = 0.7; + + //show animation + animateTo({ + duration: 200, + curve: Curve.Friction, + onFinish: () => { + animateTo({ + duration:100, + curve: Curve.Friction + }, () =>{ + this.mWidthSize = 1; + this.mHeightSize = 1; + }) + }, + }, () => { + this.mOpacity = 1; + this.mWidthSize = 1.03; + this.mHeightSize = 1.03; + }) + } + + hideAnimation(){ + //hide animation + animateTo({ + duration: 100, + curve: Curve.Friction, + onFinish: () => { + WindowManager.hideWindow(WindowType.NOTIFICATION_PANEL); + } + }, () => { + this.mWidthSize = 0.7; + this.mHeightSize = 0.7; + this.mOpacity = 0; + }) } hideWindow() { Log.showInfo(TAG, `do hide window.`); - WindowManager.hideWindow(WindowType.NOTIFICATION_PANEL); - this.mOpacity = 0.0; - this.mWidthSize = 0.2; - this.mHeightSize = 0.2; + this.hideAnimation(); } } -- Gitee From 9bcdbe207e4969dcbe0b4b1f131db74cfb18c32a Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Fri, 5 Aug 2022 16:20:53 +0800 Subject: [PATCH 224/373] =?UTF-8?q?SystemUI=E7=8A=B6=E6=80=81=E6=A0=8F?= =?UTF-8?q?=E4=BA=BA=E5=9B=A0=E5=B8=83=E5=B1=80=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- common/src/main/ets/default/StyleConfiguration.ts | 2 +- .../src/main/ets/com/ohos/pages/MetaIconItemComponent.ets | 4 ++-- .../main/ets/com/ohos/pages/PluginIconItemComponent.ets | 2 ++ .../src/main/ets/com/ohos/pages/StatusBarComponent.ets | 3 ++- .../statusbar/src/main/ets/pages/common/StyleManager.ts | 2 +- .../statusbar/src/main/resources/base/element/float.json | 4 ++++ .../src/main/resources/pointingdevice/element/float.json | 8 ++++++++ .../src/main/resources/base/element/float.json | 4 ++++ .../statusbar/src/main/resources/base/element/float.json | 4 ++++ 9 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 product/pc/statusbar/src/main/resources/pointingdevice/element/float.json diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts index 878ffb68..a1ac8bc9 100644 --- a/common/src/main/ets/default/StyleConfiguration.ts +++ b/common/src/main/ets/default/StyleConfiguration.ts @@ -23,7 +23,7 @@ export class CommonStyle { statusBarFontSize: Length = deviceTypeInfo === 'phone' ? '12fp' : '16fp'; statusBarIconWidth: Length = '24vp'; statusBarIconHeight: Length = '24vp'; - statusBarMarginLeftRight: Length = deviceTypeInfo === 'phone' ? '0vp' : '5vp'; + statusBarMarginLeftRight: Length = deviceTypeInfo === 'phone' ? '0vp' : $r("app.float.status_bar_margin_left_right"); deviceTypeInfo = deviceTypeInfo; } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets index 91c6a688..5c72d350 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/MetaIconItemComponent.ets @@ -52,7 +52,7 @@ export default struct MetaIconItemComponent { Row() { if ((this.mItemData.get().isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.get().label)) || (this.mItemData.get().isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.get().iconUrl))) { - Row().width(this.style.stackPadding).height('100%') + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } if (this.mItemData.get().isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.get().label)) { Text(this.mItemData.get() @@ -77,7 +77,7 @@ export default struct MetaIconItemComponent { } if ((this.mItemData.get().isShowLabel && !CheckEmptyUtils.isEmpty(this.mItemData.get().label)) || (this.mItemData.get().isShowIcon && !CheckEmptyUtils.isEmpty(this.mItemData.get().iconUrl))) { - Row().width(this.style.stackPadding).height('100%') + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } }.height('100%') } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets index efd45d6c..b0abe998 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/PluginIconItemComponent.ets @@ -72,6 +72,7 @@ export default struct PluginIconItemComponent { build() { Row() { if (this.mPluginData.template && this.mPluginData.data && Object.keys(this.mPluginData.data).length > 0) { + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') PluginComponent({ template: this.mPluginData.template, data: this.mPluginData.data @@ -81,6 +82,7 @@ export default struct PluginIconItemComponent { Log.showInfo(TAG, `PluginComponent.Error code:${errcode} message:${msg}`) }) .size({ width: px2vp(this.style.iconWidth), height: '100%' }) + Row().width(this.styleCommon.statusBarMarginLeftRight).height('100%') } }.height('100%') } diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets index fa543d1e..e0daa045 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets +++ b/features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent.ets @@ -50,6 +50,7 @@ export default struct StatusBarComponent { private moduleName: string = '' aboutToAppear() { + AppStorage.SetOrCreate('size', $r("app.float.status_bar_margin_left_right")); Log.showInfo(TAG, `aboutToAppear Start, mStatusBarComponentConfig: ${JSON.stringify(this.mStatusBarComponentConfig)}`); this.initViewModel(this.moduleName); } @@ -239,7 +240,7 @@ struct VerticalStatusBarItemLoadComponent { @Component struct StatusBarItemLoadComponent { private mComponentName: string - + @StorageLink('size') size: any='' aboutToAppear() { Log.showInfo(TAG_StatusBarItemLoadComponent, `aboutToAppear, mComponentName: ${this.mComponentName} `) } diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts index a7477033..1c4815b9 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -64,7 +64,7 @@ export class StyleManager extends BaseStyleManager { style.statusBarFontSize = this.calcScaleSizePx(14); style.statusBarIconWidth = this.calcScaleSizePx(20); style.statusBarIconHeight = this.calcScaleSizePx(20); - style.statusBarMarginLeftRight = this.calcScaleSizePx(10); + style.statusBarMarginLeftRight = $r("app.float.status_bar_margin_left_right"); } // StatusBar-VerticalStatusBarItemLoadComponent diff --git a/product/pc/statusbar/src/main/resources/base/element/float.json b/product/pc/statusbar/src/main/resources/base/element/float.json index 02c9560a..92039318 100644 --- a/product/pc/statusbar/src/main/resources/base/element/float.json +++ b/product/pc/statusbar/src/main/resources/base/element/float.json @@ -143,6 +143,10 @@ { "name": "signal_component_text_margin_left", "value": "3vp" + }, + { + "name": "status_bar_margin_left_right", + "value": "6vp" } ] } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/pointingdevice/element/float.json b/product/pc/statusbar/src/main/resources/pointingdevice/element/float.json new file mode 100644 index 00000000..2da873fa --- /dev/null +++ b/product/pc/statusbar/src/main/resources/pointingdevice/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "status_bar_margin_left_right", + "value": "3vp" + } + ] +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/resources/base/element/float.json b/product/phone/dropdownpanel/src/main/resources/base/element/float.json index 9f7acd89..a698877b 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/element/float.json +++ b/product/phone/dropdownpanel/src/main/resources/base/element/float.json @@ -1,5 +1,9 @@ { "float": [ + { + "name": "status_bar_margin_left_right", + "value": "5vp" + }, { "name": "status_bar_height", "value": "46vp" diff --git a/product/phone/statusbar/src/main/resources/base/element/float.json b/product/phone/statusbar/src/main/resources/base/element/float.json index 060e3453..fdb640c9 100644 --- a/product/phone/statusbar/src/main/resources/base/element/float.json +++ b/product/phone/statusbar/src/main/resources/base/element/float.json @@ -143,6 +143,10 @@ { "name": "battery_component_margin", "value": "2vp" + }, + { + "name": "status_bar_margin_left_right", + "value": "5vp" } ] } \ No newline at end of file -- Gitee From 679646ec8830062d2a338dbe8c0728ee4c1fd8c8 Mon Sep 17 00:00:00 2001 From: gaochao Date: Fri, 5 Aug 2022 17:08:48 +0800 Subject: [PATCH 225/373] =?UTF-8?q?[systemui]=E6=B5=81=E6=B0=B4=E7=BA=BF?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E6=96=87=E4=BB=B6=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: gaochao --- gradlew | 199 ++++++-------------------------------------------------- 1 file changed, 19 insertions(+), 180 deletions(-) diff --git a/gradlew b/gradlew index 2fe81a7d..8641d8e8 100755 --- a/gradlew +++ b/gradlew @@ -1,183 +1,22 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# 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 -# -# https://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. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 +function npm_install { + cd $1 + npm install } -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME +npm config set registry http://mirrors.tools.huawei.com/npm/ +npm config set @ohos:registry https://cmc.centralrepo.rnd.huawei.com/artifactory/api/npm/product_npm/ +npm config set strict-ssl false +npm config set sslVerify false -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" +APP_HOME="`pwd -P`" +npm_install "$APP_HOME" +npm_install "$APP_HOME/product/default/navigationBar" +npm_install "$APP_HOME/product/default/notificationmanagement" +npm_install "$APP_HOME/product/default/volumepanel" +npm_install "$APP_HOME/product/pc/controlpanel" +npm_install "$APP_HOME/product/pc/notificationpanel" +npm_install "$APP_HOME/product/pc/statusbar" + +cd $APP_HOME +cp ./compile-resource.js ./node_modules/@ohos/hvigor-ohos-plugin/src/tasks/compile-resource.js +node ./node_modules/@ohos/hvigor/bin/hvigor.js --mode module assembleHap \ No newline at end of file -- Gitee From d1642b0e43cb8593824fede095e641eddd28d0de Mon Sep 17 00:00:00 2001 From: yangpeng85 Date: Fri, 5 Aug 2022 15:19:38 +0800 Subject: [PATCH 226/373] support launch screenlock by SystemUI Signed-off-by: yangpeng85 --- .gitignore | 3 +- AppScope/app.json5 | 8 ++--- common/src/main/ets/default/SysFaultLogger.ts | 1 + common/src/main/ets/default/TimeManager.ts | 3 +- common/src/main/ets/default/WindowManager.ts | 3 +- .../main/ets/default/event/EventManager.ts | 2 +- common/src/main/module.json5 | 2 +- entry/src/main/module.json5 | 4 ++- .../main/resources/base/element/color.json | 8 +++++ .../src/main/ets/default/batteryModel.ts | 3 +- .../batterycomponent/src/main/module.json5 | 2 +- features/clockcomponent/src/main/module.json5 | 2 +- .../datetimecomponent/src/main/module.json5 | 2 +- .../com/ohos/noticeItem/common/CommonUtil.ts | 4 +-- .../noticeItem/model/NotificationService.ts | 4 +-- .../ohos/noticeItem/model/ParseDataUtil.ts | 15 +++----- .../noticeItem/model/rule/RuleController.ts | 1 + .../view/NotificationListComponent.ets | 4 +-- .../ohos/noticeItem/view/item/generalItem.ets | 2 +- .../ohos/noticeItem/view/item/groupItem.ets | 2 +- .../ohos/noticeItem/viewmodel/ViewModel.ts | 5 ++- features/noticeitem/src/main/module.json5 | 2 +- .../main/ets/com/ohos/model/accountsModel.ts | 1 + .../ets/com/ohos/model/screenLockService.ts | 4 +-- features/screenlock/src/main/module.json5 | 2 +- .../shortcutcomponent/src/main/module.json5 | 2 +- .../signalcomponent/src/main/module.json5 | 2 +- .../wallpapercomponent/src/main/module.json5 | 2 +- features/wificomponent/src/main/module.json5 | 2 +- package.json | 35 ++++++++++--------- .../pc/src/main/ets/pages/customPassword.ets | 1 - .../pc/src/main/ets/pages/digitalPassword.ets | 1 - product/pc/src/main/ets/pages/index.ets | 2 +- .../pc/src/main/ets/pages/mixedPassword.ets | 1 - product/pc/src/main/module.json5 | 4 +-- .../src/main/ets/pages/customPassword.ets | 1 - .../src/main/ets/pages/digitalPassword.ets | 1 - product/phone/src/main/ets/pages/index.ets | 2 +- .../src/main/ets/pages/mixedPassword.ets | 1 - .../src/main/ets/pages/slidescreenlock.ets | 2 ++ product/phone/src/main/module.json5 | 6 ++-- 41 files changed, 80 insertions(+), 74 deletions(-) create mode 100644 entry/src/main/resources/base/element/color.json diff --git a/.gitignore b/.gitignore index 9f6d3499..7aac1f70 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ /local.properties /.idea **/build -/features/**/build \ No newline at end of file +/features/**/build +/.hvigor \ No newline at end of file diff --git a/AppScope/app.json5 b/AppScope/app.json5 index 7baec669..52356e8a 100644 --- a/AppScope/app.json5 +++ b/AppScope/app.json5 @@ -1,15 +1,15 @@ { "app": { - "bundleName": "com.ohos.screenlock", - "vendor": "example", + "bundleName": "com.ohos.systemui", + "vendor": "ohos", "versionCode": 1000000, "versionName": "1.0.0", "icon": "$media:app_icon", "label": "$string:app_name", "distributedNotificationEnabled": true, "singleton": true, - "keepAlive":true, - "minAPIVersion": 9, + "keepAlive": true, + "minAPIVersion": 8, "targetAPIVersion": 9 } } diff --git a/common/src/main/ets/default/SysFaultLogger.ts b/common/src/main/ets/default/SysFaultLogger.ts index ad46d3c2..6ed8e734 100644 --- a/common/src/main/ets/default/SysFaultLogger.ts +++ b/common/src/main/ets/default/SysFaultLogger.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/common/src/main/ets/default/TimeManager.ts b/common/src/main/ets/default/TimeManager.ts index d7d187b5..182e6b9f 100644 --- a/common/src/main/ets/default/TimeManager.ts +++ b/common/src/main/ets/default/TimeManager.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /** * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -30,7 +31,7 @@ export type TimeEventArgs = { timeFormat: boolean; }; -const TAG = "TimeManager"; +const TAG = "TimeManagerSc"; const URI_VAR = "dataability:///com.ohos.settingsdata.DataAbility"; const TIME_FORMAT_KEY = settings.date.TIME_FORMAT; const TIME_SUBSCRIBE_INFO = { diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index 13ac9261..fde57465 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -38,7 +39,7 @@ export const WINDOW_SHOW_HIDE_EVENT = "WindowShowHideEvent"; export const WINDOW_RESIZE_EVENT = "WindowResizeEvent"; type WindowHandle = typeof Window.Window; -const TAG = "WindowManager"; +const TAG = "WindowManagerSc"; const SYSTEM_WINDOW_TYPE_MAP: { [key in WindowType]: number } = { SystemUi_StatusBar: 2108, SystemUi_NavigationBar: 2112, diff --git a/common/src/main/ets/default/event/EventManager.ts b/common/src/main/ets/default/event/EventManager.ts index cb0aa2d4..91890758 100644 --- a/common/src/main/ets/default/event/EventManager.ts +++ b/common/src/main/ets/default/event/EventManager.ts @@ -22,7 +22,7 @@ import { Callback, createEventBus, EventBus } from "./EventBus"; export type unsubscribe = () => void; export type Events = string | string[]; -const TAG = "EventManager"; +const TAG = "EventManagerSc"; class EventManager { mEventBus: EventBus; diff --git a/common/src/main/module.json5 b/common/src/main/module.json5 index 064cd174..56a91a87 100644 --- a/common/src/main/module.json5 +++ b/common/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "common", "type": "har", "deviceTypes": [ - "phone", + "default", "tablet" ], "uiSyntax": "ets" diff --git a/entry/src/main/module.json5 b/entry/src/main/module.json5 index 035cdc75..d85dc66e 100644 --- a/entry/src/main/module.json5 +++ b/entry/src/main/module.json5 @@ -6,7 +6,7 @@ "description": "$string:entry_desc", "mainElement": "MainAbility", "deviceTypes": [ - "phone", + "default", "tablet" ], "deliveryWithInstall": true, @@ -21,6 +21,8 @@ "icon": "$media:icon", "label": "$string:MainAbility_label", "visible": true, + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:startWindowBackground", "skills": [ { "entities": [ diff --git a/entry/src/main/resources/base/element/color.json b/entry/src/main/resources/base/element/color.json new file mode 100644 index 00000000..2299b1a8 --- /dev/null +++ b/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "startWindowBackground", + "value": "#ffffff" + } + ] +} \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/batteryModel.ts b/features/batterycomponent/src/main/ets/default/batteryModel.ts index cdaa845c..b4d0dd37 100644 --- a/features/batterycomponent/src/main/ets/default/batteryModel.ts +++ b/features/batterycomponent/src/main/ets/default/batteryModel.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,7 +26,7 @@ import { POLICY, } from "../../../../../../common/src/main/ets/default/commonEvent/CommonEventManager"; -const TAG = "BatteryComponent-batteryModel"; +const TAG = "BatteryComponent-batteryModelSc"; const DEFAULT_PROGRESS = 100; const SUBSCRIBE_INFO = { events: [commonEvent.Support.COMMON_EVENT_BATTERY_CHANGED], diff --git a/features/batterycomponent/src/main/module.json5 b/features/batterycomponent/src/main/module.json5 index 50dd6bac..f121300c 100644 --- a/features/batterycomponent/src/main/module.json5 +++ b/features/batterycomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "batterycomponent", "type": "har", "deviceTypes": [ - "phone", + "default", "tablet" ], "uiSyntax": "ets" diff --git a/features/clockcomponent/src/main/module.json5 b/features/clockcomponent/src/main/module.json5 index a68c71e3..c13e0859 100644 --- a/features/clockcomponent/src/main/module.json5 +++ b/features/clockcomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "clockcomponent", "type": "har", "deviceTypes": [ - "phone", + "default", "tablet" ], "uiSyntax": "ets" diff --git a/features/datetimecomponent/src/main/module.json5 b/features/datetimecomponent/src/main/module.json5 index ae47cb13..7685a924 100644 --- a/features/datetimecomponent/src/main/module.json5 +++ b/features/datetimecomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "datetimecomponent", "type": "har", "deviceTypes": [ - "phone", + "default", "tablet" ], "uiSyntax": "ets" diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts index c14bf865..f572af90 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/common/CommonUtil.ts @@ -28,8 +28,8 @@ export default class CommonUtil { static startWant(want, triggerInfo?: any) { let info = (triggerInfo) ? triggerInfo : DEFAULT_INFO; Log.showDebug(TAG, `startWant ${JSON.stringify(want)}, info ${JSON.stringify(info)}`); - WantAgent.trigger(want, info, ((err, data) => { - Log.showDebug(TAG, `wantAgent trigger err ${JSON.stringify(err)} data ${JSON.stringify(data)}`); + WantAgent.trigger(want, info, ((data) => { + Log.showDebug(TAG, `wantAgent trigger data ${JSON.stringify(data)}`); })); } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts index 74f1facb..37f84f42 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/NotificationService.ts @@ -13,8 +13,6 @@ * limitations under the License. */ -import notification from '@ohos.notification'; -import NotificationSubscriber from '@ohos.notificationSubscriber'; import Log from '../../../../../../../../../common/src/main/ets/default/Log'; import NotificationManager from './NotificationManager'; import ParseDataUtil from './ParseDataUtil'; @@ -23,7 +21,7 @@ import CommonUtil from '../common/CommonUtil'; import createOrGet from "../../../../../../../../../common/src/main/ets/default/SingleInstanceHelper"; import DistributionManager from './NotificationDistributionManager'; -const TAG = 'NotificationService'; +const TAG = 'NotificationServiceSc'; interface NotificationListener { userId: number; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index c827d913..c2a7d276 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -13,14 +13,12 @@ * limitations under the License. */ -import Notification from '@ohos.notification'; import AccountManager from '@ohos.account.osAccount'; import Log from '../../../../../../../../../common/src/main/ets/default/Log'; import BundleManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/bundleManager'; import AbilityManager from '../../../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; -import DistributionManager from './NotificationDistributionManager'; import NotificationManager from './NotificationManager'; -import Constants, {NotificationItemData} from '../common/constants'; +import {NotificationItemData} from '../common/constants'; import {NotificationConfig} from './NotificationConfig'; const TAG = 'Notification_ParseDataUtil'; @@ -39,11 +37,8 @@ type NotificationContent = { } async function getUserId(uid) { - let userId = await AccountManager.getAccountManager().getOsAccountLocalIdFromUid(uid) - .catch((err)=>{ - Log.showError(TAG, `getOsAccountLocalIdFromUid error error: ${JSON.stringify(err)}`); - }) - Log.showDebug(TAG, `getOsAccountLocalIdFromUid uid = ${uid}, userId = ${userId}`); + let userId = await AccountManager.getAccountManager().getOsAccountLocalIdFromUid(uid); + Log.showInfo(TAG, `getOsAccountLocalIdFromUid uid = ${uid}, userId = ${userId}`); return userId; } @@ -112,8 +107,8 @@ export default class ParseDataUtil { let context = AbilityManager.getContext()??AbilityManager.getContext(AbilityManager.ABILITY_NAME_SCREEN_LOCK); let item = await BundleManager.getResourceManager(TAG, context, bundleName); let appMessage = { - appName: labelId > 0 ? await item.getString(labelId) : '', - icon: iconId > 0 ? await item.getMediaBase64(iconId) : null + appName: parseInt(labelId) > 0 ? await item.getString(parseInt(labelId)) : '', + icon: parseInt(iconId) > 0 ? await item.getMediaBase64(parseInt(iconId)) : null }; if (appMessage.icon != null && appMessage.appName) { appDataMap.set(bundleName, appMessage); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts index 6a517ff9..56e4311b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/rule/RuleController.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index 53f9cef2..d07b1800 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -27,8 +27,8 @@ type NotificationLayoutConfig = { @Component export default struct NotificationListComponent { - @Provide('notificationUpdate') update: number = 0; - @StorageLink('notificationList') notificationList: any[] = [] + @Provide('notificationUpdateSc') update: number = 0; + @StorageLink('notificationListSc') notificationList: any[] = [] private config: NotificationLayoutConfig = { itemMargin: Layout.ITEM_MARGIN } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets index 5c0c40f9..90188bcf 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/generalItem.ets @@ -28,7 +28,7 @@ const TAG = 'NoticeItem-GeneralItem'; @Component export default struct GeneralItem { - @Consume('notificationUpdate') updateFlag: number; + @Consume('notificationUpdateSc') updateFlag: number; @State hasPicture: boolean = false @State @Watch('expandChange') isExpand: boolean = false @State needExpand: boolean = true diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 35e95115..d4b3e4f9 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -24,7 +24,7 @@ const TAG = 'NoticeItem-GroupItem'; @Component export default struct GroupItem { - @Consume('notificationUpdate') updateFlag: number; + @Consume('notificationUpdateSc') updateFlag: number; @State distributedDeviceName: string = '' @State @Watch('expandChange') toExpand: boolean = false; private groupData: any[] = [] diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts index c2ad0471..5e252349 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/viewmodel/ViewModel.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,8 +17,6 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log'; import SwitchUserManager from '../../../../../../../../../common/src/main/ets/default/SwitchUserManager'; import media from '@ohos.multimedia.media'; -import vibrator from '@ohos.vibrator'; -import wantAgent from '@ohos.wantAgent'; import SourceType from '@ohos.notification' import NotificationService from '../model/NotificationService' import NotificationWindowManager from '../model/NotificationWindowManager'; @@ -129,7 +128,7 @@ export class ViewModel { Log.showDebug(TAG, `updateNotification length: ${this.mNotificationList.length}`); this.sortNotification() let notificationList = this.groupByGroupName(); - AppStorage.SetOrCreate('notificationList', notificationList); + AppStorage.SetOrCreate('notificationListSc', notificationList); } groupByGroupName(): any[]{ diff --git a/features/noticeitem/src/main/module.json5 b/features/noticeitem/src/main/module.json5 index 3a02970d..277a74a7 100644 --- a/features/noticeitem/src/main/module.json5 +++ b/features/noticeitem/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "noticeitem", "type": "har", "deviceTypes": [ - "phone", + "default", "tablet" ], "uiSyntax": "ets" diff --git a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts index a464aa60..de5125c1 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/accountsModel.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts index d72e94ae..0a9be437 100644 --- a/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts +++ b/features/screenlock/src/main/ets/com/ohos/model/screenLockService.ts @@ -150,9 +150,9 @@ export class ScreenLockService { lockScreen() { Trace.start(Trace.CORE_METHOD_SHOW_LOCK_SCREEN); Log.showDebug(TAG, `lockScreen`); - let length = Router.getLength() + let length = parseInt(Router.getLength()) Log.showDebug(TAG, `Router.getLength: ${length}`) - for (let index = 1;index < length; index++) { + for (let index = 1; index < length; index++) { Log.showInfo(TAG, `back to index`); Router.back(); } diff --git a/features/screenlock/src/main/module.json5 b/features/screenlock/src/main/module.json5 index 21e2f167..ae2b1d70 100644 --- a/features/screenlock/src/main/module.json5 +++ b/features/screenlock/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "screenlock", "type": "har", "deviceTypes": [ - "phone", + "default", "tablet" ], "uiSyntax": "ets" diff --git a/features/shortcutcomponent/src/main/module.json5 b/features/shortcutcomponent/src/main/module.json5 index 08e77959..71394d9b 100644 --- a/features/shortcutcomponent/src/main/module.json5 +++ b/features/shortcutcomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "shortcutcomponent", "type": "har", "deviceTypes": [ - "phone", + "default", "tablet" ], "uiSyntax": "ets" diff --git a/features/signalcomponent/src/main/module.json5 b/features/signalcomponent/src/main/module.json5 index 6552c5dd..dc9c80c3 100644 --- a/features/signalcomponent/src/main/module.json5 +++ b/features/signalcomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "signalcomponent", "type": "har", "deviceTypes": [ - "phone", + "default", "tablet" ], "uiSyntax": "ets" diff --git a/features/wallpapercomponent/src/main/module.json5 b/features/wallpapercomponent/src/main/module.json5 index 6c741cda..68fa33fa 100644 --- a/features/wallpapercomponent/src/main/module.json5 +++ b/features/wallpapercomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "wallpapercomponent", "type": "har", "deviceTypes": [ - "phone", + "default", "tablet" ], "uiSyntax": "ets" diff --git a/features/wificomponent/src/main/module.json5 b/features/wificomponent/src/main/module.json5 index ead4df09..5bad4d22 100644 --- a/features/wificomponent/src/main/module.json5 +++ b/features/wificomponent/src/main/module.json5 @@ -3,7 +3,7 @@ "name": "wificomponent", "type": "har", "deviceTypes": [ - "phone", + "default", "tablet" ], "uiSyntax": "ets" diff --git a/package.json b/package.json index 774d59b8..fb06d5a7 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,19 @@ { - "license":"ISC", - "devDependencies":{}, - "name":"screenlock", - "ohos":{ - "org":"huawei", - "directoryLevel":"project", - "buildTool":"hvigor" - }, - "description":"example description", - "repository":{}, - "version":"1.0.0", - "dependencies":{ - "@ohos/hvigor-ohos-plugin":"1.0.6", - "hypium":"^1.0.0", - "@ohos/hvigor":"1.0.6" - } -} \ No newline at end of file + "license": "ISC", + "devDependencies": {}, + "name": "systemui", + "ohos": { + "org": "huawei", + "directoryLevel": "project", + "buildTool": "hvigor" + }, + "description": "example description", + "repository": {}, + "version": "1.0.0", + "dependencies": { + "@ohos/hvigor-ohos-plugin": "1.1.6", + "hypium": "^1.0.0", + "@ohos/hvigor": "1.1.6", + "@ohos/hypium": "1.0.1" + } +} diff --git a/product/pc/src/main/ets/pages/customPassword.ets b/product/pc/src/main/ets/pages/customPassword.ets index d0efe1ac..088e7ac6 100644 --- a/product/pc/src/main/ets/pages/customPassword.ets +++ b/product/pc/src/main/ets/pages/customPassword.ets @@ -31,7 +31,6 @@ export default struct CustomPassword { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') this.mHeightPx = configInfo.height diff --git a/product/pc/src/main/ets/pages/digitalPassword.ets b/product/pc/src/main/ets/pages/digitalPassword.ets index 84b7337a..3ea7f5c7 100644 --- a/product/pc/src/main/ets/pages/digitalPassword.ets +++ b/product/pc/src/main/ets/pages/digitalPassword.ets @@ -31,7 +31,6 @@ export default struct DigitalPassword { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showInfo(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) diff --git a/product/pc/src/main/ets/pages/index.ets b/product/pc/src/main/ets/pages/index.ets index 4caa4ade..2fc77059 100644 --- a/product/pc/src/main/ets/pages/index.ets +++ b/product/pc/src/main/ets/pages/index.ets @@ -71,7 +71,7 @@ struct Index { } onBackPress(): boolean { - let length = Router.getLength() + let length = parseInt(Router.getLength()) Log.showInfo(TAG, `onBackPress length: ${length}`) if (length > 1) { Router.back() diff --git a/product/pc/src/main/ets/pages/mixedPassword.ets b/product/pc/src/main/ets/pages/mixedPassword.ets index 3bc243ec..bfa4a923 100644 --- a/product/pc/src/main/ets/pages/mixedPassword.ets +++ b/product/pc/src/main/ets/pages/mixedPassword.ets @@ -31,7 +31,6 @@ export default struct MixedPassword { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) diff --git a/product/pc/src/main/module.json5 b/product/pc/src/main/module.json5 index eb83e1b7..53b47492 100644 --- a/product/pc/src/main/module.json5 +++ b/product/pc/src/main/module.json5 @@ -4,7 +4,7 @@ "type": "feature", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:pc_desc", - "mainElement": "ServiceExtAbility", + "mainElement": "com.ohos.systemui.screenlock.ServiceExtAbility", "deviceTypes": [ "tablet" ], @@ -73,7 +73,7 @@ ], "extensionAbilities": [ { - "name": "ServiceExtAbility", + "name": "com.ohos.systemui.screenlock.ServiceExtAbility", "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", "description": "$string:MainAbility_desc", "icon": "$media:icon", diff --git a/product/phone/src/main/ets/pages/customPassword.ets b/product/phone/src/main/ets/pages/customPassword.ets index cce137f3..79bb1b24 100644 --- a/product/phone/src/main/ets/pages/customPassword.ets +++ b/product/phone/src/main/ets/pages/customPassword.ets @@ -31,7 +31,6 @@ export default struct CustomPassword { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) diff --git a/product/phone/src/main/ets/pages/digitalPassword.ets b/product/phone/src/main/ets/pages/digitalPassword.ets index 47099d4f..a9dfff0e 100644 --- a/product/phone/src/main/ets/pages/digitalPassword.ets +++ b/product/phone/src/main/ets/pages/digitalPassword.ets @@ -31,7 +31,6 @@ export default struct DigitalPassword { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) diff --git a/product/phone/src/main/ets/pages/index.ets b/product/phone/src/main/ets/pages/index.ets index 4d008d4a..e2bdb990 100644 --- a/product/phone/src/main/ets/pages/index.ets +++ b/product/phone/src/main/ets/pages/index.ets @@ -72,7 +72,7 @@ struct Index { } onBackPress(): boolean { - let length = Router.getLength() + let length = parseInt(Router.getLength()) Log.showDebug(TAG, `onBackPress length: ${length}`) if (length > 1) { Router.back() diff --git a/product/phone/src/main/ets/pages/mixedPassword.ets b/product/phone/src/main/ets/pages/mixedPassword.ets index b3a24ba6..faf24876 100644 --- a/product/phone/src/main/ets/pages/mixedPassword.ets +++ b/product/phone/src/main/ets/pages/mixedPassword.ets @@ -31,7 +31,6 @@ export default struct MixedPassword { aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`) - setAppBgColor('#00000000') CommonStyleManager.setAbilityPageName(TAG) let configInfo = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'rect') Log.showDebug(TAG, `configMaxWidth${JSON.stringify(configInfo.height)}`) diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets index 808b76e2..0d386854 100644 --- a/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -111,6 +111,8 @@ export default struct SlideScreenlock { } .alignItems(HorizontalAlign.Center) .width(Constants.NOTIFICATION_AREA_WIDTH) + .borderWidth("4vp") + .borderColor(Color.Green) } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) diff --git a/product/phone/src/main/module.json5 b/product/phone/src/main/module.json5 index 433daa81..6a888901 100644 --- a/product/phone/src/main/module.json5 +++ b/product/phone/src/main/module.json5 @@ -4,9 +4,9 @@ "type": "feature", "srcEntrance": "./ets/Application/AbilityStage.ts", "description": "$string:phone_desc", - "mainElement": "ServiceExtAbility", + "mainElement": "com.ohos.systemui.screenlock.ServiceExtAbility", "deviceTypes": [ - "phone" + "default" ], "deliveryWithInstall": true, "installationFree": false, @@ -70,7 +70,7 @@ ], "extensionAbilities": [ { - "name": "ServiceExtAbility", + "name": "com.ohos.systemui.screenlock.ServiceExtAbility", "srcEntrance": "./ets/ServiceExtAbility/ServiceExtAbility.ts", "description": "$string:MainAbility_desc", "icon": "$media:icon", -- Gitee From a77f9dc1c6f5f54479119686d77fb1888a2d60bf Mon Sep 17 00:00:00 2001 From: yangpeng85 Date: Sat, 6 Aug 2022 17:01:29 +0800 Subject: [PATCH 227/373] remove border color of NoticeItem Signed-off-by: yangpeng85 --- product/phone/src/main/ets/pages/slidescreenlock.ets | 2 -- 1 file changed, 2 deletions(-) diff --git a/product/phone/src/main/ets/pages/slidescreenlock.ets b/product/phone/src/main/ets/pages/slidescreenlock.ets index 0d386854..808b76e2 100644 --- a/product/phone/src/main/ets/pages/slidescreenlock.ets +++ b/product/phone/src/main/ets/pages/slidescreenlock.ets @@ -111,8 +111,6 @@ export default struct SlideScreenlock { } .alignItems(HorizontalAlign.Center) .width(Constants.NOTIFICATION_AREA_WIDTH) - .borderWidth("4vp") - .borderColor(Color.Green) } .width(Constants.FULL_CONTAINER_WIDTH) .height(Constants.FULL_CONTAINER_HEIGHT) -- Gitee From 349b184988560eb7586b2a728ea4a34384852049 Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Mon, 8 Aug 2022 11:31:02 +0800 Subject: [PATCH 228/373] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E7=AA=97=E5=8F=A3=E5=8F=98=E5=B0=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- common/src/main/ets/default/WindowManager.ts | 6 ++++ .../ets/com/ohos/viewmodel/StatusBarVM.ts | 29 +++++++++---------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/common/src/main/ets/default/WindowManager.ts b/common/src/main/ets/default/WindowManager.ts index d1b73e0a..bff2449b 100644 --- a/common/src/main/ets/default/WindowManager.ts +++ b/common/src/main/ets/default/WindowManager.ts @@ -89,6 +89,12 @@ class WindowManager { Log.showInfo(TAG, `resize window[${name}] success, rect: ${JSON.stringify(rect)}.`); } + async moveTo(name: WindowType, rect: Rect): Promise { + Log.showInfo(TAG, `moveTo window[${name}] success, rect: ${JSON.stringify(rect)}.`); + let window = await Window.find(name); + await window.moveTo(rect.left, rect.top); + } + async showWindow(name: WindowType): Promise { let window = await Window.find(name); await window.show(); diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts index 4a91fe4b..526bbd22 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM.ts @@ -312,37 +312,36 @@ export class StatusBarVM { } async resetWindow(id: string, area: Rect): Promise{ - Log.showInfo(TAG, `setComponentContent, id ${id} contentColor: ${JSON.stringify(area)}`); + Log.showInfo(TAG, `resetWindow, id ${id} contentColor: ${JSON.stringify(area)}`); let panelWidth; let panelHeight; - let resetEventName; + let abilityName; let windowName; if (id === 'systemui_notificationpanel') { - panelWidth = 804; - panelHeight = 762; - resetEventName = 'NotificationWindowResizeEvent'; + abilityName = AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL; + let initRect = AbilityManager.getAbilityData(abilityName, 'rect'); + Log.showInfo(TAG, `id ${id} initRect: ${JSON.stringify(initRect)}`); + panelWidth = initRect.width; + panelHeight = initRect.height; windowName = WindowType.NOTIFICATION_PANEL; } else if (id === 'systemui_controlpanel') { - panelWidth = 804; - panelHeight = 620; - resetEventName = 'ControlWindowResizeEvent'; + abilityName = AbilityManager.ABILITY_NAME_CONTROL_PANEL; + let initRect = AbilityManager.getAbilityData(abilityName, 'rect'); + Log.showInfo(TAG, `id ${id} initRect: ${JSON.stringify(initRect)}`); + panelWidth = initRect.width; + panelHeight = initRect.height; windowName = WindowType.CONTROL_PANEL; } else { return; } - let dis = await display.getDefaultDisplay(); let rect = { left: area.left + area.width - panelWidth, top: area.height, width: panelWidth, height: panelHeight, }; - EventManager.publish( - obtainLocalEvent(resetEventName, { - windowName: windowName, - rect - }) - ); + AbilityManager.setAbilityData(abilityName, 'rect', rect); + await WindowManager.moveTo(windowName, rect); } setComponentContent(id: string, contentColor: string): void{ -- Gitee From e6239e952bdc28097f8f935cf3652095b78f0258 Mon Sep 17 00:00:00 2001 From: yangpeng85 Date: Tue, 9 Aug 2022 11:10:28 +0800 Subject: [PATCH 229/373] fix background color for pswdPage fix load statusBar icons of SystemUI too slow Signed-off-by: yangpeng85 --- common/src/main/ets/default/SwitchUserManager.ts | 2 +- .../screenlock/src/main/resources/base/element/color.json | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/common/src/main/ets/default/SwitchUserManager.ts b/common/src/main/ets/default/SwitchUserManager.ts index 43e14fa5..bee3bf7e 100644 --- a/common/src/main/ets/default/SwitchUserManager.ts +++ b/common/src/main/ets/default/SwitchUserManager.ts @@ -17,7 +17,7 @@ import AccountManager from "@ohos.account.osAccount"; import Log from "./Log"; import getSingleInstance from "./SingleInstanceHelper"; -const TAG = "SwitchUserManager"; +const TAG = "SwitchUserManagerSc"; const SUBSCRIBE_KEY = "SystemUiAccount"; const USER_CHANGE_EVENT = "activate"; const DELAY_TIME = 50 * 1000; diff --git a/features/screenlock/src/main/resources/base/element/color.json b/features/screenlock/src/main/resources/base/element/color.json index 618b9661..46bfaf8a 100644 --- a/features/screenlock/src/main/resources/base/element/color.json +++ b/features/screenlock/src/main/resources/base/element/color.json @@ -16,10 +16,6 @@ "name": "circle_background_transparent", "value": "#00ffffff" }, - { - "name": "page_background", - "value": "#0173C7" - }, { "name": "batterysoc_text_color", "value": "#ffffff" -- Gitee From fb17502bd70cbbba3273388a2d54f0fc4aa332d2 Mon Sep 17 00:00:00 2001 From: lizhi Date: Tue, 9 Aug 2022 21:18:50 +0800 Subject: [PATCH 230/373] =?UTF-8?q?[systemui]=E4=BF=AE=E6=94=B9=E5=AF=BC?= =?UTF-8?q?=E8=88=AA=E6=A0=8F=E7=82=B9=E5=87=BB=E4=BA=8B=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E5=8D=95=E6=AC=A1=E4=BB=85=E5=85=81=E8=AE=B8=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../ets/com/ohos/navigationservice/KeyCodeEvent.ts | 8 ++++---- .../navigationBar/src/main/ets/common/constants.ts | 1 + .../navigationBar/src/main/ets/pages/keyButton.ets | 12 ++++++++++-- .../navigationBar/src/main/ets/pages/threeLayout.ets | 5 +++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts index 60853983..d78b50cf 100644 --- a/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts +++ b/features/navigationservice/src/main/ets/com/ohos/navigationservice/KeyCodeEvent.ts @@ -27,24 +27,24 @@ export class KeyCodeEvent { Log.showInfo(TAG, `sendKeyEvent keycode: ${keyCode} type: ${eventType}`); switch (keyCode) { case Constants.KEYCODE_BACK: - if (eventType === Constants.KEY_DOWN) { + if (eventType === TouchType.Down) { Log.showDebug(TAG, 'sendKeyEvent : KEY_DOWN'); this.sendBackKeyEventStart(); //down - } else if (eventType === Constants.KEY_UP) { + } else if (eventType === TouchType.Up) { Log.showDebug(TAG, `sendKeyEvent : KEY_UP`); this.sentEvnt(); this.sendBackKeyEventEnd(); //up } break; case Constants.KEYCODE_HOME: - if (eventType === Constants.KEY_UP) { + if (eventType === TouchType.Up) { Log.showDebug(TAG, 'sendKeyEvent : KEY_UP'); this.sentEvnt(); this.sendHomeKeyEvent(); } break; case Constants.KEYCODE_RECENT: - if (eventType === Constants.KEY_UP) { + if (eventType === TouchType.Up) { Log.showDebug(TAG, 'sendKeyEvent : KEY_UP'); this.sentEvnt(); this.sendRecentKeyEvent(); diff --git a/product/default/navigationBar/src/main/ets/common/constants.ts b/product/default/navigationBar/src/main/ets/common/constants.ts index 4ab3d178..550d9677 100644 --- a/product/default/navigationBar/src/main/ets/common/constants.ts +++ b/product/default/navigationBar/src/main/ets/common/constants.ts @@ -16,6 +16,7 @@ export default class Constants { static readonly KEY_DOWN: number = 0; static readonly KEY_UP: number = 1; + static readonly KEYCODE_NONE: number = -1; static readonly KEYCODE_BACK: number = 1; static readonly KEYCODE_HOME: number = 2; static readonly KEYCODE_RECENT: number = 3; diff --git a/product/default/navigationBar/src/main/ets/pages/keyButton.ets b/product/default/navigationBar/src/main/ets/pages/keyButton.ets index 427ce134..e8b9fa8f 100644 --- a/product/default/navigationBar/src/main/ets/pages/keyButton.ets +++ b/product/default/navigationBar/src/main/ets/pages/keyButton.ets @@ -26,6 +26,7 @@ const TAG = 'NavigationBar-KeyButton'; export default struct keyButton { private uri: any; @Prop keyCode: number; + @Link currentTouchItem: number; @State backGroundColor: any = $r('app.color.button_default_background'); @StorageLink("showNavHorizontal") showNavHorizontal: boolean = AppStorage.SetAndLink("showNavHorizontal", true).get(); @State mNavigationBarComponentData: NavigationBarComponentData = NavigationBarViewModel.getInstance() @@ -63,14 +64,21 @@ export default struct keyButton { } private onKeyTouch(event: TouchEvent) { + if (this.currentTouchItem != Constants.KEYCODE_NONE && this.currentTouchItem != this.keyCode) { + Log.showInfo(TAG, `current has item touch.`); + return; + } Log.showDebug(TAG, `onKeyTouch event: ${ event }`) let eventType = event.type; switch (eventType) { - case Constants.KEY_DOWN: + case TouchType.Down: + this.currentTouchItem = this.keyCode; this.backGroundColor = $r('app.color.button_click_background') break; - case Constants.KEY_UP: + case TouchType.Up: + case TouchType.Cancel: this.backGroundColor = $r('app.color.button_default_background') + this.currentTouchItem = Constants.KEYCODE_NONE; break; default: break; diff --git a/product/default/navigationBar/src/main/ets/pages/threeLayout.ets b/product/default/navigationBar/src/main/ets/pages/threeLayout.ets index b529d17d..22f8543b 100644 --- a/product/default/navigationBar/src/main/ets/pages/threeLayout.ets +++ b/product/default/navigationBar/src/main/ets/pages/threeLayout.ets @@ -37,6 +37,7 @@ export default struct threeLayout { @StorageLink('minNavHeight') minNavHeight:number = 32 @StorageLink("showNavHorizontal") showNavHorizontal: boolean = AppStorage.SetAndLink("showNavHorizontal", false).get(); + @State currentTouchItem: number = Constants.KEYCODE_NONE; aboutToAppear() { Log.showDebug(TAG, `aboutToAppear Start`) } @@ -51,7 +52,7 @@ struct threeLayout { ForEach(KeyCodeArr, (item: any) => { GridItem() { Row() { - keyButton({ uri: item.uri, keyCode: item.keyCode }) + keyButton({ uri: item.uri, keyCode: item.keyCode, currentTouchItem: $currentTouchItem }) }.height('100%') } .height('100%') @@ -67,7 +68,7 @@ struct threeLayout { ForEach(KeyCodeArr, (item: any) => { GridItem() { Column() { - keyButton({ uri: item.uri, keyCode: item.keyCode }) + keyButton({ uri: item.uri, keyCode: item.keyCode, currentTouchItem: $currentTouchItem }) }.width('100%') } .width('100%') -- Gitee From 41b3aefeb04c0783a2752998db12759caa2b4933 Mon Sep 17 00:00:00 2001 From: lizhi Date: Thu, 11 Aug 2022 11:29:13 +0800 Subject: [PATCH 231/373] =?UTF-8?q?[SystemUI]=E6=95=B4=E6=94=B9HiLog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- common/src/main/ets/default/Log.ts | 84 +++++++++++++++---- .../src/main/ets/template/iconTitleBase.ets | 4 +- doc/Instructions.md | 3 +- 3 files changed, 73 insertions(+), 18 deletions(-) diff --git a/common/src/main/ets/default/Log.ts b/common/src/main/ets/default/Log.ts index 0a5170ae..1d0f16c9 100644 --- a/common/src/main/ets/default/Log.ts +++ b/common/src/main/ets/default/Log.ts @@ -12,8 +12,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import HiLog from '@ohos.hilog'; +const DOMAIN: number = 0x001A; const TAG = "SystemUI_Default"; +const SYMBOL = " --> "; const FILTER_KEYS = [ new RegExp('hide', "gi") ] @@ -36,32 +39,83 @@ export function filterKey(target: any, propKey: string, descriptor: PropertyDesc */ export default class Log { /** - * print info level log + * Outputs debug-level logs. * - * @param {string} tag - Page or class tag - * @param {string} log - Log needs to be printed + * @param tag Identifies the log tag. + * @param format Indicates the log format string. + * @param args Indicates the log parameters. + * @since 7 */ - static showInfo(tag: string, log: string) { - console.info(`${TAG} tag: ${tag} --> ${log}`); + static showDebug(tag: string, format: string, ...args: any[]) { + if (Log.isLoggable(HiLog.LogLevel.DEBUG)) { + HiLog.debug(DOMAIN, TAG, tag + SYMBOL + format, args); + } } /** - * print debug level log + * Outputs info-level logs. * - * @param {string} tag - Page or class tag - * @param {string} log - Log needs to be printed + * @param tag Identifies the log tag. + * @param format Indicates the log format string. + * @param args Indicates the log parameters. + * @since 7 */ - static showDebug(tag: string, log: string) { - console.debug(`${TAG} tag: ${tag} --> ${log}`); + static showInfo(tag: string, format: string, ...args: any[]) { + if (Log.isLoggable(HiLog.LogLevel.INFO)) { + HiLog.info(DOMAIN, TAG, tag + SYMBOL + format, args); + } } /** - * print error level log + * Outputs warning-level logs. * - * @param {string} tag - Page or class tag - * @param {string} log - Log needs to be printed + * @param tag Identifies the log tag. + * @param format Indicates the log format string. + * @param args Indicates the log parameters. + * @since 7 */ - static showError(tag: string, log: string) { - console.error(`${TAG} tag: ${tag} --> ${log}`); + static showWarn(tag: string, format: string, ...args: any[]) { + if (Log.isLoggable(HiLog.LogLevel.WARN)) { + HiLog.warn(DOMAIN, TAG, tag + SYMBOL + format, args); + } + } + + /** + * Outputs error-level logs. + * + * @param tag Identifies the log tag. + * @param format Indicates the log format string. + * @param args Indicates the log parameters. + * @since 7 + */ + static showError(tag: string, format: string, ...args: any[]) { + if (Log.isLoggable(HiLog.LogLevel.ERROR)) { + HiLog.error(DOMAIN, TAG, tag + SYMBOL + format, args); + } + } + + /** + * Outputs fatal-level logs. + * + * @param tag Identifies the log tag. + * @param format Indicates the log format string. + * @param args Indicates the log parameters. + * @since 7 + */ + static showFatal(tag: string, format: string, ...args: any[]) { + if (Log.isLoggable(HiLog.LogLevel.FATAL)) { + HiLog.fatal(DOMAIN, TAG, tag + SYMBOL + format, args); + } + } + + /** + * Checks whether logs of the specified tag, and level can be printed. + * + * @param tag Identifies the log tag. + * @param level log level + * @since 7 + */ + private static isLoggable(level: HiLog.LogLevel): boolean { + return HiLog.isLoggable(DOMAIN, TAG, level); } } diff --git a/common/src/main/ets/template/iconTitleBase.ets b/common/src/main/ets/template/iconTitleBase.ets index 53556587..69a3cb7f 100644 --- a/common/src/main/ets/template/iconTitleBase.ets +++ b/common/src/main/ets/template/iconTitleBase.ets @@ -58,11 +58,11 @@ export default struct iconBaseComponent { }) } .onClick(() => { - console.log(`start clickEvent ${this.changeSwitch}`) + Log.showDebug(TAG, `start clickEvent ${this.changeSwitch}`); if (this.mClickEvent) { this.mClickEvent() } - console.log(`end clickEvent ${this.changeSwitch}`) + Log.showDebug(TAG, `end clickEvent ${this.changeSwitch}`); }) } .height('100%') diff --git a/doc/Instructions.md b/doc/Instructions.md index 2a6e2292..98937978 100644 --- a/doc/Instructions.md +++ b/doc/Instructions.md @@ -152,7 +152,8 @@ reboot ### log打印 - 在程序中添加 log ```JS -console.info("SystemUI log info"); +import hilog from '@ohos.hilog'; +hilog.info(0x0001, "SystemUI", "%{public}s World %{private}d", "hello", 3); ``` ### log获取及过滤 - log获取 -- Gitee From ea9b9dbd7bf7b779a9f145f6f3453a158224c788 Mon Sep 17 00:00:00 2001 From: zhangyimin Date: Thu, 11 Aug 2022 17:09:19 +0800 Subject: [PATCH 232/373] =?UTF-8?q?[ScreenLock]=E6=97=A5=E5=BF=97=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E5=B7=A5=E5=85=B7=E6=9B=BF=E6=8D=A2=E6=88=90hilog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangyimin --- common/src/main/ets/default/Log.ts | 86 +++++++++++++++---- .../src/main/ets/Application/AbilityStage.ts | 7 +- entry/src/main/ets/MainAbility/MainAbility.ts | 15 ++-- .../src/main/ets/default/app.ets | 7 +- .../src/main/ets/default/app.ets | 15 ++-- .../src/main/ets/default/pages/signalIcon.ets | 2 +- .../src/main/ets/default/app.ets | 8 +- 7 files changed, 105 insertions(+), 35 deletions(-) diff --git a/common/src/main/ets/default/Log.ts b/common/src/main/ets/default/Log.ts index 855d0e43..de667141 100644 --- a/common/src/main/ets/default/Log.ts +++ b/common/src/main/ets/default/Log.ts @@ -12,8 +12,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import hiLog from '@ohos.hilog'; -const TAG = 'ScreenLock-Default'; +const DOMAIN: number = 0x002A; +const TAG = "ScreenLock_Default"; +const SYMBOL = " --> "; const FILTER_KEYS = [ new RegExp('hide', "gi") ] @@ -36,32 +39,83 @@ export function filterKey(target: any, propKey: string, descriptor: PropertyDesc */ export default class Log { /** - * print info level log + * Outputs debug-level logs. * - * @param {string} tag - Page or class tag - * @param {string} log - Log needs to be printed + * @param tag Identifies the log tag. + * @param format Indicates the log format string. + * @param args Indicates the log parameters. + * @since 7 */ - static showInfo(tag: string, log: string) { - console.info(`${TAG} tag: ${tag} --> ${log}`); + static showDebug(tag: string, format: string, ...args: any[]) { + if (Log.isLogGable(hiLog.LogLevel.DEBUG)) { + hiLog.debug(DOMAIN, TAG, tag + SYMBOL + format, args); + } } /** - * print debug level log + * Outputs info-level logs. * - * @param {string} tag - Page or class tag - * @param {string} log - Log needs to be printed + * @param tag Identifies the log tag. + * @param format Indicates the log format string. + * @param args Indicates the log parameters. + * @since 7 */ - static showDebug(tag: string, log: string) { - console.debug(`${TAG} tag: ${tag} --> ${log}`); + static showInfo(tag: string, format: string, ...args: any[]) { + if (Log.isLogGable(hiLog.LogLevel.INFO)) { + hiLog.info(DOMAIN, TAG, tag + SYMBOL + format, args); + } } /** - * print error level log + * Outputs warning-level logs. * - * @param {string} tag - Page or class tag - * @param {string} log - Log needs to be printed + * @param tag Identifies the log tag. + * @param format Indicates the log format string. + * @param args Indicates the log parameters. + * @since 7 */ - static showError(tag: string, log: string) { - console.error(`${TAG} tag: ${tag} --> ${log}`); + static showWarn(tag: string, format: string, ...args: any[]) { + if (Log.isLogGable(hiLog.LogLevel.WARN)) { + hiLog.warn(DOMAIN, TAG, tag + SYMBOL + format, args); + } + } + + /** + * Outputs error-level logs. + * + * @param tag Identifies the log tag. + * @param format Indicates the log format string. + * @param args Indicates the log parameters. + * @since 7 + */ + static showError(tag: string, format: string, ...args: any[]) { + if (Log.isLogGable(hiLog.LogLevel.ERROR)) { + hiLog.error(DOMAIN, TAG, tag + SYMBOL + format, args); + } + } + + /** + * Outputs fatal-level logs. + * + * @param tag Identifies the log tag. + * @param format Indicates the log format string. + * @param args Indicates the log parameters. + * @since 7 + */ + static showFatal(tag: string, format: string, ...args: any[]) { + if (Log.isLogGable(hiLog.LogLevel.FATAL)) { + hiLog.fatal(DOMAIN, TAG, tag + SYMBOL + format, args); + } + } + + /** + * Checks whether logs of the specified tag, and level can be printed. + * + * @param tag Identifies the log tag. + * @param level log level + * @since 7 + */ + private static isLogGable(level: hiLog.LogLevel): boolean { + return hiLog.isLoggable(DOMAIN, TAG, level); } } diff --git a/entry/src/main/ets/Application/AbilityStage.ts b/entry/src/main/ets/Application/AbilityStage.ts index ef2476ea..577fcde6 100644 --- a/entry/src/main/ets/Application/AbilityStage.ts +++ b/entry/src/main/ets/Application/AbilityStage.ts @@ -13,10 +13,13 @@ * limitations under the License. */ -import AbilityStage from "@ohos.application.AbilityStage" +import AbilityStage from "@ohos.application.AbilityStage"; +import Log from '../../../../../common/src/main/ets/default/Log'; + +const TAG = "Entry_AbilityStage"; export default class MyAbilityStage extends AbilityStage { onCreate() { - console.log("[Demo] MyAbilityStage onCreate") + Log.showInfo(TAG, "MyAbilityStage onCreate") } } \ No newline at end of file diff --git a/entry/src/main/ets/MainAbility/MainAbility.ts b/entry/src/main/ets/MainAbility/MainAbility.ts index 220392de..0478f1c8 100644 --- a/entry/src/main/ets/MainAbility/MainAbility.ts +++ b/entry/src/main/ets/MainAbility/MainAbility.ts @@ -14,36 +14,39 @@ */ import Ability from '@ohos.application.Ability' +import Log from '../../../../../common/src/main/ets/default/Log'; + +const TAG = "Entry_MainAbility"; export default class MainAbility extends Ability { onCreate(want, launchParam) { - console.log("[Demo] MainAbility onCreate") + Log.showInfo(TAG, "MainAbility onCreate") globalThis.abilityWant = want; } onDestroy() { - console.log("[Demo] MainAbility onDestroy") + Log.showInfo(TAG, "MainAbility onDestroy") } onWindowStageCreate(windowStage) { // Main window is created, set main page for this ability - console.log("[Demo] MainAbility onWindowStageCreate") + Log.showInfo(TAG, "MainAbility onWindowStageCreate") windowStage.setUIContent(this.context, "pages/index", null) } onWindowStageDestroy() { // Main window is destroyed, release UI related resources - console.log("[Demo] MainAbility onWindowStageDestroy") + Log.showInfo(TAG, "MainAbility onWindowStageDestroy") } onForeground() { // Ability has brought to foreground - console.log("[Demo] MainAbility onForeground") + Log.showInfo(TAG, "MainAbility onForeground") } onBackground() { // Ability has back to background - console.log("[Demo] MainAbility onBackground") + Log.showInfo(TAG, "MainAbility onBackground") } }; diff --git a/features/clockcomponent/src/main/ets/default/app.ets b/features/clockcomponent/src/main/ets/default/app.ets index 2a3b6238..c23e8763 100644 --- a/features/clockcomponent/src/main/ets/default/app.ets +++ b/features/clockcomponent/src/main/ets/default/app.ets @@ -12,12 +12,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import Log from '../../../../../../common/src/main/ets/default/Log'; + +const TAG = "Clock_Component_APP"; export default { onCreate() { - console.info('Application onCreate') + Log.showInfo(TAG, 'Application onCreate') }, onDestroy() { - console.info('Application onDestroy') + Log.showInfo(TAG, 'Application onDestroy') }, } diff --git a/features/signalcomponent/src/main/ets/default/app.ets b/features/signalcomponent/src/main/ets/default/app.ets index 4d568aa2..e87d720a 100644 --- a/features/signalcomponent/src/main/ets/default/app.ets +++ b/features/signalcomponent/src/main/ets/default/app.ets @@ -12,12 +12,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import Log from '../../../../../../common/src/main/ets/default/Log'; + +const TAG = "Signal_Component_APP"; export default { - onCreate() { - console.info('SystemUI statusBar Application onDestroy') - }, - onDestroy() { - console.info('SystemUI statusBar Application onDestroy') - }, + onCreate() { + Log.showInfo(TAG, 'SystemUI statusBar Application onDestroy') + }, + onDestroy() { + Log.showInfo(TAG, 'SystemUI statusBar Application onDestroy') + }, } diff --git a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets index 6acc7e6c..248a0156 100644 --- a/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets +++ b/features/signalcomponent/src/main/ets/default/pages/signalIcon.ets @@ -146,7 +146,7 @@ export default struct SignalIcon { cellularImage = $r('app.media.ic_statusbar_signal_no'); break; } - console.info('systemui updateCellularImage = ' + cellularImage); + Log.showInfo(TAG, 'systemui updateCellularImage = ' + cellularImage); return cellularImage; } diff --git a/features/wificomponent/src/main/ets/default/app.ets b/features/wificomponent/src/main/ets/default/app.ets index 2a3b6238..dfd326fc 100644 --- a/features/wificomponent/src/main/ets/default/app.ets +++ b/features/wificomponent/src/main/ets/default/app.ets @@ -13,11 +13,15 @@ * limitations under the License. */ +import Log from '../../../../../../common/src/main/ets/default/Log'; + +const TAG = "Wifi_Component_App"; + export default { onCreate() { - console.info('Application onCreate') + Log.showInfo(TAG, 'Application onCreate') }, onDestroy() { - console.info('Application onDestroy') + Log.showInfo(TAG, 'Application onDestroy') }, } -- Gitee From 0518311bbeda2421e33bed8ac6fc7a4e91365b1e Mon Sep 17 00:00:00 2001 From: lizhi Date: Sat, 13 Aug 2022 16:27:30 +0800 Subject: [PATCH 233/373] =?UTF-8?q?[SystemUI]=E4=BF=AE=E5=A4=8DRK=E4=B8=8A?= =?UTF-8?q?=E6=A8=AA=E5=B9=85=E9=80=9A=E7=9F=A5=E4=B8=8D=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../src/main/ets/pages/bannerNotification.ets | 93 ++++++++++++++++--- .../resources/base/profile/main_pages.json | 3 +- 2 files changed, 84 insertions(+), 12 deletions(-) diff --git a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets index 17eba5bc..475d8257 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/bannerNotification.ets @@ -13,16 +13,40 @@ * limitations under the License. */ -import Log from '../../../../../../../common/src/main/ets/default/Log' -import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager' -import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager' -import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager" -import BannerNotification from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/item/bannernotificationitem' -import ViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/NotificationViewModel'; +import Log from '../../../../../../../common/src/main/ets/default/Log'; +import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; +import WindowManager, { WindowType } from '../../../../../../../common/src/main/ets/default/windowmanager'; +import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/eventmanager"; +import BannerNotification from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/view/item/bannernotificationitem'; +import NotificationViewModel from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/viewmodel/NotificationViewModel'; import NotificationConstants, { ScreenLockStatus } from '../../../../../../../features/noticeitem/src/main/ets/com/ohos/noticeitem/common/constants'; -const TAG = 'DropdownPanel-BannerNotification' - +const TAG = 'DropdownPanel-BannerNotification'; +const TRANSLATE_SIZE = '382vp'; +const ANIM_CONFIG = { + duration: 250, + tempo: 1.0, + curve: Curve.Friction, + delay: 0, + iterations: 1, + playMode: PlayMode.Normal, +} +const OPACITY_SHOW_ANIM_CONFIG = { + duration: 200, + tempo: 1.0, + curve: Curve.Friction, + delay: 0, + iterations: 1, + playMode: PlayMode.Normal, +} +const OPACITY_HIDE_ANIM_CONFIG = { + duration: 200, + tempo: 1.0, + curve: Curve.Friction, + delay: 50, + iterations: 1, + playMode: PlayMode.Normal, +} @Entry @Component @@ -33,6 +57,9 @@ struct Index { @State needExpand: boolean = true @State isExpand: boolean = false; @State pageData: any = {}; + @State mOpacity: number = 0.0; + @State mWidthSize: number = 0.8; + @State mTranslate: string = TRANSLATE_SIZE; mClearCallbacks: unsubscribe[] mDefaultBannerRect: any; @@ -76,6 +103,13 @@ struct Index { } .width('100%') .height('100%') + .clip(true) + .opacity(this.mOpacity) + .scale({ + x: this.mWidthSize, + centerX: '100%' + }) + .translate({x: this.mTranslate}) } onBannerNoticeShow() { @@ -113,12 +147,11 @@ struct Index { WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); WindowManager.showWindow(WindowType.BANNER_NOTICE); Log.showDebug(TAG, `onBannerNoticeShow end`); + this.showWindowAnim(); } onBannerNoticeHide() { - this.mBannerNoticeCnt = 0; - WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); - WindowManager.hideWindow(WindowType.BANNER_NOTICE); + this.hideWindowAnim(); } checkItemNeedExpand() { @@ -130,4 +163,42 @@ struct Index { } } + _animateTo(config, callback) { + animateTo(config, callback); + setTimeout(config.onFinish, config.duration + config.delay); + } + + showWindowAnim() { + Log.showDebug(TAG, `show anim start`); + this._animateTo({ ...ANIM_CONFIG, onFinish: () => { + Log.showInfo(TAG, `show anim finish`); + } }, () => { + Log.showInfo(TAG, `do show anim`); + this.mWidthSize = 1.0; + this.mTranslate = '0vp'; + }); + this._animateTo({ ...OPACITY_SHOW_ANIM_CONFIG, onFinish: () => { + } }, () => { + this.mOpacity = 1.0; + }); + } + + hideWindowAnim() { + Log.showDebug(TAG, `hide anim start`); + this._animateTo({ ...ANIM_CONFIG, onFinish: () => { + Log.showInfo(TAG, `hide anim finish`); + this.mBannerNoticeCnt = 0; + WindowManager.resetSizeWindow(WindowType.BANNER_NOTICE, this.mDefaultBannerRect); + WindowManager.hideWindow(WindowType.BANNER_NOTICE); + } + }, () => { + Log.showInfo(TAG, `do hide anim`); + this.mWidthSize = 0.8; + this.mTranslate = TRANSLATE_SIZE; + }); + this._animateTo({ ...OPACITY_HIDE_ANIM_CONFIG, onFinish: () => {} + }, () => { + this.mOpacity = 0.0; + }); + } } diff --git a/product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json b/product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json index feec276e..f368d3c2 100644 --- a/product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json +++ b/product/phone/dropdownpanel/src/main/resources/base/profile/main_pages.json @@ -1,5 +1,6 @@ { "src": [ - "pages/index" + "pages/index", + "pages/bannerNotification" ] } -- Gitee From e2a7b81a53a99d44d7a82e94a468ba92572c58d0 Mon Sep 17 00:00:00 2001 From: lizhi Date: Sat, 13 Aug 2022 16:35:13 +0800 Subject: [PATCH 234/373] =?UTF-8?q?[SystemUI]=E4=BF=AE=E5=A4=8DRK=E4=B8=8A?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=8F=E4=B8=8B=E6=8B=89=EF=BC=8C=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E6=B6=88=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../src/main/ets/default/BaseStyleManager.ts | 69 ---- .../main/ets/default/CommonStyleManager.ts | 19 +- .../main/ets/default/StyleConfiguration.ts | 4 +- .../ets/template/common/StyleConfiguration.ts | 8 +- .../ets/default/common/StyleConfiguration.ts | 6 +- .../ets/com/ohos/common/StyleConfiguration.ts | 4 +- .../ets/default/common/StyleConfiguration.ts | 4 +- .../ets/default/common/StyleConfiguration.ts | 4 +- .../ets/default/common/StyleConfiguration.ts | 4 +- .../ets/com/ohos/common/StyleConfiguration.ts | 20 +- .../ets/com/ohos/common/StyleConfiguration.ts | 4 +- .../ets/com/ohos/common/StyleConfiguration.ts | 6 +- .../ets/com/ohos/common/StyleConfiguration.ts | 6 +- .../ets/default/common/StyleConfiguration.ts | 4 +- .../ets/com/ohos/common/StyleConfiguration.ts | 10 +- .../ets/com/ohos/common/StyleConfiguration.ts | 4 +- .../ets/default/common/StyleConfiguration.ts | 4 +- .../src/main/ets/common/StyleConfiguration.ts | 4 +- .../src/main/ets/common/StyleManager.ts | 60 ++-- .../src/main/ets/pages/index.ets | 2 + .../src/main/ets/common/StyleConfiguration.ts | 4 +- .../src/main/ets/common/StyleManager.ts | 55 ++-- .../volumepanel/src/main/ets/pages/index.ets | 2 + .../ets/pages/common/StyleConfiguration.ts | 4 +- .../src/main/ets/pages/common/StyleManager.ts | 302 +++++++++--------- .../controlpanel/src/main/ets/pages/index.ets | 2 + .../ets/pages/common/StyleConfiguration.ts | 4 +- .../src/main/ets/pages/common/StyleManager.ts | 33 +- .../ets/pages/common/StyleConfiguration.ts | 4 +- .../src/main/ets/pages/common/StyleManager.ts | 181 +++++------ .../pc/statusbar/src/main/ets/pages/index.ets | 2 + .../ets/pages/common/StyleConfiguration.ts | 10 +- .../src/main/ets/pages/common/StyleManager.ts | 299 ++++++++--------- .../src/main/ets/pages/index.ets | 2 + .../ets/pages/common/StyleConfiguration.ts | 4 +- .../src/main/ets/pages/common/StyleManager.ts | 31 +- .../statusbar/src/main/ets/pages/index.ets | 2 + 37 files changed, 585 insertions(+), 602 deletions(-) delete mode 100644 common/src/main/ets/default/BaseStyleManager.ts diff --git a/common/src/main/ets/default/BaseStyleManager.ts b/common/src/main/ets/default/BaseStyleManager.ts deleted file mode 100644 index e617ebad..00000000 --- a/common/src/main/ets/default/BaseStyleManager.ts +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2021-2022 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 Log from "./Log"; - -const TAG = "Base-StyleManager"; - -export default class BaseStyleManager { - // standard display width - static readonly STANDARD_DISPLAY_WIDTH_LARGE: number = 2560; - static readonly STANDARD_DISPLAY_WIDTH_NORMAL: number = 1280; - static readonly STANDARD_DISPLAY_WIDTH_SMALL: number = 720; - - mAbilityPageName = ""; - maxWidth: number = BaseStyleManager.STANDARD_DISPLAY_WIDTH_NORMAL; - standardWidth: number = BaseStyleManager.STANDARD_DISPLAY_WIDTH_NORMAL; - - constructor(name: string) { - Log.showInfo(TAG, `constructor, name: ${name}`); - this.mAbilityPageName = name; - } - - setAbilityPageName(name: string): void { - Log.showInfo(TAG, `setAbilityPageName, name: ${name}`); - this.mAbilityPageName = name; - } - - setMaxWidth(width: number): void { - Log.showInfo(TAG, `setMaxWidth, width: ${width}`); - this.maxWidth = width; - } - - setStandardWidth(width: number): void { - Log.showInfo(TAG, `setStandardWidth, width: ${width}`); - this.standardWidth = width; - } - - getStyle(key: string, defaultStyle: { new(): T }): T { - let newKey = this.mAbilityPageName + "-" + key; - if (!AppStorage.Has(newKey)) { - AppStorage.SetOrCreate(newKey, new defaultStyle()); - Log.showInfo(TAG, `Create storageKey of ${newKey}`); - } - return AppStorage.Get(newKey) as T; - } - - number2px(n: number): string { - return n.toString() + "px"; - } - - calcScaleSize(n: number): number { - return n * this.maxWidth / this.standardWidth; - } - - calcScaleSizePx(n: number): string { - return this.number2px(this.calcScaleSize(n)); - } -} \ No newline at end of file diff --git a/common/src/main/ets/default/CommonStyleManager.ts b/common/src/main/ets/default/CommonStyleManager.ts index b131315e..1f9fa1ff 100644 --- a/common/src/main/ets/default/CommonStyleManager.ts +++ b/common/src/main/ets/default/CommonStyleManager.ts @@ -12,17 +12,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import BaseStyleManager from "./BaseStyleManager"; import Log from "./Log"; const TAG = "Common-StyleManager"; -export class CommonStyleManager extends BaseStyleManager { - static readonly ABILITY_PAGE_NAME_COMMON = "Common-Index"; +export class CommonStyleManager { + mAbilityPageName = ''; - constructor() { - super(CommonStyleManager.ABILITY_PAGE_NAME_COMMON); + setAbilityPageName(name: string): void{ + Log.showInfo(TAG, `setAbilityPageName, name: ${name}`); + this.mAbilityPageName = name; + } + + getStyle(key: string, defaultStyle: { new(): T }): T { + let newKey = this.mAbilityPageName + "-" + key; + if (!AppStorage.Has(newKey)) { + AppStorage.SetOrCreate(newKey, new defaultStyle()); + Log.showInfo(TAG, `Create storageKey of ${newKey}`); } + return AppStorage.Get(newKey) as T; + } } let commonStyleManager = new CommonStyleManager(); diff --git a/common/src/main/ets/default/StyleConfiguration.ts b/common/src/main/ets/default/StyleConfiguration.ts index a1ac8bc9..92370d8f 100644 --- a/common/src/main/ets/default/StyleConfiguration.ts +++ b/common/src/main/ets/default/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from './CommonStyleManager'; +import CommonStyleManager from './CommonStyleManager'; import deviceInfo from '@ohos.deviceInfo'; const TAG = 'Common-StyleConfiguration'; @@ -30,6 +30,6 @@ export class CommonStyle { export default class StyleConfiguration { static getCommonStyle(): CommonStyle { const key: string = TAG + '-Common'; - return StyleManager.getStyle(key, CommonStyle); + return CommonStyleManager.getStyle(key, CommonStyle); } } \ No newline at end of file diff --git a/common/src/main/ets/template/common/StyleConfiguration.ts b/common/src/main/ets/template/common/StyleConfiguration.ts index 1dcebe2f..0c0e248b 100644 --- a/common/src/main/ets/template/common/StyleConfiguration.ts +++ b/common/src/main/ets/template/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../default/CommonStyleManager'; +import CommonStyleManager from '../../default/CommonStyleManager'; const TAG = 'CommonTemplate-StyleConfiguration'; @@ -72,16 +72,16 @@ export class SimpleToggleBaseStyle { export default class StyleConfiguration { static getIconTitleBaseStyle(): IconTitleBaseStyle { const key: string = TAG + '-IconTitleBase'; - return StyleManager.getStyle(key, IconTitleBaseStyle); + return CommonStyleManager.getStyle(key, IconTitleBaseStyle); } static getIconComponentStyle(): IconComponentStyle { const key: string = TAG + '-IconComponent'; - return StyleManager.getStyle(key, IconComponentStyle); + return CommonStyleManager.getStyle(key, IconComponentStyle); } static getSimpleToggleBaseStyle(): SimpleToggleBaseStyle { const key: string = TAG + '-SimpleToggleBase'; - return StyleManager.getStyle(key, SimpleToggleBaseStyle); + return CommonStyleManager.getStyle(key, SimpleToggleBaseStyle); } } \ No newline at end of file diff --git a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts index cf4b7264..55b35248 100644 --- a/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/batterycomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'battery-StyleConfiguration'; @@ -38,11 +38,11 @@ export class BatteryPicStyle { export default class StyleConfiguration { static getBatteryComponentStyle(): BatteryComponentStyle { const key: string = TAG + '-BatteryComponent'; - return StyleManager.getStyle(key, BatteryComponentStyle); + return CommonStyleManager.getStyle(key, BatteryComponentStyle); } static getBatteryPicStyle(): BatteryPicStyle { const key: string = TAG + '-BatteryPicComponent'; - return StyleManager.getStyle(key, BatteryPicStyle); + return CommonStyleManager.getStyle(key, BatteryPicStyle); } } \ No newline at end of file diff --git a/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index e6b9aa58..c39f8d70 100644 --- a/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/bluetoothcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'bluetooth-StyleConfiguration'; @@ -25,6 +25,6 @@ export class StatusBarBluetoothComponentStyle { export default class StyleConfiguration { static getStatusBarBluetoothComponentStyle(): StatusBarBluetoothComponentStyle { const key: string = TAG + '-StatusBarBluetoothComponent'; - return StyleManager.getStyle(key, StatusBarBluetoothComponentStyle); + return CommonStyleManager.getStyle(key, StatusBarBluetoothComponentStyle); } } \ No newline at end of file diff --git a/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts index 015525a8..dc39941e 100644 --- a/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/brightnesscomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'brightness-StyleConfiguration'; @@ -36,6 +36,6 @@ export class BrightnessComponentStyle { export default class StyleConfiguration { static getBrightnessComponentStyle(): BrightnessComponentStyle { const key: string = TAG + '-BrightnessComponent'; - return StyleManager.getStyle(key, BrightnessComponentStyle); + return CommonStyleManager.getStyle(key, BrightnessComponentStyle); } } \ No newline at end of file diff --git a/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts index b8e58624..aea2967d 100644 --- a/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/capsulecomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; import Constants from './constants'; const TAG = 'capsule-StyleConfiguration'; @@ -32,6 +32,6 @@ export class CapsuleComponentStyle { export default class StyleConfiguration { static getCapsuleComponentStyle(): CapsuleComponentStyle { const key: string = TAG + '-CapsuleComponent'; - return StyleManager.getStyle(key, CapsuleComponentStyle); + return CommonStyleManager.getStyle(key, CapsuleComponentStyle); } } \ No newline at end of file diff --git a/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts index 902821b5..1c654568 100644 --- a/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/clockcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'clock-StyleConfiguration'; @@ -24,6 +24,6 @@ export class ClockComponentStyle { export default class StyleConfiguration { static getClockComponentStyle(): ClockComponentStyle { const key: string = TAG + '-ClockComponent'; - return StyleManager.getStyle(key, ClockComponentStyle); + return CommonStyleManager.getStyle(key, ClockComponentStyle); } } \ No newline at end of file diff --git a/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 3aca71ae..abc6f7f6 100644 --- a/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/controlcentercomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; import Constants from './Constants'; const TAG = 'ControlCenter-StyleConfiguration'; @@ -134,46 +134,46 @@ export class ControlEditDialogStyle { export default class StyleConfiguration { static getControlCenterComponentStyle(): ControlCenterComponentStyle { const key: string = TAG + '-ControlCenterComponent'; - return StyleManager.getStyle(key, ControlCenterComponentStyle); + return CommonStyleManager.getStyle(key, ControlCenterComponentStyle); } static getControlCenterUpTitleStyle(): ControlCenterUpTitleStyle { const key: string = TAG + '-ControlCenterUpTitle'; - return StyleManager.getStyle(key, ControlCenterUpTitleStyle); + return CommonStyleManager.getStyle(key, ControlCenterUpTitleStyle); } static getControlCenterComplexToggleLayoutStyle(): ControlCenterComplexToggleLayoutStyle { const key: string = TAG + '-ControlCenterComplexToggleLayout'; - return StyleManager.getStyle(key, ControlCenterComplexToggleLayoutStyle); + return CommonStyleManager.getStyle(key, ControlCenterComplexToggleLayoutStyle); } static getControlCenterSimpleToggleLayoutStyle(): ControlCenterSimpleToggleLayoutStyle { const key: string = TAG + '-ControlCenterSimpleToggleLayout'; - return StyleManager.getStyle(key, ControlCenterSimpleToggleLayoutStyle); + return CommonStyleManager.getStyle(key, ControlCenterSimpleToggleLayoutStyle); } static getSimpleToggleLayoutEditComponentStyle(): SimpleToggleLayoutEditComponentStyle { const key: string = TAG + '-SimpleToggleLayoutEditComponent'; - return StyleManager.getStyle(key, SimpleToggleLayoutEditComponentStyle); + return CommonStyleManager.getStyle(key, SimpleToggleLayoutEditComponentStyle); } static getSimpleToggleLayoutEditUpTitleStyle(): SimpleToggleLayoutEditUpTitleStyle { const key: string = TAG + '-SimpleToggleLayoutEditUpTitle'; - return StyleManager.getStyle(key, SimpleToggleLayoutEditUpTitleStyle); + return CommonStyleManager.getStyle(key, SimpleToggleLayoutEditUpTitleStyle); } static getSimpleToggleLayoutEditOptMsgStyle(): SimpleToggleLayoutEditOptMsgStyle { const key: string = TAG + '-SimpleToggleLayoutEditOptMsg'; - return StyleManager.getStyle(key, SimpleToggleLayoutEditOptMsgStyle); + return CommonStyleManager.getStyle(key, SimpleToggleLayoutEditOptMsgStyle); } static getSimpleToggleLayoutEditGridStyle(): SimpleToggleLayoutEditGridStyle { const key: string = TAG + '-SimpleToggleLayoutEditGrid'; - return StyleManager.getStyle(key, SimpleToggleLayoutEditGridStyle); + return CommonStyleManager.getStyle(key, SimpleToggleLayoutEditGridStyle); } static getControlEditDialogStyle(): ControlEditDialogStyle { const key: string = TAG + '-ControlEditDialog'; - return StyleManager.getStyle(key, ControlEditDialogStyle); + return CommonStyleManager.getStyle(key, ControlEditDialogStyle); } } \ No newline at end of file diff --git a/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index e2a12703..ebcc056b 100644 --- a/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/locationcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'location-StyleConfiguration'; @@ -25,6 +25,6 @@ export class StartsBarLocationComponentStyle { export default class StyleConfiguration { static getStartsBarLocationComponentStyle(): StartsBarLocationComponentStyle { const key: string = TAG + '-startsBarLocation'; - return StyleManager.getStyle(key, StartsBarLocationComponentStyle); + return CommonStyleManager.getStyle(key, StartsBarLocationComponentStyle); } } \ No newline at end of file diff --git a/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index dadf7ae1..e6cb7526 100644 --- a/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/nfccomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'capsule-StyleConfiguration'; @@ -29,11 +29,11 @@ export class ControlCenterRingModeComponentStyle { export default class StyleConfiguration { static getStatusRingModeComponentStyle(): StatusRingModeComponentStyle { const key: string = TAG + '-StatusRingMode'; - return StyleManager.getStyle(key, StatusRingModeComponentStyle); + return CommonStyleManager.getStyle(key, StatusRingModeComponentStyle); } static getControlCenterRingModeComponentStyle(): ControlCenterRingModeComponentStyle { const key: string = TAG + '-ControlCenterRingMode'; - return StyleManager.getStyle(key, ControlCenterRingModeComponentStyle); + return CommonStyleManager.getStyle(key, ControlCenterRingModeComponentStyle); } } \ No newline at end of file diff --git a/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index dadf7ae1..e6cb7526 100644 --- a/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/ringmodecomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'capsule-StyleConfiguration'; @@ -29,11 +29,11 @@ export class ControlCenterRingModeComponentStyle { export default class StyleConfiguration { static getStatusRingModeComponentStyle(): StatusRingModeComponentStyle { const key: string = TAG + '-StatusRingMode'; - return StyleManager.getStyle(key, StatusRingModeComponentStyle); + return CommonStyleManager.getStyle(key, StatusRingModeComponentStyle); } static getControlCenterRingModeComponentStyle(): ControlCenterRingModeComponentStyle { const key: string = TAG + '-ControlCenterRingMode'; - return StyleManager.getStyle(key, ControlCenterRingModeComponentStyle); + return CommonStyleManager.getStyle(key, ControlCenterRingModeComponentStyle); } } \ No newline at end of file diff --git a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts index 138d94d4..2c9b91ae 100644 --- a/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/signalcomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'signal-StyleConfiguration'; @@ -29,6 +29,6 @@ export class SignalComponentStyle { export default class StyleConfiguration { static getSignalComponentStyle(): SignalComponentStyle { const key: string = TAG + '-SignalComponent'; - return StyleManager.getStyle(key, SignalComponentStyle); + return CommonStyleManager.getStyle(key, SignalComponentStyle); } } \ No newline at end of file diff --git a/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 2913883f..8f810e85 100644 --- a/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/statusbarcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; import Constants from './Constants'; const TAG = 'statusBar-StyleConfiguration'; @@ -48,21 +48,21 @@ export class PluginIconItemComponentStyle { export default class StyleConfiguration { static getVerticalStatusBarItemLoadComponentStyle(): VerticalStatusBarItemLoadComponentStyle { const key: string = TAG + '-VerticalStatusBarItemLoadComponent'; - return StyleManager.getStyle(key, VerticalStatusBarItemLoadComponentStyle); + return CommonStyleManager.getStyle(key, VerticalStatusBarItemLoadComponentStyle); } static getStatusBarNotificationIconStyle(): StatusBarNotificationIconStyle { const key: string = TAG + '-StatusBarNotificationIcon'; - return StyleManager.getStyle(key, StatusBarNotificationIconStyle); + return CommonStyleManager.getStyle(key, StatusBarNotificationIconStyle); } static getIconItemComponentStyle(): IconItemComponentStyle { const key: string = TAG + '-IconItemComponent'; - return StyleManager.getStyle(key, IconItemComponentStyle); + return CommonStyleManager.getStyle(key, IconItemComponentStyle); } static getPluginIconItemComponentStyle(): PluginIconItemComponentStyle { const key: string = TAG + '-PluginIconItemComponent'; - return StyleManager.getStyle(key, PluginIconItemComponentStyle); + return CommonStyleManager.getStyle(key, PluginIconItemComponentStyle); } } \ No newline at end of file diff --git a/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts b/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts index 181da825..50915677 100644 --- a/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts +++ b/features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; import Constants from './Constants'; const TAG = 'volumepanel-StyleConfiguration'; @@ -44,6 +44,6 @@ export class VolumePanelComponentStyle { export default class StyleConfiguration { static getVolumePanelComponentStyle(): VolumePanelComponentStyle { const key: string = TAG + '-VolumePanelComponent'; - return StyleManager.getStyle(key, VolumePanelComponentStyle); + return CommonStyleManager.getStyle(key, VolumePanelComponentStyle); } } \ No newline at end of file diff --git a/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts b/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts index b1582bd9..0fc05e7b 100644 --- a/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts +++ b/features/wificomponent/src/main/ets/default/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'wifi-StyleConfiguration'; @@ -25,6 +25,6 @@ export class StartsBarWifiComponentStyle { export default class StyleConfiguration { static getStartsBarWifiComponentStyle(): StartsBarWifiComponentStyle { const key: string = TAG + '-startsBarWifi'; - return StyleManager.getStyle(key, StartsBarWifiComponentStyle); + return CommonStyleManager.getStyle(key, StartsBarWifiComponentStyle); } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts b/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts index 6ba79572..3873a112 100644 --- a/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts +++ b/product/default/navigationBar/src/main/ets/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from './StyleManager'; +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'NavigationBar-StyleConfiguration'; @@ -28,6 +28,6 @@ export class KeyButtonStyle { export default class StyleConfiguration { static getKeyButtonStyle(): KeyButtonStyle { const key: string = TAG + '-KeyButton'; - return StyleManager.getStyle(key, KeyButtonStyle); + return CommonStyleManager.getStyle(key, KeyButtonStyle); } } \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/common/StyleManager.ts b/product/default/navigationBar/src/main/ets/common/StyleManager.ts index 9c425818..c447c600 100644 --- a/product/default/navigationBar/src/main/ets/common/StyleManager.ts +++ b/product/default/navigationBar/src/main/ets/common/StyleManager.ts @@ -13,56 +13,64 @@ * limitations under the License. */ import Log from '../../../../../../../common/src/main/ets/default/Log'; -import BaseStyleManager from '../../../../../../../common/src/main/ets/default/BaseStyleManager'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import StyleConfiguration from './StyleConfiguration'; const TAG = 'StatusBar-StyleManager'; -export class StyleManager extends BaseStyleManager { - static readonly ABILITY_PAGE_NAME_NAVIGATION_BAR = "NavigationBar-Index"; +export default class StyleManager { + static readonly PAD_STANDARD_DISPLAY_WIDTH = 1280; + static readonly PAD_STANDARD_DISPLAY_HEIGHT = 800; + static readonly PHONE_STANDARD_DISPLAY_WIDTH = 720; + static readonly PHONE_STANDARD_DISPLAY_HEIGHT = 1280; + static maxWidth: number = StyleManager.PAD_STANDARD_DISPLAY_WIDTH; + static rumMode = 'pad'; - constructor() { - super(StyleManager.ABILITY_PAGE_NAME_NAVIGATION_BAR); - } - - setPadStyle(): void { + static setPadStyle(): void { Log.showDebug(TAG, 'setPadStyle'); let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); - this.setMaxWidth(config.maxWidth); - this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_NORMAL); + StyleManager.maxWidth = config.maxWidth; + StyleManager.rumMode = 'pad'; // keyButton { let style = StyleConfiguration.getKeyButtonStyle(); - style.buttonWidth = this.calcScaleSizePx(88); - style.buttonHeight = this.calcScaleSizePx(44); - style.buttonBorderRadius = this.calcScaleSizePx(22); - style.buttonIconWidth = this.calcScaleSizePx(15); - style.buttonIconHeight = this.calcScaleSizePx(15); + style.buttonWidth = StyleManager.calcScaleSizePx(88); + style.buttonHeight = StyleManager.calcScaleSizePx(44); + style.buttonBorderRadius = StyleManager.calcScaleSizePx(22); + style.buttonIconWidth = StyleManager.calcScaleSizePx(15); + style.buttonIconHeight = StyleManager.calcScaleSizePx(15); } } - setPhoneStyle(): void { + static setPhoneStyle(): void { Log.showDebug(TAG, 'setPhoneStyle'); let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NAVIGATION_BAR, 'config'); - this.setMaxWidth(config.maxWidth); - this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_SMALL); + StyleManager.maxWidth = config.maxWidth; + StyleManager.rumMode = 'phone'; // keyButton { let style = StyleConfiguration.getKeyButtonStyle(); - style.buttonWidth = this.calcScaleSizePx(144); - style.buttonHeight = this.calcScaleSizePx(72); - style.buttonBorderRadius = this.calcScaleSizePx(36); - style.buttonIconWidth = this.calcScaleSizePx(24); - style.buttonIconHeight = this.calcScaleSizePx(24); + style.buttonWidth = StyleManager.calcScaleSizePx(144); + style.buttonHeight = StyleManager.calcScaleSizePx(72); + style.buttonBorderRadius = StyleManager.calcScaleSizePx(36); + style.buttonIconWidth = StyleManager.calcScaleSizePx(24); + style.buttonIconHeight = StyleManager.calcScaleSizePx(24); } } -} -let styleManager = new StyleManager(); + static number2px(n: number): string { + return n.toString() + 'px'; + } + + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / (StyleManager.rumMode == 'pad' ? StyleManager.PAD_STANDARD_DISPLAY_WIDTH : StyleManager.PHONE_STANDARD_DISPLAY_WIDTH); + } -export default styleManager; \ No newline at end of file + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/default/navigationBar/src/main/ets/pages/index.ets b/product/default/navigationBar/src/main/ets/pages/index.ets index a1fbebf4..c77199c3 100644 --- a/product/default/navigationBar/src/main/ets/pages/index.ets +++ b/product/default/navigationBar/src/main/ets/pages/index.ets @@ -16,6 +16,7 @@ import Three from './threeLayout' import Log from '../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager' import NavigationBarViewModel from '../viewmodel/NavigationBarViewModel'; import {NavigationBarComponentData} from '../common/constants' import StyleManager from '../common/StyleManager' @@ -44,6 +45,7 @@ struct Index { mConfigManager.initConfig(); setAppBgColor('#00000000'); + CommonStyleManager.setAbilityPageName(TAG) if (configInfo.maxWidth > configInfo.maxHeight) { // Pad、PC Mode StyleManager.setPadStyle(); } else { // Phone Mode diff --git a/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts b/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts index ee6d0a7e..11a4668f 100644 --- a/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts +++ b/product/default/volumepanel/src/main/ets/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from './StyleManager'; +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'VolumePanel-StyleConfiguration'; @@ -23,6 +23,6 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, IndexStyle); + return CommonStyleManager.getStyle(key, IndexStyle); } } \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/common/StyleManager.ts b/product/default/volumepanel/src/main/ets/common/StyleManager.ts index 2cc737bc..c1b9f8f3 100644 --- a/product/default/volumepanel/src/main/ets/common/StyleManager.ts +++ b/product/default/volumepanel/src/main/ets/common/StyleManager.ts @@ -12,44 +12,40 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import BaseStyleManager from '../../../../../../../common/src/main/ets/default/BaseStyleManager'; import Log from '../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager'; import StyleConfiguration from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/common/StyleConfiguration'; const TAG = 'VolumePanel-StyleManager'; -export class StyleManager extends BaseStyleManager { - static readonly ABILITY_PAGE_NAME_VOLUMEPANEL = "VolumePanel-Index"; +export default class StyleManager { + static readonly STANDARD_DISPLAY_WIDTH: number = 2560; + static readonly STANDARD_DISPLAY_HEIGHT: number = 1600; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - constructor() { - super(StyleManager.ABILITY_PAGE_NAME_VOLUMEPANEL); - } - - setStyle(): void { + static setStyle(): void { Log.showDebug(TAG, 'setStyle'); - this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_LARGE); let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_VOLUME_PANEL, 'dis'); - this.setMaxWidth(config.width); + StyleManager.maxWidth = config.width; // Pad、PC Mode { let style = StyleConfiguration.getVolumePanelComponentStyle(); - style.volumePanelSliderMarginTop = this.calcScaleSizePx(40); - style.volumePanSliderWidth = px2vp(this.calcScaleSize(8)).toString() + 'vp'; - style.volumePanSliderHeight = this.calcScaleSizePx(320); - style.volumePanelSliderMarginBottom = this.calcScaleSizePx(40); - style.volumePanelMutBtnIconSize = this.calcScaleSizePx(48); - style.volumePanelMutBtnIconMarginBottom = this.calcScaleSizePx(24); - style.volumePanelMuteBtnHeight = this.calcScaleSizePx(72); - style.volumePanelSettingIconSize = this.calcScaleSizePx(48); - style.volumePanelSettingButtonSize = this.calcScaleSizePx(96); + style.volumePanelSliderMarginTop = StyleManager.calcScaleSizePx(40); + style.volumePanSliderWidth = px2vp(StyleManager.calcScaleSize(8)).toString() + 'vp'; + style.volumePanSliderHeight = StyleManager.calcScaleSizePx(320); + style.volumePanelSliderMarginBottom = StyleManager.calcScaleSizePx(40); + style.volumePanelMutBtnIconSize = StyleManager.calcScaleSizePx(48); + style.volumePanelMutBtnIconMarginBottom = StyleManager.calcScaleSizePx(24); + style.volumePanelMuteBtnHeight = StyleManager.calcScaleSizePx(72); + style.volumePanelSettingIconSize = StyleManager.calcScaleSizePx(48); + style.volumePanelSettingButtonSize = StyleManager.calcScaleSizePx(96); style.volumePanelBackground = '#99FFFFFF'; style.volumePanelSliderBlockColor = '#FFFFFFFF'; - style.volumePanelDividerHeight = this.calcScaleSizePx(1); - style.volumePanelBorderRadius = this.calcScaleSizePx(48); - style.volumeDividerWidth = this.calcScaleSizePx(60); + style.volumePanelDividerHeight = StyleManager.calcScaleSizePx(1); + style.volumePanelBorderRadius = StyleManager.calcScaleSizePx(48); + style.volumeDividerWidth = StyleManager.calcScaleSizePx(60); style.volumeSliderTrackColor = '#FFAEE6E6'; style.volumeSelectedColor = '#FF007DFF'; style.volumeButtonBackgroundColor = '#00000000'; @@ -57,9 +53,18 @@ export class StyleManager extends BaseStyleManager { style.volumePanelDividerColor = '#FF9BCECE'; style.volumePanelSettingColor = '#FF4D6666'; } + } -} -let styleManager = new StyleManager(); + static number2px(n: number): string { + return n.toString() + 'px'; + } -export default styleManager; \ No newline at end of file + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/default/volumepanel/src/main/ets/pages/index.ets b/product/default/volumepanel/src/main/ets/pages/index.ets index 65b77736..12976941 100644 --- a/product/default/volumepanel/src/main/ets/pages/index.ets +++ b/product/default/volumepanel/src/main/ets/pages/index.ets @@ -13,6 +13,7 @@ * limitations under the License. */ import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager' import VolumePanelComponent from '../../../../../../../features/volumepanelcomponent/src/main/ets/com/ohos/pages/VolumePanelComponent' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import StyleManager from '../common/StyleManager' @@ -50,6 +51,7 @@ struct Index { WindowManager.resetSizeWindow(WindowType.VOLUME_PANEL, volumeRect); setAppBgColor('#00000000'); + CommonStyleManager.setAbilityPageName(TAG) Log.showDebug(TAG, `configInfo Start, configInfo ${JSON.stringify(configInfo)}`); if (configInfo.width > configInfo.height) { // Pad、PC Mode StyleManager.setStyle(); diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts index 4d959548..9b415e4e 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from './StyleManager'; +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'ControlPanel-StyleConfiguration'; @@ -24,7 +24,7 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, IndexStyle); + return CommonStyleManager.getStyle(key, IndexStyle); } } diff --git a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts index 70422b98..8674a216 100644 --- a/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/controlpanel/src/main/ets/pages/common/StyleManager.ts @@ -12,7 +12,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import BaseStyleManager from '../../../../../../../../common/src/main/ets/default/BaseStyleManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/styleconfiguration'; @@ -23,128 +22,125 @@ import IndexStyleConfiguration from './styleconfiguration'; const TAG = 'ControlPanel-StyleManager'; -export class StyleManager extends BaseStyleManager { - static readonly ABILITY_PAGE_NAME_CONTROLPANEL = "ControlPanel-Index"; +export default class StyleManager { + static readonly STANDARD_DISPLAY_WIDTH = 1280; + static readonly STANDARD_DISPLAY_HEIGHT = 800; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - constructor() { - super(StyleManager.ABILITY_PAGE_NAME_CONTROLPANEL); - } - - setStyle(): void{ + static setStyle(): void{ Log.showDebug(TAG, 'setStyle'); - this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_NORMAL); let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_CONTROL_PANEL, 'dis'); - this.setMaxWidth(dis.width); + StyleManager.maxWidth = dis.width; // Index - this.setIndexStyle(); + StyleManager.setIndexStyle(); // ControlCenter - this.setControlCenterComponentStyle(); + StyleManager.setControlCenterComponentStyle(); // ControlCenter-Title - this.setControlCenterUpTitleStyle(); + StyleManager.setControlCenterUpTitleStyle(); // ControlCenter-ComplexToggleLayout - this.setControlCenterComplexToggleLayoutStyle(); + StyleManager.setControlCenterComplexToggleLayoutStyle(); // ControlCenter-SimpleToggleLayout - this.setControlCenterSimpleToggleLayoutStyle(); + StyleManager.setControlCenterSimpleToggleLayoutStyle(); // CommonTemplate-iconTitleBase - this.setIconTitleBaseStyle(); + StyleManager.setIconTitleBaseStyle(); // CommonTemplate-iconComponent - this.setIconComponentStyle(); + StyleManager.setIconComponentStyle(); // CommonTemplate-simpleToggleBase - this.setSimpleToggleBaseStyle(); + StyleManager.setSimpleToggleBaseStyle(); // Brightness - this.setBrightnessComponentStyle(); + StyleManager.setBrightnessComponentStyle(); // RingMode - this.setControlCenterRingModeComponentStyle(); + StyleManager.setControlCenterRingModeComponentStyle(); // SimpleToggleLayoutEdit - this.setSimpleToggleLayoutEditComponentStyle(); + StyleManager.setSimpleToggleLayoutEditComponentStyle(); // SimpleToggleLayoutEdit-title - this.setSimpleToggleLayoutEditUpTitleStyle(); + StyleManager.setSimpleToggleLayoutEditUpTitleStyle(); // SimpleToggleLayoutEdit-msg - this.setSimpleToggleLayoutEditOptMsgStyle(); + StyleManager.setSimpleToggleLayoutEditOptMsgStyle(); // SimpleToggleLayoutEdit-grid - this.setSimpleToggleLayoutEditGridStyle(); + StyleManager.setSimpleToggleLayoutEditGridStyle(); // EditDialog - this.setControlEditDialogStyle(); + StyleManager.setControlEditDialogStyle(); } // Index - private setIndexStyle(): void { + private static setIndexStyle(): void { let style = IndexStyleConfiguration.getIndexStyle(); - style.borderRadius = this.calcScaleSizePx(24); + style.borderRadius = StyleManager.calcScaleSizePx(24); } // ControlCenter - private setControlCenterComponentStyle(): void { + private static setControlCenterComponentStyle(): void { let style = ControlCenterStyleConfiguration.getControlCenterComponentStyle(); - style.marginLeft = this.calcScaleSizePx(20); - style.marginRight = this.calcScaleSizePx(20); - style.marginTop = this.calcScaleSizePx(0); - style.upTitleHeight = this.calcScaleSizePx(56); - style.titleMarginBottom = this.calcScaleSizePx(0); - style.toggleAreaGap = this.calcScaleSizePx(12); - style.simpleToggleLayoutMarginTop = this.calcScaleSizePx(23); - style.simpleToggleLayoutMarginBottom = this.calcScaleSizePx(0); - style.brightnessMarginBottom = this.calcScaleSizePx(12); - style.componentBorderRadius = this.calcScaleSizePx(24); + style.marginLeft = StyleManager.calcScaleSizePx(20); + style.marginRight = StyleManager.calcScaleSizePx(20); + style.marginTop = StyleManager.calcScaleSizePx(0); + style.upTitleHeight = StyleManager.calcScaleSizePx(56); + style.titleMarginBottom = StyleManager.calcScaleSizePx(0); + style.toggleAreaGap = StyleManager.calcScaleSizePx(12); + style.simpleToggleLayoutMarginTop = StyleManager.calcScaleSizePx(23); + style.simpleToggleLayoutMarginBottom = StyleManager.calcScaleSizePx(0); + style.brightnessMarginBottom = StyleManager.calcScaleSizePx(12); + style.componentBorderRadius = StyleManager.calcScaleSizePx(24); style.componentBackgroundColor = '#99FFFFFF'; } // ControlCenter-Title - private setControlCenterUpTitleStyle(): void{ + private static setControlCenterUpTitleStyle(): void{ let style = ControlCenterStyleConfiguration.getControlCenterUpTitleStyle(); - style.marginLeft = this.calcScaleSizePx(24); - style.marginRight = this.calcScaleSizePx(21); - style.fontSize = this.calcScaleSizePx(20); + style.marginLeft = StyleManager.calcScaleSizePx(24); + style.marginRight = StyleManager.calcScaleSizePx(21); + style.fontSize = StyleManager.calcScaleSizePx(20); style.fontColor = '#000000'; - style.imageWidth = this.calcScaleSizePx(24); - style.imageHeight = this.calcScaleSizePx(24); - style.imageHoverWidth = this.calcScaleSizePx(32); - style.imageHoverHeight = this.calcScaleSizePx(32); - style.imageHoverRadius = this.calcScaleSizePx(8); + style.imageWidth = StyleManager.calcScaleSizePx(24); + style.imageHeight = StyleManager.calcScaleSizePx(24); + style.imageHoverWidth = StyleManager.calcScaleSizePx(32); + style.imageHoverHeight = StyleManager.calcScaleSizePx(32); + style.imageHoverRadius = StyleManager.calcScaleSizePx(8); style.imageHoverColor = 'rgba(0, 0, 0, 0.05)'; style.imageTransparentColor = 'rgba(255, 255, 255, 0)'; - style.upTitleSpace = this.calcScaleSizePx(24); + style.upTitleSpace = StyleManager.calcScaleSizePx(24); style.titleImageColor = '#ff182431'; } // ControlCenter-ComplexToggleLayout - private setControlCenterComplexToggleLayoutStyle(): void { + private static setControlCenterComplexToggleLayoutStyle(): void { let style = ControlCenterStyleConfiguration.getControlCenterComplexToggleLayoutStyle(); - style.columnGap = this.calcScaleSizePx(12); - style.rowGap = this.calcScaleSize(12); - style.rowHeight = this.calcScaleSize(66); + style.columnGap = StyleManager.calcScaleSizePx(12); + style.rowGap = StyleManager.calcScaleSize(12); + style.rowHeight = StyleManager.calcScaleSize(66); } // ControlCenter-SimpleToggleLayout - private setControlCenterSimpleToggleLayoutStyle(): void{ + private static setControlCenterSimpleToggleLayoutStyle(): void{ let style = ControlCenterStyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); - style.marginLeft = this.calcScaleSizePx(11); - style.marginRight = this.calcScaleSizePx(11); - style.columnGap = this.calcScaleSizePx(0); - style.rowGap = this.calcScaleSize(0); - style.rowHeight = this.calcScaleSize(81); + style.marginLeft = StyleManager.calcScaleSizePx(11); + style.marginRight = StyleManager.calcScaleSizePx(11); + style.columnGap = StyleManager.calcScaleSizePx(0); + style.rowGap = StyleManager.calcScaleSize(0); + style.rowHeight = StyleManager.calcScaleSize(81); } // CommonTemplate-iconTitleBase - private setIconTitleBaseStyle(): void{ + private static setIconTitleBaseStyle(): void{ let style = CommonTemplateStyleConfiguration.getIconTitleBaseStyle(); - style.marginLeft = this.calcScaleSizePx(8); - style.marginRight = this.calcScaleSizePx(4); - style.componentGap = this.calcScaleSizePx(8); - style.titleSize = this.calcScaleSizePx(12); + style.marginLeft = StyleManager.calcScaleSizePx(8); + style.marginRight = StyleManager.calcScaleSizePx(4); + style.componentGap = StyleManager.calcScaleSizePx(8); + style.titleSize = StyleManager.calcScaleSizePx(12); style.titleColor = $r('sys.color.ohos_id_color_text_secondary'), - style.borderRadius = this.calcScaleSizePx(24); + style.borderRadius = StyleManager.calcScaleSizePx(24); style.backgroundColor = '#99FFFFFF'; - style.textMargin = this.calcScaleSizePx(8); - style.textHoverHeight = this.calcScaleSizePx(26); - style.textHoverWidth = this.calcScaleSizePx(68); - style.textHoverRadius = this.calcScaleSizePx(4); + style.textMargin = StyleManager.calcScaleSizePx(8); + style.textHoverHeight = StyleManager.calcScaleSizePx(26); + style.textHoverWidth = StyleManager.calcScaleSizePx(68); + style.textHoverRadius = StyleManager.calcScaleSizePx(4); style.hoverColor = 'rgba(0, 0, 0, 0.05)'; style.transparentColor = 'rgba(255, 255, 255, 0)'; } // CommonTemplate-iconComponent - private setIconComponentStyle(): void { + private static setIconComponentStyle(): void { let style = CommonTemplateStyleConfiguration.getIconComponentStyle(); - style.circleWidth = this.calcScaleSizePx(48); - style.circleHeight = this.calcScaleSizePx(48); - style.iconWidth = this.calcScaleSizePx(24); - style.iconHeight = this.calcScaleSizePx(24); + style.circleWidth = StyleManager.calcScaleSizePx(48); + style.circleHeight = StyleManager.calcScaleSizePx(48); + style.iconWidth = StyleManager.calcScaleSizePx(24); + style.iconHeight = StyleManager.calcScaleSizePx(24); style.iconOffBG = '#1A000000'; style.iconOnBG = '#FF007DFF'; style.iconOnColor = '#FFFFFFFF'; @@ -153,128 +149,136 @@ export class StyleManager extends BaseStyleManager { style.transparentColor = 'rgba(255, 255, 255, 0)'; } // CommonTemplate-simpleToggleBase - private setSimpleToggleBaseStyle(): void { + private static setSimpleToggleBaseStyle(): void { let style = CommonTemplateStyleConfiguration.getSimpleToggleBaseStyle(); - style.circleWidth = this.calcScaleSizePx(48); - style.circleHeight = this.calcScaleSizePx(48); - style.iconWidth = this.calcScaleSizePx(24); - style.iconHeight = this.calcScaleSizePx(24); - style.dragCircleWidth = this.calcScaleSizePx(60); - style.dragCircleHeight = this.calcScaleSizePx(60); - style.dragIconWidth = this.calcScaleSizePx(36); - style.dragIconHeight = this.calcScaleSizePx(36); + style.circleWidth = StyleManager.calcScaleSizePx(48); + style.circleHeight = StyleManager.calcScaleSizePx(48); + style.iconWidth = StyleManager.calcScaleSizePx(24); + style.iconHeight = StyleManager.calcScaleSizePx(24); + style.dragCircleWidth = StyleManager.calcScaleSizePx(60); + style.dragCircleHeight = StyleManager.calcScaleSizePx(60); + style.dragIconWidth = StyleManager.calcScaleSizePx(36); + style.dragIconHeight = StyleManager.calcScaleSizePx(36); style.iconOffBG = '#1A000000'; style.iconOnBG = '#FF007DFF'; style.iconOnColor = '#FFFFFFFF'; style.iconOffColor = $r('sys.color.ohos_id_color_secondary'); - style.componentGap = this.calcScaleSizePx(4); - style.titleSize = this.calcScaleSizePx(12); + style.componentGap = StyleManager.calcScaleSizePx(4); + style.titleSize = StyleManager.calcScaleSizePx(12); style.titleColor = $r('sys.color.ohos_id_color_text_secondary'); - style.textHoverWidth = this.calcScaleSizePx(68); - style.textHoverHeight = this.calcScaleSizePx(18); - style.textHoverRadius = this.calcScaleSizePx(4); + style.textHoverWidth = StyleManager.calcScaleSizePx(68); + style.textHoverHeight = StyleManager.calcScaleSizePx(18); + style.textHoverRadius = StyleManager.calcScaleSizePx(4); style.hoverColor = 'rgba(0, 0, 0, 0.05)'; style.transparentColor = 'rgba(255, 255, 255, 0)'; } // Brightness - private setBrightnessComponentStyle(): void { + private static setBrightnessComponentStyle(): void{ let style = BrightnessStyleConfiguration.getBrightnessComponentStyle(); - style.marginLeft = this.calcScaleSizePx(12.5); - style.marginRight = this.calcScaleSizePx(12.5); - style.componentGap = this.calcScaleSizePx(8.5); + style.marginLeft = StyleManager.calcScaleSizePx(12.5); + style.marginRight = StyleManager.calcScaleSizePx(12.5); + style.componentGap = StyleManager.calcScaleSizePx(8.5); style.brightnessIconColor = $r('sys.color.ohos_id_color_secondary'); - style.brightnessReduceWidth = this.calcScaleSizePx(22); - style.brightnessReduceHeight = this.calcScaleSizePx(22); - style.brightnessPlusWidth = this.calcScaleSizePx(22); - style.brightnessPlusHeight = this.calcScaleSizePx(22); - style.brightnessHeight = this.calcScaleSizePx(40); - style.sliderHeight = px2vp(this.calcScaleSize(20)).toString() + 'vp'; + style.brightnessReduceWidth = StyleManager.calcScaleSizePx(22); + style.brightnessReduceHeight = StyleManager.calcScaleSizePx(22); + style.brightnessPlusWidth = StyleManager.calcScaleSizePx(22); + style.brightnessPlusHeight = StyleManager.calcScaleSizePx(22); + style.brightnessHeight = StyleManager.calcScaleSizePx(40); + style.sliderHeight = px2vp(StyleManager.calcScaleSize(20)).toString() + 'vp'; style.sliderBlockColor = '#FFFFFFFF'; style.sliderTrackColor = '#0D000000'; style.sliderSelectedColor = '#FF007DFF'; } // RingMode - private setControlCenterRingModeComponentStyle(): void { + private static setControlCenterRingModeComponentStyle(): void{ let style = RingModeStyleConfiguration.getControlCenterRingModeComponentStyle(); style.onBgColor = '#FFFF9800'; } // SimpleToggleLayoutEdit - private setSimpleToggleLayoutEditComponentStyle(): void { + private static setSimpleToggleLayoutEditComponentStyle(): void{ let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); - style.marginLeft = this.calcScaleSizePx(0); - style.marginRight = this.calcScaleSizePx(0); - style.marginTop = this.calcScaleSizePx(0); - style.titleHeight = this.calcScaleSizePx(56); - style.titleMarginBottom = this.calcScaleSizePx(0); - style.upGridMarginTop = this.calcScaleSizePx(4); - style.upGridMarginBottom = this.calcScaleSizePx(20); - style.gridMarginLeft = this.calcScaleSizePx(21); - style.gridMarginRight = this.calcScaleSizePx(21); - style.msgMarginTop = this.calcScaleSizePx(0); - style.msgMarginBottom = this.calcScaleSizePx(4); - style.btnMarginTop = this.calcScaleSizePx(4); - style.btnMarginBottom = this.calcScaleSizePx(16); - style.borderRadius = this.calcScaleSizePx(24); + style.marginLeft = StyleManager.calcScaleSizePx(0); + style.marginRight = StyleManager.calcScaleSizePx(0); + style.marginTop = StyleManager.calcScaleSizePx(0); + style.titleHeight = StyleManager.calcScaleSizePx(56); + style.titleMarginBottom = StyleManager.calcScaleSizePx(0); + style.upGridMarginTop = StyleManager.calcScaleSizePx(4); + style.upGridMarginBottom = StyleManager.calcScaleSizePx(20); + style.gridMarginLeft = StyleManager.calcScaleSizePx(21); + style.gridMarginRight = StyleManager.calcScaleSizePx(21); + style.msgMarginTop = StyleManager.calcScaleSizePx(0); + style.msgMarginBottom = StyleManager.calcScaleSizePx(4); + style.btnMarginTop = StyleManager.calcScaleSizePx(4); + style.btnMarginBottom = StyleManager.calcScaleSizePx(16); + style.borderRadius = StyleManager.calcScaleSizePx(24); style.upAreaBgColor = '#00FFFFFF'; style.downAreaBgColor = '#4DFFFFFF'; style.editBtnFontColor = '#FF007DFF'; style.editBtnFontSize = $r('sys.float.ohos_id_text_size_button1'); style.editBtnBgColor = '#0D000000'; - style.editBtnMarginLeft = this.calcScaleSizePx(16); - style.editBtnMarginRight = this.calcScaleSizePx(16); - style.editBtnHeight = this.calcScaleSizePx(40); - style.editBtnSpace = this.calcScaleSizePx(16); + style.editBtnMarginLeft = StyleManager.calcScaleSizePx(16); + style.editBtnMarginRight = StyleManager.calcScaleSizePx(16); + style.editBtnHeight = StyleManager.calcScaleSizePx(40); + style.editBtnSpace = StyleManager.calcScaleSizePx(16); } // SimpleToggleLayoutEdit - private setSimpleToggleLayoutEditUpTitleStyle(): void { + private static setSimpleToggleLayoutEditUpTitleStyle(): void{ let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle(); - style.marginLeft = this.calcScaleSizePx(24); - style.imageWidth = this.calcScaleSizePx(20); - style.imageHeight = this.calcScaleSizePx(20); + style.marginLeft = StyleManager.calcScaleSizePx(24); + style.imageWidth = StyleManager.calcScaleSizePx(20); + style.imageHeight = StyleManager.calcScaleSizePx(20); style.fontColor = '#FF000000'; - style.editTitleSpace = this.calcScaleSizePx(18); - style.titleFontSize = this.calcScaleSizePx(20); + style.editTitleSpace = StyleManager.calcScaleSizePx(18); + style.titleFontSize = StyleManager.calcScaleSizePx(20); } // SimpleToggleLayoutEdit - private setSimpleToggleLayoutEditOptMsgStyle(): void { + private static setSimpleToggleLayoutEditOptMsgStyle(): void{ let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); - style.fontSize = this.calcScaleSizePx(12); + style.fontSize = StyleManager.calcScaleSizePx(12); style.fontColor = $r('sys.color.ohos_id_color_text_secondary'); - style.height = this.calcScaleSizePx(41); - style.marginLeftRight = this.calcScaleSizePx(30); + style.height = StyleManager.calcScaleSizePx(41); + style.marginLeftRight = StyleManager.calcScaleSizePx(30); } // SimpleToggleLayoutEdit-grid - private setSimpleToggleLayoutEditGridStyle(): void { + private static setSimpleToggleLayoutEditGridStyle(): void{ let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditGridStyle(); - style.columnGap = this.calcScaleSizePx(0); - style.rowGap = this.calcScaleSize(0); - style.rowHeight = this.calcScaleSize(80); - style.dragBgSize = this.calcScaleSizePx(60); + style.columnGap = StyleManager.calcScaleSizePx(0); + style.rowGap = StyleManager.calcScaleSize(0); + style.rowHeight = StyleManager.calcScaleSize(80); + style.dragBgSize = StyleManager.calcScaleSizePx(60); } // EditDialog - private setControlEditDialogStyle(): void { + private static setControlEditDialogStyle(): void{ let style = ControlCenterStyleConfiguration.getControlEditDialogStyle(); - style.editDialogHeight = this.calcScaleSizePx(121); - style.editDialogWidth = this.calcScaleSizePx(374); - style.editDialogFontSize = this.calcScaleSizePx(18); - style.editDialogBtnMarginLF = this.calcScaleSizePx(13); - style.editDialogFontHeight = this.calcScaleSizePx(20); - style.editDialogBtnMarginTop = this.calcScaleSizePx(20); - style.editDialogButtonSize = this.calcScaleSizePx(18); - style.editDialogDividerHeight = this.calcScaleSizePx(20); - style.editDialogButtonHeight = this.calcScaleSizePx(30); - style.editDialogRadius = this.calcScaleSizePx(20); - style.editDialogBtnWidth = this.calcScaleSizePx(173); - style.editDialogFontMarginTop = this.calcScaleSizePx(29); + style.editDialogHeight = StyleManager.calcScaleSizePx(121); + style.editDialogWidth = StyleManager.calcScaleSizePx(374); + style.editDialogFontSize = StyleManager.calcScaleSizePx(18); + style.editDialogBtnMarginLF = StyleManager.calcScaleSizePx(13); + style.editDialogFontHeight = StyleManager.calcScaleSizePx(20); + style.editDialogBtnMarginTop = StyleManager.calcScaleSizePx(20); + style.editDialogButtonSize = StyleManager.calcScaleSizePx(18); + style.editDialogDividerHeight = StyleManager.calcScaleSizePx(20); + style.editDialogButtonHeight = StyleManager.calcScaleSizePx(30); + style.editDialogRadius = StyleManager.calcScaleSizePx(20); + style.editDialogBtnWidth = StyleManager.calcScaleSizePx(173); + style.editDialogFontMarginTop = StyleManager.calcScaleSizePx(29); style.editDialogColor = '#FFFFFFFF'; style.editDialogBtnFontColor = '#FF0000FF'; style.editDialogBtnBgColor = '#00FFFFFF'; style.editDialogDividerColor = $r('sys.color.ohos_id_color_secondary'); - style.editDialogDividerWidth = this.calcScaleSizePx(1); + style.editDialogDividerWidth = StyleManager.calcScaleSizePx(1); Log.showDebug(TAG, 'getControlEditDialogStyle'); } -} -let styleManager = new StyleManager(); + static number2px(n: number): string { + return n.toString() + 'px'; + } + + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } -export default styleManager; \ No newline at end of file + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/pc/controlpanel/src/main/ets/pages/index.ets b/product/pc/controlpanel/src/main/ets/pages/index.ets index 51c0ae27..5c558d62 100644 --- a/product/pc/controlpanel/src/main/ets/pages/index.ets +++ b/product/pc/controlpanel/src/main/ets/pages/index.ets @@ -13,6 +13,7 @@ * limitations under the License. */ import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager' import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/AbilityManager' import StyleConfiguration, { IndexStyle } from './common/StyleConfiguration' @@ -68,6 +69,7 @@ struct Index { Log.showInfo(TAG, `aboutToAppear, start`) setAppBgColor('#00000000') + CommonStyleManager.setAbilityPageName(TAG) this.style = StyleConfiguration.getIndexStyle() StyleManager.setStyle() diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts index cab3acf8..354110f5 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/pc/notificationpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from './StyleManager'; +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'NotificationPanel-StyleConfiguration'; @@ -24,6 +24,6 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, IndexStyle); + return CommonStyleManager.getStyle(key, IndexStyle); } } \ No newline at end of file diff --git a/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts b/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts index a6f79ce5..1452b5f5 100644 --- a/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/notificationpanel/src/main/ets/pages/common/StyleManager.ts @@ -12,35 +12,40 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import BaseStyleManager from '../../../../../../../../common/src/main/ets/default/BaseStyleManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import IndexStyleConfiguration from './styleconfiguration'; const TAG = 'NotificationPanel-StyleManager'; -export class StyleManager extends BaseStyleManager { - static readonly ABILITY_PAGE_NAME_NOTIFICATIONPANEL = "NotificationPanel-Index"; +export default class StyleManager { + static readonly STANDARD_DISPLAY_WIDTH = 1280; + static readonly STANDARD_DISPLAY_HEIGHT = 800; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - constructor() { - super(StyleManager.ABILITY_PAGE_NAME_NOTIFICATIONPANEL); - } - - setStyle(): void { + static setStyle(): void { Log.showDebug(TAG, 'setStyle'); - this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_NORMAL); let dis = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_NOTIFICATION_PANEL, 'dis'); - this.setMaxWidth(dis.width); + StyleManager.maxWidth = dis.width; // Index { let style = IndexStyleConfiguration.getIndexStyle(); - style.borderRadius = this.calcScaleSizePx(24); + style.borderRadius = StyleManager.calcScaleSizePx(24); } + } -} -let styleManager = new StyleManager(); + static number2px(n: number): string { + return n.toString() + 'px'; + } -export default styleManager; \ No newline at end of file + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts index 542d0d24..5979e09d 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from './StyleManager'; +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'StatusBar-StyleConfiguration'; @@ -23,6 +23,6 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, IndexStyle); + return CommonStyleManager.getStyle(key, IndexStyle); } } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts index 1c4815b9..7dcb0537 100644 --- a/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/pc/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -12,7 +12,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import BaseStyleManager from '../../../../../../../../common/src/main/ets/default/BaseStyleManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import CommonStyleConfiguration from '../../../../../../../../common/src/main/ets/default/styleconfiguration'; @@ -28,161 +27,165 @@ import RingModeStyleConfiguration from '../../../../../../../../features/ringmod const TAG = './styleconfigurationer'; -export class StyleManager extends BaseStyleManager { - static readonly ABILITY_PAGE_NAME_STATUSBAR = "StatusBar-Index"; +export default class StyleManager { + static readonly STANDARD_DISPLAY_WIDTH = 1280; + static readonly STANDARD_DISPLAY_HEIGHT = 800; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - constructor() { - super(StyleManager.ABILITY_PAGE_NAME_STATUSBAR); - } - - setStyle(): void { + static setStyle(): void { Log.showDebug(TAG, 'setStyle'); - this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_NORMAL); - let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); - this.setMaxWidth(config.maxWidth); - - this.setCommonStyle(); - this.setVerticalStatusBarItemLoadComponentStyle(); - this.setStatusBarNotificationIconStyle(); - this.setIconItemComponentStyle(); - this.setPluginIconItemComponentStyle(); - this.setClockComponentStyle(); - this.setBatteryComponentStyle(); - this.setBatteryPicStyle(); - this.setSignalComponentStyle(); - this.setStatusBarBluetoothComponentStyle(); - this.setStartsBarLocationComponentStyle(); - this.setStatusRingModeComponentStyle(); - this.setStartsBarWifiComponentStyle(); - this.setCapsuleComponentStyle(); + StyleManager.maxWidth = config.maxWidth; + + StyleManager.setCommonStyle(); + StyleManager.setVerticalStatusBarItemLoadComponentStyle(); + StyleManager.setStatusBarNotificationIconStyle(); + StyleManager.setIconItemComponentStyle(); + StyleManager.setPluginIconItemComponentStyle(); + StyleManager.setClockComponentStyle(); + StyleManager.setBatteryComponentStyle(); + StyleManager.setBatteryPicStyle(); + StyleManager.setSignalComponentStyle(); + StyleManager.setStatusBarBluetoothComponentStyle(); + StyleManager.setStartsBarLocationComponentStyle(); + StyleManager.setStatusRingModeComponentStyle(); + StyleManager.setStartsBarWifiComponentStyle(); + StyleManager.setCapsuleComponentStyle(); } // Common - private setCommonStyle(): void { + private static setCommonStyle(): void { let style = CommonStyleConfiguration.getCommonStyle(); - style.statusBarFontSize = this.calcScaleSizePx(14); - style.statusBarIconWidth = this.calcScaleSizePx(20); - style.statusBarIconHeight = this.calcScaleSizePx(20); + style.statusBarFontSize = StyleManager.calcScaleSizePx(14); + style.statusBarIconWidth = StyleManager.calcScaleSizePx(20); + style.statusBarIconHeight = StyleManager.calcScaleSizePx(20); style.statusBarMarginLeftRight = $r("app.float.status_bar_margin_left_right"); } // StatusBar-VerticalStatusBarItemLoadComponent - private setVerticalStatusBarItemLoadComponentStyle(): void { + private static setVerticalStatusBarItemLoadComponentStyle(): void { let style = StatusBarStyleConfiguration.getVerticalStatusBarItemLoadComponentStyle(); - style.statusBarVerticalComponentHeight = this.calcScaleSize(64); + style.statusBarVerticalComponentHeight = StyleManager.calcScaleSize(64); } // StatusBar-NotificationIcon - private setStatusBarNotificationIconStyle(): void { + private static setStatusBarNotificationIconStyle(): void { let style = StatusBarStyleConfiguration.getStatusBarNotificationIconStyle(); - style.iconWidth = this.calcScaleSizePx(16); - style.iconHeight = this.calcScaleSizePx(16); - style.iconSpace = this.calcScaleSizePx(6); + style.iconWidth = StyleManager.calcScaleSizePx(16); + style.iconHeight = StyleManager.calcScaleSizePx(16); + style.iconSpace = StyleManager.calcScaleSizePx(6); } // StatusBar-IconComponent - private setIconItemComponentStyle(): void { + private static setIconItemComponentStyle(): void { let style = StatusBarStyleConfiguration.getIconItemComponentStyle(); - style.stackHeight = this.calcScaleSizePx(8 * 2 + 18); - style.stackPadding = this.calcScaleSizePx(8); - style.stackBorderRadius = this.calcScaleSizePx(8); + style.stackHeight = StyleManager.calcScaleSizePx(8 * 2 + 18); + style.stackPadding = StyleManager.calcScaleSizePx(8); + style.stackBorderRadius = StyleManager.calcScaleSizePx(8); style.stackBgColorSelected = '#33000000'; style.stackBgColorUnSelected = '#00000000'; - style.componentSpace = this.calcScaleSizePx(8); - style.iconWidth = this.calcScaleSizePx(18); - style.iconHeight = this.calcScaleSizePx(18); - style.marginLeft = this.calcScaleSizePx(4); - style.marginRight = this.calcScaleSizePx(4); + style.componentSpace = StyleManager.calcScaleSizePx(8); + style.iconWidth = StyleManager.calcScaleSizePx(18); + style.iconHeight = StyleManager.calcScaleSizePx(18); + style.marginLeft = StyleManager.calcScaleSizePx(4); + style.marginRight = StyleManager.calcScaleSizePx(4); } // StatusBar-PluginIconItemComponent - private setPluginIconItemComponentStyle(): void { + private static setPluginIconItemComponentStyle(): void { let style = StatusBarStyleConfiguration.getPluginIconItemComponentStyle(); - style.iconWidth = this.calcScaleSize(32); + style.iconWidth = StyleManager.calcScaleSize(32); } // Clock - private setClockComponentStyle(): void { + private static setClockComponentStyle(): void { let style = ClockStyleConfiguration.getClockComponentStyle(); - style.statusBarClockMaxWidth = this.calcScaleSizePx(37); + style.statusBarClockMaxWidth = StyleManager.calcScaleSizePx(37); } // Battery-Icon - private setBatteryComponentStyle(): void { + private static setBatteryComponentStyle(): void { let style = BatteryStyleConfiguration.getBatteryComponentStyle(); - style.componentGap = this.calcScaleSizePx(6); + style.componentGap = StyleManager.calcScaleSizePx(6); } // Battery-Pic - private setBatteryPicStyle(): void { + private static setBatteryPicStyle(): void { let style = BatteryStyleConfiguration.getBatteryPicStyle(); - style.picGap = this.calcScaleSizePx(1); - style.picBodyWidth = this.calcScaleSizePx(18.75); - style.picBodyHeight = this.calcScaleSizePx(10.83); - style.picBodyPadding = this.calcScaleSizePx(1); - style.picBodyBorderWidth = this.calcScaleSizePx(1); - style.picBorderRadius = this.calcScaleSizePx(2); - style.picHeadBorderRadius = this.calcScaleSizePx(1); + style.picGap = StyleManager.calcScaleSizePx(1); + style.picBodyWidth = StyleManager.calcScaleSizePx(18.75); + style.picBodyHeight = StyleManager.calcScaleSizePx(10.83); + style.picBodyPadding = StyleManager.calcScaleSizePx(1); + style.picBodyBorderWidth = StyleManager.calcScaleSizePx(1); + style.picBorderRadius = StyleManager.calcScaleSizePx(2); + style.picHeadBorderRadius = StyleManager.calcScaleSizePx(1); style.picChargingColor = '#00ff21'; style.picLevelLowColor = '#ff0000'; - style.picHeadWidth = this.calcScaleSizePx(1.5); - style.picHeadHeight = this.calcScaleSizePx(5); + style.picHeadWidth = StyleManager.calcScaleSizePx(1.5); + style.picHeadHeight = StyleManager.calcScaleSizePx(5); } // Signal-Icon - private setSignalComponentStyle(): void { + private static setSignalComponentStyle(): void { let style = SignalStyleConfiguration.getSignalComponentStyle(); - style.cellularImageWidth = this.calcScaleSizePx(25); - style.cellularImageHeight = this.calcScaleSizePx(20); - style.statusBarSignalTypeFontSize = this.calcScaleSizePx(7); - style.statusBarSignalUnknownFontSize = this.calcScaleSizePx(12); - style.signalTextMaxWeight = this.calcScaleSizePx(100); - style.netSignalTextMaxWidth = this.calcScaleSizePx(18); + style.cellularImageWidth = StyleManager.calcScaleSizePx(25); + style.cellularImageHeight = StyleManager.calcScaleSizePx(20); + style.statusBarSignalTypeFontSize = StyleManager.calcScaleSizePx(7); + style.statusBarSignalUnknownFontSize = StyleManager.calcScaleSizePx(12); + style.signalTextMaxWeight = StyleManager.calcScaleSizePx(100); + style.netSignalTextMaxWidth = StyleManager.calcScaleSizePx(18); } // Bluetooth -Icon - private setStatusBarBluetoothComponentStyle(): void { + private static setStatusBarBluetoothComponentStyle(): void { let style = BluetoothStyleConfiguration.getStatusBarBluetoothComponentStyle(); - style.staticBarBluetoothWidth = this.calcScaleSizePx(18); - style.staticBarBluetoothHeight = this.calcScaleSizePx(20); + style.staticBarBluetoothWidth = StyleManager.calcScaleSizePx(18); + style.staticBarBluetoothHeight = StyleManager.calcScaleSizePx(20); } // Location-Icon - private setStartsBarLocationComponentStyle(): void { + private static setStartsBarLocationComponentStyle(): void { let style = LocationStyleConfiguration.getStartsBarLocationComponentStyle(); - style.statusBarLocationWidth = this.calcScaleSizePx(18); - style.statusBarLocationHeight = this.calcScaleSizePx(20); + style.statusBarLocationWidth = StyleManager.calcScaleSizePx(18); + style.statusBarLocationHeight = StyleManager.calcScaleSizePx(20); } // RingMode-Icon - private setStatusRingModeComponentStyle(): void { + private static setStatusRingModeComponentStyle(): void { let style = RingModeStyleConfiguration.getStatusRingModeComponentStyle(); - style.statusBarRingModeWidth = this.calcScaleSizePx(20); - style.statusBarRingModeHeight = this.calcScaleSizePx(20); + style.statusBarRingModeWidth = StyleManager.calcScaleSizePx(20); + style.statusBarRingModeHeight = StyleManager.calcScaleSizePx(20); } // Wifi-Icon - private setStartsBarWifiComponentStyle(): void { + private static setStartsBarWifiComponentStyle(): void { let style = WifiStyleConfiguration.getStartsBarWifiComponentStyle(); - style.statusBarWifiWidth = this.calcScaleSizePx(20); - style.statusBarWifiHeight = this.calcScaleSizePx(20); + style.statusBarWifiWidth = StyleManager.calcScaleSizePx(20); + style.statusBarWifiHeight = StyleManager.calcScaleSizePx(20); } // Capsule-Icon - private setCapsuleComponentStyle(): void { + private static setCapsuleComponentStyle(): void { let style = CapsuleStyleConfiguration.getCapsuleComponentStyle(); - style.greenCapsulePhoneWidth = this.calcScaleSizePx(15); - style.greenCapsulePhoneHeight = this.calcScaleSizePx(15); - style.greenCapsuleHeight = this.calcScaleSizePx(30); + style.greenCapsulePhoneWidth = StyleManager.calcScaleSizePx(15); + style.greenCapsulePhoneHeight = StyleManager.calcScaleSizePx(15); + style.greenCapsuleHeight = StyleManager.calcScaleSizePx(30); style.greenCapsuleTextColor = '#CCFFFFFF'; - style.greenCapsuleTextMarginLeftRight = this.calcScaleSizePx(10); - style.greenCapsuleRadius = this.calcScaleSizePx(24); + style.greenCapsuleTextMarginLeftRight = StyleManager.calcScaleSizePx(10); + style.greenCapsuleRadius = StyleManager.calcScaleSizePx(24); style.greenCapsuleBackgroundColor = '#64BB5C'; style.maxLines = 1; } -} -let styleManager = new StyleManager(); + static number2px(n: number): string { + return n.toString() + 'px'; + } -export default styleManager; \ No newline at end of file + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/pc/statusbar/src/main/ets/pages/index.ets b/product/pc/statusbar/src/main/ets/pages/index.ets index 347159b0..560309fa 100644 --- a/product/pc/statusbar/src/main/ets/pages/index.ets +++ b/product/pc/statusbar/src/main/ets/pages/index.ets @@ -14,6 +14,7 @@ */ import Log from '../../../../../../../common/src/main/ets/default/Log' +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager' import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' import StatusBarComponent from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' import StyleManager from './common/StyleManager' @@ -52,6 +53,7 @@ struct Index { StatusBarVM.updateStatusBarData(statusBarData); setAppBgColor('#00000000'); + CommonStyleManager.setAbilityPageName(TAG); StyleManager.setStyle(); mHeightConfigUtils = new HeightConfigUtils(); diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts index f5732ea4..3565c647 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from './StyleManager'; +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; import Constants from './constants'; import deviceInfo from '@ohos.deviceInfo'; @@ -54,21 +54,21 @@ export class DateItemStyle { export default class StyleConfiguration { static getControlStyle(): ControlStyle { const key: string = TAG + '-Control'; - return StyleManager.getStyle(key, ControlStyle); + return CommonStyleManager.getStyle(key, ControlStyle); } static getNotificationStyle(): NotificationStyle { const key: string = TAG + '-Notification'; - return StyleManager.getStyle(key, NotificationStyle); + return CommonStyleManager.getStyle(key, NotificationStyle); } static getQuicklySettingStyle(): QuicklySettingStyle { const key: string = TAG + '-QuicklySetting'; - return StyleManager.getStyle(key, QuicklySettingStyle); + return CommonStyleManager.getStyle(key, QuicklySettingStyle); } static getDateItemStyle(): DateItemStyle { const key: string = TAG + '-DateItem'; - return StyleManager.getStyle(key, DateItemStyle); + return CommonStyleManager.getStyle(key, DateItemStyle); } } \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts index e1c1889b..50fb8052 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/dropdownpanel/src/main/ets/pages/common/StyleManager.ts @@ -12,7 +12,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import BaseStyleManager from '../../../../../../../../common/src/main/ets/default/BaseStyleManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; import CommonTemplateStyleConfiguration from '../../../../../../../../common/src/main/ets/template/common/styleconfiguration'; @@ -22,122 +21,118 @@ import RingModeStyleConfiguration from '../../../../../../../../features/ringmod const TAG = 'DropdownPanel-StyleManager'; -export class StyleManager extends BaseStyleManager { - static readonly ABILITY_PAGE_NAME_DROPDOWNPANEL = "DropdownPanel-Index"; +export default class StyleManager { + static readonly STANDARD_DISPLAY_WIDTH: number = 720; + static readonly STANDARD_DISPLAY_HEIGHT: number = 1280; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - constructor() { - super(StyleManager.ABILITY_PAGE_NAME_DROPDOWNPANEL); - } - - setStyle(): void { + static setStyle(): void { Log.showDebug(TAG, 'setStyle'); - this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_SMALL); - let rect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect'); - this.setMaxWidth(rect.width); + StyleManager.maxWidth = rect.width; // ControlCenter - this.setControlCenterComponentStyle(); + StyleManager.setControlCenterComponentStyle(); // ControlCenter-Title - this.setControlCenterUpTitleStyle(); + StyleManager.setControlCenterUpTitleStyle(); // ControlCenter-ComplexToggleLayout - this.setControlCenterComplexToggleLayoutStyle(); + StyleManager.setControlCenterComplexToggleLayoutStyle(); // ControlCenter-SimpleToggleLayout - this.setControlCenterSimpleToggleLayoutStyle(); + StyleManager.setControlCenterSimpleToggleLayoutStyle(); // CommonTemplate-iconTitleBase - this.setIconTitleBaseStyle(); + StyleManager.setIconTitleBaseStyle(); // CommonTemplate-iconComponent - this.setIconComponentStyle(); + StyleManager.setIconComponentStyle(); // CommonTemplate-simpleToggleBase - this.setSimpleToggleBaseStyle(); + StyleManager.setSimpleToggleBaseStyle(); // Brightness - this.setBrightnessComponentStyle(); + StyleManager.setBrightnessComponentStyle(); // RingMode - this.setControlCenterRingModeComponentStyle(); + StyleManager.setControlCenterRingModeComponentStyle(); // SimpleToggleLayoutEdit - this.setSimpleToggleLayoutEditComponentStyle(); + StyleManager.setSimpleToggleLayoutEditComponentStyle(); // SimpleToggleLayoutEdit-title - this.setSimpleToggleLayoutEditUpTitleStyle(); + StyleManager.setSimpleToggleLayoutEditUpTitleStyle(); // SimpleToggleLayoutEdit-msg - this.setSimpleToggleLayoutEditOptMsgStyle(); + StyleManager.setSimpleToggleLayoutEditOptMsgStyle(); // SimpleToggleLayoutEdit-grid - this.setSimpleToggleLayoutEditGridStyle(); + StyleManager.setSimpleToggleLayoutEditGridStyle(); // EditDialog - this.setControlEditDialogStyle(); + StyleManager.setControlEditDialogStyle(); } // ControlCenter - private setControlCenterComponentStyle(): void{ + private static setControlCenterComponentStyle(): void{ let style = ControlCenterStyleConfiguration.getControlCenterComponentStyle(); - style.marginLeft = this.calcScaleSizePx(48); - style.marginRight = this.calcScaleSizePx(48); - style.marginTop = this.calcScaleSizePx(36); - style.upTitleHeight = this.calcScaleSizePx(127); - style.titleMarginBottom = this.calcScaleSizePx(0); - style.toggleAreaGap = this.calcScaleSizePx(24); - style.simpleToggleLayoutMarginTop = this.calcScaleSizePx(48); - style.simpleToggleLayoutMarginBottom = this.calcScaleSizePx(20); - style.brightnessMarginBottom = this.calcScaleSizePx(44); - style.componentBorderRadius = this.calcScaleSizePx(48); + style.marginLeft = StyleManager.calcScaleSizePx(48); + style.marginRight = StyleManager.calcScaleSizePx(48); + style.marginTop = StyleManager.calcScaleSizePx(36); + style.upTitleHeight = StyleManager.calcScaleSizePx(127); + style.titleMarginBottom = StyleManager.calcScaleSizePx(0); + style.toggleAreaGap = StyleManager.calcScaleSizePx(24); + style.simpleToggleLayoutMarginTop = StyleManager.calcScaleSizePx(48); + style.simpleToggleLayoutMarginBottom = StyleManager.calcScaleSizePx(20); + style.brightnessMarginBottom = StyleManager.calcScaleSizePx(44); + style.componentBorderRadius = StyleManager.calcScaleSizePx(48); style.componentBackgroundColor = '#99FFFFFF'; } // ControlCenter-Title - private setControlCenterUpTitleStyle(): void{ + private static setControlCenterUpTitleStyle(): void{ let style = ControlCenterStyleConfiguration.getControlCenterUpTitleStyle(); - style.marginLeft = this.calcScaleSizePx(72); - style.marginRight = this.calcScaleSizePx(72); - style.fontSize = this.calcScaleSizePx(40); + style.marginLeft = StyleManager.calcScaleSizePx(72); + style.marginRight = StyleManager.calcScaleSizePx(72); + style.fontSize = StyleManager.calcScaleSizePx(40); style.fontColor = '#FFFFFFFF'; - style.imageWidth = this.calcScaleSizePx(48); - style.imageHeight = this.calcScaleSizePx(48); - style.imageHoverWidth = this.calcScaleSizePx(64); - style.imageHoverHeight = this.calcScaleSizePx(64); - style.imageHoverRadius = this.calcScaleSizePx(16); + style.imageWidth = StyleManager.calcScaleSizePx(48); + style.imageHeight = StyleManager.calcScaleSizePx(48); + style.imageHoverWidth = StyleManager.calcScaleSizePx(64); + style.imageHoverHeight = StyleManager.calcScaleSizePx(64); + style.imageHoverRadius = StyleManager.calcScaleSizePx(16); style.imageHoverColor = 'rgba(0, 0, 0, 0.05)'; style.imageTransparentColor = 'rgba(255, 255, 255, 0)'; - style.upTitleSpace = this.calcScaleSizePx(36); + style.upTitleSpace = StyleManager.calcScaleSizePx(36); style.titleImageColor = '#FFFFFFFF'; } // ControlCenter-ComplexToggleLayout - private setControlCenterComplexToggleLayoutStyle(): void{ + private static setControlCenterComplexToggleLayoutStyle(): void{ let style = ControlCenterStyleConfiguration.getControlCenterComplexToggleLayoutStyle(); - style.columnGap = this.calcScaleSizePx(24); - style.rowGap = this.calcScaleSize(24); - style.rowHeight = this.calcScaleSize(132); + style.columnGap = StyleManager.calcScaleSizePx(24); + style.rowGap = StyleManager.calcScaleSize(24); + style.rowHeight = StyleManager.calcScaleSize(132); } // ControlCenter-SimpleToggleLayout - private setControlCenterSimpleToggleLayoutStyle(): void{ + private static setControlCenterSimpleToggleLayoutStyle(): void{ let style = ControlCenterStyleConfiguration.getControlCenterSimpleToggleLayoutStyle(); - style.marginLeft = this.calcScaleSizePx(22); - style.marginRight = this.calcScaleSizePx(22); - style.columnGap = this.calcScaleSizePx(0); - style.rowGap = this.calcScaleSize(0); - style.rowHeight = this.calcScaleSize(162); + style.marginLeft = StyleManager.calcScaleSizePx(22); + style.marginRight = StyleManager.calcScaleSizePx(22); + style.columnGap = StyleManager.calcScaleSizePx(0); + style.rowGap = StyleManager.calcScaleSize(0); + style.rowHeight = StyleManager.calcScaleSize(162); } // CommonTemplate-iconTitleBase - private setIconTitleBaseStyle(): void { + private static setIconTitleBaseStyle(): void { let style = CommonTemplateStyleConfiguration.getIconTitleBaseStyle(); - style.marginLeft = this.calcScaleSizePx(24); - style.marginRight = this.calcScaleSizePx(16); - style.componentGap = this.calcScaleSizePx(8); - style.titleSize = this.calcScaleSizePx(24); + style.marginLeft = StyleManager.calcScaleSizePx(24); + style.marginRight = StyleManager.calcScaleSizePx(16); + style.componentGap = StyleManager.calcScaleSizePx(8); + style.titleSize = StyleManager.calcScaleSizePx(24); style.titleColor = $r('sys.color.ohos_id_color_text_primary'); - style.borderRadius = this.calcScaleSizePx(48); + style.borderRadius = StyleManager.calcScaleSizePx(48); style.backgroundColor = '#99FFFFFF'; - style.textMargin = this.calcScaleSizePx(8); - style.textHoverHeight = this.calcScaleSizePx(52); - style.textHoverWidth = this.calcScaleSizePx(136); - style.textHoverRadius = this.calcScaleSizePx(8); + style.textMargin = StyleManager.calcScaleSizePx(8); + style.textHoverHeight = StyleManager.calcScaleSizePx(52); + style.textHoverWidth = StyleManager.calcScaleSizePx(136); + style.textHoverRadius = StyleManager.calcScaleSizePx(8); style.hoverColor = 'rgba(0, 0, 0, 0.05)'; style.transparentColor = 'rgba(255, 255, 255, 0)'; } // CommonTemplate-iconComponent - private setIconComponentStyle(): void { + private static setIconComponentStyle(): void { let style = CommonTemplateStyleConfiguration.getIconComponentStyle(); - style.circleWidth = this.calcScaleSizePx(96); - style.circleHeight = this.calcScaleSizePx(96); - style.iconWidth = this.calcScaleSizePx(48); - style.iconHeight = this.calcScaleSizePx(48); + style.circleWidth = StyleManager.calcScaleSizePx(96); + style.circleHeight = StyleManager.calcScaleSizePx(96); + style.iconWidth = StyleManager.calcScaleSizePx(48); + style.iconHeight = StyleManager.calcScaleSizePx(48); style.iconOffBG = '#1A182431'; style.iconOnBG = '#FF007DFF'; style.iconOnColor = '#FFFFFFFF'; @@ -146,128 +141,136 @@ export class StyleManager extends BaseStyleManager { style.transparentColor = 'rgba(255, 255, 255, 0)'; } // CommonTemplate-simpleToggleBase - private setSimpleToggleBaseStyle(): void{ + private static setSimpleToggleBaseStyle(): void{ let style = CommonTemplateStyleConfiguration.getSimpleToggleBaseStyle(); - style.circleWidth = this.calcScaleSizePx(96); - style.circleHeight = this.calcScaleSizePx(96); - style.iconWidth = this.calcScaleSizePx(48); - style.iconHeight = this.calcScaleSizePx(48); - style.dragCircleWidth = this.calcScaleSizePx(120); - style.dragCircleHeight = this.calcScaleSizePx(120); - style.dragIconWidth = this.calcScaleSizePx(72); - style.dragIconHeight = this.calcScaleSizePx(72); + style.circleWidth = StyleManager.calcScaleSizePx(96); + style.circleHeight = StyleManager.calcScaleSizePx(96); + style.iconWidth = StyleManager.calcScaleSizePx(48); + style.iconHeight = StyleManager.calcScaleSizePx(48); + style.dragCircleWidth = StyleManager.calcScaleSizePx(120); + style.dragCircleHeight = StyleManager.calcScaleSizePx(120); + style.dragIconWidth = StyleManager.calcScaleSizePx(72); + style.dragIconHeight = StyleManager.calcScaleSizePx(72); style.iconOffBG = '#1A182431'; style.iconOnBG = '#FF007DFF'; style.iconOnColor = '#FFFFFFFF'; style.iconOffColor = $r('sys.color.ohos_id_color_secondary'); - style.componentGap = this.calcScaleSizePx(10); - style.titleSize = this.calcScaleSizePx(24); + style.componentGap = StyleManager.calcScaleSizePx(10); + style.titleSize = StyleManager.calcScaleSizePx(24); style.titleColor = $r('sys.color.ohos_id_color_text_primary'); - style.textHoverWidth = this.calcScaleSizePx(136); - style.textHoverHeight = this.calcScaleSizePx(36); - style.textHoverRadius = this.calcScaleSizePx(8); + style.textHoverWidth = StyleManager.calcScaleSizePx(136); + style.textHoverHeight = StyleManager.calcScaleSizePx(36); + style.textHoverRadius = StyleManager.calcScaleSizePx(8); style.hoverColor = 'rgba(0, 0, 0, 0.05)'; style.transparentColor = 'rgba(255, 255, 255, 0)'; } // Brightness - private setBrightnessComponentStyle(): void{ + private static setBrightnessComponentStyle(): void{ let style = BrightnessStyleConfiguration.getBrightnessComponentStyle(); - style.marginLeft = this.calcScaleSizePx(26); - style.marginRight = this.calcScaleSizePx(26); - style.componentGap = this.calcScaleSizePx(26); + style.marginLeft = StyleManager.calcScaleSizePx(26); + style.marginRight = StyleManager.calcScaleSizePx(26); + style.componentGap = StyleManager.calcScaleSizePx(26); style.brightnessIconColor = $r('sys.color.ohos_id_color_secondary'); - style.brightnessReduceWidth = this.calcScaleSizePx(44); - style.brightnessReduceHeight = this.calcScaleSizePx(44); - style.brightnessPlusWidth = this.calcScaleSizePx(44); - style.brightnessPlusHeight = this.calcScaleSizePx(44); - style.brightnessHeight = this.calcScaleSizePx(44); - style.sliderHeight = this.calcScaleSizePx(40); + style.brightnessReduceWidth = StyleManager.calcScaleSizePx(44); + style.brightnessReduceHeight = StyleManager.calcScaleSizePx(44); + style.brightnessPlusWidth = StyleManager.calcScaleSizePx(44); + style.brightnessPlusHeight = StyleManager.calcScaleSizePx(44); + style.brightnessHeight = StyleManager.calcScaleSizePx(44); + style.sliderHeight = StyleManager.calcScaleSizePx(40); style.sliderBlockColor = '#FFFFFFFF'; style.sliderTrackColor = '#1A182431'; style.sliderSelectedColor = '#FF007DFF'; } // RingMode - private setControlCenterRingModeComponentStyle(): void{ + private static setControlCenterRingModeComponentStyle(): void{ let style = RingModeStyleConfiguration.getControlCenterRingModeComponentStyle(); style.onBgColor = '#FFFF9800'; } // SimpleToggleLayoutEdit - private setSimpleToggleLayoutEditComponentStyle(): void{ + private static setSimpleToggleLayoutEditComponentStyle(): void{ let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); - style.marginLeft = this.calcScaleSizePx(48); - style.marginRight = this.calcScaleSizePx(48); - style.marginTop = this.calcScaleSizePx(33); - style.titleHeight = this.calcScaleSizePx(127); - style.titleMarginBottom = this.calcScaleSizePx(0); - style.upGridMarginTop = this.calcScaleSizePx(48); - style.upGridMarginBottom = this.calcScaleSizePx(24); - style.gridMarginLeft = this.calcScaleSizePx(18.24); - style.gridMarginRight = this.calcScaleSizePx(18.24); - style.msgMarginTop = this.calcScaleSizePx(0); - style.msgMarginBottom = this.calcScaleSizePx(0); - style.btnMarginTop = this.calcScaleSizePx(24); - style.btnMarginBottom = this.calcScaleSizePx(32); - style.borderRadius = this.calcScaleSizePx(48); + style.marginLeft = StyleManager.calcScaleSizePx(48); + style.marginRight = StyleManager.calcScaleSizePx(48); + style.marginTop = StyleManager.calcScaleSizePx(33); + style.titleHeight = StyleManager.calcScaleSizePx(127); + style.titleMarginBottom = StyleManager.calcScaleSizePx(0); + style.upGridMarginTop = StyleManager.calcScaleSizePx(48); + style.upGridMarginBottom = StyleManager.calcScaleSizePx(24); + style.gridMarginLeft = StyleManager.calcScaleSizePx(18.24); + style.gridMarginRight = StyleManager.calcScaleSizePx(18.24); + style.msgMarginTop = StyleManager.calcScaleSizePx(0); + style.msgMarginBottom = StyleManager.calcScaleSizePx(0); + style.btnMarginTop = StyleManager.calcScaleSizePx(24); + style.btnMarginBottom = StyleManager.calcScaleSizePx(32); + style.borderRadius = StyleManager.calcScaleSizePx(48); style.upAreaBgColor = '#99FFFFFF'; style.downAreaBgColor = '#4DFFFFFF'; style.editBtnFontColor = '#FF007DFF'; - style.editBtnFontSize = this.calcScaleSizePx(32); + style.editBtnFontSize = StyleManager.calcScaleSizePx(32); style.editBtnBgColor = '#0D000000'; - style.editBtnMarginLeft = this.calcScaleSizePx(32); - style.editBtnMarginRight = this.calcScaleSizePx(32); - style.editBtnHeight = this.calcScaleSizePx(80); - style.editBtnSpace = this.calcScaleSizePx(32); + style.editBtnMarginLeft = StyleManager.calcScaleSizePx(32); + style.editBtnMarginRight = StyleManager.calcScaleSizePx(32); + style.editBtnHeight = StyleManager.calcScaleSizePx(80); + style.editBtnSpace = StyleManager.calcScaleSizePx(32); } // SimpleToggleLayoutEdit-title - private setSimpleToggleLayoutEditUpTitleStyle(): void{ + private static setSimpleToggleLayoutEditUpTitleStyle(): void{ let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle(); - style.marginLeft = this.calcScaleSizePx(72); - style.imageWidth = this.calcScaleSizePx(40); - style.imageHeight = this.calcScaleSizePx(40); + style.marginLeft = StyleManager.calcScaleSizePx(72); + style.imageWidth = StyleManager.calcScaleSizePx(40); + style.imageHeight = StyleManager.calcScaleSizePx(40); style.fontColor = '#FFFFFFFF'; - style.editTitleSpace = this.calcScaleSizePx(36); - style.titleFontSize = this.calcScaleSizePx(40); + style.editTitleSpace = StyleManager.calcScaleSizePx(36); + style.titleFontSize = StyleManager.calcScaleSizePx(40); } // SimpleToggleLayoutEdit-msg - private setSimpleToggleLayoutEditOptMsgStyle(): void{ + private static setSimpleToggleLayoutEditOptMsgStyle(): void{ let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); - style.fontSize = this.calcScaleSizePx(24); + style.fontSize = StyleManager.calcScaleSizePx(24); style.fontColor = $r('sys.color.ohos_id_color_text_secondary'); - style.height = this.calcScaleSizePx(98); - style.marginLeftRight = this.calcScaleSizePx(44); + style.height = StyleManager.calcScaleSizePx(98); + style.marginLeftRight = StyleManager.calcScaleSizePx(44); } // SimpleToggleLayoutEdit-grid - private setSimpleToggleLayoutEditGridStyle(): void{ + private static setSimpleToggleLayoutEditGridStyle(): void{ let style = ControlCenterStyleConfiguration.getSimpleToggleLayoutEditGridStyle(); - style.columnGap = this.calcScaleSizePx(0); - style.rowGap = this.calcScaleSize(0); - style.rowHeight = this.calcScaleSize(162); - style.dragBgSize = this.calcScaleSizePx(120); + style.columnGap = StyleManager.calcScaleSizePx(0); + style.rowGap = StyleManager.calcScaleSize(0); + style.rowHeight = StyleManager.calcScaleSize(162); + style.dragBgSize = StyleManager.calcScaleSizePx(120); } // EditDialog - private setControlEditDialogStyle(): void { + private static setControlEditDialogStyle(): void { let style = ControlCenterStyleConfiguration.getControlEditDialogStyle(); - style.editDialogHeight = this.calcScaleSizePx(217); - style.editDialogWidth = this.calcScaleSizePx(670); - style.editDialogFontSize = this.calcScaleSizePx(30); - style.editDialogBtnMarginLF = this.calcScaleSizePx(24); - style.editDialogFontHeight = this.calcScaleSizePx(36); - style.editDialogBtnMarginTop = this.calcScaleSizePx(36); - style.editDialogButtonSize = this.calcScaleSizePx(30); - style.editDialogDividerHeight = this.calcScaleSizePx(36); - style.editDialogButtonHeight = this.calcScaleSizePx(54); - style.editDialogRadius = this.calcScaleSizePx(36); - style.editDialogBtnWidth = this.calcScaleSizePx(311); - style.editDialogFontMarginTop = this.calcScaleSizePx(52); + style.editDialogHeight = StyleManager.calcScaleSizePx(217); + style.editDialogWidth = StyleManager.calcScaleSizePx(670); + style.editDialogFontSize = StyleManager.calcScaleSizePx(30); + style.editDialogBtnMarginLF = StyleManager.calcScaleSizePx(24); + style.editDialogFontHeight = StyleManager.calcScaleSizePx(36); + style.editDialogBtnMarginTop = StyleManager.calcScaleSizePx(36); + style.editDialogButtonSize = StyleManager.calcScaleSizePx(30); + style.editDialogDividerHeight = StyleManager.calcScaleSizePx(36); + style.editDialogButtonHeight = StyleManager.calcScaleSizePx(54); + style.editDialogRadius = StyleManager.calcScaleSizePx(36); + style.editDialogBtnWidth = StyleManager.calcScaleSizePx(311); + style.editDialogFontMarginTop = StyleManager.calcScaleSizePx(52); style.editDialogColor = '#FFFFFFFF'; style.editDialogBtnFontColor = '#FF0000FF'; style.editDialogBtnBgColor = '#00FFFFFF'; style.editDialogDividerColor = $r('sys.color.ohos_id_color_secondary'); - style.editDialogDividerWidth = this.calcScaleSizePx(1); + style.editDialogDividerWidth = StyleManager.calcScaleSizePx(1); Log.showDebug(TAG, 'getControlEditDialogStyle'); } -} -let styleManager = new StyleManager(); + static number2px(n: number): string { + return n.toString() + 'px'; + } -export default styleManager; \ No newline at end of file + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/phone/dropdownpanel/src/main/ets/pages/index.ets b/product/phone/dropdownpanel/src/main/ets/pages/index.ets index c9dbe9f4..7183ba51 100644 --- a/product/phone/dropdownpanel/src/main/ets/pages/index.ets +++ b/product/phone/dropdownpanel/src/main/ets/pages/index.ets @@ -30,6 +30,7 @@ import WindowManager, { WindowType, WINDOW_SHOW_HIDE_EVENT } from '../../../../../../../common/src/main/ets/default/WindowManager' import EventManager, { unsubscribe } from "../../../../../../../common/src/main/ets/default/event/EventManager" import { START_ABILITY_EVENT } from "../../../../../../../common/src/main/ets/default/event/EventUtil" +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager' import MultimodalInputManager from '../../../../../../../common/src/main/ets/default/MultimodalInputManager' import AbilityManager from '../../../../../../../common/src/main/ets/default/abilitymanager/abilityManager' import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' @@ -93,6 +94,7 @@ struct Index { Log.showInfo(TAG, `aboutToAppear, start`); setAppBgColor('#00000000'); + CommonStyleManager.setAbilityPageName(TAG); StyleManager.setStyle(); let dropdownRect = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_DROPDOWN_PANEL, 'rect'); diff --git a/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts b/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts index 542d0d24..5979e09d 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StyleConfiguration.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import StyleManager from './StyleManager'; +import CommonStyleManager from '../../../../../../../../common/src/main/ets/default/CommonStyleManager'; const TAG = 'StatusBar-StyleConfiguration'; @@ -23,6 +23,6 @@ export class IndexStyle { export default class StyleConfiguration { static getIndexStyle(): IndexStyle { const key: string = TAG + '-Index'; - return StyleManager.getStyle(key, IndexStyle); + return CommonStyleManager.getStyle(key, IndexStyle); } } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts index 3ea08d35..abb1ebf5 100644 --- a/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts +++ b/product/phone/statusbar/src/main/ets/pages/common/StyleManager.ts @@ -12,33 +12,36 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import BaseStyleManager from '../../../../../../../../common/src/main/ets/default/BaseStyleManager'; import Log from '../../../../../../../../common/src/main/ets/default/Log'; import AbilityManager from '../../../../../../../../common/src/main/ets/default/abilitymanager/abilitymanager'; const TAG = 'StatusBar-StyleManager'; -export class StyleManager extends BaseStyleManager { - static readonly ABILITY_PAGE_NAME_STATUSBAR = "StatusBar-Index"; +export default class StyleManager { + static readonly STANDARD_DISPLAY_WIDTH = 720; + static readonly STANDARD_DISPLAY_HEIGHT = 1280; + static maxWidth: number = StyleManager.STANDARD_DISPLAY_WIDTH; - constructor() { - super(StyleManager.ABILITY_PAGE_NAME_STATUSBAR); - } - - setStyle(): void { + static setStyle(): void { Log.showDebug(TAG, 'setStyle'); - this.setStandardWidth(BaseStyleManager.STANDARD_DISPLAY_WIDTH_SMALL); - let config = AbilityManager.getAbilityData(AbilityManager.ABILITY_NAME_STATUS_BAR, 'config'); - this.setMaxWidth(config.maxWidth); + StyleManager.maxWidth = config.maxWidth; // xxx { } } -} -let styleManager = new StyleManager(); + static number2px(n: number): string { + return n.toString() + 'px'; + } -export default styleManager; \ No newline at end of file + static calcScaleSize(n: number): number { + return n * StyleManager.maxWidth / StyleManager.STANDARD_DISPLAY_WIDTH; + } + + static calcScaleSizePx(n: number): string { + return StyleManager.number2px(StyleManager.calcScaleSize(n)); + } +} \ No newline at end of file diff --git a/product/phone/statusbar/src/main/ets/pages/index.ets b/product/phone/statusbar/src/main/ets/pages/index.ets index 902417f0..a1b2659c 100644 --- a/product/phone/statusbar/src/main/ets/pages/index.ets +++ b/product/phone/statusbar/src/main/ets/pages/index.ets @@ -19,6 +19,7 @@ import WindowManager, {WindowType, WINDOW_SHOW_HIDE_EVENT } from '../../../../../../../common/src/main/ets/default/WindowManager' import EventManager, {unsubscribe} from "../../../../../../../common/src/main/ets/default/event/EventManager" import {obtainLocalEvent} from "../../../../../../../common/src/main/ets/default/event/EventUtil" +import CommonStyleManager from '../../../../../../../common/src/main/ets/default/CommonStyleManager' import HeightConfigUtils from '../../../../../../../common/src/main/ets/default/heightcofigUtils/HeightConfigUtils' import StatusBarComponent from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/pages/StatusBarComponent' import StatusBarVM from '../../../../../../../features/statusbarcomponent/src/main/ets/com/ohos/viewmodel/StatusBarVM' @@ -55,6 +56,7 @@ struct Index { this.updateStatusBarData(); setAppBgColor('#00000000'); + CommonStyleManager.setAbilityPageName(TAG); StyleManager.setStyle(); this.mClearCallback = EventManager.subscribe(WINDOW_SHOW_HIDE_EVENT, (args) => this.onWindowShowHideEvent(args)); -- Gitee From 70c0a820307e0a82a886fc3987f01503e943816b Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Wed, 17 Aug 2022 10:20:50 +0800 Subject: [PATCH 235/373] swipelayout Signed-off-by: xuchangzhou --- .../noticeItem/model/ExpandInfoManager.ts | 55 ++++ .../ohos/noticeItem/model/SwipeLayoutUtils.ts | 62 ++++ .../view/NotificationListComponent.ets | 20 +- .../ohos/noticeItem/view/item/SwipeLayout.ets | 291 ++++++++++++++++++ .../ohos/noticeItem/view/item/groupItem.ets | 162 ++++++---- .../view/item/iconListComponent.ets | 46 +++ .../noticeItem/view/item/notificationItem.ets | 81 ++--- 7 files changed, 607 insertions(+), 110 deletions(-) create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts create mode 100644 features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts new file mode 100644 index 00000000..7ae3de8f --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ExpandInfoManager.ts @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021-2022 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 TAG = 'ExpandInfosManager'; + +export class ExpandInfoManager { + //该类主要维护ExpandInfo这个集合,用于存储UX界面中组通知是否展开的信息,存在该组名表示组通知需要展开,否则表示不展开 + static ExpandInfo = new Set(); + + private getItemDataName(itemData): string{ + return `${TAG}_${itemData.bundleName}_${itemData.groupName}`; + } + + addExpandInfo(itemData): void{ + ExpandInfoManager.ExpandInfo.add(this.getItemDataName(itemData)) + return; + } + + hasExpandInfo(itemData): boolean{ + if(ExpandInfoManager.ExpandInfo.has(this.getItemDataName(itemData))){ + return true; + } else { + return false; + } + } + + deleteExpandInfo(itemData): void{ + if(ExpandInfoManager.ExpandInfo.has(this.getItemDataName(itemData))){ + ExpandInfoManager.ExpandInfo.delete(this.getItemDataName(itemData)) + } + return; + } + + deleteAllExpandInfo(): void{ + ExpandInfoManager.ExpandInfo.clear(); + return; + } + +} + +let expandInfoManager = new ExpandInfoManager(); + +export default expandInfoManager; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts new file mode 100644 index 00000000..acd7bceb --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021-2022 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 TAG = 'SwipeLayout_FocusCallback'; + +class FocusCallback{ + static callback: () => void = null; + static lastFocusId: string = null; + + private init(): void{ + FocusCallback.lastFocusId = null; + FocusCallback.callback = null; + return; + } + + private setCallback(name: string, callback: () => void): void{ + FocusCallback.callback = callback; + FocusCallback.lastFocusId = name; + return; + } + + executeCallback(name: string, callback: () => void): void{ + if(FocusCallback.lastFocusId != name){ + if(FocusCallback.callback != null){ + FocusCallback.callback(); + } + this.setCallback(name, callback); + } + return; + } + + deleteCallback(name: string): void{ + if( name == FocusCallback.lastFocusId){ + this.init(); + } + return; + } +} + +export function getId(itemData, isGroup): string{ + if(isGroup == false){ + return `swipelayout_item_${itemData.hashcode}_${itemData.timestamp}`; + } else { + return `swipelayout_group_${itemData.hashcode}_${itemData.timestamp}`; + } +} + +let focusCallBack = new FocusCallback(); + +export default focusCallBack; \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets index 84bae673..95053d46 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/NotificationListComponent.ets @@ -15,8 +15,9 @@ import Log from '../../../../../../../../../common/src/main/ets/default/Log'; import Constants, {NotificationLayout as Layout} from '../common/constants'; -import NotificationItem from './item/notificationItem' -import GroupNotificationItem from './item/groupItem' +import NotificationItem from './item/notificationItem'; +import GroupNotificationItem from './item/groupItem'; +import ExpandInfoManager from '../model/ExpandInfoManager'; const TAG = 'NoticeItem-NotificationListComponent'; @@ -28,10 +29,10 @@ type NotificationLayoutConfig = { export default struct NotificationListComponent { // 当长通知消息展开时,这里用于重新刷新item布局,扩展高度 @Provide('notificationUpdate') update: number = 0; - @StorageLink('notificationList') notificationList: any[] = [] + @StorageLink('notificationList') notificationList: any[] = []; private config: NotificationLayoutConfig = { itemMargin: Layout.ITEM_MARGIN - } + }; aboutToAppear() { Log.showDebug(TAG, `notificationList, aboutToAppear`); @@ -41,6 +42,11 @@ export default struct NotificationListComponent { Log.showDebug(TAG, `aboutToDisAppear`); } + deleteExpandInfo(itemData){ + ExpandInfoManager.deleteExpandInfo(itemData); + return true; + } + build() { List({ space: this.config.itemMargin }) { if (this.update && false) { @@ -52,12 +58,16 @@ export default struct NotificationListComponent { if (item.length > 1) { GroupNotificationItem({ groupData: item }) } else { - NotificationItem({ itemData: item[0] }) + if(this.deleteExpandInfo(item[0])){ + //更新组展开信息 + NotificationItem({ itemData: item[0] }) + } } } }, (list: any) => JSON.stringify(list.map((item) => `${item.hashcode}_${item.timestamp}`))) } .align(Alignment.Top) .width('100%') + .height('100%') } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets new file mode 100644 index 00000000..a0cdef67 --- /dev/null +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets @@ -0,0 +1,291 @@ +/* + * Copyright (c) 2021-2022 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 Log from '../../../../../../../../../../common/src/main/ets/default/Log'; +import Constants, {NotificationLayout as Layout} from '../../common/constants'; +import FocusCallBack from '../../model/SwipeLayoutUtils'; + +const TAG = 'SwipeLayout'; + +@Component +export default struct SwipeLayout { + angelCalFlag: boolean = false; + responseSwipeEvent: boolean = false; + surfaceWidth: number = -1;//通过获取当前控件宽度而获得 + rightThreshold: number = 0;//通过bottom控件的总宽度计算得出 + startX: number = 0; + startY: number = 0; + lastTouchX: number = 0; + rateSurface: number = 1/1.3;//跟手 + rateDelete: number = 1/6;//右侧删除图标移动比例 + + + //需要配置项 + id: string = 'id default';//需要配置 + bottomLeftWidth: number = 0;//需要配置 + bottomRightWidth: number = 0;//需要配置 + leftThreshold: number = 0;//需要配置 + bottomHeight: number = 92;//需要配置,与外层的其他图标控件的高度保持一致 + deleteButtonCallback: any;// 需要配置 + @BuilderParam SurfaceComponent?: () => void;//需要配置 + @BuilderParam BottomLeftComponent?: () => void;//需要配置。根据UX设计,删除图标时固定的,其他图标要可配置,故这里采用由上层控件传入要配置的图标 + + //页面位置position坐标、透明度、宽高等状态变量 + @State overallX: number = 0; + @State surfaceX: number = 0; + @State bottomLeftX: number = 0; + @State deleteCenterX: number = 0; + @State rotateAngel: number = 0; + @State scale: number = 1; + @State surfaceOpacity: number = 1; + @State bottomLeftOpacity: number = 0;//透明度默认值为0 + @State bottomRightOpacity: number = 0;//透明度默认值为0 + @State bottomLeftWidthMoving: number = 0; + + initState(): void{ + this.rightThreshold= this.surfaceWidth - this.bottomLeftWidth -this.bottomRightWidth; + this.bottomLeftWidthMoving = this.bottomLeftWidth; + this.surfaceX = 0; + this.bottomLeftX = 0 + this.surfaceWidth; + this.deleteCenterX = 0 + this.surfaceWidth + this.bottomLeftWidth + Layout.BUTTON_SIZE/2; + this.surfaceOpacity = 1;; + this.bottomLeftOpacity = 1;; + this.bottomRightOpacity = 1;; + this.responseSwipeEvent = false; + return; + } + + loseFocusCallback(){ + animateTo({ + duration: 200, + curve: Curve.Friction, + onFinish: () => { + }, + }, () => { + this.initState(); + }) + } + + deleteAnimation(){ + animateTo({ + duration: 250, + curve: Curve.Friction, + onFinish: () => { + this.deleteButtonCallback(); + }, + }, () => { + this.overallX = - this.surfaceWidth - this.surfaceX; + this.surfaceOpacity = 0; + this.bottomLeftOpacity = 0; + this.bottomRightOpacity = 0; + }) + } + + aboutToAppear(){ + Log.showInfo(TAG, `aboutToAppear`); + } + + aboutToDisappear(){ + Log.showInfo(TAG, `aboutToDisappear`); + FocusCallBack.deleteCallback(this.id); + } + + build(){ + Row(){ + Row() { + //Surface Component + Row() { + this.SurfaceComponent() + } + .zIndex(1) + .width('100%') + .position({ x: this.surfaceX }) + .opacity(this.surfaceOpacity) + + //Bottom Left Component + Row() { + this.BottomLeftComponent() + } + .justifyContent(FlexAlign.Center) + .width(this.bottomLeftWidthMoving) + .opacity(this.bottomLeftOpacity) + .position({ x: this.bottomLeftX }) + .zIndex(0) + + Row(){ + Button({ type: ButtonType.Circle, stateEffect: true }) { + Image($r("app.media.ic_public_delete_filled")) + .objectFit(ImageFit.Contain) + .fillColor($r("sys.color.ohos_id_color_primary_contrary")) + .width(Layout.ICON_SIZE) + .height(Layout.ICON_SIZE) + .rotate({ + x: 0, + y: 0, + z: 1, + centerX: '50%', + centerY: '50%', + angle: this.rotateAngel + }) + } + .backgroundColor($r("app.color.button_background")) + .zIndex(1) + .onClick(() => this.deleteAnimation()) + .width(Layout.BUTTON_SIZE) + .height(Layout.BUTTON_SIZE) + .scale({ + x: this.scale, + y: this.scale, + z: 1, + centerX: '50%', + centerY: '50%' + }) + } + .opacity(this.bottomRightOpacity) + .width(Layout.BUTTON_SIZE) + .height(this.bottomHeight) + .clip(false) + .markAnchor({ x: Layout.BUTTON_SIZE/2}) + .position({ x: this.deleteCenterX }) + } + .width('100%') + .position({ x: this.overallX }) + } + .width('100%') + .onTouch( (touchEvent: TouchEvent) => { + if (touchEvent.type == TouchType.Down) { + if(this.surfaceWidth == -1){ + this.surfaceWidth = Number(touchEvent.target.area.width)//获取父组件的宽度,然后对滑动动效中所用的尺寸数据进行初始化 + this.initState() + } + this.responseSwipeEvent = false;//初始化标记,是否响应滑动事件 + this.angelCalFlag = false;//初始化角度判断的标记 + this.startX = touchEvent.touches[0].screenX;//记录下手指落下时的坐标 + this.startY = touchEvent.touches[0].screenY; + this.lastTouchX = touchEvent.touches[0].screenX;//上一次move的坐标,用于计算增量 + if (!AppStorage.Has('swipelayout')) { + AppStorage.SetOrCreate('swipelayout', this.id); + } else if (this.id.startsWith('swipelayout_item')){//当滑动事件被子组件捕获,则更新storage中的id,表示滑动子组件。 只有匹配的id才允许被滑动 + AppStorage.SetOrCreate('swipelayout', this.id); + } + + } else if (touchEvent.type == TouchType.Move) { + if (AppStorage.Get('swipelayout') != this.id){//只有匹配的id才允许被滑动 + return; + } + //如果有子组件被touch,那么父组件开头的就返回 + if(this.angelCalFlag == false){ + this.responseSwipeEvent = (Math.abs(touchEvent.touches[0].screenX - this.startX) > Math.abs(touchEvent.touches[0].screenY - this.startY));//如果x方向移动较多(这里取四十五度为分界),那么就认为响应左滑 + this.angelCalFlag = true; //改变角度标志位, 表示角度已经判断过了,之后无需重复判断 + + if (this.responseSwipeEvent){ + FocusCallBack.executeCallback(this.id, this.loseFocusCallback.bind(this));//本控件响应回调,那么就需要将上一次滑动的控件弹回 + } + } + if(this.responseSwipeEvent == false) { + return; + } + //走到这里,角度判断过了,响应左滑也判断过了,那么先阻塞滑动事件传递,只让自己消费 + touchEvent.stopPropagation();//bug:这里阻塞事件传递的逻辑没有用,父组件还是会收到,故用storage配合组件id判断子组件是否被滑动 + + //计算跟手距离 + let followHand = this.rateSurface * (touchEvent.touches[0].screenX - this.lastTouchX);//根据跟手系数计算出的surface应该改移动的距离,为增量距离 + this.surfaceX = this.surfaceX + followHand; + this.bottomLeftX = this.bottomLeftX + followHand; + + //是否整体进入屏幕 + if(this.bottomLeftX > this.rightThreshold){//1、在右侧阈值的右侧,即底层的图标尚未完全进入屏幕 ----|左侧阈值|-------|右侧阈值| --here-- + this.rotateAngel = 0; + this.scale = 1; + this.deleteCenterX = this.bottomLeftX + this.bottomLeftWidth + Layout.BUTTON_SIZE/2; + } else if (this.bottomLeftX > this.leftThreshold && this.bottomLeftX < this.rightThreshold) {//2、在左侧和右侧阈值的内,需要对边界值做处理 ----|左侧阈值|----here---|右侧阈值| ---- + if(this.bottomLeftOpacity == 0){//如果是在左侧阈值,且向右滑动,那么就需要显示其余按钮 + animateTo({ + duration: 200, + curve: Curve.Friction, + onFinish: () => { + }, + }, () => { + this.bottomLeftOpacity = 1; + this.bottomLeftWidthMoving = (this.rightThreshold - this.bottomLeftX) * (1 - this.rateDelete) + this.bottomLeftWidth; + this.deleteCenterX = this.bottomLeftX + this.bottomLeftWidthMoving + Layout.BUTTON_SIZE/2; + this.rotateAngel = 12 - 12 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); + this.scale = 1.05 - 0.05 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); + }) + } else {//在非突变处,那么就跟手 + this.bottomLeftWidthMoving = (this.rightThreshold - this.bottomLeftX) * (1 - this.rateDelete) + this.bottomLeftWidth; + this.deleteCenterX = this.bottomLeftX + this.bottomLeftWidthMoving + Layout.BUTTON_SIZE/2; + this.rotateAngel = 12 - 12 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); + this.scale = 1.05 - 0.05 * (this.bottomLeftX - this.leftThreshold)/(this.rightThreshold - this.leftThreshold); + } + + } else {//3. 小于最左边的阈值 --here--|左侧阈值|-------|右侧阈值| ---- + if (this.bottomLeftOpacity == 1){// 如果是在向左滑动,那么就需要隐藏掉其余按钮 + animateTo({ + duration: 200, + curve: Curve.Friction, + onFinish: () => { + }, + }, () => { + this.bottomLeftOpacity = 0; + this.deleteCenterX = (this.bottomLeftX + this.surfaceWidth)/2; + this.rotateAngel = 17; + this.scale = 1.2; + }) + } else { + this.deleteCenterX = (this.bottomLeftX + this.surfaceWidth)/2; + } + } + + this.lastTouchX = touchEvent.touches[0].screenX; + + } else if (touchEvent.type == TouchType.Up) { + AppStorage.Delete('swipelayout');//删除该字段,这样group会有左滑的机会 + if(this.responseSwipeEvent == false) { + return; + } + if(this.bottomLeftX > this.rightThreshold){//在阈值2右侧,尚未完全进入屏幕 + FocusCallBack.deleteCallback(this.id) + animateTo({ + duration: 200, + curve: Curve.Friction, + onFinish: () => { + }, + }, () => { + this.surfaceX = 0; + this.bottomLeftX = 0 + this.surfaceWidth; + this.deleteCenterX = 0 + this.surfaceWidth + this.bottomLeftWidth + Layout.BUTTON_SIZE/2;// 垃圾桶控件左侧x坐标 + }) + } else if (this.bottomLeftX > this.leftThreshold && this.bottomLeftX < this.rightThreshold) { + animateTo({ + duration: 300, + curve: Curve.Friction, + onFinish: () => { + }, + }, () => { + this.bottomLeftOpacity = 1; + this.bottomLeftX = this.rightThreshold; + this.deleteCenterX = this.bottomLeftX + this.bottomLeftWidth + Layout.BUTTON_SIZE/2; + this.surfaceX = this.bottomLeftX - this.surfaceWidth; + this.bottomLeftWidthMoving = this.bottomLeftWidth; + this.rotateAngel = 0; + }) + } else { + this.deleteButtonCallback(); + } + } + }) + } +} \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 1ad847a5..030ffcc3 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -16,103 +16,135 @@ import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; import Constants, { NotificationLayout as Layout } from '../../common/constants'; import NotificationItem from './notificationItem' -import titleItem from './titleItem'; -import IconListComponent, { getIconListSize } from './iconListComponent'; -import ScrollbarManager from '../../common/ScrollbarManager'; +import NotificationViewModel from '../../viewmodel/NotificationViewModel'; +import SwipeLayout from './SwipeLayout'; +import deviceInfo from '@ohos.deviceInfo'; +import ExpandInfoManager from '../../model/ExpandInfoManager'; +import {getId} from '../../model/SwipeLayoutUtils'; +import {BottomLeftItem} from './iconListComponent'; const TAG = 'NoticeItem-GroupItem'; +const deviceTypeInfo = deviceInfo.deviceType; @Component export default struct GroupItem { @Consume('notificationUpdate') updateFlag: number; - @State distributedDeviceName: string = '' + @State distributedDeviceName: string = ''; @State @Watch('expandChange') toExpand: boolean = false; - private groupData: any[] = [] - private mScroller: Scroller = new Scroller(); - @State mIconAlpha: number = 0; - @State @Watch('scrollEdge') mEdgeEnd: boolean = false; + private groupData: any[] = []; expandChange() { this.updateFlag++; } - aboutToAppear() { + aboutToAppear() {h Log.showInfo(TAG, `aboutToAppear`); + this.toExpand = ExpandInfoManager.hasExpandInfo(this.groupData[0]); } aboutToDisappear() { Log.showInfo(TAG, `aboutToDisAppear`); } - build() { - Stack({ alignContent: Alignment.TopEnd }) { - Scroll(this.mScroller) { - Row() { - Column() { - Row() { - titleItem({ - notificationSmallIcon: this.groupData[0].smallIcon, - notificationName: this.groupData[0].appName, - notificationTime: this.groupData[0].time, - isExpand: $toExpand, - needExpand: true, - distributedDeviceName: this.distributedDeviceName, - clickTitleAction: () => null - }) - } - .flexShrink(0) - .backgroundColor($r('app.color.notificationitem_background')) - .width(Constants.FULL_CONTAINER_WIDTH) + deleteButtonCallback(){ + ExpandInfoManager.deleteExpandInfo(this.groupData[0]); + NotificationViewModel.removeGroupNotification(this.groupData[0], true); + } - if (this.toExpand) { - Row().height($r("app.float.notice_divider")).width('100%').flexShrink(0) - } - Column() { - ContentList({ groupData: this.groupData, toExpand: this.toExpand }) - } - .flexShrink(1) - .width(Constants.FULL_CONTAINER_WIDTH) - .enabled(!this.mEdgeEnd) - } - .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) - .clip(true) - IconListComponent({ iconAlpha: this.mIconAlpha, itemData: this.groupData[0], isGroup: true }) + @Builder SurfaceComponent() { + Column() { + Row() { + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) { + Image(this.groupData[0].smallIcon) + .objectFit(ImageFit.Contain) + .width(Layout.TITLE_IMAGE_SIZE) + .height(Layout.TITLE_IMAGE_SIZE) + Row() { + Text(this.groupData[0].appName) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body3")) + .fontWeight(FontWeight.Regular) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .maxLines(Constants.SINGLE_LINE) + }.margin({ left: 8 }) + Text(this.groupData[0].time) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body3")) + .fontWeight(FontWeight.Regular) + .maxLines(Constants.SINGLE_LINE) + .flexGrow(0) + .margin({ left: 8, right: 8 }) + + Text($r('app.string.distributed_devicename', this.distributedDeviceName)) + .fontColor($r("sys.color.ohos_fa_text_primary")) + .fontSize($r("sys.float.ohos_id_text_size_body3")) + .fontWeight(FontWeight.Regular) + .maxLines(Constants.SINGLE_LINE) + .visibility((this.distributedDeviceName ? true : false) ? Visibility.Visible : Visibility.None) + + Blank() + Image(this.toExpand ? $r('app.media.ic_notification_up') : $r('app.media.ic_notification_down')) + .objectFit(ImageFit.Contain) + .width(Layout.TITLE_IMAGE_SIZE) + .height(Layout.TITLE_IMAGE_SIZE) } + .margin({ left: 12, right: 12 }) + .height(Layout.TITLE_HEIGHT) + .onClick(() => { + if (this.toExpand) { + this.toExpand = false; + ExpandInfoManager.deleteExpandInfo(this.groupData[0]) + } else { + this.toExpand = true; + ExpandInfoManager.addExpandInfo(this.groupData[0]) + } + }) } - .scrollable(ScrollDirection.Horizontal) - .scrollBar(BarState.On) - .onScroll(() => { - let accuracy = 0.1 - let newOpacity = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize() - let diffs = Math.abs(this.mIconAlpha - newOpacity) - if (diffs >= accuracy) { - let finalAlpha = newOpacity < accuracy ? 0 : newOpacity - finalAlpha = finalAlpha > (1 - accuracy) ? 1 : finalAlpha - this.mIconAlpha = finalAlpha - } - }) - .onScrollEnd(() => { - this.mEdgeEnd = (this.mEdgeEnd && - this.mScroller.currentOffset().xOffset > (getIconListSize() - Layout.SCROLL_THRESHOLD)) - || (!this.mEdgeEnd && this.mScroller.currentOffset().xOffset > Layout.SCROLL_THRESHOLD) - ScrollbarManager.restoreOtherScroll(this.mScroller); - }) + .flexShrink(0) + .backgroundColor($r('app.color.notificationitem_background')) + .width(Constants.FULL_CONTAINER_WIDTH) + + if (this.toExpand) { + Row().height($r("app.float.notice_divider")).width(Constants.FULL_CONTAINER_WIDTH) + } + Column() { + ContentList({ groupData: this.groupData, toExpand: this.toExpand }) + } + .width(Constants.FULL_CONTAINER_WIDTH) } - .width(Constants.FULL_CONTAINER_WIDTH) .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) .clip(true) } - scrollEdge() { - this.mScroller.scrollEdge(this.mEdgeEnd ? Edge.End : Edge.Start) + @Builder BottomLeftComponent() { + BottomLeftItem({itemData: this.groupData[0], height: 92}); + } + + build() { + Column(){ + SwipeLayout({ + id: getId(this.groupData[0], true), + bottomLeftWidth: 80,//可调参 + bottomRightWidth: 60,//可调参 + leftThreshold: 100,//可调参 + bottomHeight: 92,//可调参 + deleteButtonCallback: this.deleteButtonCallback.bind(this), + SurfaceComponent: this.SurfaceComponent.bind(this), + BottomLeftComponent: this.BottomLeftComponent.bind(this) + }) + } + .width(Constants.FULL_CONTAINER_WIDTH) + .height(this.toExpand ? this.groupData.length * 93 - 1 + 42 : 92)//bug: 在swipelayout中使用position属性,若此处不指定高度值,使用了position属性的swipelayout无法正常显示。 + .borderRadius($r("sys.float.ohos_id_corner_radius_default_l")) + .clip(true) } } @Component struct ContentList { - @State @Watch('remainderChange') groupData: any[] = [] - @Prop toExpand: boolean - @State remainderNum: number= 0 + @State @Watch('remainderChange') groupData: any[] = []; + @Prop toExpand: boolean; + @State remainderNum: number= 0; aboutToAppear() { this.remainderNum = this.groupData.length - 2; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets index e53e5f25..af4b2dc7 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/iconListComponent.ets @@ -112,4 +112,50 @@ export default struct IconListComponent { } .margin({ left: Layout.ICON_MARGIN }) } +} + +@Component +export struct BottomLeftItem { + private itemData: any = {}; + private height: number = 92; + + private settingDialogController: CustomDialogController = new CustomDialogController({ + builder: SettingDialog({ + itemData: this.itemData, + action: () => this.confirmDialogController.open() + }), + autoCancel: false, + alignment: deviceTypeInfo === 'phone' ? DialogAlignment.Bottom : DialogAlignment.Default, + offset: { dx: 0, dy: $r('app.float.setting_dialog_dy') }, + customStyle: true + }); + + private confirmDialogController: CustomDialogController = new CustomDialogController({ + builder: ConfirmDialog({ + title: $r('app.string.closeNovice'), + bundleName: this.itemData.name, + action: () => NotificationViewModel.enableNotification(this.itemData, false) + }), + autoCancel: false, + alignment: deviceTypeInfo === 'phone' ? DialogAlignment.Bottom : DialogAlignment.Default, + offset: { dx: 0, dy: $r('app.float.confirm_dialog_dy') }, + customStyle: true + }); + + build(){ + Flex({justifyContent: FlexAlign.SpaceEvenly, alignItems: ItemAlign.Center}) { + Button({ type: ButtonType.Circle, stateEffect: true }) { + Image($r("app.media.ic_public_settings_filled")) + .objectFit(ImageFit.Contain) + .fillColor($r("sys.color.ohos_id_color_primary_contrary")) + .width(Layout.ICON_SIZE) + .height(Layout.ICON_SIZE) + } + .backgroundColor($r("app.color.button_background")) + .onClick(() => this.settingDialogController.open()) + .width(Layout.BUTTON_SIZE) + .height(Layout.BUTTON_SIZE) + } + .height(this.height) + } } \ No newline at end of file diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index cbf2ce66..3d4beac7 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -20,53 +20,55 @@ import Log from '../../../../../../../../../../common/src/main/ets/default/Log'; import NotificationViewModel from '../../viewmodel/NotificationViewModel'; import DevicesDialog from './devicesDialog'; import WantAgent from '@ohos.wantAgent'; -import IconListComponent, {getIconListSize} from './iconListComponent'; -import ScrollbarManager from '../../common/ScrollbarManager'; +import {BottomLeftItem} from './iconListComponent'; +import deviceInfo from '@ohos.deviceInfo'; +import SwipeLayout from './SwipeLayout'; +import {getId} from '../../model/SwipeLayoutUtils'; const TAG = 'NoticeItem-NotificationItem'; +const deviceTypeInfo = deviceInfo.deviceType; @Component export default struct NotificationItem { @State mIconAlpha: number = 0; - @State @Watch('scrollEdge') mEdgeEnd: boolean = false; - @State itemWidth: string = '100%' - private itemData: any = {} + @State itemWidth: string = '100%'; + private itemData: any = {}; private isSubItem: boolean= false; - private mScroller: Scroller = new Scroller(); - build() { - Stack() { - Scroll(this.mScroller) { - Row() { - FrontItem({ itemData: this.itemData, isSubItem: this.isSubItem }) - IconListComponent({ iconAlpha: this.mIconAlpha, itemData: this.itemData }) - } - } - .scrollable(ScrollDirection.Horizontal) - .scrollBar(BarState.On) - .onScroll(() => { - let accuracy = 0.1 - let newOpacity = this.mScroller.currentOffset().xOffset * 1.0 / getIconListSize() - let diffs = Math.abs(this.mIconAlpha - newOpacity) - if (diffs >= accuracy) { - let finalAlpha = newOpacity < accuracy ? 0 : newOpacity - finalAlpha = finalAlpha > (1 - accuracy) ? 1 : finalAlpha - this.mIconAlpha = finalAlpha - } - }) - .onScrollEnd(() => { - this.mEdgeEnd = (this.mEdgeEnd && - this.mScroller.currentOffset().xOffset > (getIconListSize() - Layout.SCROLL_THRESHOLD)) - || (!this.mEdgeEnd && this.mScroller.currentOffset().xOffset > Layout.SCROLL_THRESHOLD) - ScrollbarManager.restoreOtherScroll(this.mScroller); - }) - }.width(this.itemWidth) + deleteButtonCallback(){ + NotificationViewModel.removeNotificationItem(this.itemData, true); + } + + @Builder SurfaceComponent() { + Column() { + FrontItem({ itemData: this.itemData, isSubItem: this.isSubItem }) + } + .width(this.itemWidth) .borderRadius(!this.isSubItem ? $r("sys.float.ohos_id_corner_radius_default_l") : 0) .clip(!this.isSubItem) } - scrollEdge() { - this.mScroller.scrollEdge(this.mEdgeEnd ? Edge.End : Edge.Start) + @Builder BottomLeftComponent() { + BottomLeftItem({itemData: this.itemData, height: 92}); + } + + build() { + Column(){ + SwipeLayout({ + id: getId(this.itemData, false), + bottomLeftWidth: 80, + bottomRightWidth: 60, + leftThreshold: 100, + bottomHeight: 92, + deleteButtonCallback: this.deleteButtonCallback.bind(this), + SurfaceComponent: this.SurfaceComponent.bind(this),//bug: 此处需绑定this,否则控件无法正常显示 + BottomLeftComponent: this.BottomLeftComponent.bind(this) + }) + } + .width(this.itemWidth) + .height(92)//bug: 在子控件swipelayout中使用position属性,若此处不指定高度值,使用了position属性的swipelayout无法正常显示。 + .borderRadius(!this.isSubItem ? $r("sys.float.ohos_id_corner_radius_default_l") : 0) + .clip(!this.isSubItem) } } @@ -105,10 +107,10 @@ struct FrontItem { let wantAgent = this.itemData?.want; if (!!wantAgent) { WantAgent.getWant(wantAgent).then((want) => { - this.nowWant = want + this.nowWant = want; Log.showInfo(TAG, `showDevicesDialog want: ${JSON.stringify(this.nowWant)}`); if (!want?.deviceId) { - this.devicesDialogController.open() + this.devicesDialogController.open(); } else { NotificationViewModel.clickItem(this.itemData); } @@ -127,7 +129,6 @@ struct FrontItem { permission: '', extraInfo: {} }; - NotificationViewModel.clickDistributionItem(this.itemData, triggerInfo) + NotificationViewModel.clickDistributionItem(this.itemData, triggerInfo); } -} - +} \ No newline at end of file -- Gitee From 7c93c1ef9ddd836d206bb8a1c0aa4fcf4f452a3e Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Wed, 17 Aug 2022 10:57:31 +0800 Subject: [PATCH 236/373] swipelayout Signed-off-by: xuchangzhou --- .../ohos/noticeItem/model/SwipeLayoutUtils.ts | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts index acd7bceb..7087ad00 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts @@ -19,31 +19,21 @@ class FocusCallback{ static callback: () => void = null; static lastFocusId: string = null; - private init(): void{ - FocusCallback.lastFocusId = null; - FocusCallback.callback = null; - return; - } - - private setCallback(name: string, callback: () => void): void{ - FocusCallback.callback = callback; - FocusCallback.lastFocusId = name; - return; - } - - executeCallback(name: string, callback: () => void): void{ + setCallback(name: string, callback: () => void): void{ if(FocusCallback.lastFocusId != name){ if(FocusCallback.callback != null){ FocusCallback.callback(); } - this.setCallback(name, callback); + FocusCallback.callback = callback; + FocusCallback.lastFocusId = name; } return; } deleteCallback(name: string): void{ if( name == FocusCallback.lastFocusId){ - this.init(); + FocusCallback.lastFocusId = null; + FocusCallback.callback = null; } return; } -- Gitee From 85f7b41ddaaefd5c99c33ca483af0ae84da08425 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Wed, 17 Aug 2022 11:20:32 +0800 Subject: [PATCH 237/373] swipelayout Signed-off-by: xuchangzhou --- .../src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets | 2 +- .../src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets index a0cdef67..4900223b 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets @@ -191,7 +191,7 @@ export default struct SwipeLayout { this.angelCalFlag = true; //改变角度标志位, 表示角度已经判断过了,之后无需重复判断 if (this.responseSwipeEvent){ - FocusCallBack.executeCallback(this.id, this.loseFocusCallback.bind(this));//本控件响应回调,那么就需要将上一次滑动的控件弹回 + FocusCallBack.setCallback(this.id, this.loseFocusCallback.bind(this));//本控件响应回调,那么就需要将上一次滑动的控件弹回 } } if(this.responseSwipeEvent == false) { diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 030ffcc3..1f1621d4 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -37,7 +37,7 @@ export default struct GroupItem { this.updateFlag++; } - aboutToAppear() {h + aboutToAppear() { Log.showInfo(TAG, `aboutToAppear`); this.toExpand = ExpandInfoManager.hasExpandInfo(this.groupData[0]); } -- Gitee From d812d698a31cc92045365457495c866879e479e1 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Thu, 18 Aug 2022 09:40:07 +0800 Subject: [PATCH 238/373] Switch to full_sdk Signed-off-by: xuchangzhou --- .../src/main/ets/default/viewmodel/CapsuleViewModel.ts | 4 ++-- .../src/main/ets/com/ohos/model/bundleResourceModel.ts | 6 +++--- .../ets/com/ohos/noticeItem/view/item/actionComponent.ets | 8 ++++---- .../statusbar/src/main/resources/base/element/string.json | 8 ++++++++ .../src/main/resources/en_US/element/string.json | 8 ++++++++ .../src/main/resources/zh_CN/element/string.json | 8 ++++++++ .../statusbar/src/main/resources/base/element/string.json | 8 ++++++++ .../src/main/resources/en_US/element/string.json | 8 ++++++++ .../src/main/resources/zh_CN/element/string.json | 8 ++++++++ 9 files changed, 57 insertions(+), 9 deletions(-) diff --git a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts index 5d5a00bd..cc0f3026 100644 --- a/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts +++ b/features/capsulecomponent/src/main/ets/default/viewmodel/CapsuleViewModel.ts @@ -71,7 +71,7 @@ export default class CapsuleViewModel { await ResourceUtil.initResourceManager(AbilityManager.ABILITY_NAME_STATUS_BAR); if (data.callState == CallState.CALL_INCOMING || data.callState == CallState.CALL_WAITING) { this.mStartTime = 0; - this.mText =await ResourceUtil.getString($r("app.string.incoming_call")); + this.mText = await ResourceUtil.getString($r("app.string.incoming_call")); } else if (data.callState == CallState.CALL_ACTIVE) { clearTimeout(this.mTimeMeter); if (this.mCallState != CallState.CALL_ACTIVE) { @@ -101,7 +101,7 @@ export default class CapsuleViewModel { Log.showInfo(TAG, `cannot show`); } else { this.mStartTime = 0; - this.mText =await ResourceUtil.getString($r("app.string.communicate_by_phone")); + this.mText = await ResourceUtil.getString($r("app.string.communicate_by_phone")); }; this.mCallState = data.callState; } diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index 874964aa..959c378d 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -56,7 +56,7 @@ export default class BundleResourceModel { let that = this; try { let appInfo = data[index].appInfo; - if (parseInt(appInfo.labelResource.id) > 0) { + if (appInfo.labelResource.id > 0) { BundleManager.getString(appInfo.labelResource, (value) => { { if (value) { @@ -116,7 +116,7 @@ export default class BundleResourceModel { }).then((data) => { Log.showInfo(TAG, `getBundleInfo bundleInfo:${JSON.stringify(data)}`); let appInfo = data.appInfo; - if (parseInt(appInfo.labelResource.id) > 0) { + if (appInfo.labelResource.id > 0) { BundleManager.getString(appInfo.labelResource, (value) => { { if (value) { @@ -135,7 +135,7 @@ export default class BundleResourceModel { mBundleInfo.appUid = data.uid; mBundleInfo.systemApp = appInfo.systemApp; Log.showDebug(TAG, 'getBundleInfo getResourceManager label:' + label); - if (parseInt(appInfo.iconResource.id) > 0) { + if (appInfo.iconResource.id > 0) { BundleManager.getMediaBase64(appInfo.iconResource, (imageValue) => { if (!!imageValue) { mBundleInfo.appIcon = imageValue; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets index ef1ce1f5..92767954 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/actionComponent.ets @@ -81,7 +81,7 @@ export default struct ActionComponent { @Component struct ActionButton { - @State backgroundColor: Resource = $r("app.color.transparent"); + @State isTouched: boolean = false; @Prop content: string; clickable: boolean = true; clickEvent: () => void = () => { @@ -94,15 +94,15 @@ struct ActionButton { .borderRadius($r("sys.float.ohos_fa_corner_radius_default_s")) .height(Layout.ACTION_HEIGHT) .padding({ left: Layout.ACTION_MARGIN, right: Layout.ACTION_MARGIN }) - .backgroundColor(this.backgroundColor) + .backgroundColor(this.isTouched ? $r("sys.color.ohos_fa_click_effect") : $r("app.color.transparent")) .onTouch((event: TouchEvent) => { if (!this.clickable) { return; } if (event.type == TouchType.Down) { - this.backgroundColor = $r("sys.color.ohos_fa_click_effect"); + this.isTouched = true; } else if (event.type == TouchType.Up) { - this.backgroundColor = $r("app.color.transparent"); + this.isTouched = false; } }) .onClick(() => { diff --git a/product/pc/statusbar/src/main/resources/base/element/string.json b/product/pc/statusbar/src/main/resources/base/element/string.json index c02ef3a6..9fc7c837 100644 --- a/product/pc/statusbar/src/main/resources/base/element/string.json +++ b/product/pc/statusbar/src/main/resources/base/element/string.json @@ -55,6 +55,14 @@ { "name": "signal_null", "value": "×" + }, + { + "name": "incoming_call", + "value": "来电" + }, + { + "name": "communicate_by_phone", + "value": "通话" } ] } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/en_US/element/string.json b/product/pc/statusbar/src/main/resources/en_US/element/string.json index d32ab2bf..e50f8585 100644 --- a/product/pc/statusbar/src/main/resources/en_US/element/string.json +++ b/product/pc/statusbar/src/main/resources/en_US/element/string.json @@ -47,6 +47,14 @@ { "name": "signal_null", "value": "×" + }, + { + "name": "incoming_call", + "value": "Incoming call" + }, + { + "name": "communicate_by_phone", + "value": "communicate" } ] } \ No newline at end of file diff --git a/product/pc/statusbar/src/main/resources/zh_CN/element/string.json b/product/pc/statusbar/src/main/resources/zh_CN/element/string.json index a958d64f..6dc8ca3d 100644 --- a/product/pc/statusbar/src/main/resources/zh_CN/element/string.json +++ b/product/pc/statusbar/src/main/resources/zh_CN/element/string.json @@ -47,6 +47,14 @@ { "name": "signal_null", "value": "×" + }, + { + "name": "incoming_call", + "value": "来电" + }, + { + "name": "communicate_by_phone", + "value": "通话" } ] } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/base/element/string.json b/product/phone/statusbar/src/main/resources/base/element/string.json index f2eb8806..c7195795 100644 --- a/product/phone/statusbar/src/main/resources/base/element/string.json +++ b/product/phone/statusbar/src/main/resources/base/element/string.json @@ -55,6 +55,14 @@ { "name": "signal_null", "value": "×" + }, + { + "name": "incoming_call", + "value": "来电" + }, + { + "name": "communicate_by_phone", + "value": "通话" } ] } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/en_US/element/string.json b/product/phone/statusbar/src/main/resources/en_US/element/string.json index 04c679a9..99a6772d 100644 --- a/product/phone/statusbar/src/main/resources/en_US/element/string.json +++ b/product/phone/statusbar/src/main/resources/en_US/element/string.json @@ -39,6 +39,14 @@ { "name": "signal_null", "value": "×" + }, + { + "name": "incoming_call", + "value": "Incoming call" + }, + { + "name": "communicate_by_phone", + "value": "communicate" } ] } \ No newline at end of file diff --git a/product/phone/statusbar/src/main/resources/zh_CN/element/string.json b/product/phone/statusbar/src/main/resources/zh_CN/element/string.json index fd677cbb..44632af9 100644 --- a/product/phone/statusbar/src/main/resources/zh_CN/element/string.json +++ b/product/phone/statusbar/src/main/resources/zh_CN/element/string.json @@ -39,6 +39,14 @@ { "name": "signal_null", "value": "×" + }, + { + "name": "incoming_call", + "value": "来电" + }, + { + "name": "communicate_by_phone", + "value": "通话" } ] } \ No newline at end of file -- Gitee From 2bea0866b260f749495f6f1dcf251d38e7a93b6c Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Thu, 18 Aug 2022 17:28:33 +0800 Subject: [PATCH 239/373] =?UTF-8?q?SystemUI=E6=B7=BB=E5=8A=A0=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E7=94=A8=E6=88=B7=E6=8E=88=E6=9D=83=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E5=8E=9F=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- entry/pc/src/main/module.json5 | 3 ++- entry/pc/src/main/resources/base/element/string.json | 4 ++++ entry/phone/src/main/module.json5 | 3 ++- entry/phone/src/main/resources/base/element/string.json | 4 ++++ .../src/main/ets/com/ohos/model/bundleResourceModel.ts | 1 + .../src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts | 1 + 6 files changed, 14 insertions(+), 2 deletions(-) diff --git a/entry/pc/src/main/module.json5 b/entry/pc/src/main/module.json5 index e6bee67e..8ed9ca82 100644 --- a/entry/pc/src/main/module.json5 +++ b/entry/pc/src/main/module.json5 @@ -70,7 +70,8 @@ "name": "ohos.permission.MODIFY_AUDIO_SETTINGS" }, { - "name": "ohos.permission.DISTRIBUTED_DATASYNC" + "name": "ohos.permission.DISTRIBUTED_DATASYNC", + "reason": "$string:distributed_data_sync_reason" } ] } diff --git a/entry/pc/src/main/resources/base/element/string.json b/entry/pc/src/main/resources/base/element/string.json index c962e718..d75b993e 100644 --- a/entry/pc/src/main/resources/base/element/string.json +++ b/entry/pc/src/main/resources/base/element/string.json @@ -11,6 +11,10 @@ { "name": "description_mainability", "value": "SystemUI ServiceExtension" + }, + { + "name": "distributed_data_sync_reason", + "value": "SystemUI Distributed Notification Request" } ] } \ No newline at end of file diff --git a/entry/phone/src/main/module.json5 b/entry/phone/src/main/module.json5 index 373a8522..c7f7a9f2 100644 --- a/entry/phone/src/main/module.json5 +++ b/entry/phone/src/main/module.json5 @@ -70,7 +70,8 @@ "name": "ohos.permission.MODIFY_AUDIO_SETTINGS" }, { - "name": "ohos.permission.DISTRIBUTED_DATASYNC" + "name": "ohos.permission.DISTRIBUTED_DATASYNC", + "reason": "$string:distributed_data_sync_reason" } ] } diff --git a/entry/phone/src/main/resources/base/element/string.json b/entry/phone/src/main/resources/base/element/string.json index c962e718..d75b993e 100644 --- a/entry/phone/src/main/resources/base/element/string.json +++ b/entry/phone/src/main/resources/base/element/string.json @@ -11,6 +11,10 @@ { "name": "description_mainability", "value": "SystemUI ServiceExtension" + }, + { + "name": "distributed_data_sync_reason", + "value": "SystemUI Distributed Notification Request" } ] } \ No newline at end of file diff --git a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts index 874964aa..2c76b090 100644 --- a/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts +++ b/features/managementcomponent/src/main/ets/com/ohos/model/bundleResourceModel.ts @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts index ae55765b..6169dab4 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/ParseDataUtil.ts @@ -1,3 +1,4 @@ +//@ts-nocheck /* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); -- Gitee From ce25ccd411ee3d9915058c6dce0cec5d6319d0ce Mon Sep 17 00:00:00 2001 From: lizhi Date: Fri, 19 Aug 2022 17:05:12 +0800 Subject: [PATCH 240/373] =?UTF-8?q?[systemui]=E6=97=A0=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=97=B6=E4=B8=8D=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lizhi --- .../src/main/ets/pages/setEnable.ets | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets index 436f6f36..ffea2d96 100644 --- a/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets +++ b/product/default/notificationmanagement/src/main/ets/pages/setEnable.ets @@ -73,11 +73,12 @@ export default struct SetEnable { .padding({ left: $r('sys.float.ohos_id_default_padding_start'), right: $r('sys.float.ohos_id_default_padding_end')}) .height($r('app.float.notice_row_height')) - Row() { - SlotLstComponent({ appInfo: appInfo ,slotLst: $slotLst}) + if (this.initState && this.slotLst?.length > 0) { + Row() { + SlotLstComponent({ appInfo: appInfo ,slotLst: $slotLst}) + } + .align(Alignment.Start) } - .align(Alignment.Start) - .visibility(this.initState ? Visibility.Visible : Visibility.Hidden); } .width(ConfigData.WH_100_100) .height(ConfigData.WH_100_100) -- Gitee From d5173bd5b64c94fd0e41703fa27d3de3ef06feaa Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Sat, 20 Aug 2022 16:42:08 +0800 Subject: [PATCH 241/373] Add blocking event capture logic Signed-off-by: xuchangzhou --- .../ohos/noticeItem/model/SwipeLayoutUtils.ts | 4 +++ .../ohos/noticeItem/view/item/SwipeLayout.ets | 15 +++++----- .../ohos/noticeItem/view/item/groupItem.ets | 29 +++++++++++++++++-- .../noticeItem/view/item/notificationItem.ets | 12 +++++++- 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts index 7087ad00..68d0f9bd 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/model/SwipeLayoutUtils.ts @@ -37,6 +37,10 @@ class FocusCallback{ } return; } + + getLastFocusId(): string{ + return FocusCallback.lastFocusId; + } } export function getId(itemData, isGroup): string{ diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets index 4900223b..6e4f86da 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets @@ -41,6 +41,7 @@ export default struct SwipeLayout { deleteButtonCallback: any;// 需要配置 @BuilderParam SurfaceComponent?: () => void;//需要配置 @BuilderParam BottomLeftComponent?: () => void;//需要配置。根据UX设计,删除图标时固定的,其他图标要可配置,故这里采用由上层控件传入要配置的图标 + registerEventCapture: (id: string) => boolean = null;//需要配置 注入父组件的事件捕获逻辑 //页面位置position坐标、透明度、宽高等状态变量 @State overallX: number = 0; @@ -165,6 +166,9 @@ export default struct SwipeLayout { } .width('100%') .onTouch( (touchEvent: TouchEvent) => { + if(this.registerEventCapture != null && this.registerEventCapture(this.id)){ + return;//表示询问过父组件后,如果该事件由父组件消费, 则本组件不会继续执行以后的逻辑。 如果上层的各级父组件都不消费,那么就由本组件消费 + } if (touchEvent.type == TouchType.Down) { if(this.surfaceWidth == -1){ this.surfaceWidth = Number(touchEvent.target.area.width)//获取父组件的宽度,然后对滑动动效中所用的尺寸数据进行初始化 @@ -176,13 +180,10 @@ export default struct SwipeLayout { this.startY = touchEvent.touches[0].screenY; this.lastTouchX = touchEvent.touches[0].screenX;//上一次move的坐标,用于计算增量 if (!AppStorage.Has('swipelayout')) { - AppStorage.SetOrCreate('swipelayout', this.id); - } else if (this.id.startsWith('swipelayout_item')){//当滑动事件被子组件捕获,则更新storage中的id,表示滑动子组件。 只有匹配的id才允许被滑动 - AppStorage.SetOrCreate('swipelayout', this.id); + AppStorage.SetOrCreate('swipelayout', this.id);//通过加appstorage的校验,可以防止嵌套使用时父组件由于阻止冒泡事件失效而触发滑动 } - } else if (touchEvent.type == TouchType.Move) { - if (AppStorage.Get('swipelayout') != this.id){//只有匹配的id才允许被滑动 + if (AppStorage.Get('swipelayout') != this.id){//只有匹配的id才允许被滑动,防止嵌套使用时父组件由于阻止冒泡事件失效而触发滑动 return; } //如果有子组件被touch,那么父组件开头的就返回 @@ -190,9 +191,7 @@ export default struct SwipeLayout { this.responseSwipeEvent = (Math.abs(touchEvent.touches[0].screenX - this.startX) > Math.abs(touchEvent.touches[0].screenY - this.startY));//如果x方向移动较多(这里取四十五度为分界),那么就认为响应左滑 this.angelCalFlag = true; //改变角度标志位, 表示角度已经判断过了,之后无需重复判断 - if (this.responseSwipeEvent){ - FocusCallBack.setCallback(this.id, this.loseFocusCallback.bind(this));//本控件响应回调,那么就需要将上一次滑动的控件弹回 - } + FocusCallBack.setCallback(this.id, this.loseFocusCallback.bind(this));//将上一次滑动的控件弹回 } if(this.responseSwipeEvent == false) { return; diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets index 1f1621d4..91a97c1e 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/groupItem.ets @@ -22,6 +22,7 @@ import deviceInfo from '@ohos.deviceInfo'; import ExpandInfoManager from '../../model/ExpandInfoManager'; import {getId} from '../../model/SwipeLayoutUtils'; import {BottomLeftItem} from './iconListComponent'; +import FocusCallBack from '../../model/SwipeLayoutUtils'; const TAG = 'NoticeItem-GroupItem'; const deviceTypeInfo = deviceInfo.deviceType; @@ -33,6 +34,18 @@ export default struct GroupItem { @State @Watch('expandChange') toExpand: boolean = false; private groupData: any[] = []; + registerGroupItemEventCapture(id: string){ + if(FocusCallBack.getLastFocusId() == getId(this.groupData[0], true)){ + //如果上次滑动的是该group, 它自身允许滑动, 但它的子控件不应该滑动 + if(id == getId(this.groupData[0], true)){ + return false; + } + return true; + } else { + return false; + } + } + expandChange() { this.updateFlag++; } @@ -108,7 +121,7 @@ export default struct GroupItem { Row().height($r("app.float.notice_divider")).width(Constants.FULL_CONTAINER_WIDTH) } Column() { - ContentList({ groupData: this.groupData, toExpand: this.toExpand }) + ContentList({ groupData: this.groupData, toExpand: this.toExpand, registerEventCapture: this.registerGroupItemEventCapture.bind(this) }) } .width(Constants.FULL_CONTAINER_WIDTH) } @@ -130,7 +143,8 @@ export default struct GroupItem { bottomHeight: 92,//可调参 deleteButtonCallback: this.deleteButtonCallback.bind(this), SurfaceComponent: this.SurfaceComponent.bind(this), - BottomLeftComponent: this.BottomLeftComponent.bind(this) + BottomLeftComponent: this.BottomLeftComponent.bind(this), + registerEventCapture: this.registerGroupItemEventCapture.bind(this) }) } .width(Constants.FULL_CONTAINER_WIDTH) @@ -145,6 +159,15 @@ struct ContentList { @State @Watch('remainderChange') groupData: any[] = []; @Prop toExpand: boolean; @State remainderNum: number= 0; + registerEventCapture: (id: string) => boolean = null; + + registerContentListEventCapture(id: string){ + if(this.registerEventCapture != null && this.registerEventCapture(id)){ + return true; + } else { + return false; + } + } aboutToAppear() { this.remainderNum = this.groupData.length - 2; @@ -212,7 +235,7 @@ struct ContentList { List() { ForEach(this.groupData, (item: any) => { ListItem() { - NotificationItem({ itemData: item, isSubItem: true }) + NotificationItem({ itemData: item, isSubItem: true, registerEventCapture: this.registerContentListEventCapture.bind(this) }) } }, (item: any) => `${item.hashcode}_${item.timestamp}_subitem`) } diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets index 3d4beac7..50e0c7e0 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/notificationItem.ets @@ -34,6 +34,15 @@ export default struct NotificationItem { @State itemWidth: string = '100%'; private itemData: any = {}; private isSubItem: boolean= false; + registerEventCapture: (id: string) => boolean = null; + + registerNotificationItemEventCapture(id: string){ + if(this.registerEventCapture != null && this.registerEventCapture(id)){ + return true; + } else { + return false; + } + } deleteButtonCallback(){ NotificationViewModel.removeNotificationItem(this.itemData, true); @@ -62,7 +71,8 @@ export default struct NotificationItem { bottomHeight: 92, deleteButtonCallback: this.deleteButtonCallback.bind(this), SurfaceComponent: this.SurfaceComponent.bind(this),//bug: 此处需绑定this,否则控件无法正常显示 - BottomLeftComponent: this.BottomLeftComponent.bind(this) + BottomLeftComponent: this.BottomLeftComponent.bind(this), + registerEventCapture: this.registerNotificationItemEventCapture.bind(this) }) } .width(this.itemWidth) -- Gitee From e909699f95c719b095a0e9306db10e61062a26b8 Mon Sep 17 00:00:00 2001 From: xuchangzhou Date: Sat, 20 Aug 2022 19:07:55 +0800 Subject: [PATCH 242/373] swipelayout logic optimisation Signed-off-by: xuchangzhou --- .../com/ohos/noticeItem/view/item/SwipeLayout.ets | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets index 6e4f86da..24c41403 100644 --- a/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets +++ b/features/noticeitem/src/main/ets/com/ohos/noticeItem/view/item/SwipeLayout.ets @@ -30,6 +30,7 @@ export default struct SwipeLayout { lastTouchX: number = 0; rateSurface: number = 1/1.3;//跟手 rateDelete: number = 1/6;//右侧删除图标移动比例 + eventCaptureFlag: boolean = true;//false代表控件不消费该事件,true代表所有其他情况 //需要配置项 @@ -166,10 +167,11 @@ export default struct SwipeLayout { } .width('100%') .onTouch( (touchEvent: TouchEvent) => { - if(this.registerEventCapture != null && this.registerEventCapture(this.id)){ - return;//表示询问过父组件后,如果该事件由父组件消费, 则本组件不会继续执行以后的逻辑。 如果上层的各级父组件都不消费,那么就由本组件消费 - } - if (touchEvent.type == TouchType.Down) { + if (touchEvent.type == TouchType.Down) {//eventCaptureFlag + if(this.registerEventCapture != null && this.registerEventCapture(this.id)){ + this.eventCaptureFlag = false;//使用标志位,实现该部分逻辑只在down中执行一次 + return;//表示询问过父组件后,如果该事件由父组件消费, 则本组件不会继续执行以后的逻辑。 如果上层的各级父组件都不消费,那么就由本组件消费 + } if(this.surfaceWidth == -1){ this.surfaceWidth = Number(touchEvent.target.area.width)//获取父组件的宽度,然后对滑动动效中所用的尺寸数据进行初始化 this.initState() @@ -183,6 +185,9 @@ export default struct SwipeLayout { AppStorage.SetOrCreate('swipelayout', this.id);//通过加appstorage的校验,可以防止嵌套使用时父组件由于阻止冒泡事件失效而触发滑动 } } else if (touchEvent.type == TouchType.Move) { + if(this.eventCaptureFlag == false){ + return;//本控件不消费该事件,因此不执行move中的逻辑 + } if (AppStorage.Get('swipelayout') != this.id){//只有匹配的id才允许被滑动,防止嵌套使用时父组件由于阻止冒泡事件失效而触发滑动 return; } @@ -251,6 +256,7 @@ export default struct SwipeLayout { this.lastTouchX = touchEvent.touches[0].screenX; } else if (touchEvent.type == TouchType.Up) { + this.eventCaptureFlag = true;//将标志位置为true,默认控件响应滑动 AppStorage.Delete('swipelayout');//删除该字段,这样group会有左滑的机会 if(this.responseSwipeEvent == false) { return; -- Gitee From 7687e362d231336eeab5651eca6d9bff84d79baf Mon Sep 17 00:00:00 2001 From: lijinfengde123 Date: Mon, 22 Aug 2022 09:30:07 +0800 Subject: [PATCH 243/373] =?UTF-8?q?SystemUI=E6=9B=B4=E6=96=B0=E7=AD=BE?= =?UTF-8?q?=E5=90=8D=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lijinfengde123 --- signature/systemui.p7b | Bin 3637 -> 3924 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/signature/systemui.p7b b/signature/systemui.p7b index 2db090e729d460597b7fdec2868b12aba27532e6..740ed7ac25ee542d79ba440e63bd76a4e854db79 100644 GIT binary patch delta 958 zcmZ8gPe>F|7;o0y$yGO{n_00w3bUGZ#@uyHG!3e?4tYq3B=pV9+x6w_%xmV2w*5ie zVxfbCYz0yWPZ2^V384t0V}vK`R7B_@x+sNoi{8x6Y&LWH_`cuw`~ALezV~wf+QAvI z*f`8bkCrl}-!X1?XtCHh$WnbFj+0_yJs%w}WjIt54sl|U-}(pS7K{A1aFPFVD^?e0 zADBX>g$-TMVIF~#aUdncgb0oYs*0gHRmso86d{6&Eox%frcOUC5Vzm3#;{IN&V)|7 zN@UwuWd!r2ZN{gD8dfnau&n3B^`je9kWtn!UA<&aS2~sKOr|~IDg$bWd0J z35KZ9-tis!eoUkxXrZbRdBE0H4GCD!8Ubk)O(D%7$P`?!;37eK2AX+8FZk__ez}Kh z;o{4exN|k$EUqiL!t3u*G4csx!mtun!J;T{V}~Ld1(0Y=7F4ohGPJO=lbqFwkVTN% z?g9W~81t~K0s=!Gfr@4YrhuAeOe0nBN~4Zyv|JZyjZ~szkzOy#M%umTL8N`hC|3h2 zY$JJWIad&2 z?CQKCc2r+MG%SH|Jh#xX@oMGzmfu93wkN3?gZ^Syjmc6gl zzHm(_oDt84T6b-Kc=4pv@MGxO`qIPihi02L?lsKM?P=yn^SklO7j6$R$okMt`g%@% fzxr{ZZ>4+hblclchCJ~!)>MD^+0y6C-CutJ(#H`N delta 680 zcmca2w^gRzpo!0rjZ>@5qwPB{BRkWACO##gkQ@^uqam*WHydX{n+IbmGYb==K@;mG zghIvzO{|AmnppQ&E0v`d6=&w>=_co=q$*h%>c9o^5_5q9N``s{dIm~5N~NWlDL}5N zfsuKVrDdwFX&R82ctk=_sid+1q_8M8CpED+RY_-Jtwg<2esO$eUP)?tQDO9g zsWdMoCsj8yFD)OWJteg)H7CCywMZB2B>#fcJdebp-2A*spgk#>#U(|P7cz=&-p=UG zTo2O=^-Xequ3mmdez9J0WpPPrZfPb^M`A$^(D@L7_@u<*%w(`&fo@uAVo52;jY>cr z@lXYc1qDh#CnYB56ocH7n3I!Vo|>Wy;YTZh4F@_cH?tTNtdqC03Qj)FYCV~oO>?p( zo2FYVP%lCnY(!Bi(8Za_B|uY9WTHW8fyR`A!b7PbI};qDMR|!iN}FZazq0W-8Z

    H~zE3?Aq!LLthpCMP4am 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 literal 0 HcmV?d00001 diff --git a/figures/downLoad_02.png b/figures/downLoad_02.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3beb166e07d98536990c5a1043efe5831b8303 GIT binary patch literal 61351 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∓^wLFK-)DFuY1s)GdnW3kLzND-3?|Q=5%I6Yv zfBX_Abq+aji~bq=uh{shrXpZZM%|9E4cu(q<#b=sO`OFgv+FExvjUGI@>6zbj6US@({qCJ^&L0d$K&IQ9eOI@<(Xs+r zJ(?G*sCV5d18GCbfL#UMt7u;Tlg07hJ5n+H=TDBx2BNEhaAvq+3=gU!QX-FFlj#(1 zphVRm)beO4c%pzxEp5u-sOf{vAM0SdaeN41zUM_zE}O<NTZ#Ee4b)q$WQN*28bbyyoa5^W3JtwJ0(2sRR2S9)8G?B~*~ie8^tgbok*>Nvi4NDv zckb&R1n}lRt)FN6toV#+A2V0rCt#P+6eh71zS8#3HKybWBwu^+AU;E`dvBFuIVycT$~?LBiX^hki=g^ z{8-VV>F2rQcg&)W`9}27Vs<1d;+xLt7GxujL8E1xnAkIi{BjFYNkz;N-?Ikxr?&mI zNk&Qr;C49oZXFOQ-Q=wR!Jhodc2;N*t-USS{VC{u$Szb3I7Y%A4|{mGw}KzH3|qo5S7#mGy|A<7LU63CZP|$QrSy z$jd9rCC852+YfT^b*%dk{!QaqArxly%g0oK#1AGK=*UBd;C^rF&O>*tU`7P-%`%}% zznQ%dM6iMC0HXA?9!AW4&~EK8J?aKO^g4tD#7Km(WO`DmO5BlTdMdCzJbZ%Xxo;dU zf~J$FK>n721?yMty>=q5vr%PKtdEV>1`JE=Qy70ccQ2O;x?xDpTEpb zRAQrK0t(9NlkYB+n>2kdM!b$s_T@JOTyk!He)S$KZ)99_<6yo;5Q$#=t#ya3a>4H^ z`{5{wev_WdV+yX@)0kBr%W%#m?*_wDGH{vhTBug1PekR44-vtNhgm03B=dAmQz?pO zA-+iO+gteGLfvrCbrI?}Okg}`9%#E9X1f!${Uy_2CcLNUvyE;8 z8g(9Vtk&F*Ey;dczI`pf@$m#rq6Q42ShdhU95N0L&lQH*J}1|r8%2P7W(o9czO!GF zbYzg{MS9Y{7o)2CZpvi0D10e=7hajw_7p)m>o#&;30Lowf~Y@B9{s=b05n&rwb8-4 zuQ7y;hQL|<873oX#6bi4kq=&DMB>NFUe*=C4(j6vlrgLK^^M>eWE=KuI}fp>kga)4 z9VOjkn7X_mO!Cf$*e&xt@)KGid;!tf_pl^gRa)mm!9>~mnfeH;@wn5dEQ2dIEs~4= z<;I_F$-~+PRDN`Yqs^j?IhFfKF!jg{b5I!}@@ z(W|CDGd%HkiC|pSRX6l^goqP=>%(rb7|{q|W>ww(EAdwyui9?kW$GlN*E`7D&vJip z^y+eG?2S`}8C151JlrDm+E6Q4?uaOsW2AEK(&+H%uPj(qhi3m>Yz~`@ zo#~UdjD6%HLc(yN$8g_%^%|U6O$q2@!;u%pohVGb97BPS4g zKiDhVUTWz23cXv+O419Cu=l`L1q;#QFgmLFVi&kujc8)bhA0b;*mL)RSw~YHAsEh2@g4aNCQt{;lS>Cug`-W~yh z$uPz*yHjUgPU5e4QH=}A8ijspVsUxb|A6vM_ql&FbXD)k)j^oFbo$Kh7%Jt3z+On$ zlY*Vy!<+V-;z0e|6BO++HHjxSk=tG+N1A% zGnFUjX8qI^;}QbS=St+n8Mv5xPc)A&NM(^~LbOlpciBe8N1wW~3+8Fh1@M2KPROgN zLEGHqw3u?nyL0#`CS0VwI8iZ4;MBWf5N32{tpQ{aCa@p}P(!$P4*WZ$aq1N?>b1o_ zT(PnptCt2u`z755Jn{z&-l%)Ym~Gid4^B9a@sX255WT?C8&4kleeD)RN)<@xIQWS5 zzej7^|4MCk|A&_U-&!HpLxXBFFI><5PUjVN_-^B?|yuk+=~qY%20&|XuM9-%YtbhSrNJU*lo{8*8PK{eJ+ z5{38=q#etc#i!>yEk3__L<@b_LG^eD@3+-T_wke#rT*_5?GQKd>^bL6JOzE8F)r{P zXvY28WBdw>?Fi-S@;^gF{hCQy{Rr10Kl=}X`Mz9-+*sHDKWS>Q@H#&LYXaiLIUfr-{{udDQvBDJ`u#Dg|JRHfO4I=hvJjVZ~ z<;7gMN@X?03`xN-h5hL;PkfR5k1}V#5XgMjOMrv|%JB+Em04F2L+O#;FTylt0BV*0 zL60j){|No^^nXUunE$4rGRprSJ|rdI{~!5}6xCQdv2s67{9VNH8u#Cd>DbIFe%5}# z#R%rb`5);x`}{c7W4-9VX=h$RQiy_i{~>Az-~t~L+W(}|3h#Y7r4bz?302e=F~~1DwhO$v>uaK_L;)?r0-?Y zT=r*F7JQsVr9(Xz{KHkAIt)Wr+BwsjtOWIBE#V};?ePMS77hkqZZ0s+@`Hrbwycy% zfA!o}3z)LF0{O!Z_A9-oEvzkNrw>1rX%PqOrM$7IBWde%D6JnYDwij}X{NDmAkWLK zka=Epmqe{giIx_@`;)8za~K_!{X2i!9q$kKd}Qk6R~wxJ_89~JlIxjvBehIwwF*5C zqq!*!YW|95I7#ytw~OT-TCvg z4eoN}XqsTytTa)}r@$yZ%A)T*DMoi}<@lU$Qsgf({K9I{etuO8F(>-U$5_YzJ&94o z3cW{a7G=u>V8!lcV8DKkH?TEG63@?<<6@|spxIf#K>TTfXpSRMj|=6|b$^(rY5#f9 zGcfR@A<&y_s8@WS6FshmyF`S^BU63iANT)7uP|__6XdVA7Vwje{MC0X58ot4*wy~NT z+0y3;7_HS-{jWzf6QX*C67NF9i@!)0@CKT~t*wZ1Q)~08ox+%yo6F=>oFb0fBF^_x z)iN82*?~&I@LihtuZ>hQTxcz_x~-|Z?jJoCyH`ZWc$$^B;|E^*tLrEdTTQtd-Xwl@ zSdqq^o$1;$rVps{gNzv)J~F=&`3>dfO@IU#Mi8tB7S|%!}@26iSPO*pL%+6`Io|-l`{G8rf9^f zjHfa8OD3fA_oUnm4ie}xd<1ptUv@d`iG9}CVlas!w$TfS)nCN@mZVuxi{s+)2iu7< zsZA$dy?(bwpH7?(Jgp>E8>ij%Z}hozpeeL zF;T|1cfM+$gA43a3%zg(fV6#h%?eX`mBFR$&_(d?O=#)Hg@x0IOt&A+MPqNUrw+61urz6AvG zQjVlreb$H%+BlQ?+Ys)U^t7gx`~c%PRO=8;1U1SUKbv2TSuGt{8-BZtbgLoX8B)WDH;dSY+_Qrb)KrjU6}Rw zs1e#dNH-`uqi=gs2m83@d2>0&f!SMm{B-oix8NREOICkZ(^vdF_{Yb`cgpe~jlaDA z6&Dwq{3~Raxq5Z|c3&qk{)^{^DS+4bU^G=bBgp<*)@wYp_h%m{qy5(^`GCaU5uCW+$S_h%s-sY55xFH2=ayk~?v%K4h;% zZ|>U+dPV~!XZbvK3J}XHhI?PB63cT@O(*e(ivnO+R`Ofv%YwgFM4;dQ7j17H6j$)= z`{EKLI6;F1ch?Xcf_rcubZ`lf;10opTL=)`-3cxO3@(EY!6i6^B*5F`cTSyK^{U>h zSNGlj2B!C(-o18rul4OuuP!FfxDVsY?MA~qBJFpIXCiT`()^uq9o`UrRL4_>=obh6 zoHDG*7_S{xJY>^2y6GC^%D9ofk}hD>k7--a*wn?1c3xq^L~dGQC$&9zObZ%V8n zvPSGnc%e~^V6fS%zRY*n5XY<(##g?V&YYu?hphO!5qMDX1@Q0}zb*ozKc~Y8^Hlre zID-*#&aUT}D@-|MvOSu*)^vfP=*1Jpk>4WpzD08M*Jl!P+aG$?omxJYj9JwZ4_o~e z@!~BOYwr>G_5!DBXQ{zYVwI$Fuw5T!ycDsJCJw%+jU21bje z_cDm^nugio^=cJ5NGe}CS7umX-EOkKN;?|3P%Y(*?l-h0gYu@@sKyyqwlvM#WxJa+ z;t)VTOZ(T_t!w!xEW|i9N)@sY!pG&xM6guLp{QO5OlN-6~?9fY-`j}+r(1~~Nh;3y@D;&t&pVLqb$Zd=wW0v&4Kw3*_D zDIbN8%ccsdmpXSyK*VSh2BM(uPnH5OFp_bBUy}w+Y!NiHf#*|Kubi! zxzse!vXuv5*BMn@=E!m#M#Hg1_*ocwfJGV&nNi(3Dw7CSbYfj_RZ1)Z$xNIC?3DEpnT+0}eA_P6uL{>ot22zqA^;l+BXgRr)bUjyQdw>YsLtCdUj--M z>!@VeJQs`1%s3E6j_0E^XF`tcLZ-Bd3KSD%tq~CxwOR;K9dRQ0!-VyOY|=d;(~$DK$Ngt1e_S0yv~U2XVf57il`U8p>n^ZP%YsVs$OB^PyL z=9u5G=QJS%u+XiR5#aF$qV3i!MNdV&UfTJA{pT)Nu_C4q(uSL{*Mi=m3LiHJYv}nn z#}G*eZlix_G(%_!BI0ivak_rIUn<#U@6tIA6uL^Qj*|f47&6u0YI_tP?n}G)@)x|D z49SgU>b&JItXtz&(#F+z@nXEuq{~kEIVqw^PK$3h2E(TdpUOs%tP#XJwYf`GO96r^LKsZ=@f#JgDaCnt@}R5Po*t!bL*# zr^EGuU0BT{WEgUW2v@;zvPFKTEoikoaBtr_W^-GMNvq{tfhXj*#Rdhhwm2p$UNZQzO#7IDM-y zqx5dc7c86P<6qT5zlt8lm+plcWh8oG!!C&S^N#Tbxom zl3|u?!xd}pqaf42&@}m~UM2kX*Y8lQKG-vq8^zJPqaU*Y!v*ovaIu`lmr7nWp<4PD z7C*vavDE0x*Votgo2;7wg-twnbAJ;%UCyx%r2H!gG!W;gE!^y^EE&A?4pzzNqLn*g zFakTkiF`XNyL1r}X#R@Vnkn$AK;o39FO!$XJOYC%7T!gRWc2$a7PY^Hrf&oJ@`Mu3 z?8e80yPC%jP5eV&tKzv+^w09eiR}%_eyP$yAcest#+=yE-h_Ol`o#k~=eb zq08cYC3+R*vA$L)udT})VqzVqBcXK2uM}5QmXK1JTRyoIUFu|nN4<}1)&i@|ZbD$| z7qn<-5lcg@4*G*cDm>vCUU7>S7U?4YYvKAV(=h=SJHT6ZvUPYEp|=*%iNG}erGo^Y z?kY9Ch{mDN0>ycX4j)XpX9|!rx6xkZjH{jPLhj$e%ooR|f?1Z!seYxMwC{-zjdd{{T z6oj)y9uxW<+iB~%wVk?AZ)DfxLn~T34I3v~rbrR9)3MggM(1P(Z;up1z`JcyTzqKE z;zUFtC4PrELcURpez)LnvUuHUZ64pWmkTV&NTOdI>_b>x&_mXYYh8DgP)dmMOWzv5 z!5LjT=Evj{*RudwBgQz&G85;Ua8wtq(Msuyn;D;0^e3g51^c&3Q+tT zc4<7M5mglpUC8k?*dNxc+(ZnNEwe181(BQfPUKgWKBzS3BCf#b#Q**b8l>>1t9l#v zdy8Kdn?7e$ZJ!*ZlTVVXY9ED*HJH{aPIQ!NDawswuNa5jA92FMd_o|kJc}V$MZG-p zVxaOm>_;cfx8^e0#3@>JOxyLdH9a&tiu{8L5jGiQex(Umc`zId_X9^M$z6Xz&5#(x z3?Qp21>>(w+f7fKhGrdevp433*=sZQL&eDJ?pQtNK=d4QIJn-icmT)Y-hut1_^u1> zWmVaDEMv9+TOmGIw!oTn;&PF~yHW43=pI3rW-1$~Ni=bXp={J4k!=<3G}~Sb9*csb zAakLkQ8q==rd0y4mWv}`QE$-Df$pa%*klo5GcmPIP�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 literal 0 HcmV?d00001 diff --git a/figures/downLoad_03.png b/figures/downLoad_03.png new file mode 100644 index 0000000000000000000000000000000000000000..80145844e837a2ea4cbf2e3d2df46421a957c076 GIT binary patch literal 46171 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 literal 0 HcmV?d00001 diff --git a/figures/downLoad_04.png b/figures/downLoad_04.png new file mode 100644 index 0000000000000000000000000000000000000000..a75222d819e2193ded68806773ce46a42bf52897 GIT binary patch literal 33993 zcmeFY1yfwX+JFg!5J->!f#4*#yUP&V8C(Md2pZhog1a-gyAB#WxH|-AaJRvRL6^IA z@3((qpQ3G{$?P_Xr3G7_u@Fst5>3xv%dIs3@=Z_ubfLuMb2g zRcSGV>Iss=*8;M+sG=wW0yy@=qtV;fGMc@NjuQd`X77J4#6i2#p9ly+2C@>O>h1=o zS#O=mcyDj@7hUD`%w%TSIR69x*efK0Cw<|#^`xAfPGgvy+vjaWD`hLimTfDF4^LW? z{F5GrUD@%~)rA$(>4ec}ME?gXwywXG#eZp6w?Hh<`!7({ytkzx|7Acv7(e&_YlQdz zH~N1EgB8!O6~X6%z!ui=H75dOYYE;GMr@L7zcgEN%3&+|{p|F5pv)$U~%!?)O>61Nxx zjXlyC1J2wJh0`_pd*@8o}`AvUqA1KbO& z?9MX40lxb=1gWPl=wB<#{tNv4>g5BX)py6w4A3%7&QlID!YwC<9+!ds?`F<()C1D` zW@0<0G$XKZ?9YU>v{Bc?KOsc*1F_oveMLEJA4dky2?Za(HT z$jGBkZme~^| zC5$A|t)YJZ)OyeZV4oudcd@WjMRj0ka%};Imv|F>-}`AUX)wWV4nVJ<92|s*NkK!k ztFE!!N@-;CRf;dW3}?`V+Q`-bn=#Vw3FJhH-TqgxXaa7ZU#>IU`}7CscaUN>XJT;A zHnYF_h{&(;B(BB2Xo{)dC$-*V7jDgbupqf=zk1Q%+krDdNCdOJPP)1w46`{J*{j~Z z%r%g#NxQ>aq|pzxpTHx_3NY<4s=x^Xo%9fJy4NjM@<}Ju>(6tlR%>lm`WvP zxj5+*fH#w>)G~lzjmL!26C&y0#Q3B|vJtGS-*kM`poDtL(hi;g#88f~2@S6>>9Z3huSe&d5Pl{0U}zOa;j{?XxD(iv z@LH=sZcbi8%6)6!H^{~eA6@6@uRphFrE_PP{+`-n%_bo{n6P9}xo_p&YP$iEQ#D^{oqh_)nKb|W+v5|-`okd%l$pF<`@sqp^&lLG_z<6oTS>Dh0+a?VkZ+DuXF6|P78Z0$%X?6$>p#hn z5*(ub-UYE~7&;n63GmWJe=l!U*J>9_db*EDDBgpF`29jGzr9q?vD$U&3Y#o)SRnZ5 zn~j12a z_*jFxW5n2CQjT93}TTILt@c$1>E**}eAE z`F-zN5;yjXZrai){{&JCyVO{NVu?|VY$HTPvcYSRIF5$R-rA}AH1v6T^9x5lJveMyp)Mh!UG5IQ~ zEr*ZkimzgsHOtQsk%3c#`rCZsc}f{f2j44t(`et47$k)Op<=kBQeC1AKk76u!viT~ z{rzN>Et|X5$tK4FEm_R`W<(%qCY|Uf^$Bh+sp6wS(Hmn1p12aA%|9o6U8KdDUmVSM zS%VV{s}Z8n+-TN4Nd{Bh@#ZRqQQsJ^7b%^N74VXm1FXE+&DSwv9UPL%pmib6+ zb?05DR~7$_l(z8^#<8mDC5ZCd{K$&al_#M(Sen53jD7Pk6-_>(m;1}dt66jHW=P1q zS&5F@Unz@8A}6hXr0;(;JH4mfI@_k&_lRUw7x>x((PKU8T>LId;PLR)NULTO4}0)% zmW%{&6qDv7WQN$xhyOs(%vEMLOzTE{9m}>;-d9TugHH0r*1NH#NRzU0iu9+v`By1y zF=%zgSt-2H%X7>Z6SUT6aMUY)sZvo@F2qnR#JZNlc{gH$?e0dcBnR*{A`#gd>h#gH zj&J`*+F*L)%R0=edO7@;HS=Fj;Mh&Cyjh?R^N;PT^bV!)?JrX z$J4x&W7D2zj2G}Vx5SB)6Cac)x5g-#dz};@X5rl!YQ%VS-V{l{#RzM7!C`SdIv}ZA zH}?1sl?aV43YtsWehp6UG&W1$iqc+RIT@FY;HSid$h-0i>O`d?Bj)az{U-d}7uvMh z^&}aURIF(Edfs5weeBe1A`11V7uJ>+UM+u`zW9SC9LQP+A^#uN^OT&4UoLL54r(N! z9GCB>h83(0VvT9w@Y{K_Inrk}#PYsN< zp4bcRv+lgUE|M4yCMadGRZYj+zTug+k;h3SJu|{i6voy}eN3+Pv|Sc4R|3St$UgS+ zdvED4wpnn@{+ch;o8FqE(@3WSU+9eXo}1Z23Of^4s%PFTI8f zZWe7Tc;tnlggoNTHx3u5LF6&|dN_m6z?*S%2Tn8(Sg$p_e2YbXdW^XU+?A+xQwG$X zLDf?x<$B&59V5q z8~Rl7L0b|s>6=x8u4I+?u)lO=n0L3Gh7j#cIbn-JyKq~eQ4-&-Ys3$M)ftz&2=G|t zP9a^te9_QT^A`K|kMeQmd^6P*3lb%LX9nm8N@RGt@5A>ykpZ~5P^v#Q{caG10TAZa zcDa*#8<?&b(3$E0oEms#C8(yrG&~GE^hYiOYUy(DkAP2UF;TbfV|!F-1Tx<> zO;y0~W?FuVxEe#M6SFT9h=SVO?aac@H<)$V|KBH{IFicCG8gF1*@d^(N&6Lt!SlEPVut3N0?wQmL@ zlvTCPYaiwp=5~*Z{TmqV|JbJWnVHH4C|w^?e%^lV>6eGFCcQAuPLcxHc6z|f+m}#4UIKgd^3Y)D4uGcH(%im8 zFsp`a6K;I%Ij!+QmG$iAhm{=bPi5MaSBXxKN6CjCEIjRlZZQNPB^<_(SK*?N#P;W<zZ_e~i(D4x&052U#>iPqi@g`4` z`h%Qf_<9wx*1D_NzRVe_yP-5mjH?OD7y`3}istF_RgAl3-`1>7OQ&2hGzL96r4bmU-wJtg-d$*en zAP>M!rR~549km`0XLB}F>5lLb)ve#gNmcWyx{;NKo9=1cDzVVGCSvC2XL+sNSC#$6 z_f<8HiB9l$p?Sh4Hn#ggUbIVVP<&_`!R}pkiJpGyP1^whp1NJ zo!H8VCwlLA1e*peWQ!owDQS1v74$#OvHo)v?h;wO|A5QZ8~h|D=Nk!_1~Vm(RKoMN zFRe`vNwvrO;q9b<)7a!w#4bfXI{SV-<>nF{s%Lfj=NQ-1H|!mWdfG~C7?r}_ySn>ZuMOJ z4*azjzgdM7E?1MnXLPW02DN8wC=!V<%x9u(#vIU1UGDhDiUM^1gw%V@Q{g*5XZm7@ z6ibAD_2yenlhT_lvWA7H@TFXT?6F?cl}cPGFVP&8e} zXT-mwsinTekq(@6xa+gzQLyTs+q0X>x3ug$YD}mxN8y~i#F;QBPslwRA5T-TcvXtI zA6HP7DM2}-ErW6>)wshj5Q|DnqxpO82`c4b{_MIKa1wrsOBAPeH+@Qot*ioO%U@_c zEb26wB$3>h%r`ZyDb=F!YxqokJ{^y6g6gG?YM=SEB{qdrL20v4wt=7;$mIy>U7+1| za<(w);}T;ogYb3$GU1%KBYgm?1k#VNN3ze`vI*NvN>%5;WVJUTD5lg+BLBFb&#RwCs9qdGMh$RI4^)v#{w z1jcW?!Nf>&;(d`dBqbBk?Qg*p9CNM$(~h0G`Xg=FPxYhi3_w$@^~dZ%NZpg08rl>S zc=Gdp*ep|aSFC}e8)wg4TGkn_y&sdS+-gM1Pp=?>tlPQgCuy_I}6Gs1!<=EH`*1vJ{i6n4Azq zOrjSh;^d0@Dfowc_x-Zl5(Lp9zpeU+sJZDQfOnT^rN5`@@x+hP7MM(u%5dZKlrKWq zDbH6|NRAQ7wVOjzMXzl~Ev{5jYp^v%U&d${-h4DNd-e7JqpZH3M8rO!Kg*o6sGnrd z&e61D(M#+RpDwC{o~OmS-_rnb59XU=tSD$QvxU%K9Q>+ir9cb4whA7C^cDO5nGwqi zrWW{hYFR3Gyu~YNn|`FLj85jE1fN}2U40MdrMz3z9%!@~O|9YDd;%(3@=ON5H8(Y; zNklmJTDSj#&$ZAHLzK>wz+Pkr|=Rp&BVzp#a{YIM|;EUY{z5!H5+53+qWw zd1)O4o)M?5e$iOAd5k_}JT^Wj$U}#nwv+Cwm+PkZ_7;|1mF}g;jutZ~4g1cSh(D<6>-x#mOj6a+GYDA{JC{O&aRLv!l`CbP zLTsVcpkHT#UEtS5FS!UB`U{E^xs@tb8iCiE>_!w`xz8ca&s-&U2FSUnnJ4P!cKoe& zA2!m~SRQ1H&TLvq|KcZA|GmPrwwxc%>s-5P(~A#E&n4@{pQt?;Ar($@6##M5T(*hC z4PweS!1Whm*k1+)@*!}yYV4+?cjZpa`ot$@KVp~zJ#pQ$kKiTXjeJF-xuaRD923{rn-cO|d95#AfgG${~sC0Gz_m1VJ zs*};kY}J_JIj&mtx+Ab16r1+VqtPret~x#t08Sf$FM4k36^-CoZ+cc z>1_>H(}hZ>nhVV>U4VI*5VRgVShR>u88tS{DUr+z)7}-#!wEdXkQ#Un9}(eqr4_>V zGGzm{ILAlk35Eg8M&`i1cMbQe)`+d_C(?)vyP9@TRo~A(-|CbbQ|Z8zC#$$n@Nz9c zuxqtdQ*4{|>1(J+86$Yj{dAvm#p&r;8m{i`mN>z{jzx>} z?veB^@8HL^6`^`^{Q?eeTLjpBVivLeMxUt3by%0kZp*7p%cCvdqHd^eXa3;v;Ngk} zcp{0hy(L+0Ovf1g$Klj%DK%mLW9(pBf%F2K^5G>iq*q#571`n)c5a(r4T8oCZiqp< z)OC@vw|H!=(H2{)k7mq0`9jH3t?;!&OE1pNMe22%geC31ooPbmo`0i)a|myxXf)Ob z<%&)F*3%dhD+16k7@*4HlJ>aYEQ_qKzS}|zp$6RdIl4E0cxY;I7-G&+n+egU4hfd= zsTe(W_)3em1PRZY{iRyuA)>%gwH^Akn#s8(A~cEd-T>d|a3Yh-u;EtUKE9=17-#k|4ix0h>tidWlR8N+}Me&UY6}#K~L;%(9aO$ zaD6HMt0cI`m`z*DljN!1eP!29!&1A0+`P$c#!2BRW6lW794gxAWckY~R!#hx*ybTT zJ~m?7>at|3dby1YK+B9L7!9C;DlO&Hq)4?t3cJdrOSP--?Wa)93O4#FrWAY0Xxr%nY*pDqDMq$fJ&}*oYx$S}J*v~$vQFrUg zR=W8786h0c4Ehuu=hY;cEJ^kxEyi35fV^U4VFT(Ej#@80KXsN7%ggZhtne;ez@f>Mb%WYoq}CGX15=2>PAp5lJX&Sc5;Nae@}A2h$s zLqvd_th;^#WFd~L^&1SXLV6w}@EqvNezMwA@ul)$S;HK^$E+%%4&Wt@l=Y%ylhP$K z^GfefsK(%O85-$yr5Xcw(wz5|0uR@IT`=rQaI3}=XA!}hhJ{W2veYKkAE}Emj#n^3pi!P6-nzsxvx9_|}_3$U{U?977JFj69V0Q67= zxIurq;c{}8mMb9kV$%J`P9AcY+tC~A*cx-#q8(`dhEx}wK&mY5YXdG~>oLqAFjYt+ zE7;5wJHzUC>>vX^7NO*to0rP-cK9{uu&*vDl;l$YrIVFd;n+0qIj$=+?gQt8ws0*D zf(7sxAN9cZ-}WaE4nga%@-OgbUCb$r{&h1Jiqzfu9H%8MdZ%YA7ob z3OXO=Pl@8S$Z=dAPyn*epemA~>*e#Qnq^o6X-6{VJEK;G2_;$Kpm07+K~|{l5+xX7 zxJ0}EPNq!-U3P+^+l}{YXh`i3W53QC;bbi<>pUouq3ghEw_>9{w3)$teeqr_;yh=? z(2*Vv;8iNSnzOs?GPltyqI?;h(1PEU43@pTSe-n&olea?WG5^y-;OA;Cne4`9zFm2(!WfubQu)3B417h@Kz})_#Nibg)?sJS!l=M8CYz7 z1%#2!I<>15VK-#FY_Z7Zy)Vts*y!GW>oEoRw2LOVeV94NBvIahPL5448utu$Z-;UT zKjs7hYq2z046KE)dmKk4T)p)B*>}sZ8^q6Lm-;YcFJzQDhhj_uLP*W9hguxh-L>6eyOOmv zNGN&mnKYRQM=A);lx&4^-ES%~ELh0}2k2RHtptC~5YsWnowG$oSmNPXLiA+UpbdEjT`TOgM(8vC-lUIu)2&W8#gkJO` z;7#5_va?bxi(;ewor%1x(8bp7sN|7zJuLZ^hM&{7CQN#5Audi2br$Nl>5T^?dZy+V zzMM{;wvqUV_XOvHz{2tGe}N-@%lv_BdkOo~+Dw7f8(#p9sX{)EW9lOv1>>zSsD<1+Cx=^N-v$nkgA|M$B^YotQwR_jOU*4Q)Iq&NR}1~p&m)OKw# z>`@A8-&f>UI?*(R#R3OrSMc=)x2+p*&BASnGTMK7%ez~l&Xlf{L)Hg?C$$e6f|wDc z=GjYM^LiFF#QXK<2eS2)6vw;5{D=|D$pDU%-ec)u$IdRYdFhHIMUvL|^$~>^!>AD> z=FrTp(G`i=dEvAhoZ!rPOY|*P-F#2-xm}98?;sAsA{ zTG3hWzeld6|Hgm|&ZXnf;Z=xn}|L;177)73A+PZ<-+&;?T>a6TZ~e(QN{2 zjL-yX3w_zamH8+eTwTs8HJAG+ko;gYI7;X#?g@KIudsB~!pfBA3!DKlJCxr9kb>tV zHB&pNDtF7LaDJn5673PS@P=P=r1+$kADkk2nm+Tea$bK*m$?x0KIzq(cM@iLVYx_a ztbJ;iR?1RQ-mORQw3B^D|F$`|z?y6}RfRfYR?J(y?gw@!w(reav$tXHN6Dj`!mUNz zhBeoC$!dG4K(9=6uHg{UcDH^$YmTY&--nF4kcuVZtLH%3KU#mm{8ai?ifVB3{)QFY_6)))T zng;kq<*&ZN2i%X|pwo(foVC*w0{B#ug}un-3GLVV%;t-?$<}DI(c4X`mH;+% zCUVJz^I8zqy-=~OdSj`FF;*t!S_H{UKe@c~t{p?jd~e|t)wZI{lPj$w-!@ujb2U!( zVR&i@e?>`EzE^a=^RN00LbLdR=d==PAdnjL^CEH|6HMheFq(PuyVY2?5LL0LI+E}y z4;6y1`YH#nxOXCJq*crJcu;In%~O-cW#^NV)YjbKgGWc^pE9zWBPxTk(xZZMx#B9N8eSyok>RAOeW2|+(+QX{(ip!wZwJ!>tIpC#0 z_?=xEEmDK2A9k*v^ILUmbtEn!_5caU_#GMP_}y?KJb#G>aBSUs;bZO~01L9WgfQ4~ zFDa)+iT9ysiKK0eSM^?E(p;ZvrZObjlr|sYe<&0w(=NO8t^PKQoy%Z2zZbpWBd1@w zpicuB@7$$OI^w?=!>=^oHP^|BEnP81&B1amT2GI(MpJcNrKDaD&lGutjBqXh__60KP4X8jJIR2)1!}YF&u9;={e|nd0&D0qgy2(GH@)7_+ z%!89w> zzuYq*olD)~eqni(e`|4ukb5R_9lx{@UJnCp`DN=;06vgm@oHa7AO|z|(o-?9Ko~P) zisMa?D1A8jlk8VM0*`z-UAm&>IM2(AUV>@0BT=(VTmtYZh8Pqgb61n>M}TMrCxyx* zO6Wy_-ZeB74Tm!p11G?JBh2SwZ^@9vLZHn>eD1vV?rjW2z1735fo$JpNO@%=P43{3q|!{YMRuw4pN zc!+1$U9CaM#!PR_NIUK)r%O{~R&o{V*E#OB+j?R1g3GmTpTf;C?l#F6**mOJd3euU zY--5fWC1rSME{skT{rNM$Nr~J4nga8q@fs5_Tav~v8%^`bJ>^{o+5i$XV(2y;3AO= zF{}-S+DZIt5p2F|ACk&su?T&dJas=N1s8BaFocx08_SrST7G*it8EYXac5u&`AK^x zefu_G8AFyiTzHRXNwJTI-)VlyKvRRZ`%qB>y0Fdj^qwD$I;!AE+q@&7#hz#9wf*SC zh+gyOx3wV;NHq9LMJ?t<^KS3BCNkC#k38dI`PfcQ;BC-2y#23&?xdTM?KSgQA0{n* zv#y8o>4lDR%6U0PN0^npDonV1^ck>;P4UmX*3VcngzG-)ywhF!a-`|0altTt(k@8R z{kUVAi=->-E%>(b!^-&F*Q$fZJ!18QZ2%6D&9}RVd+(BuG!XR7aUx<1;a~6CCMvi8 zhQrYZAoV~J0_ zy6sQ0Pw~cO3jVOnM#_fRyA)ojMRg}0&~h@VgrdPjfV!%R`#zme)0 z_@<49qe+*ZNGAPlkX={){qOwn>vxSgg_l~dF2QMnqiBI)^)C67q{}6==wyT47l@u# z%it5re23cr^>~m3#rJ>P;3`_Rw#Mxh;KRlJetjutcYG1lt@dNUHVr`Qu>2v+4|va@ zFaF(BxVzhm(reJCH?#UB1VN*Vv72fzxWE77egpcXz7KmAAl&a}ZSujyo6zYb)8UtB z!cNKAliEH3R+4P%+4H(KlTBZ`0mV13`NGFV6Lme8c>b7JbVQ;Gnh>e3M{WSk!RnjC z8aF7w3m5jM;*ad(jWR4lDr+0Ggv1kj7eg=HRWu)#rmmMR^RjKPU8QNZM#H?rry{Mm z)N0IT8d}v|nDfR(bI^hAng^QTmZ=O^Lwk)>=}OXDB+DG1*gWSfIxgWN5XwrZH#wxQ zAEbw}T_W)^CIEfRyX;K{ohOFVX?Q*m6PcX!xh%&xPhuAK z*+cefdQ}5xxGtWzuTC((4c*40@LX?TzR$Den0So0kiIh)rHILdLj?C zF@Wt9MM*lfe*Riss>%I#{Q{&QQoJ|Y?2X_UNmE7O44X1rDEhwWjYX|<|;;jhyImF?1pgjdO355Xn$0Du+*(z zgeM4k-W9tSj{FcBwAvb>6-cfrol@(fOIz%0r#OhxQKscX7oCAwpbz`%d}1e85@2#L z^^0wsD5b>gD{h1@J<{3eGAKz`V)$#!Se;00^c}|rIO+73y50B`7Q!Hw);b|j7&MY6XcqQ&=>+nppcpKijke5he4o0VEtaBVxL2lI&k&AW4HVbVFwqxr2UCVJ_#$%I z3<&95N&_39ESAvUo?+7AjyD?#o?oPVv{K=7auSQd(h}KS3fgkWm^{)tf>vAwR@`}N zz5lol1fv8f2WPzx>;+(?3j1fc7PAg`S?@@G9+6?W(n>p0btjUx{j1Bh!$Q$uRa`rN zmYoI~(i(Pe?NrSF&OhB#Ga14bm~=IRZsKY`*z6p{r(IXfYax5`GT`Y29zN6Y41If2 zL$p%#UocKd$1EBU5l|cYiCm=!tpBnJcvooGDuR#bz(QuezXoDHo$Lum#3RtS&15SWU5p&omU9D%l#_`g2v>-ab@*x&e_U%Z!Xe2 z{pqBR21{At)kjQwO?MLW$s{E_Vtzaadjn{AoDwGlSjuajGF$VX9-m?yf7nW!agPI! zM{b4;eF#OIg~iWF%TDBd!zy%bQUI2yMXT4ozx|34G#Jl9v|~`IcNRZcYx0ypKt}Cr z3z@LNcWnPI15x{E!vJIWT8ugR7gDaH*kM$UyCTjQlm& zR(%yEqq%co-(OP@x^wVOjRK{YlxThR(F#kUd_V@)Pu z%+>v{LSh#9lj6jt;6Ly3?uMW5aJ$NgZN8=rT_jV_WygVtMP?97mOZc|PS>immvRt9befrjC3!d}4Qg*bYg zbDAl)Is5ylI6m%L@^QhNf}*~@Zuu&m6X%SMJgnL)=m7MN;a|+LLWXfL-IWG?`L%)4 z11?1vrNm#_5*$*i@cl`@6)NcYKH_XVn$gK>C@A{RCjIK@=f!5B)OnvDv=+u7pC`Z z#WR0jCC4D;Fe}n^C}rL!0ipr7Q1QDXWwxRn*t4yrbxixf;f|NPS-B2;_N04bA4z>i z3u#V1d?jp!$qg`ximfvKxnI@jJ71A>sH&|u9Ue`Ps;4#EE^W}1l_gUmmTB$$6GKV< z`4(mO_qV3hVpqja-T<1%35}j}>8+jSNR6i>_KW&v3$+H!=uonPrzXa+x{iQgKN^S)NRpw&xIP>iE^F8xBaoBKY#FKk2LBt)u5SUERanFs4H*{lYQ+l+q)m-uZ*aFMws>S}+e}=Z{XTeEigg`Rca_*(c91+7`Xt!iAH%L-2POSYoRs%aD0~gLPYT}La2F=+ zqLROzIO!{WJfD564@@fO&Dt^%Is|hE=vUKch9_}RaMYqH4bnVvxPq~$ltuoY515Lb z2W@S1hU2YO%)TTxmuA!yhcz*)XJU^nzA@+D%L(~)B1vK*(SV%Q-@nOL?Il&`A*OYd zeB3J{k}Vd`^N#RW&VVmAUJQlyTt|dlWvLhPypPinpxXkjE+)06RScM~;OH$<>Y0Gh z(r`u%9Xye&wD^m1hpOIWiE>#sWjoMP>STCih?jAQz90Qd&-bP+H*zt^pr8IZreW!w zdrsHaHyI7TmF;eAKx5a%IkRoodJP9`ASwBt1E0IEzdEvwKfCxPsyz*kGPi6~v@+cEr? zbv(r<@}8qXwISY+F0=$M_QEec%)C#uDaLlV z)^5FM_;Ww~x;u6e?H$JtEsDMDvKjJ;?N44986V4>J`=CPfCJu2yvqw`-CpFe+sC>q z2VEi|`deOt^fg*B?#eECXZ7l-L4K-QM|RXb5@V$T7!!=&oNBB}0nC9)RmOvcqhI)Y zi3Uv))266I<{@l(63?FMT#Y5;*|bcTDErqX13rUG6|kVmWk_O>=#yBX7LnP+rs7M^f^+ z(w{-k(b!PJ>^-||37?5@?9v-zwf*|o=n9N;REX~jW#_M-az2)A#XPm*63OP8u7;}3 zUyzHx_d;wrF)N7J{S-_hZb83g?F5giV)lO=kW$)7CQrsP=JJAt*&?%w&qoU-tNbT& z=Q7|pvDH*k&*QznW?qDKkSud#ir$Q<-bV9A^Kw3^RlWB$Oi%FPopIgAGi&XI z_MNn{ot({qUaUwV3wf!%Lx_ zaxr8`X?h43;*KwxRWP05Oov&q6zm!U|H*H^`b|UqrP1yR7weoRqO1kqN0Q?9W0nw4 zHgEUQq+D0@45b@OL*ktwDPtC3@o;6ovd@j4j|&|HVro~?&(ug~qw_5aCW_U!|sAm(=oU0c7kk(~=Z(b;J5n-2{VWnt=Y_C-|wl#@tI|sFYEeDFeg%miA7dz{mjVkjJs;ky) zr&>loL6@SczGqmC#GHHnTrqke5&RCUbCmN6NyZU;-z7OtHd@-a*@WC9xJcu*iCddu z`i6M=j{IEhC`&Hsuqk8U!IqOz8ATr25(O(Pt13VHFhBB-nJ~8oK=Uj`q4K%1wgEJ7 zkzUjv1EYufykk&wF4#s}B%u5qMZzdKvW_FuC$rZtQzy1y(&oWNI>NgroEWmhC=y9# zHqDeO08T=jg!L#QCG<%H;xlV+cjJ;jKU7MN={uAlFX8Q1mVd^ zJYq660rR!Wls<7<%I_xBA9gK;_UDIS%4Vow5tJsIZX2}FT4j)q{ z>eO)CMiUtBl6s|RQQ!Kcd~@mHV@*1y`?>HWK=3{xY>Gtm)(c+pekv1h%D?tUJ66z z`eAR|nycxDDU*GuPXI!rGE#$969TiyZR~4u#~4?B;t9V=S70!u;7q%WkzD%&qG87a zi{T#Qw{T5Li>9gQyinG<9vvE1L@j$cVQ^F$hOuO+e4uMDugH)jMaGeg>cork5X zOU8fCAdr=t_N)Zy+W6CEd?;V57YC*8Lebu5L$!@6x4W$ZEO@oE3j@}7@qIC4> zicE`-niD^@-VK@p7GL}KGl|vC1JB9#L!0+&iU#TAh9VQuRN4SdaOn@##QU{>)7$nW zv#Tt%D~!Rjz7C7h5+-;D-M3YoX{$Swtv=>rPxn=&JhY&glrQ5$?i=)6W7vbIii8ABe}|eKo4C+X3|=i!ra^t;F7k zNOJ_pK}Q{(>uErVD4`!kbnTc;&?G*BG1wmB4lmY@VEwnwrO$t14{zuxx9T?!wNYA& z>-e{b$OvPjo2dyIOU06Xs}aUKQh`s!W}ZjBO8X6hp#JYaQuLUZ$5!cD$I>Zgv&z08 zH5`S}F+`)5^ngB=zuGXnqwGDa!%fp}JVq+6N#qG{z38!97?A8nlUoK$h7|YIm)4`UZlOZ+Ub|nX= z-Z}p@$@RdvXyD8AMwTyL^cbwY5NV6|{<3BGxZUQGFbBUz{y8Lz{#E;PNq5UtIlkqx zT?lDaJXY=e+cwaVXV`g#lEa-YzR7=x-k>l@GeYDCnI9v!lADJKs(`1s?wPU7l96R9 zhnIuLXUMGdlZ}1w9QkU=dc;wJ6BD6AK{G#MQpmQo z^=3=0J?z%7zgw}mp$w8eDRM3YEoMAu=FLu~008AXDnxljB`R8}Dkcdmc2Zr4>wSh?5~F0IzRRG_1J@qWO?vG2QURY!-KSC4Dj_FEmzy7c z&Nr0tqvIJysAy^r$Ibifuut-jRaF z!kR9vM+?#e_WMfehg@6qzr!oJR7!kuUMVIMyT?OJH$*;YWfS+;g~(7)SrKEt8{jB4 zk?w@ok&3)Jm{PeBL+%Aeqpf6xEVGdy_N+reWAyQX zlcI4Xa#{91xt88F+)o-aakQ`*f(WjNHyqh zBkH!RtOcz`?=Bf#KY21fJl*FcTMsl-ez*LiHlUMZjaYu>=W`bG?lq|~jaA>j9N2hy z$c(5HKDn0PL*rho_MpuNIl0}9)L-9O+5Ug1I_sde!mitwLXiT+DNb>BcZ$1Pp%mBR z5+qoQd(q(T?rz0`y96(8L4rG%_q*?RXYT&@%$#R3nK`qcz4rPoum{lR-WG(hadw?w z791u4rnY>{-VccSqtL>*d7n3m%t-F;Ut+Xi2Ay%Jr4tP-_4~`sZzJDz(mveW|GQ38 zq?A)oi$G%6`KuNIsnk6d9Cr%YAVR&?fBbz+$8ll$jm;aHlESZ)Yz*lzr-0heSzNWe zOTbMYTRx(Mk4y~0Jt0df`!%3<$4u}QurI;bV@DaT-4~1#qD@NfEfFV$vQpGQ9GX`# z?rH{>GC$C>_?zSZnEbg1Nf}?=)Dlfn#mb413bVVV&yI{Iip){B_*%E~kY_d%1&*>; zV+Iy26qG+8JjhKZ(W;B6RzKq{^R1w6cf@R>;2ztOFM(<#hH*obuiI$*nEdljU^0`% zyKu8RfGYIUWS`mMJ4AGnVS^-m*tbxsDE^Fod01p~n96o8lXj@srL)?gp{ZnLcr6jz zRz5k8epFw<7LfwFhjA@fn#4j)U6hxMIsUQ^DVZ*4%|{ASIhp|z8s4jQPgR=^`k_ob zGUFg zP4D6ts5UlvWNZML&BJR|r~813vm1(^Y68(*+cH@s3NcD6%seun7!q^op-XT6VULb8Yba5T>E!PJIP)VzPujwLC@k6(%3yTubLPKxe93UPn? zE^c?Wi%}tAY(9@%-s!r!KAc7jN<1Wh?$#z#YUH~VI^;-&Uk%SK-PW*QkKg7u!DtXn z6J)jYG0fhKebf3}Hqy4Jf7c%s@0%V`XfqZ1^p9p`gZ@q4wxD;u$oaU!PZFr!Fdy_b z5LM4stH>`aiK>M5)$m_%I4nw>BSXg0;FJ$829LLJaMt;b6hxk`yK4Beaml3eTdh+5 z73-WyOGUiXe$OP~QzVt^pCU$vB;#zX@S#on<(Ge_egt0^lp;Zmc+gwSq&#E0K&l*a zE2}GVc`=EbGx;Nqh%F(WiwU;Q7Zx{LeEyYy47cv$Bk1_AN0AEm3Lu(?Ggpi0Tpq&#^Ohbvmfn?D=|FrV zc7vBp!e?9W;JH1_R{MUZJt zs1vSGRo%kAdeb|+*EgEVy~jVr&pAi!*s%_Wu@F4xBzcEnx0;B8s8(_#$IE|_m8Ux^ zn>Od=_NPAGeUbXI5`f&gleim# z^m>maa*uGlTokkm=ltKZpF|tJkI4cT&YzdzagB_XTMtjQGXALsV|`5|B@w^opt$-* zI>~v={ON-sm_c5o12%Wi(2beAxvX8{2%;dRRcja`vh{E_kJ(07`R*_06kpE~ z0L`9{5^M$dTna(0X#iI^n@v;Ua6m3S*E#gFKuxD5NFbRnI4qVIW}=ETm_5=fjTo$U zJ(YB)*?CWUd%|~Am%pq)3w;v7{>>6DVmnghCBm@bLPR@%tKpKzb}Z?z^(qyE^|c5Q zd;9wUs)i%uTIj7ay1U8bj?P&51Ad=AZ~iQ{qxVWrNI%%qD57_5pWUFS!}x<6gmsWy z*~GBIJ9zWW&tI^Obrf)akvet;iGg$1pDMA`wdEs}N&j0<*kX)hrgLI7GlDa=1nqs8 zl_!bnh^>U|0w3cb0Q~a4$Zrqr2nWJgIg-+L=y^JYjZq@lqdHhC#V+I$BW-dLAzZ&+ zj`es<-bag_$_ilR7^1;F1a0ppAOj3SKxiY9h$$DbL_hDW+Go*(o$%9{W<1Ekt6dP? zXwtOWV}#R{(p~`)EHYd+P&v^`(b#6<6C60A+jfK!d;NEt3kkJ9mZFn0!KNDSOh)KV zCQYL>WaunUrW1_eSl__AB;A2@RSku#kgNP99fr{E`37E&jOc}-y`s4=0i8Q3tCj(h zG))-2^S57T>n~9$>{%Ww(0?agtY`u$A;+!Y!DOi;empCQU6Nf*T`}2D6BWaC3zXtQ z^SR5oLPU1$lkYvSer}PwM@F{AF3`t9a-r%tPv1?7`iqwHH4Ven9Je^v^=O}!?Y#omLmqw9O)>Yn0qYpK{1)(oRk1V3$yNuKm0Aw5nc`!WzpP7 zD{LwUl2|hM#pEjZ=Upqy-re#@)baOt(+%$Jglh1#bw30C!}`CP#Qi8+poZhoUkU9~ zE79bQe6v1zm+ujy4>4%a@9E7K+PtRg`-R79+NOq;w92JFj7$yJGE#JPUmT`>rzx+@ zL&*o?r zB9(2;{C02qA!_lN$-?#9*^|%`<;IN$vpmw(6^7f?{UjOGNaK+cSl;<3j|)fl?MD{YrcBi8cz(e&T?|ofsD-VOcpE_0 zP50R8jy>)e|ICz05Rgy9bAV$+**SlP-aj=HNyAKvp2bRr)7nfJm6@vsxzz$$&HXG( zzw;>^XMW?NokCm^8jceOu(nY>YDy22PqN1)*kk6jllc4@DiMSj`YP~B4s2~4O_$w!1_pu;U_x}4D)OQ%y#={$j_5evdtgF{x<@M z^&2b^f$LTRM4l+4=Rp3#U)=~lH~Q;I46H^jk{ykg3%*1To)is+L`JQejKf$u1-kNh z;AJNZ^~9{wm{qLuyU`FopCu5ODMq1vdF+p|Z3Vd9X9DgDT(s^C|JWK2Q7O!og|$_4ZN)>d0PzqrDu_t;XFLNHEV%Xr zjqOf798XemEHjD`ujq`J-voA+WVI(L`m*oV5(%7>}50 zy23~t(hWUR#3+6lGE=JQ9^oxTrDISHKvp}Ziu|^)>47{Ixb(guYS ztR4Hi*N6YOVYRv|gGfmK_Sg2^_j}?MW9M``ewgEB`NO_as#ksb^>~7FsiZEh`cdF* z?c(<|xkNvpF%Q&SCFvka^PLv;NBAbxi2K(Eo(QfsbyP&=MvhbIADLfzH&+dR&rWV* zT|J({X{TQ!$*tT90SQ3~r~(~1%n2bnId&i{pLJg$Wh+R{g%dltbEY;rp^K7Zw8Y3p zRw3xaen-|KW=`2z#Q4!>+UjDa%&^C{&KH4GRlFS2K>cw|;&S3@<0Ms@WK--sexN18 zx)9LB)^^08QTI}YnCanEzDEYZx`yPZFbCUB$>O`v_14gO5RH&5$O?dtF$?%YgzE|)`HwjO(mrQ zSo@`E?R z)spis$aJ*dNKD-lpuy0X0dQA$77XZjre2JJgtioxHUF{@4!pi>2qwg_R9Xl?IYorYQ^3_48ujY3+D6GBgtD{hkn`rtFWaG27;EDB)6G zLED_aP#oS^WSyk(|c>4&aQvDt4 z%{2&MltCmO=((!ZUptI!IgJ`215>`WgU{Jjruo@-3YEN}^7nz#PY>DtrX9~iRHyix zzW`E8Dt$h?;zvB6DYRWa6+Vz#6-m;93)j~Qp&_xmKG)|dwjNlEj`C}n1H;?YOd;u< z1wQZ(9%(~zm+X5A_hV9O-tz0V|I|U&{?`ni_u1YemIq!aTdB7wBP~?DTXD54f4oy@ zzdwC>2&;)QRwqBf?xj{z?Q|LY6FojQqfAt7dMoum2(Fld*;b< zkFYy7J!+Lj&au-ll?(c?zw^3Vc)qUt=y}neadYIaEChXCg=c*4=IePw^S1C3-GqC;Lxg`aQkC)MWh;3q z@wISLQSZC7Wt1Zr6_jC=f{c7W{use5l1eEf9vRo$JF}L; zP0Txii}S#$G;|>Gow^^U!5m|pK7}T%KSv39j=11{<*XdOwG!}-p*t5i5y z^{Be=_(2>nYThS*ajAZCmAA}xo7_KuU`Gn5De&h(On&}Mx^k7Xy-cqpJ!T)PWqS6B z;*c{gqAMtYz=igP_ta))zu)q;0;sW`?n$>X_-*7c@f=f?#=Ku8-ybE(kJqCAMiX z`Nb`gg_Q`$I%X*0gV2nX##Ik=8WB$Dphf%6DQv%&cn>LZQ;)`_nw=Akw==Gg$zk2L zVj;>$mm`K)Nia@^nnAl+JH*en60?iM(_MWsGLY{UUh!97VTBjY0sT^aU@VPdPC{+b zPf@Y73$Ex6k0Bi9|1d?dIi9^PJJEO*_fjCobkD*XTN!QHMxCLC_OFG!gRy@&gDgZT zrA)J&nIcKbtNsyCzFc@=4W4Ge3?|E9q=zrp9$K7Us#|>^pQ~yj+@CzzfECje$^<`G zn|;xE9Xl6p`5yuRG=kpHUCVQ6S1!ae)j^HrNRo&5Lj9_(06Cx;cKq{w-HVb*B|1G7V%$==|+ zQY$R`r-flb^_kWHvk^%u!)r#BBv9kkP~!`Ta6d%}yq&8hDFr^=+xZ)QWwQ_@aWt`n5*5y_2B;TM)i-)nh!@4?72k5I-frt&|Gzq_|YOT4Q!xy@ciQ zhG&$uixn`&iyx4`FFu|}>(yj-s!biZBdcV%|7sC|M<`w_-8F^^Zs9IkkBWa%6ZzmD z7=&a6Q;^>c*tTdQAMP0(2>kb_l4OG~BAAe8m_BU@4t3&wLdnaHF4mc+>4~Dd4U2N_9rU3c4du?!{N+({x4xofYp#%>%z$?L z>p9-2=K~g^>|TA#wG|r6qpIL_rV6lLb~5X?uIhMpI|aO2uS3N+9cPUUQbbBaj?b_c z+A^qL-$s=;-l(67A9&9hP9b#8e#T;2gEz2#*jr4ll3R*AHNYuO-VM|aibh{&MNQ?Z zz`^S(k=ZLeOh>c>-I$zg_PJ{5@8jH%7?VQV`0Qo?ac-~aT>jD6Znx9Ii zbLyCz(9=YP#qznj7X1=P0ezptPWB6NAxjn}IWWR8(U^-CRinGR4Wr~v7G-KkkuOY` ze3Fn)Q3w54w!62``bQ;>`#xl90ftpx$R!ho?!rHlDUYw7U4ZD$lT+T%&t}Vs=k;S| zIBGzwHxqsjDOJdZDuFJwc1ZYp(5hLCynzOWP$@wi(EouPJ4fNJTrbr<^n8r^x2cGL zgL9(vEZ^JUfOYTeQ&P(V!RSu<9nHh$acy7{7t&ON1RkTVtzu}ajuNP;UhzWbRwEm4 zh3$tbH46;0_+~Q4V`TxCZ7wX$Fq!?y8u6!D!E?b6iZAP*g$xvRCe}uF)D2SGheOd{ zZuyyGoK$0IzKn!ZO`MKFh==<-_aVpW&$JYHeG>{o;Yl6XY%-WQt)E6a`wo|Ks6MQp zC=BSA6R=9yXmavf7GhzWFuZ1u=kP|CelHNbZddFi>mE`l)%_{2S}AI|);b*QYK45Q z5B?qQTdGqeT3B|KaQAOam|^8tzmO*wX$x5Kid}0@H}G~m=BgV8QEH;%PEf%D3FKe+~qncAV-p;6(9Uk z`*`*_EmT8F55gQoeuEI_@A1b6QN!91lP5-sQ@*I8Y4|og?o;}g`|=KzA-RUBOG;l= z8nwl-Y>AbVyCJ*JuTGe7MEuAJf4TVdP`wKZ>3%uW&_I8{;X7$E~|Jg72-i zI8a-o@}p$By)mp=Cq?jK@zOiW7wJn^2wQ#k|s+g}GFjNTdu>yoQhXUL0)-eXC?1Y#QxpSVy`en%z zbEp4oU-6@l=FzA{#3r1I;+e#Mk=R1x{d>y1jy*6Z4TILAfZ6&`fZ$*yM=c4cXKzR6`IuP@KdpAS5QN+SfgTIkF3cVhqOb@cEhD;$wRNRY}H2bJLNGf{&dAhjSn|g z9OwsZ7AhS;s`$or>83Z}ZieItohY!{^HKGdPf6BA97 zF~rJ=#3nbrzoK|i%|DOkvf2)6a=TwNnDZ_Ff(|?_NQZQZpG=lXRfoOf2?L9CSgzu< zyV{}CYIz2iZG7G$50<_BTHbfHe4S^Xvd3lY{)a+b)j7TA@ulUV%1VCmsDZ;P>El^q zu3qt))`n+rDH%2rwJOaWc460?Z-9I$R>5OMkNc#t_chUAdZ8uEi-}8yBx*n9ZbR~D zM0X%zql`(ql&Mk7NlNGav^=<``TO8qa*-A=pUr)QZD5W$&3$WI^Qg;Ap6^G=DU%jc z`3QcX!cGLc)}yRUmJpjCpnuVobQFwMaM+Aq`ecu>993)ndtZ__V!J?|a7%Nbb#;Z% zulZe4N0e@`r6CRNT4qkbxLt-wMpH16CXDOw=kqw>wrBeF3|(f`Xu+M`7uf|2D}~J4 zLv7g4<(TiPpHWj7Y8PcLV!LmGP~~H&g_H+;2Hx3nlTI)d;;VV5kVXnS4k6rPQGg^- zP}ahiMx3wcSE3@w8*-fYE73qp7iAD2e}60HL34~UkayaA$GI%_++yMH<(+(IX?R0g z2|+?#PlD&!$;e(fPsz7-R9fkM^_qS8R5_!64cMZwbJ~Bjpl`i)hoe_WqIa~4ecOzK zudw8IlVSv^>wdq%d#MSeO7LxuniA5do#(m)ukPtj-e*z!#t)i4ti_mQ9+-4so+yL1 z$PxGx8xf&+!>nd>ii+i`w$I$c+wUnW1IHPa(vrly*3O{J$- z&MDbjN7qM-IW}oH!lUQgr%8k1BDlV9jSh6>loR!m4@I4}MjE`19$5b_-yG|&25y9N zpc$Oi5}|?Q`&q;~M~M%J0Gnai`F)t*3eMG1rlpdEWQ*+FHgZSaZH>3NtKhRH)U%lY z{V{d+gqm3cAZNJW*f*+58+NHvJXg;`4!Ayt!t9etskJCMg=TbeBHNoRQO2m#27D)Ewv1>|gO0w)H_e=-&#DXYh8g{-OXuLyD> zzfgWbOu;n}|J4Ohsvm#TTQMrp{@KIID(JQ zD#Te)X{*`HAyve;vluNq!8k?)vq9Pbt2zL z$yxrA$4T>%C-JK-!n4j&E&oAWt=It}9s-*v?a{h&?!pATMBvl{k=21s4j}_b? zSb0}mSxk%SHj&p`f?>XPf_1?(?XjFD_Q*JVh4rIMiio*-!V;hATs44LviH`SZTN-6 z<3)Da@K@hF)3hH?mb_+?D(QqFo>L*D$GSCU-eQ*M$C8z&m-iiu97k;ECWbxkt2FFL z48Oiy+aiY;&HW@RYXk9OrnqOl{!nMz)?y~qw`4Br%;OuK2Lxf8RaE?0^+j&n)1^1AZlS8;B zgo9ab7&1PE_X{n+5wAp#9j*lPZX|K7Kg?O*$p|{Qn2r5{MeU{HAwcsRs zFbRal-t`iuS)nhKz0}FX*|IE@$f8A*K>oHQGW+ZX`Zh@+8BnI{tiNT_{KtkANprg3 z^KMs~@&?{Z1(wk;fAmJeoBz9l!)Pj-kjFnKQptsJj!ZV(;qicdn>z9qQY*PU+LWN7 zD_el>xZYp2B&o+)hQ#8nvS03iRKh-Z%$#Tu7o2&&Eu`maseU zuDFfLajXRR*w6g-$;QZEn-fuLx-||@_P(H>C(Rq>t5-ZU&TJ>fWj0TsfK_QOtMYIgFk}@_7t@2x>RWA7Qay@;1FZ+ z{@O2m&d}?1n9Un=NRL$!kx>Iip`U;d*n!!61{j&98zI5al;wnBNkp~Qj0i>1LV8VCjx`J;^B-e4Ds&;31m=TPoyP~JZ5eHA zi|kGzgyrM*OD4M$O`7XlOvDS!83TEu?i}`pp$e7YOAB&TqKc?LqJX{wvs_B8z_Zmp zk)A9nRD;^GSvs_nsXrl-&9hD+d`0Q+^*rv-fYdT)nQXl_ZXV0GX}x@g;|u~z*`+tS z&K=AN;l!y@*^LADW4xBkKcu&_n5;#exDs^rYwk;MgjBq02WA4@g~q<|)QZ&$Y8See z^Ws8lem_x>9(vG6=I3PuI((;P9YyqSZe>2&h*zKuE`aisE_m_5lb+QpY-MeCmfsb( z6WxwYR^F4sN8lC7N6OEU?Tat&ijHl#$~;8&3x~I-GiQ8j-NdYyWj0;zX=R3(jw6;% z`Eokf$_s?n?-P#kDOu`+B(7|)c*a8}b2poq5lKh?{R?MlIXNC6nbpB%n2(7aiOHSl zPf&6Z1fR|sw5$#HvaO*KbX7((fPNI_GW0sJ${OSQL)&=l~KGTk?F_Ybb6@JMgK z_*cvSXlK5R55qnG(qJjuobCoBKB<5kD+YJ&2#L^M25ZOQD6ktOHG&J3et?l*GI7p3oHziEmdw}JeGs04^!hgxEl>=W|IERj2lMm#=~ z*Y?fZevrlYFgc2ZmT1UAQ~rQs3?N~o>zq!AtA0}A-XF7AA8Yi*0(K>dr>ne`Bf?@Y z_RHz_b>rQR)GDNi6(W?cfo15IRNqKEW2q>8I@s1I*;$A@9JxN7rS@d}J+U@yVBB42 zQYm#DQESV9s236ymTTp@1s^3ctEFQbapy|}$IX%Z2RS5Lr4qX#jV8(tM!1EY-@8AM zls$;i{od>qk>KJK*tQ?da?ei@X(8%N0~L8+GvcxtWoqCtX>@thd|b5dp_>PuyO)1! z$aEal2mRD5jz9)IASZGQ8^)Tp=3p@i`pZQ|WM7!P)OF~zz>_cPi??>k61IsDTn=$V zseA<*Y_Lb$l8aQw&jw^Iyt=L3MVWM>O)bhbT2+*Z09C59r*CVY9fa9o@1FOr)f>=Ye!xyXrr3SUkj(g>U=^MJcp)=a_2Bpb&U4;#k4s%tr zS)!Rgxullmg1zkv>|^%lm)j2-7$)?hFEnqT3rPpoEO`_3uL~39=_363lgJc1^cei= zFsC=&A1QtvTEWoxLw0isnTa=&Sn+;p92(IuTzlClC}u6WYbVX%m8;h|v6Pk%CNl8` zEC&LnZ2WN(d>vi>K_z_(Sjv!;qXa#FtnCyE%8)WS(+aMGJe%(`^w&Zrv?DLdmTv}k zG}m9Na6j12<#~=TCst@>a>jSREk{coy5O>@|NiK1Fzq%2hxl#PtPrw^Z4;P1%8Y;O z!1$iKJ1luw>$ofQt@+UvRt->C(ZHBufV1_mqiGN69KF(^ojY5Oe8PdZX*7h%}drxjP`rnljab%`43-!KA-i=irP9jguFAl>Jp?)bA5bscY7Ee(J-; z2!&;n`761uV{v!(rA@ht5#ZsMFX{LxoVgy7%eut>a#L3w!IvLMwd}CMHFx#L^&_AEgM>#*k%S7lAjx z%JE|RYw%{__~#t6u2Va=ybs1$vAgfFqjThc8$jo2zM+z(;1OSk#IbUIJ>SVrsdb^I zNq7FKjEZtGHgYMW5YL}`mr_j9or6a979li+>n^tL+#4HfG7ni!WO@om^Yps42FmLF z(KRY%_|?JEM|)*;xBBL5=MG$CtS<2MXR=(5C`r!Qbd{CLDIoScC4v#I2O-#-A3vQo zusz^?psBnKs@{`-Z1jIha3qS#IW02}5$anf5HLa{zWxU)3++KwH5d1hI*3N)ZzDBc zDM^c}ej=J@)Y%+gAii^xz|3c1+sb@Nks{=e_E0FVD|HRdHI>b%qf%R%9u(u{Qc~93dgZe85YB{52=bntD^fYHSwr-*A_R}-doozid)%@ zt~n~z6e+@cqyd6pIbV}G$7&*XZ4Ldc+$J=5Kq4CT+9>aczH}{Z;%A_T_EH>E`r-eaBy7Xr@5@rr-@L(>|MN9VNsl|8Hn8|y?&R(;OXS3(SrO^jH02JoMEV;x7=zUGo=I2 zdB%l;izt!rMxP}Q>X+=uI!{(V?s-;!$er#TLPMFwQc$%j)l)Kh+6}yxY1Fm39QuZ zNo^4DgMxNE=}Y%@MYd?z-o`@iRXdCIoGTp_)Ui$<;lM`T;3WQ!6GdE0zZvA4l8H|{ zqn7u!yQn6B_@O&Jj*@d&W*g6dg9~YWUdT9uBZ^kR@8m1qQAvM77@`75A0Uj^+%UtBCDJ5rRv5oun5|M`;Be9Lx zY}(|PLnmfsqWx^S`>cvj=j^PK$h+X5GeL-vp5 zCP+m4QHjpjf;Tehq`N?M$>Y9DUstJ(B>yR1iuX>K`r-nIvr5sBj-=Q2RZoVOMR7@2 zIqN4_R(c=?1;B|CfJd>_&Km`kFD4V-Y zk1r6r$00<3_j7W&0J&nOir_u>_ZjV*Jr=Mk{i`krNs{v{;SY(l(z$a?3X9p!5Cylx zd{*1I{%nmq(or*1`h+&$dJgbOlD5(!DOKQ@nT4?N2A9;5-?)t-krYlh%J*o_;Md&l zW=&*lfnBQ9aDa)ssnDfNI%kfw!7`7%WWqvb$w~)HBQZ~*^COvCdLziW*gPj9KoeUo zkmipl&g5sQyYi&vpB^w|)SaEG4|eI(vCdrhGk`+6wXw}4TWw(){2|fu);8BT|%ij&Hba{y_VwJu(s^q38NfMDkR{BkoqQWMZGi=5r_EycGP!d``9Wk$Mzxy84>8%;PEIMe- z=4=IX6&pE(zx>AU`z5nI3}fX}o_Fj#H<=?C0&fFVeRr!EixP1;xZ=PAT#UAWOo?*a zE`7bQk$&Dgv0nIDa|aX%Tp%@vR0N`(wTChkf%V+K#6L4&)MCM^`UA=W?;5zVazAC% zE{&}UY+J9@qPnLy75%!a{#x!Z=O8HcBpU4yn9SwBt-_lvJUC{k&j&HCYw`nN)VuL4m>;x5+;s-6an6o!K2#GVY_Yc;yh z1GKx96=*r9i1rhR^*YQMGm+2=OhO&F9afgCnW7Ec^WuDX?bhxIkNF&x4Q(RF+dk!i zdlRC>d_mE_RGnfJzkFH!CE4!5X@8(0^J!^J={i6QVir@N_=pQvw(M~#rM<>i0SG|G zq=4=nkCggqLMnB}n#qjka^3cXHuj~U2~b_6NQfpF$!d+3k}EmK+UgTIWOOWUlz_vS zbanw)$9qnOB(27;D8eY#|051%GuT@Axe`)m%9=0eURVxU%L{IZTv#ie_M~*zx66GD z;;L|J4ZwwGbJv!(`#2u|k`N~)SCOuS_KDrU_if(xZD7YDrsAT_0UGmlfB_UL)DxOugb-e)PCG2=7tIGhm`iR<_ytfVm?W>RjL~o z!Cd(tBtjjjOMM|zsx#Ir4Xty(8us@j2li;Vk4^seXHG*wFI$v{cj0g5K^}l2<_bI) z88-Ibuj=cMV~f%KZgOnlgroyS3v-V1I?K*RhqtZ;S>uFt)B$fI5IU^1$rkkwcQ2Qt z99m?rSZ~}j5WwM^a_4z2V`+D7<~t-=U>gPcT*CX=|AY|+qI9|ynFx{QBACwQGE8g8 zOTFrTnDP6`=fHX*P3u~8Nm$31cK_m}=2HytL{^r2ORuo~Q~~XU9u_r_cW3KdN~ZcA zVc(=`oSDXYzhgZZQC?kDb+x;u*HJxE-6%b_?wE`Hi!|x_`iY^TQJE7mK^xb!5Z-`qvaA5NodbTYisLjqK|1S1`Wf@F-w65_+mJe5TKkNk6@SP#W!`#JWDwR8X&uPq&uGPiv#! zBCEI@-}Ms#pNvB@GG|aW7->9GU0XtbE2FHZYNy#UydCsUO z7#zRO@}yZEp-idZJ7KczPq-fh^psngqj9}<0@+GZ*w#NX-NF<*fB%%@yooPPg7_)D zF%n<&bWt>l++yy(_p;u^#KmOm2PZVVI2o2UF#!-Q)~Wb+BRIY}p(*#y&?QsNh-&+F z4^oYgm$7&cI!oX-*!SX06o?M!&g(8~3+GLm9H)mgIws%k(OS)9ZBf{-^2rkHHELe- z;fXzIRLT1*_VNg0Jr1Gjf!D#JFq9vMrumQuv#3NsrhBM(DOD`w67ndI1{?0-eM*Cz z_j^t$pDY{C?S5$7owS#K+q$D2l=zX56TNd9N5%hGV0Aq6i8`5-Dz|Gy7zr9>`JKDRUbX^NTd(yVa|r zfbWcooxOV3wfpnwSj3YX2~9qvlMp2agN$jb*w#|N>Y0S5v$T-lvF~cq}{JJQLw0-`~=jbi4<7)G7`6%h|e4tGtUtrds*!SC)mu2nqDoR-Y z5;{`Hxz5oDP#NzGFCtsVSLv(2QGMq3hHE2Q4|jcZ%YP1%Wq{`FKP~MO@9%M1opb6~ z%`q15l&;g}Wxdk@Vi8rtH1|ukFS0;=R)C?}*KpE7k9kDucje6^CB9PGg$Z;lX8AU? z@|6V$yVtTYzJvFsvIQhRA@RVM$r*Kn%Mv<(wlAWh;H$bgFLVh1lJQloRH*SeVL6bK zPb~1ran}G=-<`3(sbAH8n^q1E~Ju??S2J<@N9Ko zLKl$Ktxc?9uW+w%V!>$GmvTV3J3g#gXoo7>o@wo$TJ0IZXCta*SxMD% z0=6J{yy`4v8J8HYu5#6+B0-s5D&A+ezQ>F@h6v>{^wP?>DCOg%wN{H!hR|gNh541( z>x=Ds86zEcW_PQdgxL)((Z2%VUHjthc}uNyUv=_F`K6t^{iX7m*f%aLhTluUOOl9$ zHb$9>>tkTSCG@GI2_^b2*N4qU_!wTSnFwQX;8K5FG=c@V7OdQzF~5l?iqZYwPV!V*rH@9(NKE*3Uzh zURUotq4fCtS~;Om#RXC-{vbvDBhIlioSX=OuZka{GvH+H_w$0nDX_Ji)UyRP=6Tsn z7{fkl_wY!iXPDXD7tD+%I6Cxb1qOe#Y=!?fIjaS)eG^csLzr#mq0+;JP_koz{N5s; z2seo(zWL$R@#EBnNhr~k-}oo0%+&x!FeA*gAVIRvNFphwPJX`6^+QQU^@uSPrF23a zuw$VjI4E9#2=5+4H0LsNe_H~@WPH?4+mba?8%oIj%A*(gY%8u7*oMtMa+-~*MuX@& zsk^IVsw$G0_XK)FyZ;@-6gzr7YRT|PJm5YuY-}bmV$3z}pw(C^8A(sr=YnIjDedG= ziglSCK4wb_h3U(nBy0cv?Q2ukym4gKO`k5vrYb1YHu4EJeM$Gl zG~pt(3}blI8W^v#?&^A??t?Ez9i81Do4rD@|J=apf2Ce^&P9vivU=%L@eo?3DGA-f z%NcQuubRHuNm=!?pKE8-Rau&IE@Ni=M4zrLJn^_Z=06!@WRviA2Zw(te9sNCWxtus z&7RUlIIO;uC$oGlns{s#*Sc*h{c@0b9hOk4tCx)l?xFwrF=TAA>xzs$KsAt7gT@D) zYTJG(H7(43kVm-gRM8t-II8DQrUUC`QFZBm>;4Sp_~x5HWAV7wFdWfPJ(hkUvbX`= zYLce6AK8pyy3S~ESzY%;w&_l>ZVRr&;}8&^NkyMuzjZ*Fl)0$Z_^k<8&b)RCF@Gs8 zlbwI0uxm_cV~`xC=KpW9efH#kl3}z=RY~(p`VYuAFK2YRnK+I;UO03PK@fUMSKAJx zwLFYjMq4&XQ`Pz#JAUxY#3uFD?Bgocwy?X+v>cbJ{{PF2_a}SheSbAs^k#sO8 z&H+W^P0@tEsbFj94)QTPSx&m;nOH6rZ97%E!f#1`|5LAzPhw2s(RkXq-rMo6dn_si zMqA?gh(L|WIzFD%Swh{Y^lr0(DmnKG{G9(ii7oim>Vq}we4nH(x$0R(sHdd}I~k{j z76x5uXp~Fy-zf~jw^ZE!sVFeenu>Th(fB%$?ne+B&zE4`g zlac6gbN9(e^S^bu3-g!wzp?56dC`mSoe^G+?CvaIB(&LfCrnNGzcv19|DyY$L|XXn zEe$n&U_avjd$NddV2PCzYTCoXVi5FTX=xO*_`jz=ZR};UisMKJkc9`&|EiG>SG%v$ zk(l50bXP6;@BdS@_saYFe^$a+WtPrb;v2AyBUF3gtD-$H$z{tP0S(xk*X+&~(ZON6 zCd~dR%<;j&#?$L}G3@;u;PPVao2db%mT`B5SHY6i%9*F_V;izEU|@G%(;xr< literal 0 HcmV?d00001 diff --git a/figures/downLoad_05.png b/figures/downLoad_05.png new file mode 100644 index 0000000000000000000000000000000000000000..3ceb1adffde10fd179201304bb626e429cb551e4 GIT binary patch literal 165386 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